use super::Job;
use super::JobKey;
use crate::Message;
#[derive(Debug, Eq, PartialEq, Clone, Copy)]
pub enum DiscardMode {
Oldest,
Newest,
}
#[derive(Debug, Clone)]
pub(crate) enum WorkerDiscardSettings {
None,
Static { limit: usize, mode: DiscardMode },
}
impl WorkerDiscardSettings {
pub(crate) fn update_worker_limit(&mut self, new_limit: usize) {
if let Self::Static { limit, .. } = self {
*limit = new_limit;
}
}
pub(crate) fn get_limit_and_mode(&self) -> Option<(usize, DiscardMode)> {
match self {
Self::None => None,
Self::Static { limit, mode, .. } => Some((*limit, *mode)),
}
}
}
pub enum DiscardSettings {
None,
Static {
limit: usize,
mode: DiscardMode,
},
Dynamic {
limit: usize,
mode: DiscardMode,
updater: Box<dyn DynamicDiscardController>,
},
}
impl std::fmt::Debug for DiscardSettings {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
DiscardSettings::None => {
write!(f, "DiscardSettings::None")
}
DiscardSettings::Static { limit, mode } => f
.debug_struct("DiscardSettings::Static")
.field("limit", limit)
.field("mode", mode)
.finish(),
DiscardSettings::Dynamic { limit, mode, .. } => f
.debug_struct("DiscardSettings::Dynamic")
.field("limit", limit)
.field("mode", mode)
.finish(),
}
}
}
impl DiscardSettings {
pub(crate) fn get_worker_settings(&self) -> WorkerDiscardSettings {
match &self {
Self::None => WorkerDiscardSettings::None,
Self::Static { limit, mode } => WorkerDiscardSettings::Static {
limit: *limit,
mode: *mode,
},
Self::Dynamic { limit, mode, .. } => WorkerDiscardSettings::Static {
limit: *limit,
mode: *mode,
},
}
}
pub fn get_limit_and_mode(&self) -> Option<(usize, DiscardMode)> {
match self {
Self::None => None,
Self::Static { limit, mode, .. } => Some((*limit, *mode)),
Self::Dynamic { limit, mode, .. } => Some((*limit, *mode)),
}
}
}
#[cfg_attr(feature = "async-trait", crate::async_trait)]
pub trait DynamicDiscardController: Send + Sync + 'static {
#[cfg(feature = "async-trait")]
async fn compute(&mut self, current_threshold: usize) -> usize;
#[cfg(not(feature = "async-trait"))]
fn compute(&mut self, current_threshold: usize) -> futures::future::BoxFuture<'_, usize>;
}
#[derive(Debug, Eq, PartialEq, Clone)]
pub enum DiscardReason {
TtlExpired,
Loadshed,
Shutdown,
RateLimited,
}
pub trait DiscardHandler<TKey, TMsg>: Send + Sync + 'static
where
TKey: JobKey,
TMsg: Message,
{
fn discard(&self, reason: DiscardReason, job: &mut Job<TKey, TMsg>);
}