mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
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.
This commit is contained in:
@ -1,8 +1,11 @@
|
|||||||
|
|
||||||
#
|
#
|
||||||
# This test is executed once after each test to check the servers
|
# This test is executed once after each test to check the servers
|
||||||
# for unexpected warnings found in the servers error log
|
# 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
|
--disable_query_log
|
||||||
|
|
||||||
# Don't write these queries to binlog
|
# Don't write these queries to binlog
|
||||||
@ -17,41 +20,21 @@ use mtr;
|
|||||||
|
|
||||||
create temporary table error_log (
|
create temporary table error_log (
|
||||||
row int auto_increment primary key,
|
row int auto_increment primary key,
|
||||||
suspicious int default 0,
|
suspicious int default 1,
|
||||||
file_name varchar(255),
|
file_name varchar(255),
|
||||||
line varchar(1024) default null
|
line varchar(1024) default null
|
||||||
) engine=myisam;
|
) engine=myisam;
|
||||||
|
|
||||||
# Get the name of servers error log
|
# Get the name of servers error log
|
||||||
let $log_error= query_get_value(show variables like 'log_error', Value, 1);
|
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
|
# Load the warnings into a temporary table
|
||||||
--error 0,1085
|
eval load data infile '$log_warning' into table error_log
|
||||||
eval load data infile '$log_error' into table error_log
|
fields terminated by 'xykls37'
|
||||||
fields terminated by 'xykls37' (line)
|
ignore 1 lines
|
||||||
|
(line)
|
||||||
set file_name='$log_error';
|
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
|
# Call check_warnings to filter out any warning in
|
||||||
# the error_log table
|
# the error_log table
|
||||||
|
@ -186,42 +186,6 @@ BEGIN
|
|||||||
-- Don't write these queries to binlog
|
-- Don't write these queries to binlog
|
||||||
SET SQL_LOG_BIN=0;
|
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
|
-- Remove mark from lines that are suppressed by global suppressions
|
||||||
--
|
--
|
||||||
@ -236,17 +200,6 @@ BEGIN
|
|||||||
SET suspicious=0
|
SET suspicious=0
|
||||||
WHERE el.suspicious=1 AND el.line REGEXP ts.pattern;
|
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
|
-- 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
|
# Run include/check-warnings.test
|
||||||
#
|
#
|
||||||
# RETURN VALUE
|
# RETURN VALUE
|
||||||
@ -3368,6 +3447,8 @@ sub start_check_warnings ($$) {
|
|||||||
|
|
||||||
my $name= "warnings-".$mysqld->name();
|
my $name= "warnings-".$mysqld->name();
|
||||||
|
|
||||||
|
extract_warning_lines($mysqld->value('log-error'));
|
||||||
|
|
||||||
my $args;
|
my $args;
|
||||||
mtr_init_args(\$args);
|
mtr_init_args(\$args);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user