@ -1014,73 +1014,4 @@ is($cascading_stdout, $expected,
'got same expected output from pg_recvlogical decoding session on cascading standby'
) ;
##################################################
# Test that logical decoding on standby correctly handles a timeline
# change during promotion. This relies on an injection point that
# waits between the moment the segments of the old timeline are removed
# and the moment RecoveryInProgress() would set, catching that a WAL
# sender is still able to decode changes across a promotion.
##################################################
# Create a logical slot on the cascading standby for this test.
$ node_cascading_standby - > create_logical_slot_on_standby ( $ node_standby ,
'race_slot' , 'testdb' ) ;
$ node_standby - > safe_psql ( 'testdb' ,
qq[ INSERT INTO decoding_test(x,y) SELECT s, s::text FROM generate_series(10,13) s; ]
) ;
$ node_standby - > wait_for_replay_catchup ( $ node_cascading_standby ) ;
$ expected = q{ BEGIN
table public . decoding_test: INSERT: x [ integer ] : 10 y [ text ] : '10'
table public . decoding_test: INSERT: x [ integer ] : 11 y [ text ] : '11'
table public . decoding_test: INSERT: x [ integer ] : 12 y [ text ] : '12'
table public . decoding_test: INSERT: x [ integer ] : 13 y [ text ] : '13'
COMMIT } ;
$ node_standby - > safe_psql ( 'testdb' , 'CREATE EXTENSION injection_points;' ) ;
$ node_standby - > wait_for_replay_catchup ( $ node_cascading_standby ) ;
# Attach injection point to pause startup after WAL segment cleanup
# but before RecoveryInProgress() flips to false.
$ node_cascading_standby - > safe_psql ( 'testdb' ,
"SELECT injection_points_attach('promotion-after-wal-segment-cleanup', 'wait');"
) ;
# Promote, wait for the removal of the segments on the old timeline.
$ node_cascading_standby - > safe_psql ( 'testdb' , "SELECT pg_promote(false)" ) ;
$ node_cascading_standby - > wait_for_event ( 'startup' ,
'promotion-after-wal-segment-cleanup' ) ;
# Start pg_recvlogical.
my ( $ stdout2 , $ stderr2 ) ;
my $ handle2 = IPC::Run:: start (
[
'pg_recvlogical' ,
'--dbname' = > $ node_cascading_standby - > connstr ( 'testdb' ) ,
'--slot' = > 'race_slot' ,
'--option' = > 'include-xids=0' ,
'--option' = > 'skip-empty-xacts=1' ,
'--file' = > '-' ,
'--no-loop' ,
'--start' ,
] ,
'>' = > \ $ stdout2 ,
'2>' = > \ $ stderr2 ,
IPC::Run:: timeout ( $ default_timeout ) ) ;
# Verify that pg_recvlogical successfully decodes the data while startup
# is still paused in the injection point.
$ pump_timeout = IPC::Run:: timer ( $ default_timeout ) ;
ok ( pump_until ( $ handle2 , $ pump_timeout , \ $ stdout2 , qr/COMMIT/ s ) ,
'pg_recvlogical works during promotion timeline switch' ) ;
chomp ( $ stdout2 ) ;
is ( $ stdout2 , $ expected ,
'got expected output from pg_recvlogical during promotion timeline switch'
) ;
# Resume promotion.
$ node_cascading_standby - > safe_psql ( 'testdb' ,
"SELECT injection_points_wakeup('promotion-after-wal-segment-cleanup');" ) ;
done_testing ( ) ;