@ -19,15 +19,15 @@ my $backup_name = 'my_backup';
$ node_primary - > backup ( $ backup_name ) ;
# Create a streaming standby with a 1 second delay from the backup
my $ node_standby1 = PostgreSQL::Test::Cluster - > new ( 'standby' ) ;
my $ node_standby = PostgreSQL::Test::Cluster - > new ( 'standby' ) ;
my $ delay = 1 ;
$ node_standby1 - > init_from_backup ( $ node_primary , $ backup_name ,
$ node_standby - > init_from_backup ( $ node_primary , $ backup_name ,
has_streaming = > 1 ) ;
$ node_standby1 - > append_conf (
$ node_standby - > append_conf (
'postgresql.conf' , qq[
recovery_min_apply_delay = '${delay}s'
] ) ;
$ node_standby1 - > start ;
$ node_standby - > start ;
# 1. Make sure that pg_wal_replay_wait() works: add new content to
# primary and memorize primary's insert LSN, then wait for that LSN to be
@ -36,7 +36,7 @@ $node_primary->safe_psql('postgres',
"INSERT INTO wait_test VALUES (generate_series(11, 20))" ) ;
my $ lsn1 =
$ node_primary - > safe_psql ( 'postgres' , "SELECT pg_current_wal_insert_lsn()" ) ;
my $ output = $ node_standby1 - > safe_psql (
my $ output = $ node_standby - > safe_psql (
'postgres' , qq[
CALL pg_wal_replay_wait ( '${lsn1}' , 1000000 ) ;
SELECT pg_lsn_cmp ( pg_last_wal_replay_lsn ( ) , '${lsn1}' :: pg_lsn ) ;
@ -52,7 +52,7 @@ $node_primary->safe_psql('postgres',
"INSERT INTO wait_test VALUES (generate_series(21, 30))" ) ;
my $ lsn2 =
$ node_primary - > safe_psql ( 'postgres' , "SELECT pg_current_wal_insert_lsn()" ) ;
$ output = $ node_standby1 - > safe_psql (
$ output = $ node_standby - > safe_psql (
'postgres' , qq[
CALL pg_wal_replay_wait ( '${lsn2}' ) ;
SELECT count ( * ) FROM wait_test ;
@ -68,9 +68,9 @@ my $lsn3 =
$ node_primary - > safe_psql ( 'postgres' ,
"SELECT pg_current_wal_insert_lsn() + 10000000000" ) ;
my $ stderr ;
$ node_standby1 - > safe_psql ( 'postgres' ,
$ node_standby - > safe_psql ( 'postgres' ,
"CALL pg_wal_replay_wait('${lsn2}', 10);" ) ;
$ node_standby1 - > psql (
$ node_standby - > psql (
'postgres' ,
"CALL pg_wal_replay_wait('${lsn3}', 1000);" ,
stderr = > \ $ stderr ) ;
@ -88,7 +88,7 @@ $node_primary->psql(
ok ( $ stderr =~ /recovery is not in progress/ ,
"get an error when running on the primary" ) ;
$ node_standby1 - > psql (
$ node_standby - > psql (
'postgres' ,
"BEGIN ISOLATION LEVEL REPEATABLE READ; CALL pg_wal_replay_wait('${lsn3}');" ,
stderr = > \ $ stderr ) ;
@ -107,8 +107,8 @@ CREATE FUNCTION pg_wal_replay_wait_wrap(target_lsn pg_lsn) RETURNS void AS \$\$
LANGUAGE plpgsql ;
] ) ;
$ node_primary - > wait_for_catchup ( $ node_standby1 ) ;
$ node_standby1 - > psql (
$ node_primary - > wait_for_catchup ( $ node_standby ) ;
$ node_standby - > psql (
'postgres' ,
"SELECT pg_wal_replay_wait_wrap('${lsn3}');" ,
stderr = > \ $ stderr ) ;
@ -134,17 +134,16 @@ CREATE FUNCTION log_count(i int) RETURNS void AS \$\$
\ $\ $
LANGUAGE plpgsql ;
] ) ;
$ node_standby1 - > safe_psql ( 'postgres' , "SELECT pg_wal_replay_pause();" ) ;
$ node_standby - > safe_psql ( 'postgres' , "SELECT pg_wal_replay_pause();" ) ;
my @ psql_sessions ;
for ( my $ i = 0 ; $ i < 5 ; $ i + + )
{
print ( $ i ) ;
$ node_primary - > safe_psql ( 'postgres' ,
"INSERT INTO wait_test VALUES (${i});" ) ;
my $ lsn =
$ node_primary - > safe_psql ( 'postgres' ,
"SELECT pg_current_wal_insert_lsn()" ) ;
$ psql_sessions [ $ i ] = $ node_standby1 - > background_psql ( 'postgres' ) ;
$ psql_sessions [ $ i ] = $ node_standby - > background_psql ( 'postgres' ) ;
$ psql_sessions [ $ i ] - > query_until (
qr/start/ , qq[
\ \ echo start
@ -152,11 +151,11 @@ for (my $i = 0; $i < 5; $i++)
SELECT log_count ( $ { i } ) ;
] ) ;
}
my $ log_offset = - s $ node_standby1 - > logfile ;
$ node_standby1 - > safe_psql ( 'postgres' , "SELECT pg_wal_replay_resume();" ) ;
my $ log_offset = - s $ node_standby - > logfile ;
$ node_standby - > safe_psql ( 'postgres' , "SELECT pg_wal_replay_resume();" ) ;
for ( my $ i = 0 ; $ i < 5 ; $ i + + )
{
$ node_standby1 - > wait_for_log ( "count ${i}" , $ log_offset ) ;
$ node_standby - > wait_for_log ( "count ${i}" , $ log_offset ) ;
$ psql_sessions [ $ i ] - > quit ;
}
@ -171,25 +170,24 @@ my $lsn4 =
"SELECT pg_current_wal_insert_lsn() + 10000000000" ) ;
my $ lsn5 =
$ node_primary - > safe_psql ( 'postgres' , "SELECT pg_current_wal_insert_lsn()" ) ;
my $ psql_session = $ node_standby1 - > background_psql ( 'postgres' ) ;
my $ psql_session = $ node_standby - > background_psql ( 'postgres' ) ;
$ psql_session - > query_until (
qr/start/ , qq[
\ \ echo start
CALL pg_wal_replay_wait ( '${lsn4}' ) ;
] ) ;
$ log_offset = - s $ node_standby1 - > logfile ;
$ node_standby1 - > promote ;
$ node_standby1 - > wait_for_log ( 'recovery is not in progress' , $ log_offset ) ;
$ log_offset = - s $ node_standby - > logfile ;
$ node_standby - > promote ;
$ node_standby - > wait_for_log ( 'recovery is not in progress' , $ log_offset ) ;
ok ( 1 , 'got error after standby promote' ) ;
$ node_standby1 - > safe_psql ( 'postgres' , "CALL pg_wal_replay_wait('${lsn5}');" ) ;
$ node_standby - > safe_psql ( 'postgres' , "CALL pg_wal_replay_wait('${lsn5}');" ) ;
ok ( 1 ,
'wait for already replayed LSN exists immediately even after promotion' ) ;
ok ( 1 , 'wait for already replayed LSN exits immediately even after promotion' ) ;
$ node_standby1 - > stop ;
$ node_standby - > stop ;
$ node_primary - > stop ;
# If we send \q with $psql_session->quit the command can be sent to the session