Skip to content

Commit 075b520

Browse files
committed
wip
1 parent c380649 commit 075b520

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

prototypes/ScheduledMerges.hs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
480480
creditsForMerge (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

486486
type Event = EventAt EventDetail
487487
data 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

Comments
 (0)