From 21fb39cb07938d29f2c7cfcf627d1b3d6b48e61c Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 17 Dec 2024 12:23:26 -0500 Subject: [PATCH] Set max_safe_fds whenever we create shared memory and semaphores. 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 | 6 ++++++ src/backend/tcop/postgres.c | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index a5217773ffc..f3a7a007f77 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -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 diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 3ce088f0bad..85902788181 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -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.