]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: don't unregister request if request is not connected to manager 9102/head
authorYehuda Sadeh <yehuda@redhat.com>
Tue, 10 May 2016 22:34:19 +0000 (15:34 -0700)
committerYehuda Sadeh <yehuda@redhat.com>
Thu, 12 May 2016 16:14:40 +0000 (09:14 -0700)
That means that request is already complete and done with the manager.

Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
src/rgw/rgw_http_client.cc

index 8b419c807eb2295077848d4e9dbd474ced42e298..f11ef2b322241aeb64bdf139765c411a3849338c 100644 (file)
@@ -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);