pub struct RotationState {
streak_count: u32,
streak_window: Duration,
no_reset_cooldown: Duration,
cooldowns: Mutex<HashMap<AccountKey, SystemTime>>,
streaks: Mutex<HashMap<AccountKey, (u32, SystemTime)>>,
}Expand description
Per-account rotation state: cooldown end, and the streak.
Fields§
§streak_count: u32Streak count, window, and no-reset cooldown, from [gateway].
streak_window: Duration§no_reset_cooldown: Duration§cooldowns: Mutex<HashMap<AccountKey, SystemTime>>Cooldown end per account; an account inside its cooldown is skipped by selection and cannot be re-bound.
streaks: Mutex<HashMap<AccountKey, (u32, SystemTime)>>Consecutive 429s per account, with the time of the last one.
Implementations§
Source§impl RotationState
impl RotationState
pub fn new() -> Self
Sourcepub fn with_numbers(numbers: RotationNumbers) -> Self
pub fn with_numbers(numbers: RotationNumbers) -> Self
The numbers from [gateway]: how many 429s fire the streak,
the window they are counted over, and the cooldown when no
reset time is known.
Sourcepub fn no_reset_cooldown(&self) -> Duration
pub fn no_reset_cooldown(&self) -> Duration
The cooldown applied when no reset time is known.
Sourcepub fn cool_down(&self, key: &AccountKey, until: SystemTime)
pub fn cool_down(&self, key: &AccountKey, until: SystemTime)
Mark an account exhausted until until.
Sourcepub fn is_cooling_down(&self, key: &AccountKey, now: SystemTime) -> bool
pub fn is_cooling_down(&self, key: &AccountKey, now: SystemTime) -> bool
true while the account is inside a cooldown.
Sourcepub fn cooldown_end(&self, key: &AccountKey) -> Option<SystemTime>
pub fn cooldown_end(&self, key: &AccountKey) -> Option<SystemTime>
When key’s cooldown ends, None when it never cooled.
Sourcepub fn soonest_cooldown_end(&self, now: SystemTime) -> Option<SystemTime>
pub fn soonest_cooldown_end(&self, now: SystemTime) -> Option<SystemTime>
The soonest cooldown still live at now, across every account. A
reader sleeps until it to announce the thaw the clock alone decides.
Sourcepub fn soonest_reset_among(
&self,
keys: &[AccountKey],
now: SystemTime,
) -> Option<SystemTime>
pub fn soonest_reset_among( &self, keys: &[AccountKey], now: SystemTime, ) -> Option<SystemTime>
The soonest a cooling account among keys recovers, for the
failure message. None when none of them is cooling.
Sourcepub fn record_429(&self, key: &AccountKey, now: SystemTime) -> bool
pub fn record_429(&self, key: &AccountKey, now: SystemTime) -> bool
Record a 429 from account at now; rotates when the streak
reaches the configured count inside the configured window.
true when the streak fired.
The window is a max-gap since the last 429, not a sliding count: a gap beyond the window restarts at 1, so a slow drip still accumulates. That over-rotates a drip marginally rather than under-rotating a burst - the conservative direction.
Sourcepub fn reset_streak(&self, key: &AccountKey)
pub fn reset_streak(&self, key: &AccountKey)
Clear the streak: any non-429 success resets it.