summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2022-05-02 18:09:44 -0700
committerAndres Freund <andres@anarazel.de>2022-05-02 18:09:44 -0700
commite8a0cf9b20a12d9cb7687a1363cdeb261ef16472 (patch)
tree20fb60bd8f0e810aebb450a535cc0421c3d3bf99
parentd6ae041c87488af37bc1f8b30697c3df1c24e65f (diff)
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
-rw-r--r--src/test/perl/PostgreSQL/Test/Utils.pm1
-rw-r--r--src/test/perl/PostgresNode.pm36
-rw-r--r--src/test/perl/TestLib.pm31
3 files changed, 68 insertions, 0 deletions
diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm
index 1f922e77486..bd6a49475ec 100644
--- a/src/test/perl/PostgreSQL/Test/Utils.pm
+++ b/src/test/perl/PostgreSQL/Test/Utils.pm
@@ -22,6 +22,7 @@ our @EXPORT = qw(
system_or_bail
system_log
run_log
+ pump_until
command_ok
command_fails
diff --git a/src/test/perl/PostgresNode.pm b/src/test/perl/PostgresNode.pm
index 29a5e883536..e310e23f95f 100644
--- a/src/test/perl/PostgresNode.pm
+++ b/src/test/perl/PostgresNode.pm
@@ -83,6 +83,7 @@ package PostgresNode;
use strict;
use warnings;
+use Carp;
use Config;
use Cwd;
use Exporter 'import';
@@ -1932,6 +1933,41 @@ qq[SELECT '$target_lsn' <= ${mode}_lsn FROM pg_catalog.pg_replication_slots WHER
=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 f94a71cd8e3..541c2108481 100644
--- a/src/test/perl/TestLib.pm
+++ b/src/test/perl/TestLib.pm
@@ -31,6 +31,7 @@ our @EXPORT = qw(
system_or_bail
system_log
run_log
+ pump_until
command_ok
command_fails
@@ -232,6 +233,36 @@ sub run_log
return IPC::Run::run(@_);
}
+=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
{