summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmile Joubert <emile@rabbitmq.com>2013-10-31 17:31:13 +0000
committerEmile Joubert <emile@rabbitmq.com>2013-10-31 17:31:13 +0000
commit1fd10eae66036d7264494dceb071291511263095 (patch)
tree67e55c9dd9e79f6e5a3e2d39259ce7bd2dd597b5
parent1d8c1c3a71a62481e94d59a51a780ea128949023 (diff)
parent5a8c397387f27b9b3923662fc144a11963cdcf55 (diff)
downloadrabbitmq-server-git-1fd10eae66036d7264494dceb071291511263095.tar.gz
Merged stable into default
-rw-r--r--src/rabbit_amqqueue.erl12
-rw-r--r--src/rabbit_exchange.erl12
-rw-r--r--src/rabbit_policy.erl14
-rw-r--r--src/rabbit_runtime_parameters.erl22
4 files changed, 44 insertions, 16 deletions
diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl
index 8a84c9f4a6..8306f13461 100644
--- a/src/rabbit_amqqueue.erl
+++ b/src/rabbit_amqqueue.erl
@@ -466,10 +466,16 @@ check_dlxrk_arg({Type, _}, _Args) ->
list() -> mnesia:dirty_match_object(rabbit_queue, #amqqueue{_ = '_'}).
+%% Not dirty_match_object since that would not be transactional when used in a
+%% tx context
list(VHostPath) ->
- mnesia:dirty_match_object(
- rabbit_queue,
- #amqqueue{name = rabbit_misc:r(VHostPath, queue), _ = '_'}).
+ mnesia:async_dirty(
+ fun () ->
+ mnesia:match_object(
+ rabbit_queue,
+ #amqqueue{name = rabbit_misc:r(VHostPath, queue), _ = '_'},
+ read)
+ end).
info_keys() -> rabbit_amqqueue_process:info_keys().
diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl
index fc13151958..bb5b63e912 100644
--- a/src/rabbit_exchange.erl
+++ b/src/rabbit_exchange.erl
@@ -244,10 +244,16 @@ lookup_or_die(Name) ->
{error, not_found} -> rabbit_misc:not_found(Name)
end.
+%% Not dirty_match_object since that would not be transactional when used in a
+%% tx context
list(VHostPath) ->
- mnesia:dirty_match_object(
- rabbit_exchange,
- #exchange{name = rabbit_misc:r(VHostPath, exchange), _ = '_'}).
+ mnesia:async_dirty(
+ fun () ->
+ mnesia:match_object(
+ rabbit_exchange,
+ #exchange{name = rabbit_misc:r(VHostPath, exchange), _ = '_'},
+ read)
+ end).
lookup_scratch(Name, App) ->
case lookup(Name) of
diff --git a/src/rabbit_policy.erl b/src/rabbit_policy.erl
index de10b30ffd..dd1e0d9d48 100644
--- a/src/rabbit_policy.erl
+++ b/src/rabbit_policy.erl
@@ -171,7 +171,11 @@ list_formatted(VHost) ->
order_policies(list0(VHost, fun format/1)).
list0(VHost, DefnFun) ->
- [p(P, DefnFun) || P <- rabbit_runtime_parameters:list(VHost, <<"policy">>)].
+ mnesia:async_dirty(
+ fun () ->
+ [p(P, DefnFun) ||
+ P <- rabbit_runtime_parameters:list(VHost, <<"policy">>)]
+ end).
order_policies(PropList) ->
lists:sort(fun (A, B) -> pget(priority, A) < pget(priority, B) end,
@@ -208,10 +212,16 @@ notify_clear(VHost, <<"policy">>, _Name) ->
%%----------------------------------------------------------------------------
+%% [1] We need to prevent this from becoming O(n^2) in a similar
+%% manner to rabbit_binding:remove_for_{source,destination}. So see
+%% the comment in rabbit_binding:lock_route_tables/0 for more rationale.
update_policies(VHost) ->
- Policies = list(VHost),
+ Tabs = [rabbit_queue, rabbit_durable_queue,
+ rabbit_exchange, rabbit_durable_exchange],
{Xs, Qs} = rabbit_misc:execute_mnesia_transaction(
fun() ->
+ [mnesia:lock({table, T}, write) || T <- Tabs], %% [1]
+ Policies = list(VHost),
{[update_exchange(X, Policies) ||
X <- rabbit_exchange:list(VHost)],
[update_queue(Q, Policies) ||
diff --git a/src/rabbit_runtime_parameters.erl b/src/rabbit_runtime_parameters.erl
index c13c333ed4..bcde0078f6 100644
--- a/src/rabbit_runtime_parameters.erl
+++ b/src/rabbit_runtime_parameters.erl
@@ -139,15 +139,21 @@ list() ->
list(VHost) -> list(VHost, '_').
list_component(Component) -> list('_', Component).
+%% Not dirty_match_object since that would not be transactional when used in a
+%% tx context
list(VHost, Component) ->
- case VHost of
- '_' -> ok;
- _ -> rabbit_vhost:assert(VHost)
- end,
- Match = #runtime_parameters{key = {VHost, Component, '_'}, _ = '_'},
- [p(P) || #runtime_parameters{key = {_VHost, Comp, _Name}} = P <-
- mnesia:dirty_match_object(?TABLE, Match),
- Comp =/= <<"policy">> orelse Component =:= <<"policy">>].
+ mnesia:async_dirty(
+ fun () ->
+ case VHost of
+ '_' -> ok;
+ _ -> rabbit_vhost:assert(VHost)
+ end,
+ Match = #runtime_parameters{key = {VHost, Component, '_'},
+ _ = '_'},
+ [p(P) || #runtime_parameters{key = {_VHost, Comp, _Name}} = P <-
+ mnesia:match_object(?TABLE, Match, read),
+ Comp =/= <<"policy">> orelse Component =:= <<"policy">>]
+ end).
list_formatted(VHost) ->
[pset(value, format(pget(value, P)), P) || P <- list(VHost)].