Add PostgreSQL::Test::Cluster::read_head_tail() helper to PostgreSQL/Utils.pm

This function reads the lines from a file and filters its contents to
report its head and tail contents.  The amount of contents to read from
a file can be tuned by the environment variable PG_TEST_FILE_READ_LINES,
that can be used to override the default of 50 lines.  If the file whose
content is read has less lines than two times PG_TEST_FILE_READ_LINES,
the whole file is returned.

This will be used in a follow-up commit to limit the amount of
information reported by some of the TAP tests on failure, where we have
noticed that the contents reported by the buildfarm can be heavily
bloated in some cases, with the head and tail contents of a report being
able to provide enough information to be useful for debugging.

Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Co-authored-by: Michael Paquier <michael@paquier.xyz>
Discussion: https://postgr.es/m/CAN55FZ1D6KXvjSs7YGsDeadqCxNF3UUhjRAfforzzP0k-cE=bA@mail.gmail.com
This commit is contained in:
Michael Paquier 2025-12-06 14:27:53 +09:00
parent 6dfce8420e
commit b93f4e2f98
2 changed files with 58 additions and 0 deletions

View File

@ -917,6 +917,14 @@ PG_TEST_NOCLEAN=1 make -C src/bin/pg_dump check
<varname>PG_TEST_TIMEOUT_DEFAULT</varname> to a higher number will change
the default to avoid this.
</para>
<para>
For certain tests, the environment variable
<envar>PG_TEST_FILE_READ_LINES</envar> can be set to limit the number of
lines read from large output files (head and tail). This is useful when
the test output contains a lot of unnecessary content, allowing the test
framework to read only a limited number of lines for its reports.
</para>
</sect2>
</sect1>

View File

@ -68,6 +68,7 @@ our @EXPORT = qw(
slurp_file
append_to_file
string_replace_file
read_head_tail
check_mode_recursive
chmod_recursive
check_pg_config
@ -590,6 +591,55 @@ sub string_replace_file
=pod
=item read_head_tail(filename)
Return lines from the head and the tail of a file. If the file is smaller
than the number of lines requested, all its contents are returned in @head,
leaving @tail empty.
If the PG_TEST_FILE_READ_LINES environment variable is set, use it instead
of the default of 50 lines.
=cut
sub read_head_tail
{
my $filename = shift;
my (@head, @tail);
my $line_count = 50;
# Use PG_TEST_FILE_READ_LINES if set.
if (defined $ENV{PG_TEST_FILE_READ_LINES})
{
$line_count = $ENV{PG_TEST_FILE_READ_LINES};
}
return ([], []) if $line_count <= 0;
open my $fh, '<', $filename or die "couldn't open file: $filename\n";
my @lines = <$fh>;
close $fh;
chomp @lines;
my $total = scalar @lines;
# If the file is small enough, return all lines in @head.
if (2 * $line_count >= $total)
{
@head = @lines;
@tail = ();
return (\@head, \@tail);
}
@head = @lines[ 0 .. $line_count - 1 ];
@tail = @lines[ $total - $line_count .. $total - 1 ];
return (\@head, \@tail);
}
=pod
=item check_mode_recursive(dir, expected_dir_mode, expected_file_mode, ignore_list)
Check that all file/dir modes in a directory match the expected values,