]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Remove old *.backup files when we do pg_stop_backup(). This
authorBruce Momjian <bruce@momjian.us>
Wed, 15 Jun 2005 01:36:08 +0000 (01:36 +0000)
committerBruce Momjian <bruce@momjian.us>
Wed, 15 Jun 2005 01:36:08 +0000 (01:36 +0000)
prevents a large number of *.backup files from existing in pg_xlog/

src/backend/access/transam/xlog.c

index b23138de4ccab342650e038b6d2e81e82e4af3d8..c5469d174f2ad38640c7bb85d7b27a08c33f75ed 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.199 2005/06/09 22:36:27 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.200 2005/06/15 01:36:08 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -450,6 +450,7 @@ static bool RestoreArchivedFile(char *path, const char *xlogfname,
 static int     PreallocXlogFiles(XLogRecPtr endptr);
 static void MoveOfflineLogs(uint32 log, uint32 seg, XLogRecPtr endptr,
                                                        int *nsegsremoved, int *nsegsrecycled);
+static void RemoveOldBackupHistory(void);
 static XLogRecord *ReadRecord(XLogRecPtr *RecPtr, int emode);
 static bool ValidXLOGHeader(XLogPageHeader hdr, int emode);
 static XLogRecord *ReadCheckpointRecord(XLogRecPtr RecPtr, int whichChkpt);
@@ -2355,6 +2356,61 @@ MoveOfflineLogs(uint32 log, uint32 seg, XLogRecPtr endptr,
        FreeDir(xldir);
 }
 
+/*
+ * Remove previous backup history files
+ */
+static void
+RemoveOldBackupHistory(void)
+{
+       DIR                *xldir;
+       struct dirent *xlde;
+       char            path[MAXPGPATH];
+
+       xldir = AllocateDir(XLogDir);
+       if (xldir == NULL)
+               ereport(ERROR,
+                               (errcode_for_file_access(),
+                       errmsg("could not open transaction log directory \"%s\": %m",
+                                  XLogDir)));
+
+       errno = 0;
+       while ((xlde = readdir(xldir)) != NULL)
+       {
+               if (strlen(xlde->d_name) > 24 &&
+                       strspn(xlde->d_name, "0123456789ABCDEF") == 24 &&
+                       strcmp(xlde->d_name + strlen(xlde->d_name) - strlen(".backup"),
+                                  ".backup") == 0)
+               {
+                       /* Remove any *.backup files that have been archived. */
+                       if (!XLogArchivingActive() || XLogArchiveIsDone(xlde->d_name))
+                       {
+                               ereport(DEBUG2,
+                                         (errmsg("removing transaction log backup history file \"%s\"",
+                                                         xlde->d_name)));
+                               snprintf(path, MAXPGPATH, "%s/%s", XLogDir, xlde->d_name);
+                               unlink(path);
+                               XLogArchiveCleanup(xlde->d_name);
+                       }
+               }
+               errno = 0;
+       }
+#ifdef WIN32
+
+       /*
+        * This fix is in mingw cvs (runtime/mingwex/dirent.c rev 1.4), but
+        * not in released version
+        */
+       if (GetLastError() == ERROR_NO_MORE_FILES)
+               errno = 0;
+#endif
+       if (errno)
+               ereport(ERROR,
+                               (errcode_for_file_access(),
+                       errmsg("could not read transaction log directory \"%s\": %m",
+                                  XLogDir)));
+       FreeDir(xldir);
+}
+
 /*
  * Restore the backup blocks present in an XLOG record, if any.
  *
@@ -5738,6 +5794,8 @@ pg_stop_backup(PG_FUNCTION_ARGS)
                                 errmsg("could not remove file \"%s\": %m",
                                                labelfilepath)));
 
+       RemoveOldBackupHistory();
+       
        /*
         * Notify archiver that history file may be archived immediately
         */