From 445f2e03a594f9370f0dd9fee356d1cbf9bec04f Mon Sep 17 00:00:00 2001 From: Patrick Donnelly Date: Tue, 18 Dec 2018 15:08:11 -0800 Subject: [PATCH] mds: add missing locks for PurgeQueue methods These could race with the asynchronous workings of the PQ. Signed-off-by: Patrick Donnelly (cherry picked from commit c7350ac23c73867b52cd9b7bb23b6c618eebe44d) Conflicts: src/mds/PurgeQueue.cc --- src/mds/PurgeQueue.cc | 8 +++++--- src/mds/PurgeQueue.h | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/mds/PurgeQueue.cc b/src/mds/PurgeQueue.cc index df160f39412b9..9389a831eb334 100644 --- a/src/mds/PurgeQueue.cc +++ b/src/mds/PurgeQueue.cc @@ -272,7 +272,7 @@ void PurgeQueue::push(const PurgeItem &pi, Context *completion) if (!could_consume) { // Usually, it is not necessary to explicitly flush here, because the reader // will get flushes generated inside Journaler::is_readable. However, - // if we remain in a can_consume()==false state for a long period then + // if we remain in a _can_consume()==false state for a long period then // we should flush in order to allow MDCache to drop its strays rather // than having them wait for purgequeue to progress. if (!delayed_flush) { @@ -318,7 +318,7 @@ uint32_t PurgeQueue::_calculate_ops(const PurgeItem &item) const return ops_required; } -bool PurgeQueue::can_consume() +bool PurgeQueue::_can_consume() { dout(20) << ops_in_flight << "/" << max_purge_ops << " ops, " << in_flight.size() << "/" << g_conf->mds_max_purge_files @@ -352,7 +352,7 @@ bool PurgeQueue::_consume() assert(lock.is_locked_by_me()); bool could_consume = false; - while(can_consume()) { + while(_can_consume()) { if (delayed_flush) { // We are now going to read from the journal, so any proactive @@ -609,6 +609,8 @@ bool PurgeQueue::drain( size_t *in_flight_count ) { + Mutex::Locker l(lock); + assert(progress != nullptr); assert(progress_total != nullptr); assert(in_flight_count != nullptr); diff --git a/src/mds/PurgeQueue.h b/src/mds/PurgeQueue.h index 6a13a57ee3036..6f1317c9aca84 100644 --- a/src/mds/PurgeQueue.h +++ b/src/mds/PurgeQueue.h @@ -103,7 +103,7 @@ protected: uint32_t _calculate_ops(const PurgeItem &item) const; - bool can_consume(); + bool _can_consume(); // How many bytes were remaining when drain() was first called, // used for indicating progress. -- 2.39.5