-- 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)
, proxyUUID = fromClusterUUID clusteruuid
, proxySelector = selectnode
, proxyConcurrencyConfig = concurrencyconfig
- , proxyProtocolVersion = protocolversion
+ , proxyClientProtocolVersion = protocolversion
}
proxy proxydone proxyparams othermsg
(protoerrhandler closenodes)
, proxyUUID = Remote.uuid r
, proxySelector = singleProxySelector remoteside
, proxyConcurrencyConfig = concurrencyconfig
- , proxyProtocolVersion = protocolversion
+ , proxyClientProtocolVersion = protocolversion
}
let runproxy othermsg' = proxy closer proxyparams
othermsg' errhandler
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
, Proxy.proxySelector = Proxy.singleProxySelector $
proxyConnectionRemoteSide proxyconn
, Proxy.proxyConcurrencyConfig = concurrencyconfig
- , Proxy.proxyProtocolVersion = protocolversion
+ , Proxy.proxyClientProtocolVersion = protocolversion
}
let proxy mrequestmessage = case mrequestmessage of
Just requestmessage -> do
-> [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
, 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
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
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) $
_ -> 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 $
| 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) $
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
* 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,