diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bin/pg_archivecleanup/pg_archivecleanup.c | 31 | ||||
-rw-r--r-- | src/bin/pg_resetxlog/pg_resetxlog.c | 10 |
2 files changed, 33 insertions, 8 deletions
diff --git a/src/bin/pg_archivecleanup/pg_archivecleanup.c b/src/bin/pg_archivecleanup/pg_archivecleanup.c index 579a9bb8430..c5569f32a33 100644 --- a/src/bin/pg_archivecleanup/pg_archivecleanup.c +++ b/src/bin/pg_archivecleanup/pg_archivecleanup.c @@ -125,7 +125,7 @@ CleanupPriorWALFiles(void) * file. Note that this means files are not removed in the order * they were originally written, in case this worries you. */ - if (IsXLogFileName(walfile) && + if ((IsXLogFileName(walfile) || IsPartialXLogFileName(walfile)) && strcmp(walfile + 8, exclusiveCleanupFileName + 8) < 0) { /* @@ -181,7 +181,7 @@ CleanupPriorWALFiles(void) * SetWALFileNameForCleanup() * * Set the earliest WAL filename that we want to keep on the archive - * and decide whether we need_cleanup + * and decide whether we need cleanup */ static void SetWALFileNameForCleanup(void) @@ -192,9 +192,10 @@ SetWALFileNameForCleanup(void) /* * If restartWALFileName is a WAL file name then just use it directly. If - * restartWALFileName is a .backup filename, make sure we use the prefix - * of the filename, otherwise we will remove wrong files since - * 000000010000000000000010.00000020.backup is after + * restartWALFileName is a .partial or .backup filename, make sure we use + * the prefix of the filename, otherwise we will remove wrong files since + * 000000010000000000000010.partial and + * 000000010000000000000010.00000020.backup are after * 000000010000000000000010. */ if (IsXLogFileName(restartWALFileName)) @@ -202,6 +203,26 @@ SetWALFileNameForCleanup(void) strcpy(exclusiveCleanupFileName, restartWALFileName); fnameOK = true; } + else if (IsPartialXLogFileName(restartWALFileName)) + { + int args; + uint32 tli = 1, + log = 0, + seg = 0; + + args = sscanf(restartWALFileName, "%08X%08X%08X.partial", + &tli, &log, &seg); + if (args == 3) + { + fnameOK = true; + + /* + * Use just the prefix of the filename, ignore everything after + * first period + */ + XLogFileNameById(exclusiveCleanupFileName, tli, log, seg); + } + } else if (IsBackupHistoryFileName(restartWALFileName)) { int args; diff --git a/src/bin/pg_resetxlog/pg_resetxlog.c b/src/bin/pg_resetxlog/pg_resetxlog.c index e19a72b4c16..e7e8059a38d 100644 --- a/src/bin/pg_resetxlog/pg_resetxlog.c +++ b/src/bin/pg_resetxlog/pg_resetxlog.c @@ -906,7 +906,8 @@ FindEndOfXLOG(void) while (errno = 0, (xlde = readdir(xldir)) != NULL) { - if (IsXLogFileName(xlde->d_name)) + if (IsXLogFileName(xlde->d_name) || + IsPartialXLogFileName(xlde->d_name)) { unsigned int tli, log, @@ -976,7 +977,8 @@ KillExistingXLOG(void) while (errno = 0, (xlde = readdir(xldir)) != NULL) { - if (IsXLogFileName(xlde->d_name)) + if (IsXLogFileName(xlde->d_name) || + IsPartialXLogFileName(xlde->d_name)) { snprintf(path, MAXPGPATH, "%s/%s", XLOGDIR, xlde->d_name); if (unlink(path) < 0) @@ -1028,7 +1030,9 @@ KillExistingArchiveStatus(void) { if (strspn(xlde->d_name, "0123456789ABCDEF") == XLOG_FNAME_LEN && (strcmp(xlde->d_name + XLOG_FNAME_LEN, ".ready") == 0 || - strcmp(xlde->d_name + XLOG_FNAME_LEN, ".done") == 0)) + strcmp(xlde->d_name + XLOG_FNAME_LEN, ".done") == 0 || + strcmp(xlde->d_name + XLOG_FNAME_LEN, ".partial.ready") == 0 || + strcmp(xlde->d_name + XLOG_FNAME_LEN, ".partial.done") == 0)) { snprintf(path, MAXPGPATH, "%s/%s", ARCHSTATDIR, xlde->d_name); if (unlink(path) < 0) |