Skip to content

Commit 7d13547

Browse files
committed
Use list instead of AnchorSeq for ledger
1 parent c6e2301 commit 7d13547

2 files changed

Lines changed: 28 additions & 32 deletions

File tree

cardano-db-sync/src/Cardano/DbSync/Ledger/State.hs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,8 @@ import Ouroboros.Consensus.Storage.LedgerDB.V2.LSM (Args (LSMArgs), newLSMLedger
125125
import Data.String (fromString)
126126
import qualified Database.LSMTree as LSMTree
127127
import 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
130130
import Ouroboros.Network.Block (HeaderHash, Point (..))
131131
import qualified Ouroboros.Network.Point as Point
132132
import System.Directory (doesFileExist, listDirectory, removeDirectoryRecursive, removeFile)
@@ -137,7 +137,7 @@ import System.FS.IO (ioHasFS)
137137
import System.Mem (performMajorGC)
138138
import System.Random (genWord64, newStdGen)
139139
import 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.
195194
pruneLedgerDb :: Word64 -> LedgerDB -> (LedgerDB, [CardanoLedgerState])
196195
pruneLedgerDb 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
205201
ledgerDbCurrent :: LedgerDB -> CardanoLedgerState
206-
ledgerDbCurrent = either id id . AS.head . ledgerDbCheckpoints
202+
ledgerDbCurrent = NE.head . ledgerDbCheckpoints
207203

208204
mkHasLedgerEnv ::
209205
Trace IO Text ->
@@ -634,47 +630,51 @@ loadLedgerAtPoint :: HasLedgerEnv -> CardanoPoint -> IO (Either [LedgerStateFile
634630
loadLedgerAtPoint 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

679679
deleteNewerFiles :: HasLedgerEnv -> CardanoPoint -> IO ()
680680
deleteNewerFiles 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]

cardano-db-sync/src/Cardano/DbSync/Ledger/Types.hs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ import Cardano.Prelude hiding (atomically)
3333
import Cardano.Slotting.Slot (
3434
EpochNo (..),
3535
SlotNo (..),
36-
WithOrigin (..),
3736
)
3837
import Control.Concurrent.Class.MonadSTM.Strict (
3938
StrictTVar,
@@ -49,14 +48,14 @@ import Lens.Micro (Traversal')
4948
import Ouroboros.Consensus.BlockchainTime.WallClock.Types (SystemStart (..))
5049
import Ouroboros.Consensus.Cardano.Block hiding (CardanoBlock, CardanoLedgerState)
5150
import Ouroboros.Consensus.HardFork.Combinator.Basics (LedgerState (..))
52-
import Ouroboros.Consensus.Ledger.Abstract (getTipSlot)
51+
import Ouroboros.Consensus.Ledger.Abstract ()
5352
import Ouroboros.Consensus.Ledger.Basics (EmptyMK, LedgerTables, ValuesMK)
5453
import Ouroboros.Consensus.Ledger.Extended (ExtLedgerState (..))
5554
import Ouroboros.Consensus.Ledger.Tables (valuesMKDecoder, valuesMKEncoder)
5655
import Ouroboros.Consensus.Storage.LedgerDB.V2.LedgerSeq (LedgerTablesHandle (..))
5756
import qualified Ouroboros.Consensus.Node.ProtocolInfo as Consensus
5857
import Ouroboros.Consensus.Shelley.Ledger (LedgerState (..), ShelleyBlock)
59-
import Ouroboros.Network.AnchoredSeq (Anchorable (..), AnchoredSeq (..))
58+
import Data.List.NonEmpty ()
6059
import Prelude (String, fail, id)
6160

6261
--------------------------------------------------------------------------
@@ -229,14 +228,11 @@ updatedCommittee membersToRemove membersToAdd newQuorum committee =
229228
newCommitteeMembers
230229
newQuorum
231230

231+
-- | In-memory ledger DB. Checkpoints are stored newest-first.
232232
newtype LedgerDB = LedgerDB
233-
{ ledgerDbCheckpoints :: AnchoredSeq (WithOrigin SlotNo) CardanoLedgerState CardanoLedgerState
233+
{ ledgerDbCheckpoints :: NonEmpty CardanoLedgerState
234234
}
235235

236-
instance Anchorable (WithOrigin SlotNo) CardanoLedgerState CardanoLedgerState where
237-
asAnchor = id
238-
getAnchorMeasure _ = getTipSlot . clsState
239-
240236
data SnapshotPoint = OnDisk LedgerStateFile | InMemory CardanoPoint
241237

242238
-- | Per-era pure getters and setters on @NewEpochState@. Note this is a bit of an abuse

0 commit comments

Comments
 (0)