Skip to content

Commit 64d0a31

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 4e68cd3 commit 64d0a31

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
@@ -673,7 +673,7 @@ addRunToLevels tr conf@TableConfig{..} resolve hfs hbio root uc r0 reg levels =
673673
OneShot -> do
674674
let !required = MR.Credits (unNumEntries (V.foldMap' Run.size rs))
675675
let !thresh = creditThresholdForLevel conf ln
676-
MR.supplyCredits mr thresh required
676+
_leftoverCredits <- MR.supplyCredits mr thresh required
677677
-- This ensures the merge is really completed. However, we don't
678678
-- release the merge yet and only briefly inspect the resulting run.
679679
bracket (MR.expectCompleted mr) releaseRef $ \r ->
@@ -802,7 +802,8 @@ supplyCredits conf c levels =
802802
Merging mp mr -> do
803803
let !c' = scaleCreditsForMerge mp mr c
804804
let !thresh = creditThresholdForLevel conf ln
805-
MR.supplyCredits mr thresh c'
805+
_leftoverCredits <- MR.supplyCredits mr thresh c'
806+
return ()
806807

807808
-- | Scale a number of credits to a number of merge steps to be performed, based
808809
-- 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
@@ -29,6 +29,7 @@ import Control.ActionRegistry
2929
import Control.Concurrent.Class.MonadMVar.Strict
3030
import Control.Concurrent.Class.MonadSTM (MonadSTM)
3131
import Control.DeepSeq (NFData (..))
32+
import Control.Exception (assert)
3233
import Control.Monad (void, when)
3334
import Control.Monad.Class.MonadST (MonadST)
3435
import Control.Monad.Class.MonadThrow (MonadMask)
@@ -469,9 +470,10 @@ fromSnapLevels reg hfs hbio conf@TableConfig{..} uc resolve dir (SnapLevels leve
469470
-- When a snapshot is created, merge progress is lost, so we
470471
-- have to redo merging work here. SuppliedCredits tracks how
471472
-- many credits were supplied before the snapshot was taken.
472-
MR.supplyCredits mr (creditThresholdForLevel conf ln)
473-
(MR.Credits sc)
474-
return mr
473+
leftoverCredits <- MR.supplyCredits
474+
mr (creditThresholdForLevel conf ln)
475+
(MR.Credits sc)
476+
assert (leftoverCredits == 0) $ return mr
475477

476478
dupRun r = withRollback reg (dupRef r) releaseRef
477479

0 commit comments

Comments
 (0)