5#include <userver/congestion_control/controllers/linear_config.hpp>
6#include <userver/congestion_control/controllers/v2.hpp>
7#include <userver/congestion_control/limiter.hpp>
8#include <userver/dynamic_config/source.hpp>
9#include <userver/utils/periodic_task.hpp>
10#include <userver/utils/sliding_interval.hpp>
11#include <userver/yaml_config/yaml_config.hpp>
13USERVER_NAMESPACE_BEGIN
15namespace congestion_control::
v2 {
17constexpr std::size_t kShortTimingsEpochs = 3;
18constexpr std::size_t kLongTimingsEpochs = 30;
20class LinearController
final :
public Controller {
25 const std::string& name,
29 const StaticConfig& config,
30 dynamic_config::Source config_source,
31 std::function<
v2::
Config(
const dynamic_config::Snapshot&)> config_getter
37 struct SeparateTimings {
38 utils::SlidingInterval<int64_t> long_timings
{kLongTimingsEpochs
};
39 utils::SlidingInterval<int64_t> short_timings
{kShortTimingsEpochs
};
42 utils::SlidingInterval<int64_t> current_load_;
43 std::unordered_map<std::string, SeparateTimings> separate_timings_;
44 std::optional<std::size_t> current_limit_;
45 std::size_t epochs_passed_{0};
47 dynamic_config::Source config_source_;
48 std::function<
v2::
Config(
const dynamic_config::Snapshot&)> config_getter_;
51LinearController::StaticConfig