mirror of
https://github.com/postgres/postgres.git
synced 2025-06-08 22:02:03 +03:00
Minor cleanup related to pg_wal_replay_wait() procedure
* Rename $node_standby1 to $node_standby in 043_wal_replay_wait.pl as there is only one standby. * Remove useless debug printing in 043_wal_replay_wait.pl. * Fix typo in one check description in 043_wal_replay_wait.pl. * Fix some wording in comments and documentation. Reported-by: Alexander Lakhin Discussion: https://postgr.es/m/1d7b08f2-64a2-77fb-c666-c9a74c68eeda%40gmail.com Reviewed-by: Alexander Lakhin
This commit is contained in:
parent
d8adfc18be
commit
85b98b8d5a
@ -29076,7 +29076,7 @@ postgres=# SELECT * FROM movie WHERE genre = 'Drama';
|
|||||||
(0 rows)
|
(0 rows)
|
||||||
</programlisting>
|
</programlisting>
|
||||||
|
|
||||||
It may also happen that target <acronym>lsn</acronym> is not achieved
|
It may also happen that target <acronym>lsn</acronym> is not reached
|
||||||
within the timeout. In that case the error is thrown.
|
within the timeout. In that case the error is thrown.
|
||||||
|
|
||||||
<programlisting>
|
<programlisting>
|
||||||
|
@ -6168,7 +6168,7 @@ StartupXLOG(void)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Wake up all waiters for replay LSN. They need to report an error that
|
* Wake up all waiters for replay LSN. They need to report an error that
|
||||||
* recovery was ended before achieving the target LSN.
|
* recovery was ended before reaching the target LSN.
|
||||||
*/
|
*/
|
||||||
WaitLSNSetLatches(InvalidXLogRecPtr);
|
WaitLSNSetLatches(InvalidXLogRecPtr);
|
||||||
|
|
||||||
|
@ -299,7 +299,7 @@ WaitForLSNReplay(XLogRecPtr targetLSN, int64 timeout)
|
|||||||
/*
|
/*
|
||||||
* If the timeout value is specified, calculate the number of
|
* If the timeout value is specified, calculate the number of
|
||||||
* milliseconds before the timeout. Exit if the timeout is already
|
* milliseconds before the timeout. Exit if the timeout is already
|
||||||
* achieved.
|
* reached.
|
||||||
*/
|
*/
|
||||||
if (timeout > 0)
|
if (timeout > 0)
|
||||||
{
|
{
|
||||||
@ -325,7 +325,7 @@ WaitForLSNReplay(XLogRecPtr targetLSN, int64 timeout)
|
|||||||
deleteLSNWaiter();
|
deleteLSNWaiter();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we didn't achieve the target LSN, we must be exited by timeout.
|
* If we didn't reach the target LSN, we must be exited by timeout.
|
||||||
*/
|
*/
|
||||||
if (targetLSN > currentLSN)
|
if (targetLSN > currentLSN)
|
||||||
{
|
{
|
||||||
|
@ -19,15 +19,15 @@ my $backup_name = 'my_backup';
|
|||||||
$node_primary->backup($backup_name);
|
$node_primary->backup($backup_name);
|
||||||
|
|
||||||
# Create a streaming standby with a 1 second delay from the backup
|
# Create a streaming standby with a 1 second delay from the backup
|
||||||
my $node_standby1 = PostgreSQL::Test::Cluster->new('standby');
|
my $node_standby = PostgreSQL::Test::Cluster->new('standby');
|
||||||
my $delay = 1;
|
my $delay = 1;
|
||||||
$node_standby1->init_from_backup($node_primary, $backup_name,
|
$node_standby->init_from_backup($node_primary, $backup_name,
|
||||||
has_streaming => 1);
|
has_streaming => 1);
|
||||||
$node_standby1->append_conf(
|
$node_standby->append_conf(
|
||||||
'postgresql.conf', qq[
|
'postgresql.conf', qq[
|
||||||
recovery_min_apply_delay = '${delay}s'
|
recovery_min_apply_delay = '${delay}s'
|
||||||
]);
|
]);
|
||||||
$node_standby1->start;
|
$node_standby->start;
|
||||||
|
|
||||||
# 1. Make sure that pg_wal_replay_wait() works: add new content to
|
# 1. Make sure that pg_wal_replay_wait() works: add new content to
|
||||||
# primary and memorize primary's insert LSN, then wait for that LSN to be
|
# primary and memorize primary's insert LSN, then wait for that LSN to be
|
||||||
@ -36,7 +36,7 @@ $node_primary->safe_psql('postgres',
|
|||||||
"INSERT INTO wait_test VALUES (generate_series(11, 20))");
|
"INSERT INTO wait_test VALUES (generate_series(11, 20))");
|
||||||
my $lsn1 =
|
my $lsn1 =
|
||||||
$node_primary->safe_psql('postgres', "SELECT pg_current_wal_insert_lsn()");
|
$node_primary->safe_psql('postgres', "SELECT pg_current_wal_insert_lsn()");
|
||||||
my $output = $node_standby1->safe_psql(
|
my $output = $node_standby->safe_psql(
|
||||||
'postgres', qq[
|
'postgres', qq[
|
||||||
CALL pg_wal_replay_wait('${lsn1}', 1000000);
|
CALL pg_wal_replay_wait('${lsn1}', 1000000);
|
||||||
SELECT pg_lsn_cmp(pg_last_wal_replay_lsn(), '${lsn1}'::pg_lsn);
|
SELECT pg_lsn_cmp(pg_last_wal_replay_lsn(), '${lsn1}'::pg_lsn);
|
||||||
@ -52,7 +52,7 @@ $node_primary->safe_psql('postgres',
|
|||||||
"INSERT INTO wait_test VALUES (generate_series(21, 30))");
|
"INSERT INTO wait_test VALUES (generate_series(21, 30))");
|
||||||
my $lsn2 =
|
my $lsn2 =
|
||||||
$node_primary->safe_psql('postgres', "SELECT pg_current_wal_insert_lsn()");
|
$node_primary->safe_psql('postgres', "SELECT pg_current_wal_insert_lsn()");
|
||||||
$output = $node_standby1->safe_psql(
|
$output = $node_standby->safe_psql(
|
||||||
'postgres', qq[
|
'postgres', qq[
|
||||||
CALL pg_wal_replay_wait('${lsn2}');
|
CALL pg_wal_replay_wait('${lsn2}');
|
||||||
SELECT count(*) FROM wait_test;
|
SELECT count(*) FROM wait_test;
|
||||||
@ -68,9 +68,9 @@ my $lsn3 =
|
|||||||
$node_primary->safe_psql('postgres',
|
$node_primary->safe_psql('postgres',
|
||||||
"SELECT pg_current_wal_insert_lsn() + 10000000000");
|
"SELECT pg_current_wal_insert_lsn() + 10000000000");
|
||||||
my $stderr;
|
my $stderr;
|
||||||
$node_standby1->safe_psql('postgres',
|
$node_standby->safe_psql('postgres',
|
||||||
"CALL pg_wal_replay_wait('${lsn2}', 10);");
|
"CALL pg_wal_replay_wait('${lsn2}', 10);");
|
||||||
$node_standby1->psql(
|
$node_standby->psql(
|
||||||
'postgres',
|
'postgres',
|
||||||
"CALL pg_wal_replay_wait('${lsn3}', 1000);",
|
"CALL pg_wal_replay_wait('${lsn3}', 1000);",
|
||||||
stderr => \$stderr);
|
stderr => \$stderr);
|
||||||
@ -88,7 +88,7 @@ $node_primary->psql(
|
|||||||
ok( $stderr =~ /recovery is not in progress/,
|
ok( $stderr =~ /recovery is not in progress/,
|
||||||
"get an error when running on the primary");
|
"get an error when running on the primary");
|
||||||
|
|
||||||
$node_standby1->psql(
|
$node_standby->psql(
|
||||||
'postgres',
|
'postgres',
|
||||||
"BEGIN ISOLATION LEVEL REPEATABLE READ; CALL pg_wal_replay_wait('${lsn3}');",
|
"BEGIN ISOLATION LEVEL REPEATABLE READ; CALL pg_wal_replay_wait('${lsn3}');",
|
||||||
stderr => \$stderr);
|
stderr => \$stderr);
|
||||||
@ -107,8 +107,8 @@ CREATE FUNCTION pg_wal_replay_wait_wrap(target_lsn pg_lsn) RETURNS void AS \$\$
|
|||||||
LANGUAGE plpgsql;
|
LANGUAGE plpgsql;
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$node_primary->wait_for_catchup($node_standby1);
|
$node_primary->wait_for_catchup($node_standby);
|
||||||
$node_standby1->psql(
|
$node_standby->psql(
|
||||||
'postgres',
|
'postgres',
|
||||||
"SELECT pg_wal_replay_wait_wrap('${lsn3}');",
|
"SELECT pg_wal_replay_wait_wrap('${lsn3}');",
|
||||||
stderr => \$stderr);
|
stderr => \$stderr);
|
||||||
@ -134,17 +134,16 @@ CREATE FUNCTION log_count(i int) RETURNS void AS \$\$
|
|||||||
\$\$
|
\$\$
|
||||||
LANGUAGE plpgsql;
|
LANGUAGE plpgsql;
|
||||||
]);
|
]);
|
||||||
$node_standby1->safe_psql('postgres', "SELECT pg_wal_replay_pause();");
|
$node_standby->safe_psql('postgres', "SELECT pg_wal_replay_pause();");
|
||||||
my @psql_sessions;
|
my @psql_sessions;
|
||||||
for (my $i = 0; $i < 5; $i++)
|
for (my $i = 0; $i < 5; $i++)
|
||||||
{
|
{
|
||||||
print($i);
|
|
||||||
$node_primary->safe_psql('postgres',
|
$node_primary->safe_psql('postgres',
|
||||||
"INSERT INTO wait_test VALUES (${i});");
|
"INSERT INTO wait_test VALUES (${i});");
|
||||||
my $lsn =
|
my $lsn =
|
||||||
$node_primary->safe_psql('postgres',
|
$node_primary->safe_psql('postgres',
|
||||||
"SELECT pg_current_wal_insert_lsn()");
|
"SELECT pg_current_wal_insert_lsn()");
|
||||||
$psql_sessions[$i] = $node_standby1->background_psql('postgres');
|
$psql_sessions[$i] = $node_standby->background_psql('postgres');
|
||||||
$psql_sessions[$i]->query_until(
|
$psql_sessions[$i]->query_until(
|
||||||
qr/start/, qq[
|
qr/start/, qq[
|
||||||
\\echo start
|
\\echo start
|
||||||
@ -152,11 +151,11 @@ for (my $i = 0; $i < 5; $i++)
|
|||||||
SELECT log_count(${i});
|
SELECT log_count(${i});
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
my $log_offset = -s $node_standby1->logfile;
|
my $log_offset = -s $node_standby->logfile;
|
||||||
$node_standby1->safe_psql('postgres', "SELECT pg_wal_replay_resume();");
|
$node_standby->safe_psql('postgres', "SELECT pg_wal_replay_resume();");
|
||||||
for (my $i = 0; $i < 5; $i++)
|
for (my $i = 0; $i < 5; $i++)
|
||||||
{
|
{
|
||||||
$node_standby1->wait_for_log("count ${i}", $log_offset);
|
$node_standby->wait_for_log("count ${i}", $log_offset);
|
||||||
$psql_sessions[$i]->quit;
|
$psql_sessions[$i]->quit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -171,25 +170,24 @@ my $lsn4 =
|
|||||||
"SELECT pg_current_wal_insert_lsn() + 10000000000");
|
"SELECT pg_current_wal_insert_lsn() + 10000000000");
|
||||||
my $lsn5 =
|
my $lsn5 =
|
||||||
$node_primary->safe_psql('postgres', "SELECT pg_current_wal_insert_lsn()");
|
$node_primary->safe_psql('postgres', "SELECT pg_current_wal_insert_lsn()");
|
||||||
my $psql_session = $node_standby1->background_psql('postgres');
|
my $psql_session = $node_standby->background_psql('postgres');
|
||||||
$psql_session->query_until(
|
$psql_session->query_until(
|
||||||
qr/start/, qq[
|
qr/start/, qq[
|
||||||
\\echo start
|
\\echo start
|
||||||
CALL pg_wal_replay_wait('${lsn4}');
|
CALL pg_wal_replay_wait('${lsn4}');
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$log_offset = -s $node_standby1->logfile;
|
$log_offset = -s $node_standby->logfile;
|
||||||
$node_standby1->promote;
|
$node_standby->promote;
|
||||||
$node_standby1->wait_for_log('recovery is not in progress', $log_offset);
|
$node_standby->wait_for_log('recovery is not in progress', $log_offset);
|
||||||
|
|
||||||
ok(1, 'got error after standby promote');
|
ok(1, 'got error after standby promote');
|
||||||
|
|
||||||
$node_standby1->safe_psql('postgres', "CALL pg_wal_replay_wait('${lsn5}');");
|
$node_standby->safe_psql('postgres', "CALL pg_wal_replay_wait('${lsn5}');");
|
||||||
|
|
||||||
ok(1,
|
ok(1, 'wait for already replayed LSN exits immediately even after promotion');
|
||||||
'wait for already replayed LSN exists immediately even after promotion');
|
|
||||||
|
|
||||||
$node_standby1->stop;
|
$node_standby->stop;
|
||||||
$node_primary->stop;
|
$node_primary->stop;
|
||||||
|
|
||||||
# If we send \q with $psql_session->quit the command can be sent to the session
|
# If we send \q with $psql_session->quit the command can be sent to the session
|
||||||
|
Loading…
x
Reference in New Issue
Block a user