From 2d6b0d5708f07203ad2ffbd889404094d0c5969c Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Wed, 6 Nov 2024 13:59:39 -0600 Subject: [PATCH v1 2/8] Add "void *arg" parameter to walkdir() that is passed to function. THIS IS A PROOF OF CONCEPT AND IS NOT READY FOR SERIOUS REVIEW. This will be used in follow up commits to pass private state to the functions called by walkdir(). --- src/bin/pg_basebackup/walmethods.c | 8 +++---- src/bin/pg_dump/pg_backup_custom.c | 2 +- src/bin/pg_dump/pg_backup_tar.c | 2 +- src/bin/pg_dump/pg_dumpall.c | 2 +- src/common/file_utils.c | 38 +++++++++++++++--------------- src/include/common/file_utils.h | 6 ++--- 6 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/bin/pg_basebackup/walmethods.c b/src/bin/pg_basebackup/walmethods.c index 215b24597f..51640cb493 100644 --- a/src/bin/pg_basebackup/walmethods.c +++ b/src/bin/pg_basebackup/walmethods.c @@ -251,7 +251,7 @@ dir_open_for_write(WalWriteMethod *wwmethod, const char *pathname, */ if (wwmethod->sync) { - if (fsync_fname(tmppath, false) != 0 || + if (fsync_fname(tmppath, false, NULL) != 0 || fsync_parent_path(tmppath) != 0) { wwmethod->lasterrno = errno; @@ -486,7 +486,7 @@ dir_close(Walfile *f, WalCloseMethod method) */ if (f->wwmethod->sync) { - r = fsync_fname(df->fullpath, false); + r = fsync_fname(df->fullpath, false, NULL); if (r == 0) r = fsync_parent_path(df->fullpath); } @@ -617,7 +617,7 @@ dir_finish(WalWriteMethod *wwmethod) * Files are fsynced when they are closed, but we need to fsync the * directory entry here as well. */ - if (fsync_fname(dir_data->basedir, true) != 0) + if (fsync_fname(dir_data->basedir, true, NULL) != 0) { wwmethod->lasterrno = errno; return false; @@ -1321,7 +1321,7 @@ tar_finish(WalWriteMethod *wwmethod) if (wwmethod->sync) { - if (fsync_fname(tar_data->tarfilename, false) != 0 || + if (fsync_fname(tar_data->tarfilename, false, NULL) != 0 || fsync_parent_path(tar_data->tarfilename) != 0) { wwmethod->lasterrno = errno; diff --git a/src/bin/pg_dump/pg_backup_custom.c b/src/bin/pg_dump/pg_backup_custom.c index ecaad7321a..6f750c916c 100644 --- a/src/bin/pg_dump/pg_backup_custom.c +++ b/src/bin/pg_dump/pg_backup_custom.c @@ -767,7 +767,7 @@ _CloseArchive(ArchiveHandle *AH) /* Sync the output file if one is defined */ if (AH->dosync && AH->mode == archModeWrite && AH->fSpec) - (void) fsync_fname(AH->fSpec, false); + (void) fsync_fname(AH->fSpec, false, NULL); AH->FH = NULL; } diff --git a/src/bin/pg_dump/pg_backup_tar.c b/src/bin/pg_dump/pg_backup_tar.c index 41ee52b1d6..ecba27b623 100644 --- a/src/bin/pg_dump/pg_backup_tar.c +++ b/src/bin/pg_dump/pg_backup_tar.c @@ -847,7 +847,7 @@ _CloseArchive(ArchiveHandle *AH) /* Sync the output file if one is defined */ if (AH->dosync && AH->fSpec) - (void) fsync_fname(AH->fSpec, false); + (void) fsync_fname(AH->fSpec, false, NULL); } AH->FH = NULL; diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c index e3ad8fb295..cbb1e3f9e4 100644 --- a/src/bin/pg_dump/pg_dumpall.c +++ b/src/bin/pg_dump/pg_dumpall.c @@ -621,7 +621,7 @@ main(int argc, char *argv[]) /* sync the resulting file, errors are not fatal */ if (dosync) - (void) fsync_fname(filename, false); + (void) fsync_fname(filename, false, NULL); } exit_nicely(0); diff --git a/src/common/file_utils.c b/src/common/file_utils.c index 3f488bf5ec..dc90f35ae1 100644 --- a/src/common/file_utils.c +++ b/src/common/file_utils.c @@ -46,7 +46,7 @@ #define MINIMUM_VERSION_FOR_PG_WAL 100000 #ifdef PG_FLUSH_DATA_WORKS -static int pre_sync_fname(const char *fname, bool isdir); +static int pre_sync_fname(const char *fname, bool isdir, void *arg); #endif #ifdef HAVE_SYNCFS @@ -184,10 +184,10 @@ sync_pgdata(const char *pg_data, * fsync the data directory and its contents. */ #ifdef PG_FLUSH_DATA_WORKS - walkdir(pg_data, pre_sync_fname, false); + walkdir(pg_data, pre_sync_fname, false, NULL); if (xlog_is_symlink) - walkdir(pg_wal, pre_sync_fname, false); - walkdir(pg_tblspc, pre_sync_fname, true); + walkdir(pg_wal, pre_sync_fname, false, NULL); + walkdir(pg_tblspc, pre_sync_fname, true, NULL); #endif /* @@ -200,10 +200,10 @@ sync_pgdata(const char *pg_data, * get fsync'd twice. That's not an expected case so we don't * worry about optimizing it. */ - walkdir(pg_data, fsync_fname, false); + walkdir(pg_data, fsync_fname, false, NULL); if (xlog_is_symlink) - walkdir(pg_wal, fsync_fname, false); - walkdir(pg_tblspc, fsync_fname, true); + walkdir(pg_wal, fsync_fname, false, NULL); + walkdir(pg_tblspc, fsync_fname, true, NULL); } break; } @@ -242,10 +242,10 @@ sync_dir_recurse(const char *dir, DataDirSyncMethod sync_method) * fsync the data directory and its contents. */ #ifdef PG_FLUSH_DATA_WORKS - walkdir(dir, pre_sync_fname, false); + walkdir(dir, pre_sync_fname, false, NULL); #endif - walkdir(dir, fsync_fname, false); + walkdir(dir, fsync_fname, false, NULL); } break; } @@ -267,8 +267,8 @@ sync_dir_recurse(const char *dir, DataDirSyncMethod sync_method) */ void walkdir(const char *path, - int (*action) (const char *fname, bool isdir), - bool process_symlinks) + int (*action) (const char *fname, bool isdir, void *arg), + bool process_symlinks, void *arg) { DIR *dir; struct dirent *de; @@ -293,10 +293,10 @@ walkdir(const char *path, switch (get_dirent_type(subpath, de, process_symlinks, PG_LOG_ERROR)) { case PGFILETYPE_REG: - (*action) (subpath, false); + (*action) (subpath, false, arg); break; case PGFILETYPE_DIR: - walkdir(subpath, action, false); + walkdir(subpath, action, false, arg); break; default: @@ -320,7 +320,7 @@ walkdir(const char *path, * synced. Recent versions of ext4 have made the window much wider but * it's been an issue for ext3 and other filesystems in the past. */ - (*action) (path, true); + (*action) (path, true, arg); } /* @@ -332,7 +332,7 @@ walkdir(const char *path, #ifdef PG_FLUSH_DATA_WORKS static int -pre_sync_fname(const char *fname, bool isdir) +pre_sync_fname(const char *fname, bool isdir, void *arg) { int fd; @@ -373,7 +373,7 @@ pre_sync_fname(const char *fname, bool isdir) * are fatal. */ int -fsync_fname(const char *fname, bool isdir) +fsync_fname(const char *fname, bool isdir, void *arg) { int fd; int flags; @@ -444,7 +444,7 @@ fsync_parent_path(const char *fname) if (strlen(parentpath) == 0) strlcpy(parentpath, ".", MAXPGPATH); - if (fsync_fname(parentpath, true) != 0) + if (fsync_fname(parentpath, true, NULL) != 0) return -1; return 0; @@ -467,7 +467,7 @@ durable_rename(const char *oldfile, const char *newfile) * because it's then guaranteed that either source or target file exists * after a crash. */ - if (fsync_fname(oldfile, false) != 0) + if (fsync_fname(oldfile, false, NULL) != 0) return -1; fd = open(newfile, PG_BINARY | O_RDWR, 0); @@ -502,7 +502,7 @@ durable_rename(const char *oldfile, const char *newfile) * To guarantee renaming the file is persistent, fsync the file with its * new name, and its containing directory. */ - if (fsync_fname(newfile, false) != 0) + if (fsync_fname(newfile, false, NULL) != 0) return -1; if (fsync_parent_path(newfile) != 0) diff --git a/src/include/common/file_utils.h b/src/include/common/file_utils.h index 5a9519acfe..c328f56a85 100644 --- a/src/include/common/file_utils.h +++ b/src/include/common/file_utils.h @@ -33,15 +33,15 @@ typedef enum DataDirSyncMethod struct iovec; /* avoid including port/pg_iovec.h here */ #ifdef FRONTEND -extern int fsync_fname(const char *fname, bool isdir); +extern int fsync_fname(const char *fname, bool isdir, void *arg); extern void sync_pgdata(const char *pg_data, int serverVersion, DataDirSyncMethod sync_method); extern void sync_dir_recurse(const char *dir, DataDirSyncMethod sync_method); extern int durable_rename(const char *oldfile, const char *newfile); extern int fsync_parent_path(const char *fname); extern void walkdir(const char *path, - int (*action) (const char *fname, bool isdir), - bool process_symlinks); + int (*action) (const char *fname, bool isdir, void *arg), + bool process_symlinks, void *arg); #endif extern PGFileType get_dirent_type(const char *path, -- 2.39.5 (Apple Git-154)