]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
Client: make sure the Finisher's mutex lock not held during it being distructed 35000/head
authorXiubo Li <xiubli@redhat.com>
Tue, 31 Mar 2020 09:09:45 +0000 (05:09 -0400)
committerNathan Cutler <ncutler@suse.com>
Mon, 11 May 2020 16:16:39 +0000 (18:16 +0200)
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 <xiubli@redhat.com>
(cherry picked from commit fbff4ee153f17da51c3b6675eb0616f2b2062f5e)

Conflicts:
src/client/Client.cc
- nautilus uses client_lock.Lock()/client_lock.Unlock() instead of
  std::lock_guard in a code block

src/client/Client.cc
src/client/Client.h

index 95b1e6719c726b8398a7e6adf18e28d95a45d2ee..bbffeb8199e61e90c26854f759cbe4b6c4d75093 100644 (file)
@@ -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();
 }
 
 
@@ -474,10 +471,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();
 
   client_lock.Lock();
   ceph_assert(!initialized);
@@ -14562,8 +14569,7 @@ StandaloneClient::~StandaloneClient()
 
 int StandaloneClient::init()
 {
-  timer.init();
-  objectcacher->start();
+  _pre_init();
   objecter->init();
 
   client_lock.Lock();
index c2218a250ccf82c9af358fa7831a4a3572e79ff2..4905d78cacd25fd654f4ae7d2674bdc5ae7eaa23 100644 (file)
@@ -952,6 +952,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