diff --git a/src/test/recovery/t/020_archive_status.pl b/src/test/recovery/t/020_archive_status.pl index 401412e687..d197066567 100644 --- a/src/test/recovery/t/020_archive_status.pl +++ b/src/test/recovery/t/020_archive_status.pl @@ -5,7 +5,7 @@ use strict; use warnings; use PostgresNode; use TestLib; -use Test::More tests => 13; +use Test::More tests => 16; use Config; my $primary = get_new_node('master'); @@ -93,7 +93,7 @@ $primary->safe_psql( $primary->poll_query_until('postgres', q{SELECT archived_count FROM pg_stat_archiver}, '1') - or die "Timed out while waiting for archiving to finish"; + or die "Timed out while waiting for archiving to finish"; ok(!-f "$primary_data/$segment_path_1_ready", ".ready file for archived WAL segment $segment_name_1 removed"); @@ -119,14 +119,23 @@ my $segment_path_2_done = "$segment_path_2.done"; $primary->safe_psql( 'postgres', q{ INSERT INTO mine SELECT generate_series(10,20) AS x; - SELECT pg_switch_wal(); CHECKPOINT; }); +# Make sure that the standby has caught here. +my $primary_lsn = $primary->safe_psql('postgres', + q{SELECT pg_current_wal_lsn()}); + +# force archiving current wal +$primary->safe_psql( + 'postgres', q{ + SELECT pg_switch_wal(); +}); + $primary->poll_query_until('postgres', q{ SELECT last_archived_wal FROM pg_stat_archiver }, $segment_name_2) - or die "Timed out while waiting for archiving to finish"; + or die "Timed out while waiting for archiving to finish"; # Test standby with archive_mode = on. my $standby1 = get_new_node('standby'); @@ -134,14 +143,30 @@ $standby1->init_from_backup($primary, 'backup', has_restoring => 1); $standby1->append_conf('postgresql.conf', "archive_mode = on"); my $standby1_data = $standby1->data_dir; $standby1->start; + +$standby1->poll_query_until('postgres', + qq{ SELECT pg_wal_lsn_diff(pg_last_wal_replay_lsn(), '$primary_lsn') >= 0 }) + or die "Timed out while waiting for xlog replay on standby2"; + $standby1->safe_psql('postgres', q{CHECKPOINT}); +# Recovery with archive_mode=on does not keep .ready signal files inherited +# from backup. Note that this WAL segment existed in the backup. +ok( !-f "$standby1_data/$segment_path_1_ready", + ".ready file for WAL segment $segment_name_1 present in backup got removed with archive_mode=on on standby" +); + # Recovery with archive_mode=on should not create .ready files. # Note that this segment did not exist in the backup. ok( !-f "$standby1_data/$segment_path_2_ready", ".ready file for WAL segment $segment_name_2 not created on standby when archive_mode=on on standby" ); +# Recovery with archive_mode = on creates .done files. +ok( -f "$standby1_data/$segment_path_2_done", + ".done file for WAL segment $segment_name_2 created when archive_mode=on on standby" +); + # Test recovery with archive_mode = always, which should always keep # .ready files if archiving is enabled, though here we want the archive # command to fail to persist the .ready files. Note that this node @@ -153,12 +178,20 @@ $standby2->append_conf('postgresql.conf', 'archive_mode = always'); my $standby2_data = $standby2->data_dir; $standby2->start; +$standby2->poll_query_until('postgres', + qq{ SELECT pg_wal_lsn_diff(pg_last_wal_replay_lsn(), '$primary_lsn') >= 0 }) + or die "Timed out while waiting for xlog replay on standby2"; + $standby2->safe_psql('postgres', q{CHECKPOINT}); ok( -f "$standby2_data/$segment_path_1_ready", ".ready file for WAL segment $segment_name_1 existing in backup is kept with archive_mode=always on standby" ); +ok( -f "$standby2_data/$segment_path_2_ready", + ".ready file for WAL segment $segment_name_2 created with archive_mode=always on standby" +); + # Reset statistics of the archiver for the next checks. $standby2->safe_psql('postgres', q{SELECT pg_stat_reset_shared('archiver')});