]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Backpatch addition of wait_for_log(), pump_until().
authorAndres Freund <andres@anarazel.de>
Tue, 3 May 2022 01:09:44 +0000 (18:09 -0700)
committerAndres Freund <andres@anarazel.de>
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.udl7lll7f3o7nre7@alap3.anarazel.de
Backpatch: 10-14

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

index 43ca2693ec14f83da8052015f552f539778e2fac..1248559caf8025756bde3ec0900c0654ecc5469f 100644 (file)
@@ -25,6 +25,7 @@ our @EXPORT = qw(
   system_or_bail
   system_log
   run_log
+  pump_until
 
   command_ok
   command_fails
index 92b38a81cc179dae2d04ccce07e4f1f442cef4c8..457cc48f0eddd2673b79017182978c3575ba2c0a 100644 (file)
@@ -2065,6 +2065,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 549fa64a6772ad3c55edfea29f2dd3277ecd907a..8f3c48060a6c409c6cd24e5b8d0a015c27d7f7d3 100644 (file)
@@ -36,6 +36,7 @@ our @EXPORT = qw(
   system_or_bail
   system_log
   run_log
+  pump_until
 
   command_ok
   command_fails
@@ -238,6 +239,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
 {