From 4f0da67420ef451ed50e99eaf53172042d72f989 Mon Sep 17 00:00:00 2001 From: Michael Davis Date: Wed, 11 Sep 2024 13:10:10 -0400 Subject: [PATCH] Handle Khepri timeouts when attempting to delete crashed classic Qs --- deps/rabbit/src/rabbit_amqqueue.erl | 5 ++++- deps/rabbit/src/rabbit_classic_queue.erl | 13 ++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/deps/rabbit/src/rabbit_amqqueue.erl b/deps/rabbit/src/rabbit_amqqueue.erl index 78c3463dc7..442aa3609b 100644 --- a/deps/rabbit/src/rabbit_amqqueue.erl +++ b/deps/rabbit/src/rabbit_amqqueue.erl @@ -1691,7 +1691,10 @@ delete_crashed(Q) when ?amqqueue_is_classic(Q) -> delete_crashed(Q, ActingUser) when ?amqqueue_is_classic(Q) -> rabbit_classic_queue:delete_crashed(Q, ActingUser). --spec delete_crashed_internal(amqqueue:amqqueue(), rabbit_types:username()) -> 'ok'. +-spec delete_crashed_internal(Q, ActingUser) -> Ret when + Q :: amqqueue:amqqueue(), + ActingUser :: rabbit_types:username(), + Ret :: ok | {error, timeout}. delete_crashed_internal(Q, ActingUser) when ?amqqueue_is_classic(Q) -> rabbit_classic_queue:delete_crashed_internal(Q, ActingUser). diff --git a/deps/rabbit/src/rabbit_classic_queue.erl b/deps/rabbit/src/rabbit_classic_queue.erl index 2da8d55f7a..a7fea8d181 100644 --- a/deps/rabbit/src/rabbit_classic_queue.erl +++ b/deps/rabbit/src/rabbit_classic_queue.erl @@ -168,8 +168,15 @@ delete(Q0, IfUnused, IfEmpty, ActingUser) when ?amqqueue_is_classic(Q0) -> rabbit_log:warning("Queue ~ts in vhost ~ts is down. " "Forcing queue deletion.", [Name, Vhost]), - delete_crashed_internal(Q, ActingUser), - {ok, 0} + case delete_crashed_internal(Q, ActingUser) of + ok -> + {ok, 0}; + {error, timeout} -> + {error, protocol_error, + "The operation to delete ~ts from the " + "metadata store timed out", + [rabbit_misc:rs(QName)]} + end end end; {error, not_found} -> @@ -551,7 +558,7 @@ delete_crashed(Q, ActingUser) -> delete_crashed_internal(Q, ActingUser) -> delete_crashed_in_backing_queue(Q), - ok = rabbit_amqqueue:internal_delete(Q, ActingUser). + rabbit_amqqueue:internal_delete(Q, ActingUser). delete_crashed_in_backing_queue(Q) -> {ok, BQ} = application:get_env(rabbit, backing_queue_module),