vector/sinks/util/adaptive_concurrency/
layer.rs

1use tower::Layer;
2
3use super::{AdaptiveConcurrencyLimit, AdaptiveConcurrencySettings};
4use crate::sinks::util::retries::RetryLogic;
5
6/// Enforces a limit on the concurrent number of requests the underlying
7/// service can handle.
8#[derive(Debug, Clone)]
9pub struct AdaptiveConcurrencyLimitLayer<L> {
10    concurrency: Option<usize>,
11    options: AdaptiveConcurrencySettings,
12    logic: L,
13}
14
15impl<L> AdaptiveConcurrencyLimitLayer<L> {
16    /// Create a new concurrency limit layer.
17    pub const fn new(
18        concurrency: Option<usize>,
19        options: AdaptiveConcurrencySettings,
20        logic: L,
21    ) -> Self {
22        AdaptiveConcurrencyLimitLayer {
23            concurrency,
24            options,
25            logic,
26        }
27    }
28}
29
30impl<S, L: RetryLogic> Layer<S> for AdaptiveConcurrencyLimitLayer<L> {
31    type Service = AdaptiveConcurrencyLimit<S, L>;
32
33    fn layer(&self, service: S) -> Self::Service {
34        AdaptiveConcurrencyLimit::new(service, self.logic.clone(), self.concurrency, self.options)
35    }
36}