@@ -57,7 +57,7 @@ zlib_decompress(void *dst, size_t dst_size, void const *src, size_t src_size)
5757 */
5858static int32
5959do_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 )
6161{
6262 switch (alg )
6363 {
@@ -66,7 +66,13 @@ do_compress(void* dst, size_t dst_size, void const* src, size_t src_size,
6666 return -1 ;
6767#ifdef HAVE_LIBZ
6868 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+ }
7076#endif
7177 case PGLZ_COMPRESS :
7278 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,
8187 */
8288static int32
8389do_decompress (void * dst , size_t dst_size , void const * src , size_t src_size ,
84- CompressAlg alg )
90+ CompressAlg alg , const char * * errormsg )
8591{
8692 switch (alg )
8793 {
@@ -90,7 +96,13 @@ do_decompress(void* dst, size_t dst_size, void const* src, size_t src_size,
9096 return -1 ;
9197#ifdef HAVE_LIBZ
9298 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+ }
94106#endif
95107 case PGLZ_COMPRESS :
96108 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,
110122 * But at least we will do this check only for pages which will no pass validation step.
111123 */
112124static bool
113- page_may_be_compressed (Page page , CompressAlg alg )
125+ page_may_be_compressed (Page page , CompressAlg alg , uint32 backup_version )
114126{
115127 PageHeader phdr ;
116128
@@ -127,7 +139,7 @@ page_may_be_compressed(Page page, CompressAlg alg)
127139 phdr -> pd_special == MAXALIGN (phdr -> pd_special )))
128140 {
129141 /* ... end only if it is invalid, then do more checks */
130- if (parse_program_version ( current . program_version ) >= 20023 )
142+ if (backup_version >= 20023 )
131143 {
132144 /* Versions 2.0.23 and higher don't have such bug */
133145 return false;
@@ -434,9 +446,16 @@ compress_and_backup_page(pgFile *file, BlockNumber blknum,
434446 }
435447 else
436448 {
449+ const char * errormsg = NULL ;
450+
437451 /* The page was not truncated, so we need to compress it */
438452 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 );
440459
441460 file -> compress_alg = calg ;
442461 file -> read_size += BLCKSZ ;
@@ -473,7 +492,7 @@ compress_and_backup_page(pgFile *file, BlockNumber blknum,
473492
474493 fclose (in );
475494 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" ,
477496 file -> path , blknum , strerror (errno_tmp ));
478497 }
479498
@@ -661,7 +680,7 @@ backup_data_file(backup_files_arg* arguments,
661680 */
662681void
663682restore_data_file (const char * to_path , pgFile * file , bool allow_truncate ,
664- bool write_header )
683+ bool write_header , uint32 backup_version )
665684{
666685 FILE * in = NULL ;
667686 FILE * out = NULL ;
@@ -766,14 +785,19 @@ restore_data_file(const char *to_path, pgFile *file, bool allow_truncate,
766785 blknum , file -> path , read_len , header .compressed_size );
767786
768787 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 ))
770790 {
771791 int32 uncompressed_size = 0 ;
792+ const char * errormsg = NULL ;
772793
773794 uncompressed_size = do_decompress (page .data , BLCKSZ ,
774795 compressed_page .data ,
775796 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 );
777801
778802 if (uncompressed_size != BLCKSZ )
779803 elog (ERROR , "page of file \"%s\" uncompressed to %d bytes. != BLCKSZ" ,
@@ -1578,7 +1602,8 @@ validate_one_page(Page page, pgFile *file,
15781602
15791603/* Valiate pages of datafile in backup one by one */
15801604bool
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 )
15821607{
15831608 size_t read_len = 0 ;
15841609 bool is_valid = true;
@@ -1645,14 +1670,20 @@ check_file_pages(pgFile *file, XLogRecPtr stop_lsn, uint32 checksum_version)
16451670 blknum , file -> path , read_len , header .compressed_size );
16461671
16471672 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 ))
16491675 {
16501676 int32 uncompressed_size = 0 ;
1677+ const char * errormsg = NULL ;
16511678
16521679 uncompressed_size = do_decompress (page .data , BLCKSZ ,
16531680 compressed_page .data ,
16541681 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 );
16561687
16571688 if (uncompressed_size != BLCKSZ )
16581689 {
0 commit comments