checkpresent support for clusters
This assumes that the proxy for a cluster has up-to-date location logs. If it didn't, it might proxy the checkpresent to a node that no longer has the content, while some other node still does, and so it would incorrectly appear that the cluster no longer contains the content. Since cluster UUIDs are not stored to location logs, git-annex fsck --fast when claiming to fix a location log when that occurred would not cause any problems. And presumably the location tracking would later get sorted out. At least usually, changes to the content of nodes goes via the proxy, and it will update its location logs, so they will be accurate. However, if there were multiple proxies to the same cluster, or nodes were accessed directly (or via proxy to the node and not the cluster), the proxy's location log could certainly be wrong. (The location log access for GET has the same issues.)
This commit is contained in:
parent
88d9a02f7c
commit
f049156a03
3 changed files with 26 additions and 17 deletions
14
P2P/Proxy.hs
14
P2P/Proxy.hs
|
@ -54,7 +54,7 @@ closeRemoteSide remoteside =
|
|||
- actions.
|
||||
- -}
|
||||
data ProxySelector = ProxySelector
|
||||
{ proxyCHECKPRESENT :: Key -> Annex RemoteSide
|
||||
{ proxyCHECKPRESENT :: Key -> Annex (Maybe RemoteSide)
|
||||
, proxyLOCKCONTENT :: Key -> Annex (Maybe RemoteSide)
|
||||
, proxyUNLOCKCONTENT :: Annex (Maybe RemoteSide)
|
||||
, proxyREMOVE :: Key -> Annex RemoteSide
|
||||
|
@ -64,7 +64,7 @@ data ProxySelector = ProxySelector
|
|||
|
||||
singleProxySelector :: RemoteSide -> ProxySelector
|
||||
singleProxySelector r = ProxySelector
|
||||
{ proxyCHECKPRESENT = const (pure r)
|
||||
{ proxyCHECKPRESENT = const (pure (Just r))
|
||||
, proxyLOCKCONTENT = const (pure (Just r))
|
||||
, proxyUNLOCKCONTENT = pure (Just r)
|
||||
, proxyREMOVE = const (pure r)
|
||||
|
@ -160,9 +160,13 @@ proxy proxydone proxymethods servermode (ClientSide clientrunst clientconn) prox
|
|||
|
||||
proxyclientmessage Nothing = proxydone
|
||||
proxyclientmessage (Just message) = case message of
|
||||
CHECKPRESENT k -> do
|
||||
remoteside <- proxyCHECKPRESENT proxyselector k
|
||||
proxyresponse remoteside message (const proxynextclientmessage)
|
||||
CHECKPRESENT k -> proxyCHECKPRESENT proxyselector k >>= \case
|
||||
Just remoteside ->
|
||||
proxyresponse remoteside message
|
||||
(const proxynextclientmessage)
|
||||
Nothing ->
|
||||
protoerrhandler proxynextclientmessage $
|
||||
client $ net $ sendMessage FAILURE
|
||||
LOCKCONTENT k -> proxyLOCKCONTENT proxyselector k >>= \case
|
||||
Just remoteside ->
|
||||
proxyresponse remoteside message
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue