process startup: Remove bootstrap / checker modes from AuxProcType.
authorAndres Freund <[email protected]>
Thu, 5 Aug 2021 19:17:31 +0000 (12:17 -0700)
committerAndres Freund <[email protected]>
Thu, 5 Aug 2021 19:18:15 +0000 (12:18 -0700)
Neither is actually initialized as an auxiliary process, so it does not really
make sense to reserve a PGPROC etc for them.

This keeps checker mode implemented by exiting partway through bootstrap
mode. That might be worth changing at some point, perhaps if we ever extend
checker mode to be a more general tool.

Author: Andres Freund <[email protected]>
Reviewed-By: Kyotaro Horiguchi <[email protected]>
Reviewed-By: Robert Haas <[email protected]>
Discussion: https://postgr.es/m/20210802164124[email protected]

src/backend/bootstrap/bootstrap.c
src/backend/main/main.c
src/backend/postmaster/auxprocess.c
src/bin/initdb/initdb.c
src/include/bootstrap/bootstrap.h
src/include/miscadmin.h

index 80dc3b585f613249c6ee20ceb8df5bcf3fc8a8cc..2e2f76a4716dc6ca5f7b46e770239a02f55b1233 100644 (file)
@@ -193,9 +193,14 @@ CheckerModeMain(void)
  *  The bootstrap mode is used to initialize the template database.
  *  The bootstrap backend doesn't speak SQL, but instead expects
  *  commands in a special bootstrap language.
+ *
+ *  When check_only is true, startup is done only far enough to verify that
+ *  the current configuration, particularly the passed in options pertaining
+ *  to shared memory sizing, options work (or at least do not cause an error
+ *  up to shared memory creation).
  */
 void
