@@ -194,7 +194,7 @@ invariant = go 1
194194 MergePolicyLevelling -> assertST $ null rs
195195 -- Runs in tiering levels usually fit that size, but they can be one
196196 -- larger, if a run has been held back (creating a 5-way merge).
197- MergePolicyTiering -> assertST $ all (\ r -> tieringRunSizeToLevel r `elem` [ln, ln+ 1 ]) rs
197+ MergePolicyTiering -> assertST $ all (\ r -> tieringRunSizeToLevel r `elem` [ln- 1 , ln]) rs
198198
199199 -- Incoming runs being merged also need to be of the right size, but the
200200 -- conditions are more complicated.
@@ -229,7 +229,7 @@ invariant = go 1
229229 let residentRuns = drop 4 rs
230230 assertST $ length incomingRuns == 4
231231 assertST $ length residentRuns <= 1
232- assertST $ all (\ r -> tieringRunSizeToLevel r == ln- 1 ) incomingRuns
232+ assertST $ all (\ r -> tieringRunSizeToLevel r `elem` [ ln- 2 , ln - 1 ] ) incomingRuns
233233 assertST $ all (\ r -> levellingRunSizeToLevel r <= ln+ 1 ) residentRuns
234234
235235 MergePolicyTiering ->
@@ -247,14 +247,14 @@ invariant = go 1
247247 -- a single level only.
248248 (_, CompletedMerge r, MergeLastLevel ) -> do
249249 assertST $ ln == 1
250- assertST $ tieringRunSizeToLevel r <= ln+ 1
250+ assertST $ tieringRunSizeToLevel r <= ln
251251
252252 -- A completed mid level run is usually of the size for the
253253 -- level it is entering, but can also be one smaller (in which case
254254 -- it'll be held back and merged again) or one larger (because it
255255 -- includes a run that has been held back before).
256256 (_, CompletedMerge r, MergeMidLevel ) ->
257- assertST $ tieringRunSizeToLevel r `elem` [ln- 1 , ln, ln + 1 ]
257+ assertST $ tieringRunSizeToLevel r `elem` [ln- 1 , ln]
258258
259259 -- An ongoing merge for tiering should have 4 incoming runs of
260260 -- the right size for the level below, and at most 1 run held back
@@ -298,7 +298,7 @@ newMerge tr level mergepolicy mergelast rs = do
298298 debt = newMergeDebt $ case mergepolicy of
299299 MergePolicyLevelling -> 4 * tieringRunSize (level- 1 )
300300 + levellingRunSize level
301- MergePolicyTiering -> length rs * tieringRunSize (level- 1 )
301+ MergePolicyTiering -> 4 * tieringRunSize (level- 1 )
302302 -- deliberately lazy:
303303 r = case mergelast of
304304 MergeMidLevel -> (mergek rs)
@@ -479,9 +479,9 @@ creditsForMerge SingleRun{} = 0
479479-- It needs to be completed before another run comes in.
480480creditsForMerge (MergingRun MergePolicyLevelling _ _) = (1 + 4 ) / 1
481481
482- -- A tiering merge has 5 runs at most (once could be held back to merged again)
482+ -- A tiering merge has 4 runs at most (once could be held back to merged again)
483483-- and must be completed before the level is full (once 4 more runs come in).
484- creditsForMerge (MergingRun MergePolicyTiering _ _) = 5 / 4
484+ creditsForMerge (MergingRun MergePolicyTiering _ _) = 4 / 4
485485
486486type Event = EventAt EventDetail
487487data EventAt e = EventAt {
@@ -533,7 +533,9 @@ increment tr sc = \r ls -> do
533533
534534 -- If r is still too small for this level then keep it and merge again
535535 -- with the incoming runs.
536- MergePolicyTiering | tieringRunSizeToLevel r < ln -> do
536+ MergePolicyTiering
537+ | tieringRunSizeToLevel r < ln
538+ , sum (map Map. size (r : incoming)) <= tieringRunSize ln -> do
537539 let mergelast = mergeLastForLevel ls
538540 mr' <- newMerge tr' ln MergePolicyTiering mergelast (incoming ++ [r])
539541 return (Level mr' rs : ls)
0 commit comments