]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: don't try to wait for pending if list is empty
authorYehuda Sadeh <yehuda@inktank.com>
Wed, 16 Jul 2014 19:23:31 +0000 (12:23 -0700)
committerSage Weil <sage@redhat.com>
Wed, 16 Jul 2014 22:27:49 +0000 (15:27 -0700)
Fixes: #8846
Backport: firefly, dumpling

This was broken at ea68b9372319fd0bab40856db26528d36359102e. We ended
up calling wait_pending_front() when pending list was empty.
This commit also moves the need_to_wait check to a different place,
where we actually throttle (and not just drain completed IOs).

Reported-by: Sylvain Munaut <s.munaut@whatever-company.com>
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
(cherry picked from commit f9f2417d7db01ecf2425039539997901615816a9)

src/rgw/rgw_rados.cc

index 3fdb49209baea8c3f30a54f9666a93bd4fc1a9c8..7f26c68b79431419749a49d2adfe6cc37288215f 100644 (file)
@@ -1095,6 +1095,9 @@ struct put_obj_aio_info RGWPutObjProcessor_Aio::pop_pending()
 
 int RGWPutObjProcessor_Aio::wait_pending_front()
 {
+  if (pending.empty()) {
+    return 0;
+  }
   struct put_obj_aio_info info = pop_pending();
   int ret = store->aio_wait(info.handle);
   return ret;
@@ -1128,8 +1131,9 @@ int RGWPutObjProcessor_Aio::throttle_data(void *handle, bool need_to_wait)
     pending.push_back(info);
   }
   size_t orig_size = pending.size();
-  while (pending_has_completed()
-         || need_to_wait) {
+
+  /* first drain complete IOs */
+  while (pending_has_completed()) {
     int r = wait_pending_front();
     if (r < 0)
       return r;
@@ -1142,10 +1146,14 @@ int RGWPutObjProcessor_Aio::throttle_data(void *handle, bool need_to_wait)
     max_chunks++;
   }
 
-  if (pending.size() > max_chunks) {
+  /* now throttle. Note that need_to_wait should only affect the first IO operation */
+  if (pending.size() > max_chunks ||
+      need_to_wait) {
     int r = wait_pending_front();
     if (r < 0)
       return r;
+
+    need_to_wait = false;
   }
   return 0;
 }