Skip to content

Commit ff96655

Browse files
SimonUngemergify[bot]
authored andcommitted
Mnesia: Ask to leave a cluster and retry to join if cluster already consider node a member.
Khepri: no-op. Khepri is less strict already, and rabbit_khepri:can_join would accept a join request from a node that is already a member (cherry picked from commit dd49cbe) (cherry picked from commit 6d464f9)
1 parent 85cb9fd commit ff96655

File tree

2 files changed

+35
-10
lines changed

2 files changed

+35
-10
lines changed

deps/rabbit/src/rabbit_db_cluster.erl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,28 @@ join(RemoteNode, NodeType)
214214
end;
215215
{ok, already_member} ->
216216
{ok, already_member};
217+
{error, {inconsistent_cluster, Msg}} = Error ->
218+
case rabbit_khepri:is_enabled() of
219+
true ->
220+
Error;
221+
false ->
222+
%% rabbit_mnesia:can_join_cluster/1 notice inconsistent_cluster,
223+
%% as RemoteNode thinks this node is already in the cluster.
224+
%% Attempt to leave the RemoteNode cluster, the discovery cluster,
225+
%% and simply retry the operation.
226+
rabbit_log:info("Mnesia: node ~tp thinks it's clustered "
227+
"with node ~tp, but ~tp disagrees. ~tp will ask "
228+
"to leave the cluster and try again.",
229+
[RemoteNode, node(), node(), node()]),
230+
try
231+
ok = rabbit_mnesia:leave_discover_cluster(RemoteNode),
232+
join(RemoteNode, NodeType)
233+
catch
234+
_ ->
235+
rabbit_log:error(Msg),
236+
Error
237+
end
238+
end;
217239
{error, _} = Error ->
218240
Error
219241
end.

deps/rabbit/src/rabbit_mnesia.erl

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
-export([node_info/0, remove_node_if_mnesia_running/1]).
7474

7575
%% Used internally in `rabbit_db_cluster'.
76-
-export([members/0]).
76+
-export([members/0, leave_discover_cluster/1]).
7777

7878
%% Used internally in `rabbit_khepri'.
7979
-export([mnesia_and_msg_store_files/0]).
@@ -179,7 +179,6 @@ can_join_cluster(DiscoveryNode) ->
179179
{ok, already_member};
180180
false ->
181181
Msg = format_inconsistent_cluster_message(DiscoveryNode, node()),
182-
rabbit_log:error(Msg),
183182
{error, {inconsistent_cluster, Msg}}
184183
end
185184
end.
@@ -894,15 +893,19 @@ remove_node_if_mnesia_running(Node) ->
894893
end
895894
end.
896895

897-
leave_cluster() ->
898-
case rabbit_nodes:nodes_excl_me(cluster_nodes(all)) of
899-
[] -> ok;
900-
AllNodes -> case lists:any(fun leave_cluster/1, AllNodes) of
901-
true -> ok;
902-
false -> e(no_running_cluster_nodes)
903-
end
904-
end.
896+
leave_discover_cluster(DiscoveryNode) ->
897+
{ClusterNodes, _, _} = discover_cluster([DiscoveryNode]),
898+
leave_cluster(rabbit_nodes:nodes_excl_me(ClusterNodes)).
905899

900+
leave_cluster() ->
901+
leave_cluster(rabbit_nodes:nodes_excl_me(cluster_nodes(all))).
902+
leave_cluster([]) ->
903+
ok;
904+
leave_cluster(Nodes) when is_list(Nodes) ->
905+
case lists:any(fun leave_cluster/1, Nodes) of
906+
true -> ok;
907+
false -> e(no_running_cluster_nodes)
908+
end;
906909
leave_cluster(Node) ->
907910
case rpc:call(Node,
908911
rabbit_mnesia, remove_node_if_mnesia_running, [node()]) of

0 commit comments

Comments
 (0)