From acda626d031a735c0703ade5d9d5de646d2d557a Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 24 Sep 2015 11:36:30 -0400 Subject: [PATCH] osd: avoid duplicate MMonGetOSDMap requests These are relatively expensive (we grab the full map from the mon) so we should avoid duplicating our requests. Track which requests are in flight. Only send a new request when new maps are asked for. Resend requests when there is a new mon session. Signed-off-by: Sage Weil --- src/osd/OSD.cc | 78 +++++++++++++++++++++++++++++++++++++++++++++++--- src/osd/OSD.h | 6 ++++ 2 files changed, 80 insertions(+), 4 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index f8611fff16e21..85e803147fe48 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -1557,6 +1557,8 @@ OSD::OSD(CephContext *cct_, ObjectStore *store_, outstanding_pg_stats(false), timeout_mon_on_pg_stats(true), up_thru_wanted(0), up_thru_pending(0), + requested_full_first(0), + requested_full_last(0), pg_stat_queue_lock("OSD::pg_stat_queue_lock"), osd_stat_updated(false), pg_stat_tid(0), pg_stat_tid_flushed(0), @@ -4359,6 +4361,15 @@ void OSD::ms_handle_connect(Connection *con) monc->sub_want("osdmap", osdmap->get_epoch(), CEPH_SUBSCRIBE_ONETIME); monc->renew_subs(); } + + // full map requests may happen while active or pre-boot + if (requested_full_first) { + epoch_t first = requested_full_first; + epoch_t last = requested_full_last; + requested_full_first = 0; + requested_full_last = 0; + request_full_map(first, last); + } } } @@ -4624,6 +4635,65 @@ void OSD::send_alive() } } +void OSD::request_full_map(epoch_t first, epoch_t last) +{ + dout(10) << __func__ << " " << first << ".." << last + << ", previously requested " + << requested_full_first << ".." << requested_full_last << dendl; + assert(osd_lock.is_locked()); + assert(first > 0 && last > 0); + assert(first <= last); + assert(first >= requested_full_first); // we shouldn't ever ask for older maps + if (requested_full_first == 0) { + // first request + requested_full_first = first; + requested_full_last = last; + } else if (last <= requested_full_last) { + // dup + return; + } else { + // additional request + first = requested_full_last + 1; + requested_full_last = last; + } + MMonGetOSDMap *req = new MMonGetOSDMap; + req->request_full(first, last); + monc->send_mon_message(req); +} + +void OSD::got_full_map(epoch_t e) +{ + assert(requested_full_first <= requested_full_last); + assert(osd_lock.is_locked()); + if (requested_full_first == 0) { + dout(20) << __func__ << " " << e << ", nothing requested" << dendl; + return; + } + if (e < requested_full_first) { + dout(10) << __func__ << " " << e << ", requested " << requested_full_first + << ".." << requested_full_last + << ", ignoring" << dendl; + return; + } + if (e > requested_full_first) { + dout(10) << __func__ << " " << e << ", requested " << requested_full_first + << ".." << requested_full_last << ", resetting" << dendl; + requested_full_first = requested_full_last = 0; + return; + } + if (requested_full_first == requested_full_last) { + dout(10) << __func__ << " " << e << ", requested " << requested_full_first + << ".." << requested_full_last + << ", now done" << dendl; + requested_full_first = requested_full_last = 0; + } else { + dout(10) << __func__ << " " << e << ", requested " << requested_full_first + << ".." << requested_full_last + << ", still need more" << dendl; + ++requested_full_first; + } +} + void OSD::send_failures() { assert(osd_lock.is_locked()); @@ -6217,6 +6287,8 @@ void OSD::handle_osd_map(MOSDMap *m) t.write(coll_t::meta(), fulloid, 0, bl.length(), bl); pin_map_bl(e, bl); pinned_maps.push_back(add_map(o)); + + got_full_map(e); continue; } @@ -6266,13 +6338,11 @@ void OSD::handle_osd_map(MOSDMap *m) fbl.hexdump(*_dout); *_dout << dendl; delete o; - MMonGetOSDMap *req = new MMonGetOSDMap; - req->request_full(e, last); - monc->send_mon_message(req); + request_full_map(e, last); last = e - 1; break; } - + got_full_map(e); ghobject_t fulloid = get_osdmap_pobject_name(e); t.write(coll_t::meta(), fulloid, 0, fbl.length(), fbl); diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 539114861f3e7..0182b5002bb8d 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -2014,6 +2014,12 @@ protected: void queue_want_up_thru(epoch_t want); void send_alive(); + // -- full map requests -- + epoch_t requested_full_first, requested_full_last; + + void request_full_map(epoch_t first, epoch_t last); + void got_full_map(epoch_t e); + // -- failures -- map failure_queue; map failure_pending; -- 2.39.5