Re-enable the old code in xlog.c that tried to use posix_fadvise(), so that
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 11 Jan 2009 18:02:17 +0000 (18:02 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 11 Jan 2009 18:02:17 +0000 (18:02 +0000)
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
configure.in
src/backend/access/transam/xlog.c
src/include/pg_config.h.in
src/include/pg_config_manual.h

index 820b92c642f27901bf659bf7f1e5fb24f907a974..5d85213a8778bfcd5158dd519b56f906d07b9907 100755 (executable)
--- 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
index 9582fd317e8d46ca5215a3714bbd17827feb0e13..901ddcfb0abfb3a7c99c6f2c56d0aab9f3dd1dd1 100644 (file)
@@ -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 <unistd.h>])
 AC_CHECK_DECLS(posix_fadvise, [], [], [#include <fcntl.h>])
index 06ca52909d082cd4b255e811aebf55a78b408aa7..7debb34072601c4606a3842535251ce6f623dd22 100644 (file)
@@ -17,6 +17,7 @@
 #include <ctype.h>
 #include <signal.h>
 #include <time.h>
+#include <fcntl.h>
 #include <sys/stat.h>
 #include <sys/time.h>
 #include <sys/wait.h>
@@ -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().
-        */
-#if defined(HAVE_DECL_POSIX_FADVISE) && defined(POSIX_FADV_DONTNEED)
-       if (!XLogArchivingActive())
-               posix_fadvise(openLogFile, 0, 0, POSIX_FADV_DONTNEED);
+        * 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(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,
index 308f2bb6a31aa69d60ef3287dd671f0dcc88fc8a..3cc7c7ce6a88d0ab8fd4804330e87a2b416b8fa2 100644 (file)
 /* Define to 1 if you have the <poll.h> 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
 
index 6ebb43377f0538f9e88f501f196ac07b9b7fe84d..1df610daf73bb5d0369b2296950f20317eb6ac78 100644 (file)
 #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
 #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