Skip to content

Commit c1be2c8

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 eb15274 commit c1be2c8

File tree

3 files changed

+14
-9
lines changed

3 files changed

+14
-9
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: 6 additions & 4 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,15 +647,15 @@ 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 -> do
652652
-- Atomically add credits to the unspent credits (but not allowing
653653
-- 'suppliedCredits' to exceed the total debt), determine which case
654654
-- we're in and thus how many credits we should try to spend now on
655655
-- performing merge steps. Return the credits to spend now and any
656656
-- leftover credits that would exceed the debt limit.
657657
(spendCredits,
658-
_leftoverCredits) <- atomicDepositAndSpendCredits
658+
leftoverCredits) <- atomicDepositAndSpendCredits
659659
mergeCreditsVar
660660
(numEntriesToTotalDebt mergeNumEntries)
661661
creditBatchThreshold credits
@@ -673,6 +673,8 @@ supplyCredits (DeRef MergingRun {
673673
-- complete the merge.
674674
when weFinishedMerge $ completeMerge mergeState mergeKnownCompleted
675675

676+
return leftoverCredits
677+
676678
{-# SPECIALISE performMergeSteps ::
677679
StrictMVar IO (MergingRunState IO h)
678680
-> CreditsVar RealWorld

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)