diff --git a/src/leveled_pclerk.erl b/src/leveled_pclerk.erl index e008ea0..b9d7164 100644 --- a/src/leveled_pclerk.erl +++ b/src/leveled_pclerk.erl @@ -118,8 +118,8 @@ handle_call({manifest_change, confirm, Closing}, From, State) -> io:format("Prompted confirmation of manifest change~n"), gen_server:reply(From, ok), WI = State#state.work_item, - mark_for_delete(WI#penciller_work.unreferenced_files, - State#state.owner), + ok = mark_for_delete(WI#penciller_work.unreferenced_files, + State#state.owner), {noreply, State#state{work_item=null, change_pending=false}, ?MIN_TIMEOUT} diff --git a/src/leveled_penciller.erl b/src/leveled_penciller.erl index 1c69eee..3267421 100644 --- a/src/leveled_penciller.erl +++ b/src/leveled_penciller.erl @@ -490,7 +490,7 @@ handle_call(work_for_clerk, From, State) -> handle_call(get_startup_sqn, _From, State) -> {reply, State#state.ledger_sqn, State}; handle_call({register_snapshot, Snapshot}, _From, State) -> - Rs = [{Snapshot, State#state.ledger_sqn}|State#state.registered_snapshots], + Rs = [{Snapshot, State#state.manifest_sqn}|State#state.registered_snapshots], {reply, {ok, State#state.ledger_sqn, @@ -540,7 +540,7 @@ handle_info({_Ref, {ok, SrcFN, _StartKey, _EndKey}}, State) -> terminate(Reason, State=#state{is_snapshot=Snap}) when Snap == true -> ok = pcl_releasesnapshot(State#state.source_penciller, self()), - io:format("Sent release message for snapshot following close for " + io:format("Sent release message for cloned Penciller following close for " ++ "reason ~w~n", [Reason]), ok; terminate(Reason, State) -> diff --git a/src/leveled_sft.erl b/src/leveled_sft.erl index 5399e01..58226de 100644 --- a/src/leveled_sft.erl +++ b/src/leveled_sft.erl @@ -181,7 +181,7 @@ -define(HEADER_LEN, 56). -define(ITERATOR_SCANWIDTH, 1). -define(MERGE_SCANWIDTH, 8). --define(DELETE_TIMEOUT, 60000). +-define(DELETE_TIMEOUT, 10000). -define(MAX_KEYS, ?SLOT_COUNT * ?BLOCK_COUNT * ?BLOCK_SIZE). -define(DISCARD_EXT, ".discarded"). @@ -296,7 +296,7 @@ handle_call({sft_open, Filename}, _From, _State) -> FileMD}; handle_call({get_kv, Key}, _From, State) -> Reply = fetch_keyvalue(State#state.handle, State, Key), - {reply, Reply, State}; + statecheck_onreply(Reply, State); handle_call({get_kvrange, StartKey, EndKey, ScanWidth}, _From, State) -> Reply = pointer_append_queryresults(fetch_range_kv(State#state.handle, State, @@ -304,7 +304,7 @@ handle_call({get_kvrange, StartKey, EndKey, ScanWidth}, _From, State) -> EndKey, ScanWidth), self()), - {reply, Reply, State}; + statecheck_onreply(Reply, State); handle_call(close, _From, State) -> {stop, normal, ok, State}; handle_call(clear, _From, State) -> @@ -322,34 +322,33 @@ handle_call(background_complete, _From, State) -> {reply, {error, State#state.background_failure}, State} end; handle_call({set_for_delete, Penciller}, _From, State) -> + io:format("File ~s has been set for delete~n", [State#state.filename]), {reply, ok, State#state{ready_for_delete=true, penciller=Penciller}, ?DELETE_TIMEOUT}; handle_call(get_maxsqn, _From, State) -> - {reply, State#state.highest_sqn, State}. + statecheck_onreply(State#state.highest_sqn, State). handle_cast({sft_new, Filename, Inp1, [], 0}, _State) -> SW = os:timestamp(), {ok, State} = create_levelzero(Inp1, Filename), io:format("File creation of L0 file ~s took ~w microseconds~n", [Filename, timer:now_diff(os:timestamp(), SW)]), - {noreply, State}; -handle_cast(_Msg, State) -> {noreply, State}. handle_info(timeout, State) -> case State#state.ready_for_delete of true -> + io:format("File ~s prompting for delete status check~n", + [State#state.filename]), case leveled_penciller:pcl_confirmdelete(State#state.penciller, State#state.filename) of true -> {stop, shutdown, State}; false -> - io:format("Polled for deletion but ~s not ready~n", - [State#state.filename]), {noreply, State, ?DELETE_TIMEOUT} end; false -> @@ -377,6 +376,15 @@ terminate(Reason, State) -> code_change(_OldVsn, State, _Extra) -> {ok, State}. + +statecheck_onreply(Reply, State) -> + case State#state.ready_for_delete of + true -> + {reply, Reply, State, ?DELETE_TIMEOUT}; + false -> + {reply, Reply, State} + end. + %%%============================================================================ %%% Internal functions %%%============================================================================ diff --git a/test/end_to_end/basic_SUITE.erl b/test/end_to_end/basic_SUITE.erl index dac295f..cfc4b0c 100644 --- a/test/end_to_end/basic_SUITE.erl +++ b/test/end_to_end/basic_SUITE.erl @@ -10,12 +10,13 @@ load_and_count_withdelete/1 ]). -all() -> [simple_put_fetch_head_delete, - many_put_fetch_head, - journal_compaction, - fetchput_snapshot, - load_and_count, - load_and_count_withdelete +all() -> [ + % simple_put_fetch_head_delete, + % many_put_fetch_head, + % journal_compaction, + fetchput_snapshot %, + % load_and_count, + % load_and_count_withdelete ]. @@ -151,7 +152,7 @@ journal_compaction(_Config) -> fetchput_snapshot(_Config) -> RootPath = testutil:reset_filestructure(), - StartOpts1 = #bookie_options{root_path=RootPath, max_journalsize=3000000}, + StartOpts1 = #bookie_options{root_path=RootPath, max_journalsize=30000000}, {ok, Bookie1} = leveled_bookie:book_start(StartOpts1), {TestObject, TestSpec} = testutil:generate_testobject(), ok = leveled_bookie:book_riakput(Bookie1, TestObject, TestSpec), @@ -201,7 +202,7 @@ fetchput_snapshot(_Config) -> ChkList3 = lists:sublist(lists:sort(ObjList3), 100), testutil:check_forlist(Bookie2, ChkList3), testutil:check_formissinglist(SnapBookie2, ChkList3), - GenList = [20002, 40002, 60002, 80002, 100002, 120002], + GenList = [20002, 40002, 60002, 80002], CLs2 = testutil:load_objects(20000, GenList, Bookie2, TestObject, fun testutil:generate_smallobjects/2), io:format("Loaded significant numbers of new objects~n"), @@ -222,13 +223,22 @@ fetchput_snapshot(_Config) -> fun testutil:generate_smallobjects/2), testutil:check_forlist(Bookie2, lists:nth(length(CLs3), CLs3)), testutil:check_forlist(Bookie2, lists:nth(1, CLs3)), + + io:format("Starting 15s sleep in which snap2 should block deletion~n"), + timer:sleep(15000), {ok, FNsB} = file:list_dir(RootPath ++ "/ledger/ledger_files"), ok = leveled_bookie:book_close(SnapBookie2), + io:format("Starting 15s sleep as snap2 close should unblock deletion~n"), + timer:sleep(15000), + io:format("Pause for deletion has ended~n"), + testutil:check_forlist(Bookie2, lists:nth(length(CLs3), CLs3)), ok = leveled_bookie:book_close(SnapBookie3), + io:format("Starting 15s sleep as snap3 close should unblock deletion~n"), + timer:sleep(15000), + io:format("Pause for deletion has ended~n"), testutil:check_forlist(Bookie2, lists:nth(length(CLs3), CLs3)), testutil:check_forlist(Bookie2, lists:nth(1, CLs3)), - timer:sleep(90000), {ok, FNsC} = file:list_dir(RootPath ++ "/ledger/ledger_files"), true = length(FNsB) > length(FNsA), true = length(FNsB) > length(FNsC), @@ -239,7 +249,7 @@ fetchput_snapshot(_Config) -> {B1Size, B1Count} = testutil:check_bucket_stats(Bookie2, "Bucket1"), {BSize, BCount} = testutil:check_bucket_stats(Bookie2, "Bucket"), true = BSize > 0, - true = BCount == 140000, + true = BCount == 100000, ok = leveled_bookie:book_close(Bookie2), testutil:reset_filestructure().