From: Xuehan Xu Date: Fri, 10 Jul 2026 07:02:08 +0000 (+0800) Subject: fixup! fixup! crimson/os/seastore: throttle bandwidth to secondary devices X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0e6c42e0c94370d13eea10eb78a24e11617e52ea;p=ceph-ci.git fixup! fixup! crimson/os/seastore: throttle bandwidth to secondary devices --- 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()) {