Skip to content

Commit daa42a9

Browse files
authored
Merge pull request #5189 from IntersectMBO/coot/connection-manager-exception-propagation
Propagate disconnection reason out of connection manager
2 parents 4ed116a + 5c1c0cc commit daa42a9

File tree

11 files changed

+224
-145
lines changed

11 files changed

+224
-145
lines changed

ouroboros-network-framework/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@
44

55
### Breaking changes
66

7+
* `HandleError` renamed as `HandlerError`, also `HandlerErrorType` and `classifyHandlerError`.
8+
79
### Non-breaking changes
810

11+
* propagate diconnection reason out of connection manager when including an
12+
inbound connection or acquiring an outbound connection.
13+
914
## 0.19.0.0 -- 28.06.2025
1015

1116
### Breaking changes

ouroboros-network-framework/demo/connection-manager.hs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ withBidirectionalConnectionManager snocket makeBearer socket
280280
},
281281
updateVersionData = \a _ -> a,
282282
connStateIdSupply,
283-
classifyHandleError = (\_ -> HandshakeFailure)
283+
classifyHandlerError = (\_ -> HandshakeFailure)
284284
}
285285
(InResponderMode inbgovInfoChannel)
286286
connectionHandler
@@ -566,8 +566,7 @@ bidirectionalExperiment
566566
(HandleWithExpandedCtx
567567
Mux.InitiatorResponderMode peerAddr
568568
UnversionedProtocolData ByteString IO () ())
569-
(HandleError
570-
Mux.InitiatorResponderMode
569+
(HandlerError
571570
UnversionedProtocol))
572571
connect n cm | n <= 1 =
573572
acquireOutboundConnection cm InitiatorAndResponderDiffusionMode remoteAddr

