diff options
author | Robert Haas | 2012-04-05 18:18:42 +0000 |
---|---|---|
committer | Robert Haas | 2012-04-05 18:18:42 +0000 |
commit | bbc02243fcf2fbf51b6bacf05a73fa042d3d84a4 (patch) | |
tree | 803ef6332fb9268ddaade852f89e473be9c331ff | |
parent | b736aef2ec57b520ebadb70cceac0fed3168a5df (diff) |
Allow pg_archivecleanup to strip optional file extensions.
Greg Smith and Jaime Casanova, reviewed by Alex Shulgin and myself.
e
-rw-r--r-- | contrib/pg_archivecleanup/pg_archivecleanup.c | 39 | ||||
-rw-r--r-- | doc/src/sgml/pgarchivecleanup.sgml | 15 |
2 files changed, 50 insertions, 4 deletions
diff --git a/contrib/pg_archivecleanup/pg_archivecleanup.c b/contrib/pg_archivecleanup/pg_archivecleanup.c index adfc83dea7..1b3cecf3c4 100644 --- a/contrib/pg_archivecleanup/pg_archivecleanup.c +++ b/contrib/pg_archivecleanup/pg_archivecleanup.c @@ -37,6 +37,7 @@ const char *progname; /* Options and defaults */ bool debug = false; /* are we debugging? */ bool dryrun = false; /* are we performing a dry-run operation? */ +char *additional_ext = NULL; /* Extension to remove from filenames */ char *archiveLocation; /* where to find the archive? */ char *restartWALFileName; /* the file from which we can restart restore */ @@ -91,16 +92,36 @@ Initialize(void) } static void +TrimExtension(char *filename, char *extension) +{ + int flen; + int elen; + + if (extension == NULL) + return; + + elen = strlen(extension); + flen = strlen(filename); + + if (flen > elen && strcmp(filename + flen - elen, extension) == 0) + filename[flen - elen] = '\0'; +} + +static void CleanupPriorWALFiles(void) { int rc; DIR *xldir; struct dirent *xlde; + char walfile[MAXPGPATH]; if ((xldir = opendir(archiveLocation)) != NULL) { while ((xlde = readdir(xldir)) != NULL) { + strncpy(walfile, xlde->d_name, MAXPGPATH); + TrimExtension(walfile, additional_ext); + /* * We ignore the timeline part of the XLOG segment identifiers in * deciding whether a segment is still needed. This ensures that @@ -114,10 +135,14 @@ CleanupPriorWALFiles(void) * file. Note that this means files are not removed in the order * they were originally written, in case this worries you. */ - if (strlen(xlde->d_name) == XLOG_DATA_FNAME_LEN && - strspn(xlde->d_name, "0123456789ABCDEF") == XLOG_DATA_FNAME_LEN && - strcmp(xlde->d_name + 8, exclusiveCleanupFileName + 8) < 0) + if (strlen(walfile) == XLOG_DATA_FNAME_LEN && + strspn(walfile, "0123456789ABCDEF") == XLOG_DATA_FNAME_LEN && + strcmp(walfile + 8, exclusiveCleanupFileName + 8) < 0) { + /* + * Use the original file name again now, including any extension + * that might have been chopped off before testing the sequence. + */ snprintf(WALFilePath, MAXPGPATH, "%s/%s", archiveLocation, xlde->d_name); @@ -167,6 +192,8 @@ SetWALFileNameForCleanup(void) { bool fnameOK = false; + TrimExtension(restartWALFileName, additional_ext); + /* * If restartWALFileName is a WAL file name then just use it directly. If * restartWALFileName is a .backup filename, make sure we use the prefix @@ -223,6 +250,7 @@ usage(void) printf("\nOptions:\n"); printf(" -d generates debug output (verbose mode)\n"); printf(" -n shows the names of the files that would have been removed (dry-run)\n"); + printf(" -x EXT cleanup files if they have this same extension\n"); printf(" --help show this help, then exit\n"); printf(" --version output version information, then exit\n"); printf("\n" @@ -259,7 +287,7 @@ main(int argc, char **argv) } } - while ((c = getopt(argc, argv, "dn")) != -1) + while ((c = getopt(argc, argv, "x:dn")) != -1) { switch (c) { @@ -269,6 +297,9 @@ main(int argc, char **argv) case 'n': /* Dry-Run mode */ dryrun = true; break; + case 'x': + additional_ext = optarg; /* Extension to remove from xlogfile names */ + break; default: fprintf(stderr, "Try \"%s --help\" for more information.\n", progname); exit(2); diff --git a/doc/src/sgml/pgarchivecleanup.sgml b/doc/src/sgml/pgarchivecleanup.sgml index 8148c53d3a..40bac85470 100644 --- a/doc/src/sgml/pgarchivecleanup.sgml +++ b/doc/src/sgml/pgarchivecleanup.sgml @@ -107,6 +107,21 @@ pg_archivecleanup: removing file "archive/00000001000000370000000E" </listitem> </varlistentry> + <varlistentry> + <term><option>-x</option> <replaceable>extension</></term> + <listitem> + <para> + When using the program as a standalone utility, provide an extension + that will be stripped from all file names before deciding if they + should be deleted. This is typically useful for cleaning up archives + that have been compressed during storage, and therefore have had an + extension added by the compression program. Note that the + <filename>.backup</> file name passed to the program should not + include the extension. + </para> + </listitem> + </varlistentry> + </variablelist> </para> |