From 9e5b6fe47732a15c5723fbade1a309f36c29d584 Mon Sep 17 00:00:00 2001 From: Xiubo Li Date: Tue, 31 Mar 2020 05:09:45 -0400 Subject: [PATCH] Client: make sure the Finisher's mutex lock not held during it being distructed The objecter_finisher is already started in Client::Client(), but in the failure path when initializing and starting the Client object, we may not get a chance to call the Client::shutdown() to stop the Finisher thread, which maybe still holding the mutex lock in it. Then when destrucing the Finisher object the pthread_mutex_destroy() will fail. This fix will delay the objecter_finisher thread to start in ::init() until we're ready to call Client::shutdown on any errors instead. Fixes: https://tracker.ceph.com/issues/44389 Signed-off-by: Xiubo Li (cherry picked from commit fbff4ee153f17da51c3b6675eb0616f2b2062f5e) --- src/client/Client.cc | 18 ++++++++++++------ src/client/Client.h | 2 ++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index d3dceee2e5211..30bad16b343d0 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -303,9 +303,6 @@ Client::Client(Messenger *m, MonClient *mc, Objecter *objecter_) cct->_conf->client_oc_target_dirty, cct->_conf->client_oc_max_dirty_age, true)); - objecter_finisher.start(); - filer.reset(new Filer(objecter, &objecter_finisher)); - objecter->enable_blacklist_events(); } @@ -473,10 +470,20 @@ void Client::dump_status(Formatter *f) } } -int Client::init() +void Client::_pre_init() { timer.init(); + + objecter_finisher.start(); + filer.reset(new Filer(objecter, &objecter_finisher)); + objecter->enable_blacklist_events(); + objectcacher->start(); +} + +int Client::init() +{ + _pre_init(); { std::lock_guard l{client_lock}; ceph_assert(!initialized); @@ -14623,8 +14630,7 @@ StandaloneClient::~StandaloneClient() int StandaloneClient::init() { - timer.init(); - objectcacher->start(); + _pre_init(); objecter->init(); client_lock.lock(); diff --git a/src/client/Client.h b/src/client/Client.h index 0ec989db2672b..7b6eef99d07b9 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -953,6 +953,8 @@ protected: void _close_sessions(); + void _pre_init(); + /** * The basic housekeeping parts of init (perf counters, admin socket) * that is independent of how objecters/monclient/messengers are -- 2.39.5