@@ -132,17 +132,20 @@ tieringRunSize n = 4^n
132132levellingRunSize :: Int -> Int
133133levellingRunSize n = 4 ^ (n+ 1 )
134134
135- tieringRunSizeToLevel :: Run -> Int
136- tieringRunSizeToLevel r
135+ tieringLevel :: Int -> Int
136+ tieringLevel s
137137 | s <= bufferSize = 1 -- level numbers start at 1
138138 | otherwise =
139139 1 + (finiteBitSize s - countLeadingZeros (s- 1 ) - 1 ) `div` 2
140- where
141- s = Map. size r
140+
141+ levellingLevel :: Int -> Int
142+ levellingLevel s = max 1 (tieringLevel s - 1 ) -- level numbers start at 1
143+
144+ tieringRunSizeToLevel :: Run -> Int
145+ tieringRunSizeToLevel = tieringLevel . Map. size
142146
143147levellingRunSizeToLevel :: Run -> Int
144- levellingRunSizeToLevel r =
145- max 1 (tieringRunSizeToLevel r - 1 ) -- level numbers start at 1
148+ levellingRunSizeToLevel = levellingLevel . Map. size
146149
147150bufferSize :: Int
148151bufferSize = tieringRunSize 1 -- 4
@@ -519,16 +522,27 @@ increment tr sc = \r ls -> do
519522 invariant ls'
520523 return ls'
521524 where
522- go :: Int -> [Run ] -> Levels s -> ST s (Levels s )
523- go ! ln incoming [] = do
525+ go , go' :: Int -> [Run ] -> Levels s -> ST s (Levels s )
526+ go ! ln incoming ls = do
527+ case incoming of
528+ [r] -> do
529+ assertST $ tieringRunSizeToLevel r `elem` [ln, ln+ 1 ] -- +1 from levelling
530+ _ -> do
531+ assertST $ length incoming == 4
532+ -- because of overfull runs due to holding back
533+ assertST $ all (\ r -> tieringRunSizeToLevel r `elem` [ln- 1 , ln]) incoming
534+ assertST $ tieringLevel (sum (map Map. size incoming)) `elem` [ln, ln+ 1 ]
535+ go' ln incoming ls
536+
537+ go' ! ln incoming [] = do
524538 let mergepolicy = mergePolicyForLevel ln []
525539 traceWith tr' AddLevelEvent
526540 mr <- newMerge tr' ln mergepolicy MergeLastLevel incoming
527541 return (Level mr [] : [] )
528542 where
529543 tr' = contramap (EventAt sc ln) tr
530544
531- go ! ln incoming (Level mr rs : ls) = do
545+ go' ! ln incoming (Level mr rs : ls) = do
532546 r <- expectCompletedMerge tr' mr
533547 let resident = r: rs
534548 case mergePolicyForLevel ln ls of
0 commit comments