# Checks for recovery_min_apply_delay use strict; use warnings; use PostgresNode; use TestLib; use Test::More tests => 1; # Initialize master node my $node_master = get_new_node('master'); $node_master->init(allows_streaming => 1); $node_master->start; # And some content $node_master->safe_psql('postgres', "CREATE TABLE tab_int AS SELECT generate_series(1, 10) AS a"); # Take backup my $backup_name = 'my_backup'; $node_master->backup($backup_name); # Create streaming standby from backup my $node_standby = get_new_node('standby'); my $delay = 3; $node_standby->init_from_backup($node_master, $backup_name, has_streaming => 1); $node_standby->append_conf( 'postgresql.conf', qq( recovery_min_apply_delay = '${delay}s' )); $node_standby->start; # Make new content on master and check its presence in standby depending # on the delay applied above. Before doing the insertion, get the # current timestamp that will be used as a comparison base. Even on slow # machines, this allows to have a predictable behavior when comparing the # delay between data insertion moment on master and replay time on standby. my $master_insert_time = time(); $node_master->safe_psql('postgres', "INSERT INTO tab_int VALUES (generate_series(11, 20))"); # Now wait for replay to complete on standby. We're done waiting when the # standby has replayed up to the previously saved master LSN. my $until_lsn = $node_master->safe_psql('postgres', "SELECT pg_current_wal_lsn()"); $node_standby->poll_query_until('postgres', "SELECT (pg_last_wal_replay_lsn() - '$until_lsn'::pg_lsn) >= 0") or die "standby never caught up"; # This test is successful if and only if the LSN has been applied with at least # the configured apply delay. ok(time() - $master_insert_time >= $delay, "standby applies WAL only after replication delay");