summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordcorbacho <dparracorbacho@piotal.io>2021-12-21 16:12:25 +0100
committerdcorbacho <dparracorbacho@piotal.io>2021-12-21 16:13:07 +0100
commit345809d659a88bdb360f05000b00396bbc0f9bc2 (patch)
treec824a0422ae84967538900f1c3afb3bce26be3f6
parent72da4fb864877744a461ef2f5efc2a28252938d6 (diff)
downloadrabbitmq-server-git-handle-import-shutdown-error.tar.gz
Support leave khepri cluster on `rabbit_mnesia`handle-import-shutdown-error
-rw-r--r--deps/rabbit/src/rabbit_mnesia.erl31
1 files changed, 29 insertions, 2 deletions
diff --git a/deps/rabbit/src/rabbit_mnesia.erl b/deps/rabbit/src/rabbit_mnesia.erl
index 4b0b65e66d..7c45a63581 100644
--- a/deps/rabbit/src/rabbit_mnesia.erl
+++ b/deps/rabbit/src/rabbit_mnesia.erl
@@ -267,7 +267,34 @@ join_mnesia_cluster(DiscoveryNode, NodeType) ->
join_khepri_cluster(DiscoveryNode) ->
ThisNode = node(),
- rabbit_khepri:add_member(ThisNode, [DiscoveryNode]).
+ retry_khepri_op(fun() -> rabbit_khepri:add_member(ThisNode, [DiscoveryNode]) end, 60).
+
+leave_khepri_cluster(Node) ->
+ retry_khepri_op(fun() -> rabbit_khepri:remove_member(Node) end, 60).
+
+retry_khepri_op(Fun, 0) ->
+ Fun();
+retry_khepri_op(Fun, N) ->
+ case Fun() of
+ {error, {no_more_servers_to_try, Reasons}} = Err ->
+ case lists:member({error,cluster_change_not_permitted}, Reasons) of
+ true ->
+ timer:sleep(1000),
+ retry_khepri_op(Fun, N - 1);
+ false ->
+ Err
+ end;
+ {no_more_servers_to_try, Reasons} = Err ->
+ case lists:member({error,cluster_change_not_permitted}, Reasons) of
+ true ->
+ timer:sleep(1000),
+ retry_khepri_op(Fun, N - 1);
+ false ->
+ Err
+ end;
+ Any ->
+ Any
+ end.
%% return node to its virgin state, where it is not member of any
%% cluster, has no cluster configuration, no local database, and no
@@ -878,7 +905,7 @@ remove_node_if_mnesia_running(Node) ->
{atomic, ok} ->
rabbit_amqqueue:forget_all_durable(Node),
rabbit_node_monitor:notify_left_cluster(Node),
- ok;
+ leave_khepri_cluster(Node);
{aborted, Reason} ->
{error, {failed_to_remove_node, Node, Reason}}
end