userver: userver/congestion_control/controllers/linear.hpp Source File
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
linear.hpp
1#pragma once
2
3#include <optional>
4
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>
12
13USERVER_NAMESPACE_BEGIN
14
15namespace congestion_control::v2 {
16
17constexpr std::size_t kShortTimingsEpochs = 3;
18constexpr std::size_t kLongTimingsEpochs = 30;
19
20class LinearController final : public Controller {
21public:
22 using StaticConfig = Controller::Config;
23
24 LinearController(
25 const std::string& name,
26 v2::Sensor& sensor,
27 Limiter& limiter,
28 Stats& stats,
29 const StaticConfig& config,
30 dynamic_config::Source config_source,
31 std::function<v2::Config(const dynamic_config::Snapshot&)> config_getter
32 );
33
34 LimitWithDetails Update(const Sensor::Data& current) override;
35
36private:
37 struct SeparateTimings {
38 utils::SlidingInterval<int64_t> long_timings{kLongTimingsEpochs};
39 utils::SlidingInterval<int64_t> short_timings{kShortTimingsEpochs};
40 };
41 StaticConfig config_;
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};
46
47 dynamic_config::Source config_source_;
48 std::function<v2::Config(const dynamic_config::Snapshot&)> config_getter_;
49};
50
51LinearController::StaticConfig
52Parse(const yaml_config::YamlConfig& value, formats::parse::To<LinearController::StaticConfig>);
53
54} // namespace congestion_control::v2
55
56USERVER_NAMESPACE_END