aboutsummaryrefslogtreecommitdiff
path: root/src/backend/bootstrap/bootstrap.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/bootstrap/bootstrap.c')
-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 67cd5ac6e9a..7d6a9d7448b 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