clean up protocol version for proxying
authorJoey Hess <joeyh@joeyh.name>
Fri, 26 Jul 2024 17:39:43 +0000 (13:39 -0400)
committerJoey Hess <joeyh@joeyh.name>
Fri, 26 Jul 2024 17:49:05 +0000 (13:49 -0400)
The proxy always checks the protocol version of a remote before talking
to it in a version-specific way, so the protocol version in the ProxyParams
is the client's protocol version. The remote will always be at the same or
an older protocol version than the client.

Note that in relayDATAFinish, when the client is at protocol version 0,
the remote must thus be as well, and that's why its version is not
checked in the case for that.

With that clarified, it's evident that, in P2P.Http.State, there's no
need to look at the proxied remote's protocol version at all.

Annex/Cluster.hs
Command/P2PStdIO.hs
P2P/Http/State.hs
P2P/Proxy.hs
doc/todo/git-annex_proxies.mdwn

index 0f748ef732d28b8def24f461e5e7ea73c8671e4f..e43cc737bd435bdb3b90da6043172b7f30455dc7 100644 (file)
@@ -51,9 +51,8 @@ proxyCluster clusteruuid proxydone servermode clientside protoerrhandler = do
                -- known at this point, and would be too expensive to
                -- determine. Instead, pick the newest protocol version
                -- that we and the client both speak. The proxy code
-               -- checks protocol versions when operating on multiple
-               -- nodes, and allows nodes to have different protocol
-               -- versions.
+               -- checks protocol versions of remotes, so nodes can
+               -- have different protocol versions.
                let protocolversion = min maxProtocolVersion clientmaxversion
                sendClientProtocolVersion clientside othermsg protocolversion
                        (getclientbypass protocolversion) (protoerrhandler noop)
@@ -76,7 +75,7 @@ proxyCluster clusteruuid proxydone servermode clientside protoerrhandler = do
                        , proxyUUID = fromClusterUUID clusteruuid
                        , proxySelector = selectnode
                        , proxyConcurrencyConfig = concurrencyconfig
-                       , proxyProtocolVersion = protocolversion
+                       , proxyClientProtocolVersion = protocolversion
                        }
                proxy proxydone proxyparams othermsg
                        (protoerrhandler closenodes)
index dfc4499601dec58b70322b0cd3db91af3ce0d493..cc5d675e5399e06de7477fb3ecd6f12403488de4 100644 (file)
@@ -84,7 +84,7 @@ performProxy clientuuid servermode r = do
                        , proxyUUID = Remote.uuid r
                        , proxySelector = singleProxySelector remoteside
                        , proxyConcurrencyConfig = concurrencyconfig
-                       , proxyProtocolVersion = protocolversion
+                       , proxyClientProtocolVersion = protocolversion
                        }
                let runproxy othermsg' = proxy closer proxyparams 
                        othermsg' errhandler
index 377357f7f9a5a5c70a8293a46fa76fcd86dbac0a..ac9898f8c802f25c6f9e62474d60cda3300ba821 100644 (file)
@@ -346,9 +346,8 @@ proxyConnection relv connparams workerpool proxyconn = do
                inAnnexWorker' workerpool $ do
                        proxystate <- liftIO Proxy.mkProxyState
                        concurrencyconfig <- Proxy.noConcurrencyConfig
-                       -- TODO run remote protocol to get its version and
-                       -- take minimum of that and connectionProtocolVersion
-                       let protocolversion = connectionProtocolVersion connparams
+                       let protocolversion = min remoteprotocolversion $
+                               connectionProtocolVersion connparams
                        let proxyparams = Proxy.ProxyParams
                                { Proxy.proxyMethods = mkProxyMethods
                                , Proxy.proxyState = proxystate
@@ -358,7 +357,7 @@ proxyConnection relv connparams workerpool proxyconn = do
                                , Proxy.proxySelector = Proxy.singleProxySelector $
                                        proxyConnectionRemoteSide proxyconn
                                , Proxy.proxyConcurrencyConfig = concurrencyconfig
-                               , Proxy.proxyProtocolVersion = protocolversion
+                               , Proxy.proxyClientProtocolVersion = protocolversion
                                }
                        let proxy mrequestmessage = case mrequestmessage of
                                Just requestmessage -> do
@@ -516,8 +515,8 @@ openProxyConnectionToRemote
        -> [UUID]
        -> Remote
        -> IO (Either SomeException ProxyConnection)
