diff --git a/src/test/recovery/t/002_archiving.pl b/src/test/recovery/t/002_archiving.pl index c675c0886c..8db7e47d13 100644 --- a/src/test/recovery/t/002_archiving.pl +++ b/src/test/recovery/t/002_archiving.pl @@ -6,7 +6,7 @@ use strict; use warnings; use PostgresNode; use TestLib; -use Test::More tests => 3; +use Test::More tests => 4; use File::Copy; # Initialize primary node, doing archives @@ -75,3 +75,42 @@ ok( !-f "$node_standby2_data/pg_wal/RECOVERYHISTORY", "RECOVERYHISTORY removed after promotion"); ok( !-f "$node_standby2_data/pg_wal/RECOVERYXLOG", "RECOVERYXLOG removed after promotion"); + +# Check that archive recovery can be paused or resumed expectedly. +my $node_standby3 = get_new_node('standby3'); +$node_standby3->init_from_backup($node_primary, $backup_name, + has_restoring => 1); +$node_standby3->start; + +# Archive recovery is not yet paused. +is($node_standby3->safe_psql('postgres', + "SELECT pg_get_wal_replay_pause_state()"), + 'not paused', 'pg_get_wal_replay_pause_state() reports not paused'); + +# Request to pause archive recovery and wait until it's actually paused. +$node_standby3->safe_psql('postgres', "SELECT pg_wal_replay_pause()"); +$node_primary->safe_psql('postgres', + "INSERT INTO tab_int VALUES (generate_series(2001,2010))"); +$node_standby3->poll_query_until('postgres', + "SELECT pg_get_wal_replay_pause_state() = 'paused'") + or die "Timed out while waiting for archive recovery to be paused"; + +# Request to resume archive recovery and wait until it's actually resumed. +$node_standby3->safe_psql('postgres', "SELECT pg_wal_replay_resume()"); +$node_standby3->poll_query_until('postgres', + "SELECT pg_get_wal_replay_pause_state() = 'not paused'") + or die "Timed out while waiting for archive recovery to be resumed"; + +# Check that the paused state ends and promotion continues if a promotion +# is triggered while recovery is paused. +$node_standby3->safe_psql('postgres', "SELECT pg_wal_replay_pause()"); +$node_primary->safe_psql('postgres', + "INSERT INTO tab_int VALUES (generate_series(2011,2020))"); +$node_standby3->poll_query_until('postgres', + "SELECT pg_get_wal_replay_pause_state() = 'paused'") + or die "Timed out while waiting for archive recovery to be paused"; + +$node_standby3->promote; +$node_standby3->poll_query_until('postgres', + "SELECT NOT pg_is_in_recovery()") + or die "Timed out while waiting for promotion to finish";