diff --git a/src/leveled_bookie.erl b/src/leveled_bookie.erl index 73c0c33..9e547b4 100644 --- a/src/leveled_bookie.erl +++ b/src/leveled_bookie.erl @@ -1004,7 +1004,7 @@ book_snapshot(Pid, SnapType, Query, LongRunning) -> 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_trimjournal(pid()) -> ok. @@ -1371,10 +1371,10 @@ handle_call({return_runner, QueryType}, _From, State) -> fold_countdown = CountDown}}; handle_call({compact_journal, Timeout}, _From, State) when State#state.head_only == false -> - ok = leveled_inker:ink_compactjournal(State#state.inker, + R = leveled_inker:ink_compactjournal(State#state.inker, self(), Timeout), - {reply, ok, State}; + {reply, R, State}; handle_call(confirm_compact, _From, State) when State#state.head_only == false -> {reply, leveled_inker:ink_compactionpending(State#state.inker), State}; diff --git a/src/leveled_inker.erl b/src/leveled_inker.erl index d2ad02b..dd6b86d 100644 --- a/src/leveled_inker.erl +++ b/src/leveled_inker.erl @@ -348,7 +348,7 @@ ink_loadpcl(Pid, MinSQN, FilterFun, Penciller) -> as_ink}, infinity). --spec ink_compactjournal(pid(), pid(), integer()) -> ok. +-spec ink_compactjournal(pid(), pid(), integer()) -> ok|busy. %% @doc %% 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 @@ -605,14 +605,19 @@ handle_call({compact, FilterFun, Timeout}, _From, State) -> - leveled_iclerk:clerk_compact(State#state.clerk, - Checker, - InitiateFun, - CloseFun, - FilterFun, - self(), - Timeout), - {reply, ok, State#state{compaction_pending=true}}; + case State#state.compaction_pending of + true -> + {reply, busy, State}; + false -> + leveled_iclerk:clerk_compact(State#state.clerk, + Checker, + InitiateFun, + CloseFun, + FilterFun, + self(), + Timeout), + {reply, ok, State#state{compaction_pending=true}} + end; handle_call(compaction_complete, _From, State) -> {reply, ok, State#state{compaction_pending=false}}; handle_call(compaction_pending, _From, State) -> diff --git a/test/end_to_end/basic_SUITE.erl b/test/end_to_end/basic_SUITE.erl index 5aef2e8..a17108a 100644 --- a/test/end_to_end/basic_SUITE.erl +++ b/test/end_to_end/basic_SUITE.erl @@ -300,6 +300,7 @@ journal_compaction_tester(Restart, WRP) -> {sync_strategy, testutil:sync_strategy()}], {ok, Bookie3} = leveled_bookie:book_start(StartOpts2), ok = leveled_bookie:book_compactjournal(Bookie3, 30000), + busy = leveled_bookie:book_compactjournal(Bookie3, 30000), testutil:wait_for_compaction(Bookie3), ok = leveled_bookie:book_close(Bookie3),