@@ -194,7 +194,7 @@ invariant = go 1
194
194
MergePolicyLevelling -> assertST $ null rs
195
195
-- Runs in tiering levels usually fit that size, but they can be one
196
196
-- 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
198
198
199
199
-- Incoming runs being merged also need to be of the right size, but the
200
200
-- conditions are more complicated.
@@ -229,7 +229,7 @@ invariant = go 1
229
229
let residentRuns = drop 4 rs
230
230
assertST $ length incomingRuns == 4
231
231
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
233
233
assertST $ all (\ r -> levellingRunSizeToLevel r <= ln+ 1 ) residentRuns
234
234
235
235
MergePolicyTiering ->
@@ -247,14 +247,14 @@ invariant = go 1
247
247
-- a single level only.
248
248
(_, CompletedMerge r, MergeLastLevel ) -> do
249
249
assertST $ ln == 1
250
- assertST $ tieringRunSizeToLevel r <= ln+ 1
250
+ assertST $ tieringRunSizeToLevel r <= ln
251
251
252
252
-- A completed mid level run is usually of the size for the
253
253
-- level it is entering, but can also be one smaller (in which case
254
254
-- it'll be held back and merged again) or one larger (because it
255
255
-- includes a run that has been held back before).
256
256
(_, CompletedMerge r, MergeMidLevel ) ->
257
- assertST $ tieringRunSizeToLevel r `elem` [ln- 1 , ln, ln + 1 ]
257
+ assertST $ tieringRunSizeToLevel r `elem` [ln- 1 , ln]
258
258
259
259
-- An ongoing merge for tiering should have 4 incoming runs of
260
260
-- 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
298
298
debt = newMergeDebt $ case mergepolicy of
299
299
MergePolicyLevelling -> 4 * tieringRunSize (level- 1 )
300
300
+ levellingRunSize level
301
- MergePolicyTiering -> length rs * tieringRunSize (level- 1 )
301
+ MergePolicyTiering -> 4 * tieringRunSize (level- 1 )
302
302
-- deliberately lazy:
303
303
r = case mergelast of
304
304
MergeMidLevel -> (mergek rs)
@@ -479,9 +479,9 @@ creditsForMerge SingleRun{} = 0
479
479
-- It needs to be completed before another run comes in.
480
480
creditsForMerge (MergingRun MergePolicyLevelling _ _) = (1 + 4 ) / 1
481
481
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)
483
483
-- 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
485
485
486
486
type Event = EventAt EventDetail
487
487
data EventAt e = EventAt {
@@ -533,7 +533,9 @@ increment tr sc = \r ls -> do
533
533
534
534
-- If r is still too small for this level then keep it and merge again
535
535
-- 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
537
539
let mergelast = mergeLastForLevel ls
538
540
mr' <- newMerge tr' ln MergePolicyTiering mergelast (incoming ++ [r])
539
541
return (Level mr' rs : ls)
0 commit comments