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:close(Fd)
end, OpenFds),
file_handle_cache:release_reservation(),
%% Write recovery terms for faster recovery.
rabbit_recovery_terms:store(VHost, filename:basename(Dir),
[{mqi_state, {?VERSION, Segments}} | Terms]),
@ -408,6 +409,7 @@ delete_and_terminate(State = #mqistate { dir = Dir,
_ = maps:map(fun(_, Fd) ->
ok = file:close(Fd)
end, OpenFds),
file_handle_cache:release_reservation(),
%% Erase the data on disk.
ok = erase_index_dir(Dir),
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
%% limit at 4 because we try to keep up to 2 for reading
%% and 2 for writing.
reduce_fd_usage(_, State = #mqistate{ fds = OpenFds })
reduce_fd_usage(SegmentToOpen, State = #mqistate{ fds = OpenFds })
when map_size(OpenFds) < 4 ->
State;
%% 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;
_ ->
file_handle_cache:set_reservation(map_size(OpenFds) + 1),
State
end;
reduce_fd_usage(SegmentToOpen, State = #mqistate{ fds = OpenFds0 }) ->
case OpenFds0 of
#{SegmentToOpen := _} ->
@ -719,6 +730,10 @@ delete_segment(Segment, State0 = #mqistate{ fds = OpenFds0 }) ->
State = case maps:take(Segment, OpenFds0) of
{Fd, OpenFds} ->
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 };
error ->
State0

View File

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