Expand description
Best-effort broadcast.
Cachin, Guerraoui & Rodrigues, Module 3.1 and Algorithm 3.1 (“Basic Broadcast”).
Status: deployable. Space: bounded by membership. This layer holds only the process set; everything else belongs to the link beneath it.
Sends the message individually to every process over perfect links. If the sender is correct, every correct process delivers it. If the sender crashes partway through, some processes may deliver and others may not — that is the guarantee this abstraction deliberately does not make, and the reason the stronger broadcasts exist.
upon event ⟨ beb, Broadcast | m ⟩ do
forall q ∈ Π do
trigger ⟨ pl, Send | q, m ⟩;
upon event ⟨ pl, Deliver | p, m ⟩ do
trigger ⟨ beb, Deliver | p, m ⟩;Π includes the sender, so a process broadcasts to itself the same way it broadcasts to everyone else. Self-delivery is not a special case.
This layer adds nothing to the wire: its message type is the perfect link’s, unchanged, and its indication handler is pure forwarding. It is the second of the three protocols in this stack to contribute no header of its own.
§Over a link that reports scope boundaries
L is a parameter, so this one module is both the perfect-link broadcast above and what
session_best_effort_broadcast used to be. The algorithm is unchanged either way — Algorithm
3.1 does not mention links — but what it can promise is not.
Over a perfect link, a message sent to a correct process arrives; the link retransmits until it does. Over a session link it may not: a session can end with the message in flight, and that link does not retry. So validity holds only while the sessions carrying a broadcast hold.
This layer cannot repair that. It keeps nothing but the process set — no copy of what it sent,
no record of who received — so there is nothing to resend from, and giving it one would be
state growing with messages, which docs/bounded-space.md forbids. What it can do is refuse to
conceal it: both boundary reports are passed upward, because they are the only signal the
layers above have, and one of them — uniform reliable broadcast — can act on what this layer
cannot.
BEB1 [session] Best-effort validity — [always] over a link that cannot end
BEB2 [always] No duplication
BEB3 [always] No creationThe scope annotation is the link’s, not this layer’s: over a link whose guarantees never lapse,
[session] is vacuous and BEB1 reads as the book states it.
One request is not in Module 3.1. Cmd::SendTo sends to a single member of Π — same wire
message, same link, strictly fewer recipients, no new communication step. It exists so a layer
above can answer a scope that has just come back without paying for a fan-out to everyone
else, and it is a narrowing of Broadcast rather than an addition to the module.
Structs§
- Best
Effort Broadcast - Fan-out to every process over perfect links.