Raxol.Swarm.Topology
(Raxol v2.3.0)
View Source
Manages node roles and handles promotion/demotion on failure.
Uses seniority-based commander election: the longest-running node becomes commander. No Raft/Paxos -- tactical decisions don't need consensus, just a coordinator.
Summary
Functions
Returns a specification to start this module under a supervisor.
Notify topology of a node joining. Called by Supervisor on node_up.
Notify topology of a node leaving. Called by Supervisor on node_down.
Types
@type role() :: :commander | :wingmate | :observer | :relay
@type t() :: %Raxol.Swarm.Topology{ commander: node() | nil, election_state: :stable | :electing, node_id: node(), node_monitor: GenServer.server(), nodes: %{required(node()) => node_info()}, quorum_size: pos_integer(), role: role() }
Functions
Returns a specification to start this module under a supervisor.
See Supervisor.
@spec get_commander(GenServer.server()) :: {:ok, node()} | {:error, :no_commander}
@spec get_role(GenServer.server()) :: role()
@spec list_nodes(GenServer.server()) :: [{node(), role()}]
@spec node_count(GenServer.server()) :: non_neg_integer()
@spec node_joined(GenServer.server(), node()) :: :ok
Notify topology of a node joining. Called by Supervisor on node_up.
@spec node_left(GenServer.server(), node()) :: :ok
Notify topology of a node leaving. Called by Supervisor on node_down.
@spec promote(GenServer.server(), node(), role()) :: :ok | {:error, term()}
@spec request_role(GenServer.server(), role()) :: :ok | {:error, term()}
@spec start_link(keyword()) :: GenServer.on_start()