@@ -2130,6 +2130,9 @@ get_data_file_headers(HeaderMap *hdr_map, pgFile *file, uint32 backup_version)
21302130 FILE * in = NULL ;
21312131 pg_crc32 hdr_crc ;
21322132 BackupPageHeader2 * headers = NULL ;
2133+ /* header decompression */
2134+ char * zheaders = NULL ;
2135+ const char * errormsg = NULL ;
21332136
21342137 if (backup_version < 20400 )
21352138 return NULL ;
@@ -2150,14 +2153,33 @@ get_data_file_headers(HeaderMap *hdr_map, pgFile *file, uint32 backup_version)
21502153 file -> hdr_off , hdr_map -> path , strerror (errno ));
21512154
21522155 /*
2153- * the actual number of headers in header file is n+1, last one is a dummy header,
2154- * used for calculation of compressed_size for actual last header.
2156+ * The actual number of headers in header file is n+1, last one is a dummy header,
2157+ * used for calculation of read_len for actual last header.
21552158 */
21562159 read_len = (file -> n_headers + 1 ) * sizeof (BackupPageHeader2 );
2160+
2161+ /* allocate memory for compressed and uncompressed headers */
21572162 headers = pgut_malloc (read_len );
2163+ memset (headers , 0 , read_len );
2164+ zheaders = pgut_malloc (file -> hdr_size );
2165+ memset (zheaders , 0 , file -> hdr_size );
2166+
2167+ if (fread (zheaders , 1 , file -> hdr_size , in ) != file -> hdr_size )
2168+ elog (ERROR , "Cannot read header file at offset: %li len: %i \"%s\": %s" ,
2169+ file -> hdr_off , file -> hdr_size , hdr_map -> path , strerror (errno ));
21582170
2159- if (fread (headers , 1 , read_len , in ) != read_len )
2160- elog (ERROR , "Cannot read header file \"%s\": %s" , hdr_map -> path , strerror (errno ));
2171+ // elog(INFO, "zsize: %i, size: %i", file->hdr_size, read_len);
2172+
2173+ if (do_decompress (headers , read_len , zheaders , file -> hdr_size ,
2174+ ZLIB_COMPRESS , & errormsg ) != read_len )
2175+ {
2176+ if (errormsg )
2177+ elog (ERROR , "An error occured during metadata decompression for file \"%s\": %s" ,
2178+ file -> rel_path , errormsg );
2179+ else
2180+ elog (ERROR , "An error occured during metadata decompression for file \"%s\"" ,
2181+ file -> rel_path );
2182+ }
21612183
21622184 /* validate checksum */
21632185 INIT_FILE_CRC32 (true, hdr_crc );
@@ -2171,6 +2193,8 @@ get_data_file_headers(HeaderMap *hdr_map, pgFile *file, uint32 backup_version)
21712193 if (fclose (in ))
21722194 elog (ERROR , "Cannot close header file \"%s\": %s" , hdr_map -> path , strerror (errno ));
21732195
2196+ pg_free (zheaders );
2197+
21742198 return headers ;
21752199}
21762200
@@ -2179,6 +2203,10 @@ write_page_headers(BackupPageHeader2 *headers, pgFile *file, HeaderMap *hdr_map,
21792203{
21802204 size_t read_len = 0 ;
21812205 char * map_path = NULL ;
2206+ /* header compression */
2207+ int z_len = 0 ;
2208+ char * zheaders = NULL ;
2209+ const char * errormsg = NULL ;
21822210
21832211 if (file -> n_headers <= 0 )
21842212 return ;
@@ -2219,11 +2247,34 @@ write_page_headers(BackupPageHeader2 *headers, pgFile *file, HeaderMap *hdr_map,
22192247 COMP_FILE_CRC32 (true, file -> hdr_crc , headers , read_len );
22202248 FIN_FILE_CRC32 (true, file -> hdr_crc );
22212249
2222- if (fwrite (headers , 1 , read_len , hdr_map -> fp ) != read_len )
2250+ zheaders = pgut_malloc (read_len * 2 );
2251+ memset (zheaders , 0 , read_len * 2 );
2252+
2253+ z_len = do_compress (zheaders , read_len * 2 , headers ,
2254+ read_len , ZLIB_COMPRESS , 1 , & errormsg );
2255+
2256+ if (z_len < 0 )
2257+ {
2258+ if (errormsg )
2259+ elog (ERROR , "An error occured during compressing metadata for file \"%s\": %s" ,
2260+ file -> rel_path , errormsg );
2261+ else
2262+ elog (ERROR , "An error occured during compressing metadata for file \"%s\": %i" ,
2263+ file -> rel_path , z_len );
2264+ }
2265+
2266+ if (fwrite (zheaders , 1 , z_len , hdr_map -> fp ) != z_len )
22232267 elog (ERROR , "Cannot write to file \"%s\": %s" , map_path , strerror (errno ));
22242268
2225- elog (VERBOSE , "Writing header map for file \"%s\" offset: %lu, len: %lu, crc: %u" ,
2226- file -> rel_path , file -> hdr_off , read_len , file -> hdr_crc );
2269+ elog (VERBOSE , "Writing header map for file \"%s\" offset: %li, len: %i, crc: %u" ,
2270+ file -> rel_path , file -> hdr_off , z_len , file -> hdr_crc );
2271+
2272+ // elog(INFO, "File: %s, Unzip: %i, zip: %i", file->rel_path, read_len, z_len);
22272273
2274+ file -> hdr_size = z_len ;
2275+
2276+ /* End critical section */
22282277 pthread_mutex_unlock (& (hdr_map -> mutex ));
2278+
2279+ pg_free (zheaders );
22292280}
0 commit comments