Skip to content

Commit 36ad018

Browse files
author
Erlang/OTP
committed
Merge branch 'michal/kernel/decreasing-disk-log-size-causes-infinite-loop/OTP-19608' into maint-27
* michal/kernel/decreasing-disk-log-size-causes-infinite-loop/OTP-19608: Test changing wrap disk_log size multiple times Allow changing wrap disk_log size multiple times # Conflicts: # lib/kernel/test/disk_log_SUITE.erl
2 parents a319282 + 8965b8d commit 36ad018

File tree

2 files changed

+79
-5
lines changed

2 files changed

+79
-5
lines changed

lib/kernel/src/disk_log_1.erl

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -979,13 +979,14 @@ mf_ext_close(#handle{filename = FName, curF = CurF,
979979
%% -> {ok, handle()} | throw(FileError)
980980
change_size_wrap(#handle{filename = FName} = Handle, {NewMaxB, NewMaxF}, Version) ->
981981
{_MaxB, MaxF} = get_wrap_size(Handle),
982+
BiggerMaxF = lists:max([MaxF, get_old_max_f(Handle#handle.maxF)]),
982983
write_size_file(read_write, FName, NewMaxB, NewMaxF, Version),
983984
if
984-
NewMaxF > MaxF ->
985+
NewMaxF > BiggerMaxF ->
985986
remove_files(wrap, FName, MaxF + 1, NewMaxF),
986987
{ok, Handle#handle{maxB = NewMaxB, maxF = NewMaxF}};
987-
NewMaxF < MaxF ->
988-
{ok, Handle#handle{maxB = NewMaxB, maxF = {NewMaxF, MaxF}}};
988+
NewMaxF < BiggerMaxF ->
989+
{ok, Handle#handle{maxB = NewMaxB, maxF = {NewMaxF, BiggerMaxF}}};
989990
true ->
990991
{ok, Handle#handle{maxB = NewMaxB, maxF = NewMaxF}}
991992
end.
@@ -1798,3 +1799,8 @@ file_error(FileName, {error, Error}) ->
17981799
file_error_close(Fd, FileName, {error, Error}) ->
17991800
_ = file:close(Fd),
18001801
throw({error, {file_error, FileName, Error}}).
1802+
1803+
get_old_max_f({_, OldMaxF}) ->
1804+
OldMaxF;
1805+
get_old_max_f(MaxF) ->
1806+
MaxF.

lib/kernel/test/disk_log_SUITE.erl

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@
9292

9393
otp_6278/1, otp_10131/1, otp_16768/1, otp_16809/1,
9494

95-
decrease_size_with_chunk_step/1]).
95+
decrease_size_with_chunk_step/1, decrease_size_twice/1]).
9696

9797
-export([head_fun/1, hf/0, hf_bin/0, lserv/1,
9898
measure/0, init_m/1, xx/0]).
@@ -169,7 +169,8 @@ groups() ->
169169
{change_size, [],
170170
[change_size_before, change_size_during,
171171
change_size_after, default_size, change_size2,
172-
change_size_truncate, decrease_size_with_chunk_step]}].
172+
change_size_truncate, decrease_size_with_chunk_step,
173+
decrease_size_twice]}].
173174

174175
init_per_suite(Config) ->
175176
Config.
@@ -4447,6 +4448,73 @@ decrease_size_with_chunk_step(Conf) when is_list(Conf) ->
44474448
ok = disk_log:close(Log),
44484449
del(File, 2).
44494450

4451+
decrease_size_twice(Conf) when is_list(Conf) ->
4452+
Dir = ?privdir(Conf),
4453+
Log = decrease_size_twice,
4454+
File = filename:join(Dir, lists:concat([Log, ".LOG"])),
4455+
4456+
Data_1 = [1, 2, 3],
4457+
Data_2 = [4, 5, 6],
4458+
Data_3 = [7, 8, 9],
4459+
Data_2_3 = Data_2 ++ Data_3,
4460+
Data = Data_1 ++ Data_2_3,
4461+
4462+
{ok, Log} = disk_log:open([{size, {50, 3}}, {name, Log}, {type, wrap},
4463+
{file, File}, {notify, true}]),
4464+
4465+
ok = disk_log:log_terms(Log, Data),
4466+
4467+
%% Changing size to the same size should make no changes
4468+
ok = disk_log:change_size(Log, {50, 3}),
4469+
Data = get_all_terms(Log),
4470+
4471+
%% Changing size to smaller and then again to the same smaller size,
4472+
%% should leave OldMaxF as it was before
4473+
ok = disk_log:change_size(Log, {50, 2}),
4474+
ok = disk_log:change_size(Log, {50, 2}),
4475+
Data = get_all_terms(Log),
4476+
4477+
%% After writing data with new (smaller) log size, some terms should be truncated
4478+
ok = disk_log:log_terms(Log, Data),
4479+
Data_2_3 = get_all_terms(Log),
4480+
4481+
%% Changing size to bigger should remove OldMaxF
4482+
ok = disk_log:change_size(Log, {50, 3}),
4483+
ok = disk_log:log_terms(Log, Data),
4484+
Data = get_all_terms(Log),
4485+
4486+
%% Changing size to smaller, and then to even smaller should keep bigger OldMaxF
4487+
ok = disk_log:change_size(Log, {50, 2}),
4488+
ok = disk_log:change_size(Log, {50, 1}),
4489+
Data = get_all_terms(Log),
4490+
4491+
%% After writing data with new (even smaller) log size, some terms should be truncated
4492+
ok = disk_log:log_terms(Log, Data),
4493+
Data_3 = get_all_terms(Log),
4494+
4495+
%% Changing size to bigger should remove OldMaxF
4496+
ok = disk_log:change_size(Log, {50, 3}),
4497+
ok = disk_log:log_terms(Log, Data),
4498+
Data = get_all_terms(Log),
4499+
4500+
%% Changing size to smaller, writing some data (but less than required to cause logs to wrap),
4501+
%% and then to even smaller should keep bigger OldMaxF
4502+
ok = disk_log:log_terms(Log, lists:seq(1, 7)),
4503+
ok = disk_log:change_size(Log, {50, 2}),
4504+
ok = disk_log:log_terms(Log, [8, 9]),
4505+
ok = disk_log:change_size(Log, {50, 1}),
4506+
Data = get_all_terms(Log),
4507+
4508+
%% Changing size to bigger and than to bigger again, should allow to read all data
4509+
ok = disk_log:change_size(Log, {50, 2}),
4510+
Data = get_all_terms(Log),
4511+
ok = disk_log:change_size(Log, {50, 3}),
4512+
Data = get_all_terms(Log),
4513+
4514+
ok = disk_log:close(Log),
4515+
4516+
del(File, 3).
4517+
44504518
mark(FileName, What) ->
44514519
{ok,Fd} = file:open(FileName, [raw, binary, read, write]),
44524520
{ok,_} = file:position(Fd, 4),

0 commit comments

Comments
 (0)