Skip to main content

EpochConsensus

Struct EpochConsensus 

Source
pub struct EpochConsensus<V: Clone> { /* private fields */ }
Expand description

Abortable consensus within one epoch.

Implementations§

Source§

impl<V: Clone> EpochConsensus<V>

Source

pub fn new( me: NodeId, peers: impl IntoIterator<Item = NodeId>, ets: u64, leader: NodeId, state: State<V>, retransmit: Duration, ) -> Self

⟨ ep, Init | state ⟩ — an instance for epoch ets led by leader, beginning from state.

Source

pub fn timestamp(&self) -> u64

This epoch’s timestamp.

Source

pub fn is_aborted(&self) -> bool

Whether this instance has been abandoned and is therefore silent.

Source

pub fn state(&self) -> &State<V>

What this process has accepted, and when.

Trait Implementations§

Source§

impl<V: Debug + Clone> Debug for EpochConsensus<V>

Source§

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

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

impl<V: Clone> Protocol for EpochConsensus<V>

Source§

type Meta = Infallible

Keeps nothing durably. logged_epoch_consensus is the variant that does.

Source§

fn on_msg(&mut self, from: NodeId, msg: BebMsg<V>, cx: &mut ProtoCx<'_, Self>)

such that ts = ets, applied at the door rather than after the link beneath.

The guard has to be here, not only where the delivery is handled, and the reason is the perfect link’s duplicate-detection set. Each epoch gets a new instance, so each epoch gets a new link, and a new link restarts its sequence numbers at one — while the receiver’s set is cleared at a different moment, when its own epoch changes. Hand a foreign-epoch message to the link and it records (src, 1) as delivered; the real epoch-ets message with sequence one is then discarded as a duplicate, silently, and that process never answers the leader again. Three of five processes stalled this way before the guard moved up here.

This is CLAUDE.md’s “identity is as durable as the state it keys” seen from the other side: the identifier’s scope is one epoch, so nothing outside that epoch may enter the set that keys on it.

Source§

type Cmd = Cmd<V>

Requests from the layer above.
Source§

type Ind = Ind<V>

Indications to the layer above — this protocol delivering on its guarantee.
Source§

type Msg = Wire<Tagged<V>>

What crosses the wire to a peer running the same protocol.
Source§

type Scope = Infallible

Scopes whose boundaries this protocol’s guarantees depend on, and which it can observe. Read more
Source§

type Note = Note

The vocabulary in which this protocol narrates its decisions. Read more
Source§

type Entry = Infallible

The durable entries this protocol appends: what accumulates.
Source§

fn on_cmd(&mut self, cmd: Cmd<V>, cx: &mut ProtoCx<'_, Self>)

Handle a request from the layer above.
Source§

fn on_timer(&mut self, id: TimerId, cx: &mut ProtoCx<'_, Self>)

Handle a timer that fired somewhere in this protocol or in what it composes. Read more
§

fn on_init( &mut self, _cx: &mut Cx<'_, Self::Msg, Self::Ind, Self::Note, Self::Meta, Self::Entry>, )

Begin, on a first start — when nothing has been written down. Read more
§

fn on_recovery( &mut self, _cx: &mut Cx<'_, Self::Msg, Self::Ind, Self::Note, Self::Meta, Self::Entry>, )

Resume after a crash, reading what survived. Read more
§

fn on_scope_event( &mut self, _scope: Self::Scope, _cx: &mut Cx<'_, Self::Msg, Self::Ind, Self::Note, Self::Meta, Self::Entry>, )

Handle a boundary of a scope this protocol’s guarantees depend on — its end, or the beginning of the one that succeeds it. Read more

Auto Trait Implementations§

§

impl<V> Freeze for EpochConsensus<V>
where V: Freeze,

§

impl<V> RefUnwindSafe for EpochConsensus<V>
where V: RefUnwindSafe,

§

impl<V> Send for EpochConsensus<V>
where V: Send,

§

impl<V> Sync for EpochConsensus<V>
where V: Sync,

§

impl<V> Unpin for EpochConsensus<V>
where V: Unpin,

§

impl<V> UnsafeUnpin for EpochConsensus<V>
where V: UnsafeUnpin,

§

impl<V> UnwindSafe for EpochConsensus<V>

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
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

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.

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

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

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

§

fn vzip(self) -> V