From 852185c2428fdaaafb240b74d99663bc5f6627e1 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 15 Aug 2014 14:17:05 -0400 Subject: [PATCH] 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. --- Annex/Transfer.hs | 16 ++++++++++++++-- Command/SendKey.hs | 8 ++++++++ debian/changelog | 3 +++ doc/bugs/protocol_mismatch_after_interrupt.mdwn | 2 ++ 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Annex/Transfer.hs b/Annex/Transfer.hs index ebc8e8b899..5e98a87d9f 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 a201d1b89a..6b5127aca2 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 eaa36b3621..c55fbabd32 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 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 837690eac8..c2c1590578 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]]