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)
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();
}
}
}
-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);
int StandaloneClient::init()
{
- timer.init();
- objectcacher->start();
+ _pre_init();
objecter->init();
client_lock.lock();
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