Skip to content

Commit

Permalink
Return leftover credits from supplyCredits
Browse files Browse the repository at this point in the history
This is now easy because it's reported as part of the credit accounting
in a reliable way.
  • Loading branch information
dcoutts committed Feb 6, 2025
1 parent eb15274 commit c1be2c8
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 9 deletions.
5 changes: 3 additions & 2 deletions src/Database/LSMTree/Internal/MergeSchedule.hs
Original file line number Diff line number Diff line change
Expand Up @@ -673,7 +673,7 @@ addRunToLevels tr conf@TableConfig{..} resolve hfs hbio root uc r0 reg levels =
OneShot -> do
let !required = MR.Credits (unNumEntries (V.foldMap' Run.size rs))
let !thresh = creditThresholdForLevel conf ln
MR.supplyCredits mr thresh required
_leftoverCredits <- MR.supplyCredits mr thresh required
-- This ensures the merge is really completed. However, we don't
-- release the merge yet and only briefly inspect the resulting run.
bracket (MR.expectCompleted mr) releaseRef $ \r ->
Expand Down Expand Up @@ -802,7 +802,8 @@ supplyCredits conf c levels =
Merging mp mr -> do
let !c' = scaleCreditsForMerge mp mr c
let !thresh = creditThresholdForLevel conf ln
MR.supplyCredits mr thresh c'
_leftoverCredits <- MR.supplyCredits mr thresh c'
return ()

-- | Scale a number of credits to a number of merge steps to be performed, based
-- on the merging run.
Expand Down
10 changes: 6 additions & 4 deletions src/Database/LSMTree/Internal/MergingRun.hs
Original file line number Diff line number Diff line change
Expand Up @@ -628,15 +628,15 @@ atomicSpendCredits (CreditsVar var) spend =
Ref (MergingRun IO h)
-> CreditThreshold
-> Credits
-> IO () #-}
-> IO Credits #-}
-- | Supply the given amount of credits to a merging run. This /may/ cause an
-- ongoing merge to progress.
supplyCredits ::
forall m h. (MonadSTM m, MonadST m, MonadMVar m, MonadMask m)
=> Ref (MergingRun m h)
-> CreditThreshold
-> Credits
-> m ()
-> m Credits
supplyCredits (DeRef MergingRun {
mergeKnownCompleted,
mergeNumEntries,
Expand All @@ -647,15 +647,15 @@ supplyCredits (DeRef MergingRun {
assert (credits >= 0) $ do
mergeCompleted <- readMutVar mergeKnownCompleted
case mergeCompleted of
MergeKnownCompleted -> pure ()
MergeKnownCompleted -> pure credits
MergeMaybeCompleted -> do
-- Atomically add credits to the unspent credits (but not allowing
-- 'suppliedCredits' to exceed the total debt), determine which case
-- we're in and thus how many credits we should try to spend now on
-- performing merge steps. Return the credits to spend now and any
-- leftover credits that would exceed the debt limit.
(spendCredits,
_leftoverCredits) <- atomicDepositAndSpendCredits
leftoverCredits) <- atomicDepositAndSpendCredits
mergeCreditsVar
(numEntriesToTotalDebt mergeNumEntries)
creditBatchThreshold credits
Expand All @@ -673,6 +673,8 @@ supplyCredits (DeRef MergingRun {
-- complete the merge.
when weFinishedMerge $ completeMerge mergeState mergeKnownCompleted

return leftoverCredits

{-# SPECIALISE performMergeSteps ::
StrictMVar IO (MergingRunState IO h)
-> CreditsVar RealWorld
Expand Down
8 changes: 5 additions & 3 deletions src/Database/LSMTree/Internal/Snapshot.hs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import Control.ActionRegistry
import Control.Concurrent.Class.MonadMVar.Strict
import Control.Concurrent.Class.MonadSTM (MonadSTM)
import Control.DeepSeq (NFData (..))
import Control.Exception (assert)
import Control.Monad (void, when)
import Control.Monad.Class.MonadST (MonadST)
import Control.Monad.Class.MonadThrow (MonadMask)
Expand Down Expand Up @@ -469,9 +470,10 @@ fromSnapLevels reg hfs hbio conf@TableConfig{..} uc resolve dir (SnapLevels leve
-- When a snapshot is created, merge progress is lost, so we
-- have to redo merging work here. SuppliedCredits tracks how
-- many credits were supplied before the snapshot was taken.
MR.supplyCredits mr (creditThresholdForLevel conf ln)
(MR.Credits sc)
return mr
leftoverCredits <- MR.supplyCredits
mr (creditThresholdForLevel conf ln)
(MR.Credits sc)
assert (leftoverCredits == 0) $ return mr

dupRun r = withRollback reg (dupRef r) releaseRef

Expand Down

0 comments on commit c1be2c8

Please sign in to comment.