MySQL Lists are EOL. Please join:

List:Commits« Previous MessageNext Message »
From:Bjorn Munch Date:January 21 2009 10:16am
Subject:bzr push into mysql-5.1 branch (Bjorn.Munch:2713 to 2714)
View as plain text  
 2714 Bjorn Munch	2009-01-21 [merge]
      merge
modified:
  client/mysqltest.cc
  mysql-test/lib/My/CoreDump.pm
  mysql-test/lib/My/SafeProcess.pm
  mysql-test/lib/My/SafeProcess/safe_process.cc
  mysql-test/mysql-test-run.pl

 2713 Magnus Svensson	2009-01-15
      Bug#35701 please allow test language variables in connection and
      sync_slave_with_master
       - Additional patch for "disconnect $variable"
modified:
  client/mysqltest.cc
  mysql-test/r/mysqltest.result
  mysql-test/t/mysqltest.test

=== modified file 'client/mysqltest.cc'
--- a/client/mysqltest.cc	2009-01-15 08:05:51 +0000
+++ b/client/mysqltest.cc	2009-01-21 09:34:01 +0000
@@ -7326,6 +7326,13 @@ static sig_handler signal_handler(int si
 {
   fprintf(stderr, "mysqltest got " SIGNAL_FMT "\n", sig);
   dump_backtrace();
+
+  fprintf(stderr, "Writing a core file...\n");
+  fflush(stderr);
+  my_write_core(sig);
+#ifndef __WIN__
+  exit(1);			// Shouldn't get here but just in case
+#endif
 }
 
 #ifdef __WIN__

=== modified file 'mysql-test/lib/My/CoreDump.pm'
--- a/mysql-test/lib/My/CoreDump.pm	2008-10-13 16:14:30 +0000
+++ b/mysql-test/lib/My/CoreDump.pm	2009-01-21 09:34:01 +0000
@@ -49,12 +49,56 @@ sub _gdb {
 
   unlink $tmp_name or die "Error removing $tmp_name: $!";
 
+  return if $? >> 8;
   return unless $gdb_output;
 
   print <<EOF, $gdb_output, "\n";
 Output from gdb follows. The first stack trace is from the failing thread.
 The following stack traces are from all threads (so the failing one is
 duplicated).
+--------------------------
+EOF
+  return 1;
+}
+
+
+sub _dbx {
+  my ($core_name)= @_;
+
+  print "\nTrying 'dbx' to get a backtrace\n";
+
+  return unless -f $core_name;
+
+  # Find out name of binary that generated core
+  `echo | dbx - '$core_name' 2>&1` =~
+    /Corefile specified executable: "([^"]+)"/;
+  my $binary= $1 or return;
+  print "Core generated by '$binary'\n";
+
+  # Find all threads
+  my @thr_ids = `echo threads | dbx '$binary' '$core_name' 2>&1` =~ /t@\d+/g;
+
+  # Create tempfile containing dbx commands
+  my ($tmp, $tmp_name) = tempfile();
+  foreach my $thread (@thr_ids) {
+    print $tmp "where $thread\n";
+  }
+  print $tmp "exit\n";
+  close $tmp or die "Error closing $tmp_name: $!";
+
+  # Run dbx
+  my $dbx_output=
+    `cat '$tmp_name' | dbx '$binary' '$core_name' 2>&1`;
+
+  unlink $tmp_name or die "Error removing $tmp_name: $!";
+
+  return if $? >> 8;
+  return unless $dbx_output;
+
+  print <<EOF, $dbx_output, "\n";
+Output from dbx follows. Stack trace is printed for all threads in order,
+above this you should see info about which thread was the failing one.
+----------------------------
 EOF
   return 1;
 }
