diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index fe0d368a35b..8545c6c4231 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -2491,7 +2491,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 1ecdb0eba0d..8dad044db4b 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 primary node my $node_primary = get_new_node('primary'); $node_primary->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 primary on a newer timeline +# when WAL archiving is enabled. + +# Initialize primary node +my $node_primary_2 = get_new_node('primary_2'); +$node_primary_2->init(allows_streaming => 1, has_archiving => 1); +$node_primary_2->start; + +# Take backup +$node_primary_2->backup($backup_name); + +# Create standby node +my $node_standby_3 = get_new_node('standby_3'); +$node_standby_3->init_from_backup($node_primary_2, $backup_name, + has_streaming => 1); + +# Restart primary node in standby mode and promote it, switching it +# to a new timeline. +$node_primary_2->set_standby_mode; +$node_primary_2->restart; +$node_primary_2->promote; + +# Start standby node, create some content on primary and check its presence +# in standby, to ensure that the timeline switch has been done. +$node_standby_3->start; +$node_primary_2->safe_psql('postgres', + "CREATE TABLE tab_int AS SELECT 1 AS a"); +$node_primary_2->wait_for_catchup($node_standby_3, 'replay', + $node_primary_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');