From b6e5e1277020b160e44e99cdedd8963e5c1c105e Mon Sep 17 00:00:00 2001 From: dvdrw Date: Tue, 9 Jun 2026 19:49:03 +0200 Subject: [PATCH] fix: deadlock when connecting/receiving connections rapidly --- src/Control/Actor/Network.hs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Control/Actor/Network.hs b/src/Control/Actor/Network.hs index 0b3cb21..e0a65f2 100644 --- a/src/Control/Actor/Network.hs +++ b/src/Control/Actor/Network.hs @@ -29,8 +29,10 @@ import Control.Concurrent.STM , readTMVar , readTVar , readTVarIO + , tryPutTMVar , tryTakeTMVar , writeTQueue + , writeTVar ) import Control.Exception (SomeException, try) import Control.Monad (forM_, forever, unless, void) @@ -112,7 +114,7 @@ handleNewConn ch = do Nothing -> return () Just p -> do modifyTVar (rtConnPromises rt) (Map.delete peerAddr) - putTMVar p ref + void $ tryPutTMVar p ref _else -> liftIO $ chClose ch -- Connection pool @@ -140,9 +142,11 @@ getOrCreateConn peer = do liftIO $ chSend ch (encode (NMHandshake (rtNodeId rt))) ref <- spawnConnTree peer ch liftIO $ atomically $ do - modifyTVar (rtConnections rt) (Map.insert peer ref) + conns <- readTVar (rtConnections rt) + unless (Map.member peer conns) $ + modifyTVar (rtConnections rt) (Map.insert peer ref) modifyTVar (rtConnPromises rt) (Map.delete peer) - putTMVar promise ref + void $ tryPutTMVar promise ref return ref -- Message dispatch