From 9a4059d4ff1100e10d2aaadb136a04a407351249 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 10 Jul 2018 08:39:27 +0900 Subject: [PATCH] Simplify logic to sync target directory at the end of pg_rewind The previous sync logic relied on looking for and then launching externally initdb -S, which is a simple wrapper on top of fsync_pgdata. There is nothing preventing pg_rewind to directly call this routine, so remove the dependency to initdb and just call it directly. Author: Michael Paquier Reviewed-by: Heikki Linnakangas Discussion: https://postgr.es/m/20180325122607.GB3707@paquier.xyz --- src/bin/pg_rewind/pg_rewind.c | 44 ++++------------------------------- 1 file changed, 5 insertions(+), 39 deletions(-) diff --git a/src/bin/pg_rewind/pg_rewind.c b/src/bin/pg_rewind/pg_rewind.c index b0fd3f66ac..441e8074b7 100644 --- a/src/bin/pg_rewind/pg_rewind.c +++ b/src/bin/pg_rewind/pg_rewind.c @@ -25,6 +25,7 @@ #include "catalog/catversion.h" #include "catalog/pg_control.h" #include "common/file_perm.h" +#include "common/file_utils.h" #include "common/restricted_token.h" #include "getopt_long.h" #include "storage/bufpage.h" @@ -701,50 +702,15 @@ updateControlFile(ControlFileData *ControlFile) * * We do this once, for the whole data directory, for performance reasons. At * the end of pg_rewind's run, the kernel is likely to already have flushed - * most dirty buffers to disk. Additionally initdb -S uses a two-pass approach - * (only initiating writeback in the first pass), which often reduces the - * overall amount of IO noticeably. + * most dirty buffers to disk. Additionally fsync_pgdata uses a two-pass + * approach (only initiating writeback in the first pass), which often reduces + * the overall amount of IO noticeably. */ static void syncTargetDirectory(const char *argv0) { - int ret; -#define MAXCMDLEN (2 * MAXPGPATH) - char exec_path[MAXPGPATH]; - char cmd[MAXCMDLEN]; - - /* locate initdb binary */ - if ((ret = find_other_exec(argv0, "initdb", - "initdb (PostgreSQL) " PG_VERSION "\n", - exec_path)) < 0) - { - char full_path[MAXPGPATH]; - - if (find_my_exec(argv0, full_path) < 0) - strlcpy(full_path, progname, sizeof(full_path)); - - if (ret == -1) - pg_fatal("The program \"initdb\" is needed by %s but was\n" - "not found in the same directory as \"%s\".\n" - "Check your installation.\n", progname, full_path); - else - pg_fatal("The program \"initdb\" was found by \"%s\"\n" - "but was not the same version as %s.\n" - "Check your installation.\n", full_path, progname); - } - - /* only skip processing after ensuring presence of initdb */ if (dry_run) return; - /* finally run initdb -S */ - if (debug) - snprintf(cmd, MAXCMDLEN, "\"%s\" -D \"%s\" -S", - exec_path, datadir_target); - else - snprintf(cmd, MAXCMDLEN, "\"%s\" -D \"%s\" -S > \"%s\"", - exec_path, datadir_target, DEVNULL); - - if (system(cmd) != 0) - pg_fatal("sync of target directory failed\n"); + fsync_pgdata(datadir_target, progname, PG_VERSION_NUM); } -- 2.40.0