Merge mysql.com:/home/wax/mysql/mysql-4.1
into mysql.com:/home/wax/mysql/mysql-4.1test2
This commit is contained in:
commit
7d1af16c2a
@ -61,7 +61,7 @@ purifying_binaries ()
|
|||||||
if [ -n "$cxxfilt" ] ; then
|
if [ -n "$cxxfilt" ] ; then
|
||||||
opts="$opts -demangle-program=$cxxfilt"
|
opts="$opts -demangle-program=$cxxfilt"
|
||||||
fi
|
fi
|
||||||
opts="$opts -best-effort g++"
|
opts="$opts -best-effort"
|
||||||
|
|
||||||
back=`pwd`
|
back=`pwd`
|
||||||
cd $dir
|
cd $dir
|
||||||
@ -76,17 +76,17 @@ purifying_binaries ()
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "$mode" -a $mode = purify ] ; then
|
if [ -n "$mode" -a $mode = purify ] ; then
|
||||||
gmake CXXLD="purify $opts" $target
|
gmake CCLD="purify $opts gcc" CXXLD="purify $opts g++" $target
|
||||||
mv $binary $binary-purify
|
mv $binary $binary-purify
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "$mode" -a $mode = quantify ] ; then
|
if [ -n "$mode" -a $mode = quantify ] ; then
|
||||||
gmake CXXLD="quantify $opts" $target
|
gmake CCLD="quantify $opts gcc" CXXLD="quantify $opts g++" $target
|
||||||
mv $binary $binary-quantify
|
mv $binary $binary-quantify
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "$mode" -a $mode = purecov ] ; then
|
if [ -n "$mode" -a $mode = purecov ] ; then
|
||||||
gmake CXXLD="purecov $opts" $target
|
gmake CCLD="purecov $opts gcc" CXXLD="purecov $opts g++" $target
|
||||||
mv $binary $binary-purecov
|
mv $binary $binary-purecov
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -119,6 +119,7 @@ miguel@light.
|
|||||||
miguel@light.local
|
miguel@light.local
|
||||||
miguel@sartre.local
|
miguel@sartre.local
|
||||||
mikael@mc04.(none)
|
mikael@mc04.(none)
|
||||||
|
mikael@orca.ndb.mysql.com
|
||||||
mikron@c-fb0ae253.1238-1-64736c10.cust.bredbandsbolaget.se
|
mikron@c-fb0ae253.1238-1-64736c10.cust.bredbandsbolaget.se
|
||||||
mikron@mikael-ronstr-ms-dator.local
|
mikron@mikael-ronstr-ms-dator.local
|
||||||
mleich@mysql.com
|
mleich@mysql.com
|
||||||
@ -180,6 +181,7 @@ ram@gw.mysql.r18.ru
|
|||||||
ram@gw.udmsearch.izhnet.ru
|
ram@gw.udmsearch.izhnet.ru
|
||||||
ram@mysql.r18.ru
|
ram@mysql.r18.ru
|
||||||
ram@ram.(none)
|
ram@ram.(none)
|
||||||
|
ramil@mysql.com
|
||||||
ranger@regul.home.lan
|
ranger@regul.home.lan
|
||||||
rburnett@build.mysql.com
|
rburnett@build.mysql.com
|
||||||
reggie@bob.(none)
|
reggie@bob.(none)
|
||||||
|
@ -214,7 +214,7 @@ if (-d $target_dir)
|
|||||||
@stat= stat("$target_dir/configure.in");
|
@stat= stat("$target_dir/configure.in");
|
||||||
my $mtime= $stat[9];
|
my $mtime= $stat[9];
|
||||||
my ($sec,$min,$hour,$mday,$mon,$year) = localtime($mtime);
|
my ($sec,$min,$hour,$mday,$mon,$year) = localtime($mtime);
|
||||||
my $mtime= sprintf("%04d%-02d-%02d-%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min);
|
my $mtime= sprintf("%04d-%02d-%02d-%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min);
|
||||||
|
|
||||||
&logger("Renaming $target_dir to $target_dir-$mtime");
|
&logger("Renaming $target_dir to $target_dir-$mtime");
|
||||||
$command= "mv ";
|
$command= "mv ";
|
||||||
|
@ -7,7 +7,7 @@ use Sys::Hostname;
|
|||||||
@config_options= ();
|
@config_options= ();
|
||||||
@make_options= ();
|
@make_options= ();
|
||||||
|
|
||||||
$opt_distribution=$opt_user=$opt_config_env=$opt_config_extra_env="";
|
$opt_comment=$opt_distribution=$opt_user=$opt_config_env=$opt_config_extra_env="";
|
||||||
$opt_dbd_options=$opt_perl_options=$opt_config_options=$opt_make_options=$opt_suffix="";
|
$opt_dbd_options=$opt_perl_options=$opt_config_options=$opt_make_options=$opt_suffix="";
|
||||||
$opt_tmp=$opt_version_suffix="";
|
$opt_tmp=$opt_version_suffix="";
|
||||||
$opt_bundled_zlib=$opt_help=$opt_delete=$opt_debug=$opt_stage=$opt_no_test=$opt_no_perl=$opt_one_error=$opt_with_low_memory=$opt_fast_benchmark=$opt_static_client=$opt_static_server=$opt_static_perl=$opt_sur=$opt_with_small_disk=$opt_local_perl=$opt_tcpip=$opt_build_thread=$opt_use_old_distribution=$opt_enable_shared=$opt_no_crash_me=$opt_no_strip=$opt_with_archive=$opt_with_cluster=$opt_with_csv=$opt_with_example=$opt_with_debug=$opt_no_benchmark=$opt_no_mysqltest=$opt_without_embedded=$opt_readline=0;
|
$opt_bundled_zlib=$opt_help=$opt_delete=$opt_debug=$opt_stage=$opt_no_test=$opt_no_perl=$opt_one_error=$opt_with_low_memory=$opt_fast_benchmark=$opt_static_client=$opt_static_server=$opt_static_perl=$opt_sur=$opt_with_small_disk=$opt_local_perl=$opt_tcpip=$opt_build_thread=$opt_use_old_distribution=$opt_enable_shared=$opt_no_crash_me=$opt_no_strip=$opt_with_archive=$opt_with_cluster=$opt_with_csv=$opt_with_example=$opt_with_debug=$opt_no_benchmark=$opt_no_mysqltest=$opt_without_embedded=$opt_readline=0;
|
||||||
@ -17,6 +17,7 @@ GetOptions(
|
|||||||
"bdb",
|
"bdb",
|
||||||
"build-thread=i",
|
"build-thread=i",
|
||||||
"bundled-zlib",
|
"bundled-zlib",
|
||||||
|
"comment=s",
|
||||||
"config-env=s" => \@config_env,
|
"config-env=s" => \@config_env,
|
||||||
"config-extra-env=s" => \@config_extra_env,
|
"config-extra-env=s" => \@config_extra_env,
|
||||||
"config-options=s" => \@config_options,
|
"config-options=s" => \@config_options,
|
||||||
@ -110,6 +111,7 @@ $log="$pwd/Logs/$host-$major.$minor$opt_version_suffix.log";
|
|||||||
$opt_distribution =~ /(mysql[^\/]*)\.tar/;
|
$opt_distribution =~ /(mysql[^\/]*)\.tar/;
|
||||||
$ver=$1;
|
$ver=$1;
|
||||||
$gcc_version=which("gcc");
|
$gcc_version=which("gcc");
|
||||||
|
$opt_comment= "Official MySQL$opt_version_suffix binary" unless $opt_comment;
|
||||||
if (defined($gcc_version) && ! $opt_config_env)
|
if (defined($gcc_version) && ! $opt_config_env)
|
||||||
{
|
{
|
||||||
$tmp=`$gcc_version -v 2>&1`;
|
$tmp=`$gcc_version -v 2>&1`;
|
||||||
@ -303,7 +305,7 @@ if ($opt_stage <= 1)
|
|||||||
}
|
}
|
||||||
|
|
||||||
$prefix="/usr/local/mysql";
|
$prefix="/usr/local/mysql";
|
||||||
check_system("$opt_config_env ./configure --prefix=$prefix --localstatedir=$prefix/data --libexecdir=$prefix/bin --with-comment=\"Official MySQL$opt_version_suffix binary\" --with-extra-charsets=complex --with-server-suffix=\"$opt_version_suffix\" --enable-thread-safe-client --enable-local-infile $opt_config_options","Thank you for choosing MySQL");
|
check_system("$opt_config_env ./configure --prefix=$prefix --localstatedir=$prefix/data --libexecdir=$prefix/bin --with-comment=\"$opt_comment\" --with-extra-charsets=complex --with-server-suffix=\"$opt_version_suffix\" --enable-thread-safe-client --enable-local-infile $opt_config_options","Thank you for choosing MySQL");
|
||||||
if (-d "$pwd/$host/include-mysql")
|
if (-d "$pwd/$host/include-mysql")
|
||||||
{
|
{
|
||||||
safe_system("cp -r $pwd/$host/include-mysql/* $pwd/$host/$ver/include");
|
safe_system("cp -r $pwd/$host/include-mysql/* $pwd/$host/$ver/include");
|
||||||
@ -530,6 +532,10 @@ When running several Do-compile runs in parallel, each build
|
|||||||
should have its own thread ID, so running the test suites
|
should have its own thread ID, so running the test suites
|
||||||
does not cause conflicts with duplicate TCP port numbers.
|
does not cause conflicts with duplicate TCP port numbers.
|
||||||
|
|
||||||
|
--comment=<comment>
|
||||||
|
Replace the default compilation comment that is embedded into
|
||||||
|
the mysqld binary.
|
||||||
|
|
||||||
--config-env=<environment for configure>
|
--config-env=<environment for configure>
|
||||||
To set up the environment, like 'CC=cc CXX=gcc CXXFLAGS=-O3'
|
To set up the environment, like 'CC=cc CXX=gcc CXXFLAGS=-O3'
|
||||||
|
|
||||||
@ -684,16 +690,20 @@ sub abort
|
|||||||
|
|
||||||
if ($opt_user)
|
if ($opt_user)
|
||||||
{
|
{
|
||||||
$mail_header_file="$opt_tmp/do-command.$$";
|
# Take the last 40 lines of the build log
|
||||||
open(TMP,">$mail_header_file");
|
open(LOG, "$log") or die $!;
|
||||||
|
my @log= <LOG>;
|
||||||
|
close LOG;
|
||||||
|
splice @log => 0, -40;
|
||||||
|
my $mail_file="$opt_tmp/do-command.$$";
|
||||||
|
open(TMP,">$mail_file") or die $!;
|
||||||
print TMP "From: mysqldev\@$full_host_name\n";
|
print TMP "From: mysqldev\@$full_host_name\n";
|
||||||
print TMP "To: $email\n";
|
print TMP "To: $email\n";
|
||||||
print TMP "Subject: $host($uname): $ver$opt_version_suffix compilation failed\n\n";
|
print TMP "Subject: $host($uname): $ver$opt_version_suffix compilation failed\n\n";
|
||||||
|
print TMP @log;
|
||||||
close TMP;
|
close TMP;
|
||||||
system("tail -n 40 $log > $log.mail");
|
system("$sendmail -t -f $email < $mail_file");
|
||||||
system("cat $mail_header_file $log.mail | $sendmail -t -f $email");
|
unlink($mail_file);
|
||||||
unlink($mail_header_file);
|
|
||||||
unlink("$log.mail");
|
|
||||||
}
|
}
|
||||||
exit 1;
|
exit 1;
|
||||||
}
|
}
|
||||||
|
183
Build-tools/Do-solaris-pkg
Normal file
183
Build-tools/Do-solaris-pkg
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
#
|
||||||
|
# Script to create Solaris packages
|
||||||
|
#
|
||||||
|
$INTERACTIVE= 0;
|
||||||
|
chomp ($hostname= `hostname`);
|
||||||
|
$find = "/usr/bin/find";
|
||||||
|
$pkgproto = "/usr/bin/pkgproto";
|
||||||
|
$pkgmk = "/usr/bin/pkgmk -o";
|
||||||
|
$pkgtrans = "/usr/bin/pkgtrans";
|
||||||
|
$temp = "/tmp/prototype$$";
|
||||||
|
$prototype = "prototype";
|
||||||
|
$pkginfo = "pkginfo";
|
||||||
|
($gid ,$pkg ,$uid ,$userInfo ,$email ,$quota ,$group ,$passwd
|
||||||
|
,$category ,$userHome ,$vendor ,$loginShell ,$pstamp ,$basedir)=();
|
||||||
|
|
||||||
|
$fullname = shift @ARGV;
|
||||||
|
$fullname or die "No package name was specified";
|
||||||
|
-d $fullname or die "That directory is not present!";
|
||||||
|
|
||||||
|
$fullname =~ s,/+$,,; # Remove ending slash if any
|
||||||
|
|
||||||
|
$pkgdir= `cd ../$hostname; pwd`;
|
||||||
|
$pwd = `pwd`;
|
||||||
|
if ($pwd =~ '\/usr\/local') {
|
||||||
|
$pwd = $`;
|
||||||
|
}
|
||||||
|
die "Wrong location, please cd to <PKGBASE>/usr/local/ and run again.\n"
|
||||||
|
if ($pwd eq "");
|
||||||
|
|
||||||
|
system ("$find . -print | $pkgproto > $temp");
|
||||||
|
open (PREPROTO,"<$temp") or die "Unable to read prototype information ($!)\n";
|
||||||
|
open (PROTO,">$prototype") or die "Unable to write file prototype ($!)\n";
|
||||||
|
print PROTO "i pkginfo=./$pkginfo\n";
|
||||||
|
while (<PREPROTO>) {
|
||||||
|
# Read the prototype information from /tmp/prototype$$
|
||||||
|
chomp;
|
||||||
|
$thisline = $_;
|
||||||
|
if ($thisline =~ " prototype "
|
||||||
|
or $thisline =~ " pkginfo ") {
|
||||||
|
# We don't need that line
|
||||||
|
} elsif ($thisline =~ "^[fd] ") {
|
||||||
|
# Change the ownership for files and directories
|
||||||
|
($dir, $none, $file, $mode, $user, $group) = split / /,$thisline;
|
||||||
|
print PROTO "$dir $none $file $mode bin bin\n";
|
||||||
|
} else {
|
||||||
|
# Symlinks and other stuff should be printed as well ofcourse
|
||||||
|
print PROTO "$thisline\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close PROTO;
|
||||||
|
close PREPROTO;
|
||||||
|
|
||||||
|
# Clean up
|
||||||
|
unlink $temp or warn "Unable to remove tempfile ($!)\n";
|
||||||
|
|
||||||
|
# Now we can start building the package
|
||||||
|
#
|
||||||
|
# First get some info
|
||||||
|
|
||||||
|
$fullname =~ /^((mysql)-.+)-([\d\.]+)-.+$/
|
||||||
|
or die "This name is not what I expected - \"$fullname\"";
|
||||||
|
|
||||||
|
$default{"name"}= $2;
|
||||||
|
$default{"version"}= $3;
|
||||||
|
$default{"pkg"}= $1;
|
||||||
|
$default{"arch"} = `uname -m`;
|
||||||
|
chomp $default{"arch"};
|
||||||
|
$default{"category"}= "application";
|
||||||
|
$default{"vendor"}= "MySQL AB";
|
||||||
|
$default{"email"}= "build\@mysql.com";
|
||||||
|
$default{"pstamp"}= "MySQL AB Build Engineers";
|
||||||
|
$os = `uname -r`;
|
||||||
|
$os =~ '\.';
|
||||||
|
$os = "sol$'";
|
||||||
|
chomp $os;
|
||||||
|
$default{"basedir"}= "/usr/local";
|
||||||
|
$default{"packagename"}= "${fullname}.pkg";
|
||||||
|
|
||||||
|
# Check for correctness of guessed values by userinput
|
||||||
|
|
||||||
|
%questions = (
|
||||||
|
pkg => "Please give the name for this package",
|
||||||
|
name => "Now enter the real name for this package",
|
||||||
|
arch => "What architecture did you build the package on?",
|
||||||
|
version => "Enter the version number of the package",
|
||||||
|
category => "What category does this package belong to?",
|
||||||
|
vendor => "Who is the vendor of this package?",
|
||||||
|
email => "Enter the email adress for contact",
|
||||||
|
pstamp => "Enter your own name",
|
||||||
|
basedir => "What is the basedir this package will install into?",
|
||||||
|
packagename => "How should I call the packagefile?",
|
||||||
|
);
|
||||||
|
|
||||||
|
@vars = qw(pkg name arch version category vendor email pstamp basedir
|
||||||
|
packagename);
|
||||||
|
foreach $varname (@vars) {
|
||||||
|
getvar_noq($varname);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($INTERACTIVE) {
|
||||||
|
while (!&chkvar()) {
|
||||||
|
print "\n";
|
||||||
|
foreach $varname (@vars) {
|
||||||
|
getvar($varname);
|
||||||
|
}
|
||||||
|
@vars = qw(pkg name arch version category vendor email pstamp basedir
|
||||||
|
packagename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$classes = "none";
|
||||||
|
|
||||||
|
# Create the pkginfo file
|
||||||
|
|
||||||
|
print "\nNow creating $pkginfo file\n";
|
||||||
|
open (PKGINFO,">$pkginfo") || die "Unable to open $pkginfo for writing ($!)\n";
|
||||||
|
print PKGINFO "PKG=\"$pkg\"\n";
|
||||||
|
print PKGINFO "NAME=\"$name\"\n";
|
||||||
|
print PKGINFO "ARCH=\"$arch\"\n";
|
||||||
|
print PKGINFO "VERSION=\"$version\"\n";
|
||||||
|
print PKGINFO "CATEGORY=\"$category\"\n";
|
||||||
|
print PKGINFO "VENDOR=\"$vendor\"\n";
|
||||||
|
print PKGINFO "EMAIL=\"$email\"\n";
|
||||||
|
print PKGINFO "PSTAMP=\"$pstamp\"\n";
|
||||||
|
print PKGINFO "BASEDIR=\"$basedir\"\n";
|
||||||
|
print PKGINFO "CLASSES=\"$classes\"\n";
|
||||||
|
close PKGINFO;
|
||||||
|
print "Done.\n";
|
||||||
|
|
||||||
|
# Build and zip the package
|
||||||
|
|
||||||
|
print "Building package\n";
|
||||||
|
system ("$pkgmk -r `pwd`");
|
||||||
|
system ("(cd /var/spool/pkg; $pkgtrans -s -o `pwd` /tmp/$packagename $pkg)");
|
||||||
|
system ("gzip /tmp/$packagename");
|
||||||
|
|
||||||
|
# Clean-up the spool area
|
||||||
|
system ("(cd /var/spool/pkg; rm -rf $pkg)");
|
||||||
|
# Clean-up the ~/packaging/ area
|
||||||
|
system ("(rm -rf mysql*)");
|
||||||
|
unlink $pkginfo;
|
||||||
|
unlink $prototype;
|
||||||
|
system ("mv /tmp/${packagename}.gz $pkgdir");
|
||||||
|
print "Done. (~/$hostname/$packagename.gz)\n";
|
||||||
|
# The subroutines
|
||||||
|
sub chkvar {
|
||||||
|
print "\n";
|
||||||
|
|
||||||
|
print "PKG=$pkg\n";
|
||||||
|
print "NAME=$name\n";
|
||||||
|
print "ARCH=$arch\n";
|
||||||
|
print "VERSION=$version\n";
|
||||||
|
print "CATEGORY=$category\n";
|
||||||
|
print "VENDOR=$vendor\n";
|
||||||
|
print "EMAIL=$email\n";
|
||||||
|
print "PSTAMP=$pstamp\n";
|
||||||
|
print "BASEDIR=$basedir\n";
|
||||||
|
print "PACKAGENAME=$packagename\n";
|
||||||
|
|
||||||
|
|
||||||
|
print "\nIs this information correct? [Y/n]: ";
|
||||||
|
my $answer= <STDIN>;
|
||||||
|
chomp $answer;
|
||||||
|
$answer= 'Y' if ($answer eq "");
|
||||||
|
$answer= uc $answer;
|
||||||
|
my $res= ($answer eq 'Y')? 1 : 0;
|
||||||
|
return($res);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub getvar_noq {
|
||||||
|
my $questionname = "@_";
|
||||||
|
$$questionname = $default{$questionname};
|
||||||
|
}
|
||||||
|
|
||||||
|
sub getvar {
|
||||||
|
my $questionname = "@_";
|
||||||
|
my $ucquestionname= uc $questionname;
|
||||||
|
print "$ucquestionname: $questions{$questionname} [$default{\"$questionname\"}]: ";
|
||||||
|
my $answer = <STDIN>;
|
||||||
|
chomp $answer;
|
||||||
|
$$questionname = $answer;
|
||||||
|
$$questionname = $default{$questionname} if ($$questionname eq "");
|
||||||
|
}
|
21
acinclude.m4
21
acinclude.m4
@ -194,6 +194,8 @@ dnl Define zlib paths to point at bundled zlib
|
|||||||
AC_DEFUN([MYSQL_USE_BUNDLED_ZLIB], [
|
AC_DEFUN([MYSQL_USE_BUNDLED_ZLIB], [
|
||||||
ZLIB_INCLUDES="-I\$(top_srcdir)/zlib"
|
ZLIB_INCLUDES="-I\$(top_srcdir)/zlib"
|
||||||
ZLIB_LIBS="\$(top_builddir)/zlib/libz.la"
|
ZLIB_LIBS="\$(top_builddir)/zlib/libz.la"
|
||||||
|
dnl Omit -L$pkglibdir as it's always in the list of mysql_config deps.
|
||||||
|
ZLIB_DEPS="-lz"
|
||||||
zlib_dir="zlib"
|
zlib_dir="zlib"
|
||||||
AC_SUBST([zlib_dir])
|
AC_SUBST([zlib_dir])
|
||||||
mysql_cv_compress="yes"
|
mysql_cv_compress="yes"
|
||||||
@ -235,8 +237,13 @@ dnl $prefix/lib. If zlib headers or binaries weren't found at $prefix, the
|
|||||||
dnl macro bails out with error.
|
dnl macro bails out with error.
|
||||||
dnl
|
dnl
|
||||||
dnl If the library was found, this function #defines HAVE_COMPRESS
|
dnl If the library was found, this function #defines HAVE_COMPRESS
|
||||||
dnl and configure variables ZLIB_INCLUDES (i.e. -I/path/to/zlib/include) and
|
dnl and configure variables ZLIB_INCLUDES (i.e. -I/path/to/zlib/include),
|
||||||
dnl ZLIB_LIBS (i. e. -L/path/to/zlib/lib -lz).
|
dnl ZLIB_LIBS (i. e. -L/path/to/zlib/lib -lz) and ZLIB_DEPS which is
|
||||||
|
dnl used in mysql_config and is always the same as ZLIB_LIBS except to
|
||||||
|
dnl when we use the bundled zlib. In the latter case ZLIB_LIBS points to the
|
||||||
|
dnl build dir ($top_builddir/zlib), while mysql_config must point to the
|
||||||
|
dnl installation dir ($pkglibdir), so ZLIB_DEPS is set to point to
|
||||||
|
dnl $pkglibdir.
|
||||||
|
|
||||||
AC_DEFUN([MYSQL_CHECK_ZLIB_WITH_COMPRESS], [
|
AC_DEFUN([MYSQL_CHECK_ZLIB_WITH_COMPRESS], [
|
||||||
AC_MSG_CHECKING([for zlib compression library])
|
AC_MSG_CHECKING([for zlib compression library])
|
||||||
@ -285,7 +292,11 @@ case $SYSTEM_TYPE in
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
if test "$mysql_cv_compress" = "yes"; then
|
if test "$mysql_cv_compress" = "yes"; then
|
||||||
|
if test "x$ZLIB_DEPS" = "x"; then
|
||||||
|
ZLIB_DEPS="$ZLIB_LIBS"
|
||||||
|
fi
|
||||||
AC_SUBST([ZLIB_LIBS])
|
AC_SUBST([ZLIB_LIBS])
|
||||||
|
AC_SUBST([ZLIB_DEPS])
|
||||||
AC_SUBST([ZLIB_INCLUDES])
|
AC_SUBST([ZLIB_INCLUDES])
|
||||||
AC_DEFINE([HAVE_COMPRESS], [1], [Define to enable compression support])
|
AC_DEFINE([HAVE_COMPRESS], [1], [Define to enable compression support])
|
||||||
fi
|
fi
|
||||||
@ -1039,7 +1050,6 @@ AC_MSG_CHECKING(for OpenSSL)
|
|||||||
echo "You can't use the --all-static link option when using openssl."
|
echo "You can't use the --all-static link option when using openssl."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
NON_THREADED_CLIENT_LIBS="$NON_THREADED_CLIENT_LIBS $openssl_libs"
|
|
||||||
else
|
else
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
if test ! -z "$openssl_includes"
|
if test ! -z "$openssl_includes"
|
||||||
@ -1624,6 +1634,11 @@ AC_DEFUN([MYSQL_CHECK_NDB_OPTIONS], [
|
|||||||
--without-ndb-debug Disable special ndb debug features],
|
--without-ndb-debug Disable special ndb debug features],
|
||||||
[ndb_debug="$withval"],
|
[ndb_debug="$withval"],
|
||||||
[ndb_debug="default"])
|
[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_CHECKING([for NDB Cluster options])
|
||||||
AC_MSG_RESULT([])
|
AC_MSG_RESULT([])
|
||||||
|
@ -1008,6 +1008,7 @@ static void usage(void)
|
|||||||
print_defaults("my",load_default_groups);
|
print_defaults("my",load_default_groups);
|
||||||
puts("\nWhere command is a one or more of: (Commands may be shortened)\n\
|
puts("\nWhere command is a one or more of: (Commands may be shortened)\n\
|
||||||
create databasename Create a new database\n\
|
create databasename Create a new database\n\
|
||||||
|
debug Instruct server to write debug information to log\n\
|
||||||
drop databasename Delete a database and all its tables\n\
|
drop databasename Delete a database and all its tables\n\
|
||||||
extended-status Gives an extended status message from the server\n\
|
extended-status Gives an extended status message from the server\n\
|
||||||
flush-hosts Flush all cached hosts\n\
|
flush-hosts Flush all cached hosts\n\
|
||||||
|
@ -195,7 +195,7 @@ static void usage(void)
|
|||||||
puts("and you are welcome to modify and redistribute it under the GPL license.\n");
|
puts("and you are welcome to modify and redistribute it under the GPL license.\n");
|
||||||
puts("This program can be used to CHECK (-c,-m,-C), REPAIR (-r), ANALYZE (-a)");
|
puts("This program can be used to CHECK (-c,-m,-C), REPAIR (-r), ANALYZE (-a)");
|
||||||
puts("or OPTIMIZE (-o) tables. Some of the options (like -e or -q) can be");
|
puts("or OPTIMIZE (-o) tables. Some of the options (like -e or -q) can be");
|
||||||
puts("used at the same time. It works on MyISAM and in some cases on BDB tables.");
|
puts("used at the same time. Not all options are supported by all storage engines.");
|
||||||
puts("Please consult the MySQL manual for latest information about the");
|
puts("Please consult the MySQL manual for latest information about the");
|
||||||
puts("above. The options -c,-r,-a and -o are exclusive to each other, which");
|
puts("above. The options -c,-r,-a and -o are exclusive to each other, which");
|
||||||
puts("means that the last option will be used, if several was specified.\n");
|
puts("means that the last option will be used, if several was specified.\n");
|
||||||
|
@ -2091,6 +2091,7 @@ static int dump_all_tables_in_db(char *database)
|
|||||||
RETURN
|
RETURN
|
||||||
void
|
void
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void get_actual_table_name(const char *old_table_name,
|
static void get_actual_table_name(const char *old_table_name,
|
||||||
char *new_table_name,
|
char *new_table_name,
|
||||||
int buf_size)
|
int buf_size)
|
||||||
@ -2098,7 +2099,6 @@ static void get_actual_table_name( const char *old_table_name,
|
|||||||
MYSQL_RES *tableRes;
|
MYSQL_RES *tableRes;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
char query[ NAME_LEN + 50 ];
|
char query[ NAME_LEN + 50 ];
|
||||||
|
|
||||||
DBUG_ENTER("get_actual_table_name");
|
DBUG_ENTER("get_actual_table_name");
|
||||||
|
|
||||||
sprintf( query, "SHOW TABLES LIKE '%s'", old_table_name);
|
sprintf( query, "SHOW TABLES LIKE '%s'", old_table_name);
|
||||||
@ -2109,9 +2109,9 @@ static void get_actual_table_name( const char *old_table_name,
|
|||||||
|
|
||||||
tableRes= mysql_store_result( sock );
|
tableRes= mysql_store_result( sock );
|
||||||
row= mysql_fetch_row( tableRes );
|
row= mysql_fetch_row( tableRes );
|
||||||
strncpy( new_table_name, row[0], buf_size );
|
strmake(new_table_name, row[0], buf_size-1);
|
||||||
mysql_free_result(tableRes);
|
mysql_free_result(tableRes);
|
||||||
} /* get_actual_table_name */
|
}
|
||||||
|
|
||||||
|
|
||||||
static int dump_selected_tables(char *db, char **table_names, int tables)
|
static int dump_selected_tables(char *db, char **table_names, int tables)
|
||||||
|
29
configure.in
29
configure.in
@ -924,9 +924,11 @@ if test "$ac_cv_header_termio_h" = "no" -a "$ac_cv_header_termios_h" = "no"
|
|||||||
then
|
then
|
||||||
AC_CHECK_FUNC(gtty, , AC_CHECK_LIB(compat, gtty))
|
AC_CHECK_FUNC(gtty, , AC_CHECK_LIB(compat, gtty))
|
||||||
fi
|
fi
|
||||||
# We make a special variable for client library's to avoid including
|
|
||||||
# thread libs in the client.
|
# We make a special variable for non-threaded version of LIBS to avoid
|
||||||
NON_THREADED_CLIENT_LIBS="$LIBS $ZLIB_LIBS"
|
# including thread libs into non-threaded version of MySQL client library.
|
||||||
|
# Later in this script LIBS will be augmented with a threads library.
|
||||||
|
NON_THREADED_LIBS="$LIBS"
|
||||||
|
|
||||||
AC_MSG_CHECKING([for int8])
|
AC_MSG_CHECKING([for int8])
|
||||||
case $SYSTEM_TYPE in
|
case $SYSTEM_TYPE in
|
||||||
@ -1502,7 +1504,7 @@ then
|
|||||||
if test -f /usr/lib/libxnet.so -a "$SYSTEM_TYPE" = "sni-sysv4"
|
if test -f /usr/lib/libxnet.so -a "$SYSTEM_TYPE" = "sni-sysv4"
|
||||||
then
|
then
|
||||||
LIBS="-lxnet $LIBS"
|
LIBS="-lxnet $LIBS"
|
||||||
NON_THREADED_CLIENT_LIBS="$NON_THREADED_CLIENT_LIBS -lxnet"
|
NON_THREADED_LIBS="-lxnet $NON_THREADED_LIBS"
|
||||||
with_named_thread="-Kthread $LDFLAGS -lxnet"
|
with_named_thread="-Kthread $LDFLAGS -lxnet"
|
||||||
LD_FLAGS=""
|
LD_FLAGS=""
|
||||||
CFLAGS="-Kthread $CFLAGS"
|
CFLAGS="-Kthread $CFLAGS"
|
||||||
@ -1677,8 +1679,8 @@ then
|
|||||||
elif test "$with_debug" = "full"
|
elif test "$with_debug" = "full"
|
||||||
then
|
then
|
||||||
# Full debug. Very slow in some cases
|
# Full debug. Very slow in some cases
|
||||||
CFLAGS="$DEBUG_CFLAGS -DDBUG_ON -DSAFE_MUTEX -DSAFEMALLOC $CFLAGS"
|
CFLAGS="$DEBUG_CFLAGS -DDBUG_ON -DSAFE_MUTEX -DSAFEMALLOC -DUNIV_DEBUG $CFLAGS"
|
||||||
CXXFLAGS="$DEBUG_CXXFLAGS -DDBUG_ON -DSAFE_MUTEX -DSAFEMALLOC $CXXFLAGS"
|
CXXFLAGS="$DEBUG_CXXFLAGS -DDBUG_ON -DSAFE_MUTEX -DSAFEMALLOC -DUNIV_DEBUG $CXXFLAGS"
|
||||||
else
|
else
|
||||||
# Optimized version. No debug
|
# Optimized version. No debug
|
||||||
CFLAGS="$OPTIMIZE_CFLAGS -DDBUG_OFF $CFLAGS"
|
CFLAGS="$OPTIMIZE_CFLAGS -DDBUG_OFF $CFLAGS"
|
||||||
@ -2826,7 +2828,7 @@ dnl This probably should be cleaned up more - for now the threaded
|
|||||||
dnl client is just using plain-old libs.
|
dnl client is just using plain-old libs.
|
||||||
sql_client_dirs="libmysql strings regex client"
|
sql_client_dirs="libmysql strings regex client"
|
||||||
linked_client_targets="linked_libmysql_sources"
|
linked_client_targets="linked_libmysql_sources"
|
||||||
CLIENT_LIBS=$NON_THREADED_CLIENT_LIBS
|
|
||||||
if test "$THREAD_SAFE_CLIENT" != "no"
|
if test "$THREAD_SAFE_CLIENT" != "no"
|
||||||
then
|
then
|
||||||
sql_client_dirs="libmysql_r $sql_client_dirs"
|
sql_client_dirs="libmysql_r $sql_client_dirs"
|
||||||
@ -2834,9 +2836,11 @@ then
|
|||||||
AC_DEFINE([THREAD_SAFE_CLIENT], [1], [Should be client be thread safe])
|
AC_DEFINE([THREAD_SAFE_CLIENT], [1], [Should be client be thread safe])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
CLIENT_LIBS="$CLIENT_LIBS $STATIC_NSS_FLAGS"
|
CLIENT_LIBS="$NON_THREADED_LIBS $openssl_libs $ZLIB_LIBS $STATIC_NSS_FLAGS"
|
||||||
|
|
||||||
AC_SUBST(CLIENT_LIBS)
|
AC_SUBST(CLIENT_LIBS)
|
||||||
|
AC_SUBST(NON_THREADED_LIBS)
|
||||||
|
AC_SUBST(STATIC_NSS_FLAGS)
|
||||||
AC_SUBST(sql_client_dirs)
|
AC_SUBST(sql_client_dirs)
|
||||||
AC_SUBST(linked_client_targets)
|
AC_SUBST(linked_client_targets)
|
||||||
|
|
||||||
@ -2954,6 +2958,15 @@ EOF
|
|||||||
AC_CONFIG_SUBDIRS(innobase)
|
AC_CONFIG_SUBDIRS(innobase)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
case $SYSTEM_TYPE-$MACHINE_TYPE-$ac_cv_prog_gcc-$have_ndbcluster in
|
||||||
|
*solaris*-i?86-no-yes)
|
||||||
|
# ndb fail for whatever strange reason to link Sun Forte/x86
|
||||||
|
# unless using incremental linker
|
||||||
|
CXXFLAGS="$CXXFLAGS -xildon"
|
||||||
|
;;
|
||||||
|
*) ;;
|
||||||
|
esac
|
||||||
|
|
||||||
if test X"$have_ndbcluster" = Xyes
|
if test X"$have_ndbcluster" = Xyes
|
||||||
then
|
then
|
||||||
if test X"$mysql_cv_compress" != Xyes
|
if test X"$mysql_cv_compress" != Xyes
|
||||||
|
@ -215,10 +215,12 @@ int main(int argc,char *argv[])
|
|||||||
*/
|
*/
|
||||||
msg= strerror(10000);
|
msg= strerror(10000);
|
||||||
|
|
||||||
/* allocate a buffer for unknown_error since strerror always returns the same pointer
|
/*
|
||||||
on some platforms such as Windows */
|
Allocate a buffer for unknown_error since strerror always returns
|
||||||
|
the same pointer on some platforms such as Windows
|
||||||
|
*/
|
||||||
unknown_error= malloc(strlen(msg)+1);
|
unknown_error= malloc(strlen(msg)+1);
|
||||||
strcpy( unknown_error, msg );
|
strmov(unknown_error, msg);
|
||||||
|
|
||||||
for ( ; argc-- > 0 ; argv++)
|
for ( ; argc-- > 0 ; argv++)
|
||||||
{
|
{
|
||||||
|
@ -62,7 +62,7 @@ void ft_free_stopwords(void);
|
|||||||
#define FT_SORTED 2
|
#define FT_SORTED 2
|
||||||
#define FT_EXPAND 4 /* query expansion */
|
#define FT_EXPAND 4 /* query expansion */
|
||||||
|
|
||||||
FT_INFO *ft_init_search(uint,void *, uint, byte *, uint, byte *);
|
FT_INFO *ft_init_search(uint,void *, uint, byte *, uint,CHARSET_INFO *, byte *);
|
||||||
my_bool ft_boolean_check_syntax_string(const byte *);
|
my_bool ft_boolean_check_syntax_string(const byte *);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -135,7 +135,13 @@
|
|||||||
#ifdef HAVE_UNIXWARE7_THREADS
|
#ifdef HAVE_UNIXWARE7_THREADS
|
||||||
#include <thread.h>
|
#include <thread.h>
|
||||||
#else
|
#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 */
|
#include <pthread.h> /* AIX must have this included first */
|
||||||
|
#endif
|
||||||
#endif /* HAVE_UNIXWARE7_THREADS */
|
#endif /* HAVE_UNIXWARE7_THREADS */
|
||||||
#endif /* HAVE_mit_thread */
|
#endif /* HAVE_mit_thread */
|
||||||
#if !defined(SCO) && !defined(_REENTRANT)
|
#if !defined(SCO) && !defined(_REENTRANT)
|
||||||
|
@ -334,6 +334,17 @@ typedef struct st_mysql_parameters
|
|||||||
*/
|
*/
|
||||||
int STDCALL mysql_server_init(int argc, char **argv, char **groups);
|
int STDCALL mysql_server_init(int argc, char **argv, char **groups);
|
||||||
void STDCALL mysql_server_end(void);
|
void STDCALL mysql_server_end(void);
|
||||||
|
/*
|
||||||
|
mysql_server_init/end need to be called when using libmysqld or
|
||||||
|
libmysqlclient (exactly, mysql_server_init() is called by mysql_init() so
|
||||||
|
you don't need to call it explicitely; but you need to call
|
||||||
|
mysql_server_end() to free memory). The names are a bit misleading
|
||||||
|
(mysql_SERVER* to be used when using libmysqlCLIENT). So we add more general
|
||||||
|
names which suit well whether you're using libmysqld or libmysqlclient. We
|
||||||
|
intend to promote these aliases over the mysql_server* ones.
|
||||||
|
*/
|
||||||
|
#define mysql_library_init mysql_server_init
|
||||||
|
#define mysql_library_end mysql_server_end
|
||||||
|
|
||||||
MYSQL_PARAMETERS *STDCALL mysql_get_parameters(void);
|
MYSQL_PARAMETERS *STDCALL mysql_get_parameters(void);
|
||||||
|
|
||||||
|
@ -80,10 +80,6 @@ memory is read outside the allocated blocks. */
|
|||||||
|
|
||||||
/* Make a non-inline debug version */
|
/* Make a non-inline debug version */
|
||||||
|
|
||||||
#ifdef DBUG_ON
|
|
||||||
#define UNIV_DEBUG
|
|
||||||
#endif /* DBUG_ON */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
#define UNIV_DEBUG
|
#define UNIV_DEBUG
|
||||||
#define UNIV_MEM_DEBUG
|
#define UNIV_MEM_DEBUG
|
||||||
|
@ -365,6 +365,7 @@ static void _ftb_init_index_search(FT_INFO *ftb)
|
|||||||
reset_tree(& ftb->no_dupes);
|
reset_tree(& ftb->no_dupes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ftbw->off=0; /* in case of reinit */
|
||||||
if (_ft2_search(ftb, ftbw, 1))
|
if (_ft2_search(ftb, ftbw, 1))
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -373,7 +374,7 @@ static void _ftb_init_index_search(FT_INFO *ftb)
|
|||||||
|
|
||||||
|
|
||||||
FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query,
|
FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query,
|
||||||
uint query_len)
|
uint query_len, CHARSET_INFO *cs)
|
||||||
{
|
{
|
||||||
FTB *ftb;
|
FTB *ftb;
|
||||||
FTB_EXPR *ftbe;
|
FTB_EXPR *ftbe;
|
||||||
@ -385,8 +386,8 @@ FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query,
|
|||||||
ftb->state=UNINITIALIZED;
|
ftb->state=UNINITIALIZED;
|
||||||
ftb->info=info;
|
ftb->info=info;
|
||||||
ftb->keynr=keynr;
|
ftb->keynr=keynr;
|
||||||
ftb->charset= ((keynr==NO_SUCH_KEY) ?
|
ftb->charset=cs;
|
||||||
default_charset_info : info->s->keyinfo[keynr].seg->charset);
|
DBUG_ASSERT(keynr==NO_SUCH_KEY || cs == info->s->keyinfo[keynr].seg->charset);
|
||||||
ftb->with_scan=0;
|
ftb->with_scan=0;
|
||||||
ftb->lastpos=HA_OFFSET_ERROR;
|
ftb->lastpos=HA_OFFSET_ERROR;
|
||||||
bzero(& ftb->no_dupes, sizeof(TREE));
|
bzero(& ftb->no_dupes, sizeof(TREE));
|
||||||
|
@ -55,11 +55,12 @@ const struct _ft_vft _ft_vft_boolean = {
|
|||||||
|
|
||||||
|
|
||||||
FT_INFO *ft_init_search(uint flags, void *info, uint keynr,
|
FT_INFO *ft_init_search(uint flags, void *info, uint keynr,
|
||||||
byte *query, uint query_len, byte *record)
|
byte *query, uint query_len, CHARSET_INFO *cs,
|
||||||
|
byte *record)
|
||||||
{
|
{
|
||||||
FT_INFO *res;
|
FT_INFO *res;
|
||||||
if (flags & FT_BOOL)
|
if (flags & FT_BOOL)
|
||||||
res= ft_init_boolean_search((MI_INFO *)info, keynr, query, query_len);
|
res= ft_init_boolean_search((MI_INFO *)info, keynr, query, query_len,cs);
|
||||||
else
|
else
|
||||||
res= ft_init_nlq_search((MI_INFO *)info, keynr, query, query_len, flags,
|
res= ft_init_nlq_search((MI_INFO *)info, keynr, query, query_len, flags,
|
||||||
record);
|
record);
|
||||||
|
@ -131,7 +131,7 @@ FT_WORD * _mi_ft_parserecord(MI_INFO *, uint, const byte *);
|
|||||||
uint _mi_ft_parse(TREE *, MI_INFO *, uint, const byte *, my_bool);
|
uint _mi_ft_parse(TREE *, MI_INFO *, uint, const byte *, my_bool);
|
||||||
|
|
||||||
FT_INFO *ft_init_nlq_search(MI_INFO *, uint, byte *, uint, uint, byte *);
|
FT_INFO *ft_init_nlq_search(MI_INFO *, uint, byte *, uint, uint, byte *);
|
||||||
FT_INFO *ft_init_boolean_search(MI_INFO *, uint, byte *, uint);
|
FT_INFO *ft_init_boolean_search(MI_INFO *, uint, byte *, uint, CHARSET_INFO *);
|
||||||
|
|
||||||
extern const struct _ft_vft _ft_vft_nlq;
|
extern const struct _ft_vft _ft_vft_nlq;
|
||||||
int ft_nlq_read_next(FT_INFO *, char *);
|
int ft_nlq_read_next(FT_INFO *, char *);
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
--exec test x$NDB_STATUS_OK = x1
|
||||||
-- require r/have_ndb.require
|
-- require r/have_ndb.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show variables like "have_ndbcluster";
|
show variables like "have_ndbcluster";
|
||||||
|
270
mysql-test/lib/mtr_cases.pl
Normal file
270
mysql-test/lib/mtr_cases.pl
Normal file
@ -0,0 +1,270 @@
|
|||||||
|
# -*- cperl -*-
|
||||||
|
|
||||||
|
# This is a library file used by the Perl version of mysql-test-run,
|
||||||
|
# and is part of the translation of the Bourne shell script with the
|
||||||
|
# same name.
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
sub collect_test_cases ($);
|
||||||
|
sub collect_one_test_case ($$$$$);
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# 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 $cases = []; # Array of hash, will be array of C struct
|
||||||
|
|
||||||
|
opendir(TESTDIR, $testdir) or mtr_error("Can't open dir \"$testdir\": $!");
|
||||||
|
|
||||||
|
if ( @::opt_cases )
|
||||||
|
{
|
||||||
|
foreach my $tname ( @::opt_cases ) { # Run in specified order, no sort
|
||||||
|
my $elem= "$tname.test";
|
||||||
|
if ( ! -f "$testdir/$elem")
|
||||||
|
{
|
||||||
|
mtr_error("Test case $tname ($testdir/$elem) is not found");
|
||||||
|
}
|
||||||
|
collect_one_test_case($testdir,$resdir,$tname,$elem,$cases);
|
||||||
|
}
|
||||||
|
closedir TESTDIR;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
|
||||||
|
collect_one_test_case($testdir,$resdir,$tname,$elem,$cases);
|
||||||
|
}
|
||||||
|
closedir TESTDIR;
|
||||||
|
}
|
||||||
|
|
||||||
|
# To speed things up, we sort first in if the test require a restart
|
||||||
|
# or not, second in alphanumeric order.
|
||||||
|
|
||||||
|
# @$cases = sort {
|
||||||
|
# if ( $a->{'master_restart'} and $b->{'master_restart'} or
|
||||||
|
# ! $a->{'master_restart'} and ! $b->{'master_restart'} )
|
||||||
|
# {
|
||||||
|
# return $a->{'name'} cmp $b->{'name'};
|
||||||
|
# }
|
||||||
|
# if ( $a->{'master_restart'} )
|
||||||
|
# {
|
||||||
|
# return 1; # Is greater
|
||||||
|
# }
|
||||||
|
# else
|
||||||
|
# {
|
||||||
|
# return -1; # Is less
|
||||||
|
# }
|
||||||
|
# } @$cases;
|
||||||
|
|
||||||
|
return $cases;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Collect information about a single test case
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
|
||||||
|
sub collect_one_test_case($$$$$) {
|
||||||
|
my $testdir= shift;
|
||||||
|
my $resdir= shift;
|
||||||
|
my $tname= shift;
|
||||||
|
my $elem= shift;
|
||||||
|
my $cases= shift;
|
||||||
|
|
||||||
|
my $path= "$testdir/$elem";
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
# Skip some tests silently
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( $::opt_start_from and $tname lt $::opt_start_from )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
# Skip some tests but include in list, just mark them to skip
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
my $tinfo= {};
|
||||||
|
$tinfo->{'name'}= $tname;
|
||||||
|
$tinfo->{'result_file'}= "$resdir/$tname.result";
|
||||||
|
push(@$cases, $tinfo);
|
||||||
|
|
||||||
|
if ( $::opt_skip_test and defined mtr_match_prefix($tname,$::opt_skip_test) )
|
||||||
|
{
|
||||||
|
$tinfo->{'skip'}= 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 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;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
# 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;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$tinfo->{'slave_num'}= 1; # Default, use one slave
|
||||||
|
|
||||||
|
# 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; # Not 3 ? Check old code, strange
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# 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";
|
||||||
|
my $disabled= "$testdir/$tname.disabled";
|
||||||
|
|
||||||
|
$tinfo->{'master_opt'}= [];
|
||||||
|
$tinfo->{'slave_opt'}= [];
|
||||||
|
$tinfo->{'slave_mi'}= [];
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( -f $disabled )
|
||||||
|
{
|
||||||
|
$tinfo->{'skip'}= 1;
|
||||||
|
$tinfo->{'disable'}= 1; # Sub type of 'skip'
|
||||||
|
$tinfo->{'comment'}= mtr_fromfile($disabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
# 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
@ -8,6 +8,7 @@ use strict;
|
|||||||
|
|
||||||
sub mtr_get_pid_from_file ($);
|
sub mtr_get_pid_from_file ($);
|
||||||
sub mtr_get_opts_from_file ($);
|
sub mtr_get_opts_from_file ($);
|
||||||
|
sub mtr_fromfile ($);
|
||||||
sub mtr_tofile ($@);
|
sub mtr_tofile ($@);
|
||||||
sub mtr_tonewfile($@);
|
sub mtr_tonewfile($@);
|
||||||
|
|
||||||
@ -107,6 +108,8 @@ sub mtr_fromfile ($) {
|
|||||||
open(FILE,"<",$file) or mtr_error("can't open file \"$file\": $!");
|
open(FILE,"<",$file) or mtr_error("can't open file \"$file\": $!");
|
||||||
my $text= join('', <FILE>);
|
my $text= join('', <FILE>);
|
||||||
close FILE;
|
close FILE;
|
||||||
|
$text =~ s/^\s+//; # Remove starting space, incl newlines
|
||||||
|
$text =~ s/\s+$//; # Remove ending space, incl newlines
|
||||||
return $text;
|
return $text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,14 +5,19 @@
|
|||||||
# same name.
|
# same name.
|
||||||
|
|
||||||
#use Carp qw(cluck);
|
#use Carp qw(cluck);
|
||||||
|
use Socket;
|
||||||
|
use Errno;
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
use POSIX ":sys_wait_h";
|
#use POSIX ":sys_wait_h";
|
||||||
|
use POSIX 'WNOHANG';
|
||||||
|
|
||||||
sub mtr_run ($$$$$$);
|
sub mtr_run ($$$$$$);
|
||||||
sub mtr_spawn ($$$$$$);
|
sub mtr_spawn ($$$$$$);
|
||||||
sub mtr_stop_mysqld_servers ($$);
|
sub mtr_stop_mysqld_servers ($);
|
||||||
sub mtr_kill_leftovers ();
|
sub mtr_kill_leftovers ();
|
||||||
|
sub mtr_record_dead_children ();
|
||||||
|
sub sleep_until_file_created ($$$);
|
||||||
|
|
||||||
# static in C
|
# static in C
|
||||||
sub spawn_impl ($$$$$$$);
|
sub spawn_impl ($$$$$$$);
|
||||||
@ -34,7 +39,18 @@ sub mtr_run ($$$$$$) {
|
|||||||
my $error= shift;
|
my $error= shift;
|
||||||
my $pid_file= 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 ($$$$$$) {
|
sub mtr_spawn ($$$$$$) {
|
||||||
@ -45,7 +61,7 @@ sub mtr_spawn ($$$$$$) {
|
|||||||
my $error= shift;
|
my $error= shift;
|
||||||
my $pid_file= 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 ($$$$$$$) {
|
sub spawn_impl ($$$$$$$) {
|
||||||
my $path= shift;
|
my $path= shift;
|
||||||
my $arg_list_t= shift;
|
my $arg_list_t= shift;
|
||||||
my $join= shift;
|
my $mode= shift;
|
||||||
my $input= shift;
|
my $input= shift;
|
||||||
my $output= shift;
|
my $output= shift;
|
||||||
my $error= shift;
|
my $error= shift;
|
||||||
@ -71,55 +87,31 @@ sub spawn_impl ($$$$$$$) {
|
|||||||
print STDERR "#### ", "STDIN $input\n" if $input;
|
print STDERR "#### ", "STDIN $input\n" if $input;
|
||||||
print STDERR "#### ", "STDOUT $output\n" if $output;
|
print STDERR "#### ", "STDOUT $output\n" if $output;
|
||||||
print STDERR "#### ", "STDERR $error\n" if $error;
|
print STDERR "#### ", "STDERR $error\n" if $error;
|
||||||
if ( $join )
|
print STDERR "#### ", "$mode : $path ", join(" ",@$arg_list_t), "\n";
|
||||||
{
|
|
||||||
print STDERR "#### ", "RUN ";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
print STDERR "#### ", "SPAWN ";
|
|
||||||
}
|
|
||||||
print STDERR "$path ", join(" ",@$arg_list_t), "\n";
|
|
||||||
print STDERR "#### ", "-" x 78, "\n";
|
print STDERR "#### ", "-" x 78, "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FORK:
|
||||||
|
{
|
||||||
my $pid= fork();
|
my $pid= fork();
|
||||||
|
|
||||||
if ( ! defined $pid )
|
if ( ! defined $pid )
|
||||||
|
{
|
||||||
|
if ( $! == $!{EAGAIN} ) # See "perldoc Errno"
|
||||||
|
{
|
||||||
|
mtr_debug("Got EAGAIN from fork(), sleep 1 second and redo");
|
||||||
|
sleep(1);
|
||||||
|
redo FORK;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
mtr_error("$path ($pid) can't be forked");
|
mtr_error("$path ($pid) can't be forked");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ( $pid )
|
if ( $pid )
|
||||||
{
|
{
|
||||||
# Parent, i.e. the main script
|
spawn_parent_impl($pid,$mode,$path);
|
||||||
if ( $join )
|
|
||||||
{
|
|
||||||
# We run a command and wait for the result
|
|
||||||
# FIXME this need to be improved
|
|
||||||
my $res= waitpid($pid,0);
|
|
||||||
|
|
||||||
if ( $res == -1 )
|
|
||||||
{
|
|
||||||
mtr_error("$path ($pid) got lost somehow");
|
|
||||||
}
|
|
||||||
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 )
|
|
||||||
{
|
|
||||||
mtr_error("$path ($pid) dumped core");
|
|
||||||
}
|
|
||||||
return $exit_value;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
# We spawned a process we don't wait for
|
|
||||||
return $pid;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -165,6 +157,121 @@ sub spawn_impl ($$$$$$$) {
|
|||||||
exec($path,@$arg_list_t);
|
exec($path,@$arg_list_t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub spawn_parent_impl {
|
||||||
|
my $pid= shift;
|
||||||
|
my $mode= shift;
|
||||||
|
my $path= shift;
|
||||||
|
|
||||||
|
if ( $mode eq 'run' or $mode eq 'test' )
|
||||||
|
{
|
||||||
|
my $exit_value= -1;
|
||||||
|
my $signal_num= 0;
|
||||||
|
my $dumped_core= 0;
|
||||||
|
|
||||||
|
if ( $mode eq 'run' )
|
||||||
|
{
|
||||||
|
# Simple run of command, we wait for it to return
|
||||||
|
my $ret_pid= waitpid($pid,0);
|
||||||
|
|
||||||
|
if ( $ret_pid <= 0 )
|
||||||
|
{
|
||||||
|
mtr_error("$path ($pid) got lost somehow");
|
||||||
|
}
|
||||||
|
|
||||||
|
$exit_value= $? >> 8;
|
||||||
|
$signal_num= $? & 127;
|
||||||
|
$dumped_core= $? & 128;
|
||||||
|
|
||||||
|
return $exit_value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
# 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 )
|
||||||
|
{
|
||||||
|
# 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 )
|
||||||
|
{
|
||||||
|
# We got termination of mysqltest, we are done
|
||||||
|
$exit_value= $? >> 8;
|
||||||
|
$signal_num= $? & 127;
|
||||||
|
$dumped_core= $? & 128;
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
|
||||||
|
# If one of the mysqld processes died, we want to
|
||||||
|
# mark this, and kill the mysqltest process.
|
||||||
|
|
||||||
|
foreach my $idx (0..1)
|
||||||
|
{
|
||||||
|
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 ( $ret_pid != $pid )
|
||||||
|
{
|
||||||
|
# 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
# We spawned a process we don't wait for
|
||||||
|
return $pid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
#
|
#
|
||||||
@ -172,6 +279,11 @@ sub spawn_impl ($$$$$$$) {
|
|||||||
#
|
#
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
# 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 () {
|
sub mtr_kill_leftovers () {
|
||||||
|
|
||||||
# First, kill all masters and slaves that would conflict with
|
# 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
|
# 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 )
|
if ( -d $rundir )
|
||||||
{
|
{
|
||||||
@ -218,22 +343,32 @@ sub mtr_kill_leftovers () {
|
|||||||
if ( -f $pidfile )
|
if ( -f $pidfile )
|
||||||
{
|
{
|
||||||
my $pid= mtr_get_pid_from_file($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");
|
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);
|
closedir(RUNDIR);
|
||||||
|
|
||||||
start_reap_all();
|
if ( @pids )
|
||||||
|
{
|
||||||
if ( $::glob_cygwin_perl )
|
if ( $::glob_cygwin_perl )
|
||||||
{
|
{
|
||||||
# We have no (easy) way of knowing the Cygwin controlling
|
# We have no (easy) way of knowing the Cygwin controlling
|
||||||
# process, in the PID file we only have the Windows process id.
|
# process, in the PID file we only have the Windows process id.
|
||||||
system("kill -f " . join(" ",@pids)); # Hope for the best....
|
system("kill -f " . join(" ",@pids)); # Hope for the best....
|
||||||
|
mtr_debug("Sleep 5 seconds waiting for processes to die");
|
||||||
|
sleep(5);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -241,170 +376,124 @@ sub mtr_kill_leftovers () {
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
kill(9, @pids);
|
kill(9, @pids);
|
||||||
|
mtr_debug("Sleep 1 second waiting for processes to die");
|
||||||
|
sleep(1) # Wait one second
|
||||||
} while ( $retries-- and kill(0, @pids) );
|
} while ( $retries-- and kill(0, @pids) );
|
||||||
|
|
||||||
if ( kill(0, @pids) )
|
if ( kill(0, @pids) ) # Check if some left
|
||||||
{
|
{
|
||||||
mtr_error("can't kill processes " . join(" ", @pids));
|
# FIXME maybe just mtr_warning() ?
|
||||||
|
mtr_error("can't kill process(es) " . join(" ", @pids));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stop_reap_all();
|
# 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.
|
||||||
|
|
||||||
|
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.
|
# To speed things we kill servers in parallel. The argument is a list
|
||||||
# The argument is a list of 'pidfiles' and 'socketfiles'.
|
# of 'ports', 'pids', '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
|
# FIXME On Cygwin, and maybe some other platforms, $srv->{'pid'} and
|
||||||
# didn't create in this run, i.e. initial cleanup before we start working.
|
# $srv->{'pidfile'} will not be the same PID. We need to try to kill
|
||||||
# If force flag is set, we try to kill all with mysqladmin, and
|
# both I think.
|
||||||
# give up if we have no PIDs.
|
|
||||||
|
|
||||||
# FIXME On some operating systems, $srv->{'pid'} and $srv->{'pidfile'}
|
sub mtr_stop_mysqld_servers ($) {
|
||||||
# will not be the same PID. We need to try to kill both I think.
|
|
||||||
|
|
||||||
sub mtr_stop_mysqld_servers ($$) {
|
|
||||||
my $spec= shift;
|
my $spec= shift;
|
||||||
my $force= shift;
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
# If the process was not started from this file, we got no PID,
|
# First try nice normal shutdown using 'mysqladmin'
|
||||||
# we try to find it in the PID file.
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
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 )
|
foreach my $srv ( @$spec )
|
||||||
{
|
{
|
||||||
if ( ! $srv->{'pid'} and -f $srv->{'pidfile'} )
|
if ( $srv->{'pid'} and (waitpid($srv->{'pid'},&WNOHANG) == $srv->{'pid'}) )
|
||||||
{
|
{
|
||||||
$srv->{'pid'}= mtr_get_pid_from_file($srv->{'pidfile'});
|
$srv->{'pid'}= 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
# 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.
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
my %mysqld_pids;
|
||||||
|
|
||||||
|
foreach my $srv ( @$spec )
|
||||||
|
{
|
||||||
if ( $srv->{'pid'} )
|
if ( $srv->{'pid'} )
|
||||||
{
|
{
|
||||||
$any_pid= 1;
|
$mysqld_pids{$srv->{'pid'}}= 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
# 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'} )
|
||||||
|
{
|
||||||
|
mtr_error("can't remove $srv->{'pidfile'}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# If the processes where started from this script, and we know
|
# ----------------------------------------------------------------------
|
||||||
# no PIDs, then we don't have to do anything.
|
# If the processes where started from this script, and we had no PIDS
|
||||||
|
# then we don't have to do anything.
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
if ( ! $any_pid and ! $force )
|
if ( ! keys %mysqld_pids )
|
||||||
{
|
{
|
||||||
# cluck "This is how we got here!";
|
# cluck "This is how we got here!";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
# First try nice normal shutdown using 'mysqladmin'
|
# 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
|
||||||
start_reap_all(); # Don't require waitpid() of children
|
# that for true Win32 processes, kill(0,$pid) will not return 1.
|
||||||
|
|
||||||
foreach my $srv ( @$spec )
|
|
||||||
{
|
|
||||||
if ( -e $srv->{'sockfile'} or $srv->{'port'} )
|
|
||||||
{
|
|
||||||
# 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, "");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# 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 )
|
|
||||||
{
|
|
||||||
if ( -e $srv->{'sockfile'} or -f $srv->{'pidfile'} )
|
|
||||||
{
|
|
||||||
$pidsockfiles_left++; # Could be that pidfile is left
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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 ( ! $any_pid )
|
|
||||||
{
|
|
||||||
stop_reap_all();
|
|
||||||
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.
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
SIGNAL:
|
SIGNAL:
|
||||||
foreach my $sig (15,9)
|
foreach my $sig (15,9)
|
||||||
{
|
{
|
||||||
my $process_left= 0;
|
my $retries= 10; # 10 seconds
|
||||||
foreach my $srv ( @$spec )
|
kill($sig, keys %mysqld_pids);
|
||||||
|
while ( $retries-- and kill(0, keys %mysqld_pids) )
|
||||||
{
|
{
|
||||||
if ( $srv->{'pid'} and
|
mtr_debug("Sleep 1 second waiting for processes to die");
|
||||||
( -f $srv->{'pidfile'} or kill(0,$srv->{'pid'}) ) )
|
sleep(1) # Wait one second
|
||||||
{
|
|
||||||
$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 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'})
|
foreach my $file ($srv->{'pidfile'}, $srv->{'sockfile'})
|
||||||
{
|
{
|
||||||
unlink($file);
|
# Know it is dead so should be no race, careful anyway
|
||||||
if ( -e $file )
|
if ( -f $file and ! unlink($file) and -f $file )
|
||||||
{
|
{
|
||||||
$errors++;
|
$errors++;
|
||||||
mtr_warning("couldn't delete $file");
|
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
|
||||||
|
|
||||||
# FIXME We just assume they are all dead, we don't know....
|
}
|
||||||
|
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# 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?
|
||||||
|
}
|
||||||
|
|
||||||
|
# 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 {
|
sub start_reap_all {
|
||||||
@ -467,6 +694,32 @@ sub stop_reap_all {
|
|||||||
$SIG{CHLD}= 'DEFAULT';
|
$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
|
# 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 $pidfile= shift;
|
||||||
my $timeout= shift;
|
my $timeout= shift;
|
||||||
|
my $pid= shift;
|
||||||
|
|
||||||
my $loop= $timeout;
|
for ( my $loop= 1; $loop <= $timeout; $loop++ )
|
||||||
while ( $loop-- )
|
|
||||||
{
|
{
|
||||||
if ( -r $pidfile )
|
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);
|
sleep(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! -r $pidfile )
|
return 0;
|
||||||
{
|
|
||||||
mtr_error("No $pidfile was created");
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -10,6 +10,7 @@ sub mtr_report_test_name($);
|
|||||||
sub mtr_report_test_passed($);
|
sub mtr_report_test_passed($);
|
||||||
sub mtr_report_test_failed($);
|
sub mtr_report_test_failed($);
|
||||||
sub mtr_report_test_skipped($);
|
sub mtr_report_test_skipped($);
|
||||||
|
sub mtr_report_test_disabled($);
|
||||||
|
|
||||||
sub mtr_show_failed_diff ($);
|
sub mtr_show_failed_diff ($);
|
||||||
sub mtr_report_stats ($);
|
sub mtr_report_stats ($);
|
||||||
@ -72,8 +73,15 @@ sub mtr_report_test_skipped ($) {
|
|||||||
my $tinfo= shift;
|
my $tinfo= shift;
|
||||||
|
|
||||||
$tinfo->{'result'}= 'MTR_RES_SKIPPED';
|
$tinfo->{'result'}= 'MTR_RES_SKIPPED';
|
||||||
|
if ( $tinfo->{'disable'} )
|
||||||
|
{
|
||||||
|
print "[ disabled ] $tinfo->{'comment'}\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
print "[ skipped ]\n";
|
print "[ skipped ]\n";
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sub mtr_report_test_passed ($) {
|
sub mtr_report_test_passed ($) {
|
||||||
my $tinfo= shift;
|
my $tinfo= shift;
|
||||||
@ -95,10 +103,19 @@ sub mtr_report_test_failed ($) {
|
|||||||
$tinfo->{'result'}= 'MTR_RES_FAILED';
|
$tinfo->{'result'}= 'MTR_RES_FAILED';
|
||||||
print "[ fail ]\n";
|
print "[ fail ]\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 "Errors are (from $::path_timefile) :\n";
|
||||||
print mtr_fromfile($::path_timefile); # FIXME print_file() instead
|
print mtr_fromfile($::path_timefile); # FIXME print_file() instead
|
||||||
print "\n(the last lines may be the most important ones)\n";
|
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 ($) {
|
sub mtr_report_stats ($) {
|
||||||
my $tests= shift;
|
my $tests= shift;
|
||||||
|
@ -84,10 +84,11 @@ use Sys::Hostname;
|
|||||||
#use Carp;
|
#use Carp;
|
||||||
use IO::Socket;
|
use IO::Socket;
|
||||||
use IO::Socket::INET;
|
use IO::Socket::INET;
|
||||||
use Data::Dumper;
|
#use Data::Dumper;
|
||||||
use strict;
|
use strict;
|
||||||
#use diagnostics;
|
#use diagnostics;
|
||||||
|
|
||||||
|
require "lib/mtr_cases.pl";
|
||||||
require "lib/mtr_process.pl";
|
require "lib/mtr_process.pl";
|
||||||
require "lib/mtr_io.pl";
|
require "lib/mtr_io.pl";
|
||||||
require "lib/mtr_gcov.pl";
|
require "lib/mtr_gcov.pl";
|
||||||
@ -165,14 +166,12 @@ our $glob_user= 'test';
|
|||||||
our $glob_use_embedded_server= 0;
|
our $glob_use_embedded_server= 0;
|
||||||
|
|
||||||
our $glob_basedir;
|
our $glob_basedir;
|
||||||
our $glob_do_test;
|
|
||||||
|
|
||||||
# The total result
|
# The total result
|
||||||
|
|
||||||
our $path_charsetsdir;
|
our $path_charsetsdir;
|
||||||
our $path_client_bindir;
|
our $path_client_bindir;
|
||||||
our $path_language;
|
our $path_language;
|
||||||
our $path_tests_bindir;
|
|
||||||
our $path_timefile;
|
our $path_timefile;
|
||||||
our $path_manager_log; # Used by mysqldadmin
|
our $path_manager_log; # Used by mysqldadmin
|
||||||
our $path_slave_load_tmpdir; # What is this?!
|
our $path_slave_load_tmpdir; # What is this?!
|
||||||
@ -192,8 +191,10 @@ our $exe_master_mysqld;
|
|||||||
our $exe_mysql;
|
our $exe_mysql;
|
||||||
our $exe_mysqladmin;
|
our $exe_mysqladmin;
|
||||||
our $exe_mysqlbinlog;
|
our $exe_mysqlbinlog;
|
||||||
|
our $exe_mysql_client_test;
|
||||||
our $exe_mysqld;
|
our $exe_mysqld;
|
||||||
our $exe_mysqldump; # Called from test case
|
our $exe_mysqldump; # Called from test case
|
||||||
|
our $exe_mysql_fix_system_tables;
|
||||||
our $exe_mysqltest;
|
our $exe_mysqltest;
|
||||||
our $exe_slave_mysqld;
|
our $exe_slave_mysqld;
|
||||||
|
|
||||||
@ -208,6 +209,7 @@ our $opt_current_test;
|
|||||||
our $opt_ddd;
|
our $opt_ddd;
|
||||||
our $opt_debug;
|
our $opt_debug;
|
||||||
our $opt_do_test;
|
our $opt_do_test;
|
||||||
|
our @opt_cases; # The test cases names in argv
|
||||||
our $opt_embedded_server;
|
our $opt_embedded_server;
|
||||||
our $opt_extern;
|
our $opt_extern;
|
||||||
our $opt_fast;
|
our $opt_fast;
|
||||||
@ -232,8 +234,6 @@ our $opt_local_master;
|
|||||||
our $master; # Will be struct in C
|
our $master; # Will be struct in C
|
||||||
our $slave;
|
our $slave;
|
||||||
|
|
||||||
our $opt_master_myport;
|
|
||||||
our $opt_slave_myport;
|
|
||||||
our $opt_ndbcluster_port;
|
our $opt_ndbcluster_port;
|
||||||
our $opt_ndbconnectstring;
|
our $opt_ndbconnectstring;
|
||||||
|
|
||||||
@ -284,6 +284,11 @@ our $opt_warnings;
|
|||||||
our $opt_with_ndbcluster;
|
our $opt_with_ndbcluster;
|
||||||
our $opt_with_openssl;
|
our $opt_with_openssl;
|
||||||
|
|
||||||
|
our $exe_ndb_mgm;
|
||||||
|
our $path_ndb_tools_dir;
|
||||||
|
our $path_ndb_backup_dir;
|
||||||
|
our $file_ndb_testrun_log;
|
||||||
|
our $flag_ndb_status_ok= 1;
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
#
|
#
|
||||||
@ -297,8 +302,7 @@ sub command_line_setup ();
|
|||||||
sub executable_setup ();
|
sub executable_setup ();
|
||||||
sub environment_setup ();
|
sub environment_setup ();
|
||||||
sub kill_and_cleanup ();
|
sub kill_and_cleanup ();
|
||||||
sub collect_test_cases ($);
|
sub ndbcluster_install ();
|
||||||
sub sleep_until_file_created ($$);
|
|
||||||
sub ndbcluster_start ();
|
sub ndbcluster_start ();
|
||||||
sub ndbcluster_stop ();
|
sub ndbcluster_stop ();
|
||||||
sub run_benchmarks ($);
|
sub run_benchmarks ($);
|
||||||
@ -306,6 +310,7 @@ sub run_tests ();
|
|||||||
sub mysql_install_db ();
|
sub mysql_install_db ();
|
||||||
sub install_db ($$);
|
sub install_db ($$);
|
||||||
sub run_testcase ($);
|
sub run_testcase ($);
|
||||||
|
sub report_failure_and_restart ($);
|
||||||
sub do_before_start_master ($$);
|
sub do_before_start_master ($$);
|
||||||
sub do_before_start_slave ($$);
|
sub do_before_start_slave ($$);
|
||||||
sub mysqld_start ($$$$);
|
sub mysqld_start ($$$$);
|
||||||
@ -347,20 +352,22 @@ sub main () {
|
|||||||
kill_and_cleanup();
|
kill_and_cleanup();
|
||||||
mysql_install_db();
|
mysql_install_db();
|
||||||
|
|
||||||
if ( $opt_with_ndbcluster and ! $glob_use_running_ndbcluster )
|
|
||||||
{
|
|
||||||
ndbcluster_start(); # We start the cluster storage engine
|
|
||||||
}
|
|
||||||
|
|
||||||
# mysql_loadstd(); FIXME copying from "std_data" .frm and
|
# mysql_loadstd(); FIXME copying from "std_data" .frm and
|
||||||
# .MGR but there are none?!
|
# .MGR but there are none?!
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( $opt_start_and_exit )
|
if ( $opt_start_and_exit )
|
||||||
|
{
|
||||||
|
if ( mysqld_start('master',0,[],[]) )
|
||||||
{
|
{
|
||||||
mtr_report("Servers started, exiting");
|
mtr_report("Servers started, exiting");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
mtr_error("Can't start the mysqld server");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
if ( $opt_bench )
|
if ( $opt_bench )
|
||||||
{
|
{
|
||||||
@ -447,8 +454,8 @@ sub command_line_setup () {
|
|||||||
$path_manager_log= "$glob_mysql_test_dir/var/log/manager.log";
|
$path_manager_log= "$glob_mysql_test_dir/var/log/manager.log";
|
||||||
$opt_current_test= "$glob_mysql_test_dir/var/log/current_test";
|
$opt_current_test= "$glob_mysql_test_dir/var/log/current_test";
|
||||||
|
|
||||||
$opt_master_myport= 9306;
|
my $opt_master_myport= 9306;
|
||||||
$opt_slave_myport= 9308;
|
my $opt_slave_myport= 9308;
|
||||||
$opt_ndbcluster_port= 9350;
|
$opt_ndbcluster_port= 9350;
|
||||||
|
|
||||||
# Read the command line
|
# Read the command line
|
||||||
@ -532,6 +539,8 @@ sub command_line_setup () {
|
|||||||
usage("");
|
usage("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@opt_cases= @ARGV;
|
||||||
|
|
||||||
# Put this into a hash, will be a C struct
|
# Put this into a hash, will be a C struct
|
||||||
|
|
||||||
$master->[0]->{'path_myddir'}= "$glob_mysql_test_dir/var/master-data";
|
$master->[0]->{'path_myddir'}= "$glob_mysql_test_dir/var/master-data";
|
||||||
@ -542,6 +551,8 @@ sub command_line_setup () {
|
|||||||
$master->[0]->{'path_myport'}= $opt_master_myport;
|
$master->[0]->{'path_myport'}= $opt_master_myport;
|
||||||
$master->[0]->{'start_timeout'}= 400; # enough time create innodb tables
|
$master->[0]->{'start_timeout'}= 400; # enough time create innodb tables
|
||||||
|
|
||||||
|
$master->[0]->{'ndbcluster'}= 1; # ndbcluster not started
|
||||||
|
|
||||||
$master->[1]->{'path_myddir'}= "$glob_mysql_test_dir/var/master1-data";
|
$master->[1]->{'path_myddir'}= "$glob_mysql_test_dir/var/master1-data";
|
||||||
$master->[1]->{'path_myerr'}= "$glob_mysql_test_dir/var/log/master1.err";
|
$master->[1]->{'path_myerr'}= "$glob_mysql_test_dir/var/log/master1.err";
|
||||||
$master->[1]->{'path_mylog'}= "$glob_mysql_test_dir/var/log/master1.log";
|
$master->[1]->{'path_mylog'}= "$glob_mysql_test_dir/var/log/master1.log";
|
||||||
@ -598,7 +609,7 @@ sub command_line_setup () {
|
|||||||
# Look at the command line options and set script flags
|
# 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");
|
mtr_error("Will not run in record mode without a specific test case");
|
||||||
}
|
}
|
||||||
@ -672,6 +683,10 @@ sub command_line_setup () {
|
|||||||
$glob_use_running_ndbcluster= 1;
|
$glob_use_running_ndbcluster= 1;
|
||||||
$opt_with_ndbcluster= 1;
|
$opt_with_ndbcluster= 1;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$opt_ndbconnectstring= "host=localhost:$opt_ndbcluster_port";
|
||||||
|
}
|
||||||
|
|
||||||
# FIXME
|
# FIXME
|
||||||
|
|
||||||
@ -733,7 +748,8 @@ sub executable_setup () {
|
|||||||
{
|
{
|
||||||
mtr_error("Can't find embedded server 'mysqltest'");
|
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
|
else
|
||||||
{
|
{
|
||||||
@ -749,7 +765,8 @@ sub executable_setup () {
|
|||||||
{
|
{
|
||||||
$exe_mysqltest= "$glob_basedir/client/mysqltest";
|
$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" )
|
if ( -f "$glob_basedir/client/.libs/mysqldump" )
|
||||||
{
|
{
|
||||||
@ -768,22 +785,29 @@ sub executable_setup () {
|
|||||||
$exe_mysqlbinlog= "$glob_basedir/client/mysqlbinlog";
|
$exe_mysqlbinlog= "$glob_basedir/client/mysqlbinlog";
|
||||||
}
|
}
|
||||||
|
|
||||||
$exe_mysqld= "$glob_basedir/sql/mysqld";
|
|
||||||
$path_client_bindir= "$glob_basedir/client";
|
$path_client_bindir= "$glob_basedir/client";
|
||||||
|
$exe_mysqld= "$glob_basedir/sql/mysqld";
|
||||||
$exe_mysqladmin= "$path_client_bindir/mysqladmin";
|
$exe_mysqladmin= "$path_client_bindir/mysqladmin";
|
||||||
$exe_mysql= "$path_client_bindir/mysql";
|
$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_language= "$glob_basedir/sql/share/english/";
|
||||||
$path_charsetsdir= "$glob_basedir/sql/share/charsets";
|
$path_charsetsdir= "$glob_basedir/sql/share/charsets";
|
||||||
|
|
||||||
|
$path_ndb_tools_dir= "$glob_basedir/ndb/tools";
|
||||||
|
$exe_ndb_mgm= "$glob_basedir/ndb/src/mgmclient/ndb_mgm";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
my $path_tests_bindir= "$glob_basedir/tests";
|
||||||
|
|
||||||
$path_client_bindir= "$glob_basedir/bin";
|
$path_client_bindir= "$glob_basedir/bin";
|
||||||
$path_tests_bindir= "$glob_basedir/tests";
|
|
||||||
$exe_mysqltest= "$path_client_bindir/mysqltest";
|
$exe_mysqltest= "$path_client_bindir/mysqltest";
|
||||||
$exe_mysqldump= "$path_client_bindir/mysqldump";
|
$exe_mysqldump= "$path_client_bindir/mysqldump";
|
||||||
$exe_mysqlbinlog= "$path_client_bindir/mysqlbinlog";
|
$exe_mysqlbinlog= "$path_client_bindir/mysqlbinlog";
|
||||||
$exe_mysqladmin= "$path_client_bindir/mysqladmin";
|
$exe_mysqladmin= "$path_client_bindir/mysqladmin";
|
||||||
$exe_mysql= "$path_client_bindir/mysql";
|
$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" )
|
if ( -d "$glob_basedir/share/mysql/english" )
|
||||||
{
|
{
|
||||||
$path_language ="$glob_basedir/share/mysql/english/";
|
$path_language ="$glob_basedir/share/mysql/english/";
|
||||||
@ -804,6 +828,36 @@ sub executable_setup () {
|
|||||||
$exe_mysqld= "$glob_basedir/bin/mysqld";
|
$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";
|
||||||
|
}
|
||||||
|
|
||||||
|
$path_ndb_tools_dir= "$glob_basedir/bin";
|
||||||
|
$exe_ndb_mgm= "$glob_basedir/bin/ndb_mgm";
|
||||||
}
|
}
|
||||||
|
|
||||||
# FIXME special $exe_master_mysqld and $exe_slave_mysqld
|
# FIXME special $exe_master_mysqld and $exe_slave_mysqld
|
||||||
@ -818,6 +872,10 @@ sub executable_setup () {
|
|||||||
{
|
{
|
||||||
$exe_slave_mysqld= $exe_mysqld;
|
$exe_slave_mysqld= $exe_mysqld;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$path_ndb_backup_dir=
|
||||||
|
"$glob_mysql_test_dir/var/ndbcluster-$opt_ndbcluster_port";
|
||||||
|
$file_ndb_testrun_log= "$glob_mysql_test_dir/var/log/ndb_testrun.log";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -846,13 +904,18 @@ sub environment_setup () {
|
|||||||
# Also command lines in .opt files may contain env vars
|
# Also command lines in .opt files may contain env vars
|
||||||
# --------------------------------------------------------------------------
|
# --------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$ENV{'UMASK'}= "0660"; # The octal *string*
|
||||||
|
$ENV{'UMASK_DIR'}= "0770"; # The octal *string*
|
||||||
$ENV{'LC_COLLATE'}= "C";
|
$ENV{'LC_COLLATE'}= "C";
|
||||||
|
$ENV{'USE_RUNNING_SERVER'}= $glob_use_running_server;
|
||||||
$ENV{'MYSQL_TEST_DIR'}= $glob_mysql_test_dir;
|
$ENV{'MYSQL_TEST_DIR'}= $glob_mysql_test_dir;
|
||||||
$ENV{'MASTER_MYPORT'}= $opt_master_myport;
|
$ENV{'MASTER_MYSOCK'}= $master->[0]->{'path_mysock'};
|
||||||
$ENV{'SLAVE_MYPORT'}= $opt_slave_myport;
|
$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'}= '@MYSQL_TCP_PORT@'; # FIXME
|
||||||
$ENV{'MYSQL_TCP_PORT'}= 3306;
|
$ENV{'MYSQL_TCP_PORT'}= 3306;
|
||||||
$ENV{'MASTER_MYSOCK'}= $master->[0]->{'path_mysock'};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -875,203 +938,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
|
# Handle left overs from previous runs
|
||||||
@ -1099,22 +965,19 @@ sub kill_and_cleanup () {
|
|||||||
mtr_report("Killing Possible Leftover Processes");
|
mtr_report("Killing Possible Leftover Processes");
|
||||||
mkpath("$glob_mysql_test_dir/var/log"); # Needed for mysqladmin log
|
mkpath("$glob_mysql_test_dir/var/log"); # Needed for mysqladmin log
|
||||||
mtr_kill_leftovers();
|
mtr_kill_leftovers();
|
||||||
}
|
|
||||||
|
|
||||||
if ( $opt_with_ndbcluster and ! $glob_use_running_ndbcluster )
|
|
||||||
{
|
|
||||||
ndbcluster_stop();
|
ndbcluster_stop();
|
||||||
|
$master->[0]->{'ndbcluster'}= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
mtr_report("Removing Stale Files");
|
mtr_report("Removing Stale Files");
|
||||||
|
|
||||||
rmtree("$glob_mysql_test_dir/var/log");
|
rmtree("$glob_mysql_test_dir/var/log");
|
||||||
rmtree("$glob_mysql_test_dir/var/ndbcluster");
|
rmtree("$glob_mysql_test_dir/var/ndbcluster-$opt_ndbcluster_port");
|
||||||
rmtree("$glob_mysql_test_dir/var/run");
|
rmtree("$glob_mysql_test_dir/var/run");
|
||||||
rmtree("$glob_mysql_test_dir/var/tmp");
|
rmtree("$glob_mysql_test_dir/var/tmp");
|
||||||
|
|
||||||
mkpath("$glob_mysql_test_dir/var/log");
|
mkpath("$glob_mysql_test_dir/var/log");
|
||||||
mkpath("$glob_mysql_test_dir/var/ndbcluster");
|
|
||||||
mkpath("$glob_mysql_test_dir/var/run");
|
mkpath("$glob_mysql_test_dir/var/run");
|
||||||
mkpath("$glob_mysql_test_dir/var/tmp");
|
mkpath("$glob_mysql_test_dir/var/tmp");
|
||||||
mkpath($opt_tmpdir);
|
mkpath($opt_tmpdir);
|
||||||
@ -1152,26 +1015,67 @@ sub kill_and_cleanup () {
|
|||||||
|
|
||||||
# FIXME why is there a different start below?!
|
# FIXME why is there a different start below?!
|
||||||
|
|
||||||
|
sub ndbcluster_install () {
|
||||||
|
|
||||||
|
if ( ! $opt_with_ndbcluster or $glob_use_running_ndbcluster )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
mtr_report("Install ndbcluster");
|
||||||
|
my $ndbcluster_opts= $opt_bench ? "" : "--small";
|
||||||
|
my $ndbcluster_port_base= $opt_ndbcluster_port + 2;
|
||||||
|
if ( mtr_run("$glob_mysql_test_dir/ndb/ndbcluster",
|
||||||
|
["--port=$opt_ndbcluster_port",
|
||||||
|
"--port-base=$ndbcluster_port_base",
|
||||||
|
"--data-dir=$glob_mysql_test_dir/var",
|
||||||
|
$ndbcluster_opts,
|
||||||
|
"--initial"],
|
||||||
|
"", "", "", "") )
|
||||||
|
{
|
||||||
|
mtr_error("Error ndbcluster_install");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ndbcluster_stop();
|
||||||
|
$master->[0]->{'ndbcluster'}= 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
sub ndbcluster_start () {
|
sub ndbcluster_start () {
|
||||||
|
|
||||||
mtr_report("Starting ndbcluster");
|
if ( ! $opt_with_ndbcluster or $glob_use_running_ndbcluster )
|
||||||
my $ndbcluster_opts= $opt_bench ? "" : "--small";
|
{
|
||||||
# FIXME check result code?!
|
return 0;
|
||||||
mtr_run("$glob_mysql_test_dir/ndb/ndbcluster",
|
}
|
||||||
["--port-base=$opt_ndbcluster_port",
|
# FIXME, we want to _append_ output to file $file_ndb_testrun_log instead of /dev/null
|
||||||
$ndbcluster_opts,
|
if ( mtr_run("$glob_mysql_test_dir/ndb/ndbcluster",
|
||||||
"--diskless",
|
["--port=$opt_ndbcluster_port",
|
||||||
"--initial",
|
|
||||||
"--data-dir=$glob_mysql_test_dir/var"],
|
"--data-dir=$glob_mysql_test_dir/var"],
|
||||||
"", "", "", "");
|
"", "/dev/null", "", "") )
|
||||||
|
{
|
||||||
|
mtr_error("Error ndbcluster_install");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub ndbcluster_stop () {
|
sub ndbcluster_stop () {
|
||||||
|
|
||||||
|
if ( ! $opt_with_ndbcluster or $glob_use_running_ndbcluster )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
my $ndbcluster_port_base= $opt_ndbcluster_port + 2;
|
||||||
|
# FIXME, we want to _append_ output to file $file_ndb_testrun_log instead of /dev/null
|
||||||
mtr_run("$glob_mysql_test_dir/ndb/ndbcluster",
|
mtr_run("$glob_mysql_test_dir/ndb/ndbcluster",
|
||||||
["--data-dir=$glob_mysql_test_dir/var",
|
["--port=$opt_ndbcluster_port",
|
||||||
"--port-base=$opt_ndbcluster_port",
|
"--data-dir=$glob_mysql_test_dir/var",
|
||||||
"--stop"],
|
"--stop"],
|
||||||
"", "", "", "");
|
"", "/dev/null", "", "");
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1189,6 +1093,10 @@ sub run_benchmarks ($) {
|
|||||||
if ( ! $glob_use_embedded_server and ! $opt_local_master )
|
if ( ! $glob_use_embedded_server and ! $opt_local_master )
|
||||||
{
|
{
|
||||||
$master->[0]->{'pid'}= mysqld_start('master',0,[],[]);
|
$master->[0]->{'pid'}= mysqld_start('master',0,[],[]);
|
||||||
|
if ( ! $master->[0]->{'pid'} )
|
||||||
|
{
|
||||||
|
mtr_error("Can't start the mysqld server");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mtr_init_args(\$args);
|
mtr_init_args(\$args);
|
||||||
@ -1275,11 +1183,6 @@ sub run_suite () {
|
|||||||
stop_masters_slaves();
|
stop_masters_slaves();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( $opt_with_ndbcluster and ! $glob_use_running_ndbcluster )
|
|
||||||
{
|
|
||||||
ndbcluster_stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( $opt_gcov )
|
if ( $opt_gcov )
|
||||||
{
|
{
|
||||||
gcov_collect(); # collect coverage information
|
gcov_collect(); # collect coverage information
|
||||||
@ -1301,10 +1204,19 @@ sub run_suite () {
|
|||||||
|
|
||||||
sub mysql_install_db () {
|
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->[0]->{'path_myddir'});
|
||||||
|
install_db('master', $master->[1]->{'path_myddir'});
|
||||||
install_db('slave', $slave->[0]->{'path_myddir'});
|
install_db('slave', $slave->[0]->{'path_myddir'});
|
||||||
|
install_db('slave', $slave->[1]->{'path_myddir'});
|
||||||
|
install_db('slave', $slave->[2]->{'path_myddir'});
|
||||||
|
|
||||||
|
if ( ndbcluster_install() )
|
||||||
|
{
|
||||||
|
# failed to install, disable usage but flag that its no ok
|
||||||
|
$opt_with_ndbcluster= 0;
|
||||||
|
$flag_ndb_status_ok= 0;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1368,6 +1280,9 @@ sub run_testcase ($) {
|
|||||||
|
|
||||||
mtr_tonewfile($opt_current_test,"$tname\n"); # Always tell where we are
|
mtr_tonewfile($opt_current_test,"$tname\n"); # Always tell where we are
|
||||||
|
|
||||||
|
# output current test to ndbcluster log file to enable diagnostics
|
||||||
|
mtr_tofile($file_ndb_testrun_log,"CURRENT TEST $tname\n");
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
# If marked to skip, just print out and return.
|
# If marked to skip, just print out and return.
|
||||||
# Note that a test case not marked as 'skip' can still be
|
# Note that a test case not marked as 'skip' can still be
|
||||||
@ -1422,6 +1337,12 @@ sub run_testcase ($) {
|
|||||||
mtr_tofile($master->[0]->{'path_myerr'},"CURRENT_TEST: $tname\n");
|
mtr_tofile($master->[0]->{'path_myerr'},"CURRENT_TEST: $tname\n");
|
||||||
do_before_start_master($tname,$tinfo->{'master_sh'});
|
do_before_start_master($tname,$tinfo->{'master_sh'});
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
# If any mysqld servers running died, we have to know
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
mtr_record_dead_children();
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
# Start masters
|
# Start masters
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
@ -1435,18 +1356,37 @@ sub run_testcase ($) {
|
|||||||
|
|
||||||
if ( ! $opt_local_master )
|
if ( ! $opt_local_master )
|
||||||
{
|
{
|
||||||
|
if ( $master->[0]->{'ndbcluster'} )
|
||||||
|
{
|
||||||
|
$master->[0]->{'ndbcluster'}= ndbcluster_start();
|
||||||
|
if ( $master->[0]->{'ndbcluster'} )
|
||||||
|
{
|
||||||
|
report_failure_and_restart($tinfo);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
if ( ! $master->[0]->{'pid'} )
|
if ( ! $master->[0]->{'pid'} )
|
||||||
{
|
{
|
||||||
$master->[0]->{'pid'}=
|
$master->[0]->{'pid'}=
|
||||||
mysqld_start('master',0,$tinfo->{'master_opt'},[]);
|
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'} )
|
if ( $opt_with_ndbcluster and ! $master->[1]->{'pid'} )
|
||||||
{
|
{
|
||||||
$master->[1]->{'pid'}=
|
$master->[1]->{'pid'}=
|
||||||
mysqld_start('master',1,$tinfo->{'master_opt'},[]);
|
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;
|
$master->[0]->{'uses_special_flags'}= 1;
|
||||||
}
|
}
|
||||||
@ -1469,6 +1409,11 @@ sub run_testcase ($) {
|
|||||||
$slave->[$idx]->{'pid'}=
|
$slave->[$idx]->{'pid'}=
|
||||||
mysqld_start('slave',$idx,
|
mysqld_start('slave',$idx,
|
||||||
$tinfo->{'slave_opt'}, $tinfo->{'slave_mi'});
|
$tinfo->{'slave_opt'}, $tinfo->{'slave_mi'});
|
||||||
|
if ( ! $slave->[$idx]->{'pid'} )
|
||||||
|
{
|
||||||
|
report_failure_and_restart($tinfo);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1502,12 +1447,21 @@ sub run_testcase ($) {
|
|||||||
"mysqltest returned unexpected code $res, " .
|
"mysqltest returned unexpected code $res, " .
|
||||||
"it has probably crashed");
|
"it has probably crashed");
|
||||||
}
|
}
|
||||||
|
report_failure_and_restart($tinfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub report_failure_and_restart ($) {
|
||||||
|
my $tinfo= shift;
|
||||||
|
|
||||||
mtr_report_test_failed($tinfo);
|
mtr_report_test_failed($tinfo);
|
||||||
mtr_show_failed_diff($tname);
|
mtr_show_failed_diff($tinfo->{'name'});
|
||||||
print "\n";
|
print "\n";
|
||||||
if ( ! $opt_force )
|
if ( ! $opt_force )
|
||||||
{
|
{
|
||||||
print "Aborting: $tname failed. To continue, re-run with '--force'.";
|
print "Aborting: $tinfo->{'name'} failed. To continue, re-run with '--force'.";
|
||||||
print "\n";
|
print "\n";
|
||||||
if ( ! $opt_gdb and ! $glob_use_running_server and
|
if ( ! $opt_gdb and ! $glob_use_running_server and
|
||||||
! $opt_ddd and ! $glob_use_embedded_server )
|
! $opt_ddd and ! $glob_use_embedded_server )
|
||||||
@ -1525,8 +1479,6 @@ sub run_testcase ($) {
|
|||||||
}
|
}
|
||||||
print "Resuming Tests\n\n";
|
print "Resuming Tests\n\n";
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
@ -1609,6 +1561,8 @@ sub mysqld_arguments ($$$$$) {
|
|||||||
my $extra_opt= shift;
|
my $extra_opt= shift;
|
||||||
my $slave_master_info= shift;
|
my $slave_master_info= shift;
|
||||||
|
|
||||||
|
# print STDERR Dumper($extra_opt);
|
||||||
|
|
||||||
my $sidx= ""; # Index as string, 0 is empty string
|
my $sidx= ""; # Index as string, 0 is empty string
|
||||||
if ( $idx > 0 )
|
if ( $idx > 0 )
|
||||||
{
|
{
|
||||||
@ -1728,18 +1682,9 @@ sub mysqld_arguments ($$$$$) {
|
|||||||
if ( $opt_with_ndbcluster )
|
if ( $opt_with_ndbcluster )
|
||||||
{
|
{
|
||||||
mtr_add_arg($args, "%s--ndbcluster", $prefix);
|
mtr_add_arg($args, "%s--ndbcluster", $prefix);
|
||||||
|
mtr_add_arg($args, "%s--ndb-connectstring=%s", $prefix,
|
||||||
if ( $glob_use_running_ndbcluster )
|
|
||||||
{
|
|
||||||
mtr_add_arg($args,"--ndb-connectstring=%s", $prefix,
|
|
||||||
$opt_ndbconnectstring);
|
$opt_ndbconnectstring);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
mtr_add_arg($args,"--ndb-connectstring=host=localhost:%d",
|
|
||||||
$prefix, $opt_ndbcluster_port);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# FIXME always set nowdays??? SMALL_SERVER
|
# FIXME always set nowdays??? SMALL_SERVER
|
||||||
mtr_add_arg($args, "%s--key_buffer_size=1M", $prefix);
|
mtr_add_arg($args, "%s--key_buffer_size=1M", $prefix);
|
||||||
@ -1893,9 +1838,8 @@ sub mysqld_start ($$$$) {
|
|||||||
$master->[$idx]->{'path_myerr'},
|
$master->[$idx]->{'path_myerr'},
|
||||||
$master->[$idx]->{'path_myerr'}, "") )
|
$master->[$idx]->{'path_myerr'}, "") )
|
||||||
{
|
{
|
||||||
sleep_until_file_created($master->[$idx]->{'path_mypid'},
|
return sleep_until_file_created($master->[$idx]->{'path_mypid'},
|
||||||
$master->[$idx]->{'start_timeout'});
|
$master->[$idx]->{'start_timeout'}, $pid);
|
||||||
return $pid;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1905,13 +1849,12 @@ sub mysqld_start ($$$$) {
|
|||||||
$slave->[$idx]->{'path_myerr'},
|
$slave->[$idx]->{'path_myerr'},
|
||||||
$slave->[$idx]->{'path_myerr'}, "") )
|
$slave->[$idx]->{'path_myerr'}, "") )
|
||||||
{
|
{
|
||||||
sleep_until_file_created($slave->[$idx]->{'path_mypid'},
|
return sleep_until_file_created($slave->[$idx]->{'path_mypid'},
|
||||||
$master->[$idx]->{'start_timeout'});
|
$master->[$idx]->{'start_timeout'}, $pid);
|
||||||
return $pid;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mtr_error("Can't start mysqld FIXME");
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub stop_masters_slaves () {
|
sub stop_masters_slaves () {
|
||||||
@ -1944,7 +1887,13 @@ sub stop_masters () {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mtr_stop_mysqld_servers(\@args, 0);
|
if ( ! $master->[0]->{'ndbcluster'} )
|
||||||
|
{
|
||||||
|
ndbcluster_stop();
|
||||||
|
$master->[0]->{'ndbcluster'}= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
mtr_stop_mysqld_servers(\@args);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub stop_slaves () {
|
sub stop_slaves () {
|
||||||
@ -1966,7 +1915,7 @@ sub stop_slaves () {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mtr_stop_mysqld_servers(\@args, 0);
|
mtr_stop_mysqld_servers(\@args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1992,17 +1941,39 @@ sub run_mysqltest ($$) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
my $cmdline_mysql=
|
my $cmdline_mysql=
|
||||||
"$exe_mysql --host=localhost --port=$master->[0]->{'path_myport'} " .
|
"$exe_mysql --host=localhost --user=root --password= " .
|
||||||
"--socket=$master->[0]->{'path_mysock'} --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???
|
# 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{'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_DUMP'}= $cmdline_mysqldump;
|
||||||
$ENV{'MYSQL_BINLOG'}= $exe_mysqlbinlog;
|
$ENV{'MYSQL_BINLOG'}= $cmdline_mysqlbinlog;
|
||||||
$ENV{'CLIENT_BINDIR'}= $path_client_bindir;
|
$ENV{'MYSQL_FIX_SYSTEM_TABLES'}= $cmdline_mysql_fix_system_tables;
|
||||||
$ENV{'TESTS_BINDIR'}= $path_tests_bindir;
|
$ENV{'MYSQL_CLIENT_TEST'}= $cmdline_mysql_client_test;
|
||||||
|
$ENV{'CHARSETSDIR'}= $path_charsetsdir;
|
||||||
|
|
||||||
|
$ENV{'NDB_STATUS_OK'}= $flag_ndb_status_ok;
|
||||||
|
$ENV{'NDB_MGM'}= $exe_ndb_mgm;
|
||||||
|
$ENV{'NDB_BACKUP_DIR'}= $path_ndb_backup_dir;
|
||||||
|
$ENV{'NDB_TOOLS_DIR'}= $path_ndb_tools_dir;
|
||||||
|
$ENV{'NDB_TOOLS_OUTPUT'}= $file_ndb_testrun_log;
|
||||||
|
$ENV{'NDB_CONNECTSTRING'}= $opt_ndbconnectstring;
|
||||||
|
|
||||||
my $exe= $exe_mysqltest;
|
my $exe= $exe_mysqltest;
|
||||||
my $args;
|
my $args;
|
||||||
|
@ -490,6 +490,7 @@ export MASTER_MYPORT MASTER_MYPORT1 SLAVE_MYPORT MYSQL_TCP_PORT MASTER_MYSOCK MA
|
|||||||
NDBCLUSTER_BASE_PORT=`expr $NDBCLUSTER_PORT + 2`
|
NDBCLUSTER_BASE_PORT=`expr $NDBCLUSTER_PORT + 2`
|
||||||
NDBCLUSTER_OPTS="--port=$NDBCLUSTER_PORT --port-base=$NDBCLUSTER_BASE_PORT --data-dir=$MYSQL_TEST_DIR/var --ndb_mgm-extra-opts=$NDB_MGM_EXTRA_OPTS --ndb_mgmd-extra-opts=$NDB_MGMD_EXTRA_OPTS --ndbd-extra-opts=$NDBD_EXTRA_OPTS"
|
NDBCLUSTER_OPTS="--port=$NDBCLUSTER_PORT --port-base=$NDBCLUSTER_BASE_PORT --data-dir=$MYSQL_TEST_DIR/var --ndb_mgm-extra-opts=$NDB_MGM_EXTRA_OPTS --ndb_mgmd-extra-opts=$NDB_MGMD_EXTRA_OPTS --ndbd-extra-opts=$NDBD_EXTRA_OPTS"
|
||||||
NDB_BACKUP_DIR=$MYSQL_TEST_DIR/var/ndbcluster-$NDBCLUSTER_PORT
|
NDB_BACKUP_DIR=$MYSQL_TEST_DIR/var/ndbcluster-$NDBCLUSTER_PORT
|
||||||
|
NDB_TOOLS_OUTPUT=$MYSQL_TEST_DIR/var/log/ndb_tools.log
|
||||||
|
|
||||||
if [ x$SOURCE_DIST = x1 ] ; then
|
if [ x$SOURCE_DIST = x1 ] ; then
|
||||||
MY_BASEDIR=$MYSQL_TEST_DIR
|
MY_BASEDIR=$MYSQL_TEST_DIR
|
||||||
@ -690,7 +691,10 @@ export CLIENT_BINDIR MYSQL_CLIENT_TEST CHARSETSDIR
|
|||||||
export NDB_TOOLS_DIR
|
export NDB_TOOLS_DIR
|
||||||
export NDB_MGM
|
export NDB_MGM
|
||||||
export NDB_BACKUP_DIR
|
export NDB_BACKUP_DIR
|
||||||
|
export NDB_TOOLS_OUTPUT
|
||||||
export PURIFYOPTIONS
|
export PURIFYOPTIONS
|
||||||
|
NDB_STATUS_OK=1
|
||||||
|
export NDB_STATUS_OK
|
||||||
|
|
||||||
MYSQL_TEST_ARGS="--no-defaults --socket=$MASTER_MYSOCK --database=$DB \
|
MYSQL_TEST_ARGS="--no-defaults --socket=$MASTER_MYSOCK --database=$DB \
|
||||||
--user=$DBUSER --password=$DBPASSWD --silent -v --skip-safemalloc \
|
--user=$DBUSER --password=$DBPASSWD --silent -v --skip-safemalloc \
|
||||||
@ -1043,6 +1047,7 @@ start_ndbcluster()
|
|||||||
{
|
{
|
||||||
if [ ! -z "$USE_NDBCLUSTER" ]
|
if [ ! -z "$USE_NDBCLUSTER" ]
|
||||||
then
|
then
|
||||||
|
rm -f $NDB_TOOLS_OUTPUT
|
||||||
if [ -z "$USE_RUNNING_NDBCLUSTER" ]
|
if [ -z "$USE_RUNNING_NDBCLUSTER" ]
|
||||||
then
|
then
|
||||||
echo "Starting ndbcluster"
|
echo "Starting ndbcluster"
|
||||||
@ -1052,7 +1057,15 @@ start_ndbcluster()
|
|||||||
else
|
else
|
||||||
NDBCLUSTER_EXTRA_OPTS="--small"
|
NDBCLUSTER_EXTRA_OPTS="--small"
|
||||||
fi
|
fi
|
||||||
./ndb/ndbcluster $NDBCLUSTER_OPTS $NDBCLUSTER_EXTRA_OPTS --initial || exit 1
|
./ndb/ndbcluster $NDBCLUSTER_OPTS $NDBCLUSTER_EXTRA_OPTS --initial || NDB_STATUS_OK=0
|
||||||
|
if [ x$NDB_STATUS_OK != x1 ] ; then
|
||||||
|
if [ x$FORCE != x1 ] ; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
USE_NDBCLUSTER=
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
NDB_CONNECTSTRING="host=localhost:$NDBCLUSTER_PORT"
|
NDB_CONNECTSTRING="host=localhost:$NDBCLUSTER_PORT"
|
||||||
else
|
else
|
||||||
NDB_CONNECTSTRING="$USE_RUNNING_NDBCLUSTER"
|
NDB_CONNECTSTRING="$USE_RUNNING_NDBCLUSTER"
|
||||||
@ -1617,6 +1630,12 @@ run_testcase ()
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ "x$START_AND_EXIT" = "x1" ] ; then
|
||||||
|
echo "Servers started, exiting"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
cd $MYSQL_TEST_DIR
|
cd $MYSQL_TEST_DIR
|
||||||
|
|
||||||
if [ -f $tf ] ; then
|
if [ -f $tf ] ; then
|
||||||
@ -1754,11 +1773,6 @@ then
|
|||||||
mysql_loadstd
|
mysql_loadstd
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "x$START_AND_EXIT" = "x1" ] ; then
|
|
||||||
echo "Servers started, exiting"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
$ECHO "Starting Tests"
|
$ECHO "Starting Tests"
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -39,3 +39,6 @@ DROP TABLE t1;
|
|||||||
SELECT CHAR(31) = '', '' = CHAR(31);
|
SELECT CHAR(31) = '', '' = CHAR(31);
|
||||||
CHAR(31) = '' '' = CHAR(31)
|
CHAR(31) = '' '' = CHAR(31)
|
||||||
0 0
|
0 0
|
||||||
|
SELECT CHAR(30) = '', '' = CHAR(30);
|
||||||
|
CHAR(30) = '' '' = CHAR(30)
|
||||||
|
0 0
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
reset master;
|
reset master;
|
||||||
create database `drop-temp+table-test`;
|
create database `drop-temp+table-test`;
|
||||||
use `drop-temp+table-test`;
|
use `drop-temp+table-test`;
|
||||||
|
create temporary table shortn1 (a int);
|
||||||
create temporary table `table:name` (a int);
|
create temporary table `table:name` (a int);
|
||||||
|
create temporary table shortn2 (a int);
|
||||||
select get_lock("a",10);
|
select get_lock("a",10);
|
||||||
get_lock("a",10)
|
get_lock("a",10)
|
||||||
1
|
1
|
||||||
@ -10,9 +12,13 @@ get_lock("a",10)
|
|||||||
1
|
1
|
||||||
show binlog events;
|
show binlog events;
|
||||||
Log_name Pos Event_type Server_id Orig_log_pos Info
|
Log_name Pos Event_type Server_id Orig_log_pos Info
|
||||||
master-bin.000001 4 Start 1 4 Server ver: VERSION, Binlog ver: 3
|
master-bin.000001 # Start 1 # Server ver: VERSION, Binlog ver: 3
|
||||||
master-bin.000001 79 Query 1 79 create database `drop-temp+table-test`
|
master-bin.000001 # Query 1 # create database `drop-temp+table-test`
|
||||||
master-bin.000001 168 Query 1 168 use `drop-temp+table-test`; create temporary table `table:name` (a int)
|
master-bin.000001 # Query 1 # use `drop-temp+table-test`; create temporary table shortn1 (a int)
|
||||||
master-bin.000001 262 Query 1 262 use `drop-temp+table-test`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `drop-temp+table-test`.`table:name`
|
master-bin.000001 # Query 1 # use `drop-temp+table-test`; create temporary table `table:name` (a int)
|
||||||
master-bin.000001 391 Query 1 391 use `drop-temp+table-test`; DO RELEASE_LOCK("a")
|
master-bin.000001 # Query 1 # use `drop-temp+table-test`; create temporary table shortn2 (a int)
|
||||||
|
master-bin.000001 # Query 1 # use `drop-temp+table-test`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `drop-temp+table-test`.`shortn2`
|
||||||
|
master-bin.000001 # Query 1 # use `drop-temp+table-test`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `drop-temp+table-test`.`table:name`
|
||||||
|
master-bin.000001 # Query 1 # use `drop-temp+table-test`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `drop-temp+table-test`.`shortn1`
|
||||||
|
master-bin.000001 # Query 1 # use `drop-temp+table-test`; DO RELEASE_LOCK("a")
|
||||||
drop database `drop-temp+table-test`;
|
drop database `drop-temp+table-test`;
|
||||||
|
@ -733,3 +733,15 @@ one 2
|
|||||||
two 2
|
two 2
|
||||||
three 1
|
three 1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
create table t1(f1 datetime);
|
||||||
|
insert into t1 values (now());
|
||||||
|
create table t2 select f2 from (select max(now()) f2 from t1) a;
|
||||||
|
show columns from t2;
|
||||||
|
Field Type Null Key Default Extra
|
||||||
|
f2 datetime 0000-00-00 00:00:00
|
||||||
|
drop table t2;
|
||||||
|
create table t2 select f2 from (select now() f2 from t1) a;
|
||||||
|
show columns from t2;
|
||||||
|
Field Type Null Key Default Extra
|
||||||
|
f2 datetime 0000-00-00 00:00:00
|
||||||
|
drop table t2, t1;
|
||||||
|
@ -28,3 +28,24 @@ length(format('nan', 2)) > 0
|
|||||||
select concat("$",format(2500,2));
|
select concat("$",format(2500,2));
|
||||||
concat("$",format(2500,2))
|
concat("$",format(2500,2))
|
||||||
$2,500.00
|
$2,500.00
|
||||||
|
create table t1 ( a timestamp );
|
||||||
|
insert into t1 values ( '2004-01-06 12:34' );
|
||||||
|
select a from t1 where left(a+0,6) in ( left(20040106,6) );
|
||||||
|
a
|
||||||
|
2004-01-06 12:34:00
|
||||||
|
select a from t1 where left(a+0,6) = ( left(20040106,6) );
|
||||||
|
a
|
||||||
|
2004-01-06 12:34:00
|
||||||
|
select a from t1 where right(a+0,6) in ( right(20040106123400,6) );
|
||||||
|
a
|
||||||
|
2004-01-06 12:34:00
|
||||||
|
select a from t1 where right(a+0,6) = ( right(20040106123400,6) );
|
||||||
|
a
|
||||||
|
2004-01-06 12:34:00
|
||||||
|
select a from t1 where mid(a+0,6,3) in ( mid(20040106123400,6,3) );
|
||||||
|
a
|
||||||
|
2004-01-06 12:34:00
|
||||||
|
select a from t1 where mid(a+0,6,3) = ( mid(20040106123400,6,3) );
|
||||||
|
a
|
||||||
|
2004-01-06 12:34:00
|
||||||
|
drop table t1;
|
||||||
|
@ -325,6 +325,19 @@ trim(trailing 'foo' from 'foo')
|
|||||||
select trim(leading 'foo' from 'foo');
|
select trim(leading 'foo' from 'foo');
|
||||||
trim(leading 'foo' from 'foo')
|
trim(leading 'foo' from 'foo')
|
||||||
|
|
||||||
|
select quote(ltrim(concat(' ', 'a')));
|
||||||
|
quote(ltrim(concat(' ', 'a')))
|
||||||
|
'a'
|
||||||
|
select quote(trim(concat(' ', 'a')));
|
||||||
|
quote(trim(concat(' ', 'a')))
|
||||||
|
'a'
|
||||||
|
CREATE TABLE t1 SELECT 1 UNION SELECT 2 UNION SELECT 3;
|
||||||
|
SELECT QUOTE('A') FROM t1;
|
||||||
|
QUOTE('A')
|
||||||
|
'A'
|
||||||
|
'A'
|
||||||
|
'A'
|
||||||
|
DROP TABLE t1;
|
||||||
select 1=_latin1'1';
|
select 1=_latin1'1';
|
||||||
1=_latin1'1'
|
1=_latin1'1'
|
||||||
1
|
1
|
||||||
@ -691,12 +704,6 @@ select count(*) as total, left(c,10) as reg from t1 group by reg order by reg de
|
|||||||
total reg
|
total reg
|
||||||
10 2004-12-10
|
10 2004-12-10
|
||||||
drop table t1;
|
drop table t1;
|
||||||
select quote(ltrim(concat(' ', 'a')));
|
|
||||||
quote(ltrim(concat(' ', 'a')))
|
|
||||||
'a'
|
|
||||||
select quote(trim(concat(' ', 'a')));
|
|
||||||
quote(trim(concat(' ', 'a')))
|
|
||||||
'a'
|
|
||||||
select trim(null from 'kate') as "must_be_null";
|
select trim(null from 'kate') as "must_be_null";
|
||||||
must_be_null
|
must_be_null
|
||||||
NULL
|
NULL
|
||||||
|
@ -629,15 +629,6 @@ explain SELECT i, COUNT(DISTINCT(i)) FROM t1 GROUP BY j ORDER BY NULL;
|
|||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 6 Using filesort
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 6 Using filesort
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
create table t1 ( col1 int, col2 int );
|
|
||||||
insert into t1 values (1,1),(1,2),(1,3),(2,1),(2,2);
|
|
||||||
select group_concat( distinct col1 ) as alias from t1
|
|
||||||
group by col2 having alias like '%';
|
|
||||||
alias
|
|
||||||
1,2
|
|
||||||
1,2
|
|
||||||
1
|
|
||||||
drop table t1;
|
|
||||||
create table t1 (a int);
|
create table t1 (a int);
|
||||||
insert into t1 values(null);
|
insert into t1 values(null);
|
||||||
select min(a) is null from t1;
|
select min(a) is null from t1;
|
||||||
@ -650,3 +641,39 @@ select 1 and min(a) is null from t1;
|
|||||||
1 and min(a) is null
|
1 and min(a) is null
|
||||||
1
|
1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
create table t1 ( col1 int, col2 int );
|
||||||
|
insert into t1 values (1,1),(1,2),(1,3),(2,1),(2,2);
|
||||||
|
select group_concat( distinct col1 ) as alias from t1
|
||||||
|
group by col2 having alias like '%';
|
||||||
|
alias
|
||||||
|
1,2
|
||||||
|
1,2
|
||||||
|
1
|
||||||
|
drop table t1;
|
||||||
|
create table t1 (a integer, b integer, c integer);
|
||||||
|
insert into t1 (a,b) values (1,2),(1,3),(2,5);
|
||||||
|
select a, 0.1*0+1 r2, sum(1) r1 from t1 where a = 1 group by a having r1>1 and r2=1;
|
||||||
|
a r2 r1
|
||||||
|
1 1.0 2
|
||||||
|
select a, rand()*0+1 r2, sum(1) r1 from t1 where a = 1 group by a having r1>1 and r2=1;
|
||||||
|
a r2 r1
|
||||||
|
1 1 2
|
||||||
|
select a,sum(b) from t1 where a=1 group by c;
|
||||||
|
a sum(b)
|
||||||
|
1 5
|
||||||
|
select a*sum(b) from t1 where a=1 group by c;
|
||||||
|
a*sum(b)
|
||||||
|
5
|
||||||
|
select sum(a)*sum(b) from t1 where a=1 group by c;
|
||||||
|
sum(a)*sum(b)
|
||||||
|
10
|
||||||
|
select a,sum(b) from t1 where a=1 group by c having a=1;
|
||||||
|
a sum(b)
|
||||||
|
1 5
|
||||||
|
select a as d,sum(b) from t1 where a=1 group by c having d=1;
|
||||||
|
d sum(b)
|
||||||
|
1 5
|
||||||
|
select sum(a)*sum(b) as d from t1 where a=1 group by c having d > 0;
|
||||||
|
d
|
||||||
|
10
|
||||||
|
drop table t1;
|
||||||
|
@ -633,3 +633,15 @@ No Field Count
|
|||||||
0 1 100
|
0 1 100
|
||||||
0 2 100
|
0 2 100
|
||||||
drop table t1, t2;
|
drop table t1, t2;
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
ID int(11) NOT NULL auto_increment,
|
||||||
|
NO int(11) NOT NULL default '0',
|
||||||
|
SEQ int(11) NOT NULL default '0',
|
||||||
|
PRIMARY KEY (ID),
|
||||||
|
KEY t1$NO (SEQ,NO)
|
||||||
|
) ENGINE=MyISAM;
|
||||||
|
INSERT INTO t1 (SEQ, NO) SELECT "1" AS SEQ, IF(MAX(NO) IS NULL, 0, MAX(NO)) + 1 AS NO FROM t1 WHERE (SEQ = 1);
|
||||||
|
select SQL_BUFFER_RESULT * from t1 WHERE (SEQ = 1);
|
||||||
|
ID NO SEQ
|
||||||
|
1 1 1
|
||||||
|
drop table t1;
|
||||||
|
@ -67,3 +67,12 @@ SELECT * FROM t1;
|
|||||||
id id2
|
id id2
|
||||||
3 0
|
3 0
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
create table t1 (a integer);
|
||||||
|
insert into t1 values (1);
|
||||||
|
select 1 as a from t1 union all select 1 from dual limit 1;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
(select 1 as a from t1) union all (select 1 from dual) limit 1;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
drop table t1;
|
||||||
|
@ -573,3 +573,37 @@ select * from t1 where a12345678901234567890123456789a1234567890=2;
|
|||||||
a1234567890123456789012345678901234567890 a12345678901234567890123456789a1234567890
|
a1234567890123456789012345678901234567890 a12345678901234567890123456789a1234567890
|
||||||
5 2
|
5 2
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
create table t1
|
||||||
|
(a bigint, b bigint, c bigint, d bigint,
|
||||||
|
primary key (a,b,c,d))
|
||||||
|
engine=ndb
|
||||||
|
max_rows=200000000;
|
||||||
|
Warnings:
|
||||||
|
Warning 1105 Ndb might have problems storing the max amount of rows specified
|
||||||
|
insert into t1 values
|
||||||
|
(1,2,3,4),(2,3,4,5),(3,4,5,6),
|
||||||
|
(3,2,3,4),(1,3,4,5),(2,4,5,6),
|
||||||
|
(1,2,3,5),(2,3,4,8),(3,4,5,9),
|
||||||
|
(3,2,3,5),(1,3,4,8),(2,4,5,9),
|
||||||
|
(1,2,3,6),(2,3,4,6),(3,4,5,7),
|
||||||
|
(3,2,3,6),(1,3,4,6),(2,4,5,7),
|
||||||
|
(1,2,3,7),(2,3,4,7),(3,4,5,8),
|
||||||
|
(3,2,3,7),(1,3,4,7),(2,4,5,8),
|
||||||
|
(1,3,3,4),(2,4,4,5),(3,5,5,6),
|
||||||
|
(3,3,3,4),(1,4,4,5),(2,5,5,6),
|
||||||
|
(1,3,3,5),(2,4,4,8),(3,5,5,9),
|
||||||
|
(3,3,3,5),(1,4,4,8),(2,5,5,9),
|
||||||
|
(1,3,3,6),(2,4,4,6),(3,5,5,7),
|
||||||
|
(3,3,3,6),(1,4,4,6),(2,5,5,7),
|
||||||
|
(1,3,3,7),(2,4,4,7),(3,5,5,8),
|
||||||
|
(3,3,3,7),(1,4,4,7),(2,5,5,8);
|
||||||
|
select count(*) from t1;
|
||||||
|
count(*)
|
||||||
|
48
|
||||||
|
drop table t1;
|
||||||
|
create table t1
|
||||||
|
(a bigint, b bigint, c bigint, d bigint,
|
||||||
|
primary key (a))
|
||||||
|
engine=ndb
|
||||||
|
max_rows=1;
|
||||||
|
drop table t1;
|
||||||
|
@ -2196,15 +2196,3 @@ ERROR 42S22: Reference 'xx' not supported (forward reference in item list)
|
|||||||
select 1 = ALL (select 1 from t1 where 1 = xx ), 1 as xx from DUAL;
|
select 1 = ALL (select 1 from t1 where 1 = xx ), 1 as xx from DUAL;
|
||||||
ERROR 42S22: Reference 'xx' not supported (forward reference in item list)
|
ERROR 42S22: Reference 'xx' not supported (forward reference in item list)
|
||||||
drop table t1;
|
drop table t1;
|
||||||
CREATE TABLE `t1` ( `a` char(3) NOT NULL default '', `b` char(3) NOT NULL default '', `c` char(3) NOT NULL default '', PRIMARY KEY (`a`,`b`,`c`)) ENGINE=InnoDB;
|
|
||||||
CREATE TABLE t2 LIKE t1;
|
|
||||||
INSERT INTO t1 VALUES (1,1,1);
|
|
||||||
INSERT INTO t2 VALUES (1,1,1);
|
|
||||||
PREPARE my_stmt FROM "SELECT t1.b, count(*) FROM t1 group by t1.b having
|
|
||||||
count(*) > ALL (SELECT COUNT(*) FROM t2 WHERE t2.a=1 GROUP By t2.b)";
|
|
||||||
EXECUTE my_stmt;
|
|
||||||
b count(*)
|
|
||||||
EXECUTE my_stmt;
|
|
||||||
b count(*)
|
|
||||||
deallocate prepare my_stmt;
|
|
||||||
drop table t1,t2;
|
|
||||||
|
@ -140,3 +140,15 @@ id date1 coworkerid description sum_used sum_remaining comments
|
|||||||
6 2004-01-01 1 test 22 33 comment
|
6 2004-01-01 1 test 22 33 comment
|
||||||
7 2004-01-01 1 test 22 33 comment
|
7 2004-01-01 1 test 22 33 comment
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
CREATE TABLE `t1` ( `a` char(3) NOT NULL default '', `b` char(3) NOT NULL default '', `c` char(3) NOT NULL default '', PRIMARY KEY (`a`,`b`,`c`)) ENGINE=InnoDB;
|
||||||
|
CREATE TABLE t2 LIKE t1;
|
||||||
|
INSERT INTO t1 VALUES (1,1,1);
|
||||||
|
INSERT INTO t2 VALUES (1,1,1);
|
||||||
|
PREPARE my_stmt FROM "SELECT t1.b, count(*) FROM t1 group by t1.b having
|
||||||
|
count(*) > ALL (SELECT COUNT(*) FROM t2 WHERE t2.a=1 GROUP By t2.b)";
|
||||||
|
EXECUTE my_stmt;
|
||||||
|
b count(*)
|
||||||
|
EXECUTE my_stmt;
|
||||||
|
b count(*)
|
||||||
|
deallocate prepare my_stmt;
|
||||||
|
drop table t1,t2;
|
||||||
|
@ -96,3 +96,11 @@ f2
|
|||||||
19781126
|
19781126
|
||||||
19781126
|
19781126
|
||||||
DROP TABLE t1, t2, t3;
|
DROP TABLE t1, t2, t3;
|
||||||
|
CREATE TABLE t1 (y YEAR);
|
||||||
|
INSERT INTO t1 VALUES ('abc');
|
||||||
|
Warnings:
|
||||||
|
Warning 1265 Data truncated for column 'y' at row 1
|
||||||
|
SELECT * FROM t1;
|
||||||
|
y
|
||||||
|
0000
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -143,6 +143,15 @@ drop table t1;
|
|||||||
create table t1 (f float(54));
|
create table t1 (f float(54));
|
||||||
ERROR 42000: Incorrect column specifier for column 'f'
|
ERROR 42000: Incorrect column specifier for column 'f'
|
||||||
drop table if exists t1;
|
drop table if exists t1;
|
||||||
|
create table t1 (d1 double, d2 double unsigned);
|
||||||
|
insert into t1 set d1 = -1.0;
|
||||||
|
update t1 set d2 = d1;
|
||||||
|
Warnings:
|
||||||
|
Warning 1264 Data truncated; out of range for column 'd2' at row 1
|
||||||
|
select * from t1;
|
||||||
|
d1 d2
|
||||||
|
-1 0
|
||||||
|
drop table t1;
|
||||||
create table t1 (f float(4,3));
|
create table t1 (f float(4,3));
|
||||||
insert into t1 values (-11.0),(-11),("-11"),(11.0),(11),("11");
|
insert into t1 values (-11.0),(-11),("-11"),(11.0),(11),("11");
|
||||||
Warnings:
|
Warnings:
|
||||||
|
@ -1137,3 +1137,39 @@ t1 CREATE TABLE `t1` (
|
|||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
drop table t2;
|
drop table t2;
|
||||||
|
create table t1(a1 int, f1 char(10));
|
||||||
|
create table t2
|
||||||
|
select f2,a1 from (select a1, CAST('2004-12-31' AS DATE) f2 from t1) a
|
||||||
|
union
|
||||||
|
select f2,a1 from (select a1, CAST('2004-12-31' AS DATE) f2 from t1) a
|
||||||
|
order by f2, a1;
|
||||||
|
show columns from t2;
|
||||||
|
Field Type Null Key Default Extra
|
||||||
|
f2 date YES NULL
|
||||||
|
a1 int(11) YES NULL
|
||||||
|
drop table t1, t2;
|
||||||
|
create table t1 (f1 int);
|
||||||
|
create table t2 (f1 int, f2 int ,f3 date);
|
||||||
|
create table t3 (f1 int, f2 char(10));
|
||||||
|
create table t4
|
||||||
|
(
|
||||||
|
select t2.f3 as sdate
|
||||||
|
from t1
|
||||||
|
left outer join t2 on (t1.f1 = t2.f1)
|
||||||
|
inner join t3 on (t2.f2 = t3.f1)
|
||||||
|
order by t1.f1, t3.f1, t2.f3
|
||||||
|
)
|
||||||
|
union
|
||||||
|
(
|
||||||
|
select cast('2004-12-31' as date) as sdate
|
||||||
|
from t1
|
||||||
|
left outer join t2 on (t1.f1 = t2.f1)
|
||||||
|
inner join t3 on (t2.f2 = t3.f1)
|
||||||
|
group by t1.f1
|
||||||
|
order by t1.f1, t3.f1, t2.f3
|
||||||
|
)
|
||||||
|
order by sdate;
|
||||||
|
show columns from t4;
|
||||||
|
Field Type Null Key Default Extra
|
||||||
|
sdate date YES NULL
|
||||||
|
drop table t1, t2, t3, t4;
|
||||||
|
@ -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";
|
||||||
update t1 left join t2 on t1.c1 = t2.c1 set t2.c2 = "t2c2-1" where t1.c3 = 10;
|
update t1 left join t2 on t1.c1 = t2.c1 set t2.c2 = "t2c2-1" where t1.c3 = 10;
|
||||||
drop table t1, t2;
|
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;
|
||||||
|
@ -109,8 +109,8 @@ select @a:=0;
|
|||||||
select @a, @a:=@a+count(*), count(*), @a from t1 group by i;
|
select @a, @a:=@a+count(*), count(*), @a from t1 group by i;
|
||||||
@a @a:=@a+count(*) count(*) @a
|
@a @a:=@a+count(*) count(*) @a
|
||||||
0 1 1 0
|
0 1 1 0
|
||||||
0 2 2 0
|
0 3 2 0
|
||||||
0 3 3 0
|
0 6 3 0
|
||||||
select @a:=0;
|
select @a:=0;
|
||||||
@a:=0
|
@a:=0
|
||||||
0
|
0
|
||||||
|
@ -33,3 +33,5 @@ DROP TABLE t1;
|
|||||||
|
|
||||||
# Bug #8134: Comparison against CHAR(31) at end of string
|
# Bug #8134: Comparison against CHAR(31) at end of string
|
||||||
SELECT CHAR(31) = '', '' = CHAR(31);
|
SELECT CHAR(31) = '', '' = CHAR(31);
|
||||||
|
# Extra test
|
||||||
|
SELECT CHAR(30) = '', '' = CHAR(30);
|
||||||
|
@ -4,7 +4,9 @@ connection con1;
|
|||||||
reset master;
|
reset master;
|
||||||
create database `drop-temp+table-test`;
|
create database `drop-temp+table-test`;
|
||||||
use `drop-temp+table-test`;
|
use `drop-temp+table-test`;
|
||||||
|
create temporary table shortn1 (a int);
|
||||||
create temporary table `table:name` (a int);
|
create temporary table `table:name` (a int);
|
||||||
|
create temporary table shortn2 (a int);
|
||||||
select get_lock("a",10);
|
select get_lock("a",10);
|
||||||
disconnect con1;
|
disconnect con1;
|
||||||
|
|
||||||
@ -15,5 +17,6 @@ connection con2;
|
|||||||
select get_lock("a",10);
|
select get_lock("a",10);
|
||||||
let $VERSION=`select version()`;
|
let $VERSION=`select version()`;
|
||||||
--replace_result $VERSION VERSION
|
--replace_result $VERSION VERSION
|
||||||
|
--replace_column 2 # 5 #
|
||||||
show binlog events;
|
show binlog events;
|
||||||
drop database `drop-temp+table-test`;
|
drop database `drop-temp+table-test`;
|
||||||
|
@ -473,3 +473,17 @@ INSERT INTO t1 VALUES
|
|||||||
|
|
||||||
select val, count(*) from t1 group by val;
|
select val, count(*) from t1 group by val;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug 7833: Wrong datatype of aggregate column is returned
|
||||||
|
#
|
||||||
|
|
||||||
|
create table t1(f1 datetime);
|
||||||
|
insert into t1 values (now());
|
||||||
|
create table t2 select f2 from (select max(now()) f2 from t1) a;
|
||||||
|
show columns from t2;
|
||||||
|
drop table t2;
|
||||||
|
create table t2 select f2 from (select now() f2 from t1) a;
|
||||||
|
show columns from t2;
|
||||||
|
drop table t2, t1;
|
||||||
|
@ -23,3 +23,18 @@ select length(format('nan', 2)) > 0;
|
|||||||
# Test for bug #628
|
# Test for bug #628
|
||||||
#
|
#
|
||||||
select concat("$",format(2500,2));
|
select concat("$",format(2500,2));
|
||||||
|
|
||||||
|
# Test for BUG#7716
|
||||||
|
create table t1 ( a timestamp );
|
||||||
|
insert into t1 values ( '2004-01-06 12:34' );
|
||||||
|
select a from t1 where left(a+0,6) in ( left(20040106,6) );
|
||||||
|
select a from t1 where left(a+0,6) = ( left(20040106,6) );
|
||||||
|
|
||||||
|
select a from t1 where right(a+0,6) in ( right(20040106123400,6) );
|
||||||
|
select a from t1 where right(a+0,6) = ( right(20040106123400,6) );
|
||||||
|
|
||||||
|
select a from t1 where mid(a+0,6,3) in ( mid(20040106123400,6,3) );
|
||||||
|
select a from t1 where mid(a+0,6,3) = ( mid(20040106123400,6,3) );
|
||||||
|
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
@ -195,6 +195,18 @@ select trim(trailing 'foo' from 'foo');
|
|||||||
select trim(leading 'foo' from 'foo');
|
select trim(leading 'foo' from 'foo');
|
||||||
|
|
||||||
#
|
#
|
||||||
|
# crashing bug with QUOTE() and LTRIM() or TRIM() fixed
|
||||||
|
# Bug #7495
|
||||||
|
#
|
||||||
|
|
||||||
|
select quote(ltrim(concat(' ', 'a')));
|
||||||
|
select quote(trim(concat(' ', 'a')));
|
||||||
|
|
||||||
|
# Bad results from QUOTE(). Bug #8248
|
||||||
|
CREATE TABLE t1 SELECT 1 UNION SELECT 2 UNION SELECT 3;
|
||||||
|
SELECT QUOTE('A') FROM t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
# Test collation and coercibility
|
# Test collation and coercibility
|
||||||
#
|
#
|
||||||
|
|
||||||
@ -429,12 +441,6 @@ create table t1 (a int not null primary key, b varchar(40), c datetime);
|
|||||||
insert into t1 (a,b,c) values (1,'Tom','2004-12-10 12:13:14'),(2,'ball games','2004-12-10 12:13:14'), (3,'Basil','2004-12-10 12:13:14'), (4,'Dean','2004-12-10 12:13:14'),(5,'Ellis','2004-12-10 12:13:14'), (6,'Serg','2004-12-10 12:13:14'), (7,'Sergei','2004-12-10 12:13:14'),(8,'Georg','2004-12-10 12:13:14'),(9,'Salle','2004-12-10 12:13:14'),(10,'Sinisa','2004-12-10 12:13:14');
|
insert into t1 (a,b,c) values (1,'Tom','2004-12-10 12:13:14'),(2,'ball games','2004-12-10 12:13:14'), (3,'Basil','2004-12-10 12:13:14'), (4,'Dean','2004-12-10 12:13:14'),(5,'Ellis','2004-12-10 12:13:14'), (6,'Serg','2004-12-10 12:13:14'), (7,'Sergei','2004-12-10 12:13:14'),(8,'Georg','2004-12-10 12:13:14'),(9,'Salle','2004-12-10 12:13:14'),(10,'Sinisa','2004-12-10 12:13:14');
|
||||||
select count(*) as total, left(c,10) as reg from t1 group by reg order by reg desc limit 0,12;
|
select count(*) as total, left(c,10) as reg from t1 group by reg order by reg desc limit 0,12;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
# crashing bug with QUOTE() and LTRIM() or TRIM() fixed
|
|
||||||
# Bug #7495
|
|
||||||
#
|
|
||||||
|
|
||||||
select quote(ltrim(concat(' ', 'a')));
|
|
||||||
select quote(trim(concat(' ', 'a')));
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bug#7455 unexpected result: TRIM(<NULL> FROM <whatever>) gives NOT NULL
|
# Bug#7455 unexpected result: TRIM(<NULL> FROM <whatever>) gives NOT NULL
|
||||||
|
@ -457,15 +457,6 @@ SELECT i, COUNT(DISTINCT(i)) FROM t1 GROUP BY j ORDER BY NULL;
|
|||||||
explain SELECT i, COUNT(DISTINCT(i)) FROM t1 GROUP BY j ORDER BY NULL;
|
explain SELECT i, COUNT(DISTINCT(i)) FROM t1 GROUP BY j ORDER BY NULL;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
# Test for BUG#5400: GROUP_CONCAT returns everything twice.
|
|
||||||
create table t1 ( col1 int, col2 int );
|
|
||||||
insert into t1 values (1,1),(1,2),(1,3),(2,1),(2,2);
|
|
||||||
select group_concat( distinct col1 ) as alias from t1
|
|
||||||
group by col2 having alias like '%';
|
|
||||||
|
|
||||||
drop table t1;
|
|
||||||
|
|
||||||
|
|
||||||
#Test for BUG#6976: Aggregate functions have incorrect NULL-ness
|
#Test for BUG#6976: Aggregate functions have incorrect NULL-ness
|
||||||
create table t1 (a int);
|
create table t1 (a int);
|
||||||
insert into t1 values(null);
|
insert into t1 values(null);
|
||||||
@ -474,3 +465,26 @@ select min(a) is null or null from t1;
|
|||||||
select 1 and min(a) is null from t1;
|
select 1 and min(a) is null from t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
# Test for BUG#5400: GROUP_CONCAT returns everything twice.
|
||||||
|
create table t1 ( col1 int, col2 int );
|
||||||
|
insert into t1 values (1,1),(1,2),(1,3),(2,1),(2,2);
|
||||||
|
select group_concat( distinct col1 ) as alias from t1
|
||||||
|
group by col2 having alias like '%';
|
||||||
|
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Test BUG#8216 when referring in HAVING to n alias which is rand() function
|
||||||
|
#
|
||||||
|
|
||||||
|
create table t1 (a integer, b integer, c integer);
|
||||||
|
insert into t1 (a,b) values (1,2),(1,3),(2,5);
|
||||||
|
select a, 0.1*0+1 r2, sum(1) r1 from t1 where a = 1 group by a having r1>1 and r2=1;
|
||||||
|
select a, rand()*0+1 r2, sum(1) r1 from t1 where a = 1 group by a having r1>1 and r2=1;
|
||||||
|
select a,sum(b) from t1 where a=1 group by c;
|
||||||
|
select a*sum(b) from t1 where a=1 group by c;
|
||||||
|
select sum(a)*sum(b) from t1 where a=1 group by c;
|
||||||
|
select a,sum(b) from t1 where a=1 group by c having a=1;
|
||||||
|
select a as d,sum(b) from t1 where a=1 group by c having d=1;
|
||||||
|
select sum(a)*sum(b) as d from t1 where a=1 group by c having d > 0;
|
||||||
|
drop table t1;
|
||||||
|
@ -49,3 +49,13 @@ SELECT * FROM t1;
|
|||||||
DELETE FROM t1 WHERE id2 = 0 ORDER BY id desc LIMIT 1;
|
DELETE FROM t1 WHERE id2 = 0 ORDER BY id desc LIMIT 1;
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#8023 - limit on UNION with from DUAL, causes syntax error
|
||||||
|
#
|
||||||
|
create table t1 (a integer);
|
||||||
|
insert into t1 values (1);
|
||||||
|
# both queries must return one row
|
||||||
|
select 1 as a from t1 union all select 1 from dual limit 1;
|
||||||
|
(select 1 as a from t1) union all (select 1 from dual) limit 1;
|
||||||
|
drop table t1;
|
||||||
|
@ -199,7 +199,7 @@ insert into t4 values (1, "Automatic");
|
|||||||
select * from t4;
|
select * from t4;
|
||||||
|
|
||||||
# Remove the table from NDB
|
# Remove the table from NDB
|
||||||
system exec $NDB_TOOLS_DIR/ndb_drop_table --no-defaults -d test t4 > /dev/null ;
|
system exec $NDB_TOOLS_DIR/ndb_drop_table --no-defaults -d test t4 >> $NDB_TOOLS_OUTPUT ;
|
||||||
|
|
||||||
#
|
#
|
||||||
# Test that correct error is returned
|
# Test that correct error is returned
|
||||||
@ -230,7 +230,7 @@ select * from t4;
|
|||||||
flush tables;
|
flush tables;
|
||||||
|
|
||||||
# Remove the table from NDB
|
# Remove the table from NDB
|
||||||
system exec $NDB_TOOLS_DIR/ndb_drop_table --no-defaults -d test t4 > /dev/null ;
|
system exec $NDB_TOOLS_DIR/ndb_drop_table --no-defaults -d test t4 >> $NDB_TOOLS_OUTPUT ;
|
||||||
|
|
||||||
SHOW TABLES;
|
SHOW TABLES;
|
||||||
|
|
||||||
@ -264,8 +264,8 @@ insert into t8 values (8, "myisam table 8");
|
|||||||
insert into t9 values (9);
|
insert into t9 values (9);
|
||||||
|
|
||||||
# Remove t3, t5 from NDB
|
# Remove t3, t5 from NDB
|
||||||
system exec $NDB_TOOLS_DIR/ndb_drop_table --no-defaults -d test t3 > /dev/null ;
|
system exec $NDB_TOOLS_DIR/ndb_drop_table --no-defaults -d test t3 >> $NDB_TOOLS_OUTPUT ;
|
||||||
system exec $NDB_TOOLS_DIR/ndb_drop_table --no-defaults -d test t5 > /dev/null ;
|
system exec $NDB_TOOLS_DIR/ndb_drop_table --no-defaults -d test t5 >> $NDB_TOOLS_OUTPUT ;
|
||||||
# Remove t6, t7 from disk
|
# Remove t6, t7 from disk
|
||||||
system rm var/master-data/test/t6.frm > /dev/null ;
|
system rm var/master-data/test/t6.frm > /dev/null ;
|
||||||
system rm var/master-data/test/t7.frm > /dev/null ;
|
system rm var/master-data/test/t7.frm > /dev/null ;
|
||||||
@ -479,4 +479,4 @@ create table t10 (
|
|||||||
|
|
||||||
insert into t10 values (1, 'kalle');
|
insert into t10 values (1, 'kalle');
|
||||||
|
|
||||||
--exec $NDB_TOOLS_DIR/ndb_drop_table --no-defaults -d test `$NDB_TOOLS_DIR/ndb_show_tables --no-defaults | grep BLOB` > /dev/null 2>&1 || true
|
--exec $NDB_TOOLS_DIR/ndb_drop_table --no-defaults -d test `$NDB_TOOLS_DIR/ndb_show_tables --no-defaults | grep BLOB` >> $NDB_TOOLS_OUTPUT 2>&1 || true
|
||||||
|
@ -539,3 +539,41 @@ insert into t1 values (1,1),(2,1),(3,1),(4,1),(5,2),(6,1),(7,1);
|
|||||||
explain select * from t1 where a12345678901234567890123456789a1234567890=2;
|
explain select * from t1 where a12345678901234567890123456789a1234567890=2;
|
||||||
select * from t1 where a12345678901234567890123456789a1234567890=2;
|
select * from t1 where a12345678901234567890123456789a1234567890=2;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# test fragment creation
|
||||||
|
#
|
||||||
|
# first a table with _many_ fragments per node group
|
||||||
|
# then a table with just one fragment per node group
|
||||||
|
#
|
||||||
|
create table t1
|
||||||
|
(a bigint, b bigint, c bigint, d bigint,
|
||||||
|
primary key (a,b,c,d))
|
||||||
|
engine=ndb
|
||||||
|
max_rows=200000000;
|
||||||
|
insert into t1 values
|
||||||
|
(1,2,3,4),(2,3,4,5),(3,4,5,6),
|
||||||
|
(3,2,3,4),(1,3,4,5),(2,4,5,6),
|
||||||
|
(1,2,3,5),(2,3,4,8),(3,4,5,9),
|
||||||
|
(3,2,3,5),(1,3,4,8),(2,4,5,9),
|
||||||
|
(1,2,3,6),(2,3,4,6),(3,4,5,7),
|
||||||
|
(3,2,3,6),(1,3,4,6),(2,4,5,7),
|
||||||
|
(1,2,3,7),(2,3,4,7),(3,4,5,8),
|
||||||
|
(3,2,3,7),(1,3,4,7),(2,4,5,8),
|
||||||
|
(1,3,3,4),(2,4,4,5),(3,5,5,6),
|
||||||
|
(3,3,3,4),(1,4,4,5),(2,5,5,6),
|
||||||
|
(1,3,3,5),(2,4,4,8),(3,5,5,9),
|
||||||
|
(3,3,3,5),(1,4,4,8),(2,5,5,9),
|
||||||
|
(1,3,3,6),(2,4,4,6),(3,5,5,7),
|
||||||
|
(3,3,3,6),(1,4,4,6),(2,5,5,7),
|
||||||
|
(1,3,3,7),(2,4,4,7),(3,5,5,8),
|
||||||
|
(3,3,3,7),(1,4,4,7),(2,5,5,8);
|
||||||
|
select count(*) from t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
create table t1
|
||||||
|
(a bigint, b bigint, c bigint, d bigint,
|
||||||
|
primary key (a))
|
||||||
|
engine=ndb
|
||||||
|
max_rows=1;
|
||||||
|
drop table t1;
|
||||||
|
@ -141,10 +141,10 @@ create table t8_c engine=ndbcluster as select * from t8;
|
|||||||
create table t9_c engine=ndbcluster as select * from t9;
|
create table t9_c engine=ndbcluster as select * from t9;
|
||||||
|
|
||||||
|
|
||||||
--exec $NDB_MGM --no-defaults -e "start backup" > /dev/null
|
--exec $NDB_MGM --no-defaults -e "start backup" >> $NDB_TOOLS_OUTPUT
|
||||||
drop table t1_c,t2_c,t3_c,t4_c,t5_c,t6_c,t7_c,t8_c,t9_c;
|
drop table t1_c,t2_c,t3_c,t4_c,t5_c,t6_c,t7_c,t8_c,t9_c;
|
||||||
--exec $NDB_TOOLS_DIR/ndb_restore --no-defaults -b 1 -n 1 -m -r --print --print_meta $NDB_BACKUP_DIR/BACKUP/BACKUP-1 > /tmp/ndb_restore.out
|
--exec $NDB_TOOLS_DIR/ndb_restore --no-defaults -b 1 -n 1 -m -r --print --print_meta $NDB_BACKUP_DIR/BACKUP/BACKUP-1 >> $NDB_TOOLS_OUTPUT
|
||||||
--exec $NDB_TOOLS_DIR/ndb_restore --no-defaults -b 1 -n 2 -r --print --print_meta $NDB_BACKUP_DIR/BACKUP/BACKUP-1 > /tmp/ndb_restore.out
|
--exec $NDB_TOOLS_DIR/ndb_restore --no-defaults -b 1 -n 2 -r --print --print_meta $NDB_BACKUP_DIR/BACKUP/BACKUP-1 >> $NDB_TOOLS_OUTPUT
|
||||||
|
|
||||||
show tables;
|
show tables;
|
||||||
|
|
||||||
|
@ -1465,17 +1465,3 @@ select 1 = ALL (select 1 from t1 where 1 = xx ), 1 as xx;
|
|||||||
-- error 1247
|
-- error 1247
|
||||||
select 1 = ALL (select 1 from t1 where 1 = xx ), 1 as xx from DUAL;
|
select 1 = ALL (select 1 from t1 where 1 = xx ), 1 as xx from DUAL;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
#
|
|
||||||
# cleaning up of results of subselects (BUG#8125)
|
|
||||||
#
|
|
||||||
CREATE TABLE `t1` ( `a` char(3) NOT NULL default '', `b` char(3) NOT NULL default '', `c` char(3) NOT NULL default '', PRIMARY KEY (`a`,`b`,`c`)) ENGINE=InnoDB;
|
|
||||||
CREATE TABLE t2 LIKE t1;
|
|
||||||
INSERT INTO t1 VALUES (1,1,1);
|
|
||||||
INSERT INTO t2 VALUES (1,1,1);
|
|
||||||
PREPARE my_stmt FROM "SELECT t1.b, count(*) FROM t1 group by t1.b having
|
|
||||||
count(*) > ALL (SELECT COUNT(*) FROM t2 WHERE t2.a=1 GROUP By t2.b)";
|
|
||||||
EXECUTE my_stmt;
|
|
||||||
EXECUTE my_stmt;
|
|
||||||
deallocate prepare my_stmt;
|
|
||||||
drop table t1,t2;
|
|
||||||
|
@ -145,3 +145,17 @@ SELECT DISTINCT
|
|||||||
FROM t1;
|
FROM t1;
|
||||||
select * from t1;
|
select * from t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# cleaning up of results of subselects (BUG#8125)
|
||||||
|
#
|
||||||
|
CREATE TABLE `t1` ( `a` char(3) NOT NULL default '', `b` char(3) NOT NULL default '', `c` char(3) NOT NULL default '', PRIMARY KEY (`a`,`b`,`c`)) ENGINE=InnoDB;
|
||||||
|
CREATE TABLE t2 LIKE t1;
|
||||||
|
INSERT INTO t1 VALUES (1,1,1);
|
||||||
|
INSERT INTO t2 VALUES (1,1,1);
|
||||||
|
PREPARE my_stmt FROM "SELECT t1.b, count(*) FROM t1 group by t1.b having
|
||||||
|
count(*) > ALL (SELECT COUNT(*) FROM t2 WHERE t2.a=1 GROUP By t2.b)";
|
||||||
|
EXECUTE my_stmt;
|
||||||
|
EXECUTE my_stmt;
|
||||||
|
deallocate prepare my_stmt;
|
||||||
|
drop table t1,t2;
|
||||||
|
@ -107,3 +107,10 @@ SELECT * FROM t2;
|
|||||||
SELECT * FROM t3;
|
SELECT * FROM t3;
|
||||||
|
|
||||||
DROP TABLE t1, t2, t3;
|
DROP TABLE t1, t2, t3;
|
||||||
|
|
||||||
|
# Test that setting YEAR to invalid string results in default value, not
|
||||||
|
# 2000. (Bug #6067)
|
||||||
|
CREATE TABLE t1 (y YEAR);
|
||||||
|
INSERT INTO t1 VALUES ('abc');
|
||||||
|
SELECT * FROM t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -664,3 +664,38 @@ show create table t1;
|
|||||||
drop table t1;
|
drop table t1;
|
||||||
drop table t2;
|
drop table t2;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug 6931: Date Type column problem when using UNION-Table.
|
||||||
|
#
|
||||||
|
create table t1(a1 int, f1 char(10));
|
||||||
|
create table t2
|
||||||
|
select f2,a1 from (select a1, CAST('2004-12-31' AS DATE) f2 from t1) a
|
||||||
|
union
|
||||||
|
select f2,a1 from (select a1, CAST('2004-12-31' AS DATE) f2 from t1) a
|
||||||
|
order by f2, a1;
|
||||||
|
show columns from t2;
|
||||||
|
drop table t1, t2;
|
||||||
|
|
||||||
|
create table t1 (f1 int);
|
||||||
|
create table t2 (f1 int, f2 int ,f3 date);
|
||||||
|
create table t3 (f1 int, f2 char(10));
|
||||||
|
create table t4
|
||||||
|
(
|
||||||
|
select t2.f3 as sdate
|
||||||
|
from t1
|
||||||
|
left outer join t2 on (t1.f1 = t2.f1)
|
||||||
|
inner join t3 on (t2.f2 = t3.f1)
|
||||||
|
order by t1.f1, t3.f1, t2.f3
|
||||||
|
)
|
||||||
|
union
|
||||||
|
(
|
||||||
|
select cast('2004-12-31' as date) as sdate
|
||||||
|
from t1
|
||||||
|
left outer join t2 on (t1.f1 = t2.f1)
|
||||||
|
inner join t3 on (t2.f2 = t3.f1)
|
||||||
|
group by t1.f1
|
||||||
|
order by t1.f1, t3.f1, t2.f3
|
||||||
|
)
|
||||||
|
order by sdate;
|
||||||
|
show columns from t4;
|
||||||
|
drop table t1, t2, t3, t4;
|
||||||
|
@ -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";
|
||||||
update t1 left join t2 on t1.c1 = t2.c1 set t2.c2 = "t2c2-1" where t1.c3 = 10;
|
update t1 left join t2 on t1.c1 = t2.c1 set t2.c2 = "t2c2-1" where t1.c3 = 10;
|
||||||
drop table t1, t2;
|
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;
|
||||||
|
@ -43,7 +43,7 @@ static int compare_bin(uchar *a, uint a_length, uchar *b, uint b_length,
|
|||||||
return 0;
|
return 0;
|
||||||
if (skip_end_space && a_length != b_length)
|
if (skip_end_space && a_length != b_length)
|
||||||
{
|
{
|
||||||
int swap= 0;
|
int swap= 1;
|
||||||
/*
|
/*
|
||||||
We are using space compression. We have to check if longer key
|
We are using space compression. We have to check if longer key
|
||||||
has next character < ' ', in which case it's less than the shorter
|
has next character < ' ', in which case it's less than the shorter
|
||||||
@ -57,12 +57,12 @@ static int compare_bin(uchar *a, uint a_length, uchar *b, uint b_length,
|
|||||||
/* put shorter key in a */
|
/* put shorter key in a */
|
||||||
a_length= b_length;
|
a_length= b_length;
|
||||||
a= b;
|
a= b;
|
||||||
swap= -1 ^ 1; /* swap sign of result */
|
swap= -1; /* swap sign of result */
|
||||||
}
|
}
|
||||||
for (end= a + a_length-length; a < end ; a++)
|
for (end= a + a_length-length; a < end ; a++)
|
||||||
{
|
{
|
||||||
if (*a != ' ')
|
if (*a != ' ')
|
||||||
return ((int) *a - (int) ' ') ^ swap;
|
return (*a < ' ') ? -swap : swap;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -687,6 +687,8 @@ private:
|
|||||||
|
|
||||||
void remove_list(NdbOperation*& head, NdbOperation*);
|
void remove_list(NdbOperation*& head, NdbOperation*);
|
||||||
void define_scan_op(NdbIndexScanOperation*);
|
void define_scan_op(NdbIndexScanOperation*);
|
||||||
|
|
||||||
|
friend class HugoOperations;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline
|
inline
|
||||||
|
@ -141,9 +141,9 @@ public:
|
|||||||
enum FragmentType {
|
enum FragmentType {
|
||||||
FragUndefined = 0, ///< Fragmentation type undefined or default
|
FragUndefined = 0, ///< Fragmentation type undefined or default
|
||||||
FragSingle = 1, ///< Only one fragment
|
FragSingle = 1, ///< Only one fragment
|
||||||
FragAllSmall = 2, ///< One fragment per node group
|
FragAllSmall = 2, ///< One fragment per node, default
|
||||||
FragAllMedium = 3, ///< Default value. Two fragments per node group.
|
FragAllMedium = 3, ///< two fragments per node
|
||||||
FragAllLarge = 4 ///< Eight fragments per node group.
|
FragAllLarge = 4 ///< Four fragments per node.
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ int NdbThread_WaitFor(struct NdbThread* p_wait_thread, void** status);
|
|||||||
*
|
*
|
||||||
* * status: exit code
|
* * status: exit code
|
||||||
*/
|
*/
|
||||||
void NdbThread_Exit(int status);
|
void NdbThread_Exit(void *status);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set thread concurrency level
|
* Set thread concurrency level
|
||||||
|
@ -54,10 +54,7 @@ extern "C" void* thread1func(void* arg)
|
|||||||
if (arg1 != 7)
|
if (arg1 != 7)
|
||||||
fail("TEST1", "Wrong arg");
|
fail("TEST1", "Wrong arg");
|
||||||
|
|
||||||
NdbThread_Exit(returnvalue);
|
return returnvalue;
|
||||||
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// test 2 variables and funcs
|
// test 2 variables and funcs
|
||||||
@ -80,10 +77,7 @@ extern "C" void* test2func(void* arg)
|
|||||||
fail("TEST2", "Failed to unlock mutex");
|
fail("TEST2", "Failed to unlock mutex");
|
||||||
|
|
||||||
int returnvalue = arg1;
|
int returnvalue = arg1;
|
||||||
NdbThread_Exit(returnvalue);
|
return returnvalue;
|
||||||
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -129,8 +123,7 @@ extern "C" void* testfunc(void* arg)
|
|||||||
}
|
}
|
||||||
while(tmpVar<100);
|
while(tmpVar<100);
|
||||||
|
|
||||||
NdbThread_Exit(0);
|
return 0;
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" void* testTryLockfunc(void* arg)
|
extern "C" void* testTryLockfunc(void* arg)
|
||||||
@ -169,8 +162,7 @@ extern "C" void* testTryLockfunc(void* arg)
|
|||||||
}
|
}
|
||||||
while(tmpVar<100);
|
while(tmpVar<100);
|
||||||
|
|
||||||
NdbThread_Exit(0);
|
return 0;
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
#include <ndb_global.h>
|
#include <ndb_global.h>
|
||||||
#include <NdbThread.h>
|
#include <NdbThread.h>
|
||||||
#include <pthread.h>
|
#include <my_pthread.h>
|
||||||
#include <NdbMem.h>
|
#include <NdbMem.h>
|
||||||
|
|
||||||
#define MAX_THREAD_NAME 16
|
#define MAX_THREAD_NAME 16
|
||||||
@ -39,8 +39,8 @@ struct NdbThread
|
|||||||
static
|
static
|
||||||
void*
|
void*
|
||||||
ndb_thread_wrapper(void* _ss){
|
ndb_thread_wrapper(void* _ss){
|
||||||
void * ret;
|
my_thread_init();
|
||||||
struct NdbThread * ss = (struct NdbThread *)_ss;
|
{
|
||||||
DBUG_ENTER("ndb_thread_wrapper");
|
DBUG_ENTER("ndb_thread_wrapper");
|
||||||
#ifdef NDB_SHM_TRANSPORTER
|
#ifdef NDB_SHM_TRANSPORTER
|
||||||
if (g_ndb_shm_signum)
|
if (g_ndb_shm_signum)
|
||||||
@ -52,8 +52,15 @@ ndb_thread_wrapper(void* _ss){
|
|||||||
pthread_sigmask(SIG_BLOCK, &mask, 0);
|
pthread_sigmask(SIG_BLOCK, &mask, 0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
{
|
||||||
|
void *ret;
|
||||||
|
struct NdbThread * ss = (struct NdbThread *)_ss;
|
||||||
ret= (* ss->func)(ss->object);
|
ret= (* ss->func)(ss->object);
|
||||||
DBUG_RETURN(ret);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1104,11 +1104,8 @@ TransporterRegistry::setIOState(NodeId nodeId, IOState state) {
|
|||||||
static void *
|
static void *
|
||||||
run_start_clients_C(void * me)
|
run_start_clients_C(void * me)
|
||||||
{
|
{
|
||||||
my_thread_init();
|
|
||||||
((TransporterRegistry*) me)->start_clients_thread();
|
((TransporterRegistry*) me)->start_clients_thread();
|
||||||
my_thread_end();
|
return 0;
|
||||||
NdbThread_Exit(0);
|
|
||||||
return me;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run by kernel thread
|
// Run by kernel thread
|
||||||
|
@ -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;
|
union { const Uint32* p; const unsigned char* v; } u1, u2;
|
||||||
u1.p = p1;
|
u1.p = p1;
|
||||||
u2.p = p2;
|
u2.p = p2;
|
||||||
|
#ifdef ndb_date_sol9x86_cc_xO3_madness
|
||||||
// from Field_newdate::val_int
|
// from Field_newdate::val_int
|
||||||
Uint64 j1 = uint3korr(u1.v);
|
Uint64 j1 = uint3korr(u1.v);
|
||||||
Uint64 j2 = uint3korr(u2.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)
|
if (j1 > j2)
|
||||||
return +1;
|
return +1;
|
||||||
return 0;
|
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
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,11 +186,7 @@ extern "C"
|
|||||||
void*
|
void*
|
||||||
socketServerThread_C(void* _ss){
|
socketServerThread_C(void* _ss){
|
||||||
SocketServer * ss = (SocketServer *)_ss;
|
SocketServer * ss = (SocketServer *)_ss;
|
||||||
|
|
||||||
my_thread_init();
|
|
||||||
ss->doRun();
|
ss->doRun();
|
||||||
my_thread_end();
|
|
||||||
NdbThread_Exit(0);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -309,11 +305,8 @@ void*
|
|||||||
sessionThread_C(void* _sc){
|
sessionThread_C(void* _sc){
|
||||||
SocketServer::Session * si = (SocketServer::Session *)_sc;
|
SocketServer::Session * si = (SocketServer::Session *)_sc;
|
||||||
|
|
||||||
my_thread_init();
|
|
||||||
if(!transfer(si->m_socket)){
|
if(!transfer(si->m_socket)){
|
||||||
si->m_stopped = true;
|
si->m_stopped = true;
|
||||||
my_thread_end();
|
|
||||||
NdbThread_Exit(0);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -325,8 +318,6 @@ sessionThread_C(void* _sc){
|
|||||||
}
|
}
|
||||||
|
|
||||||
si->m_stopped = true;
|
si->m_stopped = true;
|
||||||
my_thread_end();
|
|
||||||
NdbThread_Exit(0);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5704,7 +5704,8 @@ void Dbacc::commitOperation(Signal* signal)
|
|||||||
Uint32 tmp2Olq;
|
Uint32 tmp2Olq;
|
||||||
|
|
||||||
if ((operationRecPtr.p->commitDeleteCheckFlag == ZFALSE) &&
|
if ((operationRecPtr.p->commitDeleteCheckFlag == ZFALSE) &&
|
||||||
(operationRecPtr.p->operation != ZSCAN_OP)) {
|
(operationRecPtr.p->operation != ZSCAN_OP) &&
|
||||||
|
(operationRecPtr.p->operation != ZREAD)) {
|
||||||
jam();
|
jam();
|
||||||
/* This method is used to check whether the end result of the transaction
|
/* This method is used to check whether the end result of the transaction
|
||||||
will be to delete the tuple. In this case all operation will be marked
|
will be to delete the tuple. In this case all operation will be marked
|
||||||
|
@ -6178,7 +6178,7 @@ void Dbdih::execCREATE_FRAGMENTATION_REQ(Signal * signal){
|
|||||||
break;
|
break;
|
||||||
case DictTabInfo::AllNodesMediumTable:
|
case DictTabInfo::AllNodesMediumTable:
|
||||||
jam();
|
jam();
|
||||||
noOfFragments = csystemnodes;
|
noOfFragments = 2 * csystemnodes;
|
||||||
break;
|
break;
|
||||||
case DictTabInfo::AllNodesLargeTable:
|
case DictTabInfo::AllNodesLargeTable:
|
||||||
jam();
|
jam();
|
||||||
|
@ -8719,13 +8719,14 @@ void Dblqh::finishScanrec(Signal* signal)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ndbrequire(restart.p->scanState == ScanRecord::IN_QUEUE);
|
||||||
|
|
||||||
ScanRecordPtr tmpScan = scanptr;
|
ScanRecordPtr tmpScan = scanptr;
|
||||||
TcConnectionrecPtr tmpTc = tcConnectptr;
|
TcConnectionrecPtr tmpTc = tcConnectptr;
|
||||||
|
|
||||||
tcConnectptr.i = restart.p->scanTcrec;
|
tcConnectptr.i = restart.p->scanTcrec;
|
||||||
ptrCheckGuard(tcConnectptr, ctcConnectrecFileSize, tcConnectionrec);
|
ptrCheckGuard(tcConnectptr, ctcConnectrecFileSize, tcConnectionrec);
|
||||||
restart.p->scanNumber = scanNumber;
|
restart.p->scanNumber = scanNumber;
|
||||||
restart.p->scanState = ScanRecord::WAIT_ACC_SCAN;
|
|
||||||
|
|
||||||
queue.remove(restart);
|
queue.remove(restart);
|
||||||
scans.add(restart);
|
scans.add(restart);
|
||||||
@ -8741,9 +8742,17 @@ void Dblqh::finishScanrec(Signal* signal)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
restart.p->scanState = ScanRecord::SCAN_FREE; // set in initScanRec
|
||||||
|
if(tcConnectptr.p->transactionState == TcConnectionrec::SCAN_STATE_USED)
|
||||||
|
{
|
||||||
|
jam();
|
||||||
scanptr = restart;
|
scanptr = restart;
|
||||||
continueAfterReceivingAllAiLab(signal);
|
continueAfterReceivingAllAiLab(signal);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ndbrequire(tcConnectptr.p->transactionState == TcConnectionrec::WAIT_SCAN_AI);
|
||||||
|
}
|
||||||
scanptr = tmpScan;
|
scanptr = tmpScan;
|
||||||
tcConnectptr = tmpTc;
|
tcConnectptr = tmpTc;
|
||||||
}//Dblqh::finishScanrec()
|
}//Dblqh::finishScanrec()
|
||||||
|
@ -9028,6 +9028,8 @@ void Dbtc::execDIGETPRIMCONF(Signal* signal)
|
|||||||
scanFragptr.p->lqhBlockref = ref;
|
scanFragptr.p->lqhBlockref = ref;
|
||||||
scanFragptr.p->m_connectCount = getNodeInfo(tnodeid).m_connectCount;
|
scanFragptr.p->m_connectCount = getNodeInfo(tnodeid).m_connectCount;
|
||||||
sendScanFragReq(signal, scanptr.p, scanFragptr.p);
|
sendScanFragReq(signal, scanptr.p, scanFragptr.p);
|
||||||
|
if(ERROR_INSERTED(8035))
|
||||||
|
globalTransporterRegistry.performSend();
|
||||||
attrbufptr.i = cachePtr.p->firstAttrbuf;
|
attrbufptr.i = cachePtr.p->firstAttrbuf;
|
||||||
while (attrbufptr.i != RNIL) {
|
while (attrbufptr.i != RNIL) {
|
||||||
jam();
|
jam();
|
||||||
@ -9037,6 +9039,8 @@ void Dbtc::execDIGETPRIMCONF(Signal* signal)
|
|||||||
attrbufptr.p,
|
attrbufptr.p,
|
||||||
ref);
|
ref);
|
||||||
attrbufptr.i = attrbufptr.p->attrbuf[ZINBUF_NEXT];
|
attrbufptr.i = attrbufptr.p->attrbuf[ZINBUF_NEXT];
|
||||||
|
if(ERROR_INSERTED(8035))
|
||||||
|
globalTransporterRegistry.performSend();
|
||||||
}//while
|
}//while
|
||||||
scanFragptr.p->scanFragState = ScanFragRec::LQH_ACTIVE;
|
scanFragptr.p->scanFragState = ScanFragRec::LQH_ACTIVE;
|
||||||
scanFragptr.p->startFragTimer(ctcTimer);
|
scanFragptr.p->startFragTimer(ctcTimer);
|
||||||
|
@ -82,7 +82,6 @@ static int numAsyncFiles = 0;
|
|||||||
|
|
||||||
extern "C" void * runAsyncFile(void* arg)
|
extern "C" void * runAsyncFile(void* arg)
|
||||||
{
|
{
|
||||||
my_thread_init();
|
|
||||||
((AsyncFile*)arg)->run();
|
((AsyncFile*)arg)->run();
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
@ -876,8 +875,6 @@ void AsyncFile::endReq()
|
|||||||
{
|
{
|
||||||
// Thread is ended with return
|
// Thread is ended with return
|
||||||
if (theWriteBuffer) NdbMem_Free(theWriteBuffer);
|
if (theWriteBuffer) NdbMem_Free(theWriteBuffer);
|
||||||
my_thread_end();
|
|
||||||
NdbThread_Exit(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -40,7 +40,6 @@ extern "C" void* runProducer(void*arg)
|
|||||||
NdbSleep_MilliSleep(i);
|
NdbSleep_MilliSleep(i);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
NdbThread_Exit(0);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,7 +57,6 @@ extern "C" void* runConsumer(void* arg)
|
|||||||
delete p;
|
delete p;
|
||||||
|
|
||||||
}
|
}
|
||||||
NdbThread_Exit(0);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,7 +90,6 @@ extern "C" void* runProducer2(void*arg)
|
|||||||
NdbSleep_MilliSleep(i);
|
NdbSleep_MilliSleep(i);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
NdbThread_Exit(0);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,7 +108,6 @@ extern "C" void* runConsumer2(void* arg)
|
|||||||
delete p;
|
delete p;
|
||||||
}
|
}
|
||||||
ndbout << "Consumer2: " << count << " received" << endl;
|
ndbout << "Consumer2: " << count << " received" << endl;
|
||||||
NdbThread_Exit(0);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,11 +76,16 @@ FastScheduler::activateSendPacked()
|
|||||||
globalData.loopMax = 2048;
|
globalData.loopMax = 2048;
|
||||||
}//FastScheduler::activateSendPacked()
|
}//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
|
void
|
||||||
FastScheduler::doJob()
|
FastScheduler::doJob()
|
||||||
{
|
{
|
||||||
do{
|
Uint32 init_loopCount = 0;
|
||||||
Uint32 loopCount = 0;
|
|
||||||
Uint32 TminLoops = getBOccupancy() + EXTRA_SIGNALS_PER_DO_JOB;
|
Uint32 TminLoops = getBOccupancy() + EXTRA_SIGNALS_PER_DO_JOB;
|
||||||
Uint32 TloopMax = (Uint32)globalData.loopMax;
|
Uint32 TloopMax = (Uint32)globalData.loopMax;
|
||||||
if (TminLoops < TloopMax) {
|
if (TminLoops < TloopMax) {
|
||||||
@ -89,6 +94,8 @@ FastScheduler::doJob()
|
|||||||
if (TloopMax < MIN_NUMBER_OF_SIG_PER_DO_JOB) {
|
if (TloopMax < MIN_NUMBER_OF_SIG_PER_DO_JOB) {
|
||||||
TloopMax = MIN_NUMBER_OF_SIG_PER_DO_JOB;
|
TloopMax = MIN_NUMBER_OF_SIG_PER_DO_JOB;
|
||||||
}//if
|
}//if
|
||||||
|
do{
|
||||||
|
Uint32 loopCount = init_loopCount;
|
||||||
register Uint32 tHighPrio = globalData.highestAvailablePrio;
|
register Uint32 tHighPrio = globalData.highestAvailablePrio;
|
||||||
register Signal* signal = getVMSignals();
|
register Signal* signal = getVMSignals();
|
||||||
while ((tHighPrio < LEVEL_IDLE) && (loopCount < TloopMax)) {
|
while ((tHighPrio < LEVEL_IDLE) && (loopCount < TloopMax)) {
|
||||||
@ -151,7 +158,7 @@ FastScheduler::doJob()
|
|||||||
if (globalData.sendPackedActivated == 1) {
|
if (globalData.sendPackedActivated == 1) {
|
||||||
Uint32 t1 = theDoJobTotalCounter;
|
Uint32 t1 = theDoJobTotalCounter;
|
||||||
Uint32 t2 = theDoJobCallCounter;
|
Uint32 t2 = theDoJobCallCounter;
|
||||||
t1 += loopCount;
|
t1 += (loopCount - init_loopCount);
|
||||||
t2++;
|
t2++;
|
||||||
theDoJobTotalCounter = t1;
|
theDoJobTotalCounter = t1;
|
||||||
theDoJobCallCounter = t2;
|
theDoJobCallCounter = t2;
|
||||||
@ -161,7 +168,11 @@ FastScheduler::doJob()
|
|||||||
theDoJobTotalCounter = 0;
|
theDoJobTotalCounter = 0;
|
||||||
}//if
|
}//if
|
||||||
}//if
|
}//if
|
||||||
} while (getBOccupancy() > MAX_OCCUPANCY);
|
init_loopCount = loopCount;
|
||||||
|
sendPacked();
|
||||||
|
} while ((getBOccupancy() > MAX_OCCUPANCY) ||
|
||||||
|
((init_loopCount < TloopMax) &&
|
||||||
|
(globalData.highestAvailablePrio < LEVEL_IDLE)));
|
||||||
}//FastScheduler::doJob()
|
}//FastScheduler::doJob()
|
||||||
|
|
||||||
void FastScheduler::sendPacked()
|
void FastScheduler::sendPacked()
|
||||||
|
@ -173,9 +173,6 @@ void ThreadConfig::ipControlLoop()
|
|||||||
// until all buffers are empty or until we have executed 2048 signals.
|
// until all buffers are empty or until we have executed 2048 signals.
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
globalScheduler.doJob();
|
globalScheduler.doJob();
|
||||||
|
|
||||||
globalScheduler.sendPacked();
|
|
||||||
|
|
||||||
}//while
|
}//while
|
||||||
|
|
||||||
globalData.incrementWatchDogCounter(6);
|
globalData.incrementWatchDogCounter(6);
|
||||||
|
@ -27,10 +27,7 @@
|
|||||||
extern "C"
|
extern "C"
|
||||||
void*
|
void*
|
||||||
runWatchDog(void* w){
|
runWatchDog(void* w){
|
||||||
my_thread_init();
|
|
||||||
((WatchDog*)w)->run();
|
((WatchDog*)w)->run();
|
||||||
my_thread_end();
|
|
||||||
NdbThread_Exit(0);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -457,8 +457,6 @@ event_thread_run(void* m)
|
|||||||
{
|
{
|
||||||
NdbMgmHandle handle= *(NdbMgmHandle*)m;
|
NdbMgmHandle handle= *(NdbMgmHandle*)m;
|
||||||
|
|
||||||
my_thread_init();
|
|
||||||
|
|
||||||
int filter[] = { 15, NDB_MGM_EVENT_CATEGORY_BACKUP, 0 };
|
int filter[] = { 15, NDB_MGM_EVENT_CATEGORY_BACKUP, 0 };
|
||||||
int fd = ndb_mgm_listen_event(handle, filter);
|
int fd = ndb_mgm_listen_event(handle, filter);
|
||||||
if (fd > 0)
|
if (fd > 0)
|
||||||
@ -478,9 +476,7 @@ event_thread_run(void* m)
|
|||||||
do_event_thread= -1;
|
do_event_thread= -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
my_thread_end();
|
return NULL;
|
||||||
NdbThread_Exit(0);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
@ -3192,13 +3192,27 @@ fixShmKey(InitConfigFileParser::Context & ctx, const char *)
|
|||||||
{
|
{
|
||||||
DBUG_ENTER("fixShmKey");
|
DBUG_ENTER("fixShmKey");
|
||||||
{
|
{
|
||||||
|
static int last_signum= -1;
|
||||||
Uint32 signum;
|
Uint32 signum;
|
||||||
if(!ctx.m_currentSection->get("Signum", &signum))
|
if(!ctx.m_currentSection->get("Signum", &signum))
|
||||||
{
|
{
|
||||||
signum= OPT_NDB_SHM_SIGNUM_DEFAULT;
|
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);
|
ctx.m_currentSection->put("Signum", signum);
|
||||||
DBUG_PRINT("info",("Added Signum=%u", 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;
|
Uint32 id1= 0, id2= 0, key= 0;
|
||||||
|
@ -70,12 +70,7 @@ void *
|
|||||||
MgmtSrvr::logLevelThread_C(void* m)
|
MgmtSrvr::logLevelThread_C(void* m)
|
||||||
{
|
{
|
||||||
MgmtSrvr *mgm = (MgmtSrvr*)m;
|
MgmtSrvr *mgm = (MgmtSrvr*)m;
|
||||||
my_thread_init();
|
|
||||||
mgm->logLevelThreadRun();
|
mgm->logLevelThreadRun();
|
||||||
|
|
||||||
my_thread_end();
|
|
||||||
NdbThread_Exit(0);
|
|
||||||
/* NOTREACHED */
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,12 +78,7 @@ void *
|
|||||||
MgmtSrvr::signalRecvThread_C(void *m)
|
MgmtSrvr::signalRecvThread_C(void *m)
|
||||||
{
|
{
|
||||||
MgmtSrvr *mgm = (MgmtSrvr*)m;
|
MgmtSrvr *mgm = (MgmtSrvr*)m;
|
||||||
my_thread_init();
|
|
||||||
mgm->signalRecvThreadRun();
|
mgm->signalRecvThreadRun();
|
||||||
|
|
||||||
my_thread_end();
|
|
||||||
NdbThread_Exit(0);
|
|
||||||
/* NOTREACHED */
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,7 +54,6 @@ runClusterMgr_C(void * me)
|
|||||||
#ifdef NDB_OSE
|
#ifdef NDB_OSE
|
||||||
NdbSleep_MilliSleep(50);
|
NdbSleep_MilliSleep(50);
|
||||||
#endif
|
#endif
|
||||||
NdbThread_Exit(0);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -560,10 +559,7 @@ extern "C"
|
|||||||
void*
|
void*
|
||||||
runArbitMgr_C(void* me)
|
runArbitMgr_C(void* me)
|
||||||
{
|
{
|
||||||
my_thread_init();
|
|
||||||
((ArbitMgr*) me)->threadMain();
|
((ArbitMgr*) me)->threadMain();
|
||||||
my_thread_end();
|
|
||||||
NdbThread_Exit(0);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,7 +284,7 @@ void
|
|||||||
NdbTableImpl::init(){
|
NdbTableImpl::init(){
|
||||||
clearNewProperties();
|
clearNewProperties();
|
||||||
m_frm.clear();
|
m_frm.clear();
|
||||||
m_fragmentType = NdbDictionary::Object::FragAllMedium;
|
m_fragmentType = NdbDictionary::Object::FragAllSmall;
|
||||||
m_logging = true;
|
m_logging = true;
|
||||||
m_kvalue = 6;
|
m_kvalue = 6;
|
||||||
m_minLoadFactor = 78;
|
m_minLoadFactor = 78;
|
||||||
|
@ -405,11 +405,8 @@ extern "C"
|
|||||||
void*
|
void*
|
||||||
runSendRequest_C(void * me)
|
runSendRequest_C(void * me)
|
||||||
{
|
{
|
||||||
my_thread_init();
|
|
||||||
((TransporterFacade*) me)->threadMainSend();
|
((TransporterFacade*) me)->threadMainSend();
|
||||||
my_thread_end();
|
return 0;
|
||||||
NdbThread_Exit(0);
|
|
||||||
return me;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TransporterFacade::threadMainSend(void)
|
void TransporterFacade::threadMainSend(void)
|
||||||
@ -443,11 +440,8 @@ extern "C"
|
|||||||
void*
|
void*
|
||||||
runReceiveResponse_C(void * me)
|
runReceiveResponse_C(void * me)
|
||||||
{
|
{
|
||||||
my_thread_init();
|
|
||||||
((TransporterFacade*) me)->threadMainReceive();
|
((TransporterFacade*) me)->threadMainReceive();
|
||||||
my_thread_end();
|
return 0;
|
||||||
NdbThread_Exit(0);
|
|
||||||
return me;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TransporterFacade::threadMainReceive(void)
|
void TransporterFacade::threadMainReceive(void)
|
||||||
|
@ -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)
|
extern "C" pthread_handler_decl(run_ndb_cluster_connection_connect_thread, me)
|
||||||
{
|
{
|
||||||
my_thread_init();
|
|
||||||
g_run_connect_thread= 1;
|
g_run_connect_thread= 1;
|
||||||
((Ndb_cluster_connection_impl*) me)->connect_thread();
|
((Ndb_cluster_connection_impl*) me)->connect_thread();
|
||||||
my_thread_end();
|
|
||||||
NdbThread_Exit(0);
|
|
||||||
return me;
|
return me;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,6 +31,8 @@ public:
|
|||||||
NdbConnection* getTransaction();
|
NdbConnection* getTransaction();
|
||||||
void refresh();
|
void refresh();
|
||||||
|
|
||||||
|
void setTransactionId(Uint64);
|
||||||
|
|
||||||
int pkInsertRecord(Ndb*,
|
int pkInsertRecord(Ndb*,
|
||||||
int recordNo,
|
int recordNo,
|
||||||
int numRecords = 1,
|
int numRecords = 1,
|
||||||
|
@ -225,6 +225,8 @@ protected:
|
|||||||
void stopTimer(NDBT_Context*);
|
void stopTimer(NDBT_Context*);
|
||||||
void printTimer(NDBT_Context*);
|
void printTimer(NDBT_Context*);
|
||||||
|
|
||||||
|
BaseString _name;
|
||||||
|
BaseString _comment;
|
||||||
const char* name;
|
const char* name;
|
||||||
const char* comment;
|
const char* comment;
|
||||||
NDBT_TestSuite* suite;
|
NDBT_TestSuite* suite;
|
||||||
|
@ -984,7 +984,6 @@ void* ThreadExec(void* ThreadData){
|
|||||||
delete pMyNdb;
|
delete pMyNdb;
|
||||||
pMyNdb = NULL ;
|
pMyNdb = NULL ;
|
||||||
ThreadReady[thread_no] = 1;
|
ThreadReady[thread_no] = 1;
|
||||||
NdbThread_Exit(0) ;
|
|
||||||
return 0 ;
|
return 0 ;
|
||||||
}//if
|
}//if
|
||||||
|
|
||||||
@ -1197,7 +1196,6 @@ void* ThreadExec(void* ThreadData){
|
|||||||
} // for(;;)
|
} // for(;;)
|
||||||
|
|
||||||
delete pMyNdb ;
|
delete pMyNdb ;
|
||||||
NdbThread_Exit(0) ;
|
return 0 ;
|
||||||
return 0 ; // Compiler is happy now
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -494,8 +494,7 @@ threadLoop(void* ThreadData)
|
|||||||
delete localNdb;
|
delete localNdb;
|
||||||
ThreadReady[threadNo] = 1;
|
ThreadReady[threadNo] = 1;
|
||||||
|
|
||||||
NdbThread_Exit(0);
|
return NULL;
|
||||||
return NULL; // Just to keep compiler happy
|
|
||||||
}//threadLoop()
|
}//threadLoop()
|
||||||
|
|
||||||
static
|
static
|
||||||
|
@ -617,7 +617,7 @@ static void* flexBenchThread(void* pArg)
|
|||||||
free(attrRefValue) ;
|
free(attrRefValue) ;
|
||||||
free(pOps) ;
|
free(pOps) ;
|
||||||
delete pNdb ;
|
delete pNdb ;
|
||||||
NdbThread_Exit(0) ;
|
return 0; // thread exits
|
||||||
}
|
}
|
||||||
|
|
||||||
pNdb->init();
|
pNdb->init();
|
||||||
@ -934,8 +934,7 @@ static void* flexBenchThread(void* pArg)
|
|||||||
free(longKeyAttrValue);
|
free(longKeyAttrValue);
|
||||||
} // if
|
} // if
|
||||||
|
|
||||||
NdbThread_Exit(0);
|
return NULL; // Thread exits
|
||||||
return NULL; // Just to keep compiler happy
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -612,10 +612,7 @@ flexHammerThread(void* pArg)
|
|||||||
|
|
||||||
flexHammerErrorData->resetErrorCounters();
|
flexHammerErrorData->resetErrorCounters();
|
||||||
|
|
||||||
// And exit using NDBT
|
return NULL; // thread exits
|
||||||
NdbThread_Exit(0);
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
} // flexHammerThread
|
} // flexHammerThread
|
||||||
|
|
||||||
|
@ -701,8 +701,7 @@ flexScanThread(void* ThreadData)
|
|||||||
free(pkValue);
|
free(pkValue);
|
||||||
} // if
|
} // if
|
||||||
|
|
||||||
NdbThread_Exit(0);
|
return NULL; // thread exits
|
||||||
return NULL;
|
|
||||||
|
|
||||||
} // flexScanThread
|
} // flexScanThread
|
||||||
|
|
||||||
|
@ -389,8 +389,7 @@ threadLoop(void* ThreadData)
|
|||||||
delete localNdb;
|
delete localNdb;
|
||||||
ThreadReady[loc_threadNo] = 1;
|
ThreadReady[loc_threadNo] = 1;
|
||||||
|
|
||||||
NdbThread_Exit(0);
|
return NULL; // Thread exits
|
||||||
return NULL; // Just to keep compiler happy
|
|
||||||
}//threadLoop()
|
}//threadLoop()
|
||||||
|
|
||||||
static
|
static
|
||||||
|
@ -406,9 +406,8 @@ threadLoop(void* ThreadData)
|
|||||||
|
|
||||||
delete localNdb;
|
delete localNdb;
|
||||||
ThreadReady[threadNo] = 1;
|
ThreadReady[threadNo] = 1;
|
||||||
NdbThread_Exit(0);
|
|
||||||
|
|
||||||
return NULL;
|
return NULL; // thread exits
|
||||||
}
|
}
|
||||||
|
|
||||||
void executeThread(StartType aType, Ndb* aNdbObject, ThreadNdb* threadInfo)
|
void executeThread(StartType aType, Ndb* aNdbObject, ThreadNdb* threadInfo)
|
||||||
|
@ -710,7 +710,7 @@ static void* flexBenchThread(void* pArg)
|
|||||||
the_socket_name,
|
the_socket_name,
|
||||||
0) == NULL ) {
|
0) == NULL ) {
|
||||||
ndbout << "failed" << endl;
|
ndbout << "failed" << endl;
|
||||||
NdbThread_Exit(0) ;
|
return 0;
|
||||||
}
|
}
|
||||||
ndbout << "ok" << endl;
|
ndbout << "ok" << endl;
|
||||||
|
|
||||||
@ -722,7 +722,7 @@ static void* flexBenchThread(void* pArg)
|
|||||||
|
|
||||||
if (r) {
|
if (r) {
|
||||||
ndbout << "autocommit on/off failed" << endl;
|
ndbout << "autocommit on/off failed" << endl;
|
||||||
NdbThread_Exit(0) ;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -741,7 +741,7 @@ static void* flexBenchThread(void* pArg)
|
|||||||
ndbout << threadNo << endl ;
|
ndbout << threadNo << endl ;
|
||||||
ndbout << "Thread #" << threadNo << " will now exit" << endl ;
|
ndbout << "Thread #" << threadNo << " will now exit" << endl ;
|
||||||
tResult = 13 ;
|
tResult = 13 ;
|
||||||
NdbThread_Exit(0) ;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (use_ndb) {
|
if (use_ndb) {
|
||||||
@ -750,7 +750,7 @@ static void* flexBenchThread(void* pArg)
|
|||||||
ndbout << "Failed to get an NDB object" << endl;
|
ndbout << "Failed to get an NDB object" << endl;
|
||||||
ndbout << "Thread #" << threadNo << " will now exit" << endl ;
|
ndbout << "Thread #" << threadNo << " will now exit" << endl ;
|
||||||
tResult = 13;
|
tResult = 13;
|
||||||
NdbThread_Exit(0) ;
|
return 0;
|
||||||
}
|
}
|
||||||
pNdb->waitUntilReady();
|
pNdb->waitUntilReady();
|
||||||
return_ndb_object(pNdb, ndb_id);
|
return_ndb_object(pNdb, ndb_id);
|
||||||
@ -900,11 +900,11 @@ static void* flexBenchThread(void* pArg)
|
|||||||
prep_insert[i] = mysql_prepare(&mysql, buf, pos);
|
prep_insert[i] = mysql_prepare(&mysql, buf, pos);
|
||||||
if (prep_insert[i] == 0) {
|
if (prep_insert[i] == 0) {
|
||||||
ndbout << "mysql_prepare: " << mysql_error(&mysql) << endl;
|
ndbout << "mysql_prepare: " << mysql_error(&mysql) << endl;
|
||||||
NdbThread_Exit(0) ;
|
return 0;
|
||||||
}
|
}
|
||||||
if (mysql_bind_param(prep_insert[i], bind_insert)) {
|
if (mysql_bind_param(prep_insert[i], bind_insert)) {
|
||||||
ndbout << "mysql_bind_param: " << mysql_error(&mysql) << endl;
|
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);
|
prep_update[i] = mysql_prepare(&mysql, buf, pos);
|
||||||
if (prep_update[i] == 0) {
|
if (prep_update[i] == 0) {
|
||||||
ndbout << "mysql_prepare: " << mysql_error(&mysql) << endl;
|
ndbout << "mysql_prepare: " << mysql_error(&mysql) << endl;
|
||||||
NdbThread_Exit(0) ;
|
return 0;
|
||||||
}
|
}
|
||||||
if (mysql_bind_param(prep_update[i], bind_update)) {
|
if (mysql_bind_param(prep_update[i], bind_update)) {
|
||||||
ndbout << "mysql_bind_param: " << mysql_error(&mysql) << endl;
|
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);
|
prep_read[i] = mysql_prepare(&mysql, buf, pos);
|
||||||
if (prep_read[i] == 0) {
|
if (prep_read[i] == 0) {
|
||||||
ndbout << "mysql_prepare: " << mysql_error(&mysql) << endl;
|
ndbout << "mysql_prepare: " << mysql_error(&mysql) << endl;
|
||||||
NdbThread_Exit(0) ;
|
return 0;
|
||||||
}
|
}
|
||||||
if (mysql_bind_param(prep_read[i], bind_read)) {
|
if (mysql_bind_param(prep_read[i], bind_read)) {
|
||||||
ndbout << "mysql_bind_param: " << mysql_error(&mysql) << endl;
|
ndbout << "mysql_bind_param: " << mysql_error(&mysql) << endl;
|
||||||
NdbThread_Exit(0) ;
|
return 0;
|
||||||
}
|
}
|
||||||
if (mysql_bind_result(prep_read[i], &bind_read[1])) {
|
if (mysql_bind_result(prep_read[i], &bind_read[1])) {
|
||||||
ndbout << "mysql_bind_result: " << mysql_error(&mysql) << endl;
|
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);
|
prep_delete[i] = mysql_prepare(&mysql, buf, pos);
|
||||||
if (prep_delete[i] == 0) {
|
if (prep_delete[i] == 0) {
|
||||||
ndbout << "mysql_prepare: " << mysql_error(&mysql) << endl;
|
ndbout << "mysql_prepare: " << mysql_error(&mysql) << endl;
|
||||||
NdbThread_Exit(0) ;
|
return 0;
|
||||||
}
|
}
|
||||||
if (mysql_bind_param(prep_delete[i], bind_delete)) {
|
if (mysql_bind_param(prep_delete[i], bind_delete)) {
|
||||||
ndbout << "mysql_bind_param: " << mysql_error(&mysql) << endl;
|
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;
|
ndbout << "I got here " << endl;
|
||||||
return_ndb_object(pNdb, ndb_id);
|
return_ndb_object(pNdb, ndb_id);
|
||||||
}
|
}
|
||||||
NdbThread_Exit(0);
|
return NULL;
|
||||||
return NULL; // Just to keep compiler happy
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -274,8 +274,6 @@ threadRoutine(void *arg)
|
|||||||
|
|
||||||
asyncDbDisconnect(pNDB);
|
asyncDbDisconnect(pNDB);
|
||||||
|
|
||||||
NdbThread_Exit(0);
|
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,6 +98,15 @@ OperationTestCase matrix[] = {
|
|||||||
result = NDBT_FAILED; \
|
result = NDBT_FAILED; \
|
||||||
break; }
|
break; }
|
||||||
|
|
||||||
|
#define C3(b) if (!(b)) { \
|
||||||
|
g_err << "ERR: "<< step->getName() \
|
||||||
|
<< " failed on line " << __LINE__ << endl; \
|
||||||
|
abort(); return NDBT_FAILED; }
|
||||||
|
|
||||||
|
#define C3(b) if (!(b)) { \
|
||||||
|
g_err << "ERR: failed on line " << __LINE__ << endl; \
|
||||||
|
return NDBT_FAILED; }
|
||||||
|
|
||||||
int
|
int
|
||||||
runOp(HugoOperations & hugoOps,
|
runOp(HugoOperations & hugoOps,
|
||||||
Ndb * pNdb,
|
Ndb * pNdb,
|
||||||
@ -228,11 +237,369 @@ runClearTable(NDBT_Context* ctx, NDBT_Step* step){
|
|||||||
return NDBT_OK;
|
return NDBT_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum OPS { o_DONE= 0, o_INS= 1, o_UPD= 2, o_DEL= 3 };
|
||||||
|
typedef Vector<OPS> Sequence;
|
||||||
|
|
||||||
|
static
|
||||||
|
bool
|
||||||
|
valid(const Sequence& s)
|
||||||
|
{
|
||||||
|
if(s.size() == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for(size_t i = 1; i<s.size(); i++)
|
||||||
|
{
|
||||||
|
switch(s[i]){
|
||||||
|
case o_INS:
|
||||||
|
if(s[i-1] != o_DEL)
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
case o_UPD:
|
||||||
|
case o_DEL:
|
||||||
|
if(s[i-1] == o_DEL)
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
case o_DONE:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
NdbOut& operator<<(NdbOut& out, const Sequence& s)
|
||||||
|
{
|
||||||
|
out << "[ ";
|
||||||
|
for(size_t i = 0; i<s.size(); i++)
|
||||||
|
{
|
||||||
|
switch(s[i]){
|
||||||
|
case o_INS:
|
||||||
|
out << "INS ";
|
||||||
|
break;
|
||||||
|
case o_DEL:
|
||||||
|
out << "DEL ";
|
||||||
|
break;
|
||||||
|
case o_UPD:
|
||||||
|
out << "UPD ";
|
||||||
|
break;
|
||||||
|
case o_DONE:
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out << "]";
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
generate(Sequence& out, int no)
|
||||||
|
{
|
||||||
|
while(no & 3)
|
||||||
|
{
|
||||||
|
out.push_back((OPS)(no & 3));
|
||||||
|
no >>= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
generate(Vector<int>& out, size_t len)
|
||||||
|
{
|
||||||
|
int max= 1;
|
||||||
|
while(len)
|
||||||
|
{
|
||||||
|
max <<= 2;
|
||||||
|
len--;
|
||||||
|
}
|
||||||
|
|
||||||
|
len= 1;
|
||||||
|
for(int i = 0; i<max; i++)
|
||||||
|
{
|
||||||
|
Sequence tmp;
|
||||||
|
generate(tmp, i);
|
||||||
|
|
||||||
|
if(tmp.size() >= len && valid(tmp))
|
||||||
|
{
|
||||||
|
out.push_back(i);
|
||||||
|
len= tmp.size();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//ndbout << "DISCARD: " << tmp << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static const Uint32 DUMMY = 0;
|
||||||
|
static const Uint32 ROW = 1;
|
||||||
|
|
||||||
|
int
|
||||||
|
verify_other(NDBT_Context* ctx,
|
||||||
|
Ndb* pNdb, int seq, OPS latest, bool initial_row, bool commit)
|
||||||
|
{
|
||||||
|
Uint32 no_wait = NdbOperation::LM_CommittedRead*
|
||||||
|
ctx->getProperty("NoWait", (Uint32)1);
|
||||||
|
|
||||||
|
for(size_t j = no_wait; j<3; j++)
|
||||||
|
{
|
||||||
|
HugoOperations other(*ctx->getTab());
|
||||||
|
C3(other.startTransaction(pNdb) == 0);
|
||||||
|
C3(other.pkReadRecord(pNdb, ROW, 1, (NdbOperation::LockMode)j) == 0);
|
||||||
|
int tmp= other.execute_Commit(pNdb);
|
||||||
|
if(seq == 0){
|
||||||
|
if(j == NdbOperation::LM_CommittedRead)
|
||||||
|
{
|
||||||
|
C3(initial_row? tmp==0 && other.verifyUpdatesValue(0) == 0 : tmp==626);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
C3(tmp == 266);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(commit)
|
||||||
|
{
|
||||||
|
switch(latest){
|
||||||
|
case o_INS:
|
||||||
|
case o_UPD:
|
||||||
|
C3(tmp == 0 && other.verifyUpdatesValue(seq) == 0);
|
||||||
|
break;
|
||||||
|
case o_DEL:
|
||||||
|
C3(tmp == 626);
|
||||||
|
break;
|
||||||
|
case o_DONE:
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// rollback
|
||||||
|
C3(initial_row? tmp==0 && other.verifyUpdatesValue(0) == 0 : tmp==626);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NDBT_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
verify_savepoint(NDBT_Context* ctx,
|
||||||
|
Ndb* pNdb, int seq, OPS latest,
|
||||||
|
Uint64 transactionId)
|
||||||
|
{
|
||||||
|
bool initial_row= (seq == 0) && latest == o_INS;
|
||||||
|
|
||||||
|
for(size_t j = 0; j<3; j++)
|
||||||
|
{
|
||||||
|
const NdbOperation::LockMode lm= (NdbOperation::LockMode)j;
|
||||||
|
|
||||||
|
HugoOperations same(*ctx->getTab());
|
||||||
|
C3(same.startTransaction(pNdb) == 0);
|
||||||
|
same.setTransactionId(transactionId); // Cheat
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Increase savepoint to <em>k</em>
|
||||||
|
*/
|
||||||
|
for(size_t l = 1; l<=seq; l++)
|
||||||
|
{
|
||||||
|
C3(same.pkReadRecord(pNdb, DUMMY, 1, lm) == 0); // Read dummy row
|
||||||
|
C3(same.execute_NoCommit(pNdb) == 0);
|
||||||
|
g_info << "savepoint: " << l << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_info << "op(" << seq << "): "
|
||||||
|
<< " lock mode " << lm << endl;
|
||||||
|
|
||||||
|
C3(same.pkReadRecord(pNdb, ROW, 1, lm) == 0); // Read real row
|
||||||
|
int tmp= same.execute_Commit(pNdb);
|
||||||
|
if(seq == 0)
|
||||||
|
{
|
||||||
|
if(initial_row)
|
||||||
|
{
|
||||||
|
C3(tmp == 0 && same.verifyUpdatesValue(0) == 0);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
C3(tmp == 626);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch(latest){
|
||||||
|
case o_INS:
|
||||||
|
case o_UPD:
|
||||||
|
C3(tmp == 0 && same.verifyUpdatesValue(seq) == 0);
|
||||||
|
break;
|
||||||
|
case o_DEL:
|
||||||
|
C3(tmp == 626);
|
||||||
|
break;
|
||||||
|
case o_DONE:
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NDBT_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
runOperations(NDBT_Context* ctx, NDBT_Step* step)
|
||||||
|
{
|
||||||
|
int tmp;
|
||||||
|
Ndb* pNdb = GETNDB(step);
|
||||||
|
|
||||||
|
Uint32 seqNo = ctx->getProperty("Sequence", (Uint32)0);
|
||||||
|
Uint32 commit= ctx->getProperty("Commit", (Uint32)1);
|
||||||
|
|
||||||
|
if(seqNo == 0)
|
||||||
|
{
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
Sequence seq;
|
||||||
|
generate(seq, seqNo);
|
||||||
|
|
||||||
|
{
|
||||||
|
// Dummy row
|
||||||
|
HugoOperations hugoOps(*ctx->getTab());
|
||||||
|
C3(hugoOps.startTransaction(pNdb) == 0);
|
||||||
|
C3(hugoOps.pkInsertRecord(pNdb, DUMMY, 1, 0) == 0);
|
||||||
|
C3(hugoOps.execute_Commit(pNdb) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
const bool initial_row= (seq[0] != o_INS);
|
||||||
|
if(initial_row)
|
||||||
|
{
|
||||||
|
HugoOperations hugoOps(*ctx->getTab());
|
||||||
|
C3(hugoOps.startTransaction(pNdb) == 0);
|
||||||
|
C3(hugoOps.pkInsertRecord(pNdb, ROW, 1, 0) == 0);
|
||||||
|
C3(hugoOps.execute_Commit(pNdb) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
HugoOperations trans1(*ctx->getTab());
|
||||||
|
C3(trans1.startTransaction(pNdb) == 0);
|
||||||
|
for(size_t i = 0; i<seq.size(); i++)
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Perform operation
|
||||||
|
*/
|
||||||
|
switch(seq[i]){
|
||||||
|
case o_INS:
|
||||||
|
C3(trans1.pkInsertRecord(pNdb, ROW, 1, i+1) == 0);
|
||||||
|
break;
|
||||||
|
case o_UPD:
|
||||||
|
C3(trans1.pkUpdateRecord(pNdb, ROW, 1, i+1) == 0);
|
||||||
|
break;
|
||||||
|
case o_DEL:
|
||||||
|
C3(trans1.pkDeleteRecord(pNdb, ROW, 1) == 0);
|
||||||
|
break;
|
||||||
|
case o_DONE:
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
C3(trans1.execute_NoCommit(pNdb) == 0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify other transaction
|
||||||
|
*/
|
||||||
|
if(verify_other(ctx, pNdb, 0, seq[0], initial_row, commit) != NDBT_OK)
|
||||||
|
return NDBT_FAILED;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify savepoint read
|
||||||
|
*/
|
||||||
|
Uint64 transactionId= trans1.getTransaction()->getTransactionId();
|
||||||
|
|
||||||
|
for(size_t k=0; k<=i+1; k++)
|
||||||
|
{
|
||||||
|
if(verify_savepoint(ctx, pNdb, k,
|
||||||
|
k>0 ? seq[k-1] : initial_row ? o_INS : o_DONE,
|
||||||
|
transactionId) != NDBT_OK)
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(commit)
|
||||||
|
{
|
||||||
|
C3(trans1.execute_Commit(pNdb) == 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
C3(trans1.execute_Rollback(pNdb) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(verify_other(ctx, pNdb, seq.size(), seq.back(),
|
||||||
|
initial_row, commit) != NDBT_OK)
|
||||||
|
return NDBT_FAILED;
|
||||||
|
|
||||||
|
return NDBT_OK;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, const char** argv){
|
main(int argc, const char** argv){
|
||||||
ndb_init();
|
ndb_init();
|
||||||
|
|
||||||
|
Vector<int> tmp;
|
||||||
|
generate(tmp, 5);
|
||||||
|
|
||||||
NDBT_TestSuite ts("testOperations");
|
NDBT_TestSuite ts("testOperations");
|
||||||
|
for(size_t i = 0; i<tmp.size(); i++)
|
||||||
|
{
|
||||||
|
BaseString name;
|
||||||
|
Sequence s;
|
||||||
|
generate(s, tmp[i]);
|
||||||
|
for(size_t j = 0; j<s.size(); j++){
|
||||||
|
switch(s[j]){
|
||||||
|
case o_INS:
|
||||||
|
name.append("_INS");
|
||||||
|
break;
|
||||||
|
case o_DEL:
|
||||||
|
name.append("_DEL");
|
||||||
|
break;
|
||||||
|
case o_UPD:
|
||||||
|
name.append("_UPD");
|
||||||
|
break;
|
||||||
|
case o_DONE:
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BaseString n1;
|
||||||
|
n1.append(name);
|
||||||
|
n1.append("_COMMIT");
|
||||||
|
|
||||||
|
NDBT_TestCaseImpl1 *pt = new NDBT_TestCaseImpl1(&ts,
|
||||||
|
n1.c_str()+1, "");
|
||||||
|
|
||||||
|
pt->setProperty("Sequence", tmp[i]);
|
||||||
|
pt->addInitializer(new NDBT_Initializer(pt,
|
||||||
|
"runClearTable",
|
||||||
|
runClearTable));
|
||||||
|
|
||||||
|
pt->addStep(new NDBT_ParallelStep(pt,
|
||||||
|
"run",
|
||||||
|
runOperations));
|
||||||
|
|
||||||
|
pt->addFinalizer(new NDBT_Finalizer(pt,
|
||||||
|
"runClearTable",
|
||||||
|
runClearTable));
|
||||||
|
|
||||||
|
ts.addTest(pt);
|
||||||
|
|
||||||
|
name.append("_ABORT");
|
||||||
|
pt = new NDBT_TestCaseImpl1(&ts, name.c_str()+1, "");
|
||||||
|
pt->setProperty("Sequence", tmp[i]);
|
||||||
|
pt->setProperty("Commit", (Uint32)0);
|
||||||
|
pt->addInitializer(new NDBT_Initializer(pt,
|
||||||
|
"runClearTable",
|
||||||
|
runClearTable));
|
||||||
|
|
||||||
|
pt->addStep(new NDBT_ParallelStep(pt,
|
||||||
|
"run",
|
||||||
|
runOperations));
|
||||||
|
|
||||||
|
pt->addFinalizer(new NDBT_Finalizer(pt,
|
||||||
|
"runClearTable",
|
||||||
|
runClearTable));
|
||||||
|
|
||||||
|
ts.addTest(pt);
|
||||||
|
}
|
||||||
|
|
||||||
for(Uint32 i = 0; i<sizeof(matrix)/sizeof(matrix[0]); i++){
|
for(Uint32 i = 0; i<sizeof(matrix)/sizeof(matrix[0]); i++){
|
||||||
NDBT_TestCaseImpl1 *pt = new NDBT_TestCaseImpl1(&ts, matrix[i].name, "");
|
NDBT_TestCaseImpl1 *pt = new NDBT_TestCaseImpl1(&ts, matrix[i].name, "");
|
||||||
|
|
||||||
@ -270,3 +637,5 @@ main(int argc, const char** argv){
|
|||||||
return ts.execute(argc, argv);
|
return ts.execute(argc, argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template class Vector<OPS>;
|
||||||
|
template class Vector<Sequence>;
|
||||||
|
@ -35,7 +35,8 @@ getTable(Ndb* pNdb, int i){
|
|||||||
|
|
||||||
int runLoadTable(NDBT_Context* ctx, NDBT_Step* step){
|
int runLoadTable(NDBT_Context* ctx, NDBT_Step* step){
|
||||||
|
|
||||||
int records = ctx->getNumRecords();
|
int records = ctx->getProperty("Rows", ctx->getNumRecords());
|
||||||
|
|
||||||
HugoTransactions hugoTrans(*ctx->getTab());
|
HugoTransactions hugoTrans(*ctx->getTab());
|
||||||
if (hugoTrans.loadTable(GETNDB(step), records) != 0){
|
if (hugoTrans.loadTable(GETNDB(step), records) != 0){
|
||||||
return NDBT_FAILED;
|
return NDBT_FAILED;
|
||||||
@ -264,7 +265,7 @@ int runVerifyTable(NDBT_Context* ctx, NDBT_Step* step){
|
|||||||
|
|
||||||
int runScanRead(NDBT_Context* ctx, NDBT_Step* step){
|
int runScanRead(NDBT_Context* ctx, NDBT_Step* step){
|
||||||
int loops = ctx->getNumLoops();
|
int loops = ctx->getNumLoops();
|
||||||
int records = ctx->getNumRecords();
|
int records = ctx->getProperty("Rows", ctx->getNumRecords());
|
||||||
int parallelism = ctx->getProperty("Parallelism", 240);
|
int parallelism = ctx->getProperty("Parallelism", 240);
|
||||||
int abort = ctx->getProperty("AbortProb", 5);
|
int abort = ctx->getProperty("AbortProb", 5);
|
||||||
|
|
||||||
@ -376,6 +377,19 @@ int runScanReadError(NDBT_Context* ctx, NDBT_Step* step){
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
runInsertError(NDBT_Context* ctx, NDBT_Step* step){
|
||||||
|
int error = ctx->getProperty("ErrorCode");
|
||||||
|
NdbRestarter restarter;
|
||||||
|
|
||||||
|
ctx->setProperty("ErrorCode", (Uint32)0);
|
||||||
|
if (restarter.insertErrorInAllNodes(error) != 0){
|
||||||
|
ndbout << "Could not insert error in all nodes "<<endl;
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
return NDBT_OK;
|
||||||
|
}
|
||||||
|
|
||||||
int runScanReadErrorOneNode(NDBT_Context* ctx, NDBT_Step* step){
|
int runScanReadErrorOneNode(NDBT_Context* ctx, NDBT_Step* step){
|
||||||
int result = NDBT_OK;
|
int result = NDBT_OK;
|
||||||
int loops = ctx->getNumLoops();
|
int loops = ctx->getNumLoops();
|
||||||
@ -1221,6 +1235,16 @@ TESTCASE("ScanRead100",
|
|||||||
STEPS(runScanRead, 100);
|
STEPS(runScanRead, 100);
|
||||||
FINALIZER(runClearTable);
|
FINALIZER(runClearTable);
|
||||||
}
|
}
|
||||||
|
TESTCASE("Scan-bug8262",
|
||||||
|
""){
|
||||||
|
TC_PROPERTY("Rows", 1);
|
||||||
|
TC_PROPERTY("ErrorCode", 8035);
|
||||||
|
INITIALIZER(runLoadTable);
|
||||||
|
INITIALIZER(runInsertError); // Will reset error code
|
||||||
|
STEPS(runScanRead, 25);
|
||||||
|
FINALIZER(runInsertError);
|
||||||
|
FINALIZER(runClearTable);
|
||||||
|
}
|
||||||
TESTCASE("ScanRead40RandomTable",
|
TESTCASE("ScanRead40RandomTable",
|
||||||
"Verify scan requirement: Scan with 40 simultaneous threads. "\
|
"Verify scan requirement: Scan with 40 simultaneous threads. "\
|
||||||
"Use random table for the scan"){
|
"Use random table for the scan"){
|
||||||
|
@ -378,6 +378,10 @@ max-time: 500
|
|||||||
cmd: testScan
|
cmd: testScan
|
||||||
args: -n ScanRestart T1
|
args: -n ScanRestart T1
|
||||||
|
|
||||||
|
max-time: 500
|
||||||
|
cmd: testScan
|
||||||
|
args: -l 100 -n Scan-bug8262 T7
|
||||||
|
|
||||||
# OLD FLEX
|
# OLD FLEX
|
||||||
max-time: 500
|
max-time: 500
|
||||||
cmd: flexBench
|
cmd: flexBench
|
||||||
|
@ -32,6 +32,13 @@ int HugoOperations::startTransaction(Ndb* pNdb){
|
|||||||
return NDBT_OK;
|
return NDBT_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
HugoOperations::setTransactionId(Uint64 id){
|
||||||
|
if (pTrans != NULL){
|
||||||
|
pTrans->setTransactionId(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int HugoOperations::closeTransaction(Ndb* pNdb){
|
int HugoOperations::closeTransaction(Ndb* pNdb){
|
||||||
|
|
||||||
if (pTrans != NULL){
|
if (pTrans != NULL){
|
||||||
@ -401,6 +408,10 @@ HugoOperations::HugoOperations(const NdbDictionary::Table& _tab):
|
|||||||
|
|
||||||
HugoOperations::~HugoOperations(){
|
HugoOperations::~HugoOperations(){
|
||||||
deallocRows();
|
deallocRows();
|
||||||
|
if (pTrans != NULL){
|
||||||
|
pTrans->close();
|
||||||
|
pTrans = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -327,13 +327,17 @@ NDBT_Finalizer::NDBT_Finalizer(NDBT_TestCase* ptest,
|
|||||||
NDBT_TestCase::NDBT_TestCase(NDBT_TestSuite* psuite,
|
NDBT_TestCase::NDBT_TestCase(NDBT_TestSuite* psuite,
|
||||||
const char* pname,
|
const char* pname,
|
||||||
const char* pcomment) :
|
const char* pcomment) :
|
||||||
name(pname) ,
|
name(strdup(pname)) ,
|
||||||
comment(pcomment),
|
comment(strdup(pcomment)),
|
||||||
suite(psuite){
|
suite(psuite)
|
||||||
|
{
|
||||||
|
_name.assign(pname);
|
||||||
|
_comment.assign(pcomment);
|
||||||
|
name= _name.c_str();
|
||||||
|
comment= _comment.c_str();
|
||||||
assert(suite != NULL);
|
assert(suite != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NDBT_TestCaseImpl1::NDBT_TestCaseImpl1(NDBT_TestSuite* psuite,
|
NDBT_TestCaseImpl1::NDBT_TestCaseImpl1(NDBT_TestSuite* psuite,
|
||||||
const char* pname,
|
const char* pname,
|
||||||
const char* pcomment) :
|
const char* pcomment) :
|
||||||
@ -475,7 +479,6 @@ void *
|
|||||||
runStep_C(void * s)
|
runStep_C(void * s)
|
||||||
{
|
{
|
||||||
runStep(s);
|
runStep(s);
|
||||||
NdbThread_Exit(0);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -291,7 +291,6 @@ extern "C" void*
|
|||||||
copyrun_C(void* copy)
|
copyrun_C(void* copy)
|
||||||
{
|
{
|
||||||
((Copy*) copy)->run();
|
((Copy*) copy)->run();
|
||||||
NdbThread_Exit(0);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -322,7 +321,6 @@ extern "C" void*
|
|||||||
connrun_C(void* conn)
|
connrun_C(void* conn)
|
||||||
{
|
{
|
||||||
((Conn*) conn)->run();
|
((Conn*) conn)->run();
|
||||||
NdbThread_Exit(0);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,6 +140,9 @@ SUFFIXES = .sh
|
|||||||
-e 's!@''IS_LINUX''@!@IS_LINUX@!' \
|
-e 's!@''IS_LINUX''@!@IS_LINUX@!' \
|
||||||
-e "s!@""CONF_COMMAND""@!@CONF_COMMAND@!" \
|
-e "s!@""CONF_COMMAND""@!@CONF_COMMAND@!" \
|
||||||
-e 's!@''MYSQLD_USER''@!@MYSQLD_USER@!' \
|
-e 's!@''MYSQLD_USER''@!@MYSQLD_USER@!' \
|
||||||
|
-e 's!@''STATIC_NSS_FLAGS''@!@STATIC_NSS_FLAGS@!' \
|
||||||
|
-e 's!@''NON_THREADED_LIBS''@!@NON_THREADED_LIBS@!' \
|
||||||
|
-e 's!@''ZLIB_DEPS''@!@ZLIB_DEPS@!' \
|
||||||
-e "s!@MAKE@!$(MAKE)!" \
|
-e "s!@MAKE@!$(MAKE)!" \
|
||||||
$< > $@-t
|
$< > $@-t
|
||||||
@CHMOD@ +x $@-t
|
@CHMOD@ +x $@-t
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user