summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Klishin <michael@novemberain.com>2018-07-25 05:08:06 +0300
committerGitHub <noreply@github.com>2018-07-25 05:08:06 +0300
commit08c6675a979856d2444a249079268d1f494e7748 (patch)
tree694ccb0d9731845107f3e8714dc4ff519a519da7
parent4da1431d27336f31d5f04c23c8326680e6d25d5c (diff)
parent051f7f3a8a31c8178630e0b10b950b82c4ac094c (diff)
downloadrabbitmq-server-git-08c6675a979856d2444a249079268d1f494e7748.tar.gz
Merge pull request #1650 from rabbitmq/binding-global-recover
Prepare semi-durable binding table once instead of each time a virtual host is recovered
-rw-r--r--src/rabbit_binding.erl24
-rw-r--r--src/rabbit_vhost.erl4
2 files changed, 18 insertions, 10 deletions
diff --git a/src/rabbit_binding.erl b/src/rabbit_binding.erl
index 090e30b2b4..a6907b8ce6 100644
--- a/src/rabbit_binding.erl
+++ b/src/rabbit_binding.erl
@@ -17,7 +17,7 @@
-module(rabbit_binding).
-include("rabbit.hrl").
--export([recover/2, exists/1, add/2, add/3, remove/1, remove/3, list/1]).
+-export([recover/0, recover/2, exists/1, add/2, add/3, remove/1, remove/3, list/1]).
-export([list_for_source/1, list_for_destination/1,
list_for_source_and_destination/2]).
-export([new_deletions/0, combine_deletions/2, add_deletion/3,
@@ -102,16 +102,20 @@
routing_key, arguments,
vhost]).
-recover(XNames, QNames) ->
+%% Global table recovery
+recover() ->
rabbit_misc:table_filter(
- fun (Route) ->
- mnesia:read({rabbit_semi_durable_route, Route}) =:= []
- end,
- fun (Route, true) ->
- ok = mnesia:write(rabbit_semi_durable_route, Route, write);
- (_Route, false) ->
- ok
- end, rabbit_durable_route),
+ fun (Route) ->
+ mnesia:read({rabbit_semi_durable_route, Route}) =:= []
+ end,
+ fun (Route, true) ->
+ ok = mnesia:write(rabbit_semi_durable_route, Route, write);
+ (_Route, false) ->
+ ok
+ end, rabbit_durable_route).
+
+%% Virtual host-specific recovery
+recover(XNames, QNames) ->
XNameSet = sets:from_list(XNames),
QNameSet = sets:from_list(QNames),
SelectSet = fun (#resource{kind = exchange}) -> XNameSet;
diff --git a/src/rabbit_vhost.erl b/src/rabbit_vhost.erl
index e97af7a757..fdcba35db2 100644
--- a/src/rabbit_vhost.erl
+++ b/src/rabbit_vhost.erl
@@ -52,6 +52,10 @@ recover() ->
rabbit_amqqueue:on_node_down(node()),
rabbit_amqqueue:warn_file_limit(),
+
+ %% Prepare rabbit_semi_durable_route table
+ rabbit_binding:recover(),
+
%% rabbit_vhost_sup_sup will start the actual recovery.
%% So recovery will be run every time a vhost supervisor is restarted.
ok = rabbit_vhost_sup_sup:start(),