diff --git a/doc/xml/release/2024/2.51.xml b/doc/xml/release/2024/2.51.xml index 54008ab64..aec87a6ae 100644 --- a/doc/xml/release/2024/2.51.xml +++ b/doc/xml/release/2024/2.51.xml @@ -108,6 +108,17 @@

Limit resume functionality to full backups.

+ + + + + + + + +

Update resume functionality for block incremental.

+
+ diff --git a/src/command/backup/backup.c b/src/command/backup/backup.c index 43cc93bc3..74ae29c58 100644 --- a/src/command/backup/backup.c +++ b/src/command/backup/backup.c @@ -774,10 +774,16 @@ backupResumeClean( if (fileCompressType != compressTypeNone) manifestName = compressExtStrip(manifestName, fileCompressType); + // If the file is block incremental then strip off the extension before doing the lookup + const bool blockIncr = strEndsWithZ(manifestName, BACKUP_BLOCK_INCR_EXT); + + if (blockIncr) + manifestName = strSubN(manifestName, 0, strSize(manifestName) - (sizeof(BACKUP_BLOCK_INCR_EXT) - 1)); + // Check if the file can be resumed or must be removed const char *removeReason = NULL; - if (fileCompressType != compressType) + if (fileCompressType != compressType && !blockIncr) removeReason = "mismatched compression type"; else if (!manifestFileExists(manifest, manifestName)) removeReason = "missing in manifest"; @@ -811,6 +817,9 @@ backupResumeClean( file.sizeRepo = fileResume.sizeRepo; file.checksumSha1 = fileResume.checksumSha1; file.checksumRepoSha1 = fileResume.checksumRepoSha1; + file.blockIncrSize = fileResume.blockIncrSize; + file.blockIncrChecksumSize = fileResume.blockIncrChecksumSize; + file.blockIncrMapSize = fileResume.blockIncrMapSize; file.checksumPage = fileResume.checksumPage; file.checksumPageError = fileResume.checksumPageError; file.checksumPageErrorList = fileResume.checksumPageErrorList; @@ -2022,7 +2031,7 @@ backupJobCallback(void *const data, const unsigned int clientIdx) pckWriteU64P(param, file.blockIncrChecksumSize); pckWriteU64P(param, jobData->blockIncrSizeSuper); - if (file.blockIncrMapSize != 0) + if (file.blockIncrMapSize != 0 && !file.resume) { pckWriteStrP( param, diff --git a/test/src/module/command/backupTest.c b/test/src/module/command/backupTest.c index 017c51445..41d8c7b33 100644 --- a/test/src/module/command/backupTest.c +++ b/test/src/module/command/backupTest.c @@ -3222,6 +3222,98 @@ testRun(void) HRN_STORAGE_PUT(storagePgWrite(), "block-incr-grow", file, .timeModified = backupTimeStart); + // File that uses block incr and will not be resumed + file = bufNew(BLOCK_MIN_SIZE * 3); + memset(bufPtr(file), 0, bufSize(file)); + bufUsedSet(file, bufSize(file)); + + HRN_STORAGE_PUT(storagePgWrite(), "block-incr-no-resume", file, .timeModified = backupTimeStart); + + // Error when pg_control is missing after backup start + HRN_BACKUP_SCRIPT_SET( + {.op = hrnBackupScriptOpRemove, .file = storagePathP(storagePg(), STRDEF("global/pg_control"))}); + hrnBackupPqScriptP( + PG_VERSION_11, backupTimeStart, .walCompressType = compressTypeGz, .walTotal = 2, .walSwitch = true, + .errorAfterCopyStart = true); + TEST_ERROR( + hrnCmdBackup(), FileMissingError, + "raised from local-1 shim protocol: unable to open missing file '" TEST_PATH "/pg1/global/pg_control' for read"); + + TEST_RESULT_LOG( + "P00 INFO: execute non-exclusive backup start: backup begins after the next regular checkpoint completes\n" + "P00 INFO: backup start archive = 0000000105DBF06000000000, lsn = 5dbf060/0\n" + "P00 INFO: check archive for segment 0000000105DBF06000000000\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/block-incr-no-resume (24KB, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/block-incr-grow (24KB, [PCT]) checksum [SHA1]"); + + HRN_PG_CONTROL_PUT(storagePgWrite(), PG_VERSION_11, .pageChecksumVersion = 0, .walSegmentSize = 2 * 1024 * 1024); + + // Run backup + hrnBackupPqScriptP(PG_VERSION_11, backupTimeStart, .walCompressType = compressTypeGz, .walTotal = 2, .walSwitch = true); + TEST_RESULT_VOID(hrnCmdBackup(), "backup"); + + TEST_RESULT_LOG( + "P00 INFO: execute non-exclusive backup start: backup begins after the next regular checkpoint completes\n" + "P00 INFO: backup start archive = 0000000105DBF06000000000, lsn = 5dbf060/0\n" + "P00 INFO: check archive for segment 0000000105DBF06000000000\n" + "P00 INFO: backup '20191103-165320F' cannot be resumed: partially deleted by prior resume or invalid\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/block-incr-no-resume (24KB, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/block-incr-grow (24KB, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/global/pg_control (bundle 1/0, 8KB, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/PG_VERSION (bundle 1/8192, 2B, [PCT]) checksum [SHA1]\n" + "P00 INFO: execute non-exclusive backup stop and wait for all WAL segments to archive\n" + "P00 INFO: backup stop archive = 0000000105DBF06000000001, lsn = 5dbf060/300000\n" + "P00 DETAIL: wrote 'backup_label' file returned from backup stop function\n" + "P00 INFO: check archive for segment(s) 0000000105DBF06000000000:0000000105DBF06000000001\n" + "P00 INFO: new backup label = 20191103-165320F\n" + "P00 INFO: full backup size = [SIZE], file total = 5"); + + TEST_RESULT_STR_Z( + testBackupValidateP(storageRepo(), STRDEF(STORAGE_REPO_BACKUP "/latest")), + ".> {d=20191103-165320F}\n" + "bundle/1/pg_data/PG_VERSION {s=2}\n" + "bundle/1/pg_data/global/pg_control {s=8192}\n" + "pg_data/backup_label {s=17, ts=+2}\n" + "pg_data/block-incr-grow.pgbi {s=24576, m=0:{0,1,2}}\n" + "pg_data/block-incr-no-resume.pgbi {s=24576, m=0:{0,1,2}}\n" + "--------\n" + "[backup:target]\n" + "pg_data={\"path\":\"" TEST_PATH "/pg1\",\"type\":\"path\"}\n", + "compare file list"); + } + + // ------------------------------------------------------------------------------------------------------------------------- + TEST_TITLE("online 11 full backup with block incr resume"); + + backupTimeStart = BACKUP_EPOCH + 2900000; + + { + // Load options + StringList *argList = strLstNew(); + hrnCfgArgRawZ(argList, cfgOptStanza, "test1"); + hrnCfgArgRaw(argList, cfgOptRepoPath, repoPath); + hrnCfgArgRaw(argList, cfgOptPgPath, pg1Path); + hrnCfgArgRawZ(argList, cfgOptRepoRetentionFull, "1"); + hrnCfgArgRawStrId(argList, cfgOptType, backupTypeFull); + hrnCfgArgRawZ(argList, cfgOptCompressType, "none"); + hrnCfgArgRawBool(argList, cfgOptRepoBundle, true); + hrnCfgArgRawZ(argList, cfgOptRepoBundleLimit, "23kB"); + hrnCfgArgRawBool(argList, cfgOptRepoBlock, true); + hrnCfgArgRawZ(argList, cfgOptRepoBlockSizeMap, STRINGIFY(BLOCK_MAX_FILE_SIZE) "b=" STRINGIFY(BLOCK_MAX_SIZE) "b"); + hrnCfgArgRawZ(argList, cfgOptRepoBlockSizeMap, STRINGIFY(BLOCK_MIN_FILE_SIZE) "=" STRINGIFY(BLOCK_MIN_SIZE)); + hrnCfgArgRawZ(argList, cfgOptRepoBlockSizeMap, STRINGIFY(BLOCK_MID_FILE_SIZE) "=" STRINGIFY(BLOCK_MID_SIZE)); + HRN_CFG_LOAD(cfgCmdBackup, argList); + + // Make this backup look resumable + HRN_STORAGE_REMOVE(storageTest, "repo/backup/test1/20191103-165320F/backup.manifest"); + + // Corrupt file that uses block incr and will not be resumed + Buffer *file = bufNew(BLOCK_MIN_SIZE * 3); + memset(bufPtr(file), 99, bufSize(file)); + bufUsedSet(file, bufSize(file)); + + HRN_STORAGE_PUT(storageRepoWrite(), "backup/test1/20191103-165320F/pg_data/block-incr-no-resume.pgbi", file); + // File that shrinks below the limit where it would get block incremental if it were new file = bufNew(BLOCK_MIN_FILE_SIZE + 1); memset(bufPtr(file), 55, bufSize(file)); @@ -3260,53 +3352,45 @@ testRun(void) HRN_STORAGE_PUT(storagePgWrite(), "grow-to-block-incr", file, .timeModified = backupTimeStart); - // Error when pg_control is missing after backup start - HRN_BACKUP_SCRIPT_SET( - {.op = hrnBackupScriptOpRemove, .file = storagePathP(storagePg(), STRDEF("global/pg_control"))}); - hrnBackupPqScriptP( - PG_VERSION_11, backupTimeStart, .walCompressType = compressTypeGz, .walTotal = 2, .walSwitch = true, - .errorAfterCopyStart = true); - TEST_ERROR( - hrnCmdBackup(), FileMissingError, - "raised from local-1 shim protocol: unable to open missing file '" TEST_PATH "/pg1/global/pg_control' for read"); - - TEST_RESULT_LOG( - "P00 INFO: execute non-exclusive backup start: backup begins after the next regular checkpoint completes\n" - "P00 INFO: backup start archive = 0000000105DBF06000000000, lsn = 5dbf060/0\n" - "P00 INFO: check archive for segment 0000000105DBF06000000000\n" - "P01 DETAIL: backup file " TEST_PATH "/pg1/block-incr-grow (24KB, [PCT]) checksum [SHA1]"); - - HRN_PG_CONTROL_PUT(storagePgWrite(), PG_VERSION_11, .walSegmentSize = 2 * 1024 * 1024); - // Run backup hrnBackupPqScriptP(PG_VERSION_11, backupTimeStart, .walCompressType = compressTypeGz, .walTotal = 2, .walSwitch = true); TEST_RESULT_VOID(hrnCmdBackup(), "backup"); TEST_RESULT_LOG( + "P00 WARN: backup '20191103-165320F' missing manifest removed from backup.info\n" "P00 INFO: execute non-exclusive backup start: backup begins after the next regular checkpoint completes\n" - "P00 INFO: backup start archive = 0000000105DBF06000000000, lsn = 5dbf060/0\n" - "P00 INFO: check archive for segment 0000000105DBF06000000000\n" - "P00 INFO: backup '20191103-165320F' cannot be resumed: partially deleted by prior resume or invalid\n" - "P01 DETAIL: backup file " TEST_PATH "/pg1/block-incr-grow (24KB, [PCT]) checksum [SHA1]\n" - "P01 DETAIL: backup file " TEST_PATH "/pg1/normal-same (bundle 1/0, 4B, [PCT]) checksum [SHA1]\n" - "P01 DETAIL: backup file " TEST_PATH "/pg1/grow-to-block-incr (bundle 1/4, 16.0KB, [PCT]) checksum [SHA1]\n" - "P01 DETAIL: backup file " TEST_PATH "/pg1/global/pg_control (bundle 1/16387, 8KB, [PCT]) checksum [SHA1]\n" - "P01 DETAIL: backup file " TEST_PATH "/pg1/block-incr-shrink-block (bundle 1/24579, 16KB, [PCT]) checksum [SHA1]\n" - "P01 DETAIL: backup file " TEST_PATH "/pg1/block-incr-shrink-below (bundle 1/40985, 16KB, [PCT]) checksum [SHA1]\n" - "P01 DETAIL: backup file " TEST_PATH "/pg1/block-incr-shrink (bundle 1/57391, 16KB, [PCT]) checksum [SHA1]\n" - "P01 DETAIL: backup file " TEST_PATH "/pg1/block-incr-same (bundle 1/73805, 16KB, [PCT]) checksum [SHA1]\n" - "P01 DETAIL: backup file " TEST_PATH "/pg1/PG_VERSION (bundle 1/90211, 2B, [PCT]) checksum [SHA1]\n" + "P00 INFO: backup start archive = 0000000105DC08C000000000, lsn = 5dc08c0/0\n" + "P00 INFO: check archive for segment 0000000105DC08C000000000\n" + "P00 WARN: resumable backup 20191103-165320F of same type exists -- invalid files will be removed then the backup" + " will resume\n" + "P00 DETAIL: remove path '" TEST_PATH "/repo/backup/test1/20191103-165320F/bundle' from resumed backup\n" + "P00 DETAIL: remove file '" TEST_PATH "/repo/backup/test1/20191103-165320F/pg_data/backup_label' from resumed" + " backup (missing in manifest)\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/block-incr-no-resume (24KB, [PCT]) checksum [SHA1]\n" + "P00 WARN: resumed backup file pg_data/block-incr-no-resume did not have expected checksum" + " ebdd38b69cd5b9f2d00d273c981e16960fbbb4f7. The file was recopied and backup will continue but this may be an issue" + " unless the resumed backup path in the repository is known to be corrupted.\n" + " NOTE: this does not indicate a problem with the PostgreSQL page checksums.\n" + "P01 DETAIL: checksum resumed file " TEST_PATH "/pg1/block-incr-grow (24KB, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/PG_VERSION (bundle 1/0, 2B, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/normal-same (bundle 1/2, 4B, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/grow-to-block-incr (bundle 1/6, 16.0KB, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/global/pg_control (bundle 1/16389, 8KB, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/block-incr-shrink-block (bundle 1/24581, 16KB, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/block-incr-shrink-below (bundle 1/40987, 16KB, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/block-incr-shrink (bundle 1/57393, 16KB, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/block-incr-same (bundle 1/73807, 16KB, [PCT]) checksum [SHA1]\n" "P00 INFO: execute non-exclusive backup stop and wait for all WAL segments to archive\n" - "P00 INFO: backup stop archive = 0000000105DBF06000000001, lsn = 5dbf060/300000\n" + "P00 INFO: backup stop archive = 0000000105DC08C000000001, lsn = 5dc08c0/300000\n" "P00 DETAIL: wrote 'backup_label' file returned from backup stop function\n" - "P00 INFO: check archive for segment(s) 0000000105DBF06000000000:0000000105DBF06000000001\n" + "P00 INFO: check archive for segment(s) 0000000105DC08C000000000:0000000105DC08C000000001\n" "P00 INFO: new backup label = 20191103-165320F\n" - "P00 INFO: full backup size = [SIZE], file total = 10"); + "P00 INFO: full backup size = [SIZE], file total = 11"); TEST_RESULT_STR_Z( testBackupValidateP(storageRepo(), STRDEF(STORAGE_REPO_BACKUP "/latest")), ".> {d=20191103-165320F}\n" - "bundle/1/pg_data/PG_VERSION {s=2}\n" + "bundle/1/pg_data/PG_VERSION {s=2, ts=-100000}\n" "bundle/1/pg_data/block-incr-same {s=16384, m=0:{0,1}}\n" "bundle/1/pg_data/block-incr-shrink {s=16385, m=0:{0,1,2}}\n" "bundle/1/pg_data/block-incr-shrink-below {s=16384, m=0:{0,1}}\n" @@ -3315,11 +3399,14 @@ testRun(void) "bundle/1/pg_data/grow-to-block-incr {s=16383}\n" "bundle/1/pg_data/normal-same {s=4}\n" "pg_data/backup_label {s=17, ts=+2}\n" - "pg_data/block-incr-grow.pgbi {s=24576, m=0:{0,1,2}}\n" + "pg_data/block-incr-grow.pgbi {s=24576, m=0:{0,1,2}, ts=-100000}\n" + "pg_data/block-incr-no-resume.pgbi {s=24576, m=0:{0,1,2}, ts=-100000}\n" "--------\n" "[backup:target]\n" "pg_data={\"path\":\"" TEST_PATH "/pg1\",\"type\":\"path\"}\n", "compare file list"); + + HRN_STORAGE_REMOVE(storagePgWrite(), "block-incr-no-resume"); } // ------------------------------------------------------------------------------------------------------------------------- @@ -3511,12 +3598,12 @@ testRun(void) HRN_STORAGE_PUT(storagePgWrite(), "block-incr-grow", file, .timeModified = backupTimeStart); - // File that will later have a timestamp far enough in the past to make the block size zero - file = bufNew((size_t)(BLOCK_MIN_FILE_SIZE)); + // File that uses block incr and will not be resumed + file = bufNew((size_t)(BLOCK_MIN_FILE_SIZE * 1.5)); memset(bufPtr(file), 0, bufSize(file)); bufUsedSet(file, bufSize(file)); - HRN_STORAGE_PUT(storagePgWrite(), "block-incr-wayback", file, .timeModified = backupTimeStart); + HRN_STORAGE_PUT(storagePgWrite(), "block-incr-no-resume", file, .timeModified = backupTimeStart); // Run backup hrnBackupPqScriptP( @@ -3528,8 +3615,8 @@ testRun(void) "P00 INFO: execute non-exclusive backup start: backup begins after the next regular checkpoint completes\n" "P00 INFO: backup start archive = 0000000105DC520000000000, lsn = 5dc5200/0\n" "P00 INFO: check archive for segment 0000000105DC520000000000\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/block-incr-no-resume (24KB, [PCT]) checksum [SHA1]\n" "P01 DETAIL: backup file " TEST_PATH "/pg1/block-incr-grow (24KB, [PCT]) checksum [SHA1]\n" - "P01 DETAIL: backup file " TEST_PATH "/pg1/block-incr-wayback (16KB, [PCT]) checksum [SHA1]\n" "P01 DETAIL: backup file " TEST_PATH "/pg1/PG_VERSION (bundle 1/0, 2B, [PCT]) checksum [SHA1]\n" "P01 DETAIL: backup file " TEST_PATH "/pg1/global/pg_control (bundle 1/24, 8KB, [PCT]) checksum [SHA1]\n" "P00 INFO: execute non-exclusive backup stop and wait for all WAL segments to archive\n" @@ -3548,11 +3635,100 @@ testRun(void) "bundle/1/pg_data/global/pg_control {s=8192}\n" "pg_data/backup_label.gz {s=17, ts=+2}\n" "pg_data/block-incr-grow.pgbi {s=24576, m=0:{0,1,2}}\n" + "pg_data/block-incr-no-resume.pgbi {s=24576, m=0:{0,1,2}}\n" + "--------\n" + "[backup:target]\n" + "pg_data={\"path\":\"" TEST_PATH "/pg1\",\"type\":\"path\"}\n", + "compare file list"); + } + + // ------------------------------------------------------------------------------------------------------------------------- + TEST_TITLE("online 11 full backup with comp/enc resume"); + + backupTimeStart = BACKUP_EPOCH + 3300000; + + { + // Load options + StringList *argList = strLstNew(); + hrnCfgArgRawZ(argList, cfgOptStanza, "test1"); + hrnCfgArgRaw(argList, cfgOptRepoPath, repoPath); + hrnCfgArgRaw(argList, cfgOptPgPath, pg1Path); + hrnCfgArgRawZ(argList, cfgOptRepoRetentionFull, "1"); + hrnCfgArgRawStrId(argList, cfgOptType, backupTypeFull); + hrnCfgArgRawBool(argList, cfgOptDelta, true); + hrnCfgArgRawBool(argList, cfgOptRepoBundle, true); + hrnCfgArgRawZ(argList, cfgOptRepoBundleLimit, "8KiB"); + hrnCfgArgRawBool(argList, cfgOptRepoBlock, true); + hrnCfgArgRawZ(argList, cfgOptRepoBlockSizeMap, STRINGIFY(BLOCK_MAX_FILE_SIZE) "=" STRINGIFY(BLOCK_MAX_SIZE)); + hrnCfgArgRawZ(argList, cfgOptRepoBlockSizeMap, STRINGIFY(BLOCK_MIN_FILE_SIZE) "=" STRINGIFY(BLOCK_MIN_SIZE)); + hrnCfgArgRawZ(argList, cfgOptRepoBlockSizeMap, STRINGIFY(BLOCK_MID_FILE_SIZE) "=" STRINGIFY(BLOCK_MID_SIZE)); + hrnCfgArgRawZ(argList, cfgOptBufferSize, "16KiB"); + hrnCfgArgRawZ(argList, cfgOptRepoCipherType, "aes-256-cbc"); + hrnCfgEnvRawZ(cfgOptRepoCipherPass, TEST_CIPHER_PASS); + HRN_CFG_LOAD(cfgCmdBackup, argList); + + // Make this backup look resumable + HRN_STORAGE_REMOVE(storageTest, "repo/backup/test1/20191108-080000F/backup.manifest"); + + // File that will later have a timestamp far enough in the past to make the block size zero + Buffer *file = bufNew((size_t)(BLOCK_MIN_FILE_SIZE)); + memset(bufPtr(file), 0, bufSize(file)); + bufUsedSet(file, bufSize(file)); + + HRN_STORAGE_PUT(storagePgWrite(), "block-incr-wayback", file, .timeModified = backupTimeStart); + + // Modify file that uses block incr and will not be resumed so it is caught by delta + file = bufNew((size_t)(BLOCK_MIN_FILE_SIZE * 1.5)); + memset(bufPtr(file), 0xFE, bufSize(file)); + bufUsedSet(file, bufSize(file)); + + HRN_STORAGE_PUT(storagePgWrite(), "block-incr-no-resume", file, .timeModified = backupTimeStart - 100000); + + // Run backup + hrnBackupPqScriptP( + PG_VERSION_11, backupTimeStart, .walCompressType = compressTypeNone, .cipherType = cipherTypeAes256Cbc, + .cipherPass = TEST_CIPHER_PASS, .walTotal = 2, .walSwitch = true); + TEST_RESULT_VOID(hrnCmdBackup(), "backup"); + + TEST_RESULT_LOG( + "P00 WARN: backup '20191108-080000F' missing manifest removed from backup.info\n" + "P00 INFO: execute non-exclusive backup start: backup begins after the next regular checkpoint completes\n" + "P00 INFO: backup start archive = 0000000105DC6A7000000000, lsn = 5dc6a70/0\n" + "P00 INFO: check archive for segment 0000000105DC6A7000000000\n" + "P00 WARN: resumable backup 20191108-080000F of same type exists -- invalid files will be removed then the backup" + " will resume\n" + "P00 DETAIL: remove path '" TEST_PATH "/repo/backup/test1/20191108-080000F/bundle' from resumed backup\n" + "P00 DETAIL: remove file '" TEST_PATH "/repo/backup/test1/20191108-080000F/pg_data/backup_label.gz' from resumed" + " backup (missing in manifest)\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/block-incr-no-resume (24KB, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: checksum resumed file " TEST_PATH "/pg1/block-incr-grow (24KB, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/block-incr-wayback (16KB, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/PG_VERSION (bundle 1/0, 2B, [PCT]) checksum [SHA1]\n" + "P01 DETAIL: backup file " TEST_PATH "/pg1/global/pg_control (bundle 1/24, 8KB, [PCT]) checksum [SHA1]\n" + "P00 INFO: execute non-exclusive backup stop and wait for all WAL segments to archive\n" + "P00 INFO: backup stop archive = 0000000105DC6A7000000001, lsn = 5dc6a70/300000\n" + "P00 DETAIL: wrote 'backup_label' file returned from backup stop function\n" + "P00 INFO: check archive for segment(s) 0000000105DC6A7000000000:0000000105DC6A7000000001\n" + "P00 INFO: new backup label = 20191108-080000F\n" + "P00 INFO: full backup size = [SIZE], file total = 6"); + + TEST_RESULT_STR_Z( + testBackupValidateP( + storageRepo(), STRDEF(STORAGE_REPO_BACKUP "/latest"), .cipherType = cipherTypeAes256Cbc, + .cipherPass = TEST_CIPHER_PASS), + ".> {d=20191108-080000F}\n" + "bundle/1/pg_data/PG_VERSION {s=2, ts=-500000}\n" + "bundle/1/pg_data/global/pg_control {s=8192}\n" + "pg_data/backup_label.gz {s=17, ts=+2}\n" + "pg_data/block-incr-grow.pgbi {s=24576, m=0:{0,1,2}, ts=-100000}\n" + "pg_data/block-incr-no-resume.pgbi {s=24576, m=0:{0,1,2}, ts=-100000}\n" "pg_data/block-incr-wayback.pgbi {s=16384, m=0:{0,1}}\n" "--------\n" "[backup:target]\n" "pg_data={\"path\":\"" TEST_PATH "/pg1\",\"type\":\"path\"}\n", "compare file list"); + + HRN_STORAGE_REMOVE(storagePgWrite(), "block-incr-no-resume"); } // -------------------------------------------------------------------------------------------------------------------------