Skip to content

Commit 7d32a39

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 6318bec commit 7d32a39

File tree

3 files changed

+20
-11
lines changed

3 files changed

+20
-11
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: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -687,33 +687,33 @@ atomicUnspendCredits (CreditsVar var) unspend =
687687
Ref (MergingRun IO h)
688688
-> CreditThreshold
689689
-> Credits
690-
-> IO () #-}
690+
-> IO Credits #-}
691691
-- | Supply the given amount of credits to a merging run. This /may/ cause an
692692
-- ongoing merge to progress.
693693
supplyCredits ::
694694
forall m h. (MonadSTM m, MonadST m, MonadMVar m, MonadMask m)
695695
=> Ref (MergingRun m h)
696696
-> CreditThreshold
697697
-> Credits
698-
-> m ()
698+
-> m Credits
699699
supplyCredits (DeRef mrun@MergingRun {mergeKnownCompleted})
700700
!creditBatchThreshold !credits = do
701701
mergeCompleted <- readMutVar mergeKnownCompleted
702702
case mergeCompleted of
703-
MergeKnownCompleted -> pure ()
703+
MergeKnownCompleted -> pure credits
704704
MergeMaybeCompleted -> supplyCredits' mrun creditBatchThreshold credits
705705

706706
{-# SPECIALISE supplyCredits' ::
707707
MergingRun IO h
708708
-> CreditThreshold
709709
-> Credits
710-
-> IO () #-}
710+
-> IO Credits #-}
711711
supplyCredits' ::
712712
forall m h. (MonadSTM m, MonadST m, MonadMVar m, MonadMask m)
713713
=> MergingRun m h
714714
-> CreditThreshold
715715
-> Credits
716-
-> m ()
716+
-> m Credits
717717
supplyCredits' MergingRun {
718718
mergeNumEntries,
719719
mergeCreditsVar,
@@ -763,6 +763,8 @@ supplyCredits' MergingRun {
763763
-- completion, then that is fine. The next supplyCredits will
764764
-- complete the merge.
765765
when weFinishedMerge $ completeMerge mergeState mergeKnownCompleted
766+
-- We reliably know the credits we supplied that were left over.
767+
return leftoverCredits
766768

767769
| unspentCredits >= batchThreshold -> do
768770
-- If the unspent credits have reached the threshold then we will try
@@ -784,10 +786,14 @@ supplyCredits' MergingRun {
784786
-- completion, then that is fine. The next supplyCredits will
785787
-- complete the merge.
786788
when weFinishedMerge $ completeMerge mergeState mergeKnownCompleted
789+
-- We didn't finish, so can be no leftover credits
790+
assert (leftoverCredits == 0) $ pure (Credits 0)
787791

788792
-- Otherwise just accumulate credits (which we did already above),
789793
-- because we are not over the threshold yet.
790-
| otherwise -> pure ()
794+
| otherwise ->
795+
-- We didn't finish, so can be no leftover credits
796+
assert (leftoverCredits == 0) $ pure (Credits 0)
791797

792798
{-# SPECIALISE performMergeSteps ::
793799
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)