summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Klishin <michael@clojurewerkz.org>2019-04-01 16:36:49 +0300
committerMichael Klishin <michael@clojurewerkz.org>2019-04-01 16:36:49 +0300
commita1ab9545f3644e6e14d36ff3a4223963c634fa8a (patch)
tree2f69546686838223a7bd74836ce5fd097f261bd9 /src
parent2997bc4f072cf4755a2069bab5a0b246c726a70c (diff)
downloadrabbitmq-server-git-a1ab9545f3644e6e14d36ff3a4223963c634fa8a.tar.gz
Quorum queue; make membership changes [more] idempotent
Per discussion with @kjnilsson.
Diffstat (limited to 'src')
-rw-r--r--src/rabbit_quorum_queue.erl17
1 files changed, 7 insertions, 10 deletions
diff --git a/src/rabbit_quorum_queue.erl b/src/rabbit_quorum_queue.erl
index 76cd194d91..cbd9980491 100644
--- a/src/rabbit_quorum_queue.erl
+++ b/src/rabbit_quorum_queue.erl
@@ -673,7 +673,8 @@ add_member(VHost, Name, Node) ->
true ->
case lists:member(Node, QNodes) of
true ->
- {error, already_a_member};
+ %% idempotent by design
+ ok;
false ->
add_member(Q, Node)
end
@@ -719,16 +720,12 @@ delete_member(VHost, Name, Node) ->
{error, classic_queue_not_supported};
{ok, Q} when ?amqqueue_is_quorum(Q) ->
QNodes = amqqueue:get_quorum_nodes(Q),
- case lists:member(Node, rabbit_mnesia:cluster_nodes(running)) of
+ case lists:member(Node, QNodes) of
false ->
- {error, node_not_running};
+ %% idempotent by design
+ ok;
true ->
- case lists:member(Node, QNodes) of
- false ->
- {error, not_a_member};
- true ->
- delete_member(Q, Node)
- end
+ delete_member(Q, Node)
end;
{error, not_found} = E ->
E
@@ -743,7 +740,7 @@ delete_member(Q, Node) when ?amqqueue_is_quorum(Q) ->
%% deleting the last member is not allowed
{error, last_node};
_ ->
- case ra:leave_and_delete_server(ServerId) of
+ case ra:leave_and_delete_server(amqqueue:get_pid(Q), ServerId) of
ok ->
Fun = fun(Q1) ->
amqqueue:set_quorum_nodes(