Skip to main content

DeltaBuffer

Struct DeltaBuffer 

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

Buffer for storing deltas during snapshot sync.

Implements Invariant I6: Deltas received during state-based sync MUST be preserved and applied after sync completes.

When the buffer is full, the oldest delta is evicted (FIFO eviction policy) and the drops counter is incremented. Drops MUST be observable via metrics.

§Deduplication

The buffer tracks seen delta IDs to prevent duplicate deltas from being buffered. This protects against replay attacks where an adversary might flood the buffer with duplicate deltas to cause eviction of legitimate deltas.

Implementations§

Source§

impl DeltaBuffer

Source

pub fn new(capacity: usize, sync_start_hlc: u64) -> Self

Create a new delta buffer with specified capacity.

§Capacity Warning

If capacity is below MIN_RECOMMENDED_CAPACITY, callers should log a warning at startup. Zero capacity is valid but will drop ALL deltas.

Check if capacity is below recommended minimum.

Callers should log a warning at session start if this returns true.

Source

pub fn push(&mut self, delta: BufferedDelta) -> PushResult

Add a delta to the buffer.

Returns a PushResult indicating what happened:

  • Added: Delta was added successfully
  • Duplicate: Delta ID was already in buffer (no action taken)
  • Evicted(id): Delta was added but oldest delta was evicted
  • DroppedZeroCapacity(id): Delta was dropped (zero capacity buffer)
§Deduplication

If a delta with the same ID is already in the buffer, it is not added again and PushResult::Duplicate is returned. This prevents replay attacks.

§Edge case: zero capacity

If capacity is 0, the incoming delta is immediately dropped (not added) and PushResult::DroppedZeroCapacity is returned with the dropped delta’s ID.

Source

pub fn drain(&mut self) -> Vec<BufferedDelta>

Get all buffered deltas for replay, clearing the buffer.

Returns deltas in FIFO order (oldest first), preserving causality. Also clears the deduplication set.

Source

pub fn contains(&self, id: &[u8; 32]) -> bool

Check if a delta ID is already in the buffer.

This is O(1) due to the internal HashSet tracking.

Source

pub fn len(&self) -> usize

Number of buffered deltas.

Source

pub fn is_empty(&self) -> bool

Check if buffer is empty.

Source

pub fn sync_start_hlc(&self) -> u64

Get the sync start HLC.

Source

pub fn drops(&self) -> u64

Get the number of deltas dropped due to buffer overflow.

This metric MUST be observable per Invariant I6 delivery contract.

Source

pub fn capacity(&self) -> usize

Get the buffer capacity.

Trait Implementations§

Source§

impl Debug for DeltaBuffer

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. 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> 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> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: 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: 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> Reflect for T

Source§

fn as_dyn_ref<'a>(&self) -> &(dyn Reflect + 'a)
where T: 'a,

Source§

fn as_dyn_mut<'a>(&mut self) -> &mut (dyn Reflect + 'a)
where T: 'a,

Source§

fn as_dyn_box<'a>(self: Box<T>) -> Box<dyn Reflect + 'a>
where T: 'a,

Source§

fn as_dyn_rc<'a>(self: Rc<T>) -> Rc<dyn Reflect + 'a>
where T: 'a,

Source§

fn as_dyn_arc<'a>(self: Arc<T>) -> Arc<dyn Reflect + 'a>
where T: 'a,

Source§

fn type_id(&self) -> TypeId

Source§

fn type_name(&self) -> &'static str

Source§

impl<T> ReflectExt for T
where T: Reflect + ?Sized,

Source§

fn is<T>(&self) -> bool
where T: Reflect + ?Sized,

Source§

fn type_id() -> TypeId

Source§

fn downcast_ref<T>(&self) -> Option<&T>
where T: Reflect,

Source§

fn downcast_mut<T>(&mut self) -> Option<&mut T>
where T: Reflect,

Source§

fn downcast_box<T>(self: Box<Self>) -> Result<Box<T>, Box<Self>>
where T: Reflect,

Source§

fn downcast_rc<T>(self: Rc<Self>) -> Result<Rc<T>, Rc<Self>>
where T: Reflect,

Source§

fn downcast_arc<T>(self: Arc<Self>) -> Result<Arc<T>, Arc<Self>>
where T: Reflect,

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 = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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
Source§

impl<T> ErasedDestructor for T
where T: 'static,