Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix NotReleasedConnections in Server2 tests #4623

Merged
merged 1 commit into from
Oct 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions ouroboros-network-framework/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
* Fixed a bug in `connection-manager` which could result in leaking
a connection.

* Fix Server2 [sim test](https://github.com/input-output-hk/ouroboros-network/issues/4607) by synchronizing connection/disconnection events.

## 0.9.0.0 -- 2023-08-21

### Breaking changes
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import Control.Applicative (Alternative ((<|>)))
import qualified Control.Concurrent.Class.MonadSTM as LazySTM
import Control.Concurrent.Class.MonadSTM.Strict
import Control.Exception (SomeAsyncException (..), SomeException (..))
import Control.Monad (replicateM, when)
import Control.Monad (replicateM)
import Control.Monad.Class.MonadAsync
import Control.Monad.Class.MonadFork
import Control.Monad.Class.MonadSay
Expand Down Expand Up @@ -770,8 +770,7 @@ multinodeExperiment inboundTrTracer trTracer inboundTracer cmTracer
(mkNextRequests connVar)
timeLimitsHandshake
acceptedConnLimit
( \ connectionManager _ serverAsync -> do
linkOnly (const True) serverAsync
( \ connectionManager _ _serverAsync -> do
connectionLoop SingInitiatorResponderMode localAddr cc connectionManager Map.empty connVar
)
-- `JobPool` does not catch any async exceptions, so we
Expand Down Expand Up @@ -837,12 +836,11 @@ multinodeExperiment inboundTrTracer trTracer inboundTracer cmTracer
-> StrictTVar m (Map.Map (ConnectionId peerAddr) (TemperatureBundle (StrictTQueue m [req])))
-- ^ mini protocol queues
-> m ()
connectionLoop muxMode localAddr cc cm connMap0 connVar = go True connMap0
connectionLoop muxMode localAddr cc cm connMap0 connVar = go connMap0
where
go :: Bool -- if false do not run 'unregisterOutboundConnection'
-> Map.Map peerAddr (HandleWithExpandedCtx muxMode peerAddr DataFlowProtocolData ByteString m [resp] a) -- active connections
go :: Map.Map peerAddr (HandleWithExpandedCtx muxMode peerAddr DataFlowProtocolData ByteString m [resp] a) -- active connections
-> m ()
go !unregister !connMap = atomically (readTQueue cc) >>= \ case
go !connMap = atomically (readTQueue cc) >>= \ case
NewConnection remoteAddr -> do
let mkQueue :: forall pt. SingProtocolTemperature pt
-> STM m (StrictTQueue m [req])
Expand All @@ -860,18 +858,20 @@ multinodeExperiment inboundTrTracer trTracer inboundTracer cmTracer
$ requestOutboundConnection cm remoteAddr
case connHandle of
Left _ ->
go False connMap
go connMap
Right (Connected _ _ h) -> do
qs <- atomically $ sequenceA $ makeBundle mkQueue
atomically $ modifyTVar connVar
$ Map.insert (connId remoteAddr) qs
go True (Map.insert remoteAddr h connMap)
go (Map.insert remoteAddr h connMap)
Right Disconnected {} -> return ()
Disconnect remoteAddr -> do
atomically $ modifyTVar connVar $ Map.delete (connId remoteAddr)
when unregister $
void (unregisterOutboundConnection cm remoteAddr)
go False (Map.delete remoteAddr connMap)
atomically $ do
m <- readTVar connVar
check (Map.member (connId remoteAddr) m)
writeTVar connVar (Map.delete (connId remoteAddr) m)
void (unregisterOutboundConnection cm remoteAddr)
go (Map.delete remoteAddr connMap)
RunMiniProtocols remoteAddr reqs -> do
atomically $ do
mqs <- Map.lookup (connId remoteAddr) <$> readTVar connVar
Expand Down Expand Up @@ -908,8 +908,8 @@ multinodeExperiment inboundTrTracer trTracer inboundTracer cmTracer
Left {} -> do
atomically
$ modifyTVar connVar (Map.delete (connId remoteAddr))
go unregister (Map.delete remoteAddr connMap)
Right {} -> go unregister connMap
go (Map.delete remoteAddr connMap)
Right {} -> go connMap
Shutdown -> return ()
where
connId remoteAddr = ConnectionId { localAddress = localAddr
Expand Down