userver: userver/congestion_control/controllers/linear.hpp Source File
Loading...
Searching...
No Matches
linear.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/congestion_control/controllers/linear.hpp
4/// @brief @copybrief congestion_control::v2::LinearController
5
6#include <optional>
7
8#include <userver/congestion_control/controllers/linear_config.hpp>
9#include <userver/congestion_control/controllers/v2.hpp>
10#include <userver/congestion_control/limiter.hpp>
11#include <userver/dynamic_config/source.hpp>
12#include <userver/utils/periodic_task.hpp>
13#include <userver/utils/sliding_interval.hpp>
14#include <userver/yaml_config/yaml_config.hpp>
15
16USERVER_NAMESPACE_BEGIN
17
18namespace congestion_control::v2 {
19
20constexpr std::size_t kShortTimingsEpochs = 3;
21constexpr std::size_t kLongTimingsEpochs = 30;
22
23/// @brief Linear congestion control controller (v2)
24class LinearController final : public Controller {
25public:
26 using StaticConfig = Controller::Config;
27
28 LinearController(
29 const std::string& name,
30 v2::Sensor& sensor,
31 Limiter& limiter,
32 Stats& stats,
33 const StaticConfig& config,
34 dynamic_config::Source config_source,
35 std::function<v2::Config(const dynamic_config::Snapshot&)> config_getter
36 );
37
38 LimitWithDetails Update(const Sensor::Data& current) override;
39
40private:
41 struct SeparateTimings {
42 utils::SlidingInterval<int64_t> long_timings{kLongTimingsEpochs};
43 utils::SlidingInterval<int64_t> short_timings{kShortTimingsEpochs};
44 };
45 StaticConfig config_;
46 utils::SlidingInterval<int64_t> current_load_;
47 std::unordered_map<std::string, SeparateTimings> separate_timings_;
48 std::optional<std::size_t> current_limit_;
49 std::size_t epochs_passed_{0};
50
51 dynamic_config::Source config_source_;
52 std::function<v2::Config(const dynamic_config::Snapshot&)> config_getter_;
53};
54
55LinearController::StaticConfig
56Parse(const yaml_config::YamlConfig& value, formats::parse::To<LinearController::StaticConfig>);
57
58} // namespace congestion_control::v2
59
60USERVER_NAMESPACE_END