Skip to main content

RepublishScheduler

Struct RepublishScheduler 

Source
pub struct RepublishScheduler { /* private fields */ }
Expand description

Republish-scheduler handle. Owns the per-hash heap and the abort signal so the runtime can stop it on shutdown.

§The authoritative-due invariant

A BinaryHeap cannot remove or reschedule an interior entry, so any rescheduling leaves the old entry behind as a tombstone. scheduled is therefore the authority: it maps each live hash to the ONE due_us that counts, and drain_cycle discards a popped entry whose due_us disagrees. Without that check a tombstone is resurrected the moment its hash is scheduled again — it pops already-overdue, passes a membership-only test, and buys a spurious republish. Two call patterns hit that: a re-seed racing the tick path’s drain-then-reschedule, and Self::unschedule followed by a later re-seed.

Implementations§

Source§

impl RepublishScheduler

Source

pub fn new() -> Self

Construct an empty scheduler.

Source

pub fn len(&self) -> usize

Number of hashes currently scheduled.

Source

pub fn is_empty(&self) -> bool

Whether the scheduler is empty.

Source

pub fn schedule_steady(&self, hash: ContentHash)

Schedule hash with the steady-state jitter window (30–50 min), superseding any due time it already has.

A fresh draw per cycle is ADR 022 §STORE Flow step 3. Superseding is safe because the displaced heap entry no longer matches the authoritative due time and drain_cycle discards it.

Source

pub fn schedule_steady_if_absent(&self, hash: ContentHash) -> bool

Schedule hash with the steady-state jitter window (30–50 min) only if it has no live entry. Returns whether it was added.

The cache-event path uses this so that a repeated event (a ranged fill announces once per completed block) keeps the due time the hash already has rather than pushing it back.

Source

pub fn mark_announced(&self, hash: ContentHash)

Record that a peer accepted a Store with non-empty coverage for hash.

Source

pub fn is_announced(&self, hash: &ContentHash) -> bool

Whether a peer accepted a Store with non-empty coverage for hash since it was last unscheduled.

Source

pub fn seed_cold_start<I>(&self, iter: I) -> usize
where I: IntoIterator<Item = ContentHash>,

Batch-schedule every hash in iter with an independent cold-start jitter draw (uniform(0, 40 min) per hash, NOT a shared timestamp). Callers pass a holder_snapshot result, or origin_held_snapshot for the origin-only rescan — never access_times_snapshot, which is eviction-recency state rather than the on-disk set; see the iter_hashes rustdoc.

Seeding leaves an already-scheduled hash alone: it keeps its existing due time rather than being pulled earlier by a re-seed. The lag sweep in run_republish and the periodic origin rescan both run against a populated scheduler, so without this a burst of re-seeds would keep dragging every due time toward the present.

Returns the number of hashes newly scheduled — useful for the startup log line so operators can see how big the cold-start queue is, and for the sweep so a no-op sweep is distinguishable from a repair.

Source

pub fn unschedule(&self, hash: &ContentHash)

Unschedule hash — used when the cache evicts the blob, or holds no whole block of it. Clears its announced mark, so the next cache event for it publishes eagerly again.

Trait Implementations§

Source§

impl Default for RepublishScheduler

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FutureExt for T

Source§

fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
Source§

fn with_current_context(self) -> WithContext<Self> ⓘ

Attaches the current Context to this type, returning a WithContext wrapper. Read more
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<Unshared, Shared> IntoShared<Shared> for Unshared
where Shared: FromUnshared<Unshared>,

Source§

fn into_shared(self) -> Shared

Creates a shared type from an unshared type.
Source§

impl<L> LayerExt<L> for L

Source§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
Source§

impl<T> MaybeSend for T
where T: Send,

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more