struct SsaPseudonymEntry<S: PixSpec> {
ssa_index: SsaIndex,
poly_queue: VecDeque<IndexedPolynomial<S>>,
retained_commitments: VecDeque<RetainedCommitment<S>>,
cursor: usize,
highest_emitted: Option<SsaIndex>,
front_run: usize,
front_emitted: u64,
}Fields§
§ssa_index: SsaIndex§poly_queue: VecDeque<IndexedPolynomial<S>>§retained_commitments: VecDeque<RetainedCommitment<S>>Commitment material of the cycles most recently committed for this pseudonym, oldest first.
Bounded by MAX_RETAINED_COMMITMENT_CYCLES and by nothing else — in particular not by
emission, which is not a proxy for the peer’s need: the peer completes a cycle out of the
shares it has already buffered and the commitment it is still missing, on its own deadline,
whether or not the polynomials that produced those shares are still queued here. Releasing on
drain would take the material away exactly where the repair is worth most, since a fully
emitted cycle is one whose every share has gone out and whose only missing piece is the one a
dropped packet took.
cursor: usizePosition within the emission window, i.e. into the first
SHARE_EMISSION_WINDOW entries of poly_queue.
highest_emitted: Option<SsaIndex>Highest SSA index a share has actually been emitted for, None until the first one goes out.
Monotone. Equal to the index of the cycle at the front of poly_queue while that cycle is
being served, since the window no longer straddles cycle boundaries — see front_run. Kept as
its own field rather than derived, because it must survive the front cycle being drained and
removed. Read by SsaShareGenerator::emission_progress.
front_run: usizePolynomials of the front cycle still in poly_queue, or 0 when that cycle is drained and
the next one has yet to be picked up.
This is what confines the emission window to a single cycle. Refreshed lazily in
EntryShareGenerator::next_share rather than at commit time: removals only ever touch the
front cycle, so when it hits 0 the new front cycle is necessarily untouched and its run is a
full polynomials_per_ssa — which holds whether or not further cycles were committed in the
meantime.
front_emitted: u64Shares emitted so far for the cycle currently at the front of poly_queue.
Reset in lockstep with front_run, so it measures the front cycle only. Where
highest_emitted says which cycle is being served, this says how far into it — and the
difference is the whole admission decision: highest_emitted reaches the last committed index
on that cycle’s very first share, which is 0 % of the way through the batch, not the ~85 % at
which a conforming Exit asks for the next one.
Auto Trait Implementations§
impl<S> Freeze for SsaPseudonymEntry<S>
impl<S> RefUnwindSafe for SsaPseudonymEntry<S>where
<<S as PixSpec>::Curve as CurveArithmetic>::ProjectivePoint: RefUnwindSafe,
<<<S as PixSpec>::Curve as CurveArithmetic>::ProjectivePoint as GroupEncoding>::Repr: RefUnwindSafe,
<S as PixSpec>::Pseudonym: RefUnwindSafe,
<<<S as PixSpec>::Curve as Curve>::FieldBytesSize as ArraySize>::ArrayType<u8>: RefUnwindSafe,
<<S as PixSpec>::Curve as CurveArithmetic>::Scalar: RefUnwindSafe,
impl<S> Send for SsaPseudonymEntry<S>
impl<S> Sync for SsaPseudonymEntry<S>
impl<S> Unpin for SsaPseudonymEntry<S>where
<<S as PixSpec>::Curve as CurveArithmetic>::ProjectivePoint: Unpin,
<<<S as PixSpec>::Curve as CurveArithmetic>::ProjectivePoint as GroupEncoding>::Repr: Unpin,
<S as PixSpec>::Pseudonym: Unpin,
<<<S as PixSpec>::Curve as Curve>::FieldBytesSize as ArraySize>::ArrayType<u8>: Unpin,
<<S as PixSpec>::Curve as CurveArithmetic>::Scalar: Unpin,
impl<S> UnsafeUnpin for SsaPseudonymEntry<S>
impl<S> UnwindSafe for SsaPseudonymEntry<S>where
<<S as PixSpec>::Curve as CurveArithmetic>::ProjectivePoint: UnwindSafe,
<<<S as PixSpec>::Curve as CurveArithmetic>::ProjectivePoint as GroupEncoding>::Repr: UnwindSafe,
<S as PixSpec>::Pseudonym: UnwindSafe,
<<<S as PixSpec>::Curve as Curve>::FieldBytesSize as ArraySize>::ArrayType<u8>: UnwindSafe,
<<S as PixSpec>::Curve as CurveArithmetic>::Scalar: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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