@@ -2130,6 +2130,9 @@ get_data_file_headers(HeaderMap *hdr_map, pgFile *file, uint32 backup_version)
2130
2130
FILE * in = NULL ;
2131
2131
pg_crc32 hdr_crc ;
2132
2132
BackupPageHeader2 * headers = NULL ;
2133
+ /* header decompression */
2134
+ char * zheaders = NULL ;
2135
+ const char * errormsg = NULL ;
2133
2136
2134
2137
if (backup_version < 20400 )
2135
2138
return NULL ;
@@ -2150,14 +2153,33 @@ get_data_file_headers(HeaderMap *hdr_map, pgFile *file, uint32 backup_version)
2150
2153
file -> hdr_off , hdr_map -> path , strerror (errno ));
2151
2154
2152
2155
/*
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.
2155
2158
*/
2156
2159
read_len = (file -> n_headers + 1 ) * sizeof (BackupPageHeader2 );
2160
+
2161
+ /* allocate memory for compressed and uncompressed headers */
2157
2162
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 ));
2158
2170
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
+ }
2161
2183
2162
2184
/* validate checksum */
2163
2185
INIT_FILE_CRC32 (true, hdr_crc );
@@ -2171,6 +2193,8 @@ get_data_file_headers(HeaderMap *hdr_map, pgFile *file, uint32 backup_version)
2171
2193
if (fclose (in ))
2172
2194
elog (ERROR , "Cannot close header file \"%s\": %s" , hdr_map -> path , strerror (errno ));
2173
2195
2196
+ pg_free (zheaders );
2197
+
2174
2198
return headers ;
2175
2199
}
2176
2200
@@ -2179,6 +2203,10 @@ write_page_headers(BackupPageHeader2 *headers, pgFile *file, HeaderMap *hdr_map,
2179
2203
{
2180
2204
size_t read_len = 0 ;
2181
2205
char * map_path = NULL ;
2206
+ /* header compression */
2207
+ int z_len = 0 ;
2208
+ char * zheaders = NULL ;
2209
+ const char * errormsg = NULL ;
2182
2210
2183
2211
if (file -> n_headers <= 0 )
2184
2212
return ;
@@ -2219,11 +2247,34 @@ write_page_headers(BackupPageHeader2 *headers, pgFile *file, HeaderMap *hdr_map,
2219
2247
COMP_FILE_CRC32 (true, file -> hdr_crc , headers , read_len );
2220
2248
FIN_FILE_CRC32 (true, file -> hdr_crc );
2221
2249
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 )
2223
2267
elog (ERROR , "Cannot write to file \"%s\": %s" , map_path , strerror (errno ));
2224
2268
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);
2227
2273
2274
+ file -> hdr_size = z_len ;
2275
+
2276
+ /* End critical section */
2228
2277
pthread_mutex_unlock (& (hdr_map -> mutex ));
2278
+
2279
+ pg_free (zheaders );
2229
2280
}
0 commit comments