Struct Ackr

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

Track tuple acks across multiple tasks with minimal memory requirements. The algorithm is from the stream-processing system Storm.

The only allocation needed is two 64-bit values per task (task_id, ack value) and scales to 2^64 tuples.

To track a tuple, you call tuple. The tuple’s id will be XORed with the previous ack value. As tuples are acked (marked as arbitrarily completed), the ack value will once again be XORed. Once all tuples are acked/completed, the ack value will be 0.

Implementations§

Source§

impl Ackr

Source

pub fn new() -> Ackr

Create a new Ackr with no buckets/tasks.

Source

pub fn insert(&mut self, source_id: Source, task_id: Task)

Insert a new bucket entry with the Source id as the initial ack value.

Source

pub fn add_tuple(&mut self, source_id: Source, tuple_id: Tuple)

Add a tuple to the Source’s ack value. This is essentially just the first XOR.

Source

pub fn ack(&mut self, source_id: Source, tuple_id: Tuple) -> Option<()>

XOR the ack value for a given Source and the result is the new ack value. Acking once adds the tuple to the Source, acking it twice removes it.

Source

pub fn get(&mut self, source_id: Source) -> Tuple

Source

pub fn has_completed(&mut self, source_id: Source) -> bool

Trait Implementations§

Source§

impl Debug for Ackr

Source§

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

Formats the value using the given formatter. Read more
Source§

impl PartialEq for Ackr

Source§

fn eq(&self, other: &Ackr) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Eq for Ackr

Source§

impl StructuralPartialEq for Ackr

Auto Trait Implementations§

§

impl Freeze for Ackr

§

impl RefUnwindSafe for Ackr

§

impl Send for Ackr

§

impl Sync for Ackr

§

impl Unpin for Ackr

§

impl UnwindSafe for Ackr

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, 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, 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.