Add file_handle_cache FD reservations

This commit is contained in:
Loïc Hoguin 2021-06-04 11:01:23 +02:00
parent d00e97d6d8
commit cf080b9937
No known key found for this signature in database
GPG Key ID: C69E26E3A9DF618F
2 changed files with 19 additions and 4 deletions

View File

@ -393,6 +393,7 @@ terminate(VHost, Terms, State0 = #mqistate { dir = Dir,
ok = file:sync(Fd), ok = file:sync(Fd),
ok = file:close(Fd) ok = file:close(Fd)
end, OpenFds), end, OpenFds),
file_handle_cache:release_reservation(),
%% Write recovery terms for faster recovery. %% Write recovery terms for faster recovery.
rabbit_recovery_terms:store(VHost, filename:basename(Dir), rabbit_recovery_terms:store(VHost, filename:basename(Dir),
[{mqi_state, {?VERSION, Segments}} | Terms]), [{mqi_state, {?VERSION, Segments}} | Terms]),
@ -408,6 +409,7 @@ delete_and_terminate(State = #mqistate { dir = Dir,
_ = maps:map(fun(_, Fd) -> _ = maps:map(fun(_, Fd) ->
ok = file:close(Fd) ok = file:close(Fd)
end, OpenFds), end, OpenFds),
file_handle_cache:release_reservation(),
%% Erase the data on disk. %% Erase the data on disk.
ok = erase_index_dir(Dir), ok = erase_index_dir(Dir),
State#mqistate{ segments = #{}, State#mqistate{ segments = #{},
@ -484,9 +486,18 @@ new_segment_file(Segment, State = #mqistate{ segments = Segments }) ->
%% using too many FDs when the consumer lags a lot. We %% using too many FDs when the consumer lags a lot. We
%% limit at 4 because we try to keep up to 2 for reading %% limit at 4 because we try to keep up to 2 for reading
%% and 2 for writing. %% and 2 for writing.
reduce_fd_usage(_, State = #mqistate{ fds = OpenFds }) reduce_fd_usage(SegmentToOpen, State = #mqistate{ fds = OpenFds })
when map_size(OpenFds) < 4 -> when map_size(OpenFds) < 4 ->
%% The only case where we need to update reservations is
%% when we are opening a segment that wasn't already open,
%% and we are not closing another segment at the same time.
case OpenFds of
#{SegmentToOpen := _} ->
State; State;
_ ->
file_handle_cache:set_reservation(map_size(OpenFds) + 1),
State
end;
reduce_fd_usage(SegmentToOpen, State = #mqistate{ fds = OpenFds0 }) -> reduce_fd_usage(SegmentToOpen, State = #mqistate{ fds = OpenFds0 }) ->
case OpenFds0 of case OpenFds0 of
#{SegmentToOpen := _} -> #{SegmentToOpen := _} ->
@ -719,6 +730,10 @@ delete_segment(Segment, State0 = #mqistate{ fds = OpenFds0 }) ->
State = case maps:take(Segment, OpenFds0) of State = case maps:take(Segment, OpenFds0) of
{Fd, OpenFds} -> {Fd, OpenFds} ->
ok = file:close(Fd), ok = file:close(Fd),
case map_size(OpenFds) of
0 -> file_handle_cache:release_reservation();
N -> file_handle_cache:set_reservation(N)
end,
State0#mqistate{ fds = OpenFds }; State0#mqistate{ fds = OpenFds };
error -> error ->
State0 State0

View File

@ -124,8 +124,8 @@ setup_file_handle_cache(Config) ->
setup_file_handle_cache1() -> setup_file_handle_cache1() ->
%% FIXME: Why are we doing this? %% FIXME: Why are we doing this?
application:set_env(rabbit, file_handles_high_watermark, 10), application:set_env(rabbit, file_handles_high_watermark, 100),
ok = file_handle_cache:set_limit(10), ok = file_handle_cache:set_limit(100),
ok. ok.
end_per_group(Group, Config) -> end_per_group(Group, Config) ->