process startup: Move AuxiliaryProcessMain into its own file.
authorAndres Freund <andres@anarazel.de>
Thu, 5 Aug 2021 19:09:19 +0000 (12:09 -0700)
committerAndres Freund <andres@anarazel.de>
Thu, 5 Aug 2021 19:12:11 +0000 (12:12 -0700)
After the preceding commits the auxprocess code is independent from
bootstrap.c - so a dedicated file seems less confusing.

Author: Andres Freund <andres@anarazel.de>
Reviewed-By: Kyotaro Horiguchi <horikyota.ntt@gmail.com>
Reviewed-By: Robert Haas <robertmhaas@gmail.com>
Discussion: https://postgr.es/m/20210802164124.ufo5buo4apl6yuvs@alap3.anarazel.de

src/backend/bootstrap/bootstrap.c
src/backend/postmaster/Makefile
src/backend/postmaster/auxprocess.c [new file with mode: 0644]
src/backend/postmaster/postmaster.c
src/include/bootstrap/bootstrap.h
src/include/miscadmin.h
src/include/postmaster/auxprocess.h [new file with mode: 0644]

index e2c01e5625938c91900fad426a975d1add99ce02..80dc3b585f613249c6ee20ceb8df5bcf3fc8a8cc 100644 (file)
 #include "miscadmin.h"
 #include "nodes/makefuncs.h"
 #include "pg_getopt.h"
-#include "pgstat.h"
-#include "postmaster/bgwriter.h"
-#include "postmaster/startup.h"
-#include "postmaster/walwriter.h"
-#include "replication/walreceiver.h"
 #include "storage/bufmgr.h"
 #include "storage/bufpage.h"
 #include "storage/condition_variable.h"
@@ -47,7 +42,6 @@
 #include "utils/builtins.h"
 #include "utils/fmgroids.h"
 #include "utils/memutils.h"
-#include "utils/ps_status.h"
 #include "utils/rel.h"
 #include "utils/relmapper.h"
 
@@ -56,7 +50,6 @@ uint32                bootstrap_data_checksum_version = 0;    /* No checksum */
 
 static void CheckerModeMain(void);
 static void bootstrap_signals(void);
-static void ShutdownAuxiliaryProcess(int code, Datum arg);
 static Form_pg_attribute AllocateAttribute(void);
 static void populate_typ_list(void);
 static Oid     gettype(char *type);
@@ -67,8 +60,6 @@ static void cleanup(void);
  * ----------------
  */
 
-AuxProcType MyAuxProcType = NotAnAuxProcess;   /* declared in miscadmin.h */
-
 Relation       boot_reldesc;           /* current relation descriptor */
 
 Form_pg_attribute attrtypes[MAXATTR];  /* points to attribute info */
@@ -184,139 +175,6 @@ typedef struct _IndexList
 static IndexList *ILHead = NULL;
 
 
