Unify several ways to tracking backend type
authorPeter Eisentraut <peter@eisentraut.org>
Wed, 11 Mar 2020 15:36:40 +0000 (16:36 +0100)
committerPeter Eisentraut <peter@eisentraut.org>
Fri, 13 Mar 2020 13:01:10 +0000 (14:01 +0100)
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.  Since it's no longer just for stats, move to
miscinit.c and rename existing functions to match the expanded
purpose.

Reviewed-by: Julien Rouhaud <rjuju123@gmail.com>
Reviewed-by: Kuntal Ghosh <kuntalghosh.2007@gmail.com>
Reviewed-by: Alvaro Herrera <alvherre@2ndquadrant.com>
Discussion: https://www.postgresql.org/message-id/flat/c65e5196-4f04-4ead-9353-6088c19615a3@2ndquadrant.com

12 files changed:
src/backend/bootstrap/bootstrap.c
src/backend/postmaster/autovacuum.c
src/backend/postmaster/bgworker.c
src/backend/postmaster/pgarch.c
src/backend/postmaster/pgstat.c
src/backend/postmaster/postmaster.c
src/backend/postmaster/syslogger.c
src/backend/utils/adt/pgstatfuncs.c
src/backend/utils/init/miscinit.c
src/backend/utils/misc/ps_status.c
src/include/miscadmin.h
src/include/pgstat.h

index 7923d1ec9b2053ed897ad423b121b0499274610a..5480a024e05b5247c18792715e1baf3ba88c2ac3 100644 (file)
@@ -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)
index a6499fc3da637ae31df313ecbb9f7e79f44a5efc..da75e755f0ff769a47796757fe84bfd430c09bba 100644 (file)
@@ -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);
 
index 684250984d4f32ea14d71f7f94cece9f424b5bd1..6c684b5e12b913bd488ae96540d4f6aec4a98054 100644 (file)
@@ -688,7 +688,7 @@ StartBackgroundWorker(void)
 
        IsBackgroundWorker = true;
 
-       /* Identify myself via ps */
+       MyBackendType = B_BG_WORKER;
        init_ps_display(worker->bgw_name);
 
        /*
index 58f54544f60e67bf1621d658a42302673a585e26..01ffd6513c7c1401d09232dce4e92f3ddbd0c12b 100644 (file)
@@ -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();
 
index 107c96533668b8f41c49ceebe2d4f9404db439a8..f9287b794254be3aa5550a3b956b60d320b14239 100644 (file)
@@ -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.
index 46be78aadbf38b5a9d5730cefaa2eb68e231e671..2b9ab32293102e10f34f74f9adaaad74074ea4bd 100644 (file)
@@ -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);
index b394599236f004be1349a16b3023296164c5bab3..3b708c3f670a8e71d863e46e4c9e1a795747b5ab 100644 (file)
@@ -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
index 54d26732541ccbefc596fea9b361add02d70dfd9..cea01534a5ef3875c9fb4877963877ea90118b97 100644 (file)
@@ -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)
index cd099b0c709c5f64c0fb67544c70adee31ac0897..a7b7b12249d7551b42e5b233068403044c27bec9 100644 (file)
@@ -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
index 8b160c0b405c7aca3d2aecb8e02abdd576c9c90b..584d7709575ee278ae1b5507406a8242d3ac479d 100644 (file)
@@ -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 */
index 6b9093733fb98e723e5eb8b7166c2d34eb7da354..14fa127ab118aaa2f917fd02481c9b709b378c5e 100644 (file)
@@ -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);
index 7bc36c65838bcd45249721ba241821fc470bfe3a..1a19921f8039b92cc775667d95492d10b922f0ec 100644 (file)
@@ -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);