11{-# LANGUAGE BangPatterns #-}
22{-# LANGUAGE DeriveAnyClass #-}
33{-# LANGUAGE DeriveGeneric #-}
4- {-# LANGUAGE DerivingStrategies #-}
54{-# LANGUAGE FlexibleContexts #-}
65{-# LANGUAGE LambdaCase #-}
76{-# LANGUAGE NamedFieldPuns #-}
87{-# LANGUAGE RecordWildCards #-}
98{-# LANGUAGE ScopedTypeVariables #-}
10- {-# LANGUAGE TupleSections #-}
119
1210-- | Background tasks:
1311--
@@ -53,7 +51,6 @@ import Data.Sequence.Strict (StrictSeq (..))
5351import qualified Data.Sequence.Strict as Seq
5452import Data.Time.Clock
5553import Data.Void (Void )
56- import Data.Word
5754import GHC.Generics (Generic )
5855import GHC.Stack (HasCallStack )
5956import Ouroboros.Consensus.Block
@@ -77,7 +74,7 @@ import Ouroboros.Consensus.Util
7774import Ouroboros.Consensus.Util.Condense
7875import Ouroboros.Consensus.Util.Enclose (Enclosing' (.. ))
7976import Ouroboros.Consensus.Util.IOLike
80- import Ouroboros.Consensus.Util.STM (Watcher (.. ), forkLinkedWatcher )
77+ import Ouroboros.Consensus.Util.STM (Watcher (.. ), blockUntilJust , forkLinkedWatcher )
8178import Ouroboros.Network.AnchoredFragment (AnchoredSeq (.. ))
8279import qualified Ouroboros.Network.AnchoredFragment as AF
8380
@@ -94,15 +91,13 @@ launchBgTasks ::
9491 , HasHardForkHistory blk
9592 ) =>
9693 ChainDbEnv m blk ->
97- -- | Number of immutable blocks replayed on ledger DB startup
98- Word64 ->
9994 m ()
100- launchBgTasks cdb@ CDB {.. } replayed = do
95+ launchBgTasks cdb@ CDB {.. } = do
10196 ! addBlockThread <-
10297 launch " ChainDB.addBlockRunner" $
10398 addBlockRunner cdbChainSelFuse cdb
10499
105- ledgerDbTasksTrigger <- newLedgerDbTasksTrigger replayed
100+ ledgerDbTasksTrigger <- newLedgerDbTasksTrigger
106101 ! ledgerDbMaintenaceThread <-
107102 forkLinkedWatcher cdbRegistry " ChainDB.ledgerDbTasksTasks" $
108103 ledgerDbTasksTasks cdb ledgerDbTasksTrigger
@@ -260,18 +255,17 @@ copyToImmutableDBRunner cdb@CDB{..} ledgerDbTasksTrigger gcSchedule fuse = do
260255 copyAndTrigger :: m ()
261256 copyAndTrigger = do
262257 -- Wait for the chain to grow larger than @k@
263- numToWrite <- atomically $ do
258+ atomically $ do
264259 curChain <- icWithoutTime <$> readTVar cdbChain
265260 check $ fromIntegral (AF. length curChain) > unNonZero k
266- return $ fromIntegral (AF. length curChain) - unNonZero k
267261
268262 -- Copy blocks to ImmutableDB
269263 --
270264 -- This is a synchronous operation: when it returns, the blocks have been
271265 -- copied to disk (though not flushed, necessarily).
272266 gcSlotNo <- withFuse fuse (copyToImmutableDB cdb)
273267
274- triggerLedgerDbTasks ledgerDbTasksTrigger gcSlotNo numToWrite
268+ triggerLedgerDbTasks ledgerDbTasksTrigger gcSlotNo
275269 scheduleGC' gcSlotNo
276270
277271 scheduleGC' :: WithOrigin SlotNo -> m ()
@@ -293,45 +287,20 @@ copyToImmutableDBRunner cdb@CDB{..} ledgerDbTasksTrigger gcSchedule fuse = do
293287-- | Trigger for the LedgerDB maintenance tasks, namely whenever the immutable
294288-- DB tip slot advances when we finish copying blocks to it.
295289newtype LedgerDbTasksTrigger m
296- = LedgerDbTasksTrigger (StrictTVar m LedgerDbTaskState )
290+ = LedgerDbTasksTrigger (StrictTVar m ( WithOrigin SlotNo ) )
297291
298- data LedgerDbTaskState = LedgerDbTaskState
299- { ldbtsImmTip :: ! (WithOrigin SlotNo )
300- , ldbtsPrevSnapshotTime :: ! (Maybe Time )
301- , ldbtsBlocksSinceLastSnapshot :: ! Word64
302- }
303- deriving stock Generic
304- deriving anyclass NoThunks
305-
306- newLedgerDbTasksTrigger ::
307- IOLike m =>
308- -- | Number of blocks replayed.
309- Word64 ->
310- m (LedgerDbTasksTrigger m )
311- newLedgerDbTasksTrigger replayed = LedgerDbTasksTrigger <$> newTVarIO st
312- where
313- st =
314- LedgerDbTaskState
315- { ldbtsImmTip = Origin
316- , ldbtsPrevSnapshotTime = Nothing
317- , ldbtsBlocksSinceLastSnapshot = replayed
318- }
292+ newLedgerDbTasksTrigger :: IOLike m => m (LedgerDbTasksTrigger m )
293+ newLedgerDbTasksTrigger = LedgerDbTasksTrigger <$> newTVarIO Origin
319294
320295triggerLedgerDbTasks ::
321296 forall m .
322297 IOLike m =>
323298 LedgerDbTasksTrigger m ->
324299 -- | New tip of the ImmutableDB.
325300 WithOrigin SlotNo ->
326- -- | Number of blocks written to the ImmutableDB.
327- Word64 ->
328301 m ()
329- triggerLedgerDbTasks (LedgerDbTasksTrigger varSt) immTip numWritten =
330- atomically $ modifyTVar varSt $ \ st ->
331- st
332- { ldbtsImmTip = immTip
333- , ldbtsBlocksSinceLastSnapshot = ldbtsBlocksSinceLastSnapshot st + numWritten
334- }
302+ triggerLedgerDbTasks (LedgerDbTasksTrigger varSt) =
303+ atomically . writeTVar varSt
335304
336305-- | Run LedgerDB maintenance tasks when 'LedgerDbTasksTrigger' changes.
337306--
@@ -343,38 +312,16 @@ ledgerDbTasksTasks ::
343312 IOLike m =>
344313 ChainDbEnv m blk ->
345314 LedgerDbTasksTrigger m ->
346- Watcher m LedgerDbTaskState ( WithOrigin SlotNo )
315+ Watcher m SlotNo SlotNo
347316ledgerDbTasksTasks CDB {.. } (LedgerDbTasksTrigger varSt) =
348317 Watcher
349- { wFingerprint = ldbtsImmTip
318+ { wFingerprint = id
350319 , wInitial = Nothing
351- , wReader = readTVar varSt
352- , wNotify =
353- \ LedgerDbTaskState
354- { ldbtsImmTip
355- , ldbtsBlocksSinceLastSnapshot = blocksSinceLast
356- , ldbtsPrevSnapshotTime = prevSnapTime
357- } ->
358- whenJust (withOriginToMaybe ldbtsImmTip) $ \ slotNo -> do
359- LedgerDB. tryFlush cdbLedgerDB
360-
361- now <- getMonotonicTime
362- LedgerDB. SnapCounters
363- { prevSnapshotTime
364- , ntBlocksSinceLastSnap
365- } <-
366- LedgerDB. tryTakeSnapshot
367- cdbLedgerDB
368- ((,now) <$> prevSnapTime)
369- blocksSinceLast
370- atomically $ modifyTVar varSt $ \ st ->
371- st
372- { ldbtsBlocksSinceLastSnapshot =
373- ldbtsBlocksSinceLastSnapshot st - blocksSinceLast + ntBlocksSinceLastSnap
374- , ldbtsPrevSnapshotTime = prevSnapshotTime
375- }
376-
377- LedgerDB. garbageCollect cdbLedgerDB slotNo
320+ , wReader = blockUntilJust $ withOriginToMaybe <$> readTVar varSt
321+ , wNotify = \ slotNo -> do
322+ LedgerDB. tryFlush cdbLedgerDB
323+ LedgerDB. tryTakeSnapshot cdbLedgerDB
324+ LedgerDB. garbageCollect cdbLedgerDB slotNo
378325 }
379326
380327{- ------------------------------------------------------------------------------
0 commit comments