TAP-test_recovery_end_command_v2.patch
application/x-patch
Filename: TAP-test_recovery_end_command_v2.patch
Type: application/x-patch
Part: 0
Patch
Format: unified
Series: patch v2
| File | + | − |
|---|---|---|
| src/test/recovery/t/020_archive_status.pl | 34 | 1 |
diff --git a/src/test/recovery/t/020_archive_status.pl b/src/test/recovery/t/020_archive_status.pl
index cea65735a39..a89baa93401 100644
--- a/src/test/recovery/t/020_archive_status.pl
+++ b/src/test/recovery/t/020_archive_status.pl
@@ -8,7 +8,7 @@ use strict;
use warnings;
use PostgresNode;
use TestLib;
-use Test::More tests => 16;
+use Test::More tests => 20;
use Config;
my $primary = PostgresNode->new('primary');
@@ -234,3 +234,36 @@ ok( -f "$standby2_data/$segment_path_1_done"
&& -f "$standby2_data/$segment_path_2_done",
".done files created after archive success with archive_mode=always on standby"
);
+
+# Test archive_cleanup_command and recovery_end_command execution
+my $standby3 = PostgresNode->new('standby3');
+$standby3->init_from_backup($primary, 'backup', has_restoring => 1);
+my $standby3_data = $standby3->data_dir;
+my $archive_cleanup_command_file = "$standby3_data/archive_cleanup_command.done";
+my $recovery_end_command_file = "$standby3_data/recovery_end_command.done";
+$standby3->append_conf('postgresql.conf',
+ "archive_cleanup_command = 'echo archive_cleanuped > $archive_cleanup_command_file'");
+$standby3->append_conf('postgresql.conf',
+ "recovery_end_command = 'echo recovery_ended > $recovery_end_command_file'");
+
+$standby3->start;
+$primary_lsn = $primary->lsn('write');
+$standby2->poll_query_until('postgres',
+ qq{ SELECT pg_wal_lsn_diff(pg_last_wal_replay_lsn(), '$primary_lsn') >= 0 }
+) or die "Timed out while waiting for xlog replay on standby2";
+
+# archive_cleanup_command executed with every restart points
+ok( !-f "$archive_cleanup_command_file",
+ 'archive_cleanup_command not executed yet');
+# Checkpoint will trigger restart point on standby.
+$standby3->safe_psql('postgres', q{CHECKPOINT});
+ok(-f "$archive_cleanup_command_file",
+ 'archive_cleanup_command executed on checkpoint');
+
+# recovery_end_command_file executed only on recovery end which can happen on
+# promotion.
+ok( !-f "$recovery_end_command_file",
+ 'recovery_end_command not executed yet');
+$standby3->promote;
+ok(-f "$recovery_end_command_file",
+ 'recovery_end_command executed after promotion');