12#include <userver/engine/single_consumer_event.hpp>
13#include <userver/engine/task/task_with_result.hpp>
14#include <userver/rcu/rcu.hpp>
15#include <userver/utils/assert.hpp>
16#include <userver/utils/flags.hpp>
19#include <userver/engine/condition_variable.hpp>
20#include <userver/testsuite/periodic_task_control.hpp>
21#include <userver/tracing/span.hpp>
23USERVER_NAMESPACE_BEGIN
26class PeriodicTaskControl;
43class PeriodicTask
final {
64 struct Settings
final {
65 static constexpr uint8_t kDistributionPercent = 25;
68 std::chrono::milliseconds period,
72 : Settings(period, kDistributionPercent, flags, span_level) {}
75 std::chrono::milliseconds period,
76 std::chrono::milliseconds distribution,
80 : period(period), distribution(distribution), flags(flags),
span_level(span_level) {
81 UASSERT(distribution <= period);
85 std::chrono::milliseconds period,
86 uint8_t distribution_percent,
90 : Settings(period, period * distribution_percent / 100, flags, span_level) {
91 UASSERT(distribution_percent <= 100);
94 template <
class Rep,
class Period>
95 constexpr Settings(std::chrono::duration<Rep, Period> period)
96 : Settings(period, kDistributionPercent, {},
logging::
Level::kInfo) {}
98 bool operator==(
const Settings& other)
const noexcept;
99 bool operator!=(
const Settings& other)
const noexcept;
130 using Callback = std::function<
void()>;
135 PeriodicTask(PeriodicTask&&) =
delete;
136 PeriodicTask(
const PeriodicTask&) =
delete;
143 void Start(std::string name, Settings settings, Callback callback);
207 enum class SuspendState { kRunning, kSuspended };
215 bool StepDebug(
bool preserve_span);
219 std::chrono::milliseconds MutatePeriod(std::chrono::milliseconds period);
221 std::string_view GetName()
const noexcept;
224 std::atomic<
bool> is_name_set_{
false};
227 rcu::Variable<Settings> settings_;
228 engine::SingleConsumerEvent changed_event_;
229 std::atomic<
bool> should_force_step_{
false};
230 std::optional<std::minstd_rand> mutate_period_random_;
233 engine::Mutex step_mutex_;
234 std::atomic<SuspendState> suspend_state_;