Skip to content

Commit ea3ed9f

Browse files
committed
Instead of current global backup variable use function local argument, which is sent by callers
1 parent 5e12fec commit ea3ed9f

File tree

6 files changed

+63
-28
lines changed

6 files changed

+63
-28
lines changed

src/data.c

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ zlib_decompress(void *dst, size_t dst_size, void const *src, size_t src_size)
5757
*/
5858
static int32
5959
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)
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
*/
8288
static int32
8389
do_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
*/
112124
static 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
*/
662681
void
663682
restore_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 */
15801604
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)
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
{

src/merge.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -457,14 +457,16 @@ merge_files(void *arg)
457457
file->path = to_path_tmp;
458458

459459
/* Decompress first/target file */
460-
restore_data_file(tmp_file_path, file, false, false);
460+
restore_data_file(tmp_file_path, file, false, false,
461+
parse_program_version(to_backup->program_version));
461462

462463
file->path = prev_path;
463464
}
464465
/* Merge second/source file with first/target file */
465466
restore_data_file(tmp_file_path, file,
466467
from_backup->backup_mode == BACKUP_MODE_DIFF_DELTA,
467-
false);
468+
false,
469+
parse_program_version(from_backup->program_version));
468470

469471
elog(VERBOSE, "Compress file and save it to the directory \"%s\"",
470472
argument->to_root);
@@ -496,7 +498,8 @@ merge_files(void *arg)
496498
/* We can merge in-place here */
497499
restore_data_file(to_path_tmp, file,
498500
from_backup->backup_mode == BACKUP_MODE_DIFF_DELTA,
499-
true);
501+
true,
502+
parse_program_version(from_backup->program_version));
500503

501504
/*
502505
* We need to calculate write_size, restore_data_file() doesn't

src/pg_probackup.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,8 @@ extern bool backup_data_file(backup_files_arg* arguments,
517517
CompressAlg calg, int clevel);
518518
extern void restore_data_file(const char *to_path,
519519
pgFile *file, bool allow_truncate,
520-
bool write_header);
520+
bool write_header,
521+
uint32 backup_version);
521522
extern bool copy_file(const char *from_root, const char *to_root, pgFile *file);
522523
extern void move_file(const char *from_root, const char *to_root, pgFile *file);
523524
extern void push_wal_file(const char *from_path, const char *to_path,
@@ -526,8 +527,8 @@ extern void get_wal_file(const char *from_path, const char *to_path);
526527

527528
extern bool calc_file_checksum(pgFile *file);
528529

529-
extern bool check_file_pages(pgFile* file,
530-
XLogRecPtr stop_lsn, uint32 checksum_version);
530+
extern bool check_file_pages(pgFile* file, XLogRecPtr stop_lsn,
531+
uint32 checksum_version, uint32 backup_version);
531532

532533
/* parsexlog.c */
533534
extern void extractPageMap(const char *archivedir,

src/restore.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -621,7 +621,8 @@ restore_files(void *arg)
621621
file->path + strlen(from_root) + 1);
622622
restore_data_file(to_path, file,
623623
arguments->backup->backup_mode == BACKUP_MODE_DIFF_DELTA,
624-
false);
624+
false,
625+
parse_program_version(arguments->backup->program_version));
625626
}
626627
else
627628
copy_file(from_root, pgdata, file);

src/validate.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ typedef struct
2828
bool corrupted;
2929
XLogRecPtr stop_lsn;
3030
uint32 checksum_version;
31+
uint32 backup_version;
3132

3233
/*
3334
* Return value from the thread.
@@ -92,11 +93,6 @@ pgBackupValidate(pgBackup *backup)
9293
pg_atomic_clear_flag(&file->lock);
9394
}
9495

95-
/*
96-
* We use program version to calculate checksum in pgBackupValidateFiles()
97-
*/
98-
validate_backup_version = parse_program_version(backup->program_version);
99-
10096
/* init thread args with own file lists */
10197
threads = (pthread_t *) palloc(sizeof(pthread_t) * num_threads);
10298
threads_args = (validate_files_arg *)
@@ -111,6 +107,7 @@ pgBackupValidate(pgBackup *backup)
111107
arg->corrupted = false;
112108
arg->stop_lsn = backup->stop_lsn;
113109
arg->checksum_version = backup->checksum_version;
110+
arg->backup_version = parse_program_version(backup->program_version);
114111
/* By default there are some error */
115112
threads_args[i].ret = 1;
116113

@@ -233,7 +230,9 @@ pgBackupValidateFiles(void *arg)
233230
/* validate relation blocks */
234231
if (file->is_datafile)
235232
{
236-
if (!check_file_pages(file, arguments->stop_lsn, arguments->checksum_version))
233+
if (!check_file_pages(file, arguments->stop_lsn,
234+
arguments->checksum_version,
235+
arguments->backup_version))
237236
arguments->corrupted = true;
238237
}
239238
}

tests/expected/option_version.out

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
pg_probackup 2.0.22
1+
pg_probackup 2.0.23

0 commit comments

Comments
 (0)