Backpatch addition of wait_for_log(), pump_until().
authorAndres Freund
Tue, 3 May 2022 01:09:42 +0000 (18:09 -0700)
committerAndres Freund
Tue, 3 May 2022 01:09:42 +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 df5def49d52c72af9b068c34065cea6472994f7c..bdbbd6e4706eac237e113c509d8b2565a2e14442 100644 (file)
@@ -27,6 +27,7 @@ our @EXPORT = qw(
   system_log
   run_log
   run_command
+  pump_until
 
   command_ok
   command_fails
index d130052c3edbf9626ed8277b951f456f6bc08f74..be9096388bbd4857338b6e317186a512073524f2 100644 (file)
@@ -2561,6 +2561,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__
index ba2beb1c9e532dc732c7dd71e4dcb86edb4fd9c8..f3ee20af41c2a5ab69898fc91394c833f0a97c73 100644 (file)
@@ -74,6 +74,7 @@ our @EXPORT = qw(
   system_log
   run_log
   run_command
+  pump_until
 
   command_ok
   command_fails
@@ -393,6 +394,36 @@ sub run_command
 
 =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;
+}
+
+=pod
+
 =item generate_ascii_string(from_char, to_char)
 
 Generate a string made of the given range of ASCII characters.