From: Sage Weil Date: Mon, 3 Mar 2014 19:35:28 +0000 (-0800) Subject: mon/OSDMonitor: fix race in 'osd tier remove ...' X-Git-Tag: v0.78~94^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F1342%2Fhead;p=ceph.git mon/OSDMonitor: fix race in 'osd tier remove ...' Signed-off-by: Sage Weil --- diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index ff2fef11903a..7ad68c4ee15e 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -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));