From 8b19229df364a166c1ed78b97234438800e77521 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Wed, 26 Oct 2016 17:21:41 +0800 Subject: [PATCH] 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 --- src/librados/RadosClient.cc | 2 +- src/librados/RadosClient.h | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/librados/RadosClient.cc b/src/librados/RadosClient.cc index f73ff4ee89c..2300f62058b 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 a88da49ba74..557d14f241e 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; -- 2.47.3