Skip to content

Commit 12680f8

Browse files
committed
crimson/.../mclock_scheduler: add crimson specific background job
Signed-off-by: Samuel Just <[email protected]>
1 parent c1cc2f1 commit 12680f8

File tree

1 file changed

+47
-1
lines changed

1 file changed

+47
-1
lines changed

src/crimson/osd/scheduler/mclock_scheduler.h

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
#pragma once
1717

18+
#include <chrono>
19+
#include <functional>
1820
#include <ostream>
1921
#include <map>
2022
#include <vector>
@@ -74,12 +76,56 @@ class mClockScheduler : public Scheduler, md_config_obs_t {
7476
const scheduler_id_t &id) const;
7577
} client_registry;
7678

79+
class crimson_mclock_cleaning_job_t {
80+
struct job_control_t {
81+
std::chrono::milliseconds period;
82+
std::function<void()> body;
83+
84+
bool stopping = false;
85+
seastar::condition_variable cv;
86+
87+
88+
template <typename D, typename F>
89+
job_control_t(D _period, F &&_body) :
90+
period(std::chrono::duration_cast<decltype(period)>(_period)),
91+
body(std::forward<F>(_body)) {
92+
}
93+
};
94+
seastar::lw_shared_ptr<job_control_t> control;
95+
96+
static seastar::future<> run(
97+
seastar::lw_shared_ptr<job_control_t> control) {
98+
while (!control->stopping) {
99+
std::invoke(control->body);
100+
co_await control->cv.wait(control->period);
101+
}
102+
}
103+
public:
104+
template<typename... Args>
105+
crimson_mclock_cleaning_job_t(Args&&... args) :
106+
control(seastar::make_lw_shared<job_control_t>(
107+
std::forward<Args>(args)...))
108+
{
109+
std::ignore = run(control);
110+
}
111+
112+
void try_update(milliseconds _period) {
113+
control->period = _period;
114+
control->cv.signal();
115+
}
116+
117+
~crimson_mclock_cleaning_job_t() {
118+
control->stopping = true;
119+
control->cv.signal();
120+
}
121+
};
77122
using mclock_queue_t = crimson::dmclock::PullPriorityQueue<
78123
scheduler_id_t,
79124
item_t,
80125
true,
81126
true,
82-
2>;
127+
2,
128+
crimson_mclock_cleaning_job_t>;
83129
mclock_queue_t scheduler;
84130
std::list<item_t> immediate;
85131

0 commit comments

Comments
 (0)