@@ -63,12 +107,18 @@ EOF
 sub show {
   my ($class, $core_name)= @_;
 
+  # We try dbx first; gdb itself may coredump if run on a Sun Studio
+  # compiled binary on Solaris.
+
   my @debuggers =
     (
+     \&_dbx,
      \&_gdb,
      # TODO...
    );
 
+  # Try debuggers until one succeeds
+
   foreach my $debugger (@debuggers){
     if ($debugger->($core_name)){
       return;

=== modified file 'mysql-test/lib/My/SafeProcess.pm'
--- a/mysql-test/lib/My/SafeProcess.pm	2008-10-10 07:19:19 +0000
+++ b/mysql-test/lib/My/SafeProcess.pm	2009-01-21 09:34:01 +0000
@@ -349,13 +349,24 @@ sub start_kill {
   {
     $pid= $self->{SAFE_PID};
     die "Can't kill not started process" unless defined $pid;
-    $ret= kill(15, $pid);
+    $ret= kill("TERM", $pid);
   }
 
   return $ret;
 }
 
 
+sub dump_core {
+  my ($self)= @_;
+  return if IS_WINDOWS;
+  my $pid= $self->{SAFE_PID};
+  die "Can't cet core from not started process" unless defined $pid;
+  _verbose("Sending ABRT to $self");
+  kill ("ABRT", $pid);
+  return 1;
+}
+
+
 #
 # Kill the process as fast as possible
 # and wait for it to return

=== modified file 'mysql-test/lib/My/SafeProcess/safe_process.cc'
--- a/mysql-test/lib/My/SafeProcess/safe_process.cc	2008-03-04 11:32:51 +0000
+++ b/mysql-test/lib/My/SafeProcess/safe_process.cc	2009-01-21 09:34:01 +0000
@@ -117,6 +117,16 @@ static void kill_child (void)
 }
 
 
+static void handle_abort (int sig)
+{
+    message("Got signal %d, child_pid: %d, sending ABRT", sig, child_pid);
+
+    if (child_pid > 0) {
+	kill (-child_pid, SIGABRT);	// Don't wait for it to terminate
+    }
+}
+
+    
 static void handle_signal (int sig)
 {
   message("Got signal %d, child_pid: %d", sig, child_pid);
@@ -144,6 +154,7 @@ int main(int argc, char* const argv[] )
   signal(SIGTERM, handle_signal);
   signal(SIGINT,  handle_signal);
   signal(SIGCHLD, handle_signal);
+  signal(SIGABRT, handle_abort);
 
   sprintf(safe_process_name, "safe_process[%d]", own_pid);
 

=== modified file 'mysql-test/mysql-test-run.pl'
--- a/mysql-test/mysql-test-run.pl	2009-01-08 19:03:56 +0000
+++ b/mysql-test/mysql-test-run.pl	2009-01-21 09:34:01 +0000
@@ -464,7 +464,11 @@ sub run_test_server ($$$) {
 	    else {
 	      mtr_report(" - saving '$worker_savedir/' to '$savedir/'");
 	      rename($worker_savedir, $savedir);
-
+	      # Move any core files from e.g. mysqltest
+	      foreach my $coref (glob("core*"))
+	      {
+                move($coref, $savedir);
+              }
 	      if ($opt_max_save_core > 0) {
 		# Limit number of core files saved
 		find({ no_chdir => 1,
@@ -2381,7 +2385,7 @@ sub kill_leftovers ($) {
       }
       mtr_report(" - found old pid $pid in '$elem', killing it...");
 
-      my $ret= kill(9, $pid);
+      my $ret= kill("KILL", $pid);
       if ($ret == 0) {
 	mtr_report("   process did not exist!");
 	next;
@@ -3284,11 +3288,6 @@ sub run_testcase ($) {
     $test_timeout_proc->kill();
 
     # ----------------------------------------------------
-    # It's not mysqltest that has exited, kill it
-    # ----------------------------------------------------
-    $test->kill();
-
-    # ----------------------------------------------------
     # Check if it was a server that died
     # ----------------------------------------------------
     if ( grep($proc eq $_, started(all_servers())) )
@@ -3297,10 +3296,30 @@ sub run_testcase ($) {
       $tinfo->{comment}=
 	"Server $proc failed during test run";
 
+      # ----------------------------------------------------
+      # It's not mysqltest that has exited, kill it
+      # ----------------------------------------------------
+      $test->kill();
+
       report_failure_and_restart($tinfo);
       return 1;
     }
 
+    # Try to dump core for mysqltest and all servers
+    foreach my $proc ($test, started(all_servers())) 
+    {
+      mtr_print("Trying to dump core for $proc");
+      if ($proc->dump_core())
+      {
+	$proc->wait_one(20);
+      }
+    }
+
+    # ----------------------------------------------------
+    # It's not mysqltest that has exited, kill it
+    # ----------------------------------------------------
+    $test->kill();
+
     # ----------------------------------------------------
     # Check if testcase timer expired
     # ----------------------------------------------------
@@ -3319,6 +3338,7 @@ sub run_testcase ($) {
       }
       $tinfo->{'timeout'}= testcase_timeout(); # Mark as timeout
       run_on_all($tinfo, 'analyze-timeout');
+
       report_failure_and_restart($tinfo);
       return 1;
     }
@@ -4222,7 +4242,7 @@ sub start_servers($) {
     }
     else
     {
-      mysql_install_db($mysqld);
+      mysql_install_db($mysqld); # For versional testing
 
       mtr_error("Failed to install system db to '$datadir'")
 	unless -d $datadir;

Thread
bzr push into mysql-5.1 branch (Bjorn.Munch:2713 to 2714) Bjorn Munch21 Jan