mirror of https://github.com/postgres/postgres
These tests are copy of original pg_resetwal tests with enalbed WAL encryption and removed flags validation as we interested here only in proper enrypted WAL handling.pull/238/head
parent
ad39bf9d89
commit
342122cecf
@ -0,0 +1,150 @@ |
||||
|
||||
# Copyright (c) 2021-2024, PostgreSQL Global Development Group |
||||
|
||||
use strict; |
||||
use warnings FATAL => 'all'; |
||||
|
||||
use PostgreSQL::Test::Cluster; |
||||
use PostgreSQL::Test::Utils; |
||||
use Test::More; |
||||
|
||||
unlink('/tmp/pg_resetwal_basic.per'); |
||||
|
||||
my $node = PostgreSQL::Test::Cluster->new('main'); |
||||
$node->init; |
||||
$node->append_conf( |
||||
'postgresql.conf', q{ |
||||
track_commit_timestamp = on |
||||
|
||||
# WAL Encryption |
||||
shared_preload_libraries = 'pg_tde' |
||||
}); |
||||
|
||||
$node->start; |
||||
$node->safe_psql('postgres', "CREATE EXTENSION pg_tde;"); |
||||
$node->safe_psql('postgres', |
||||
"SELECT pg_tde_add_global_key_provider_file('file-keyring-wal', '/tmp/pg_resetwal_basic.per');" |
||||
); |
||||
$node->safe_psql('postgres', |
||||
"SELECT pg_tde_create_key_using_global_key_provider('server-key', 'file-keyring-wal');" |
||||
); |
||||
$node->safe_psql('postgres', |
||||
"SELECT pg_tde_set_server_key_using_global_key_provider('server-key', 'file-keyring-wal');" |
||||
); |
||||
|
||||
$node->append_conf( |
||||
'postgresql.conf', q{ |
||||
pg_tde.wal_encrypt = on |
||||
}); |
||||
$node->stop; |
||||
|
||||
|
||||
command_like([ 'pg_resetwal', '-n', $node->data_dir ], |
||||
qr/checkpoint/, 'pg_resetwal -n produces output'); |
||||
|
||||
|
||||
# Permissions on PGDATA should be default |
||||
SKIP: |
||||
{ |
||||
skip "unix-style permissions not supported on Windows", 1 |
||||
if ($windows_os); |
||||
|
||||
ok(check_mode_recursive($node->data_dir, 0700, 0600), |
||||
'check PGDATA permissions'); |
||||
} |
||||
|
||||
command_ok([ 'pg_resetwal', '-D', $node->data_dir ], 'pg_resetwal runs'); |
||||
$node->start; |
||||
is($node->safe_psql("postgres", "SELECT 1;"), |
||||
1, 'server running and working after reset'); |
||||
|
||||
command_fails_like( |
||||
[ 'pg_resetwal', $node->data_dir ], |
||||
qr/lock file .* exists/, |
||||
'fails if server running'); |
||||
|
||||
$node->stop('immediate'); |
||||
command_fails_like( |
||||
[ 'pg_resetwal', $node->data_dir ], |
||||
qr/database server was not shut down cleanly/, |
||||
'does not run after immediate shutdown'); |
||||
command_ok( |
||||
[ 'pg_resetwal', '-f', $node->data_dir ], |
||||
'runs after immediate shutdown with force'); |
||||
$node->start; |
||||
is($node->safe_psql("postgres", "SELECT 1;"), |
||||
1, 'server running and working after forced reset'); |
||||
|
||||
$node->stop; |
||||
|
||||
# check various command-line handling |
||||
|
||||
# Note: This test intends to check that a nonexistent data directory |
||||
# gives a reasonable error message. Because of the way the code is |
||||
# currently structured, you get an error about readings permissions, |
||||
# which is perhaps suboptimal, so feel free to update this test if |
||||
# this gets improved. |
||||
|
||||
|
||||
# run with control override options |
||||
|
||||
my $out = (run_command([ 'pg_resetwal', '-n', $node->data_dir ]))[0]; |
||||
$out =~ /^Database block size: *(\d+)$/m or die; |
||||
my $blcksz = $1; |
||||
|
||||
my @cmd = ('pg_resetwal', '-D', $node->data_dir); |
||||
|
||||
# some not-so-critical hardcoded values |
||||
push @cmd, '-e', 1; |
||||
push @cmd, '-l', '00000001000000320000004B'; |
||||
push @cmd, '-o', 100_000; |
||||
push @cmd, '--wal-segsize', 1; |
||||
|
||||
# these use the guidance from the documentation |
||||
|
||||
sub get_slru_files |
||||
{ |
||||
opendir(my $dh, $node->data_dir . '/' . $_[0]) or die $!; |
||||
my @files = sort grep { /[0-9A-F]+/ } readdir $dh; |
||||
closedir $dh; |
||||
return @files; |
||||
} |
||||
|
||||
my (@files, $mult); |
||||
|
||||
@files = get_slru_files('pg_commit_ts'); |
||||
# XXX: Should there be a multiplier, similar to the other options? |
||||
# -c argument is "old,new" |
||||
push @cmd, |
||||
'-c', |
||||
sprintf("%d,%d", hex($files[0]) == 0 ? 3 : hex($files[0]), hex($files[-1])); |
||||
|
||||
@files = get_slru_files('pg_multixact/offsets'); |
||||
$mult = 32 * $blcksz / 4; |
||||
# -m argument is "new,old" |
||||
push @cmd, '-m', |
||||
sprintf("%d,%d", |
||||
(hex($files[-1]) + 1) * $mult, |
||||
hex($files[0]) == 0 ? 1 : hex($files[0] * $mult)); |
||||
|
||||
@files = get_slru_files('pg_multixact/members'); |
||||
$mult = 32 * int($blcksz / 20) * 4; |
||||
push @cmd, '-O', (hex($files[-1]) + 1) * $mult; |
||||
|
||||
@files = get_slru_files('pg_xact'); |
||||
$mult = 32 * $blcksz * 4; |
||||
push @cmd, |
||||
'-u', (hex($files[0]) == 0 ? 3 : hex($files[0]) * $mult), |
||||
'-x', ((hex($files[-1]) + 1) * $mult); |
||||
|
||||
command_ok([ @cmd, '-n' ], 'runs with control override options, dry run'); |
||||
command_ok(\@cmd, 'runs with control override options'); |
||||
command_like( |
||||
[ 'pg_resetwal', '-n', $node->data_dir ], |
||||
qr/^Latest checkpoint's NextOID: *100000$/m, |
||||
'spot check that control changes were applied'); |
||||
|
||||
$node->start; |
||||
ok(1, 'server started after reset'); |
||||
|
||||
done_testing(); |
@ -0,0 +1,92 @@ |
||||
|
||||
# Copyright (c) 2021-2024, PostgreSQL Global Development Group |
||||
|
||||
# Tests for handling a corrupted pg_control |
||||
|
||||
use strict; |
||||
use warnings FATAL => 'all'; |
||||
|
||||
use PostgreSQL::Test::Cluster; |
||||
use PostgreSQL::Test::Utils; |
||||
use Test::More; |
||||
|
||||
unlink('/tmp/pg_resetwal_corrupted.per'); |
||||
|
||||
my $node = PostgreSQL::Test::Cluster->new('main'); |
||||
$node->init; |
||||
$node->append_conf( |
||||
'postgresql.conf', q{ |
||||
|
||||
# WAL Encryption |
||||
shared_preload_libraries = 'pg_tde' |
||||
}); |
||||
|
||||
$node->start; |
||||
$node->safe_psql('postgres', "CREATE EXTENSION pg_tde;"); |
||||
$node->safe_psql('postgres', |
||||
"SELECT pg_tde_add_global_key_provider_file('file-keyring-wal', '/tmp/pg_waldump_corrupted.per');" |
||||
); |
||||
$node->safe_psql('postgres', |
||||
"SELECT pg_tde_create_key_using_global_key_provider('server-key', 'file-keyring-wal');" |
||||
); |
||||
$node->safe_psql('postgres', |
||||
"SELECT pg_tde_set_server_key_using_global_key_provider('server-key', 'file-keyring-wal');" |
||||
); |
||||
|
||||
$node->append_conf( |
||||
'postgresql.conf', q{ |
||||
pg_tde.wal_encrypt = on |
||||
}); |
||||
$node->stop; |
||||
|
||||
my $pg_control = $node->data_dir . '/global/pg_control'; |
||||
my $size = -s $pg_control; |
||||
|
||||
# Read out the head of the file to get PG_CONTROL_VERSION in |
||||
# particular. |
||||
my $data; |
||||
open my $fh, '<', $pg_control or BAIL_OUT($!); |
||||
binmode $fh; |
||||
read $fh, $data, 16 or die $!; |
||||
close $fh; |
||||
|
||||
# Fill pg_control with zeros |
||||
open $fh, '>', $pg_control or BAIL_OUT($!); |
||||
binmode $fh; |
||||
print $fh pack("x[$size]"); |
||||
close $fh; |
||||
|
||||
command_checks_all( |
||||
[ 'pg_resetwal', '-n', $node->data_dir ], |
||||
0, |
||||
[qr/pg_control version number/], |
||||
[ |
||||
qr/pg_resetwal: warning: pg_control exists but is broken or wrong version; ignoring it/ |
||||
], |
||||
'processes corrupted pg_control all zeroes'); |
||||
|
||||
# Put in the previously saved header data. This uses a different code |
||||
# path internally, allowing us to process a zero WAL segment size. |
||||
open $fh, '>', $pg_control or BAIL_OUT($!); |
||||
binmode $fh; |
||||
print $fh $data, pack("x[" . ($size - 16) . "]"); |
||||
close $fh; |
||||
|
||||
command_checks_all( |
||||
[ 'pg_resetwal', '-n', $node->data_dir ], |
||||
0, |
||||
[qr/pg_control version number/], |
||||
[ |
||||
qr/\Qpg_resetwal: warning: pg_control specifies invalid WAL segment size (0 bytes); proceed with caution\E/ |
||||
], |
||||
'processes zero WAL segment size'); |
||||
|
||||
# now try to run it |
||||
command_fails_like( |
||||
[ 'pg_resetwal', $node->data_dir ], |
||||
qr/not proceeding because control file values were guessed/, |
||||
'does not run when control file values were guessed'); |
||||
command_ok([ 'pg_resetwal', '-f', $node->data_dir ], |
||||
'runs with force when control file values were guessed'); |
||||
|
||||
done_testing(); |
Loading…
Reference in new issue