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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy