pub mod key_manager;
pub mod lease_manager;
pub mod period_roller;
mod registry;
pub mod runtime;
pub mod snapshot_manager;
mod task_health;
pub mod usage_writer;
#[cfg(feature = "http")]
pub mod http;
#[cfg(feature = "http")]
pub mod http_security;
pub use key_manager::{
KeyManager, KeyManagerConfig, KeyManagerConfigError, KeyManagerHealth, KeyManagerMonitor,
KeyManagerReport, KeyManagerShutdownReport, KeyManagerStats, KeyVerifier,
};
pub use period_roller::{
PeriodRoller, PeriodRollerConfig, PeriodRollerConfigError, PeriodRollerHealth,
PeriodRollerMonitor, PeriodRollerReport, PeriodRollerShutdownReport, PeriodRollerStats,
};
pub use runtime::RuntimeFundingReport;
pub use runtime::{
AccountPhase, AccountReport, ContentionReport, InstanceRuntime, InstanceRuntimeConfig,
InstanceRuntimeConfigError, RuntimeHandle, RuntimeReadiness, RuntimeReport,
RuntimeShutdownReport, RuntimeWriterError,
};
pub use tollgate_store::{Clock, ManualClock, SystemClock};
#[cfg(feature = "http")]
pub use http::HttpStore;
#[cfg(feature = "http")]
pub use http_security::{
BearerProvider, BearerToken, GoogleIdentity, HttpStoreConfig, StaticBearer,
};
pub use lease_manager::{
AccountLeaseConfig, LeaseCounters, LeaseManager, LeaseManagerConfig, LeaseManagerConfigError,
LeaseManagerReport, LeaseStats,
};
pub use snapshot_manager::{
SlotRegistry, SnapshotCounters, SnapshotManager, SnapshotManagerConfig,
SnapshotManagerConfigError, SnapshotManagerReport, SnapshotStats, TrackedPrincipals,
};
pub use usage_writer::{
UsagePermit, UsageRecorder, UsageWriter, UsageWriterConfig, UsageWriterConfigError,
WriterCounters, WriterHealth, WriterShutdownError, WriterStats,
};
#[derive(Default)]
pub(crate) struct ShutdownDeadline(std::sync::Mutex<Option<tokio::time::Instant>>);
impl ShutdownDeadline {
pub(crate) fn constrain(&self, deadline: tokio::time::Instant) {
let mut current = self.0.lock().expect("shutdown deadline poisoned");
*current = Some(current.map_or(deadline, |old| old.min(deadline)));
}
pub(crate) fn within(&self, budget: std::time::Duration) -> tokio::time::Instant {
let local = tokio::time::Instant::now() + budget;
self.0
.lock()
.expect("shutdown deadline poisoned")
.map_or(local, |deadline| deadline.min(local))
}
}
pub(crate) fn signal(tx: &tokio::sync::watch::Sender<bool>, value: bool, signal: &'static str) {
if tx.send(value).is_err() {
tracing::debug!(signal, value, "no receivers remain for signal");
}
}
#[cfg(test)]
mod deadline_tests {
use super::ShutdownDeadline;
use std::time::Duration;
use tokio::time::Instant;
#[tokio::test(start_paused = true)]
async fn a_shared_shutdown_deadline_can_only_shorten_a_components_budget() {
let deadline = ShutdownDeadline::default();
let now = Instant::now();
let second = Duration::from_secs(1);
assert_eq!(deadline.within(second), now + second);
deadline.constrain(now + second * 3);
deadline.constrain(now + second * 2);
deadline.constrain(now + second * 4);
assert_eq!(deadline.within(second * 10), now + second * 2);
assert_eq!(deadline.within(second), now + second);
tokio::time::advance(second * 2).await;
assert_eq!(deadline.within(second * 10), now + second * 2);
}
}