Don't clobber postmaster sigmask in dsm_impl_resize.
authorThomas Munro <[email protected]>
Thu, 14 Jul 2022 13:23:29 +0000 (01:23 +1200)
committerThomas Munro <[email protected]>
Thu, 14 Jul 2022 14:00:09 +0000 (02:00 +1200)
Commit 4518c798 intended to block signals in regular backends that
allocate DSM segments, but dsm_impl_resize() is also reached by
dsm_postmaster_startup().  It's not OK to clobber the postmaster's
signal mask, so only manipulate the signal mask when under the
postmaster.

Back-patch to all releases, like 4518c798.

Discussion: https://postgr.es/m/CA%2BhUKGKNpK%3D2OMeea_AZwpLg7Bm4%3DgYWk7eDjZ5F6YbozfOf8w%40mail.gmail.com

src/backend/storage/ipc/dsm_impl.c

index 258d47bcfacf6ea1da6a7de90f6a3e428e7eecb3..0247d13a9135981ba6b542103f36ea0b09beb768 100644 (file)
@@ -362,7 +362,8 @@ dsm_impl_posix_resize(int fd, off_t size)
     * allowed SIGUSR1 to interrupt us repeatedly (for example, due to recovery
     * conflicts), the retry loop might never succeed.
     */
-   PG_SETMASK(&BlockSig);
+   if (IsUnderPostmaster)
+       PG_SETMASK(&BlockSig);
 
    pgstat_report_wait_start(WAIT_EVENT_DSM_ALLOCATE);
 #if defined(HAVE_POSIX_FALLOCATE) && defined(__linux__)
@@ -398,9 +399,12 @@ dsm_impl_posix_resize(int fd, off_t size)
 #endif
    pgstat_report_wait_end();
 
-   save_errno = errno;
-   PG_SETMASK(&UnBlockSig);
-   errno = save_errno;
+   if (IsUnderPostmaster)
+   {
+       save_errno = errno;
+       PG_SETMASK(&UnBlockSig);
+       errno = save_errno;
+   }
 
    return rc;
 }