summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <joreland@mysql.com>2005-02-04 06:09:43 +0100
committerunknown <joreland@mysql.com>2005-02-04 06:09:43 +0100
commitef5c8dbf7b5e0e4eb6535e6c2c2d40b4a374982d (patch)
tree8f4b07615781cf1548225cc7f14604e11cad6e1d
parenta6cb0e5ff1c5160f60ebc5303f5c0d898d28dcda (diff)
parent876b4a59b1e72c29061a8ff973d2baa39f2cc6d0 (diff)
downloadmariadb-git-ef5c8dbf7b5e0e4eb6535e6c2c2d40b4a374982d.tar.gz
Merge joreland@bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/home/jonas/src/mysql-4.1 configure.in: Auto merged ndb/test/src/NDBT_Test.cpp: Auto merged
-rw-r--r--BitKeeper/etc/logging_ok1
-rw-r--r--acinclude.m47
-rw-r--r--include/my_global.h6
-rw-r--r--mysql-test/lib/mtr_io.pl3
-rw-r--r--mysql-test/lib/mtr_process.pl672
-rw-r--r--mysql-test/lib/mtr_report.pl25
-rwxr-xr-xmysql-test/mysql-test-run.pl457
-rw-r--r--mysql-test/r/update.result7
-rw-r--r--mysql-test/t/update.test9
-rw-r--r--ndb/include/portlib/NdbThread.h2
-rw-r--r--ndb/src/common/portlib/NdbPortLibTest.cpp16
-rw-r--r--ndb/src/common/portlib/NdbThread.c40
-rw-r--r--ndb/src/common/transporter/TransporterRegistry.cpp5
-rw-r--r--ndb/src/common/util/NdbSqlUtil.cpp28
-rw-r--r--ndb/src/common/util/SocketServer.cpp9
-rw-r--r--ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp3
-rw-r--r--ndb/src/kernel/blocks/ndbfs/MemoryChannelTest/MemoryChannelTest.cpp4
-rw-r--r--ndb/src/kernel/vm/FastScheduler.cpp33
-rw-r--r--ndb/src/kernel/vm/ThreadConfig.cpp3
-rw-r--r--ndb/src/kernel/vm/WatchDog.cpp3
-rw-r--r--ndb/src/mgmclient/CommandInterpreter.cpp6
-rw-r--r--ndb/src/mgmsrv/ConfigInfo.cpp14
-rw-r--r--ndb/src/mgmsrv/MgmtSrvr.cpp10
-rw-r--r--ndb/src/ndbapi/ClusterMgr.cpp4
-rw-r--r--ndb/src/ndbapi/TransporterFacade.cpp10
-rw-r--r--ndb/src/ndbapi/ndb_cluster_connection.cpp3
-rw-r--r--ndb/test/ndbapi/benchronja.cpp4
-rw-r--r--ndb/test/ndbapi/flexAsynch.cpp3
-rw-r--r--ndb/test/ndbapi/flexBench.cpp5
-rw-r--r--ndb/test/ndbapi/flexHammer.cpp5
-rw-r--r--ndb/test/ndbapi/flexScan.cpp3
-rw-r--r--ndb/test/ndbapi/flexTT.cpp3
-rw-r--r--ndb/test/ndbapi/flexTimedAsynch.cpp3
-rw-r--r--ndb/test/ndbapi/flex_bench_mysql.cpp29
-rw-r--r--ndb/test/ndbapi/mainAsyncGenerator.cpp2
-rw-r--r--ndb/test/src/NDBT_Test.cpp1
-rw-r--r--ndb/test/tools/transproxy.cpp2
-rw-r--r--sql/item_func.cc8
-rw-r--r--support-files/Makefile.am9
-rw-r--r--support-files/mysql.spec.sh94
-rw-r--r--support-files/ndb-config-2-node.ini.sh43
41 files changed, 960 insertions, 634 deletions
diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok
index 6ccc886e161..cfdb004723c 100644
--- a/BitKeeper/etc/logging_ok
+++ b/BitKeeper/etc/logging_ok
@@ -119,6 +119,7 @@ miguel@light.
miguel@light.local
miguel@sartre.local
mikael@mc04.(none)
+mikael@orca.ndb.mysql.com
mikron@c-fb0ae253.1238-1-64736c10.cust.bredbandsbolaget.se
mikron@mikael-ronstr-ms-dator.local
mleich@mysql.com
diff --git a/acinclude.m4 b/acinclude.m4
index 4f2ad8daf91..d7e22332655 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -1624,7 +1624,12 @@ AC_DEFUN([MYSQL_CHECK_NDB_OPTIONS], [
--without-ndb-debug Disable special ndb debug features],
[ndb_debug="$withval"],
[ndb_debug="default"])
-
+ AC_ARG_WITH([ndb-ccflags],
+ [
+ --with-ndb-ccflags Extra CC options for ndb compile],
+ [ndb_cxxflags_fix="$ndb_cxxflags_fix $withval"],
+ [ndb_cxxflags_fix=$ndb_cxxflags_fix])
+
AC_MSG_CHECKING([for NDB Cluster options])
AC_MSG_RESULT([])
diff --git a/include/my_global.h b/include/my_global.h
index 3263d079853..7ca3d5e1e58 100644
--- a/include/my_global.h
+++ b/include/my_global.h
@@ -135,7 +135,13 @@
#ifdef HAVE_UNIXWARE7_THREADS
#include <thread.h>
#else
+#if defined(HPUX10) || defined(HPUX11)
+C_MODE_START /* HPUX needs this, signal.h bug */
+#include <pthread.h>
+C_MODE_END
+#else
#include <pthread.h> /* AIX must have this included first */
+#endif
#endif /* HAVE_UNIXWARE7_THREADS */
#endif /* HAVE_mit_thread */
#if !defined(SCO) && !defined(_REENTRANT)
diff --git a/mysql-test/lib/mtr_io.pl b/mysql-test/lib/mtr_io.pl
index 017ba11645b..b3da6d97664 100644
--- a/mysql-test/lib/mtr_io.pl
+++ b/mysql-test/lib/mtr_io.pl
@@ -8,6 +8,7 @@ use strict;
sub mtr_get_pid_from_file ($);
sub mtr_get_opts_from_file ($);
+sub mtr_fromfile ($);
sub mtr_tofile ($@);
sub mtr_tonewfile($@);
@@ -107,6 +108,8 @@ sub mtr_fromfile ($) {
open(FILE,"<",$file) or mtr_error("can't open file \"$file\": $!");
my $text= join('', <FILE>);
close FILE;
+ $text =~ s/^\s+//; # Remove starting space, incl newlines
+ $text =~ s/\s+$//; # Remove ending space, incl newlines
return $text;
}
diff --git a/mysql-test/lib/mtr_process.pl b/mysql-test/lib/mtr_process.pl
index e832468d0cb..e1461a9730c 100644
--- a/mysql-test/lib/mtr_process.pl
+++ b/mysql-test/lib/mtr_process.pl
@@ -5,14 +5,19 @@
# same name.
#use Carp qw(cluck);
+use Socket;
+use Errno;
use strict;
-use POSIX ":sys_wait_h";
+#use POSIX ":sys_wait_h";
+use POSIX 'WNOHANG';
sub mtr_run ($$$$$$);
sub mtr_spawn ($$$$$$);
-sub mtr_stop_mysqld_servers ($$);
+sub mtr_stop_mysqld_servers ($);
sub mtr_kill_leftovers ();
+sub mtr_record_dead_children ();
+sub sleep_until_file_created ($$$);
# static in C
sub spawn_impl ($$$$$$$);
@@ -34,7 +39,18 @@ sub mtr_run ($$$$$$) {
my $error= shift;
my $pid_file= shift;
- return spawn_impl($path,$arg_list_t,1,$input,$output,$error,$pid_file);
+ return spawn_impl($path,$arg_list_t,'run',$input,$output,$error,$pid_file);
+}
+
+sub mtr_run_test ($$$$$$) {
+ my $path= shift;
+ my $arg_list_t= shift;
+ my $input= shift;
+ my $output= shift;
+ my $error= shift;
+ my $pid_file= shift;
+
+ return spawn_impl($path,$arg_list_t,'test',$input,$output,$error,$pid_file);
}
sub mtr_spawn ($$$$$$) {
@@ -45,7 +61,7 @@ sub mtr_spawn ($$$$$$) {
my $error= shift;
my $pid_file= shift;
- return spawn_impl($path,$arg_list_t,0,$input,$output,$error,$pid_file);
+ return spawn_impl($path,$arg_list_t,'spawn',$input,$output,$error,$pid_file);
}
@@ -58,7 +74,7 @@ sub mtr_spawn ($$$$$$) {
sub spawn_impl ($$$$$$$) {
my $path= shift;
my $arg_list_t= shift;
- my $join= shift;
+ my $mode= shift;
my $input= shift;
my $output= shift;
my $error= shift;
@@ -71,107 +87,203 @@ sub spawn_impl ($$$$$$$) {
print STDERR "#### ", "STDIN $input\n" if $input;
print STDERR "#### ", "STDOUT $output\n" if $output;
print STDERR "#### ", "STDERR $error\n" if $error;
- if ( $join )
- {
- print STDERR "#### ", "RUN ";
- }
- else
- {
- print STDERR "#### ", "SPAWN ";
- }
- print STDERR "$path ", join(" ",@$arg_list_t), "\n";
+ print STDERR "#### ", "$mode : $path ", join(" ",@$arg_list_t), "\n";
print STDERR "#### ", "-" x 78, "\n";
}
- my $pid= fork();
- if ( ! defined $pid )
+ FORK:
{
- mtr_error("$path ($pid) can't be forked");
- }
+ my $pid= fork();
- if ( $pid )
- {
- # Parent, i.e. the main script
- if ( $join )
+ if ( ! defined $pid )
{
- # We run a command and wait for the result
- # FIXME this need to be improved
- my $res= waitpid($pid,0);
-
- if ( $res == -1 )
+ if ( $! == $!{EAGAIN} ) # See "perldoc Errno"
{
- mtr_error("$path ($pid) got lost somehow");
+ mtr_debug("Got EAGAIN from fork(), sleep 1 second and redo");
+ sleep(1);
+ redo FORK;
}
- my $exit_value= $? >> 8;
- my $signal_num= $? & 127;
- my $dumped_core= $? & 128;
- if ( $signal_num )
- {
- mtr_error("$path ($pid) got signal $signal_num");
- }
- if ( $dumped_core )
+ else
{
- mtr_error("$path ($pid) dumped core");
+ mtr_error("$path ($pid) can't be forked");
}
- return $exit_value;
+ }
+
+ if ( $pid )
+ {
+ spawn_parent_impl($pid,$mode,$path);
}
else
{
- # We spawned a process we don't wait for
- return $pid;
+ # Child, redirect output and exec
+ # FIXME I tried POSIX::setsid() here to detach and, I hoped,
+ # avoid zombies. But everything went wild, somehow the parent
+ # became a deamon as well, and was hard to kill ;-)
+ # Need to catch SIGCHLD and do waitpid or something instead......
+
+ $SIG{INT}= 'DEFAULT'; # Parent do some stuff, we don't
+
+ if ( $output )
+ {
+ if ( ! open(STDOUT,">",$output) )
+ {
+ mtr_error("can't redirect STDOUT to \"$output\": $!");
+ }
+ }
+ if ( $error )
+ {
+ if ( $output eq $error )
+ {
+ if ( ! open(STDERR,">&STDOUT") )
+ {
+ mtr_error("can't dup STDOUT: $!");
+ }
+ }
+ else
+ {
+ if ( ! open(STDERR,">",$error) )
+ {
+ mtr_error("can't redirect STDERR to \"$output\": $!");
+ }
+ }
+ }
+ if ( $input )
+ {
+ if ( ! open(STDIN,"<",$input) )
+ {
+ mtr_error("can't redirect STDIN to \"$input\": $!");
+ }
+ }
+ exec($path,@$arg_list_t);
}
}
- else
- {
- # Child, redirect output and exec
- # FIXME I tried POSIX::setsid() here to detach and, I hoped,
- # avoid zombies. But everything went wild, somehow the parent
- # became a deamon as well, and was hard to kill ;-)
- # Need to catch SIGCHLD and do waitpid or something instead......
+}
+
+
+sub spawn_parent_impl {
+ my $pid= shift;
+ my $mode= shift;
+ my $path= shift;
- $SIG{INT}= 'DEFAULT'; # Parent do some stuff, we don't
+ if ( $mode eq 'run' or $mode eq 'test' )
+ {
+ my $exit_value= -1;
+ my $signal_num= 0;
+ my $dumped_core= 0;
- if ( $output )
+ if ( $mode eq 'run' )
{
- if ( ! open(STDOUT,">",$output) )
+ # Simple run of command, we wait for it to return
+ my $ret_pid= waitpid($pid,0);
+
+ if ( $ret_pid <= 0 )
{
- mtr_error("can't redirect STDOUT to \"$output\": $!");
+ mtr_error("$path ($pid) got lost somehow");
}
+
+ $exit_value= $? >> 8;
+ $signal_num= $? & 127;
+ $dumped_core= $? & 128;
+
+ return $exit_value;
}
- if ( $error )
+ else
{
- if ( $output eq $error )
+ # We run mysqltest and wait for it to return. But we try to
+ # catch dying mysqld processes as well.
+ #
+ # We do blocking waitpid() until we get the return from the
+ # "mysqltest" call. But if a mysqld process dies that we
+ # started, we take this as an error, and kill mysqltest.
+ #
+ # FIXME is this as it should be? Can't mysqld terminate
+ # normally from running a test case?
+
+ my $ret_pid; # What waitpid() returns
+
+ while ( ($ret_pid= waitpid(-1,0)) != -1 )
{
- if ( ! open(STDERR,">&STDOUT") )
+ # Someone terminated, don't know who. Collect
+ # status info first before $? is lost,
+ # but not $exit_value, this is flagged from
+ #
+
+ if ( $ret_pid == $pid )
{
- mtr_error("can't dup STDOUT: $!");
+ # We got termination of mysqltest, we are done
+ $exit_value= $? >> 8;
+ $signal_num= $? & 127;
+ $dumped_core= $? & 128;
+ last;
}
- }
- else
- {
- if ( ! open(STDERR,">",$error) )
+
+ # If one of the mysqld processes died, we want to
+ # mark this, and kill the mysqltest process.
+
+ foreach my $idx (0..1)
{
- mtr_error("can't redirect STDERR to \"$output\": $!");
+ if ( $::master->[$idx]->{'pid'} eq $ret_pid )
+ {
+ mtr_debug("child $ret_pid was master[$idx], " .
+ "exit during mysqltest run");
+ $::master->[$idx]->{'pid'}= 0;
+ last;
+ }
}
+
+ foreach my $idx (0..2)
+ {
+ if ( $::slave->[$idx]->{'pid'} eq $ret_pid )
+ {
+ mtr_debug("child $ret_pid was slave[$idx], " .
+ "exit during mysqltest run");
+ $::slave->[$idx]->{'pid'}= 0;
+ last;
+ }
+ }
+
+ mtr_debug("waitpid() catched exit of unknown child $ret_pid, " .
+ "exit during mysqltest run");
}
- }
- if ( $input )
- {
- if ( ! open(STDIN,"<",$input) )
+
+ if ( $ret_pid != $pid )
{
- mtr_error("can't redirect STDIN to \"$input\": $!");
+ # We terminated the waiting because a "mysqld" process died.
+ # Kill the mysqltest process.
+
+ kill(9,$pid);
+
+ $ret_pid= waitpid($pid,0);
+
+ if ( $ret_pid == -1 )
+ {
+ mtr_error("$path ($pid) got lost somehow");
+ }
}
+
+ return $exit_value;
}
- exec($path,@$arg_list_t);
+ }
+ else
+ {
+ # We spawned a process we don't wait for
+ return $pid;
}
}
+
+
##############################################################################
#
# Kill processes left from previous runs
#
##############################################################################
+# We just "ping" on the ports, and if we can't do a socket connect
+# we assume the server is dead. So we don't *really* know a server
+# is dead, we just hope that it after letting the listen port go,
+# it is dead enough for us to start a new server.
+
sub mtr_kill_leftovers () {
# First, kill all masters and slaves that would conflict with
@@ -199,10 +311,23 @@ sub mtr_kill_leftovers () {
});
}
- mtr_stop_mysqld_servers(\@args, 1);
+ mtr_mysqladmin_shutdown(\@args);
+
+ # We now have tried to terminate nice. We have waited for the listen
+ # port to be free, but can't really tell if the mysqld process died
+ # or not. We now try to find the process PID from the PID file, and
+ # send a kill to that process. Note that Perl let kill(0,@pids) be
+ # a way to just return the numer of processes the kernel can send
+ # signals to. So this can be used (except on Cygwin) to determine
+ # if there are processes left running that we cound out might exists.
+ #
+ # But still after all this work, all we know is that we have
+ # the ports free.
# We scan the "var/run/" directory for other process id's to kill
- my $rundir= "$::glob_mysql_test_dir/var/run"; # FIXME $path_run_dir or something
+
+ # FIXME $path_run_dir or something
+ my $rundir= "$::glob_mysql_test_dir/var/run";
if ( -d $rundir )
{
@@ -218,193 +343,157 @@ sub mtr_kill_leftovers () {
if ( -f $pidfile )
{
my $pid= mtr_get_pid_from_file($pidfile);
- if ( ! unlink($pidfile) )
+
+ # Race, could have been removed between I tested with -f
+ # and the unlink() below, so I better check again with -f
+
+ if ( ! unlink($pidfile) and -f $pidfile )
{
mtr_error("can't remove $pidfile");
}
- push(@pids, $pid);
+
+ if ( $::glob_cygwin_perl or kill(0, $pid) )
+ {
+ push(@pids, $pid); # We know (cygwin guess) it exists
+ }
}
}
closedir(RUNDIR);
- start_reap_all();
-
- if ( $::glob_cygwin_perl )
+ if ( @pids )
{
- # We have no (easy) way of knowing the Cygwin controlling
- # process, in the PID file we only have the Windows process id.
- system("kill -f " . join(" ",@pids)); # Hope for the best....
- }
- else
- {
- my $retries= 10; # 10 seconds
- do
+ if ( $::glob_cygwin_perl )
{
- kill(9, @pids);
- } while ( $retries-- and kill(0, @pids) );
-
- if ( kill(0, @pids) )
+ # We have no (easy) way of knowing the Cygwin controlling
+ # process, in the PID file we only have the Windows process id.
+ system("kill -f " . join(" ",@pids)); # Hope for the best....
+ mtr_debug("Sleep 5 seconds waiting for processes to die");
+ sleep(5);
+ }
+ else
{
- mtr_error("can't kill processes " . join(" ", @pids));
+ my $retries= 10; # 10 seconds
+ do
+ {
+ kill(9, @pids);
+ mtr_debug("Sleep 1 second waiting for processes to die");
+ sleep(1) # Wait one second
+ } while ( $retries-- and kill(0, @pids) );
+
+ if ( kill(0, @pids) ) # Check if some left
+ {
+ # FIXME maybe just mtr_warning() ?
+ mtr_error("can't kill process(es) " . join(" ", @pids));
+ }
}
}
+ }
+
+ # We may have failed everything, bug we now check again if we have
+ # the listen ports free to use, and if they are free, just go for it.
- stop_reap_all();
+ foreach my $srv ( @args )
+ {
+ if ( mtr_ping_mysqld_server($srv->{'port'}, $srv->{'sockfile'}) )
+ {
+ mtr_error("can't kill old mysqld holding port $srv->{'port'}");
+ }
}
}
##############################################################################
#
-# Shut down mysqld servers
+# Shut down mysqld servers we have started from this run of this script
#
##############################################################################
-# To speed things we kill servers in parallel.
-# The argument is a list of 'pidfiles' and 'socketfiles'.
-# We use the pidfiles and socketfiles to try to terminate the servers.
-# This is not perfect, there could still be other server processes
-# left.
-
-# Force flag is to be set only for killing mysqld servers this script
-# didn't create in this run, i.e. initial cleanup before we start working.
-# If force flag is set, we try to kill all with mysqladmin, and
-# give up if we have no PIDs.
+# To speed things we kill servers in parallel. The argument is a list
+# of 'ports', 'pids', 'pidfiles' and 'socketfiles'.
-# FIXME On some operating systems, $srv->{'pid'} and $srv->{'pidfile'}
-# will not be the same PID. We need to try to kill both I think.
+# FIXME On Cygwin, and maybe some other platforms, $srv->{'pid'} and
+# $srv->{'pidfile'} will not be the same PID. We need to try to kill
+# both I think.
-sub mtr_stop_mysqld_servers ($$) {
+sub mtr_stop_mysqld_servers ($) {
my $spec= shift;
- my $force= shift;
# ----------------------------------------------------------------------
- # If the process was not started from this file, we got no PID,
- # we try to find it in the PID file.
+ # First try nice normal shutdown using 'mysqladmin'
# ----------------------------------------------------------------------
- my $any_pid= 0; # If we have any PIDs
+ mtr_mysqladmin_shutdown($spec);
+
+ # ----------------------------------------------------------------------
+ # We loop with waitpid() nonblocking to see how many of the ones we
+ # are to kill, actually got killed by mtr_mysqladmin_shutdown().
+ # Note that we don't rely on this, the mysqld server might have stop
+ # listening to the port, but still be alive. But it is a start.
+ # ----------------------------------------------------------------------
foreach my $srv ( @$spec )
{
- if ( ! $srv->{'pid'} and -f $srv->{'pidfile'} )
- {
- $srv->{'pid'}= mtr_get_pid_from_file($srv->{'pidfile'});
- }
- if ( $srv->{'pid'} )
+ if ( $srv->{'pid'} and (waitpid($srv->{'pid'},&WNOHANG) == $srv->{'pid'}) )
{
- $any_pid= 1;
+ $srv->{'pid'}= 0;
}
}
- # If the processes where started from this script, and we know
- # no PIDs, then we don't have to do anything.
-
- if ( ! $any_pid and ! $force )
- {
- # cluck "This is how we got here!";
- return;
- }
-
# ----------------------------------------------------------------------
- # First try nice normal shutdown using 'mysqladmin'
+ # We know the process was started from this file, so there is a PID
+ # saved, or else we have nothing to do.
+ # Might be that is is recorded to be missing, but we failed to
+ # take away the PID file earlier, then we do it now.
# ----------------------------------------------------------------------
- start_reap_all(); # Don't require waitpid() of children
+ my %mysqld_pids;
foreach my $srv ( @$spec )
{
- if ( -e $srv->{'sockfile'} or $srv->{'port'} )
+ if ( $srv->{'pid'} )
{
- # FIXME wrong log.....
- # FIXME, stderr.....
- # Shutdown time must be high as slave may be in reconnect
- my $args;
-
- mtr_init_args(\$args);
-
- mtr_add_arg($args, "--no-defaults");
- mtr_add_arg($args, "--user=%s", $::opt_user);
- mtr_add_arg($args, "--password=");
- if ( -e $srv->{'sockfile'} )
- {
- mtr_add_arg($args, "--socket=%s", $srv->{'sockfile'});
- }
- if ( $srv->{'port'} )
- {
- mtr_add_arg($args, "--port=%s", $srv->{'port'});
- }
- mtr_add_arg($args, "--connect_timeout=5");
- mtr_add_arg($args, "--shutdown_timeout=20");
- mtr_add_arg($args, "--protocol=tcp"); # FIXME new thing, will it help?!
- mtr_add_arg($args, "shutdown");
- # We don't wait for termination of mysqladmin
- mtr_spawn($::exe_mysqladmin, $args,
- "", $::path_manager_log, $::path_manager_log, "");
+ $mysqld_pids{$srv->{'pid'}}= 1;
}
- }
-
- # Wait for them all to remove their pid and socket file
-
- PIDSOCKFILEREMOVED:
- for (my $loop= $::opt_sleep_time_for_delete; $loop; $loop--)
- {
- my $pidsockfiles_left= 0;
- foreach my $srv ( @$spec )
+ else
{
- if ( -e $srv->{'sockfile'} or -f $srv->{'pidfile'} )
+ # Race, could have been removed between I tested with -f
+ # and the unlink() below, so I better check again with -f
+
+ if ( -f $srv->{'pidfile'} and ! unlink($srv->{'pidfile'}) and
+ -f $srv->{'pidfile'} )
{
- $pidsockfiles_left++; # Could be that pidfile is left
+ mtr_error("can't remove $srv->{'pidfile'}");
}
}
- if ( ! $pidsockfiles_left )
- {
- last PIDSOCKFILEREMOVED;
- }
- if ( $loop % 20 == 1 )
- {
- mtr_warning("Still processes alive after 10 seconds, retrying for $loop seconds...");
- }
- mtr_debug("Sleep for 1 second waiting for pid and socket file removal");
- sleep(1); # One second
}
# ----------------------------------------------------------------------
- # If no known PIDs, we have nothing more to try
+ # If the processes where started from this script, and we had no PIDS
+ # then we don't have to do anything.
# ----------------------------------------------------------------------
- if ( ! $any_pid )
+ if ( ! keys %mysqld_pids )
{
- stop_reap_all();
+ # cluck "This is how we got here!";
return;
}
# ----------------------------------------------------------------------
- # We may have killed all that left a socket, but we are not sure we got
- # them all killed. If we suspect it lives, try nice kill with SIG_TERM.
- # Note that for true Win32 processes, kill(0,$pid) will not return 1.
+ # In mtr_mysqladmin_shutdown() we only waited for the mysqld servers
+ # not to listen to the port. But we are not sure we got them all
+ # killed. If we suspect it lives, try nice kill with SIG_TERM. Note
+ # that for true Win32 processes, kill(0,$pid) will not return 1.
# ----------------------------------------------------------------------
SIGNAL:
foreach my $sig (15,9)
{
- my $process_left= 0;
- foreach my $srv ( @$spec )
+ my $retries= 10; # 10 seconds
+ kill($sig, keys %mysqld_pids);
+ while ( $retries-- and kill(0, keys %mysqld_pids) )
{
- if ( $srv->{'pid'} and
- ( -f $srv->{'pidfile'} or kill(0,$srv->{'pid'}) ) )
- {
- $process_left++;
- mtr_warning("process $srv->{'pid'} not cooperating, " .
- "will send signal $sig to process");
- kill($sig,$srv->{'pid'}); # SIG_TERM
- }
- if ( ! $process_left )
- {
- last SIGNAL;
- }
+ mtr_debug("Sleep 1 second waiting for processes to die");
+ sleep(1) # Wait one second
}
- mtr_debug("Sleep for 5 seconds waiting for processes to die");
- sleep(5); # We wait longer than usual
}
# ----------------------------------------------------------------------
@@ -437,8 +526,8 @@ sub mtr_stop_mysqld_servers ($$) {
foreach my $file ($srv->{'pidfile'}, $srv->{'sockfile'})
{
- unlink($file);
- if ( -e $file )
+ # Know it is dead so should be no race, careful anyway
+ if ( -f $file and ! unlink($file) and -f $file )
{
$errors++;
mtr_warning("couldn't delete $file");
@@ -454,9 +543,147 @@ sub mtr_stop_mysqld_servers ($$) {
}
}
- stop_reap_all();
+ # FIXME We just assume they are all dead, for Cygwin we are not
+ # really sure
+
+}
+
+
+##############################################################################
+#
+# Shut down mysqld servers using "mysqladmin ... shutdown".
+# To speed this up, we start them in parallel and use waitpid() to
+# catch their termination. Note that this doesn't say the servers
+# are terminated, just that 'mysqladmin' is terminated.
+#
+# Note that mysqladmin will ask the server about what PID file it uses,
+# and mysqladmin will wait for it to be removed before it terminates
+# (unless passes timeout).
+#
+# This function will take at most about 20 seconds, and we still are not
+# sure we killed them all. If none is responding to ping, we return 1,
+# else we return 0.
+#
+##############################################################################
+
+sub mtr_mysqladmin_shutdown () {
+ my $spec= shift;
+
+ my @mysql_admin_pids;
+ my @to_kill_specs;
+
+ foreach my $srv ( @$spec )
+ {
+ if ( mtr_ping_mysqld_server($srv->{'port'}, $srv->{'sockfile'}) )
+ {
+ push(@to_kill_specs, $srv);
+ }
+ }
+
+
+ foreach my $srv ( @to_kill_specs )
+ {
+ # FIXME wrong log.....
+ # FIXME, stderr.....
+ # Shutdown time must be high as slave may be in reconnect
+ my $args;
+
+ mtr_init_args(\$args);
+
+ mtr_add_arg($args, "--no-defaults");
+ mtr_add_arg($args, "--user=%s", $::opt_user);
+ mtr_add_arg($args, "--password=");
+ if ( -e $srv->{'sockfile'} )
+ {
+ mtr_add_arg($args, "--socket=%s", $srv->{'sockfile'});
+ }
+ if ( $srv->{'port'} )
+ {
+ mtr_add_arg($args, "--port=%s", $srv->{'port'});
+ }
+ if ( $srv->{'port'} and ! -e $srv->{'sockfile'} )
+ {
+ mtr_add_arg($args, "--protocol=tcp"); # Needed if no --socket
+ }
+ mtr_add_arg($args, "--connect_timeout=5");
+ mtr_add_arg($args, "--shutdown_timeout=20");
+ mtr_add_arg($args, "shutdown");
+ # We don't wait for termination of mysqladmin
+ my $pid= mtr_spawn($::exe_mysqladmin, $args,
+ "", $::path_manager_log, $::path_manager_log, "");
+ push(@mysql_admin_pids, $pid);
+ }
+
+ # We wait blocking, we wait for the last one anyway
+ foreach my $pid (@mysql_admin_pids)
+ {
+ waitpid($pid,0); # FIXME no need to check -1 or 0?
+ }
- # FIXME We just assume they are all dead, we don't know....
+ # If we trusted "mysqladmin --shutdown_timeout= ..." we could just
+ # terminate now, but we don't (FIXME should be debugged).
+ # So we try again to ping and at least wait the same amount of time
+ # mysqladmin would for all to die.
+
+ my $timeout= 20; # 20 seconds max
+ my $res= 1; # If we just fall through, we are done
+
+ TIME:
+ while ( $timeout-- )
+ {
+ foreach my $srv ( @to_kill_specs )
+ {
+ $res= 1; # We are optimistic
+ if ( mtr_ping_mysqld_server($srv->{'port'}, $srv->{'sockfile'}) )
+ {
+ mtr_debug("Sleep 1 second waiting for processes to stop using port");
+ sleep(1); # One second
+ $res= 0;
+ next TIME;
+ }
+ }
+ last; # If we got here, we are done
+ }
+
+ return $res;
+}
+
+##############################################################################
+#
+# The operating system will keep information about dead children,
+# we read this information here, and if we have records the process
+# is alive, we mark it as dead.
+#
+##############################################################################
+
+sub mtr_record_dead_children () {
+
+ my $ret_pid;
+
+ # FIXME the man page says to wait for -1 to terminate,
+ # but on OS X we get '0' all the time...
+ while ( ($ret_pid= waitpid(-1,&WNOHANG)) > 0 )
+ {
+ mtr_debug("waitpid() catched exit of child $ret_pid");
+ foreach my $idx (0..1)
+ {
+ if ( $::master->[$idx]->{'pid'} eq $ret_pid )
+ {
+ mtr_debug("child $ret_pid was master[$idx]");
+ $::master->[$idx]->{'pid'}= 0;
+ }
+ }
+
+ foreach my $idx (0..2)
+ {
+ if ( $::slave->[$idx]->{'pid'} eq $ret_pid )
+ {
+ mtr_debug("child $ret_pid was slave[$idx]");
+ $::slave->[$idx]->{'pid'}= 0;
+ last;
+ }
+ }
+ }
}
sub start_reap_all {
@@ -467,6 +694,32 @@ sub stop_reap_all {
$SIG{CHLD}= 'DEFAULT';
}
+sub mtr_ping_mysqld_server () {
+ my $port= shift;
+
+ my $remote= "localhost";
+ my $iaddr= inet_aton($remote);
+ if ( ! $iaddr )
+ {
+ mtr_error("can't find IP number for $remote");
+ }
+ my $paddr= sockaddr_in($port, $iaddr);
+ my $proto= getprotobyname('tcp');
+ if ( ! socket(SOCK, PF_INET, SOCK_STREAM, $proto) )
+ {
+ mtr_error("can't create socket: $!");
+ }
+ if ( connect(SOCK, $paddr) )
+ {
+ close(SOCK); # FIXME check error?
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
##############################################################################
#
# Wait for a file to be created
@@ -474,33 +727,38 @@ sub stop_reap_all {
##############################################################################
-sub sleep_until_file_created ($$) {
+sub sleep_until_file_created ($$$) {
my $pidfile= shift;
my $timeout= shift;
+ my $pid= shift;
- my $loop= $timeout;
- while ( $loop-- )
+ for ( my $loop= 1; $loop <= $timeout; $loop++ )
{
if ( -r $pidfile )
{
- return;
+ return 1;
}
- mtr_debug("Sleep for 1 second waiting for creation of $pidfile");
- if ( $loop % 20 == 1 )
+ # Check if it died after the fork() was successful
+ if ( waitpid($pid,&WNOHANG) == $pid )
{
- mtr_warning("Waiting for $pidfile to be created, still trying for $loop seconds...");
+ return 0;
+ }
+
+ mtr_debug("Sleep 1 second waiting for creation of $pidfile");
+
+ if ( $loop % 60 == 0 )
+ {
+ my $left= $timeout - $loop;
+ mtr_warning("Waited $loop seconds for $pidfile to be created, " .
+ "still waiting for $left seconds...");
}
sleep(1);
}
- if ( ! -r $pidfile )
- {
- mtr_error("No $pidfile was created");
- }
+ return 0;
}
-
1;
diff --git a/mysql-test/lib/mtr_report.pl b/mysql-test/lib/mtr_report.pl
index 0f75fc1341a..c45bb1601ce 100644
--- a/mysql-test/lib/mtr_report.pl
+++ b/mysql-test/lib/mtr_report.pl
@@ -10,6 +10,7 @@ sub mtr_report_test_name($);
sub mtr_report_test_passed($);
sub mtr_report_test_failed($);
sub mtr_report_test_skipped($);
+sub mtr_report_test_disabled($);
sub mtr_show_failed_diff ($);
sub mtr_report_stats ($);
@@ -72,7 +73,14 @@ sub mtr_report_test_skipped ($) {
my $tinfo= shift;
$tinfo->{'result'}= 'MTR_RES_SKIPPED';
- print "[ skipped ]\n";
+ if ( $tinfo->{'disable'} )
+ {
+ print "[ disabled ] $tinfo->{'comment'}\n";
+ }
+ else
+ {
+ print "[ skipped ]\n";
+ }
}
sub mtr_report_test_passed ($) {
@@ -95,9 +103,18 @@ sub mtr_report_test_failed ($) {
$tinfo->{'result'}= 'MTR_RES_FAILED';
print "[ fail ]\n";
- print "Errors are (from $::path_timefile) :\n";
- print mtr_fromfile($::path_timefile); # FIXME print_file() instead
- print "\n(the last lines may be the most important ones)\n";
+ # FIXME Instead of this test, and meaningless error message in 'else'
+ # we should write out into $::path_timefile when the error occurs.
+ if ( -f $::path_timefile )
+ {
+ print "Errors are (from $::path_timefile) :\n";
+ print mtr_fromfile($::path_timefile); # FIXME print_file() instead
+ print "\n(the last lines may be the most important ones)\n";
+ }
+ else
+ {
+ print "Unexpected termination, probably when starting mysqld\n";
+ }
}
sub mtr_report_stats ($) {
diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl
index 3bbdb48d98a..3dd6f5803d7 100755
--- a/mysql-test/mysql-test-run.pl
+++ b/mysql-test/mysql-test-run.pl
@@ -84,10 +84,11 @@ use Sys::Hostname;
#use Carp;
use IO::Socket;
use IO::Socket::INET;
-use Data::Dumper;
+#use Data::Dumper;
use strict;
#use diagnostics;
+require "lib/mtr_cases.pl";
require "lib/mtr_process.pl";
require "lib/mtr_io.pl";
require "lib/mtr_gcov.pl";
@@ -165,14 +166,12 @@ our $glob_user= 'test';
our $glob_use_embedded_server= 0;
our $glob_basedir;
-our $glob_do_test;
# The total result
our $path_charsetsdir;
our $path_client_bindir;
our $path_language;
-our $path_tests_bindir;
our $path_timefile;
our $path_manager_log; # Used by mysqldadmin
our $path_slave_load_tmpdir; # What is this?!
@@ -192,8 +191,10 @@ our $exe_master_mysqld;
our $exe_mysql;
our $exe_mysqladmin;
our $exe_mysqlbinlog;
+our $exe_mysql_client_test;
our $exe_mysqld;
our $exe_mysqldump; # Called from test case
+our $exe_mysql_fix_system_tables;
our $exe_mysqltest;
our $exe_slave_mysqld;
@@ -208,6 +209,7 @@ our $opt_current_test;
our $opt_ddd;
our $opt_debug;
our $opt_do_test;
+our @opt_cases; # The test cases names in argv
our $opt_embedded_server;
our $opt_extern;
our $opt_fast;
@@ -232,8 +234,6 @@ our $opt_local_master;
our $master; # Will be struct in C
our $slave;
-our $opt_master_myport;
-our $opt_slave_myport;
our $opt_ndbcluster_port;
our $opt_ndbconnectstring;
@@ -297,8 +297,6 @@ sub command_line_setup ();
sub executable_setup ();
sub environment_setup ();
sub kill_and_cleanup ();
-sub collect_test_cases ($);
-sub sleep_until_file_created ($$);
sub ndbcluster_start ();
sub ndbcluster_stop ();
sub run_benchmarks ($);
@@ -306,6 +304,7 @@ sub run_tests ();
sub mysql_install_db ();
sub install_db ($$);
sub run_testcase ($);
+sub report_failure_and_restart ($);
sub do_before_start_master ($$);
sub do_before_start_slave ($$);
sub mysqld_start ($$$$);
@@ -358,7 +357,15 @@ sub main () {
if ( $opt_start_and_exit )
{
- mtr_report("Servers started, exiting");
+ # FIXME what about ndb?
+ if ( mysqld_start('master',0,[],[]) )
+ {
+ mtr_report("Servers started, exiting");
+ }
+ else
+ {
+ mtr_error("Can't start the mysqld server");
+ }
}
else
{
@@ -447,8 +454,8 @@ sub command_line_setup () {
$path_manager_log= "$glob_mysql_test_dir/var/log/manager.log";
$opt_current_test= "$glob_mysql_test_dir/var/log/current_test";
- $opt_master_myport= 9306;
- $opt_slave_myport= 9308;
+ my $opt_master_myport= 9306;
+ my $opt_slave_myport= 9308;
$opt_ndbcluster_port= 9350;
# Read the command line
@@ -532,6 +539,8 @@ sub command_line_setup () {
usage("");
}
+ @opt_cases= @ARGV;
+
# Put this into a hash, will be a C struct
$master->[0]->{'path_myddir'}= "$glob_mysql_test_dir/var/master-data";
@@ -598,7 +607,7 @@ sub command_line_setup () {
# Look at the command line options and set script flags
# --------------------------------------------------------------------------
- if ( $opt_record and ! @ARGV)
+ if ( $opt_record and ! @opt_cases )
{
mtr_error("Will not run in record mode without a specific test case");
}
@@ -733,7 +742,8 @@ sub executable_setup () {
{
mtr_error("Can't find embedded server 'mysqltest'");
}
- $path_tests_bindir= "$glob_basedir/libmysqld/examples";
+ $exe_mysql_client_test=
+ "$glob_basedir/libmysqld/examples/mysql_client_test_embedded";
}
else
{
@@ -749,7 +759,8 @@ sub executable_setup () {
{
$exe_mysqltest= "$glob_basedir/client/mysqltest";
}
- $path_tests_bindir= "$glob_basedir/tests";
+ $exe_mysql_client_test=
+ "$glob_basedir/tests/mysql_client_test";
}
if ( -f "$glob_basedir/client/.libs/mysqldump" )
{
@@ -768,22 +779,26 @@ sub executable_setup () {
$exe_mysqlbinlog= "$glob_basedir/client/mysqlbinlog";
}
- $exe_mysqld= "$glob_basedir/sql/mysqld";
- $path_client_bindir= "$glob_basedir/client";
- $exe_mysqladmin= "$path_client_bindir/mysqladmin";
- $exe_mysql= "$path_client_bindir/mysql";
- $path_language= "$glob_basedir/sql/share/english/";
- $path_charsetsdir= "$glob_basedir/sql/share/charsets";
+ $path_client_bindir= "$glob_basedir/client";
+ $exe_mysqld= "$glob_basedir/sql/mysqld";
+ $exe_mysqladmin= "$path_client_bindir/mysqladmin";
+ $exe_mysql= "$path_client_bindir/mysql";
+ $exe_mysql_fix_system_tables= "$glob_basedir/scripts/mysql_fix_privilege_tables";
+ $path_language= "$glob_basedir/sql/share/english/";
+ $path_charsetsdir= "$glob_basedir/sql/share/charsets";
}
else
{
- $path_client_bindir= "$glob_basedir/bin";
- $path_tests_bindir= "$glob_basedir/tests";
- $exe_mysqltest= "$path_client_bindir/mysqltest";
- $exe_mysqldump= "$path_client_bindir/mysqldump";
- $exe_mysqlbinlog= "$path_client_bindir/mysqlbinlog";
- $exe_mysqladmin= "$path_client_bindir/mysqladmin";
- $exe_mysql= "$path_client_bindir/mysql";
+ my $path_tests_bindir= "$glob_basedir/tests";
+
+ $path_client_bindir= "$glob_basedir/bin";
+ $exe_mysqltest= "$path_client_bindir/mysqltest";
+ $exe_mysqldump= "$path_client_bindir/mysqldump";
+ $exe_mysqlbinlog= "$path_client_bindir/mysqlbinlog";
+ $exe_mysqladmin= "$path_client_bindir/mysqladmin";
+ $exe_mysql= "$path_client_bindir/mysql";
+ $exe_mysql_fix_system_tables= "$path_client_bindir/scripts/mysql_fix_privilege_tables";
+
if ( -d "$glob_basedir/share/mysql/english" )
{
$path_language ="$glob_basedir/share/mysql/english/";
@@ -804,6 +819,33 @@ sub executable_setup () {
$exe_mysqld= "$glob_basedir/bin/mysqld";
}
+ if ( $glob_use_embedded_server )
+ {
+ if ( -f "$path_client_bindir/mysqltest_embedded" )
+ {
+ # FIXME valgrind?
+ $exe_mysqltest="$path_client_bindir/mysqltest_embedded";
+ }
+ else
+ {
+ error("Cannot find embedded server 'mysqltest_embedded'");
+ }
+ if ( -d "$path_tests_bindir/mysql_client_test_embedded" )
+ {
+ $exe_mysql_client_test=
+ "$path_tests_bindir/mysql_client_test_embedded";
+ }
+ else
+ {
+ $exe_mysql_client_test=
+ "$path_client_bindir/mysql_client_test_embedded";
+ }
+ }
+ else
+ {
+ $exe_mysqltest="$path_client_bindir/mysqltest";
+ $exe_mysql_client_test="$path_client_bindir/mysql_client_test";
+ }
}
# FIXME special $exe_master_mysqld and $exe_slave_mysqld
@@ -846,13 +888,18 @@ sub environment_setup () {
# Also command lines in .opt files may contain env vars
# --------------------------------------------------------------------------
- $ENV{'LC_COLLATE'}= "C";
- $ENV{'MYSQL_TEST_DIR'}= $glob_mysql_test_dir;
- $ENV{'MASTER_MYPORT'}= $opt_master_myport;
- $ENV{'SLAVE_MYPORT'}= $opt_slave_myport;
-# $ENV{'MYSQL_TCP_PORT'}= '@MYSQL_TCP_PORT@'; # FIXME
- $ENV{'MYSQL_TCP_PORT'}= 3306;
- $ENV{'MASTER_MYSOCK'}= $master->[0]->{'path_mysock'};
+ $ENV{'UMASK'}= "0660"; # The octal *string*
+ $ENV{'UMASK_DIR'}= "0770"; # The octal *string*
+ $ENV{'LC_COLLATE'}= "C";
+ $ENV{'USE_RUNNING_SERVER'}= $glob_use_running_server;
+ $ENV{'MYSQL_TEST_DIR'}= $glob_mysql_test_dir;
+ $ENV{'MASTER_MYSOCK'}= $master->[0]->{'path_mysock'};
+ $ENV{'MASTER_MYSOCK1'}= $master->[1]->{'path_mysock'};
+ $ENV{'MASTER_MYPORT'}= $master->[0]->{'path_myport'};
+ $ENV{'MASTER_MYPORT1'}= $master->[1]->{'path_myport'};
+ $ENV{'SLAVE_MYPORT'}= $slave->[0]->{'path_myport'};
+# $ENV{'MYSQL_TCP_PORT'}= '@MYSQL_TCP_PORT@'; # FIXME
+ $ENV{'MYSQL_TCP_PORT'}= 3306;
}
@@ -877,203 +924,6 @@ sub handle_int_signal () {
##############################################################################
#
-# Collect information about test cases we are to run
-#
-##############################################################################
-
-sub collect_test_cases ($) {
- my $suite= shift; # Test suite name
-
- my $testdir;
- my $resdir;
-
- if ( $suite eq "main" )
- {
- $testdir= "$glob_mysql_test_dir/t";
- $resdir= "$glob_mysql_test_dir/r";
- }
- else
- {
- $testdir= "$glob_mysql_test_dir/suite/$suite/t";
- $resdir= "$glob_mysql_test_dir/suite/$suite/r";
- }
-
- my @tests; # Array of hash, will be array of C struct
-
- opendir(TESTDIR, $testdir) or mtr_error("Can't open dir \"$testdir\": $!");
-
- foreach my $elem ( sort readdir(TESTDIR) ) {
- my $tname= mtr_match_extension($elem,"test");
- next if ! defined $tname;
- next if $opt_do_test and ! defined mtr_match_prefix($elem,$opt_do_test);
- my $path= "$testdir/$elem";
-
- # ----------------------------------------------------------------------
- # Skip some tests silently
- # ----------------------------------------------------------------------
-
- if ( $opt_start_from and $tname lt $opt_start_from )
- {
- next;
- }
-
- # ----------------------------------------------------------------------
- # Skip some tests but include in list, just mark them to skip
- # ----------------------------------------------------------------------
-
- my $tinfo= {};
- $tinfo->{'name'}= $tname;
- $tinfo->{'result_file'}= "$resdir/$tname.result";
- push(@tests, $tinfo);
-
- if ( $opt_skip_test and defined mtr_match_prefix($tname,$opt_skip_test) )
- {
- $tinfo->{'skip'}= 1;
- next;
- }
-
- # FIXME temporary solution, we have a hard coded list of test cases to
- # skip if we are using the embedded server
-
- if ( $glob_use_embedded_server and
- mtr_match_any_exact($tname,\@skip_if_embedded_server) )
- {
- $tinfo->{'skip'}= 1;
- next;
- }
-
- # ----------------------------------------------------------------------
- # Collect information about test case
- # ----------------------------------------------------------------------
-
- $tinfo->{'path'}= $path;
- $tinfo->{'timezone'}= "GMT-3"; # for UNIX_TIMESTAMP tests to work
-
- if ( defined mtr_match_prefix($tname,"rpl") )
- {
- if ( $opt_skip_rpl )
- {
- $tinfo->{'skip'}= 1;
- next;
- }
-
- # FIXME currently we always restart slaves
- $tinfo->{'slave_restart'}= 1;
-
- if ( $tname eq 'rpl_failsafe' or $tname eq 'rpl_chain_temp_table' )
- {
- $tinfo->{'slave_num'}= 3;
- }
- else
- {
- $tinfo->{'slave_num'}= 1;
- }
- }
-
- # FIXME what about embedded_server + ndbcluster, skip ?!
-
- my $master_opt_file= "$testdir/$tname-master.opt";
- my $slave_opt_file= "$testdir/$tname-slave.opt";
- my $slave_mi_file= "$testdir/$tname.slave-mi";
- my $master_sh= "$testdir/$tname-master.sh";
- my $slave_sh= "$testdir/$tname-slave.sh";
-
- if ( -f $master_opt_file )
- {
- $tinfo->{'master_restart'}= 1; # We think so for now
- # This is a dirty hack from old mysql-test-run, we use the opt file
- # to flag other things as well, it is not a opt list at all
- my $extra_master_opt= mtr_get_opts_from_file($master_opt_file);
-
- foreach my $opt (@$extra_master_opt)
- {
- my $value;
-
- $value= mtr_match_prefix($opt, "--timezone=");
-
- if ( defined $value )
- {
- $tinfo->{'timezone'}= $value;
- $extra_master_opt= [];
- $tinfo->{'master_restart'}= 0;
- last;
- }
-
- $value= mtr_match_prefix($opt, "--result-file=");
-
- if ( defined $value )
- {
- $tinfo->{'result_file'}= "r/$value.result";
- if ( $opt_result_ext and $opt_record or
- -f "$tinfo->{'result_file'}$opt_result_ext")
- {
- $tinfo->{'result_file'}.= $opt_result_ext;
- }
- $extra_master_opt= [];
- $tinfo->{'master_restart'}= 0;
- last;
- }
- }
-
- $tinfo->{'master_opt'}= $extra_master_opt;
- }
-
- if ( -f $slave_opt_file )
- {
- $tinfo->{'slave_opt'}= mtr_get_opts_from_file($slave_opt_file);
- $tinfo->{'slave_restart'}= 1;
- }
-
- if ( -f $slave_mi_file )
- {
- $tinfo->{'slave_mi'}= mtr_get_opts_from_file($slave_mi_file);
- $tinfo->{'slave_restart'}= 1;
- }
-
- if ( -f $master_sh )
- {
- if ( $glob_win32_perl )
- {
- $tinfo->{'skip'}= 1;
- }
- else
- {
- $tinfo->{'master_sh'}= $master_sh;
- $tinfo->{'master_restart'}= 1;
- }
- }
-
- if ( -f $slave_sh )
- {
- if ( $glob_win32_perl )
- {
- $tinfo->{'skip'}= 1;
- }
- else
- {
- $tinfo->{'slave_sh'}= $slave_sh;
- $tinfo->{'slave_restart'}= 1;
- }
- }
-
- # We can't restart a running server that may be in use
-
- if ( $glob_use_running_server and
- ( $tinfo->{'master_restart'} or $tinfo->{'slave_restart'} ) )
- {
- $tinfo->{'skip'}= 1;
- }
-
- }
-
- closedir TESTDIR;
-
- return \@tests;
-}
-
-
-##############################################################################
-#
# Handle left overs from previous runs
#
##############################################################################
@@ -1189,6 +1039,10 @@ sub run_benchmarks ($) {
if ( ! $glob_use_embedded_server and ! $opt_local_master )
{
$master->[0]->{'pid'}= mysqld_start('master',0,[],[]);
+ if ( ! $master->[0]->{'pid'} )
+ {
+ mtr_error("Can't start the mysqld server");
+ }
}
mtr_init_args(\$args);
@@ -1254,7 +1108,7 @@ sub run_suite () {
mtr_print_thick_line();
- mtr_report("Finding Tests in the '$suite' suite");
+ mtr_report("Finding Tests in the '$suite' suite");
my $tests= collect_test_cases($suite);
@@ -1301,10 +1155,12 @@ sub run_suite () {
sub mysql_install_db () {
- mtr_report("Installing Test Databases");
-
+ # FIXME not exactly true I think, needs improvements
install_db('master', $master->[0]->{'path_myddir'});
+ install_db('master', $master->[1]->{'path_myddir'});
install_db('slave', $slave->[0]->{'path_myddir'});
+ install_db('slave', $slave->[1]->{'path_myddir'});
+ install_db('slave', $slave->[2]->{'path_myddir'});
return 0;
}
@@ -1423,6 +1279,12 @@ sub run_testcase ($) {
do_before_start_master($tname,$tinfo->{'master_sh'});
# ----------------------------------------------------------------------
+ # If any mysqld servers running died, we have to know
+ # ----------------------------------------------------------------------
+
+ mtr_record_dead_children();
+
+ # ----------------------------------------------------------------------
# Start masters
# ----------------------------------------------------------------------
@@ -1439,14 +1301,24 @@ sub run_testcase ($) {
{
$master->[0]->{'pid'}=
mysqld_start('master',0,$tinfo->{'master_opt'},[]);
+ if ( ! $master->[0]->{'pid'} )
+ {
+ report_failure_and_restart($tinfo);
+ return;
+ }
}
if ( $opt_with_ndbcluster and ! $master->[1]->{'pid'} )
{
$master->[1]->{'pid'}=
mysqld_start('master',1,$tinfo->{'master_opt'},[]);
+ if ( ! $master->[1]->{'pid'} )
+ {
+ report_failure_and_restart($tinfo);
+ return;
+ }
}
- if ( $tinfo->{'master_opt'} )
+ if ( @{$tinfo->{'master_opt'}} )
{
$master->[0]->{'uses_special_flags'}= 1;
}
@@ -1469,6 +1341,11 @@ sub run_testcase ($) {
$slave->[$idx]->{'pid'}=
mysqld_start('slave',$idx,
$tinfo->{'slave_opt'}, $tinfo->{'slave_mi'});
+ if ( ! $slave->[$idx]->{'pid'} )
+ {
+ report_failure_and_restart($tinfo);
+ return;
+ }
}
}
}
@@ -1502,30 +1379,37 @@ sub run_testcase ($) {
"mysqltest returned unexpected code $res, " .
"it has probably crashed");
}
- mtr_report_test_failed($tinfo);
- mtr_show_failed_diff($tname);
- print "\n";
- if ( ! $opt_force )
- {
- print "Aborting: $tname failed. To continue, re-run with '--force'.";
- print "\n";
- if ( ! $opt_gdb and ! $glob_use_running_server and
- ! $opt_ddd and ! $glob_use_embedded_server )
- {
- stop_masters_slaves();
- }
- exit(1);
- }
+ report_failure_and_restart($tinfo);
+ }
+ }
+}
- # FIXME always terminate on failure?!
- if ( ! $opt_gdb and ! $glob_use_running_server and
- ! $opt_ddd and ! $glob_use_embedded_server )
- {
- stop_masters_slaves();
- }
- print "Resuming Tests\n\n";
+
+sub report_failure_and_restart ($) {
+ my $tinfo= shift;
+
+ mtr_report_test_failed($tinfo);
+ mtr_show_failed_diff($tinfo->{'name'});
+ print "\n";
+ if ( ! $opt_force )
+ {
+ print "Aborting: $tinfo->{'name'} failed. To continue, re-run with '--force'.";
+ print "\n";
+ if ( ! $opt_gdb and ! $glob_use_running_server and
+ ! $opt_ddd and ! $glob_use_embedded_server )
+ {
+ stop_masters_slaves();
}
+ exit(1);
+ }
+
+ # FIXME always terminate on failure?!
+ if ( ! $opt_gdb and ! $glob_use_running_server and
+ ! $opt_ddd and ! $glob_use_embedded_server )
+ {
+ stop_masters_slaves();
}
+ print "Resuming Tests\n\n";
}
@@ -1603,11 +1487,13 @@ sub do_before_start_slave ($$) {
}
sub mysqld_arguments ($$$$$) {
- my $args= shift;
- my $type= shift; # master/slave/bootstrap
- my $idx= shift;
- my $extra_opt= shift;
- my $slave_master_info= shift;
+ my $args= shift;
+ my $type= shift; # master/slave/bootstrap
+ my $idx= shift;
+ my $extra_opt= shift;
+ my $slave_master_info= shift;
+
+# print STDERR Dumper($extra_opt);
my $sidx= ""; # Index as string, 0 is empty string
if ( $idx > 0 )
@@ -1835,10 +1721,10 @@ sub mysqld_arguments ($$$$$) {
##############################################################################
sub mysqld_start ($$$$) {
- my $type= shift; # master/slave/bootstrap
- my $idx= shift;
- my $extra_opt= shift;
- my $slave_master_info= shift;
+ my $type= shift; # master/slave/bootstrap
+ my $idx= shift;
+ my $extra_opt= shift;
+ my $slave_master_info= shift;
my $args; # Arg vector
my $exe;
@@ -1893,9 +1779,8 @@ sub mysqld_start ($$$$) {
$master->[$idx]->{'path_myerr'},
$master->[$idx]->{'path_myerr'}, "") )
{
- sleep_until_file_created($master->[$idx]->{'path_mypid'},
- $master->[$idx]->{'start_timeout'});
- return $pid;
+ return sleep_until_file_created($master->[$idx]->{'path_mypid'},
+ $master->[$idx]->{'start_timeout'}, $pid);
}
}
@@ -1905,13 +1790,12 @@ sub mysqld_start ($$$$) {
$slave->[$idx]->{'path_myerr'},
$slave->[$idx]->{'path_myerr'}, "") )
{
- sleep_until_file_created($slave->[$idx]->{'path_mypid'},
- $master->[$idx]->{'start_timeout'});
- return $pid;
+ return sleep_until_file_created($slave->[$idx]->{'path_mypid'},
+ $master->[$idx]->{'start_timeout'}, $pid);
}
}
- mtr_error("Can't start mysqld FIXME");
+ return 0;
}
sub stop_masters_slaves () {
@@ -1944,7 +1828,7 @@ sub stop_masters () {
}
}
- mtr_stop_mysqld_servers(\@args, 0);
+ mtr_stop_mysqld_servers(\@args);
}
sub stop_slaves () {
@@ -1966,7 +1850,7 @@ sub stop_slaves () {
}
}
- mtr_stop_mysqld_servers(\@args, 0);
+ mtr_stop_mysqld_servers(\@args);
}
@@ -1992,17 +1876,32 @@ sub run_mysqltest ($$) {
}
my $cmdline_mysql=
- "$exe_mysql --host=localhost --port=$master->[0]->{'path_myport'} " .
- "--socket=$master->[0]->{'path_mysock'} --user=root --password=";
+ "$exe_mysql --host=localhost --user=root --password= " .
+ "--port=$master->[0]->{'path_myport'} " .
+ "--socket=$master->[0]->{'path_mysock'}";
+
+ my $cmdline_mysql_client_test=
+ "$exe_mysql_client_test --no-defaults --testcase --user=root --silent " .
+ "--port=$master->[0]->{'path_myport'} " .
+ "--socket=$master->[0]->{'path_mysock'}";
+
+ my $cmdline_mysql_fix_system_tables=
+ "$exe_mysql_fix_system_tables --no-defaults --host=localhost --user=root --password= " .
+ "--basedir=$glob_basedir --bindir=$path_client_bindir --verbose " .
+ "--port=$master->[0]->{'path_myport'} " .
+ "--socket=$master->[0]->{'path_mysock'}";
+
+
# FIXME really needing a PATH???
# $ENV{'PATH'}= "/bin:/usr/bin:/usr/local/bin:/usr/bsd:/usr/X11R6/bin:/usr/openwin/bin:/usr/bin/X11:$ENV{'PATH'}";
- $ENV{'MYSQL'}= $exe_mysql;
+ $ENV{'MYSQL'}= $cmdline_mysql;
$ENV{'MYSQL_DUMP'}= $cmdline_mysqldump;
- $ENV{'MYSQL_BINLOG'}= $exe_mysqlbinlog;
- $ENV{'CLIENT_BINDIR'}= $path_client_bindir;
- $ENV{'TESTS_BINDIR'}= $path_tests_bindir;
+ $ENV{'MYSQL_BINLOG'}= $cmdline_mysqlbinlog;
+ $ENV{'MYSQL_FIX_SYSTEM_TABLES'}= $cmdline_mysql_fix_system_tables;
+ $ENV{'MYSQL_CLIENT_TEST'}= $cmdline_mysql_client_test;
+ $ENV{'CHARSETSDIR'}= $path_charsetsdir;
my $exe= $exe_mysqltest;
my $args;
diff --git a/mysql-test/r/update.result b/mysql-test/r/update.result
index beab6105f79..ac370db9ecc 100644
--- a/mysql-test/r/update.result
+++ b/mysql-test/r/update.result
@@ -212,3 +212,10 @@ insert into t1 values (1, "t1c2-1", 10), (2, "t1c2-2", 20);
update t1 left join t2 on t1.c1 = t2.c1 set t2.c2 = "t2c2-1";
update t1 left join t2 on t1.c1 = t2.c1 set t2.c2 = "t2c2-1" where t1.c3 = 10;
drop table t1, t2;
+create table t1 (id int not null auto_increment primary key, id_str varchar(32));
+insert into t1 (id_str) values ("test");
+update t1 set id_str = concat(id_str, id) where id = last_insert_id();
+select * from t1;
+id id_str
+1 test1
+drop table t1;
diff --git a/mysql-test/t/update.test b/mysql-test/t/update.test
index 704263b1216..04192f25ac8 100644
--- a/mysql-test/t/update.test
+++ b/mysql-test/t/update.test
@@ -170,3 +170,12 @@ insert into t1 values (1, "t1c2-1", 10), (2, "t1c2-2", 20);
update t1 left join t2 on t1.c1 = t2.c1 set t2.c2 = "t2c2-1";
update t1 left join t2 on t1.c1 = t2.c1 set t2.c2 = "t2c2-1" where t1.c3 = 10;
drop table t1, t2;
+
+#
+# Bug #8057
+#
+create table t1 (id int not null auto_increment primary key, id_str varchar(32));
+insert into t1 (id_str) values ("test");
+update t1 set id_str = concat(id_str, id) where id = last_insert_id();
+select * from t1;
+drop table t1;
diff --git a/ndb/include/portlib/NdbThread.h b/ndb/include/portlib/NdbThread.h
index 212f7de9384..e86deee4354 100644
--- a/ndb/include/portlib/NdbThread.h
+++ b/ndb/include/portlib/NdbThread.h
@@ -76,7 +76,7 @@ int NdbThread_WaitFor(struct NdbThread* p_wait_thread, void** status);
*
* * status: exit code
*/
-void NdbThread_Exit(int status);
+void NdbThread_Exit(void *status);
/**
* Set thread concurrency level
diff --git a/ndb/src/common/portlib/NdbPortLibTest.cpp b/ndb/src/common/portlib/NdbPortLibTest.cpp
index 55b9ccec5f2..d7892411851 100644
--- a/ndb/src/common/portlib/NdbPortLibTest.cpp
+++ b/ndb/src/common/portlib/NdbPortLibTest.cpp
@@ -54,10 +54,7 @@ extern "C" void* thread1func(void* arg)
if (arg1 != 7)
fail("TEST1", "Wrong arg");
- NdbThread_Exit(returnvalue);
-
- return NULL;
-
+ return returnvalue;
}
// test 2 variables and funcs
@@ -80,10 +77,7 @@ extern "C" void* test2func(void* arg)
fail("TEST2", "Failed to unlock mutex");
int returnvalue = arg1;
- NdbThread_Exit(returnvalue);
-
- return NULL;
-
+ return returnvalue;
}
@@ -129,8 +123,7 @@ extern "C" void* testfunc(void* arg)
}
while(tmpVar<100);
- NdbThread_Exit(0);
- return NULL;
+ return 0;
}
extern "C" void* testTryLockfunc(void* arg)
@@ -169,8 +162,7 @@ extern "C" void* testTryLockfunc(void* arg)
}
while(tmpVar<100);
- NdbThread_Exit(0);
- return NULL;
+ return 0;
}
diff --git a/ndb/src/common/portlib/NdbThread.c b/ndb/src/common/portlib/NdbThread.c
index 5f2e6021c43..aaee9b45069 100644
--- a/ndb/src/common/portlib/NdbThread.c
+++ b/ndb/src/common/portlib/NdbThread.c
@@ -17,7 +17,7 @@
#include <ndb_global.h>
#include <NdbThread.h>
-#include <pthread.h>
+#include <my_pthread.h>
#include <NdbMem.h>
#define MAX_THREAD_NAME 16
@@ -39,21 +39,28 @@ struct NdbThread
static
void*
ndb_thread_wrapper(void* _ss){
- void * ret;
- struct NdbThread * ss = (struct NdbThread *)_ss;
- DBUG_ENTER("ndb_thread_wrapper");
-#ifdef NDB_SHM_TRANSPORTER
- if (g_ndb_shm_signum)
+ my_thread_init();
{
- sigset_t mask;
- DBUG_PRINT("info",("Block signum %d",g_ndb_shm_signum));
- sigemptyset(&mask);
- sigaddset(&mask, g_ndb_shm_signum);
- pthread_sigmask(SIG_BLOCK, &mask, 0);
- }
+ DBUG_ENTER("ndb_thread_wrapper");
+#ifdef NDB_SHM_TRANSPORTER
+ if (g_ndb_shm_signum)
+ {
+ sigset_t mask;
+ DBUG_PRINT("info",("Block signum %d",g_ndb_shm_signum));
+ sigemptyset(&mask);
+ sigaddset(&mask, g_ndb_shm_signum);
+ pthread_sigmask(SIG_BLOCK, &mask, 0);
+ }
#endif
- ret= (* ss->func)(ss->object);
- DBUG_RETURN(ret);
+ {
+ void *ret;
+ struct NdbThread * ss = (struct NdbThread *)_ss;
+ ret= (* ss->func)(ss->object);
+ NdbThread_Exit(ret);
+ }
+ /* will never be reached */
+ DBUG_RETURN(0);
+ }
}
@@ -130,9 +137,10 @@ int NdbThread_WaitFor(struct NdbThread* p_wait_thread, void** status)
}
-void NdbThread_Exit(int status)
+void NdbThread_Exit(void *status)
{
- pthread_exit(&status);
+ my_thread_end();
+ pthread_exit(status);
}
diff --git a/ndb/src/common/transporter/TransporterRegistry.cpp b/ndb/src/common/transporter/TransporterRegistry.cpp
index 462cde76740..439730435ec 100644
--- a/ndb/src/common/transporter/TransporterRegistry.cpp
+++ b/ndb/src/common/transporter/TransporterRegistry.cpp
@@ -1104,11 +1104,8 @@ TransporterRegistry::setIOState(NodeId nodeId, IOState state) {
static void *
run_start_clients_C(void * me)
{
- my_thread_init();
((TransporterRegistry*) me)->start_clients_thread();
- my_thread_end();
- NdbThread_Exit(0);
- return me;
+ return 0;
}
// Run by kernel thread
diff --git a/ndb/src/common/util/NdbSqlUtil.cpp b/ndb/src/common/util/NdbSqlUtil.cpp
index 6b23da774af..53fa5d69215 100644
--- a/ndb/src/common/util/NdbSqlUtil.cpp
+++ b/ndb/src/common/util/NdbSqlUtil.cpp
@@ -526,6 +526,7 @@ NdbSqlUtil::cmpDate(const void* info, const Uint32* p1, const Uint32* p2, Uint32
union { const Uint32* p; const unsigned char* v; } u1, u2;
u1.p = p1;
u2.p = p2;
+#ifdef ndb_date_sol9x86_cc_xO3_madness
// from Field_newdate::val_int
Uint64 j1 = uint3korr(u1.v);
Uint64 j2 = uint3korr(u2.v);
@@ -536,6 +537,33 @@ NdbSqlUtil::cmpDate(const void* info, const Uint32* p1, const Uint32* p2, Uint32
if (j1 > j2)
return +1;
return 0;
+#else
+ uint j1 = uint3korr(u1.v);
+ uint j2 = uint3korr(u2.v);
+ uint d1 = (j1 & 31);
+ uint d2 = (j2 & 31);
+ j1 = (j1 >> 5);
+ j2 = (j2 >> 5);
+ uint m1 = (j1 & 15);
+ uint m2 = (j2 & 15);
+ j1 = (j1 >> 4);
+ j2 = (j2 >> 4);
+ uint y1 = j1;
+ uint y2 = j2;
+ if (y1 < y2)
+ return -1;
+ if (y1 > y2)
+ return +1;
+ if (m1 < m2)
+ return -1;
+ if (m1 > m2)
+ return +1;
+ if (d1 < d2)
+ return -1;
+ if (d1 > d2)
+ return +1;
+ return 0;
+#endif
#endif
}
diff --git a/ndb/src/common/util/SocketServer.cpp b/ndb/src/common/util/SocketServer.cpp
index 8bee256684d..da06389b5df 100644
--- a/ndb/src/common/util/SocketServer.cpp
+++ b/ndb/src/common/util/SocketServer.cpp
@@ -186,11 +186,7 @@ extern "C"
void*
socketServerThread_C(void* _ss){
SocketServer * ss = (SocketServer *)_ss;
-
- my_thread_init();
ss->doRun();
- my_thread_end();
- NdbThread_Exit(0);
return 0;
}
@@ -309,11 +305,8 @@ void*
sessionThread_C(void* _sc){
SocketServer::Session * si = (SocketServer::Session *)_sc;
- my_thread_init();
if(!transfer(si->m_socket)){
si->m_stopped = true;
- my_thread_end();
- NdbThread_Exit(0);
return 0;
}
@@ -325,8 +318,6 @@ sessionThread_C(void* _sc){
}
si->m_stopped = true;
- my_thread_end();
- NdbThread_Exit(0);
return 0;
}
diff --git a/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp b/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp
index ad6c0fd5283..f76440a462a 100644
--- a/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp
+++ b/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp
@@ -82,7 +82,6 @@ static int numAsyncFiles = 0;
extern "C" void * runAsyncFile(void* arg)
{
- my_thread_init();
((AsyncFile*)arg)->run();
return (NULL);
}
@@ -876,8 +875,6 @@ void AsyncFile::endReq()
{
// Thread is ended with return
if (theWriteBuffer) NdbMem_Free(theWriteBuffer);
- my_thread_end();
- NdbThread_Exit(0);
}
diff --git a/ndb/src/kernel/blocks/ndbfs/MemoryChannelTest/MemoryChannelTest.cpp b/ndb/src/kernel/blocks/ndbfs/MemoryChannelTest/MemoryChannelTest.cpp
index aeab9f7828d..b98c60693f4 100644
--- a/ndb/src/kernel/blocks/ndbfs/MemoryChannelTest/MemoryChannelTest.cpp
+++ b/ndb/src/kernel/blocks/ndbfs/MemoryChannelTest/MemoryChannelTest.cpp
@@ -40,7 +40,6 @@ extern "C" void* runProducer(void*arg)
NdbSleep_MilliSleep(i);
i++;
}
- NdbThread_Exit(0);
return NULL;
}
@@ -58,7 +57,6 @@ extern "C" void* runConsumer(void* arg)
delete p;
}
- NdbThread_Exit(0);
return NULL;
}
@@ -92,7 +90,6 @@ extern "C" void* runProducer2(void*arg)
NdbSleep_MilliSleep(i);
i++;
}
- NdbThread_Exit(0);
return NULL;
}
@@ -111,7 +108,6 @@ extern "C" void* runConsumer2(void* arg)
delete p;
}
ndbout << "Consumer2: " << count << " received" << endl;
- NdbThread_Exit(0);
return NULL;
}
diff --git a/ndb/src/kernel/vm/FastScheduler.cpp b/ndb/src/kernel/vm/FastScheduler.cpp
index eca456d26dd..d05c02360a7 100644
--- a/ndb/src/kernel/vm/FastScheduler.cpp
+++ b/ndb/src/kernel/vm/FastScheduler.cpp
@@ -76,19 +76,26 @@ FastScheduler::activateSendPacked()
globalData.loopMax = 2048;
}//FastScheduler::activateSendPacked()
+//------------------------------------------------------------------------
+// sendPacked is executed at the end of the loop.
+// To ensure that we don't send any messages before executing all local
+// packed signals we do another turn in the loop (unless we have already
+// executed too many signals in the loop).
+//------------------------------------------------------------------------
void
FastScheduler::doJob()
{
+ Uint32 init_loopCount = 0;
+ Uint32 TminLoops = getBOccupancy() + EXTRA_SIGNALS_PER_DO_JOB;
+ Uint32 TloopMax = (Uint32)globalData.loopMax;
+ if (TminLoops < TloopMax) {
+ TloopMax = TminLoops;
+ }//if
+ if (TloopMax < MIN_NUMBER_OF_SIG_PER_DO_JOB) {
+ TloopMax = MIN_NUMBER_OF_SIG_PER_DO_JOB;
+ }//if
do{
- Uint32 loopCount = 0;
- Uint32 TminLoops = getBOccupancy() + EXTRA_SIGNALS_PER_DO_JOB;
- Uint32 TloopMax = (Uint32)globalData.loopMax;
- if (TminLoops < TloopMax) {
- TloopMax = TminLoops;
- }//if
- if (TloopMax < MIN_NUMBER_OF_SIG_PER_DO_JOB) {
- TloopMax = MIN_NUMBER_OF_SIG_PER_DO_JOB;
- }//if
+ Uint32 loopCount = init_loopCount;
register Uint32 tHighPrio = globalData.highestAvailablePrio;
register Signal* signal = getVMSignals();
while ((tHighPrio < LEVEL_IDLE) && (loopCount < TloopMax)) {
@@ -151,7 +158,7 @@ FastScheduler::doJob()
if (globalData.sendPackedActivated == 1) {
Uint32 t1 = theDoJobTotalCounter;
Uint32 t2 = theDoJobCallCounter;
- t1 += loopCount;
+ t1 += (loopCount - init_loopCount);
t2++;
theDoJobTotalCounter = t1;
theDoJobCallCounter = t2;
@@ -161,7 +168,11 @@ FastScheduler::doJob()
theDoJobTotalCounter = 0;
}//if
}//if
- } while (getBOccupancy() > MAX_OCCUPANCY);
+ init_loopCount = loopCount;
+ sendPacked();
+ } while ((getBOccupancy() > MAX_OCCUPANCY) ||
+ ((init_loopCount < TloopMax) &&
+ (globalData.highestAvailablePrio < LEVEL_IDLE)));
}//FastScheduler::doJob()
void FastScheduler::sendPacked()
diff --git a/ndb/src/kernel/vm/ThreadConfig.cpp b/ndb/src/kernel/vm/ThreadConfig.cpp
index 4844bb9a477..76fcc4ba84f 100644
--- a/ndb/src/kernel/vm/ThreadConfig.cpp
+++ b/ndb/src/kernel/vm/ThreadConfig.cpp
@@ -173,9 +173,6 @@ void ThreadConfig::ipControlLoop()
// until all buffers are empty or until we have executed 2048 signals.
//--------------------------------------------------------------------
globalScheduler.doJob();
-
- globalScheduler.sendPacked();
-
}//while
globalData.incrementWatchDogCounter(6);
diff --git a/ndb/src/kernel/vm/WatchDog.cpp b/ndb/src/kernel/vm/WatchDog.cpp
index 4e07dc1df90..23475a478d3 100644
--- a/ndb/src/kernel/vm/WatchDog.cpp
+++ b/ndb/src/kernel/vm/WatchDog.cpp
@@ -27,10 +27,7 @@
extern "C"
void*
runWatchDog(void* w){
- my_thread_init();
((WatchDog*)w)->run();
- my_thread_end();
- NdbThread_Exit(0);
return NULL;
}
diff --git a/ndb/src/mgmclient/CommandInterpreter.cpp b/ndb/src/mgmclient/CommandInterpreter.cpp
index cbf7776fe06..025bed2bc09 100644
--- a/ndb/src/mgmclient/CommandInterpreter.cpp
+++ b/ndb/src/mgmclient/CommandInterpreter.cpp
@@ -457,8 +457,6 @@ event_thread_run(void* m)
{
NdbMgmHandle handle= *(NdbMgmHandle*)m;
- my_thread_init();
-
int filter[] = { 15, NDB_MGM_EVENT_CATEGORY_BACKUP, 0 };
int fd = ndb_mgm_listen_event(handle, filter);
if (fd > 0)
@@ -478,9 +476,7 @@ event_thread_run(void* m)
do_event_thread= -1;
}
- my_thread_end();
- NdbThread_Exit(0);
- return 0;
+ return NULL;
}
bool
diff --git a/ndb/src/mgmsrv/ConfigInfo.cpp b/ndb/src/mgmsrv/ConfigInfo.cpp
index 9be4af1b9b5..07310e3a8b8 100644
--- a/ndb/src/mgmsrv/ConfigInfo.cpp
+++ b/ndb/src/mgmsrv/ConfigInfo.cpp
@@ -3192,13 +3192,27 @@ fixShmKey(InitConfigFileParser::Context & ctx, const char *)
{
DBUG_ENTER("fixShmKey");
{
+ static int last_signum= -1;
Uint32 signum;
if(!ctx.m_currentSection->get("Signum", &signum))
{
signum= OPT_NDB_SHM_SIGNUM_DEFAULT;
+ if (signum <= 0)
+ {
+ ctx.reportError("Unable to set default parameter for [SHM]Signum"
+ " please specify [SHM DEFAULT]Signum");
+ return false;
+ }
ctx.m_currentSection->put("Signum", signum);
DBUG_PRINT("info",("Added Signum=%u", signum));
}
+ if ( last_signum != (int)signum && last_signum >= 0 )
+ {
+ ctx.reportError("All shared memory transporters must have same [SHM]Signum defined."
+ " Use [SHM DEFAULT]Signum");
+ return false;
+ }
+ last_signum= (int)signum;
}
{
Uint32 id1= 0, id2= 0, key= 0;
diff --git a/ndb/src/mgmsrv/MgmtSrvr.cpp b/ndb/src/mgmsrv/MgmtSrvr.cpp
index f698099141a..66c9a6448aa 100644
--- a/ndb/src/mgmsrv/MgmtSrvr.cpp
+++ b/ndb/src/mgmsrv/MgmtSrvr.cpp
@@ -70,12 +70,7 @@ void *
MgmtSrvr::logLevelThread_C(void* m)
{
MgmtSrvr *mgm = (MgmtSrvr*)m;
- my_thread_init();
mgm->logLevelThreadRun();
-
- my_thread_end();
- NdbThread_Exit(0);
- /* NOTREACHED */
return 0;
}
@@ -83,12 +78,7 @@ void *
MgmtSrvr::signalRecvThread_C(void *m)
{
MgmtSrvr *mgm = (MgmtSrvr*)m;
- my_thread_init();
mgm->signalRecvThreadRun();
-
- my_thread_end();
- NdbThread_Exit(0);
- /* NOTREACHED */
return 0;
}
diff --git a/ndb/src/ndbapi/ClusterMgr.cpp b/ndb/src/ndbapi/ClusterMgr.cpp
index e10b2e1d82c..1fe0cedbd6c 100644
--- a/ndb/src/ndbapi/ClusterMgr.cpp
+++ b/ndb/src/ndbapi/ClusterMgr.cpp
@@ -54,7 +54,6 @@ runClusterMgr_C(void * me)
#ifdef NDB_OSE
NdbSleep_MilliSleep(50);
#endif
- NdbThread_Exit(0);
return NULL;
}
@@ -560,10 +559,7 @@ extern "C"
void*
runArbitMgr_C(void* me)
{
- my_thread_init();
((ArbitMgr*) me)->threadMain();
- my_thread_end();
- NdbThread_Exit(0);
return NULL;
}
diff --git a/ndb/src/ndbapi/TransporterFacade.cpp b/ndb/src/ndbapi/TransporterFacade.cpp
index 031ee6315e8..5582143be44 100644
--- a/ndb/src/ndbapi/TransporterFacade.cpp
+++ b/ndb/src/ndbapi/TransporterFacade.cpp
@@ -405,11 +405,8 @@ extern "C"
void*
runSendRequest_C(void * me)
{
- my_thread_init();
((TransporterFacade*) me)->threadMainSend();
- my_thread_end();
- NdbThread_Exit(0);
- return me;
+ return 0;
}
void TransporterFacade::threadMainSend(void)
@@ -443,11 +440,8 @@ extern "C"
void*
runReceiveResponse_C(void * me)
{
- my_thread_init();
((TransporterFacade*) me)->threadMainReceive();
- my_thread_end();
- NdbThread_Exit(0);
- return me;
+ return 0;
}
void TransporterFacade::threadMainReceive(void)
diff --git a/ndb/src/ndbapi/ndb_cluster_connection.cpp b/ndb/src/ndbapi/ndb_cluster_connection.cpp
index 5df707e211d..ab32d6abb8e 100644
--- a/ndb/src/ndbapi/ndb_cluster_connection.cpp
+++ b/ndb/src/ndbapi/ndb_cluster_connection.cpp
@@ -87,11 +87,8 @@ const char *Ndb_cluster_connection::get_connectstring(char *buf,
extern "C" pthread_handler_decl(run_ndb_cluster_connection_connect_thread, me)
{
- my_thread_init();
g_run_connect_thread= 1;
((Ndb_cluster_connection_impl*) me)->connect_thread();
- my_thread_end();
- NdbThread_Exit(0);
return me;
}
diff --git a/ndb/test/ndbapi/benchronja.cpp b/ndb/test/ndbapi/benchronja.cpp
index 91b2a041186..a7523e8e416 100644
--- a/ndb/test/ndbapi/benchronja.cpp
+++ b/ndb/test/ndbapi/benchronja.cpp
@@ -984,7 +984,6 @@ void* ThreadExec(void* ThreadData){
delete pMyNdb;
pMyNdb = NULL ;
ThreadReady[thread_no] = 1;
- NdbThread_Exit(0) ;
return 0 ;
}//if
@@ -1197,7 +1196,6 @@ void* ThreadExec(void* ThreadData){
} // for(;;)
delete pMyNdb ;
- NdbThread_Exit(0) ;
- return 0 ; // Compiler is happy now
+ return 0 ;
}
diff --git a/ndb/test/ndbapi/flexAsynch.cpp b/ndb/test/ndbapi/flexAsynch.cpp
index 1953444d640..4b87b2c70ed 100644
--- a/ndb/test/ndbapi/flexAsynch.cpp
+++ b/ndb/test/ndbapi/flexAsynch.cpp
@@ -494,8 +494,7 @@ threadLoop(void* ThreadData)
delete localNdb;
ThreadReady[threadNo] = 1;
- NdbThread_Exit(0);
- return NULL; // Just to keep compiler happy
+ return NULL;
}//threadLoop()
static
diff --git a/ndb/test/ndbapi/flexBench.cpp b/ndb/test/ndbapi/flexBench.cpp
index 2a2388109a1..cc2bfb391da 100644
--- a/ndb/test/ndbapi/flexBench.cpp
+++ b/ndb/test/ndbapi/flexBench.cpp
@@ -617,7 +617,7 @@ static void* flexBenchThread(void* pArg)
free(attrRefValue) ;
free(pOps) ;
delete pNdb ;
- NdbThread_Exit(0) ;
+ return 0; // thread exits
}
pNdb->init();
@@ -934,8 +934,7 @@ static void* flexBenchThread(void* pArg)
free(longKeyAttrValue);
} // if
- NdbThread_Exit(0);
- return NULL; // Just to keep compiler happy
+ return NULL; // Thread exits
}
diff --git a/ndb/test/ndbapi/flexHammer.cpp b/ndb/test/ndbapi/flexHammer.cpp
index 688e70d501a..13cd2d5e561 100644
--- a/ndb/test/ndbapi/flexHammer.cpp
+++ b/ndb/test/ndbapi/flexHammer.cpp
@@ -612,10 +612,7 @@ flexHammerThread(void* pArg)
flexHammerErrorData->resetErrorCounters();
- // And exit using NDBT
- NdbThread_Exit(0);
-
- return NULL;
+ return NULL; // thread exits
} // flexHammerThread
diff --git a/ndb/test/ndbapi/flexScan.cpp b/ndb/test/ndbapi/flexScan.cpp
index c7f4041a525..4d2c85d6955 100644
--- a/ndb/test/ndbapi/flexScan.cpp
+++ b/ndb/test/ndbapi/flexScan.cpp
@@ -701,8 +701,7 @@ flexScanThread(void* ThreadData)
free(pkValue);
} // if
- NdbThread_Exit(0);
- return NULL;
+ return NULL; // thread exits
} // flexScanThread
diff --git a/ndb/test/ndbapi/flexTT.cpp b/ndb/test/ndbapi/flexTT.cpp
index 3b976f9f87e..8d5be2bb399 100644
--- a/ndb/test/ndbapi/flexTT.cpp
+++ b/ndb/test/ndbapi/flexTT.cpp
@@ -389,8 +389,7 @@ threadLoop(void* ThreadData)
delete localNdb;
ThreadReady[loc_threadNo] = 1;
- NdbThread_Exit(0);
- return NULL; // Just to keep compiler happy
+ return NULL; // Thread exits
}//threadLoop()
static
diff --git a/ndb/test/ndbapi/flexTimedAsynch.cpp b/ndb/test/ndbapi/flexTimedAsynch.cpp
index 27380cc79fd..2b8c0bdd5f8 100644
--- a/ndb/test/ndbapi/flexTimedAsynch.cpp
+++ b/ndb/test/ndbapi/flexTimedAsynch.cpp
@@ -406,9 +406,8 @@ threadLoop(void* ThreadData)
delete localNdb;
ThreadReady[threadNo] = 1;
- NdbThread_Exit(0);
- return NULL;
+ return NULL; // thread exits
}
void executeThread(StartType aType, Ndb* aNdbObject, ThreadNdb* threadInfo)
diff --git a/ndb/test/ndbapi/flex_bench_mysql.cpp b/ndb/test/ndbapi/flex_bench_mysql.cpp
index c8d4d85bedf..c15175bfb00 100644
--- a/ndb/test/ndbapi/flex_bench_mysql.cpp
+++ b/ndb/test/ndbapi/flex_bench_mysql.cpp
@@ -710,7 +710,7 @@ static void* flexBenchThread(void* pArg)
the_socket_name,
0) == NULL ) {
ndbout << "failed" << endl;
- NdbThread_Exit(0) ;
+ return 0;
}
ndbout << "ok" << endl;
@@ -722,7 +722,7 @@ static void* flexBenchThread(void* pArg)
if (r) {
ndbout << "autocommit on/off failed" << endl;
- NdbThread_Exit(0) ;
+ return 0;
}
}
#endif
@@ -741,7 +741,7 @@ static void* flexBenchThread(void* pArg)
ndbout << threadNo << endl ;
ndbout << "Thread #" << threadNo << " will now exit" << endl ;
tResult = 13 ;
- NdbThread_Exit(0) ;
+ return 0;
}
if (use_ndb) {
@@ -750,7 +750,7 @@ static void* flexBenchThread(void* pArg)
ndbout << "Failed to get an NDB object" << endl;
ndbout << "Thread #" << threadNo << " will now exit" << endl ;
tResult = 13;
- NdbThread_Exit(0) ;
+ return 0;
}
pNdb->waitUntilReady();
return_ndb_object(pNdb, ndb_id);
@@ -900,11 +900,11 @@ static void* flexBenchThread(void* pArg)
prep_insert[i] = mysql_prepare(&mysql, buf, pos);
if (prep_insert[i] == 0) {
ndbout << "mysql_prepare: " << mysql_error(&mysql) << endl;
- NdbThread_Exit(0) ;
+ return 0;
}
if (mysql_bind_param(prep_insert[i], bind_insert)) {
ndbout << "mysql_bind_param: " << mysql_error(&mysql) << endl;
- NdbThread_Exit(0) ;
+ return 0;
}
}
@@ -926,11 +926,11 @@ static void* flexBenchThread(void* pArg)
prep_update[i] = mysql_prepare(&mysql, buf, pos);
if (prep_update[i] == 0) {
ndbout << "mysql_prepare: " << mysql_error(&mysql) << endl;
- NdbThread_Exit(0) ;
+ return 0;
}
if (mysql_bind_param(prep_update[i], bind_update)) {
ndbout << "mysql_bind_param: " << mysql_error(&mysql) << endl;
- NdbThread_Exit(0) ;
+ return 0;
}
}
@@ -953,15 +953,15 @@ static void* flexBenchThread(void* pArg)
prep_read[i] = mysql_prepare(&mysql, buf, pos);
if (prep_read[i] == 0) {
ndbout << "mysql_prepare: " << mysql_error(&mysql) << endl;
- NdbThread_Exit(0) ;
+ return 0;
}
if (mysql_bind_param(prep_read[i], bind_read)) {
ndbout << "mysql_bind_param: " << mysql_error(&mysql) << endl;
- NdbThread_Exit(0) ;
+ return 0;
}
if (mysql_bind_result(prep_read[i], &bind_read[1])) {
ndbout << "mysql_bind_result: " << mysql_error(&mysql) << endl;
- NdbThread_Exit(0) ;
+ return 0;
}
}
@@ -978,11 +978,11 @@ static void* flexBenchThread(void* pArg)
prep_delete[i] = mysql_prepare(&mysql, buf, pos);
if (prep_delete[i] == 0) {
ndbout << "mysql_prepare: " << mysql_error(&mysql) << endl;
- NdbThread_Exit(0) ;
+ return 0;
}
if (mysql_bind_param(prep_delete[i], bind_delete)) {
ndbout << "mysql_bind_param: " << mysql_error(&mysql) << endl;
- NdbThread_Exit(0) ;
+ return 0;
}
}
}
@@ -1431,8 +1431,7 @@ static void* flexBenchThread(void* pArg)
ndbout << "I got here " << endl;
return_ndb_object(pNdb, ndb_id);
}
- NdbThread_Exit(0);
- return NULL; // Just to keep compiler happy
+ return NULL;
}
diff --git a/ndb/test/ndbapi/mainAsyncGenerator.cpp b/ndb/test/ndbapi/mainAsyncGenerator.cpp
index 16cb50e160f..73a8b98ab57 100644
--- a/ndb/test/ndbapi/mainAsyncGenerator.cpp
+++ b/ndb/test/ndbapi/mainAsyncGenerator.cpp
@@ -274,8 +274,6 @@ threadRoutine(void *arg)
asyncDbDisconnect(pNDB);
- NdbThread_Exit(0);
-
return NULL;
}
diff --git a/ndb/test/src/NDBT_Test.cpp b/ndb/test/src/NDBT_Test.cpp
index 0e5f744d5ea..600a5443f40 100644
--- a/ndb/test/src/NDBT_Test.cpp
+++ b/ndb/test/src/NDBT_Test.cpp
@@ -479,7 +479,6 @@ void *
runStep_C(void * s)
{
runStep(s);
- NdbThread_Exit(0);
return NULL;
}
diff --git a/ndb/test/tools/transproxy.cpp b/ndb/test/tools/transproxy.cpp
index 88267801172..28a621fa584 100644
--- a/ndb/test/tools/transproxy.cpp
+++ b/ndb/test/tools/transproxy.cpp
@@ -291,7 +291,6 @@ extern "C" void*
copyrun_C(void* copy)
{
((Copy*) copy)->run();
- NdbThread_Exit(0);
return 0;
}
@@ -322,7 +321,6 @@ extern "C" void*
connrun_C(void* conn)
{
((Conn*) conn)->run();
- NdbThread_Exit(0);
return 0;
}
diff --git a/sql/item_func.cc b/sql/item_func.cc
index bff49541252..7d38c44bab3 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -2298,14 +2298,10 @@ longlong Item_func_last_insert_id::val_int()
longlong value=args[0]->val_int();
current_thd->insert_id(value);
null_value=args[0]->null_value;
- return value;
}
else
- {
- Item *it= get_system_var(current_thd, OPT_SESSION, "last_insert_id", 14,
- "last_insert_id()");
- return it->val_int();
- }
+ current_thd->lex->uncacheable(UNCACHEABLE_SIDEEFFECT);
+ return current_thd->insert_id();
}
/* This function is just used to test speed of different functions */
diff --git a/support-files/Makefile.am b/support-files/Makefile.am
index 7ae1071f9ec..0a6077f0efc 100644
--- a/support-files/Makefile.am
+++ b/support-files/Makefile.am
@@ -27,7 +27,8 @@ EXTRA_DIST = mysql.spec.sh \
mysql.server.sh \
binary-configure.sh \
magic \
- MySQL-shared-compat.spec.sh
+ MySQL-shared-compat.spec.sh \
+ ndb-config-2-node.ini.sh
SUBDIRS = MacOSX
@@ -38,7 +39,8 @@ pkgdata_DATA = my-small.cnf \
my-innodb-heavy-4G.cnf \
mysql-log-rotate \
mysql-@VERSION@.spec \
- MySQL-shared-compat.spec
+ MySQL-shared-compat.spec \
+ ndb-config-2-node.ini
pkgdata_SCRIPTS = mysql.server
@@ -52,7 +54,8 @@ CLEANFILES = my-small.cnf \
mysql-log-rotate \
mysql.server \
binary-configure \
- MySQL-shared-compat.spec
+ MySQL-shared-compat.spec \
+ ndb-config-2-node.ini
mysql-@VERSION@.spec: mysql.spec
rm -f $@
diff --git a/support-files/mysql.spec.sh b/support-files/mysql.spec.sh
index 99280385965..0d72356731c 100644
--- a/support-files/mysql.spec.sh
+++ b/support-files/mysql.spec.sh
@@ -104,6 +104,53 @@ This package contains the standard MySQL clients and administration tools.
%description client -l pt_BR
Este pacote contém os clientes padrão para o MySQL.
+%package ndb-storage
+Release: %{release}
+Summary: MySQL - ndbcluster storage engine
+Group: Applications/Databases
+
+%description ndb-storage
+This package contains the ndbcluster storage engine.
+It is necessary to have this package installed on all
+computers that should store ndbcluster table data.
+Note that this storage engine can only be used in conjunction
+with the MySQL Max server.
+
+%{see_base}
+
+%package ndb-management
+Release: %{release}
+Summary: MySQL - ndbcluster storage engine management
+Group: Applications/Databases
+
+%description ndb-management
+This package contains ndbcluster storage engine management.
+It is necessary to have this package installed on at least
+one computer in the cluster.
+
+%{see_base}
+
+%package ndb-tools
+Release: %{release}
+Summary: MySQL - ndbcluster storage engine basic tools
+Group: Applications/Databases
+
+%description ndb-tools
+This package contains ndbcluster storage engine basic tools.
+
+%{see_base}
+
+%package ndb-extra
+Release: %{release}
+Summary: MySQL - ndbcluster storage engine extra tools
+Group: Applications/Databases
+
+%description ndb-extra
+This package contains some extra ndbcluster storage engine tools for the advanced user.
+They should be used with caution.
+
+%{see_base}
+
%package bench
Release: %{release}
Requires: %{name}-client perl-DBI perl
@@ -162,6 +209,7 @@ Requires: MySQL-server >= 4.0
Optional MySQL server binary that supports additional features like:
- Berkeley DB Storage Engine
+ - Ndbcluster Storage Engine interface
- Archive Storage Engine
- CSV Storage Engine
- Example Storage Engine
@@ -279,6 +327,7 @@ BuildMySQL "--enable-shared \
--without-openssl \
--with-berkeley-db \
--with-innodb \
+ --with-ndbcluster \
--with-raid \
--with-archive \
--with-csv-storage-engine \
@@ -293,6 +342,9 @@ BuildMySQL "--enable-shared \
mv sql/mysqld sql/mysqld-max
nm --numeric-sort sql/mysqld-max > sql/mysqld-max.sym
+# Install the ndb binaries
+(cd ndb; make install DESTDIR=$RBR)
+
# Install embedded server library in the build root
install -m 644 libmysqld/libmysqld.a $RBR%{_libdir}/mysql/
@@ -435,6 +487,21 @@ chmod -R og-rw $mysql_datadir/mysql
# Allow safe_mysqld to start mysqld and print a message before we exit
sleep 2
+
+%pre ndb-storage
+mysql_clusterdir=/var/lib/mysql-cluster
+
+# Create cluster directory if needed
+if test ! -d $mysql_clusterdir; then mkdir -m755 $mysql_clusterdir; fi
+
+
+%pre ndb-storage
+mysql_clusterdir=/var/lib/mysql-cluster
+
+# Create cluster directory if needed
+if test ! -d $mysql_clusterdir; then mkdir -m755 $mysql_clusterdir; fi
+
+
%post Max
# Restart mysqld, to use the new binary.
echo "Restarting mysqld."
@@ -475,6 +542,7 @@ fi
%doc Docs/manual.{html,ps,texi,txt}
%doc Docs/manual_toc.html
%doc support-files/my-*.cnf
+%doc support-files/ndb-*.ini
%doc %attr(644, root, root) %{_infodir}/mysql.info*
@@ -556,6 +624,32 @@ fi
%postun shared
/sbin/ldconfig
+%files ndb-storage
+%defattr(-,root,root,0755)
+%attr(755, root, root) %{_sbindir}/ndbd
+
+%files ndb-management
+%defattr(-,root,root,0755)
+%attr(755, root, root) %{_sbindir}/ndb_mgmd
+%attr(755, root, root) %{_bindir}/ndb_mgm
+
+%files ndb-tools
+%defattr(-,root,root,0755)
+%attr(755, root, root) %{_bindir}/ndb_mgm
+%attr(755, root, root) %{_bindir}/ndb_restore
+%attr(755, root, root) %{_bindir}/ndb_waiter
+%attr(755, root, root) %{_bindir}/ndb_select_all
+%attr(755, root, root) %{_bindir}/ndb_select_count
+%attr(755, root, root) %{_bindir}/ndb_desc
+%attr(755, root, root) %{_bindir}/ndb_show_tables
+%attr(755, root, root) %{_bindir}/ndb_test_platform
+
+%files ndb-extra
+%defattr(-,root,root,0755)
+%attr(755, root, root) %{_bindir}/ndb_drop_index
+%attr(755, root, root) %{_bindir}/ndb_drop_table
+%attr(755, root, root) %{_bindir}/ndb_delete_all
+
%files devel
%defattr(-, root, root, 0755)
%doc EXCEPTIONS-CLIENT
diff --git a/support-files/ndb-config-2-node.ini.sh b/support-files/ndb-config-2-node.ini.sh
new file mode 100644
index 00000000000..be80f1dd0b3
--- /dev/null
+++ b/support-files/ndb-config-2-node.ini.sh
@@ -0,0 +1,43 @@
+# Example Ndbcluster storage engine config file.
+#
+[ndbd default]
+NoOfReplicas= 2
+MaxNoOfConcurrentOperations= 10000
+DataMemory= 80M
+IndexMemory= 24M
+TimeBetweenWatchDogCheck= 30000
+DataDir= /var/lib/mysql-cluster
+MaxNoOfOrderedIndexes= 512
+
+[ndb_mgmd default]
+DataDir= /var/lib/mysql-cluster
+
+[ndb_mgmd]
+Id=1
+HostName= localhost
+
+[ndbd]
+Id= 2
+HostName= localhost
+
+[ndbd]
+Id= 3
+HostName= localhost
+
+[mysqld]
+Id= 4
+
+[mysqld]
+Id= 5
+
+[mysqld]
+Id= 6
+
+[mysqld]
+Id= 7
+
+# choose an unused port number
+# in this configuration 63132, 63133, and 63134
+# will be used
+[tcp default]
+PortNumber= 63132