]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/.../mclock_scheduler: add crimson specific background job
authorSamuel Just <sjust@redhat.com>
Tue, 19 Aug 2025 16:24:40 +0000 (09:24 -0700)
committerSamuel Just <sjust@redhat.com>
Fri, 5 Sep 2025 21:47:42 +0000 (14:47 -0700)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/osd/scheduler/mclock_scheduler.h

index 16082ffd0954042207d430e5c23ebefea4bf976c..6f42ebfdeffafc0b1e625061035d615aba9f1911 100644 (file)
@@ -15,6 +15,8 @@
 
 #pragma once
 
+#include <chrono>
+#include <functional>
 #include <ostream>
 #include <map>
 #include <vector>
@@ -74,12 +76,56 @@ class mClockScheduler : public Scheduler, md_config_obs_t {
       const scheduler_id_t &id) const;
   } client_registry;
 
+  class crimson_mclock_cleaning_job_t {
+    struct job_control_t {
+      std::chrono::milliseconds period;
+      std::function<void()> body;
+
+      bool stopping = false;
+      seastar::condition_variable cv;
+
+
+      template <typename D, typename F>
+      job_control_t(D _period, F &&_body) :
+       period(std::chrono::duration_cast<decltype(period)>(_period)),
+       body(std::forward<F>(_body)) {
+      }
+    };
+    seastar::lw_shared_ptr<job_control_t> control;
+
+    static seastar::future<> run(
+      seastar::lw_shared_ptr<job_control_t> control) {
+      while (!control->stopping) {
+       std::invoke(control->body);
+       co_await control->cv.wait(control->period);
+      }
+    }
+  public:
+    template<typename... Args>
+      crimson_mclock_cleaning_job_t(Args&&... args) :
+      control(seastar::make_lw_shared<job_control_t>(
+               std::forward<Args>(args)...))
+    {
+      std::ignore = run(control);
+    }
+
+    void try_update(milliseconds _period) {
+      control->period = _period;
+      control->cv.signal();
+    }
+
+    ~crimson_mclock_cleaning_job_t() {
+      control->stopping = true;
+      control->cv.signal();
+    }
+  };
   using mclock_queue_t = crimson::dmclock::PullPriorityQueue<
     scheduler_id_t,
     item_t,
     true,
     true,
-    2>;
+    2,
+    crimson_mclock_cleaning_job_t>;
   mclock_queue_t scheduler;
   std::list<item_t> immediate;