From f4d907ca8576a0e8a3c14230618ac29b70bb3606 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Wed, 15 Jun 2005 01:36:08 +0000 Subject: [PATCH] Remove old *.backup files when we do pg_stop_backup(). This prevents a large number of *.backup files from existing in pg_xlog/ --- src/backend/access/transam/xlog.c | 60 ++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index b23138de4c..c5469d174f 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -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 */