diff options
Diffstat (limited to 'src/backend/bootstrap/bootstrap.c')
-rw-r--r-- | src/backend/bootstrap/bootstrap.c | 324 |
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 |