From 1a37056a74e273085c39bb88cba48797695c067e Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 11 Jan 2009 18:02:17 +0000 Subject: [PATCH] Re-enable the old code in xlog.c that tried to use posix_fadvise(), so that we can get some buildfarm feedback about whether that function is still problematic. (Note that the planned async-preread patch will not really prove anything one way or the other in buildfarm testing, since it will be inactive with default GUC settings.) --- configure | 3 ++- configure.in | 4 ++-- src/backend/access/transam/xlog.c | 31 ++++++++++--------------------- src/include/pg_config.h.in | 3 +++ src/include/pg_config_manual.h | 14 ++++++++++++-- 5 files changed, 29 insertions(+), 26 deletions(-) diff --git a/configure b/configure index 820b92c642..5d85213a87 100755 --- a/configure +++ b/configure @@ -16238,7 +16238,8 @@ fi -for ac_func in cbrt dlopen fcvt fdatasync getpeereid getpeerucred getrlimit memmove poll pstat readlink setproctitle setsid sigprocmask symlink sysconf towlower utime utimes waitpid wcstombs + +for ac_func in cbrt dlopen fcvt fdatasync getpeereid getpeerucred getrlimit memmove poll posix_fadvise pstat readlink setproctitle setsid sigprocmask symlink sysconf towlower utime utimes waitpid wcstombs do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 diff --git a/configure.in b/configure.in index 52a8db226c..38c26f2194 100644 --- a/configure.in +++ b/configure.in @@ -1,5 +1,5 @@ dnl Process this file with autoconf to produce a configure script. -dnl $PostgreSQL: pgsql/configure.in,v 1.584 2009/01/07 10:38:44 petere Exp $ +dnl $PostgreSQL: pgsql/configure.in,v 1.585 2009/01/11 18:02:17 tgl Exp $ dnl dnl Developers, please strive to achieve this order: dnl @@ -1137,7 +1137,7 @@ PGAC_VAR_INT_TIMEZONE AC_FUNC_ACCEPT_ARGTYPES PGAC_FUNC_GETTIMEOFDAY_1ARG -AC_CHECK_FUNCS([cbrt dlopen fcvt fdatasync getpeereid getpeerucred getrlimit memmove poll pstat readlink setproctitle setsid sigprocmask symlink sysconf towlower utime utimes waitpid wcstombs]) +AC_CHECK_FUNCS([cbrt dlopen fcvt fdatasync getpeereid getpeerucred getrlimit memmove poll posix_fadvise pstat readlink setproctitle setsid sigprocmask symlink sysconf towlower utime utimes waitpid wcstombs]) AC_CHECK_DECLS(fdatasync, [], [], [#include ]) AC_CHECK_DECLS(posix_fadvise, [], [], [#include ]) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index daea9fafdf..9a2b3308b1 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.326 2009/01/01 17:23:36 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.327 2009/01/11 18:02:17 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -2435,30 +2436,18 @@ XLogFileClose(void) { Assert(openLogFile >= 0); - /* - * posix_fadvise is problematic on many platforms: on older x86 Linux it - * just dumps core, and there are reports of problems on PPC platforms as - * well. The following is therefore disabled for the time being. We could - * consider some kind of configure test to see if it's safe to use, but - * since we lack hard evidence that there's any useful performance gain to - * be had, spending time on that seems unprofitable for now. - */ -#ifdef NOT_USED - /* * WAL segment files will not be re-read in normal operation, so we advise - * OS to release any cached pages. But do not do so if WAL archiving is - * active, because archiver process could use the cache to read the WAL - * segment. - * - * While O_DIRECT works for O_SYNC, posix_fadvise() works for fsync() and - * O_SYNC, and some platforms only have posix_fadvise(). + * the OS to release any cached pages. But do not do so if WAL archiving + * is active, because archiver process could use the cache to read the WAL + * segment. Also, don't bother with it if we are using O_DIRECT, since + * the kernel is presumably not caching in that case. */ -#if defined(HAVE_DECL_POSIX_FADVISE) && defined(POSIX_FADV_DONTNEED) - if (!XLogArchivingActive()) - posix_fadvise(openLogFile, 0, 0, POSIX_FADV_DONTNEED); +#if defined(USE_POSIX_FADVISE) && defined(POSIX_FADV_DONTNEED) + if (!XLogArchivingActive() && + (get_sync_bit(sync_method) & PG_O_DIRECT) == 0) + (void) posix_fadvise(openLogFile, 0, 0, POSIX_FADV_DONTNEED); #endif -#endif /* NOT_USED */ if (close(openLogFile)) ereport(PANIC, diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index 308f2bb6a3..3cc7c7ce6a 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -336,6 +336,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_POLL_H +/* Define to 1 if you have the `posix_fadvise' function. */ +#undef HAVE_POSIX_FADVISE + /* Define to 1 if you have the POSIX signal interface. */ #undef HAVE_POSIX_SIGNALS diff --git a/src/include/pg_config_manual.h b/src/include/pg_config_manual.h index 3c1c1c0b8e..ff9d6ce45d 100644 --- a/src/include/pg_config_manual.h +++ b/src/include/pg_config_manual.h @@ -6,7 +6,7 @@ * for developers. If you edit any of these, be sure to do a *full* * rebuild (and an initdb if noted). * - * $PostgreSQL: pgsql/src/include/pg_config_manual.h,v 1.35 2008/07/12 02:28:43 tgl Exp $ + * $PostgreSQL: pgsql/src/include/pg_config_manual.h,v 1.36 2009/01/11 18:02:17 tgl Exp $ *------------------------------------------------------------------------ */ @@ -112,7 +112,7 @@ #define ALIGNOF_BUFFER 32 /* - * Disable UNIX sockets for those operating system. + * Disable UNIX sockets for certain operating systems. */ #if defined(WIN32) #undef HAVE_UNIX_SOCKETS @@ -125,6 +125,16 @@ #define HAVE_WORKING_LINK 1 #endif +/* + * USE_POSIX_FADVISE controls whether Postgres will attempt to use the + * posix_fadvise() kernel call. Usually the automatic configure tests are + * sufficient, but some older Linux distributions had broken versions of + * posix_fadvise(). If necessary you can remove the #define here. + */ +#if HAVE_DECL_POSIX_FADVISE && defined(HAVE_POSIX_FADVISE) +#define USE_POSIX_FADVISE +#endif + /* * This is the default directory in which AF_UNIX socket files are * placed. Caution: changing this risks breaking your existing client