Skip to content

Commit

Permalink
Introduce LMDB backing store implementation (#4366)
Browse files Browse the repository at this point in the history
Co-authored-by: Nick Frisby <nick.frisby@iohk.io>
Co-authored-by: Damian Nadales <damian.nadales@iohk.io>
Co-authored-by: Joris Dral <joris@well-typed.com>
  • Loading branch information
4 people committed Mar 27, 2023
1 parent ff4488c commit 2e9b596
Show file tree
Hide file tree
Showing 15 changed files with 1,101 additions and 128 deletions.
6 changes: 3 additions & 3 deletions cabal.project
Expand Up @@ -18,7 +18,7 @@ index-state:
-- Bump this if you need newer packages from Hackage
, hackage.haskell.org 2023-03-22T00:00:00Z
-- Bump this if you need newer packages from CHaP
, cardano-haskell-packages 2023-02-23T15:33:46Z
, cardano-haskell-packages 2023-03-09T09:27:54Z

packages: ./cardano-ping
./ouroboros-network-testing
Expand Down Expand Up @@ -153,8 +153,8 @@ allow-newer:
source-repository-package
type: git
location: https://github.com/input-output-hk/fs-sim
tag: ed36f48785aa9b2a9cfaa3d783c138180f3bfb9d
--sha256: 1svym9bynaq07wpd28qkwyixnsyxacb5s15lfnxi2v54kvmx4j43
tag: e2e923fee7c540b3a02de1627d73747122f47a53
--sha256: 18d4qw2i9qdfzx5ls78mr5hrglymd4rk603zrqic8sbp5gp352h8
subdir:
fs-api
fs-sim
13 changes: 10 additions & 3 deletions ouroboros-consensus-diffusion/src/Ouroboros/Consensus/Node.hs
Expand Up @@ -85,9 +85,13 @@ import Ouroboros.Consensus.Node.Tracers
import Ouroboros.Consensus.NodeKernel
import Ouroboros.Consensus.Storage.ChainDB (ChainDB, ChainDbArgs)
import qualified Ouroboros.Consensus.Storage.ChainDB as ChainDB
import Ouroboros.Consensus.Storage.FS.API (SomeHasFS (..))
import Ouroboros.Consensus.Storage.FS.API.Types
import Ouroboros.Consensus.Storage.FS.IO (ioHasFS)
import Ouroboros.Consensus.Storage.ImmutableDB (ChunkInfo,
ValidationPolicy (..))
import Ouroboros.Consensus.Storage.LedgerDB (SnapshotInterval (..),
import Ouroboros.Consensus.Storage.LedgerDB
(BackingStoreSelector (..), SnapshotInterval (..),
defaultDiskPolicy)
import Ouroboros.Consensus.Storage.VolatileDB
(BlockValidationPolicy (..))
Expand Down Expand Up @@ -170,6 +174,9 @@ data RunNodeArgs m addrNTN addrNTC blk (p2p :: Diffusion.P2P) = RunNodeArgs {

-- | Network P2P Mode switch
, rnEnableP2P :: NetworkP2PMode p2p

-- | Whether to use the LMDB or the in-memory backend for UTxO-HD.
, rnBackingStoreSelector :: !(BackingStoreSelector m)
}

-- | Arguments that usually only tests /directly/ specify.
Expand Down Expand Up @@ -765,7 +772,7 @@ stdLowLevelRunNodeArgsIO ::
NodeToClientVersionData
blk
p2p)
stdLowLevelRunNodeArgsIO RunNodeArgs{ rnProtocolInfo, rnEnableP2P }
stdLowLevelRunNodeArgsIO RunNodeArgs{ rnProtocolInfo, rnEnableP2P, rnBackingStoreSelector }
StdRunNodeArgs{..} = do
llrnBfcSalt <- stdBfcSaltIO
llrnKeepAliveRng <- stdKeepAliveRngIO
Expand All @@ -775,7 +782,7 @@ stdLowLevelRunNodeArgsIO RunNodeArgs{ rnProtocolInfo, rnEnableP2P }
, llrnCustomiseHardForkBlockchainTimeArgs = id
, llrnKeepAliveRng
, llrnChainDbArgsDefaults =
updateChainDbDefaults $ ChainDB.defaultArgs mkHasFS diskPolicy
updateChainDbDefaults $ ChainDB.defaultArgs mkHasFS diskPolicy rnBackingStoreSelector
, llrnCustomiseChainDbArgs = id
, llrnCustomiseNodeKernelArgs
, llrnRunDataDiffusion =
Expand Down
35 changes: 20 additions & 15 deletions ouroboros-consensus/ouroboros-consensus.cabal
Expand Up @@ -206,7 +206,10 @@ library
Ouroboros.Consensus.Storage.IO
Ouroboros.Consensus.Storage.LedgerDB
Ouroboros.Consensus.Storage.LedgerDB.BackingStore
Ouroboros.Consensus.Storage.LedgerDB.BackingStore.Impl
Ouroboros.Consensus.Storage.LedgerDB.BackingStore.InMemory
Ouroboros.Consensus.Storage.LedgerDB.BackingStore.LMDB
Ouroboros.Consensus.Storage.LedgerDB.BackingStore.LMDB.Bridge
Ouroboros.Consensus.Storage.LedgerDB.BackingStore.Trivial
Ouroboros.Consensus.Storage.LedgerDB.DbChangelog
Ouroboros.Consensus.Storage.LedgerDB.DiffSeq
Expand Down Expand Up @@ -299,19 +302,21 @@ library
ViewPatterns

build-depends:
, base >=4.14 && <4.17
, base >=4.14 && <4.17
, base16-bytestring
, bimap >=0.4 && <0.5
, binary >=0.8 && <0.11
, bytestring >=0.10 && <0.12
, bimap >=0.4 && <0.5
, binary >=0.8 && <0.11
, bytestring >=0.10 && <0.12
, cardano-binary
, cardano-crypto-class
, cardano-ledger-binary
, cardano-lmdb >=0.3.0.0
, cardano-lmdb-simple >=0.6.0.0
, cardano-prelude
, cardano-slotting
, cardano-strict-containers
, cborg >=0.2.2 && <0.3
, containers >=0.5 && <0.7
, cborg >=0.2.2 && <0.3
, containers >=0.5 && <0.7
, contra-tracer
, deepseq
, diff-containers
Expand All @@ -322,24 +327,24 @@ library
, hashable
, io-classes ^>=0.3
, measures
, mtl >=2.2 && <2.3
, nothunks >=0.1.2 && <0.2
, mtl >=2.2 && <2.3
, nothunks >=0.1.2 && <0.2
, ouroboros-network-api
, ouroboros-network-mock
, ouroboros-network-protocols >=0.2
, psqueues >=0.2.3 && <0.3
, quiet >=0.2 && <0.3
, psqueues >=0.2.3 && <0.3
, quiet >=0.2 && <0.3
, semialign >=1.1
, serialise >=0.2 && <0.3
, sop-core >=0.5 && <0.6
, serialise >=0.2 && <0.3
, sop-core >=0.5 && <0.6
, streaming
, strict-stm ^>=0.2
, text >=1.2 && <1.3
, these >=1.1 && <1.2
, text >=1.2 && <1.3
, these >=1.1 && <1.2
, time
, transformers
, typed-protocols
, vector >=0.12 && <0.13
, vector >=0.12 && <0.13

ghc-options:
-Wall -Wcompat -Wincomplete-uni-patterns
Expand Down
Expand Up @@ -26,7 +26,8 @@ import Ouroboros.Consensus.Storage.ChainDB.Impl.Types
(TraceEvent (..))
import Ouroboros.Consensus.Storage.ImmutableDB (ChunkInfo)
import qualified Ouroboros.Consensus.Storage.ImmutableDB as ImmutableDB
import Ouroboros.Consensus.Storage.LedgerDB (DiskPolicy (..))
import Ouroboros.Consensus.Storage.LedgerDB
(BackingStoreSelector (..), DiskPolicy (..))
import qualified Ouroboros.Consensus.Storage.VolatileDB as VolatileDB
import Ouroboros.Consensus.Util.Args
import Ouroboros.Consensus.Util.ResourceRegistry (ResourceRegistry)
Expand Down Expand Up @@ -75,6 +76,10 @@ data ChainDbArgs f m blk = ChainDbArgs {
-- is the maximum number of blocks that could be kept in memory at the
-- same time when the background thread processing the blocks can't keep
-- up.

-- LedgerDB Backing Store
, cdbBackingStoreSelector :: !(BackingStoreSelector m)
-- ^ Which implementation of the backing store to use
}

-- | Arguments specific to the ChainDB, not to the ImmutableDB, VolatileDB, or
Expand Down Expand Up @@ -138,11 +143,12 @@ defaultArgs ::
Monad m
=> (RelativeMountPoint -> SomeHasFS m)
-> DiskPolicy
-> BackingStoreSelector m
-> ChainDbArgs Defaults m blk
defaultArgs mkFS diskPolicy =
defaultArgs mkFS diskPolicy bss =
toChainDbArgs (ImmutableDB.defaultArgs immFS)
(VolatileDB.defaultArgs volFS)
(LgrDB.defaultArgs lgrFS diskPolicy)
(LgrDB.defaultArgs lgrFS diskPolicy bss)
defaultSpecificArgs
where
immFS, volFS, lgrFS :: SomeHasFS m
Expand Down Expand Up @@ -181,13 +187,14 @@ fromChainDbArgs ChainDbArgs{..} = (
, volTracer = contramap TraceVolatileDBEvent cdbTracer
}
, LgrDB.LgrDbArgs {
lgrTopLevelConfig = cdbTopLevelConfig
, lgrHasFS = cdbHasFSLgrDB
, lgrDiskPolicy = cdbDiskPolicy
, lgrGenesis = cdbGenesis
, lgrTracer = contramap TraceSnapshotEvent cdbTracer
, lgrRegistry = cdbRegistry
, lgrTraceLedger = cdbTraceLedger
lgrTopLevelConfig = cdbTopLevelConfig
, lgrHasFS = cdbHasFSLgrDB
, lgrDiskPolicy = cdbDiskPolicy
, lgrGenesis = cdbGenesis
, lgrTracer = contramap TraceLedgerDBEvent cdbTracer
, lgrRegistry = cdbRegistry
, lgrTraceLedger = cdbTraceLedger
, lgrBackingStoreSelector = cdbBackingStoreSelector
}
, ChainDbSpecificArgs {
cdbsTracer = cdbTracer
Expand Down Expand Up @@ -236,6 +243,8 @@ toChainDbArgs ImmutableDB.ImmutableDbArgs {..}
, cdbGcDelay = cdbsGcDelay
, cdbGcInterval = cdbsGcInterval
, cdbBlocksToAddSize = cdbsBlocksToAddSize
-- Backing store
, cdbBackingStoreSelector = lgrBackingStoreSelector
}

{-------------------------------------------------------------------------------
Expand Down
Expand Up @@ -46,6 +46,7 @@ module Ouroboros.Consensus.Storage.ChainDB.Impl.LgrDB (
, LedgerDB.DiskPolicy (..)
, LedgerDB.DiskSnapshot
, LedgerDB.ExceededRollback (..)
, LedgerDB.TraceLedgerDBEvent (..)
, LedgerDB.TraceReplayEvent (..)
, LedgerDB.TraceSnapshotEvent (..)
, LedgerDB.current
Expand All @@ -59,6 +60,7 @@ import Codec.Serialise (Serialise (decode))
import Control.Monad.Trans.Class
import Control.Tracer
import Data.Foldable (foldl')
import Data.Functor.Contravariant ((>$<))
import Data.Set (Set)
import qualified Data.Set as Set
import Data.Word (Word64)
Expand Down Expand Up @@ -133,7 +135,7 @@ data LgrDB m blk = LgrDB {
, cfg :: !(TopLevelConfig blk)
, diskPolicy :: !LedgerDB.DiskPolicy
, hasFS :: !(SomeHasFS m)
, tracer :: !(Tracer m (LedgerDB.TraceSnapshotEvent blk))
, tracer :: !(Tracer m (LedgerDB.TraceLedgerDBEvent blk))
} deriving (Generic)

deriving instance (IOLike m, LedgerSupportsProtocol blk)
Expand All @@ -157,29 +159,32 @@ type LgrDbSerialiseConstraints blk =
-------------------------------------------------------------------------------}

data LgrDbArgs f m blk = LgrDbArgs {
lgrDiskPolicy :: LedgerDB.DiskPolicy
, lgrGenesis :: HKD f (m (ExtLedgerState blk ValuesMK))
, lgrHasFS :: SomeHasFS m
, lgrTopLevelConfig :: HKD f (TopLevelConfig blk)
, lgrTraceLedger :: Tracer m (LedgerDB' blk)
, lgrTracer :: Tracer m (LedgerDB.TraceSnapshotEvent blk)
, lgrRegistry :: HKD f (ResourceRegistry m)
lgrDiskPolicy :: LedgerDB.DiskPolicy
, lgrGenesis :: HKD f (m (ExtLedgerState blk ValuesMK))
, lgrHasFS :: SomeHasFS m
, lgrTopLevelConfig :: HKD f (TopLevelConfig blk)
, lgrTraceLedger :: Tracer m (LedgerDB' blk)
, lgrTracer :: Tracer m (LedgerDB.TraceLedgerDBEvent blk)
, lgrRegistry :: HKD f (ResourceRegistry m)
, lgrBackingStoreSelector :: !(LedgerDB.BackingStoreSelector m)
}

-- | Default arguments
defaultArgs ::
Applicative m
=> SomeHasFS m
-> LedgerDB.DiskPolicy
-> LedgerDB.BackingStoreSelector m
-> LgrDbArgs Defaults m blk
defaultArgs lgrHasFS diskPolicy = LgrDbArgs {
lgrDiskPolicy = diskPolicy
, lgrGenesis = NoDefault
defaultArgs lgrHasFS diskPolicy bss = LgrDbArgs {
lgrDiskPolicy = diskPolicy
, lgrGenesis = NoDefault
, lgrHasFS
, lgrTopLevelConfig = NoDefault
, lgrTraceLedger = nullTracer
, lgrTracer = nullTracer
, lgrRegistry = NoDefault
, lgrTopLevelConfig = NoDefault
, lgrTraceLedger = nullTracer
, lgrTracer = nullTracer
, lgrRegistry = NoDefault
, lgrBackingStoreSelector = bss
}

-- | Open the ledger DB
Expand Down Expand Up @@ -276,6 +281,7 @@ initFromDisk LgrDbArgs { lgrHasFS = hasFS, .. }
(LedgerDB.configLedgerDb lgrTopLevelConfig)
lgrGenesis
(streamAPI immutableDB)
lgrBackingStoreSelector
return (db, replayed, backingStore)
where
ccfg = configCodec lgrTopLevelConfig
Expand Down Expand Up @@ -346,7 +352,7 @@ takeSnapshot lgrDB = wrapFailure (Proxy @blk) $ do
ledgerDB <- LedgerDB.lastFlushedState
<$> atomically (getCurrent lgrDB)
LedgerDB.takeSnapshot
tracer
(LedgerDB.LedgerDBSnapshotEvent >$< tracer)
hasFS
lgrBackingStore
encodeExtLedgerState'
Expand All @@ -367,7 +373,7 @@ trimSnapshots ::
=> LgrDB m blk
-> m [LedgerDB.DiskSnapshot]
trimSnapshots LgrDB { diskPolicy, tracer, hasFS } = wrapFailure (Proxy @blk) $
LedgerDB.trimSnapshots tracer hasFS diskPolicy
LedgerDB.trimSnapshots (LedgerDB.LedgerDBSnapshotEvent >$< tracer) hasFS diskPolicy

getDiskPolicy :: LgrDB m blk -> LedgerDB.DiskPolicy
getDiskPolicy = diskPolicy
Expand Down
Expand Up @@ -491,7 +491,7 @@ getBlockToAdd (BlocksToAdd queue) = atomically $ readTBQueue queue
Trace types
-------------------------------------------------------------------------------}

{-# DEPRECATED TraceLedgerEvent "Use TraceSnapshotEvent"#-}
{-# DEPRECATED TraceLedgerEvent "Use TraceLedgerDBEvent"#-}
-- | Trace type for the various events of the ChainDB.
data TraceEvent blk
= TraceAddBlockEvent (TraceAddBlockEvent blk)
Expand All @@ -501,8 +501,8 @@ data TraceEvent blk
| TraceInitChainSelEvent (TraceInitChainSelEvent blk)
| TraceOpenEvent (TraceOpenEvent blk)
| TraceIteratorEvent (TraceIteratorEvent blk)
| TraceSnapshotEvent (LgrDB.TraceSnapshotEvent blk)
| TraceLedgerEvent (LgrDB.TraceSnapshotEvent blk)
| TraceLedgerDBEvent (LgrDB.TraceLedgerDBEvent blk)
| TraceLedgerEvent (LgrDB.TraceLedgerDBEvent blk)
| TraceLedgerReplayEvent (LgrDB.TraceReplayEvent blk)
| TraceImmutableDBEvent (ImmutableDB.TraceEvent blk)
| TraceVolatileDBEvent (VolatileDB.TraceEvent blk)
Expand Down
Expand Up @@ -6,6 +6,7 @@ module Ouroboros.Consensus.Storage.LedgerDB (
, configLedgerDb
, mkWithAnchor
-- * Initialization
, BackingStoreSelector (..)
, InitLog (..)
, ReplayStart (..)
, initialize
Expand All @@ -14,6 +15,7 @@ module Ouroboros.Consensus.Storage.LedgerDB (
, restoreBackingStore
-- * Trace
, ReplayGoal (..)
, TraceLedgerDBEvent (..)
, TraceReplayEvent (..)
, decorateReplayTracerWithGoal
, decorateReplayTracerWithStart
Expand Down Expand Up @@ -91,9 +93,10 @@ module Ouroboros.Consensus.Storage.LedgerDB (
import Ouroboros.Consensus.Storage.LedgerDB.DiskPolicy
(DiskPolicy (..), SnapshotInterval (..),
TimeSinceLast (..), defaultDiskPolicy)
import Ouroboros.Consensus.Storage.LedgerDB.Init (InitLog (..),
ReplayGoal (..), ReplayStart (..), TraceReplayEvent (..),
decorateReplayTracerWithGoal,
import Ouroboros.Consensus.Storage.LedgerDB.Init
(BackingStoreSelector (..), InitLog (..), ReplayGoal (..),
ReplayStart (..), TraceLedgerDBEvent (..),
TraceReplayEvent (..), decorateReplayTracerWithGoal,
decorateReplayTracerWithStart, initialize, newBackingStore,
newBackingStoreInitialiser, restoreBackingStore)
import Ouroboros.Consensus.Storage.LedgerDB.LedgerDB (LedgerDB (..),
Expand Down

0 comments on commit 2e9b596

Please sign in to comment.