aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/storage/aio/aio_io.c6
-rw-r--r--src/backend/storage/aio/method_worker.c9
2 files changed, 15 insertions, 0 deletions
diff --git a/src/backend/storage/aio/aio_io.c b/src/backend/storage/aio/aio_io.c
index 36d2c1f492d..cc6d999a6fb 100644
--- a/src/backend/storage/aio/aio_io.c
+++ b/src/backend/storage/aio/aio_io.c
@@ -159,6 +159,12 @@ pgaio_io_before_prep(PgAioHandle *ioh)
Assert(pgaio_my_backend->handed_out_io == ioh);
Assert(pgaio_io_has_target(ioh));
Assert(ioh->op == PGAIO_OP_INVALID);
+
+ /*
+ * Otherwise the FDs referenced by the IO could be closed due to interrupt
+ * processing.
+ */
+ Assert(!INTERRUPTS_CAN_BE_PROCESSED());
}
/*
diff --git a/src/backend/storage/aio/method_worker.c b/src/backend/storage/aio/method_worker.c
index 2be6bb8972b..4a7853d13fa 100644
--- a/src/backend/storage/aio/method_worker.c
+++ b/src/backend/storage/aio/method_worker.c
@@ -477,6 +477,13 @@ IoWorkerMain(const void *startup_data, size_t startup_data_len)
MyIoWorkerId);
/*
+ * Prevent interrupts between pgaio_io_reopen() and
+ * pgaio_io_perform_synchronously() that otherwise could lead to
+ * the FD getting closed in that window.
+ */
+ HOLD_INTERRUPTS();
+
+ /*
* It's very unlikely, but possible, that reopen fails. E.g. due
* to memory allocations failing or file permissions changing or
* such. In that case we need to fail the IO.
@@ -502,6 +509,8 @@ IoWorkerMain(const void *startup_data, size_t startup_data_len)
* ensure we don't accidentally fail.
*/
pgaio_io_perform_synchronously(ioh);
+
+ RESUME_INTERRUPTS();
}
else
{