You've already forked pgbackrest
mirror of
https://github.com/pgbackrest/pgbackrest.git
synced 2025-07-03 00:26:59 +02:00
Improve validation of zero pages.
Checking that pd_upper == 0 is not enough since this field may be corrupted. Still use pd_upper as a quick check, but when it is zero proceed to check the rest of the page to ensure it is also all zeroes.
This commit is contained in:
@ -2797,12 +2797,14 @@ testRun(void)
|
||||
HRN_STORAGE_PUT(storagePgWrite(), PG_PATH_BASE "/1/2", relation, .timeModified = backupTimeStart);
|
||||
|
||||
// File with bad page checksums
|
||||
relation = bufNew(PG_PAGE_SIZE_DEFAULT * 4);
|
||||
relation = bufNew(PG_PAGE_SIZE_DEFAULT * 5);
|
||||
memset(bufPtr(relation), 0, bufSize(relation));
|
||||
*(PageHeaderData *)(bufPtr(relation) + (PG_PAGE_SIZE_DEFAULT * 0x00)) = (PageHeaderData){.pd_upper = 0xFF};
|
||||
*(PageHeaderData *)(bufPtr(relation) + (PG_PAGE_SIZE_DEFAULT * 0x01)) = (PageHeaderData){.pd_upper = 0x00};
|
||||
*(PageHeaderData *)(bufPtr(relation) + (PG_PAGE_SIZE_DEFAULT * 0x02)) = (PageHeaderData){.pd_upper = 0xFE};
|
||||
*(PageHeaderData *)(bufPtr(relation) + (PG_PAGE_SIZE_DEFAULT * 0x03)) = (PageHeaderData){.pd_upper = 0xEF};
|
||||
*(PageHeaderData *)(bufPtr(relation) + (PG_PAGE_SIZE_DEFAULT * 0x04)) = (PageHeaderData){.pd_upper = 0x00};
|
||||
(bufPtr(relation) + (PG_PAGE_SIZE_DEFAULT * 0x04))[PG_PAGE_SIZE_DEFAULT - 1] = 0xFF;
|
||||
bufUsedSet(relation, bufSize(relation));
|
||||
|
||||
HRN_STORAGE_PUT(storagePgWrite(), PG_PATH_BASE "/1/3", relation, .timeModified = backupTimeStart);
|
||||
@ -2850,8 +2852,8 @@ testRun(void)
|
||||
"P00 INFO: execute non-exclusive pg_start_backup(): backup begins after the next regular checkpoint completes\n"
|
||||
"P00 INFO: backup start archive = 0000000105DB5DE000000000, lsn = 5db5de0/0\n"
|
||||
"P00 INFO: check archive for segment 0000000105DB5DE000000000\n"
|
||||
"P01 DETAIL: backup file " TEST_PATH "/pg1/base/1/3 (32KB, [PCT]) checksum [SHA1]\n"
|
||||
"P00 WARN: invalid page checksums found in file " TEST_PATH "/pg1/base/1/3 at pages 0, 2-3\n"
|
||||
"P01 DETAIL: backup file " TEST_PATH "/pg1/base/1/3 (40KB, [PCT]) checksum [SHA1]\n"
|
||||
"P00 WARN: invalid page checksums found in file " TEST_PATH "/pg1/base/1/3 at pages 0, 2-4\n"
|
||||
"P01 DETAIL: backup file " TEST_PATH "/pg1/base/1/4 (24KB, [PCT]) checksum [SHA1]\n"
|
||||
"P00 WARN: invalid page checksum found in file " TEST_PATH "/pg1/base/1/4 at page 1\n"
|
||||
"P01 DETAIL: backup file " TEST_PATH "/pg1/base/1/2 (8.5KB, [PCT]) checksum [SHA1]\n"
|
||||
@ -2883,7 +2885,7 @@ testRun(void)
|
||||
"pg_data/base/1 {path}\n"
|
||||
"pg_data/base/1/1.gz {file, s=8192}\n"
|
||||
"pg_data/base/1/2.gz {file, s=8704}\n"
|
||||
"pg_data/base/1/3.gz {file, s=32768}\n"
|
||||
"pg_data/base/1/3.gz {file, s=40960}\n"
|
||||
"pg_data/base/1/4.gz {file, s=24576}\n"
|
||||
"pg_data/global {path}\n"
|
||||
"pg_data/global/pg_control.gz {file, s=8192}\n"
|
||||
@ -2914,8 +2916,8 @@ testRun(void)
|
||||
",\"size\":8192,\"timestamp\":1572200000}\n"
|
||||
"pg_data/base/1/2={\"checksum\":\"2deafa7ae60279a54a09422b985a8025f5e125fb\",\"checksum-page\":false"
|
||||
",\"size\":8704,\"timestamp\":1572200000}\n"
|
||||
"pg_data/base/1/3={\"checksum\":\"%s\",\"checksum-page\":false,\"checksum-page-error\":[0,[2,3]]"
|
||||
",\"size\":32768,\"timestamp\":1572200000}\n"
|
||||
"pg_data/base/1/3={\"checksum\":\"%s\",\"checksum-page\":false,\"checksum-page-error\":[0,[2,4]]"
|
||||
",\"size\":40960,\"timestamp\":1572200000}\n"
|
||||
"pg_data/base/1/4={\"checksum\":\"%s\",\"checksum-page\":false,\"checksum-page-error\":[1],\"size\":24576"
|
||||
",\"timestamp\":1572200000}\n"
|
||||
"pg_data/global/pg_control={\"size\":8192,\"timestamp\":1572200000}\n"
|
||||
|
Reference in New Issue
Block a user