@@ -248,11 +248,10 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
248
248
in , out , page );
249
249
250
250
try_again -- ;
251
- /* This block was truncated. Do nothing */
251
+ /* This block was truncated.*/
252
252
if (result == 0 )
253
253
{
254
- free (page );
255
- return ;
254
+ header .compressed_size = -1 ;
256
255
}
257
256
258
257
if (result == 1 )
@@ -273,11 +272,8 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
273
272
274
273
if (page == NULL )
275
274
{
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 ;
281
277
}
282
278
283
279
if (page_size != BLCKSZ )
@@ -288,18 +284,20 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
288
284
((PageHeader ) page )-> pd_checksum = pg_checksum_page (page , absolute_blknum );
289
285
}
290
286
287
+ if (header .compressed_size != -1 )
288
+ {
289
+ file -> read_size += BLCKSZ ;
291
290
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 );
298
295
299
- file -> compress_alg = compress_alg ;
296
+ file -> compress_alg = compress_alg ;
300
297
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
+ }
303
301
304
302
/* The page was successfully compressed */
305
303
if (header .compressed_size > 0 )
@@ -309,13 +307,18 @@ backup_data_page(pgFile *file, XLogRecPtr prev_backup_start_lsn,
309
307
write_buffer_size += MAXALIGN (header .compressed_size );
310
308
}
311
309
/* The page compression failed. Write it as is. */
312
- else
310
+ else if ( header . compressed_size == 0 )
313
311
{
314
312
header .compressed_size = BLCKSZ ;
315
313
memcpy (write_buffer , & header , sizeof (header ));
316
314
memcpy (write_buffer + sizeof (header ), page , BLCKSZ );
317
315
write_buffer_size += header .compressed_size ;
318
316
}
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
+ }
319
322
320
323
/* Update CRC */
321
324
COMP_CRC32C (* crc , & write_buffer , write_buffer_size );
@@ -589,7 +592,16 @@ restore_data_file(const char *from_root,
589
592
elog (ERROR , "cannot seek block %u of \"%s\": %s" ,
590
593
blknum , to_path , strerror (errno ));
591
594
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 )
593
605
{
594
606
if (fwrite (page .data , 1 , BLCKSZ , out ) != BLCKSZ )
595
607
elog (ERROR , "cannot write block %u of \"%s\": %s" ,
0 commit comments