Make check that compaction not ongoing before accepting new compaction

Respond 'busy' if compaction is ongoing
This commit is contained in:
Martin Sumner 2019-01-24 15:46:17 +00:00
parent c9bf43953b
commit 28d0aef5fe
3 changed files with 18 additions and 12 deletions

View file

@ -1004,7 +1004,7 @@ book_snapshot(Pid, SnapType, Query, LongRunning) ->
gen_server:call(Pid, {snapshot, SnapType, Query, LongRunning}, infinity). gen_server:call(Pid, {snapshot, SnapType, Query, LongRunning}, infinity).
-spec book_compactjournal(pid(), integer()) -> ok. -spec book_compactjournal(pid(), integer()) -> ok|busy.
-spec book_islastcompactionpending(pid()) -> boolean(). -spec book_islastcompactionpending(pid()) -> boolean().
-spec book_trimjournal(pid()) -> ok. -spec book_trimjournal(pid()) -> ok.
@ -1371,10 +1371,10 @@ handle_call({return_runner, QueryType}, _From, State) ->
fold_countdown = CountDown}}; fold_countdown = CountDown}};
handle_call({compact_journal, Timeout}, _From, State) handle_call({compact_journal, Timeout}, _From, State)
when State#state.head_only == false -> when State#state.head_only == false ->
ok = leveled_inker:ink_compactjournal(State#state.inker, R = leveled_inker:ink_compactjournal(State#state.inker,
self(), self(),
Timeout), Timeout),
{reply, ok, State}; {reply, R, State};
handle_call(confirm_compact, _From, State) handle_call(confirm_compact, _From, State)
when State#state.head_only == false -> when State#state.head_only == false ->
{reply, leveled_inker:ink_compactionpending(State#state.inker), State}; {reply, leveled_inker:ink_compactionpending(State#state.inker), State};

View file

@ -348,7 +348,7 @@ ink_loadpcl(Pid, MinSQN, FilterFun, Penciller) ->
as_ink}, as_ink},
infinity). infinity).
-spec ink_compactjournal(pid(), pid(), integer()) -> ok. -spec ink_compactjournal(pid(), pid(), integer()) -> ok|busy.
%% @doc %% @doc
%% Trigger a compaction event. the compaction event will use a sqn check %% Trigger a compaction event. the compaction event will use a sqn check
%% against the Ledger to see if a value can be compacted - if the penciller %% against the Ledger to see if a value can be compacted - if the penciller
@ -605,14 +605,19 @@ handle_call({compact,
FilterFun, FilterFun,
Timeout}, Timeout},
_From, State) -> _From, State) ->
leveled_iclerk:clerk_compact(State#state.clerk, case State#state.compaction_pending of
Checker, true ->
InitiateFun, {reply, busy, State};
CloseFun, false ->
FilterFun, leveled_iclerk:clerk_compact(State#state.clerk,
self(), Checker,
Timeout), InitiateFun,
{reply, ok, State#state{compaction_pending=true}}; CloseFun,
FilterFun,
self(),
Timeout),
{reply, ok, State#state{compaction_pending=true}}
end;
handle_call(compaction_complete, _From, State) -> handle_call(compaction_complete, _From, State) ->
{reply, ok, State#state{compaction_pending=false}}; {reply, ok, State#state{compaction_pending=false}};
handle_call(compaction_pending, _From, State) -> handle_call(compaction_pending, _From, State) ->

View file

@ -300,6 +300,7 @@ journal_compaction_tester(Restart, WRP) ->
{sync_strategy, testutil:sync_strategy()}], {sync_strategy, testutil:sync_strategy()}],
{ok, Bookie3} = leveled_bookie:book_start(StartOpts2), {ok, Bookie3} = leveled_bookie:book_start(StartOpts2),
ok = leveled_bookie:book_compactjournal(Bookie3, 30000), ok = leveled_bookie:book_compactjournal(Bookie3, 30000),
busy = leveled_bookie:book_compactjournal(Bookie3, 30000),
testutil:wait_for_compaction(Bookie3), testutil:wait_for_compaction(Bookie3),
ok = leveled_bookie:book_close(Bookie3), ok = leveled_bookie:book_close(Bookie3),