diff options
| author | Daniil Fedotov <hairyhum@gmail.com> | 2018-03-06 12:14:04 +0000 |
|---|---|---|
| committer | Daniil Fedotov <hairyhum@gmail.com> | 2018-03-06 12:14:04 +0000 |
| commit | 1d413eac80c2adb6844b82c8ce57e21a04a55b04 (patch) | |
| tree | 1ef2db0a71d726ac2926e8995ca0aa66876cf6ec /src | |
| parent | e3ba0b51b1754427594cc0b0e6c2064b6efc280f (diff) | |
| download | rabbitmq-server-git-1d413eac80c2adb6844b82c8ce57e21a04a55b04.tar.gz | |
Make min-masters locator count uniqueue queue names instead of bindings.
Fixes #1519
Min-masters locator was counting bindings instead of bound queues, which
caused #1519
Unique queue name counting is what documentation implies.
Diffstat (limited to 'src')
| -rw-r--r-- | src/rabbit_queue_location_min_masters.erl | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/src/rabbit_queue_location_min_masters.erl b/src/rabbit_queue_location_min_masters.erl index 5d6f568d4a..c532714d41 100644 --- a/src/rabbit_queue_location_min_masters.erl +++ b/src/rabbit_queue_location_min_masters.erl @@ -57,23 +57,26 @@ count_masters(Node, Masters) -> get_bound_queue_masters_per_vhost([], Acc) -> lists:flatten(Acc); get_bound_queue_masters_per_vhost([VHost|RemVHosts], Acc) -> - Bindings = rabbit_binding:list(VHost), - BoundQueueMasters = get_queue_master_per_binding(VHost, Bindings, []), + BoundQueueNames = + lists:filtermap( + fun(#binding{destination =#resource{kind = queue, + name = QueueName}}) -> + {true, QueueName}; + (_) -> + false + end, + rabbit_binding:list(VHost)), + UniqQueueNames = lists:usort(BoundQueueNames), + BoundQueueMasters = get_queue_masters(VHost, UniqQueueNames, []), get_bound_queue_masters_per_vhost(RemVHosts, [BoundQueueMasters|Acc]). -get_queue_master_per_binding(_VHost, [], BoundQueueNodes) -> BoundQueueNodes; -get_queue_master_per_binding(VHost, [#binding{destination= - #resource{kind=queue, - name=QueueName}}| - RemBindings], - QueueMastersAcc) -> +get_queue_masters(_VHost, [], BoundQueueNodes) -> BoundQueueNodes; +get_queue_masters(VHost, [QueueName | RemQueueNames], QueueMastersAcc) -> QueueMastersAcc0 = case rabbit_queue_master_location_misc:lookup_master( QueueName, VHost) of {ok, Master} when is_atom(Master) -> [Master|QueueMastersAcc]; _ -> QueueMastersAcc end, - get_queue_master_per_binding(VHost, RemBindings, QueueMastersAcc0); -get_queue_master_per_binding(VHost, [_|RemBindings], QueueMastersAcc) -> - get_queue_master_per_binding(VHost, RemBindings, QueueMastersAcc). + get_queue_masters(VHost, RemQueueNames, QueueMastersAcc0). |
