]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
tool: fix exponential retry delay
authorDaniel Stenberg <daniel@haxx.se>
Thu, 18 Sep 2025 06:49:22 +0000 (08:49 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 18 Sep 2025 08:15:54 +0000 (10:15 +0200)
Also, show retry delay with decimals since it might be not be integer
seconds.

Regression from da27db068fc888d7091d347080 (shipped in 8.16.0)

Reported-by: Andrew Olsen
Fixes #18591
Assisted-by: Jay Satiro
Closes #18595

src/tool_cfgable.c
src/tool_cfgable.h
src/tool_operate.c

index 0321848b0d5a95ae6321f54b87bd67eb15a96bb8..675f4d2d9da9f544b89532e2a48021ddcd862a36 100644 (file)
@@ -52,7 +52,6 @@ struct OperationConfig *config_alloc(void)
   config->ftp_skip_ip = TRUE;
   config->file_clobber_mode = CLOBBER_DEFAULT;
   config->upload_flags = CURLULFLAG_SEEN;
-  config->retry_delay_ms = RETRY_SLEEP_DEFAULT;
   curlx_dyn_init(&config->postdata, MAX_FILE2MEMORY);
   return config;
 }
index 5e7222a8a86d5de83462783a40f169dade863609..3b2ac93a74dec1332877c17453d86fbce8d6e1a7 100644 (file)
@@ -209,7 +209,8 @@ struct OperationConfig {
   long httpversion;
   unsigned long socks5_auth;/* auth bitmask for socks5 proxies */
   long req_retry;           /* number of retries */
-  long retry_delay_ms;      /* delay between retries (in milliseconds) */
+  long retry_delay_ms;      /* delay between retries (in milliseconds),
+                               0 means increase exponentially */
   long retry_maxtime_ms;    /* maximum time to keep retrying */
 
   unsigned long mime_options; /* Mime option flags. */
index 2c3030096f6ab6d8875c2b98250f9f556d125a8d..4337cdee60067a2644f27b32e87df30e0f33ca24 100644 (file)
@@ -437,7 +437,6 @@ static CURLcode retrycheck(struct OperationConfig *config,
       ": FTP error"
     };
 
-    sleeptime = per->retry_sleep;
     if(RETRY_HTTP == retry) {
       curl_easy_getinfo(curl, CURLINFO_RETRY_AFTER, &retry_after);
       if(retry_after) {
@@ -464,20 +463,28 @@ static CURLcode retrycheck(struct OperationConfig *config,
         }
       }
     }
+    if(!sleeptime && !config->retry_delay_ms) {
+      if(!per->retry_sleep)
+        per->retry_sleep = RETRY_SLEEP_DEFAULT;
+      else
+        per->retry_sleep *= 2;
+      if(per->retry_sleep > RETRY_SLEEP_MAX)
+        per->retry_sleep = RETRY_SLEEP_MAX;
+    }
+    if(!sleeptime)
+      sleeptime = per->retry_sleep;
     warnf("Problem %s. "
-          "Will retry in %ld second%s. "
+          "Will retry in %ld%s%.*ld second%s. "
           "%ld retr%s left.",
           m[retry], sleeptime/1000L,
+          (sleeptime%1000L ? "." : ""),
+          (sleeptime%1000L ? 3 : 0),
+          sleeptime%1000L,
           (sleeptime/1000L == 1 ? "" : "s"),
           per->retry_remaining,
           (per->retry_remaining > 1 ? "ies" : "y"));
 
     per->retry_remaining--;
-    if(!config->retry_delay_ms) {
-      per->retry_sleep *= 2;
-      if(per->retry_sleep > RETRY_SLEEP_MAX)
-        per->retry_sleep = RETRY_SLEEP_MAX;
-    }
 
     if(outs->bytes && outs->filename && outs->stream) {
 #ifndef __MINGW32CE__