]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
SimpleRADOSStriper: wait for finished aios after write
authorPatrick Donnelly <pdonnell@redhat.com>
Sat, 13 Mar 2021 21:39:50 +0000 (13:39 -0800)
committerPatrick Donnelly <pdonnell@redhat.com>
Fri, 19 Mar 2021 15:52:55 +0000 (08:52 -0700)
So the "aios" (better named) vector doesn't grow infinitely.

Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
src/SimpleRADOSStriper.cc
src/SimpleRADOSStriper.h

index 1c2b96c2973805ddc340145f7296176737798985..736e8769d43c8afbdd2821dadc0a8eb317f834ed 100644 (file)
@@ -120,7 +120,8 @@ int SimpleRADOSStriper::remove()
     return -EBLOCKLISTED;
   }
 
-  if (int rc = wait_for_updates(); rc < 0) {
+  if (int rc = wait_for_aios(true); rc < 0) {
+    aios_failure = 0;
     return rc;
   }
 
@@ -155,19 +156,29 @@ int SimpleRADOSStriper::truncate(uint64_t size)
   return 0;
 }
 
-int SimpleRADOSStriper::wait_for_updates()
+int SimpleRADOSStriper::wait_for_aios(bool block)
 {
-  d(10) << dendl;
-
-  for (auto& aiocp : updates) {
-    if (int rc = aiocp->wait_for_complete(); rc < 0) {
-      d(5) << " update failed: " << cpp_strerror(rc) << dendl;
-      return rc;
+  while (!aios.empty()) {
+    auto& aiocp = aios.front();
+    int rc;
+    if (block) {
+      rc = aiocp->wait_for_complete();
+    } else {
+      if (aiocp->is_complete()) {
+        rc = aiocp->get_return_value();
+      } else {
+        return 0;
+      }
     }
+    if (rc) {
+      d(5) << " aio failed: " << cpp_strerror(rc) << dendl;
+      if (aios_failure == 0) {
+        aios_failure = rc;
+      }
+    }
+    aios.pop();
   }
-  updates.clear();
-
-  return 0;
+  return aios_failure;
 }
 
 int SimpleRADOSStriper::flush()
@@ -184,7 +195,8 @@ int SimpleRADOSStriper::flush()
     }
   }
 
-  if (int rc = wait_for_updates(); rc < 0) {
+  if (int rc = wait_for_aios(true); rc < 0) {
+    aios_failure = 0;
     return rc;
   }
 
@@ -418,7 +430,7 @@ int SimpleRADOSStriper::set_metadata(uint64_t new_size, bool update_size)
       allocated = new_allocated;
     }
     if (aiocp) {
-      updates.emplace_back(std::move(aiocp));
+      aios.emplace(std::move(aiocp));
     }
     if (update_size) {
       size = new_size;
@@ -452,10 +464,12 @@ ssize_t SimpleRADOSStriper::write(const void* data, size_t len, uint64_t off)
     if (int rc = ioctx.aio_write(ext.soid, aiocp.get(), bl, ext.len, ext.off); rc < 0) {
       break;
     }
-    updates.emplace_back(std::move(aiocp));
+    aios.emplace(std::move(aiocp));
     w += ext.len;
   }
 
+  wait_for_aios(false); // clean up finished completions
+
   if (size < (len+off)) {
     size = len+off;
     size_dirty = true;
index 2472eb7dda97e353acd16fc7df5421750d884e9e..2e7984870f9085e3e9b70386d505f3edbc9fcbbd 100644 (file)
@@ -15,6 +15,7 @@
 #ifndef _SIMPLERADOSSTRIPER_H
 #define _SIMPLERADOSSTRIPER_H
 
+#include <queue>
 #include <string_view>
 #include <thread>
 
@@ -91,7 +92,7 @@ protected:
   int set_metadata(uint64_t new_size, bool update_size);
   int shrink_alloc(uint64_t a);
   int maybe_shrink_alloc();
-  int wait_for_updates();
+  int wait_for_aios(bool block);
   int recover_lock();
   extent get_next_extent(uint64_t off, size_t len) const;
   extent get_first_extent() const {
@@ -130,7 +131,8 @@ private:
   bool locked = false;
   bool size_dirty = false;
   bool blocklist_the_dead = true;
-  std::vector<aiocompletionptr> updates;
+  std::queue<aiocompletionptr> aios;
+  int aios_failure = 0;
   std::string myaddrs;
 };