Commit 8193c327 authored by unknown's avatar unknown

BUG#43418: MTR2: does not notice a memory leak occuring at shutdown of

mysqld w/ --valgrind

 - Fixed by implementing parsing of error log messages generated outside of
   test case runs (eg. during server shutdown).

Also make mysql-test-run.pl not delete the error log after server restart,
which looses information about which warnings were found.

Finally, make multi_update2 a --big test.

mysql-test/lib/My/Test.pm:
  Fix home-brewed (and broken) serialization in My::Test to use the standard
  Storable serializer.
mysql-test/mysql-test-run.pl:
   - Stop mysqld servers gracefully rather than kill -9 when
     warnings are being checked.
  
   - After stopping mysqld servers, do an additional parse of the error
     log to check for any warnings generated during shutdown.
    
   - Fix error log parsing to be careful not to skip parsing part of the
     file, by keeping track of previous file position rather than
     relying on mark_log markers.
  
   - Workers report warnings during shutdown to the master process with
     a new packet 'WARNINGS' which includes a list of names of test that
     might have caused the problem (could be any test run since last
     server start).
    
   - Fail entire test suite if warnings are found.
  
   - When we remove the server data dir before server restart, preserve the
     error log (don't delete it between restarts), as it may contain
     valuable information even for test cases which don't show direct
     failures.
mysql-test/t/multi_update2.test:
  Make test --big, as it takes a _long_ time to run and only tests a single bug.
parent 806ec1b0
...@@ -9,6 +9,7 @@ package My::Test; ...@@ -9,6 +9,7 @@ package My::Test;
use strict; use strict;
use warnings; use warnings;
use Carp; use Carp;
use Storable();
sub new { sub new {
...@@ -30,18 +31,6 @@ sub key { ...@@ -30,18 +31,6 @@ sub key {
} }
sub _encode {
my ($value)= @_;
$value =~ s/([|\\\x{0a}\x{0d}])/sprintf('\%02X', ord($1))/eg;
return $value;
}
sub _decode {
my ($value)= @_;
$value =~ s/\\([0-9a-fA-F]{2})/chr(hex($1))/ge;
return $value;
}
sub is_failed { sub is_failed {
my ($self)= @_; my ($self)= @_;
my $result= $self->{result}; my $result= $self->{result};
...@@ -58,66 +47,22 @@ sub write_test { ...@@ -58,66 +47,22 @@ sub write_test {
# Give the test a unique key before serializing it # Give the test a unique key before serializing it
$test->{key}= "$test" unless defined $test->{key}; $test->{key}= "$test" unless defined $test->{key};
print $sock $header, "\n"; my $serialized= Storable::freeze($test);
while ((my ($key, $value)) = each(%$test)) { $serialized =~ s/([\x0d\x0a\\])/sprintf("\\%02x", ord($1))/eg;
print $sock $key, "= "; print $sock $header, "\n", $serialized, "\n";
if (ref $value eq "ARRAY") {
print $sock "[", _encode(join(", ", @$value)), "]";
} else {
print $sock _encode($value);
}
print $sock "\n";
}
print $sock "\n";
} }
sub read_test { sub read_test {
my ($sock)= @_; my ($sock)= @_;
my $test= My::Test->new(); my $serialized= <$sock>;
# Read the : separated key value pairs until a chomp($serialized);
# single newline on it's own line $serialized =~ s/\\([0-9a-fA-F]{2})/chr(hex($1))/eg;
my $line; my $test= Storable::thaw($serialized);
while (defined($line= <$sock>)) { die "wrong class (hack attempt?)"
# List is terminated by newline on it's own unless ref($test) eq 'My::Test';
if ($line eq "\n") {
# Correctly terminated reply
# print "Got newline\n";
last;
}
chomp($line);
# Split key/value on the first "="
my ($key, $value)= split("= ", $line, 2);
if ($value =~ /^\[(.*)\]/){
my @values= split(", ", _decode($1));
push(@{$test->{$key}}, @values);
}
else
{
$test->{$key}= _decode($value);
}
}
return $test; return $test;
} }
sub print_test {
my ($self)= @_;
print "[", $self->{name}, "]", "\n";
while ((my ($key, $value)) = each(%$self)) {
print " ", $key, "= ";
if (ref $value eq "ARRAY") {
print "[", join(", ", @$value), "]";
} else {
print $value;
}
print "\n";
}
print "\n";
}
1; 1;
This diff is collapsed.
...@@ -2,6 +2,9 @@ ...@@ -2,6 +2,9 @@
# Test of update statement that uses many tables. # Test of update statement that uses many tables.
# #
# This is a big test.
--source include/big_test.inc
--disable_warnings --disable_warnings
DROP TABLE IF EXISTS t1,t2; DROP TABLE IF EXISTS t1,t2;
--enable_warnings --enable_warnings
......
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