diff options
Diffstat (limited to 'src/bin/pg_basebackup/t/010_pg_basebackup.pl')
-rw-r--r-- | src/bin/pg_basebackup/t/010_pg_basebackup.pl | 138 |
1 files changed, 76 insertions, 62 deletions
diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl index 0cd510eeea4..1c80ff74917 100644 --- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl +++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl @@ -20,7 +20,7 @@ my $node = get_new_node('main'); umask(0077); # Initialize node without replication settings -$node->init(extra => [ '--data-checksums' ]); +$node->init(extra => ['--data-checksums']); $node->start; my $pgdata = $node->data_dir; @@ -47,7 +47,7 @@ ok(!-d "$tempdir/backup", 'backup directory was cleaned up'); # Create a backup directory that is not empty so the next commnd will fail # but leave the data directory behind mkdir("$tempdir/backup") - or BAIL_OUT("unable to create $tempdir/backup"); + or BAIL_OUT("unable to create $tempdir/backup"); append_to_file("$tempdir/backup/dir-not-empty.txt", "Some data"); $node->command_fails([ 'pg_basebackup', '-D', "$tempdir/backup", '-n' ], @@ -86,13 +86,14 @@ my $baseUnloggedPath = $node->safe_psql('postgres', # Make sure main and init forks exist ok(-f "$pgdata/${baseUnloggedPath}_init", 'unlogged init fork in base'); -ok(-f "$pgdata/$baseUnloggedPath", 'unlogged main fork in base'); +ok(-f "$pgdata/$baseUnloggedPath", 'unlogged main fork in base'); # Create files that look like temporary relations to ensure they are ignored. my $postgresOid = $node->safe_psql('postgres', q{select oid from pg_database where datname = 'postgres'}); -my @tempRelationFiles = qw(t999_999 t9999_999.1 t999_9999_vm t99999_99999_vm.1); +my @tempRelationFiles = + qw(t999_999 t9999_999.1 t999_9999_vm t99999_99999_vm.1); foreach my $filename (@tempRelationFiles) { @@ -107,10 +108,11 @@ ok(-f "$tempdir/backup/PG_VERSION", 'backup was created'); # Permissions on backup should be default SKIP: { - skip "unix-style permissions not supported on Windows", 1 if ($windows_os); + skip "unix-style permissions not supported on Windows", 1 + if ($windows_os); ok(check_mode_recursive("$tempdir/backup", 0700, 0600), - "check backup dir permissions"); + "check backup dir permissions"); } # Only archive_status directory should be copied in pg_wal/. @@ -133,8 +135,7 @@ foreach my $dirname ( # These files should not be copied. foreach my $filename ( qw(postgresql.auto.conf.tmp postmaster.opts postmaster.pid tablespace_map current_logfiles.tmp - global/pg_internal.init) - ) + global/pg_internal.init)) { ok(!-f "$tempdir/backup/$filename", "$filename not copied"); } @@ -142,14 +143,14 @@ foreach my $filename ( # Unlogged relation forks other than init should not be copied ok(-f "$tempdir/backup/${baseUnloggedPath}_init", 'unlogged init fork in backup'); -ok(!-f "$tempdir/backup/$baseUnloggedPath", +ok( !-f "$tempdir/backup/$baseUnloggedPath", 'unlogged main fork not in backup'); # Temp relations should not be copied. foreach my $filename (@tempRelationFiles) { - ok(!-f "$tempdir/backup/base/$postgresOid/$filename", - "base/$postgresOid/$filename not copied"); + ok( !-f "$tempdir/backup/base/$postgresOid/$filename", + "base/$postgresOid/$filename not copied"); } # Make sure existing backup_label was ignored. @@ -212,7 +213,7 @@ SKIP: # Move pg_replslot out of $pgdata and create a symlink to it. $node->stop; - # Set umask so test directories and files are created with group permissions + # Set umask so test directories and files are created with group permissions umask(0027); # Enable group permissions on PGDATA @@ -244,24 +245,27 @@ SKIP: is(scalar(@tblspc_tars), 1, 'one tablespace tar was created'); rmtree("$tempdir/tarbackup2"); - # Create an unlogged table to test that forks other than init are not copied. + # Create an unlogged table to test that forks other than init are not copied. $node->safe_psql('postgres', - 'CREATE UNLOGGED TABLE tblspc1_unlogged (id int) TABLESPACE tblspc1;'); + 'CREATE UNLOGGED TABLE tblspc1_unlogged (id int) TABLESPACE tblspc1;' + ); - my $tblspc1UnloggedPath = $node->safe_psql( - 'postgres', q{select pg_relation_filepath('tblspc1_unlogged')}); + my $tblspc1UnloggedPath = $node->safe_psql('postgres', + q{select pg_relation_filepath('tblspc1_unlogged')}); # Make sure main and init forks exist - ok(-f "$pgdata/${tblspc1UnloggedPath}_init", + ok( -f "$pgdata/${tblspc1UnloggedPath}_init", 'unlogged init fork in tablespace'); - ok(-f "$pgdata/$tblspc1UnloggedPath", - 'unlogged main fork in tablespace'); + ok(-f "$pgdata/$tblspc1UnloggedPath", 'unlogged main fork in tablespace'); - # Create files that look like temporary relations to ensure they are ignored - # in a tablespace. + # Create files that look like temporary relations to ensure they are ignored + # in a tablespace. my @tempRelationFiles = qw(t888_888 t888888_888888_vm.1); - my $tblSpc1Id = basename(dirname(dirname($node->safe_psql('postgres', - q{select pg_relation_filepath('test1')})))); + my $tblSpc1Id = basename( + dirname( + dirname( + $node->safe_psql( + 'postgres', q{select pg_relation_filepath('test1')})))); foreach my $filename (@tempRelationFiles) { @@ -284,16 +288,17 @@ SKIP: -l "$tempdir/backup1/pg_tblspc/$_" and readlink "$tempdir/backup1/pg_tblspc/$_" eq "$tempdir/tbackup/tblspc1" - } readdir($dh)), + } readdir($dh)), "tablespace symlink was updated"); closedir $dh; # Group access should be enabled on all backup files ok(check_mode_recursive("$tempdir/backup1", 0750, 0640), - "check backup dir permissions"); + "check backup dir permissions"); # Unlogged relation forks other than init should not be copied - my ($tblspc1UnloggedBackupPath) = $tblspc1UnloggedPath =~ /[^\/]*\/[^\/]*\/[^\/]*$/g; + my ($tblspc1UnloggedBackupPath) = + $tblspc1UnloggedPath =~ /[^\/]*\/[^\/]*\/[^\/]*$/g; ok(-f "$tempdir/tbackup/tblspc1/${tblspc1UnloggedBackupPath}_init", 'unlogged init fork in tablespace backup'); @@ -303,15 +308,15 @@ SKIP: # Temp relations should not be copied. foreach my $filename (@tempRelationFiles) { - ok(!-f "$tempdir/tbackup/tblspc1/$tblSpc1Id/$postgresOid/$filename", - "[tblspc1]/$postgresOid/$filename not copied"); + ok( !-f "$tempdir/tbackup/tblspc1/$tblSpc1Id/$postgresOid/$filename", + "[tblspc1]/$postgresOid/$filename not copied"); # Also remove temp relation files or tablespace drop will fail. my $filepath = - "$shorter_tempdir/tblspc1/$tblSpc1Id/$postgresOid/$filename"; + "$shorter_tempdir/tblspc1/$tblSpc1Id/$postgresOid/$filename"; unlink($filepath) - or BAIL_OUT("unable to unlink $filepath"); + or BAIL_OUT("unable to unlink $filepath"); } ok( -d "$tempdir/backup1/pg_replslot", @@ -398,27 +403,35 @@ $node->command_fails( 'pg_basebackup fails with nonexistent replication slot'); $node->command_fails( - [ 'pg_basebackup', '-D', "$tempdir/backupxs_slot", '-C' ], + [ 'pg_basebackup', '-D', "$tempdir/backupxs_slot", '-C' ], 'pg_basebackup -C fails without slot name'); $node->command_fails( - [ 'pg_basebackup', '-D', "$tempdir/backupxs_slot", '-C', '-S', 'slot0', '--no-slot' ], + [ 'pg_basebackup', '-D', + "$tempdir/backupxs_slot", '-C', + '-S', 'slot0', + '--no-slot' ], 'pg_basebackup fails with -C -S --no-slot'); $node->command_ok( - [ 'pg_basebackup', '-D', "$tempdir/backupxs_slot", '-C', '-S', 'slot0' ], + [ 'pg_basebackup', '-D', "$tempdir/backupxs_slot", '-C', '-S', 'slot0' ], 'pg_basebackup -C runs'); rmtree("$tempdir/backupxs_slot"); -is($node->safe_psql('postgres', q{SELECT slot_name FROM pg_replication_slots WHERE slot_name = 'slot0'}), - 'slot0', - 'replication slot was created'); -isnt($node->safe_psql('postgres', q{SELECT restart_lsn FROM pg_replication_slots WHERE slot_name = 'slot0'}), - '', - 'restart LSN of new slot is not null'); +is( $node->safe_psql( + 'postgres', +q{SELECT slot_name FROM pg_replication_slots WHERE slot_name = 'slot0'}), + 'slot0', + 'replication slot was created'); +isnt( + $node->safe_psql( + 'postgres', +q{SELECT restart_lsn FROM pg_replication_slots WHERE slot_name = 'slot0'}), + '', + 'restart LSN of new slot is not null'); $node->command_fails( - [ 'pg_basebackup', '-D', "$tempdir/backupxs_slot1", '-C', '-S', 'slot0' ], + [ 'pg_basebackup', '-D', "$tempdir/backupxs_slot1", '-C', '-S', 'slot0' ], 'pg_basebackup fails with -C -S and a previously existing slot'); $node->safe_psql('postgres', @@ -455,10 +468,10 @@ rmtree("$tempdir/backupxs_sl_R"); # create tables to corrupt and get their relfilenodes my $file_corrupt1 = $node->safe_psql('postgres', - q{SELECT a INTO corrupt1 FROM generate_series(1,10000) AS a; ALTER TABLE corrupt1 SET (autovacuum_enabled=false); SELECT pg_relation_filepath('corrupt1')} +q{SELECT a INTO corrupt1 FROM generate_series(1,10000) AS a; ALTER TABLE corrupt1 SET (autovacuum_enabled=false); SELECT pg_relation_filepath('corrupt1')} ); my $file_corrupt2 = $node->safe_psql('postgres', - q{SELECT b INTO corrupt2 FROM generate_series(1,2) AS b; ALTER TABLE corrupt2 SET (autovacuum_enabled=false); SELECT pg_relation_filepath('corrupt2')} +q{SELECT b INTO corrupt2 FROM generate_series(1,2) AS b; ALTER TABLE corrupt2 SET (autovacuum_enabled=false); SELECT pg_relation_filepath('corrupt2')} ); # set page header and block sizes @@ -473,31 +486,32 @@ syswrite($file, '\0\0\0\0\0\0\0\0\0'); close $file; system_or_bail 'pg_ctl', '-D', $pgdata, 'start'; -$node->command_checks_all([ 'pg_basebackup', '-D', "$tempdir/backup_corrupt"], +$node->command_checks_all( + [ 'pg_basebackup', '-D', "$tempdir/backup_corrupt" ], 1, [qr{^$}], [qr/^WARNING.*checksum verification failed/s], - 'pg_basebackup reports checksum mismatch' -); + 'pg_basebackup reports checksum mismatch'); rmtree("$tempdir/backup_corrupt"); # induce further corruption in 5 more blocks system_or_bail 'pg_ctl', '-D', $pgdata, 'stop'; open $file, '+<', "$pgdata/$file_corrupt1"; -for my $i ( 1..5 ) { - my $offset = $pageheader_size + $i * $block_size; - seek($file, $offset, 0); - syswrite($file, '\0\0\0\0\0\0\0\0\0'); +for my $i (1 .. 5) +{ + my $offset = $pageheader_size + $i * $block_size; + seek($file, $offset, 0); + syswrite($file, '\0\0\0\0\0\0\0\0\0'); } close $file; system_or_bail 'pg_ctl', '-D', $pgdata, 'start'; -$node->command_checks_all([ 'pg_basebackup', '-D', "$tempdir/backup_corrupt2"], - 1, - [qr{^$}], - [qr/^WARNING.*further.*failures.*will.not.be.reported/s], - 'pg_basebackup does not report more than 5 checksum mismatches' -); +$node->command_checks_all( + [ 'pg_basebackup', '-D', "$tempdir/backup_corrupt2" ], + 1, + [qr{^$}], + [qr/^WARNING.*further.*failures.*will.not.be.reported/s], + 'pg_basebackup does not report more than 5 checksum mismatches'); rmtree("$tempdir/backup_corrupt2"); # induce corruption in a second file @@ -508,17 +522,17 @@ syswrite($file, '\0\0\0\0\0\0\0\0\0'); close $file; system_or_bail 'pg_ctl', '-D', $pgdata, 'start'; -$node->command_checks_all([ 'pg_basebackup', '-D', "$tempdir/backup_corrupt3"], - 1, - [qr{^$}], - [qr/^WARNING.*7 total checksum verification failures/s], - 'pg_basebackup correctly report the total number of checksum mismatches' -); +$node->command_checks_all( + [ 'pg_basebackup', '-D', "$tempdir/backup_corrupt3" ], + 1, + [qr{^$}], + [qr/^WARNING.*7 total checksum verification failures/s], + 'pg_basebackup correctly report the total number of checksum mismatches'); rmtree("$tempdir/backup_corrupt3"); # do not verify checksums, should return ok $node->command_ok( - [ 'pg_basebackup', '-D', "$tempdir/backup_corrupt4", '-k' ], + [ 'pg_basebackup', '-D', "$tempdir/backup_corrupt4", '-k' ], 'pg_basebackup with -k does not report checksum mismatch'); rmtree("$tempdir/backup_corrupt4"); |