From: Bruce Momjian Date: Wed, 14 Feb 2007 05:00:40 +0000 (+0000) Subject: Move fsync method macro defines into /include/access/xlogdefs.h so they X-Git-Tag: REL8_3_BETA1~1222 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a9eb53969abc27f17f13c9d19eeb2621ecd57961;p=postgresql Move fsync method macro defines into /include/access/xlogdefs.h so they can be used by src/tools/fsync/test_fsync.c. --- diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fa6731a386..cd62220c0f 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.263 2007/02/08 11:10:27 petere Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.264 2007/02/14 05:00:40 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -31,6 +31,7 @@ #include "access/twophase.h" #include "access/xact.h" #include "access/xlog_internal.h" +#include "access/xlogdefs.h" #include "access/xlogutils.h" #include "catalog/catversion.h" #include "catalog/pg_control.h" @@ -49,78 +50,6 @@ #include "utils/pg_locale.h" -/* - * Because O_DIRECT bypasses the kernel buffers, and because we never - * read those buffers except during crash recovery, it is a win to use - * it in all cases where we sync on each write(). We could allow O_DIRECT - * with fsync(), but because skipping the kernel buffer forces writes out - * quickly, it seems best just to use it for O_SYNC. It is hard to imagine - * how fsync() could be a win for O_DIRECT compared to O_SYNC and O_DIRECT. - * Also, O_DIRECT is never enough to force data to the drives, it merely - * tries to bypass the kernel cache, so we still need O_SYNC or fsync(). - */ -#ifdef O_DIRECT -#define PG_O_DIRECT O_DIRECT -#else -#define PG_O_DIRECT 0 -#endif - -/* - * This chunk of hackery attempts to determine which file sync methods - * are available on the current platform, and to choose an appropriate - * default method. We assume that fsync() is always available, and that - * configure determined whether fdatasync() is. - */ -#if defined(O_SYNC) -#define BARE_OPEN_SYNC_FLAG O_SYNC -#elif defined(O_FSYNC) -#define BARE_OPEN_SYNC_FLAG O_FSYNC -#endif -#ifdef BARE_OPEN_SYNC_FLAG -#define OPEN_SYNC_FLAG (BARE_OPEN_SYNC_FLAG | PG_O_DIRECT) -#endif - -#if defined(O_DSYNC) -#if defined(OPEN_SYNC_FLAG) -/* O_DSYNC is distinct? */ -#if O_DSYNC != BARE_OPEN_SYNC_FLAG -#define OPEN_DATASYNC_FLAG (O_DSYNC | PG_O_DIRECT) -#endif -#else /* !defined(OPEN_SYNC_FLAG) */ -/* Win32 only has O_DSYNC */ -#define OPEN_DATASYNC_FLAG (O_DSYNC | PG_O_DIRECT) -#endif -#endif - -#if defined(OPEN_DATASYNC_FLAG) -#define DEFAULT_SYNC_METHOD_STR "open_datasync" -#define DEFAULT_SYNC_METHOD SYNC_METHOD_OPEN -#define DEFAULT_SYNC_FLAGBIT OPEN_DATASYNC_FLAG -#elif defined(HAVE_FDATASYNC) -#define DEFAULT_SYNC_METHOD_STR "fdatasync" -#define DEFAULT_SYNC_METHOD SYNC_METHOD_FDATASYNC -#define DEFAULT_SYNC_FLAGBIT 0 -#elif defined(HAVE_FSYNC_WRITETHROUGH_ONLY) -#define DEFAULT_SYNC_METHOD_STR "fsync_writethrough" -#define DEFAULT_SYNC_METHOD SYNC_METHOD_FSYNC_WRITETHROUGH -#define DEFAULT_SYNC_FLAGBIT 0 -#else -#define DEFAULT_SYNC_METHOD_STR "fsync" -#define DEFAULT_SYNC_METHOD SYNC_METHOD_FSYNC -#define DEFAULT_SYNC_FLAGBIT 0 -#endif - - -/* - * Limitation of buffer-alignment for direct IO depends on OS and filesystem, - * but XLOG_BLCKSZ is assumed to be enough for it. - */ -#ifdef O_DIRECT -#define ALIGNOF_XLOG_BUFFER XLOG_BLCKSZ -#else -#define ALIGNOF_XLOG_BUFFER ALIGNOF_BUFFER -#endif - /* File path names (all relative to $PGDATA) */ #define BACKUP_LABEL_FILE "backup_label" diff --git a/src/include/access/xlogdefs.h b/src/include/access/xlogdefs.h index 6926bd792a..ceca779432 100644 --- a/src/include/access/xlogdefs.h +++ b/src/include/access/xlogdefs.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/xlogdefs.h,v 1.16 2007/01/05 22:19:51 momjian Exp $ + * $PostgreSQL: pgsql/src/include/access/xlogdefs.h,v 1.17 2007/02/14 05:00:40 momjian Exp $ */ #ifndef XLOG_DEFS_H #define XLOG_DEFS_H @@ -63,4 +63,75 @@ typedef struct XLogRecPtr */ typedef uint32 TimeLineID; +/* + * Because O_DIRECT bypasses the kernel buffers, and because we never + * read those buffers except during crash recovery, it is a win to use + * it in all cases where we sync on each write(). We could allow O_DIRECT + * with fsync(), but because skipping the kernel buffer forces writes out + * quickly, it seems best just to use it for O_SYNC. It is hard to imagine + * how fsync() could be a win for O_DIRECT compared to O_SYNC and O_DIRECT. + * Also, O_DIRECT is never enough to force data to the drives, it merely + * tries to bypass the kernel cache, so we still need O_SYNC or fsync(). + */ +#ifdef O_DIRECT +#define PG_O_DIRECT O_DIRECT +#else +#define PG_O_DIRECT 0 +#endif + +/* + * This chunk of hackery attempts to determine which file sync methods + * are available on the current platform, and to choose an appropriate + * default method. We assume that fsync() is always available, and that + * configure determined whether fdatasync() is. + */ +#if defined(O_SYNC) +#define BARE_OPEN_SYNC_FLAG O_SYNC +#elif defined(O_FSYNC) +#define BARE_OPEN_SYNC_FLAG O_FSYNC +#endif +#ifdef BARE_OPEN_SYNC_FLAG +#define OPEN_SYNC_FLAG (BARE_OPEN_SYNC_FLAG | PG_O_DIRECT) +#endif + +#if defined(O_DSYNC) +#if defined(OPEN_SYNC_FLAG) +/* O_DSYNC is distinct? */ +#if O_DSYNC != BARE_OPEN_SYNC_FLAG +#define OPEN_DATASYNC_FLAG (O_DSYNC | PG_O_DIRECT) +#endif +#else /* !defined(OPEN_SYNC_FLAG) */ +/* Win32 only has O_DSYNC */ +#define OPEN_DATASYNC_FLAG (O_DSYNC | PG_O_DIRECT) +#endif +#endif + +#if defined(OPEN_DATASYNC_FLAG) +#define DEFAULT_SYNC_METHOD_STR "open_datasync" +#define DEFAULT_SYNC_METHOD SYNC_METHOD_OPEN +#define DEFAULT_SYNC_FLAGBIT OPEN_DATASYNC_FLAG +#elif defined(HAVE_FDATASYNC) +#define DEFAULT_SYNC_METHOD_STR "fdatasync" +#define DEFAULT_SYNC_METHOD SYNC_METHOD_FDATASYNC +#define DEFAULT_SYNC_FLAGBIT 0 +#elif defined(HAVE_FSYNC_WRITETHROUGH_ONLY) +#define DEFAULT_SYNC_METHOD_STR "fsync_writethrough" +#define DEFAULT_SYNC_METHOD SYNC_METHOD_FSYNC_WRITETHROUGH +#define DEFAULT_SYNC_FLAGBIT 0 +#else +#define DEFAULT_SYNC_METHOD_STR "fsync" +#define DEFAULT_SYNC_METHOD SYNC_METHOD_FSYNC +#define DEFAULT_SYNC_FLAGBIT 0 +#endif + +/* + * Limitation of buffer-alignment for direct IO depends on OS and filesystem, + * but XLOG_BLCKSZ is assumed to be enough for it. + */ +#ifdef O_DIRECT +#define ALIGNOF_XLOG_BUFFER XLOG_BLCKSZ +#else +#define ALIGNOF_XLOG_BUFFER ALIGNOF_BUFFER +#endif + #endif /* XLOG_DEFS_H */ diff --git a/src/tools/fsync/test_fsync.c b/src/tools/fsync/test_fsync.c index 637d1a6bc1..2179ac937e 100644 --- a/src/tools/fsync/test_fsync.c +++ b/src/tools/fsync/test_fsync.c @@ -7,6 +7,7 @@ #include "access/xlog_internal.h" #include "access/xlog.h" +#include "access/xlogdefs.h" #include #include @@ -18,83 +19,6 @@ #include #include -/* --------------------------------------------------------------- - * Copied from xlog.c. Some day this should be moved an include file. - */ - -/* - * Because O_DIRECT bypasses the kernel buffers, and because we never - * read those buffers except during crash recovery, it is a win to use - * it in all cases where we sync on each write(). We could allow O_DIRECT - * with fsync(), but because skipping the kernel buffer forces writes out - * quickly, it seems best just to use it for O_SYNC. It is hard to imagine - * how fsync() could be a win for O_DIRECT compared to O_SYNC and O_DIRECT. - * Also, O_DIRECT is never enough to force data to the drives, it merely - * tries to bypass the kernel cache, so we still need O_SYNC or fsync(). - */ -#ifdef O_DIRECT -#define PG_O_DIRECT O_DIRECT -#else -#define PG_O_DIRECT 0 -#endif - -/* - * This chunk of hackery attempts to determine which file sync methods - * are available on the current platform, and to choose an appropriate - * default method. We assume that fsync() is always available, and that - * configure determined whether fdatasync() is. - */ -#if defined(O_SYNC) -#define BARE_OPEN_SYNC_FLAG O_SYNC -#elif defined(O_FSYNC) -#define BARE_OPEN_SYNC_FLAG O_FSYNC -#endif -#ifdef BARE_OPEN_SYNC_FLAG -#define OPEN_SYNC_FLAG (BARE_OPEN_SYNC_FLAG | PG_O_DIRECT) -#endif - -#if defined(O_DSYNC) -#if defined(OPEN_SYNC_FLAG) -/* O_DSYNC is distinct? */ -#if O_DSYNC != BARE_OPEN_SYNC_FLAG -#define OPEN_DATASYNC_FLAG (O_DSYNC | PG_O_DIRECT) -#endif -#else /* !defined(OPEN_SYNC_FLAG) */ -/* Win32 only has O_DSYNC */ -#define OPEN_DATASYNC_FLAG (O_DSYNC | PG_O_DIRECT) -#endif -#endif - -#if defined(OPEN_DATASYNC_FLAG) -#define DEFAULT_SYNC_METHOD_STR "open_datasync" -#define DEFAULT_SYNC_METHOD SYNC_METHOD_OPEN -#define DEFAULT_SYNC_FLAGBIT OPEN_DATASYNC_FLAG -#elif defined(HAVE_FDATASYNC) -#define DEFAULT_SYNC_METHOD_STR "fdatasync" -#define DEFAULT_SYNC_METHOD SYNC_METHOD_FDATASYNC -#define DEFAULT_SYNC_FLAGBIT 0 -#elif defined(HAVE_FSYNC_WRITETHROUGH_ONLY) -#define DEFAULT_SYNC_METHOD_STR "fsync_writethrough" -#define DEFAULT_SYNC_METHOD SYNC_METHOD_FSYNC_WRITETHROUGH -#define DEFAULT_SYNC_FLAGBIT 0 -#else -#define DEFAULT_SYNC_METHOD_STR "fsync" -#define DEFAULT_SYNC_METHOD SYNC_METHOD_FSYNC -#define DEFAULT_SYNC_FLAGBIT 0 -#endif - - -/* - * Limitation of buffer-alignment for direct IO depends on OS and filesystem, - * but XLOG_BLCKSZ is assumed to be enough for it. - */ -#ifdef O_DIRECT -#define ALIGNOF_XLOG_BUFFER XLOG_BLCKSZ -#else -#define ALIGNOF_XLOG_BUFFER ALIGNOF_BUFFER -#endif - -/* ------------ from xlog.c --------------- */ #ifdef WIN32 #define FSYNC_FILENAME "./test_fsync.out"