diff options
| author | Simon MacMullen <simon@rabbitmq.com> | 2013-09-03 12:47:13 +0100 |
|---|---|---|
| committer | Simon MacMullen <simon@rabbitmq.com> | 2013-09-03 12:47:13 +0100 |
| commit | ccef51f21eaaac9a247d199a60db8712d5853a92 (patch) | |
| tree | d8fcf83122127617c8046fbe27305e87038aa06e | |
| parent | 7da554f11615a5ec18a21659bdae08e406cc952d (diff) | |
| download | rabbitmq-server-git-ccef51f21eaaac9a247d199a60db8712d5853a92.tar.gz | |
Reinstate optimisations, plus a bit of abstraction. This entails an API change in the return type of rabbit_policy:get/2.
| -rw-r--r-- | src/rabbit_amqqueue.erl | 3 | ||||
| -rw-r--r-- | src/rabbit_exchange.erl | 12 | ||||
| -rw-r--r-- | src/rabbit_policy.erl | 24 |
3 files changed, 23 insertions, 16 deletions
diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl index 0673ff8ebd..31c0268f99 100644 --- a/src/rabbit_amqqueue.erl +++ b/src/rabbit_amqqueue.erl @@ -631,8 +631,7 @@ forget_all_durable(Node) -> internal_delete1(Name)) || #amqqueue{name = Name, pid = Pid} = Q <- Qs, node(Pid) =:= Node, - rabbit_policy:get(<<"ha-mode">>, Q) - =:= {error, not_found}], + rabbit_policy:get(<<"ha-mode">>, Q) =:= undefined], ok end), ok. diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl index bdb0f5db48..fc13151958 100644 --- a/src/rabbit_exchange.erl +++ b/src/rabbit_exchange.erl @@ -347,13 +347,11 @@ route1(Delivery, Decorators, lists:foldl(fun process_route/2, {WorkList, SeenXs, QNames}, AlternateDests ++ DecorateDests ++ ExchangeDests)). -process_alternate(X = #exchange{name = XName, arguments = Args}, []) -> - case rabbit_misc:r_arg(XName, exchange, Args, <<"alternate-exchange">>) of - undefined -> case rabbit_policy:get(<<"alternate-exchange">>, X) of - {ok, AName} -> [rabbit_misc:r(XName, exchange, AName)]; - {error, _} -> [] - end; - AName -> [AName] +process_alternate(X = #exchange{name = XName}, []) -> + case rabbit_policy:get_arg( + <<"alternate-exchange">>, <<"alternate-exchange">>, X) of + undefined -> []; + AName -> [rabbit_misc:r(XName, exchange, AName)] end; process_alternate(_X, _Results) -> []. diff --git a/src/rabbit_policy.erl b/src/rabbit_policy.erl index 0785d27802..d371ac4db7 100644 --- a/src/rabbit_policy.erl +++ b/src/rabbit_policy.erl @@ -26,7 +26,7 @@ -export([register/0]). -export([invalidate/0, recover/0]). --export([name/1, get/2, set/1]). +-export([name/1, get/2, get_arg/3, set/1]). -export([validate/4, notify/4, notify_clear/3]). -export([parse_set/6, set/6, delete/2, lookup/2, list/0, list/1, list_formatted/1, info_keys/0]). @@ -62,15 +62,25 @@ get(Name, #exchange{policy = Policy}) -> get0(Name, Policy); get(Name, EntityName = #resource{virtual_host = VHost}) -> get0(Name, match(EntityName, list(VHost))). -get0(_Name, undefined) -> {error, not_found}; +get0(_Name, undefined) -> undefined; get0(Name, List) -> case pget(definition, List) of - undefined -> {error, not_found}; - Policy -> case pget(Name, Policy) of - undefined -> {error, not_found}; - Value -> {ok, Value} - end + undefined -> undefined; + Policy -> pget(Name, Policy) end. +%% Many heads for optimisation +get_arg(_AName, _PName, #exchange{arguments = [], policy = undefined}) -> + undefined; +get_arg(_AName, PName, X = #exchange{arguments = []}) -> + get(PName, X); +get_arg(AName, _PName, #exchange{arguments = Args, policy = undefined}) -> + rabbit_misc:table_lookup(Args, AName); +get_arg(AName, PName, X = #exchange{arguments = Args}) -> + case rabbit_misc:table_lookup(Args, AName) of + undefined -> get(PName, X); + Arg -> Arg + end. + %%---------------------------------------------------------------------------- %% Gets called during upgrades - therefore must not assume anything about the |
