From: Sage Weil Date: Sat, 13 Dec 2014 16:06:31 +0000 (-0800) Subject: osd: check that source OSD is valid for MOSDRepScrub X-Git-Tag: v0.90~1^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F3173%2Fhead;p=ceph.git osd: check that source OSD is valid for MOSDRepScrub Make sure the message we got from the peer OSD is valid. Specifically, this avoids a race like this: - A marks down B - B sends MOSDRepScrub - A accepts connection from B as new - A replies to scrub - B crashes because msgr seq 1 < expected seq 1000+ See #8880 for the most recent fix for requests. Fixes: #9555 Backport: giant, firefly Signed-off-by: Sage Weil --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index c1d4fd05d32..3a4fbf8871a 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -5723,11 +5723,11 @@ void OSD::_dispatch(Message *m) case MSG_OSD_SCRUB: handle_scrub(static_cast(m)); - break; + break; case MSG_OSD_REP_SCRUB: handle_rep_scrub(static_cast(m)); - break; + break; // -- need OSDMap -- @@ -5753,7 +5753,21 @@ void OSD::_dispatch(Message *m) void OSD::handle_rep_scrub(MOSDRepScrub *m) { - dout(10) << "queueing MOSDRepScrub " << *m << dendl; + dout(10) << __func__ << " " << *m << dendl; + if (!require_self_aliveness(m, m->map_epoch)) { + m->put(); + return; + } + if (!require_osd_peer(m)) { + m->put(); + return; + } + if (osdmap->get_epoch() >= m->map_epoch && + !require_same_peer_instance(m, osdmap, true)) { + m->put(); + return; + } + rep_scrub_wq.queue(m); }