From 590b783f93995bfd1ec05dbcb2805a577372604d Mon Sep 17 00:00:00 2001 From: Kyotaro Horiguchi Date: Thu, 2 Apr 2020 17:09:35 +0900 Subject: [PATCH] Protect dsm_impl from EINTR dsm_impl functions should not error-out by EINTR. --- src/backend/storage/ipc/dsm_impl.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/backend/storage/ipc/dsm_impl.c b/src/backend/storage/ipc/dsm_impl.c index 1972aecbed..f4e7350a5e 100644 --- a/src/backend/storage/ipc/dsm_impl.c +++ b/src/backend/storage/ipc/dsm_impl.c @@ -360,7 +360,11 @@ dsm_impl_posix_resize(int fd, off_t size) int rc; /* Truncate (or extend) the file to the requested size. */ - rc = ftruncate(fd, size); + do + { + rc = ftruncate(fd, size); + } while (rc < 0 && errno == EINTR && + !(ProcDiePending || QueryCancelPending)); /* * On Linux, a shm_open fd is backed by a tmpfs file. After resizing with @@ -874,11 +878,19 @@ dsm_impl_mmap(dsm_op op, dsm_handle handle, Size request_size, while (success && remaining > 0) { Size goal = remaining; + Size rc; if (goal > ZBUFFER_SIZE) goal = ZBUFFER_SIZE; pgstat_report_wait_start(WAIT_EVENT_DSM_FILL_ZERO_WRITE); - if (write(fd, zbuffer, goal) == goal) + + do + { + rc = write(fd, zbuffer, goal); + } while (rc < 0 && errno == EINTR && + !(ProcDiePending || QueryCancelPending)); + + if (rc == goal) remaining -= goal; else success = false; -- 2.18.2