Add option --config-file to pg_rewind
authorMichael Paquier <michael@paquier.xyz>
Wed, 6 Apr 2022 23:51:49 +0000 (08:51 +0900)
committerMichael Paquier <michael@paquier.xyz>
Wed, 6 Apr 2022 23:51:49 +0000 (08:51 +0900)
This option is useful to do a rewind with the server configuration file
(aka postgresql.conf) located outside the data directory, which is
something that some Linux distributions and some HA tools like to rely
on.  As a result, this can simplify the logic around a rewind by
avoiding the copy of such files before running pg_rewind.

This option affects pg_rewind when it internally starts the target
cluster with some "postgres" commands, adding -c config_file=FILE to the
command strings generated, when:
- retrieving a restore_command using a "postgres -C" command for
-c/--restore-target-wal.
- forcing crash recovery once to get the cluster into a clean shutdown
state.

Author: Gunnar "Nick" Bluth
Reviewed-by: Michael Banck, Alexander Kukushkin, Michael Paquier,
Alexander Alekseev
Discussion: https://postgr.es/m/7c59265d-ac50-b0aa-ca1e-65e8bd27642a@pro-open.de

doc/src/sgml/ref/pg_rewind.sgml
src/bin/pg_rewind/pg_rewind.c
src/bin/pg_rewind/t/RewindTest.pm

index 33e6bb64ad61c5830d323e47f499d9828ebecaa0..e808239aa5b52562aecd6694e0e49685b79b1d0a 100644 (file)
@@ -241,6 +241,21 @@ PostgreSQL documentation
       </listitem>
      </varlistentry>
 
+     <varlistentry>
+      <term><option>--config-file=<replaceable class="parameter">filename</replaceable></option></term>
+      <listitem>
+       <para>
+        Use the specified main server configuration file for the target
+        cluster. This affects <application>pg_rewind</application> when
+        it uses internally the <application>postgres</application> command
+        for the rewind operation on this cluster (when retrieving
+        <varname>restore_command</varname> with the option
+        <option>-c/--restore-target-wal</option> and when forcing a
+        completion of crash recovery).
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry>
       <term><option>--debug</option></term>
       <listitem>
index 6cc44172fbfad3de71826fc60bf333ddf3b77aea..0922032e231e2e34c84088e814bd4b244f1879a9 100644 (file)
@@ -61,6 +61,7 @@ char     *datadir_target = NULL;
 char      *datadir_source = NULL;
 char      *connstr_source = NULL;
 char      *restore_command = NULL;
+char      *config_file = NULL;
 
 static bool debug = false;
 bool       showprogress = false;
@@ -87,6 +88,8 @@ usage(const char *progname)
    printf(_("Options:\n"));
    printf(_("  -c, --restore-target-wal       use restore_command in target configuration to\n"
             "                                 retrieve WAL files from archives\n"));
+   printf(_("      --config-file=FILENAME     use specified main server configuration\n"));
+   printf(_("                                 file when running target cluster\n"));
    printf(_("  -D, --target-pgdata=DIRECTORY  existing data directory to modify\n"));
    printf(_("      --source-pgdata=DIRECTORY  source data directory to synchronize with\n"));
    printf(_("      --source-server=CONNSTR    source server to synchronize with\n"));
@@ -115,6 +118,7 @@ main(int argc, char **argv)
        {"source-pgdata", required_argument, NULL, 1},
        {"source-server", required_argument, NULL, 2},
        {"no-ensure-shutdown", no_argument, NULL, 4},
+       {"config-file", required_argument, NULL, 5},
        {"version", no_argument, NULL, 'V'},
        {"restore-target-wal", no_argument, NULL, 'c'},
        {"dry-run", no_argument, NULL, 'n'},
@@ -205,6 +209,10 @@ main(int argc, char **argv)
            case 4:
                no_ensure_shutdown = true;
                break;
+
+           case 5:
+               config_file = pg_strdup(optarg);
+               break;
        }
    }
 
@@ -1058,6 +1066,13 @@ getRestoreCommand(const char *argv0)
    appendPQExpBufferStr(postgres_cmd, " -D ");
    appendShellString(postgres_cmd, datadir_target);
 
+   /* add custom configuration file only if requested */
+   if (config_file != NULL)
+   {
+       appendPQExpBufferStr(postgres_cmd, " -c config_file=");
+       appendShellString(postgres_cmd, config_file);
+   }
+
    /* add -C switch, for restore_command */
    appendPQExpBufferStr(postgres_cmd, " -C restore_command");
 
@@ -1136,6 +1151,13 @@ ensureCleanShutdown(const char *argv0)
    appendPQExpBufferStr(postgres_cmd, " --single -F -D ");
    appendShellString(postgres_cmd, datadir_target);
 
+   /* add custom configuration file only if requested */
+   if (config_file != NULL)
+   {
+       appendPQExpBufferStr(postgres_cmd, " -c config_file=");
+       appendShellString(postgres_cmd, config_file);
+   }
+
    /* finish with the database name, and a properly quoted redirection */
    appendPQExpBufferStr(postgres_cmd, " template1 < ");
    appendShellString(postgres_cmd, DEVNULL);
index 1e34768e2705fca8540678c355aa176517b473e2..8fd1f4b9de4114e2eaa21f93e7772d626fdeed86 100644 (file)
@@ -263,7 +263,9 @@ sub run_pg_rewind
                "--debug",
                "--source-pgdata=$standby_pgdata",
                "--target-pgdata=$primary_pgdata",
-               "--no-sync"
+               "--no-sync",
+               "--config-file",
+               "$tmp_folder/primary-postgresql.conf.tmp"
            ],
            'pg_rewind local');
    }
@@ -276,7 +278,8 @@ sub run_pg_rewind
                'pg_rewind',                       "--debug",
                "--source-server",                 $standby_connstr,
                "--target-pgdata=$primary_pgdata", "--no-sync",
-               "--write-recovery-conf"
+               "--write-recovery-conf",           "--config-file",
+               "$tmp_folder/primary-postgresql.conf.tmp"
            ],
            'pg_rewind remote');
 
@@ -323,7 +326,8 @@ sub run_pg_rewind
 
        # Note the use of --no-ensure-shutdown here.  WAL files are
        # gone in this mode and the primary has been stopped
-       # gracefully already.
+       # gracefully already.  --config-file reuses the original
+       # postgresql.conf as restore_command has been enabled above.
        command_ok(
            [
                'pg_rewind',
@@ -332,7 +336,9 @@ sub run_pg_rewind
                "--target-pgdata=$primary_pgdata",
                "--no-sync",
                "--no-ensure-shutdown",
-               "--restore-target-wal"
+               "--restore-target-wal",
+               "--config-file",
+               "$primary_pgdata/postgresql.conf"
            ],
            'pg_rewind archive');
    }