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
@@ -77,7 +74,7 @@ import Ouroboros.Consensus.Util
77
74
import Ouroboros.Consensus.Util.Condense
78
75
import Ouroboros.Consensus.Util.Enclose (Enclosing' (.. ))
79
76
import Ouroboros.Consensus.Util.IOLike
80
- import Ouroboros.Consensus.Util.STM (Watcher (.. ), forkLinkedWatcher )
77
+ import Ouroboros.Consensus.Util.STM (Watcher (.. ), blockUntilJust , forkLinkedWatcher )
81
78
import Ouroboros.Network.AnchoredFragment (AnchoredSeq (.. ))
82
79
import qualified Ouroboros.Network.AnchoredFragment as AF
83
80
@@ -94,15 +91,13 @@ launchBgTasks ::
94
91
, HasHardForkHistory blk
95
92
) =>
96
93
ChainDbEnv m blk ->
97
- -- | Number of immutable blocks replayed on ledger DB startup
98
- Word64 ->
99
94
m ()
100
- launchBgTasks cdb@ CDB {.. } replayed = do
95
+ launchBgTasks cdb@ CDB {.. } = do
101
96
! addBlockThread <-
102
97
launch " ChainDB.addBlockRunner" $
103
98
addBlockRunner cdbChainSelFuse cdb
104
99
105
- ledgerDbTasksTrigger <- newLedgerDbTasksTrigger replayed
100
+ ledgerDbTasksTrigger <- newLedgerDbTasksTrigger
106
101
! ledgerDbMaintenaceThread <-
107
102
forkLinkedWatcher cdbRegistry " ChainDB.ledgerDbTasksTasks" $
108
103
ledgerDbTasksTasks cdb ledgerDbTasksTrigger
@@ -260,18 +255,17 @@ copyToImmutableDBRunner cdb@CDB{..} ledgerDbTasksTrigger gcSchedule fuse = do
260
255
copyAndTrigger :: m ()
261
256
copyAndTrigger = do
262
257
-- Wait for the chain to grow larger than @k@
263
- numToWrite <- atomically $ do
258
+ atomically $ do
264
259
curChain <- icWithoutTime <$> readTVar cdbChain
265
260
check $ fromIntegral (AF. length curChain) > unNonZero k
266
- return $ fromIntegral (AF. length curChain) - unNonZero k
267
261
268
262
-- Copy blocks to ImmutableDB
269
263
--
270
264
-- This is a synchronous operation: when it returns, the blocks have been
271
265
-- copied to disk (though not flushed, necessarily).
272
266
gcSlotNo <- withFuse fuse (copyToImmutableDB cdb)
273
267
274
- triggerLedgerDbTasks ledgerDbTasksTrigger gcSlotNo numToWrite
268
+ triggerLedgerDbTasks ledgerDbTasksTrigger gcSlotNo
275
269
scheduleGC' gcSlotNo
276
270
277
271
scheduleGC' :: WithOrigin SlotNo -> m ()
@@ -293,45 +287,20 @@ copyToImmutableDBRunner cdb@CDB{..} ledgerDbTasksTrigger gcSchedule fuse = do
293
287
-- | Trigger for the LedgerDB maintenance tasks, namely whenever the immutable
294
288
-- DB tip slot advances when we finish copying blocks to it.
295
289
newtype LedgerDbTasksTrigger m
296
- = LedgerDbTasksTrigger (StrictTVar m LedgerDbTaskState )
290
+ = LedgerDbTasksTrigger (StrictTVar m ( WithOrigin SlotNo ) )
297
291
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
319
294
320
295
triggerLedgerDbTasks ::
321
296
forall m .
322
297
IOLike m =>
323
298
LedgerDbTasksTrigger m ->
324
299
-- | New tip of the ImmutableDB.
325
300
WithOrigin SlotNo ->
326
- -- | Number of blocks written to the ImmutableDB.
327
- Word64 ->
328
301
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
335
304
336
305
-- | Run LedgerDB maintenance tasks when 'LedgerDbTasksTrigger' changes.
337
306
--
@@ -343,38 +312,16 @@ ledgerDbTasksTasks ::
343
312
IOLike m =>
344
313
ChainDbEnv m blk ->
345
314
LedgerDbTasksTrigger m ->
346
- Watcher m LedgerDbTaskState ( WithOrigin SlotNo )
315
+ Watcher m SlotNo SlotNo
347
316
ledgerDbTasksTasks CDB {.. } (LedgerDbTasksTrigger varSt) =
348
317
Watcher
349
- { wFingerprint = ldbtsImmTip
318
+ { wFingerprint = id
350
319
, 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
378
325
}
379
326
380
327
{- ------------------------------------------------------------------------------
0 commit comments