also generate a drop safety proof for move --from remote

This commit is contained in:
Joey Hess 2015-10-09 16:16:03 -04:00
parent b944da832b
commit e392ec112f
Failed to extract signature
4 changed files with 39 additions and 5 deletions

View file

@ -19,7 +19,7 @@ module Annex.NumCopies (
numCopiesCheck',
verifyEnoughCopiesToDrop,
verifiableCopies,
UnVerifiedCopy,
UnVerifiedCopy(..),
) where
import Common.Annex
@ -115,7 +115,7 @@ verifyEnoughCopiesToDrop
-> [UUID] -- repos to skip considering (generally untrusted remotes)
-> [VerifiedCopy] -- copies already verified to exist
-> [UnVerifiedCopy] -- places to check to see if they have copies
-> (SafeDropProof -> Annex a) -- action to perform to drop
-> (SafeDropProof -> Annex a) -- action to perform the drop
-> Annex a -- action to perform when unable to drop
-> Annex a
verifyEnoughCopiesToDrop nolocmsg key removallock need skip preverified tocheck dropaction nodropaction =

View file

@ -120,7 +120,7 @@ performRemote key afile numcopies remote = do
liftIO $ debugM "drop" $ unwords
[ "Dropping from remote"
, show remote
, "proof: "
, "proof:"
, show proof
]
ok <- Remote.removeKey remote key

View file

@ -1,6 +1,6 @@
{- git-annex command
-
- Copyright 2010-2013 Joey Hess <id@joeyh.name>
- Copyright 2010-2015 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU GPL version 3 or higher.
-}
@ -16,6 +16,9 @@ import qualified Remote
import Annex.UUID
import Annex.Transfer
import Logs.Presence
import Annex.NumCopies
import System.Log.Logger (debugM)
cmd :: Command
cmd = withGlobalOptions (jobsOption : annexedMatchingOptions) $
@ -170,6 +173,18 @@ fromPerform src move key afile = ifM (inAnnex key)
Remote.retrieveKeyFile src key afile t p
dispatch _ False = stop -- failed
dispatch False True = next $ return True -- copy complete
dispatch True True = do -- finish moving
-- Finish by dropping from remote, taking care to verify that
-- the copy here has not been lost somehow.
-- (NumCopies is 1 since we're moving.)
dispatch True True = verifyEnoughCopiesToDrop "" key Nothing
(NumCopies 1) [] [] [UnVerifiedHere] dropremote faileddropremote
dropremote proof = do
liftIO $ debugM "drop" $ unwords
[ "Dropping from remote"
, show src
, "proof:"
, show proof
]
ok <- Remote.removeKey src key
next $ Command.Drop.cleanupRemote key src ok
faileddropremote = error "Unable to drop from remote."

View file

@ -346,3 +346,22 @@ A drops B keeps C keeps
It can race other ways, but they all work out the same way essentially,
due to the locking.
</pre>
# the bug, with moves
`git annex move --from remote` is the same as a copy followed by drop --from,
so the same bug can occur then.
But, the implementation differs from Command.Drop, so will also
need some changes.
Command.Move.toPerform already locks local content for removal before
removing it, of course. So, that will interoperate fine with
concurrent drops/moves. Seems fine as-is.
Command.Move.fromPerform simply needs to lock the local content
in place before dropping it from the remote. This satisfies the need
for 1 locked copy when dropping from a remote, and so is sufficent to
fix the bug.
> done