@@ -125,8 +125,8 @@ import Ouroboros.Consensus.Storage.LedgerDB.V2.LSM (Args (LSMArgs), newLSMLedger
125125import Data.String (fromString )
126126import qualified Database.LSMTree as LSMTree
127127import Ouroboros.Consensus.Storage.Serialisation (DecodeDisk (.. ), EncodeDisk (.. ))
128- import Ouroboros.Network.AnchoredSeq ( AnchoredSeq ( .. ) )
129- import qualified Ouroboros.Network.AnchoredSeq as AS
128+ import Data.List.NonEmpty ( )
129+ import qualified Data.List.NonEmpty as NE
130130import Ouroboros.Network.Block (HeaderHash , Point (.. ))
131131import qualified Ouroboros.Network.Point as Point
132132import System.Directory (doesFileExist , listDirectory , removeDirectoryRecursive , removeFile )
@@ -137,7 +137,7 @@ import System.FS.IO (ioHasFS)
137137import System.Mem (performMajorGC )
138138import System.Random (genWord64 , newStdGen )
139139import Control.Tracer (nullTracer )
140- import Prelude (String , id )
140+ import Prelude (String )
141141
142142-- Note: The decision on whether a ledger-state is written to disk is based on the block number
143143-- rather than the slot number because while the block number is fully populated (for every block
@@ -186,24 +186,20 @@ pushLedgerDB db st =
186186 pruneLedgerDb
187187 100
188188 db
189- { ledgerDbCheckpoints = ledgerDbCheckpoints db :> st
189+ { ledgerDbCheckpoints = NE. cons st (ledgerDbCheckpoints db)
190190 }
191191
192- -- | Prune snapshots until at we have at most @k@ snapshots in the LedgerDB,
193- -- excluding the snapshots stored at the anchor. Returns the pruned DB and
194- -- the dropped states.
192+ -- | Prune snapshots until we have at most @k@ snapshots in the LedgerDB.
193+ -- Returns the pruned DB and the dropped states whose handles should be closed.
195194pruneLedgerDb :: Word64 -> LedgerDB -> (LedgerDB , [CardanoLedgerState ])
196195pruneLedgerDb k db =
197- let old = ledgerDbCheckpoints db
198- new = AS. anchorNewest k old
199- nDrop = AS. length old - AS. length new
200- dropped = take nDrop (AS. toOldestFirst old)
201- in (db {ledgerDbCheckpoints = new}, dropped)
196+ let (kept, dropped) = splitAt (fromIntegral k) (NE. toList $ ledgerDbCheckpoints db)
197+ in (db {ledgerDbCheckpoints = NE. fromList kept}, dropped)
202198{-# INLINE pruneLedgerDb #-}
203199
204200-- | The ledger state at the tip of the chain
205201ledgerDbCurrent :: LedgerDB -> CardanoLedgerState
206- ledgerDbCurrent = either id id . AS .head . ledgerDbCheckpoints
202+ ledgerDbCurrent = NE .head . ledgerDbCheckpoints
207203
208204mkHasLedgerEnv ::
209205 Trace IO Text ->
@@ -634,47 +630,51 @@ loadLedgerAtPoint :: HasLedgerEnv -> CardanoPoint -> IO (Either [LedgerStateFile
634630loadLedgerAtPoint hasLedgerEnv point = do
635631 mLedgerDB <- atomically $ readTVar $ leStateVar hasLedgerEnv
636632 -- First try to find the ledger in memory
637- let mAnchoredSeq = rollbackLedger mLedgerDB
638- case mAnchoredSeq of
633+ let mStates = rollbackLedger mLedgerDB
634+ case mStates of
639635 Nothing -> do
640636 -- Ledger states are growing to become very big in memory.
641637 -- Before parsing the new ledger state we need to make sure the old states
642638 -- are or can be garbage collected.
643639 -- TODO: re-enable once we duplicate handles before queuing snapshots
644640 -- case mLedgerDB of
645641 -- Strict.Nothing -> pure ()
646- -- Strict.Just db -> mapM_ (close . clsTables) (AS.toOldestFirst $ ledgerDbCheckpoints db)
642+ -- Strict.Just db -> mapM_ (close . clsTables) (reverse . NE.toList $ ledgerDbCheckpoints db)
647643 writeLedgerState hasLedgerEnv Strict. Nothing
648644 performMajorGC
649645 mst <- findStateFromPoint hasLedgerEnv point
650646 case mst of
651647 Right st -> do
652- writeLedgerState hasLedgerEnv (Strict. Just . LedgerDB $ AS. Empty st )
648+ writeLedgerState hasLedgerEnv (Strict. Just . LedgerDB $ st :| [] )
653649 logInfo (leTrace hasLedgerEnv) $ mconcat [" Found snapshot file for " , renderPoint point]
654650 pure $ Right st
655651 Left lsfs -> pure $ Left lsfs
656- Just anchoredSeq ' -> do
652+ Just states ' -> do
657653 logInfo (leTrace hasLedgerEnv) $ mconcat [" Found in memory ledger snapshot at " , renderPoint point]
658654 -- TODO: re-enable once we duplicate handles before queuing snapshots
659- -- let nKept = AS .length anchoredSeq '
655+ -- let nKept = NE .length states '
660656 -- case mLedgerDB of
661657 -- Strict.Just db ->
662- -- let dropped = drop nKept (AS.toOldestFirst $ ledgerDbCheckpoints db)
658+ -- let dropped = drop nKept (reverse . NE.toList $ ledgerDbCheckpoints db)
663659 -- in mapM_ (close . clsTables) dropped
664660 -- Strict.Nothing -> pure ()
665- let ledgerDB' = LedgerDB anchoredSeq '
661+ let ledgerDB' = LedgerDB states '
666662 let st = ledgerDbCurrent ledgerDB'
667663 deleteNewerFiles hasLedgerEnv point
668664 writeLedgerState hasLedgerEnv $ Strict. Just ledgerDB'
669665 pure $ Right st
670666 where
671667 rollbackLedger ::
672668 Strict. Maybe LedgerDB ->
673- Maybe (AnchoredSeq ( WithOrigin SlotNo ) CardanoLedgerState CardanoLedgerState )
669+ Maybe (NonEmpty CardanoLedgerState )
674670 rollbackLedger mLedgerDB = case mLedgerDB of
675671 Strict. Nothing -> Nothing
676672 Strict. Just ledgerDB ->
677- AS. rollback (pointSlot point) (const True ) (ledgerDbCheckpoints ledgerDB)
673+ -- Drop states newer than the rollback point (list is newest-first)
674+ NE. nonEmpty $
675+ dropWhile
676+ (\ st -> Consensus. getTipSlot (clsState st) > pointSlot point)
677+ (NE. toList $ ledgerDbCheckpoints ledgerDB)
678678
679679deleteNewerFiles :: HasLedgerEnv -> CardanoPoint -> IO ()
680680deleteNewerFiles env point = do
@@ -898,7 +898,7 @@ listMemorySnapshots env = do
898898 (castPoint . Consensus. getTip . clsState <$> getEdgePoints ledgerDB)
899899 where
900900 getEdgePoints ldb =
901- case AS. toNewestFirst $ ledgerDbCheckpoints ldb of
901+ case NE. toList $ ledgerDbCheckpoints ldb of
902902 [] -> []
903903 [a] -> [a]
904904 (h : ls) -> catMaybes [Just h, lastMay ls]
0 commit comments