12
12
13
13
my $tempdir = PostgreSQL::Test::Utils::tempdir;
14
14
15
- my @walfiles = (
16
- ' 00000001000000370000000C.gz' , ' 00000001000000370000000D' ,
17
- ' 00000001000000370000000E' , ' 00000001000000370000000F.partial' ,);
15
+ # WAL file patterns created before running each sub-scenario. "present"
16
+ # tracks if the file with "name" still exists or not after running
17
+ # pg_archivecleanup.
18
+ my @walfiles_verbose = (
19
+ { name => ' 00000001000000370000000D' , present => 0 },
20
+ { name => ' 00000001000000370000000E' , present => 1 });
21
+ my @walfiles_with_gz = (
22
+ { name => ' 00000001000000370000000C.gz' , present => 0 },
23
+ { name => ' 00000001000000370000000D' , present => 0 },
24
+ { name => ' 00000001000000370000000D.backup' , present => 1 },
25
+ { name => ' 00000001000000370000000E' , present => 1 },
26
+ { name => ' 00000001000000370000000F.partial' , present => 1 },
27
+ { name => ' unrelated_file' , present => 1 });
28
+ my @walfiles_for_clean_backup_history = (
29
+ { name => ' 00000001000000370000000D' , present => 0 },
30
+ { name => ' 00000001000000370000000D.00000028.backup' , present => 0 },
31
+ { name => ' 00000001000000370000000E' , present => 1 },
32
+ { name => ' 00000001000000370000000F.partial' , present => 1 },
33
+ { name => ' unrelated_file' , present => 1 });
18
34
19
35
sub create_files
20
36
{
21
- foreach my $fn (@walfiles , ' unrelated_file ' )
37
+ foreach my $fn (map { $_ -> { name } } @_ )
22
38
{
23
39
open my $file , ' >' , " $tempdir /$fn " ;
40
+
24
41
print $file ' CONTENT' ;
25
42
close $file ;
26
43
}
27
44
return ;
28
45
}
29
46
30
- create_files();
47
+ sub remove_files
48
+ {
49
+ foreach my $fn (map { $_ -> {name } } @_ )
50
+ {
51
+ unlink " $tempdir /$fn " ;
52
+ }
53
+ return ;
54
+ }
31
55
32
56
command_fails_like(
33
57
[' pg_archivecleanup' ],
@@ -54,54 +78,86 @@ sub create_files
54
78
qr / invalid file name argument/ ,
55
79
' fails with invalid restart file name' );
56
80
81
+ # Test a dry run, no files are physically removed, but logs are generated
82
+ # to show what would be removed.
57
83
{
58
- # like command_like but checking stderr
84
+ create_files(@walfiles_verbose );
85
+
59
86
my $stderr ;
87
+ my $oldestkeptwalfile = ' 00000001000000370000000E' ;
60
88
my $result =
61
89
IPC::Run::run [ ' pg_archivecleanup' , ' -d' , ' -n' , $tempdir ,
62
- $walfiles [2] ],
90
+ $oldestkeptwalfile ],
63
91
' 2>' , \$stderr ;
64
92
ok($result , " pg_archivecleanup dry run: exit code 0" );
65
- like(
66
- $stderr ,
67
- qr /$walfiles [1].*would be removed/ ,
68
- " pg_archivecleanup dry run: matches" );
69
- foreach my $fn (@walfiles )
93
+
94
+ for my $walpair (@walfiles_verbose )
95
+ {
96
+ if ($walpair -> {present })
97
+ {
98
+ unlike(
99
+ $stderr ,
100
+ qr /$walpair ->{name}.*would be removed/ ,
101
+ " pg_archivecleanup dry run for $walpair ->{name}: matches" );
102
+ }
103
+ else
104
+ {
105
+ like(
106
+ $stderr ,
107
+ qr /$walpair ->{name}.*would be removed/ ,
108
+ " pg_archivecleanup dry run for $walpair ->{name}: matches" );
109
+ }
110
+ }
111
+ foreach my $fn (map { $_ -> {name } } @walfiles_verbose )
70
112
{
71
113
ok(-f " $tempdir /$fn " , " $fn not removed" );
72
114
}
115
+
116
+ remove_files(@walfiles_verbose );
73
117
}
74
118
75
119
sub run_check
76
120
{
77
121
local $Test::Builder::Level = $Test::Builder::Level + 1;
78
122
79
- my ($suffix , $test_name ) = @_ ;
123
+ my ($testdata , $oldestkeptwalfile , $ test_name, @options ) = @_ ;
80
124
81
- create_files();
125
+ create_files(@$testdata );
82
126
83
127
command_ok(
84
- [
85
- ' pg_archivecleanup' , ' -x' , ' .gz' , $tempdir ,
86
- $walfiles [2] . $suffix
87
- ],
128
+ [ ' pg_archivecleanup' , @options , $tempdir , $oldestkeptwalfile ],
88
129
" $test_name : runs" );
89
130
90
- ok(!-f " $tempdir /$walfiles [0]" ,
91
- " $test_name : first older WAL file was cleaned up" );
92
- ok(!-f " $tempdir /$walfiles [1]" ,
93
- " $test_name : second older WAL file was cleaned up" );
94
- ok(-f " $tempdir /$walfiles [2]" ,
95
- " $test_name : restartfile was not cleaned up" );
96
- ok(-f " $tempdir /$walfiles [3]" ,
97
- " $test_name : newer WAL file was not cleaned up" );
98
- ok(-f " $tempdir /unrelated_file" ,
99
- " $test_name : unrelated file was not cleaned up" );
131
+ for my $walpair (@$testdata )
132
+ {
133
+ if ($walpair -> {present })
134
+ {
135
+ ok(-f " $tempdir /$walpair ->{name}" ,
136
+ " $test_name :$walpair ->{name} was not cleaned up" );
137
+ }
138
+ else
139
+ {
140
+ ok(!-f " $tempdir /$walpair ->{name}" ,
141
+ " $test_name :$walpair ->{name} was cleaned up" );
142
+ }
143
+ }
144
+
145
+ remove_files(@$testdata );
100
146
return ;
101
147
}
102
148
103
- run_check(' ' , ' pg_archivecleanup' );
104
- run_check(' .partial' , ' pg_archivecleanup with .partial file' );
105
- run_check(' .00000020.backup' , ' pg_archivecleanup with .backup file' );
149
+ run_check(\@walfiles_with_gz , ' 00000001000000370000000E' ,
150
+ ' pg_archivecleanup' , ' -x.gz' );
151
+ run_check(
152
+ \@walfiles_with_gz ,
153
+ ' 00000001000000370000000E.partial' ,
154
+ ' pg_archivecleanup with .partial file' , ' -x.gz' );
155
+ run_check(
156
+ \@walfiles_with_gz ,
157
+ ' 00000001000000370000000E.00000020.backup' ,
158
+ ' pg_archivecleanup with .backup file' , ' -x.gz' );
159
+ run_check(\@walfiles_for_clean_backup_history ,
160
+ ' 00000001000000370000000E' ,
161
+ ' pg_archivecleanup with --clean-backup-history' , ' -b' );
106
162
107
163
done_testing();
0 commit comments