Merge pt-kill-log-dsn.

This commit is contained in:
Daniel Nichter
2012-07-19 11:20:29 -06:00
4 changed files with 915 additions and 33 deletions

View File

@@ -9,7 +9,7 @@ BEGIN {
use strict;
use warnings FATAL => 'all';
use English qw(-no_match_vars);
use Test::More tests => 34;
use Test::More tests => 35;
use Processlist;
use PerconaTest;
@@ -600,6 +600,17 @@ my %find_spec = (
},
);
my $matching_query =
{ 'Time' => '91',
'Command' => 'Query',
'db' => undef,
'Id' => '43',
'Info' => 'select * from foo',
'User' => 'msandbox',
'State' => 'executing',
'Host' => 'localhost'
};
my @queries = $pl->find(
[ { 'Time' => '488',
'Command' => 'Connect',
@@ -675,33 +686,24 @@ my @queries = $pl->find(
'State' => 'Locked',
'Host' => 'localhost'
},
{ 'Time' => '91',
'Command' => 'Query',
'db' => undef,
'Id' => '43',
'Info' => 'select * from foo',
'User' => 'msandbox',
'State' => 'executing',
'Host' => 'localhost'
},
$matching_query,
],
%find_spec,
);
my $expected = [
{ 'Time' => '91',
'Command' => 'Query',
'db' => undef,
'Id' => '43',
'Info' => 'select * from foo',
'User' => 'msandbox',
'State' => 'executing',
'Host' => 'localhost'
},
];
my $expected = [ $matching_query ];
is_deeply(\@queries, $expected, 'Basic find()');
{
# Internal, fragile test!
is_deeply(
$pl->{_reasons_for_matching}->{$matching_query},
[ 'Exceeds busy time', 'Query matches Command spec', 'Query matches Info spec', ],
"_reasons_for_matching works"
);
}
%find_spec = (
busy_time => 1,
ignore => {

View File

@@ -29,7 +29,7 @@ if ( !$dbh ) {
plan skip_all => 'Cannot connect to sandbox master';
}
else {
plan tests => 8;
plan tests => 21;
}
my $output;
@@ -56,8 +56,11 @@ ok(
$output = output(
sub { pt_kill::main('-F', $cnf, qw(--kill --print --run-time 1 --interval 1),
'--match-info', 'select sleep\(4\)') },
"--match-info", 'select sleep\(4\)',
)
},
);
like(
$output,
qr/KILL $pid /,
@@ -116,6 +119,157 @@ is(
'Connection is still alive'
);
# #############################################################################
# Test that --log-dsn
# #############################################################################
$dbh->do("DROP DATABASE IF EXISTS `kill_test`");
$dbh->do("CREATE DATABASE `kill_test`");
my $sql = OptionParser->read_para_after(
"$trunk/bin/pt-kill", qr/MAGIC_create_log_table/);
$sql =~ s/kill_log/`kill_test`.`log_table`/;
$dbh->do($sql);
{
system("/tmp/12345/use -h127.1 -P12345 -umsandbox -pmsandbox -e 'select sleep(4)' >/dev/null&");
sleep 0.5;
local $EVAL_ERROR;
eval {
pt_kill::main('-F', $cnf, qw(--kill --run-time 1 --interval 1),
"--match-info", 'select sleep\(4\)',
"--log-dsn", q!h=127.1,P=12345,u=msandbox,p=msandbox,D=kill_test,t=log_table!,
)
};
is(
$EVAL_ERROR,
'',
"--log-dsn works if the table exists and --create-log-table wasn't passed in."
) or diag $EVAL_ERROR;
local $EVAL_ERROR;
my $results = eval { $dbh->selectall_arrayref("SELECT * FROM `kill_test`.`log_table`", { Slice => {} } ) };
is(
$EVAL_ERROR,
'',
"...and we can query the table"
) or diag $EVAL_ERROR;
is @{$results}, 1, "...which contains one entry";
use Data::Dumper;
my $reason = $dbh->selectrow_array("SELECT reason FROM `kill_test`.`log_table` WHERE kill_id=1");
is $reason,
'Query matches Info spec',
'reason gets set to something sensible';
TODO: {
local $::TODO = "Time_ms currently isn't reported";
my $time_ms = $dbh->selectrow_array("SELECT Time_ms FROM `kill_test`.`log_table` WHERE kill_id=1");
ok $time_ms;
}
my $result = shift @$results;
my $against = {
user => 'msandbox',
host => 'localhost',
db => undef,
command => 'Query',
state => ($sandbox_version lt '5.1' ? "executing" : "User sleep"),
info => 'select sleep(4)',
};
my %trimmed_result;
@trimmed_result{ keys %$against } = @{$result}{ keys %$against };
$trimmed_result{host} =~ s/localhost:[0-9]+/localhost/;
is_deeply(
\%trimmed_result,
$against,
"...and was populated as expected",
) or diag(Dumper($result));
system("/tmp/12345/use -h127.1 -P12345 -umsandbox -pmsandbox -e 'select sleep(4)' >/dev/null&");
sleep 0.5;
local $EVAL_ERROR;
eval {
pt_kill::main('-F', $cnf, qw(--kill --run-time 1 --interval 1 --create-log-table),
"--match-info", 'select sleep\(4\)',
"--log-dsn", q!h=127.1,P=12345,u=msandbox,p=msandbox,D=kill_test,t=log_table!,
)
};
is(
$EVAL_ERROR,
'',
"--log-dsn works if the table exists and --create-log-table was passed in."
);
}
{
$dbh->do("DROP TABLE `kill_test`.`log_table`");
system("/tmp/12345/use -h127.1 -P12345 -umsandbox -pmsandbox -e 'select sleep(4)' >/dev/null&");
sleep 0.5;
local $EVAL_ERROR;
eval {
pt_kill::main('-F', $cnf, qw(--kill --run-time 1 --interval 1 --create-log-table),
"--match-info", 'select sleep\(4\)',
"--log-dsn", q!h=127.1,P=12345,u=msandbox,p=msandbox,D=kill_test,t=log_table!,
)
};
is(
$EVAL_ERROR,
'',
"--log-dsn works if the table doesn't exists and --create-log-table was passed in."
);
}
{
$dbh->do("DROP TABLE `kill_test`.`log_table`");
local $EVAL_ERROR;
eval {
pt_kill::main('-F', $cnf, qw(--kill --run-time 1 --interval 1),
"--match-info", 'select sleep\(4\)',
"--log-dsn", q!h=127.1,P=12345,u=msandbox,p=msandbox,D=kill_test,t=log_table!,
)
};
like $EVAL_ERROR,
qr/\Q--log-dsn table does not exist. Please create it or specify\E/,
"By default, --log-dsn doesn't autogenerate a table";
}
for my $dsn (
q!h=127.1,P=12345,u=msandbox,p=msandbox,t=log_table!,
q!h=127.1,P=12345,u=msandbox,p=msandbox,D=kill_test!,
q!h=127.1,P=12345,u=msandbox,p=msandbox!,
) {
local $EVAL_ERROR;
eval {
pt_kill::main('-F', $cnf, qw(--kill --run-time 1 --interval 1),
"--match-info", 'select sleep\(4\)',
"--log-dsn", $dsn,
)
};
like $EVAL_ERROR,
qr/\Q--log-dsn does not specify a database (D) or a database-qualified table (t)\E/,
"--log-dsn croaks if t= or D= are absent";
}
# Run it twice
for (1,2) {
system("/tmp/12345/use -h127.1 -P12345 -umsandbox -pmsandbox -e 'select sleep(4)' >/dev/null&");
sleep 0.5;
pt_kill::main('-F', $cnf, qw(--kill --run-time 1 --interval 1 --create-log-table),
"--match-info", 'select sleep\(4\)',
"--log-dsn", q!h=127.1,P=12345,u=msandbox,p=msandbox,D=kill_test,t=log_table!,
);
}
my $results = $dbh->selectall_arrayref("SELECT * FROM `kill_test`.`log_table`");
is @{$results}, 2, "Different --log-dsn runs reuse the same table.";
$dbh->do("DROP DATABASE kill_test");
# #############################################################################
# Done.
# #############################################################################