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

