From b2fd8734280f59247d2e0e503ca689aad406f53a Mon Sep 17 00:00:00 2001 From: Diana Corbacho Date: Tue, 21 Jun 2016 08:20:37 +0100 Subject: [PATCH] Erase index on crash recovery for any backing queue It is up to the individual implementation to decide what to erase, i.e. priority queues have one index per priority --- src/rabbit_mirror_queue_slave.erl | 2 +- src/rabbit_queue_index.erl | 6 +++++- src/rabbit_variable_queue.erl | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/rabbit_mirror_queue_slave.erl b/src/rabbit_mirror_queue_slave.erl index 9edb99c4d707..c04c82f45ea7 100644 --- a/src/rabbit_mirror_queue_slave.erl +++ b/src/rabbit_mirror_queue_slave.erl @@ -120,7 +120,7 @@ handle_go(Q = #amqqueue{name = QName}) -> Self, {rabbit_amqqueue, set_ram_duration_target, [Self]}), {ok, BQ} = application:get_env(backing_queue_module), Q1 = Q #amqqueue { pid = QPid }, - ok = rabbit_queue_index:erase(QName), %% For crash recovery + _ = BQ:delete_crashed(Q), %% For crash recovery BQS = bq_init(BQ, Q1, new), State = #state { q = Q1, gm = GM, diff --git a/src/rabbit_queue_index.erl b/src/rabbit_queue_index.erl index 06b6961edb8e..81efb6af99e5 100644 --- a/src/rabbit_queue_index.erl +++ b/src/rabbit_queue_index.erl @@ -273,7 +273,11 @@ reset_state(#qistate{ dir = Dir, undefined -> ok; _ -> file_handle_cache:close(JournalHdl) end, - ok = erase_index_dir(Dir), + %% Don't verify return value as it might return an `enoent` error if + %% reset and delete_crashed happen simultaneous. This is easily triggered + %% in priority queues where the master do not wait long enough for all + %% slaves + _ = erase_index_dir(Dir), blank_state_dir_funs(Dir, OnSyncFun, OnSyncMsgFun). init(Name, OnSyncFun, OnSyncMsgFun) -> diff --git a/src/rabbit_variable_queue.erl b/src/rabbit_variable_queue.erl index 45dde112a56c..181ecb027d8c 100644 --- a/src/rabbit_variable_queue.erl +++ b/src/rabbit_variable_queue.erl @@ -553,7 +553,7 @@ delete_and_terminate(_Reason, State) -> a(State2 #vqstate { msg_store_clients = undefined }). delete_crashed(#amqqueue{name = QName}) -> - ok = rabbit_queue_index:erase(QName). + _ = rabbit_queue_index:erase(QName). purge(State = #vqstate { len = Len }) -> case is_pending_ack_empty(State) of