diff --git a/doc/xml/release/2024/2.51.xml b/doc/xml/release/2024/2.51.xml index 50dbff7f2..d03b3bcad 100644 --- a/doc/xml/release/2024/2.51.xml +++ b/doc/xml/release/2024/2.51.xml @@ -52,6 +52,18 @@

Improve archive-push WAL segment queue handling.

+ + + + + + + + + +

Limit resume functionality to full backups.

+
+ diff --git a/src/command/backup/backup.c b/src/command/backup/backup.c index e34a8be17..ce57e0447 100644 --- a/src/command/backup/backup.c +++ b/src/command/backup/backup.c @@ -784,18 +784,16 @@ backupResumeClean( else { ManifestFile file = manifestFileFind(manifest, manifestName); + ASSERT(file.reference == NULL); - if (file.reference != NULL) - removeReason = "reference in manifest"; - else if (!manifestFileExists(manifestResume, manifestName)) + if (!manifestFileExists(manifestResume, manifestName)) removeReason = "missing in resumed manifest"; else { const ManifestFile fileResume = manifestFileFind(manifestResume, manifestName); + ASSERT(fileResume.reference == NULL); - if (fileResume.reference != NULL) - removeReason = "reference in resumed manifest"; - else if (fileResume.checksumSha1 == NULL) + if (fileResume.checksumSha1 == NULL) removeReason = "no checksum in resumed manifest"; else if (file.size != fileResume.size) removeReason = "mismatched size"; @@ -890,72 +888,78 @@ backupResumeFind(const Manifest *const manifest, const String *const cipherPassB // Resumable backups do not have backup.manifest if (!storageExistsP(storageRepo(), manifestFile)) { - const bool resume = cfgOptionBool(cfgOptResume); + const bool resume = cfgOptionBool(cfgOptResume) && cfgOptionStrId(cfgOptType) == backupTypeFull; bool usable = false; - const String *reason = STRDEF("partially deleted by prior resume or invalid"); + const String *reason = STRDEF("resume only valid for full backup"); Manifest *manifestResume = NULL; - // Resumable backups must have backup.manifest.copy - if (storageExistsP(storageRepo(), strNewFmt("%s" INFO_COPY_EXT, strZ(manifestFile)))) + if (cfgOptionStrId(cfgOptType) == backupTypeFull) { - reason = strNewZ("resume is disabled"); + reason = STRDEF("partially deleted by prior resume or invalid"); - // Attempt to read the manifest file in the resumable backup to see if it can be used. If any error at all - // occurs then the backup will be considered unusable and a resume will not be attempted. - if (resume) + // Resumable backups must have backup.manifest.copy + if (storageExistsP(storageRepo(), strNewFmt("%s" INFO_COPY_EXT, strZ(manifestFile)))) { - TRY_BEGIN() - { - manifestResume = manifestLoadFile( - storageRepo(), manifestFile, cfgOptionStrId(cfgOptRepoCipherType), cipherPassBackup); - } - CATCH_ANY() - { - reason = strNewFmt("unable to read %s" INFO_COPY_EXT, strZ(manifestFile)); - } - TRY_END(); + reason = strNewZ("resume is disabled"); - if (manifestResume != NULL) + // Attempt to read the manifest file in the resumable backup to see if it can be used. If any error at all + // occurs then the backup will be considered unusable and a resume will not be attempted. + if (resume) { - const ManifestData *manifestResumeData = manifestData(manifestResume); + TRY_BEGIN() + { + manifestResume = manifestLoadFile( + storageRepo(), manifestFile, cfgOptionStrId(cfgOptRepoCipherType), cipherPassBackup); + } + CATCH_ANY() + { + reason = strNewFmt("unable to read %s" INFO_COPY_EXT, strZ(manifestFile)); + } + TRY_END(); - // Check pgBackRest version. This allows the resume implementation to be changed with each version of - // pgBackRest at the expense of users losing a resumable back after an upgrade, which seems worth the - // cost. - if (!strEq(manifestResumeData->backrestVersion, manifestData(manifest)->backrestVersion)) + if (manifestResume != NULL) { - reason = strNewFmt( - "new " PROJECT_NAME " version '%s' does not match resumable " PROJECT_NAME " version '%s'", - strZ(manifestData(manifest)->backrestVersion), strZ(manifestResumeData->backrestVersion)); + const ManifestData *manifestResumeData = manifestData(manifestResume); + + // Check pgBackRest version. This allows the resume implementation to be changed with each version + // of pgBackRest at the expense of users losing a resumable back after an upgrade, which seems worth + // the cost. + if (!strEq(manifestResumeData->backrestVersion, manifestData(manifest)->backrestVersion)) + { + reason = strNewFmt( + "new " PROJECT_NAME " version '%s' does not match resumable " PROJECT_NAME " version '%s'", + strZ(manifestData(manifest)->backrestVersion), strZ(manifestResumeData->backrestVersion)); + } + // Check backup type because new backup label must be the same type as resume backup label + else if (manifestResumeData->backupType != cfgOptionStrId(cfgOptType)) + { + reason = strNewFmt( + "new backup type '%s' does not match resumable backup type '%s'", + strZ(cfgOptionDisplay(cfgOptType)), strZ(strIdToStr(manifestResumeData->backupType))); + } + // Check prior backup label ??? Do we really care about the prior backup label? + else if (!strEq(manifestResumeData->backupLabelPrior, manifestData(manifest)->backupLabelPrior)) + { + reason = strNewFmt( + "new prior backup label '%s' does not match resumable prior backup label '%s'", + manifestResumeData->backupLabelPrior ? + strZ(manifestResumeData->backupLabelPrior) : "", + manifestData(manifest)->backupLabelPrior ? + strZ(manifestData(manifest)->backupLabelPrior) : ""); + } + // Check compression. Compression can't be changed between backups so resume won't work either. + else if ( + manifestResumeData->backupOptionCompressType != + compressTypeEnum(cfgOptionStrId(cfgOptCompressType))) + { + reason = strNewFmt( + "new compression '%s' does not match resumable compression '%s'", + strZ(cfgOptionDisplay(cfgOptCompressType)), + strZ(compressTypeStr(manifestResumeData->backupOptionCompressType))); + } + else + usable = true; } - // Check backup type because new backup label must be the same type as resume backup label - else if (manifestResumeData->backupType != cfgOptionStrId(cfgOptType)) - { - reason = strNewFmt( - "new backup type '%s' does not match resumable backup type '%s'", - strZ(cfgOptionDisplay(cfgOptType)), strZ(strIdToStr(manifestResumeData->backupType))); - } - // Check prior backup label ??? Do we really care about the prior backup label? - else if (!strEq(manifestResumeData->backupLabelPrior, manifestData(manifest)->backupLabelPrior)) - { - reason = strNewFmt( - "new prior backup label '%s' does not match resumable prior backup label '%s'", - manifestResumeData->backupLabelPrior ? strZ(manifestResumeData->backupLabelPrior) : "", - manifestData(manifest)->backupLabelPrior ? - strZ(manifestData(manifest)->backupLabelPrior) : ""); - } - // Check compression. Compression can't be changed between backups so resume won't work either. - else if ( - manifestResumeData->backupOptionCompressType != - compressTypeEnum(cfgOptionStrId(cfgOptCompressType))) - { - reason = strNewFmt( - "new compression '%s' does not match resumable compression '%s'", - strZ(cfgOptionDisplay(cfgOptCompressType)), - strZ(compressTypeStr(manifestResumeData->backupOptionCompressType))); - } - else - usable = true; } } } @@ -1012,9 +1016,8 @@ backupResume(Manifest *const manifest, const String *const cipherPassBackup) "resumable backup %s of same type exists -- invalid files will be removed then the backup will resume", strZ(manifestData(manifest)->backupLabel)); - // If resuming a full backup then copy cipher subpass since it was used to encrypt the resumable files - if (manifestData(manifest)->backupType == backupTypeFull) - manifestCipherSubPassSet(manifest, manifestCipherSubPass(manifestResume)); + // Copy cipher subpass since it was used to encrypt the resumable files + manifestCipherSubPassSet(manifest, manifestCipherSubPass(manifestResume)); // Clean resumed backup const String *const backupPath = strNewFmt(STORAGE_REPO_BACKUP "/%s", strZ(manifestData(manifest)->backupLabel)); diff --git a/test/src/module/command/backupTest.c b/test/src/module/command/backupTest.c index e826c075b..28028da79 100644 --- a/test/src/module/command/backupTest.c +++ b/test/src/module/command/backupTest.c @@ -1994,7 +1994,7 @@ testRun(void) TEST_RESULT_LOG( "P00 INFO: last backup label = [FULL-1], version = " PROJECT_VERSION "\n" "P00 WARN: incr backup cannot alter 'checksum-page' option to 'true', reset to 'false' from [FULL-1]\n" - "P00 WARN: backup '[DIFF-1]' cannot be resumed: new backup type 'incr' does not match resumable backup type 'diff'\n" + "P00 INFO: backup '[DIFF-1]' cannot be resumed: resume only valid for full backup\n" "P01 DETAIL: backup file " TEST_PATH "/pg1/PG_VERSION (3B, 100.00%) checksum c8663c2525f44b6d9c687fbceb4aafc63ed8b451\n" "P00 DETAIL: reference pg_data/global/pg_control to [FULL-1]\n" "P00 DETAIL: reference pg_data/postgresql.conf to [FULL-1]\n" @@ -2382,7 +2382,7 @@ testRun(void) } // ------------------------------------------------------------------------------------------------------------------------- - TEST_TITLE("online resumed compressed 9.5 diff backup"); + TEST_TITLE("online resumed compressed 9.5 full delta backup"); backupTimeStart = BACKUP_EPOCH + 200000; @@ -2392,39 +2392,22 @@ testRun(void) hrnCfgArgRaw(argList, cfgOptRepoPath, repoPath); hrnCfgArgRaw(argList, cfgOptPgPath, pg1Path); hrnCfgArgRawZ(argList, cfgOptRepoRetentionFull, "1"); - hrnCfgArgRawStrId(argList, cfgOptType, backupTypeDiff); - hrnCfgArgRawBool(argList, cfgOptCompress, false); + hrnCfgArgRawStrId(argList, cfgOptType, backupTypeFull); + hrnCfgArgRawBool(argList, cfgOptDelta, true); hrnCfgArgRawBool(argList, cfgOptStopAuto, true); hrnCfgArgRawBool(argList, cfgOptRepoHardlink, true); HRN_CFG_LOAD(cfgCmdBackup, argList); - // Load the previous manifest and null out the checksum-page option to be sure it gets set to false in this backup - const String *manifestPriorFile = STRDEF(STORAGE_REPO_BACKUP "/latest/" BACKUP_MANIFEST_FILE); - Manifest *manifestPrior = manifestNewLoad(storageReadIo(storageNewReadP(storageRepo(), manifestPriorFile))); - ((ManifestData *)manifestData(manifestPrior))->backupOptionChecksumPage = NULL; - manifestSave(manifestPrior, storageWriteIo(storageNewWriteP(storageRepoWrite(), manifestPriorFile))); - // Create a backup manifest that looks like a halted backup manifest Manifest *manifestResume = manifestNewBuild( storagePg(), PG_VERSION_95, hrnPgCatalogVersion(PG_VERSION_95), 0, true, false, false, false, NULL, NULL, NULL); ManifestData *manifestResumeData = (ManifestData *)manifestData(manifestResume); - manifestResumeData->backupType = backupTypeDiff; - manifestResumeData->backupLabelPrior = manifestData(manifestPrior)->backupLabel; manifestResumeData->backupOptionCompressType = compressTypeGz; - const String *resumeLabel = backupLabelCreate( - backupTypeDiff, manifestData(manifestPrior)->backupLabel, backupTimeStart); + const String *resumeLabel = backupLabelCreate(backupTypeFull, NULL, backupTimeStart - 100000); manifestBackupLabelSet(manifestResume, resumeLabel); strLstAddZ(manifestResume->pub.referenceList, "BOGUS"); - // Reference in manifest - HRN_STORAGE_PUT_EMPTY(storageRepoWrite(), zNewFmt(STORAGE_REPO_BACKUP "/%s/pg_data/PG_VERSION.gz", strZ(resumeLabel))); - - // Reference in resumed manifest - HRN_STORAGE_PUT_EMPTY(storagePgWrite(), "resume-ref", .timeModified = backupTimeStart); - HRN_STORAGE_PUT_EMPTY(storageRepoWrite(), zNewFmt(STORAGE_REPO_BACKUP "/%s/pg_data/resume-ref.gz", strZ(resumeLabel))); - HRN_MANIFEST_FILE_ADD(manifestResume, .name = "pg_data/resume-ref", .reference = "BOGUS"); - // Time does not match between cluster and resume manifest (but resume because time is in future so delta enabled). Note // also that the repo file is intentionally corrupt to generate a warning about corruption in the repository. HRN_STORAGE_PUT_Z(storagePgWrite(), "time-mismatch2", "TEST", .timeModified = backupTimeStart + 100); @@ -2472,7 +2455,9 @@ testRun(void) "mkfifo -m 666 %s", strZ(storagePathP(storageRepo(), strNewFmt(STORAGE_REPO_BACKUP "/%s/pg_data/pipe", strZ(resumeLabel))))); - // Save the resume manifest + // Save the resume manifest with full type + manifestResumeData->backupType = backupTypeFull; + manifestSave( manifestResume, storageWriteIo( @@ -2488,23 +2473,15 @@ testRun(void) // Check log TEST_RESULT_LOG( - "P00 INFO: last backup label = 20191003-105320F, version = " PROJECT_VERSION "\n" - "P00 WARN: diff backup cannot alter compress-type option to 'none', reset to value in 20191003-105320F\n" "P00 INFO: execute exclusive backup start: backup begins after the next regular checkpoint completes\n" "P00 INFO: backup start archive = 0000000105D9759000000000, lsn = 5d97590/0\n" "P00 INFO: check archive for prior segment 0000000105D9758F000000FF\n" - "P00 WARN: file 'time-mismatch2' has timestamp (1570200100) in the future (relative to copy start 1570200000)," - " enabling delta checksum\n" - "P00 WARN: resumable backup 20191003-105320F_20191004-144000D of same type exists -- invalid files will be" - " removed then the backup will resume\n" - "P00 DETAIL: remove file '" TEST_PATH "/repo/backup/test1/20191003-105320F_20191004-144000D/pg_data/PG_VERSION.gz'" - " from resumed backup (reference in manifest)\n" - "P00 WARN: remove special file '" TEST_PATH "/repo/backup/test1/20191003-105320F_20191004-144000D/pg_data/pipe'" - " from resumed backup\n" - "P00 DETAIL: remove file '" TEST_PATH "/repo/backup/test1/20191003-105320F_20191004-144000D/pg_data/resume-ref.gz'" - " from resumed backup (reference in resumed manifest)\n" + "P00 WARN: resumable backup 20191003-105321F of same type exists -- invalid files will be removed then the backup" + " will resume\n" + "P00 WARN: remove special file '" TEST_PATH "/repo/backup/test1/20191003-105321F/pg_data/pipe' from resumed" + " backup\n" "P01 DETAIL: backup file " TEST_PATH "/pg1/global/pg_control (8KB, [PCT]) checksum [SHA1]\n" - "P01 DETAIL: match file from prior backup " TEST_PATH "/pg1/postgresql.conf (11B, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/postgresql.conf (11B, [PCT]) checksum [SHA1]\n" "P01 DETAIL: backup file " TEST_PATH "/pg1/time-mismatch2 (4B, [PCT]) checksum [SHA1]\n" "P00 WARN: resumed backup file pg_data/time-mismatch2 did not have expected checksum" " 984816fd329622876e14907634264e6f332e9fb3. The file was recopied and backup will continue but this may be an issue" @@ -2517,27 +2494,23 @@ testRun(void) " NOTE: this does not indicate a problem with the PostgreSQL page checksums.\n" "P01 DETAIL: skip file removed by database " TEST_PATH "/pg1/removed-during\n" "P01 DETAIL: backup file " TEST_PATH "/pg1/content-mismatch (4B, [PCT]) checksum [SHA1]\n" - "P01 DETAIL: match file from prior backup " TEST_PATH "/pg1/PG_VERSION (3B, [PCT]) checksum [SHA1]\n" - "P01 DETAIL: backup file " TEST_PATH "/pg1/resume-ref (0B, [PCT])\n" - "P00 DETAIL: hardlink pg_data/PG_VERSION to 20191003-105320F\n" - "P00 DETAIL: hardlink pg_data/postgresql.conf to 20191003-105320F\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/PG_VERSION (3B, [PCT]) checksum [SHA1]\n" "P00 INFO: execute exclusive backup stop and wait for all WAL segments to archive\n" "P00 INFO: backup stop archive = 0000000105D9759000000000, lsn = 5d97590/800000\n" "P00 INFO: check archive for segment(s) 0000000105D9759000000000:0000000105D9759000000000\n" - "P00 INFO: new backup label = 20191003-105320F_20191004-144000D\n" - "P00 INFO: diff backup size = [SIZE], file total = 7"); + "P00 INFO: new backup label = 20191003-105321F\n" + "P00 INFO: full backup size = [SIZE], file total = 6"); // Check repo directory TEST_RESULT_STR_Z( testBackupValidateP(storageRepo(), STRDEF(STORAGE_REPO_BACKUP "/latest")), - ".> {d=20191003-105320F_20191004-144000D}\n" + ".> {d=20191003-105321F}\n" "pg_data/PG_VERSION.gz {s=3, ts=-200000}\n" "pg_data/content-mismatch.gz {s=4}\n" "pg_data/global/pg_control.gz {s=8192}\n" "pg_data/pg_xlog/\n" "pg_data/postgresql.conf.gz {s=11, ts=-200000}\n" "pg_data/repo-size-mismatch.gz {s=4}\n" - "pg_data/resume-ref.gz {s=0}\n" "pg_data/time-mismatch2.gz {s=4, ts=+100}\n" "--------\n" "[backup:target]\n" @@ -2545,10 +2518,43 @@ testRun(void) "compare file list"); // Remove test files - HRN_STORAGE_REMOVE(storagePgWrite(), "resume-ref", .errorOnMissing = true); HRN_STORAGE_REMOVE(storagePgWrite(), "time-mismatch2", .errorOnMissing = true); HRN_STORAGE_REMOVE(storagePgWrite(), "content-mismatch", .errorOnMissing = true); HRN_STORAGE_REMOVE(storagePgWrite(), "repo-size-mismatch", .errorOnMissing = true); + + // Remove main manifest to make this backup look resumable + HRN_STORAGE_REMOVE(storageRepoWrite(), "backup/test1/20191003-105321F/backup.manifest"); + + // Save the resume manifest with diff type + manifestResumeData->backupType = backupTypeDiff; + + manifestSave( + manifestResume, + storageWriteIo( + storageNewWriteP( + storageRepoWrite(), + strNewFmt(STORAGE_REPO_BACKUP "/%s/" BACKUP_MANIFEST_FILE INFO_COPY_EXT, strZ(resumeLabel))))); + + // Back errors on backup type + hrnBackupPqScriptP(PG_VERSION_95, backupTimeStart); + TEST_RESULT_VOID(hrnCmdBackup(), "backup"); + + // Check log + TEST_RESULT_LOG( + "P00 WARN: backup '20191003-105321F' missing manifest removed from backup.info\n" + "P00 INFO: execute exclusive backup start: backup begins after the next regular checkpoint completes\n" + "P00 INFO: backup start archive = 0000000105D9759000000000, lsn = 5d97590/0\n" + "P00 INFO: check archive for prior segment 0000000105D9758F000000FF\n" + "P00 WARN: backup '20191003-105321F' cannot be resumed: new backup type 'full' does not match resumable backup" + " type 'diff'\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/global/pg_control (8KB, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/postgresql.conf (11B, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/PG_VERSION (3B, [PCT]) checksum [SHA1]\n" + "P00 INFO: execute exclusive backup stop and wait for all WAL segments to archive\n" + "P00 INFO: backup stop archive = 0000000105D9759000000000, lsn = 5d97590/800000\n" + "P00 INFO: check archive for segment(s) 0000000105D9759000000000:0000000105D9759000000000\n" + "P00 INFO: new backup label = 20191004-144000F\n" + "P00 INFO: full backup size = [SIZE], file total = 3"); } // ------------------------------------------------------------------------------------------------------------------------- @@ -3322,6 +3328,12 @@ testRun(void) backupTimeStart = BACKUP_EPOCH + 3000000; { + // Load the previous manifest and null out the checksum-page option to be sure it gets set to false in this backup + const String *manifestPriorFile = STRDEF(STORAGE_REPO_BACKUP "/20191103-165320F/" BACKUP_MANIFEST_FILE); + Manifest *manifestPrior = manifestNewLoad(storageReadIo(storageNewReadP(storageRepo(), manifestPriorFile))); + ((ManifestData *)manifestData(manifestPrior))->backupOptionChecksumPage = NULL; + manifestSave(manifestPrior, storageWriteIo(storageNewWriteP(storageRepoWrite(), manifestPriorFile))); + // Load options StringList *argList = strLstNew(); hrnCfgArgRawZ(argList, cfgOptStanza, "test1"); @@ -3556,10 +3568,10 @@ testRun(void) hrnCfgArgRaw(argList, cfgOptPgPath, pg1Path); hrnCfgArgRawZ(argList, cfgOptRepoRetentionFull, "1"); hrnCfgArgRawStrId(argList, cfgOptType, backupTypeDiff); + hrnCfgArgRawZ(argList, cfgOptCompressType, "bz2"); hrnCfgArgRawBool(argList, cfgOptRepoBundle, true); hrnCfgArgRawZ(argList, cfgOptRepoBundleLimit, "4MiB"); hrnCfgArgRawBool(argList, cfgOptRepoBlock, true); - hrnCfgArgRawBool(argList, cfgOptDelta, true); hrnCfgArgRawZ(argList, cfgOptRepoCipherType, "aes-256-cbc"); hrnCfgArgRawZ(argList, cfgOptRepoBlockAgeMap, "1=2"); hrnCfgArgRawZ(argList, cfgOptRepoBlockAgeMap, "2=0"); @@ -3574,7 +3586,7 @@ testRun(void) memset(bufPtr(file) + (BLOCK_MIN_SIZE * 2), 1, BLOCK_MIN_SIZE); bufUsedSet(file, bufSize(file)); - HRN_STORAGE_PUT(storagePgWrite(), "block-incr-grow", file, .timeModified = backupTimeStart); + HRN_STORAGE_PUT(storagePgWrite(), "block-incr-grow", file, .timeModified = backupTimeStart - 200000); // File with age multiplier file = bufNew(BLOCK_MIN_FILE_SIZE * 2); @@ -3601,15 +3613,18 @@ testRun(void) TEST_RESULT_LOG( "P00 INFO: last backup label = 20191108-080000F, version = " PROJECT_VERSION "\n" + "P00 WARN: diff backup cannot alter compress-type option to 'bz2', reset to value in 20191108-080000F\n" "P00 INFO: execute non-exclusive backup start: backup begins after the next regular checkpoint completes\n" "P00 INFO: backup start archive = 0000000105DC82D000000000, lsn = 5dc82d0/0\n" "P00 INFO: check archive for segment 0000000105DC82D000000000\n" + "P00 WARN: file 'block-incr-grow' has same timestamp (1573200000) as prior but different size (prior 24576," + " current 49152), enabling delta checksum\n" "P01 DETAIL: match file from prior backup " TEST_PATH "/pg1/PG_VERSION (2B, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/block-incr-grow (bundle 1/0, 48KB, [PCT]) checksum [SHA1]\n" "P01 DETAIL: match file from prior backup " TEST_PATH "/pg1/block-incr-wayback (16KB, [PCT]) checksum [SHA1]\n" - "P01 DETAIL: backup file " TEST_PATH "/pg1/block-age-to-zero (bundle 1/0, 16KB, [PCT]) checksum [SHA1]\n" - "P01 DETAIL: backup file " TEST_PATH "/pg1/block-age-multiplier (bundle 1/56, 32KB, [PCT]) checksum [SHA1]\n" - "P01 DETAIL: backup file " TEST_PATH "/pg1/global/pg_control (bundle 1/184, 8KB, [PCT]) checksum [SHA1]\n" - "P01 DETAIL: backup file " TEST_PATH "/pg1/block-incr-grow (bundle 1/288, 48KB, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/block-age-to-zero (bundle 1/128, 16KB, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/block-age-multiplier (bundle 1/184, 32KB, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/global/pg_control (bundle 1/312, 8KB, [PCT]) checksum [SHA1]\n" "P00 DETAIL: reference pg_data/PG_VERSION to 20191108-080000F\n" "P00 DETAIL: reference pg_data/block-incr-wayback to 20191108-080000F\n" "P00 INFO: execute non-exclusive backup stop and wait for all WAL segments to archive\n" @@ -3626,7 +3641,7 @@ testRun(void) ".> {d=20191108-080000F_20191110-153320D}\n" "bundle/1/pg_data/block-age-multiplier {s=32768, m=1:{0,1}, ts=-86400}\n" "bundle/1/pg_data/block-age-to-zero {s=16384, ts=-172800}\n" - "bundle/1/pg_data/block-incr-grow {s=49152, m=0:{0,1},1:{0,1,2,3}}\n" + "bundle/1/pg_data/block-incr-grow {s=49152, m=0:{0,1},1:{0,1,2,3}, ts=-200000}\n" "bundle/1/pg_data/global/pg_control {s=8192}\n" "pg_data/backup_label.gz {s=17, ts=+2}\n" "20191108-080000F/bundle/1/pg_data/PG_VERSION {s=2, ts=-600000}\n"