ouroboros-network-framework/sim-tests/Test/Ouroboros/Network/ConnectionManager.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -784,7 +784,7 @@ prop_valid_transitions (Fixed rnd) (SkewedBool bindToLocalAddress) scheduleMap =
784784
outboundIdleTimeout = testOutboundIdleTimeout,
785785
updateVersionData = \a _ -> a,
786786
connStateIdSupply,
787-
classifyHandleError = \_ -> HandshakeFailure }
787+
classifyHandlerError = \_ -> HandshakeFailure }
788788
(InResponderMode inbgovInfoChannel)
789789
connectionHandler
790790
$ \(connectionManager

ouroboros-network-framework/src/Ouroboros/Network/ConnectionHandler.hs

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ module Ouroboros.Network.ConnectionHandler
3131
( Handle (..)
3232
, HandleWithExpandedCtx
3333
, HandleWithMinimalCtx
34-
, HandleError (..)
35-
, classifyHandleError
34+
, HandlerError (..)
35+
, classifyHandlerError
3636
, MkMuxConnectionHandler (..)
3737
, MuxConnectionHandler
3838
, makeConnectionHandler
@@ -110,7 +110,7 @@ sduHandshakeTimeout = 10
110110
-- * 'HandleHandshakeServerError'
111111
-- - the connection handler thread was running server side of the
112112
-- handshake protocol, which fail with 'HandshakeException'
113-
-- * 'HandleError'
113+
-- * 'HandlerError'
114114
-- - the multiplexer thrown 'MuxError'.
115115
--
116116
data Handle (muxMode :: Mx.Mode) initiatorCtx responderCtx versionData bytes m a b =
@@ -155,42 +155,46 @@ type HandleWithMinimalCtx muxMode peerAddr versionData bytes m a b =
155155
(ResponderContext peerAddr)
156156
versionData bytes m a b
157157

158-
data HandleError (muxMode :: Mx.Mode) versionNumber where
159-
HandleHandshakeClientError
160-
:: HasInitiator muxMode ~ True
161-
=> !(HandshakeException versionNumber)
162-
-> HandleError muxMode versionNumber
158+
-- | A connection handler error.
159+
--
160+
-- It is returned either when creating the `Handle` or raised by the connection
161+
-- handler.
162+
--
163+
data HandlerError versionNumber =
164+
-- | A handshake exception when creating `Handle`.
165+
HandleHandshakeClientError !(HandshakeException versionNumber)
163166

164-
HandleHandshakeServerError
165-
:: HasResponder muxMode ~ True
166-
=> !(HandshakeException versionNumber)
167-
-> HandleError muxMode versionNumber
167+
-- | A handshake exception when creating `Handle`.
168+
| HandleHandshakeServerError !(HandshakeException versionNumber)
168169

169-
HandleError
170-
:: !SomeException
171-
-> HandleError muxMode versionNumber
170+
-- | A connection handler exception (e.g. might be a mini-protocol error, io
171+
-- exception, etc).
172+
| HandlerError !SomeException
173+
deriving Show
172174

173-
instance Show versionNumber
174-
=> Show (HandleError muxMode versionNumber) where
175-
show (HandleHandshakeServerError err) = "HandleHandshakeServerError " ++ show err
176-
show (HandleHandshakeClientError err) = "HandleHandshakeClientError " ++ show err
177-
show (HandleError err) = "HandleError " ++ show err
175+
instance ( Typeable versionNumber
176+
, Show versionNumber
177+
)
178+
=> Exception (HandlerError versionNumber) where
179+
displayException (HandleHandshakeClientError err) = "handshake client error: " ++ show err
180+
displayException (HandleHandshakeServerError err) = "handshake server error: " ++ show err
181+
displayException (HandlerError err) = "connection handler error: " ++ show err
178182

179183

180-
classifyHandleError :: HandleError muxMode versionNumber
181-
-> HandleErrorType
182-
classifyHandleError (HandleHandshakeClientError (HandshakeProtocolLimit _)) =
184+
classifyHandlerError :: HandlerError versionNumber
185+
-> HandlerErrorType
186+
classifyHandlerError (HandleHandshakeClientError (HandshakeProtocolLimit _)) =
183187
HandshakeProtocolViolation
184188
-- TODO: 'HandshakeProtocolError' is not a protocol error! It is just
185189
-- a negotiation failure. It should be renamed.
186-
classifyHandleError (HandleHandshakeClientError (HandshakeProtocolError _)) =
190+
classifyHandlerError (HandleHandshakeClientError (HandshakeProtocolError _)) =
187191
HandshakeFailure
188-
classifyHandleError (HandleHandshakeServerError (HandshakeProtocolLimit _)) =
192+
classifyHandlerError (HandleHandshakeServerError (HandshakeProtocolLimit _)) =
189193
HandshakeProtocolViolation
190-
classifyHandleError (HandleHandshakeServerError (HandshakeProtocolError _)) =
194+
classifyHandlerError (HandleHandshakeServerError (HandshakeProtocolError _)) =
191195
HandshakeFailure
192196
-- any other exception, e.g. MuxError \/ IOError, codec errors, etc.
193-
classifyHandleError (HandleError _) =
197+
classifyHandlerError (HandlerError _) =
194198
HandshakeProtocolViolation
195199

196200

@@ -202,7 +206,7 @@ type MuxConnectionHandler muxMode socket initiatorCtx responderCtx peerAddr vers
202206
socket
203207
peerAddr
204208
(Handle muxMode initiatorCtx responderCtx versionData bytes m a b)
205-
(HandleError muxMode versionNumber)
209+
(HandlerError versionNumber)
206210
versionNumber
207211
versionData
208212
m
@@ -212,15 +216,15 @@ type MuxConnectionHandler muxMode socket initiatorCtx responderCtx peerAddr vers
212216
type MuxConnectionManager muxMode socket initiatorCtx responderCtx peerAddr versionData versionNumber bytes m a b =
213217
ConnectionManager muxMode socket peerAddr
214218
(Handle muxMode initiatorCtx responderCtx versionData bytes m a b)
215-
(HandleError muxMode versionNumber)
219+
(HandlerError versionNumber)
216220
m
217221

218222
-- | Type alias for 'ConnectionManager' which is using expanded context.
219223
--
220224
type ConnectionManagerWithExpandedCtx muxMode socket peerAddr versionData versionNumber bytes m a b =
221225
ConnectionManager muxMode socket peerAddr
222226
(HandleWithExpandedCtx muxMode peerAddr versionData bytes m a b)
223-
(HandleError muxMode versionNumber)
227+
(HandlerError versionNumber)
224228
m
225229

226230
-- | To be used as `makeConnectionHandler` field of 'ConnectionManagerArguments'.
@@ -298,15 +302,14 @@ makeConnectionHandler muxTracers forkPolicy
298302
throwIO (ExceptionInHandler remoteAddress err)
299303

300304
outboundConnectionHandler
301-
:: HasInitiator muxMode ~ True
302-
=> InResponderMode muxMode ( StrictTVar m (StrictMaybe ResponderCounters)
305+
:: InResponderMode muxMode ( StrictTVar m (StrictMaybe ResponderCounters)
303306
-> Tracer m (WithBearer (ConnectionId peerAddr) Trace)
304307
, versionData -> DataFlow)
305308
-> ConnectionHandlerFn (ConnectionHandlerTrace versionNumber versionData)
306309
socket
307310
peerAddr
308311
(Handle muxMode initiatorCtx responderCtx versionData ByteString m a b)
309-
(HandleError muxMode versionNumber)
312+
(HandlerError versionNumber)
310313
versionNumber
311314
versionData
312315
m
@@ -339,7 +342,7 @@ makeConnectionHandler muxTracers forkPolicy
339342
-- handshake negotiation failures, but not with 'IOException's or
340343
-- 'MuxError's.
341344
`catch` \(err :: SomeException) -> do
342-
atomically $ writePromise (Left (HandleError err))
345+
atomically $ writePromise (Left (HandlerError err))
343346
throwIO err
344347
case hsResult of
345348
Left !err -> do
@@ -382,14 +385,13 @@ makeConnectionHandler muxTracers forkPolicy
382385

383386

384387
inboundConnectionHandler
385-
:: HasResponder muxMode ~ True
386-
=> ( StrictTVar m (StrictMaybe ResponderCounters)
388+
:: ( StrictTVar m (StrictMaybe ResponderCounters)
387389
-> Tracer m (WithBearer (ConnectionId peerAddr) Trace))
388390
-> ConnectionHandlerFn (ConnectionHandlerTrace versionNumber versionData)
389391
socket
390392
peerAddr
391393
(Handle muxMode initiatorCtx responderCtx versionData ByteString m a b)
392-
(HandleError muxMode versionNumber)
394+
(HandlerError versionNumber)
393395
versionNumber
394396
versionData
395397
m
@@ -422,7 +424,7 @@ makeConnectionHandler muxTracers forkPolicy
422424
-- handshake negotiation failures, but not with 'IOException's or
423425
-- 'MuxError's.
424426
`catch` \(err :: SomeException) -> do
425-
atomically $ writePromise (Left (HandleError err))
427+
atomically $ writePromise (Left (HandlerError err))
426428
throwIO err
427429

428430
case hsResult of

0 commit comments

Comments
 (0)