From 6d73f9505acb72a5d72c95c3a6509dabe7bf00f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Mon, 15 Dec 2025 15:36:53 +0100 Subject: [PATCH] CQ: Use open_eventually in recovery and other places It's possible for Windows to be so stubborn that the file can't be opened after open_eventually has given up, which causes a crash and force the queue to be restarted, then trying to open that same file during recovery still errors out. Using open_eventually there may or may not help. Also use open_eventually in queue store's get_read_fd as a crash log has shown it can happen there as well. (cherry picked from commit ba71e6663c1fe30dbf3eeb2009e13b81fea97daf) (cherry picked from commit 5f316df93e7db00f3bac2388faa9576469c9c216) --- deps/rabbit/src/rabbit_classic_queue_index_v2.erl | 3 ++- deps/rabbit/src/rabbit_classic_queue_store_v2.erl | 2 +- deps/rabbit/src/rabbit_file.erl | 5 ++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/deps/rabbit/src/rabbit_classic_queue_index_v2.erl b/deps/rabbit/src/rabbit_classic_queue_index_v2.erl index 7d6fa3de8aea..dff425d60a7a 100644 --- a/deps/rabbit/src/rabbit_classic_queue_index_v2.erl +++ b/deps/rabbit/src/rabbit_classic_queue_index_v2.erl @@ -310,7 +310,8 @@ recover_segments(State, _, StoreState, _, []) -> recover_segments(State0, ContainsCheckFun, StoreState0, CountersRef, [Segment|Tail]) -> SegmentEntryCount = segment_entry_count(), SegmentFile = segment_file(Segment, State0), - {ok, Fd} = file:open(SegmentFile, [read, read_ahead, write, raw, binary]), + {ok, Fd} = rabbit_file:open_eventually(SegmentFile, + [read, read_ahead, write, raw, binary]), case file:read(Fd, ?HEADER_SIZE) of {ok, < maybe_close_fd(OldFd), - case file:open(segment_file(Segment, State), [read, raw, binary]) of + case rabbit_file:open_eventually(segment_file(Segment, State), [read, raw, binary]) of {ok, Fd} -> case file:read(Fd, ?HEADER_SIZE) of {ok, < %% try again up to 3 times. {error, eacces} -> timer:sleep(10), - open_eventually(File, Modes, N - 1) + open_eventually(File, Modes, N - 1); + %% Other errors we return immediately. + Error -> + Error end.