Skip to content

Commit e989050

Browse files
committed
framework: added traces to the simple server
1 parent 3ca85da commit e989050

File tree

6 files changed

+55
-21
lines changed

6 files changed

+55
-21
lines changed

cardano-diffusion/demo/chain-sync.hs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,8 @@ serverChainSync sockAddr slotLength seed = withIOManager $ \iocp -> do
276276
Just a -> return (Random.mkStdGen a)
277277
Server.Simple.with
278278
(localSnocket iocp)
279+
nullTracer
280+
Mx.nullTracers
279281
makeLocalBearer
280282
mempty
281283
(localAddressFromPath sockAddr)
@@ -552,6 +554,8 @@ serverBlockFetch sockAddr slotLength seed = withIOManager $ \iocp -> do
552554
Just a -> return (Random.mkStdGen a)
553555
Server.Simple.with
554556
(localSnocket iocp)
557+
nullTracer
558+
Mx.nullTracers
555559
makeLocalBearer
556560
mempty
557561
(localAddressFromPath sockAddr)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
### Breaking
2+
3+
- `Ouroboros.Network.Server.Simple.with` now requires tracers as argument,
4+
these should not be nullTracers in production code, although
5+
`Network.Mux.Trace.ChannelTrace` and `Network.Mux.Trace.BearerTrace` should
6+
be off by default as they can be extensive, the `Network.Mux.Trace.Trace` can
7+
be on by default, while `Ouroboros.Network.Server.Simple.ServerTrace` must be
8+
on as it traces important exception.

ouroboros-network/demo/ping-pong.hs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,8 @@ serverPingPong =
160160
withIOManager $ \iomgr -> do
161161
Server.with
162162
(Snocket.localSnocket iomgr)
163+
nullTracer
164+
Mx.nullTracers
163165
makeLocalBearer
164166
mempty
165167
defaultLocalSocketAddr
@@ -255,6 +257,8 @@ serverPingPong2 =
255257
withIOManager $ \iomgr -> do
256258
Server.with
257259
(Snocket.localSnocket iomgr)
260+
nullTracer
261+
Mx.nullTracers
258262
makeLocalBearer
259263
mempty
260264
defaultLocalSocketAddr

ouroboros-network/framework/io-tests/Test/Ouroboros/Network/Socket.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,8 @@ prop_socket_send_recv initiatorAddr responderAddr configureSock f xs =
240240
res <-
241241
Server.Simple.with
242242
snocket
243+
nullTracer
244+
Mx.nullTracers
243245
Mx.makeSocketBearer
244246
((. Just) <$> configureSock)
245247
responderAddr

ouroboros-network/framework/lib/Ouroboros/Network/Server/Simple.hs

Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99
-- of inbound connections) and thus should only be used in a safe environment.
1010
--
1111
-- The module should be imported qualified.
12-
module Ouroboros.Network.Server.Simple where
12+
module Ouroboros.Network.Server.Simple
13+
( with
14+
, ServerTracer (..)
15+
) where
1316

1417
import Control.Applicative (Alternative)
1518
import Control.Concurrent.JobPool qualified as JobPool
@@ -18,6 +21,7 @@ import Control.Monad.Class.MonadFork (MonadFork)
1821
import Control.Monad.Class.MonadSTM
1922
import Control.Monad.Class.MonadThrow
2023
import Control.Monad.Class.MonadTimer.SI (MonadDelay, MonadTimer)
24+
import Control.Tracer (Tracer, traceWith)
2125
import Data.ByteString.Lazy qualified as BL
2226
import Data.Functor (void)
2327
import Data.Typeable (Typeable)
@@ -33,13 +37,11 @@ import Ouroboros.Network.Snocket (Snocket)
3337
import Ouroboros.Network.Snocket qualified as Snocket
3438
import Ouroboros.Network.Socket
3539

40+
data ServerTracer addr
41+
= AcceptException SomeException
42+
| ConnectionHandlerException (ConnectionId addr) SomeException
43+
deriving Show
3644

