diff options
| author | kjnilsson <knilsson@pivotal.io> | 2019-02-14 16:53:43 +0000 |
|---|---|---|
| committer | kjnilsson <knilsson@pivotal.io> | 2019-02-14 16:53:43 +0000 |
| commit | 8e6701b310679eb1b05e4a80ab42e6e1b1af0768 (patch) | |
| tree | 0688db95032d419827f62997242276e28d03762b /src | |
| parent | b062641019a849f2c80118bf33c0882335cda431 (diff) | |
| download | rabbitmq-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.erl | 43 |
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, |
