Skip to content

Commit be07f94

Browse files
committed
Return leftover credits from supplyCredits
This is now easy because it's reported as part of the credit accounting in a reliable way.
1 parent 819f1d3 commit be07f94

File tree

3 files changed

+15
-10
lines changed

3 files changed

+15
-10
lines changed

src/Database/LSMTree/Internal/MergeSchedule.hs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -746,7 +746,7 @@ addRunToLevels tr conf@TableConfig{..} resolve hfs hbio root uc r0 reg levels ul
746746
OneShot -> do
747747
let !required = MR.Credits (unNumEntries (V.foldMap' Run.size rs))
748748
let !thresh = creditThresholdForLevel conf ln
749-
MR.supplyCredits mr thresh required
749+
_leftoverCredits <- MR.supplyCredits mr thresh required
750750
-- This ensures the merge is really completed. However, we don't
751751
-- release the merge yet and only briefly inspect the resulting run.
752752
bracket (MR.expectCompleted mr) releaseRef $ \r ->
@@ -877,7 +877,8 @@ supplyCredits conf c levels =
877877
Merging mp mr -> do
878878
let !c' = scaleCreditsForMerge mp mr c
879879
let !thresh = creditThresholdForLevel conf ln
880-
MR.supplyCredits mr thresh c'
880+
_leftoverCredits <- MR.supplyCredits mr thresh c'
881+
return ()
881882

882883
-- | Scale a number of credits to a number of merge steps to be performed, based
883884
-- on the merging run.

src/Database/LSMTree/Internal/MergingRun.hs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -628,15 +628,15 @@ atomicSpendCredits (CreditsVar var) spend =
628628
Ref (MergingRun IO h)
629629
-> CreditThreshold
630630
-> Credits
631-
-> IO () #-}
631+
-> IO Credits #-}
632632
-- | Supply the given amount of credits to a merging run. This /may/ cause an
633633
-- ongoing merge to progress.
634634
supplyCredits ::
635635
forall m h. (MonadSTM m, MonadST m, MonadMVar m, MonadMask m)
636636
=> Ref (MergingRun m h)
637637
-> CreditThreshold
638638
-> Credits
639-
-> m ()
639+
-> m Credits
640640
supplyCredits (DeRef MergingRun {
641641
mergeKnownCompleted,
642642
mergeNumEntries,
@@ -647,7 +647,7 @@ supplyCredits (DeRef MergingRun {
647647
assert (credits >= 0) $ do
648648
mergeCompleted <- readMutVar mergeKnownCompleted
649649
case mergeCompleted of
650-
MergeKnownCompleted -> pure ()
650+
MergeKnownCompleted -> pure credits
651651
MergeMaybeCompleted ->
652652
bracketOnError
653653
-- Atomically add credits to the unspent credits (but not allowing
@@ -665,7 +665,7 @@ supplyCredits (DeRef MergingRun {
665665
(\(spendCredits, _leftoverCredits) ->
666666
atomicSpendCredits mergeCreditsVar (-spendCredits))
667667

668-
(\(spendCredits, _leftoverCredits) ->
668+
(\(spendCredits, leftoverCredits) -> do
669669
when (spendCredits > 0) $ do
670670
weFinishedMerge <-
671671
performMergeSteps mergeState mergeCreditsVar spendCredits
@@ -674,7 +674,9 @@ supplyCredits (DeRef MergingRun {
674674
-- completion, then that is fine. The next supplyCredits will
675675
-- complete the merge.
676676
when weFinishedMerge $
677-
completeMerge mergeState mergeKnownCompleted)
677+
completeMerge mergeState mergeKnownCompleted
678+
679+
return leftoverCredits)
678680

679681
{-# SPECIALISE performMergeSteps ::
680682
StrictMVar IO (MergingRunState IO h)

src/Database/LSMTree/Internal/Snapshot.hs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import Control.ActionRegistry
2828
import Control.Concurrent.Class.MonadMVar.Strict
2929
import Control.Concurrent.Class.MonadSTM (MonadSTM)
3030
import Control.DeepSeq (NFData (..))
31+
import Control.Exception (assert)
3132
import Control.Monad (void)
3233
import Control.Monad.Class.MonadST (MonadST)
3334
import Control.Monad.Class.MonadThrow (MonadMask)
@@ -462,9 +463,10 @@ fromSnapLevels reg hfs hbio conf@TableConfig{..} uc resolve dir (SnapLevels leve
462463
-- When a snapshot is created, merge progress is lost, so we
463464
-- have to redo merging work here. SuppliedCredits tracks how
464465
-- many credits were supplied before the snapshot was taken.
465-
MR.supplyCredits mr (creditThresholdForLevel conf ln)
466-
(MR.Credits sc)
467-
return mr
466+
leftoverCredits <- MR.supplyCredits
467+
mr (creditThresholdForLevel conf ln)
468+
(MR.Credits sc)
469+
assert (leftoverCredits == 0) $ return mr
468470

469471
dupRun r = withRollback reg (dupRef r) releaseRef
470472

0 commit comments

Comments
 (0)