use std::{
collections::VecDeque,
time::{Duration, Instant},
};
#[cfg(feature = "locktick")]
use locktick::parking_lot::Mutex;
#[cfg(not(feature = "locktick"))]
use parking_lot::Mutex;
#[derive(Default)]
struct SyncMetricsData {
completed_requests: VecDeque<Instant>,
sync_speed: f64,
}
#[derive(Default)]
pub struct BlockSyncMetrics {
data: Mutex<SyncMetricsData>,
}
impl BlockSyncMetrics {
const METRIC_WINDOW: Duration = Duration::from_secs(60);
pub fn get_sync_speed(&self) -> f64 {
let mut data = self.data.lock();
while let Some(time) = data.completed_requests.front()
&& time.elapsed() > Self::METRIC_WINDOW
{
data.completed_requests.pop_front();
}
data.sync_speed = data.completed_requests.len() as f64 / Self::METRIC_WINDOW.as_secs_f64();
data.sync_speed
}
pub fn count_request_completed(&self) {
let mut data = self.data.lock();
while let Some(time) = data.completed_requests.front()
&& time.elapsed() > Self::METRIC_WINDOW
{
data.completed_requests.pop_front();
}
data.completed_requests.push_back(Instant::now());
}
pub fn mark_fully_synced(&self) {
self.data.lock().sync_speed = 0.0;
}
}