From: Yehuda Sadeh Date: Sun, 22 Apr 2018 12:15:56 +0000 (-0700) Subject: rgw: cloud sync crf: delete requests X-Git-Tag: v13.1.0~31^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a3ad431717829529f11b4aeddc1cae47b64199d0;p=ceph.git rgw: cloud sync crf: delete requests 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 --- diff --git a/src/rgw/rgw_cr_rest.cc b/src/rgw/rgw_cr_rest.cc index b9a1f5e0266c..7b5b05bd8e01 100644 --- a/src/rgw/rgw_cr_rest.cc +++ b/src/rgw/rgw_cr_rest.cc @@ -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); diff --git a/src/rgw/rgw_cr_rest.h b/src/rgw/rgw_cr_rest.h index 7d4156fa3825..0518edcb1ea5 100644 --- a/src/rgw/rgw_cr_rest.h +++ b/src/rgw/rgw_cr_rest.h @@ -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; diff --git a/src/rgw/rgw_http_client.cc b/src/rgw/rgw_http_client.cc index 25c63a7794db..d32f1b6734e0 100644 --- a/src/rgw/rgw_http_client.cc +++ b/src/rgw/rgw_http_client.cc @@ -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; diff --git a/src/rgw/rgw_http_client.h b/src/rgw/rgw_http_client.h index 41c4c5bbbf14..4f40402a0e24 100644 --- a/src/rgw/rgw_http_client.h +++ b/src/rgw/rgw_http_client.h @@ -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);