22
22
typedef struct BackupPageHeader
23
23
{
24
24
BlockNumber block ; /* block number */
25
- uint16 hole_offset ; /* number of bytes before "hole" */
26
- uint16 hole_length ; /* number of bytes in "hole" */
27
25
} BackupPageHeader ;
28
26
29
27
static bool
30
- parse_page (const DataPage * page ,
31
- XLogRecPtr * lsn , uint16 * offset , uint16 * length )
28
+ parse_page (const DataPage * page , XLogRecPtr * lsn )
32
29
{
33
30
const PageHeaderData * page_data = & page -> page_data ;
34
31
@@ -43,13 +40,8 @@ parse_page(const DataPage *page,
43
40
page_data -> pd_upper <= page_data -> pd_special &&
44
41
page_data -> pd_special <= BLCKSZ &&
45
42
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 ;
49
43
return true;
50
- }
51
44
52
- * offset = * length = 0 ;
53
45
return false;
54
46
}
55
47
@@ -87,8 +79,7 @@ backup_data_page(pgFile *file, const XLogRecPtr *lsn,
87
79
* If an invalid data page was found, fallback to simple copy to ensure
88
80
* all pages in the file don't have BackupPageHeader.
89
81
*/
90
- if (!parse_page (& page , & page_lsn ,
91
- & header .hole_offset , & header .hole_length ))
82
+ if (!parse_page (& page , & page_lsn ))
92
83
{
93
84
int i ;
94
85
/* Check if the page is zeroed. */
@@ -467,50 +458,39 @@ restore_data_file(const char *from_root,
467
458
if (read_len == 0 && feof (in ))
468
459
break ; /* EOF found */
469
460
else if (read_len != 0 && feof (in ))
470
- {
471
461
elog (ERROR ,
472
462
"odd size page found at block %u of \"%s\"" ,
473
463
blknum , file -> path );
474
- }
475
464
else
476
- {
477
465
elog (ERROR , "cannot read block %u of \"%s\": %s" ,
478
466
blknum , file -> path , strerror (errno_tmp ));
479
- }
480
467
}
481
468
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 )
485
470
elog (ERROR , "backup is broken at block %u" ,
486
471
blknum );
487
- }
488
472
489
- upper_offset = header .hole_offset + header .hole_length ;
490
- upper_length = BLCKSZ - upper_offset ;
491
473
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 )
498
475
elog (ERROR , "cannot read block %u of \"%s\": %s" ,
499
476
blknum , file -> path , strerror (errno ));
500
- }
501
477
502
478
/* update checksum because we are not save whole */
503
479
if (backup -> checksum_version )
504
480
{
505
- /* skip calc checksum if zero page */
481
+ bool is_zero_page = false;
482
+
506
483
if (page .page_data .pd_upper == 0 )
507
484
{
508
485
int i ;
509
- for (i = 0 ; i < BLCKSZ && page .data [i ] == 0 ; i ++ );
486
+ for (i = 0 ; i < BLCKSZ && page .data [i ] == 0 ; i ++ );
510
487
if (i == BLCKSZ )
511
- goto skip_checksum ;
488
+ is_zero_page = true ;
512
489
}
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 );
514
494
}
515
495
516
496
skip_checksum :
0 commit comments