Files
oc-discovery/docs/diagrams/25_failure_node_gc.puml

36 lines
1.6 KiB
Plaintext
Raw Normal View History

2026-03-09 14:57:41 +01:00
@startuml 25_failure_node_gc
title F7 — Crash nœud → GC indexeur + AfterDelete
2026-03-11 16:28:15 +01:00
participant "Node\n(crashé)" as N
2026-03-09 14:57:41 +01:00
participant "Indexer A" as IA
participant "Indexer B" as IB
2026-03-11 16:28:15 +01:00
note over N, IB: État nominal : N heartbeatait vers IA et IB
2026-03-09 14:57:41 +01:00
== Crash Node ==
N ->x IA: stream reset (heartbeat coupé)
N ->x IB: stream reset (heartbeat coupé)
== GC côté Indexer A ==
2026-03-11 16:28:15 +01:00
note over IA: HandleHeartbeat : stream reset détecté\nStreamRecords[ProtocolHeartbeat][N].Expiry figé
2026-03-09 14:57:41 +01:00
loop ticker GC (30s) — StartGC(30*time.Second)
2026-03-11 16:28:15 +01:00
IA -> IA: gc()\nnow.After(Expiry) où Expiry = lastHBTime + 2min\n→ si 2min sans heartbeat → éviction
IA -> IA: delete(StreamRecords[ProtocolHeartbeat][N])\nAfterDelete(N, name, did) appelé hors lock
note over IA: N retiré du registre vivant.\nFillRate recalculé : (n-1) / MaxNodesConn()
2026-03-09 14:57:41 +01:00
end
2026-03-11 16:28:15 +01:00
== Impact fill rate ==
note over IA: FillRate diminue.\nProchain BuildHeartbeatResponse\ninclura FillRate mis à jour.\nSi fillRate revient < 80% :\n→ offload.inBatch et alreadyTried réinitialisés.
2026-03-09 14:57:41 +01:00
2026-03-11 16:28:15 +01:00
== GC côté Indexer B ==
note over IB: Même GC effectué.\nN retiré de StreamRecords[ProtocolHeartbeat].
2026-03-09 14:57:41 +01:00
== Reconnexion éventuelle du nœud ==
N -> N: redémarrage
2026-03-11 16:28:15 +01:00
N -> IA: SendHeartbeat /opencloud/heartbeat/1.0\nHeartbeat{name, PeerID_N, IndexersBinded, need, record}
IA -> IA: HandleHeartbeat → UptimeTracker(FirstSeen=now)\nStreamRecords[ProtocolHeartbeat][N] recréé\nRepublish PeerRecord N dans DHT
note over IA: N de retour avec FirstSeen frais.\ndynamicMinScore élevé tant que age < 24h.\n(phase de grâce : 2 ticks avant scoring)
2026-03-09 14:57:41 +01:00
@enduml