@@ -48,9 +48,9 @@ import Database.LSMTree.Internal.Paths (ActiveDir (..), ForBlob (..),
4848 ForKOps (.. ), NamedSnapshotDir (.. ), RunFsPaths (.. ),
4949 WriteBufferFsPaths (.. ),
5050 fromChecksumsFileForWriteBufferFiles , pathsForRunFiles ,
51- runChecksumsPath , writeBufferBlobPath ,
51+ runChecksumsPath , runPath , writeBufferBlobPath ,
5252 writeBufferChecksumsPath , writeBufferKOpsPath )
53- import Database.LSMTree.Internal.Run (Run )
53+ import Database.LSMTree.Internal.Run (Run , RunParams )
5454import qualified Database.LSMTree.Internal.Run as Run
5555import Database.LSMTree.Internal.RunNumber
5656import Database.LSMTree.Internal.UniqCounter (UniqCounter ,
@@ -156,17 +156,16 @@ instance NFData r => NFData (SnapLevel r) where
156156--
157157data SnapIncomingRun r =
158158 SnapMergingRun ! MergePolicyForLevel
159- ! NumRuns
160- ! MergeDebt -- ^ The total merge debt.
159+ ! NominalDebt
161160 ! NominalCredits -- ^ The nominal credits supplied, and that
162161 -- need to be supplied on snapshot open.
163162 ! (SnapMergingRunState MR. LevelMergeType r )
164163 | SnapSingleRun ! r
165164 deriving stock (Eq , Functor , Foldable , Traversable )
166165
167166instance NFData r => NFData (SnapIncomingRun r ) where
168- rnf (SnapMergingRun a b c d e ) =
169- rnf a `seq` rnf b `seq` rnf c `seq` rnf d `seq` rnf e
167+ rnf (SnapMergingRun a b c d) =
168+ rnf a `seq` rnf b `seq` rnf c `seq` rnf d
170169 rnf (SnapSingleRun a) = rnf a
171170
172171-- | The total number of supplied credits. This total is used on snapshot load
@@ -176,13 +175,13 @@ newtype SuppliedCredits = SuppliedCredits { getSuppliedCredits :: Int }
176175 deriving newtype NFData
177176
178177data SnapMergingRunState t r =
179- SnapCompletedMerge ! r
180- | SnapOngoingMerge ! (V. Vector r ) ! t
178+ SnapCompletedMerge ! NumRuns ! MergeDebt ! r
179+ | SnapOngoingMerge ! RunParams ! MergeCredits ! (V. Vector r ) ! t
181180 deriving stock (Eq , Functor , Foldable , Traversable )
182181
183182instance (NFData t , NFData r ) => NFData (SnapMergingRunState t r ) where
184- rnf (SnapCompletedMerge a) = rnf a
185- rnf (SnapOngoingMerge a b) = rnf a `seq` rnf b
183+ rnf (SnapCompletedMerge a b c) = rnf a `seq` rnf b `seq` rnf c
184+ rnf (SnapOngoingMerge a b c d ) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d
186185
187186{- ------------------------------------------------------------------------------
188187 Conversion to levels snapshot format
@@ -220,31 +219,34 @@ toSnapIncomingRun ir = do
220219 case s of
221220 Left r -> pure $! SnapSingleRun r
222221 Right (mergePolicy,
223- numRuns,
224- _nominalDebt, -- not stored
222+ nominalDebt,
225223 nominalCredits,
226- mergeDebt,
227- _mergeCredits, -- not stored
228- mergingRunState) -> do
224+ mergingRun) -> do
229225 -- We need to know how many credits were supplied so we can restore merge
230226 -- work on snapshot load.
231- -- TODO: MR.snapshot needs to return duplicated run references, and we
232- -- need to arrange to release them when the snapshoting is done.
233- let smrs = toSnapMergingRunState mergingRunState
234- pure $!
235- SnapMergingRun
236- mergePolicy
237- numRuns
238- mergeDebt
239- nominalCredits
240- smrs
227+ smrs <- toSnapMergingRunState mergingRun
228+ pure $! SnapMergingRun mergePolicy nominalDebt nominalCredits smrs
241229
230+ {-# SPECIALISE toSnapMergingRunState ::
231+ Ref (MR.MergingRun t IO h)
232+ -> IO (SnapMergingRunState t (Ref (Run IO h))) #-}
242233toSnapMergingRunState ::
243- MR. MergingRunState t m h
244- -> SnapMergingRunState t (Ref (Run m h ))
245- toSnapMergingRunState = \ case
246- MR. CompletedMerge r -> SnapCompletedMerge r
247- MR. OngoingMerge rs m -> SnapOngoingMerge rs (Merge. mergeType m)
234+ (PrimMonad m , MonadMVar m )
235+ => Ref (MR. MergingRun t m h )
236+ -> m (SnapMergingRunState t (Ref (Run m h )))
237+ toSnapMergingRunState ! mr = do
238+ -- TODO: MR.snapshot needs to return duplicated run references, and we
239+ -- need to arrange to release them when the snapshoting is done.
240+ (numRuns, mergeDebt, mergeCredits, state) <- MR. snapshot mr
241+ case state of
242+ MR. CompletedMerge r ->
243+ pure $! SnapCompletedMerge numRuns mergeDebt r
244+
245+ MR. OngoingMerge rs m ->
246+ pure $! SnapOngoingMerge runParams mergeCredits rs mergeType
247+ where
248+ runParams = Merge. mergeRunParams m
249+ mergeType = Merge. mergeType m
248250
249251{- ------------------------------------------------------------------------------
250252 Write Buffer
@@ -485,35 +487,55 @@ fromSnapLevels reg hfs hbio conf uc resolve dir (SnapLevels levels) =
485487 fromSnapIncomingRun _ln (SnapSingleRun run) =
486488 newIncomingSingleRun run
487489
488- fromSnapIncomingRun ln (SnapMergingRun mergePolicy nr mergeDebt _nc
489- (SnapCompletedMerge r)) = do
490- mr <- MR. newCompleted nr mergeDebt r
491- let nominalDebt = nominalDebtForLevel conf ln
492- nominalCredits = nominalDebtAsCredits nominalDebt
490+ fromSnapIncomingRun ln (SnapMergingRun mergePolicy nominalDebt
491+ nominalCredits smrs) = do
492+ mr <- fromSnapMergingRunState hfs hbio uc resolve dir smrs
493493 ir <- newIncomingMergingRun mergePolicy nominalDebt mr
494- -- This will do no real work, since the mr is completed, it'll just
495- -- set the final nominal credits
494+ -- This will set the correct nominal credits, but it will not do any more
495+ -- merging work because fromSnapMergingRunState already supplies all the
496+ -- merging credits already.
496497 supplyCreditsIncomingRun conf ln ir nominalCredits
497498 return ir
498499
499- fromSnapIncomingRun ln (SnapMergingRun mergePolicy _nr _md nc
500- (SnapOngoingMerge rs mergeType)) =
501- bracketOnError
502- (do uniq <- incrUniqCounter uc
503- let (runParams, runPaths) =
504- mergingRunParamsForLevel dir conf uniq ln
505- MR. new hfs hbio resolve runParams mergeType runPaths rs)
506- releaseRef $ \ mr -> do
507-
508- let nominalDebt = nominalDebtForLevel conf ln
509- ir <- newIncomingMergingRun mergePolicy nominalDebt mr
510-
511- -- When a snapshot is created, merge progress is lost, so we have to
512- -- redo merging work here. The MergeCredits in SnapMergingRun tracks
513- -- how many credits were supplied before the snapshot was taken.
514- -- TODO: bracketOnError the MR.new for this:
515- supplyCreditsIncomingRun conf ln ir nc
516- return ir
500+ {-# SPECIALISE fromSnapMergingRunState ::
501+ MR.IsMergeType t
502+ => HasFS IO h
503+ -> HasBlockIO IO h
504+ -> UniqCounter IO
505+ -> ResolveSerialisedValue
506+ -> ActiveDir
507+ -> SnapMergingRunState t (Ref (Run IO h))
508+ -> IO (Ref (MR.MergingRun t IO h)) #-}
509+ fromSnapMergingRunState ::
510+ (MonadMask m , MonadMVar m , MonadSTM m , MonadST m , MR. IsMergeType t )
511+ => HasFS m h
512+ -> HasBlockIO m h
513+ -> UniqCounter m
514+ -> ResolveSerialisedValue
515+ -> ActiveDir
516+ -> SnapMergingRunState t (Ref (Run m h ))
517+ -> m (Ref (MR. MergingRun t m h ))
518+ fromSnapMergingRunState _hfs _hbio _uc _resolve _dir
519+ (SnapCompletedMerge numRuns mergeDebt r) =
520+ MR. newCompleted numRuns mergeDebt r
521+
522+ fromSnapMergingRunState hfs hbio uc resolve dir
523+ (SnapOngoingMerge runParams mergeCredits
524+ rs mergeType) = do
525+ bracketOnError
526+ (do uniq <- incrUniqCounter uc
527+ let runPaths = runPath dir (uniqueToRunNumber uniq)
528+ MR. new hfs hbio resolve runParams mergeType runPaths rs)
529+ releaseRef $ \ mr -> do
530+ -- When a snapshot is created, merge progress is lost, so we have to
531+ -- redo merging work here. The MergeCredits in SnapMergingRun tracks
532+ -- how many credits were supplied before the snapshot was taken.
533+
534+ -- TODO: the threshold should be stored with the MergingRun
535+ -- here we want to supply the credits now, so we can use a threshold of 1
536+ let thresh = MR. CreditThreshold (MR. UnspentCredits 1 )
537+ _ <- MR. supplyCreditsAbsolute mr thresh mergeCredits
538+ return mr
517539
518540{- ------------------------------------------------------------------------------
519541 Hard links
0 commit comments