@@ -57,7 +57,7 @@ zlib_decompress(void *dst, size_t dst_size, void const *src, size_t src_size)
57
57
*/
58
58
static int32
59
59
do_compress (void * dst , size_t dst_size , void const * src , size_t src_size ,
60
- CompressAlg alg , int level )
60
+ CompressAlg alg , int level , const char * * errormsg )
61
61
{
62
62
switch (alg )
63
63
{
@@ -66,7 +66,13 @@ do_compress(void* dst, size_t dst_size, void const* src, size_t src_size,
66
66
return -1 ;
67
67
#ifdef HAVE_LIBZ
68
68
case ZLIB_COMPRESS :
69
- return zlib_compress (dst , dst_size , src , src_size , level );
69
+ {
70
+ int32 ret ;
71
+ ret = zlib_compress (dst , dst_size , src , src_size , level );
72
+ if (ret != Z_OK && errormsg )
73
+ * errormsg = zError (ret );
74
+ return ret ;
75
+ }
70
76
#endif
71
77
case PGLZ_COMPRESS :
72
78
return pglz_compress (src , src_size , dst , PGLZ_strategy_always );
@@ -81,7 +87,7 @@ do_compress(void* dst, size_t dst_size, void const* src, size_t src_size,
81
87
*/
82
88
static int32
83
89
do_decompress (void * dst , size_t dst_size , void const * src , size_t src_size ,
84
- CompressAlg alg )
90
+ CompressAlg alg , const char * * errormsg )
85
91
{
86
92
switch (alg )
87
93
{
@@ -90,7 +96,13 @@ do_decompress(void* dst, size_t dst_size, void const* src, size_t src_size,
90
96
return -1 ;
91
97
#ifdef HAVE_LIBZ
92
98
case ZLIB_COMPRESS :
93
- return zlib_decompress (dst , dst_size , src , src_size );
99
+ {
100
+ int32 ret ;
101
+ ret = zlib_decompress (dst , dst_size , src , src_size );
102
+ if (ret != Z_OK && errormsg )
103
+ * errormsg = zError (ret );
104
+ return ret ;
105
+ }
94
106
#endif
95
107
case PGLZ_COMPRESS :
96
108
return pglz_decompress (src , src_size , dst , dst_size );
@@ -110,7 +122,7 @@ do_decompress(void* dst, size_t dst_size, void const* src, size_t src_size,
110
122
* But at least we will do this check only for pages which will no pass validation step.
111
123
*/
112
124
static bool
113
- page_may_be_compressed (Page page , CompressAlg alg )
125
+ page_may_be_compressed (Page page , CompressAlg alg , uint32 backup_version )
114
126
{
115
127
PageHeader phdr ;
116
128
@@ -127,7 +139,7 @@ page_may_be_compressed(Page page, CompressAlg alg)
127
139
phdr -> pd_special == MAXALIGN (phdr -> pd_special )))
128
140
{
129
141
/* ... end only if it is invalid, then do more checks */
130
- if (parse_program_version ( current . program_version ) >= 20023 )
142
+ if (backup_version >= 20023 )
131
143
{
132
144
/* Versions 2.0.23 and higher don't have such bug */
133
145
return false;
@@ -434,9 +446,16 @@ compress_and_backup_page(pgFile *file, BlockNumber blknum,
434
446
}
435
447
else
436
448
{
449
+ const char * errormsg = NULL ;
450
+
437
451
/* The page was not truncated, so we need to compress it */
438
452
header .compressed_size = do_compress (compressed_page , BLCKSZ ,
439
- page , BLCKSZ , calg , clevel );
453
+ page , BLCKSZ , calg , clevel ,
454
+ & errormsg );
455
+ /* Something went wrong and errormsg was assigned, throw a warning */
456
+ if (header .compressed_size < 0 && errormsg != NULL )
457
+ elog (WARNING , "An error occured during compressing block %u of file \"%s\": %s" ,
458
+ blknum , file -> path , errormsg );
440
459
441
460
file -> compress_alg = calg ;
442
461
file -> read_size += BLCKSZ ;
@@ -473,7 +492,7 @@ compress_and_backup_page(pgFile *file, BlockNumber blknum,
473
492
474
493
fclose (in );
475
494
fclose (out );
476
- elog (ERROR , "File: %s, cannot write backup at block %u : %s" ,
495
+ elog (ERROR , "File: %s, cannot write backup at block %u: %s" ,
477
496
file -> path , blknum , strerror (errno_tmp ));
478
497
}
479
498
@@ -661,7 +680,7 @@ backup_data_file(backup_files_arg* arguments,
661
680
*/
662
681
void
663
682
restore_data_file (const char * to_path , pgFile * file , bool allow_truncate ,
664
- bool write_header )
683
+ bool write_header , uint32 backup_version )
665
684
{
666
685
FILE * in = NULL ;
667
686
FILE * out = NULL ;
@@ -766,14 +785,19 @@ restore_data_file(const char *to_path, pgFile *file, bool allow_truncate,
766
785
blknum , file -> path , read_len , header .compressed_size );
767
786
768
787
if (header .compressed_size != BLCKSZ
769
- || page_may_be_compressed (compressed_page .data , file -> compress_alg ))
788
+ || page_may_be_compressed (compressed_page .data , file -> compress_alg ,
789
+ backup_version ))
770
790
{
771
791
int32 uncompressed_size = 0 ;
792
+ const char * errormsg = NULL ;
772
793
773
794
uncompressed_size = do_decompress (page .data , BLCKSZ ,
774
795
compressed_page .data ,
775
796
header .compressed_size ,
776
- file -> compress_alg );
797
+ file -> compress_alg , & errormsg );
798
+ if (uncompressed_size < 0 && errormsg != NULL )
799
+ elog (WARNING , "An error occured during decompressing block %u of file \"%s\": %s" ,
800
+ blknum , file -> path , errormsg );
777
801
778
802
if (uncompressed_size != BLCKSZ )
779
803
elog (ERROR , "page of file \"%s\" uncompressed to %d bytes. != BLCKSZ" ,
@@ -1578,7 +1602,8 @@ validate_one_page(Page page, pgFile *file,
1578
1602
1579
1603
/* Valiate pages of datafile in backup one by one */
1580
1604
bool
1581
- check_file_pages (pgFile * file , XLogRecPtr stop_lsn , uint32 checksum_version )
1605
+ check_file_pages (pgFile * file , XLogRecPtr stop_lsn , uint32 checksum_version ,
1606
+ uint32 backup_version )
1582
1607
{
1583
1608
size_t read_len = 0 ;
1584
1609
bool is_valid = true;
@@ -1645,14 +1670,20 @@ check_file_pages(pgFile *file, XLogRecPtr stop_lsn, uint32 checksum_version)
1645
1670
blknum , file -> path , read_len , header .compressed_size );
1646
1671
1647
1672
if (header .compressed_size != BLCKSZ
1648
- || page_may_be_compressed (compressed_page .data , file -> compress_alg ))
1673
+ || page_may_be_compressed (compressed_page .data , file -> compress_alg ,
1674
+ backup_version ))
1649
1675
{
1650
1676
int32 uncompressed_size = 0 ;
1677
+ const char * errormsg = NULL ;
1651
1678
1652
1679
uncompressed_size = do_decompress (page .data , BLCKSZ ,
1653
1680
compressed_page .data ,
1654
1681
header .compressed_size ,
1655
- file -> compress_alg );
1682
+ file -> compress_alg ,
1683
+ & errormsg );
1684
+ if (uncompressed_size < 0 && errormsg != NULL )
1685
+ elog (WARNING , "An error occured during decompressing block %u of file \"%s\": %s" ,
1686
+ blknum , file -> path , errormsg );
1656
1687
1657
1688
if (uncompressed_size != BLCKSZ )
1658
1689
{
0 commit comments