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