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
This commit is contained in:
Michael Paquier 2018-07-10 08:39:27 +09:00
parent 0905fe8911
commit 9a4059d4ff
1 changed files with 5 additions and 39 deletions

View File

@ -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);
}