1
0
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:
Alexander Korotkov 2024-09-17 22:50:43 +03:00
parent d8adfc18be
commit 85b98b8d5a
4 changed files with 27 additions and 29 deletions

View File

@ -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>

View File

@ -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);

View File

@ -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)
{ {

View File

@ -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