Commit ffb4e27e authored by Heikki Linnakangas's avatar Heikki Linnakangas

pg_rewind: Move syncTargetDirectory() to file_ops.c

For consistency. All the other low-level functions that operate on the
target directory are in file_ops.c.

Reviewed-by: Michael Paquier
Discussion: https://www.postgresql.org/message-id/0c5b3783-af52-3ee5-f8fa-6e794061f70d%40iki.fi
parent ac22929a
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <unistd.h> #include <unistd.h>
#include "common/file_perm.h" #include "common/file_perm.h"
#include "common/file_utils.h"
#include "file_ops.h" #include "file_ops.h"
#include "filemap.h" #include "filemap.h"
#include "pg_rewind.h" #include "pg_rewind.h"
...@@ -266,6 +267,24 @@ remove_target_symlink(const char *path) ...@@ -266,6 +267,24 @@ remove_target_symlink(const char *path)
dstpath); dstpath);
} }
/*
* Sync target data directory to ensure that modifications are safely on disk.
*
* 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 fsync_pgdata uses a two-pass
* approach (only initiating writeback in the first pass), which often reduces
* the overall amount of IO noticeably.
*/
void
sync_target_dir(void)
{
if (!do_sync || dry_run)
return;
fsync_pgdata(datadir_target, PG_VERSION_NUM);
}
/* /*
* Read a file into memory. The file to be read is <datadir>/<path>. * Read a file into memory. The file to be read is <datadir>/<path>.
......
...@@ -19,6 +19,7 @@ extern void remove_target_file(const char *path, bool missing_ok); ...@@ -19,6 +19,7 @@ extern void remove_target_file(const char *path, bool missing_ok);
extern void truncate_target_file(const char *path, off_t newsize); extern void truncate_target_file(const char *path, off_t newsize);
extern void create_target(file_entry_t *t); extern void create_target(file_entry_t *t);
extern void remove_target(file_entry_t *t); extern void remove_target(file_entry_t *t);
extern void sync_target_dir(void);
extern char *slurpFile(const char *datadir, const char *path, size_t *filesize); extern char *slurpFile(const char *datadir, const char *path, size_t *filesize);
......
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
#include "catalog/pg_control.h" #include "catalog/pg_control.h"
#include "common/controldata_utils.h" #include "common/controldata_utils.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 "common/string.h" #include "common/string.h"
#include "fe_utils/recovery_gen.h" #include "fe_utils/recovery_gen.h"
...@@ -38,7 +37,6 @@ static void createBackupLabel(XLogRecPtr startpoint, TimeLineID starttli, ...@@ -38,7 +37,6 @@ static void createBackupLabel(XLogRecPtr startpoint, TimeLineID starttli,
static void digestControlFile(ControlFileData *ControlFile, char *source, static void digestControlFile(ControlFileData *ControlFile, char *source,
size_t size); size_t size);
static void syncTargetDirectory(void);
static void getRestoreCommand(const char *argv0); static void getRestoreCommand(const char *argv0);
static void sanityChecks(void); static void sanityChecks(void);
static void findCommonAncestorTimeline(XLogRecPtr *recptr, int *tliIndex); static void findCommonAncestorTimeline(XLogRecPtr *recptr, int *tliIndex);
...@@ -455,7 +453,7 @@ main(int argc, char **argv) ...@@ -455,7 +453,7 @@ main(int argc, char **argv)
if (showprogress) if (showprogress)
pg_log_info("syncing target data directory"); pg_log_info("syncing target data directory");
syncTargetDirectory(); sync_target_dir();
if (writerecoveryconf && !dry_run) if (writerecoveryconf && !dry_run)
WriteRecoveryConfig(conn, datadir_target, WriteRecoveryConfig(conn, datadir_target,
...@@ -803,24 +801,6 @@ digestControlFile(ControlFileData *ControlFile, char *src, size_t size) ...@@ -803,24 +801,6 @@ digestControlFile(ControlFileData *ControlFile, char *src, size_t size)
checkControlFile(ControlFile); checkControlFile(ControlFile);
} }
/*
* Sync target data directory to ensure that modifications are safely on disk.
*
* 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 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(void)
{
if (!do_sync || dry_run)
return;
fsync_pgdata(datadir_target, PG_VERSION_NUM);
}
/* /*
* Get value of GUC parameter restore_command from the target cluster. * Get value of GUC parameter restore_command from the target cluster.
* *
......
...@@ -24,6 +24,7 @@ extern char *datadir_source; ...@@ -24,6 +24,7 @@ extern char *datadir_source;
extern char *connstr_source; extern char *connstr_source;
extern bool showprogress; extern bool showprogress;
extern bool dry_run; extern bool dry_run;
extern bool do_sync;
extern int WalSegSz; extern int WalSegSz;
/* Target history */ /* Target history */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment