diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index 7f87eb7f199..04f6c3ebb4a 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -2478,7 +2478,7 @@ WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, XLogSegNo endSegNo; XLByteToSeg(sendTimeLineValidUpto, endSegNo, state->segcxt.ws_segsize); - if (state->seg.ws_segno == endSegNo) + if (nextSegNo == endSegNo) *tli_p = sendTimeLineNextTLI; } diff --git a/src/test/recovery/t/004_timeline_switch.pl b/src/test/recovery/t/004_timeline_switch.pl index 7e952d36676..edadab790f3 100644 --- a/src/test/recovery/t/004_timeline_switch.pl +++ b/src/test/recovery/t/004_timeline_switch.pl @@ -1,15 +1,16 @@ # Test for timeline switch -# Ensure that a cascading standby is able to follow a newly-promoted standby -# on a new timeline. use strict; use warnings; use File::Path qw(rmtree); use PostgresNode; use TestLib; -use Test::More tests => 2; +use Test::More tests => 3; $ENV{PGDATABASE} = 'postgres'; +# Ensure that a cascading standby is able to follow a newly-promoted standby +# on a new timeline. + # Initialize master node my $node_master = get_new_node('master'); $node_master->init(allows_streaming => 1); @@ -66,3 +67,38 @@ $node_standby_1->wait_for_catchup($node_standby_2, 'replay', my $result = $node_standby_2->safe_psql('postgres', "SELECT count(*) FROM tab_int"); is($result, qq(2000), 'check content of standby 2'); + + +# Ensure that a standby is able to follow a master on a newer timeline +# when WAL archiving is enabled. + +# Initialize master node +my $node_master_2 = get_new_node('master_2'); +$node_master_2->init(allows_streaming => 1, has_archiving => 1); +$node_master_2->start; + +# Take backup +$node_master_2->backup($backup_name); + +# Create standby node +my $node_standby_3 = get_new_node('standby_3'); +$node_standby_3->init_from_backup($node_master_2, $backup_name, + has_streaming => 1); + +# Restart master node in standby mode and promote it, switching it +# to a new timeline. +$node_master_2->set_standby_mode; +$node_master_2->restart; +$node_master_2->promote; + +# Start standby node, create some content on master and check its presence +# in standby, to ensure that the timeline switch has been done. +$node_standby_3->start; +$node_master_2->safe_psql('postgres', + "CREATE TABLE tab_int AS SELECT 1 AS a"); +$node_master_2->wait_for_catchup($node_standby_3, 'replay', + $node_master_2->lsn('write')); + +my $result_2 = + $node_standby_3->safe_psql('postgres', "SELECT count(*) FROM tab_int"); +is($result_2, qq(1), 'check content of standby 3');