]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/OSDMonitor: fix race in 'osd tier remove ...' 1342/head
authorSage Weil <sage@inktank.com>
Mon, 3 Mar 2014 19:35:28 +0000 (11:35 -0800)
committerSage Weil <sage@inktank.com>
Tue, 4 Mar 2014 05:16:24 +0000 (21:16 -0800)
Signed-off-by: Sage Weil <sage@inktank.com>
src/mon/OSDMonitor.cc

index ff2fef11903ad81b76b60d732fd6601b251c9356..7ad68c4ee15e71a37f45ce068db129fc6fb163e0 100644 (file)
@@ -4555,8 +4555,16 @@ done:
       goto reply;
     }
     // go
-    pending_inc.get_new_pool(pool_id, p)->tiers.erase(tierpool_id);
-    pending_inc.get_new_pool(tierpool_id, tp)->clear_tier();
+    pg_pool_t *np = pending_inc.get_new_pool(pool_id, p);
+    pg_pool_t *ntp = pending_inc.get_new_pool(tierpool_id, tp);
+    if (np->tiers.count(tierpool_id) == 0 ||
+       ntp->tier_of != pool_id ||
+       np->read_tier == tierpool_id) {
+      wait_for_finished_proposal(new C_RetryMessage(this, m));
+      return true;
+    }
+    np->tiers.erase(tierpool_id);
+    ntp->clear_tier();
     ss << "pool '" << tierpoolstr << "' is now (or already was) not a tier of '" << poolstr << "'";
     wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, ss.str(),
                                              get_last_committed() + 1));