}
}
+RGWStreamReadHTTPResourceCRF::~RGWStreamReadHTTPResourceCRF()
+{
+ if (req) {
+ req->cancel();
+ req->wait();
+ delete req;
+ }
+}
+
int RGWStreamReadHTTPResourceCRF::init()
{
env->stack->init_new_io(req);
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);
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 */
caller(_caller),
http_manager(_http_manager),
write_drain_notify_cb(this) {}
- virtual ~RGWStreamWriteHTTPResourceCRF() = default;
+ virtual ~RGWStreamWriteHTTPResourceCRF();
int init() override {
return 0;
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();
}
}
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)
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;
int process();
int wait();
+ void cancel();
bool is_done();
rgw_http_req_data *get_req_data() { return req_data; }
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);