rest-server: handle failure in worker task setup correctly

if setting up a new worker fails after it has been inserted into the
WORKER_TASK_LIST, we need to clean it up instead of bubbling up the error right
away, else we "leak" the worker task and it never finishes..

a worker task that never finishes will indefinitely block shutdown
of the rest server process, including the "old" process when reloading
the rest server.

this issue was found in the wild on a system with lock contention on the
file-based lock covering task index updating leading to lock acquiring
timeouts.

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
This commit is contained in:
Fabian Grünbichler 2024-12-02 14:04:09 +01:00 committed by Thomas Lamprecht
parent 6e600c74a8
commit 4e51ac3527

View File

@ -923,7 +923,12 @@ impl WorkerTask {
set_worker_count(hash.len());
}
setup.update_active_workers(Some(&upid))?;
let res = setup.update_active_workers(Some(&upid));
if res.is_err() {
// needed to undo the insertion into WORKER_TASK_LIST above
worker.log_result(&res);
res?
}
Ok((worker, logger))
}