Skip to content

Commit

Permalink
diffusion: p2p and non-p2p diffusion
Browse files Browse the repository at this point in the history
`Ouroboros.Network.Diffusion` offers p2p and non-p2p API. The following
commit integrates this with `ouroboros-consensus` which can pick either
of them depending on a configuration option.

- `Ouroboros.Network.Diffusion` unified API which allows to run
  diffusion in both modes: p2p and non-p2p
- `Ouroboros.Network.Diffusion.P2P` offers the peer-to-peer diffusion
  API
- `Ouroboros.Network.Diffusion.NonP2P` offers the master branch's
  diffusion API
- `Ouroboros.Network.Diffusion.Common` contains data types that are common
  to both versions

Authors: Armando Santos, Marcin Szamotulski
  • Loading branch information
coot committed Oct 25, 2021
1 parent 76606a9 commit b9a1acc
Show file tree
Hide file tree
Showing 9 changed files with 2,166 additions and 636 deletions.
47 changes: 30 additions & 17 deletions ouroboros-consensus/src/Ouroboros/Consensus/Node.hs
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MonadComprehensions #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
-- | Run the whole Node
--
Expand Down Expand Up @@ -139,7 +143,7 @@ import Ouroboros.Consensus.Storage.VolatileDB

-- | Arguments expected from any invocation of 'runWith', whether by deployed
-- code, tests, etc.
data RunNodeArgs m addrNTN addrNTC blk = RunNodeArgs {
data RunNodeArgs m addrNTN addrNTC blk (p2p :: Diffusion.P2P) = RunNodeArgs {
-- | Consensus tracers
rnTraceConsensus :: Tracers m (ConnectionId addrNTN) (ConnectionId addrNTC) blk

Expand Down Expand Up @@ -168,7 +172,9 @@ data RunNodeArgs m addrNTN addrNTC blk = RunNodeArgs {
-- 'runWith'. The @cardano-node@, for example, instead calls the 'run'
-- abbreviation, which uses 'stdLowLevelRunNodeArgsIO' to indirectly specify
-- these low-level values from the higher-level 'StdRunNodeArgs'.
data LowLevelRunNodeArgs m addrNTN addrNTC versionDataNTN versionDataNTC blk = LowLevelRunNodeArgs {
data LowLevelRunNodeArgs m addrNTN addrNTC versionDataNTN versionDataNTC blk
(p2p :: Diffusion.P2P) =
LowLevelRunNodeArgs {

-- | How to manage the clean-shutdown marker on disk
llrnWithCheckedDB :: forall a. (LastShutDownWasClean -> m a) -> m a
Expand Down Expand Up @@ -209,6 +215,7 @@ data LowLevelRunNodeArgs m addrNTN addrNTC versionDataNTN versionDataNTC blk = L
addrNTN addrNTC
versionDataNTN versionDataNTC
m
-> Diffusion.ExtraApplications p2p addrNTN m
-> m ()

, llrnVersionDataNTC :: versionDataNTC
Expand All @@ -230,10 +237,10 @@ data LowLevelRunNodeArgs m addrNTN addrNTC versionDataNTN versionDataNTC blk = L
-------------------------------------------------------------------------------}

-- | Combination of 'runWith' and 'stdLowLevelRunArgsIO'
run :: forall blk.
run :: forall blk p2p.
RunNode blk
=> RunNodeArgs IO RemoteAddress LocalAddress blk
-> StdRunNodeArgs IO blk
=> RunNodeArgs IO RemoteAddress LocalAddress blk p2p
-> StdRunNodeArgs IO blk p2p
-> IO ()
run args stdArgs = stdLowLevelRunNodeArgsIO args stdArgs >>= runWith args

Expand All @@ -243,13 +250,13 @@ run args stdArgs = stdLowLevelRunNodeArgsIO args stdArgs >>= runWith args
-- network layer.
--
-- This function runs forever unless an exception is thrown.
runWith :: forall m addrNTN addrNTC versionDataNTN versionDataNTC blk.
runWith :: forall m addrNTN addrNTC versionDataNTN versionDataNTC blk p2p.
( RunNode blk
, IOLike m, MonadTime m, MonadTimer m
, Hashable addrNTN, Ord addrNTN, Typeable addrNTN
)
=> RunNodeArgs m addrNTN addrNTC blk
-> LowLevelRunNodeArgs m addrNTN addrNTC versionDataNTN versionDataNTC blk
=> RunNodeArgs m addrNTN addrNTC blk p2p
-> LowLevelRunNodeArgs m addrNTN addrNTC versionDataNTN versionDataNTC blk p2p
-> m ()
runWith RunNodeArgs{..} LowLevelRunNodeArgs{..} =

Expand Down Expand Up @@ -328,7 +335,7 @@ runWith RunNodeArgs{..} LowLevelRunNodeArgs{..} =
ntcApps
nodeKernel

llrnRunDataDiffusion registry diffusionApplications
llrnRunDataDiffusion registry apps appsExtra
where
ProtocolInfo
{ pInfoConfig = cfg
Expand Down Expand Up @@ -628,14 +635,15 @@ stdRunDataDiffusion ::
RemoteAddress LocalAddress
NodeToNodeVersionData NodeToClientVersionData
IO
-> Diffusion.ExtraApplications p2p RemoteAddress IO
-> IO ()
stdRunDataDiffusion = runDataDiffusion
stdRunDataDiffusion = Diffusion.run

-- | Higher-level arguments that can determine the 'LowLevelRunNodeArgs' under
-- some usual assumptions for realistic use cases such as in @cardano-node@.
--
-- See 'stdLowLevelRunNodeArgsIO'.
data StdRunNodeArgs m blk = StdRunNodeArgs
data StdRunNodeArgs m blk (p2p :: Diffusion.P2P) = StdRunNodeArgs
{ srnBfcMaxConcurrencyBulkSync :: Maybe Word
, srnBfcMaxConcurrencyDeadline :: Maybe Word
, srnChainDbValidateOverride :: Bool
Expand All @@ -658,16 +666,17 @@ data StdRunNodeArgs m blk = StdRunNodeArgs
-- | Conveniently packaged 'LowLevelRunNodeArgs' arguments from a standard
-- non-testing invocation.
stdLowLevelRunNodeArgsIO ::
forall blk. RunNode blk
=> RunNodeArgs IO RemoteAddress LocalAddress blk
-> StdRunNodeArgs IO blk
forall blk p2p. RunNode blk
=> RunNodeArgs IO RemoteAddress LocalAddress blk p2p
-> StdRunNodeArgs IO blk p2p
-> IO (LowLevelRunNodeArgs
IO
RemoteAddress
LocalAddress
NodeToNodeVersionData
NodeToClientVersionData
blk)
blk
p2p)
stdLowLevelRunNodeArgsIO RunNodeArgs{ rnProtocolInfo } StdRunNodeArgs{..} = do
llrnBfcSalt <- stdBfcSaltIO
llrnKeepAliveRng <- stdKeepAliveRngIO
Expand All @@ -681,8 +690,12 @@ stdLowLevelRunNodeArgsIO RunNodeArgs{ rnProtocolInfo } StdRunNodeArgs{..} = do
, llrnCustomiseChainDbArgs = id
, llrnCustomiseNodeKernelArgs
, llrnRunDataDiffusion =
\_reg apps ->
stdRunDataDiffusion srnDiffusionTracers srnDiffusionArguments apps
\_reg apps extraApps ->
stdRunDataDiffusion srnDiffusionTracers
srnDiffusionTracersExtra
srnDiffusionArguments
srnDiffusionArgumentsExtra
apps extraApps
, llrnVersionDataNTC =
stdVersionDataNTC networkMagic
, llrnVersionDataNTN =
Expand Down
5 changes: 4 additions & 1 deletion ouroboros-network/ouroboros-network.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ library
Ouroboros.Network.Counter
Ouroboros.Network.DeltaQ
Ouroboros.Network.Diffusion
Ouroboros.Network.Diffusion.P2P
Ouroboros.Network.Diffusion.NonP2P
Ouroboros.Network.Diffusion.Policies
Ouroboros.Network.KeepAlive
Ouroboros.Network.Magic
Expand Down Expand Up @@ -129,7 +131,8 @@ library
Ouroboros.Network.TxSubmission.Inbound
Ouroboros.Network.TxSubmission.Mempool.Reader
Ouroboros.Network.TxSubmission.Outbound
other-modules: Ouroboros.Network.PeerSelection.Governor.ActivePeers
other-modules: Ouroboros.Network.Diffusion.Common
Ouroboros.Network.PeerSelection.Governor.ActivePeers
Ouroboros.Network.PeerSelection.Governor.EstablishedPeers
Ouroboros.Network.PeerSelection.Governor.KnownPeers
Ouroboros.Network.PeerSelection.Governor.Monitor
Expand Down
Loading

0 comments on commit b9a1acc

Please sign in to comment.