1
1
{-# LANGUAGE BangPatterns #-}
2
2
{-# LANGUAGE DeriveAnyClass #-}
3
3
{-# LANGUAGE DeriveGeneric #-}
4
- {-# LANGUAGE DerivingStrategies #-}
5
4
{-# LANGUAGE FlexibleContexts #-}
6
5
{-# LANGUAGE LambdaCase #-}
7
6
{-# LANGUAGE NamedFieldPuns #-}
8
7
{-# LANGUAGE RecordWildCards #-}
9
8
{-# LANGUAGE ScopedTypeVariables #-}
10
- {-# LANGUAGE TupleSections #-}
11
9
12
10
-- | Background tasks:
13
11
--
@@ -53,7 +51,6 @@ import Data.Sequence.Strict (StrictSeq (..))
53
51
import qualified Data.Sequence.Strict as Seq
54
52
import Data.Time.Clock
55
53
import Data.Void (Void )
56
- import Data.Word
57
54
import GHC.Generics (Generic )
58
55
import GHC.Stack (HasCallStack )
59
56
import Ouroboros.Consensus.Block
@@ -76,7 +73,7 @@ import qualified Ouroboros.Consensus.Storage.VolatileDB as VolatileDB
76
73
import Ouroboros.Consensus.Util
77
74
import Ouroboros.Consensus.Util.Condense
78
75
import Ouroboros.Consensus.Util.IOLike
79
- import Ouroboros.Consensus.Util.STM (Watcher (.. ), forkLinkedWatcher )
76
+ import Ouroboros.Consensus.Util.STM (Watcher (.. ), blockUntilJust , forkLinkedWatcher )
80
77
import Ouroboros.Network.AnchoredFragment (AnchoredSeq (.. ))
81
78
import qualified Ouroboros.Network.AnchoredFragment as AF
82
79
@@ -93,15 +90,13 @@ launchBgTasks ::
93
90
, HasHardForkHistory blk
94
91
) =>
95
92
ChainDbEnv m blk ->
96
- -- | Number of immutable blocks replayed on ledger DB startup
97
- Word64 ->
98
93
m ()
99
- launchBgTasks cdb@ CDB {.. } replayed = do
94
+ launchBgTasks cdb@ CDB {.. } = do
100
95
! addBlockThread <-
101
96
launch " ChainDB.addBlockRunner" $
102
97
addBlockRunner cdbChainSelFuse cdb
103
98
104
- ledgerDbTasksTrigger <- newLedgerDbTasksTrigger replayed
99
+ ledgerDbTasksTrigger <- newLedgerDbTasksTrigger
105
100
! ledgerDbMaintenaceThread <-
106
101
forkLinkedWatcher cdbRegistry " ChainDB.ledgerDbTaskWatcher" $
107
102
ledgerDbTaskWatcher cdb ledgerDbTasksTrigger
@@ -259,18 +254,17 @@ copyToImmutableDBRunner cdb@CDB{..} ledgerDbTasksTrigger gcSchedule fuse = do
259
254
copyAndTrigger :: m ()
260
255
copyAndTrigger = do
261
256
-- Wait for the chain to grow larger than @k@
262
- numToWrite <- atomically $ do
257
+ atomically $ do
263
258
curChain <- icWithoutTime <$> readTVar cdbChain
264
259
check $ fromIntegral (AF. length curChain) > unNonZero k
265
- return $ fromIntegral (AF. length curChain) - unNonZero k
266
260
267
261
-- Copy blocks to ImmutableDB
268
262
--
269
263
-- This is a synchronous operation: when it returns, the blocks have been
270
264
-- copied to disk (though not flushed, necessarily).
271
265
gcSlotNo <- withFuse fuse (copyToImmutableDB cdb)
272
266
273
- triggerLedgerDbTasks ledgerDbTasksTrigger gcSlotNo numToWrite
267
+ triggerLedgerDbTasks ledgerDbTasksTrigger gcSlotNo
274
268
scheduleGC' gcSlotNo
275
269
276
270
scheduleGC' :: WithOrigin SlotNo -> m ()
@@ -292,45 +286,20 @@ copyToImmutableDBRunner cdb@CDB{..} ledgerDbTasksTrigger gcSchedule fuse = do
292
286
-- | Trigger for the LedgerDB maintenance tasks, namely whenever the immutable
293
287
-- DB tip slot advances when we finish copying blocks to it.
294
288
newtype LedgerDbTasksTrigger m
295
- = LedgerDbTasksTrigger (StrictTVar m LedgerDbTaskState )
289
+ = LedgerDbTasksTrigger (StrictTVar m ( WithOrigin SlotNo ) )
296
290
297
- data LedgerDbTaskState = LedgerDbTaskState
298
- { ldbtsImmTip :: ! (WithOrigin SlotNo )
299
- , ldbtsPrevSnapshotTime :: ! (Maybe Time )
300
- , ldbtsBlocksSinceLastSnapshot :: ! Word64
301
- }
302
- deriving stock Generic
303
- deriving anyclass NoThunks
304
-
305
- newLedgerDbTasksTrigger ::
306
- IOLike m =>
307
- -- | Number of blocks replayed.
308
- Word64 ->
309
- m (LedgerDbTasksTrigger m )
310
- newLedgerDbTasksTrigger replayed = LedgerDbTasksTrigger <$> newTVarIO st
311
- where
312
- st =
313
- LedgerDbTaskState
314
- { ldbtsImmTip = Origin
315
- , ldbtsPrevSnapshotTime = Nothing
316
- , ldbtsBlocksSinceLastSnapshot = replayed
317
- }
291
+ newLedgerDbTasksTrigger :: IOLike m => m (LedgerDbTasksTrigger m )
292
+ newLedgerDbTasksTrigger = LedgerDbTasksTrigger <$> newTVarIO Origin
318
293
319
294
triggerLedgerDbTasks ::
320
295
forall m .
321
296
IOLike m =>
322
297
LedgerDbTasksTrigger m ->
323
298
-- | New tip of the ImmutableDB.
324
299
WithOrigin SlotNo ->
325
- -- | Number of blocks written to the ImmutableDB.
326
- Word64 ->
327
300
m ()
328
- triggerLedgerDbTasks (LedgerDbTasksTrigger varSt) immTip numWritten =
329
- atomically $ modifyTVar varSt $ \ st ->
330
- st
331
- { ldbtsImmTip = immTip
332
- , ldbtsBlocksSinceLastSnapshot = ldbtsBlocksSinceLastSnapshot st + numWritten
333
- }
301
+ triggerLedgerDbTasks (LedgerDbTasksTrigger varSt) =
302
+ atomically . writeTVar varSt
334
303
335
304
-- | Run LedgerDB maintenance tasks when 'LedgerDbTasksTrigger' changes.
336
305
--
@@ -342,38 +311,16 @@ ledgerDbTaskWatcher ::
342
311
IOLike m =>
343
312
ChainDbEnv m blk ->
344
313
LedgerDbTasksTrigger m ->
345
- Watcher m LedgerDbTaskState ( WithOrigin SlotNo )
314
+ Watcher m SlotNo SlotNo
346
315
ledgerDbTaskWatcher CDB {.. } (LedgerDbTasksTrigger varSt) =
347
316
Watcher
348
- { wFingerprint = ldbtsImmTip
317
+ { wFingerprint = id
349
318
, wInitial = Nothing
350
- , wReader = readTVar varSt
351
- , wNotify =
352
- \ LedgerDbTaskState
353
- { ldbtsImmTip
354
- , ldbtsBlocksSinceLastSnapshot = blocksSinceLast
355
- , ldbtsPrevSnapshotTime = prevSnapTime
356
- } ->
357
- whenJust (withOriginToMaybe ldbtsImmTip) $ \ slotNo -> do
358
- LedgerDB. tryFlush cdbLedgerDB
359
-
360
- now <- getMonotonicTime
361
- LedgerDB. SnapCounters
362
- { prevSnapshotTime
363
- , ntBlocksSinceLastSnap
364
- } <-
365
- LedgerDB. tryTakeSnapshot
366
- cdbLedgerDB
367
- ((,now) <$> prevSnapTime)
368
- blocksSinceLast
369
- atomically $ modifyTVar varSt $ \ st ->
370
- st
371
- { ldbtsBlocksSinceLastSnapshot =
372
- ldbtsBlocksSinceLastSnapshot st - blocksSinceLast + ntBlocksSinceLastSnap
373
- , ldbtsPrevSnapshotTime = prevSnapshotTime
374
- }
375
-
376
- LedgerDB. garbageCollect cdbLedgerDB slotNo
319
+ , wReader = blockUntilJust $ withOriginToMaybe <$> readTVar varSt
320
+ , wNotify = \ slotNo -> do
321
+ LedgerDB. tryFlush cdbLedgerDB
322
+ LedgerDB. tryTakeSnapshot cdbLedgerDB
323
+ LedgerDB. garbageCollect cdbLedgerDB slotNo
377
324
}
378
325
379
326
{- ------------------------------------------------------------------------------
0 commit comments