Skip to content

Commit 1b91798

Browse files
authored
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 6976b72 commit 1b91798

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
@@ -142,15 +142,30 @@ recover(VHost, Queues) ->
142142
{ok, _} ->
143143
RecoveredQs = recover_durable_queues(lists:zip(Queues,
144144
OrderedRecoveryTerms)),
145-
RecoveredNames = [amqqueue:get_name(Q) || Q <- RecoveredQs],
146-
FailedQueues = [Q || Q <- Queues,
147-
not lists:member(amqqueue:get_name(Q), RecoveredNames)],
148-
{RecoveredQs, FailedQueues};
145+
FailedQs = find_missing_queues(Queues,RecoveredQs),
146+
{RecoveredQs, FailedQs};
149147
{error, Reason} ->
150148
rabbit_log:error("Failed to start queue supervisor for vhost '~ts': ~ts", [VHost, Reason]),
151149
throw({error, Reason})
152150
end.
153151

152+
find_missing_queues(Q1s, Q2s) when length(Q1s) == length(Q2s)->
153+
[];
154+
find_missing_queues(Q1s, Q2s) ->
155+
find_missing_queues(lists:sort(Q1s), lists:sort(Q2s), []).
156+
157+
find_missing_queues([], _, Acc) ->
158+
Acc;
159+
find_missing_queues(Q1s, [], Acc) ->
160+
Q1s ++ Acc;
161+
find_missing_queues([Q1|Rem1], [Q2|Rem2] = Q2s, Acc) ->
162+
case amqqueue:get_name(Q1) == amqqueue:get_name(Q2) of
163+
true ->
164+
find_missing_queues(Rem1, Rem2, Acc);
165+
false ->
166+
find_missing_queues(Rem1, Q2s, [Q1|Acc])
167+
end.
168+
154169
-spec policy_changed(amqqueue:amqqueue()) -> ok.
155170
policy_changed(Q) ->
156171
QPid = amqqueue:get_pid(Q),

0 commit comments

Comments
 (0)