@@ -466,20 +466,24 @@ bufferToRun = id
466466supplyCredits :: Credit -> Levels s -> ST s ()
467467supplyCredits n ls =
468468 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+ ]
470472
471473-- | The general case (and thus worst case) of how many merge credits we need
472474-- for a level. This is based on the merging policy at the level.
473475--
474- creditsForMerge :: MergingRun s -> Credit
476+ creditsForMerge :: MergingRun s -> Float
475477creditsForMerge SingleRun {} = 0
476478
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
483487
484488type Event = EventAt EventDetail
485489data EventAt e = EventAt {
0 commit comments