Skip to content

v0.3.1

@AndreFilho0 AndreFilho0 tagged this 31 May 19:13
O start_child do Horde.DynamicSupervisor é eventual: sob boot/split simultâneo
de 2-3 nós (cada um chamando ensure_started/1 antes do CRDT do Horde convergir),
mais de um nó podia subir a árvore localmente — grafos zumbis/duplicados, que
disparam o bug de soma de pesos da v0.2.x. O Horde.Registry (:unique), porém,
converge para UM dono de forma confiável (árbitro forte).

- Reconciler: a cada tick, se lookup_owner aponta o dono num OUTRO nó vivo e
  este nó tem árvore local viva (Process.whereis(local_name)), este nó perdeu a
  eleição :unique — reapa a própria árvore. Não luta com timing: deixa o Registry
  decidir o vencedor e só varre os perdedores (converge em 1-2 ticks). Guard
  remote_alive? evita falso-positivo no failover (entrada stale do dono morto).
- Distributed.reap_local/1: terminate_child (remove do supervisor + CRDT), com
  fallback Supervisor.stop p/ árvore que não é mais filha do Horde.
- Supervisor.local_name/1: fonte única do nome local da árvore (por nó).
- Telemetria nova: [:meli_graph, :reconciler, :reap] (%{name, node, owner_node}).
- Teste multi-nó :peer: injeta um zumbi num nó não-dono e prova que morre,
  convergindo p/ uma única árvore sem dupla-carga (edge_count == 3).
- Docs (distribution.md, implementation), CHANGELOG [0.3.1], @version 0.3.1.

Torna desnecessário qualquer gate/stagger de boot no app consumidor — a correção
mora na lib, onde pertence e serve a qualquer consumidor.
Assets 2
Loading