Skip to content

Commit 7e57fae

Browse files
Merge pull request #1879 from rabbitmq/rabbitmq-server-1873-binding-recovery-37
Recover bindings for all durable queues including failed to recover. 3.7
2 parents f4a893e + a38d771 commit 7e57fae

File tree

3 files changed

+14
-8
lines changed

3 files changed

+14
-8
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
@@ -238,7 +238,11 @@ recover(VHost) ->
238238
BQ:start(VHost, [QName || #amqqueue{name = QName} <- Queues]),
239239
case rabbit_amqqueue_sup_sup:start_for_vhost(VHost) of
240240
{ok, _} ->
241-
recover_durable_queues(lists:zip(Queues, OrderedRecoveryTerms));
241+
Recovered = recover_durable_queues(lists:zip(Queues, OrderedRecoveryTerms)),
242+
RecoveredNames = [Name || #amqqueue{name = Name} <- Recovered],
243+
FailedQueues = [Q || Q = #amqqueue{name = Name} <- Queues,
244+
not lists:member(Name, RecoveredNames)],
245+
{Recovered, FailedQueues};
242246
{error, Reason} ->
243247
rabbit_log:error("Failed to start queue supervisor for vhost '~s': ~s", [VHost, Reason]),
244248
throw({error, Reason})

src/rabbit_vhost.erl

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,12 @@ 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+
AllQs = RecoveredQs ++ FailedQs,
76+
ok = rabbit_binding:recover(
77+
rabbit_exchange:recover(VHost),
78+
[QName || #amqqueue{name = QName} <- AllQs]),
79+
ok = rabbit_amqqueue:start(RecoveredQs),
7880
%% Start queue mirrors.
7981
ok = rabbit_mirror_queue_misc:on_vhost_up(VHost),
8082
ok.
@@ -326,4 +328,3 @@ info_all(Ref, AggregatorPid) -> info_all(?INFO_KEYS, Ref, AggregatorPid).
326328
info_all(Items, Ref, AggregatorPid) ->
327329
rabbit_control_misc:emitting_map(
328330
AggregatorPid, Ref, fun(VHost) -> info(VHost, Items) end, list()).
329-

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)