]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
fixup! fixup! crimson/os/seastore: throttle bandwidth to secondary devices dev-lbc2
authorXuehan Xu <xuxuehan@qianxin.com>
Fri, 10 Jul 2026 07:02:08 +0000 (15:02 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Sat, 11 Jul 2026 02:48:29 +0000 (10:48 +0800)
src/crimson/os/seastore/extent_placement_manager.cc
src/crimson/os/seastore/extent_placement_manager.h

index 8350fb8784ef6cc116640613fca4bdecea3978d2..918d5c17c2874a647777c8ef2d612f4a0f45f217 100644 (file)
@@ -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<rbm_pending_ool_t> ptr =
-        seastar::make_lw_shared<rbm_pending_ool_t>();
-    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<rbm_pending_ool_t> ptr =
+          seastar::make_lw_shared<rbm_pending_ool_t>();
+      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;
+    }
   });
 }
 
index edfab2dcd6b7439e53594b3eeda8fac0acba65f2..016d1348fe751f3d4b2f35a05163decccbc7b2bd 100644 (file)
@@ -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()) {