From 781d41e003cb4ea494dfec805e3451599871efd0 Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 26 Oct 2026 20:08:55 +0100 Subject: [PATCH] Disable detached worker completions before draining jobs --- src/member_files/worker.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/member_files/worker.h b/src/member_files/worker.h index fc836d6f..0657ba6b 100644 --- a/src/member_files/worker.h +++ b/src/member_files/worker.h @@ -1,7 +1,8 @@ /* Единственный дисковый поток модуля. submit/done выполняются в uasync, work — * в pthread. Очередь ограничена; completion резервируется до передачи работы. - * Для обязательной очистки reserve выполняется до открытия файлов. destroy вне - * собственных callbacks ждёт работ и доставляет done, включая поставленные ими cleanup jobs. + * Для обязательной очистки reserve выполняется до открытия файлов. destroy в uasync + * ждёт работ и доставляет done, включая поставленные ими cleanup jobs; допустим из внешней команды. + * Отмена completion удаляет task и из общей очереди, и из ещё не исполненной части batch uasync. * data/arg заимствованы до done; worker освобождает только собственную оболочку работы. * ua/work/done и worker обязательны; ua живёт до конца destroy. Останавливать worker из done нельзя. */ #ifndef MEMBER_FILES_WORKER_H @@ -24,7 +25,7 @@ void mf_worker_submit(struct mf_worker* worker, mf_work_fn work, void* data, mf_ * После вызова резерв нельзя освобождать/использовать повторно. Work выполняется FIFO, done ровно один раз. */ void mf_worker_submit_reserved(struct mf_worker* worker, struct mf_work* reserved, mf_work_fn work, void* data, mf_done_fn done, void* arg); -// После quiesce владельца, вне собственных callbacks: дождаться работ и cleanup continuations без остановки pthread. +// После quiesce владельца в uasync, вне собственных done: дождаться работ и cleanup continuations, не останавливая pthread. // Не запускает uasync рекурсивно; порядок done при drain не обещается. NULL допустим. void mf_worker_drain(struct mf_worker* worker); /* Drain, затем join и освобождение. Работы не прерываются и получают обычный done(0); NULL допустим. */