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:
parent
0905fe8911
commit
9a4059d4ff
@ -25,6 +25,7 @@
|
|||||||
#include "catalog/catversion.h"
|
#include "catalog/catversion.h"
|
||||||
#include "catalog/pg_control.h"
|
#include "catalog/pg_control.h"
|
||||||
#include "common/file_perm.h"
|
#include "common/file_perm.h"
|
||||||
|
#include "common/file_utils.h"
|
||||||
#include "common/restricted_token.h"
|
#include "common/restricted_token.h"
|
||||||
#include "getopt_long.h"
|
#include "getopt_long.h"
|
||||||
#include "storage/bufpage.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
|
* 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
|
* 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
|
* most dirty buffers to disk. Additionally fsync_pgdata uses a two-pass
|
||||||
* (only initiating writeback in the first pass), which often reduces the
|
* approach (only initiating writeback in the first pass), which often reduces
|
||||||
* overall amount of IO noticeably.
|
* the overall amount of IO noticeably.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
syncTargetDirectory(const char *argv0)
|
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)
|
if (dry_run)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* finally run initdb -S */
|
fsync_pgdata(datadir_target, progname, PG_VERSION_NUM);
|
||||||
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");
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user