MINOR: acme: register the task in the ckch_store

This patch registers the task in the ckch_store so we don't run 2 tasks
at the same time for a given certificate.

Move the task creation under the lock and check if there was already a
task under the lock.
This commit is contained in:
William Lallemand 2025-04-16 17:12:43 +02:00
parent 115653bfc8
commit e778049ffc
2 changed files with 18 additions and 7 deletions

View File

@ -87,6 +87,7 @@ struct ckch_store {
struct list ckch_inst; /* list of ckch_inst which uses this ckch_node */ struct list ckch_inst; /* list of ckch_inst which uses this ckch_node */
struct list crtlist_entry; /* list of entries which use this store */ struct list crtlist_entry; /* list of entries which use this store */
struct ckch_conf conf; struct ckch_conf conf;
struct task *acme_task;
struct ebmb_node node; struct ebmb_node node;
char path[VAR_ARRAY]; char path[VAR_ARRAY];
}; };

View File

@ -1789,6 +1789,11 @@ static int cli_acme_renew_parse(char **args, char *payload, struct appctx *appct
goto err; goto err;
} }
if (store->acme_task != NULL) {
memprintf(&err, "An ACME task is already running for certificate '%s'.\n", args[2]);
goto err;
}
if (store->conf.acme.id == NULL) { if (store->conf.acme.id == NULL) {
memprintf(&err, "No ACME configuration defined for file '%s'.\n", args[2]); memprintf(&err, "No ACME configuration defined for file '%s'.\n", args[2]);
goto err; goto err;
@ -1806,6 +1811,18 @@ static int cli_acme_renew_parse(char **args, char *payload, struct appctx *appct
goto err; goto err;
} }
task = task_new_anywhere();
if (!task)
goto err;
task->nice = 0;
task->process = acme_process;
/* register the task in the store so we don't
* have 2 tasks at the same time
*/
store->acme_task = task;
HA_SPIN_UNLOCK(CKCH_LOCK, &ckch_lock); HA_SPIN_UNLOCK(CKCH_LOCK, &ckch_lock);
ctx = calloc(1, sizeof *ctx); ctx = calloc(1, sizeof *ctx);
@ -1855,15 +1872,8 @@ static int cli_acme_renew_parse(char **args, char *payload, struct appctx *appct
goto err; goto err;
} }
ctx->store = newstore; ctx->store = newstore;
ctx->cfg = cfg; ctx->cfg = cfg;
task = task_new_anywhere();
if (!task)
goto err;
task->nice = 0;
task->process = acme_process;
task->context = ctx; task->context = ctx;
task_wakeup(task, TASK_WOKEN_INIT); task_wakeup(task, TASK_WOKEN_INIT);