@@ -23,6 +23,8 @@ module Database.LSMTree.Internal.MergingRun (
2323 , Credits (.. )
2424 , CreditThreshold (.. )
2525 , SuppliedCredits (.. )
26+ , SpentCredits (.. )
27+ , UnspentCredits (.. )
2628
2729 -- * Concurrency
2830 -- $concurrency
@@ -32,16 +34,18 @@ module Database.LSMTree.Internal.MergingRun (
3234 , MergingRunState (.. )
3335 , MergeKnownCompleted (.. )
3436 , CreditsVar (.. )
37+ , pattern CreditsPair
3538 ) where
3639
3740import Control.ActionRegistry
3841import Control.Concurrent.Class.MonadMVar.Strict
3942import Control.DeepSeq (NFData (.. ))
43+ import Control.Exception (ErrorCall (.. ))
4044import Control.Monad (when )
4145import Control.Monad.Class.MonadST (MonadST )
4246import Control.Monad.Class.MonadSTM (MonadSTM (.. ))
4347import Control.Monad.Class.MonadThrow (MonadCatch (bracketOnError ),
44- MonadMask )
48+ MonadMask , MonadThrow ( throwIO ) )
4549import Control.Monad.Primitive
4650import Control.RefCount
4751import Data.Bits
@@ -183,6 +187,10 @@ unsafeNew ::
183187 -> MergeKnownCompleted
184188 -> MergingRunState m h
185189 -> m (Ref (MergingRun m h ))
190+ unsafeNew _ mergeNumEntries _ _
191+ | SpentCredits (numEntriesToTotalDebt mergeNumEntries) > maxBound
192+ = throwIO (ErrorCall " MergingRun.new: run size exceeds maximum of 2^40" )
193+
186194unsafeNew mergeNumRuns mergeNumEntries knownCompleted state = do
187195 mergeCreditsVar <- CreditsVar <$> newPrimVar 0
188196 case state of
@@ -340,6 +348,7 @@ newtype SuppliedCredits = SuppliedCredits Credits
340348-- spent (by some thread calling 'supplyCredits').
341349--
342350newtype SpentCredits = SpentCredits Credits
351+ deriving newtype (Eq , Ord )
343352
344353-- | 40 bit unsigned number
345354instance Bounded SpentCredits where
@@ -355,6 +364,7 @@ instance Bounded SpentCredits where
355364-- current unspent credits being negative for a time.
356365--
357366newtype UnspentCredits = UnspentCredits Credits
367+ deriving newtype (Eq , Ord )
358368
359369-- | 24 bit signed number
360370instance Bounded UnspentCredits where
@@ -386,11 +396,13 @@ pattern CreditsPair sc uc <- (unpackCreditsPair -> (sc, uc))
386396#endif
387397{-# COMPLETE CreditsPair #-}
388398
389- -- TODO: test pack/unpack round trip with the minBound & maxBounds
390-
391399{-# INLINE packCreditsPair #-}
392400packCreditsPair :: SpentCredits -> UnspentCredits -> Int
393- packCreditsPair (SpentCredits (Credits sc)) (UnspentCredits (Credits uc)) =
401+ packCreditsPair spent@ (SpentCredits (Credits sc))
402+ unspent@ (UnspentCredits (Credits uc)) =
403+ assert (spent >= minBound && spent <= maxBound ) $
404+ assert (unspent >= minBound && unspent <= maxBound ) $
405+
394406 sc `unsafeShiftL` 24
395407 .|. (uc .&. 0xffffff )
396408
0 commit comments