From 9b283915e3a2fef730223fff726817ad36f56e34 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Tue, 20 Mar 2018 11:52:44 -0700 Subject: [PATCH] rgw: don't call http data callbacks under lock There is no need to hold req_data->lock when calling into client callbacks. This removes an unneeded lock dependency (that is a problem when cancelliing coroutines stack). Signed-off-by: Yehuda Sadeh --- src/rgw/rgw_http_client.cc | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/rgw/rgw_http_client.cc b/src/rgw/rgw_http_client.cc index 02410d9a01898..a3e23e3d6e3a1 100644 --- a/src/rgw/rgw_http_client.cc +++ b/src/rgw/rgw_http_client.cc @@ -299,13 +299,18 @@ size_t RGWHTTPClient::receive_http_data(void * const ptr, return len; } - Mutex::Locker l(req_data->lock); - - if (!req_data->registered) { - return len; + RGWHTTPClient *client; + + { + Mutex::Locker l(req_data->lock); + if (!req_data->registered) { + return len; + } + + client = req_data->client; } - - int ret = req_data->client->receive_data((char *)ptr + skip_bytes, len - skip_bytes, &pause); + + int ret = client->receive_data((char *)ptr + skip_bytes, len - skip_bytes, &pause); if (ret < 0) { dout(0) << "WARNING: client->receive_data() returned ret=" << ret << dendl; } @@ -315,6 +320,7 @@ size_t RGWHTTPClient::receive_http_data(void * const ptr, if (pause) { dout(20) << "RGWHTTPClient::receive_http_data(): pause" << dendl; skip_bytes = len; + Mutex::Locker l(req_data->lock); req_data->read_paused = true; return CURL_WRITEFUNC_PAUSE; } @@ -331,21 +337,28 @@ size_t RGWHTTPClient::send_http_data(void * const ptr, { rgw_http_req_data *req_data = static_cast(_info); - Mutex::Locker l(req_data->lock); + RGWHTTPClient *client; + + { + Mutex::Locker l(req_data->lock); - if (!req_data->registered) { - return 0; + if (!req_data->registered) { + return 0; + } + + client = req_data->client; } bool pause = false; - int ret = req_data->client->send_data(ptr, size * nmemb, &pause); + int ret = client->send_data(ptr, size * nmemb, &pause); if (ret < 0) { dout(0) << "WARNING: client->receive_data() returned ret=" << ret << dendl; } if (ret == 0 && pause) { + Mutex::Locker l(req_data->lock); req_data->write_paused = true; return CURL_READFUNC_PAUSE; } -- 2.39.5