(unnamed)

text/plain

Filename: (unnamed)
Type: text/plain
Part: 3
Message: Re: [HACKERS] WAL logging problem in 9.4.3?
#! /usr/bin/perl

use strict;
use POSIX qw(floor);

my $state = 0;
my $wal_level = '';
my $pages = 0;
my $binary = '';
my $scale = 0;
my $paramcount = 0;
my $mode = '';
my $sumtps = 0;
my $sumlat = 0;
my $count = 0;
my $trig = 0;
my $title = "(undef)";
my $ddltime = 0;
my @lines = ();
my $trailstr = '';
my $verbose = 1 if ($ARGV[0] eq '-v');
my %tps = ();
my %lat = ();
my %ddltime = ();
my %modestr=("n", "none", "s", "sync", "w", "WAL");

while (<STDIN>) {
	push(@lines, $_);
	chomp;
	next if (/^(END|START)$/);
	next if (/NOTICE:  /);

#	print "$state: $_\n";
	if ($state == 0) {
		if (/^## params: count=([0-9.]+) pages=([0-9.]+) mode=(.) binary=([^ ]+) scale=([0-9.]+) wal_level=([a-z]+)/) {
			$paramcount = $1;
			$pages = $2;
			$mode = $3;
			$binary = $4;
			$scale = $5;
			$wal_level = $6;
			my $modestr = $modestr{$mode};

			print "## params: wal_level=$wal_level mode=$modestr pages=$pages count=$paramcount scale=$scale\n";
			print "(% are relative to \"before\")\n";
			$state = 1;
			next;
		} else {
			next;
		}
	} elsif ($state == 1) {
		if (/^starting vacuum/) {
			$state = 2;
		}
		next;
	} elsif ($state == 2) {
		if (/^bench.*/) {
			$trig = 1;
			$title = "before";
			$state = 3;
		}
	} elsif ($state == 3) {
		if (/^size ([0-9]+): procs ([0-9]+): time ([0-9]+)$/) {
			$ddltime{$mode} = $3;
			$trig = 1;
			$title = "during";
			$trailstr = '';
			$state = 4;
		}
	} elsif ($state == 4) {
		if (/^transaction type: /) {
			$trig = 1;
			$title = "after";
			$trailstr = "# $_\n";
			$state = 5;
		}
	} elsif ($state == 5) {
		if (!/^statement latencies /) {
			$trailstr .= "# $_\n";
			next;
		}
		printf "DDL time: %6.0f ms (%6.1f%% relative to mode=%s)\n",
			$ddltime{$mode},
			floor(1000.0 * $ddltime{$mode} / $ddltime{n} + 0.5) / 10,
			$modestr{n};
		$trailstr .= "# $_\n";
		$state = 6;
		next;
	} elsif ($state == 6) {
		if (/^ {8}/) {
			$trailstr.= "# $_\n";
			next;
		}
		if ($verbose) {
			print $trailstr;
		}
		$state = 0;
		next;
	}

	if ($trig) {
		die "count 0?\n" if ($count == 0);
		$tps{$title} = $sumtps / $count;
		$lat{$title} = $sumlat / $count;
		printf "%6s: tps %6.1f (%5.1f%%), lat %9.3f ms (%5.1f%%) (%d samples)\n",
			$title,
			$tps{$title}, floor(1000.0 * $tps{$title} / $tps{before} + 0.5)/10,
			$lat{$title}, floor(1000.0 * $lat{$title} / $lat{before} + 0.5)/10,
			$count;
		$sumtps = $sumlat = $count = 0;
		$trig = 0;
		next;
	}

	if (!/^progress: ([0-9.]+) s, ([0-9.]+) tps, lat ([0-9.]+) ms stddev ([0-9.]+|NaN)$/) {
		last;
	}
	$sumtps += $2;
	$sumlat += $3;
	$count++;
}

if ($state != 0) {
	print "Wrong state after EOF: state = $state\n";
	print "=====================================\n";
	foreach (-10 .. -1) {
		printf "%d: %s", ($. + $_), $lines[$. + $_];
	}
	print "=====================================\n";
	exit(1);
}

die "uncounted lines?\n" if ($count > 0);