Allow TestLib::slurp_file to skip contents, and use as needed
authorAndrew Dunstan <[email protected]>
Fri, 16 Apr 2021 20:54:04 +0000 (16:54 -0400)
committerAndrew Dunstan <[email protected]>
Fri, 16 Apr 2021 21:41:20 +0000 (17:41 -0400)
In order to avoid getting old logfile contents certain functions in
PostgresNode were doing one of two things. On Windows it rotated the
logfile and restarted the server, while elsewhere it truncated the log
file. Both of these are unnecessary. We borrow from the buildfarm which
does this instead: note the size of the logfile before we start, and
then when fetching the logfile skip to that position before accumulating
contents. This is spelled differently on Windows but the effect is the
same. This is largely centralized in TestLib's slurp_file function,
which has a new optional parameter, the offset to skip to before
starting to reading the file. Code in the client becomes much neater.

Backpatch to all live branches.

Michael Paquier, slightly modified by me.

Discussion: https://postgr.es/m/[email protected]

src/test/perl/PostgresNode.pm
src/test/perl/TestLib.pm

index 8a08a64f3d0271ea4f8e87cffaac7071d4fefc12..0b07f3947cb6c69dcf9de7f78384ebb4857d2639 100644 (file)
@@ -1456,9 +1456,6 @@ sub command_like
 Run a command on the node, then verify that $expected_sql appears in the
 server log file.
 
-Reads the whole log file so be careful when working with large log outputs.
-The log file is truncated prior to running the command, however.
-
 =cut
 
 sub issues_sql_like
@@ -1468,10 +1465,11 @@ sub issues_sql_like
    local $ENV{PGHOST} = $self->host;
    local $ENV{PGPORT} = $self->port;
 
-   truncate $self->logfile, 0;
+   my $log_location = -s $self->logfile;
+
    my $result = TestLib::run_log($cmd);
    ok($result, "@$cmd exit code 0");
-   my $log = TestLib::slurp_file($self->logfile);
+   my $log = TestLib::slurp_file($self->logfile, $log_location);
    like($log, $expected_sql, "$test_name: SQL found in server log");
 }
 
index 8319727cf6e99aad4738c4b6f3428d5b292a1d9d..cc4fa53a24d1bee5213e697054906cc481ca74af 100644 (file)
@@ -13,6 +13,7 @@ use warnings;
 use Config;
 use Cwd;
 use Exporter 'import';
+use Fcntl qw(:mode :seek);
 use File::Basename;
 use File::Spec;
 use File::Temp ();
@@ -66,7 +67,7 @@ BEGIN
    if ($windows_os)
    {
        require Win32API::File;
-       Win32API::File->import(qw(createFile OsFHandleOpen CloseHandle));
+       Win32API::File->import(qw(createFile OsFHandleOpen CloseHandle setFilePointer));
    }
 }
 
@@ -215,13 +216,18 @@ sub slurp_dir
 
 sub slurp_file
 {
-   my ($filename) = @_;
+   my ($filename, $offset) = @_;
    local $/;
    my $contents;
    if ($Config{osname} ne 'MSWin32')
    {
        open(my $in, '<', $filename)
          or die "could not read \"$filename\": $!";
+       if (defined($offset))
+       {
+           seek($in, $offset, SEEK_SET)
+             or die "could not seek \"$filename\": $!";
+       }
        $contents = <$in>;
        close $in;
    }
@@ -231,6 +237,11 @@ sub slurp_file
          or die "could not open \"$filename\": $^E";
        OsFHandleOpen(my $fh = IO::Handle->new(), $fHandle, 'r')
          or die "could not read \"$filename\": $^E\n";
+       if (defined($offset))
+       {
+           setFilePointer($fh, $offset, qw(FILE_BEGIN))
+             or die "could not seek \"$filename\": $^E\n";
+       }
        $contents = <$fh>;
        CloseHandle($fHandle)
          or die "could not close \"$filename\": $^E\n";