@@ -105,14 +105,15 @@ import Database.LSMTree.Internal.BlobRef (WeakBlobRef (..))
105105import qualified Database.LSMTree.Internal.BlobRef as BlobRef
106106import Database.LSMTree.Internal.Config
107107import qualified Database.LSMTree.Internal.Cursor as Cursor
108- import Database.LSMTree.Internal.Entry (Entry )
108+ import Database.LSMTree.Internal.Entry (Entry , NumEntries ( .. ) )
109109import Database.LSMTree.Internal.IncomingRun (IncomingRun (.. ))
110110import Database.LSMTree.Internal.Lookup (ByteCountDiscrepancy ,
111111 ResolveSerialisedValue , lookupsIO ,
112112 lookupsIOWithoutWriteBuffer )
113113import Database.LSMTree.Internal.MergeSchedule
114114import qualified Database.LSMTree.Internal.MergingRun as MR
115115import Database.LSMTree.Internal.MergingTree
116+ import qualified Database.LSMTree.Internal.MergingTree as MT
116117import qualified Database.LSMTree.Internal.MergingTree.Lookup as MT
117118import Database.LSMTree.Internal.Paths (SessionRoot (.. ),
118119 SnapshotMetaDataChecksumFile (.. ),
@@ -1626,32 +1627,56 @@ newtype UnionDebt = UnionDebt Int
16261627
16271628{-# SPECIALISE remainingUnionDebt :: Table IO h -> IO UnionDebt #-}
16281629-- | See 'Database.LSMTree.Normal.remainingUnionDebt'.
1629- remainingUnionDebt :: (MonadSTM m , MonadThrow m ) => Table m h -> m UnionDebt
1630+ remainingUnionDebt ::
1631+ (MonadSTM m , MonadMVar m , MonadThrow m , PrimMonad m )
1632+ => Table m h -> m UnionDebt
16301633remainingUnionDebt t = do
16311634 traceWith (tableTracer t) TraceRemainingUnionDebt
16321635 withOpenTable t $ \ tEnv -> do
1633- RW. withReadAccess (tableContent tEnv) $ \ tableContent ->
1636+ RW. withReadAccess (tableContent tEnv) $ \ tableContent -> do
16341637 case tableUnionLevel tableContent of
1635- NoUnion -> pure (UnionDebt 0 )
1636- Union {} -> error " remainingUnionDebt: not yet implemented"
1638+ NoUnion ->
1639+ pure (UnionDebt 0 )
1640+ Union mt -> do
1641+ (MergeDebt (MergeCredits c), _) <- MT. remainingMergeDebt mt
1642+ pure (UnionDebt c)
16371643
16381644-- | See 'Database.LSMTree.Normal.UnionCredits'.
16391645newtype UnionCredits = UnionCredits Int
16401646 deriving newtype (Show , Eq , Ord , Num )
16411647
1642- {-# SPECIALISE supplyUnionCredits :: Table IO h -> UnionCredits -> IO UnionCredits #-}
1648+ {-# SPECIALISE supplyUnionCredits ::
1649+ ResolveSerialisedValue -> Table IO h -> UnionCredits -> IO UnionCredits #-}
16431650-- | See 'Database.LSMTree.Normal.supplyUnionCredits'.
1644- supplyUnionCredits :: (MonadSTM m , MonadCatch m ) => Table m h -> UnionCredits -> m UnionCredits
1645- supplyUnionCredits t credits = do
1651+ supplyUnionCredits ::
1652+ (MonadST m , MonadSTM m , MonadMVar m , MonadMask m )
1653+ => ResolveSerialisedValue -> Table m h -> UnionCredits -> m UnionCredits
1654+ supplyUnionCredits resolve t credits = do
16461655 traceWith (tableTracer t) $ TraceSupplyUnionCredits credits
16471656 withOpenTable t $ \ tEnv -> do
1648- -- TODO: should this be acquiring read or write access?
1649- RW. withWriteAccess (tableContent tEnv) $ \ tableContent ->
1657+ -- No need to mutate the table content here. In the rare case that we want
1658+ -- to move a completed union level into the regular levels, we can still
1659+ -- take the write lock for that.
1660+ RW. withReadAccess (tableContent tEnv) $ \ tableContent -> do
16501661 case tableUnionLevel tableContent of
1651- NoUnion -> pure (tableContent, credits) -- all leftovers
1652- Union {}
1653- | credits <= UnionCredits 0 -> pure (tableContent, UnionCredits 0 )
1654- -- TODO: remove this 0 special case once the general case covers it.
1655- -- We do not need to optimise the 0 case. It is just here to
1656- -- simplify test coverage.
1657- | otherwise -> error " supplyUnionCredits: not yet implemented"
1662+ NoUnion ->
1663+ pure (max 0 credits) -- all leftovers (but never negative)
1664+ Union mt -> do
1665+ let conf = tableConfig t
1666+ let AllocNumEntries (NumEntries x) = confWriteBufferAlloc conf
1667+ -- We simply use the write buffer size as merge credit threshold, as
1668+ -- the regular level merges also do.
1669+ -- TODO: pick a more suitable threshold or make configurable?
1670+ let thresh = MR. CreditThreshold (MR. UnspentCredits (MergeCredits x))
1671+ MergeCredits leftovers <-
1672+ MT. supplyCredits
1673+ (tableHasFS tEnv)
1674+ (tableHasBlockIO tEnv)
1675+ resolve
1676+ (runParamsForLevel conf UnionLevel )
1677+ thresh
1678+ (tableSessionRoot tEnv)
1679+ (tableSessionUniqCounter tEnv)
1680+ mt
1681+ (let UnionCredits c = credits in MergeCredits c)
1682+ pure (UnionCredits leftovers)
0 commit comments