Fix pg_bsaebackup checksum tests
Hopefully fix the fact that these checks are unstable, by introducing the corruption in a separate table from pg_class, and also explicitly disable autovacuum on those tables. Also make sure PostgreSQL is stopped while the corruption is introduced to avoid possible caching effects. Author: Michael Banck
This commit is contained in:
parent
f044d71e33
commit
ee9e145531
@ -406,19 +406,25 @@ like(
|
|||||||
my $checksum = $node->safe_psql('postgres', 'SHOW data_checksums;');
|
my $checksum = $node->safe_psql('postgres', 'SHOW data_checksums;');
|
||||||
is($checksum, 'on', 'checksums are enabled');
|
is($checksum, 'on', 'checksums are enabled');
|
||||||
|
|
||||||
# get relfilenodes of relations to corrupt
|
# create tables to corrupt and get their relfilenodes
|
||||||
my $pg_class = $node->safe_psql('postgres',
|
my $file_corrupt1 = $node->safe_psql('postgres',
|
||||||
q{SELECT pg_relation_filepath('pg_class')}
|
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 $pg_index = $node->safe_psql('postgres',
|
my $file_corrupt2 = $node->safe_psql('postgres',
|
||||||
q{SELECT pg_relation_filepath('pg_index')}
|
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
|
||||||
|
my $pageheader_size = 24;
|
||||||
|
my $block_size = $node->safe_psql('postgres', 'SHOW block_size;');
|
||||||
|
|
||||||
# induce corruption
|
# induce corruption
|
||||||
open $file, '+<', "$pgdata/$pg_class";
|
system_or_bail 'pg_ctl', '-D', $pgdata, 'stop';
|
||||||
seek($file, 4000, 0);
|
open $file, '+<', "$pgdata/$file_corrupt1";
|
||||||
|
seek($file, $pageheader_size, 0);
|
||||||
syswrite($file, '\0\0\0\0\0\0\0\0\0');
|
syswrite($file, '\0\0\0\0\0\0\0\0\0');
|
||||||
close $file;
|
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,
|
1,
|
||||||
@ -428,13 +434,15 @@ $node->command_checks_all([ 'pg_basebackup', '-D', "$tempdir/backup_corrupt"],
|
|||||||
);
|
);
|
||||||
|
|
||||||
# induce further corruption in 5 more blocks
|
# induce further corruption in 5 more blocks
|
||||||
open $file, '+<', "$pgdata/$pg_class";
|
system_or_bail 'pg_ctl', '-D', $pgdata, 'stop';
|
||||||
my @offsets = (12192, 20384, 28576, 36768, 44960);
|
open $file, '+<', "$pgdata/$file_corrupt1";
|
||||||
foreach my $offset (@offsets) {
|
for my $i ( 1..5 ) {
|
||||||
|
my $offset = $pageheader_size + $i * $block_size;
|
||||||
seek($file, $offset, 0);
|
seek($file, $offset, 0);
|
||||||
syswrite($file, '\0\0\0\0\0\0\0\0\0');
|
syswrite($file, '\0\0\0\0\0\0\0\0\0');
|
||||||
}
|
}
|
||||||
close $file;
|
close $file;
|
||||||
|
system_or_bail 'pg_ctl', '-D', $pgdata, 'start';
|
||||||
|
|
||||||
$node->command_checks_all([ 'pg_basebackup', '-D', "$tempdir/backup_corrupt2"],
|
$node->command_checks_all([ 'pg_basebackup', '-D', "$tempdir/backup_corrupt2"],
|
||||||
1,
|
1,
|
||||||
@ -444,10 +452,12 @@ $node->command_checks_all([ 'pg_basebackup', '-D', "$tempdir/backup_corrupt2"],
|
|||||||
);
|
);
|
||||||
|
|
||||||
# induce corruption in a second file
|
# induce corruption in a second file
|
||||||
open $file, '+<', "$pgdata/$pg_index";
|
system_or_bail 'pg_ctl', '-D', $pgdata, 'stop';
|
||||||
|
open $file, '+<', "$pgdata/$file_corrupt2";
|
||||||
seek($file, 4000, 0);
|
seek($file, 4000, 0);
|
||||||
syswrite($file, '\0\0\0\0\0\0\0\0\0');
|
syswrite($file, '\0\0\0\0\0\0\0\0\0');
|
||||||
close $file;
|
close $file;
|
||||||
|
system_or_bail 'pg_ctl', '-D', $pgdata, 'start';
|
||||||
|
|
||||||
$node->command_checks_all([ 'pg_basebackup', '-D', "$tempdir/backup_corrupt3"],
|
$node->command_checks_all([ 'pg_basebackup', '-D', "$tempdir/backup_corrupt3"],
|
||||||
1,
|
1,
|
||||||
@ -460,3 +470,6 @@ $node->command_checks_all([ 'pg_basebackup', '-D', "$tempdir/backup_corrupt3"],
|
|||||||
$node->command_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');
|
'pg_basebackup with -k does not report checksum mismatch');
|
||||||
|
|
||||||
|
$node->safe_psql('postgres', "DROP TABLE corrupt1;");
|
||||||
|
$node->safe_psql('postgres', "DROP TABLE corrupt2;");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user