-BootstrapModeMain(int argc, char *argv[])
+BootstrapModeMain(int argc, char *argv[], bool check_only)
 {
    int         i;
    char       *progname = argv[0];
@@ -209,16 +214,14 @@ BootstrapModeMain(int argc, char *argv[])
    /* Set defaults, to be overridden by explicit options below */
    InitializeGUCOptions();
 
-   /* an initial --boot should be present */
+   /* an initial --boot or --check should be present */
    Assert(argc == 1
-          || strcmp(argv[1], "--boot") != 0);
+          || strcmp(argv[1], "--boot") != 0
+          || strcmp(argv[1], "--check") != 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)
+   while ((flag = getopt(argc, argv, "B:c:d:D:Fkr:X:-:")) != -1)
    {
        switch (flag)
        {
@@ -250,16 +253,6 @@ BootstrapModeMain(int argc, char *argv[])
            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);
@@ -338,7 +331,7 @@ BootstrapModeMain(int argc, char *argv[])
     * point. Right now it seems like it'd cause more code duplication than
     * it's worth.
     */
-   if (MyAuxProcType == CheckerProcess)
+   if (check_only)
    {
        SetProcessingMode(NormalProcessing);
        CheckerModeMain();
index 78ec85861e93d30faac56c4c002a7b6be4c9f578..9be397395672640ca3d323c388f5eaf9a7b4c603 100644 (file)
@@ -197,8 +197,10 @@ main(int argc, char *argv[])
    pgwin32_signal_initialize();
 #endif
 
-   if (argc > 1 && strcmp(argv[1], "--boot") == 0)
-       BootstrapModeMain(argc, argv);  /* does not return */
+   if (argc > 1 && strcmp(argv[1], "--check") == 0)
+       BootstrapModeMain(argc, argv, true);
+   else if (argc > 1 && strcmp(argv[1], "--boot") == 0)
+       BootstrapModeMain(argc, argv, false);
    else if (argc > 1 && strcmp(argv[1], "--describe-config") == 0)
        GucInfoMain();          /* does not return */
    else if (argc > 1 && strcmp(argv[1], "--single") == 0)
@@ -350,9 +352,9 @@ help(const char *progname)
 
    printf(_("\nOptions for bootstrapping mode:\n"));
    printf(_("  --boot             selects bootstrapping mode (must be first argument)\n"));
+   printf(_("  --check            selects check mode (must be first argument)\n"));
    printf(_("  DBNAME             database name (mandatory argument in bootstrapping mode)\n"));
    printf(_("  -r FILENAME        send stdout and stderr to given file\n"));
-   printf(_("  -x NUM             internal use\n"));
 
    printf(_("\nPlease read the documentation for the complete list of run-time\n"
             "configuration settings and how to set them on the command line or in\n"
index c391c963db0936e7b7ebf0f86493e15ecdba2cbb..196ee647cfe33de8ee9f04159a1d97ed77b824c8 100644 (file)
@@ -142,11 +142,6 @@ AuxiliaryProcessMain(AuxProcType auxtype)
 
    switch (MyAuxProcType)
    {
-       case CheckerProcess:
-       case BootstrapProcess:
-           pg_unreachable();
-           break;
-
        case StartupProcess:
            StartupProcessMain();
            proc_exit(1);
index 994bf07f3ba191da48944ab859ed669e98af8dd9..5e84c7bb20efce3850bcfdc667bbc72cb7e22bd8 100644 (file)
@@ -965,7 +965,7 @@ test_config_settings(void)
        test_buffs = MIN_BUFS_FOR_CONNS(test_conns);
 
        snprintf(cmd, sizeof(cmd),
-                "\"%s\" --boot -x0 %s %s "
+                "\"%s\" --check %s %s "
                 "-c max_connections=%d "
                 "-c shared_buffers=%d "
                 "-c dynamic_shared_memory_type=%s "
@@ -1001,7 +1001,7 @@ test_config_settings(void)
        }
 
        snprintf(cmd, sizeof(cmd),
-                "\"%s\" --boot -x0 %s %s "
+                "\"%s\" --check %s %s "
                 "-c max_connections=%d "
                 "-c shared_buffers=%d "
                 "-c dynamic_shared_memory_type=%s "
@@ -1406,7 +1406,7 @@ bootstrap_template1(void)
    unsetenv("PGCLIENTENCODING");
 
    snprintf(cmd, sizeof(cmd),
-            "\"%s\" --boot -x1 -X %u %s %s %s %s",
+            "\"%s\" --boot -X %u %s %s %s %s",
             backend_exec,
             wal_segment_size_mb * (1024 * 1024),
             data_checksums ? "-k" : "",
index a9829124104ea5c24030975fe9528224d43c2746..7d3b78e37463a1a85289f40dfd489b90828f80e2 100644 (file)
@@ -32,7 +32,7 @@ extern Form_pg_attribute attrtypes[MAXATTR];
 extern int numattr;
 
 
-extern void BootstrapModeMain(int argc, char *argv[]) pg_attribute_noreturn();
+extern void BootstrapModeMain(int argc, char *argv[], bool check_only) pg_attribute_noreturn();
 
 extern void closerel(char *name);
 extern void boot_openrel(char *name);
index 1b7422d6366c673110e06b88bea2058658d5cf8f..2e2e9a364a763ac04aec1cfe9372b0fedb0f569d 100644 (file)
@@ -427,9 +427,7 @@ extern ProcessingMode Mode;
 typedef enum
 {
    NotAnAuxProcess = -1,
-   CheckerProcess = 0,
-   BootstrapProcess,
-   StartupProcess,
+   StartupProcess = 0,
    BgWriterProcess,
    ArchiverProcess,
    CheckpointerProcess,
@@ -441,7 +439,6 @@ typedef enum
 
 extern AuxProcType MyAuxProcType;
 
-#define AmBootstrapProcess()       (MyAuxProcType == BootstrapProcess)
 #define AmStartupProcess()         (MyAuxProcType == StartupProcess)
 #define AmBackgroundWriterProcess() (MyAuxProcType == BgWriterProcess)
 #define AmArchiverProcess()            (MyAuxProcType == ArchiverProcess)