]> granicus.if.org Git - postgresql/commitdiff
Only recycle normal files in pg_xlog as WAL segments. pg_standby creates
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Tue, 2 Jun 2009 06:19:41 +0000 (06:19 +0000)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Tue, 2 Jun 2009 06:19:41 +0000 (06:19 +0000)
symbolic links with the -l option, and as Fujii Masao pointed out we ended up
overwriting files in the archive directory before this patch. Patch by
Aidan Van Dyk, Fujii Masao and me.

Backpatch to 8.3, where pg_standby was introduced.

src/backend/access/transam/xlog.c

index 0c11d5e55b34b23ae1179f53696b476be2c44e24..d4645e0bd68a45fc885980641c4d560f12cc19ea 100644 (file)
@@ -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.6 2009/05/07 11:25:28 heikki Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.292.2.7 2009/06/02 06:19:41 heikki Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2696,6 +2696,7 @@ RemoveOldXlogFiles(uint32 log, uint32 seg, XLogRecPtr endptr)
        struct dirent *xlde;
        char            lastoff[MAXFNAMELEN];
        char            path[MAXPGPATH];
+       struct stat statbuf;
 
        /*
         * Initialize info about where to try to recycle to.  We allow recycling
@@ -2736,11 +2737,13 @@ RemoveOldXlogFiles(uint32 log, uint32 seg, XLogRecPtr endptr)
 
                                /*
                                 * Before deleting the file, see if it can be recycled as a
-                                * future log segment.
+                                * future log segment. Only recycle normal files, pg_standby
+                                * for example can create symbolic links pointing to a
+                                * separate archive directory.
                                 */
-                               if (InstallXLogFileSegment(&endlogId, &endlogSeg, path,
-                                                                                  true, &max_advance,
-                                                                                  true))
+                               if (lstat(path, &statbuf) == 0 && S_ISREG(statbuf.st_mode) &&
+                                       InstallXLogFileSegment(&endlogId, &endlogSeg, path,
+                                                                                  true, &max_advance, true))
                                {
                                        ereport(DEBUG2,
                                                        (errmsg("recycled transaction log file \"%s\"",