@@ -947,28 +947,32 @@ with args@Arguments {
947947 , toState = Known connState
948948 })
949949 return ( State. insert connId connVar state
950- , Just (connVar, connThread, reader)
950+ , Right (connVar, connThread, reader)
951951 )
952952 else
953953 return ( state
954- , Nothing
954+ , Left ReachedInboundConnectionHardLimit
955955 )
956956
957957 case r of
958- Nothing ->
959- return (Disconnected connId Nothing )
958+ Left reason ->
959+ -- we were unable to include the connection due to hard inbound
960+ -- connection limit
961+ return (Disconnected connId reason)
960962
961- Just ( mutableConnState@ MutableConnState { connVar, connStateId }
962- , connThread, reader) -> do
963+ Right ( mutableConnState@ MutableConnState { connVar, connStateId }
964+ , connThread, reader) -> do
963965 traceCounters stateVar
964966
965967 res <- atomically $ readPromise reader
966968 case res of
967969 Left handleError -> do
968- terminateInboundWithErrorOrQuery connId connStateId connVar connThread stateVar mutableConnState $ Just handleError
970+ terminateInboundWithErrorOrQuery connId connStateId connVar connThread stateVar mutableConnState
971+ (ConnectionHandlerError handleError)
969972
970973 Right HandshakeConnectionQuery -> do
971- terminateInboundWithErrorOrQuery connId connStateId connVar connThread stateVar mutableConnState Nothing
974+ terminateInboundWithErrorOrQuery connId connStateId connVar connThread stateVar mutableConnState
975+ ConnectionDisconnectedByHandshakeQuery
972976
973977 Right (HandshakeConnectionResult handle (_version, versionData)) -> do
974978 let dataFlow = connectionDataFlow versionData
@@ -1025,10 +1029,10 @@ with args@Arguments {
10251029 throwSTM (withCallStack (ImpossibleState (remoteAddress connId)))
10261030
10271031 TerminatingState _ _ err ->
1028- return (Left err, Nothing , Inbound )
1032+ return (Left (mkDisconnectionException ConnectionInTerminatingState err) , Nothing , Inbound )
10291033
10301034 TerminatedState err ->
1031- return (Left err, Nothing , Inbound )
1035+ return (Left (mkDisconnectionException ConnectionInTerminatedState err) , Nothing , Inbound )
10321036
10331037 traverse_ (traceWith trTracer . TransitionTrace connStateId) mbTransition
10341038 traceCounters stateVar
@@ -1068,23 +1072,26 @@ with args@Arguments {
10681072 -> StrictTMVar
10691073 m (ConnectionManagerState peerAddr handle handleError version m )
10701074 -> MutableConnState peerAddr handle handleError version m
1071- -> Maybe handleError
1075+ -> DisconnectionException handleError
10721076 -> m (Connected peerAddr handle handleError )
1073- terminateInboundWithErrorOrQuery connId connStateId connVar connThread stateVar mutableConnState handleErrorM = do
1077+ terminateInboundWithErrorOrQuery connId connStateId connVar connThread stateVar mutableConnState connectionError = do
10741078 transitions <- atomically $ do
10751079 connState <- readTVar connVar
10761080
10771081 let connState' =
1078- case classifyHandleError <$> handleErrorM of
1079- Just HandshakeFailure ->
1082+ case classifyHandleError <$> connectionError of
1083+ ConnectionHandlerError HandshakeFailure ->
10801084 TerminatingState connId connThread
1081- handleErrorM
1082- Just HandshakeProtocolViolation ->
1083- TerminatedState handleErrorM
1085+ (case connectionError of
1086+ ConnectionHandlerError err -> Just err
1087+ _ -> Nothing )
1088+ ConnectionHandlerError HandshakeProtocolViolation ->
1089+ TerminatedState (case connectionError of
1090+ ConnectionHandlerError err -> Just err
1091+ _ -> Nothing )
10841092 -- On inbound query, connection is terminating.
1085- Nothing ->
1086- TerminatingState connId connThread
1087- handleErrorM
1093+ _ ->
1094+ TerminatingState connId connThread Nothing
10881095 transition = mkTransition connState connState'
10891096 absConnState = State. abstractState (Known connState)
10901097 shouldTrace = absConnState /= TerminatedSt
@@ -1148,7 +1155,7 @@ with args@Arguments {
11481155 traverse_ (traceWith trTracer . TransitionTrace connStateId) transitions
11491156 traceCounters stateVar
11501157
1151- return (Disconnected connId handleErrorM )
1158+ return (Disconnected connId connectionError )
11521159
11531160 -- We need 'mask' in order to guarantee that the traces are logged if an
11541161 -- async exception lands between the successful STM action and the logging
@@ -1619,10 +1626,12 @@ with args@Arguments {
16191626 res <- atomically (readPromise reader)
16201627 case res of
16211628 Left handleError -> do
1622- terminateOutboundWithErrorOrQuery connId connStateId connVar connThread stateVar mutableConnState $ Just handleError
1629+ terminateOutboundWithErrorOrQuery connId connStateId connVar connThread stateVar mutableConnState
1630+ (ConnectionHandlerError handleError)
16231631
16241632 Right HandshakeConnectionQuery -> do
1625- terminateOutboundWithErrorOrQuery connId connStateId connVar connThread stateVar mutableConnState Nothing
1633+ terminateOutboundWithErrorOrQuery connId connStateId connVar connThread stateVar mutableConnState
1634+ ConnectionDisconnectedByHandshakeQuery
16261635
16271636 Right (HandshakeConnectionResult handle (_version, versionData)) -> do
16281637 let dataFlow = connectionDataFlow versionData
@@ -1685,7 +1694,7 @@ with args@Arguments {
16851694 return (Right $ mkTransition connState connState')
16861695
16871696 TerminatedState err ->
1688- return $ Left err
1697+ return $ Left $ mkDisconnectionException ConnectionInTerminatedState err
16891698 _ ->
16901699 let st = State. abstractState (Known connState) in
16911700 throwSTM (withCallStack (ForbiddenOperation peerAddr st))
@@ -1773,12 +1782,12 @@ with args@Arguments {
17731782
17741783 TerminatingState _connId _connThread handleError ->
17751784 return ( Right (TrTerminatingConnection provenance connId)
1776- , Disconnected connId handleError
1785+ , Disconnected connId (mkDisconnectionException ConnectionInTerminatingState handleError)
17771786 )
17781787 TerminatedState handleError ->
17791788 return ( Right (TrTerminatedConnection provenance
17801789 (remoteAddress connId))
1781- , Disconnected connId handleError
1790+ , Disconnected connId (mkDisconnectionException ConnectionInTerminatedState handleError)
17821791 )
17831792
17841793 case etr of
@@ -1799,27 +1808,31 @@ with args@Arguments {
17991808 -> Async m ()
18001809 -> StrictTMVar m (ConnectionManagerState peerAddr handle handleError version m )
18011810 -> MutableConnState peerAddr handle handleError version m
1802- -> Maybe handleError
1811+ -> DisconnectionException handleError
18031812 -> m (Connected peerAddr handle handleError )
1804- terminateOutboundWithErrorOrQuery connId connStateId connVar connThread stateVar mutableConnState handleErrorM = do
1813+ terminateOutboundWithErrorOrQuery connId connStateId connVar connThread stateVar mutableConnState connectionError = do
18051814 transitions <- atomically $ do
18061815 connState <- readTVar connVar
18071816
18081817 let connState' =
1809- case classifyHandleError <$> handleErrorM of
1810- Just HandshakeFailure ->
1818+ case classifyHandleError <$> connectionError of
1819+ ConnectionHandlerError HandshakeFailure ->
18111820 TerminatingState connId connThread
1812- handleErrorM
1813- Just HandshakeProtocolViolation ->
1814- TerminatedState handleErrorM
1821+ (case connectionError of
1822+ ConnectionHandlerError err -> Just err
1823+ _ -> Nothing )
1824+ ConnectionHandlerError HandshakeProtocolViolation ->
1825+ TerminatedState (case connectionError of
1826+ ConnectionHandlerError err -> Just err
1827+ _ -> Nothing )
18151828 -- On outbound query, connection is terminated.
1816- Nothing ->
1817- TerminatedState handleErrorM
1829+ _ ->
1830+ TerminatedState Nothing
18181831 transition = mkTransition connState connState'
18191832 absConnState = State. abstractState (Known connState)
18201833 shouldTransition = absConnState /= TerminatedSt
18211834
1822- -- 'handleError ' might be either a handshake negotiation
1835+ -- 'connectionError ' might be either a handshake negotiation
18231836 -- a protocol failure (an IO exception, a timeout or
18241837 -- codec failure). In the first case we should not reset
18251838 -- the connection as this is not a protocol error.
@@ -1870,7 +1883,7 @@ with args@Arguments {
18701883 traverse_ (traceWith trTracer . TransitionTrace connStateId) transitions
18711884 traceCounters stateVar
18721885
1873- return (Disconnected connId handleErrorM )
1886+ return (Disconnected connId connectionError )
18741887
18751888
18761889 releaseOutboundConnectionImpl
0 commit comments