diff options
author | Thomas Munro | 2025-07-11 23:18:05 +0000 |
---|---|---|
committer | Thomas Munro | 2025-07-12 01:14:22 +0000 |
commit | 20b8b5dab983a11b8c8b5ba95f1d6f073ad26300 (patch) | |
tree | aac8c0bfe2fd05d3c4d83202c92feeb7f9314420 | |
parent | ccacaf4fae242cf71ed5d4f7c39ca0645ca4ca9c (diff) |
Fix stale idle flag when IO workers exit.
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 <[email protected]>
Reported-by: Andres Freund <[email protected]>
Discussion: https://postgr.es/m/t5aqjhkj6xdkido535pds7fk5z4finoxra4zypefjqnlieevbg%40357aaf6u525j
-rw-r--r-- | src/backend/storage/aio/method_worker.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/src/backend/storage/aio/method_worker.c b/src/backend/storage/aio/method_worker.c index 36be179678d..6454987e9f5 100644 --- a/src/backend/storage/aio/method_worker.c +++ b/src/backend/storage/aio/method_worker.c @@ -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); |