From 40749357f24adf89dc79db9b34f5c053288489bb Mon Sep 17 00:00:00 2001 From: Kyotaro Horiguchi Date: Mon, 15 Jan 2024 15:57:53 +0900 Subject: [PATCH v31 1/3] Export wal_sync_method related functions Export several functions related to wal_sync_method for use in subsequent commits. Since PG_O_DIRECT cannot be used in those commits, the new function XLogGetSyncBit() will mask PG_O_DIRECT. --- src/backend/access/transam/xlog.c | 73 +++++++++++++++++++++---------- src/include/access/xlog.h | 2 + 2 files changed, 52 insertions(+), 23 deletions(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 478377c4a2..c5f51849ee 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -8403,21 +8403,29 @@ assign_wal_sync_method(int new_wal_sync_method, void *extra) } } +/* + * Exported version of get_sync_bit() + * + * Do not expose PG_O_DIRECT for uses outside xlog.c. + */ +int +XLogGetSyncBit(void) +{ + return get_sync_bit(wal_sync_method) & ~PG_O_DIRECT; +} + /* - * Issue appropriate kind of fsync (if any) for an XLOG output file. + * Issue appropriate kind of fsync (if any) according to wal_sync_method. * - * 'fd' is a file descriptor for the XLOG file to be fsync'd. - * 'segno' is for error reporting purposes. + * 'fd' is a file descriptor for the file to be fsync'd. */ -void -issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) +const char * +XLogFsyncFile(int fd) { - char *msg = NULL; + const char *msg = NULL; instr_time start; - Assert(tli != 0); - /* * Quick exit if fsync is disabled or write() has already synced the WAL * file. @@ -8425,7 +8433,7 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) if (!enableFsync || wal_sync_method == WAL_SYNC_METHOD_OPEN || wal_sync_method == WAL_SYNC_METHOD_OPEN_DSYNC) - return; + return NULL; /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) @@ -8460,19 +8468,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) break; } - /* PANIC if failed to fsync */ - if (msg) - { - char xlogfname[MAXFNAMELEN]; - int save_errno = errno; - - XLogFileName(xlogfname, tli, segno, wal_segment_size); - errno = save_errno; - ereport(PANIC, - (errcode_for_file_access(), - errmsg(msg, xlogfname))); - } - pgstat_report_wait_end(); /* @@ -8486,7 +8481,39 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) INSTR_TIME_ACCUM_DIFF(PendingWalStats.wal_sync_time, end, start); } - PendingWalStats.wal_sync++; + if (msg != NULL) + PendingWalStats.wal_sync++; + + return msg; +} + +/* + * Issue appropriate kind of fsync (if any) for an XLOG output file. + * + * 'fd' is a file descriptor for the XLOG file to be fsync'd. + * 'segno' is for error reporting purposes. + */ +void +issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) +{ + const char *msg; + + Assert(tli != 0); + + msg = XLogFsyncFile(fd); + + /* PANIC if failed to fsync */ + if (msg) + { + char xlogfname[MAXFNAMELEN]; + int save_errno = errno; + + XLogFileName(xlogfname, tli, segno, wal_segment_size); + errno = save_errno; + ereport(PANIC, + (errcode_for_file_access(), + errmsg(msg, xlogfname))); + } } /* diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h index 301c5fa11f..2a0d65b537 100644 --- a/src/include/access/xlog.h +++ b/src/include/access/xlog.h @@ -217,6 +217,8 @@ extern void xlog_redo(struct XLogReaderState *record); extern void xlog_desc(StringInfo buf, struct XLogReaderState *record); extern const char *xlog_identify(uint8 info); +extern int XLogGetSyncBit(void); +extern const char *XLogFsyncFile(int fd); extern void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli); extern bool RecoveryInProgress(void); -- 2.39.3