95 lines
3.9 KiB
Diff
95 lines
3.9 KiB
Diff
From b00d19ea455f45376d5393aae60588915c59898e Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Lubo=C5=A1=20Uhliarik?= <luhliari@redhat.com>
|
|
Date: Tue, 9 Dec 2025 16:08:47 +0100
|
|
Subject: [PATCH] * Increasing default `MDRetryDelay` to 30 seconds to
|
|
generate less bursty (#391)
|
|
|
|
traffic on errored renewals for the ACME CA. This leads to error retries
|
|
of 30s, 1 minute, 2, 4, etc. up to daily attempts.
|
|
* Checking that configuring `MDRetryDelay` will result in a positive
|
|
duration. A delay of 0 is not accepted.
|
|
---
|
|
README.md | 2 +-
|
|
src/md_cmd_main.c | 2 +-
|
|
src/md_status.c | 14 ++++++++++----
|
|
src/mod_md_config.c | 5 ++++-
|
|
4 files changed, 16 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/README.md b/README.md
|
|
index b3b2a7e..03ec74c 100644
|
|
--- a/README.md
|
|
+++ b/README.md
|
|
@@ -2371,7 +2371,7 @@ files as usual.
|
|
|
|
## MDRetryDelay
|
|
`MDRetryDelay duration`
|
|
-Default: 5s
|
|
+Default: 30s
|
|
|
|
The delay on a failed renewal before the next attempt is done. This doubles on every consecutive error with a
|
|
cap of 24 hours, e.g. daily retries. Furthermore, the effective delay is randomly jiggled by +-50%. This is
|
|
diff --git a/src/md_cmd_main.c b/src/md_cmd_main.c
|
|
index 7e7d209..4329e28 100644
|
|
--- a/src/md_cmd_main.c
|
|
+++ b/src/md_cmd_main.c
|
|
@@ -186,7 +186,7 @@ static apr_status_t cmd_process(md_cmd_ctx *ctx, const md_cmd_t *cmd)
|
|
}
|
|
if (APR_SUCCESS != (rv = md_reg_create(&ctx->reg, ctx->p, ctx->store,
|
|
md_cmd_ctx_get_option(ctx, MD_CMD_OPT_PROXY_URL),
|
|
- ctx->ca_file, apr_time_from_sec(2), 10,
|
|
+ ctx->ca_file, apr_time_from_sec(15), 10,
|
|
0, apr_time_from_sec(5)))) {
|
|
fprintf(stderr, "error %d creating registry from store: %s\n", rv, ctx->base_dir);
|
|
return APR_EINVAL;
|
|
diff --git a/src/md_status.c b/src/md_status.c
|
|
index 936c653..8d7d173 100644
|
|
--- a/src/md_status.c
|
|
+++ b/src/md_status.c
|
|
@@ -589,10 +589,16 @@ apr_time_t md_job_delay_on_errors(md_job_t *job, int err_count, const char *last
|
|
delay = max_delay;
|
|
}
|
|
else if (err_count > 0) {
|
|
- /* back off duration, depending on the errors we encounter in a row */
|
|
- delay = job->min_delay << (err_count - 1);
|
|
- if (delay > max_delay) {
|
|
- delay = max_delay;
|
|
+ /* back off duration, depending on the errors we encounter in a row.
|
|
+ * As apr_time_t is signed, this might wrap around*/
|
|
+ int i;
|
|
+ delay = job->min_delay;
|
|
+ for (i = 0; i < (err_count - 1); ++i) {
|
|
+ delay <<= 1;
|
|
+ if ((delay <= 0) || (delay > max_delay)) {
|
|
+ delay = max_delay;
|
|
+ break;
|
|
+ }
|
|
}
|
|
}
|
|
if (delay > 0) {
|
|
diff --git a/src/mod_md_config.c b/src/mod_md_config.c
|
|
index 500f0dd..a13e00d 100644
|
|
--- a/src/mod_md_config.c
|
|
+++ b/src/mod_md_config.c
|
|
@@ -85,7 +85,7 @@ static md_mod_conf_t defmc = {
|
|
"https://crt.sh?q=", /* default cert checker site url */
|
|
NULL, /* CA cert file to use */
|
|
apr_time_from_sec(MD_SECS_PER_DAY/2), /* default time between cert checks */
|
|
- apr_time_from_sec(5), /* minimum delay for retries */
|
|
+ apr_time_from_sec(30), /* minimum delay for retries */
|
|
13, /* retry_failover after 14 errors, with 5s delay ~ half a day */
|
|
0, /* store locks, disabled by default */
|
|
apr_time_from_sec(5), /* max time to wait to obaint a store lock */
|
|
@@ -654,6 +654,9 @@ static const char *md_config_set_min_delay(cmd_parms *cmd, void *dc, const char
|
|
if (md_duration_parse(&delay, value, "s") != APR_SUCCESS) {
|
|
return "unrecognized duration format";
|
|
}
|
|
+ if (delay <= 0) {
|
|
+ return "minimum delay must be greater than 0";
|
|
+ }
|
|
config->mc->min_delay = delay;
|
|
return NULL;
|
|
}
|
|
--
|
|
2.44.0
|
|
|