summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMagnus Hagander <magnus@hagander.net>2010-06-09 10:54:50 +0000
committerMagnus Hagander <magnus@hagander.net>2010-06-09 10:54:50 +0000
commit644c2778d6fc59818ffe627735fce265a905a943 (patch)
tree50f485e63fbacd01552a592e6aec45e7275c79ec
parentf7cb215362e9ddd2f083a404f945c343e288f4f5 (diff)
Make the walwriter close it's handle to an old xlog segment if it's no longer
the current one. Not doing this would leave the walwriter with a handle to a deleted file if there was nothing for it to do for a long period of time, preventing the file from being completely removed. Reported by Tollef Fog Heen, and thanks to Heikki for some hand-holding with the patch.
-rw-r--r--src/backend/access/transam/xlog.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 1ff0a3d397e..6f44dcaf9da 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.292.2.10 2010/02/19 01:06:51 itagaki Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.292.2.11 2010/06/09 10:54:50 mha Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1821,9 +1821,21 @@ XLogBackgroundFlush(void)
flexible = false; /* ensure it all gets written */
}
- /* Done if already known flushed */
+ /*
+ * If already known flushed, we're done. Just need to check if we
+ * are holding an open file handle to a logfile that's no longer
+ * in use, preventing the file from being deleted.
+ */
if (XLByteLE(WriteRqstPtr, LogwrtResult.Flush))
+ {
+ if (openLogFile >= 0) {
+ if (!XLByteInPrevSeg(LogwrtResult.Write, openLogId, openLogSeg))
+ {
+ XLogFileClose();
+ }
+ }
return;
+ }
#ifdef WAL_DEBUG
if (XLOG_DEBUG)