]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: don't call http data callbacks under lock
authorYehuda Sadeh <yehuda@redhat.com>
Tue, 20 Mar 2018 18:52:44 +0000 (11:52 -0700)
committerYehuda Sadeh <yehuda@redhat.com>
Thu, 12 Apr 2018 22:38:40 +0000 (15:38 -0700)
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 <yehuda@redhat.com>
src/rgw/rgw_http_client.cc

index 02410d9a018982013eed4a9b0e173d017b9bbc34..a3e23e3d6e3a1e291ea30f2161855119ee5cc10c 100644 (file)
@@ -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<rgw_http_req_data *>(_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;
   }