mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-25 13:46:22 +00:00
Merge pt-kill-log-dsn.
This commit is contained in:
@@ -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 => {
|
||||
|
158
t/pt-kill/kill.t
158
t/pt-kill/kill.t
@@ -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.
|
||||
# #############################################################################
|
||||
|
Reference in New Issue
Block a user