Skip to main content

rsiot/executor/
check_capacity.rs

1use tokio::sync::mpsc;
2use tracing::warn;
3
4/// Проверка емкости канала
5pub trait CheckCapacity {
6    /// Проверить емкость канала и выдать предупреждение, если канал заполнен
7    ///
8    /// Возвращает true, если емкость меньше заданного уровня
9    fn check_capacity(&self, threshold: f64, name: &str) -> &Self;
10}
11
12impl<T> CheckCapacity for mpsc::Receiver<T> {
13    fn check_capacity(&self, threshold: f64, name: &str) -> &Self {
14        let capacity = self.capacity();
15        let max_capacity = self.max_capacity();
16        check_capacity(threshold, name, capacity, max_capacity);
17        self
18    }
19}
20
21impl<T> CheckCapacity for mpsc::Sender<T> {
22    fn check_capacity(&self, threshold: f64, name: &str) -> &Self {
23        let capacity = self.capacity();
24        let max_capacity = self.max_capacity();
25        check_capacity(threshold, name, capacity, max_capacity);
26        self
27    }
28}
29
30fn check_capacity(threshold: f64, name: &str, capacity: usize, max_capacity: usize) {
31    let free_percent = (capacity as f64) / (max_capacity as f64);
32
33    let warning = free_percent < threshold;
34    if warning {
35        warn!(
36            "Channel capacity too low: {}; channel: {}",
37            free_percent, name
38        );
39    }
40}