Skip to content

Commit bbe8b57

Browse files
committed
add wrapper with invariants
1 parent 68e44f7 commit bbe8b57

File tree

1 file changed

+23
-9
lines changed

1 file changed

+23
-9
lines changed

prototypes/ScheduledMerges.hs

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -132,17 +132,20 @@ tieringRunSize n = 4^n
132132
levellingRunSize :: Int -> Int
133133
levellingRunSize 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

143147
levellingRunSizeToLevel :: Run -> Int
144-
levellingRunSizeToLevel r =
145-
max 1 (tieringRunSizeToLevel r - 1) -- level numbers start at 1
148+
levellingRunSizeToLevel = levellingLevel . Map.size
146149

147150
bufferSize :: Int
148151
bufferSize = 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

Comments
 (0)