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@gmail.com>
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