Exposed annex.forward-retry git config
authorJoey Hess <joeyh@joeyh.name>
Fri, 4 Sep 2020 19:16:40 +0000 (15:16 -0400)
committerJoey Hess <joeyh@joeyh.name>
Fri, 4 Sep 2020 19:16:40 +0000 (15:16 -0400)
One reason is, 5 is an arbitrary number so ought to be configurable.

The real reason though, is I wanted to make the man page explain when
forward retry can override annex.retry, and having a config made the
man page easier to write.

Annex/Transfer.hs
CHANGELOG
Types/GitConfig.hs
doc/git-annex.mdwn

index 973690a8705febe9c13924007fc1d787d92cf025..3414431de19ca5f482a1784da30db5d08ae7af28 100644 (file)
@@ -217,13 +217,18 @@ stdRetry = combineRetryDeciders forwardRetry configuredRetry
  - transfer left off, and so it would make sense to keep retrying forever,
  - other remotes restart each transfer from the beginning, and so even if
  - forward progress is being made, it's not real progress. So, retry a
- - maximum of 5 times
+ - maximum of 5 times by default.
  -}
 forwardRetry :: RetryDecider
-forwardRetry = \numretries old new -> pure $ and
-       [ fromMaybe 0 (bytesComplete old) < fromMaybe 0 (bytesComplete new)
-       , numretries <= 5
-       ]
+forwardRetry numretries old new
+       | fromMaybe 0 (bytesComplete old) < fromMaybe 0 (bytesComplete new) =
+               (numretries <=) <$> maybe globalretrycfg pure remoteretrycfg
+       | otherwise = return False
+  where
+       globalretrycfg = fromMaybe 5 . annexForwardRetry
+               <$> Annex.getGitConfig
+       remoteretrycfg = remoteAnnexRetry =<<
+               (Remote.gitconfig <$> transferRemote new)
 
 {- Retries a number of times with growing delays in between when enabled
  - by git configuration. -}
index d9385aecc6c9b94d9a1c35dcfb6b7b81485964d4..e2a88941cd7ac4547ae2c819cb33c196ec41410d 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -27,6 +27,8 @@ git-annex (8.20200815) UNRELEASED; urgency=medium
   * Limit retrying of failed transfers when forward progress is being made
     to 5, to avoid some unusual edge cases where too much retrying could
     result in far more data transfer than makes sense.
+  * Exposed annex.forward-retry git config, to configure the forward retry
+    behavior that git-annex has had for a long time.
   * Retry transfers to exporttree=yes remotes same as for other remotes.
   * import: Retry downloads that fail, same as is done for downloads generally.
 
index d1dad78c1cb78ad199cc9d7e4f7cfb2550c7a346..1b441297fdd0bda516e3671c1c5452f5bd3de3b6 100644 (file)
@@ -114,6 +114,7 @@ data GitConfig = GitConfig
        , annexAddUnlocked :: Configurable (Maybe String)
        , annexSecureHashesOnly :: Bool
        , annexRetry :: Maybe Integer
+       , annexForwardRetry :: Maybe Integer
        , annexRetryDelay :: Maybe Seconds
        , annexAllowedUrlSchemes :: S.Set Scheme
        , annexAllowedIPAddresses :: String
@@ -196,6 +197,7 @@ extractGitConfig configsource r = GitConfig
                fmap Just $ getmaybe (annexConfig "addunlocked")
        , annexSecureHashesOnly = getbool (annexConfig "securehashesonly") False
        , annexRetry = getmayberead (annexConfig "retry")
+       , annexForwardRetry = getmayberead (annexConfig "forward-retry")
        , annexRetryDelay = Seconds
                <$> getmayberead (annexConfig "retrydelay")
        , annexAllowedUrlSchemes = S.fromList $ map mkScheme $
@@ -295,6 +297,7 @@ data RemoteGitConfig = RemoteGitConfig
        , remoteAnnexSpeculatePresent :: Bool
        , remoteAnnexBare :: Maybe Bool
        , remoteAnnexRetry :: Maybe Integer
+       , remoteAnnexForwardRetry :: Maybe Integer
        , remoteAnnexRetryDelay :: Maybe Seconds
        , remoteAnnexAllowUnverifiedDownloads :: Bool
        , remoteAnnexConfigUUID :: Maybe UUID
@@ -356,6 +359,7 @@ extractRemoteGitConfig r remotename = do
                , remoteAnnexSpeculatePresent = getbool "speculate-present" False
                , remoteAnnexBare = getmaybebool "bare"
                , remoteAnnexRetry = getmayberead "retry"
+               , remoteAnnexForwardRetry = getmayberead "forward-retry"
                , remoteAnnexRetryDelay = Seconds
                        <$> getmayberead "retrydelay"
                , remoteAnnexAllowUnverifiedDownloads = (== Just "ACKTHPPT") $
index a08d33877b12c5060c7a1f98797d3690bf598304..84cbfb611d4fc34cc504db2758598c02529f2487 100644 (file)
@@ -1356,9 +1356,16 @@ Remotes are configured using these settings in `.git/config`.
 
 * `remote.<name>.annex-retry`, `annex.retry`
 
-  Configure retries of failed transfers on a per-remote and general
-  basis, respectively. The value is the number of retries that can be
-  made of the same transfer. (default 0)
+  Number of times a transfer that fails can be retried. (default 0)
+
+* `remote.<name>.annex-forward-retry`, `annex.forward-retry`
+
+  If a transfer made some forward progress before failing,
+  this allows it to be retried even when `annex.retry` does not.
+  The value is the maximum number of times to do that. (default 5)
+
+  When both `annex.retry` and this are set, the maximum number of
+  retries is the larger of the two.
 
 * `remote.<name>.annex-retry-delay`, `annex.retry-delay`