Set max_safe_fds whenever we create shared memory and semaphores.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 17 Dec 2024 17:23:26 +0000 (12:23 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 17 Dec 2024 17:23:26 +0000 (12:23 -0500)
Formerly we skipped this in bootstrap/check mode and in single-user
mode.  That's bad in check mode because it may allow accepting a
value of max_connections that doesn't actually work: on platforms
where semaphores consume file descriptors, there may not be enough
free FDs left over to satisfy fd.c, causing postmaster start to
fail.  It's also not great in single-user mode, because fd.c will
operate with just the minimum allowable value of max_safe_fds,
resulting in excess file open/close overhead if anything moderately
complicated is done in single-user mode.  (There may be some penalty
for bootstrap mode too, though probably not much.)

Discussion: https://postgr.es/m/2081982.1734393311@sss.pgh.pa.us

src/backend/bootstrap/bootstrap.c
src/backend/tcop/postgres.c

index a5217773ffc1b266d4aca6bca5387e109a8dd8e9..f3a7a007f772d682143b4ab2647d2d931f138e60 100644 (file)
@@ -334,6 +334,12 @@ BootstrapModeMain(int argc, char *argv[], bool check_only)
 
    CreateSharedMemoryAndSemaphores();
 
+   /*
+    * Estimate number of openable files.  This is essential too in --check
+    * mode, because on some platforms semaphores count as open files.
+    */
+   set_max_safe_fds();
+
    /*
     * XXX: It might make sense to move this into its own function at some
     * point. Right now it seems like it'd cause more code duplication than
index 3ce088f0bad7c39bfd1de4273f1019ab4b04a454..85902788181df16c686b1671ff85ff846e2a4e4d 100644 (file)
@@ -4099,8 +4099,18 @@ PostgresSingleUserMain(int argc, char *argv[],
     */
    InitializeWalConsistencyChecking();
 
+   /*
+    * Create shared memory etc.  (Nothing's really "shared" in single-user
+    * mode, but we must have these data structures anyway.)
+    */
    CreateSharedMemoryAndSemaphores();
 
+   /*
+    * Estimate number of openable files.  This must happen after setting up
+    * semaphores, because on some platforms semaphores count as open files.
+    */
+   set_max_safe_fds();
+
    /*
     * Remember stand-alone backend startup time,roughly at the same point
     * during startup that postmaster does so.