From 458c6e7c12a6030d07cad2f1d132a43ec1c97fb4 Mon Sep 17 00:00:00 2001 From: Patrick Donnelly Date: Sat, 13 Mar 2021 13:39:50 -0800 Subject: [PATCH] SimpleRADOSStriper: wait for finished aios after write So the "aios" (better named) vector doesn't grow infinitely. Signed-off-by: Patrick Donnelly --- src/SimpleRADOSStriper.cc | 42 ++++++++++++++++++++++++++------------- src/SimpleRADOSStriper.h | 6 ++++-- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/SimpleRADOSStriper.cc b/src/SimpleRADOSStriper.cc index 1c2b96c297380..736e8769d43c8 100644 --- a/src/SimpleRADOSStriper.cc +++ b/src/SimpleRADOSStriper.cc @@ -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; diff --git a/src/SimpleRADOSStriper.h b/src/SimpleRADOSStriper.h index 2472eb7dda97e..2e7984870f908 100644 --- a/src/SimpleRADOSStriper.h +++ b/src/SimpleRADOSStriper.h @@ -15,6 +15,7 @@ #ifndef _SIMPLERADOSSTRIPER_H #define _SIMPLERADOSSTRIPER_H +#include #include #include @@ -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 updates; + std::queue aios; + int aios_failure = 0; std::string myaddrs; }; -- 2.39.5