Merge pull request #270 from martinsumner/mas-i268-gcnewl0

GC before transitioning a L0 to reader
This commit is contained in:
Martin Sumner 2019-03-04 16:44:07 +00:00 committed by GitHub
commit 055854c049
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 2 deletions

View file

@ -186,8 +186,9 @@ merge(SrcLevel, Manifest, RootPath, OptsSST) ->
leveled_log:log("PC008", [SrcLevel, Candidates]), leveled_log:log("PC008", [SrcLevel, Candidates]),
case Candidates of case Candidates of
0 -> 0 ->
leveled_log:log("PC009", NewLevel = SrcLevel + 1,
[Src#manifest_entry.filename, SrcLevel + 1]), leveled_log:log("PC009", [Src#manifest_entry.filename, NewLevel]),
leveled_sst:sst_switchlevels(Src#manifest_entry.owner, NewLevel),
Man0 = leveled_pmanifest:switch_manifest_entry(Manifest, Man0 = leveled_pmanifest:switch_manifest_entry(Manifest,
NewSQN, NewSQN,
SrcLevel, SrcLevel,

View file

@ -121,6 +121,7 @@
sst_setfordelete/2, sst_setfordelete/2,
sst_clear/1, sst_clear/1,
sst_checkready/1, sst_checkready/1,
sst_switchlevels/2,
sst_deleteconfirmed/1, sst_deleteconfirmed/1,
sst_close/1]). sst_close/1]).
@ -449,6 +450,15 @@ sst_checkready(Pid) ->
%% Only used in test %% Only used in test
gen_fsm:sync_send_event(Pid, background_complete). gen_fsm:sync_send_event(Pid, background_complete).
-spec sst_switchlevels(pid(), pos_integer()) -> ok.
%% @doc
%% Notify the SST file that it is now working at a new level
%% This simply prompts a GC on the PID now (as this may now be a long-lived
%% file, so don't want all the startup state to be held on memory - want to
%% proactively drop it
sst_switchlevels(Pid, _NewLevel) ->
gen_fsm:send_event(Pid, switch_levels).
-spec sst_close(pid()) -> ok. -spec sst_close(pid()) -> ok.
%% @doc %% @doc
%% Close the file %% Close the file
@ -699,6 +709,9 @@ reader(close, _From, State) ->
ok = file:close(State#state.handle), ok = file:close(State#state.handle),
{stop, normal, ok, State}. {stop, normal, ok, State}.
reader(switch_levels, State) ->
erlang:garbage_collect(self()),
{next_state, reader, State};
reader(timeout, State) -> reader(timeout, State) ->
case is_process_alive(State#state.starting_pid) of case is_process_alive(State#state.starting_pid) of
true -> true ->