Fix stale idle flag when IO workers exit.
authorThomas Munro <tmunro@postgresql.org>
Fri, 11 Jul 2025 23:18:05 +0000 (11:18 +1200)
committerThomas Munro <tmunro@postgresql.org>
Sat, 12 Jul 2025 01:11:47 +0000 (13:11 +1200)
Otherwise we could choose a worker that has exited and crash while
trying to wake it up.

Back-patch to 18.

Reported-by: Tomas Vondra <tomas@vondra.me>
Reported-by: Andres Freund <andres@anarazel.de>
Discussion: https://postgr.es/m/t5aqjhkj6xdkido535pds7fk5z4finoxra4zypefjqnlieevbg%40357aaf6u525j

src/backend/storage/aio/method_worker.c

index 36be179678d7adef527111a0f7f4a90d036fcfcc..6454987e9f5b92d4ca676e2638aded0eb5dda596 100644 (file)
@@ -172,6 +172,7 @@ pgaio_choose_idle_worker(void)
    /* Find the lowest bit position, and clear it. */
    worker = pg_rightmost_one_pos64(io_worker_control->idle_worker_mask);
    io_worker_control->idle_worker_mask &= ~(UINT64_C(1) << worker);
+   Assert(io_worker_control->workers[worker].in_use);
 
    return worker;
 }
@@ -316,6 +317,7 @@ pgaio_worker_die(int code, Datum arg)
    Assert(io_worker_control->workers[MyIoWorkerId].in_use);
    Assert(io_worker_control->workers[MyIoWorkerId].latch == MyLatch);
 
+   io_worker_control->idle_worker_mask &= ~(UINT64_C(1) << MyIoWorkerId);
    io_worker_control->workers[MyIoWorkerId].in_use = false;
    io_worker_control->workers[MyIoWorkerId].latch = NULL;
    LWLockRelease(AioWorkerSubmissionQueueLock);