diff options
| author | Emile Joubert <emile@rabbitmq.com> | 2013-03-11 14:16:32 +0000 |
|---|---|---|
| committer | Emile Joubert <emile@rabbitmq.com> | 2013-03-11 14:16:32 +0000 |
| commit | 734b61abe4f5b4f281034ac00672003909a36569 (patch) | |
| tree | c13843288ac1fbc9642a4a492579e5666e4ba956 /src | |
| parent | 844d1918acf1c3b691f5dab06ea75257794d4be0 (diff) | |
| download | rabbitmq-server-git-734b61abe4f5b4f281034ac00672003909a36569.tar.gz | |
Minimise routing exchange decorator API
Diffstat (limited to 'src')
| -rw-r--r-- | src/rabbit_exchange.erl | 28 | ||||
| -rw-r--r-- | src/rabbit_exchange_decorator.erl | 14 |
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. |
