Commit d4d84a88 authored by msvensson@neptunus.(none)'s avatar msvensson@neptunus.(none)

Merge 192.168.0.4:mysql/mysql-5.0-maint

into  neptunus.(none):/home/msvensson/mysql/mysql-5.0-maint
parents f105e16b f83e9e4f
...@@ -59,7 +59,9 @@ sub collect_test_cases ($) { ...@@ -59,7 +59,9 @@ sub collect_test_cases ($) {
if ( @::opt_cases ) if ( @::opt_cases )
{ {
foreach my $tname ( @::opt_cases ) { # Run in specified order, no sort foreach my $tname ( @::opt_cases )
{
# Run in specified order, no sort
my $elem= undef; my $elem= undef;
my $component_id= undef; my $component_id= undef;
...@@ -85,7 +87,7 @@ sub collect_test_cases ($) { ...@@ -85,7 +87,7 @@ sub collect_test_cases ($) {
# If target component is known, check that the specified test case # If target component is known, check that the specified test case
# exists. # exists.
# #
# Otherwise, try to guess the target component. # Otherwise, try to guess the target component.
if ( $component_id ) if ( $component_id )
...@@ -127,7 +129,8 @@ sub collect_test_cases ($) { ...@@ -127,7 +129,8 @@ sub collect_test_cases ($) {
} }
else else
{ {
foreach my $elem ( sort readdir(TESTDIR) ) { foreach my $elem ( sort readdir(TESTDIR) )
{
my $component_id= undef; my $component_id= undef;
my $tname= undef; my $tname= undef;
...@@ -144,7 +147,9 @@ sub collect_test_cases ($) { ...@@ -144,7 +147,9 @@ sub collect_test_cases ($) {
next; next;
} }
next if $::opt_do_test and ! defined mtr_match_prefix($elem,$::opt_do_test); # Skip tests that does not match the --do-test= filter
next if $::opt_do_test and
! defined mtr_match_prefix($elem,$::opt_do_test);
collect_one_test_case($testdir,$resdir,$tname,$elem,$cases,\%disabled, collect_one_test_case($testdir,$resdir,$tname,$elem,$cases,\%disabled,
$component_id); $component_id);
...@@ -152,7 +157,7 @@ sub collect_test_cases ($) { ...@@ -152,7 +157,7 @@ sub collect_test_cases ($) {
closedir TESTDIR; closedir TESTDIR;
} }
# Reorder the test cases in an order that wil make them faster to run # Reorder the test cases in an order that will make them faster to run
if ( $::opt_reorder ) if ( $::opt_reorder )
{ {
...@@ -306,40 +311,6 @@ sub collect_one_test_case($$$$$$$) { ...@@ -306,40 +311,6 @@ sub collect_one_test_case($$$$$$$) {
$tinfo->{'slave_num'}= 1; $tinfo->{'slave_num'}= 1;
} }
if ( $::opt_with_ndbcluster or defined mtr_match_substring($tname,"ndb") )
{
# This is an ndb test or all tests should be run with ndb cluster started
$tinfo->{'ndb_test'}= 1;
if ( ! $::opt_ndbcluster_supported )
{
# Ndb is not supported, skip them
$tinfo->{'skip'}= 1;
$tinfo->{'comment'}= "No ndbcluster support";
return;
}
elsif ( $::opt_skip_ndbcluster )
{
# All ndb test's should be skipped
$tinfo->{'skip'}= 1;
$tinfo->{'comment'}= "No ndbcluster tests(--skip-ndbcluster)";
return;
}
}
else
{
# This is not a ndb test
$tinfo->{'ndb_test'}= 0;
if ( $::opt_with_ndbcluster_only )
{
# Only the ndb test should be run, all other should be skipped
$tinfo->{'skip'}= 1;
$tinfo->{'comment'}= "Only ndbcluster tests(--with-ndbcluster-only)";
return;
}
}
# FIXME what about embedded_server + ndbcluster, skip ?!
my $master_opt_file= "$testdir/$tname-master.opt"; my $master_opt_file= "$testdir/$tname-master.opt";
my $slave_opt_file= "$testdir/$tname-slave.opt"; my $slave_opt_file= "$testdir/$tname-slave.opt";
my $slave_mi_file= "$testdir/$tname.slave-mi"; my $slave_mi_file= "$testdir/$tname.slave-mi";
...@@ -550,6 +521,37 @@ sub collect_one_test_case($$$$$$$) { ...@@ -550,6 +521,37 @@ sub collect_one_test_case($$$$$$$) {
$tinfo->{'comment'}= "Test need debug binaries"; $tinfo->{'comment'}= "Test need debug binaries";
return; return;
} }
if ( $tinfo->{'ndb_test'} )
{
# This is a NDB test
if ( ! $::glob_ndbcluster_supported )
{
# Ndb is not supported, skip it
$tinfo->{'skip'}= 1;
$tinfo->{'comment'}= "No ndbcluster support";
return;
}
elsif ( $::opt_skip_ndbcluster )
{
# All ndb test's should be skipped
$tinfo->{'skip'}= 1;
$tinfo->{'comment'}= "No ndbcluster tests(--skip-ndbcluster)";
return;
}
}
else
{
# This is not a ndb test
if ( $::opt_with_ndbcluster_only )
{
# Only the ndb test should be run, all other should be skipped
$tinfo->{'skip'}= 1;
$tinfo->{'comment'}= "Only ndbcluster tests(--with-ndbcluster-only)";
return;
}
}
} }
} }
...@@ -563,6 +565,7 @@ our @tags= ...@@ -563,6 +565,7 @@ our @tags=
["include/have_binlog_format_statement.inc", "binlog_format", "stmt"], ["include/have_binlog_format_statement.inc", "binlog_format", "stmt"],
["include/big_test.inc", "big_test", 1], ["include/big_test.inc", "big_test", 1],
["include/have_debug.inc", "need_debug", 1], ["include/have_debug.inc", "need_debug", 1],
["include/have_ndb.inc", "ndb_test", 1],
["include/have_ndb_extra.inc", "ndb_extra", 1], ["include/have_ndb_extra.inc", "ndb_extra", 1],
["require_manager", "require_manager", 1], ["require_manager", "require_manager", 1],
); );
......
...@@ -8,7 +8,6 @@ use Socket; ...@@ -8,7 +8,6 @@ use Socket;
use Errno; use Errno;
use strict; use strict;
#use POSIX ":sys_wait_h";
use POSIX 'WNOHANG'; use POSIX 'WNOHANG';
sub mtr_run ($$$$$$;$); sub mtr_run ($$$$$$;$);
...@@ -1088,7 +1087,6 @@ sub mtr_kill_processes ($) { ...@@ -1088,7 +1087,6 @@ sub mtr_kill_processes ($) {
sub mtr_exit ($) { sub mtr_exit ($) {
my $code= shift; my $code= shift;
# cluck("Called mtr_exit()");
mtr_timer_stop_all($::glob_timers); mtr_timer_stop_all($::glob_timers);
local $SIG{HUP} = 'IGNORE'; local $SIG{HUP} = 'IGNORE';
# ToDo: Signalling -$$ will only work if we are the process group # ToDo: Signalling -$$ will only work if we are the process group
......
...@@ -130,16 +130,11 @@ sub mtr_report_test_failed ($) { ...@@ -130,16 +130,11 @@ sub mtr_report_test_failed ($) {
my $tinfo= shift; my $tinfo= shift;
$tinfo->{'result'}= 'MTR_RES_FAILED'; $tinfo->{'result'}= 'MTR_RES_FAILED';
if ( $tinfo->{'timeout'} ) if ( defined $tinfo->{'timeout'} )
{ {
print "[ fail ] timeout\n"; print "[ fail ] timeout\n";
return; return;
} }
elsif ( $tinfo->{'ndb_test'} and $::cluster->[0]->{'installed_ok'} eq "NO")
{
print "[ fail ] ndbcluster start failure\n";
return;
}
else else
{ {
print "[ fail ]\n"; print "[ fail ]\n";
...@@ -208,8 +203,9 @@ sub mtr_report_stats ($) { ...@@ -208,8 +203,9 @@ sub mtr_report_stats ($) {
else else
{ {
my $ratio= $tot_passed * 100 / $tot_tests; my $ratio= $tot_passed * 100 / $tot_tests;
printf "Failed $tot_failed/$tot_tests tests, " . print "Failed $tot_failed/$tot_tests tests, ";
"%.2f\% were successful.\n\n", $ratio; printf("%.2f", $ratio);
print "\% were successful.\n\n";
print print
"The log files in var/log may give you some hint\n", "The log files in var/log may give you some hint\n",
"of what went wrong.\n", "of what went wrong.\n",
......
...@@ -4,23 +4,19 @@ ...@@ -4,23 +4,19 @@
# and is part of the translation of the Bourne shell script with the # and is part of the translation of the Bourne shell script with the
# same name. # same name.
use Carp qw(cluck);
use Socket; use Socket;
use Errno; use Errno;
use strict; use strict;
#use POSIX ":sys_wait_h";
use POSIX 'WNOHANG';
sub mtr_init_timers (); sub mtr_init_timers ();
sub mtr_timer_start($$$); sub mtr_timer_start($$$);
sub mtr_timer_stop($$); sub mtr_timer_stop($$);
sub mtr_timer_stop_all($); sub mtr_timer_stop_all($);
sub mtr_timer_waitpid($$$);
############################################################################## ##############################################################################
# #
# Initiate a structure shared by all timers # Initiate the structure shared by all timers
# #
############################################################################## ##############################################################################
...@@ -35,17 +31,19 @@ sub mtr_init_timers () { ...@@ -35,17 +31,19 @@ sub mtr_init_timers () {
# Start, stop and poll a timer # Start, stop and poll a timer
# #
# As alarm() isn't portable to Windows, we use separate processes to # As alarm() isn't portable to Windows, we use separate processes to
# implement timers. That is why there is a mtr_timer_waitpid(), as this # implement timers.
# is where we catch a timeout.
# #
############################################################################## ##############################################################################
sub mtr_timer_start($$$) { sub mtr_timer_start($$$) {
my ($timers,$name,$duration)= @_; my ($timers,$name,$duration)= @_;
mtr_verbose("mtr_timer_start: $name, $duration");
if ( exists $timers->{'timers'}->{$name} ) if ( exists $timers->{'timers'}->{$name} )
{ {
# We have an old running timer, kill it # We have an old running timer, kill it
mtr_verbose("There is an old timer running");
mtr_timer_stop($timers,$name); mtr_timer_stop($timers,$name);
} }
...@@ -57,7 +55,7 @@ sub mtr_timer_start($$$) { ...@@ -57,7 +55,7 @@ sub mtr_timer_start($$$) {
{ {
if ( $! == $!{EAGAIN} ) # See "perldoc Errno" if ( $! == $!{EAGAIN} ) # See "perldoc Errno"
{ {
mtr_debug("Got EAGAIN from fork(), sleep 1 second and redo"); mtr_warning("Got EAGAIN from fork(), sleep 1 second and redo");
sleep(1); sleep(1);
redo FORK; redo FORK;
} }
...@@ -70,6 +68,7 @@ sub mtr_timer_start($$$) { ...@@ -70,6 +68,7 @@ sub mtr_timer_start($$$) {
if ( $tpid ) if ( $tpid )
{ {
# Parent, record the information # Parent, record the information
mtr_verbose("timer parent, record info($name, $tpid, $duration)");
$timers->{'timers'}->{$name}->{'pid'}= $tpid; $timers->{'timers'}->{$name}->{'pid'}= $tpid;
$timers->{'timers'}->{$name}->{'duration'}= $duration; $timers->{'timers'}->{$name}->{'duration'}= $duration;
$timers->{'pids'}->{$tpid}= $name; $timers->{'pids'}->{$tpid}= $name;
...@@ -85,6 +84,7 @@ sub mtr_timer_start($$$) { ...@@ -85,6 +84,7 @@ sub mtr_timer_start($$$) {
$SIG{INT}= 'DEFAULT'; $SIG{INT}= 'DEFAULT';
$0= "mtr_timer(timers,$name,$duration)"; $0= "mtr_timer(timers,$name,$duration)";
mtr_verbose("timer child $name, sleep $duration");
sleep($duration); sleep($duration);
exit(0); exit(0);
} }
...@@ -95,9 +95,12 @@ sub mtr_timer_start($$$) { ...@@ -95,9 +95,12 @@ sub mtr_timer_start($$$) {
sub mtr_timer_stop ($$) { sub mtr_timer_stop ($$) {
my ($timers,$name)= @_; my ($timers,$name)= @_;
mtr_verbose("mtr_timer_stop: $name");
if ( exists $timers->{'timers'}->{$name} ) if ( exists $timers->{'timers'}->{$name} )
{ {
my $tpid= $timers->{'timers'}->{$name}->{'pid'}; my $tpid= $timers->{'timers'}->{$name}->{'pid'};
mtr_verbose("Stopping timer with pid $tpid");
# FIXME as Cygwin reuses pids fast, maybe check that is # FIXME as Cygwin reuses pids fast, maybe check that is
# the expected process somehow?! # the expected process somehow?!
...@@ -114,7 +117,7 @@ sub mtr_timer_stop ($$) { ...@@ -114,7 +117,7 @@ sub mtr_timer_stop ($$) {
} }
else else
{ {
mtr_debug("Asked to stop timer \"$name\" not started"); mtr_error("Asked to stop timer \"$name\" not started");
return 0; return 0;
} }
} }
...@@ -136,10 +139,8 @@ sub mtr_timer_timeout ($$) { ...@@ -136,10 +139,8 @@ sub mtr_timer_timeout ($$) {
return "" unless exists $timers->{'pids'}->{$pid}; return "" unless exists $timers->{'pids'}->{$pid};
# We got a timeout # We got a timeout, return the name ot the timer
my $name= $timers->{'pids'}->{$pid}; return $timers->{'pids'}->{$pid};
mtr_timer_stop($timers, $timers->{'timers'}->{$name});
return $name;
} }
1; 1;
...@@ -65,6 +65,7 @@ use IO::Socket; ...@@ -65,6 +65,7 @@ use IO::Socket;
use IO::Socket::INET; use IO::Socket::INET;
use Data::Dumper; use Data::Dumper;
use strict; use strict;
use warnings;
use diagnostics; use diagnostics;
our $glob_win32_perl= ($^O eq "MSWin32"); # ActiveState Win32 Perl our $glob_win32_perl= ($^O eq "MSWin32"); # ActiveState Win32 Perl
...@@ -277,7 +278,7 @@ our $opt_skip_ndbcluster= 0; ...@@ -277,7 +278,7 @@ our $opt_skip_ndbcluster= 0;
our $opt_skip_ndbcluster_slave= 0; our $opt_skip_ndbcluster_slave= 0;
our $opt_with_ndbcluster= 0; our $opt_with_ndbcluster= 0;
our $opt_with_ndbcluster_only= 0; our $opt_with_ndbcluster_only= 0;
our $opt_ndbcluster_supported= 0; our $glob_ndbcluster_supported= 0;
our $opt_ndb_extra_test= 0; our $opt_ndb_extra_test= 0;
our $opt_skip_master_binlog= 0; our $opt_skip_master_binlog= 0;
our $opt_skip_slave_binlog= 0; our $opt_skip_slave_binlog= 0;
...@@ -391,6 +392,8 @@ sub main () { ...@@ -391,6 +392,8 @@ sub main () {
my ($need_ndbcluster,$need_im); my ($need_ndbcluster,$need_im);
foreach my $test (@$tests) foreach my $test (@$tests)
{ {
next if $test->{skip};
$need_ndbcluster||= $test->{ndb_test}; $need_ndbcluster||= $test->{ndb_test};
$need_im||= $test->{component_id} eq 'im'; $need_im||= $test->{component_id} eq 'im';
...@@ -570,10 +573,10 @@ sub command_line_setup () { ...@@ -570,10 +573,10 @@ sub command_line_setup () {
'compress' => \$opt_compress, 'compress' => \$opt_compress,
'bench' => \$opt_bench, 'bench' => \$opt_bench,
'small-bench' => \$opt_small_bench, 'small-bench' => \$opt_small_bench,
'with-ndbcluster' => \$opt_with_ndbcluster,
# Control what test suites or cases to run # Control what test suites or cases to run
'force' => \$opt_force, 'force' => \$opt_force,
'with-ndbcluster' => \$opt_with_ndbcluster,
'with-ndbcluster-only' => \$opt_with_ndbcluster_only, 'with-ndbcluster-only' => \$opt_with_ndbcluster_only,
'skip-ndbcluster|skip-ndb' => \$opt_skip_ndbcluster, 'skip-ndbcluster|skip-ndb' => \$opt_skip_ndbcluster,
'skip-ndbcluster-slave|skip-ndb-slave' 'skip-ndbcluster-slave|skip-ndb-slave'
...@@ -844,9 +847,9 @@ sub command_line_setup () { ...@@ -844,9 +847,9 @@ sub command_line_setup () {
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
# Ndb cluster flags # Ndb cluster flags
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
if ( $opt_with_ndbcluster and $opt_skip_ndbcluster) if ( $opt_with_ndbcluster and !$opt_bench)
{ {
mtr_error("Can't specify both --with-ndbcluster and --skip-ndbcluster"); mtr_error("Can only use --with-ndbcluster togheter with --bench");
} }
if ( $opt_ndbconnectstring ) if ( $opt_ndbconnectstring )
...@@ -1483,7 +1486,7 @@ sub environment_setup () { ...@@ -1483,7 +1486,7 @@ sub environment_setup () {
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
# Add the path where libndbclient can be found # Add the path where libndbclient can be found
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
if ( $opt_ndbcluster_supported ) if ( $glob_ndbcluster_supported )
{ {
push(@ld_library_paths, "$glob_basedir/storage/ndb/src/.libs"); push(@ld_library_paths, "$glob_basedir/storage/ndb/src/.libs");
} }
...@@ -1868,6 +1871,8 @@ sub cleanup_stale_files () { ...@@ -1868,6 +1871,8 @@ sub cleanup_stale_files () {
rmtree(readlink($opt_vardir)); rmtree(readlink($opt_vardir));
# Remove the entire "var" dir # Remove the entire "var" dir
rmtree("$opt_vardir/"); rmtree("$opt_vardir/");
# Remove the "var" symlink
unlink($opt_vardir);
} }
else else
{ {
...@@ -2040,7 +2045,7 @@ sub check_ndbcluster_support ($) { ...@@ -2040,7 +2045,7 @@ sub check_ndbcluster_support ($) {
$opt_skip_ndbcluster_slave= 1; $opt_skip_ndbcluster_slave= 1;
return; return;
} }
$opt_ndbcluster_supported= 1; $glob_ndbcluster_supported= 1;
mtr_report("Using ndbcluster when necessary, mysqld supports it"); mtr_report("Using ndbcluster when necessary, mysqld supports it");
if ( $mysql_version_id < 50100 ) if ( $mysql_version_id < 50100 )
...@@ -2057,11 +2062,6 @@ sub check_ndbcluster_support ($) { ...@@ -2057,11 +2062,6 @@ sub check_ndbcluster_support ($) {
sub ndbcluster_start_install ($) { sub ndbcluster_start_install ($) {
my $cluster= shift; my $cluster= shift;
if ( $opt_skip_ndbcluster or $glob_use_running_ndbcluster )
{
return 0;
}
mtr_report("Installing $cluster->{'name'} Cluster"); mtr_report("Installing $cluster->{'name'} Cluster");
mkdir($cluster->{'data_dir'}); mkdir($cluster->{'data_dir'});
...@@ -2475,11 +2475,24 @@ sub mysql_install_db () { ...@@ -2475,11 +2475,24 @@ sub mysql_install_db () {
my $cluster_started_ok= 1; # Assume it can be started my $cluster_started_ok= 1; # Assume it can be started
if (ndbcluster_start_install($clusters->[0]) || if ($opt_skip_ndbcluster || $glob_use_running_ndbcluster)
($max_slave_num && !$opt_skip_ndbcluster_slave && {
ndbcluster_start_install($clusters->[1]))) # Don't install master cluster
}
elsif (ndbcluster_start_install($clusters->[0]))
{
mtr_warning("Failed to start install of $clusters->[0]->{name}");
$cluster_started_ok= 0;
}
if ($max_slave_num == 0 ||
$opt_skip_ndbcluster_slave || $glob_use_running_ndbcluster_slave)
{
# Don't install slave cluster
}
elsif (ndbcluster_start_install($clusters->[1]))
{ {
mtr_warning("Failed to start install of cluster"); mtr_warning("Failed to start install of $clusters->[1]->{name}");
$cluster_started_ok= 0; $cluster_started_ok= 0;
} }
...@@ -2512,9 +2525,6 @@ sub mysql_install_db () { ...@@ -2512,9 +2525,6 @@ sub mysql_install_db () {
} }
} }
# Stop clusters...
stop_all_servers();
return 0; return 0;
} }
...@@ -2753,10 +2763,9 @@ sub run_testcase_check_skip_test($) ...@@ -2753,10 +2763,9 @@ sub run_testcase_check_skip_test($)
# If test needs this cluster, check it was installed ok # If test needs this cluster, check it was installed ok
if ( !$cluster->{'installed_ok'} ) if ( !$cluster->{'installed_ok'} )
{ {
mtr_tofile($path_timefile,
"Test marked as failed because $cluster->{'name'} " .
"was not installed ok!");
mtr_report_test_name($tinfo); mtr_report_test_name($tinfo);
$tinfo->{comment}=
"Cluster $cluster->{'name'} was not installed ok";
mtr_report_test_failed($tinfo); mtr_report_test_failed($tinfo);
return 1; return 1;
} }
...@@ -2879,10 +2888,8 @@ sub run_testcase ($) { ...@@ -2879,10 +2888,8 @@ sub run_testcase ($) {
# Can't restart a running server that may be in use # Can't restart a running server that may be in use
if ( $glob_use_running_server ) if ( $glob_use_running_server )
{ {
$tinfo->{'skip'}= 1;
$tinfo->{'comment'}= "Can't restart a running server";
mtr_report_test_name($tinfo); mtr_report_test_name($tinfo);
$tinfo->{comment}= "Can't restart a running server";
mtr_report_test_skipped($tinfo); mtr_report_test_skipped($tinfo);
return; return;
} }
...@@ -2906,6 +2913,7 @@ sub run_testcase ($) { ...@@ -2906,6 +2913,7 @@ sub run_testcase ($) {
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
if ( $opt_start_and_exit or $opt_start_dirty ) if ( $opt_start_and_exit or $opt_start_dirty )
{ {
mtr_timer_stop_all($glob_timers);
mtr_report("\nServers started, exiting"); mtr_report("\nServers started, exiting");
exit(0); exit(0);
} }
...@@ -2932,16 +2940,16 @@ sub run_testcase ($) { ...@@ -2932,16 +2940,16 @@ sub run_testcase ($) {
$tinfo->{'timeout'}= 1; # Mark as timeout $tinfo->{'timeout'}= 1; # Mark as timeout
report_failure_and_restart($tinfo); report_failure_and_restart($tinfo);
} }
elsif ( $res == 1 )
{
# Test case failure reported by mysqltest
report_failure_and_restart($tinfo);
}
else else
{ {
# Test case failed, if in control mysqltest returns 1 # mysqltest failed, probably crashed
if ( $res != 1 ) $tinfo->{comment}=
{ "mysqltest returned unexpected code $res, it has probably crashed";
mtr_tofile($path_timefile,
"mysqltest returned unexpected code $res, " .
"it has probably crashed");
}
report_failure_and_restart($tinfo); report_failure_and_restart($tinfo);
} }
...@@ -3593,14 +3601,14 @@ sub run_testcase_need_master_restart($) ...@@ -3593,14 +3601,14 @@ sub run_testcase_need_master_restart($)
mtr_verbose("Restart master: Restart forced with --force-restart"); mtr_verbose("Restart master: Restart forced with --force-restart");
} }
elsif ( ! $opt_skip_ndbcluster and elsif ( ! $opt_skip_ndbcluster and
$tinfo->{'ndb_test'} == 0 and !$tinfo->{'ndb_test'} and
$clusters->[0]->{'pid'} != 0 ) $clusters->[0]->{'pid'} != 0 )
{ {
$do_restart= 1; # Restart without cluster $do_restart= 1; # Restart without cluster
mtr_verbose("Restart master: Test does not need cluster"); mtr_verbose("Restart master: Test does not need cluster");
} }
elsif ( ! $opt_skip_ndbcluster and elsif ( ! $opt_skip_ndbcluster and
$tinfo->{'ndb_test'} == 1 and $tinfo->{'ndb_test'} and
$clusters->[0]->{'pid'} == 0 ) $clusters->[0]->{'pid'} == 0 )
{ {
$do_restart= 1; # Restart with cluster $do_restart= 1; # Restart with cluster
...@@ -4456,6 +4464,7 @@ Options to control what engine/variation to run ...@@ -4456,6 +4464,7 @@ Options to control what engine/variation to run
skip-ssl Dont start server with support for ssl connections skip-ssl Dont start server with support for ssl connections
bench Run the benchmark suite bench Run the benchmark suite
small-bench Run the benchmarks with --small-tests --small-tables small-bench Run the benchmarks with --small-tests --small-tables
with-ndbcluster Use cluster as default table type for benchmark
Options to control directories to use Options to control directories to use
benchdir=DIR The directory where the benchmark suite is stored benchdir=DIR The directory where the benchmark suite is stored
...@@ -4472,7 +4481,6 @@ Options to control directories to use ...@@ -4472,7 +4481,6 @@ Options to control directories to use
Options to control what test suites or cases to run Options to control what test suites or cases to run
force Continue to run the suite after failure force Continue to run the suite after failure
with-ndbcluster Use cluster in all tests
with-ndbcluster-only Run only tests that include "ndb" in the filename with-ndbcluster-only Run only tests that include "ndb" in the filename
skip-ndb[cluster] Skip all tests that need cluster skip-ndb[cluster] Skip all tests that need cluster
skip-ndb[cluster]-slave Skip all tests that need a slave cluster skip-ndb[cluster]-slave Skip all tests that need a slave cluster
......
...@@ -1379,4 +1379,21 @@ i ...@@ -1379,4 +1379,21 @@ i
1 1
DEALLOCATE PREPARE stmt; DEALLOCATE PREPARE stmt;
DROP TABLE t1, t2; DROP TABLE t1, t2;
flush status;
prepare sq from 'show status like "slow_queries"';
execute sq;
Variable_name Value
Slow_queries 0
prepare no_index from 'select 1 from information_schema.tables limit 1';
execute sq;
Variable_name Value
Slow_queries 0
execute no_index;
1
1
execute sq;
Variable_name Value
Slow_queries 1
deallocate prepare no_index;
deallocate prepare sq;
End of 5.0 tests. End of 5.0 tests.
...@@ -630,4 +630,19 @@ SHOW TABLES FROM no_such_database; ...@@ -630,4 +630,19 @@ SHOW TABLES FROM no_such_database;
ERROR 42000: Unknown database 'no_such_database' ERROR 42000: Unknown database 'no_such_database'
SHOW COLUMNS FROM no_such_table; SHOW COLUMNS FROM no_such_table;
ERROR 42S02: Table 'test.no_such_table' doesn't exist ERROR 42S02: Table 'test.no_such_table' doesn't exist
flush status;
show status like 'slow_queries';
Variable_name Value
Slow_queries 0
show tables;
Tables_in_test
show status like 'slow_queries';
Variable_name Value
Slow_queries 0
select 1 from information_schema.tables limit 1;
1
1
show status like 'slow_queries';
Variable_name Value
Slow_queries 1
End of 5.0 tests End of 5.0 tests
...@@ -836,27 +836,27 @@ count(*) ...@@ -836,27 +836,27 @@ count(*)
26 26
show status like 'Slow_queries'; show status like 'Slow_queries';
Variable_name Value Variable_name Value
Slow_queries 1 Slow_queries 0
select count(*) from t1 where b=13; select count(*) from t1 where b=13;
count(*) count(*)
10 10
show status like 'Slow_queries'; show status like 'Slow_queries';
Variable_name Value Variable_name Value
Slow_queries 3 Slow_queries 1
select count(*) from t1 where b=13 union select count(*) from t1 where a=7; select count(*) from t1 where b=13 union select count(*) from t1 where a=7;
count(*) count(*)
10 10
26 26
show status like 'Slow_queries'; show status like 'Slow_queries';
Variable_name Value Variable_name Value
Slow_queries 5 Slow_queries 2
select count(*) from t1 where a=7 union select count(*) from t1 where b=13; select count(*) from t1 where a=7 union select count(*) from t1 where b=13;
count(*) count(*)
26 26
10 10
show status like 'Slow_queries'; show status like 'Slow_queries';
Variable_name Value Variable_name Value
Slow_queries 7 Slow_queries 3
flush status; flush status;
select a from t1 where b not in (1,2,3) union select a from t1 where b not in (4,5,6); select a from t1 where b not in (1,2,3) union select a from t1 where b not in (4,5,6);
a a
......
...@@ -1980,7 +1980,7 @@ v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VI ...@@ -1980,7 +1980,7 @@ v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VI
drop view v1; drop view v1;
drop table t1; drop table t1;
set sql_mode='strict_all_tables'; set sql_mode='strict_all_tables';
CREATE TABLE t1 (col1 INT NOT NULL, col2 INT NOT NULL) ENGINE = INNODB; CREATE TABLE t1 (col1 INT NOT NULL, col2 INT NOT NULL);
CREATE VIEW v1 (vcol1) AS SELECT col1 FROM t1; CREATE VIEW v1 (vcol1) AS SELECT col1 FROM t1;
CREATE VIEW v2 (vcol1) AS SELECT col1 FROM t1 WHERE col2 > 2; CREATE VIEW v2 (vcol1) AS SELECT col1 FROM t1 WHERE col2 > 2;
INSERT INTO t1 (col1) VALUES(12); INSERT INTO t1 (col1) VALUES(12);
...@@ -2032,7 +2032,7 @@ f3 f1 ...@@ -2032,7 +2032,7 @@ f3 f1
1 3 1 3
drop view v1; drop view v1;
drop table t1; drop table t1;
CREATE TABLE t1 (f1 char) ENGINE = innodb; CREATE TABLE t1 (f1 char);
INSERT INTO t1 VALUES ('A'); INSERT INTO t1 VALUES ('A');
CREATE VIEW v1 AS SELECT * FROM t1; CREATE VIEW v1 AS SELECT * FROM t1;
INSERT INTO t1 VALUES('B'); INSERT INTO t1 VALUES('B');
......
--log-slow-queries --log-long-format --log-queries-not-using-indexes
...@@ -1437,4 +1437,18 @@ DEALLOCATE PREPARE stmt; ...@@ -1437,4 +1437,18 @@ DEALLOCATE PREPARE stmt;
DROP TABLE t1, t2; DROP TABLE t1, t2;
#
# Bug 19764: SHOW commands end up in the slow log as table scans
#
flush status;
prepare sq from 'show status like "slow_queries"';
execute sq;
prepare no_index from 'select 1 from information_schema.tables limit 1';
execute sq;
execute no_index;
execute sq;
deallocate prepare no_index;
deallocate prepare sq;
--echo End of 5.0 tests. --echo End of 5.0 tests.
--log-slow-queries --log-long-format --log-queries-not-using-indexes
...@@ -507,4 +507,16 @@ SHOW TABLES FROM no_such_database; ...@@ -507,4 +507,16 @@ SHOW TABLES FROM no_such_database;
SHOW COLUMNS FROM no_such_table; SHOW COLUMNS FROM no_such_table;
#
# Bug #19764: SHOW commands end up in the slow log as table scans
#
flush status;
show status like 'slow_queries';
show tables;
show status like 'slow_queries';
# Table scan query, to ensure that slow_queries does still get incremented
# (mysqld is started with --log-queries-not-using-indexes)
select 1 from information_schema.tables limit 1;
show status like 'slow_queries';
--echo End of 5.0 tests --echo End of 5.0 tests
...@@ -1801,7 +1801,7 @@ drop table t1; ...@@ -1801,7 +1801,7 @@ drop table t1;
# underlying tables (BUG#6443) # underlying tables (BUG#6443)
# #
set sql_mode='strict_all_tables'; set sql_mode='strict_all_tables';
CREATE TABLE t1 (col1 INT NOT NULL, col2 INT NOT NULL) ENGINE = INNODB; CREATE TABLE t1 (col1 INT NOT NULL, col2 INT NOT NULL);
CREATE VIEW v1 (vcol1) AS SELECT col1 FROM t1; CREATE VIEW v1 (vcol1) AS SELECT col1 FROM t1;
CREATE VIEW v2 (vcol1) AS SELECT col1 FROM t1 WHERE col2 > 2; CREATE VIEW v2 (vcol1) AS SELECT col1 FROM t1 WHERE col2 > 2;
-- error 1364 -- error 1364
...@@ -1857,7 +1857,7 @@ drop table t1; ...@@ -1857,7 +1857,7 @@ drop table t1;
# #
# Test for bug #11771: wrong query_id in SELECT * FROM <view> # Test for bug #11771: wrong query_id in SELECT * FROM <view>
# #
CREATE TABLE t1 (f1 char) ENGINE = innodb; CREATE TABLE t1 (f1 char);
INSERT INTO t1 VALUES ('A'); INSERT INTO t1 VALUES ('A');
CREATE VIEW v1 AS SELECT * FROM t1; CREATE VIEW v1 AS SELECT * FROM t1;
......
...@@ -312,7 +312,7 @@ static my_bool my_read_charset_file(const char *filename, myf myflags) ...@@ -312,7 +312,7 @@ static my_bool my_read_charset_file(const char *filename, myf myflags)
{ {
char *buf; char *buf;
int fd; int fd;
uint len; uint len, tmp_len;
MY_STAT stat_info; MY_STAT stat_info;
if (!my_stat(filename, &stat_info, MYF(myflags)) || if (!my_stat(filename, &stat_info, MYF(myflags)) ||
...@@ -321,12 +321,11 @@ static my_bool my_read_charset_file(const char *filename, myf myflags) ...@@ -321,12 +321,11 @@ static my_bool my_read_charset_file(const char *filename, myf myflags)
return TRUE; return TRUE;
if ((fd=my_open(filename,O_RDONLY,myflags)) < 0) if ((fd=my_open(filename,O_RDONLY,myflags)) < 0)
{ goto error;
my_free(buf,myflags); tmp_len=my_read(fd, buf, len, myflags);
return TRUE;
}
len=read(fd,buf,len);
my_close(fd,myflags); my_close(fd,myflags);
if (tmp_len != len)
goto error;
if (my_parse_charset_xml(buf,len,add_collation)) if (my_parse_charset_xml(buf,len,add_collation))
{ {
...@@ -340,6 +339,10 @@ static my_bool my_read_charset_file(const char *filename, myf myflags) ...@@ -340,6 +339,10 @@ static my_bool my_read_charset_file(const char *filename, myf myflags)
my_free(buf, myflags); my_free(buf, myflags);
return FALSE; return FALSE;
error:
my_free(buf, myflags);
return TRUE;
} }
......
...@@ -333,7 +333,11 @@ my_bool reinit_io_cache(IO_CACHE *info, enum cache_type type, ...@@ -333,7 +333,11 @@ my_bool reinit_io_cache(IO_CACHE *info, enum cache_type type,
{ {
info->read_end=info->write_pos; info->read_end=info->write_pos;
info->end_of_file=my_b_tell(info); info->end_of_file=my_b_tell(info);
info->seek_not_done=1; /*
Trigger a new seek only if we have a valid
file handle.
*/
info->seek_not_done= (info->file != -1);
} }
else if (type == WRITE_CACHE) else if (type == WRITE_CACHE)
{ {
......
...@@ -30,6 +30,8 @@ uint32 my_lread(int Filedes, byte *Buffer, uint32 Count, myf MyFlags) ...@@ -30,6 +30,8 @@ uint32 my_lread(int Filedes, byte *Buffer, uint32 Count, myf MyFlags)
DBUG_PRINT("my",("Fd: %d Buffer: %ld Count: %ld MyFlags: %d", DBUG_PRINT("my",("Fd: %d Buffer: %ld Count: %ld MyFlags: %d",
Filedes, Buffer, Count, MyFlags)); Filedes, Buffer, Count, MyFlags));
DBUG_PRINT("error", ("Deprecated my_lread() function should not be used."));
/* Temp hack to get count to int32 while read wants int */ /* Temp hack to get count to int32 while read wants int */
if ((readbytes = (uint32) read(Filedes, Buffer, (uint) Count)) != Count) if ((readbytes = (uint32) read(Filedes, Buffer, (uint) Count)) != Count)
{ {
......
...@@ -26,6 +26,8 @@ uint32 my_lwrite(int Filedes, const byte *Buffer, uint32 Count, myf MyFlags) ...@@ -26,6 +26,8 @@ uint32 my_lwrite(int Filedes, const byte *Buffer, uint32 Count, myf MyFlags)
DBUG_PRINT("my",("Fd: %d Buffer: 0x%lx Count: %ld MyFlags: %d", DBUG_PRINT("my",("Fd: %d Buffer: 0x%lx Count: %ld MyFlags: %d",
Filedes, Buffer, Count, MyFlags)); Filedes, Buffer, Count, MyFlags));
DBUG_PRINT("error", ("Deprecated my_lwrite() function should not be used."));
/* Temp hack to get count to int32 while write wants int */ /* Temp hack to get count to int32 while write wants int */
if ((writenbytes = (uint32) write(Filedes, Buffer, (uint) Count)) != Count) if ((writenbytes = (uint32) write(Filedes, Buffer, (uint) Count)) != Count)
{ {
......
...@@ -52,8 +52,12 @@ uint my_pread(File Filedes, byte *Buffer, uint Count, my_off_t offset, ...@@ -52,8 +52,12 @@ uint my_pread(File Filedes, byte *Buffer, uint Count, my_off_t offset,
DBUG_PRINT("warning",("Read only %ld bytes off %ld from %d, errno: %d", DBUG_PRINT("warning",("Read only %ld bytes off %ld from %d, errno: %d",
readbytes,Count,Filedes,my_errno)); readbytes,Count,Filedes,my_errno));
#ifdef THREAD #ifdef THREAD
if (readbytes == 0 && errno == EINTR) if ((readbytes == 0 || (int) readbytes == -1) && errno == EINTR)
continue; /* Interrupted */ {
DBUG_PRINT("debug", ("my_pread() was interrupted and returned %d",
(int) readbytes));
continue; /* Interrupted */
}
#endif #endif
if (MyFlags & (MY_WME | MY_FAE | MY_FNABP)) if (MyFlags & (MY_WME | MY_FAE | MY_FNABP))
{ {
...@@ -124,8 +128,8 @@ uint my_pwrite(int Filedes, const byte *Buffer, uint Count, my_off_t offset, ...@@ -124,8 +128,8 @@ uint my_pwrite(int Filedes, const byte *Buffer, uint Count, my_off_t offset,
VOID(sleep(MY_WAIT_FOR_USER_TO_FIX_PANIC)); VOID(sleep(MY_WAIT_FOR_USER_TO_FIX_PANIC));
continue; continue;
} }
if ((writenbytes == 0 && my_errno == EINTR) || if ((writenbytes > 0 && (uint) writenbytes != (uint) -1) ||
(writenbytes > 0 && (uint) writenbytes != (uint) -1)) my_errno == EINTR)
continue; /* Retry */ continue; /* Retry */
#endif #endif
if (MyFlags & (MY_NABP | MY_FNABP)) if (MyFlags & (MY_NABP | MY_FNABP))
......
...@@ -26,6 +26,14 @@ uint my_quick_read(File Filedes,byte *Buffer,uint Count,myf MyFlags) ...@@ -26,6 +26,14 @@ uint my_quick_read(File Filedes,byte *Buffer,uint Count,myf MyFlags)
if ((readbytes = (uint) read(Filedes, Buffer, Count)) != Count) if ((readbytes = (uint) read(Filedes, Buffer, Count)) != Count)
{ {
#ifndef DBUG_OFF
if ((readbytes == 0 || (int) readbytes == -1) && errno == EINTR)
{
DBUG_PRINT("error", ("my_quick_read() was interrupted and returned %d"
". This function does not retry the read!",
(int) readbytes));
}
#endif
my_errno=errno; my_errno=errno;
return readbytes; return readbytes;
} }
...@@ -35,8 +43,24 @@ uint my_quick_read(File Filedes,byte *Buffer,uint Count,myf MyFlags) ...@@ -35,8 +43,24 @@ uint my_quick_read(File Filedes,byte *Buffer,uint Count,myf MyFlags)
uint my_quick_write(File Filedes,const byte *Buffer,uint Count) uint my_quick_write(File Filedes,const byte *Buffer,uint Count)
{ {
if ((uint) write(Filedes,Buffer,Count) != Count) #ifndef DBUG_OFF
uint writtenbytes;
#endif
if ((
#ifndef DBUG_OFF
writtenbytes =
#endif
(uint) write(Filedes,Buffer,Count)) != Count)
{ {
#ifndef DBUG_OFF
if ((writtenbytes == 0 || (int) writtenbytes == -1) && errno == EINTR)
{
DBUG_PRINT("error", ("my_quick_write() was interrupted and returned %d"
". This function does not retry the write!",
(int) writtenbytes));
}
#endif
my_errno=errno; my_errno=errno;
return (uint) -1; return (uint) -1;
} }
......
...@@ -51,10 +51,11 @@ uint my_read(File Filedes, byte *Buffer, uint Count, myf MyFlags) ...@@ -51,10 +51,11 @@ uint my_read(File Filedes, byte *Buffer, uint Count, myf MyFlags)
DBUG_PRINT("warning",("Read only %ld bytes off %ld from %d, errno: %d", DBUG_PRINT("warning",("Read only %ld bytes off %ld from %d, errno: %d",
readbytes, Count, Filedes, my_errno)); readbytes, Count, Filedes, my_errno));
#ifdef THREAD #ifdef THREAD
if ((int) readbytes <= 0 && errno == EINTR) if ((readbytes == 0 || (int) readbytes == -1) && errno == EINTR)
{ {
DBUG_PRINT("debug", ("my_read() was interrupted and returned %d", (int) readbytes)); DBUG_PRINT("debug", ("my_read() was interrupted and returned %d",
continue; /* Interrupted */ (int) readbytes));
continue; /* Interrupted */
} }
#endif #endif
if (MyFlags & (MY_WME | MY_FAE | MY_FNABP)) if (MyFlags & (MY_WME | MY_FAE | MY_FNABP))
......
...@@ -29,8 +29,13 @@ my_off_t my_seek(File fd, my_off_t pos, int whence, ...@@ -29,8 +29,13 @@ my_off_t my_seek(File fd, my_off_t pos, int whence,
whence, MyFlags)); whence, MyFlags));
DBUG_ASSERT(pos != MY_FILEPOS_ERROR); /* safety check */ DBUG_ASSERT(pos != MY_FILEPOS_ERROR); /* safety check */
if (-1 != fd) /*
newpos=lseek(fd, pos, whence); Make sure we are using a valid file descriptor!
*/
DBUG_ASSERT(fd != -1);
newpos= lseek(fd, pos, whence);
if (newpos == (os_off_t) -1) if (newpos == (os_off_t) -1)
{ {
my_errno=errno; my_errno=errno;
......
...@@ -57,18 +57,24 @@ uint my_write(int Filedes, const byte *Buffer, uint Count, myf MyFlags) ...@@ -57,18 +57,24 @@ uint my_write(int Filedes, const byte *Buffer, uint Count, myf MyFlags)
VOID(sleep(MY_WAIT_FOR_USER_TO_FIX_PANIC)); VOID(sleep(MY_WAIT_FOR_USER_TO_FIX_PANIC));
continue; continue;
} }
if (!writenbytes)
if ((writenbytes == 0 || (int) writenbytes == -1))
{ {
/* We may come here on an interrupt or if the file quote is exeeded */
if (my_errno == EINTR) if (my_errno == EINTR)
continue;
if (!errors++) /* Retry once */
{ {
errno=EFBIG; /* Assume this is the error */ DBUG_PRINT("debug", ("my_write() was interrupted and returned %d",
continue; (int) writenbytes));
continue; /* Interrupted */
}
if (!writenbytes && !errors++) /* Retry once */
{
/* We may come here if the file quota is exeeded */
errno=EFBIG; /* Assume this is the error */
continue;
} }
} }
else if ((uint) writenbytes != (uint) -1) else
continue; /* Retry */ continue; /* Retry */
#endif #endif
if (MyFlags & (MY_NABP | MY_FNABP)) if (MyFlags & (MY_NABP | MY_FNABP))
......
...@@ -2159,9 +2159,11 @@ void log_slow_statement(THD *thd) ...@@ -2159,9 +2159,11 @@ void log_slow_statement(THD *thd)
if ((ulong) (thd->start_time - thd->time_after_lock) > if ((ulong) (thd->start_time - thd->time_after_lock) >
thd->variables.long_query_time || thd->variables.long_query_time ||
((thd->server_status & (thd->server_status &
(SERVER_QUERY_NO_INDEX_USED | SERVER_QUERY_NO_GOOD_INDEX_USED)) && (SERVER_QUERY_NO_INDEX_USED | SERVER_QUERY_NO_GOOD_INDEX_USED)) &&
(specialflag & SPECIAL_LOG_QUERIES_NOT_USING_INDEXES))) (specialflag & SPECIAL_LOG_QUERIES_NOT_USING_INDEXES) &&
/* == SQLCOM_END unless this is a SHOW command */
thd->lex->orig_sql_command == SQLCOM_END)
{ {
thd->status_var.long_query_count++; thd->status_var.long_query_count++;
mysql_slow_log.write(thd, thd->query, thd->query_length, start_of_query); mysql_slow_log.write(thd, thd->query, thd->query_length, start_of_query);
...@@ -4720,6 +4722,8 @@ end_with_restore_list: ...@@ -4720,6 +4722,8 @@ end_with_restore_list:
{ {
if (end_active_trans(thd)) if (end_active_trans(thd))
goto error; goto error;
res= mysql_create_view(thd, first_table, thd->lex->create_view_mode);
break; break;
} }
case SQLCOM_DROP_VIEW: case SQLCOM_DROP_VIEW:
......
...@@ -2929,6 +2929,12 @@ bool Prepared_statement::execute(String *expanded_query, bool open_cursor) ...@@ -2929,6 +2929,12 @@ bool Prepared_statement::execute(String *expanded_query, bool open_cursor)
stmt_backup.query= thd->query; stmt_backup.query= thd->query;
stmt_backup.query_length= thd->query_length; stmt_backup.query_length= thd->query_length;
/*
Save orig_sql_command as we use it to disable slow logging for SHOW
commands (see log_slow_statement()).
*/
stmt_backup.lex->orig_sql_command= thd->lex->orig_sql_command;
/* /*
At first execution of prepared statement we may perform logical At first execution of prepared statement we may perform logical
transformations of the query tree. Such changes should be performed transformations of the query tree. Such changes should be performed
......
...@@ -1384,7 +1384,6 @@ bool mysql_drop_view(THD *thd, TABLE_LIST *views, enum_drop_mode drop_mode) ...@@ -1384,7 +1384,6 @@ bool mysql_drop_view(THD *thd, TABLE_LIST *views, enum_drop_mode drop_mode)
non_existant_views.append(','); non_existant_views.append(',');
non_existant_views.append(String(view->table_name,system_charset_info)); non_existant_views.append(String(view->table_name,system_charset_info));
} }
VOID(pthread_mutex_unlock(&LOCK_open));
continue; continue;
} }
if (my_delete(path, MYF(MY_WME))) if (my_delete(path, MYF(MY_WME)))
......
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