diff --git a/src/leveled_pclerk.erl b/src/leveled_pclerk.erl index de9dfdc..027eb44 100644 --- a/src/leveled_pclerk.erl +++ b/src/leveled_pclerk.erl @@ -186,8 +186,9 @@ merge(SrcLevel, Manifest, RootPath, OptsSST) -> leveled_log:log("PC008", [SrcLevel, Candidates]), case Candidates of 0 -> - leveled_log:log("PC009", - [Src#manifest_entry.filename, SrcLevel + 1]), + NewLevel = 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, NewSQN, SrcLevel, diff --git a/src/leveled_sst.erl b/src/leveled_sst.erl index 9e911c0..d9accee 100644 --- a/src/leveled_sst.erl +++ b/src/leveled_sst.erl @@ -121,6 +121,7 @@ sst_setfordelete/2, sst_clear/1, sst_checkready/1, + sst_switchlevels/2, sst_deleteconfirmed/1, sst_close/1]). @@ -449,6 +450,15 @@ sst_checkready(Pid) -> %% Only used in test 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. %% @doc %% Close the file @@ -699,6 +709,9 @@ reader(close, _From, State) -> ok = file:close(State#state.handle), {stop, normal, ok, State}. +reader(switch_levels, State) -> + erlang:garbage_collect(self()), + {next_state, reader, State}; reader(timeout, State) -> case is_process_alive(State#state.starting_pid) of true ->