From 847e5e102522d651aa9687a54aaafcebf3afc596 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Sat, 13 Dec 2014 08:06:31 -0800 Subject: [PATCH] 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 --- src/osd/OSD.cc | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index c1d4fd05d32d2..3a4fbf8871a79 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); } -- 2.47.3