diff options
| author | kjnilsson <knilsson@pivotal.io> | 2019-02-20 17:29:29 +0000 |
|---|---|---|
| committer | kjnilsson <knilsson@pivotal.io> | 2019-02-20 17:29:29 +0000 |
| commit | 496986d10a27d52718a8b3273e896f98f456d2ad (patch) | |
| tree | 12274d34960d4941c9d989115e02d52dda6c01dc | |
| parent | 2856a2f921ac5b63a469689881f2da251d472ae2 (diff) | |
| download | rabbitmq-server-git-496986d10a27d52718a8b3273e896f98f456d2ad.tar.gz | |
Change rabbit_quorum_queue:grow/3
To filter non-running nodes instead of by connection as it should
not be possible to add a quorum
queue server running on an erlang node without RabbitMQ.
[#162782801]
| -rw-r--r-- | src/rabbit_quorum_queue.erl | 16 | ||||
| -rw-r--r-- | test/rabbitmq_queues_cli_integration_SUITE.erl | 16 |
2 files changed, 23 insertions, 9 deletions
diff --git a/src/rabbit_quorum_queue.erl b/src/rabbit_quorum_queue.erl index 08b4eaf5b3..5d28ef506a 100644 --- a/src/rabbit_quorum_queue.erl +++ b/src/rabbit_quorum_queue.erl @@ -760,23 +760,23 @@ shrink_all(Node) -> amqqueue:get_type(Q) == quorum, lists:member(Node, amqqueue:get_quorum_nodes(Q))]. --spec grow(node(), binary(), binary(), - all | even) -> +-spec grow(node(), binary(), binary(), all | even) -> [{rabbit_amqqueue:name(), {ok, pos_integer()} | {error, pos_integer(), term()}}]. grow(Node, VhostSpec, QueueSpec, Strategy) -> - ConnectedNodes = [node() | nodes()], + Running = rabbit_mnesia:cluster_nodes(running), [begin + Size = length(amqqueue:get_quorum_nodes(Q)), QName = amqqueue:get_name(Q), rabbit_log:info("~s: Adding member ~w", [rabbit_misc:rs(QName), Node]), - Size = length(amqqueue:get_quorum_nodes(Q)), case add_member(Q, Node) of ok -> {QName, {ok, Size + 1}}; {error, Err} -> - rabbit_log:warning("~s: Failed to add member ~w, Error ~w", - [rabbit_misc:rs(QName), Node, Err]), + rabbit_log:warning( + "~s: Failed to add member ~w, Error ~w", + [rabbit_misc:rs(QName), Node, Err]), {QName, {error, Size, Err}} end end @@ -784,8 +784,8 @@ grow(Node, VhostSpec, QueueSpec, Strategy) -> amqqueue:get_type(Q) == quorum, %% don't add a member if there is already one on the node not lists:member(Node, amqqueue:get_quorum_nodes(Q)), - %% if the node isn't connected, best not to add it - lists:member(Node, ConnectedNodes), + %% node needs to be running + lists:member(Node, Running), matches_strategy(Strategy, amqqueue:get_quorum_nodes(Q)), is_match(amqqueue:get_vhost(Q), VhostSpec) andalso is_match(get_resource_name(amqqueue:get_name(Q)), QueueSpec) ]. diff --git a/test/rabbitmq_queues_cli_integration_SUITE.erl b/test/rabbitmq_queues_cli_integration_SUITE.erl index 71e51d5ab5..1601ba82fe 100644 --- a/test/rabbitmq_queues_cli_integration_SUITE.erl +++ b/test/rabbitmq_queues_cli_integration_SUITE.erl @@ -30,7 +30,8 @@ groups() -> [ {tests, [], [ shrink, - grow + grow, + grow_invalid_node_filtered ]} ]. @@ -99,6 +100,19 @@ grow(Config) -> ?assertNotMatch(#{{"/", "grow1"} := _}, parse_result(Out3)), ok. +grow_invalid_node_filtered(Config) -> + NodeConfig = rabbit_ct_broker_helpers:get_node_config(Config, 2), + Nodename2 = ?config(nodename, NodeConfig), + Ch = rabbit_ct_client_helpers:open_channel(Config, Nodename2), + %% declare a quorum queue + QName = "grow-err", + Args = [{<<"x-quorum-initial-group-size">>, long, 1}], + #'queue.declare_ok'{} = declare_qq(Ch, QName, Args), + DummyNode = not_really_a_node@nothing, + {ok, Out1} = rabbitmq_queues(Config, 0, ["grow", DummyNode, "all"]), + ?assertNotMatch(#{{"/", "grow-err"} := _}, parse_result(Out1)), + ok. + parse_result(S) -> Lines = string:split(S, "\n", all), maps:from_list( |
