fix: deadlock when connecting/receiving connections rapidly

This commit is contained in:
2026-06-09 19:49:03 +02:00
parent 05ea32f006
commit b6e5e12770
+6 -2
View File
@@ -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
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