]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: check that source OSD is valid for MOSDRepScrub 3947/head
authorSage Weil <sage@redhat.com>
Sat, 13 Dec 2014 16:06:31 +0000 (08:06 -0800)
committerLoic Dachary <ldachary@redhat.com>
Wed, 11 Mar 2015 15:57:58 +0000 (16:57 +0100)
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 <sage@redhat.com>
(cherry picked from commit 847e5e102522d651aa9687a54aaafcebf3afc596)

Conflicts:
    src/osd/OSD.cc: require functions first argument is now a reference

src/osd/OSD.cc

index f9141dbfc7eb94e6bf7a14261762a6a2ef5c6962..4abc328b8bc93e30018a1188e9079d52bf066ea4 100644 (file)
@@ -5055,11 +5055,11 @@ void OSD::_dispatch(Message *m)
 
   case MSG_OSD_SCRUB:
     handle_scrub(static_cast<MOSDScrub*>(m));
-    break;    
+    break;
 
   case MSG_OSD_REP_SCRUB:
     handle_rep_scrub(static_cast<MOSDRepScrub*>(m));
-    break;    
+    break;
 
     // -- need OSDMap --
 
@@ -5085,7 +5085,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)) {
+    m->put();
+    return;
+  }
+
   rep_scrub_wq.queue(m);
 }