diff --git a/src/leveled_cdb.erl b/src/leveled_cdb.erl index 8c18e35..73be053 100644 --- a/src/leveled_cdb.erl +++ b/src/leveled_cdb.erl @@ -79,6 +79,7 @@ cdb_complete/1, cdb_roll/1, cdb_returnhashtable/3, + cdb_checkhashtable/1, cdb_destroy/1, cdb_deletepending/1, cdb_deletepending/3, @@ -149,21 +150,7 @@ cdb_directfetch(Pid, PositionList, Info) -> gen_fsm:sync_send_event(Pid, {direct_fetch, PositionList, Info}, infinity). cdb_close(Pid) -> - cdb_close(Pid, ?PENDING_ROLL_WAIT). - -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. + gen_fsm:sync_send_all_state_event(Pid, cdb_close, infinity). cdb_complete(Pid) -> gen_fsm:sync_send_event(Pid, cdb_complete, infinity). @@ -174,6 +161,9 @@ cdb_roll(Pid) -> cdb_returnhashtable(Pid, IndexList, HashTreeBin) -> 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) -> gen_fsm:send_event(Pid, destroy). @@ -342,10 +332,11 @@ rolling({return_hashtable, IndexList, HashTreeBin}, _From, State) -> filename=NewName, hash_index=Index}} end; -rolling(cdb_kill, _From, State) -> - {stop, killed, ok, State}. - +rolling(check_hashtable, _From, State) -> + {reply, false, rolling, State}. +rolling(timeout, State) -> + {stop, normal, State}; rolling({delete_pending, ManSQN, Inker}, State) -> {next_state, rolling, @@ -408,7 +399,9 @@ reader({direct_fetch, PositionList, Info}, _From, State) -> end; reader(cdb_complete, _From, State) -> 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) -> @@ -455,8 +448,6 @@ delete_pending(timeout, State=#state{delete_point=ManSQN}) when ManSQN > 0 -> {stop, normal, State} end; delete_pending(destroy, State) -> - ok = file:close(State#state.handle), - ok = file:delete(State#state.filename), {stop, normal, State}. @@ -495,11 +486,8 @@ handle_sync_event(cdb_firstkey, _From, StateName, State) -> {reply, FirstKey, StateName, State}; handle_sync_event(cdb_filename, _From, 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) -> - ok = file:close(State#state.handle), - {stop, normal, ok, State#state{handle=undefined}}. + {stop, normal, ok, State}. handle_event(_Msg, StateName, State) -> {next_state, StateName, State}. diff --git a/src/leveled_inker.erl b/src/leveled_inker.erl index 5689274..5cc1f86 100644 --- a/src/leveled_inker.erl +++ b/src/leveled_inker.erl @@ -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, {2, stnd, K2}, term_to_binary({V2, []})), ok = leveled_cdb:cdb_roll(J1), - _LK = leveled_cdb:cdb_lastkey(J1), - ok = leveled_cdb:cdb_close(J1), + lists:foldl(fun(X, Closed) -> + 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"), {ok, J2} = leveled_cdb:cdb_open_writer(F2), {K1, V3} = {KeyConvertF("Key1"), "TestValue3"},