Commit 377d27b6 authored by Magnus Svensson's avatar Magnus Svensson

WL#4189 mtr.pl v2

 - Make a rough filtering of the servers error log and write
   all suspicious warnings to $error_log.warnings
   The .warnings file is then examined more carefully by check_warnings.test
 - This will speed things up, doing all of this in a server running
   under valgrind takes far too long time.
parent 3dbc5cf4
#
# This test is executed once after each test to check the servers
# for unexpected warnings found in the servers error log
#
# NOTE! mysql-test-run.pl has already done a rough filtering
# of the file and written any suspicious lines
# to $error_log.warnings file
#
--disable_query_log
# Don't write these queries to binlog
......@@ -17,41 +20,21 @@ use mtr;
create temporary table error_log (
row int auto_increment primary key,
suspicious int default 0,
suspicious int default 1,
file_name varchar(255),
line varchar(1024) default null
) engine=myisam;
# Get the name of servers error log
let $log_error= query_get_value(show variables like 'log_error', Value, 1);
let $log_warning= $log_error.warnings;
# Try to load the error log into the temporary table
--error 0,1085
eval load data infile '$log_error' into table error_log
fields terminated by 'xykls37' (line)
# Load the warnings into a temporary table
eval load data infile '$log_warning' into table error_log
fields terminated by 'xykls37'
ignore 1 lines
(line)
set file_name='$log_error';
if ($mysql_errno)
{
# The error log was not world readable, this is normally
# caused by a "flush logs" in the test program. mysqld
# will then rename the error log to .err-old and open
# a new error log file that is not world readable.
# chmod the error log file and try to open it again
chmod 0644 $log_error;
eval load data infile '$log_error' into table error_log
fields terminated by 'xykls37' (line)
set file_name='$log_error';
# Also load the .err-old file where there might be
# additional warnings
# Disabled intil Bug#42320 has been fixed
#let $old_log_error = $log_error-old;
#chmod 0644 $old_log_error;
#eval load data infile '$old_log_error' into table error_log
# fields terminated by 'xykls37' (line)
# set file_name='$old_log_error';
}
# Call check_warnings to filter out any warning in
# the error_log table
......
......@@ -186,42 +186,6 @@ BEGIN
-- Don't write these queries to binlog
SET SQL_LOG_BIN=0;
--
-- Remove all lines belonging to previous tests
--
SELECT COALESCE(MAX(row),0) INTO @max_row
FROM error_log
WHERE line REGEXP "^CURRENT_TEST:";
DELETE FROM error_log WHERE row < @max_row;
--
-- Mark all lines with certain patterns as suspicious
--
UPDATE error_log SET suspicious= 1
WHERE suspicious=0
AND line REGEXP "^Warning:|mysqld: Warning|\\[Warning\\]";
UPDATE error_log SET suspicious= 1
WHERE suspicious=0
AND line REGEXP "^Error:|\\[ERROR\\]";
UPDATE error_log SET suspicious= 1
WHERE suspicious=0
AND line REGEXP "^==.* at 0x";
UPDATE error_log SET suspicious= 1
WHERE suspicious=0
AND line REGEXP "InnoDB: Warning";
UPDATE error_log SET suspicious= 1
WHERE suspicious=0
AND line REGEXP "^safe_mutex:|allocated at line";
UPDATE error_log SET suspicious= 1
WHERE suspicious=0
AND line REGEXP "missing DBUG_RETURN";
UPDATE error_log SET suspicious= 1
WHERE suspicious=0
AND line REGEXP "Attempting backtrace";
UPDATE error_log SET suspicious= 1
WHERE suspicious=0
AND line REGEXP "Assertion .* failed";
--
-- Remove mark from lines that are suppressed by global suppressions
--
......@@ -236,17 +200,6 @@ BEGIN
SET suspicious=0
WHERE el.suspicious=1 AND el.line REGEXP ts.pattern;
--
-- Suppress intentional safemalloc dump warnings
-- i.e inside "Begin/End safemalloc memeory dump" block
--
SELECT @min_row:=row
FROM error_log WHERE line = "Begin safemalloc memory dump:";
SELECT @max_row:=row
FROM error_log WHERE line = "End safemalloc memory dump.";
UPDATE error_log SET suspicious=0
WHERE suspicious=1 AND row > @min_row AND row < @max_row;
--
-- Get the number of marked lines and return result
--
......
......@@ -3356,6 +3356,85 @@ sub run_testcase ($) {
}
#
# Perform a rough examination of the servers
# error log and write all lines that look
# suspicious into $error_log.warnings
#
sub extract_warning_lines ($) {
my ($error_log) = @_;
# Open the servers .err log file and read all lines
# belonging to current tets into @lines
my $Ferr = IO::File->new($error_log)
or mtr_error("Could not open file '$error_log' for reading: $!");
my @lines;
while ( my $line = <$Ferr> )
{
if ( $line =~ /"^CURRENT_TEST:"/ )
{
# Throw away lines from previous tests
@lines = ();
}
push(@lines, $line);
}
$Ferr = undef; # Close error log file
# mysql_client_test.test sends a COM_DEBUG packet to the server
# to provoke a SAFEMALLOC leak report, ignore any warnings
# between "Begin/end safemalloc memory dump"
if ( grep(/Begin safemalloc memory dump:/, @lines) > 0)
{
my $discard_lines= 1;
foreach my $line ( @lines )
{
if ($line =~ /Begin safemalloc memory dump:/){
$discard_lines = 1;
} elsif ($line =~ /End safemalloc memory dump./){
$discard_lines = 0;
}
if ($discard_lines){
$line = "ignored";
}
}
}
# Write all suspicious lines to $error_log.warnings file
my $warning_log = "$error_log.warnings";
my $Fwarn = IO::File->new($warning_log, "w")
or die("Could not open file '$warning_log' for writing: $!");
print $Fwarn "Suspicious lines from $error_log\n";
my @patterns =
(
qr/^Warning:|mysqld: Warning|\\[Warning\\]/,
qr/^Error:|\\[ERROR\\]/,
qr/^==.* at 0x/,
qr/InnoDB: Warning|InnoDB: Error/,
qr/^safe_mutex:|allocated at line/,
qr/missing DBUG_RETURN/,
qr/Attempting backtrace/,
qr/Assertion .* failed/,
);
foreach my $line ( @lines )
{
foreach my $pat ( @patterns )
{
if ( $line =~ /$pat/ )
{
print $Fwarn $line;
last;
}
}
}
$Fwarn = undef; # Close file
}
# Run include/check-warnings.test
#
# RETURN VALUE
......@@ -3368,6 +3447,8 @@ sub start_check_warnings ($$) {
my $name= "warnings-".$mysqld->name();
extract_warning_lines($mysqld->value('log-error'));
my $args;
mtr_init_args(\$args);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment