From: Kefu Chai Date: Wed, 26 Oct 2016 09:21:41 +0000 (+0800) Subject: librados: postpone cct deletion X-Git-Tag: v11.1.0~482^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F11659%2Fhead;p=ceph.git librados: postpone cct deletion RefCountedObject::put() prints log using cct, but RadosClient relinquishes the reference to cct too early, so when its `RefCountedObject` member variables print log when they are destructed, the cct is already freed. hence we have a segfault. to address this problem, we need postpone destructure of it after all other RefCountedObject member variables are destroyed. Signed-off-by: Kefu Chai --- diff --git a/src/librados/RadosClient.cc b/src/librados/RadosClient.cc index f73ff4ee89c5..2300f62058bf 100644 --- a/src/librados/RadosClient.cc +++ b/src/librados/RadosClient.cc @@ -65,6 +65,7 @@ bool librados::RadosClient::ms_get_authorizer(int dest_type, librados::RadosClient::RadosClient(CephContext *cct_) : Dispatcher(cct_->get()), + cct_deleter{cct_, [](CephContext *p) {p->put();}}, conf(cct_->_conf), state(DISCONNECTED), monclient(cct_), @@ -431,7 +432,6 @@ librados::RadosClient::~RadosClient() delete messenger; if (objecter) delete objecter; - cct->put(); cct = NULL; } diff --git a/src/librados/RadosClient.h b/src/librados/RadosClient.h index a88da49ba740..557d14f241ea 100644 --- a/src/librados/RadosClient.h +++ b/src/librados/RadosClient.h @@ -37,6 +37,9 @@ class AioCompletionImpl; class librados::RadosClient : public Dispatcher { + std::unique_ptr > cct_deleter; + public: using Dispatcher::cct; md_config_t *conf;