summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorkjnilsson <knilsson@pivotal.io>2019-02-14 16:53:43 +0000
committerkjnilsson <knilsson@pivotal.io>2019-02-14 16:53:43 +0000
commit8e6701b310679eb1b05e4a80ab42e6e1b1af0768 (patch)
tree0688db95032d419827f62997242276e28d03762b /src
parentb062641019a849f2c80118bf33c0882335cda431 (diff)
downloadrabbitmq-server-git-8e6701b310679eb1b05e4a80ab42e6e1b1af0768.tar.gz
Disallow removal of the last quorum member
Also change formatting. [#162782789]
Diffstat (limited to 'src')
-rw-r--r--src/rabbit_quorum_queue.erl43
1 files changed, 26 insertions, 17 deletions
diff --git a/src/rabbit_quorum_queue.erl b/src/rabbit_quorum_queue.erl
index b9ca15467c..fd57608515 100644
--- a/src/rabbit_quorum_queue.erl
+++ b/src/rabbit_quorum_queue.erl
@@ -712,18 +712,27 @@ delete_member(Q, Node) when ?amqqueue_is_quorum(Q) ->
QName = amqqueue:get_name(Q),
{RaName, _} = amqqueue:get_pid(Q),
ServerId = {RaName, Node},
- case ra:leave_and_delete_server(ServerId) of
- ok ->
- Fun = fun(Q1) ->
- amqqueue:set_quorum_nodes(
- Q1,
- lists:delete(Node, amqqueue:get_quorum_nodes(Q1)))
- end,
- rabbit_misc:execute_mnesia_transaction(
- fun() -> rabbit_amqqueue:update(QName, Fun) end),
- ok;
- E ->
- E
+ case amqqueue:get_quorum_nodes(Q) of
+ [Node] ->
+ %% deleting the last member is not allowed
+ {error, last_node};
+ _ ->
+ case ra:leave_and_delete_server(ServerId) of
+ ok ->
+ Fun = fun(Q1) ->
+ amqqueue:set_quorum_nodes(
+ Q1,
+ lists:delete(Node,
+ amqqueue:get_quorum_nodes(Q1)))
+ end,
+ rabbit_misc:execute_mnesia_transaction(
+ fun() -> rabbit_amqqueue:update(QName, Fun) end),
+ ok;
+ timeout ->
+ {error, timeout};
+ E ->
+ E
+ end
end.
shrink_all(Node) ->
@@ -733,11 +742,11 @@ shrink_all(Node) ->
[rabbit_misc:rs(QName), Node]),
case delete_member(Q, Node) of
ok ->
- {ok, QName};
- Err ->
- rabbit_log:warning("~s: Failed to remove member ~w",
- [rabbit_misc:rs(QName), Node]),
- {error, QName, Err}
+ {QName, ok};
+ {error, Err} ->
+ rabbit_log:warning("~s: Failed to remove member ~w, Error ~w",
+ [rabbit_misc:rs(QName), Node, Err]),
+ {QName, {error, Err}}
end
end || Q <- rabbit_amqqueue:list(),
amqqueue:get_type(Q) == quorum,