-/*
- *      AuxiliaryProcessMain
- *
- *      The main entry point for auxiliary processes, such as the bgwriter,
- *      walwriter, walreceiver, bootstrapper and the shared memory checker code.
- *
- *      This code is here just because of historical reasons.
- */
-void
-AuxiliaryProcessMain(AuxProcType auxtype)
-{
-       Assert(IsUnderPostmaster);
-
-       MyAuxProcType = auxtype;
-
-       switch (MyAuxProcType)
-       {
-               case StartupProcess:
-                       MyBackendType = B_STARTUP;
-                       break;
-               case ArchiverProcess:
-                       MyBackendType = B_ARCHIVER;
-                       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:
-                       elog(ERROR, "something has gone wrong");
-                       MyBackendType = B_INVALID;
-       }
-
-       init_ps_display(NULL);
-
-       SetProcessingMode(BootstrapProcessing);
-       IgnoreSystemIndexes = true;
-
-       BaseInit();
-
-       /*
-        * As an auxiliary process, we aren't going to do the full InitPostgres
-        * pushups, but there are a couple of things that need to get lit up even
-        * in an auxiliary process.
-        */
-
-       /*
-        * Create a PGPROC so we can use LWLocks.  In the EXEC_BACKEND case, this
-        * was already done by SubPostmasterMain().
-        */
-#ifndef EXEC_BACKEND
-       InitAuxiliaryProcess();
-#endif
-
-       /*
-        * Assign the ProcSignalSlot for an auxiliary process.  Since it doesn't
-        * have a BackendId, the slot is statically allocated based on the
-        * auxiliary process type (MyAuxProcType).  Backends use slots indexed in
-        * the range from 1 to MaxBackends (inclusive), so we use MaxBackends +
-        * AuxProcType + 1 as the index of the slot for an auxiliary process.
-        *
-        * This will need rethinking if we ever want more than one of a particular
-        * auxiliary process type.
-        */
-       ProcSignalInit(MaxBackends + MyAuxProcType + 1);
-
-       /* finish setting up bufmgr.c */
-       InitBufferPoolBackend();
-
-       /*
-        * Auxiliary processes don't run transactions, but they may need a
-        * resource owner anyway to manage buffer pins acquired outside
-        * transactions (and, perhaps, other things in future).
-        */
-       CreateAuxProcessResourceOwner();
-
-       /* Initialize statistics reporting */
-       pgstat_initialize();
-
-       /* Initialize backend status information */
-       pgstat_beinit();
-       pgstat_bestart();
-
-       /* register a before-shutdown callback for LWLock cleanup */
-       before_shmem_exit(ShutdownAuxiliaryProcess, 0);
-
-       SetProcessingMode(NormalProcessing);
-
-       switch (MyAuxProcType)
-       {
-               case CheckerProcess:
-               case BootstrapProcess:
-                       pg_unreachable();
-                       break;
-
-               case StartupProcess:
-                       StartupProcessMain();
-                       proc_exit(1);
-
-               case ArchiverProcess:
-                       PgArchiverMain();
-                       proc_exit(1);
-
-               case BgWriterProcess:
-                       BackgroundWriterMain();
-                       proc_exit(1);
-
-               case CheckpointerProcess:
-                       CheckpointerMain();
-                       proc_exit(1);
-
-               case WalWriterProcess:
-                       InitXLOGAccess();
-                       WalWriterMain();
-                       proc_exit(1);
-
-               case WalReceiverProcess:
-                       WalReceiverMain();
-                       proc_exit(1);
-
-               default:
-                       elog(PANIC, "unrecognized process type: %d", (int) MyAuxProcType);
-                       proc_exit(1);
-       }
-}
-
 /*
  * In shared memory checker mode, all we really want to do is create shared
  * memory and semaphores (just to prove we can do it with the current GUC
@@ -554,21 +412,6 @@ bootstrap_signals(void)
        pqsignal(SIGQUIT, SIG_DFL);
 }
 
-/*
- * Begin shutdown of an auxiliary process.  This is approximately the equivalent
- * of ShutdownPostgres() in postinit.c.  We can't run transactions in an
- * auxiliary process, so most of the work of AbortTransaction() is not needed,
- * but we do need to make sure we've released any LWLocks we are holding.
- * (This is only critical during an error exit.)
- */
-static void
-ShutdownAuxiliaryProcess(int code, Datum arg)
-{
-       LWLockReleaseAll();
-       ConditionVariableCancelSleep();
-       pgstat_report_wait_end();
-}
-
 /* ----------------------------------------------------------------
  *                             MANUAL BACKEND INTERACTIVE INTERFACE COMMANDS
  * ----------------------------------------------------------------
index bfdf6a833db3d20be06203ad4373ad3762b2e86c..787c6a2c3bf0df294117fcdfa779924a1651ac8d 100644 (file)
@@ -14,6 +14,7 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = \
        autovacuum.o \
+       auxprocess.o \
        bgworker.o \
        bgwriter.o \
        checkpointer.o \
diff --git a/src/backend/postmaster/auxprocess.c b/src/backend/postmaster/auxprocess.c
new file mode 100644 (file)
index 0000000..c391c96
--- /dev/null
@@ -0,0 +1,194 @@
+/*-------------------------------------------------------------------------
+ * auxprocess.c
+ *       functions related to auxiliary processes.
+ *
+ *
+ * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ *       src/backend/postmaster/auxprocess.c
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <unistd.h>
+#include <signal.h>
+
+#include "libpq/pqsignal.h"
+#include "miscadmin.h"
+#include "pgstat.h"
+#include "postmaster/auxprocess.h"
+#include "postmaster/bgwriter.h"
+#include "postmaster/startup.h"
+#include "postmaster/walwriter.h"
+#include "replication/walreceiver.h"
+#include "storage/bufmgr.h"
+#include "storage/bufpage.h"
+#include "storage/condition_variable.h"
+#include "storage/ipc.h"
+#include "storage/proc.h"
+#include "tcop/tcopprot.h"
+#include "utils/memutils.h"
+#include "utils/ps_status.h"
+#include "utils/rel.h"
+
+
+static void ShutdownAuxiliaryProcess(int code, Datum arg);
+
+
+/* ----------------
+ *             global variables
+ * ----------------
+ */
+
+AuxProcType MyAuxProcType = NotAnAuxProcess;   /* declared in miscadmin.h */
+
+
+/*
+ *      AuxiliaryProcessMain
+ *
+ *      The main entry point for auxiliary processes, such as the bgwriter,
+ *      walwriter, walreceiver, bootstrapper and the shared memory checker code.
+ *
+ *      This code is here just because of historical reasons.
+ */
+void
+AuxiliaryProcessMain(AuxProcType auxtype)
+{
+       Assert(IsUnderPostmaster);
+
+       MyAuxProcType = auxtype;
+
+       switch (MyAuxProcType)
+       {
+               case StartupProcess:
+                       MyBackendType = B_STARTUP;
+                       break;
+               case ArchiverProcess:
+                       MyBackendType = B_ARCHIVER;
+                       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:
+                       elog(ERROR, "something has gone wrong");
+                       MyBackendType = B_INVALID;
+       }
+
+       init_ps_display(NULL);
+
+       SetProcessingMode(BootstrapProcessing);
+       IgnoreSystemIndexes = true;
+
+       BaseInit();
+
+       /*
+        * As an auxiliary process, we aren't going to do the full InitPostgres
+        * pushups, but there are a couple of things that need to get lit up even
+        * in an auxiliary process.
+        */
+
+       /*
+        * Create a PGPROC so we can use LWLocks.  In the EXEC_BACKEND case, this
+        * was already done by SubPostmasterMain().
+        */
+#ifndef EXEC_BACKEND
+       InitAuxiliaryProcess();
+#endif
+
+       /*
+        * Assign the ProcSignalSlot for an auxiliary process.  Since it doesn't
+        * have a BackendId, the slot is statically allocated based on the
+        * auxiliary process type (MyAuxProcType).  Backends use slots indexed in
+        * the range from 1 to MaxBackends (inclusive), so we use MaxBackends +
+        * AuxProcType + 1 as the index of the slot for an auxiliary process.
+        *
+        * This will need rethinking if we ever want more than one of a particular
+        * auxiliary process type.
+        */
+       ProcSignalInit(MaxBackends + MyAuxProcType + 1);
+
+       /* finish setting up bufmgr.c */
+       InitBufferPoolBackend();
+
+       /*
+        * Auxiliary processes don't run transactions, but they may need a
+        * resource owner anyway to manage buffer pins acquired outside
+        * transactions (and, perhaps, other things in future).
+        */
+       CreateAuxProcessResourceOwner();
+
+       /* Initialize statistics reporting */
+       pgstat_initialize();
+
+       /* Initialize backend status information */
+       pgstat_beinit();
+       pgstat_bestart();
+
+       /* register a before-shutdown callback for LWLock cleanup */
+       before_shmem_exit(ShutdownAuxiliaryProcess, 0);
+
+       SetProcessingMode(NormalProcessing);
+
+       switch (MyAuxProcType)
+       {
+               case CheckerProcess:
+               case BootstrapProcess:
+                       pg_unreachable();
+                       break;
+
+               case StartupProcess:
+                       StartupProcessMain();
+                       proc_exit(1);
+
+               case ArchiverProcess:
+                       PgArchiverMain();
+                       proc_exit(1);
+
+               case BgWriterProcess:
+                       BackgroundWriterMain();
+                       proc_exit(1);
+
+               case CheckpointerProcess:
+                       CheckpointerMain();
+                       proc_exit(1);
+
+               case WalWriterProcess:
+                       InitXLOGAccess();
+                       WalWriterMain();
+                       proc_exit(1);
+
+               case WalReceiverProcess:
+                       WalReceiverMain();
+                       proc_exit(1);
+
+               default:
+                       elog(PANIC, "unrecognized process type: %d", (int) MyAuxProcType);
+                       proc_exit(1);
+       }
+}
+
+/*
+ * Begin shutdown of an auxiliary process.  This is approximately the equivalent
+ * of ShutdownPostgres() in postinit.c.  We can't run transactions in an
+ * auxiliary process, so most of the work of AbortTransaction() is not needed,
+ * but we do need to make sure we've released any LWLocks we are holding.
+ * (This is only critical during an error exit.)
+ */
+static void
+ShutdownAuxiliaryProcess(int code, Datum arg)
+{
+       LWLockReleaseAll();
+       ConditionVariableCancelSleep();
+       pgstat_report_wait_end();
+}
index fb948b725795bd18fd209ac68bb5a541c68129b5..386469121599f1bd6e525c801123cb46be2e3d3e 100644 (file)
@@ -95,7 +95,6 @@
 
 #include "access/transam.h"
 #include "access/xlog.h"
