@@ -466,20 +466,24 @@ bufferToRun = id
466
466
supplyCredits :: Credit -> Levels s -> ST s ()
467
467
supplyCredits n ls =
468
468
sequence_
469
- [ supplyMergeCredits (n * creditsForMerge mr) mr | Level mr _rs <- ls ]
469
+ [ supplyMergeCredits (ceiling (fromIntegral n * creditsForMerge mr)) mr
470
+ | Level mr _rs <- ls
471
+ ]
470
472
471
473
-- | The general case (and thus worst case) of how many merge credits we need
472
474
-- for a level. This is based on the merging policy at the level.
473
475
--
474
- creditsForMerge :: MergingRun s -> Credit
476
+ creditsForMerge :: MergingRun s -> Float
475
477
creditsForMerge SingleRun {} = 0
476
478
477
- -- A levelling merge is 5x the cost of a tiering merge.
478
- -- That's because for levelling one of the runs as an input to the merge
479
- -- is the one levelling run which is (up to) 4x bigger than the others put
480
- -- together, so it's 1 + 4.
481
- creditsForMerge (MergingRun MergePolicyLevelling _ _) = 5
482
- creditsForMerge (MergingRun MergePolicyTiering _ _) = 1
479
+ -- A levelling merge has 1 input run and one resident run, which is (up to) 4x
480
+ -- bigger than the others.
481
+ -- It needs to be completed before another run comes in.
482
+ creditsForMerge (MergingRun MergePolicyLevelling _ _) = (1 + 4 ) / 1
483
+
484
+ -- A tiering merge has 5 runs at most (once could be held back to merged again)
485
+ -- and must be completed before the level is full (once 4 more runs come in).
486
+ creditsForMerge (MergingRun MergePolicyTiering _ _) = 5 / 4
483
487
484
488
type Event = EventAt EventDetail
485
489
data EventAt e = EventAt {
0 commit comments