Skip to content

Commit 02d88df

Browse files
committed
Recover bindings for all durable queues including failed to recover
If a queue fails to recover it may still be restarted by the supervisor and eventually start. After that some bindings may be in rabbit_durable_route but not rabbit_route. This can cause binding not found errors. If bindings are recovered for failed queues, the behaviour will be the same as for the crashed queues. (which is currently broken but needs to be fixed separately) This is a commit for version 3.7.x Addresses #1873 [#163919158]
1 parent 37fbc13 commit 02d88df

File tree

3 files changed

+13
-7
lines changed

3 files changed

+13
-7
lines changed

src/rabbit_amqqueue.erl

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@
7474
{'absent', rabbit_types:amqqueue(),absent_reason()}.
7575
-type not_found_or_absent() ::
7676
'not_found' | {'absent', rabbit_types:amqqueue(), absent_reason()}.
77-
-spec recover(rabbit_types:vhost()) -> [rabbit_types:amqqueue()].
77+
-spec recover(rabbit_types:vhost()) -> {[rabbit_types:amqqueue()], [rabbit_types:amqqueue()]}.
7878
-spec stop(rabbit_types:vhost()) -> 'ok'.
7979
-spec start([rabbit_types:amqqueue()]) -> 'ok'.
8080
-spec declare
@@ -237,7 +237,11 @@ recover(VHost) ->
237237
BQ:start(VHost, [QName || #amqqueue{name = QName} <- Queues]),
238238
case rabbit_amqqueue_sup_sup:start_for_vhost(VHost) of
239239
{ok, _} ->
240-
recover_durable_queues(lists:zip(Queues, OrderedRecoveryTerms));
240+
Recovered = recover_durable_queues(lists:zip(Queues, OrderedRecoveryTerms)),
241+
RecoveredNames = [Name || #amqqueue{name = Name} <- Recovered],
242+
FailedQueues = [Q || Q = #amqqueue{name = Name} <- Queues,
243+
not lists:member(Name, RecoveredNames)],
244+
{Recovered, FailedQueues};
241245
{error, Reason} ->
242246
rabbit_log:error("Failed to start queue supervisor for vhost '~s': ~s", [VHost, Reason]),
243247
throw({error, Reason})

src/rabbit_vhost.erl

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,11 @@ recover(VHost) ->
7171
VHostStubFile = filename:join(VHostDir, ".vhost"),
7272
ok = rabbit_file:ensure_dir(VHostStubFile),
7373
ok = file:write_file(VHostStubFile, VHost),
74-
Qs = rabbit_amqqueue:recover(VHost),
75-
ok = rabbit_binding:recover(rabbit_exchange:recover(VHost),
76-
[QName || #amqqueue{name = QName} <- Qs]),
77-
ok = rabbit_amqqueue:start(Qs),
74+
{RecoveredQs, FailedQs} = rabbit_amqqueue:recover(VHost),
75+
ok = rabbit_binding:recover(
76+
rabbit_exchange:recover(VHost),
77+
[QName || #amqqueue{name = QName} <- RecoveredQs ++ FailedQs]),
78+
ok = rabbit_amqqueue:start(RecoveredQs),
7879
%% Start queue mirrors.
7980
ok = rabbit_mirror_queue_misc:on_vhost_up(VHost),
8081
ok.

test/backing_queue_SUITE.erl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -730,7 +730,8 @@ bq_queue_recover1(Config) ->
730730
after 10000 -> exit(timeout_waiting_for_queue_death)
731731
end,
732732
rabbit_amqqueue:stop(?VHOST),
733-
rabbit_amqqueue:start(rabbit_amqqueue:recover(?VHOST)),
733+
{Ok, []} = rabbit_amqqueue:recover(?VHOST),
734+
rabbit_amqqueue:start(Ok),
734735
{ok, Limiter} = rabbit_limiter:start_link(no_id),
735736
rabbit_amqqueue:with_or_die(
736737
QName,

0 commit comments

Comments
 (0)