@@ -202,8 +202,8 @@ mkLevelsCache reg lvls = do
202202 foldRunAndMergeM k1 k2 ls =
203203 fmap fold $ V. forM ls $ \ (Level ir rs) -> do
204204 incoming <- case ir of
205- Single r -> k1 r
206- Merging mr -> k2 mr
205+ Single r -> k1 r
206+ Merging _ mr -> k2 mr
207207 (incoming <> ) . fold <$> V. forM rs k1
208208
209209{-# SPECIALISE rebuildCache ::
@@ -283,7 +283,7 @@ data Level m h = Level {
283283-- | An incoming run is either a single run, or a merge.
284284data IncomingRun m h =
285285 Single ! (Ref (Run m h ))
286- | Merging ! (Ref (MergingRun m h ))
286+ | Merging ! MergePolicyForLevel ! (Ref (MergingRun m h ))
287287
288288mergePolicyForLevel :: MergePolicy -> LevelNo -> Levels m h -> MergePolicyForLevel
289289mergePolicyForLevel MergePolicyLazyLevelling (LevelNo n) nextLevels
@@ -329,16 +329,16 @@ duplicateIncomingRun ::
329329duplicateIncomingRun reg (Single r) =
330330 Single <$> allocateTemp reg (dupRef r) releaseRef
331331
332- duplicateIncomingRun reg (Merging mr) =
333- Merging <$> allocateTemp reg (dupRef mr) releaseRef
332+ duplicateIncomingRun reg (Merging mp mr) =
333+ Merging mp <$> allocateTemp reg (dupRef mr) releaseRef
334334
335335{-# SPECIALISE releaseIncomingRun :: TempRegistry IO -> IncomingRun IO h -> IO () #-}
336336releaseIncomingRun ::
337337 (PrimMonad m , MonadMask m , MonadMVar m )
338338 => TempRegistry m
339339 -> IncomingRun m h -> m ()
340- releaseIncomingRun reg (Single r) = freeTemp reg (releaseRef r)
341- releaseIncomingRun reg (Merging mr) = freeTemp reg (releaseRef mr)
340+ releaseIncomingRun reg (Single r) = freeTemp reg (releaseRef r)
341+ releaseIncomingRun reg (Merging _ mr) = freeTemp reg (releaseRef mr)
342342
343343{-# SPECIALISE iforLevelM_ :: Levels IO h -> (LevelNo -> Level IO h -> IO ()) -> IO () #-}
344344iforLevelM_ :: Monad m => Levels m h -> (LevelNo -> Level m h -> m () ) -> m ()
@@ -618,8 +618,8 @@ addRunToLevels tr conf@TableConfig{..} resolve hfs hbio root uc r0 reg levels =
618618 expectCompletedMerge :: LevelNo -> IncomingRun m h -> m (Ref (Run m h ))
619619 expectCompletedMerge ln ir = do
620620 r <- case ir of
621- Single r -> pure r
622- Merging mr -> do
621+ Single r -> pure r
622+ Merging _ mr -> do
623623 r <- allocateTemp reg (MR. expectCompleted mr) releaseRef
624624 freeTemp reg (releaseRef mr)
625625 pure r
@@ -656,7 +656,7 @@ addRunToLevels tr conf@TableConfig{..} resolve hfs hbio root uc r0 reg levels =
656656 -- The runs will end up inside the merging run, with fresh references.
657657 -- The original references can be released (but only on the happy path).
658658 mr <- allocateTemp reg
659- (MR. new hfs hbio resolve caching alloc mergeLevel mergePolicy runPaths rs)
659+ (MR. new hfs hbio resolve caching alloc mergeLevel runPaths rs)
660660 releaseRef
661661 V. forM_ rs $ \ r -> freeTemp reg (releaseRef r)
662662 case confMergeSchedule of
@@ -671,7 +671,7 @@ addRunToLevels tr conf@TableConfig{..} resolve hfs hbio root uc r0 reg levels =
671671 traceWith tr $ AtLevel ln $
672672 TraceCompletedMerge (Run. size r) (Run. runFsPathsNumber r)
673673
674- return (Merging mr)
674+ return (Merging mergePolicy mr)
675675
676676-- $setup
677677-- >>> import Database.LSMTree.Internal.Entry
@@ -790,8 +790,8 @@ supplyCredits conf c levels =
790790 iforLevelM_ levels $ \ ln (Level ir _rs) ->
791791 case ir of
792792 Single {} -> pure ()
793- Merging mr -> do
794- let ! c' = scaleCreditsForMerge mr c
793+ Merging mp mr -> do
794+ let ! c' = scaleCreditsForMerge mp mr c
795795 let ! thresh = creditThresholdForLevel conf ln
796796 MR. supplyCredits c' thresh mr
797797
@@ -801,28 +801,27 @@ supplyCredits conf c levels =
801801-- Initially, 1 update supplies 1 credit. However, since merging runs have
802802-- different numbers of input runs/entries, we may have to a more or less
803803-- merging work than 1 merge step for each credit.
804- scaleCreditsForMerge :: Ref (MergingRun m h ) -> Credits -> MR. Credits
804+ scaleCreditsForMerge :: MergePolicyForLevel -> Ref (MergingRun m h ) -> Credits -> MR. Credits
805805-- A single run is a trivially completed merge, so it requires no credits.
806- scaleCreditsForMerge (DeRef mr) (Credits c) =
807- case MR. mergePolicy mr of
808- LevelTiering ->
809- -- A tiering merge has 5 runs at most (one could be held back to merged
810- -- again) and must be completed before the level is full (once 4 more
811- -- runs come in).
812- MR. Credits (c * (1 + 4 ))
813- LevelLevelling ->
814- -- A levelling merge has 1 input run and one resident run, which is (up
815- -- to) 4x bigger than the others. It needs to be completed before
816- -- another run comes in.
817- -- TODO: this is currently assuming a naive worst case, where the
818- -- resident run is as large as it can be for the current level. We
819- -- probably have enough information available here to lower the
820- -- worst-case upper bound by looking at the sizes of the input runs.
821- -- As as result, merge work would/could be more evenly distributed over
822- -- time when the resident run is smaller than the worst case.
823- let NumRuns n = MR. mergeNumRuns mr
824- -- same as division rounding up: ceiling (c * n / 4)
825- in MR. Credits ((c * n + 3 ) `div` 4 )
806+ scaleCreditsForMerge LevelTiering _ (Credits c) =
807+ -- A tiering merge has 5 runs at most (one could be held back to merged
808+ -- again) and must be completed before the level is full (once 4 more
809+ -- runs come in).
810+ MR. Credits (c * (1 + 4 ))
811+
812+ scaleCreditsForMerge LevelLevelling (DeRef mr) (Credits c) =
813+ -- A levelling merge has 1 input run and one resident run, which is (up
814+ -- to) 4x bigger than the others. It needs to be completed before
815+ -- another run comes in.
816+ -- TODO: this is currently assuming a naive worst case, where the
817+ -- resident run is as large as it can be for the current level. We
818+ -- probably have enough information available here to lower the
819+ -- worst-case upper bound by looking at the sizes of the input runs.
820+ -- As as result, merge work would/could be more evenly distributed over
821+ -- time when the resident run is smaller than the worst case.
822+ let NumRuns n = MR. mergeNumRuns mr
823+ -- same as division rounding up: ceiling (c * n / 4)
824+ in MR. Credits ((c * n + 3 ) `div` 4 )
826825
827826-- TODO: the thresholds for doing merge work should be different for each level,
828827-- maybe co-prime?
0 commit comments