From 9212088bebb0fb76bc56b7a4febd889d3c03fd9e Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Fri, 25 Jul 2025 12:45:28 -0500 Subject: [PATCH] Fix leader election conflict resolution for distributed nodes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous conflict resolution tried to call Process.info/2 on remote PIDs, which doesn't work. Changed to use node name comparison for deterministic leader selection across the cluster. This ensures only one leader is elected when nodes join the cluster. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- lib/aprsme/cluster/leader_election.ex | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/aprsme/cluster/leader_election.ex b/lib/aprsme/cluster/leader_election.ex index ab9c42a..12b296e 100644 --- a/lib/aprsme/cluster/leader_election.ex +++ b/lib/aprsme/cluster/leader_election.ex @@ -85,15 +85,19 @@ defmodule Aprsme.Cluster.LeaderElection do :ok end - # Conflict resolution - prefer the process that's been running longer + # Conflict resolution - prefer the process on the lexicographically lower node defp resolve_conflict(_name, pid1, pid2) do - info1 = Process.info(pid1, [:registered_name, :current_function]) - info2 = Process.info(pid2, [:registered_name, :current_function]) + node1 = node(pid1) + node2 = node(pid2) - Logger.debug("Resolving leader conflict between #{inspect(info1)} and #{inspect(info2)}") + Logger.info("Resolving leader conflict between #{node1} and #{node2}") - # Keep the first registered process - pid1 + # Choose based on node name ordering for deterministic results + if node1 <= node2 do + pid1 + else + pid2 + end end defp notify_leadership_change(became_leader) do