From 8897e28e49a86996e1f9d6a3ec9740f2b7f20203 Mon Sep 17 00:00:00 2001 From: Paul Guo Date: Thu, 18 Apr 2019 19:37:36 +0800 Subject: [PATCH v7 2/3] Add option to write recovery configuration information in pg_rewind. --- doc/src/sgml/ref/pg_rewind.sgml | 11 +++++++++++ src/bin/pg_rewind/Makefile | 2 +- src/bin/pg_rewind/pg_rewind.c | 17 ++++++++++++++++- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/ref/pg_rewind.sgml b/doc/src/sgml/ref/pg_rewind.sgml index 52a1caa246..6a46b8c3b4 100644 --- a/doc/src/sgml/ref/pg_rewind.sgml +++ b/doc/src/sgml/ref/pg_rewind.sgml @@ -165,6 +165,17 @@ PostgreSQL documentation + + + + + + Create standby.signal and append connection settings + to postgresql.auto.conf in the output directory. + + + + diff --git a/src/bin/pg_rewind/Makefile b/src/bin/pg_rewind/Makefile index 859d3abc41..98fb381c62 100644 --- a/src/bin/pg_rewind/Makefile +++ b/src/bin/pg_rewind/Makefile @@ -16,7 +16,7 @@ top_builddir = ../../.. include $(top_builddir)/src/Makefile.global override CPPFLAGS := -I$(libpq_srcdir) -DFRONTEND $(CPPFLAGS) -LDFLAGS_INTERNAL += $(libpq_pgport) +LDFLAGS_INTERNAL += $(libpq_pgport) -L$(top_builddir)/src/fe_utils -lpgfeutils OBJS = pg_rewind.o parsexlog.o xlogreader.o datapagemap.o timeline.o \ fetch.o file_ops.o copy_fetch.o libpq_fetch.o filemap.o \ diff --git a/src/bin/pg_rewind/pg_rewind.c b/src/bin/pg_rewind/pg_rewind.c index c3903c5753..ddf71679b2 100644 --- a/src/bin/pg_rewind/pg_rewind.c +++ b/src/bin/pg_rewind/pg_rewind.c @@ -29,6 +29,7 @@ #include "common/restricted_token.h" #include "getopt_long.h" #include "storage/bufpage.h" +#include "fe_utils/recovery_gen.h" static void usage(const char *progname); @@ -75,6 +76,7 @@ usage(const char *progname) 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")); + printf(_(" -R, --write-recovery-conf write configuration for replication\n")); printf(_(" -n, --dry-run stop before modifying anything\n")); printf(_(" -N, --no-sync do not wait for changes to be written\n" " safely to disk\n")); @@ -98,6 +100,7 @@ main(int argc, char **argv) static struct option long_options[] = { {"help", no_argument, NULL, '?'}, {"target-pgdata", required_argument, NULL, 'D'}, + {"write-recovery-conf", no_argument, NULL, 'R'}, {"source-pgdata", required_argument, NULL, 1}, {"source-server", required_argument, NULL, 2}, {"version", no_argument, NULL, 'V'}, @@ -120,6 +123,7 @@ main(int argc, char **argv) XLogRecPtr endrec; TimeLineID endtli; ControlFileData ControlFile_new; + bool writerecoveryconf = false; pg_logging_init(argv[0]); set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_rewind")); @@ -140,7 +144,7 @@ main(int argc, char **argv) } } - while ((c = getopt_long(argc, argv, "D:nNP", long_options, &option_index)) != -1) + while ((c = getopt_long(argc, argv, "D:nNPR", long_options, &option_index)) != -1) { switch (c) { @@ -160,6 +164,10 @@ main(int argc, char **argv) do_sync = false; break; + case 'R': + writerecoveryconf = true; + break; + case 3: debug = true; pg_logging_set_level(PG_LOG_DEBUG); @@ -306,6 +314,9 @@ main(int argc, char **argv) if (!rewind_needed) { pg_log_info("no rewind required"); + if (writerecoveryconf && connstr_source) + WriteRecoveryConfig(conn, datadir_target, + GenerateRecoveryConfig(conn, NULL)); exit(0); } @@ -403,6 +414,10 @@ main(int argc, char **argv) pg_log_info("syncing target data directory"); syncTargetDirectory(); + if (writerecoveryconf && connstr_source) + WriteRecoveryConfig(conn, datadir_target, + GenerateRecoveryConfig(conn, NULL)); + pg_log_info("Done!"); return 0; -- 2.17.2