Files
percona-toolkit/t/pt-kill/group_by.t
2012-02-15 11:09:29 -07:00

145 lines
4.7 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 tests => 9;
use PerconaTest;
use Sandbox;
require "$trunk/bin/pt-kill";
my $sample = "$trunk/t/lib/samples/pl/";
my @args = qw(--test-matching);
my $output;
# #############################################################################
# Issue 1181: Make mk-kill prevent cache stampedes
# #############################################################################
# The 3rd query (id 4) is user=root. Next we'll test that we can filter
# that one out.
$output = output(
sub { pt_kill::main(@args, "$sample/recset010.txt",
qw(--group-by info --query-count 2 --each-busy-time 2 --match-all),
qw(--victims all-but-oldest --print)); }
);
like(
$output,
qr/# \S+ KILL 3 \(Query 9 sec\) select c from t where id='foo';\n# \S+ KILL 2 \(Query 9 sec\) select c from t where id='foo';\n# \S+ KILL 4 \(Query 5 sec\) select c from t where id='foo';/,
"Kill all but oldest"
);
# Now with --match-user user1, the 3rd query is not matched.
$output = output(
sub { pt_kill::main(@args, "$sample/recset010.txt",
qw(--group-by info --query-count 2 --each-busy-time 2 --match-user user1),
qw(--victims all-but-oldest --print)); }
);
like(
$output,
qr/# \S+ KILL 3 \(Query 9 sec\) select c from t where id='foo';\n# \S+ KILL 2 \(Query 9 sec\) select c from t where id='foo';/,
"Kill all but oldest, matching specific user"
);
# But queries matches with --any-busy-time. There's 3 queries in the class
# with Times: 9, 9, 10. The 9s don't match because they're not longer than
# 9, but the 10 does. This is correct (see issue 1221) because --victims
# is applied *after* per-class query matching.
$output = output(
sub { pt_kill::main(@args, "$sample/recset010.txt",
qw(--group-by info --query-count 2 --any-busy-time 10 --match-user user1),
qw(--victims oldest --print)); }
);
is(
$output,
"",
"Any busy time doesn't match"
);
$output = output(
sub { pt_kill::main(@args, "$sample/recset010.txt",
qw(--group-by info --query-count 2 --any-busy-time 9 --match-user user1),
qw(--victims oldest --print)); }
);
like(
$output,
qr/# \S+ KILL 1 \(Query 10 sec\)/,
"Any busy time matches"
);
# Nothing matches because --each-busy-time isn't satifised.
$output = output(
sub { pt_kill::main(@args, "$sample/recset010.txt",
qw(--group-by info --query-count 2 --each-busy-time 10 --match-user user1),
qw(--victims all-but-oldest --print)); }
);
is(
$output,
"",
"Each busy time doesn't match"
);
# Each busy time matches on the lowest possible value.
$output = output(
sub { pt_kill::main(@args, "$sample/recset010.txt",
qw(--group-by info --query-count 2 --each-busy-time 8 --match-user user1),
qw(--victims all-but-oldest --print)); }
);
like(
$output,
qr/# \S+ KILL 3 \(Query 9 sec\) select c from t where id='foo';\n# \S+ KILL 2 \(Query 9 sec\) select c from t where id='foo';/,
"Each busy time matches"
);
# Nothing matches because --query-count isn't satisified.
$output = output(
sub { pt_kill::main(@args, "$sample/recset010.txt",
qw(--group-by info --query-count 4 --each-busy-time 1 --match-user user1),
qw(--victims all-but-oldest --print)); }
);
is(
$output,
"",
"Query count doesn't match"
);
# Without stripping comments, the queries won't be grouped into a class.
$output = output(
sub { pt_kill::main(@args, "$sample/recset010.txt",
qw(--group-by info --query-count 2 --each-busy-time 2 --match-user user1),
qw(--victims all-but-oldest --print --no-strip-comments)); }
);
is(
$output,
"",
"Queries don't match unless comments are stripped"
);
# ###########################################################################
# Use --filter to create custom --group-by columns.
# ###########################################################################
ok(
no_diff(
sub { pt_kill::main(@args, "$sample/recset011.txt",
"--filter", "$trunk/t/pt-kill/samples/filter001.txt",
qw(--group-by comment --query-count 2 --each-busy-time 5),
qw(--match-user foo --victims all --print --no-strip-comments));
},
"t/pt-kill/samples/kill-recset011-001.txt",
sed => [ "-e 's/^# [^ ]* //g'" ],
),
"--filter and custom --group-by"
);
# #############################################################################
# Done.
# #############################################################################
exit;