I provided the subject, and added -hackers. > Hello, > I am running postgres 11.5 and we were having issues with shared segments. > So I increased the max_connection as suggested by you guys and reduced my > work_mem to 600M. > > Right now instead, it is the second time I see this error : > > ERROR: could not resize shared memory segment "/PostgreSQL.2137675995" to > 33624064 bytes: Interrupted system call The function posix_fallocate is protected against EINTR. | do | { | rc = posix_fallocate(fd, 0, size); | } while (rc == EINTR && !(ProcDiePending || QueryCancelPending)); But not for ftruncate and write. Don't we need to protect them from ENTRI as the attached? -- Kyotaro Horiguchi NTT Open Source Software Center
>From 590b783f93995bfd1ec05dbcb2805a577372604d Mon Sep 17 00:00:00 2001 From: Kyotaro Horiguchi <horikyoga.ntt@xxxxxxxxx> 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