#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"
*
* 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);
}