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--
@@ -52,7 +50,6 @@ import Data.Sequence.Strict (StrictSeq (..))
5250import qualified Data.Sequence.Strict as Seq
5351import Data.Time.Clock
5452import Data.Void (Void )
55- import Data.Word
5653import GHC.Generics (Generic )
5754import GHC.Stack (HasCallStack )
5855import Ouroboros.Consensus.Block
@@ -75,7 +72,7 @@ import qualified Ouroboros.Consensus.Storage.VolatileDB as VolatileDB
7572import Ouroboros.Consensus.Util
7673import Ouroboros.Consensus.Util.Condense
7774import Ouroboros.Consensus.Util.IOLike
78- import Ouroboros.Consensus.Util.STM (Watcher (.. ), forkLinkedWatcher )
75+ import Ouroboros.Consensus.Util.STM (Watcher (.. ), blockUntilJust , forkLinkedWatcher )
7976import Ouroboros.Network.AnchoredFragment (AnchoredSeq (.. ))
8077import qualified Ouroboros.Network.AnchoredFragment as AF
8178
@@ -92,15 +89,13 @@ launchBgTasks ::
9289 , HasHardForkHistory blk
9390 ) =>
9491 ChainDbEnv m blk ->
95- -- | Number of immutable blocks replayed on ledger DB startup
96- Word64 ->
9792 m ()
98- launchBgTasks cdb@ CDB {.. } replayed = do
93+ launchBgTasks cdb@ CDB {.. } = do
9994 ! addBlockThread <-
10095 launch " ChainDB.addBlockRunner" $
10196 addBlockRunner cdbChainSelFuse cdb
10297
103- ledgerDbTasksTrigger <- newLedgerDbTasksTrigger replayed
98+ ledgerDbTasksTrigger <- newLedgerDbTasksTrigger
10499 ! ledgerDbMaintenaceThread <-
105100 forkLinkedWatcher cdbRegistry " ChainDB.ledgerDbTaskWatcher" $
106101 ledgerDbTaskWatcher cdb ledgerDbTasksTrigger
@@ -259,20 +254,18 @@ copyToImmutableDBRunner cdb@CDB{..} ledgerDbTasksTrigger gcSchedule fuse = do
259254 copyAndTrigger :: m ()
260255 copyAndTrigger = do
261256 -- Wait for 'cdbChain' to become longer than 'getCurrentChain'.
262- numToWrite <- atomically $ do
257+ atomically $ do
263258 curChain <- icWithoutTime <$> readTVar cdbChain
264259 curChainVolSuffix <- Query. getCurrentChain cdb
265- let numToWrite = AF. length curChain - AF. length curChainVolSuffix
266- check $ numToWrite > 0
267- return $ fromIntegral numToWrite
260+ check $ AF. length curChain > AF. length curChainVolSuffix
268261
269262 -- Copy blocks to ImmutableDB
270263 --
271264 -- This is a synchronous operation: when it returns, the blocks have been
272265 -- copied to disk (though not flushed, necessarily).
273266 gcSlotNo <- withFuse fuse (copyToImmutableDB cdb)
274267
275- triggerLedgerDbTasks ledgerDbTasksTrigger gcSlotNo numToWrite
268+ triggerLedgerDbTasks ledgerDbTasksTrigger gcSlotNo
276269 scheduleGC' gcSlotNo
277270
278271 scheduleGC' :: WithOrigin SlotNo -> m ()
@@ -294,45 +287,20 @@ copyToImmutableDBRunner cdb@CDB{..} ledgerDbTasksTrigger gcSchedule fuse = do
294287-- | Trigger for the LedgerDB maintenance tasks, namely whenever the immutable
295288-- DB tip slot advances when we finish copying blocks to it.
296289newtype LedgerDbTasksTrigger m
297- = LedgerDbTasksTrigger (StrictTVar m LedgerDbTaskState )
290+ = LedgerDbTasksTrigger (StrictTVar m ( WithOrigin SlotNo ) )
298291
299- data LedgerDbTaskState = LedgerDbTaskState
300- { ldbtsImmTip :: ! (WithOrigin SlotNo )
301- , ldbtsPrevSnapshotTime :: ! (Maybe Time )
302- , ldbtsBlocksSinceLastSnapshot :: ! Word64
303- }
304- deriving stock Generic
305- deriving anyclass NoThunks
306-
307- newLedgerDbTasksTrigger ::
308- IOLike m =>
309- -- | Number of blocks replayed.
310- Word64 ->
311- m (LedgerDbTasksTrigger m )
312- newLedgerDbTasksTrigger replayed = LedgerDbTasksTrigger <$> newTVarIO st
313- where
314- st =
315- LedgerDbTaskState
316- { ldbtsImmTip = Origin
317- , ldbtsPrevSnapshotTime = Nothing
318- , ldbtsBlocksSinceLastSnapshot = replayed
319- }
292+ newLedgerDbTasksTrigger :: IOLike m => m (LedgerDbTasksTrigger m )
293+ newLedgerDbTasksTrigger = LedgerDbTasksTrigger <$> newTVarIO Origin
320294
321295triggerLedgerDbTasks ::
322296 forall m .
323297 IOLike m =>
324298 LedgerDbTasksTrigger m ->
325299 -- | New tip of the ImmutableDB.
326300 WithOrigin SlotNo ->
327- -- | Number of blocks written to the ImmutableDB.
328- Word64 ->
329301 m ()
330- triggerLedgerDbTasks (LedgerDbTasksTrigger varSt) immTip numWritten =
331- atomically $ modifyTVar varSt $ \ st ->
332- st
333- { ldbtsImmTip = immTip
334- , ldbtsBlocksSinceLastSnapshot = ldbtsBlocksSinceLastSnapshot st + numWritten
335- }
302+ triggerLedgerDbTasks (LedgerDbTasksTrigger varSt) =
303+ atomically . writeTVar varSt
336304
337305-- | Run LedgerDB maintenance tasks when 'LedgerDbTasksTrigger' changes.
338306--
@@ -344,38 +312,16 @@ ledgerDbTaskWatcher ::
344312 IOLike m =>
345313 ChainDbEnv m blk ->
346314 LedgerDbTasksTrigger m ->
347- Watcher m LedgerDbTaskState ( WithOrigin SlotNo )
315+ Watcher m SlotNo SlotNo
348316ledgerDbTaskWatcher CDB {.. } (LedgerDbTasksTrigger varSt) =
349317 Watcher
350- { wFingerprint = ldbtsImmTip
318+ { wFingerprint = id
351319 , wInitial = Nothing
352- , wReader = readTVar varSt
353- , wNotify =
354- \ LedgerDbTaskState
355- { ldbtsImmTip
356- , ldbtsBlocksSinceLastSnapshot = blocksSinceLast
357- , ldbtsPrevSnapshotTime = prevSnapTime
358- } ->
359- whenJust (withOriginToMaybe ldbtsImmTip) $ \ slotNo -> do
360- LedgerDB. tryFlush cdbLedgerDB
361-
362- now <- getMonotonicTime
363- LedgerDB. SnapCounters
364- { prevSnapshotTime
365- , ntBlocksSinceLastSnap
366- } <-
367- LedgerDB. tryTakeSnapshot
368- cdbLedgerDB
369- ((,now) <$> prevSnapTime)
370- blocksSinceLast
371- atomically $ modifyTVar varSt $ \ st ->
372- st
373- { ldbtsBlocksSinceLastSnapshot =
374- ldbtsBlocksSinceLastSnapshot st - blocksSinceLast + ntBlocksSinceLastSnap
375- , ldbtsPrevSnapshotTime = prevSnapshotTime
376- }
377-
378- 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
379325 }
380326
381327{- ------------------------------------------------------------------------------
0 commit comments