mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-10 13:11:32 +00:00
320 lines
8.9 KiB
Perl
320 lines
8.9 KiB
Perl
#!/usr/bin/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 => 23;
|
|
|
|
use LogSplitter;
|
|
use SlowLogParser;
|
|
use PerconaTest;
|
|
|
|
my $output;
|
|
my $tmpdir = '/tmp/LogSplitter';
|
|
diag(`rm -rf $tmpdir ; mkdir $tmpdir`);
|
|
|
|
my $lp = new SlowLogParser();
|
|
my $ls = new LogSplitter(
|
|
attribute => 'foo',
|
|
base_dir => $tmpdir,
|
|
parser => $lp,
|
|
session_files => 3,
|
|
quiet => 1,
|
|
);
|
|
|
|
isa_ok($ls, 'LogSplitter');
|
|
|
|
diag(`rm -rf $tmpdir ; mkdir $tmpdir`);
|
|
|
|
# This creates an implicit test to make sure that
|
|
# split_logs() will not die if the saveto_dir already
|
|
# exists. It should just use the existing dir.
|
|
diag(`mkdir $tmpdir/1`);
|
|
|
|
$ls->split("$trunk/t/lib/samples/slowlogs/slow006.txt");
|
|
is(
|
|
$ls->{n_sessions_saved},
|
|
0,
|
|
'Parsed zero sessions for bad attribute'
|
|
);
|
|
|
|
is(
|
|
$ls->{n_events_total},
|
|
6,
|
|
'Parsed all events'
|
|
);
|
|
|
|
# #############################################################################
|
|
# Test a simple split of 6 events, 3 sessions into 3 session files.
|
|
# #############################################################################
|
|
diag(`rm -rf $tmpdir/*`);
|
|
$ls = new LogSplitter(
|
|
attribute => 'Thread_id',
|
|
base_dir => $tmpdir,
|
|
parser => $lp,
|
|
session_files => 3,
|
|
quiet => 1,
|
|
merge_sessions => 0,
|
|
);
|
|
$ls->split("$trunk/t/lib/samples/slowlogs/slow006.txt");
|
|
ok(-f "$tmpdir/1/session-1.txt", 'Basic split session 1 file exists');
|
|
ok(-f "$tmpdir/1/session-2.txt", 'Basic split session 2 file exists');
|
|
ok(-f "$tmpdir/1/session-3.txt", 'Basic split session 3 file exists');
|
|
|
|
$output = `diff $tmpdir/1/session-1.txt $trunk/t/lib/samples/slowlogs/slow006-session-1.txt`;
|
|
is(
|
|
$output,
|
|
'',
|
|
'Session 1 file has correct SQL statements'
|
|
);
|
|
|
|
$output = `diff $tmpdir/1/session-2.txt $trunk/t/lib/samples/slowlogs/slow006-session-2.txt`;
|
|
is(
|
|
$output,
|
|
'',
|
|
'Session 2 file has correct SQL statements'
|
|
);
|
|
|
|
$output = `diff $tmpdir/1/session-3.txt $trunk/t/lib/samples/slowlogs/slow006-session-3.txt`;
|
|
is(
|
|
$output,
|
|
'',
|
|
'Session 3 file has correct SQL statements'
|
|
);
|
|
|
|
# #############################################################################
|
|
# Test splitting more sessions than we can have open filehandles at once.
|
|
# #############################################################################
|
|
diag(`rm -rf $tmpdir/*`);
|
|
$ls = new LogSplitter(
|
|
attribute => 'Thread_id',
|
|
base_dir => $tmpdir,
|
|
parser => $lp,
|
|
session_files => 10,
|
|
quiet => 1,
|
|
merge_sessions => 0,
|
|
max_open_files => 200,
|
|
close_lru_files => 50,
|
|
);
|
|
$ls->split("$trunk/t/lib/samples/slowlogs/slow009.txt");
|
|
chomp($output = `ls -1 $tmpdir/1/ | wc -l`);
|
|
$output =~ s/^\s*//;
|
|
is(
|
|
$output,
|
|
2000,
|
|
'Splits 2_000 sessions'
|
|
);
|
|
|
|
$output = `cat $tmpdir/1/session-2000.txt`;
|
|
like(
|
|
$output,
|
|
qr/SELECT 2001 FROM foo/,
|
|
'2_000th session has correct SQL'
|
|
);
|
|
|
|
$output = `cat $tmpdir/1/session-12.txt`;
|
|
like(
|
|
$output, qr/SELECT 12 FROM foo\n\nSELECT 1234 FROM foo/,
|
|
'Reopened and appended to previously closed session'
|
|
);
|
|
|
|
# #############################################################################
|
|
# Test max_sessions.
|
|
# #############################################################################
|
|
diag(`rm -rf $tmpdir/*`);
|
|
$ls = new LogSplitter(
|
|
attribute => 'Thread_id',
|
|
base_dir => $tmpdir,
|
|
parser => $lp,
|
|
session_files => 10,
|
|
quiet => 1,
|
|
merge_sessions => 0,
|
|
max_sessions => 10,
|
|
);
|
|
$ls->split("$trunk/t/lib/samples/slowlogs/slow009.txt");
|
|
chomp($output = `ls -1 $tmpdir/1/ | wc -l`);
|
|
$output =~ s/^\s*//;
|
|
is(
|
|
$output,
|
|
'10',
|
|
'max_sessions works (1/3)',
|
|
);
|
|
is(
|
|
$ls->{n_sessions_saved},
|
|
'10',
|
|
'max_sessions works (2/3)'
|
|
);
|
|
is(
|
|
$ls->{n_files_total},
|
|
'10',
|
|
'max_sessions works (3/3)'
|
|
);
|
|
|
|
# #############################################################################
|
|
# Check that all filehandles are closed.
|
|
# #############################################################################
|
|
is_deeply(
|
|
$ls->{session_fhs},
|
|
[],
|
|
'Closes open fhs'
|
|
);
|
|
|
|
#diag(`rm -rf $tmpdir/*`);
|
|
#$output = `cat $trunk/t/lib/samples/slow006.txt | $trunk/t/lib/samples/log_splitter.pl`;
|
|
#like($output, qr/Parsed sessions\s+3/, 'Reads STDIN implicitly');
|
|
|
|
#diag(`rm -rf $tmpdir/*`);
|
|
#$output = `cat $trunk/t/lib/samples/slow006.txt | $trunk/t/lib/samples/log_splitter.pl -`;
|
|
#like($output, qr/Parsed sessions\s+3/, 'Reads STDIN explicitly');
|
|
|
|
#diag(`rm -rf $tmpdir/*`);
|
|
#$output = `cat $trunk/t/lib/samples/slow006.txt | $trunk/t/lib/samples/log_splitter.pl blahblah`;
|
|
#like($output, qr/Parsed sessions\s+0/, 'Does nothing if no valid logs are given');
|
|
|
|
# #############################################################################
|
|
# Test session file merging.
|
|
# #############################################################################
|
|
diag(`rm -rf $tmpdir/*`);
|
|
$ls = new LogSplitter(
|
|
attribute => 'Thread_id',
|
|
base_dir => $tmpdir,
|
|
parser => $lp,
|
|
session_files => 10,
|
|
quiet => 1,
|
|
max_open_files => 200,
|
|
);
|
|
$ls->split("$trunk/t/lib/samples/slowlogs/slow009.txt");
|
|
$output = `grep 'START SESSION' $tmpdir/sessions-*.txt | cut -d' ' -f 4 | sort -n`;
|
|
like(
|
|
$output,
|
|
qr/^1\n2\n3\n[\d\n]+2001$/,
|
|
'Merges 2_000 sessions'
|
|
);
|
|
|
|
ok(
|
|
!-d "$tmpdir/1",
|
|
'Removes tmp dirs after merging'
|
|
);
|
|
|
|
# #############################################################################
|
|
# Issue 418: mk-log-player dies trying to play statements with blank lines
|
|
# #############################################################################
|
|
|
|
# LogSplitter should pre-process queries before writing them so that they
|
|
# do not contain blank lines.
|
|
diag(`rm -rf $tmpdir/*`);
|
|
$ls = new LogSplitter(
|
|
attribute => 'Thread_id',
|
|
base_dir => $tmpdir,
|
|
parser => $lp,
|
|
quiet => 1,
|
|
session_files => 1,
|
|
);
|
|
$ls->split("$trunk/t/lib/samples/slowlogs/slow020.txt");
|
|
$output = `diff $tmpdir/sessions-1.txt $trunk/t/lib/samples/split_slow020.txt`;
|
|
is(
|
|
$output,
|
|
'',
|
|
'Collapse multiple \n and \s (issue 418)'
|
|
);
|
|
|
|
# Make sure it works for --maxsessionfiles
|
|
#diag(`rm -rf $tmpdir/*`);
|
|
#$ls = new LogSplitter(
|
|
# attribute => 'Thread_id',
|
|
# saveto_dir => "$tmpdir/",
|
|
# lp => $lp,
|
|
# verbose => 0,
|
|
# maxsessionfiles => 1,
|
|
#);
|
|
#$ls->split(['t/lib/samples/slow020.txt' ]);
|
|
#$output = `diff $tmpdir/1/session-0001 $trunk/t/lib/samples/split_slow020_msf.txt`;
|
|
#is(
|
|
# $output,
|
|
# '',
|
|
# 'Collapse multiple \n and \s with --maxsessionfiles (issue 418)'
|
|
#);
|
|
|
|
# #############################################################################
|
|
# Issue 571: Add --filter to mk-log-player
|
|
# #############################################################################
|
|
my $callback = sub {
|
|
return;
|
|
};
|
|
$ls = new LogSplitter(
|
|
attribute => 'Thread_id',
|
|
base_dir => $tmpdir,
|
|
parser => $lp,
|
|
session_files => 3,
|
|
quiet => 1,
|
|
callbacks => [$callback],
|
|
);
|
|
$ls->split("$trunk/t/lib/samples/slowlogs/slow006.txt");
|
|
is(
|
|
$ls->{n_sessions_saved},
|
|
0,
|
|
'callbacks'
|
|
);
|
|
|
|
# #############################################################################
|
|
# Issue 798: Make mk-log-player --split work without an attribute
|
|
# #############################################################################
|
|
diag(`rm -rf $tmpdir/*`);
|
|
$ls = new LogSplitter(
|
|
attribute => 'Thread_id',
|
|
split_random => 1,
|
|
base_dir => $tmpdir,
|
|
parser => $lp,
|
|
session_files => 2,
|
|
quiet => 1,
|
|
);
|
|
$ls->split("$trunk/t/lib/samples/slowlogs/slow006.txt");
|
|
|
|
$output = `diff $tmpdir/sessions-1.txt $trunk/t/lib/samples/LogSplitter/slow006-random-1.txt`;
|
|
is(
|
|
$output,
|
|
'',
|
|
'Random file 1 file has correct SQL statements'
|
|
);
|
|
|
|
$output = `diff $tmpdir/sessions-2.txt $trunk/t/lib/samples/LogSplitter/slow006-random-2.txt`;
|
|
is(
|
|
$output,
|
|
'',
|
|
'Random file 2 file has correct SQL statements'
|
|
);
|
|
|
|
# #############################################################################
|
|
# Issue 1179: mk-log-player --filter example does not work
|
|
# #############################################################################
|
|
diag(`rm -rf $tmpdir/*`);
|
|
$ls = new LogSplitter(
|
|
attribute => 'cmd',
|
|
base_dir => $tmpdir,
|
|
parser => $lp,
|
|
session_files => 2,
|
|
quiet => 1,
|
|
);
|
|
$ls->split("$trunk/t/lib/samples/binlogs/binlog010.txt");
|
|
$output = `cat $tmpdir/sessions-1.txt`;
|
|
ok(
|
|
no_diff(
|
|
$output,
|
|
"t/lib/samples/LogSplitter/binlog010.txt",
|
|
cmd_output => 1,
|
|
),
|
|
"Split binlog with RBR data (issue 1179)"
|
|
);
|
|
|
|
# #############################################################################
|
|
# Done.
|
|
# #############################################################################
|
|
diag(`rm -rf $tmpdir`);
|
|
exit;
|