also generate a drop safety proof for move --from remote
This commit is contained in:
parent
b944da832b
commit
e392ec112f
4 changed files with 39 additions and 5 deletions
|
@ -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 =
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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."
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue