Enum foca::Message

source ·
pub enum Message<T> {
    Ping(ProbeNumber),
    Ack(ProbeNumber),
    PingReq {
        target: T,
        probe_number: ProbeNumber,
    },
    IndirectPing {
        origin: T,
        probe_number: ProbeNumber,
    },
    IndirectAck {
        target: T,
        probe_number: ProbeNumber,
    },
    ForwardedAck {
        origin: T,
        probe_number: ProbeNumber,
    },
    Announce,
    Feed,
    Gossip,
    Broadcast,
    TurnUndead,
}
Expand description

Messages are how members request interaction from each other.

There are a few different kind of interactions that may occur:

§Direct Probe Cycle

Foca will periodically check if members are still active. It sends a Ping to said member and expects an Ack in return.

If B takes too long to reply with an Ack, the indirect probe cycle starts.

§Indirect Probe Cycle

A previously pinged member may be too busy, its reply may have been dropped by an unreliable network or maybe it’s actually down.

The indirect probe cycle helps with getting more certainty about its current state by asking other members to execute a ping on our behalf.

Here, member A will ask member C to ping B on their behalf:

A ->[PingReq(B)]      C
C ->[IndirectPing(A)] B
B ->[IndirectAck(A)]  C
C ->[ForwardedAck(B)] A

If by the end of the full probe cycle (direct and indirect) Foca has received either an Ack or a ForwardedAck, the member is considered active. Otherwise the member is declared State::Suspect and will need to refute it before the configured deadline else it will be declared State::Down.

§“Join” sub-protocol

Foca instances can join a cluster by sending Announce messages to one or more identities. If a recipient decides to accept it, it replies with a Feed message, containing other active cluster members.

Variants§

§

Ping(ProbeNumber)

A Ping message. Replied with Ack.

§

Ack(ProbeNumber)

Acknowledment of a Ping. Reply to Ping.

§

PingReq

Receiver is being asked to Ping target on their behalf and should emit IndirectPing(sender) to target

Fields

§target: T

The identity that failed to reply to the original Ping in a timely manner.

§probe_number: ProbeNumber

See foca::ProbeNumber

§

IndirectPing

Analogous to Ping, with added metadata about the original requesting member. Recipient should reply IndirectAck(origin) to sender

Fields

§origin: T

The identity that started the indirect cycle. I.e.: whoever sent the unanswered Ping.

§probe_number: ProbeNumber

See foca::ProbeNumber

§

IndirectAck

Analogous to Ack, with added metadta about the final destination. Recipient should emit ForwardedAck(sender) to target

Fields

§target: T

The identity that started the indirect cycle. I.e.: whoever sent the unanswered Ping.

§probe_number: ProbeNumber

See foca::ProbeNumber

§

ForwardedAck

The result of a successful indirect probe cycle. Sender is indicating that they’ve managed to ping and receive an ack from origin

Fields

§origin: T

The identity that failed to reply to the original Ping in a timely manner.

§probe_number: ProbeNumber

See foca::ProbeNumber

§

Announce

Request to join a cluster. Replied with Feed.

§

Feed

Response to a Announce, signals that the remaining bytes in the payload will be a sequence of active members, instead of just cluster updates. Reply to Announce.

§

Gossip

Deliberate dissemination of cluster updates. Non-interactive, doesn’t expect a reply.

§

Broadcast

Deliberate dissemination of custom broadcasts. Broadcast messages do not contain cluster updates.

§

TurnUndead

Indicates that the receiver is considered down by the sender

This is an optional message that Foca sends whenever a member that’s considered down sends a message.

Trait Implementations§

source§

impl<T: Clone> Clone for Message<T>

source§

fn clone(&self) -> Message<T>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<T: Debug> Debug for Message<T>

source§

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

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

impl<'de, T> Deserialize<'de> for Message<T>
where T: Deserialize<'de>,

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<T: PartialEq> PartialEq for Message<T>

source§

fn eq(&self, other: &Message<T>) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

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

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<T> Serialize for Message<T>
where T: Serialize,

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<T: Eq> Eq for Message<T>

source§

impl<T> StructuralPartialEq for Message<T>

Auto Trait Implementations§

§

impl<T> Freeze for Message<T>
where T: Freeze,

§

impl<T> RefUnwindSafe for Message<T>
where T: RefUnwindSafe,

§

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

§

impl<T> Sync for Message<T>
where T: Sync,

§

impl<T> Unpin for Message<T>
where T: Unpin,

§

impl<T> UnwindSafe for Message<T>
where T: UnwindSafe,

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> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

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

§

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

§

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<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> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,