wait_event.txt

text/plain

sub test_lagging_standbys
{
	my ($mode, $label, $message) = @_;

	$primary->adjust_conf('postgresql.conf',
		'synchronized_standby_slots', "'$mode'");
	$primary->reload;

	$primary->safe_psql('postgres',
		"SELECT pg_logical_emit_message(true, 'qtest', '$message');"
	);

	$primary->wait_for_replay_catchup($standby2);

	my $bg = $primary->background_psql(
		'postgres',
		on_error_stop => 0,
		timeout => $PostgreSQL::Test::Utils::timeout_default);

	$bg->query_until(
		qr/decode_start/, q(
   \echo decode_start
   SELECT pg_logical_slot_peek_changes('logical_failover', NULL, NULL); ));

	ok( $primary->poll_query_until(
			'postgres', q{
SELECT EXISTS (
	SELECT 1
	FROM pg_stat_activity
	WHERE wait_event = 'WaitForStandbyConfirmation');
        }),
		$label);

	$primary->adjust_conf('postgresql.conf',
		'synchronized_standby_slots', "''");
	$primary->reload;

	$bg->quit;
}


# Hold back standby1 feedback
$standby1->adjust_conf(
	'postgresql.conf',
	'wal_receiver_status_interval',
	"'0'"
);
$standby1->reload;

# FIRST 1 must wait
test_lagging_standbys(
	"FIRST 1 (sb1_slot, sb2_slot)",
	'FIRST 1 waits for lagging higher-priority slot',
	'first_1_lagging_blocks'
);

# ANY 1 must wait
test_lagging_standbys(
	"ANY 2 (sb1_slot, sb2_slot)",
	'ANY 1 waits for lagging sb1_slot slot',
	'any_2_lagging_blocks'
);