From: Sage Weil Date: Thu, 24 Sep 2015 15:36:30 +0000 (-0400) Subject: osd: avoid duplicate MMonGetOSDMap requests X-Git-Tag: v9.1.0~68^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=acda626d031a735c0703ade5d9d5de646d2d557a;p=ceph.git 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 --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index f8611fff16e2..85e803147fe4 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 539114861f3e..0182b5002bb8 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;