Skip to content

Commit

Permalink
diffusion: run diffusion in an abstract monad
Browse files Browse the repository at this point in the history
Also introduce `Interfaces` record which provides all the interfaces
(e.g. snockets, dns resolver, etc) needed to run data diffusion.
  • Loading branch information
coot committed Oct 27, 2021
1 parent 1072e30 commit 571be60
Show file tree
Hide file tree
Showing 5 changed files with 498 additions and 378 deletions.
27 changes: 16 additions & 11 deletions ouroboros-network/src/Ouroboros/Network/Diffusion.hs
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,12 @@ module Ouroboros.Network.Diffusion
where

import Data.Functor (void)
import Control.Exception (IOException)

import Network.Socket (Socket)

import Ouroboros.Network.NodeToNode
( RemoteAddress
, Socket
, NodeToNodeVersionData
, NodeToNodeVersion
)
Expand All @@ -53,6 +55,7 @@ data ExtraTracers (p2p :: P2P) where
:: P2P.TracersExtra
RemoteAddress NodeToNodeVersion NodeToNodeVersionData
LocalAddress NodeToClientVersion NodeToClientVersionData
IOException IO
-> ExtraTracers 'P2P

NonP2PTracers
Expand All @@ -62,26 +65,26 @@ data ExtraTracers (p2p :: P2P) where

-- | Diffusion arguments which depend on p2p mode.
--
data ExtraArguments (p2p :: P2P) where
data ExtraArguments (p2p :: P2P) m where
P2PArguments
:: P2P.ArgumentsExtra
-> ExtraArguments 'P2P
:: P2P.ArgumentsExtra m
-> ExtraArguments 'P2P m

NonP2PArguments
:: NonP2P.ArgumentsExtra
-> ExtraArguments 'NonP2P
-> ExtraArguments 'NonP2P m


-- | Application data which depend on p2p mode.
--
data ExtraApplications (p2p :: P2P) n2nAddr where
data ExtraApplications (p2p :: P2P) n2nAddr m where
P2PApplications
:: P2P.ApplicationsExtra ntnAddr
-> ExtraApplications 'P2P ntnAddr
:: P2P.ApplicationsExtra ntnAddr m
-> ExtraApplications 'P2P ntnAddr m

NonP2PApplications
:: NonP2P.ApplicationsExtra
-> ExtraApplications 'NonP2P ntnAddr
-> ExtraApplications 'NonP2P ntnAddr m


-- | Run data diffusion in either 'P2P' or 'NonP2P' mode.
Expand All @@ -90,15 +93,17 @@ run :: forall (p2p :: P2P).
Tracers
RemoteAddress NodeToNodeVersion
LocalAddress NodeToClientVersion
IO
-> ExtraTracers p2p
-> Arguments
Socket RemoteAddress
LocalSocket LocalAddress
-> ExtraArguments p2p
-> ExtraArguments p2p IO
-> Applications
RemoteAddress NodeToNodeVersion NodeToNodeVersionData
LocalAddress NodeToClientVersion NodeToClientVersionData
-> ExtraApplications p2p RemoteAddress
IO
-> ExtraApplications p2p RemoteAddress IO
-> IO ()
run tracers (P2PTracers tracersExtra)
args (P2PArguments argsExtra)
Expand Down
29 changes: 16 additions & 13 deletions ouroboros-network/src/Ouroboros/Network/Diffusion/Common.hs
Original file line number Diff line number Diff line change
Expand Up @@ -79,39 +79,41 @@ instance (Typeable ntnAddr, Show ntnAddr) => Exception (Failure ntnAddr)

-- | Common DiffusionTracers interface between P2P and NonP2P
--
data Tracers ntnAddr ntnVersion ntcAddr ntcVersion = Tracers {
data Tracers ntnAddr ntnVersion ntcAddr ntcVersion m = Tracers {
-- | Mux tracer
dtMuxTracer
:: Tracer IO (WithMuxBearer (ConnectionId ntnAddr) MuxTrace)
:: Tracer m (WithMuxBearer (ConnectionId ntnAddr) MuxTrace)

-- | Handshake protocol tracer
, dtHandshakeTracer
:: Tracer IO (NodeToNode.HandshakeTr ntnAddr ntnVersion)
:: Tracer m (NodeToNode.HandshakeTr ntnAddr ntnVersion)

--
-- NodeToClient tracers
--

-- | Mux tracer for local clients
, dtLocalMuxTracer
:: Tracer IO (WithMuxBearer (ConnectionId ntcAddr) MuxTrace)
:: Tracer m (WithMuxBearer (ConnectionId ntcAddr) MuxTrace)

-- | Handshake protocol tracer for local clients
, dtLocalHandshakeTracer
:: Tracer IO (NodeToClient.HandshakeTr ntcAddr ntcVersion)
:: Tracer m (NodeToClient.HandshakeTr ntcAddr ntcVersion)

-- | Diffusion initialisation tracer
, dtDiffusionInitializationTracer
:: Tracer IO (InitializationTracer ntnAddr ntcAddr)
:: Tracer m (InitializationTracer ntnAddr ntcAddr)

-- | Ledger Peers tracer
, dtLedgerPeersTracer
:: Tracer IO TraceLedgerPeers
:: Tracer m TraceLedgerPeers
}


nullTracers :: Tracers ntnAddr ntnVersion
nullTracers :: Applicative m
=> Tracers ntnAddr ntnVersion
ntcAddr ntcVersion
m
nullTracers = Tracers {
dtMuxTracer = nullTracer
, dtHandshakeTracer = nullTracer
Expand Down Expand Up @@ -152,7 +154,7 @@ data Arguments ntnFd ntnAddr ntcFd ntcAddr = Arguments {
--
data Applications ntnAddr ntnVersion ntnVersionData
ntcAddr ntcVersion ntcVersionData
=
m =
Applications {
-- | NodeToNode initiator applications for initiator only mode.
--
Expand All @@ -164,7 +166,7 @@ data Applications ntnAddr ntnVersion ntnVersionData
ntnVersionData
(OuroborosBundle
InitiatorMode ntnAddr
ByteString IO () Void)
ByteString m () Void)

-- | NodeToNode initiator & responder applications for bidirectional mode.
--
Expand All @@ -173,7 +175,7 @@ data Applications ntnAddr ntnVersion ntnVersionData
ntnVersionData
(OuroborosBundle
InitiatorResponderMode ntnAddr
ByteString IO () ())
ByteString m () ())

-- | NodeToClient responder application (server role)
--
Expand All @@ -182,9 +184,10 @@ data Applications ntnAddr ntnVersion ntnVersionData
ntcVersionData
(OuroborosApplication
ResponderMode ntcAddr
ByteString IO Void ())
ByteString m Void ())

-- | Interface used to get peers from the current ledger.
--
, daLedgerPeersCtx :: LedgerPeersConsensusInterface IO
-- TODO: it should be in 'InterfaceExtra'
, daLedgerPeersCtx :: LedgerPeersConsensusInterface m
}
2 changes: 2 additions & 0 deletions ouroboros-network/src/Ouroboros/Network/Diffusion/NonP2P.hs
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@ run
:: Tracers
RemoteAddress NodeToNodeVersion
LocalAddress NodeToClientVersion
IO
-> TracersExtra
-> Arguments
Socket RemoteAddress
Expand All @@ -175,6 +176,7 @@ run
-> Applications
RemoteAddress NodeToNodeVersion NodeToNodeVersionData
LocalAddress NodeToClientVersion NodeToClientVersionData
IO
-> ApplicationsExtra
-> IO ()
run Tracers
Expand Down

0 comments on commit 571be60

Please sign in to comment.