Backpatch addition of wait_for_log(), pump_until().
authorAndres Freund
Tue, 3 May 2022 01:09:43 +0000 (18:09 -0700)
committerAndres Freund
Tue, 3 May 2022 01:09:43 +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 fd71968ea858d7ab6b7c190aed4dc6cd93f0049c..d7cdfda0fbe922ad40747bab2213f89f1be28cb3 100644 (file)
@@ -26,6 +26,7 @@ our @EXPORT = qw(
   system_log
   run_log
   run_command
+  pump_until
 
   command_ok
   command_fails
index 35650e264064552eb61812b5c2833ad03a38a0f1..07f19bc0b230766e9b83783520ea4f84a45b6956 100644 (file)
@@ -2184,6 +2184,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 af06cdac5b5a279e3ca604dc7e13db74b6fbb35e..63adf3b701ce5c12e1b1bc611cfeeb9bbd49d787 100644 (file)
@@ -70,6 +70,7 @@ our @EXPORT = qw(
   system_log
   run_log
   run_command
+  pump_until
 
   command_ok
   command_fails
@@ -377,6 +378,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.