summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEmile Joubert <emile@rabbitmq.com>2013-03-11 14:16:32 +0000
committerEmile Joubert <emile@rabbitmq.com>2013-03-11 14:16:32 +0000
commit734b61abe4f5b4f281034ac00672003909a36569 (patch)
treec13843288ac1fbc9642a4a492579e5666e4ba956 /src
parent844d1918acf1c3b691f5dab06ea75257794d4be0 (diff)
downloadrabbitmq-server-git-734b61abe4f5b4f281034ac00672003909a36569.tar.gz
Minimise routing exchange decorator API
Diffstat (limited to 'src')
-rw-r--r--src/rabbit_exchange.erl28
-rw-r--r--src/rabbit_exchange_decorator.erl14
2 files changed, 19 insertions, 23 deletions
diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl
index 7179454d02..0d1e9831a1 100644
--- a/src/rabbit_exchange.erl
+++ b/src/rabbit_exchange.erl
@@ -312,26 +312,24 @@ info_all(VHostPath) -> map(VHostPath, fun (X) -> info(X) end).
info_all(VHostPath, Items) -> map(VHostPath, fun (X) -> info(X, Items) end).
-route(#exchange{name = #resource{name = RName, virtual_host = VHost} = XName} = X,
+route(#exchange{name = #resource{virtual_host = VHost,
+ name = RName} = XName} = X,
#delivery{message = #basic_message{routing_keys = RKs}} = Delivery) ->
- case {registry_lookup(exchange_decorator_route) == [], RName == <<"">>} of
- {true, true} ->
+ case {registry_lookup(exchange_decorator_route), RName == <<"">>} of
+ {[], true} ->
+ %% Optimisation
[rabbit_misc:r(VHost, queue, RK) || RK <- lists:usort(RKs)];
- {NoDecorator, _} ->
+ {Decorators, _} ->
QNames = route1(Delivery, {[X], XName, []}),
- lists:usort(case NoDecorator of
- true -> QNames;
- false -> decorate_route(X, Delivery, QNames)
- end)
+ lists:usort(decorate_route(Decorators, X, Delivery, QNames))
end.
-decorate_route(X, Delivery, QNames) ->
- {Add, Remove} =
- lists:foldl(fun (Decorator, {Add, Remove}) ->
- {A1, R1} = Decorator:route(X, Delivery, QNames),
- {A1 ++ Add, R1 ++ Remove}
- end, {[], []}, registry_lookup(exchange_decorator_route)),
- QNames ++ Add -- Remove.
+decorate_route([], _X, _Delivery, QNames) ->
+ QNames;
+decorate_route(Decorators, X, Delivery, QNames) ->
+ lists:foldl(fun (Decorator, QNamesAcc) ->
+ Decorator:route(X, Delivery) ++ QNamesAcc
+ end, QNames, Decorators).
route1(_, {[], _, QNames}) ->
QNames;
diff --git a/src/rabbit_exchange_decorator.erl b/src/rabbit_exchange_decorator.erl
index 70ba4d2296..05077f03e1 100644
--- a/src/rabbit_exchange_decorator.erl
+++ b/src/rabbit_exchange_decorator.erl
@@ -58,13 +58,11 @@
serial(), rabbit_types:exchange(), rabbit_types:exchange()) -> 'ok'.
%% called after exchange routing
-%% return value is a tuple of two lists: queues to be added
-%% and queues to be removed from the list of destination queues.
-%% decorators must register separately for this callback using
-%% exchange_decorator_route.
--callback route ( rabbit_types:exchange(), rabbit_types:delivery(),
- [rabbit_amqqueue:name()]) ->
- {[rabbit_amqqueue:name()], [rabbit_amqqueue:name()]}.
+%% return value is a list of queues to be added to the list of
+%% destination queues. decorators must register separately for
+%% this callback using exchange_decorator_route.
+-callback route ( rabbit_types:exchange(), rabbit_types:delivery()) ->
+ [rabbit_amqqueue:name()].
-else.
@@ -72,7 +70,7 @@
behaviour_info(callbacks) ->
[{description, 0}, {serialise_events, 1}, {create, 2}, {delete, 3},
- {add_binding, 3}, {remove_bindings, 3}, {policy_changed, 3}, {route, 3}];
+ {add_binding, 3}, {remove_bindings, 3}, {policy_changed, 3}, {route, 2}];
behaviour_info(_Other) ->
undefined.