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..f9287b7942 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; @@ -4269,48 +4214,6 @@ pgstat_get_crashed_backend_activity(int pid, char *buffer, int buflen) return NULL; } -const char * -pgstat_get_backend_desc(BackendType backendType) -{ - const char *backendDesc = "unknown process type"; - - switch (backendType) - { - 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; - } - - return backendDesc; -} - /* ------------------------------------------------------------ * Local support functions follow * ------------------------------------------------------------ @@ -4447,10 +4350,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..2b9ab32293 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -2259,6 +2259,11 @@ retry1: 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 @@ -4422,7 +4427,7 @@ BackendInitialize(Port *port) */ initStringInfo(&ps_data); if (am_walsender) - appendStringInfo(&ps_data, "%s ", pgstat_get_backend_desc(B_WAL_SENDER)); + appendStringInfo(&ps_data, "%s ", GetBackendTypeDesc(B_WAL_SENDER)); appendStringInfo(&ps_data, "%s ", port->user_name); if (!am_walsender) appendStringInfo(&ps_data, "%s ", port->database_name); 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/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index 54d2673254..cea01534a5 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -841,7 +841,7 @@ pg_stat_get_activity(PG_FUNCTION_ARGS) } else values[17] = - CStringGetTextDatum(pgstat_get_backend_desc(beentry->st_backendType)); + CStringGetTextDatum(GetBackendTypeDesc(beentry->st_backendType)); /* SSL information */ if (beentry->st_ssl) diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index cd099b0c70..a7b7b12249 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -57,6 +57,8 @@ ProcessingMode Mode = InitProcessing; +BackendType MyBackendType; + /* List of lock files to be removed at proc exit */ static List *lock_files = NIL; @@ -187,6 +189,59 @@ 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/backend/utils/misc/ps_status.c b/src/backend/utils/misc/ps_status.c index 8b160c0b40..584d770957 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 MyBackendType. + * + * 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 = GetBackendTypeDesc(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 6b9093733f..14fa127ab1 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -306,6 +306,28 @@ 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 7bc36c6583..1a19921f80 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 * ---------- @@ -1286,7 +1268,6 @@ extern const char *pgstat_get_wait_event_type(uint32 wait_event_info); extern const char *pgstat_get_backend_current_activity(int pid, bool checkUser); extern const char *pgstat_get_crashed_backend_activity(int pid, char *buffer, int buflen); -extern const char *pgstat_get_backend_desc(BackendType backendType); extern void pgstat_progress_start_command(ProgressCommandType cmdtype, Oid relid);