]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: cloud sync crf: delete requests 21648/head
authorYehuda Sadeh <yehuda@redhat.com>
Sun, 22 Apr 2018 12:15:56 +0000 (05:15 -0700)
committerYehuda Sadeh <yehuda@redhat.com>
Wed, 25 Apr 2018 16:03:53 +0000 (09:03 -0700)
Beside fixing a leak, this also cancels the pending request and
any future callback (that would crash). Updated the interface
to allow explicit request cancellation.

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

index b9a1f5e0266ce063a44d91f3f20d5cc4c521a479..7b5b05bd8e012e212fecc28476bf8cc7a786e5f8 100644 (file)
@@ -75,6 +75,15 @@ void RGWCRHTTPGetDataCB::claim_data(bufferlist *dest, uint64_t max) {
   }
 }
 
+RGWStreamReadHTTPResourceCRF::~RGWStreamReadHTTPResourceCRF()
+{
+  if (req) {
+    req->cancel();
+    req->wait();
+    delete req;
+  }
+}
+
 int RGWStreamReadHTTPResourceCRF::init()
 {
   env->stack->init_new_io(req);
@@ -170,6 +179,15 @@ bool RGWStreamReadHTTPResourceCRF::is_done()
   return req->is_done();
 }
 
+RGWStreamWriteHTTPResourceCRF::~RGWStreamWriteHTTPResourceCRF()
+{
+  if (req) {
+    req->cancel();
+    req->wait();
+    delete req;
+  }
+}
+
 void RGWStreamWriteHTTPResourceCRF::send_ready(const rgw_rest_obj& rest_obj)
 {
   req->set_send_length(rest_obj.content_len);
index 7d4156fa382528fb020c1165f50aa262b8d34877..0518edcb1ea5e3222d6a01db211b5e257fe46349 100644 (file)
@@ -430,6 +430,7 @@ public:
                                                                 http_manager(_http_manager) {
     rest_obj.init(_src_key);
   }
+  ~RGWStreamReadHTTPResourceCRF();
 
   int init() override;
   int read(bufferlist *data, uint64_t max, bool *need_retry) override; /* reentrant */
@@ -489,7 +490,7 @@ public:
                                                                caller(_caller),
                                                                http_manager(_http_manager),
                                                                write_drain_notify_cb(this) {}
-  virtual ~RGWStreamWriteHTTPResourceCRF() = default;
+  virtual ~RGWStreamWriteHTTPResourceCRF();
 
   int init() override {
     return 0;
index 25c63a7794dbe8b0148cd6c56be2c6f89bdb0829..d32f1b6734e0cdc0e8fe31eeaece46f879664c61 100644 (file)
@@ -531,14 +531,20 @@ int RGWHTTPClient::wait()
   return req_data->ret;
 }
 
-RGWHTTPClient::~RGWHTTPClient()
+void RGWHTTPClient::cancel()
 {
   if (req_data) {
     RGWHTTPManager *http_manager = req_data->mgr;
     if (http_manager) {
       http_manager->remove_request(this);
     }
+  }
+}
 
+RGWHTTPClient::~RGWHTTPClient()
+{
+  cancel();
+  if (req_data) {
     req_data->put();
   }
 }
@@ -784,13 +790,17 @@ void RGWHTTPManager::register_request(rgw_http_req_data *req_data)
   ldout(cct, 20) << __func__ << " mgr=" << this << " req_data->id=" << req_data->id << ", curl_handle=" << req_data->curl_handle << dendl;
 }
 
-void RGWHTTPManager::unregister_request(rgw_http_req_data *req_data)
+bool RGWHTTPManager::unregister_request(rgw_http_req_data *req_data)
 {
   RWLock::WLocker rl(reqs_lock);
+  if (!req_data->registered) {
+    return false;
+  }
   req_data->get();
   req_data->registered = false;
   unregistered_reqs.push_back(req_data);
   ldout(cct, 20) << __func__ << " mgr=" << this << " req_data->id=" << req_data->id << ", curl_handle=" << req_data->curl_handle << dendl;
+  return true;
 }
 
 void RGWHTTPManager::complete_request(rgw_http_req_data *req_data)
@@ -960,7 +970,9 @@ int RGWHTTPManager::remove_request(RGWHTTPClient *client)
     unlink_request(req_data);
     return 0;
   }
-  unregister_request(req_data);
+  if (!unregister_request(req_data)) {
+    return 0;
+  }
   int ret = signal_thread();
   if (ret < 0) {
     return ret;
index 41c4c5bbbf1427f68c15ae7da5ec108e2e5cc886..4f40402a0e24755c428363b417a535613a37cdc0 100644 (file)
@@ -177,6 +177,7 @@ public:
   int process();
 
   int wait();
+  void cancel();
   bool is_done();
 
   rgw_http_req_data *get_req_data() { return req_data; }
@@ -315,7 +316,7 @@ class RGWHTTPManager {
   void register_request(rgw_http_req_data *req_data);
   void complete_request(rgw_http_req_data *req_data);
   void _complete_request(rgw_http_req_data *req_data);
-  void unregister_request(rgw_http_req_data *req_data);
+  bool unregister_request(rgw_http_req_data *req_data);
   void _unlink_request(rgw_http_req_data *req_data);
   void unlink_request(rgw_http_req_data *req_data);
   void finish_request(rgw_http_req_data *req_data, int r);