summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2013-09-03 12:47:13 +0100
committerSimon MacMullen <simon@rabbitmq.com>2013-09-03 12:47:13 +0100
commitccef51f21eaaac9a247d199a60db8712d5853a92 (patch)
treed8fcf83122127617c8046fbe27305e87038aa06e
parent7da554f11615a5ec18a21659bdae08e406cc952d (diff)
downloadrabbitmq-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.erl3
-rw-r--r--src/rabbit_exchange.erl12
-rw-r--r--src/rabbit_policy.erl24
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