From ca31388319903484ef5bec3e9fc71cb9de321525 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 20 Feb 2020 18:14:33 +0100 Subject: [PATCH v3 2/4] Unify several ways to tracking backend type Add a new global variable MyBackendType that uses the same BackendType enum that was previously only used by the stats collector. That way several duplicate ways of checking what type a particular process is can be simplified. --- src/backend/bootstrap/bootstrap.c | 48 ++++++++---------- src/backend/postmaster/autovacuum.c | 8 +-- src/backend/postmaster/bgworker.c | 2 +- src/backend/postmaster/pgarch.c | 6 +-- src/backend/postmaster/pgstat.c | 75 ++++++----------------------- src/backend/postmaster/postmaster.c | 5 ++ src/backend/postmaster/syslogger.c | 3 +- src/backend/utils/init/globals.c | 2 + src/backend/utils/misc/ps_status.c | 11 ++++- src/include/miscadmin.h | 20 ++++++++ src/include/pgstat.h | 20 +------- 11 files changed, 81 insertions(+), 119 deletions(-) diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index 7923d1ec9b..5480a024e0 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -314,36 +314,28 @@ AuxiliaryProcessMain(int argc, char *argv[]) proc_exit(1); } - /* - * Identify myself via ps - */ - if (IsUnderPostmaster) + switch (MyAuxProcType) { - const char *statmsg; - - switch (MyAuxProcType) - { - case StartupProcess: - statmsg = pgstat_get_backend_desc(B_STARTUP); - break; - case BgWriterProcess: - statmsg = pgstat_get_backend_desc(B_BG_WRITER); - break; - case CheckpointerProcess: - statmsg = pgstat_get_backend_desc(B_CHECKPOINTER); - break; - case WalWriterProcess: - statmsg = pgstat_get_backend_desc(B_WAL_WRITER); - break; - case WalReceiverProcess: - statmsg = pgstat_get_backend_desc(B_WAL_RECEIVER); - break; - default: - statmsg = "??? process"; - break; - } - init_ps_display(statmsg); + case StartupProcess: + MyBackendType = B_STARTUP; + break; + case BgWriterProcess: + MyBackendType = B_BG_WRITER; + break; + case CheckpointerProcess: + MyBackendType = B_CHECKPOINTER; + break; + case WalWriterProcess: + MyBackendType = B_WAL_WRITER; + break; + case WalReceiverProcess: + MyBackendType = B_WAL_RECEIVER; + break; + default: + MyBackendType = B_INVALID; } + if (IsUnderPostmaster) + init_ps_display(NULL); /* Acquire configuration parameters, unless inherited from postmaster */ if (!IsUnderPostmaster) diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index a6499fc3da..da75e755f0 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -433,8 +433,8 @@ AutoVacLauncherMain(int argc, char *argv[]) am_autovacuum_launcher = true; - /* Identify myself via ps */ - init_ps_display(pgstat_get_backend_desc(B_AUTOVAC_LAUNCHER)); + MyBackendType = B_AUTOVAC_LAUNCHER; + init_ps_display(NULL); ereport(DEBUG1, (errmsg("autovacuum launcher started"))); @@ -1506,8 +1506,8 @@ AutoVacWorkerMain(int argc, char *argv[]) am_autovacuum_worker = true; - /* Identify myself via ps */ - init_ps_display(pgstat_get_backend_desc(B_AUTOVAC_WORKER)); + MyBackendType = B_AUTOVAC_WORKER; + init_ps_display(NULL); SetProcessingMode(InitProcessing); diff --git a/src/backend/postmaster/bgworker.c b/src/backend/postmaster/bgworker.c index 684250984d..6c684b5e12 100644 --- a/src/backend/postmaster/bgworker.c +++ b/src/backend/postmaster/bgworker.c @@ -688,7 +688,7 @@ StartBackgroundWorker(void) IsBackgroundWorker = true; - /* Identify myself via ps */ + MyBackendType = B_BG_WORKER; init_ps_display(worker->bgw_name); /* diff --git a/src/backend/postmaster/pgarch.c b/src/backend/postmaster/pgarch.c index 58f54544f6..01ffd6513c 100644 --- a/src/backend/postmaster/pgarch.c +++ b/src/backend/postmaster/pgarch.c @@ -238,10 +238,8 @@ PgArchiverMain(int argc, char *argv[]) pqsignal(SIGCHLD, SIG_DFL); PG_SETMASK(&UnBlockSig); - /* - * Identify myself via ps - */ - init_ps_display("archiver"); + MyBackendType = B_ARCHIVER; + init_ps_display(NULL); pgarch_MainLoop(); diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 107c965336..d39e21494e 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -2892,62 +2892,7 @@ pgstat_bestart(void) * out-of-line data. Those have to be handled separately, below. */ lbeentry.st_procpid = MyProcPid; - - if (MyBackendId != InvalidBackendId) - { - if (IsAutoVacuumLauncherProcess()) - { - /* Autovacuum Launcher */ - lbeentry.st_backendType = B_AUTOVAC_LAUNCHER; - } - else if (IsAutoVacuumWorkerProcess()) - { - /* Autovacuum Worker */ - lbeentry.st_backendType = B_AUTOVAC_WORKER; - } - else if (am_walsender) - { - /* Wal sender */ - lbeentry.st_backendType = B_WAL_SENDER; - } - else if (IsBackgroundWorker) - { - /* bgworker */ - lbeentry.st_backendType = B_BG_WORKER; - } - else - { - /* client-backend */ - lbeentry.st_backendType = B_BACKEND; - } - } - else - { - /* Must be an auxiliary process */ - Assert(MyAuxProcType != NotAnAuxProcess); - switch (MyAuxProcType) - { - case StartupProcess: - lbeentry.st_backendType = B_STARTUP; - break; - case BgWriterProcess: - lbeentry.st_backendType = B_BG_WRITER; - break; - case CheckpointerProcess: - lbeentry.st_backendType = B_CHECKPOINTER; - break; - case WalWriterProcess: - lbeentry.st_backendType = B_WAL_WRITER; - break; - case WalReceiverProcess: - lbeentry.st_backendType = B_WAL_RECEIVER; - break; - default: - elog(FATAL, "unrecognized process type: %d", - (int) MyAuxProcType); - } - } - + lbeentry.st_backendType = MyBackendType; lbeentry.st_proc_start_timestamp = MyStartTimestamp; lbeentry.st_activity_start_timestamp = 0; lbeentry.st_state_start_timestamp = 0; @@ -4276,6 +4221,9 @@ pgstat_get_backend_desc(BackendType backendType) switch (backendType) { + case B_INVALID: + backendDesc = "not initialized"; + break; case B_AUTOVAC_LAUNCHER: backendDesc = "autovacuum launcher"; break; @@ -4306,6 +4254,15 @@ pgstat_get_backend_desc(BackendType backendType) 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; @@ -4447,10 +4404,8 @@ PgstatCollectorMain(int argc, char *argv[]) pqsignal(SIGCHLD, SIG_DFL); PG_SETMASK(&UnBlockSig); - /* - * Identify myself via ps - */ - init_ps_display("stats collector"); + MyBackendType = B_STATS_COLLECTOR; + init_ps_display(NULL); /* * Read in existing stats files or initialize the stats to zero. diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 46be78aadb..c586b825ed 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -2259,6 +2259,11 @@ ProcessStartupPacket(Port *port, bool secure_done) if (strlen(port->user_name) >= NAMEDATALEN) port->user_name[NAMEDATALEN - 1] = '\0'; + if (am_walsender) + MyBackendType = B_WAL_SENDER; + else + MyBackendType = B_BACKEND; + /* * Normal walsender backends, e.g. for streaming replication, are not * connected to a particular database. But walsenders used for logical diff --git a/src/backend/postmaster/syslogger.c b/src/backend/postmaster/syslogger.c index b394599236..3b708c3f67 100644 --- a/src/backend/postmaster/syslogger.c +++ b/src/backend/postmaster/syslogger.c @@ -179,7 +179,8 @@ SysLoggerMain(int argc, char *argv[]) am_syslogger = true; - init_ps_display("logger"); + MyBackendType = B_LOGGER; + init_ps_display(NULL); /* * If we restarted, our stderr is already redirected into our own input diff --git a/src/backend/utils/init/globals.c b/src/backend/utils/init/globals.c index eb19644419..e75a29def7 100644 --- a/src/backend/utils/init/globals.c +++ b/src/backend/utils/init/globals.c @@ -78,6 +78,8 @@ char postgres_exec_path[MAXPGPATH]; /* full path to backend */ /* note: currently this is not valid in backend processes */ #endif +BackendType MyBackendType; + BackendId MyBackendId = InvalidBackendId; BackendId ParallelMasterBackendId = InvalidBackendId; diff --git a/src/backend/utils/misc/ps_status.c b/src/backend/utils/misc/ps_status.c index 8b160c0b40..0685a02a31 100644 --- a/src/backend/utils/misc/ps_status.c +++ b/src/backend/utils/misc/ps_status.c @@ -28,6 +28,7 @@ #include "libpq/libpq.h" #include "miscadmin.h" +#include "pgstat.h" #include "utils/guc.h" #include "utils/ps_status.h" @@ -247,14 +248,20 @@ save_ps_display_args(int argc, char **argv) /* * Call this once during subprocess startup to set the identification - * values. At this point, the original argv[] array may be overwritten. + * values. + * + * If fixed_part is NULL, a default will be obtained from BackendType. + * + * At this point, the original argv[] array may be overwritten. */ void init_ps_display(const char *fixed_part) { bool save_update_process_title; - Assert(fixed_part); + Assert(fixed_part || MyBackendType); + if (!fixed_part) + fixed_part = pgstat_get_backend_desc(MyBackendType); #ifndef PS_USE_NONE /* no ps display for stand-alone backend */ diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index f985453ec3..a41b6331da 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -178,6 +178,26 @@ extern char pkglib_path[]; extern char postgres_exec_path[]; #endif +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; + /* * done in storage/backendid.h for now. * diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 7bc36c6583..80a0d7df59 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -13,6 +13,7 @@ #include "datatype/timestamp.h" #include "libpq/pqcomm.h" +#include "miscadmin.h" #include "port/atomics.h" #include "portability/instr_time.h" #include "postmaster/pgarch.h" @@ -712,25 +713,6 @@ typedef struct PgStat_GlobalStats } PgStat_GlobalStats; -/* ---------- - * Backend types - * ---------- - */ -typedef enum BackendType -{ - 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 -} BackendType; - - /* ---------- * Backend states * ---------- -- 2.25.0