Just reposting the previous patches to straighten out the cfbot.
--- /usr/lib/python3/dist-packages/patroni/postgresql/__init__.py 2022-02-18 13:16:15.000000000 +0000 +++ __init__.py 2022-04-03 19:17:29.952665383 +0000 @@ -798,7 +798,8 @@ return True def get_guc_value(self, name): - cmd = [self.pgcommand('postgres'), '-D', self._data_dir, '-C', name] + cmd = [self.pgcommand('postgres'), '-D', self._data_dir, '-C', name, + '--config-file={}'.format(self.config.postgresql_conf)] try: data = subprocess.check_output(cmd) if data: --- /usr/lib/python3/dist-packages/patroni/postgresql/rewind.py 2022-02-18 13:16:15.000000000 +0000 +++ rewind.py 2022-04-03 19:21:14.479726127 +0000 @@ -314,6 +314,7 @@ cmd = [self._postgresql.pgcommand('pg_rewind')] if self._postgresql.major_version >= 130000 and restore_command: cmd.append('--restore-target-wal') + cmd.append('--config-file={0}/postgresql.conf'.format(self._postgresql.config._config_dir)) cmd.extend(['-D', self._postgresql.data_dir, '--source-server', dsn]) while True:
doc/src/sgml/ref/pg_rewind.sgml | 12 +++++ src/bin/pg_rewind/pg_rewind.c | 24 ++++++++- src/bin/pg_rewind/t/001_basic.pl | 1 + src/bin/pg_rewind/t/RewindTest.pm | 105 +++++++++++++++++++++++--------------- 4 files changed, 101 insertions(+), 41 deletions(-)
diff --git a/doc/src/sgml/ref/pg_rewind.sgml b/doc/src/sgml/ref/pg_rewind.sgml index 33e6bb64ad..62fcb71825 100644 --- a/doc/src/sgml/ref/pg_rewind.sgml +++ b/doc/src/sgml/ref/pg_rewind.sgml @@ -241,6 +241,18 @@ PostgreSQL documentation </listitem> </varlistentry> + <varlistentry> + <term><option>--config-file=<replaceable class="parameter">filepath</replaceable></option></term> + <listitem> + <para> + When using the <option>-c / --restore-target-wal</option> option, the <varname>restore_command</varname> + is extracted from the configuration of the target cluster. If the <filename>postgresql.conf</filename> + of that cluster is not in the target data directory (or if you want to use an alternative config), + use this option to provide a (relative or absolute) path to the <filename>postgresql.conf</filename> to be used. + </para> + </listitem> + </varlistentry> + <varlistentry> <term><option>--debug</option></term> <listitem> diff --git a/src/bin/pg_rewind/pg_rewind.c b/src/bin/pg_rewind/pg_rewind.c index b39b5c1aac..2e83c7ee8e 100644 --- a/src/bin/pg_rewind/pg_rewind.c +++ b/src/bin/pg_rewind/pg_rewind.c @@ -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=FILE path to postgresql.conf if it resides outside\n")); + printf(_(" the target data directory (for -c)\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")); @@ -114,13 +117,14 @@ main(int argc, char **argv) {"write-recovery-conf", no_argument, NULL, 'R'}, {"source-pgdata", required_argument, NULL, 1}, {"source-server", required_argument, NULL, 2}, + {"debug", no_argument, NULL, 3}, {"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'}, {"no-sync", no_argument, NULL, 'N'}, {"progress", no_argument, NULL, 'P'}, - {"debug", no_argument, NULL, 3}, {NULL, 0, NULL, 0} }; int option_index; @@ -205,6 +209,10 @@ main(int argc, char **argv) case 4: no_ensure_shutdown = true; break; + + case 5: + config_file = pg_strdup(optarg); + break; } } @@ -1061,6 +1069,13 @@ getRestoreCommand(const char *argv0) appendPQExpBufferStr(postgres_cmd, " -D "); appendShellString(postgres_cmd, datadir_target); + /* add --config_file switch only if requested */ + if (config_file != NULL) + { + appendPQExpBufferStr(postgres_cmd, " --config_file="); + appendShellString(postgres_cmd, config_file); + } + /* add -C switch, for restore_command */ appendPQExpBufferStr(postgres_cmd, " -C restore_command"); @@ -1139,6 +1154,13 @@ ensureCleanShutdown(const char *argv0) appendPQExpBufferStr(postgres_cmd, " --single -F -D "); appendShellString(postgres_cmd, datadir_target); + /* add --config_file switch only if requested */ + if (config_file != NULL) + { + appendPQExpBufferStr(postgres_cmd, " --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); diff --git a/src/bin/pg_rewind/t/001_basic.pl b/src/bin/pg_rewind/t/001_basic.pl index db9201f38e..3c395ece12 100644 --- a/src/bin/pg_rewind/t/001_basic.pl +++ b/src/bin/pg_rewind/t/001_basic.pl @@ -190,5 +190,6 @@ in primary, before promotion run_test('local'); run_test('remote'); run_test('archive'); +run_test('archive_cli'); done_testing(); diff --git a/src/bin/pg_rewind/t/RewindTest.pm b/src/bin/pg_rewind/t/RewindTest.pm index 5651602858..f93e138b35 100644 --- a/src/bin/pg_rewind/t/RewindTest.pm +++ b/src/bin/pg_rewind/t/RewindTest.pm @@ -208,6 +208,68 @@ sub promote_standby return; } +sub run_pg_rewind_archive +{ + my $test_mode = shift; + my $primary_pgdata = $node_primary->data_dir; + + # Remove the existing archive directory and move all WAL + # segments from the old primary to the archives. These + # will be used by pg_rewind. + rmtree($node_primary->archive_dir); + PostgreSQL::Test::RecursiveCopy::copypath($node_primary->data_dir . '/pg_wal', + $node_primary->archive_dir); + + # Fast way to remove entire directory content + rmtree($node_primary->data_dir . '/pg_wal'); + mkdir($node_primary->data_dir . '/pg_wal'); + + # Make sure that directories have the right umask as this is + # required by a follow-up check on permissions, and better + # safe than sorry. + chmod(0700, $node_primary->archive_dir); + chmod(0700, $node_primary->data_dir . '/pg_wal'); + + # Add appropriate restore_command to the target cluster + $node_primary->enable_restoring($node_primary, 0); + + # Stop the new primary and be ready to perform the rewind. + $node_standby->stop; + + # Note the use of --no-ensure-shutdown here. WAL files are + # gone in this mode and the primary has been stopped + # gracefully already. + + # In archive_cli mode pass the config file as a command line option + if ($test_mode eq 'archive_cli') { + command_ok( + [ + 'pg_rewind', + '--debug', + '--source-pgdata=' . $node_standby->data_dir, + '--target-pgdata=' . $node_primary->data_dir, + '--no-sync', + '--no-ensure-shutdown', + '--restore-target-wal', + "--config-file=$primary_pgdata/postgresql.conf" + ], + "pg_rewind $test_mode"); + } else { + command_ok( + [ + 'pg_rewind', + '--debug', + '--source-pgdata=' . $node_standby->data_dir, + '--target-pgdata=' . $node_primary->data_dir, + '--no-sync', + '--no-ensure-shutdown', + '--restore-target-wal' + ], + "pg_rewind $test_mode"); + } + +} + sub run_pg_rewind { my $test_mode = shift; @@ -219,7 +281,7 @@ sub run_pg_rewind # Append the rewind-specific role to the connection string. $standby_connstr = "$standby_connstr user=rewind_user"; - if ($test_mode eq 'archive') + if ($test_mode eq 'archive' or $test_mode eq 'archive_cli') { # pg_rewind is tested with --restore-target-wal by moving all # WAL files to a secondary location. Note that this leads to @@ -292,50 +354,13 @@ sub run_pg_rewind $node_standby->safe_psql('postgres', "ALTER ROLE rewind_user WITH REPLICATION;"); } - elsif ($test_mode eq "archive") + elsif ($test_mode eq "archive" or $test_mode eq "archive_cli") { - # Do rewind using a local pgdata as source and specified # directory with target WAL archive. The old primary has # to be stopped at this point. - # Remove the existing archive directory and move all WAL - # segments from the old primary to the archives. These - # will be used by pg_rewind. - rmtree($node_primary->archive_dir); - PostgreSQL::Test::RecursiveCopy::copypath($node_primary->data_dir . "/pg_wal", - $node_primary->archive_dir); - - # Fast way to remove entire directory content - rmtree($node_primary->data_dir . "/pg_wal"); - mkdir($node_primary->data_dir . "/pg_wal"); - - # Make sure that directories have the right umask as this is - # required by a follow-up check on permissions, and better - # safe than sorry. - chmod(0700, $node_primary->archive_dir); - chmod(0700, $node_primary->data_dir . "/pg_wal"); - - # Add appropriate restore_command to the target cluster - $node_primary->enable_restoring($node_primary, 0); - - # Stop the new primary and be ready to perform the rewind. - $node_standby->stop; - - # Note the use of --no-ensure-shutdown here. WAL files are - # gone in this mode and the primary has been stopped - # gracefully already. - command_ok( - [ - 'pg_rewind', - "--debug", - "--source-pgdata=$standby_pgdata", - "--target-pgdata=$primary_pgdata", - "--no-sync", - "--no-ensure-shutdown", - "--restore-target-wal" - ], - 'pg_rewind archive'); + run_pg_rewind_archive($test_mode); } else {