From: Yehuda Sadeh Date: Tue, 10 May 2016 22:34:19 +0000 (-0700) Subject: rgw: don't unregister request if request is not connected to manager X-Git-Tag: v11.0.0~462^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=16c0605bf276b245fbf41cb3e000ecdf7b049e15;p=ceph.git rgw: don't unregister request if request is not connected to manager That means that request is already complete and done with the manager. Signed-off-by: Yehuda Sadeh --- diff --git a/src/rgw/rgw_http_client.cc b/src/rgw/rgw_http_client.cc index 8b419c807eb22..f11ef2b322241 100644 --- a/src/rgw/rgw_http_client.cc +++ b/src/rgw/rgw_http_client.cc @@ -41,6 +41,7 @@ struct rgw_http_req_data : public RefCountedObject { return ret; } + void finish(int r) { Mutex::Locker l(lock); ret = r; @@ -64,6 +65,11 @@ struct rgw_http_req_data : public RefCountedObject { Mutex::Locker l(lock); return ret; } + + RGWHTTPManager *get_manager() { + Mutex::Locker l(lock); + return mgr; + } }; /* @@ -328,7 +334,10 @@ int RGWHTTPClient::wait() RGWHTTPClient::~RGWHTTPClient() { if (req_data) { - req_data->mgr->remove_request(this); + RGWHTTPManager *http_manager = req_data->get_manager(); + if (http_manager) { + http_manager->remove_request(this); + } req_data->put(); } @@ -475,6 +484,10 @@ void RGWHTTPManager::_complete_request(rgw_http_req_data *req_data) if (iter != reqs.end()) { reqs.erase(iter); } + { + Mutex::Locker l(req_data->lock); + req_data->mgr = nullptr; + } if (completion_mgr) { completion_mgr->complete(NULL, req_data->user_info); } @@ -790,7 +803,14 @@ void *RGWHTTPManager::reqs_thread_entry() } } + RWLock::WLocker rl(reqs_lock); + for (auto r : unregistered_reqs) { + _finish_request(r, -ECANCELED); + } + + unregistered_reqs.clear(); + auto all_reqs = std::move(reqs); for (auto iter : all_reqs) { _finish_request(iter.second, -ECANCELED);