From f17f5862c2dd5c01a41143eb4d9d7eafae83618f Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Mon, 9 Aug 2021 22:48:48 +0000 Subject: [PATCH v2 1/1] add pg_ctl option for retreiving shmem size --- src/backend/bootstrap/bootstrap.c | 2 +- src/backend/postmaster/postmaster.c | 31 ++++++++++++++++++++++++------- src/backend/storage/ipc/ipci.c | 9 +++++++-- src/backend/tcop/postgres.c | 8 ++++++-- src/bin/pg_ctl/pg_ctl.c | 23 ++++++++++++++++++++++- src/include/storage/ipc.h | 2 +- 6 files changed, 61 insertions(+), 14 deletions(-) diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index 48615c0ebc..9e57591add 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -324,7 +324,7 @@ BootstrapModeMain(int argc, char *argv[], bool check_only) InitializeMaxBackends(); - CreateSharedMemoryAndSemaphores(); + (void) CreateSharedMemoryAndSemaphores(false); /* * XXX: It might make sense to move this into its own function at some diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index fc0bc8d99e..5227ce372f 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -586,6 +586,7 @@ PostmasterMain(int argc, char *argv[]) bool listen_addr_saved = false; int i; char *output_config_variable = NULL; + bool output_shmem = false; InitProcessGlobals(); @@ -709,7 +710,7 @@ PostmasterMain(int argc, char *argv[]) * tcop/postgres.c (the option sets should not conflict) and with the * common help() function in main/main.c. */ - while ((opt = getopt(argc, argv, "B:bc:C:D:d:EeFf:h:ijk:lN:nOPp:r:S:sTt:W:-:")) != -1) + while ((opt = getopt(argc, argv, "B:bc:C:D:d:EeFf:h:ijk:lMN:nOPp:r:S:sTt:W:-:")) != -1) { switch (opt) { @@ -775,6 +776,10 @@ PostmasterMain(int argc, char *argv[]) SetConfigOption("ssl", "true", PGC_POSTMASTER, PGC_S_ARGV); break; + case 'M': + output_shmem = true; + break; + case 'N': SetConfigOption("max_connections", optarg, PGC_POSTMASTER, PGC_S_ARGV); break; @@ -1026,6 +1031,18 @@ PostmasterMain(int argc, char *argv[]) */ InitializeMaxBackends(); + if (output_shmem) + { + char output[64]; + Size size; + + size = CreateSharedMemoryAndSemaphores(true); + sprintf(output, "%zu", size); + + puts(output); + ExitPostmaster(0); + } + /* * Set up shared memory and semaphores. */ @@ -2673,7 +2690,7 @@ reset_shared(void) * (if using SysV shmem and/or semas). This helps ensure that we will * clean up dead IPC objects if the postmaster crashes and is restarted. */ - CreateSharedMemoryAndSemaphores(); + (void) CreateSharedMemoryAndSemaphores(false); } @@ -5017,7 +5034,7 @@ SubPostmasterMain(int argc, char *argv[]) InitProcess(); /* Attach process to shared data structures */ - CreateSharedMemoryAndSemaphores(); + (void) CreateSharedMemoryAndSemaphores(false); /* And run the backend */ BackendRun(&port); /* does not return */ @@ -5035,7 +5052,7 @@ SubPostmasterMain(int argc, char *argv[]) InitAuxiliaryProcess(); /* Attach process to shared data structures */ - CreateSharedMemoryAndSemaphores(); + (void) CreateSharedMemoryAndSemaphores(false); auxtype = atoi(argv[3]); AuxiliaryProcessMain(auxtype); /* does not return */ @@ -5049,7 +5066,7 @@ SubPostmasterMain(int argc, char *argv[]) InitProcess(); /* Attach process to shared data structures */ - CreateSharedMemoryAndSemaphores(); + (void) CreateSharedMemoryAndSemaphores(false); AutoVacLauncherMain(argc - 2, argv + 2); /* does not return */ } @@ -5062,7 +5079,7 @@ SubPostmasterMain(int argc, char *argv[]) InitProcess(); /* Attach process to shared data structures */ - CreateSharedMemoryAndSemaphores(); + (void) CreateSharedMemoryAndSemaphores(false); AutoVacWorkerMain(argc - 2, argv + 2); /* does not return */ } @@ -5080,7 +5097,7 @@ SubPostmasterMain(int argc, char *argv[]) InitProcess(); /* Attach process to shared data structures */ - CreateSharedMemoryAndSemaphores(); + (void) CreateSharedMemoryAndSemaphores(false); /* Fetch MyBgworkerEntry from shared memory */ shmem_slot = atoi(argv[1] + 15); diff --git a/src/backend/storage/ipc/ipci.c b/src/backend/storage/ipc/ipci.c index 3e4ec53a97..0202e59748 100644 --- a/src/backend/storage/ipc/ipci.c +++ b/src/backend/storage/ipc/ipci.c @@ -91,8 +91,8 @@ RequestAddinShmemSpace(Size size) * check IsUnderPostmaster, rather than EXEC_BACKEND, to detect this case. * This is a bit code-wasteful and could be cleaned up.) */ -void -CreateSharedMemoryAndSemaphores(void) +Size +CreateSharedMemoryAndSemaphores(bool size_only) { PGShmemHeader *shim = NULL; @@ -161,6 +161,9 @@ CreateSharedMemoryAndSemaphores(void) /* might as well round it off to a multiple of a typical page size */ size = add_size(size, 8192 - (size % 8192)); + if (size_only) + return size; + elog(DEBUG3, "invoking IpcMemoryCreate(size=%zu)", size); /* @@ -288,4 +291,6 @@ CreateSharedMemoryAndSemaphores(void) */ if (shmem_startup_hook) shmem_startup_hook(); + + return 0; } diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 58b5960e27..eee4307fec 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -3711,7 +3711,7 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx, * postmaster/postmaster.c (the option sets should not conflict) and with * the common help() function in main/main.c. */ - while ((flag = getopt(argc, argv, "B:bc:C:D:d:EeFf:h:ijk:lN:nOPp:r:S:sTt:v:W:-:")) != -1) + while ((flag = getopt(argc, argv, "B:bc:C:D:d:EeFf:h:ijk:lMN:nOPp:r:S:sTt:v:W:-:")) != -1) { switch (flag) { @@ -3777,6 +3777,10 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx, SetConfigOption("ssl", "true", ctx, gucsource); break; + case 'M': + /* ignored for consistency with postmaster */ + break; + case 'N': SetConfigOption("max_connections", optarg, ctx, gucsource); break; @@ -4051,7 +4055,7 @@ PostgresMain(int argc, char *argv[], /* Initialize MaxBackends (if under postmaster, was done already) */ InitializeMaxBackends(); - CreateSharedMemoryAndSemaphores(); + (void) CreateSharedMemoryAndSemaphores(false); } /* diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index 7985da0a94..9678185930 100644 --- a/src/bin/pg_ctl/pg_ctl.c +++ b/src/bin/pg_ctl/pg_ctl.c @@ -67,7 +67,8 @@ typedef enum KILL_COMMAND, REGISTER_COMMAND, UNREGISTER_COMMAND, - RUN_AS_SERVICE_COMMAND + RUN_AS_SERVICE_COMMAND, + OUTPUT_SHARED_MEMORY_COMMAND } CtlCommand; #define DEFAULT_WAIT 60 @@ -898,6 +899,9 @@ do_start(void) pm_pid = start_postmaster(); + if (ctl_command == OUTPUT_SHARED_MEMORY_COMMAND) + return; + if (do_wait) { /* @@ -2469,6 +2473,20 @@ main(int argc, char **argv) else if (strcmp(argv[optind], "runservice") == 0) ctl_command = RUN_AS_SERVICE_COMMAND; #endif + else if (strcmp(argv[optind], "output_shared_memory") == 0) + { + ctl_command = OUTPUT_SHARED_MEMORY_COMMAND; + + if (!post_opts) + post_opts = pstrdup("-M"); + else + { + char *old_post_opts = post_opts; + + post_opts = psprintf("%s %s", old_post_opts, "-M"); + free(old_post_opts); + } + } else { write_stderr(_("%s: unrecognized operation mode \"%s\"\n"), progname, argv[optind]); @@ -2572,6 +2590,9 @@ main(int argc, char **argv) pgwin32_doRunAsService(); break; #endif + case OUTPUT_SHARED_MEMORY_COMMAND: + do_start(); + break; default: break; } diff --git a/src/include/storage/ipc.h b/src/include/storage/ipc.h index 753a6dd4d7..cdb1dd266d 100644 --- a/src/include/storage/ipc.h +++ b/src/include/storage/ipc.h @@ -77,6 +77,6 @@ extern void check_on_shmem_exit_lists_are_empty(void); /* ipci.c */ extern PGDLLIMPORT shmem_startup_hook_type shmem_startup_hook; -extern void CreateSharedMemoryAndSemaphores(void); +extern Size CreateSharedMemoryAndSemaphores(bool size_only); #endif /* IPC_H */ -- 2.16.6