aboutsummaryrefslogtreecommitdiffstats
path: root/docs/architecture.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/architecture.md')
-rw-r--r--docs/architecture.md5
1 files changed, 3 insertions, 2 deletions
diff --git a/docs/architecture.md b/docs/architecture.md
index e0e2c94..9b9db71 100644
--- a/docs/architecture.md
+++ b/docs/architecture.md
@@ -225,14 +225,15 @@ catch-up source. The phases, what each serves and how the files come in: [`lifec
the write lock, stamped with the clock) → `publish_change` (bumps the version, emits
`DocumentChanged`) → the sync worker generates a message per neighbour → each
neighbour applies it, relays its new heads to *its* neighbours, which pull what they
-lack. In a full mesh (up to `k + 1` members) the writer reaches everyone directly.
+lack. In a full mesh (up to `k + 1` members) the writer reaches everyone directly, but
+those on none of its transports, to whom the nodes between announce.
**An inbound message.** Consumer → `handle_message`: drop our own and stale-run
replies, admit (swarm key), mark the peer seen, record its epoch (ignoring late ones),
then by type: HELLO answered, HELLO_REPLY establishes membership and discovers peers,
sync queued on its lane if on our epoch (held back from everyone but the source while catching
up), STATUS answered with a STATUS_REPLY and compared for divergence, blobs served or collected,
-LINKS answered with the node's links if the asker is a member, and again on each change while it subscribes (`swarm::links`, for the dashboard);
+LINKS answered with the node's links if the asker is a member, and again on each change while it subscribes, or with other members' links it asks for the asker, which can't reach them (`swarm::links`, for the dashboard);
PING and PONG (the paths layer answered the PING already) only mark the peer seen, and
after a PONG the peer's round-trip time is its path's again.