-openProxyConnectionToRemote workerpool protoversion bypass remote =
-       inAnnexWorker' workerpool (proxyRemoteSide protoversion bypass' remote) >>= \case
+openProxyConnectionToRemote workerpool clientmaxversion bypass remote =
+       inAnnexWorker' workerpool (proxyRemoteSide clientmaxversion bypass' remote) >>= \case
                Left ex -> return (Left ex)
                Right remoteside -> return $ Right $
                        ProxyConnection (Remote.uuid remote) remoteside
index d1d6aa860bb53fe3f9a2143f42b1dce936cf3047..e78ef5a12ea135e967b5ee29e4e2443282754b82 100644 (file)
@@ -208,10 +208,9 @@ data ProxyParams = ProxyParams
        , proxyUUID :: UUID
        , proxySelector :: ProxySelector
        , proxyConcurrencyConfig :: ConcurrencyConfig
-       , proxyProtocolVersion :: ProtocolVersion
-       -- ^ Protocol version being spoken between the proxy and the
-       -- client. When there are multiple remotes, some may speak an
-       -- earlier version.
+       , proxyClientProtocolVersion :: ProtocolVersion
+       -- ^ The remote(s) may speak an earlier version, or the same
+       -- version, but not a later version.
        }
 
 {- Proxy between the client and the remote. This picks up after
@@ -452,7 +451,7 @@ proxyRequest proxydone proxyparams requestcomplete requestmessage protoerrhandle
                protoerrhandler requestcomplete $
                        client $ net $ sendMessage $
                                let nonplussed = all (== proxyUUID proxyparams) us 
-                                       || proxyProtocolVersion proxyparams < ProtocolVersion 2
+                                       || proxyClientProtocolVersion proxyparams < ProtocolVersion 2
                                in if all (maybe False (fst . fst)) v'
                                        then if nonplussed
                                                then SUCCESS
@@ -496,7 +495,7 @@ proxyRequest proxydone proxyparams requestcomplete requestmessage protoerrhandle
                        relayDATAFinish (runRemoteSide remoteside) client $
                                relayonemessage client (runRemoteSide remoteside) $
                                        const requestcomplete
-       
+
        relayPUT remoteside k len = relayDATAStart (runRemoteSide remoteside) $
                relayDATACore len client (runRemoteSide remoteside) $
                        relayDATAFinish client (runRemoteSide remoteside) $
@@ -536,7 +535,7 @@ proxyRequest proxydone proxyparams requestcomplete requestmessage protoerrhandle
                        _ -> False
                l <- forMC (proxyConcurrencyConfig proxyparams) remotesides initiate
                if all alreadyhave l
-                       then if proxyProtocolVersion proxyparams < ProtocolVersion 2
+                       then if proxyClientProtocolVersion proxyparams < ProtocolVersion 2
                                then protoerrhandler requestcomplete $
                                        client $ net $ sendMessage ALREADY_HAVE
                                else protoerrhandler requestcomplete $
@@ -621,7 +620,7 @@ proxyRequest proxydone proxyparams requestcomplete requestmessage protoerrhandle
                | otherwise = relayonemessage x y (\_ () -> sendsuccessfailure)
 
        relayDATAFinishMulti k rs
-               | proxyProtocolVersion proxyparams == ProtocolVersion 0 = 
+               | proxyProtocolVersion proxyparams == ProtocolVersion 0 =
                        finish $ net receiveMessage
                | otherwise =
                        flip protoerrhandler (client $ net $ receiveMessage) $
@@ -646,7 +645,7 @@ proxyRequest proxydone proxyparams requestcomplete requestmessage protoerrhandle
                                        case concat (catMaybes storeduuids) of
                                                [] -> FAILURE
                                                us
-                                                       | proxyProtocolVersion proxyparams < ProtocolVersion 2 -> SUCCESS
+                                                       | proxyClientProtocolVersion proxyparams < ProtocolVersion 2 -> SUCCESS
                                                        | otherwise -> SUCCESS_PLUS us
 
        -- The associated file received from the P2P protocol
index 1eed6540c78d3a388bacb9c8d92313397efc5c5d..947114a703197077d86167e7a28b924666d1df80 100644 (file)
@@ -30,9 +30,6 @@ Planned schedule of work:
 
 * http server proxying hangs on git-annex copy --to it
 
-* http server proxying needs to get the version negotiated with the proxied
-  remote and feed that into the proxy function.
-
 * test http server proxying with special remotes
 
 * http server proxying needs to reuse connections to special remotes,