add connProcess to P2PConnection

When using the new generic P2P transport to open an outgoing connection
to a peer, this will hold the pid of the git-annex-p2p-<netname>
command.

closeConnection simply waits for it. Rather than relying on garbage
collection of the closed handles to close it.

In Remote.Helper.Ssh, connProcess is set to Nothing, even though there
is a similar process being used there. That code stores the pid in
OpenConnection instead, and handles waiting for it itself. A bit ugly,
but not worth cleaning up at this point, maybe later.
This commit is contained in:
Joey Hess 2025-07-30 12:25:59 -04:00
commit a6f8248465
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
6 changed files with 13 additions and 2 deletions

View file

@ -90,6 +90,7 @@ proxySpecialRemoteSide clientmaxversion r = mkRemoteSide r $ do
, connCheckAuth = const False , connCheckAuth = const False
, connIhdl = P2PHandleTMVar ihdl (Just iwaitv) iclosedv , connIhdl = P2PHandleTMVar ihdl (Just iwaitv) iclosedv
, connOhdl = P2PHandleTMVar ohdl (Just owaitv) oclosedv , connOhdl = P2PHandleTMVar ohdl (Just owaitv) oclosedv
, connProcess = Nothing
, connIdent = ConnIdent (Just (Remote.name r)) , connIdent = ConnIdent (Just (Remote.name r))
} }
let closeremoteconn = do let closeremoteconn = do

View file

@ -138,6 +138,7 @@ checkHiddenService = bracket setup cleanup go
, connCheckAuth = const False , connCheckAuth = const False
, connIhdl = P2PHandle h , connIhdl = P2PHandle h
, connOhdl = P2PHandle h , connOhdl = P2PHandle h
, connProcess = Nothing
, connIdent = ConnIdent Nothing , connIdent = ConnIdent Nothing
} }
runst <- mkRunState Client runst <- mkRunState Client

View file

@ -406,10 +406,10 @@ mkP2PConnectionPair connparams (n1, n2) = do
(if connectionWaitVar connparams then Just wait2 else Nothing) (if connectionWaitVar connparams then Just wait2 else Nothing)
closed2 closed2
let clientconn = P2PConnection Nothing let clientconn = P2PConnection Nothing
(const True) h2 h1 (const True) h2 h1 Nothing
(ConnIdent (Just n1)) (ConnIdent (Just n1))
let serverconn = P2PConnection Nothing let serverconn = P2PConnection Nothing
(const True) h1 h2 (const True) h1 h2 Nothing
(ConnIdent (Just n2)) (ConnIdent (Just n2))
return (clientconn, serverconn) return (clientconn, serverconn)

View file

@ -97,6 +97,7 @@ data P2PConnection = P2PConnection
, connCheckAuth :: (AuthToken -> Bool) , connCheckAuth :: (AuthToken -> Bool)
, connIhdl :: P2PHandle , connIhdl :: P2PHandle
, connOhdl :: P2PHandle , connOhdl :: P2PHandle
, connProcess :: Maybe ProcessHandle
, connIdent :: ConnIdent , connIdent :: ConnIdent
} }
@ -115,6 +116,7 @@ stdioP2PConnection g = P2PConnection
, connCheckAuth = const False , connCheckAuth = const False
, connIhdl = P2PHandle stdin , connIhdl = P2PHandle stdin
, connOhdl = P2PHandle stdout , connOhdl = P2PHandle stdout
, connProcess = Nothing
, connIdent = ConnIdent Nothing , connIdent = ConnIdent Nothing
} }
@ -129,6 +131,7 @@ stdioP2PConnectionDupped g = do
, connCheckAuth = const False , connCheckAuth = const False
, connIhdl = P2PHandle readh , connIhdl = P2PHandle readh
, connOhdl = P2PHandle writeh , connOhdl = P2PHandle writeh
, connProcess = Nothing
, connIdent = ConnIdent Nothing , connIdent = ConnIdent Nothing
} }
@ -141,6 +144,7 @@ connectPeer g (TorAnnex onionaddress onionport) = do
, connCheckAuth = const False , connCheckAuth = const False
, connIhdl = P2PHandle h , connIhdl = P2PHandle h
, connOhdl = P2PHandle h , connOhdl = P2PHandle h
, connProcess = Nothing
, connIdent = ConnIdent Nothing , connIdent = ConnIdent Nothing
} }
@ -148,6 +152,9 @@ closeConnection :: P2PConnection -> IO ()
closeConnection conn = do closeConnection conn = do
closehandle (connIhdl conn) closehandle (connIhdl conn)
closehandle (connOhdl conn) closehandle (connOhdl conn)
case connProcess conn of
Nothing -> noop
Just ph -> void $ waitForProcess ph
where where
closehandle (P2PHandle h) = hClose h closehandle (P2PHandle h) = hClose h
closehandle (P2PHandleTMVar _ _ closedv) = closehandle (P2PHandleTMVar _ _ closedv) =

View file

@ -270,6 +270,7 @@ openP2PShellConnection' r maxprotoversion bypass = do
, P2P.connCheckAuth = const False , P2P.connCheckAuth = const False
, P2P.connIhdl = P2P.P2PHandle to , P2P.connIhdl = P2P.P2PHandle to
, P2P.connOhdl = P2P.P2PHandle from , P2P.connOhdl = P2P.P2PHandle from
, P2P.connProcess = Nothing
, P2P.connIdent = P2P.ConnIdent $ , P2P.connIdent = P2P.ConnIdent $
Just $ "git-annex-shell connection " ++ show pidnum Just $ "git-annex-shell connection " ++ show pidnum
} }

View file

@ -115,6 +115,7 @@ serveClient th@(TransportHandle _ _ rd) u r q = bracket setup cleanup start
, connCheckAuth = (`isAllowedAuthToken` allowed) , connCheckAuth = (`isAllowedAuthToken` allowed)
, connIhdl = P2PHandle h , connIhdl = P2PHandle h
, connOhdl = P2PHandle h , connOhdl = P2PHandle h
, connProcess = Nothing
, connIdent = ConnIdent $ Just "tor remotedaemon" , connIdent = ConnIdent $ Just "tor remotedaemon"
} }
-- not really Client, but we don't know their uuid yet -- not really Client, but we don't know their uuid yet