summaryrefslogtreecommitdiff
path: root/src/backend/bootstrap
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2021-08-04 19:29:45 -0700
committerAndres Freund <andres@anarazel.de>2021-08-05 12:03:30 -0700
commit5aa4a9d2077fa902b4041245805082fec6be0648 (patch)
treeff04bb68b20c2480ffb55ab49214a830249cb63b /src/backend/bootstrap
parent50017f77722b8b998ead5ca6fdb0b821fe7a34d2 (diff)
downloadpostgresql-5aa4a9d2077fa902b4041245805082fec6be0648.tar.gz
process startup: Separate out BootstrapModeMain from AuxiliaryProcessMain.
There practically was no shared code between the two, once all the ifs are removed. And it was quite confusing that aux processes weren't actually started by the call to AuxiliaryProcessMain() in main(). There's more to do, AuxiliaryProcessMain() should move out of bootstrap.c, and BootstrapModeMain() shouldn't use/be part of AuxProcType. 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
Diffstat (limited to 'src/backend/bootstrap')
-rw-r--r--src/backend/bootstrap/bootstrap.c324
1 files changed, 159 insertions, 165 deletions
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index 67cd5ac6e9..7d6a9d7448 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -55,7 +55,6 @@ uint32 bootstrap_data_checksum_version = 0; /* No checksum */
static void CheckerModeMain(void);
-static void BootstrapModeMain(void);
static void bootstrap_signals(void);
static void ShutdownAuxiliaryProcess(int code, Datum arg);
static Form_pg_attribute AllocateAttribute(void);
@@ -194,124 +193,11 @@ static IndexList *ILHead = NULL;
* This code is here just because of historical reasons.
*/
void
-AuxiliaryProcessMain(int argc, char *argv[])
+AuxiliaryProcessMain(AuxProcType auxtype)
{
- char *progname = argv[0];
- int flag;
- char *userDoption = NULL;
-
- /*
- * Initialize process environment (already done if under postmaster, but
- * not if standalone).
- */
- if (!IsUnderPostmaster)
- InitStandaloneProcess(argv[0]);
-
- /*
- * process command arguments
- */
-
- /* Set defaults, to be overridden by explicit options below */
- if (!IsUnderPostmaster)
- InitializeGUCOptions();
-
- /* Ignore the initial --boot argument, if present */
- if (argc > 1 && strcmp(argv[1], "--boot") == 0)
- {
- argv++;
- argc--;
- }
-
- /* If no -x argument, we are a CheckerProcess */
- MyAuxProcType = CheckerProcess;
-
- while ((flag = getopt(argc, argv, "B:c:d:D:Fkr:x:X:-:")) != -1)
- {
- switch (flag)
- {
- case 'B':
- SetConfigOption("shared_buffers", optarg, PGC_POSTMASTER, PGC_S_ARGV);
- break;
- case 'D':
- userDoption = pstrdup(optarg);
- break;
- case 'd':
- {
- /* Turn on debugging for the bootstrap process. */
- char *debugstr;
-
- debugstr = psprintf("debug%s", optarg);
- SetConfigOption("log_min_messages", debugstr,
- PGC_POSTMASTER, PGC_S_ARGV);
- SetConfigOption("client_min_messages", debugstr,
- PGC_POSTMASTER, PGC_S_ARGV);
- pfree(debugstr);
- }
- break;
- case 'F':
- SetConfigOption("fsync", "false", PGC_POSTMASTER, PGC_S_ARGV);
- break;
- case 'k':
- bootstrap_data_checksum_version = PG_DATA_CHECKSUM_VERSION;
- break;
- case 'r':
- strlcpy(OutputFileName, optarg, MAXPGPATH);
- break;
- case 'x':
- MyAuxProcType = atoi(optarg);
- break;
- case 'X':
- {
- int WalSegSz = strtoul(optarg, NULL, 0);
-
- if (!IsValidWalSegSize(WalSegSz))
- ereport(ERROR,
- (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
- errmsg("-X requires a power of two value between 1 MB and 1 GB")));
- SetConfigOption("wal_segment_size", optarg, PGC_INTERNAL,
- PGC_S_OVERRIDE);
- }
- break;
- case 'c':
- case '-':
- {
- char *name,
- *value;
-
- ParseLongOption(optarg, &name, &value);
- if (!value)
- {
- if (flag == '-')
- ereport(ERROR,
- (errcode(ERRCODE_SYNTAX_ERROR),
- errmsg("--%s requires a value",
- optarg)));
- else
- ereport(ERROR,
- (errcode(ERRCODE_SYNTAX_ERROR),
- errmsg("-c %s requires a value",
- optarg)));
- }
-
- SetConfigOption(name, value, PGC_POSTMASTER, PGC_S_ARGV);
- free(name);
- if (value)
- free(value);
- break;
- }
- default:
- write_stderr("Try \"%s --help\" for more information.\n",
- progname);
- proc_exit(1);
- break;
- }
- }
+ Assert(IsUnderPostmaster);
- if (argc != optind)
- {
- write_stderr("%s: invalid command-line arguments\n", progname);
- proc_exit(1);
- }
+ MyAuxProcType = auxtype;
switch (MyAuxProcType)
{
@@ -334,47 +220,22 @@ AuxiliaryProcessMain(int argc, char *argv[])
MyBackendType = B_WAL_RECEIVER;
break;
default:
+ elog(ERROR, "something has gone wrong");
MyBackendType = B_INVALID;
}
- if (IsUnderPostmaster)
- init_ps_display(NULL);
-
- /* Acquire configuration parameters, unless inherited from postmaster */
- if (!IsUnderPostmaster)
- {
- if (!SelectConfigFiles(userDoption, progname))
- proc_exit(1);
- }
- /*
- * Validate we have been given a reasonable-looking DataDir and change
- * into it (if under postmaster, should be done already).
- */
- if (!IsUnderPostmaster)
- {
- checkDataDir();
- ChangeToDataDir();
- }
-
- /* If standalone, create lockfile for data directory */
- if (!IsUnderPostmaster)
- CreateDataDirLockFile(false);
+ init_ps_display(NULL);
SetProcessingMode(BootstrapProcessing);
IgnoreSystemIndexes = true;
- /* Initialize MaxBackends (if under postmaster, was done already) */
- if (!IsUnderPostmaster)
- InitializeMaxBackends();
-
BaseInit();
/*
- * When we are 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.
+ * 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.
*/
- if (IsUnderPostmaster)
{
/*
* Create a PGPROC so we can use LWLocks. In the EXEC_BACKEND case,
@@ -423,22 +284,9 @@ AuxiliaryProcessMain(int argc, char *argv[])
switch (MyAuxProcType)
{
case CheckerProcess:
- /* don't set signals, they're useless here */
- CheckerModeMain();
- proc_exit(1); /* should never return */
-
case BootstrapProcess:
-
- /*
- * There was a brief instant during which mode was Normal; this is
- * okay. We need to be in bootstrap mode during BootStrapXLOG for
- * the sake of multixact initialization.
- */
- SetProcessingMode(BootstrapProcessing);
- bootstrap_signals();
- BootStrapXLOG();
- BootstrapModeMain();
- proc_exit(1); /* should never return */
+ pg_unreachable();
+ break;
case StartupProcess:
StartupProcessMain();
@@ -490,13 +338,159 @@ CheckerModeMain(void)
* The bootstrap backend doesn't speak SQL, but instead expects
* commands in a special bootstrap language.
*/
-static void
-BootstrapModeMain(void)
+void
+BootstrapModeMain(int argc, char *argv[])
{
int i;
+ char *progname = argv[0];
+ int flag;
+ char *userDoption = NULL;
Assert(!IsUnderPostmaster);
- Assert(IsBootstrapProcessingMode());
+
+ InitStandaloneProcess(argv[0]);
+
+ /* Set defaults, to be overridden by explicit options below */
+ InitializeGUCOptions();
+
+ /* an initial --boot should be present */
+ Assert(argc == 1
+ || strcmp(argv[1], "--boot") != 0);
+ argv++;
+ argc--;
+
+ /* If no -x argument, we are a CheckerProcess */
+ MyAuxProcType = CheckerProcess;
+
+ while ((flag = getopt(argc, argv, "B:c:d:D:Fkr:x:X:-:")) != -1)
+ {
+ switch (flag)
+ {
+ case 'B':
+ SetConfigOption("shared_buffers", optarg, PGC_POSTMASTER, PGC_S_ARGV);
+ break;
+ case 'D':
+ userDoption = pstrdup(optarg);
+ break;
+ case 'd':
+ {
+ /* Turn on debugging for the bootstrap process. */
+ char *debugstr;
+
+ debugstr = psprintf("debug%s", optarg);
+ SetConfigOption("log_min_messages", debugstr,
+ PGC_POSTMASTER, PGC_S_ARGV);
+ SetConfigOption("client_min_messages", debugstr,
+ PGC_POSTMASTER, PGC_S_ARGV);
+ pfree(debugstr);
+ }
+ break;
+ case 'F':
+ SetConfigOption("fsync", "false", PGC_POSTMASTER, PGC_S_ARGV);
+ break;
+ case 'k':
+ bootstrap_data_checksum_version = PG_DATA_CHECKSUM_VERSION;
+ break;
+ case 'r':
+ strlcpy(OutputFileName, optarg, MAXPGPATH);
+ break;
+ case 'x':
+ MyAuxProcType = atoi(optarg);
+ if (MyAuxProcType != CheckerProcess &&
+ MyAuxProcType != BootstrapProcess)
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("-x %s is invalid", optarg)));
+ }
+ break;
+ case 'X':
+ {
+ int WalSegSz = strtoul(optarg, NULL, 0);
+
+ if (!IsValidWalSegSize(WalSegSz))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("-X requires a power of two value between 1 MB and 1 GB")));
+ SetConfigOption("wal_segment_size", optarg, PGC_INTERNAL,
+ PGC_S_OVERRIDE);
+ }
+ break;
+ case 'c':
+ case '-':
+ {
+ char *name,
+ *value;
+
+ ParseLongOption(optarg, &name, &value);
+ if (!value)
+ {
+ if (flag == '-')
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("--%s requires a value",
+ optarg)));
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("-c %s requires a value",
+ optarg)));
+ }
+
+ SetConfigOption(name, value, PGC_POSTMASTER, PGC_S_ARGV);
+ free(name);
+ if (value)
+ free(value);
+ break;
+ }
+ default:
+ write_stderr("Try \"%s --help\" for more information.\n",
+ progname);
+ proc_exit(1);
+ break;
+ }
+ }
+
+ if (argc != optind)
+ {
+ write_stderr("%s: invalid command-line arguments\n", progname);
+ proc_exit(1);
+ }
+
+ /* Acquire configuration parameters */
+ if (!SelectConfigFiles(userDoption, progname))
+ proc_exit(1);
+
+ /*
+ * Validate we have been given a reasonable-looking DataDir and change
+ * into it
+ */
+ checkDataDir();
+ ChangeToDataDir();
+
+ CreateDataDirLockFile(false);
+
+ SetProcessingMode(BootstrapProcessing);
+ IgnoreSystemIndexes = true;
+
+ InitializeMaxBackends();
+
+ BaseInit();
+
+ /*
+ * XXX: It might make sense to move this into its own function at some
+ * point. Right now it seems like it'd cause more code duplication than
+ * it's worth.
+ */
+ if (MyAuxProcType == CheckerProcess)
+ {
+ SetProcessingMode(NormalProcessing);
+ CheckerModeMain();
+ abort();
+ }
+
+ bootstrap_signals();
+ BootStrapXLOG();
/*
* To ensure that src/common/link-canary.c is linked into the backend, we