aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2014-08-15 14:17:05 -0400
committerGravatar Joey Hess <joey@kitenet.net>2014-08-15 14:17:05 -0400
commitf448a738b8322a07994831e256e3f46207ee4950 (patch)
treeb7ab0302e7994bd2c1e78c13965914c49b40de55
parentb38491100168141f2a1daa089a5416a92014ec25 (diff)
git-annex-shell sendkey: Don't fail if a remote asks for a key to be sent that already has a transfer lock file indicating it's being sent to that remote. The remote may have moved between networks, or reconnected.
-rw-r--r--Annex/Transfer.hs16
-rw-r--r--Command/SendKey.hs8
-rw-r--r--debian/changelog3
-rw-r--r--doc/bugs/protocol_mismatch_after_interrupt.mdwn2
4 files changed, 27 insertions, 2 deletions
diff --git a/Annex/Transfer.hs b/Annex/Transfer.hs
index ebc8e8b89..5e98a87d9 100644
--- a/Annex/Transfer.hs
+++ b/Annex/Transfer.hs
@@ -12,6 +12,7 @@ module Annex.Transfer (
upload,
download,
runTransfer,
+ alwaysRunTransfer,
noRetry,
forwardRetry,
) where
@@ -46,12 +47,23 @@ download u key f d a _witness = runTransfer (Transfer Download u key) f d a
- no transfer information or lock file is used.
-}
runTransfer :: Transfer -> Maybe FilePath -> RetryDecider -> (MeterUpdate -> Annex Bool) -> Annex Bool
-runTransfer t file shouldretry a = do
+runTransfer = runTransfer' False
+
+{- Like runTransfer, but ignores any existing transfer lock file for the
+ - transfer, allowing re-running a transfer that is already in progress.
+ -
+ - Note that this may result in confusing progress meter display in the
+ - webapp, if multiple processes are writing to the transfer info file. -}
+alwaysRunTransfer :: Transfer -> Maybe FilePath -> RetryDecider -> (MeterUpdate -> Annex Bool) -> Annex Bool
+alwaysRunTransfer = runTransfer' True
+
+runTransfer' :: Bool -> Transfer -> Maybe FilePath -> RetryDecider -> (MeterUpdate -> Annex Bool) -> Annex Bool
+runTransfer' ignorelock t file shouldretry a = do
info <- liftIO $ startTransferInfo file
(meter, tfile, metervar) <- mkProgressUpdater t info
mode <- annexFileMode
(fd, inprogress) <- liftIO $ prep tfile mode info
- if inprogress
+ if inprogress && not ignorelock
then do
showNote "transfer already in progress"
return False
diff --git a/Command/SendKey.hs b/Command/SendKey.hs
index a201d1b89..6b5127aca 100644
--- a/Command/SendKey.hs
+++ b/Command/SendKey.hs
@@ -47,3 +47,11 @@ fieldTransfer direction key a = do
(\u -> runTransfer (Transfer direction (toUUID u) key) afile noRetry a)
=<< Fields.getField Fields.remoteUUID
liftIO $ exitBool ok
+ where
+ {- Allow the key to be sent to the remote even if there seems to be
+ - another transfer of that key going on to that remote.
+ - That one may be stale, etc.
+ -}
+ runner
+ | direction == Upload = alwaysRunTransfer
+ | otherwise = runTransfer
diff --git a/debian/changelog b/debian/changelog
index eaa36b362..c55fbabd3 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -36,6 +36,9 @@ git-annex (5.20140718) UNRELEASED; urgency=medium
* S3, Glacier, WebDAV: Fix bug that prevented accessing the creds
when the repository was configured with encryption=shared embedcreds=yes.
* direct: Avoid leaving file content in misctemp if interrupted.
+ * git-annex-shell sendkey: Don't fail if a remote asks for a key to be sent
+ that already has a transfer lock file indicating it's being sent to that
+ remote. The remote may have moved between networks, or reconnected.
-- Joey Hess <joeyh@debian.org> Mon, 21 Jul 2014 14:41:26 -0400
diff --git a/doc/bugs/protocol_mismatch_after_interrupt.mdwn b/doc/bugs/protocol_mismatch_after_interrupt.mdwn
index 837690eac..c2c159057 100644
--- a/doc/bugs/protocol_mismatch_after_interrupt.mdwn
+++ b/doc/bugs/protocol_mismatch_after_interrupt.mdwn
@@ -29,3 +29,5 @@ git-annex: copy: 1 failed
workaround: `cd .git/annex/; mv transfer transfer.old` on the other side.
-- [[anarcat]]
+
+> [[fixed|done]] --[[Joey]]