1- {-# LANGUAGE NoImplicitPrelude #-}
21{-# LANGUAGE OverloadedStrings #-}
32{-# LANGUAGE ScopedTypeVariables #-}
4- {-# LANGUAGE TypeApplications #-}
3+ {-# LANGUAGE NoImplicitPrelude #-}
54
65-- | Snapshot operations for db-sync, using consensus snapshot format.
76--
87-- This module replaces the old custom .lstate snapshot format with
98-- consensus's directory-based format (<slot>[_suffix]/ containing
109-- state, meta, utxoSize files).
11- module Cardano.DbSync.Ledger.Snapshot
12- ( -- * Migration
13- migrateOldSnapshots
14- -- * Save
15- , saveCurrentLedgerState
16- , saveCleanupState
17- , snapshotWriteLoop
18- , runLedgerStateWriteThread
19- -- * Load
20- , loadSnapshotFromDisk
21- , findStateFromSnapshot
22- -- * List / Cleanup
23- , listDiskSnapshots
24- , deleteNewerSnapshots
25- -- * Snapshot points
26- , listKnownSnapshots
27- , getSlotNoSnapshot
28- ) where
10+ module Cardano.DbSync.Ledger.Snapshot (
11+ -- * Migration
12+ migrateOldSnapshots ,
13+
14+ -- * Save
15+ saveCurrentLedgerState ,
16+ saveCleanupState ,
17+ snapshotWriteLoop ,
18+ runLedgerStateWriteThread ,
19+
20+ -- * Load
21+ loadSnapshotFromDisk ,
22+ findStateFromSnapshot ,
23+
24+ -- * List / Cleanup
25+ listDiskSnapshots ,
26+ deleteNewerSnapshots ,
27+
28+ -- * Snapshot points
29+ listKnownSnapshots ,
30+ getSlotNoSnapshot ,
31+ ) where
2932
3033import Cardano.BM.Trace (Trace , logInfo , logWarning )
3134import Cardano.DbSync.Api.Types (LedgerEnv (.. ))
@@ -36,17 +39,17 @@ import Cardano.Prelude hiding (atomically)
3639import Cardano.Slotting.Slot (EpochNo (.. ), WithOrigin (.. ))
3740import Control.Concurrent.Class.MonadSTM.Strict (atomically , readTVar , writeTVar )
3841import Control.Concurrent.STM.TBQueue (readTBQueue , writeTBQueue )
39- import Data.Time.Clock (getCurrentTime , diffUTCTime )
4042import qualified Data.List as List
4143import qualified Data.Strict.Maybe as Strict
44+ import Data.Time.Clock (diffUTCTime , getCurrentTime )
4245import qualified Database.LSMTree as LSMTree
4346import qualified Ouroboros.Consensus.Ledger.Abstract as Consensus
4447import Ouroboros.Consensus.Ledger.Extended (ExtLedgerState (.. ))
45- import qualified Ouroboros.Consensus.Storage.LedgerDB.V2.LedgerSeq as Consensus (StateRef (.. ))
4648import Ouroboros.Consensus.Storage.LedgerDB.Snapshots
49+ import qualified Ouroboros.Consensus.Storage.LedgerDB.V2.LedgerSeq as Consensus (StateRef (.. ))
4750import Ouroboros.Network.Block
4851import qualified Ouroboros.Network.Point as Point
49- import System.Directory (listDirectory , removeFile , doesDirectoryExist )
52+ import System.Directory (doesDirectoryExist , listDirectory , removeFile )
5053import System.FilePath (takeExtension , (</>) )
5154
5255-- | Remove old .lstate files from a previous db-sync version.
@@ -74,8 +77,7 @@ saveCurrentLedgerState env lState _mEpochNo = do
7477
7578-- | Save a snapshot and clean up old ones.
7679saveCleanupState :: HasLedgerEnv -> DbSyncStateRef -> Maybe EpochNo -> IO ()
77- saveCleanupState env ledger mEpochNo =
78- saveCurrentLedgerState env ledger mEpochNo
80+ saveCleanupState = saveCurrentLedgerState
7981
8082-- | The write thread that takes snapshots from the queue.
8183runLedgerStateWriteThread :: Trace IO Text -> LedgerEnv -> IO ()
@@ -107,13 +109,15 @@ snapshotWriteLoop tracer env = loop
107109 , textShow (diffUTCTime endTime startTime)
108110 ]
109111 -- Trim old snapshots after writing the new one
110- let policy = SnapshotPolicy
111- { onDiskNumSnapshots = 3
112- , onDiskShouldTakeSnapshot = \ _ _ -> True
113- }
112+ let policy =
113+ SnapshotPolicy
114+ { onDiskNumSnapshots = 3
115+ , onDiskShouldTakeSnapshot = \ _ _ -> True
116+ }
114117 deleted <- trimSnapshots (leSnapshotManager env) policy
115118 unless (null deleted) $
116- logInfo tracer $ " Trimmed " <> textShow (length deleted) <> " old snapshots"
119+ logInfo tracer $
120+ " Trimmed " <> textShow (length deleted) <> " old snapshots"
117121 loop
118122
119123-- | Load a snapshot from disk using consensus APIs.
@@ -125,12 +129,18 @@ loadSnapshotFromDisk ::
125129 IO (Either Text DbSyncStateRef )
126130loadSnapshotFromDisk env ds = do
127131 startTime <- getCurrentTime
128- eResult <- handle (\ (err :: LSMTree. SnapshotDoesNotExistError ) -> pure $ Left $ textShow err) $
129- leLoadSnapshot env ds
132+ eResult <-
133+ handle (\ (err :: LSMTree. SnapshotDoesNotExistError ) -> pure $ Left $ textShow err) $
134+ leLoadSnapshot env ds
130135 endTime <- getCurrentTime
131136 case eResult of
132- Left err -> pure $ Left $ " Failed to load snapshot " <> textShow (snapshotToDirName ds)
133- <> " : " <> err
137+ Left err ->
138+ pure $
139+ Left $
140+ " Failed to load snapshot "
141+ <> textShow (snapshotToDirName ds)
142+ <> " : "
143+ <> err
134144 Right cRef -> do
135145 logInfo (leTrace env) $
136146 mconcat
@@ -216,7 +226,7 @@ getSlotNoSnapshot (InMemory cp) = pointSlot cp
216226
217227listMemorySnapshots :: HasLedgerEnv -> IO [CardanoPoint ]
218228listMemorySnapshots env = do
219- mState <- atomically $ readTVar $ leStateVar env
229+ mState <- readTVarIO ( leStateVar env)
220230 case mState of
221231 Strict. Nothing -> pure []
222232 Strict. Just ledgerDB ->
0 commit comments