Skip to content

Commit 3667466

Browse files
Merge pull request #3137 from rabbitmq/faster-binding-recovery
Faster implementation of rabbit_binding:recover/0 (cherry picked from commit a3e98c2)
1 parent b76fe16 commit 3667466

File tree

2 files changed

+19
-11
lines changed

2 files changed

+19
-11
lines changed

deps/rabbit/src/rabbit_binding.erl

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,16 @@ new(Src, RoutingKey, Dst, Arguments) ->
7777
%% Global table recovery
7878

7979
recover() ->
80-
rabbit_misc:table_filter(
81-
fun (Route) ->
82-
mnesia:read({rabbit_semi_durable_route, Route}) =:= []
83-
end,
84-
fun (Route, true) ->
85-
ok = mnesia:write(rabbit_semi_durable_route, Route, write);
86-
(_Route, false) ->
87-
ok
88-
end, rabbit_durable_route).
80+
rabbit_misc:execute_mnesia_transaction(
81+
fun () ->
82+
mnesia:lock({table, rabbit_durable_route}, read),
83+
mnesia:lock({table, rabbit_semi_durable_route}, write),
84+
Routes = rabbit_misc:dirty_read_all(rabbit_durable_route),
85+
Fun = fun(Route) ->
86+
mnesia:dirty_write(rabbit_semi_durable_route, Route)
87+
end,
88+
lists:foreach(Fun, Routes)
89+
end).
8990

9091
%% Virtual host-specific recovery
9192

deps/rabbit/src/rabbit_vhost.erl

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ recover() ->
3737
rabbit_amqqueue:warn_file_limit(),
3838

3939
%% Prepare rabbit_semi_durable_route table
40-
rabbit_binding:recover(),
40+
{Time, _} = timer:tc(fun() ->
41+
rabbit_binding:recover()
42+
end),
43+
rabbit_log:debug("rabbit_binding:recover/0 completed in ~fs", [Time/1000000]),
4144

4245
%% rabbit_vhost_sup_sup will start the actual recovery.
4346
%% So recovery will be run every time a vhost supervisor is restarted.
@@ -57,7 +60,11 @@ recover(VHost) ->
5760
{Recovered, Failed} = rabbit_amqqueue:recover(VHost),
5861
AllQs = Recovered ++ Failed,
5962
QNames = [amqqueue:get_name(Q) || Q <- AllQs],
60-
ok = rabbit_binding:recover(rabbit_exchange:recover(VHost), QNames),
63+
{Time, ok} = timer:tc(fun() ->
64+
rabbit_binding:recover(rabbit_exchange:recover(VHost), QNames)
65+
end),
66+
rabbit_log:debug("rabbit_binding:recover/2 for vhost ~s completed in ~fs", [VHost, Time/1000000]),
67+
6168
ok = rabbit_amqqueue:start(Recovered),
6269
%% Start queue mirrors.
6370
ok = rabbit_mirror_queue_misc:on_vhost_up(VHost),

0 commit comments

Comments
 (0)