Tidy up closure of CDB Files

This commit is contained in:
martinsumner 2016-11-08 22:43:22 +00:00
parent eedf5d85b0
commit cc3cbc983b
2 changed files with 25 additions and 27 deletions

View file

@ -79,6 +79,7 @@
cdb_complete/1, cdb_complete/1,
cdb_roll/1, cdb_roll/1,
cdb_returnhashtable/3, cdb_returnhashtable/3,
cdb_checkhashtable/1,
cdb_destroy/1, cdb_destroy/1,
cdb_deletepending/1, cdb_deletepending/1,
cdb_deletepending/3, cdb_deletepending/3,
@ -149,21 +150,7 @@ cdb_directfetch(Pid, PositionList, Info) ->
gen_fsm:sync_send_event(Pid, {direct_fetch, PositionList, Info}, infinity). gen_fsm:sync_send_event(Pid, {direct_fetch, PositionList, Info}, infinity).
cdb_close(Pid) -> cdb_close(Pid) ->
cdb_close(Pid, ?PENDING_ROLL_WAIT). gen_fsm:sync_send_all_state_event(Pid, cdb_close, infinity).
cdb_close(Pid, WaitsLeft) ->
if
WaitsLeft > 0 ->
case gen_fsm:sync_send_all_state_event(Pid, cdb_close, infinity) of
pending_roll ->
timer:sleep(1),
cdb_close(Pid, WaitsLeft - 1);
R ->
R
end;
true ->
gen_fsm:sync_send_event(Pid, cdb_kill, infinity)
end.
cdb_complete(Pid) -> cdb_complete(Pid) ->
gen_fsm:sync_send_event(Pid, cdb_complete, infinity). gen_fsm:sync_send_event(Pid, cdb_complete, infinity).
@ -174,6 +161,9 @@ cdb_roll(Pid) ->
cdb_returnhashtable(Pid, IndexList, HashTreeBin) -> cdb_returnhashtable(Pid, IndexList, HashTreeBin) ->
gen_fsm:sync_send_event(Pid, {return_hashtable, IndexList, HashTreeBin}, infinity). gen_fsm:sync_send_event(Pid, {return_hashtable, IndexList, HashTreeBin}, infinity).
cdb_checkhashtable(Pid) ->
gen_fsm:sync_send_event(Pid, check_hashtable).
cdb_destroy(Pid) -> cdb_destroy(Pid) ->
gen_fsm:send_event(Pid, destroy). gen_fsm:send_event(Pid, destroy).
@ -342,10 +332,11 @@ rolling({return_hashtable, IndexList, HashTreeBin}, _From, State) ->
filename=NewName, filename=NewName,
hash_index=Index}} hash_index=Index}}
end; end;
rolling(cdb_kill, _From, State) -> rolling(check_hashtable, _From, State) ->
{stop, killed, ok, State}. {reply, false, rolling, State}.
rolling(timeout, State) ->
{stop, normal, State};
rolling({delete_pending, ManSQN, Inker}, State) -> rolling({delete_pending, ManSQN, Inker}, State) ->
{next_state, {next_state,
rolling, rolling,
@ -408,7 +399,9 @@ reader({direct_fetch, PositionList, Info}, _From, State) ->
end; end;
reader(cdb_complete, _From, State) -> reader(cdb_complete, _From, State) ->
ok = file:close(State#state.handle), ok = file:close(State#state.handle),
{stop, normal, {ok, State#state.filename}, State#state{handle=undefined}}. {stop, normal, {ok, State#state.filename}, State#state{handle=undefined}};
reader(check_hashtable, _From, State) ->
{reply, true, reader, State}.
reader({delete_pending, 0, no_poll}, State) -> reader({delete_pending, 0, no_poll}, State) ->
@ -455,8 +448,6 @@ delete_pending(timeout, State=#state{delete_point=ManSQN}) when ManSQN > 0 ->
{stop, normal, State} {stop, normal, State}
end; end;
delete_pending(destroy, State) -> delete_pending(destroy, State) ->
ok = file:close(State#state.handle),
ok = file:delete(State#state.filename),
{stop, normal, State}. {stop, normal, State}.
@ -495,11 +486,8 @@ handle_sync_event(cdb_firstkey, _From, StateName, State) ->
{reply, FirstKey, StateName, State}; {reply, FirstKey, StateName, State};
handle_sync_event(cdb_filename, _From, StateName, State) -> handle_sync_event(cdb_filename, _From, StateName, State) ->
{reply, State#state.filename, StateName, State}; {reply, State#state.filename, StateName, State};
handle_sync_event(cdb_close, _From, rolling, State) ->
{reply, pending_roll, rolling, State};
handle_sync_event(cdb_close, _From, _StateName, State) -> handle_sync_event(cdb_close, _From, _StateName, State) ->
ok = file:close(State#state.handle), {stop, normal, ok, State}.
{stop, normal, ok, State#state{handle=undefined}}.
handle_event(_Msg, StateName, State) -> handle_event(_Msg, StateName, State) ->
{next_state, StateName, State}. {next_state, StateName, State}.

View file

@ -747,8 +747,18 @@ build_dummy_journal(KeyConvertF) ->
ok = leveled_cdb:cdb_put(J1, {1, stnd, K1}, term_to_binary({V1, []})), ok = leveled_cdb:cdb_put(J1, {1, stnd, K1}, term_to_binary({V1, []})),
ok = leveled_cdb:cdb_put(J1, {2, stnd, K2}, term_to_binary({V2, []})), ok = leveled_cdb:cdb_put(J1, {2, stnd, K2}, term_to_binary({V2, []})),
ok = leveled_cdb:cdb_roll(J1), ok = leveled_cdb:cdb_roll(J1),
_LK = leveled_cdb:cdb_lastkey(J1), lists:foldl(fun(X, Closed) ->
ok = leveled_cdb:cdb_close(J1), case Closed of
true -> true;
false ->
case leveled_cdb:cdb_checkhashtable(J1) of
true -> leveled_cdb:cdb_close(J1), true;
false -> timer:sleep(X), false
end
end
end,
false,
lists:seq(1, 5)),
F2 = filename:join(JournalFP, "nursery_3.pnd"), F2 = filename:join(JournalFP, "nursery_3.pnd"),
{ok, J2} = leveled_cdb:cdb_open_writer(F2), {ok, J2} = leveled_cdb:cdb_open_writer(F2),
{K1, V3} = {KeyConvertF("Key1"), "TestValue3"}, {K1, V3} = {KeyConvertF("Key1"), "TestValue3"},