Tidy up closure of CDB Files
This commit is contained in:
parent
eedf5d85b0
commit
cc3cbc983b
2 changed files with 25 additions and 27 deletions
|
@ -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}.
|
||||||
|
|
|
@ -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"},
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue