use std::time::Duration;
use crate::{
TrypemaError,
common::{MILLISECONDS_PER_SECOND, SECONDS_PER_HOUR, SECONDS_PER_MINUTE, checked_duration},
};
pub(crate) const EPOCH_CHANGE_INTERVAL: Duration = Duration::from_secs(15);
pub(crate) fn committer_inactivity_sleep(sync_interval: Duration) -> Duration {
let min_ms = (EPOCH_CHANGE_INTERVAL * 2).as_millis() as u64;
let multiplier: u64 = 10;
Duration::from_millis(min_ms.max(sync_interval.as_millis() as u64 * multiplier)) / 2
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub(crate) enum RedisRateLimiterSignal {
Flush,
}
#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
pub struct SyncInterval(u64);
impl Default for SyncInterval {
fn default() -> Self {
Self(10)
}
}
impl SyncInterval {
pub fn as_milliseconds(self) -> u64 {
self.0
}
pub fn as_seconds(self) -> f64 {
self.as_period(MILLISECONDS_PER_SECOND)
}
pub fn as_minutes(self) -> f64 {
self.as_period(MILLISECONDS_PER_SECOND * SECONDS_PER_MINUTE)
}
pub fn as_hours(self) -> f64 {
self.as_period(MILLISECONDS_PER_SECOND * SECONDS_PER_HOUR)
}
pub fn milliseconds(value: u64) -> Result<Self, TrypemaError> {
Self::from_milliseconds(value, 1)
}
pub fn milliseconds_or_panic(value: u64) -> Self {
Self::milliseconds(value).unwrap()
}
pub fn seconds(value: u64) -> Result<Self, TrypemaError> {
Self::from_milliseconds(value, MILLISECONDS_PER_SECOND)
}
pub fn seconds_or_panic(value: u64) -> Self {
Self::seconds(value).unwrap()
}
pub fn minutes(value: u64) -> Result<Self, TrypemaError> {
Self::from_milliseconds(value, MILLISECONDS_PER_SECOND * SECONDS_PER_MINUTE)
}
pub fn minutes_or_panic(value: u64) -> Self {
Self::minutes(value).unwrap()
}
pub fn hours(value: u64) -> Result<Self, TrypemaError> {
Self::from_milliseconds(value, MILLISECONDS_PER_SECOND * SECONDS_PER_HOUR)
}
pub fn hours_or_panic(value: u64) -> Self {
Self::hours(value).unwrap()
}
fn from_milliseconds(value: u64, multiplier: u64) -> Result<Self, TrypemaError> {
checked_duration(
value,
multiplier,
"sync interval",
TrypemaError::InvalidSyncInterval,
)
.map(Self)
}
fn as_period(self, period_milliseconds: u64) -> f64 {
(self.0 as f64) / (period_milliseconds as f64)
}
}