From f5219e4a0c845d86c8f48d975701ecd368cd0903 Mon Sep 17 00:00:00 2001 From: Mike Palmiotto Date: Tue, 17 Mar 2020 23:37:05 +0000 Subject: [PATCH 11/11] Move to new MyBackendType - Replace MySubprocessType with MyBackendType - Reshuffle the order of BackendType enums and move to subprocess.h - Move GetBackendTypeDesc to subprocess.c and use process_types struct - Change InitMySubprocess to more appropriate SetMySubprocess - Handle resetting of MyBackendType on StartSubprocess failure --- src/backend/bootstrap/bootstrap.c | 2 +- src/backend/postmaster/postmaster.c | 102 ++++++++++++++-------------- src/backend/postmaster/subprocess.c | 12 +++- src/backend/utils/error/elog.c | 1 + src/backend/utils/init/miscinit.c | 54 --------------- src/include/miscadmin.h | 22 ------ src/include/pgstat.h | 1 + src/include/postmaster/subprocess.h | 45 ++++++------ 8 files changed, 87 insertions(+), 152 deletions(-) diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index 38d45d9163..7c6673c0fc 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -316,7 +316,7 @@ AuxiliaryProcessMain(int argc, char *argv[]) /* * We've read the arguments and know what backend type we are. */ - InitMySubprocess((SubprocessType)MyAuxProcType); + SetMySubprocess((BackendType)MyAuxProcType); /* * Identify myself via ps diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index f979d505df..143b13cca6 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -147,7 +147,7 @@ BackgroundWorker *MyBgworkerEntry = NULL; RegisteredBgWorker *MyRegisteredBgWorker = NULL; /* Struct containing postmaster subprocess control info */ -SubprocessType MySubprocessType; +BackendType MyBackendType; /* The socket number we are listening for connections on */ int PostPortNumber; @@ -374,7 +374,7 @@ static void TerminateChildren(int signal); static int CountChildren(int target); static void maybe_start_bgworkers(void); static bool CreateOptsFile(int argc, char *argv[], char *fullprogname); -static pid_t StartSubprocess(SubprocessType type); +static pid_t StartSubprocess(BackendType type); static void StartAutovacuumWorker(void); static void MaybeStartWalReceiver(void); static void InitPostmasterDeathWatchHandle(void); @@ -460,7 +460,7 @@ typedef struct TimestampTz PgReloadTime; pg_time_t first_syslogger_file_time; - SubprocessType MySubprocessType; + BackendType MyBackendType; bool redirection_done; bool IsBinaryUpgrade; @@ -1035,7 +1035,7 @@ PostmasterMain(int argc, char *argv[]) /* * If enabled, start up syslogger collection subprocess */ - SysLoggerPID = StartSubprocess(SysLoggerType); + SysLoggerPID = StartSubprocess(B_LOGGER); /* * Reset whereToSendOutput from DestDebug (its starting state) to @@ -1341,7 +1341,7 @@ PostmasterMain(int argc, char *argv[]) /* * We're ready to rock and roll... */ - StartupPID = StartSubprocess(StartupType); + StartupPID = StartSubprocess(B_STARTUP); Assert(StartupPID != 0); StartupStatus = STARTUP_RUNNING; pmState = PM_STARTUP; @@ -1675,7 +1675,7 @@ ServerLoop(void) if (ConnProcPort) { - StartSubprocess(ClientBackendType); + StartSubprocess(B_BACKEND); /* * We no longer need the open socket or port structure @@ -1690,7 +1690,7 @@ ServerLoop(void) /* If we have lost the log collector, try to start a new one */ if (SysLoggerPID == 0 && Logging_collector) - SysLoggerPID = StartSubprocess(SysLoggerType); + SysLoggerPID = StartSubprocess(B_LOGGER); /* * If no background writer process is running, and we are not in a @@ -1701,9 +1701,9 @@ ServerLoop(void) pmState == PM_HOT_STANDBY) { if (CheckpointerPID == 0) - CheckpointerPID = StartSubprocess(CheckpointerType); + CheckpointerPID = StartSubprocess(B_CHECKPOINTER); if (BgWriterPID == 0) - BgWriterPID = StartSubprocess(BgWriterType); + BgWriterPID = StartSubprocess(B_BG_WRITER); } /* @@ -1712,7 +1712,7 @@ ServerLoop(void) * be writing any new WAL). */ if (WalWriterPID == 0 && pmState == PM_RUN) - WalWriterPID = StartSubprocess(WalWriterType); + WalWriterPID = StartSubprocess(B_WAL_WRITER); /* * If we have lost the autovacuum launcher, try to start a new one. We @@ -1724,7 +1724,7 @@ ServerLoop(void) (AutoVacuumingActive() || start_autovac_launcher) && pmState == PM_RUN) { - AutoVacPID = StartSubprocess(AutoVacuumLauncherType); + AutoVacPID = StartSubprocess(B_AUTOVAC_LAUNCHER); if (AutoVacPID != 0) start_autovac_launcher = false; /* signal processed */ } @@ -1732,11 +1732,11 @@ ServerLoop(void) /* If we have lost the stats collector, try to start a new one */ if (PgStatPID == 0 && (pmState == PM_RUN || pmState == PM_HOT_STANDBY)) - PgStatPID = StartSubprocess(PgstatCollectorType); + PgStatPID = StartSubprocess(B_STATS_COLLECTOR); /* If we have lost the archiver, try to start a new one. */ if (PgArchPID == 0 && PgArchStartupAllowed()) - PgArchPID = StartSubprocess(PgArchiverType); + PgArchPID = StartSubprocess(B_ARCHIVER); /* If we need to signal the autovacuum launcher, do so now */ if (avlauncher_needs_signal) @@ -2993,22 +2993,22 @@ reaper(SIGNAL_ARGS) * if this fails, we'll just try again later. */ if (CheckpointerPID == 0) - CheckpointerPID = StartSubprocess(CheckpointerType); + CheckpointerPID = StartSubprocess(B_CHECKPOINTER); if (BgWriterPID == 0) - BgWriterPID = StartSubprocess(BgWriterType); + BgWriterPID = StartSubprocess(B_BG_WRITER); if (WalWriterPID == 0) - WalWriterPID = StartSubprocess(WalWriterType); + WalWriterPID = StartSubprocess(B_WAL_WRITER); /* * Likewise, start other special children as needed. In a restart * situation, some of them may be alive already. */ if (!IsBinaryUpgrade && AutoVacuumingActive() && AutoVacPID == 0) - AutoVacPID = StartSubprocess(AutoVacuumLauncherType); + AutoVacPID = StartSubprocess(B_AUTOVAC_LAUNCHER); if (PgArchStartupAllowed() && PgArchPID == 0) - PgArchPID = StartSubprocess(PgArchiverType); + PgArchPID = StartSubprocess(B_ARCHIVER); if (PgStatPID == 0) - PgStatPID = StartSubprocess(PgstatCollectorType); + PgStatPID = StartSubprocess(B_STATS_COLLECTOR); /* workers may be scheduled to start now */ maybe_start_bgworkers(); @@ -3154,7 +3154,7 @@ reaper(SIGNAL_ARGS) LogChildExit(LOG, _("archiver process"), pid, exitstatus); if (PgArchStartupAllowed()) - PgArchPID = StartSubprocess(PgArchiverType); + PgArchPID = StartSubprocess(B_ARCHIVER); continue; } @@ -3170,7 +3170,7 @@ reaper(SIGNAL_ARGS) LogChildExit(LOG, _("statistics collector process"), pid, exitstatus); if (pmState == PM_RUN || pmState == PM_HOT_STANDBY) - PgStatPID = StartSubprocess(PgstatCollectorType); + PgStatPID = StartSubprocess(B_STATS_COLLECTOR); continue; } @@ -3179,7 +3179,7 @@ reaper(SIGNAL_ARGS) { SysLoggerPID = 0; /* for safety's sake, launch new logger *first* */ - SysLoggerPID = StartSubprocess(SysLoggerType); + SysLoggerPID = StartSubprocess(B_LOGGER); if (!EXIT_STATUS_0(exitstatus)) LogChildExit(LOG, _("system logger process"), pid, exitstatus); @@ -3979,7 +3979,7 @@ PostmasterStateMachine(void) Assert(Shutdown > NoShutdown); /* Start the checkpointer if not running */ if (CheckpointerPID == 0) - CheckpointerPID = StartSubprocess(CheckpointerType); + CheckpointerPID = StartSubprocess(B_CHECKPOINTER); /* And tell it to shut down */ if (CheckpointerPID != 0) { @@ -4120,7 +4120,7 @@ PostmasterStateMachine(void) reset_shared(); - StartupPID = StartSubprocess(StartupType); + StartupPID = StartSubprocess(B_STARTUP); Assert(StartupPID != 0); StartupStatus = STARTUP_RUNNING; pmState = PM_STARTUP; @@ -4903,7 +4903,7 @@ SubPostmasterMain(int argc, char *argv[]) /* We should only be here once per fork */ Assert(!MySubprocess); - InitMySubprocess(MySubprocessType); + SetMySubprocess(MyBackendType); /* * If appropriate, physically re-attach to shared memory segment. We want @@ -4927,9 +4927,9 @@ SubPostmasterMain(int argc, char *argv[]) PGSharedMemoryNoReAttach(); /* autovacuum needs this set before calling InitProcess */ - if (strcmp(argv[1], "--forkavlauncher") == 0) + if (MyBackendType == B_AUTOVAC_LAUNCHER) AutovacuumLauncherIAm(); - if (strcmp(argv[1], "--forkavworker") == 0) + if (MyBackendType == B_AUTOVAC_WORKER) AutovacuumWorkerIAm(); /* @@ -4985,7 +4985,7 @@ SubPostmasterMain(int argc, char *argv[]) } /* Run backend or appropriate child */ - if (MySubprocessType == ClientBackendType) + if (MyBackendType == B_BACKEND) { /* * Need to reinitialize the SSL library in the backend, since the @@ -5022,7 +5022,7 @@ SubPostmasterMain(int argc, char *argv[]) BackendInitialize(&port); } - if (MySubprocessType == BgWorkerType) + if (MyBackendType == B_BG_WORKER) { /* do this as early as possible; in particular, before InitProcess() */ IsBackgroundWorker = true; @@ -5040,27 +5040,27 @@ SubPostmasterMain(int argc, char *argv[]) CreateSharedMemoryAndSemaphores(); } - switch (MySubprocessType) + switch (MyBackendType) { - case AutoVacuumLauncherType: - case AutoVacuumWorkerType: + case B_AUTOVAC_LAUNCHER: + case B_AUTOVAC_WORKER: MySubprocess->entrypoint(argc - 2, argv + 2); break; - case BgWorkerType: + case B_BG_WORKER: /* Fetch MyBgworkerEntry from shared memory */ shmem_slot = atoi(argv[1] + 15); MyBgworkerEntry = BackgroundWorkerEntry(shmem_slot); /* fallthrough */ - case PgArchiverType: - case PgstatCollectorType: - case SysLoggerType: - case ClientBackendType: + case B_ARCHIVER: + case B_STATS_COLLECTOR: + case B_LOGGER: + case B_BACKEND: MySubprocess->entrypoint(argc, argv); break; default: ereport(LOG, (errmsg("could not start unknown process type (%d) under postmaster", - MySubprocessType))); + MyBackendType))); } abort(); /* shouldn't get here */ @@ -5144,9 +5144,9 @@ sigusr1_handler(SIGNAL_ARGS) * we'll just try again later. */ Assert(CheckpointerPID == 0); - CheckpointerPID = StartSubprocess(CheckpointerType); + CheckpointerPID = StartSubprocess(B_CHECKPOINTER); Assert(BgWriterPID == 0); - BgWriterPID = StartSubprocess(BgWriterType); + BgWriterPID = StartSubprocess(B_BG_WRITER); /* * Start the archiver if we're responsible for (re-)archiving received @@ -5154,7 +5154,7 @@ sigusr1_handler(SIGNAL_ARGS) */ Assert(PgArchPID == 0); if (XLogArchivingAlways()) - PgArchPID = StartSubprocess(PgArchiverType); + PgArchPID = StartSubprocess(B_ARCHIVER); /* * If we aren't planning to enter hot standby mode later, treat @@ -5178,7 +5178,7 @@ sigusr1_handler(SIGNAL_ARGS) * Likewise, start other special children as needed. */ Assert(PgStatPID == 0); - PgStatPID = StartSubprocess(PgstatCollectorType); + PgStatPID = StartSubprocess(B_STATS_COLLECTOR); ereport(LOG, (errmsg("database system is ready to accept read only connections"))); @@ -5383,8 +5383,9 @@ CountChildren(int target) * the subprocess cleanup function decides whether or not to panic. */ static pid_t -StartSubprocess(SubprocessType type) +StartSubprocess(BackendType type) { + BackendType prev_backend_type = MyBackendType; pid_t pid; char *argv[10]; int argc = 0; @@ -5396,7 +5397,7 @@ StartSubprocess(SubprocessType type) /* * Get new subprocess data every time we start a new subprocess. */ - InitMySubprocess(type); + SetMySubprocess(type); argv[argc++] = "postgres"; @@ -5414,6 +5415,7 @@ StartSubprocess(SubprocessType type) { if (MySubprocess->fork_prep(argc, argv)) { + SetMySubprocess(prev_backend_type); return 0; } } @@ -5433,7 +5435,7 @@ StartSubprocess(SubprocessType type) InitPostmasterChild(); /* Close the postmaster's sockets */ - ClosePostmasterPorts(MySubprocessType == SysLoggerType); + ClosePostmasterPorts(MyBackendType == B_LOGGER) /* * Release postmaster's working memory context if the subprocess doesn't @@ -5547,7 +5549,7 @@ StartAutovacuumWorker(void) bn->child_slot = MyPMChildSlot = AssignPostmasterChildSlot(); bn->bgworker_notify = false; - bn->pid = StartSubprocess(AutoVacuumWorkerType); + bn->pid = StartSubprocess(B_AUTOVAC_WORKER); if (bn->pid > 0) { bn->bkend_type = BACKEND_TYPE_AUTOVAC; @@ -5608,7 +5610,7 @@ MaybeStartWalReceiver(void) pmState == PM_HOT_STANDBY || pmState == PM_WAIT_READONLY) && Shutdown == NoShutdown) { - WalReceiverPID = StartSubprocess(WalReceiverType); + WalReceiverPID = StartSubprocess(B_WAL_RECEIVER); if (WalReceiverPID != 0) WalReceiverRequested = false; /* else leave the flag set, so we'll try again later */ @@ -5872,7 +5874,7 @@ maybe_start_bgworkers(void) * function will do that. */ MyRegisteredBgWorker = rw; - if (StartSubprocess(BgWorkerType) <= 0) + if (StartSubprocess(B_BG_WORKER) <= 0) { StartWorkerNeeded = true; return; @@ -5990,7 +5992,7 @@ save_backend_variables(BackendParameters *param, Port *port, param->PgReloadTime = PgReloadTime; param->first_syslogger_file_time = first_syslogger_file_time; - param->MySubprocessType = MySubprocessType; + param->MyBackendType = MyBackendType; param->redirection_done = redirection_done; param->IsBinaryUpgrade = IsBinaryUpgrade; @@ -6227,7 +6229,7 @@ restore_backend_variables(BackendParameters *param, Port *port) PgReloadTime = param->PgReloadTime; first_syslogger_file_time = param->first_syslogger_file_time; - MySubprocessType = param->MySubprocessType; + MyBackendType = param->MyBackendType; redirection_done = param->redirection_done; IsBinaryUpgrade = param->IsBinaryUpgrade; diff --git a/src/backend/postmaster/subprocess.c b/src/backend/postmaster/subprocess.c index 8cc88792ea..3bd9136f83 100644 --- a/src/backend/postmaster/subprocess.c +++ b/src/backend/postmaster/subprocess.c @@ -24,7 +24,7 @@ #include "postmaster/walwriter.h" #include "replication/walreceiver.h" -SubprocessType MySubprocessType; +BackendType MyBackendType; PgSubprocess *MySubprocess; static PgSubprocess process_types[] = { @@ -196,9 +196,15 @@ static PgSubprocess process_types[] = { }; void -InitMySubprocess(SubprocessType type) +SetMySubprocess(BackendType type) { - MySubprocessType = type; + MyBackendType = type; MySubprocess = &process_types[type]; MySubprocess->desc = gettext(MySubprocess->desc); } + +const char * +GetBackendTypeDesc(BackendType type) +{ + return gettext((&process_types[type])->desc); +} diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index 62eef7b71f..214fcb0522 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -74,6 +74,7 @@ #include "miscadmin.h" #include "postmaster/bgworker.h" #include "postmaster/postmaster.h" +#include "postmaster/subprocess.h" #include "postmaster/syslogger.h" #include "storage/ipc.h" #include "storage/proc.h" diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index a7b7b12249..3d36836413 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -189,60 +189,6 @@ SwitchBackToLocalLatch(void) SetLatch(MyLatch); } -const char * -GetBackendTypeDesc(BackendType backendType) -{ - const char *backendDesc = "unknown process type"; - - switch (backendType) - { - case B_INVALID: - backendDesc = "not initialized"; - break; - case B_AUTOVAC_LAUNCHER: - backendDesc = "autovacuum launcher"; - break; - case B_AUTOVAC_WORKER: - backendDesc = "autovacuum worker"; - break; - case B_BACKEND: - backendDesc = "client backend"; - break; - case B_BG_WORKER: - backendDesc = "background worker"; - break; - case B_BG_WRITER: - backendDesc = "background writer"; - break; - case B_CHECKPOINTER: - backendDesc = "checkpointer"; - break; - case B_STARTUP: - backendDesc = "startup"; - break; - case B_WAL_RECEIVER: - backendDesc = "walreceiver"; - break; - case B_WAL_SENDER: - backendDesc = "walsender"; - break; - case B_WAL_WRITER: - backendDesc = "walwriter"; - break; - case B_ARCHIVER: - backendDesc = "archiver"; - break; - case B_STATS_COLLECTOR: - backendDesc = "stats collector"; - break; - case B_LOGGER: - backendDesc = "logger"; - break; - } - - return backendDesc; -} - /* ---------------------------------------------------------------- * database path / name support stuff * ---------------------------------------------------------------- diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index 541ca5145d..36a65865ab 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -307,28 +307,6 @@ extern void InitStandaloneProcess(const char *argv0); extern void SwitchToSharedLatch(void); extern void SwitchBackToLocalLatch(void); -typedef enum BackendType -{ - B_INVALID = 0, - B_AUTOVAC_LAUNCHER, - B_AUTOVAC_WORKER, - B_BACKEND, - B_BG_WORKER, - B_BG_WRITER, - B_CHECKPOINTER, - B_STARTUP, - B_WAL_RECEIVER, - B_WAL_SENDER, - B_WAL_WRITER, - B_ARCHIVER, - B_STATS_COLLECTOR, - B_LOGGER, -} BackendType; - -extern BackendType MyBackendType; - -extern const char *GetBackendTypeDesc(BackendType backendType); - extern void SetDatabasePath(const char *path); extern void checkDataDir(void); extern void SetDataDir(const char *dir); diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 92943f5cff..48f9e313a6 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -17,6 +17,7 @@ #include "port/atomics.h" #include "portability/instr_time.h" #include "postmaster/pgarch.h" +#include "postmaster/subprocess.h" #include "storage/proc.h" #include "utils/hsearch.h" #include "utils/relcache.h" diff --git a/src/include/postmaster/subprocess.h b/src/include/postmaster/subprocess.h index 867e1cb499..7c86690daf 100644 --- a/src/include/postmaster/subprocess.h +++ b/src/include/postmaster/subprocess.h @@ -13,27 +13,27 @@ #include "postmaster.h" -typedef enum +typedef enum BackendType { - NoProcessType = -1, - CheckerType = 0, - BootstrapType, - StartupType, - BgWriterType, - CheckpointerType, - WalWriterType, - WalReceiverType, /* end of Auxiliary Process Forks */ - AutoVacuumLauncherType, - AutoVacuumWorkerType, - PgstatCollectorType, - PgArchiverType, - SysLoggerType, - BgWorkerType, - ClientBackendType, - - WalSenderType, /* placeholder for wal sender so it can be identified in pgstat */ - NUMSUBPROCESSTYPES /* Must be last! */ -} SubprocessType; + B_INVALID = -1, + B_CHECKER = 0, + B_BOOTSTRAP, + B_STARTUP, + B_BG_WRITER, + B_CHECKPOINTER, + B_WAL_WRITER, + B_WAL_RECEIVER, /* end of Auxiliary Process Forks */ + B_AUTOVAC_LAUNCHER, + B_AUTOVAC_WORKER, + B_STATS_COLLECTOR, + B_ARCHIVER, + B_LOGGER, + B_BG_WORKER, + B_BACKEND, + + B_WAL_SENDER, /* placeholder for wal sender so it can be identified in pgstat */ + NUMBACKENDTYPES /* Must be last! */ +} BackendType; typedef int (*SubprocessPrep) (int argc, char *argv[]); typedef void (*SubprocessEntryPoint) (int argc, char *argv[]); @@ -41,7 +41,8 @@ typedef bool (*SubprocessForkFailure) (int fork_errno); typedef void (*SubprocessPostmasterMain) (int argc, char *argv[]); /* Current subprocess initializer */ -extern void InitMySubprocess(SubprocessType type); +extern void SetMySubprocess(BackendType type); +extern const char *GetBackendTypeDesc(BackendType type); typedef struct PgSubprocess { @@ -56,7 +57,7 @@ typedef struct PgSubprocess SubprocessPostmasterMain postmaster_main; } PgSubprocess; -extern SubprocessType MySubprocessType; +extern BackendType MyBackendType; extern PGDLLIMPORT PgSubprocess *MySubprocess; #endif /* SUBPROCESS_H */ -- 2.21.1