@@ -248,11 +248,10 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
248248 in , out , page );
249249
250250 try_again -- ;
251- /* This block was truncated. Do nothing */
251+ /* This block was truncated.*/
252252 if (result == 0 )
253253 {
254- free (page );
255- return ;
254+ header .compressed_size = -1 ;
256255 }
257256
258257 if (result == 1 )
@@ -273,11 +272,8 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
273272
274273 if (page == NULL )
275274 {
276- /*
277- * We may skip block for various reasons. It's fine.
278- * Otherwise pg_ptrack_get_block would have failed with ERROR.
279- */
280- return ;
275+ /* This block was truncated.*/
276+ header .compressed_size = -1 ;
281277 }
282278
283279 if (page_size != BLCKSZ )
@@ -288,18 +284,20 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
288284 ((PageHeader ) page )-> pd_checksum = pg_checksum_page (page , absolute_blknum );
289285 }
290286
287+ if (header .compressed_size != -1 )
288+ {
289+ file -> read_size += BLCKSZ ;
291290
292- file -> read_size += BLCKSZ ;
293-
294- compressed_page = malloc (BLCKSZ );
295- header .block = blknum ;
296- header .compressed_size = do_compress (compressed_page , BLCKSZ ,
297- page , BLCKSZ , compress_alg );
291+ compressed_page = malloc (BLCKSZ );
292+ header .block = blknum ;
293+ header .compressed_size = do_compress (compressed_page , BLCKSZ ,
294+ page , BLCKSZ , compress_alg );
298295
299- file -> compress_alg = compress_alg ;
296+ file -> compress_alg = compress_alg ;
300297
301- Assert (header .compressed_size <= BLCKSZ );
302- write_buffer_size = sizeof (header );
298+ Assert (header .compressed_size <= BLCKSZ );
299+ write_buffer_size = sizeof (header );
300+ }
303301
304302 /* The page was successfully compressed */
305303 if (header .compressed_size > 0 )
@@ -309,13 +307,18 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
309307 write_buffer_size += MAXALIGN (header .compressed_size );
310308 }
311309 /* The page compression failed. Write it as is. */
312- else
310+ else if ( header . compressed_size == 0 )
313311 {
314312 header .compressed_size = BLCKSZ ;
315313 memcpy (write_buffer , & header , sizeof (header ));
316314 memcpy (write_buffer + sizeof (header ), page , BLCKSZ );
317315 write_buffer_size += header .compressed_size ;
318316 }
317+ /* The page is not found, it mean that it was truncated. */
318+ else if (header .compressed_size == -1 )
319+ {
320+ memcpy (write_buffer , & header , sizeof (header ));
321+ }
319322
320323 /* Update CRC */
321324 COMP_CRC32C (* crc , & write_buffer , write_buffer_size );
@@ -589,7 +592,16 @@ restore_data_file(const char *from_root,
589592 elog (ERROR , "cannot seek block %u of \"%s\": %s" ,
590593 blknum , to_path , strerror (errno ));
591594
592- if (header .compressed_size < BLCKSZ )
595+ if (header .compressed_size == -1 )
596+ {
597+ /*
598+ * Backup contains information that this block was truncated.
599+ * Truncate file to this length.
600+ */
601+ ftruncate (out , blknum * BLCKSZ );
602+ break ;
603+ }
604+ else if (header .compressed_size < BLCKSZ )
593605 {
594606 if (fwrite (page .data , 1 , BLCKSZ , out ) != BLCKSZ )
595607 elog (ERROR , "cannot write block %u of \"%s\": %s" ,
0 commit comments