v5-0002-Move-postmaster-C-logic-to-after-processing-prelo.patch

application/octet-stream

Filename: v5-0002-Move-postmaster-C-logic-to-after-processing-prelo.patch
Type: application/octet-stream
Part: 3
Message: Re: Estimating HugePages Requirements?

Patch

Format: format-patch
Series: patch v5-0002
Subject: Move postmaster "-C" logic to after processing preload libraries.
File+
src/backend/postmaster/postmaster.c 18 15
From ba43a45c5ace5573589735514284d2dd1a6aec42 Mon Sep 17 00:00:00 2001
From: Nathan Bossart <bossartn@amazon.com>
Date: Fri, 3 Sep 2021 16:41:31 +0000
Subject: [PATCH v5 2/4] Move postmaster "-C" logic to after processing preload
 libraries.

This change allows us to return correct values for runtime-computed
GUCs such as data_checksums and for future GUCs related to the
amount of shared memory required for the server.

One notable behavior change is that "-C" will now run all preload
libraries' _PG_init() functions without locking the data directory.
If a library's _PG_init() function might do something that would
break a running server, it will need to be adjusted to be safe.
---
 src/backend/postmaster/postmaster.c | 33 ++++++++++++++++++---------------
 1 file changed, 18 insertions(+), 15 deletions(-)

diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 9c2c98614a..0fa2f41ddc 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -893,20 +893,6 @@ PostmasterMain(int argc, char *argv[])
 	if (!SelectConfigFiles(userDoption, progname))
 		ExitPostmaster(2);
 
-	if (output_config_variable != NULL)
-	{
-		/*
-		 * "-C guc" was specified, so print GUC's value and exit.  No extra
-		 * permission check is needed because the user is reading inside the
-		 * data dir.
-		 */
-		const char *config_val = GetConfigOption(output_config_variable,
-												 false, false);
-
-		puts(config_val ? config_val : "");
-		ExitPostmaster(0);
-	}
-
 	/* Verify that DataDir looks reasonable */
 	checkDataDir();
 
@@ -982,8 +968,12 @@ PostmasterMain(int argc, char *argv[])
 	 * is responsible for removing both data directory and socket lockfiles;
 	 * so it must happen before opening sockets so that at exit, the socket
 	 * lockfiles go away after CloseServerPorts runs.
+	 *
+	 * We skip this step if we are just going to print a GUC's value and exit
+	 * a few steps down.
 	 */
-	CreateDataDirLockFile(true);
+	if (output_config_variable == NULL)
+		CreateDataDirLockFile(true);
 
 	/*
 	 * Read the control file (for error checking and config info).
@@ -1026,6 +1016,19 @@ PostmasterMain(int argc, char *argv[])
 	 */
 	InitializeMaxBackends();
 
+	/*
+	 * If user requested that we print a GUC's value and exit (via "-C guc"),
+	 * do that now since we've loaded all configurations.
+	 */
+	if (output_config_variable != NULL)
+	{
+		const char *config_val = GetConfigOption(output_config_variable,
+												 false, false);
+
+		puts(config_val ? config_val : "");
+		ExitPostmaster(0);
+	}
+
 	/*
 	 * Set up shared memory and semaphores.
 	 */
-- 
2.16.6