-#include "bootstrap/bootstrap.h"
 #include "catalog/pg_control.h"
 #include "common/file_perm.h"
 #include "common/ip.h"
 #include "pgstat.h"
 #include "port/pg_bswap.h"
 #include "postmaster/autovacuum.h"
+#include "postmaster/auxprocess.h"
 #include "postmaster/bgworker_internals.h"
 #include "postmaster/fork_process.h"
 #include "postmaster/interrupt.h"
index 0f8762afaf8099040962b2c752f900a90d2a00eb..a9829124104ea5c24030975fe9528224d43c2746 100644 (file)
@@ -15,7 +15,6 @@
 #define BOOTSTRAP_H
 
 #include "nodes/execnodes.h"
-#include "miscadmin.h"
 
 
 /*
@@ -34,7 +33,6 @@ extern int    numattr;
 
 
 extern void BootstrapModeMain(int argc, char *argv[]) pg_attribute_noreturn();
-extern void AuxiliaryProcessMain(AuxProcType auxtype) pg_attribute_noreturn();
 
 extern void closerel(char *name);
 extern void boot_openrel(char *name);
index 68d840d6996f94318b47aac6c0ee11313248dc6e..1b7422d6366c673110e06b88bea2058658d5cf8f 100644 (file)
@@ -421,7 +421,7 @@ extern ProcessingMode Mode;
 /*
  * Auxiliary-process type identifiers.  These used to be in bootstrap.h
  * but it seems saner to have them here, with the ProcessingMode stuff.
- * The MyAuxProcType global is defined and set in bootstrap.c.
+ * The MyAuxProcType global is defined and set in auxprocess.c.
  */
 
 typedef enum
diff --git a/src/include/postmaster/auxprocess.h b/src/include/postmaster/auxprocess.h
new file mode 100644 (file)
index 0000000..bc3f541
--- /dev/null
@@ -0,0 +1,20 @@
+/*-------------------------------------------------------------------------
+ * auxprocess.h
+ *       include file for functions related to auxiliary processes.
+ *
+ *
+ * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ *             src/include/postmaster/auxprocess.h
+ *-------------------------------------------------------------------------
+ */
+#ifndef AUXPROCESS_H
+#define AUXPROCESS_H
+
+#include "miscadmin.h"
+
+extern void AuxiliaryProcessMain(AuxProcType auxtype) pg_attribute_noreturn();
+
+#endif                                                 /* AUXPROCESS_H */