diff options
| author | Emile Joubert <emile@rabbitmq.com> | 2013-10-31 17:31:13 +0000 |
|---|---|---|
| committer | Emile Joubert <emile@rabbitmq.com> | 2013-10-31 17:31:13 +0000 |
| commit | 1fd10eae66036d7264494dceb071291511263095 (patch) | |
| tree | 67e55c9dd9e79f6e5a3e2d39259ce7bd2dd597b5 | |
| parent | 1d8c1c3a71a62481e94d59a51a780ea128949023 (diff) | |
| parent | 5a8c397387f27b9b3923662fc144a11963cdcf55 (diff) | |
| download | rabbitmq-server-git-1fd10eae66036d7264494dceb071291511263095.tar.gz | |
Merged stable into default
| -rw-r--r-- | src/rabbit_amqqueue.erl | 12 | ||||
| -rw-r--r-- | src/rabbit_exchange.erl | 12 | ||||
| -rw-r--r-- | src/rabbit_policy.erl | 14 | ||||
| -rw-r--r-- | src/rabbit_runtime_parameters.erl | 22 |
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)]. |
