Backpatch addition of wait_for_log(), pump_until().
authorAndres Freund <[email protected]>
Tue, 3 May 2022 01:09:44 +0000 (18:09 -0700)
committerAndres Freund <[email protected]>
Tue, 3 May 2022 01:09:44 +0000 (18:09 -0700)
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[email protected]
Backpatch: 10-14

src/test/perl/PostgreSQL/Test/Utils.pm
src/test/perl/PostgresNode.pm
src/test/perl/TestLib.pm

index 1f922e77486c35597d3fd0de64972b84fdf0e63f..bd6a49475ec0e9cdf00c2d84bb024dd3ca60c713 100644 (file)
@@ -22,6 +22,7 @@ our @EXPORT = qw(
   system_or_bail
   system_log
   run_log
+  pump_until
 
   command_ok
   command_fails
index 29a5e8835367011c31bb08c393ef313b0e2cb0ed..e310e23f95fdc43c978d935d2291647947b3a19f 100644 (file)
@@ -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__
index f94a71cd8e3f2b52f1deda0aa61547183fc2c0bc..541c21084816f1c669353840e2f3637bb3c23e8c 100644 (file)
@@ -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
 {