Try get page again when checksum is fail.

This commit is contained in:
stalkerg
2016-07-12 21:26:00 +03:00
parent 356ebd3728
commit a34152b4aa
+50 -1
View File
@@ -112,6 +112,7 @@ backup_data_file(const char *from_root, const char *to_root,
/* confirm server version */
check_server_version();
/*
* Read each page and write the page excluding hole. If it has been
* determined that the page can be copied safely, but no page map
@@ -129,9 +130,12 @@ backup_data_file(const char *from_root, const char *to_root,
XLogRecPtr page_lsn;
int upper_offset;
int upper_length;
int try_checksum = 100;
header.block = blknum;
while(try_checksum)
{
/*
* If an invalid data page was found, fallback to simple copy to ensure
* all pages in the file don't have BackupPageHeader.
@@ -146,12 +150,34 @@ backup_data_file(const char *from_root, const char *to_root,
return copy_file(from_root, to_root, file);
}
file->read_size += read_len;
/* if the page has not been modified since last backup, skip it */
if (lsn && !XLogRecPtrIsInvalid(page_lsn) && page_lsn < *lsn)
break;
try_checksum--;
if(current.checksum_version &&
pg_checksum_page(page.data, header.block) != ((PageHeader) page.data)->pd_checksum)
{
if (try_checksum)
{
elog(WARNING, "File: %s blknum %u have wrong checksum, try again", file->path, blknum);
fseek(in, -sizeof(page), SEEK_CUR);
fread(&page, 1, sizeof(page), in);
}
else
elog(ERROR, "File: %s blknum %u have wrong checksum.", file->path, blknum);
} else {
try_checksum = 0;
}
}
/* if the page has not been modified since last backup, skip it */
if (lsn && !XLogRecPtrIsInvalid(page_lsn) && page_lsn < *lsn)
continue;
file->read_size += read_len;
upper_offset = header.hole_offset + header.hole_length;
upper_length = BLCKSZ - upper_offset;
@@ -186,8 +212,11 @@ backup_data_file(const char *from_root, const char *to_root,
int upper_offset;
int upper_length;
int ret;
int try_checksum = 100;
offset = blknum * BLCKSZ;
while(try_checksum)
{
if (offset > 0)
{
ret = fseek(in, offset, SEEK_SET);
@@ -214,6 +243,26 @@ backup_data_file(const char *from_root, const char *to_root,
return copy_file(from_root, to_root, file);
}
/* if the page has not been modified since last backup, skip it */
if (lsn && !XLogRecPtrIsInvalid(page_lsn) && page_lsn < *lsn)
break;
try_checksum--;
if(current.checksum_version &&
pg_checksum_page(page.data, header.block) != ((PageHeader) page.data)->pd_checksum)
{
if (try_checksum)
elog(WARNING, "File: %s blknum %u have wrong checksum, try again", file->path, blknum);
else
elog(ERROR, "File: %s blknum %u have wrong checksum.", file->path, blknum);
}
else
{
try_checksum = 0;
}
}
/* if the page has not been modified since last backup, skip it */
if (lsn && !XLogRecPtrIsInvalid(page_lsn) && page_lsn < *lsn)
continue;