Skip to content

Commit 7b5275e

Browse files
committed
pg_resetwal: Add more tests and test coverage
pg_resetwal had poor test coverage. There are some TAP tests, but they all run with -n, so they don't actually test the full functionality. (There is a non-dry-run call of pg_resetwal in the recovery test suite, but that is incidental.) This adds a bunch of more tests to test all the different options and scenarios. Reviewed-by: Aleksander Alekseev <aleksander@timescale.com> Discussion: https://www.postgresql.org/message-id/flat/0f3ab4a1-ae80-56e8-3426-6b4a02507687@eisentraut.org
1 parent 6ceec8a commit 7b5275e

File tree

2 files changed

+212
-0
lines changed

2 files changed

+212
-0
lines changed

src/bin/pg_resetwal/t/001_basic.pl

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
my $node = PostgreSQL::Test::Cluster->new('main');
1616
$node->init;
17+
$node->append_conf('postgresql.conf', 'track_commit_timestamp = on');
1718

1819
command_like([ 'pg_resetwal', '-n', $node->data_dir ],
1920
qr/checkpoint/, 'pg_resetwal -n produces output');
@@ -29,4 +30,207 @@
2930
'check PGDATA permissions');
3031
}
3132

33+
command_ok([ 'pg_resetwal', '-D', $node->data_dir ], 'pg_resetwal runs');
34+
$node->start;
35+
is($node->safe_psql("postgres", "SELECT 1;"),
36+
1, 'server running and working after reset');
37+
38+
command_fails_like(
39+
[ 'pg_resetwal', $node->data_dir ],
40+
qr/lock file .* exists/,
41+
'fails if server running');
42+
43+
$node->stop('immediate');
44+
command_fails_like(
45+
[ 'pg_resetwal', $node->data_dir ],
46+
qr/database server was not shut down cleanly/,
47+
'does not run after immediate shutdown');
48+
command_ok(
49+
[ 'pg_resetwal', '-f', $node->data_dir ],
50+
'runs after immediate shutdown with force');
51+
$node->start;
52+
is($node->safe_psql("postgres", "SELECT 1;"),
53+
1, 'server running and working after forced reset');
54+
55+
$node->stop;
56+
57+
# check various command-line handling
58+
59+
# Note: This test intends to check that a nonexistent data directory
60+
# gives a reasonable error message. Because of the way the code is
61+
# currently structured, you get an error about readings permissions,
62+
# which is perhaps suboptimal, so feel free to update this test if
63+
# this gets improved.
64+
command_fails_like(
65+
[ 'pg_resetwal', 'foo' ],
66+
qr/error: could not read permissions of directory/,
67+
'fails with nonexistent data directory');
68+
69+
command_fails_like(
70+
[ 'pg_resetwal', 'foo', 'bar' ],
71+
qr/too many command-line arguments/,
72+
'fails with too many command-line arguments');
73+
74+
$ENV{PGDATA} = $node->data_dir; # not used
75+
command_fails_like(
76+
['pg_resetwal'],
77+
qr/no data directory specified/,
78+
'fails with too few command-line arguments');
79+
80+
# error cases
81+
# -c
82+
command_fails_like(
83+
[ 'pg_resetwal', '-c', 'foo', $node->data_dir ],
84+
qr/error: invalid argument for option -c/,
85+
'fails with incorrect -c option');
86+
command_fails_like(
87+
[ 'pg_resetwal', '-c', '10,bar', $node->data_dir ],
88+
qr/error: invalid argument for option -c/,
89+
'fails with incorrect -c option part 2');
90+
command_fails_like(
91+
[ 'pg_resetwal', '-c', '1,10', $node->data_dir ],
92+
qr/greater than/,
93+
'fails with -c value 1 part 1');
94+
command_fails_like(
95+
[ 'pg_resetwal', '-c', '10,1', $node->data_dir ],
96+
qr/greater than/,
97+
'fails with -c value 1 part 2');
98+
# -e
99+
command_fails_like(
100+
[ 'pg_resetwal', '-e', 'foo', $node->data_dir ],
101+
qr/error: invalid argument for option -e/,
102+
'fails with incorrect -e option');
103+
command_fails_like(
104+
[ 'pg_resetwal', '-e', '-1', $node->data_dir ],
105+
qr/must not be -1/,
106+
'fails with -e value -1');
107+
# -l
108+
command_fails_like(
109+
[ 'pg_resetwal', '-l', 'foo', $node->data_dir ],
110+
qr/error: invalid argument for option -l/,
111+
'fails with incorrect -l option');
112+
# -m
113+
command_fails_like(
114+
[ 'pg_resetwal', '-m', 'foo', $node->data_dir ],
115+
qr/error: invalid argument for option -m/,
116+
'fails with incorrect -m option');
117+
command_fails_like(
118+
[ 'pg_resetwal', '-m', '10,bar', $node->data_dir ],
119+
qr/error: invalid argument for option -m/,
120+
'fails with incorrect -m option part 2');
121+
command_fails_like(
122+
[ 'pg_resetwal', '-m', '0,10', $node->data_dir ],
123+
qr/must not be 0/,
124+
'fails with -m value 0 part 1');
125+
command_fails_like(
126+
[ 'pg_resetwal', '-m', '10,0', $node->data_dir ],
127+
qr/must not be 0/,
128+
'fails with -m value 0 part 2');
129+
# -o
130+
command_fails_like(
131+
[ 'pg_resetwal', '-o', 'foo', $node->data_dir ],
132+
qr/error: invalid argument for option -o/,
133+
'fails with incorrect -o option');
134+
command_fails_like(
135+
[ 'pg_resetwal', '-o', '0', $node->data_dir ],
136+
qr/must not be 0/,
137+
'fails with -o value 0');
138+
# -O
139+
command_fails_like(
140+
[ 'pg_resetwal', '-O', 'foo', $node->data_dir ],
141+
qr/error: invalid argument for option -O/,
142+
'fails with incorrect -O option');
143+
command_fails_like(
144+
[ 'pg_resetwal', '-O', '-1', $node->data_dir ],
145+
qr/must not be -1/,
146+
'fails with -O value -1');
147+
# --wal-segsize
148+
command_fails_like(
149+
[ 'pg_resetwal', '--wal-segsize', 'foo', $node->data_dir ],
150+
qr/error: invalid value/,
151+
'fails with incorrect --wal-segsize option');
152+
command_fails_like(
153+
[ 'pg_resetwal', '--wal-segsize', '13', $node->data_dir ],
154+
qr/must be a power/,
155+
'fails with invalid --wal-segsize value');
156+
# -u
157+
command_fails_like(
158+
[ 'pg_resetwal', '-u', 'foo', $node->data_dir ],
159+
qr/error: invalid argument for option -u/,
160+
'fails with incorrect -u option');
161+
command_fails_like(
162+
[ 'pg_resetwal', '-u', '1', $node->data_dir ],
163+
qr/must be greater than/,
164+
'fails with -u value too small');
165+
# -x
166+
command_fails_like(
167+
[ 'pg_resetwal', '-x', 'foo', $node->data_dir ],
168+
qr/error: invalid argument for option -x/,
169+
'fails with incorrect -x option');
170+
command_fails_like(
171+
[ 'pg_resetwal', '-x', '1', $node->data_dir ],
172+
qr/must be greater than/,
173+
'fails with -x value too small');
174+
175+
# run with control override options
176+
177+
my $out = (run_command([ 'pg_resetwal', '-n', $node->data_dir ]))[0];
178+
$out =~ /^Database block size: *(\d+)$/m or die;
179+
my $blcksz = $1;
180+
181+
my @cmd = ('pg_resetwal', '-D', $node->data_dir);
182+
183+
# some not-so-critical hardcoded values
184+
push @cmd, '-e', 1;
185+
push @cmd, '-l', '00000001000000320000004B';
186+
push @cmd, '-o', 100_000;
187+
push @cmd, '--wal-segsize', 1;
188+
189+
# these use the guidance from the documentation
190+
191+
sub get_slru_files
192+
{
193+
opendir(my $dh, $node->data_dir . '/' . $_[0]) or die $!;
194+
my @files = sort grep { /[0-9A-F]+/ } readdir $dh;
195+
closedir $dh;
196+
return @files;
197+
}
198+
199+
my (@files, $mult);
200+
201+
@files = get_slru_files('pg_commit_ts');
202+
# XXX: Should there be a multiplier, similar to the other options?
203+
# -c argument is "old,new"
204+
push @cmd,
205+
'-c',
206+
sprintf("%d,%d", hex($files[0]) == 0 ? 3 : hex($files[0]), hex($files[-1]));
207+
208+
@files = get_slru_files('pg_multixact/offsets');
209+
$mult = 32 * $blcksz / 4;
210+
# -m argument is "new,old"
211+
push @cmd, '-m',
212+
sprintf("%d,%d",
213+
(hex($files[-1]) + 1) * $mult,
214+
hex($files[0]) == 0 ? 1 : hex($files[0] * $mult));
215+
216+
@files = get_slru_files('pg_multixact/members');
217+
$mult = 32 * int($blcksz / 20) * 4;
218+
push @cmd, '-O', (hex($files[-1]) + 1) * $mult;
219+
220+
@files = get_slru_files('pg_xact');
221+
$mult = 32 * $blcksz * 4;
222+
push @cmd,
223+
'-u', (hex($files[0]) == 0 ? 3 : hex($files[0]) * $mult),
224+
'-x', ((hex($files[-1]) + 1) * $mult);
225+
226+
command_ok([ @cmd, '-n' ], 'runs with control override options, dry run');
227+
command_ok(\@cmd, 'runs with control override options');
228+
command_like(
229+
[ 'pg_resetwal', '-n', $node->data_dir ],
230+
qr/^Latest checkpoint's NextOID: *100000$/m,
231+
'spot check that control changes were applied');
232+
233+
$node->start;
234+
ok(1, 'server started after reset');
235+
32236
done_testing();

src/bin/pg_resetwal/t/002_corrupted.pl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,12 @@
5555
],
5656
'processes zero WAL segment size');
5757

58+
# now try to run it
59+
command_fails_like(
60+
[ 'pg_resetwal', $node->data_dir ],
61+
qr/not proceeding because control file values were guessed/,
62+
'does not run when control file values were guessed');
63+
command_ok([ 'pg_resetwal', '-f', $node->data_dir ],
64+
'runs with force when control file values were guessed');
65+
5866
done_testing();

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy