From 0e6c42e0c94370d13eea10eb78a24e11617e52ea Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Fri, 10 Jul 2026 15:02:08 +0800 Subject: [PATCH] fixup! fixup! crimson/os/seastore: throttle bandwidth to secondary devices --- .../os/seastore/extent_placement_manager.cc | 44 ++++++++++++------- .../os/seastore/extent_placement_manager.h | 16 +++++-- 2 files changed, 39 insertions(+), 21 deletions(-) diff --git a/src/crimson/os/seastore/extent_placement_manager.cc b/src/crimson/os/seastore/extent_placement_manager.cc index 8350fb8784e..918d5c17c28 100644 --- a/src/crimson/os/seastore/extent_placement_manager.cc +++ b/src/crimson/os/seastore/extent_placement_manager.cc @@ -196,9 +196,14 @@ SegmentedOolWriter::alloc_write_ool_extents( for (auto &e : extents) { size += e->get_length(); } - co_await trans_intr::make_interruptible( - token_bucket.get(size)); - co_await do_write(t, extents); + try { + co_await trans_intr::make_interruptible( + token_bucket.get(size)); + co_await do_write(t, extents); + } catch (...) { + token_bucket.release(size); + throw; + } }); } @@ -1273,21 +1278,26 @@ RandomBlockOolWriter::alloc_write_ool_extents( for (auto &extent : extents) { size += extent->get_length(); } - co_await trans_intr::make_interruptible( - token_bucket.get(size)); - seastar::lw_shared_ptr ptr = - seastar::make_lw_shared(); - ptr->pending_extents = t.get_pre_alloc_list(); - assert(!t.is_conflicted()); - t.set_pending_ool(ptr); - co_await do_write(t, extents - ).finally([this, ptr=ptr] { - if (ptr->is_conflicted) { - for (auto &e : ptr->pending_extents) { - rb_cleaner->mark_space_free(e->get_paddr(), e->get_length()); + try { + co_await trans_intr::make_interruptible( + token_bucket.get(size)); + seastar::lw_shared_ptr ptr = + seastar::make_lw_shared(); + ptr->pending_extents = t.get_pre_alloc_list(); + assert(!t.is_conflicted()); + t.set_pending_ool(ptr); + co_await do_write(t, extents + ).finally([this, ptr=ptr] { + if (ptr->is_conflicted) { + for (auto &e : ptr->pending_extents) { + rb_cleaner->mark_space_free(e->get_paddr(), e->get_length()); + } } - } - }); + }); + } catch (...) { + token_bucket.release(size); + throw; + } }); } diff --git a/src/crimson/os/seastore/extent_placement_manager.h b/src/crimson/os/seastore/extent_placement_manager.h index edfab2dcd6b..016d1348fe7 100644 --- a/src/crimson/os/seastore/extent_placement_manager.h +++ b/src/crimson/os/seastore/extent_placement_manager.h @@ -40,10 +40,9 @@ public: return; } assert(tokens < max_tokens); - tokens += max_tokens / 10; - if (tokens > max_tokens) { - tokens = max_tokens; - } + tokens += std::min( + max_tokens / 10 + 1, + max_tokens - tokens); do_wake(); }); if (!timer.armed()) { @@ -75,6 +74,15 @@ public: } } + void release(uint64_t size) { + if (tokens == max_tokens) { + return; + } + assert(tokens < max_tokens); + tokens += std::min(size, max_tokens - tokens); + do_wake(); + } + private: void do_wake() { while (!blockers.empty()) { -- 2.47.3