Skip to content

Commit 78116b6

Browse files
authored
Merge pull request #561 from IntersectMBO/dcoutts/mergingrun-credits-concurrency
New merging run credit counter strategy using an atomic pair of counters
2 parents 492094a + ab8982c commit 78116b6

File tree

6 files changed

+649
-392
lines changed

6 files changed

+649
-392
lines changed

src-extras/Database/LSMTree/Extras/NoThunks.hs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -321,14 +321,8 @@ deriving anyclass instance NoThunks MergePolicyForLevel
321321
deriving stock instance Generic NumRuns
322322
deriving anyclass instance NoThunks NumRuns
323323

324-
deriving stock instance Generic (UnspentCreditsVar s)
325-
deriving anyclass instance Typeable s => NoThunks (UnspentCreditsVar s)
326-
327-
deriving stock instance Generic (StepsPerformedVar s)
328-
deriving anyclass instance Typeable s => NoThunks (StepsPerformedVar s)
329-
330-
deriving stock instance Generic (SpentCreditsVar s)
331-
deriving anyclass instance Typeable s => NoThunks (SpentCreditsVar s)
324+
deriving stock instance Generic (CreditsVar s)
325+
deriving anyclass instance Typeable s => NoThunks (CreditsVar s)
332326

333327
deriving stock instance Generic MergeKnownCompleted
334328
deriving anyclass instance NoThunks MergeKnownCompleted

src/Database/LSMTree/Internal/MergeSchedule.hs

Lines changed: 6 additions & 5 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 required thresh mr
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 c' thresh mr
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.
@@ -818,7 +819,7 @@ scaleCreditsForMerge LevelTiering _ (Credits c) =
818819
-- runs come in).
819820
MR.Credits (c * (1 + 4))
820821

821-
scaleCreditsForMerge LevelLevelling (DeRef mr) (Credits c) =
822+
scaleCreditsForMerge LevelLevelling mr (Credits c) =
822823
-- A levelling merge has 1 input run and one resident run, which is (up
823824
-- to) 4x bigger than the others. It needs to be completed before
824825
-- another run comes in.
@@ -828,7 +829,7 @@ scaleCreditsForMerge LevelLevelling (DeRef mr) (Credits c) =
828829
-- worst-case upper bound by looking at the sizes of the input runs.
829830
-- As as result, merge work would/could be more evenly distributed over
830831
-- time when the resident run is smaller than the worst case.
831-
let NumRuns n = MR.mergeNumRuns mr
832+
let NumRuns n = MR.numRuns mr
832833
-- same as division rounding up: ceiling (c * n / 4)
833834
in MR.Credits ((c * n + 3) `div` 4)
834835

@@ -837,4 +838,4 @@ scaleCreditsForMerge LevelLevelling (DeRef mr) (Credits c) =
837838
creditThresholdForLevel :: TableConfig -> LevelNo -> MR.CreditThreshold
838839
creditThresholdForLevel conf (LevelNo _i) =
839840
let AllocNumEntries (NumEntries x) = confWriteBufferAlloc conf
840-
in MR.CreditThreshold x
841+
in MR.CreditThreshold (MR.Credits x)

0 commit comments

Comments
 (0)