/
Diffusion.hs
108 lines (103 loc) · 4.19 KB
/
Diffusion.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Cardano.Tools.ImmDBServer.Diffusion (run) where
import Cardano.Tools.ImmDBServer.MiniProtocols (immDBServer)
import Control.Tracer
import qualified Data.ByteString.Lazy as BL
import Data.Functor.Contravariant ((>$<))
import Data.Void (Void)
import Network.Socket (SockAddr (..))
import Ouroboros.Consensus.Block
import Ouroboros.Consensus.Config
import Ouroboros.Consensus.Config.SupportsNode
import Ouroboros.Consensus.Node.InitStorage
(NodeInitStorage (nodeCheckIntegrity, nodeImmutableDbChunkInfo))
import Ouroboros.Consensus.Node.NetworkProtocolVersion
import Ouroboros.Consensus.Node.Run (SerialiseNodeToNodeConstraints)
import Ouroboros.Consensus.Storage.ImmutableDB (ImmutableDbArgs (..))
import qualified Ouroboros.Consensus.Storage.ImmutableDB as ImmutableDB
import Ouroboros.Consensus.Util
import Ouroboros.Consensus.Util.IOLike
import Ouroboros.Consensus.Util.ResourceRegistry
import Ouroboros.Network.ErrorPolicy (nullErrorPolicies)
import Ouroboros.Network.IOManager (withIOManager)
import Ouroboros.Network.Mux
import qualified Ouroboros.Network.NodeToNode as N2N
import Ouroboros.Network.PeerSelection.PeerSharing
(decodeRemoteAddress, encodeRemoteAddress)
import qualified Ouroboros.Network.Snocket as Snocket
import Ouroboros.Network.Socket (configureSocket)
import System.FS.API (SomeHasFS (..))
import System.FS.API.Types (MountPoint (MountPoint))
import System.FS.IO (ioHasFS)
-- | Glue code for using just the bits from the Diffusion Layer that we need in
-- this context.
serve ::
SockAddr
-> N2N.Versions N2N.NodeToNodeVersion N2N.NodeToNodeVersionData
(OuroborosApplication 'ResponderMode (N2N.MinimalInitiatorContext SockAddr) (N2N.ResponderContext SockAddr) BL.ByteString IO Void ())
-> IO Void
serve sockAddr application = withIOManager \iocp -> do
let sn = Snocket.socketSnocket iocp
family = Snocket.addrFamily sn sockAddr
bracket (Snocket.open sn family) (Snocket.close sn) \socket -> do
networkMutableState <- N2N.newNetworkMutableState
configureSocket socket (Just sockAddr)
Snocket.bind sn socket sockAddr
Snocket.listen sn socket
N2N.withServer
sn
N2N.nullNetworkServerTracers {
N2N.nstHandshakeTracer = show >$< stdoutTracer
, N2N.nstErrorPolicyTracer = show >$< stdoutTracer
}
networkMutableState
acceptedConnectionsLimit
socket
application
nullErrorPolicies
where
acceptedConnectionsLimit = N2N.AcceptedConnectionsLimit {
N2N.acceptedConnectionsHardLimit = maxBound
, N2N.acceptedConnectionsSoftLimit = maxBound
, N2N.acceptedConnectionsDelay = 0
}
run ::
forall blk.
( GetPrevHash blk
, ShowProxy blk
, SupportedNetworkProtocolVersion blk
, SerialiseNodeToNodeConstraints blk
, ImmutableDB.ImmutableDbSerialiseConstraints blk
, NodeInitStorage blk
, ConfigSupportsNode blk
)
=> FilePath
-> SockAddr
-> TopLevelConfig blk
-> IO Void
run immDBDir sockAddr cfg = withRegistry \registry ->
ImmutableDB.withDB
(ImmutableDB.openDB (immDBArgs registry) runWithTempRegistry)
\immDB -> serve sockAddr $ immDBServer
codecCfg
encodeRemoteAddress
decodeRemoteAddress
immDB
networkMagic
where
immDBArgs registry = defaultImmDBArgs {
immCheckIntegrity = nodeCheckIntegrity storageCfg
, immChunkInfo = nodeImmutableDbChunkInfo storageCfg
, immCodecConfig = codecCfg
, immRegistry = registry
}
where
defaultImmDBArgs =
ImmutableDB.defaultArgs $ SomeHasFS $ ioHasFS $ MountPoint immDBDir
codecCfg = configCodec cfg
storageCfg = configStorage cfg
networkMagic = getNetworkMagic . configBlock $ cfg