started on git-annex-shell cluster support
Works down to P2P protocol. The question now is, how to handle protocol version negotiation for clusters? Connecting to each node to find their protocol versions and using the lowest would be too expensive with a lot of nodes. So it seems that the cluster needs to pick its own protocol version to use with the client. Then it can either negotiate that same version with the nodes when it comes time to use them, or it can translate between multiple protocol versions. That seems complicated. Thinking it would be ok to refuse to use a node if it is not able to negotiate the same protocol version with it as with the client. That will mean that sometimes need nodes to be upgraded when upgrading the cluster's proxy. But protocol versions rarely change.
This commit is contained in:
parent
c7ad44e4d1
commit
291280ced2
5 changed files with 87 additions and 62 deletions
13
P2P/Proxy.hs
13
P2P/Proxy.hs
|
@ -12,7 +12,6 @@ module P2P.Proxy where
|
|||
import Annex.Common
|
||||
import P2P.Protocol
|
||||
import P2P.IO
|
||||
import qualified Remote
|
||||
import Utility.Metered (nullMeterUpdate)
|
||||
|
||||
import Control.Concurrent.STM
|
||||
|
@ -60,20 +59,20 @@ type ProtoErrorHandled r =
|
|||
- brought up yet.
|
||||
-}
|
||||
getClientProtocolVersion
|
||||
:: Remote
|
||||
:: UUID
|
||||
-> ClientSide
|
||||
-> (Maybe (ProtocolVersion, Maybe Message) -> Annex r)
|
||||
-> ProtoErrorHandled r
|
||||
getClientProtocolVersion remote (ClientSide clientrunst clientconn) cont protoerrhandler =
|
||||
protoerrhandler cont $ client $ getClientProtocolVersion' remote
|
||||
getClientProtocolVersion remoteuuid (ClientSide clientrunst clientconn) cont protoerrhandler =
|
||||
protoerrhandler cont $ client $ getClientProtocolVersion' remoteuuid
|
||||
where
|
||||
client = liftIO . runNetProto clientrunst clientconn
|
||||
|
||||
getClientProtocolVersion'
|
||||
:: Remote
|
||||
:: UUID
|
||||
-> Proto (Maybe (ProtocolVersion, Maybe Message))
|
||||
getClientProtocolVersion' remote = do
|
||||
net $ sendMessage (AUTH_SUCCESS (Remote.uuid remote))
|
||||
getClientProtocolVersion' remoteuuid = do
|
||||
net $ sendMessage (AUTH_SUCCESS remoteuuid)
|
||||
msg <- net receiveMessage
|
||||
case msg of
|
||||
Nothing -> return Nothing
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue