Files
percona-toolkit/t/pt-query-digest/resume.t

171 lines
3.8 KiB
Perl

#!/usr/bin/env perl
BEGIN {
die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
};
use strict;
use warnings FATAL => 'all';
use English qw(-no_match_vars);
use Test::More;
use IO::File;
use Fcntl qw(:seek);
use File::Temp qw(tempfile);
use PerconaTest;
require "$trunk/bin/pt-query-digest";
my $samples = "$trunk/t/lib/samples/slowlogs";
my $output;
my $resume_file = (tempfile())[1];
diag(`echo 0 > $resume_file`);
my ($fh, $filename) = tempfile(UNLINK => 1);
$fh->autoflush(1);
sub resume_offset_ok {
my ($resume_file, $file, $msg) = @_;
chomp(my $offset = slurp_file($resume_file));
open my $tmp_fh, q{<}, $file or die $OS_ERROR;
seek $tmp_fh, 0, SEEK_END;
is(tell($tmp_fh), $offset, $msg);
}
sub run_pqd {
my @extra_args = @_;
my $run = output(sub { pt_query_digest::main(qw(--limit 10), @extra_args, $filename) }, stderr => 1);
$run =~ s/[\d.]+m?s user time.+//;
$run =~ s/Current date: .+//;
return $run;
}
print { $fh } slurp_file("$samples/slow006.txt");
my @runs;
push @runs, run_pqd() for 1, 2;
is(
$runs[0],
$runs[1],
"Sanity check: Behaves the same between runs without --resume"
);
my @resume_runs;
push @resume_runs, run_pqd('--resume', $resume_file) for 1, 2;
# TODO
#(my $without_resume_line = $resume_runs[0]) =~ s/\n\n. Saved resume file offset.+//;
#is(
# $runs[1],
# $runs[0],
# "First time with --resume just like the first time without"
#);
like(
$resume_runs[0],
qr/\QSaved resume file offset\E/,
"Saves offset with --resume"
);
like(
$resume_runs[1],
qr/\QNo events processed.\E/,
"..and there are no events on the second run"
);
resume_offset_ok(
$resume_file,
$filename,
"The resume file has the correct offset"
);
print { $fh } slurp_file("$samples/slow002.txt");
push @resume_runs, run_pqd('--resume', $resume_file) for 1, 2;
unlike(
$resume_runs[2],
qr/\QNo events processed.\E/,
"New run detects new events"
);
like(
$resume_runs[3],
qr/\QNo events processed.\E/,
"And running again after that finds nothing new"
);
resume_offset_ok(
$resume_file,
$filename,
"The resume file has the updated offset"
);
# #############################################################################
# Now test the itneraction with --run-time-mode interval
# #############################################################################
close $fh;
diag(`echo 0 > $resume_file`);
($fh, $filename) = tempfile(UNLINK => 1);
$fh->autoflush(1);
print { $fh } slurp_file("$trunk/t/lib/samples/slowlogs/slow033.txt");
my @run_args = (qw(--run-time-mode interval --run-time 1d --iterations 0),
qw(--report-format query_report));
my @resume_args = (@run_args, '--resume', $resume_file);
my @run_time;
push @run_time, run_pqd(@resume_args) for 1,2;
resume_offset_ok(
$resume_file,
$filename,
"The resume file has the correct offset when using --run-time-mode interval"
);
print { $fh } slurp_file("$samples/slow002.txt");
push @run_time, run_pqd(@resume_args) for 1,2;
resume_offset_ok(
$resume_file,
$filename,
"...and it updates correctly"
);
like(
$_,
qr/\QNo events processed.\E/,
"Runs 2 & 4 find no new data"
) for @run_time[1, 3];
# This shows up in the first report, but shouldn't show up in there
# third run, after we add new events to the file.
my $re = qr/\QSELECT * FROM foo\E/;
unlike(
$run_time[2],
$re,
"Events from the first run are correctly ignored"
);
my $no_resume = run_pqd(@run_args);
like(
$no_resume,
$re,
"...but do show up if run without resume"
);
# #############################################################################
# Done.
# #############################################################################
done_testing;