37-
-- TODO: add tracers:
38-
--
39-
-- * accept errors,
40-
-- * errors thrown by a connection handler thread,
41-
-- * mux tracers
42-
--
4345
with :: forall fd addr vNumber vData m a b.
4446
( Alternative (STM m),
4547
MonadAsync m,
@@ -54,14 +56,16 @@ with :: forall fd addr vNumber vData m a b.
5456
Show vNumber
5557
)
5658
=> Snocket m fd addr
59+
-> Tracer m (ServerTracer addr)
60+
-> Mx.TracersWithBearer (ConnectionId addr) m
5761
-> Mx.MakeBearer m fd
5862
-> (fd -> addr -> m ())
5963
-> addr
6064
-> HandshakeArguments (ConnectionId addr) vNumber vData m
6165
-> Versions vNumber vData (SomeResponderApplication addr BL.ByteString m b)
6266
-> (addr -> Async m Void -> m a)
6367
-> m a
64-
with sn makeBearer configureSock addr handshakeArgs versions k =
68+
with sn tracer muxTracers makeBearer configureSock addr handshakeArgs versions k =
6569
JobPool.withJobPool $ \jobPool ->
6670
bracket
6771
(do sd <- Snocket.open sn (Snocket.addrFamily sn addr)
@@ -71,49 +75,59 @@ with sn makeBearer configureSock addr handshakeArgs versions k =
7175
addr' <- Snocket.getLocalAddr sn sd
7276
pure (sd, addr'))
7377
(Snocket.close sn . fst)
74-
(\(sock, addr') ->
78+
(\(sock, localAddress) ->
7579
-- accept loop
76-
withAsync (Snocket.accept sn sock >>= acceptLoop jobPool) (k addr')
80+
withAsync (Snocket.accept sn sock >>= acceptLoop jobPool localAddress)
81+
(k localAddress)
7782
)
7883
where
7984
acceptLoop :: JobPool.JobPool () m ()
85+
-> addr
8086
-> Snocket.Accept m fd addr
8187
-> m Void
82-
acceptLoop jobPool Snocket.Accept { Snocket.runAccept } = do
88+
acceptLoop
89+
jobPool
90+
localAddress
91+
Snocket.Accept { Snocket.runAccept }
92+
= do
8393
(accepted, acceptNext) <- runAccept
8494
acceptOne accepted
85-
acceptLoop jobPool acceptNext
95+
acceptLoop jobPool
96+
localAddress
97+
acceptNext
8698
where
8799
-- handle accept failures and fork a connection thread which performs
88100
-- a handshake and runs mux
89101
acceptOne :: Snocket.Accepted fd addr -> m ()
90102
acceptOne (Snocket.AcceptFailure e)
91103
| Just ioErr <- fromException e
92104
, isECONNABORTED ioErr
93-
= return ()
105+
= traceWith tracer (AcceptException e)
94106
acceptOne (Snocket.AcceptFailure e)
95-
= throwIO e
107+
= do traceWith tracer (AcceptException e)
108+
throwIO e
96109

97-
acceptOne (Snocket.Accepted sock' remoteAddr) = do
98-
let connThread = do
110+
acceptOne (Snocket.Accepted sock' remoteAddress) = do
111+
let connId = ConnectionId { localAddress, remoteAddress }
112+
connThread = do
99113
-- connection responder thread
100-
let connId = ConnectionId addr remoteAddr
101114
bearer <- Mx.getBearer makeBearer (-1) sock' Nothing
102-
configureSock sock' addr
115+
configureSock sock' localAddress
103116
r <- runHandshakeServer bearer connId handshakeArgs versions
104117
case r of
105118
Left (HandshakeProtocolLimit e) -> throwIO e
106119
Left (HandshakeProtocolError e) -> throwIO e
107120
Right HandshakeQueryResult {} -> error "handshake query is not supported"
108121
Right (HandshakeNegotiationResult (SomeResponderApplication app) vNumber vData) -> do
109-
mux <- Mx.new Mx.nullTracers
122+
mux <- Mx.new (connId `Mx.tracersWithBearer` muxTracers)
110123
(toMiniProtocolInfos
111-
(runForkPolicy noBindForkPolicy (remoteAddress connId))
124+
(runForkPolicy noBindForkPolicy remoteAddress)
112125
app)
113126
withAsync (Mx.run mux bearer) $ \aid -> do
114127
void $ simpleMuxCallback connId vNumber vData app mux aid
115128

116-
errorHandler = \e -> throwIO e
129+
errorHandler = \e -> traceWith tracer (ConnectionHandlerException connId e)
130+
>> throwIO e
117131
JobPool.forkJob jobPool
118132
$ JobPool.Job connThread
119133
errorHandler

ouroboros-network/tests/io/Test/Ouroboros/Network/Socket.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,8 @@ demo chain0 updates = withIOManager $ \iocp -> do
239239

240240
Server.Simple.with
241241
(socketSnocket iocp)
242+
nullTracer
243+
Mx.nullTracers
242244
makeSocketBearer
243245
((. Just) <$> configureSocket)
244246
producerAddress

0 commit comments

Comments
 (0)