diff --git a/src/bin/pg_verifybackup/t/007_wal.pl b/src/bin/pg_verifybackup/t/007_wal.pl index 12ca30139c5..10da5ca5041 100644 --- a/src/bin/pg_verifybackup/t/007_wal.pl +++ b/src/bin/pg_verifybackup/t/007_wal.pl @@ -105,4 +105,26 @@ $primary->command_ok( command_ok([ 'pg_verifybackup', $backup_path3 ], 'WAL verification succeeds with separate pg_wal.tar'); +# Same with client-side gzip compression. pg_basebackup writes pg_wal.tar.gz +# as several concatenated gzip members. +SKIP: +{ + skip "gzip compression not supported by this build", 2 + if !check_pg_config("#define HAVE_LIBZ 1"); + + my $backup_path4 = $primary->backup_dir . '/test_tar_gz_wal'; + $primary->command_ok( + [ + 'pg_basebackup', + '--pgdata' => $backup_path4, + '--no-sync', + '--format' => 'tar', + '--gzip', + '--checkpoint' => 'fast' + ], + "tar backup with separate pg_wal.tar.gz"); + command_ok([ 'pg_verifybackup', $backup_path4 ], + 'WAL verification succeeds with separate pg_wal.tar.gz'); +} + done_testing(); diff --git a/src/fe_utils/astreamer_gzip.c b/src/fe_utils/astreamer_gzip.c index bc3d53076e1..5fdf0e27872 100644 --- a/src/fe_utils/astreamer_gzip.c +++ b/src/fe_utils/astreamer_gzip.c @@ -333,6 +333,14 @@ astreamer_gzip_decompressor_content(astreamer *streamer, mystreamer->base.bbs_buffer.maxlen, context); mystreamer->bytes_written = 0; } + + /* + * The input can be several gzip members one after another, which is + * what pg_basebackup writes for pg_wal.tar.gz. Get ready for the + * next one. + */ + if (res == Z_STREAM_END && inflateReset(zs) != Z_OK) + pg_fatal("could not reset compression stream"); } }