@@ -49,7 +49,6 @@ import Database.LSMTree.Internal.Entry (Entry, NumEntries (..),
4949 unNumEntries )
5050import Database.LSMTree.Internal.Index (Index )
5151import Database.LSMTree.Internal.Lookup (ResolveSerialisedValue )
52- import Database.LSMTree.Internal.Merge (MergeType (.. ))
5352import Database.LSMTree.Internal.MergingRun (MergingRun , NumRuns (.. ))
5453import qualified Database.LSMTree.Internal.MergingRun as MR
5554import Database.LSMTree.Internal.MergingTree (MergingTree )
@@ -95,7 +94,7 @@ data MergeTrace =
9594 RunDataCaching
9695 RunBloomFilterAlloc
9796 MergePolicyForLevel
98- MergeType
97+ MR. LevelMergeType
9998 | TraceCompletedMerge -- TODO: currently not traced for Incremental merges
10099 NumEntries -- ^ Size of output run
101100 RunNumber
@@ -209,7 +208,7 @@ mkLevelsCache reg lvls = do
209208 foldRunAndMergeM ::
210209 Monoid a
211210 => (Ref (Run m h ) -> m a )
212- -> (Ref (MergingRun m h ) -> m a )
211+ -> (Ref (MergingRun MR. LevelMergeType m h ) -> m a )
213212 -> Levels m h
214213 -> m a
215214 foldRunAndMergeM k1 k2 ls =
@@ -298,7 +297,7 @@ data Level m h = Level {
298297-- | An incoming run is either a single run, or a merge.
299298data IncomingRun m h =
300299 Single ! (Ref (Run m h ))
301- | Merging ! MergePolicyForLevel ! (Ref (MergingRun m h ))
300+ | Merging ! MergePolicyForLevel ! (Ref (MergingRun MR. LevelMergeType m h ))
302301
303302data MergePolicyForLevel = LevelTiering | LevelLevelling
304303 deriving stock (Show , Eq )
@@ -389,6 +388,7 @@ iforLevelM_ lvls k = V.iforM_ lvls $ \i lvl -> k (LevelNo (i + 1)) lvl
389388-- * not stored in snapshots
390389-- * not loaded from snapshots
391390-- * ignored in lookups
391+ -- * never made merge progress on (by supplying credits to it)
392392-- * never merged into the regular levels
393393data UnionLevel m h =
394394 NoUnion
@@ -575,12 +575,13 @@ flushWriteBuffer tr conf@TableConfig{confFencePointerIndex, confDiskCachePolicy}
575575 | otherwise = do
576576 ! n <- incrUniqCounter uc
577577 let ! size = WB. numEntries (tableWriteBuffer tc)
578- ! l = LevelNo 1
579- ! cache = diskCachePolicyForLevel confDiskCachePolicy l
580- ! alloc = bloomFilterAllocForLevel conf l
578+ ! ln = LevelNo 1
579+ ! cache = diskCachePolicyForLevel confDiskCachePolicy ln
580+ ! alloc = bloomFilterAllocForLevel conf ln
581581 ! indexType = indexTypeForRun confFencePointerIndex
582582 ! path = Paths. runPath root (uniqueToRunNumber n)
583- traceWith tr $ AtLevel l $ TraceFlushWriteBuffer size (runNumber path) cache alloc
583+ traceWith tr $ AtLevel ln $
584+ TraceFlushWriteBuffer size (runNumber path) cache alloc
584585 r <- withRollback reg
585586 (Run. fromWriteBuffer hfs hbio
586587 cache
@@ -654,30 +655,30 @@ addRunToLevels tr conf@TableConfig{..} resolve hfs hbio root uc r0 reg levels ul
654655 traceWith tr $ AtLevel ln TraceAddLevel
655656 -- Make a new level
656657 let policyForLevel = mergePolicyForLevel confMergePolicy ln V. empty ul
657- ir <- newMerge policyForLevel MergeLastLevel ln rs
658+ ir <- newMerge policyForLevel MR. MergeLastLevel ln rs
658659 return $! V. singleton $ Level ir V. empty
659660 go ! ln rs' (V. uncons -> Just (Level ir rs, ls)) = do
660661 r <- expectCompletedMerge ln ir
661662 case mergePolicyForLevel confMergePolicy ln ls ul of
662663 -- If r is still too small for this level then keep it and merge again
663664 -- with the incoming runs.
664665 LevelTiering | Run. size r <= maxRunSize' conf LevelTiering (pred ln) -> do
665- let mergelast = mergeLastForLevel ls ul
666- ir' <- newMerge LevelTiering mergelast ln (rs' `V.snoc` r)
666+ let mergeType = mergeTypeForLevel ls ul
667+ ir' <- newMerge LevelTiering mergeType ln (rs' `V.snoc` r)
667668 pure $! Level ir' rs `V.cons` ls
668669 -- This tiering level is now full. We take the completed merged run
669670 -- (the previous incoming runs), plus all the other runs on this level
670671 -- as a bundle and move them down to the level below. We start a merge
671672 -- for the new incoming runs. This level is otherwise empty.
672673 LevelTiering | levelIsFull confSizeRatio rs -> do
673- ir' <- newMerge LevelTiering MergeMidLevel ln rs'
674+ ir' <- newMerge LevelTiering MR. MergeMidLevel ln rs'
674675 ls' <- go (succ ln) (r `V.cons` rs) ls
675676 pure $! Level ir' V. empty `V.cons` ls'
676677 -- This tiering level is not yet full. We move the completed merged run
677678 -- into the level proper, and start the new merge for the incoming runs.
678679 LevelTiering -> do
679- let mergelast = mergeLastForLevel ls ul
680- ir' <- newMerge LevelTiering mergelast ln rs'
680+ let mergeType = mergeTypeForLevel ls ul
681+ ir' <- newMerge LevelTiering mergeType ln rs'
681682 traceWith tr $ AtLevel ln
682683 $ TraceAddRun
683684 (Run. runFsPathsNumber r)
@@ -689,13 +690,13 @@ addRunToLevels tr conf@TableConfig{..} resolve hfs hbio root uc r0 reg levels ul
689690 -- empty) level .
690691 LevelLevelling | Run. size r > maxRunSize' conf LevelLevelling ln -> do
691692 assert (V. null rs && V. null ls) $ pure ()
692- ir' <- newMerge LevelTiering MergeMidLevel ln rs'
693+ ir' <- newMerge LevelTiering MR. MergeMidLevel ln rs'
693694 ls' <- go (succ ln) (V. singleton r) V. empty
694695 pure $! Level ir' V. empty `V.cons` ls'
695696 -- Otherwise we start merging the incoming runs into the run.
696697 LevelLevelling -> do
697698 assert (V. null rs && V. null ls) $ pure ()
698- ir' <- newMerge LevelLevelling MergeLastLevel ln (rs' `V.snoc` r)
699+ ir' <- newMerge LevelLevelling MR. MergeLastLevel ln (rs' `V.snoc` r)
699700 pure $! Level ir' V. empty `V.cons` V. empty
700701
701702 -- Releases the incoming run.
@@ -713,7 +714,7 @@ addRunToLevels tr conf@TableConfig{..} resolve hfs hbio root uc r0 reg levels ul
713714
714715 -- Releases the runs.
715716 newMerge :: MergePolicyForLevel
716- -> MergeType
717+ -> MR. LevelMergeType
717718 -> LevelNo
718719 -> V. Vector (Ref (Run m h ))
719720 -> m (IncomingRun m h )
@@ -737,7 +738,8 @@ addRunToLevels tr conf@TableConfig{..} resolve hfs hbio root uc r0 reg levels ul
737738 ! indexType = indexTypeForRun confFencePointerIndex
738739 ! runPaths = Paths. runPath root (uniqueToRunNumber n)
739740 traceWith tr $ AtLevel ln $
740- TraceNewMerge (V. map Run. size rs) (runNumber runPaths) caching alloc mergePolicy mergeType
741+ TraceNewMerge (V. map Run. size rs) (runNumber runPaths) caching alloc
742+ mergePolicy mergeType
741743 -- The runs will end up inside the merging run, with fresh references.
742744 -- The original references can be released (but only on the happy path).
743745 mr <- withRollback reg
@@ -801,10 +803,10 @@ maxRunSize' config policy ln =
801803
802804-- | If there are no further levels provided, this level is the last one.
803805-- However, if a 'Union' is present, it acts as another (last) level.
804- mergeLastForLevel :: Levels m h -> UnionLevel m h -> MergeType
805- mergeLastForLevel levels unionLevel
806- | V. null levels, NoUnion <- unionLevel = MergeLastLevel
807- | otherwise = MergeMidLevel
806+ mergeTypeForLevel :: Levels m h -> UnionLevel m h -> MR. LevelMergeType
807+ mergeTypeForLevel levels unionLevel
808+ | V. null levels, NoUnion <- unionLevel = MR. MergeLastLevel
809+ | otherwise = MR. MergeMidLevel
808810
809811levelIsFull :: SizeRatio -> V. Vector run -> Bool
810812levelIsFull sr rs = V. length rs + 1 >= (sizeRatioInt sr)
@@ -895,7 +897,7 @@ supplyCredits conf c levels =
895897-- merging work than 1 merge step for each credit.
896898scaleCreditsForMerge ::
897899 MergePolicyForLevel
898- -> Ref (MergingRun m h )
900+ -> Ref (MergingRun t m h )
899901 -> Credits
900902 -> MR. Credits
901903scaleCreditsForMerge LevelLevelling _ (Credits c) =
0 commit comments