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',
|
numCopiesCheck',
|
||||||
verifyEnoughCopiesToDrop,
|
verifyEnoughCopiesToDrop,
|
||||||
verifiableCopies,
|
verifiableCopies,
|
||||||
UnVerifiedCopy,
|
UnVerifiedCopy(..),
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Common.Annex
|
import Common.Annex
|
||||||
|
@ -115,7 +115,7 @@ verifyEnoughCopiesToDrop
|
||||||
-> [UUID] -- repos to skip considering (generally untrusted remotes)
|
-> [UUID] -- repos to skip considering (generally untrusted remotes)
|
||||||
-> [VerifiedCopy] -- copies already verified to exist
|
-> [VerifiedCopy] -- copies already verified to exist
|
||||||
-> [UnVerifiedCopy] -- places to check to see if they have copies
|
-> [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 -- action to perform when unable to drop
|
||||||
-> Annex a
|
-> Annex a
|
||||||
verifyEnoughCopiesToDrop nolocmsg key removallock need skip preverified tocheck dropaction nodropaction =
|
verifyEnoughCopiesToDrop nolocmsg key removallock need skip preverified tocheck dropaction nodropaction =
|
||||||
|
|
|
@ -120,7 +120,7 @@ performRemote key afile numcopies remote = do
|
||||||
liftIO $ debugM "drop" $ unwords
|
liftIO $ debugM "drop" $ unwords
|
||||||
[ "Dropping from remote"
|
[ "Dropping from remote"
|
||||||
, show remote
|
, show remote
|
||||||
, "proof: "
|
, "proof:"
|
||||||
, show proof
|
, show proof
|
||||||
]
|
]
|
||||||
ok <- Remote.removeKey remote key
|
ok <- Remote.removeKey remote key
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{- git-annex command
|
{- 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.
|
- Licensed under the GNU GPL version 3 or higher.
|
||||||
-}
|
-}
|
||||||
|
@ -16,6 +16,9 @@ import qualified Remote
|
||||||
import Annex.UUID
|
import Annex.UUID
|
||||||
import Annex.Transfer
|
import Annex.Transfer
|
||||||
import Logs.Presence
|
import Logs.Presence
|
||||||
|
import Annex.NumCopies
|
||||||
|
|
||||||
|
import System.Log.Logger (debugM)
|
||||||
|
|
||||||
cmd :: Command
|
cmd :: Command
|
||||||
cmd = withGlobalOptions (jobsOption : annexedMatchingOptions) $
|
cmd = withGlobalOptions (jobsOption : annexedMatchingOptions) $
|
||||||
|
@ -170,6 +173,18 @@ fromPerform src move key afile = ifM (inAnnex key)
|
||||||
Remote.retrieveKeyFile src key afile t p
|
Remote.retrieveKeyFile src key afile t p
|
||||||
dispatch _ False = stop -- failed
|
dispatch _ False = stop -- failed
|
||||||
dispatch False True = next $ return True -- copy complete
|
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
|
ok <- Remote.removeKey src key
|
||||||
next $ Command.Drop.cleanupRemote key src ok
|
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,
|
It can race other ways, but they all work out the same way essentially,
|
||||||
due to the locking.
|
due to the locking.
|
||||||
</pre>
|
</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