Skip to content

Commit 09e87a5

Browse files
committed
[Issue #228]: added page header map compression
1 parent a0d31d5 commit 09e87a5

File tree

4 files changed

+66
-9
lines changed

4 files changed

+66
-9
lines changed

src/catalog.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1926,6 +1926,7 @@ write_backup_filelist(pgBackup *backup, parray *files, const char *root,
19261926
len += sprintf(line+len, ",\"n_headers\":\"%i\"", file->n_headers);
19271927
len += sprintf(line+len, ",\"hdr_crc\":\"%u\"", file->hdr_crc);
19281928
len += sprintf(line+len, ",\"hdr_off\":\"%li\"", file->hdr_off);
1929+
len += sprintf(line+len, ",\"hdr_size\":\"%i\"", file->hdr_size);
19291930
}
19301931

19311932
sprintf(line+len, "}\n");

src/data.c

Lines changed: 58 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

src/dir.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1552,7 +1552,8 @@ dir_read_file_list(const char *root, const char *external_prefix,
15521552
n_headers,
15531553
dbOid, /* used for partial restore */
15541554
hdr_crc,
1555-
hdr_off;
1555+
hdr_off,
1556+
hdr_size;
15561557
pgFile *file;
15571558

15581559
COMP_FILE_CRC32(true, content_crc, buf, strlen(buf));
@@ -1602,6 +1603,9 @@ dir_read_file_list(const char *root, const char *external_prefix,
16021603
if (get_control_value(buf, "hdr_off", NULL, &hdr_off, false))
16031604
file->hdr_off = hdr_off;
16041605

1606+
if (get_control_value(buf, "hdr_size", NULL, &hdr_size, false))
1607+
file->hdr_size = (int) hdr_size;
1608+
16051609
parray_append(files, file);
16061610
}
16071611

src/pg_probackup.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,10 +214,11 @@ typedef struct pgFile
214214
may take up to 16kB per file */
215215
bool pagemap_isabsent; /* Used to mark files with unknown state of pagemap,
216216
* i.e. datafiles without _ptrack */
217-
/* coordinates in header map */
217+
/* Coordinates in header map */
218218
int n_headers; /* number of blocks in the data file in backup */
219219
pg_crc32 hdr_crc; /* CRC value of header file: name_hdr */
220220
off_t hdr_off; /* offset in header map */
221+
int hdr_size; /* offset in header map */
221222
} pgFile;
222223

223224
typedef struct page_map_entry

0 commit comments

Comments
 (0)