@@ -50,7 +50,7 @@ ensure_feature_flags_are_in_sync(Nodes, NodeIsVirgin) ->
50
50
RemoteNode :: node (),
51
51
Ret :: Ok | Error ,
52
52
Ok :: {ok , [node ()]} | {ok , already_member },
53
- Error :: {error , {inconsistent_cluster , string ()}}.
53
+ Error :: {error , {inconsistent_cluster , string ()} | { error , { erpc , noconnection }} }.
54
54
55
55
can_join (RemoteNode ) ->
56
56
? LOG_INFO (
@@ -82,7 +82,7 @@ can_join_using_khepri(RemoteNode) ->
82
82
NodeType :: node_type (),
83
83
Ret :: Ok | Error ,
84
84
Ok :: ok | {ok , already_member },
85
- Error :: {error , {inconsistent_cluster , string ()}}.
85
+ Error :: {error , {inconsistent_cluster , string ()} | { error , { erpc , noconnection }} }.
86
86
% % @doc Adds this node to a cluster using `RemoteNode' to reach it.
87
87
88
88
join (ThisNode , _NodeType ) when ThisNode =:= node () ->
@@ -214,6 +214,22 @@ join(RemoteNode, NodeType)
214
214
end ;
215
215
{ok , already_member } ->
216
216
{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
+ ok = rabbit_mnesia :leave_then_rediscover_cluster (RemoteNode ),
231
+ join (RemoteNode , NodeType )
232
+ end ;
217
233
{error , _ } = Error ->
218
234
Error
219
235
end .
0 commit comments