Applied.  (Thanks (to me).  :-))

---------------------------------------------------------------------------

Bruce Momjian wrote:
> Bruce Momjian wrote:
> > Tom Lane wrote:
> > > Bruce Momjian <pgman@candle.pha.pa.us> writes:
> > > > I have fixed the code to properly remove *.backup files from the
> > > > /pg_xlog directory once they are archived.
> > > 
> > > I do not actually think that this is a good idea.  The .backup files are
> > > not large and they are pretty critical info --- so having multiple
> > > copies of them seems like a good idea.  We don't auto-remove timeline
> > > history files either, for the same reason.
> > 
> > I realize the files are small, but the number of entries in the
> > directory might get pretty large.  I am also worried about folks
> > realizing we are not cleaning out those directories and mucking in there
> > when they shouldn't --- I already got a private email asking why there
> > are so many files in there and can they be cleared out.  In fact, the
> > archive_status/ directory also keeps *.done files for the backup files.
> > 
> > We knowe we have archived the *.backup files.  Are these files any use
> > if we can't get the archive files restored?
> > 
> > OK, how about if we do this cleanup when we do pg_stop_backup() so we
> > delete any previous *.backup files, rather than do it as part of
> > checkpoint.
> 
> OK, new version that removes old backup files only when pg_stop_backup()
> is run.  This way the current backup file will always be in pg_xlog/.
> 
> -- 
>   Bruce Momjian                        |  http://candle.pha.pa.us
>   pgman@candle.pha.pa.us               |  (610) 359-1001
>   +  If your life is a hard drive,     |  13 Roberts Road
>   +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

> Index: src/backend/access/transam/xlog.c
> ===================================================================
> RCS file: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v
> retrieving revision 1.198
> diff -c -c -r1.198 xlog.c
> *** src/backend/access/transam/xlog.c 8 Jun 2005 15:50:26 -0000       1.198
> --- src/backend/access/transam/xlog.c 9 Jun 2005 14:52:11 -0000
> ***************
> *** 450,455 ****
> --- 450,456 ----
>   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);
> ***************
> *** 2356,2361 ****
> --- 2357,2417 ----
>   }
>   
>   /*
> +  * 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.
>    *
>    * We assume all of the record has been read into memory at *record.
> ***************
> *** 5737,5742 ****
> --- 5793,5800 ----
>                                errmsg("could not remove file \"%s\": %m",
>                                               labelfilepath)));
>   
> +     RemoveOldBackupHistory();
> +     
>       /*
>        * Notify archiver that history file may be archived immediately
>        */

> 
> ---------------------------(end of broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
>     (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

---------------------------(end of broadcast)---------------------------
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]

Reply via email to