On 4/14/21 4:13 AM, Michael Paquier wrote:
> Hi all,
>
> As fairywren has proved a couple of days ago, it is not really a good
> idea to rely on a file truncation to check for patterns in the logs of
> the backend:
> https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=fairywren&dt=2021-04-07%2013%3A29%3A28
>
> Visibly, a logic based on the log file truncation fails on Windows
> because of the concurrent access of the backend that outputs its logs
> there. In PostgresNode.pm, connect_ok() and connect_access() enforce
> a rotation of the log file before restarting the server on Windows to
> make sure that a given step does not find logs generated by a previous
> test, but that's not the case of issues_sql_like(). Looking at the
> existing tests using this routine (src/bin/scripts/), I have found on
> test in 090_reindexdb.pl that could lead to a false positive. The
> test is marked in the patch attached, just for awareness.
>
> Would there be any objections to change this routine so as we avoid
> the file truncation on Windows? The patch attached achieves that.
>
> Any thoughts?
That seems rather heavy-handed. The buildfarm's approach is a bit
different. Essentially it seeks to the previous position of the log file
before reading contents. Here is its equivalent of slurp_file:
use Fcntl qw(:seek);
sub file_lines
{
my $filename = shift;
my $filepos = shift;
my $handle;
open($handle, '<', $filename) || croak "opening $filename: $!";
seek($handle, $filepos, SEEK_SET) if $filepos;
my @lines = <$handle>;
close $handle;
return @lines;
}
A client wanting what's done in PostgresNode would do something like:
my $logpos = -s $logfile;
do_some_stuff();
my @lines = file_lines($logfile, $logpos);
This has the benefit of working the same on all platforms, and no
truncation, rotation, or restart is required.
cheers
andrew
--
Andrew Dunstan
EDB: https://www.enterprisedb.com