EINTR while resizing dsm segment. - Mailing list pgsql-hackers

From Kyotaro Horiguchi
Subject EINTR while resizing dsm segment.
Date
Msg-id 20200402.172540.1001501556479933332.horikyota.ntt@gmail.com
Whole thread Raw
Responses Re: EINTR while resizing dsm segment.
Re: EINTR while resizing dsm segment.
List pgsql-hackers
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


pgsql-hackers by date:

Previous
From: Michael Paquier
Date:
Subject: Re: pgbench - add \aset to store results of a combined query
Next
From: Julien Rouhaud
Date:
Subject: Re: WAL usage calculation patch