v3-0002-Add-a-new-helper-function-wait_for_file-to-Utils..patch
application/octet-stream
Filename: v3-0002-Add-a-new-helper-function-wait_for_file-to-Utils..patch
Type: application/octet-stream
Part: 2
From 6b36a93257882a7bbf5db75202de3aeccbbc7912 Mon Sep 17 00:00:00 2001
From: Fujii Masao <fujii@postgresql.org>
Date: Thu, 25 Dec 2025 20:26:50 +0900
Subject: [PATCH v3 2/4] Add a new helper function wait_for_file() to Utils.pm.
wait_for_file() waits for the contents of a specified file, starting at an
optional offset, to match a given regular expression. If no offset is
provided, the entire file is checked. The function times out after
$PostgreSQL::Test::Utils::timeout_default seconds. It returns the total
file length on success.
The existing wait_for_log() function contains almost identical logic, but
is limited to reading the cluster's log file. This commit also refactors
wait_for_log() to call wait_for_file() instead, avoiding code duplication.
This helper will be used by upcoming changes.
---
src/test/perl/PostgreSQL/Test/Cluster.pm | 20 ++----------
src/test/perl/PostgreSQL/Test/Utils.pm | 39 ++++++++++++++++++++++++
2 files changed, 41 insertions(+), 18 deletions(-)
diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm
index 295988b8b87..0fcbc5fab0b 100644
--- a/src/test/perl/PostgreSQL/Test/Cluster.pm
+++ b/src/test/perl/PostgreSQL/Test/Cluster.pm
@@ -3535,25 +3535,9 @@ If successful, returns the length of the entire log file, in bytes.
sub wait_for_log
{
my ($self, $regexp, $offset) = @_;
- $offset = 0 unless defined $offset;
- my $max_attempts = 10 * $PostgreSQL::Test::Utils::timeout_default;
- my $attempts = 0;
-
- while ($attempts < $max_attempts)
- {
- my $log =
- PostgreSQL::Test::Utils::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";
+ return PostgreSQL::Test::Utils::wait_for_file($self->logfile, $regexp,
+ $offset);
}
=pod
diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm
index 0332d28916e..cbe6228241d 100644
--- a/src/test/perl/PostgreSQL/Test/Utils.pm
+++ b/src/test/perl/PostgreSQL/Test/Utils.pm
@@ -58,6 +58,7 @@ use File::Temp ();
use IPC::Run;
use POSIX qw(locale_h);
use PostgreSQL::Test::SimpleTee;
+use Time::HiRes qw(usleep);
# We need a version of Test::More recent enough to support subtests
use Test::More 0.98;
@@ -73,6 +74,7 @@ our @EXPORT = qw(
chmod_recursive
check_pg_config
compare_files
+ wait_for_file
dir_symlink
scan_server_header
system_or_bail
@@ -868,6 +870,43 @@ sub compare_files
=pod
+=item wait_for_file(filename, regexp[, offset])
+
+Waits for the contents of the specified file, starting at the given offset, to
+match the supplied regular expression. Checks the entire file if no offset is
+given. Times out after $timeout_default seconds.
+
+If successful, returns the length of the entire file, in bytes.
+
+=cut
+
+sub wait_for_file
+{
+ my ($filename, $regexp, $offset) = @_;
+ $offset = 0 unless defined $offset;
+
+ my $max_attempts = 10 * $timeout_default;
+ my $attempts = 0;
+
+ while ($attempts < $max_attempts)
+ {
+ if (-e $filename)
+ {
+ my $contents = slurp_file($filename, $offset);
+ return $offset + length($contents) if ($contents =~ m/$regexp/);
+ }
+
+ # Wait 0.1 second before retrying.
+ usleep(100_000);
+
+ $attempts++;
+ }
+
+ croak "timed out waiting for match: $regexp";
+}
+
+=pod
+
=item dir_symlink(oldname, newname)
Portably create a symlink for a directory. On Windows this creates a junction
--
2.51.2