use std::sync::Arc;
use tokio::sync::Mutex;
use tracing::info;
pub async fn should_reanalyze_queue(
last_queue_change_at: &Arc<Mutex<Option<std::time::Instant>>>,
bypass_debounce: bool,
) -> bool {
if bypass_debounce {
info!("Bypassing queue debounce because execution capacity recovered");
return true;
}
let last_change = last_queue_change_at.lock().await;
match *last_change {
None => {
true
}
Some(timestamp) => {
let elapsed = timestamp.elapsed();
let debounce_duration = std::time::Duration::from_secs(10);
if elapsed >= debounce_duration {
info!(
"Debounce period elapsed ({:.1}s >= 10s), proceeding with re-analysis",
elapsed.as_secs_f64()
);
true
} else {
info!(
"Debounce period active ({:.1}s < 10s), deferring re-analysis",
elapsed.as_secs_f64()
);
false
}
}
}
}
#[derive(Debug, Clone, Copy)]
pub enum ReanalysisReason {
Initial,
Completion,
ResolveCompletion,
SlotRecovery,
QueueNotification,
RepairCandidate,
}
impl std::fmt::Display for ReanalysisReason {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ReanalysisReason::Initial => write!(f, "initial"),
ReanalysisReason::Completion => write!(f, "completion"),
ReanalysisReason::ResolveCompletion => write!(f, "resolve_completion"),
ReanalysisReason::SlotRecovery => write!(f, "slot_recovery"),
ReanalysisReason::QueueNotification => write!(f, "queue"),
ReanalysisReason::RepairCandidate => write!(f, "repair_candidate"),
}
}
}