0001-Fix-use-of-posix_fadvise-in-xlog.patch
application/octet-stream
Filename: 0001-Fix-use-of-posix_fadvise-in-xlog.patch
Type: application/octet-stream
Part: 0
Message:
fix use of posix_fadvise in xlog.c
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch 0001
Subject: Fix use of posix_fadvise in xlog.
| File | + | − |
|---|---|---|
| src/backend/access/transam/xlog.c | 22 | 5 |
From 27958bc3ba69279719996f8495bfc63c83c8f0e1 Mon Sep 17 00:00:00 2001
From: Mark Wong <markwkm@gmail.com>
Date: Tue, 13 Oct 2009 19:29:47 -0700
Subject: [PATCH] Fix use of posix_fadvise in xlog.
Currently posix_fadvise() is called right before a log file is closed so
its benefit is hardly realized.
This fix moves posix_fadvise() into 3 new locations within
XLogFileInit(). The first case is where an existing file handle is
returned. The next case is when a file is zeroed out. The third case
is returning a file handle, which may be the file that was just zeroed
out.
---
src/backend/access/transam/xlog.c | 27 ++++++++++++++++++++++-----
1 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 622d796..1b1794e 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -2255,6 +2255,12 @@ XLogNeedsFlush(XLogRecPtr record)
* inside a critical section (eg, during checkpoint there is no reason to
* take down the system on failure). They will promote to PANIC if we are
* in a critical section.
+ *
+ * WAL segment files will not be re-read in normal operation, so we advise
+ * 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.
*/
int
XLogFileInit(uint32 log, uint32 seg,
@@ -2287,7 +2293,13 @@ XLogFileInit(uint32 log, uint32 seg,
path, log, seg)));
}
else
+ {
+#if defined(USE_POSIX_FADVISE) && defined(POSIX_FADV_DONTNEED)
+ if (!XLogIsNeeded())
+ (void) posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED);
+#endif
return fd;
+ }
}
/*
@@ -2310,6 +2322,11 @@ XLogFileInit(uint32 log, uint32 seg,
(errcode_for_file_access(),
errmsg("could not create file \"%s\": %m", tmppath)));
+#if defined(USE_POSIX_FADVISE) && defined(POSIX_FADV_DONTNEED)
+ if (!XLogIsNeeded())
+ (void) posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED);
+#endif
+
/*
* Zero-fill the file. We have to do this the hard way to ensure that all
* the file space has really been allocated --- on platforms that allow
@@ -2390,6 +2407,11 @@ XLogFileInit(uint32 log, uint32 seg,
errmsg("could not open file \"%s\" (log file %u, segment %u): %m",
path, log, seg)));
+#if defined(USE_POSIX_FADVISE) && defined(POSIX_FADV_DONTNEED)
+ if (!XLogIsNeeded())
+ (void) posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED);
+#endif
+
elog(DEBUG2, "done creating and filling new WAL file");
return fd;
@@ -2756,11 +2778,6 @@ XLogFileClose(void)
* or streaming is active, because archiver and walsender process could
* use the cache to read the WAL segment.
*/
-#if defined(USE_POSIX_FADVISE) && defined(POSIX_FADV_DONTNEED)
- if (!XLogIsNeeded())
- (void) posix_fadvise(openLogFile, 0, 0, POSIX_FADV_DONTNEED);
-#endif
-
if (close(openLogFile))
ereport(PANIC,
(errcode_for_file_access(),
--
1.6.0.6