From e28f6f11e97a80e9c1adf1a6eaeeabbfc991914f Mon Sep 17 00:00:00 2001 From: Cynthia Shang Date: Tue, 23 Feb 2021 12:20:02 -0500 Subject: [PATCH] Expire continues if an error occurs processing a repository. Errors are logged to the log file rather than thrown. If, after processing all repos, one or more errors occurred, then a single error error will be thrown to indicate there were errors and the log file should be inspected. Also update log messages to be more consistent with new patterns. --- build/error.yaml | 3 + doc/xml/release.xml | 1 + doc/xml/user-guide.xml | 4 +- src/command/expire/expire.c | 144 +++++---- src/common/error.auto.c | 2 + src/common/error.auto.h | 1 + test/expect/mock-all-001.log | 16 +- test/expect/mock-expire-001.log | 130 ++++---- test/expect/mock-expire-002.log | 58 ++-- test/expect/mock-stanza-001.log | 2 +- test/expect/mock-stanza-002.log | 2 +- test/src/module/command/expireTest.c | 443 ++++++++++++++++----------- 12 files changed, 466 insertions(+), 340 deletions(-) diff --git a/build/error.yaml b/build/error.yaml index 424f1a9d3..bbe164b84 100644 --- a/build/error.yaml +++ b/build/error.yaml @@ -97,6 +97,9 @@ service: 101 # An error while attempting to execute a binary execute: 102 +# The command encountered one or more errors +command: 104 + # This error should not be thrown directly -- it serves as a parent for the C errors runtime: 122 diff --git a/doc/xml/release.xml b/doc/xml/release.xml index c1181dcad..471100d91 100644 --- a/doc/xml/release.xml +++ b/doc/xml/release.xml @@ -39,6 +39,7 @@ + diff --git a/doc/xml/user-guide.xml b/doc/xml/user-guide.xml index 339586897..8ca3d9949 100644 --- a/doc/xml/user-guide.xml +++ b/doc/xml/user-guide.xml @@ -1548,7 +1548,7 @@ {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} --type=full --log-level-console=info backup - expire full backup set repo1\: {[backup-full-first]}|archive retention on backup {[backup-full-second]}|remove archive + expire full backup set {[backup-full-first]}|archive retention on backup {[backup-full-second]}|remove archive @@ -1593,7 +1593,7 @@ {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} --type=diff --log-level-console=info backup - expire diff backup set repo1: {[backup-diff-second]} + expire diff backup set {[backup-diff-second]} diff --git a/src/command/expire/expire.c b/src/command/expire/expire.c index 87c6020e9..0f3117420 100644 --- a/src/command/expire/expire.c +++ b/src/command/expire/expire.c @@ -121,8 +121,7 @@ expireAdhocBackup(InfoBackup *infoBackup, const String *backupLabel, unsigned in { THROW_FMT( BackupSetInvalidError, - "full backup repo%u: %s cannot be expired until another full backup has been created on this repo", - cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), strZ(backupLabel)); + "full backup %s cannot be expired until another full backup has been created on this repo", strZ(backupLabel)); } } @@ -144,7 +143,7 @@ expireAdhocBackup(InfoBackup *infoBackup, const String *backupLabel, unsigned in // backups that can be recovered through PITR until the next full backup is created. Same problem for differential // backups with retention-diff. LOG_WARN_FMT( - "expiring latest backup repo%u: %s - the ability to perform point-in-time-recovery (PITR) may be affected\n" + "repo%u: expiring latest backup %s - the ability to perform point-in-time-recovery (PITR) may be affected\n" "HINT: non-default settings for '%s'/'%s' (even in prior expires) can cause gaps in the WAL.", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), strZ(latestBackup), cfgOptionIdxName(cfgOptRepoRetentionArchive, repoIdx), cfgOptionIdxName(cfgOptRepoRetentionArchiveType, repoIdx)); @@ -158,7 +157,7 @@ expireAdhocBackup(InfoBackup *infoBackup, const String *backupLabel, unsigned in // Log the expired backup list (prepend "set:" if there were any dependents that were also expired) LOG_INFO_FMT( - "expire adhoc backup %srepo%u: %s", (result > 1 ? "set " : ""), cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), + "repo%u: expire adhoc backup %s%s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), (result > 1 ? "set " : ""), strZ(strLstJoin(backupExpired, ", "))); } MEM_CONTEXT_TEMP_END(); @@ -210,8 +209,8 @@ expireDiffBackup(InfoBackup *infoBackup, unsigned int repoIdx) // Log the expired backups. If there is more than one backup, then prepend "set:" LOG_INFO_FMT( - "expire diff backup %srepo%u: %s", (strLstSize(backupExpired) > 1 ? "set " : ""), - cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), strZ(strLstJoin(backupExpired, ", "))); + "repo%u: expire diff backup %s%s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), + (strLstSize(backupExpired) > 1 ? "set " : ""), strZ(strLstJoin(backupExpired, ", "))); } } } @@ -260,8 +259,8 @@ expireFullBackup(InfoBackup *infoBackup, unsigned int repoIdx) // Log the expired backups. If there is more than one backup, then prepend "set:" LOG_INFO_FMT( - "expire full backup %srepo%u: %s", (strLstSize(backupExpired) > 1 ? "set " : ""), - cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), strZ(strLstJoin(backupExpired, ", "))); + "repo%u: expire full backup %s%s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), + (strLstSize(backupExpired) > 1 ? "set " : ""), strZ(strLstJoin(backupExpired, ", "))); } } } @@ -329,8 +328,8 @@ expireTimeBasedBackup(InfoBackup *infoBackup, const time_t minTimestamp, unsigne // Log the expired backups. If there is more than one backup, then prepend "set:" LOG_INFO_FMT( - "expire time-based backup %srepo%u: %s", (strLstSize(backupExpired) > 1 ? "set " : ""), - cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), strZ(strLstJoin(backupExpired, ", "))); + "repo%u: expire time-based backup %s%s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), + (strLstSize(backupExpired) > 1 ? "set " : ""), strZ(strLstJoin(backupExpired, ", "))); } if (strEqZ(cfgOptionIdxStr(cfgOptRepoRetentionArchiveType, repoIdx), CFGOPTVAL_TMP_REPO_RETENTION_ARCHIVE_TYPE_FULL) && @@ -357,7 +356,7 @@ logExpire(ArchiveExpired *archiveExpire, String *archiveId, unsigned int repoIdx { // Force out any remaining message LOG_DETAIL_FMT( - "remove archive repo%u: %s, start = %s, stop = %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), strZ(archiveId), + "repo%u: %s remove archive, start = %s, stop = %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), strZ(archiveId), strZ(archiveExpire->start), strZ(archiveExpire->stop)); archiveExpire->start = NULL; @@ -397,7 +396,7 @@ removeExpiredArchive(InfoBackup *infoBackup, bool timeBasedFullRetention, unsign else { LOG_INFO_FMT( - "time-based archive retention not met for repo%u %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), + "repo%u: time-based archive retention not met %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), strZ(msg)); } } @@ -470,9 +469,8 @@ removeExpiredArchive(InfoBackup *infoBackup, bool timeBasedFullRetention, unsign archiveInfoPgHistory.systemId != backupInfoPgHistory.systemId || archiveInfoPgHistory.version != backupInfoPgHistory.version) { - THROW_FMT( - FormatError, "archive expiration cannot continue for repo%u - archive and backup history lists do not" - " match", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx)); + THROW( + FormatError, "archive expiration cannot continue - archive and backup history lists do not match"); } } @@ -526,7 +524,7 @@ removeExpiredArchive(InfoBackup *infoBackup, bool timeBasedFullRetention, unsign storageRepoIdx(repoIdx), strNewFmt(STORAGE_REPO_ARCHIVE "/%s", strZ(archiveId))); LOG_INFO_FMT( - "remove archive path repo%u: %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), + "repo%u: remove archive path %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), strZ(fullPath)); // Execute the real expiration and deletion only if the dry-run option is disabled @@ -619,8 +617,9 @@ removeExpiredArchive(InfoBackup *infoBackup, bool timeBasedFullRetention, unsign archiveExpireMax = strDup(archiveRange.start); LOG_DETAIL_FMT( - "archive retention on backup %s repo%u: %s, start = %s%s", strZ(backupData->backupLabel), - cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), strZ(archiveId), strZ(archiveRange.start), + "repo%u: %s archive retention on backup %s, start = %s%s", + cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), strZ(archiveId), + strZ(backupData->backupLabel), strZ(archiveRange.start), archiveRange.stop != NULL ? strZ(strNewFmt(", stop = %s", strZ(archiveRange.stop))) : ""); // Add the archive range to the list @@ -732,7 +731,7 @@ removeExpiredArchive(InfoBackup *infoBackup, bool timeBasedFullRetention, unsign if (archiveExpire.total == 0) { LOG_DETAIL_FMT( - "no archive to remove for repo%u: %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), + "repo%u: %s no archive to remove", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), strZ(archiveId)); } // Log if there is more to log @@ -766,7 +765,7 @@ removeExpiredArchive(InfoBackup *infoBackup, bool timeBasedFullRetention, unsign } LOG_DETAIL_FMT( - "remove history file repo%u: %s, file = %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), + "repo%u: %s remove history file %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), strZ(archiveId), strZ(historyFile)); } } @@ -845,7 +844,7 @@ removeExpiredBackup(InfoBackup *infoBackup, const String *adhocBackupLabel, unsi if (!strLstExists(currentBackupList, strLstGet(backupList, backupIdx))) { LOG_INFO_FMT( - "remove expired backup repo%u: %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), + "repo%u: remove expired backup %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), strZ(strLstGet(backupList, backupIdx))); // Execute the real expiration and deletion only if the dry-run mode is disabled @@ -900,68 +899,87 @@ cmdExpire(void) THROW_FMT(OptionInvalidValueError, "'%s' is not a valid backup label format", strZ(adhocBackupLabel)); } + // Track any errors that may occur + unsigned int errorTotal = 0; + for (unsigned int repoIdx = repoIdxMin; repoIdx <= repoIdxMax; repoIdx++) { // Get the repo storage in case it is remote and encryption settings need to be pulled down const Storage *storageRepo = storageRepoIdx(repoIdx); - - // Load the backup.info - InfoBackup *infoBackup = infoBackupLoadFileReconstruct( - storageRepo, INFO_BACKUP_PATH_FILE_STR, cipherType(cfgOptionIdxStr(cfgOptRepoCipherType, repoIdx)), - cfgOptionIdxStrNull(cfgOptRepoCipherPass, repoIdx)); + InfoBackup *infoBackup = NULL; bool timeBasedFullRetention = strEqZ( cfgOptionIdxStr(cfgOptRepoRetentionFullType, repoIdx), CFGOPTVAL_TMP_REPO_RETENTION_FULL_TYPE_TIME); - // If a backupLabel was set, then attempt to expire the requested backup - if (adhocBackupLabel != NULL) + TRY_BEGIN() { - if (infoBackupDataByLabel(infoBackup, adhocBackupLabel) != NULL) - { - adhocBackupFound = true; - expireAdhocBackup(infoBackup, adhocBackupLabel, repoIdx); - } + // Load the backup.info + infoBackup = infoBackupLoadFileReconstruct( + storageRepo, INFO_BACKUP_PATH_FILE_STR, cipherType(cfgOptionIdxStr(cfgOptRepoCipherType, repoIdx)), + cfgOptionIdxStrNull(cfgOptRepoCipherPass, repoIdx)); - // If the adhoc backup was not found and this was the last repo to check, then log a warning but continue to process - // the expiration based on retention - if (!adhocBackupFound && repoIdx == repoIdxMax) + // If a backupLabel was set, then attempt to expire the requested backup + if (adhocBackupLabel != NULL) { - LOG_WARN_FMT( - "backup %s does not exist\nHINT: run the info command and confirm the backup is listed", - strZ(adhocBackupLabel)); - } - } - else - { - // If time-based retention for full backups is set, then expire based on time period - if (timeBasedFullRetention) - { - // If a time period was provided then run time-based expiration otherwise do nothing (the user has already been - // warned by the config system that retention-full was not set) - if (cfgOptionIdxTest(cfgOptRepoRetentionFull, repoIdx)) + if (infoBackupDataByLabel(infoBackup, adhocBackupLabel) != NULL) { - expireTimeBasedBackup( - infoBackup, time(NULL) - (time_t)(cfgOptionUInt(cfgOptRepoRetentionFull) * SEC_PER_DAY), repoIdx); + adhocBackupFound = true; + expireAdhocBackup(infoBackup, adhocBackupLabel, repoIdx); + } + + // If the adhoc backup was not found and this was the last repo to check, then log a warning but continue to + // process the expiration based on retention + if (!adhocBackupFound && repoIdx == repoIdxMax) + { + LOG_WARN_FMT( + "backup %s does not exist\nHINT: run the info command and confirm the backup is listed", + strZ(adhocBackupLabel)); } } else - expireFullBackup(infoBackup, repoIdx); + { + // If time-based retention for full backups is set, then expire based on time period + if (timeBasedFullRetention) + { + // If a time period was provided then run time-based expiration otherwise do nothing (the user has already + // been warned by the config system that retention-full was not set) + if (cfgOptionIdxTest(cfgOptRepoRetentionFull, repoIdx)) + { + expireTimeBasedBackup( + infoBackup, time(NULL) - (time_t)(cfgOptionUInt(cfgOptRepoRetentionFull) * SEC_PER_DAY), repoIdx); + } + } + else + expireFullBackup(infoBackup, repoIdx); - expireDiffBackup(infoBackup, repoIdx); + expireDiffBackup(infoBackup, repoIdx); + } + + // Store the new backup info only if the dry-run mode is disabled + if (!cfgOptionValid(cfgOptDryRun) || !cfgOptionBool(cfgOptDryRun)) + { + infoBackupSaveFile( + infoBackup, storageRepoIdxWrite(repoIdx), INFO_BACKUP_PATH_FILE_STR, + cipherType(cfgOptionIdxStr(cfgOptRepoCipherType, repoIdx)), + cfgOptionIdxStrNull(cfgOptRepoCipherPass, repoIdx)); + } + + // Remove all files on disk that are now expired + removeExpiredBackup(infoBackup, adhocBackupLabel, repoIdx); + removeExpiredArchive(infoBackup, timeBasedFullRetention, repoIdx); } - - // Store the new backup info only if the dry-run mode is disabled - if (!cfgOptionValid(cfgOptDryRun) || !cfgOptionBool(cfgOptDryRun)) + CATCH_ANY() { - infoBackupSaveFile( - infoBackup, storageRepoIdxWrite(repoIdx), INFO_BACKUP_PATH_FILE_STR, - cipherType(cfgOptionIdxStr(cfgOptRepoCipherType, repoIdx)), cfgOptionIdxStrNull(cfgOptRepoCipherPass, repoIdx)); + LOG_ERROR_FMT( + errorTypeCode(errorType()), "repo%u: %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), errorMessage()); + errorTotal++;; } - - // Remove all files on disk that are now expired - removeExpiredBackup(infoBackup, adhocBackupLabel, repoIdx); - removeExpiredArchive(infoBackup, timeBasedFullRetention, repoIdx); + TRY_END(); } + + // Error if any errors encountered on one or more repos + if (errorTotal > 0) + THROW_FMT(CommandError, CFGCMD_EXPIRE " command encountered %u error(s), check the log file for details", errorTotal); } MEM_CONTEXT_TEMP_END(); diff --git a/src/common/error.auto.c b/src/common/error.auto.c index b6619d307..1a1a18029 100644 --- a/src/common/error.auto.c +++ b/src/common/error.auto.c @@ -83,6 +83,7 @@ ERROR_DEFINE( 99, JsonFormatError, RuntimeError); ERROR_DEFINE(100, KernelError, RuntimeError); ERROR_DEFINE(101, ServiceError, RuntimeError); ERROR_DEFINE(102, ExecuteError, RuntimeError); +ERROR_DEFINE(104, CommandError, RuntimeError); ERROR_DEFINE(122, RuntimeError, RuntimeError); ERROR_DEFINE(123, InvalidError, RuntimeError); ERROR_DEFINE(124, UnhandledError, RuntimeError); @@ -169,6 +170,7 @@ static const ErrorType *errorTypeList[] = &KernelError, &ServiceError, &ExecuteError, + &CommandError, &RuntimeError, &InvalidError, &UnhandledError, diff --git a/src/common/error.auto.h b/src/common/error.auto.h index 6d4816029..07d4e7c2e 100644 --- a/src/common/error.auto.h +++ b/src/common/error.auto.h @@ -85,6 +85,7 @@ ERROR_DECLARE(JsonFormatError); ERROR_DECLARE(KernelError); ERROR_DECLARE(ServiceError); ERROR_DECLARE(ExecuteError); +ERROR_DECLARE(CommandError); ERROR_DECLARE(RuntimeError); ERROR_DECLARE(InvalidError); ERROR_DECLARE(UnhandledError); diff --git a/test/expect/mock-all-001.log b/test/expect/mock-all-001.log index 92ea6bb0c..f04f6e8c0 100644 --- a/test/expect/mock-all-001.log +++ b/test/expect/mock-all-001.log @@ -2603,14 +2603,14 @@ expire full=1 (db-primary host) > [CONTAINER-EXEC] db-primary [BACKREST-BIN] --config=[TEST_PATH]/db-primary/pgbackrest.conf --repo1-retention-full=1 --repo=1 --stanza=db expire ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: expire command begin [BACKREST-VERSION]: --buffer-size=[BUFFER-SIZE] --config=[TEST_PATH]/db-primary/pgbackrest.conf --exec-id=[EXEC-ID] --lock-path=[TEST_PATH]/db-primary/lock --log-level-console=detail --log-level-file=[LOG-LEVEL-FILE] --log-level-stderr=off --log-path=[TEST_PATH]/db-primary/log --no-log-timestamp --repo=1 --repo1-path=[TEST_PATH]/db-primary/repo --repo1-retention-full=1 --stanza=db -P00 INFO: expire full backup set repo1: [BACKUP-FULL-2], [BACKUP-INCR-2], [BACKUP-DIFF-1], [BACKUP-INCR-3], [BACKUP-INCR-4], [BACKUP-DIFF-2], [BACKUP-DIFF-3] -P00 INFO: remove expired backup repo1: [BACKUP-DIFF-3] -P00 INFO: remove expired backup repo1: [BACKUP-DIFF-2] -P00 INFO: remove expired backup repo1: [BACKUP-INCR-4] -P00 INFO: remove expired backup repo1: [BACKUP-INCR-3] -P00 INFO: remove expired backup repo1: [BACKUP-DIFF-1] -P00 INFO: remove expired backup repo1: [BACKUP-INCR-2] -P00 INFO: remove expired backup repo1: [BACKUP-FULL-2] +P00 INFO: repo1: expire full backup set [BACKUP-FULL-2], [BACKUP-INCR-2], [BACKUP-DIFF-1], [BACKUP-INCR-3], [BACKUP-INCR-4], [BACKUP-DIFF-2], [BACKUP-DIFF-3] +P00 INFO: repo1: remove expired backup [BACKUP-DIFF-3] +P00 INFO: repo1: remove expired backup [BACKUP-DIFF-2] +P00 INFO: repo1: remove expired backup [BACKUP-INCR-4] +P00 INFO: repo1: remove expired backup [BACKUP-INCR-3] +P00 INFO: repo1: remove expired backup [BACKUP-DIFF-1] +P00 INFO: repo1: remove expired backup [BACKUP-INCR-2] +P00 INFO: repo1: remove expired backup [BACKUP-FULL-2] P00 INFO: expire command end: completed successfully diff backup - add file (db-primary host) diff --git a/test/expect/mock-expire-001.log b/test/expect/mock-expire-001.log index bb7ff1444..cfa14ab1c 100644 --- a/test/expect/mock-expire-001.log +++ b/test/expect/mock-expire-001.log @@ -300,8 +300,8 @@ Nothing to expire > [CONTAINER-EXEC] db-primary [BACKREST-BIN] --config="[TEST_PATH]/db-primary/pgbackrest.conf" --stanza=db --log-level-console=detail --repo1-retention-full=1 --repo1-retention-diff=1 --repo1-retention-archive-type=full --repo1-retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: expire command begin [BACKREST-VERSION]: --buffer-size=[BUFFER-SIZE] --config=[TEST_PATH]/db-primary/pgbackrest.conf --exec-id=[EXEC-ID] --lock-path=[TEST_PATH]/db-primary/lock --log-level-console=detail --log-level-file=[LOG-LEVEL-FILE] --log-level-stderr=off --log-path=[TEST_PATH]/db-primary/log --no-log-timestamp --repo1-path=[TEST_PATH]/db-primary/repo --repo1-retention-archive=1 --repo1-retention-archive-type=full --repo1-retention-diff=1 --repo1-retention-full=1 --stanza=db -P00 DETAIL: archive retention on backup [BACKUP-FULL-1] repo1: 9.2-1, start = 000000010000000000000000 -P00 DETAIL: no archive to remove for repo1: 9.2-1 +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-FULL-1], start = 000000010000000000000000 +P00 DETAIL: repo1: 9.2-1 no archive to remove P00 INFO: expire command end: completed successfully + supplemental file: [TEST_PATH]/db-primary/repo/backup/db/backup.info @@ -903,11 +903,11 @@ Expire oldest full backup, archive expire falls on segment major boundary > [CONTAINER-EXEC] db-primary [BACKREST-BIN] --config="[TEST_PATH]/db-primary/pgbackrest.conf" --stanza=db --log-level-console=detail --repo1-retention-full=1 --repo1-retention-diff=1 --repo1-retention-archive-type=full --repo1-retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: expire command begin [BACKREST-VERSION]: --buffer-size=[BUFFER-SIZE] --config=[TEST_PATH]/db-primary/pgbackrest.conf --exec-id=[EXEC-ID] --lock-path=[TEST_PATH]/db-primary/lock --log-level-console=detail --log-level-file=[LOG-LEVEL-FILE] --log-level-stderr=off --log-path=[TEST_PATH]/db-primary/log --no-log-timestamp --repo1-path=[TEST_PATH]/db-primary/repo --repo1-retention-archive=1 --repo1-retention-archive-type=full --repo1-retention-diff=1 --repo1-retention-full=1 --stanza=db -P00 INFO: expire full backup set repo1: [BACKUP-FULL-1], [BACKUP-INCR-1] -P00 INFO: remove expired backup repo1: [BACKUP-INCR-1] -P00 INFO: remove expired backup repo1: [BACKUP-FULL-1] -P00 DETAIL: archive retention on backup [BACKUP-FULL-2] repo1: 9.2-1, start = 000000010000000100000000 -P00 DETAIL: remove archive repo1: 9.2-1, start = 0000000100000000, stop = 0000000100000000 +P00 INFO: repo1: expire full backup set [BACKUP-FULL-1], [BACKUP-INCR-1] +P00 INFO: repo1: remove expired backup [BACKUP-INCR-1] +P00 INFO: repo1: remove expired backup [BACKUP-FULL-1] +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-FULL-2], start = 000000010000000100000000 +P00 DETAIL: repo1: 9.2-1 remove archive, start = 0000000100000000, stop = 0000000100000000 P00 INFO: expire command end: completed successfully + supplemental file: [TEST_PATH]/db-primary/repo/backup/db/backup.info @@ -1269,10 +1269,10 @@ Expire oldest full backup > [CONTAINER-EXEC] db-primary [BACKREST-BIN] --config="[TEST_PATH]/db-primary/pgbackrest.conf" --stanza=db --log-level-console=detail --repo1-retention-full=1 --repo1-retention-diff=1 --repo1-retention-archive-type=full --repo1-retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: expire command begin [BACKREST-VERSION]: --buffer-size=[BUFFER-SIZE] --config=[TEST_PATH]/db-primary/pgbackrest.conf --exec-id=[EXEC-ID] --lock-path=[TEST_PATH]/db-primary/lock --log-level-console=detail --log-level-file=[LOG-LEVEL-FILE] --log-level-stderr=off --log-path=[TEST_PATH]/db-primary/log --no-log-timestamp --repo1-path=[TEST_PATH]/db-primary/repo --repo1-retention-archive=1 --repo1-retention-archive-type=full --repo1-retention-diff=1 --repo1-retention-full=1 --stanza=db -P00 INFO: expire diff backup repo1: [BACKUP-DIFF-1] -P00 INFO: remove expired backup repo1: [BACKUP-DIFF-1] -P00 DETAIL: archive retention on backup [BACKUP-FULL-2] repo1: 9.2-1, start = 000000010000000100000000 -P00 DETAIL: no archive to remove for repo1: 9.2-1 +P00 INFO: repo1: expire diff backup [BACKUP-DIFF-1] +P00 INFO: repo1: remove expired backup [BACKUP-DIFF-1] +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-FULL-2], start = 000000010000000100000000 +P00 DETAIL: repo1: 9.2-1 no archive to remove P00 INFO: expire command end: completed successfully + supplemental file: [TEST_PATH]/db-primary/repo/backup/db/backup.info @@ -1922,13 +1922,13 @@ Expire oldest diff backup, archive expire does not fall on major segment boundar > [CONTAINER-EXEC] db-primary [BACKREST-BIN] --config="[TEST_PATH]/db-primary/pgbackrest.conf" --stanza=db --log-level-console=detail --repo1-retention-full=1 --repo1-retention-diff=1 --repo1-retention-archive-type=diff --repo1-retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: expire command begin [BACKREST-VERSION]: --buffer-size=[BUFFER-SIZE] --config=[TEST_PATH]/db-primary/pgbackrest.conf --exec-id=[EXEC-ID] --lock-path=[TEST_PATH]/db-primary/lock --log-level-console=detail --log-level-file=[LOG-LEVEL-FILE] --log-level-stderr=off --log-path=[TEST_PATH]/db-primary/log --no-log-timestamp --repo1-path=[TEST_PATH]/db-primary/repo --repo1-retention-archive=1 --repo1-retention-archive-type=diff --repo1-retention-diff=1 --repo1-retention-full=1 --stanza=db -P00 INFO: expire full backup set repo1: [BACKUP-FULL-2], [BACKUP-DIFF-2] -P00 INFO: remove expired backup repo1: [BACKUP-DIFF-2] -P00 INFO: remove expired backup repo1: [BACKUP-FULL-2] -P00 DETAIL: archive retention on backup [BACKUP-FULL-3] repo1: 9.2-1, start = 000000010000000200000010, stop = 000000010000000200000012 -P00 DETAIL: archive retention on backup [BACKUP-DIFF-3] repo1: 9.2-1, start = 000000010000000200000016 -P00 DETAIL: remove archive repo1: 9.2-1, start = 0000000100000001, stop = 00000001000000020000000F -P00 DETAIL: remove archive repo1: 9.2-1, start = 000000010000000200000013, stop = 000000010000000200000015 +P00 INFO: repo1: expire full backup set [BACKUP-FULL-2], [BACKUP-DIFF-2] +P00 INFO: repo1: remove expired backup [BACKUP-DIFF-2] +P00 INFO: repo1: remove expired backup [BACKUP-FULL-2] +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-FULL-3], start = 000000010000000200000010, stop = 000000010000000200000012 +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-DIFF-3], start = 000000010000000200000016 +P00 DETAIL: repo1: 9.2-1 remove archive, start = 0000000100000001, stop = 00000001000000020000000F +P00 DETAIL: repo1: 9.2-1 remove archive, start = 000000010000000200000013, stop = 000000010000000200000015 P00 INFO: expire command end: completed successfully + supplemental file: [TEST_PATH]/db-primary/repo/backup/db/backup.info @@ -2044,12 +2044,12 @@ Expire oldest diff backup (cascade to incr) > [CONTAINER-EXEC] db-primary [BACKREST-BIN] --config="[TEST_PATH]/db-primary/pgbackrest.conf" --stanza=db --log-level-console=detail --repo1-retention-full=1 --repo1-retention-diff=1 --repo1-retention-archive-type=diff --repo1-retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: expire command begin [BACKREST-VERSION]: --buffer-size=[BUFFER-SIZE] --config=[TEST_PATH]/db-primary/pgbackrest.conf --exec-id=[EXEC-ID] --lock-path=[TEST_PATH]/db-primary/lock --log-level-console=detail --log-level-file=[LOG-LEVEL-FILE] --log-level-stderr=off --log-path=[TEST_PATH]/db-primary/log --no-log-timestamp --repo1-path=[TEST_PATH]/db-primary/repo --repo1-retention-archive=1 --repo1-retention-archive-type=diff --repo1-retention-diff=1 --repo1-retention-full=1 --stanza=db -P00 INFO: expire diff backup set repo1: [BACKUP-DIFF-3], [BACKUP-INCR-2] -P00 INFO: remove expired backup repo1: [BACKUP-INCR-2] -P00 INFO: remove expired backup repo1: [BACKUP-DIFF-3] -P00 DETAIL: archive retention on backup [BACKUP-FULL-3] repo1: 9.2-1, start = 000000010000000200000010, stop = 000000010000000200000012 -P00 DETAIL: archive retention on backup [BACKUP-DIFF-4] repo1: 9.2-1, start = 00000001000000020000001E -P00 DETAIL: remove archive repo1: 9.2-1, start = 000000010000000200000016, stop = 00000001000000020000001D +P00 INFO: repo1: expire diff backup set [BACKUP-DIFF-3], [BACKUP-INCR-2] +P00 INFO: repo1: remove expired backup [BACKUP-INCR-2] +P00 INFO: repo1: remove expired backup [BACKUP-DIFF-3] +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-FULL-3], start = 000000010000000200000010, stop = 000000010000000200000012 +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-DIFF-4], start = 00000001000000020000001E +P00 DETAIL: repo1: 9.2-1 remove archive, start = 000000010000000200000016, stop = 00000001000000020000001D P00 INFO: expire command end: completed successfully + supplemental file: [TEST_PATH]/db-primary/repo/backup/db/backup.info @@ -2157,10 +2157,10 @@ Expire archive based on newest incr backup > [CONTAINER-EXEC] db-primary [BACKREST-BIN] --config="[TEST_PATH]/db-primary/pgbackrest.conf" --stanza=db --log-level-console=detail --repo1-retention-full=1 --repo1-retention-diff=1 --repo1-retention-archive-type=incr --repo1-retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: expire command begin [BACKREST-VERSION]: --buffer-size=[BUFFER-SIZE] --config=[TEST_PATH]/db-primary/pgbackrest.conf --exec-id=[EXEC-ID] --lock-path=[TEST_PATH]/db-primary/lock --log-level-console=detail --log-level-file=[LOG-LEVEL-FILE] --log-level-stderr=off --log-path=[TEST_PATH]/db-primary/log --no-log-timestamp --repo1-path=[TEST_PATH]/db-primary/repo --repo1-retention-archive=1 --repo1-retention-archive-type=incr --repo1-retention-diff=1 --repo1-retention-full=1 --stanza=db -P00 DETAIL: archive retention on backup [BACKUP-FULL-3] repo1: 9.2-1, start = 000000010000000200000010, stop = 000000010000000200000012 -P00 DETAIL: archive retention on backup [BACKUP-DIFF-4] repo1: 9.2-1, start = 00000001000000020000001E, stop = 000000010000000200000020 -P00 DETAIL: archive retention on backup [BACKUP-INCR-3] repo1: 9.2-1, start = 000000010000000200000024 -P00 DETAIL: remove archive repo1: 9.2-1, start = 000000010000000200000021, stop = 000000010000000200000023 +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-FULL-3], start = 000000010000000200000010, stop = 000000010000000200000012 +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-DIFF-4], start = 00000001000000020000001E, stop = 000000010000000200000020 +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-INCR-3], start = 000000010000000200000024 +P00 DETAIL: repo1: 9.2-1 remove archive, start = 000000010000000200000021, stop = 000000010000000200000023 P00 INFO: expire command end: completed successfully + supplemental file: [TEST_PATH]/db-primary/repo/backup/db/backup.info @@ -2296,16 +2296,16 @@ Expire diff treating full as diff > [CONTAINER-EXEC] db-primary [BACKREST-BIN] --config="[TEST_PATH]/db-primary/pgbackrest.conf" --stanza=db --log-level-console=detail --repo1-retention-full=2 --repo1-retention-diff=1 --repo1-retention-archive-type=diff --repo1-retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: expire command begin [BACKREST-VERSION]: --buffer-size=[BUFFER-SIZE] --config=[TEST_PATH]/db-primary/pgbackrest.conf --exec-id=[EXEC-ID] --lock-path=[TEST_PATH]/db-primary/lock --log-level-console=detail --log-level-file=[LOG-LEVEL-FILE] --log-level-stderr=off --log-path=[TEST_PATH]/db-primary/log --no-log-timestamp --repo1-path=[TEST_PATH]/db-primary/repo --repo1-retention-archive=1 --repo1-retention-archive-type=diff --repo1-retention-diff=1 --repo1-retention-full=2 --stanza=db -P00 INFO: expire full backup set repo1: [BACKUP-FULL-3], [BACKUP-DIFF-4], [BACKUP-INCR-3] -P00 INFO: expire diff backup repo1: [BACKUP-DIFF-5] -P00 INFO: remove expired backup repo1: [BACKUP-DIFF-5] -P00 INFO: remove expired backup repo1: [BACKUP-INCR-3] -P00 INFO: remove expired backup repo1: [BACKUP-DIFF-4] -P00 INFO: remove expired backup repo1: [BACKUP-FULL-3] -P00 DETAIL: archive retention on backup [BACKUP-FULL-4] repo1: 9.2-1, start = 00000001000000020000002A, stop = 00000001000000020000002C -P00 DETAIL: archive retention on backup [BACKUP-FULL-5] repo1: 9.2-1, start = 000000010000000200000036 -P00 DETAIL: remove archive repo1: 9.2-1, start = 000000010000000200000010, stop = 000000010000000200000029 -P00 DETAIL: remove archive repo1: 9.2-1, start = 00000001000000020000002D, stop = 000000010000000200000035 +P00 INFO: repo1: expire full backup set [BACKUP-FULL-3], [BACKUP-DIFF-4], [BACKUP-INCR-3] +P00 INFO: repo1: expire diff backup [BACKUP-DIFF-5] +P00 INFO: repo1: remove expired backup [BACKUP-DIFF-5] +P00 INFO: repo1: remove expired backup [BACKUP-INCR-3] +P00 INFO: repo1: remove expired backup [BACKUP-DIFF-4] +P00 INFO: repo1: remove expired backup [BACKUP-FULL-3] +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-FULL-4], start = 00000001000000020000002A, stop = 00000001000000020000002C +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-FULL-5], start = 000000010000000200000036 +P00 DETAIL: repo1: 9.2-1 remove archive, start = 000000010000000200000010, stop = 000000010000000200000029 +P00 DETAIL: repo1: 9.2-1 remove archive, start = 00000001000000020000002D, stop = 000000010000000200000035 P00 INFO: expire command end: completed successfully + supplemental file: [TEST_PATH]/db-primary/repo/backup/db/backup.info @@ -2435,14 +2435,14 @@ P00 WARN: option 'repo1-retention-full' is not set for 'repo1-retention-full-t HINT: to retain full backups indefinitely (without warning), set option 'repo1-retention-full' to the maximum. P00 WARN: option 'repo1-retention-diff' is not set for 'repo1-retention-archive-type=diff' HINT: to retain differential backups indefinitely (without warning), set option 'repo1-retention-diff' to the maximum. -P00 DETAIL: archive retention on backup [BACKUP-FULL-4] repo1: 9.2-1, start = 00000001000000020000002A, stop = 00000001000000020000002C -P00 DETAIL: archive retention on backup [BACKUP-FULL-5] repo1: 9.2-1, start = 000000010000000200000036, stop = 000000010000000200000038 -P00 DETAIL: archive retention on backup [BACKUP-FULL-6] repo1: 9.2-1, start = 00000001000000020000003C, stop = 00000001000000020000003E -P00 DETAIL: archive retention on backup [BACKUP-DIFF-6] repo1: 9.2-1, start = 000000010000000200000042, stop = 000000010000000200000044 -P00 DETAIL: archive retention on backup [BACKUP-DIFF-7] repo1: 9.2-1, start = 000000010000000200000048 -P00 DETAIL: remove archive repo1: 9.2-1, start = 000000010000000200000039, stop = 00000001000000020000003B -P00 DETAIL: remove archive repo1: 9.2-1, start = 00000001000000020000003F, stop = 000000010000000200000041 -P00 DETAIL: remove archive repo1: 9.2-1, start = 000000010000000200000045, stop = 000000010000000200000047 +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-FULL-4], start = 00000001000000020000002A, stop = 00000001000000020000002C +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-FULL-5], start = 000000010000000200000036, stop = 000000010000000200000038 +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-FULL-6], start = 00000001000000020000003C, stop = 00000001000000020000003E +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-DIFF-6], start = 000000010000000200000042, stop = 000000010000000200000044 +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-DIFF-7], start = 000000010000000200000048 +P00 DETAIL: repo1: 9.2-1 remove archive, start = 000000010000000200000039, stop = 00000001000000020000003B +P00 DETAIL: repo1: 9.2-1 remove archive, start = 00000001000000020000003F, stop = 000000010000000200000041 +P00 DETAIL: repo1: 9.2-1 remove archive, start = 000000010000000200000045, stop = 000000010000000200000047 P00 INFO: expire command end: completed successfully + supplemental file: [TEST_PATH]/db-primary/repo/backup/db/backup.info @@ -2591,15 +2591,15 @@ Expire full with repo-retention-archive with warning repo-retention-full not set P00 INFO: expire command begin [BACKREST-VERSION]: --buffer-size=[BUFFER-SIZE] --config=[TEST_PATH]/db-primary/pgbackrest.conf --exec-id=[EXEC-ID] --lock-path=[TEST_PATH]/db-primary/lock --log-level-console=detail --log-level-file=[LOG-LEVEL-FILE] --log-level-stderr=off --log-path=[TEST_PATH]/db-primary/log --no-log-timestamp --repo1-path=[TEST_PATH]/db-primary/repo --repo1-retention-archive=1 --repo1-retention-archive-type=full --stanza=db P00 WARN: option 'repo1-retention-full' is not set for 'repo1-retention-full-type=count', the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'repo1-retention-full' to the maximum. -P00 DETAIL: archive retention on backup [BACKUP-FULL-4] repo1: 9.2-1, start = 00000001000000020000002A, stop = 00000001000000020000002C -P00 DETAIL: archive retention on backup [BACKUP-FULL-5] repo1: 9.2-1, start = 000000010000000200000036, stop = 000000010000000200000038 -P00 DETAIL: archive retention on backup [BACKUP-FULL-6] repo1: 9.2-1, start = 00000001000000020000003C, stop = 00000001000000020000003E -P00 DETAIL: archive retention on backup [BACKUP-DIFF-6] repo1: 9.2-1, start = 000000010000000200000042, stop = 000000010000000200000044 -P00 DETAIL: archive retention on backup [BACKUP-DIFF-7] repo1: 9.2-1, start = 000000010000000200000048, stop = 00000001000000020000004A -P00 DETAIL: archive retention on backup [BACKUP-FULL-7] repo1: 9.2-1, start = 00000001000000020000004E, stop = 000000010000000200000050 -P00 DETAIL: archive retention on backup [BACKUP-FULL-8] repo1: 9.2-1, start = 000000010000000200000054 -P00 DETAIL: remove archive repo1: 9.2-1, start = 00000001000000020000004B, stop = 00000001000000020000004D -P00 DETAIL: remove archive repo1: 9.2-1, start = 000000010000000200000051, stop = 000000010000000200000053 +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-FULL-4], start = 00000001000000020000002A, stop = 00000001000000020000002C +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-FULL-5], start = 000000010000000200000036, stop = 000000010000000200000038 +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-FULL-6], start = 00000001000000020000003C, stop = 00000001000000020000003E +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-DIFF-6], start = 000000010000000200000042, stop = 000000010000000200000044 +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-DIFF-7], start = 000000010000000200000048, stop = 00000001000000020000004A +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-FULL-7], start = 00000001000000020000004E, stop = 000000010000000200000050 +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-FULL-8], start = 000000010000000200000054 +P00 DETAIL: repo1: 9.2-1 remove archive, start = 00000001000000020000004B, stop = 00000001000000020000004D +P00 DETAIL: repo1: 9.2-1 remove archive, start = 000000010000000200000051, stop = 000000010000000200000053 P00 INFO: expire command end: completed successfully + supplemental file: [TEST_PATH]/db-primary/repo/backup/db/backup.info @@ -2758,16 +2758,16 @@ Expire no archive with warning since repo-retention-archive not set for INCR ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: expire command begin [BACKREST-VERSION]: --buffer-size=[BUFFER-SIZE] --config=[TEST_PATH]/db-primary/pgbackrest.conf --exec-id=[EXEC-ID] --lock-path=[TEST_PATH]/db-primary/lock --log-level-console=detail --log-level-file=[LOG-LEVEL-FILE] --log-level-stderr=off --log-path=[TEST_PATH]/db-primary/log --no-log-timestamp --repo1-path=[TEST_PATH]/db-primary/repo --repo1-retention-archive-type=incr --repo1-retention-diff=1 --repo1-retention-full=1 --stanza=db P00 WARN: WAL segments will not be expired: option 'repo1-retention-archive-type=incr' but option 'repo1-retention-archive' is not set -P00 INFO: expire full backup repo1: [BACKUP-FULL-4] -P00 INFO: expire full backup repo1: [BACKUP-FULL-5] -P00 INFO: expire full backup set repo1: [BACKUP-FULL-6], [BACKUP-DIFF-6], [BACKUP-DIFF-7] -P00 INFO: expire full backup repo1: [BACKUP-FULL-7] -P00 INFO: remove expired backup repo1: [BACKUP-FULL-7] -P00 INFO: remove expired backup repo1: [BACKUP-DIFF-7] -P00 INFO: remove expired backup repo1: [BACKUP-DIFF-6] -P00 INFO: remove expired backup repo1: [BACKUP-FULL-6] -P00 INFO: remove expired backup repo1: [BACKUP-FULL-5] -P00 INFO: remove expired backup repo1: [BACKUP-FULL-4] +P00 INFO: repo1: expire full backup [BACKUP-FULL-4] +P00 INFO: repo1: expire full backup [BACKUP-FULL-5] +P00 INFO: repo1: expire full backup set [BACKUP-FULL-6], [BACKUP-DIFF-6], [BACKUP-DIFF-7] +P00 INFO: repo1: expire full backup [BACKUP-FULL-7] +P00 INFO: repo1: remove expired backup [BACKUP-FULL-7] +P00 INFO: repo1: remove expired backup [BACKUP-DIFF-7] +P00 INFO: repo1: remove expired backup [BACKUP-DIFF-6] +P00 INFO: repo1: remove expired backup [BACKUP-FULL-6] +P00 INFO: repo1: remove expired backup [BACKUP-FULL-5] +P00 INFO: repo1: remove expired backup [BACKUP-FULL-4] P00 INFO: option 'repo1-retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully diff --git a/test/expect/mock-expire-002.log b/test/expect/mock-expire-002.log index 079cb9e50..a06251248 100644 --- a/test/expect/mock-expire-002.log +++ b/test/expect/mock-expire-002.log @@ -476,13 +476,13 @@ Upgrade stanza and expire only earliest db backup and archive > [CONTAINER-EXEC] db-primary [BACKREST-BIN] --config="[TEST_PATH]/db-primary/pgbackrest.conf" --stanza=db --log-level-console=detail --repo1-retention-full=3 --repo1-retention-archive-type=full expire ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: expire command begin [BACKREST-VERSION]: --buffer-size=[BUFFER-SIZE] --config=[TEST_PATH]/db-primary/pgbackrest.conf --exec-id=[EXEC-ID] --lock-path=[TEST_PATH]/db-primary/lock --log-level-console=detail --log-level-file=[LOG-LEVEL-FILE] --log-level-stderr=off --log-path=[TEST_PATH]/db-primary/log --no-log-timestamp --repo1-path=[TEST_PATH]/db-primary/repo --repo1-retention-archive-type=full --repo1-retention-full=3 --stanza=db -P00 INFO: expire full backup set repo1: [BACKUP-FULL-1], [BACKUP-INCR-1] -P00 INFO: remove expired backup repo1: [BACKUP-INCR-1] -P00 INFO: remove expired backup repo1: [BACKUP-FULL-1] -P00 DETAIL: archive retention on backup [BACKUP-FULL-2] repo1: 9.2-1, start = 00000001000000000000000C -P00 DETAIL: remove archive repo1: 9.2-1, start = 000000010000000000000000, stop = 00000001000000000000000B -P00 DETAIL: archive retention on backup [BACKUP-FULL-3] repo1: 9.3-2, start = 000000010000000000000000 -P00 DETAIL: no archive to remove for repo1: 9.3-2 +P00 INFO: repo1: expire full backup set [BACKUP-FULL-1], [BACKUP-INCR-1] +P00 INFO: repo1: remove expired backup [BACKUP-INCR-1] +P00 INFO: repo1: remove expired backup [BACKUP-FULL-1] +P00 DETAIL: repo1: 9.2-1 archive retention on backup [BACKUP-FULL-2], start = 00000001000000000000000C +P00 DETAIL: repo1: 9.2-1 remove archive, start = 000000010000000000000000, stop = 00000001000000000000000B +P00 DETAIL: repo1: 9.3-2 archive retention on backup [BACKUP-FULL-3], start = 000000010000000000000000 +P00 DETAIL: repo1: 9.3-2 no archive to remove P00 INFO: expire command end: completed successfully + supplemental file: [TEST_PATH]/db-primary/repo/backup/db/backup.info @@ -1149,16 +1149,16 @@ Upgrade the stanza, create full back - earliest db orphaned archive removed and > [CONTAINER-EXEC] db-primary [BACKREST-BIN] --config="[TEST_PATH]/db-primary/pgbackrest.conf" --stanza=db --log-level-console=detail --repo1-retention-full=2 --repo1-retention-archive-type=full expire ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: expire command begin [BACKREST-VERSION]: --buffer-size=[BUFFER-SIZE] --config=[TEST_PATH]/db-primary/pgbackrest.conf --exec-id=[EXEC-ID] --lock-path=[TEST_PATH]/db-primary/lock --log-level-console=detail --log-level-file=[LOG-LEVEL-FILE] --log-level-stderr=off --log-path=[TEST_PATH]/db-primary/log --no-log-timestamp --repo1-path=[TEST_PATH]/db-primary/repo --repo1-retention-archive-type=full --repo1-retention-full=2 --stanza=db -P00 INFO: expire full backup repo1: [BACKUP-FULL-2] -P00 INFO: expire full backup set repo1: [BACKUP-FULL-3], [BACKUP-INCR-2] -P00 INFO: remove expired backup repo1: [BACKUP-INCR-2] -P00 INFO: remove expired backup repo1: [BACKUP-FULL-3] -P00 INFO: remove expired backup repo1: [BACKUP-FULL-2] -P00 INFO: remove archive path repo1: [TEST_PATH]/db-primary/repo/archive/db/9.2-1 -P00 DETAIL: archive retention on backup [BACKUP-FULL-4] repo1: 9.3-2, start = 0000000100000000000000FF -P00 DETAIL: remove archive repo1: 9.3-2, start = 000000010000000000000000, stop = 0000000100000000000000FE -P00 DETAIL: archive retention on backup [BACKUP-FULL-5] repo1: 10-3, start = 000000010000000000000000 -P00 DETAIL: no archive to remove for repo1: 10-3 +P00 INFO: repo1: expire full backup [BACKUP-FULL-2] +P00 INFO: repo1: expire full backup set [BACKUP-FULL-3], [BACKUP-INCR-2] +P00 INFO: repo1: remove expired backup [BACKUP-INCR-2] +P00 INFO: repo1: remove expired backup [BACKUP-FULL-3] +P00 INFO: repo1: remove expired backup [BACKUP-FULL-2] +P00 INFO: repo1: remove archive path [TEST_PATH]/db-primary/repo/archive/db/9.2-1 +P00 DETAIL: repo1: 9.3-2 archive retention on backup [BACKUP-FULL-4], start = 0000000100000000000000FF +P00 DETAIL: repo1: 9.3-2 remove archive, start = 000000010000000000000000, stop = 0000000100000000000000FE +P00 DETAIL: repo1: 10-3 archive retention on backup [BACKUP-FULL-5], start = 000000010000000000000000 +P00 DETAIL: repo1: 10-3 no archive to remove P00 INFO: expire command end: completed successfully + supplemental file: [TEST_PATH]/db-primary/repo/backup/db/backup.info @@ -1304,13 +1304,13 @@ Expire all archive last full backup through pitr > [CONTAINER-EXEC] db-primary [BACKREST-BIN] --config="[TEST_PATH]/db-primary/pgbackrest.conf" --stanza=db --log-level-console=detail --repo1-retention-full=3 --repo1-retention-diff=1 --repo1-retention-archive-type=diff --repo1-retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: expire command begin [BACKREST-VERSION]: --buffer-size=[BUFFER-SIZE] --config=[TEST_PATH]/db-primary/pgbackrest.conf --exec-id=[EXEC-ID] --lock-path=[TEST_PATH]/db-primary/lock --log-level-console=detail --log-level-file=[LOG-LEVEL-FILE] --log-level-stderr=off --log-path=[TEST_PATH]/db-primary/log --no-log-timestamp --repo1-path=[TEST_PATH]/db-primary/repo --repo1-retention-archive=1 --repo1-retention-archive-type=diff --repo1-retention-diff=1 --repo1-retention-full=3 --stanza=db -P00 INFO: expire diff backup repo1: [BACKUP-DIFF-1] -P00 INFO: remove expired backup repo1: [BACKUP-DIFF-1] -P00 DETAIL: archive retention on backup [BACKUP-FULL-4] repo1: 9.3-2, start = 0000000100000000000000FF -P00 DETAIL: no archive to remove for repo1: 9.3-2 -P00 DETAIL: archive retention on backup [BACKUP-FULL-5] repo1: 10-3, start = 000000010000000000000000, stop = 000000010000000000000002 -P00 DETAIL: archive retention on backup [BACKUP-FULL-6] repo1: 10-3, start = 000000010000000000000006 -P00 DETAIL: remove archive repo1: 10-3, start = 000000010000000000000003, stop = 000000010000000000000005 +P00 INFO: repo1: expire diff backup [BACKUP-DIFF-1] +P00 INFO: repo1: remove expired backup [BACKUP-DIFF-1] +P00 DETAIL: repo1: 9.3-2 archive retention on backup [BACKUP-FULL-4], start = 0000000100000000000000FF +P00 DETAIL: repo1: 9.3-2 no archive to remove +P00 DETAIL: repo1: 10-3 archive retention on backup [BACKUP-FULL-5], start = 000000010000000000000000, stop = 000000010000000000000002 +P00 DETAIL: repo1: 10-3 archive retention on backup [BACKUP-FULL-6], start = 000000010000000000000006 +P00 DETAIL: repo1: 10-3 remove archive, start = 000000010000000000000003, stop = 000000010000000000000005 P00 INFO: expire command end: completed successfully + supplemental file: [TEST_PATH]/db-primary/repo/backup/db/backup.info @@ -1451,11 +1451,11 @@ Expire all archive except for the current database > [CONTAINER-EXEC] db-primary [BACKREST-BIN] --config="[TEST_PATH]/db-primary/pgbackrest.conf" --stanza=db --log-level-console=detail --repo1-retention-full=2 --repo1-retention-archive-type=full expire ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: expire command begin [BACKREST-VERSION]: --buffer-size=[BUFFER-SIZE] --config=[TEST_PATH]/db-primary/pgbackrest.conf --exec-id=[EXEC-ID] --lock-path=[TEST_PATH]/db-primary/lock --log-level-console=detail --log-level-file=[LOG-LEVEL-FILE] --log-level-stderr=off --log-path=[TEST_PATH]/db-primary/log --no-log-timestamp --repo1-path=[TEST_PATH]/db-primary/repo --repo1-retention-archive-type=full --repo1-retention-full=2 --stanza=db -P00 INFO: expire full backup repo1: [BACKUP-FULL-4] -P00 INFO: remove expired backup repo1: [BACKUP-FULL-4] -P00 INFO: remove archive path repo1: [TEST_PATH]/db-primary/repo/archive/db/9.3-2 -P00 DETAIL: archive retention on backup [BACKUP-FULL-5] repo1: 10-3, start = 000000010000000000000000 -P00 DETAIL: no archive to remove for repo1: 10-3 +P00 INFO: repo1: expire full backup [BACKUP-FULL-4] +P00 INFO: repo1: remove expired backup [BACKUP-FULL-4] +P00 INFO: repo1: remove archive path [TEST_PATH]/db-primary/repo/archive/db/9.3-2 +P00 DETAIL: repo1: 10-3 archive retention on backup [BACKUP-FULL-5], start = 000000010000000000000000 +P00 DETAIL: repo1: 10-3 no archive to remove P00 INFO: expire command end: completed successfully + supplemental file: [TEST_PATH]/db-primary/repo/backup/db/backup.info diff --git a/test/expect/mock-stanza-001.log b/test/expect/mock-stanza-001.log index f8ed1d628..b9815530e 100644 --- a/test/expect/mock-stanza-001.log +++ b/test/expect/mock-stanza-001.log @@ -461,7 +461,7 @@ P00 INFO: full backup size = 48MB P00 INFO: new backup label = [BACKUP-FULL-2] P00 INFO: backup command end: completed successfully P00 INFO: expire command begin [BACKREST-VERSION]: --buffer-size=[BUFFER-SIZE] --config=[TEST_PATH]/db-primary/pgbackrest.conf --exec-id=[EXEC-ID] --lock-path=[TEST_PATH]/db-primary/lock --log-level-console=detail --log-level-file=[LOG-LEVEL-FILE] --log-level-stderr=off --log-path=[TEST_PATH]/db-primary/log --no-log-timestamp --repo=1 --repo1-path=[TEST_PATH]/db-primary/repo --repo1-retention-full=2 --stanza=db -P00 INFO: remove archive path repo1: [TEST_PATH]/db-primary/repo/archive/db/9.3-1 +P00 INFO: repo1: remove archive path [TEST_PATH]/db-primary/repo/archive/db/9.3-1 P00 INFO: expire command end: completed successfully + supplemental file: [TEST_PATH]/db-primary/pgbackrest.conf diff --git a/test/expect/mock-stanza-002.log b/test/expect/mock-stanza-002.log index 2df7acbe7..61d0e16aa 100644 --- a/test/expect/mock-stanza-002.log +++ b/test/expect/mock-stanza-002.log @@ -524,7 +524,7 @@ P00 INFO: new backup label = [BACKUP-FULL-2] P00 DETAIL: statistics: STATISTICS P00 INFO: backup command end: completed successfully P00 INFO: expire command begin [BACKREST-VERSION]: --buffer-size=[BUFFER-SIZE] --config=[TEST_PATH]/backup/pgbackrest.conf --exec-id=[EXEC-ID] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=[LOG-LEVEL-FILE] --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-log-timestamp --repo=1 --repo1-azure-account= --repo1-azure-container=azContainer --repo1-azure-host=azure --repo1-azure-key= --no-repo1-azure-verify-tls --repo1-cipher-pass= --repo1-cipher-type=aes-256-cbc --repo1-path=/ --repo1-retention-full=2 --repo1-type=azure --stanza=db -P00 INFO: remove archive path repo1: /archive/db/9.3-1 +P00 INFO: repo1: remove archive path /archive/db/9.3-1 P00 DETAIL: statistics: STATISTICS P00 INFO: expire command end: completed successfully diff --git a/test/src/module/command/expireTest.c b/test/src/module/command/expireTest.c index 6383fe27b..6c7a39793 100644 --- a/test/src/module/command/expireTest.c +++ b/test/src/module/command/expireTest.c @@ -237,7 +237,7 @@ testRun(void) "20181119-152800F\n20181119-152800F_20181119-152152D\n20181119-152800F_20181119-152155I\n20181119-152900F\n" "20181119-152900F_20181119-152600D\n", "remaining backups correct"); - harnessLogResult("P00 INFO: expire full backup repo1: 20181119-152138F"); + harnessLogResult("P00 INFO: repo1: expire full backup 20181119-152138F"); //-------------------------------------------------------------------------------------------------------------------------- TEST_TITLE("retention-full set - full backup with dependencies expired"); @@ -252,7 +252,7 @@ testRun(void) infoBackupDataLabelList(infoBackup, NULL), "20181119-152900F\n20181119-152900F_20181119-152600D\n", "remaining backups correct"); harnessLogResult( - "P00 INFO: expire full backup set repo1: 20181119-152800F, 20181119-152800F_20181119-152152D, " + "P00 INFO: repo1: expire full backup set 20181119-152800F, 20181119-152800F_20181119-152152D, " "20181119-152800F_20181119-152155I"); //-------------------------------------------------------------------------------------------------------------------------- @@ -305,7 +305,7 @@ testRun(void) "20181119-152138F\n20181119-152800F\n20181119-152900F\n20181119-152900F_20181119-152600D\n", "remaining backups correct"); harnessLogResult( - "P00 INFO: expire diff backup set repo1: 20181119-152800F_20181119-152152D, 20181119-152800F_20181119-152155I"); + "P00 INFO: repo1: expire diff backup set 20181119-152800F_20181119-152152D, 20181119-152800F_20181119-152155I"); TEST_RESULT_UINT(expireDiffBackup(infoBackup, 0), 0, "retention-diff=2 but no more to expire"); TEST_RESULT_UINT(infoBackupDataTotal(infoBackup), 4, "current backups not reduced"); @@ -322,7 +322,7 @@ testRun(void) "20181119-152138F\n20181119-152800F\n20181119-152900F\n20181119-152900F_20181119-152600D\n", " remaining backups correct"); harnessLogResult( - "P00 INFO: expire diff backup set repo1: 20181119-152800F_20181119-152152D, 20181119-152800F_20181119-152155I"); + "P00 INFO: repo1: expire diff backup set 20181119-152800F_20181119-152152D, 20181119-152800F_20181119-152155I"); //-------------------------------------------------------------------------------------------------------------------------- TEST_TITLE("retention-diff set - diff with no dependents expired"); @@ -381,7 +381,7 @@ testRun(void) infoBackupDataLabelList(infoBackup, NULL), "20181119-152800F\n20181119-152800F_20181119-152155D\n", "remaining backups correct"); harnessLogResult( - "P00 INFO: expire diff backup repo1: 20181119-152800F_20181119-152152D"); + "P00 INFO: repo1: expire diff backup 20181119-152800F_20181119-152152D"); } // ***************************************************************************************************************************** @@ -445,8 +445,8 @@ testRun(void) TEST_RESULT_VOID(removeExpiredBackup(infoBackup, NULL, 0), "remove backups not in backup.info current"); harnessLogResult( - "P00 INFO: remove expired backup repo1: 20181119-152100F_20181119-152152D\n" - "P00 INFO: remove expired backup repo1: 20181119-152100F"); + "P00 INFO: repo1: remove expired backup 20181119-152100F_20181119-152152D\n" + "P00 INFO: repo1: remove expired backup 20181119-152100F"); TEST_RESULT_STRLST_Z( strLstSort(storageListP(storageTest, backupStanzaPath), sortOrderAsc), @@ -475,7 +475,7 @@ testRun(void) TEST_RESULT_VOID(removeExpiredBackup(infoBackup, NULL, 0), "remove backups - backup.info current empty"); - harnessLogResult("P00 INFO: remove expired backup repo1: 20181119-152138F"); + harnessLogResult("P00 INFO: repo1: remove expired backup 20181119-152138F"); TEST_RESULT_STRLST_Z( strLstSort(storageListP(storageTest, backupStanzaPath), sortOrderAsc), "20181118-152100F_20181119-152152D.save\nbackup.info\nbogus\n", "remaining file/directories correct"); @@ -545,7 +545,7 @@ testRun(void) "P00 INFO: option 'repo1-retention-archive' is not set - archive logs will not be expired"); TEST_RESULT_VOID(removeExpiredArchive(infoBackup, true, 0), "archive retention not set - retention-full-type=time"); - harnessLogResult("P00 INFO: time-based archive retention not met for repo1 - archive logs will not be expired"); + harnessLogResult("P00 INFO: repo1: time-based archive retention not met - archive logs will not be expired"); //-------------------------------------------------------------------------------------------------------------------------- TEST_TITLE("retention-archive set - no current backups"); @@ -846,8 +846,8 @@ testRun(void) storageExistsP(storageTest, strNewFmt("%s/20181119-152138F/" BACKUP_MANIFEST_FILE, strZ(backupStanzaPath))), true, "backup not removed"); harnessLogResult( - "P00 INFO: [DRY-RUN] expire full backup repo1: 20181119-152138F\n" - "P00 INFO: [DRY-RUN] remove expired backup repo1: 20181119-152138F"); + "P00 INFO: [DRY-RUN] repo1: expire full backup 20181119-152138F\n" + "P00 INFO: [DRY-RUN] repo1: remove expired backup 20181119-152138F"); //-------------------------------------------------------------------------------------------------------------------------- TEST_TITLE("expire via backup command"); @@ -890,8 +890,8 @@ testRun(void) TEST_RESULT_BOOL(strLstExists(infoBackupDataLabelList(infoBackup, NULL), backupLabel), true, "backup exists repo1"); harnessLogResult( - "P00 INFO: expire full backup repo2: 20181119-152138F\n" - "P00 INFO: remove expired backup repo2: 20181119-152138F"); + "P00 INFO: repo2: expire full backup 20181119-152138F\n" + "P00 INFO: repo2: remove expired backup 20181119-152138F"); //-------------------------------------------------------------------------------------------------------------------------- TEST_TITLE("expire command - no dry run"); @@ -905,11 +905,11 @@ testRun(void) storagePathExistsP(storageTest, strNewFmt("%s/%s", strZ(archiveStanzaPath), "9.4-1/0000000100000000")), false, "archive sub path removed"); harnessLogResult( - "P00 INFO: expire full backup repo1: 20181119-152138F\n" - "P00 INFO: remove expired backup repo1: 20181119-152138F"); + "P00 INFO: repo1: expire full backup 20181119-152138F\n" + "P00 INFO: repo1: remove expired backup 20181119-152138F"); //-------------------------------------------------------------------------------------------------------------------------- - TEST_TITLE("expire command - multi-repo, dry run: archive and backups not removed"); + TEST_TITLE("expire command - multi-repo errors, continue to next repo after error"); argList = strLstDup(argListAvoidWarn); strLstAddZ(argList, "--repo1-retention-archive=1"); @@ -925,6 +925,102 @@ testRun(void) harnessLogLevelSet(logLevelDetail); + // Rename backup.info files on repo1 to cause error + TEST_RESULT_VOID( + storageMoveP(storageTest, + storageNewReadP(storageTest, backupInfoFileName), + storageNewWriteP(storageTest, strNewFmt("%s.save", strZ(backupInfoFileName)))), + "repo1: backup.info moved to backup.info.save"); + TEST_RESULT_VOID( + storageMoveP(storageTest, + storageNewReadP(storageTest, strNewFmt("%s" INFO_COPY_EXT, strZ(backupInfoFileName))), + storageNewWriteP(storageTest, strNewFmt("%s" INFO_COPY_EXT ".save", strZ(backupInfoFileName)))), + "repo1: backup.info.copy moved to backup.info.copy.save"); + + // Rename archive.info file on repo2 to cause error + String *archiveInfoFileNameRepo2 = strNew("repo2/archive/db/archive.info"); + TEST_RESULT_VOID( + storageMoveP(storageTest, + storageNewReadP(storageTest, archiveInfoFileNameRepo2), + storageNewWriteP(storageTest, strNewFmt("%s.save", strZ(archiveInfoFileNameRepo2)))), + "repo2: archive.info moved to archive.info.save"); + + TEST_ERROR( + cmdExpire(), CommandError, CFGCMD_EXPIRE " command encountered 2 error(s), check the log file for details"); + harnessLogResult( + strZ(strNewFmt( + "P00 ERROR: [055]: [DRY-RUN] repo1: unable to load info file '%s/%s' or '%s/%s':\n" + " FileMissingError: unable to open missing file '%s/%s' for read\n" + " FileMissingError: unable to open missing file '%s/%s' for read\n" + " HINT: backup.info cannot be opened and is required to perform a backup.\n" + " HINT: has a stanza-create been performed?\n" + "P00 INFO: [DRY-RUN] repo2: expire diff backup set 20181119-152800F_20181119-152152D," + " 20181119-152800F_20181119-152155I\n" + "P00 INFO: [DRY-RUN] repo2: remove expired backup 20181119-152800F_20181119-152155I\n" + "P00 INFO: [DRY-RUN] repo2: remove expired backup 20181119-152800F_20181119-152152D\n" + "P00 ERROR: [055]: [DRY-RUN] repo2: unable to load info file '%s/%s' or '%s/%s':\n" + " FileMissingError: unable to open missing file '%s/%s' for read\n" + " FileMissingError: unable to open missing file '%s/%s' for read\n" + " HINT: archive.info cannot be opened but is required to push/get WAL segments.\n" + " HINT: is archive_command configured correctly in postgresql.conf?\n" + " HINT: has a stanza-create been performed?\n" + " HINT: use --no-archive-check to disable archive checks during backup if you have an alternate" + " archiving scheme.", + testPath(), strZ(backupInfoFileName), testPath(), strZ(strNewFmt("%s" INFO_COPY_EXT, strZ(backupInfoFileName))), + testPath(), strZ(backupInfoFileName), testPath(), strZ(strNewFmt("%s" INFO_COPY_EXT, strZ(backupInfoFileName))), + testPath(), strZ(archiveInfoFileNameRepo2), testPath(), + strZ(strNewFmt("%s" INFO_COPY_EXT, strZ(archiveInfoFileNameRepo2))), testPath(), strZ(archiveInfoFileNameRepo2), + testPath(), strZ(strNewFmt("%s" INFO_COPY_EXT, strZ(archiveInfoFileNameRepo2)))))); + + // Restore saved archive.info file + TEST_RESULT_VOID( + storageMoveP(storageTest, + storageNewReadP(storageTest, strNewFmt("%s.save", strZ(archiveInfoFileNameRepo2))), + storageNewWriteP(storageTest, archiveInfoFileNameRepo2)), + "repo2: archive.info.save moved to archive.info"); + + //-------------------------------------------------------------------------------------------------------------------------- + TEST_TITLE("expire command - multi-repo, continue to next repo after error"); + + TEST_ERROR( + cmdExpire(), CommandError, CFGCMD_EXPIRE " command encountered 1 error(s), check the log file for details"); + harnessLogResult( + strZ(strNewFmt( + "P00 ERROR: [055]: [DRY-RUN] repo1: unable to load info file '%s/%s' or '%s/%s':\n" + " FileMissingError: unable to open missing file '%s/%s' for read\n" + " FileMissingError: unable to open missing file '%s/%s' for read\n" + " HINT: backup.info cannot be opened and is required to perform a backup.\n" + " HINT: has a stanza-create been performed?\n" + "P00 INFO: [DRY-RUN] repo2: expire diff backup set 20181119-152800F_20181119-152152D," + " 20181119-152800F_20181119-152155I\n" + "P00 INFO: [DRY-RUN] repo2: remove expired backup 20181119-152800F_20181119-152155I\n" + "P00 INFO: [DRY-RUN] repo2: remove expired backup 20181119-152800F_20181119-152152D\n" + "P00 DETAIL: [DRY-RUN] repo2: 9.4-1 archive retention on backup 20181119-152800F, start = 000000020000000000000002," + " stop = 000000020000000000000002\n" + "P00 DETAIL: [DRY-RUN] repo2: 9.4-1 archive retention on backup 20181119-152800F_20181119-152252D," + " start = 000000020000000000000009\n" + "P00 DETAIL: [DRY-RUN] repo2: 9.4-1 remove archive, start = 000000020000000000000004," + " stop = 000000020000000000000007\n" + "P00 DETAIL: [DRY-RUN] repo2: 10-2 archive retention on backup 20181119-152900F, start = 000000010000000000000003\n" + "P00 DETAIL: [DRY-RUN] repo2: 10-2 no archive to remove", + testPath(), strZ(backupInfoFileName), testPath(), strZ(strNewFmt("%s" INFO_COPY_EXT, strZ(backupInfoFileName))), + testPath(), strZ(backupInfoFileName), testPath(), strZ(strNewFmt("%s" INFO_COPY_EXT, strZ(backupInfoFileName)))))); + + // Restore saved backup.info files + TEST_RESULT_VOID( + storageMoveP(storageTest, + storageNewReadP(storageTest, strNewFmt("%s.save", strZ(backupInfoFileName))), + storageNewWriteP(storageTest, backupInfoFileName)), + "repo1: backup.info.save moved to backup.info"); + TEST_RESULT_VOID( + storageMoveP(storageTest, + storageNewReadP(storageTest, strNewFmt("%s" INFO_COPY_EXT ".save", strZ(backupInfoFileName))), + storageNewWriteP(storageTest, strNewFmt("%s" INFO_COPY_EXT, strZ(backupInfoFileName)))), + "repo1: backup.info.copy.save moved to backup.info.copy"); + + //-------------------------------------------------------------------------------------------------------------------------- + TEST_TITLE("expire command - multi-repo, dry run: archive and backups not removed"); + TEST_RESULT_VOID(cmdExpire(), "expire (dry-run) - log expired backups and archive path to remove"); TEST_RESULT_BOOL( storagePathExistsP(storageTest, strNewFmt("%s/%s", strZ(archiveStanzaPath), "9.4-1")), true, @@ -940,27 +1036,27 @@ testRun(void) true, "backup not removed"); harnessLogResult(strZ(strNewFmt( - "P00 INFO: [DRY-RUN] expire full backup set repo1: 20181119-152800F, 20181119-152800F_20181119-152152D, " + "P00 INFO: [DRY-RUN] repo1: expire full backup set 20181119-152800F, 20181119-152800F_20181119-152152D, " "20181119-152800F_20181119-152155I, 20181119-152800F_20181119-152252D\n" - "P00 INFO: [DRY-RUN] remove expired backup repo1: 20181119-152800F_20181119-152252D\n" - "P00 INFO: [DRY-RUN] remove expired backup repo1: 20181119-152800F_20181119-152155I\n" - "P00 INFO: [DRY-RUN] remove expired backup repo1: 20181119-152800F_20181119-152152D\n" - "P00 INFO: [DRY-RUN] remove expired backup repo1: 20181119-152800F\n" - "P00 INFO: [DRY-RUN] remove archive path repo1: %s/%s/9.4-1\n" - "P00 DETAIL: [DRY-RUN] archive retention on backup 20181119-152900F repo1: 10-2, start = 000000010000000000000003\n" - "P00 DETAIL: [DRY-RUN] no archive to remove for repo1: 10-2\n" - "P00 INFO: [DRY-RUN] expire diff backup set repo2: 20181119-152800F_20181119-152152D," + "P00 INFO: [DRY-RUN] repo1: remove expired backup 20181119-152800F_20181119-152252D\n" + "P00 INFO: [DRY-RUN] repo1: remove expired backup 20181119-152800F_20181119-152155I\n" + "P00 INFO: [DRY-RUN] repo1: remove expired backup 20181119-152800F_20181119-152152D\n" + "P00 INFO: [DRY-RUN] repo1: remove expired backup 20181119-152800F\n" + "P00 INFO: [DRY-RUN] repo1: remove archive path %s/%s/9.4-1\n" + "P00 DETAIL: [DRY-RUN] repo1: 10-2 archive retention on backup 20181119-152900F, start = 000000010000000000000003\n" + "P00 DETAIL: [DRY-RUN] repo1: 10-2 no archive to remove\n" + "P00 INFO: [DRY-RUN] repo2: expire diff backup set 20181119-152800F_20181119-152152D," " 20181119-152800F_20181119-152155I\n" - "P00 INFO: [DRY-RUN] remove expired backup repo2: 20181119-152800F_20181119-152155I\n" - "P00 INFO: [DRY-RUN] remove expired backup repo2: 20181119-152800F_20181119-152152D\n" - "P00 DETAIL: [DRY-RUN] archive retention on backup 20181119-152800F repo2: 9.4-1, start = 000000020000000000000002," + "P00 INFO: [DRY-RUN] repo2: remove expired backup 20181119-152800F_20181119-152155I\n" + "P00 INFO: [DRY-RUN] repo2: remove expired backup 20181119-152800F_20181119-152152D\n" + "P00 DETAIL: [DRY-RUN] repo2: 9.4-1 archive retention on backup 20181119-152800F, start = 000000020000000000000002," " stop = 000000020000000000000002\n" - "P00 DETAIL: [DRY-RUN] archive retention on backup 20181119-152800F_20181119-152252D repo2: 9.4-1," + "P00 DETAIL: [DRY-RUN] repo2: 9.4-1 archive retention on backup 20181119-152800F_20181119-152252D," " start = 000000020000000000000009\n" - "P00 DETAIL: [DRY-RUN] remove archive repo2: 9.4-1, start = 000000020000000000000004," + "P00 DETAIL: [DRY-RUN] repo2: 9.4-1 remove archive, start = 000000020000000000000004," " stop = 000000020000000000000007\n" - "P00 DETAIL: [DRY-RUN] archive retention on backup 20181119-152900F repo2: 10-2, start = 000000010000000000000003\n" - "P00 DETAIL: [DRY-RUN] no archive to remove for repo2: 10-2", testPath(), strZ(archiveStanzaPath)))); + "P00 DETAIL: [DRY-RUN] repo2: 10-2 archive retention on backup 20181119-152900F, start = 000000010000000000000003\n" + "P00 DETAIL: [DRY-RUN] repo2: 10-2 no archive to remove", testPath(), strZ(archiveStanzaPath)))); //-------------------------------------------------------------------------------------------------------------------------- TEST_TITLE("expire command - multi-repo, archive and backups removed"); @@ -974,27 +1070,26 @@ testRun(void) false, "archive path removed"); harnessLogResult(strZ(strNewFmt( - "P00 INFO: expire full backup set repo1: 20181119-152800F, 20181119-152800F_20181119-152152D, " + "P00 INFO: repo1: expire full backup set 20181119-152800F, 20181119-152800F_20181119-152152D, " "20181119-152800F_20181119-152155I, 20181119-152800F_20181119-152252D\n" - "P00 INFO: remove expired backup repo1: 20181119-152800F_20181119-152252D\n" - "P00 INFO: remove expired backup repo1: 20181119-152800F_20181119-152155I\n" - "P00 INFO: remove expired backup repo1: 20181119-152800F_20181119-152152D\n" - "P00 INFO: remove expired backup repo1: 20181119-152800F\n" - "P00 INFO: remove archive path repo1: %s/%s/9.4-1\n" - "P00 DETAIL: archive retention on backup 20181119-152900F repo1: 10-2, start = 000000010000000000000003\n" - "P00 DETAIL: no archive to remove for repo1: 10-2\n" - "P00 INFO: expire diff backup set repo2: 20181119-152800F_20181119-152152D," + "P00 INFO: repo1: remove expired backup 20181119-152800F_20181119-152252D\n" + "P00 INFO: repo1: remove expired backup 20181119-152800F_20181119-152155I\n" + "P00 INFO: repo1: remove expired backup 20181119-152800F_20181119-152152D\n" + "P00 INFO: repo1: remove expired backup 20181119-152800F\n" + "P00 INFO: repo1: remove archive path %s/%s/9.4-1\n" + "P00 DETAIL: repo1: 10-2 archive retention on backup 20181119-152900F, start = 000000010000000000000003\n" + "P00 DETAIL: repo1: 10-2 no archive to remove\n" + "P00 INFO: repo2: expire diff backup set 20181119-152800F_20181119-152152D," " 20181119-152800F_20181119-152155I\n" - "P00 INFO: remove expired backup repo2: 20181119-152800F_20181119-152155I\n" - "P00 INFO: remove expired backup repo2: 20181119-152800F_20181119-152152D\n" - "P00 DETAIL: archive retention on backup 20181119-152800F repo2: 9.4-1, start = 000000020000000000000002," + "P00 INFO: repo2: remove expired backup 20181119-152800F_20181119-152155I\n" + "P00 INFO: repo2: remove expired backup 20181119-152800F_20181119-152152D\n" + "P00 DETAIL: repo2: 9.4-1 archive retention on backup 20181119-152800F, start = 000000020000000000000002," " stop = 000000020000000000000002\n" - "P00 DETAIL: archive retention on backup 20181119-152800F_20181119-152252D repo2: 9.4-1," + "P00 DETAIL: repo2: 9.4-1 archive retention on backup 20181119-152800F_20181119-152252D," " start = 000000020000000000000009\n" - "P00 DETAIL: remove archive repo2: 9.4-1, start = 000000020000000000000004," - " stop = 000000020000000000000007\n" - "P00 DETAIL: archive retention on backup 20181119-152900F repo2: 10-2, start = 000000010000000000000003\n" - "P00 DETAIL: no archive to remove for repo2: 10-2", testPath(), strZ(archiveStanzaPath)))); + "P00 DETAIL: repo2: 9.4-1 remove archive, start = 000000020000000000000004, stop = 000000020000000000000007\n" + "P00 DETAIL: repo2: 10-2 archive retention on backup 20181119-152900F, start = 000000010000000000000003\n" + "P00 DETAIL: repo2: 10-2 no archive to remove", testPath(), strZ(archiveStanzaPath)))); TEST_ASSIGN(infoBackup, infoBackupLoadFile(storageTest, backupInfoFileName, cipherTypeNone, NULL), "get backup.info"); TEST_RESULT_UINT(infoBackupDataTotal(infoBackup), 2, "backup.info updated on disk"); @@ -1034,12 +1129,12 @@ testRun(void) TEST_RESULT_VOID(cmdExpire(), "label format OK and expired on specified repo"); harnessLogResult( - "P00 WARN: [DRY-RUN] expiring latest backup repo1: 20181119-152900F_20181119-152500I - the ability to perform" + "P00 WARN: [DRY-RUN] repo1: expiring latest backup 20181119-152900F_20181119-152500I - the ability to perform" " point-in-time-recovery (PITR) may be affected\n" " HINT: non-default settings for 'repo1-retention-archive'/'repo1-retention-archive-type' (even in prior" " expires) can cause gaps in the WAL.\n" - "P00 INFO: [DRY-RUN] expire adhoc backup repo1: 20181119-152900F_20181119-152500I\n" - "P00 INFO: [DRY-RUN] remove expired backup repo1: 20181119-152900F_20181119-152500I"); + "P00 INFO: [DRY-RUN] repo1: expire adhoc backup 20181119-152900F_20181119-152500I\n" + "P00 INFO: [DRY-RUN] repo1: remove expired backup 20181119-152900F_20181119-152500I"); // Incorrect backup label format provided argList = strLstDup(argListAvoidWarn); @@ -1059,7 +1154,7 @@ testRun(void) TEST_RESULT_VOID(cmdExpire(), "expire remove archive path"); harnessLogResult( - strZ(strNewFmt("P00 INFO: remove archive path repo1: %s/%s/9.4-1", testPath(), strZ(archiveStanzaPath)))); + strZ(strNewFmt("P00 INFO: repo1: remove archive path %s/%s/9.4-1", testPath(), strZ(archiveStanzaPath)))); //-------------------------------------------------------------------------------------------------------------------------- storagePutP(storageNewWriteP(storageTest, backupInfoFileName), @@ -1133,11 +1228,11 @@ testRun(void) TEST_RESULT_VOID( removeExpiredArchive(infoBackup, false, 0), "backup earlier than selected for retention does not have archive-start"); harnessLogResult( - "P00 DETAIL: archive retention on backup 20181119-152138F repo1: 9.4-1, start = 000000010000000000000002," + "P00 DETAIL: repo1: 9.4-1 archive retention on backup 20181119-152138F, start = 000000010000000000000002," " stop = 000000010000000000000002\n" - "P00 DETAIL: archive retention on backup 20181119-152900F repo1: 9.4-1, start = 000000010000000000000004\n" - "P00 DETAIL: remove archive repo1: 9.4-1, start = 000000010000000000000001, stop = 000000010000000000000001\n" - "P00 DETAIL: remove archive repo1: 9.4-1, start = 000000010000000000000003, stop = 000000010000000000000003"); + "P00 DETAIL: repo1: 9.4-1 archive retention on backup 20181119-152900F, start = 000000010000000000000004\n" + "P00 DETAIL: repo1: 9.4-1 remove archive, start = 000000010000000000000001, stop = 000000010000000000000001\n" + "P00 DETAIL: repo1: 9.4-1 remove archive, start = 000000010000000000000003, stop = 000000010000000000000003"); //-------------------------------------------------------------------------------------------------------------------------- TEST_TITLE("expire history files - dry run"); @@ -1223,11 +1318,11 @@ testRun(void) "history file not removed"); harnessLogResult( - "P00 DETAIL: [DRY-RUN] archive retention on backup 20181119-152138F repo1: 9.4-1, start = 000000010000000000000002\n" - "P00 DETAIL: [DRY-RUN] no archive to remove for repo1: 9.4-1\n" - "P00 DETAIL: [DRY-RUN] archive retention on backup 20181119-152900F repo1: 10-2, start = 000000030000000000000006\n" - "P00 DETAIL: [DRY-RUN] no archive to remove for repo1: 10-2\n" - "P00 DETAIL: [DRY-RUN] remove history file repo1: 10-2, file = 00000002.history"); + "P00 DETAIL: [DRY-RUN] repo1: 9.4-1 archive retention on backup 20181119-152138F, start = 000000010000000000000002\n" + "P00 DETAIL: [DRY-RUN] repo1: 9.4-1 no archive to remove\n" + "P00 DETAIL: [DRY-RUN] repo1: 10-2 archive retention on backup 20181119-152900F, start = 000000030000000000000006\n" + "P00 DETAIL: [DRY-RUN] repo1: 10-2 no archive to remove\n" + "P00 DETAIL: [DRY-RUN] repo1: 10-2 remove history file 00000002.history"); //-------------------------------------------------------------------------------------------------------------------------- TEST_TITLE("expire history files - no dry run"); @@ -1246,11 +1341,11 @@ testRun(void) "00000003.history file not removed"); harnessLogResult( - "P00 DETAIL: archive retention on backup 20181119-152138F repo1: 9.4-1, start = 000000010000000000000002\n" - "P00 DETAIL: no archive to remove for repo1: 9.4-1\n" - "P00 DETAIL: archive retention on backup 20181119-152900F repo1: 10-2, start = 000000030000000000000006\n" - "P00 DETAIL: no archive to remove for repo1: 10-2\n" - "P00 DETAIL: remove history file repo1: 10-2, file = 00000002.history"); + "P00 DETAIL: repo1: 9.4-1 archive retention on backup 20181119-152138F, start = 000000010000000000000002\n" + "P00 DETAIL: repo1: 9.4-1 no archive to remove\n" + "P00 DETAIL: repo1: 10-2 archive retention on backup 20181119-152900F, start = 000000030000000000000006\n" + "P00 DETAIL: repo1: 10-2 no archive to remove\n" + "P00 DETAIL: repo1: 10-2 remove history file 00000002.history"); //-------------------------------------------------------------------------------------------------------------------------- TEST_TITLE("expire history files via backup command"); @@ -1273,11 +1368,11 @@ testRun(void) "00000003.history file not removed"); harnessLogResult( - "P00 DETAIL: archive retention on backup 20181119-152138F repo1: 9.4-1, start = 000000010000000000000002\n" - "P00 DETAIL: no archive to remove for repo1: 9.4-1\n" - "P00 DETAIL: archive retention on backup 20181119-152900F repo1: 10-2, start = 000000030000000000000006\n" - "P00 DETAIL: no archive to remove for repo1: 10-2\n" - "P00 DETAIL: remove history file repo1: 10-2, file = 00000002.history"); + "P00 DETAIL: repo1: 9.4-1 archive retention on backup 20181119-152138F, start = 000000010000000000000002\n" + "P00 DETAIL: repo1: 9.4-1 no archive to remove\n" + "P00 DETAIL: repo1: 10-2 archive retention on backup 20181119-152900F, start = 000000030000000000000006\n" + "P00 DETAIL: repo1: 10-2 no archive to remove\n" + "P00 DETAIL: repo1: 10-2 remove history file 00000002.history"); harnessLogLevelReset(); } @@ -1363,11 +1458,12 @@ testRun(void) archiveGenerate(storageTest, archiveStanzaPath, 1, 7, "10-2", "0000000100000000"); TEST_ERROR( - cmdExpire(), FormatError, "archive expiration cannot continue for repo1 - archive and backup history lists do not" - " match"); + cmdExpire(), CommandError, CFGCMD_EXPIRE " command encountered 1 error(s), check the log file for details"); harnessLogResult( - "P00 INFO: expire full backup repo1: 20181119-152138F\n" - "P00 INFO: remove expired backup repo1: 20181119-152138F"); + "P00 INFO: repo1: expire full backup 20181119-152138F\n" + "P00 INFO: repo1: remove expired backup 20181119-152138F\n" + "P00 ERROR: [029]: repo1: archive expiration cannot continue - archive and backup history lists do not" + " match"); TEST_RESULT_STRLST_STR( strLstSort(storageListP( storageTest, strNewFmt("%s/%s/%s", strZ(archiveStanzaPath), "10-1", "0000000100000000")), sortOrderAsc), @@ -1393,8 +1489,9 @@ testRun(void) "2={\"db-id\":6626363367545678089,\"db-version\":\"10\"}")); TEST_ERROR( - cmdExpire(), FormatError, "archive expiration cannot continue for repo1 - archive and backup history lists do not" - " match"); + cmdExpire(), CommandError, CFGCMD_EXPIRE " command encountered 1 error(s), check the log file for details"); + harnessLogResult( + "P00 ERROR: [029]: repo1: archive expiration cannot continue - archive and backup history lists do not match"); //-------------------------------------------------------------------------------------------------------------------------- TEST_TITLE("archive.info old history db version not the same as backup.info"); @@ -1412,8 +1509,9 @@ testRun(void) "2={\"db-id\":6626363367545678089,\"db-version\":\"10\"}")); TEST_ERROR( - cmdExpire(), FormatError, "archive expiration cannot continue for repo1 - archive and backup history lists do not" - " match"); + cmdExpire(), CommandError, CFGCMD_EXPIRE " command encountered 1 error(s), check the log file for details"); + harnessLogResult( + "P00 ERROR: [029]: repo1: archive expiration cannot continue - archive and backup history lists do not match"); //-------------------------------------------------------------------------------------------------------------------------- TEST_TITLE("archive.info has only current db with same db history id as backup.info"); @@ -1492,10 +1590,10 @@ testRun(void) TEST_RESULT_VOID(cmdExpire(), "Expire archive that archive.info is aware of"); harnessLogResult( - "P00 INFO: expire full backup repo1: 20181119-152138F\n" - "P00 INFO: expire full backup repo1: 20181119-152800F\n" - "P00 INFO: remove expired backup repo1: 20181119-152800F\n" - "P00 INFO: remove expired backup repo1: 20181119-152138F"); + "P00 INFO: repo1: expire full backup 20181119-152138F\n" + "P00 INFO: repo1: expire full backup 20181119-152800F\n" + "P00 INFO: repo1: remove expired backup 20181119-152800F\n" + "P00 INFO: repo1: remove expired backup 20181119-152138F"); TEST_RESULT_STRLST_STR( strLstSort(storageListP( storageTest, strNewFmt("%s/%s/%s", strZ(archiveStanzaPath), "10-1", "0000000100000000")), sortOrderAsc), @@ -1719,18 +1817,18 @@ testRun(void) TEST_RESULT_STR(storageInfoP(storageRepo(), STRDEF(STORAGE_REPO_BACKUP "/latest")).linkDestination, STRDEF("20181119-152900F"), "latest link not updated"); harnessLogResult( - "P00 INFO: expire adhoc backup set repo1: 20181119-152800F_20181119-152152D, 20181119-152800F_20181119-152155I\n" - "P00 INFO: remove expired backup repo1: 20181119-152800F_20181119-152155I\n" - "P00 INFO: remove expired backup repo1: 20181119-152800F_20181119-152152D\n" - "P00 DETAIL: archive retention on backup 20181119-152138F repo1: 9.4-1, start = 000000020000000000000001," + "P00 INFO: repo1: expire adhoc backup set 20181119-152800F_20181119-152152D, 20181119-152800F_20181119-152155I\n" + "P00 INFO: repo1: remove expired backup 20181119-152800F_20181119-152155I\n" + "P00 INFO: repo1: remove expired backup 20181119-152800F_20181119-152152D\n" + "P00 DETAIL: repo1: 9.4-1 archive retention on backup 20181119-152138F, start = 000000020000000000000001," " stop = 000000020000000000000001\n" - "P00 DETAIL: archive retention on backup 20181119-152800F repo1: 9.4-1, start = 000000020000000000000002\n" - "P00 DETAIL: no archive to remove for repo1: 9.4-1\n" - "P00 DETAIL: archive retention on backup 20181119-152850F repo1: 12-2, start = 000000010000000000000002," + "P00 DETAIL: repo1: 9.4-1 archive retention on backup 20181119-152800F, start = 000000020000000000000002\n" + "P00 DETAIL: repo1: 9.4-1 no archive to remove\n" + "P00 DETAIL: repo1: 12-2 archive retention on backup 20181119-152850F, start = 000000010000000000000002," " stop = 000000010000000000000004\n" - "P00 DETAIL: archive retention on backup 20181119-152900F repo1: 12-2, start = 000000010000000000000006\n" - "P00 DETAIL: remove archive repo1: 12-2, start = 000000010000000000000001, stop = 000000010000000000000001\n" - "P00 DETAIL: remove archive repo1: 12-2, start = 000000010000000000000005, stop = 000000010000000000000005"); + "P00 DETAIL: repo1: 12-2 archive retention on backup 20181119-152900F, start = 000000010000000000000006\n" + "P00 DETAIL: repo1: 12-2 remove archive, start = 000000010000000000000001, stop = 000000010000000000000001\n" + "P00 DETAIL: repo1: 12-2 remove archive, start = 000000010000000000000005, stop = 000000010000000000000005"); //-------------------------------------------------------------------------------------------------------------------------- TEST_TITLE("expire full and archive (no dependents)"); @@ -1755,14 +1853,14 @@ testRun(void) !storageExistsP(storageTest, strNewFmt("%s/20181119-152138F/" BACKUP_MANIFEST_FILE, strZ(backupStanzaPath)))), true, "only adhoc full removed"); harnessLogResult( - "P00 INFO: expire adhoc backup repo1: 20181119-152138F\n" - "P00 INFO: remove expired backup repo1: 20181119-152138F\n" - "P00 DETAIL: archive retention on backup 20181119-152800F repo1: 9.4-1, start = 000000020000000000000002\n" - "P00 DETAIL: remove archive repo1: 9.4-1, start = 000000020000000000000001, stop = 000000020000000000000001\n" - "P00 DETAIL: archive retention on backup 20181119-152850F repo1: 12-2, start = 000000010000000000000002," + "P00 INFO: repo1: expire adhoc backup 20181119-152138F\n" + "P00 INFO: repo1: remove expired backup 20181119-152138F\n" + "P00 DETAIL: repo1: 9.4-1 archive retention on backup 20181119-152800F, start = 000000020000000000000002\n" + "P00 DETAIL: repo1: 9.4-1 remove archive, start = 000000020000000000000001, stop = 000000020000000000000001\n" + "P00 DETAIL: repo1: 12-2 archive retention on backup 20181119-152850F, start = 000000010000000000000002," " stop = 000000010000000000000004\n" - "P00 DETAIL: archive retention on backup 20181119-152900F repo1: 12-2, start = 000000010000000000000006\n" - "P00 DETAIL: no archive to remove for repo1: 12-2"); + "P00 DETAIL: repo1: 12-2 archive retention on backup 20181119-152900F, start = 000000010000000000000006\n" + "P00 DETAIL: repo1: 12-2 no archive to remove"); //-------------------------------------------------------------------------------------------------------------------------- TEST_TITLE("expire latest and resumable"); @@ -1789,17 +1887,17 @@ testRun(void) strZ(backupStanzaPath)))), true, "latest and resumable removed"); harnessLogResult( - "P00 WARN: expiring latest backup repo1: 20181119-152900F - the ability to perform point-in-time-recovery (PITR) may" + "P00 WARN: repo1: expiring latest backup 20181119-152900F - the ability to perform point-in-time-recovery (PITR) may" " be affected\n" " HINT: non-default settings for 'repo1-retention-archive'/'repo1-retention-archive-type'" " (even in prior expires) can cause gaps in the WAL.\n" - "P00 INFO: expire adhoc backup repo1: 20181119-152900F\n" - "P00 INFO: remove expired backup repo1: 20181119-152900F_20181119-153000I\n" - "P00 INFO: remove expired backup repo1: 20181119-152900F\n" - "P00 DETAIL: archive retention on backup 20181119-152800F repo1: 9.4-1, start = 000000020000000000000002\n" - "P00 DETAIL: no archive to remove for repo1: 9.4-1\n" - "P00 DETAIL: archive retention on backup 20181119-152850F repo1: 12-2, start = 000000010000000000000002\n" - "P00 DETAIL: no archive to remove for repo1: 12-2"); + "P00 INFO: repo1: expire adhoc backup 20181119-152900F\n" + "P00 INFO: repo1: remove expired backup 20181119-152900F_20181119-153000I\n" + "P00 INFO: repo1: remove expired backup 20181119-152900F\n" + "P00 DETAIL: repo1: 9.4-1 archive retention on backup 20181119-152800F, start = 000000020000000000000002\n" + "P00 DETAIL: repo1: 9.4-1 no archive to remove\n" + "P00 DETAIL: repo1: 12-2 archive retention on backup 20181119-152850F, start = 000000010000000000000002\n" + "P00 DETAIL: repo1: 12-2 no archive to remove"); TEST_RESULT_STR(storageInfoP(storageRepo(), STRDEF(STORAGE_REPO_BACKUP "/latest")).linkDestination, STRDEF("20181119-152850F"), "latest link updated"); TEST_RESULT_STRLST_STR( @@ -1816,8 +1914,10 @@ testRun(void) harnessCfgLoad(cfgCmdExpire, argList); TEST_ERROR( - cmdExpire(), BackupSetInvalidError, - "full backup repo1: 20181119-152850F cannot be expired until another full backup has been created on this repo"); + cmdExpire(), CommandError, CFGCMD_EXPIRE " command encountered 1 error(s), check the log file for details"); + harnessLogResult( + "P00 ERROR: [075]: repo1: full backup 20181119-152850F cannot be expired until another full backup has been created on" + " this repo"); //-------------------------------------------------------------------------------------------------------------------------- TEST_TITLE("allow adhoc expire on last full backup in prior db-id"); @@ -1836,12 +1936,12 @@ testRun(void) true, "only last prior backup removed"); harnessLogResult( strZ(strNewFmt( - "P00 INFO: expire adhoc backup set repo1: 20181119-152800F, 20181119-152800F_20181119-152252D\n" - "P00 INFO: remove expired backup repo1: 20181119-152800F_20181119-152252D\n" - "P00 INFO: remove expired backup repo1: 20181119-152800F\n" - "P00 INFO: remove archive path repo1: %s/repo/archive/db/9.4-1\n" - "P00 DETAIL: archive retention on backup 20181119-152850F repo1: 12-2, start = 000000010000000000000002\n" - "P00 DETAIL: no archive to remove for repo1: 12-2", testPath()))); + "P00 INFO: repo1: expire adhoc backup set 20181119-152800F, 20181119-152800F_20181119-152252D\n" + "P00 INFO: repo1: remove expired backup 20181119-152800F_20181119-152252D\n" + "P00 INFO: repo1: remove expired backup 20181119-152800F\n" + "P00 INFO: repo1: remove archive path %s/repo/archive/db/9.4-1\n" + "P00 DETAIL: repo1: 12-2 archive retention on backup 20181119-152850F, start = 000000010000000000000002\n" + "P00 DETAIL: repo1: 12-2 no archive to remove", testPath()))); //-------------------------------------------------------------------------------------------------------------------------- TEST_TITLE("error on expire last full backup on disk"); @@ -1851,8 +1951,10 @@ testRun(void) harnessCfgLoad(cfgCmdExpire, argList); TEST_ERROR( - cmdExpire(), BackupSetInvalidError, - "full backup repo1: 20181119-152850F cannot be expired until another full backup has been created on this repo"); + cmdExpire(), CommandError, CFGCMD_EXPIRE " command encountered 1 error(s), check the log file for details"); + harnessLogResult( + "P00 ERROR: [075]: repo1: full backup 20181119-152850F cannot be expired until another full backup has been created on" + " this repo"); //-------------------------------------------------------------------------------------------------------------------------- TEST_TITLE("adhoc dry-run"); @@ -1911,12 +2013,12 @@ testRun(void) TEST_RESULT_VOID( removeExpiredBackup(infoBackup, adhocBackupLabel, 0), "code coverage: removeExpireBackup with no manifests"); harnessLogResult( - "P00 WARN: [DRY-RUN] expiring latest backup repo1: 20181119-152850F_20181119-152252D - the ability to perform" + "P00 WARN: [DRY-RUN] repo1: expiring latest backup 20181119-152850F_20181119-152252D - the ability to perform" " point-in-time-recovery (PITR) may be affected\n" " HINT: non-default settings for 'repo1-retention-archive'/'repo1-retention-archive-type'" " (even in prior expires) can cause gaps in the WAL.\n" - "P00 INFO: [DRY-RUN] expire adhoc backup repo1: 20181119-152850F_20181119-152252D\n" - "P00 INFO: [DRY-RUN] remove expired backup repo1: 20181119-152850F_20181119-152252D"); + "P00 INFO: [DRY-RUN] repo1: expire adhoc backup 20181119-152850F_20181119-152252D\n" + "P00 INFO: [DRY-RUN] repo1: remove expired backup 20181119-152850F_20181119-152252D"); //-------------------------------------------------------------------------------------------------------------------------- TEST_TITLE("resumable possibly based on adhoc expire backup, multi-repo, encryption"); @@ -2087,22 +2189,22 @@ testRun(void) TEST_RESULT_VOID(cmdExpire(), "adhoc expire latest with resumable possibly based on it"); harnessLogResult( - "P00 WARN: expiring latest backup repo1: 20181119-152850F_20181119-152252D - the ability to perform" + "P00 WARN: repo1: expiring latest backup 20181119-152850F_20181119-152252D - the ability to perform" " point-in-time-recovery (PITR) may be affected\n" " HINT: non-default settings for 'repo1-retention-archive'/'repo1-retention-archive-type'" " (even in prior expires) can cause gaps in the WAL.\n" - "P00 INFO: expire adhoc backup repo1: 20181119-152850F_20181119-152252D\n" - "P00 INFO: remove expired backup repo1: 20181119-152850F_20181119-152252D\n" - "P00 DETAIL: archive retention on backup 20181119-152850F repo1: 12-2, start = 000000010000000000000002\n" - "P00 DETAIL: no archive to remove for repo1: 12-2\n" - "P00 WARN: expiring latest backup repo2: 20181119-152850F_20181119-152252D - the ability to perform" + "P00 INFO: repo1: expire adhoc backup 20181119-152850F_20181119-152252D\n" + "P00 INFO: repo1: remove expired backup 20181119-152850F_20181119-152252D\n" + "P00 DETAIL: repo1: 12-2 archive retention on backup 20181119-152850F, start = 000000010000000000000002\n" + "P00 DETAIL: repo1: 12-2 no archive to remove\n" + "P00 WARN: repo2: expiring latest backup 20181119-152850F_20181119-152252D - the ability to perform" " point-in-time-recovery (PITR) may be affected\n" " HINT: non-default settings for 'repo2-retention-archive'/'repo2-retention-archive-type'" " (even in prior expires) can cause gaps in the WAL.\n" - "P00 INFO: expire adhoc backup repo2: 20181119-152850F_20181119-152252D\n" - "P00 INFO: remove expired backup repo2: 20181119-152850F_20181119-152252D\n" - "P00 DETAIL: archive retention on backup 20181119-152850F repo2: 12-2, start = 000000010000000000000002\n" - "P00 DETAIL: no archive to remove for repo2: 12-2"); + "P00 INFO: repo2: expire adhoc backup 20181119-152850F_20181119-152252D\n" + "P00 INFO: repo2: remove expired backup 20181119-152850F_20181119-152252D\n" + "P00 DETAIL: repo2: 12-2 archive retention on backup 20181119-152850F, start = 000000010000000000000002\n" + "P00 DETAIL: repo2: 12-2 no archive to remove"); TEST_RESULT_STR(storageInfoP(storageRepoIdx(1), STRDEF(STORAGE_REPO_BACKUP "/latest")).linkDestination, STRDEF("20181119-152850F"), "latest link updated, repo2"); @@ -2190,7 +2292,7 @@ testRun(void) " of space\n" " HINT: to retain full backups indefinitely (without warning), set option 'repo1-retention-full' to the" " maximum.\n" - "P00 INFO: time-based archive retention not met for repo1 - archive logs will not be expired"); + "P00 INFO: repo1: time-based archive retention not met - archive logs will not be expired"); // Stop time equals retention time TEST_RESULT_UINT( @@ -2215,7 +2317,7 @@ testRun(void) infoBackupDataLabelList(infoBackup, NULL), "20181119-152138F\n20181119-152800F\n20181119-152800F_20181119-152152D\n20181119-152800F_20181119-152155I\n" "20181119-152900F\n20181119-152900F_20181119-152600D\n", "no backups expired"); - harnessLogResult("P00 INFO: time-based archive retention not met for repo1 - archive logs will not be expired"); + harnessLogResult("P00 INFO: repo1: time-based archive retention not met - archive logs will not be expired"); //-------------------------------------------------------------------------------------------------------------------------- TEST_TITLE("oldest backup expired"); @@ -2226,18 +2328,17 @@ testRun(void) harnessCfgLoad(cfgCmdExpire, argList); TEST_RESULT_VOID(cmdExpire(), "only oldest backup expired - dry-run"); harnessLogResult( - "P00 INFO: [DRY-RUN] expire time-based backup repo1: 20181119-152138F\n" - "P00 INFO: [DRY-RUN] remove expired backup repo1: 20181119-152138F\n" - "P00 DETAIL: [DRY-RUN] archive retention on backup 20181119-152800F repo1: 9.4-1, start = 000000010000000000000004\n" - "P00 DETAIL: [DRY-RUN] remove archive repo1: 9.4-1, start = 000000010000000000000001," - " stop = 000000010000000000000003"); + "P00 INFO: [DRY-RUN] repo1: expire time-based backup 20181119-152138F\n" + "P00 INFO: [DRY-RUN] repo1: remove expired backup 20181119-152138F\n" + "P00 DETAIL: [DRY-RUN] repo1: 9.4-1 archive retention on backup 20181119-152800F, start = 000000010000000000000004\n" + "P00 DETAIL: [DRY-RUN] repo1: 9.4-1 remove archive, start = 000000010000000000000001, stop = 000000010000000000000003"); strLstAddZ(argList, "--repo1-retention-archive=9999999"); harnessCfgLoad(cfgCmdExpire, argList); TEST_RESULT_VOID(cmdExpire(), "only oldest backup expired - dry-run, retention-archive set to max, no archives expired"); harnessLogResult( - "P00 INFO: [DRY-RUN] expire time-based backup repo1: 20181119-152138F\n" - "P00 INFO: [DRY-RUN] remove expired backup repo1: 20181119-152138F"); + "P00 INFO: [DRY-RUN] repo1: expire time-based backup 20181119-152138F\n" + "P00 INFO: [DRY-RUN] repo1: remove expired backup 20181119-152138F"); argList = strLstDup(argListTime); strLstAddZ(argList, "--repo1-retention-full=30"); @@ -2246,18 +2347,18 @@ testRun(void) harnessCfgLoad(cfgCmdExpire, argList); TEST_RESULT_VOID(cmdExpire(), "only oldest backup expired but retention archive set lower - dry-run"); harnessLogResult( - "P00 INFO: [DRY-RUN] expire time-based backup repo1: 20181119-152138F\n" - "P00 INFO: [DRY-RUN] remove expired backup repo1: 20181119-152138F\n" - "P00 DETAIL: [DRY-RUN] archive retention on backup 20181119-152800F repo1: 9.4-1, start = 000000010000000000000004," + "P00 INFO: [DRY-RUN] repo1: expire time-based backup 20181119-152138F\n" + "P00 INFO: [DRY-RUN] repo1: remove expired backup 20181119-152138F\n" + "P00 DETAIL: [DRY-RUN] repo1: 9.4-1 archive retention on backup 20181119-152800F, start = 000000010000000000000004," " stop = 000000010000000000000004\n" - "P00 DETAIL: [DRY-RUN] archive retention on backup 20181119-152800F_20181119-152152D repo1: 9.4-1," + "P00 DETAIL: [DRY-RUN] repo1: 9.4-1 archive retention on backup 20181119-152800F_20181119-152152D," " start = 000000010000000000000006, stop = 000000010000000000000006\n" - "P00 DETAIL: [DRY-RUN] archive retention on backup 20181119-152800F_20181119-152155I repo1: 9.4-1," + "P00 DETAIL: [DRY-RUN] repo1: 9.4-1 archive retention on backup 20181119-152800F_20181119-152155I," " start = 000000010000000000000007, stop = 000000010000000000000007\n" - "P00 DETAIL: [DRY-RUN] archive retention on backup 20181119-152900F repo1: 9.4-1, start = 000000010000000000000009\n" - "P00 DETAIL: [DRY-RUN] remove archive repo1: 9.4-1, start = 000000010000000000000001, stop = 000000010000000000000003\n" - "P00 DETAIL: [DRY-RUN] remove archive repo1: 9.4-1, start = 000000010000000000000005, stop = 000000010000000000000005\n" - "P00 DETAIL: [DRY-RUN] remove archive repo1: 9.4-1, start = 000000010000000000000008, stop = 000000010000000000000008"); + "P00 DETAIL: [DRY-RUN] repo1: 9.4-1 archive retention on backup 20181119-152900F, start = 000000010000000000000009\n" + "P00 DETAIL: [DRY-RUN] repo1: 9.4-1 remove archive, start = 000000010000000000000001, stop = 000000010000000000000003\n" + "P00 DETAIL: [DRY-RUN] repo1: 9.4-1 remove archive, start = 000000010000000000000005, stop = 000000010000000000000005\n" + "P00 DETAIL: [DRY-RUN] repo1: 9.4-1 remove archive, start = 000000010000000000000008, stop = 000000010000000000000008"); //-------------------------------------------------------------------------------------------------------------------------- TEST_TITLE("repo1-retention-archive-type=diff"); @@ -2274,22 +2375,22 @@ testRun(void) "P00 WARN: [DRY-RUN] option 'repo1-retention-diff' is not set for 'repo1-retention-archive-type=diff'\n" " HINT: to retain differential backups indefinitely (without warning), set option 'repo1-retention-diff'" " to the maximum.\n" - "P00 INFO: [DRY-RUN] expire time-based backup repo1: 20181119-152138F\n" - "P00 INFO: [DRY-RUN] remove expired backup repo1: 20181119-152138F\n" - "P00 DETAIL: [DRY-RUN] archive retention on backup 20181119-152800F repo1: 9.4-1, start = 000000010000000000000004," + "P00 INFO: [DRY-RUN] repo1: expire time-based backup 20181119-152138F\n" + "P00 INFO: [DRY-RUN] repo1: remove expired backup 20181119-152138F\n" + "P00 DETAIL: [DRY-RUN] repo1: 9.4-1 archive retention on backup 20181119-152800F, start = 000000010000000000000004," " stop = 000000010000000000000004\n" - "P00 DETAIL: [DRY-RUN] archive retention on backup 20181119-152800F_20181119-152152D repo1: 9.4-1," + "P00 DETAIL: [DRY-RUN] repo1: 9.4-1 archive retention on backup 20181119-152800F_20181119-152152D," " start = 000000010000000000000006, stop = 000000010000000000000006\n" - "P00 DETAIL: [DRY-RUN] archive retention on backup 20181119-152800F_20181119-152155I repo1: 9.4-1," + "P00 DETAIL: [DRY-RUN] repo1: 9.4-1 archive retention on backup 20181119-152800F_20181119-152155I," " start = 000000010000000000000007, stop = 000000010000000000000007\n" - "P00 DETAIL: [DRY-RUN] archive retention on backup 20181119-152900F repo1: 9.4-1, start = 000000010000000000000009," + "P00 DETAIL: [DRY-RUN] repo1: 9.4-1 archive retention on backup 20181119-152900F, start = 000000010000000000000009," " stop = 000000010000000000000009\n" - "P00 DETAIL: [DRY-RUN] archive retention on backup 20181119-152900F_20181119-152600D repo1: 9.4-1," + "P00 DETAIL: [DRY-RUN] repo1: 9.4-1 archive retention on backup 20181119-152900F_20181119-152600D," " start = 000000010000000000000011\n" - "P00 DETAIL: [DRY-RUN] remove archive repo1: 9.4-1, start = 000000010000000000000001, stop = 000000010000000000000003\n" - "P00 DETAIL: [DRY-RUN] remove archive repo1: 9.4-1, start = 000000010000000000000005, stop = 000000010000000000000005\n" - "P00 DETAIL: [DRY-RUN] remove archive repo1: 9.4-1, start = 000000010000000000000008, stop = 000000010000000000000008\n" - "P00 DETAIL: [DRY-RUN] remove archive repo1: 9.4-1, start = 000000010000000000000010, stop = 000000010000000000000010"); + "P00 DETAIL: [DRY-RUN] repo1: 9.4-1 remove archive, start = 000000010000000000000001, stop = 000000010000000000000003\n" + "P00 DETAIL: [DRY-RUN] repo1: 9.4-1 remove archive, start = 000000010000000000000005, stop = 000000010000000000000005\n" + "P00 DETAIL: [DRY-RUN] repo1: 9.4-1 remove archive, start = 000000010000000000000008, stop = 000000010000000000000008\n" + "P00 DETAIL: [DRY-RUN] repo1: 9.4-1 remove archive, start = 000000010000000000000010, stop = 000000010000000000000010"); //-------------------------------------------------------------------------------------------------------------------------- TEST_TITLE("expire oldest full"); @@ -2303,12 +2404,12 @@ testRun(void) TEST_RESULT_VOID( infoBackupSaveFile(infoBackup, storageTest, backupInfoFileName, cipherTypeNone, NULL), "save backup.info without oldest"); - harnessLogResult("P00 INFO: expire time-based backup repo1: 20181119-152138F"); + harnessLogResult("P00 INFO: repo1: expire time-based backup 20181119-152138F"); TEST_RESULT_VOID(cmdExpire(), "only oldest backup expired"); harnessLogResult( - "P00 INFO: remove expired backup repo1: 20181119-152138F\n" - "P00 DETAIL: archive retention on backup 20181119-152800F repo1: 9.4-1, start = 000000010000000000000004\n" - "P00 DETAIL: remove archive repo1: 9.4-1, start = 000000010000000000000001, stop = 000000010000000000000003"); + "P00 INFO: repo1: remove expired backup 20181119-152138F\n" + "P00 DETAIL: repo1: 9.4-1 archive retention on backup 20181119-152800F, start = 000000010000000000000004\n" + "P00 DETAIL: repo1: 9.4-1 remove archive, start = 000000010000000000000001, stop = 000000010000000000000003"); //-------------------------------------------------------------------------------------------------------------------------- TEST_TITLE("newest backup - retention met but must keep one"); @@ -2319,13 +2420,13 @@ testRun(void) TEST_RESULT_VOID(cmdExpire(), "expire all but newest"); harnessLogResult( - "P00 INFO: expire time-based backup set repo1: 20181119-152800F, 20181119-152800F_20181119-152152D," + "P00 INFO: repo1: expire time-based backup set 20181119-152800F, 20181119-152800F_20181119-152152D," " 20181119-152800F_20181119-152155I\n" - "P00 INFO: remove expired backup repo1: 20181119-152800F_20181119-152155I\n" - "P00 INFO: remove expired backup repo1: 20181119-152800F_20181119-152152D\n" - "P00 INFO: remove expired backup repo1: 20181119-152800F\n" - "P00 DETAIL: archive retention on backup 20181119-152900F repo1: 9.4-1, start = 000000010000000000000009\n" - "P00 DETAIL: remove archive repo1: 9.4-1, start = 000000010000000000000004, stop = 000000010000000000000008"); + "P00 INFO: repo1: remove expired backup 20181119-152800F_20181119-152155I\n" + "P00 INFO: repo1: remove expired backup 20181119-152800F_20181119-152152D\n" + "P00 INFO: repo1: remove expired backup 20181119-152800F\n" + "P00 DETAIL: repo1: 9.4-1 archive retention on backup 20181119-152900F, start = 000000010000000000000009\n" + "P00 DETAIL: repo1: 9.4-1 remove archive, start = 000000010000000000000004, stop = 000000010000000000000008"); harnessLogLevelReset(); }