Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit a39511b

Browse files
committed
don't handle possible hole cut at restore
1 parent cd6dd02 commit a39511b

File tree

1 file changed

+12
-32
lines changed

1 file changed

+12
-32
lines changed

data.c

Lines changed: 12 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,10 @@
2222
typedef struct BackupPageHeader
2323
{
2424
BlockNumber block; /* block number */
25-
uint16 hole_offset; /* number of bytes before "hole" */
26-
uint16 hole_length; /* number of bytes in "hole" */
2725
} BackupPageHeader;
2826

2927
static bool
30-
parse_page(const DataPage *page,
31-
XLogRecPtr *lsn, uint16 *offset, uint16 *length)
28+
parse_page(const DataPage *page, XLogRecPtr *lsn)
3229
{
3330
const PageHeaderData *page_data = &page->page_data;
3431

@@ -43,13 +40,8 @@ parse_page(const DataPage *page,
4340
page_data->pd_upper <= page_data->pd_special &&
4441
page_data->pd_special <= BLCKSZ &&
4542
page_data->pd_special == MAXALIGN(page_data->pd_special))
46-
{
47-
*offset = page_data->pd_lower;
48-
*length = page_data->pd_upper - page_data->pd_lower;
4943
return true;
50-
}
5144

52-
*offset = *length = 0;
5345
return false;
5446
}
5547

@@ -87,8 +79,7 @@ backup_data_page(pgFile *file, const XLogRecPtr *lsn,
8779
* If an invalid data page was found, fallback to simple copy to ensure
8880
* all pages in the file don't have BackupPageHeader.
8981
*/
90-
if (!parse_page(&page, &page_lsn,
91-
&header.hole_offset, &header.hole_length))
82+
if (!parse_page(&page, &page_lsn))
9283
{
9384
int i;
9485
/* Check if the page is zeroed. */
@@ -467,50 +458,39 @@ restore_data_file(const char *from_root,
467458
if (read_len == 0 && feof(in))
468459
break; /* EOF found */
469460
else if (read_len != 0 && feof(in))
470-
{
471461
elog(ERROR,
472462
"odd size page found at block %u of \"%s\"",
473463
blknum, file->path);
474-
}
475464
else
476-
{
477465
elog(ERROR, "cannot read block %u of \"%s\": %s",
478466
blknum, file->path, strerror(errno_tmp));
479-
}
480467
}
481468

482-
if (header.block < blknum || header.hole_offset > BLCKSZ ||
483-
(int) header.hole_offset + (int) header.hole_length > BLCKSZ)
484-
{
469+
if (header.block < blknum)
485470
elog(ERROR, "backup is broken at block %u",
486471
blknum);
487-
}
488472

489-
upper_offset = header.hole_offset + header.hole_length;
490-
upper_length = BLCKSZ - upper_offset;
491473

492-
/* read lower/upper into page.data and restore hole */
493-
memset(page.data + header.hole_offset, 0, header.hole_length);
494-
495-
if (fread(page.data, 1, header.hole_offset, in) != header.hole_offset ||
496-
fread(page.data + upper_offset, 1, upper_length, in) != upper_length)
497-
{
474+
if (fread(page.data, 1, BLCKSZ, in) != BLCKSZ)
498475
elog(ERROR, "cannot read block %u of \"%s\": %s",
499476
blknum, file->path, strerror(errno));
500-
}
501477

502478
/* update checksum because we are not save whole */
503479
if(backup->checksum_version)
504480
{
505-
/* skip calc checksum if zero page */
481+
bool is_zero_page = false;
482+
506483
if(page.page_data.pd_upper == 0)
507484
{
508485
int i;
509-
for(i=0; i<BLCKSZ && page.data[i] == 0; i++);
486+
for(i = 0; i < BLCKSZ && page.data[i] == 0; i++);
510487
if (i == BLCKSZ)
511-
goto skip_checksum;
488+
is_zero_page = true;
512489
}
513-
((PageHeader) page.data)->pd_checksum = pg_checksum_page(page.data, file->segno * RELSEG_SIZE + header.block);
490+
491+
/* skip calc checksum if zero page */
492+
if (!is_zero_page)
493+
((PageHeader) page.data)->pd_checksum = pg_checksum_page(page.data, file->segno * RELSEG_SIZE + header.block);
514494
}
515495

516496
skip_checksum:

0 commit comments

Comments
 (0)