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.