Skip to content

Commit 133fc55

Browse files
committed
Faster node startup with many classic queues (#7326)
* Faster node startup with many classic queues On my machines, in a test with 100k queues, node startup goes down from 4-5 minutes to roughly 1 minute. The difference will be even larger with more queues as `lists:member` gets very expensive with a long list.
1 parent a7fdcd3 commit 133fc55

File tree

1 file changed

+19
-4
lines changed

1 file changed

+19
-4
lines changed

deps/rabbit/src/rabbit_classic_queue.erl

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,15 +136,30 @@ recover(VHost, Queues) ->
136136
{ok, _} ->
137137
RecoveredQs = recover_durable_queues(lists:zip(Queues,
138138
OrderedRecoveryTerms)),
139-
RecoveredNames = [amqqueue:get_name(Q) || Q <- RecoveredQs],
140-
FailedQueues = [Q || Q <- Queues,
141-
not lists:member(amqqueue:get_name(Q), RecoveredNames)],
142-
{RecoveredQs, FailedQueues};
139+
FailedQs = find_missing_queues(Queues,RecoveredQs),
140+
{RecoveredQs, FailedQs};
143141
{error, Reason} ->
144142
rabbit_log:error("Failed to start queue supervisor for vhost '~s': ~s", [VHost, Reason]),
145143
throw({error, Reason})
146144
end.
147145

146+
find_missing_queues(Q1s, Q2s) when length(Q1s) == length(Q2s)->
147+
[];
148+
find_missing_queues(Q1s, Q2s) ->
149+
find_missing_queues(lists:sort(Q1s), lists:sort(Q2s), []).
150+
151+
find_missing_queues([], _, Acc) ->
152+
Acc;
153+
find_missing_queues(Q1s, [], Acc) ->
154+
Q1s ++ Acc;
155+
find_missing_queues([Q1|Rem1], [Q2|Rem2] = Q2s, Acc) ->
156+
case amqqueue:get_name(Q1) == amqqueue:get_name(Q2) of
157+
true ->
158+
find_missing_queues(Rem1, Rem2, Acc);
159+
false ->
160+
find_missing_queues(Rem1, Q2s, [Q1|Acc])
161+
end.
162+
148163
-spec policy_changed(amqqueue:amqqueue()) -> ok.
149164
policy_changed(Q) ->
150165
QPid = amqqueue:get_pid(Q),

0 commit comments

Comments
 (0)