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

Types

node_info()

@type node_info() :: %{role: role(), joined_at: integer()}

role()

@type role() :: :commander | :wingmate | :observer | :relay

t()

@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

child_spec(init_arg)

Returns a specification to start this module under a supervisor.

See Supervisor.

get_commander(server \\ __MODULE__)

@spec get_commander(GenServer.server()) :: {:ok, node()} | {:error, :no_commander}

get_role(server \\ __MODULE__)

@spec get_role(GenServer.server()) :: role()

list_nodes(server \\ __MODULE__)

@spec list_nodes(GenServer.server()) :: [{node(), role()}]

node_count(server \\ __MODULE__)

@spec node_count(GenServer.server()) :: non_neg_integer()

node_joined(server \\ __MODULE__, node)

@spec node_joined(GenServer.server(), node()) :: :ok

Notify topology of a node joining. Called by Supervisor on node_up.

node_left(server \\ __MODULE__, node)

@spec node_left(GenServer.server(), node()) :: :ok

Notify topology of a node leaving. Called by Supervisor on node_down.

promote(server \\ __MODULE__, node, role)

@spec promote(GenServer.server(), node(), role()) :: :ok | {:error, term()}

request_role(server \\ __MODULE__, role)

@spec request_role(GenServer.server(), role()) :: :ok | {:error, term()}

start_link(opts \\ [])

@spec start_link(keyword()) :: GenServer.on_start()