diff options
| -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 |
