From 5c8b14a71d318a15c4db4fd3eb209d5c24934a43 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 2 May 2022 18:09:43 -0700 Subject: [PATCH] Backpatch addition of wait_for_log(), pump_until(). These were originally introduced in a2ab9c06ea1 and a2ab9c06ea1, as they are needed by a about-to-be-backpatched test. Discussion: https://postgr.es/m/20220413002626.udl7lll7f3o7nre7@alap3.anarazel.de Backpatch: 10-14 --- src/test/perl/PostgreSQL/Test/Utils.pm | 1 + src/test/perl/PostgresNode.pm | 35 ++++++++++++++++++++++++++ src/test/perl/TestLib.pm | 31 +++++++++++++++++++++++ 3 files changed, 67 insertions(+) diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm index 455b6aff8e..9b3886a5c5 100644 --- a/src/test/perl/PostgreSQL/Test/Utils.pm +++ b/src/test/perl/PostgreSQL/Test/Utils.pm @@ -26,6 +26,7 @@ our @EXPORT = qw( system_log run_log run_command + pump_until command_ok command_fails diff --git a/src/test/perl/PostgresNode.pm b/src/test/perl/PostgresNode.pm index e3b9b61ff3..fea0ece651 100644 --- a/src/test/perl/PostgresNode.pm +++ b/src/test/perl/PostgresNode.pm @@ -2075,6 +2075,41 @@ sub wait_for_slot_catchup =pod +=item $node->wait_for_log(regexp, offset) + +Waits for the contents of the server log file, starting at the given offset, to +match the supplied regular expression. Checks the entire log if no offset is +given. Times out after $TestLib::timeout_default seconds. + +If successful, returns the length of the entire log file, in bytes. + +=cut + +sub wait_for_log +{ + my ($self, $regexp, $offset) = @_; + $offset = 0 unless defined $offset; + + my $max_attempts = 10 * $TestLib::timeout_default; + my $attempts = 0; + + while ($attempts < $max_attempts) + { + my $log = TestLib::slurp_file($self->logfile, $offset); + + return $offset+length($log) if ($log =~ m/$regexp/); + + # Wait 0.1 second before retrying. + usleep(100_000); + + $attempts++; + } + + croak "timed out waiting for match: $regexp"; +} + +=pod + =item $node->query_hash($dbname, $query, @columns) Execute $query on $dbname, replacing any appearance of the string __COLUMNS__ diff --git a/src/test/perl/TestLib.pm b/src/test/perl/TestLib.pm index cb315b9828..4d3a7618b1 100644 --- a/src/test/perl/TestLib.pm +++ b/src/test/perl/TestLib.pm @@ -37,6 +37,7 @@ our @EXPORT = qw( system_log run_log run_command + pump_until command_ok command_fails @@ -251,6 +252,36 @@ sub run_command return ($stdout, $stderr); } +=pod + +=item pump_until(proc, timeout, stream, until) + +Pump until string is matched on the specified stream, or timeout occurs. + +=cut + +sub pump_until +{ + my ($proc, $timeout, $stream, $until) = @_; + $proc->pump_nb(); + while (1) + { + last if $$stream =~ /$until/; + if ($timeout->is_expired) + { + diag("pump_until: timeout expired when searching for \"$until\" with stream: \"$$stream\""); + return 0; + } + if (not $proc->pumpable()) + { + diag("pump_until: process terminated unexpectedly when searching for \"$until\" with stream: \"$$stream\""); + return 0; + } + $proc->pump(); + } + return 1; +} + # Generate a string made of the given range of ASCII characters sub generate_ascii_string {