From: Yan, Zheng Date: Thu, 19 Oct 2017 03:32:38 +0000 (+0800) Subject: mds: fix race in PurgeQueue::wait_for_recovery() X-Git-Tag: v13.0.1~295^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F18612%2Fhead;p=ceph.git mds: fix race in PurgeQueue::wait_for_recovery() After PurgeQueue::wait_for_recovery() locks the mutex, purge queue may have already been recovered. Signed-off-by: "Yan, Zheng" --- diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index d5cdc0dfbf66..51ae378947f5 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -1097,7 +1097,7 @@ void MDSRank::boot_start(BootStep step, int r) MDSGatherBuilder gather(g_ceph_context, new C_MDS_BootStart(this, MDS_BOOT_REPLAY_DONE)); - if (!standby_replaying && !purge_queue.is_recovered()) { + if (!standby_replaying) { dout(2) << "boot_start " << step << ": waiting for purge queue recovered" << dendl; purge_queue.wait_for_recovery(new C_IO_Wrapper(this, gather.new_sub())); } diff --git a/src/mds/PurgeQueue.cc b/src/mds/PurgeQueue.cc index e05c70ec4fca..657bf6e099e7 100644 --- a/src/mds/PurgeQueue.cc +++ b/src/mds/PurgeQueue.cc @@ -180,16 +180,13 @@ void PurgeQueue::open(Context *completion) })); } -bool PurgeQueue::is_recovered() -{ - Mutex::Locker l(lock); - return recovered; -} - void PurgeQueue::wait_for_recovery(Context* c) { Mutex::Locker l(lock); - waiting_for_recovery.push_back(c); + if (recovered) + c->complete(0); + else + waiting_for_recovery.push_back(c); } void PurgeQueue::_recover() diff --git a/src/mds/PurgeQueue.h b/src/mds/PurgeQueue.h index 221add80e9e4..6a13a57ee303 100644 --- a/src/mds/PurgeQueue.h +++ b/src/mds/PurgeQueue.h @@ -146,7 +146,6 @@ public: // Read the Journaler header for an existing queue and start consuming void open(Context *completion); - bool is_recovered(); void wait_for_recovery(Context *c); // Submit one entry to the work queue. Call back when it is persisted