@@ -121,19 +121,21 @@ static void
121121backup_data_page (pgFile * file , XLogRecPtr prev_backup_start_lsn ,
122122 BlockNumber blknum , BlockNumber nblocks ,
123123 FILE * in , FILE * out ,
124- pg_crc32 * crc , int * n_skipped )
124+ pg_crc32 * crc , int * n_skipped ,
125+ BackupMode backup_mode )
125126{
126127 BackupPageHeader header ;
127128 off_t offset ;
128129 DataPage page ; /* used as read buffer */
130+ DataPage * page_ptr = & page ; /* used as read buffer */
129131 DataPage compressed_page ; /* used as read buffer */
130132 size_t write_buffer_size ;
131133 /* maximum size of write buffer */
132134 char write_buffer [BLCKSZ + sizeof (header )];
133135 size_t read_len = 0 ;
134136 XLogRecPtr page_lsn ;
135137 int try_checksum = 100 ;
136-
138+ bool page_is_invalid = true;
137139 header .block = blknum ;
138140 offset = blknum * BLCKSZ ;
139141
@@ -156,6 +158,7 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
156158 {
157159 elog (LOG , "File %s, block %u, file was truncated" ,
158160 file -> path , blknum );
161+ page_is_invalid = false;
159162 return ;
160163 }
161164 else if (try_checksum )
@@ -187,6 +190,7 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
187190 if (i == BLCKSZ )
188191 {
189192 elog (LOG , "File: %s blknum %u, empty page" , file -> path , blknum );
193+ page_is_invalid = false;
190194 break ;
191195 }
192196
@@ -238,10 +242,24 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
238242 file -> path , blknum );
239243 }
240244 else
245+ {
246+ page_is_invalid = false;
241247 break ; /* page header and checksum are correct */
248+ }
242249 }
243250 else
251+ {
252+ page_is_invalid = false;
244253 break ; /* page header is correct and checksum check is disabled */
254+ }
255+ }
256+
257+
258+ if (page_is_invalid ||
259+ (backup_mode == BACKUP_MODE_DIFF_PTRACK ))
260+ {
261+ size_t page_size = 0 ;
262+ page_ptr = pg_ptrack_get_block (file -> relOid , blknum , & page_size );
245263 }
246264
247265 file -> read_size += read_len ;
@@ -388,7 +406,8 @@ backup_data_file(const char *from_root, const char *to_root,
388406 for (blknum = 0 ; blknum < nblocks ; blknum ++ )
389407 {
390408 backup_data_page (file , prev_backup_start_lsn , blknum ,
391- nblocks , in , out , & (file -> crc ), & n_blocks_skipped );
409+ nblocks , in , out , & (file -> crc ),
410+ & n_blocks_skipped , backup_mode );
392411 n_blocks_read ++ ;
393412 }
394413 }
@@ -400,7 +419,8 @@ backup_data_file(const char *from_root, const char *to_root,
400419 while (datapagemap_next (iter , & blknum ))
401420 {
402421 backup_data_page (file , prev_backup_start_lsn , blknum ,
403- nblocks , in , out , & (file -> crc ), & n_blocks_skipped );
422+ nblocks , in , out , & (file -> crc ),
423+ & n_blocks_skipped , backup_mode );
404424 n_blocks_read ++ ;
405425 }
406426
0 commit comments