From 80cf872d82fe8c9cc50c97f80645a5ce924f246e Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Thu, 19 Oct 2017 11:32:38 +0800 Subject: [PATCH] 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" --- src/mds/MDSRank.cc | 2 +- src/mds/PurgeQueue.cc | 11 ++++------- src/mds/PurgeQueue.h | 1 - 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index d5cdc0dfbf6..51ae378947f 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 e05c70ec4fc..657bf6e099e 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 221add80e9e..6a13a57ee30 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 -- 2.47.3