List:Commits« Previous MessageNext Message »
From:msvensson Date:January 7 2008 7:44pm
Subject:bk commit into 5.1 tree (msvensson:1.2674)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of msvensson. When msvensson does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2008-01-07 19:44:48+01:00, msvensson@stripped +6 -0
  Try to dynamically change option, restart if it fails

  mysql-test/lib/My/Options.pm@stripped, 2008-01-07 19:44:45+01:00, msvensson@stripped
+191 -0
    New BitKeeper file ``mysql-test/lib/My/Options.pm''

  mysql-test/lib/My/Options.pm@stripped, 2008-01-07 19:44:45+01:00, msvensson@stripped
+0 -0

  mysql-test/lib/mtr_cases.pm@stripped, 2008-01-07 19:44:45+01:00, msvensson@stripped
+47 -23
    Try to dynamically change option, restart if it fails.

  mysql-test/lib/mtr_misc.pl@stripped, 2008-01-07 19:44:45+01:00, msvensson@stripped +0
-60
    Move functions to My::Optiosn

  mysql-test/lib/mtr_report.pl@stripped, 2008-01-07 19:44:45+01:00, msvensson@stripped
+3 -1
    Add a small dot if test detected restart

  mysql-test/lib/t/Options.t@stripped, 2008-01-07 19:44:45+01:00, msvensson@stripped
+120 -0
    New BitKeeper file ``mysql-test/lib/t/Options.t''

  mysql-test/lib/t/Options.t@stripped, 2008-01-07 19:44:45+01:00, msvensson@stripped +0
-0

  mysql-test/mysql-test-run.pl@stripped, 2008-01-07 19:44:44+01:00, msvensson@stripped
+41 -39
    Try to dynamically change option, restart if it fails.

diff -Nrup a/mysql-test/lib/My/Options.pm b/mysql-test/lib/My/Options.pm
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/mysql-test/lib/My/Options.pm	2008-01-07 19:44:45 +01:00
@@ -0,0 +1,191 @@
+# -*- cperl -*-
+# Copyright (C) 2004-2006 MySQL AB
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+package My::Options;
+
+#
+# Utility functions to work with list of options
+#
+
+use strict;
+
+
+sub same($$) {
+  my $l1= shift;
+  my $l2= shift;
+  return compare($l1,$l2) == 0;
+}
+
+
+sub compare ($$) {
+  my $l1= shift;
+  my $l2= shift;
+
+  my @l1= @$l1;
+  my @l2= @$l2;
+
+  return -1 if @l1 < @l2;
+  return  1 if @l1 > @l2;
+
+  while ( @l1 )                         # Same length
+  {
+    my $e1= shift @l1;
+    my $e2= shift @l2;
+    my $cmp= ($e1 cmp $e2);
+    return $cmp if $cmp != 0;
+  }
+
+  return 0;                             # They are the same
+}
+
+
+sub _split_option {
+  my ($option)= @_;
+  if ($option=~ /^--(.*)=(.*)$/){
+    return ($1, $2);
+  }
+  elsif ($option=~ /^--(.*)$/){
+    return ($1, undef)
+  }
+  elsif ($option=~ /^(.*)=(.*)$/){
+    return ($1, $2)
+  }
+  elsif ($option=~ /^-O$/){
+    return (undef, undef);
+  }
+  die "Unknown option format '$option'";
+}
+
+
+sub _build_option {
+  my ($name, $value)= @_;
+  if ($name =~ /^O, /){
+    return "-".$name."=".$value;
+  }
+  elsif ($value){
+    return "--".$name."=".$value;
+  }
+  return "--".$name;
+}
+
+
+#
+# Compare two list of options and return what would need
+# to be done to get the server running with the new settings
+#
+sub diff {
+  my ($from_opts, $to_opts)= @_;
+
+  my %from;
+  foreach my $from (@$from_opts)
+  {
+    my ($opt, $value)= _split_option($from);
+    next unless defined($opt);
+    $from{$opt}= $value;
+  }
+
+  #print "from: ", %from, "\n";
+
+  my %to;
+  foreach my $to (@$to_opts)
+  {
+    my ($opt, $value)= _split_option($to);
+    next unless defined($opt);
+    $to{$opt}= $value;
+  }
+
+  #print "to: ", %to, "\n";
+
+  # Remove the ones that are in both lists
+  foreach my $name (keys %from){
+    if (exists $to{$name} and $to{$name} eq $from{$name}){
+      #print "removing '$name'  from both lists\n";
+      delete $to{$name};
+      delete $from{$name};
+    }
+  }
+
+  #print "from: ", %from, "\n";
+  #print "to: ", %to, "\n";
+
+  # Add all keys in "to" to result
+  my @result;
+  foreach my $name (keys %to){
+    push(@result, _build_option($name, $to{$name}));
+  }
+
+  # Add all keys in "from" that are not in "to"
+  # to result as "set to default"
+  foreach my $name (keys %from){
+    if (not exists $to{$name}) {
+      push(@result, _build_option($name, "default"));
+    }
+  }
+
+  return @result;
+}
+
+
+sub is_set {
+  my ($opts, $set_opts)= @_;
+
+  foreach my $opt (@$opts){
+
+    my ($opt_name1, $value1)= _split_option($opt);
+
+    foreach my $set_opt (@$set_opts){
+      my ($opt_name2, $value2)= _split_option($set_opt);
+
+      if ($opt_name1 eq $opt_name2){
+	# Option already set
+	return 1;
+      }
+    }
+  }
+
+  return 0;
+}
+
+
+sub toSQL {
+  my (@options)= @_;
+  my @sql;
+
+  foreach my $option (@options) {
+    my ($name, $value)= _split_option($option);
+    #print "name: $name\n";
+    if ($name =~ /^O, (.*)/){
+      push(@sql, "SET GLOBAL $1=$value");
+    } else {
+      my $sql_name= $name;
+      $sql_name=~ s/-/_/g;
+      push(@sql, "SET GLOBAL $sql_name=$value");
+    }
+  }
+  return join("; ", @sql);
+}
+
+
+sub toStr {
+  my $name= shift;
+  return "$name: ",
+    "['", join("', '", @_), "']\n";
+}
+
+
+1;
+
diff -Nrup a/mysql-test/lib/mtr_cases.pm b/mysql-test/lib/mtr_cases.pm
--- a/mysql-test/lib/mtr_cases.pm	2007-12-12 18:18:46 +01:00
+++ b/mysql-test/lib/mtr_cases.pm	2008-01-07 19:44:45 +01:00
@@ -31,7 +31,7 @@ our $skip_rpl;
 our $do_test;
 our $skip_test;
 our $opt_skip_combination;
-our $binlog_format;;
+our $binlog_format;
 our $enable_disabled;
 our $default_storage_engine;
 our $opt_with_ndbcluster_only;
@@ -83,8 +83,9 @@ sub init_pattern {
 #
 ##############################################################################
 
-sub collect_test_cases ($) {
+sub collect_test_cases ($$) {
   my $suites= shift; # Semicolon separated list of test suites
+  my $opt_cases= shift;
   my $cases= []; # Array of hash(one hash for each testcase)
 
   $do_test_reg= init_pattern($do_test, "--do-test");
@@ -92,15 +93,15 @@ sub collect_test_cases ($) {
 
   foreach my $suite (split(",", $suites))
   {
-    push(@$cases, collect_one_suite($suite));
+    push(@$cases, collect_one_suite($suite, $opt_cases));
   }
 
-  if ( @::opt_cases )
+  if ( @$opt_cases )
   {
     # A list of tests was specified on the command line
     # Check that the tests specified was found
     # in at least one suite
-    foreach my $test_name_spec ( @::opt_cases )
+    foreach my $test_name_spec ( @$opt_cases )
     {
       my $found= 0;
       my ($sname, $tname, $extension)= split_testname($test_name_spec);
@@ -236,6 +237,7 @@ sub split_testname {
 sub collect_one_suite($)
 {
   my $suite= shift;  # Test suite name
+  my $opt_cases= shift;
   my @cases; # Array of hash
 
   mtr_verbose("Collecting: $suite");
@@ -304,10 +306,10 @@ sub collect_one_suite($)
     $suite_opts= opts_from_file($suite_opt_file);
   }
 
-  if ( @::opt_cases )
+  if ( @$opt_cases )
   {
     # Collect in specified order
-    foreach my $test_name_spec ( @::opt_cases )
+    foreach my $test_name_spec ( @$opt_cases )
     {
       my ($sname, $tname, $extension)= split_testname($test_name_spec);
 
@@ -428,9 +430,15 @@ sub collect_one_suite($)
       {
 	foreach my $test (@cases)
 	{
-	  #print $test->{name}, " ", $comb, "\n";
-	  my $new_test= {};
+	  # Skip this combination if the values it provides
+	  # already are set in master_opt or slave_opt
+	  if (My::Options::is_set($test->{master_opt}, $comb->{comb_opt}) &&
+	      My::Options::is_set($test->{slave_opt}, $comb->{comb_opt}) ){
+	    next;
+	  }
 
+	  # Copy test options
+	  my $new_test= {};
 	  while (my ($key, $value) = each(%$test)) {
 	    if (ref $value eq "ARRAY") {
 	      push(@{$new_test->{$key}}, @$value);
@@ -450,6 +458,18 @@ sub collect_one_suite($)
 	  push(@new_cases, $new_test);
 	}
       }
+
+      # Add the plain test if it was not already added
+      # as part of a combination
+      my %added;
+      foreach my $new_test (@new_cases){
+	$added{$new_test->{name}}= 1;
+      }
+      foreach my $test (@cases){
+	push(@new_cases, $test) unless $added{$test->{name}};
+      }
+
+
       #print_testcases(@new_cases);
       @cases= @new_cases;
       #print_testcases(@cases);
@@ -481,6 +501,7 @@ sub optimize_cases {
     # --mysqld=--binlog-format=x, skip all test that does not
     # support it
     # =======================================================
+    #print "binlog_format: $binlog_format\n";
     if (defined $binlog_format )
     {
       # =======================================================
@@ -488,6 +509,8 @@ sub optimize_cases {
       # =======================================================
       if ( defined $tinfo->{'binlog_formats'} )
       {
+	#print "binlog_formats: ". join(", ", @{$tinfo->{binlog_formats}})."\n";
+
 	# The test supports different binlog formats
 	# check if the selected one is ok
 	my $supported=
@@ -513,23 +536,18 @@ sub optimize_cases {
 	  mtr_match_prefix($opt, "--binlog-format=") || $test_binlog_format;
       }
 
-      if (defined $test_binlog_format)
+      if (defined $test_binlog_format and
+	  defined $tinfo->{binlog_formats} )
       {
-	if ( defined $tinfo->{binlog_formats} )
+	my $supported=
+	  grep { $_ eq $test_binlog_format } @{$tinfo->{'binlog_formats'}};
+	if ( !$supported )
 	{
-	  my $supported=
-	    grep { $_ eq $test_binlog_format } @{$tinfo->{'binlog_formats'}};
-	  if ( !$supported )
-	  {
-	    $tinfo->{'skip'}= 1;
-	    $tinfo->{'comment'}=
-	      "Doesn't support --binlog-format='$test_binlog_format'";
-	    next;
-	  }
+	  $tinfo->{'skip'}= 1;
+	  $tinfo->{'comment'}=
+	    "Doesn't support --binlog-format='$test_binlog_format'";
+	  next;
 	}
-
-	# Save binlog format for dynamic switching
-	$tinfo->{binlog_format_switch}= $test_binlog_format;
       }
     }
   }
@@ -881,6 +899,12 @@ sub collect_one_test_case {
   if (defined $defaults_extra_file) {
     $tinfo->{extra_template_path}= $defaults_extra_file;
   }
+
+  # ----------------------------------------------------------------------
+  # Append mysqld extra options to both master and slave
+  # ----------------------------------------------------------------------
+  push(@{$tinfo->{'master_opt'}}, @::opt_extra_mysqld_opt);
+  push(@{$tinfo->{'slave_opt'}}, @::opt_extra_mysqld_opt);
 
   return $tinfo;
 }
diff -Nrup a/mysql-test/lib/mtr_misc.pl b/mysql-test/lib/mtr_misc.pl
--- a/mysql-test/lib/mtr_misc.pl	2007-12-19 12:58:02 +01:00
+++ b/mysql-test/lib/mtr_misc.pl	2008-01-07 19:44:45 +01:00
@@ -29,8 +29,6 @@ sub mtr_script_exists(@);
 sub mtr_file_exists(@);
 sub mtr_exe_exists(@);
 sub mtr_exe_maybe_exists(@);
-sub mtr_same_opts($$);
-sub mtr_cmp_opts($$);
 
 ##############################################################################
 #
@@ -189,69 +187,11 @@ sub mtr_exe_exists (@) {
 }
 
 
-
-sub mtr_same_opts ($$) {
-  my $l1= shift;
-  my $l2= shift;
-  return mtr_cmp_opts($l1,$l2) == 0;
-}
-
-sub mtr_cmp_opts ($$) {
-  my $l1= shift;
-  my $l2= shift;
-
-  my @l1= @$l1;
-  my @l2= @$l2;
-
-  return -1 if @l1 < @l2;
-  return  1 if @l1 > @l2;
-
-  while ( @l1 )                         # Same length
-  {
-    my $e1= shift @l1;
-    my $e2= shift @l2;
-    my $cmp= ($e1 cmp $e2);
-    return $cmp if $cmp != 0;
-  }
-
-  return 0;                             # They are the same
-}
-
-
 sub mtr_milli_sleep {
   die "usage: mtr_milli_sleep(milliseconds)" unless @_ == 1;
   my ($millis)= @_;
 
   select(undef, undef, undef, ($millis/1000));
-}
-
-#
-# Compare two arrays and put all unequal elements into a new one
-#
-sub mtr_diff_opts ($$) {
-  my $l1= shift;
-  my $l2= shift;
-  my $found;
-  my @result;
-  foreach my $e1 (@$l1)
-  {
-    $found= undef;
-    foreach my $e2 (@$l2)
-    {
-      $found= 1 unless ($e1 ne $e2);
-    }
-    push(@result, $e1) unless (defined $found);
-  }
-  foreach my $e2 (@$l2)
-  {
-    $found= undef;
-    foreach my $e1 (@$l1)
-    {
-      $found= 1 unless ($e1 ne $e2);
-    }
-    push(@result, $e2) unless (defined $found);
-  }
-  return @result;
 }
 
 1;
diff -Nrup a/mysql-test/lib/mtr_report.pl b/mysql-test/lib/mtr_report.pl
--- a/mysql-test/lib/mtr_report.pl	2007-12-12 18:18:46 +01:00
+++ b/mysql-test/lib/mtr_report.pl	2008-01-07 19:44:45 +01:00
@@ -68,7 +68,9 @@ sub mtr_report_test_skipped ($) {
     if ( $tinfo->{skip_detected_by_test} )
     {
       mtr_report("[ skip.]  $tinfo->{'comment'}");
-    } else {
+    }
+    else
+    {
       mtr_report("[ skip ]  $tinfo->{'comment'}");
     }
   }
diff -Nrup a/mysql-test/lib/t/Options.t b/mysql-test/lib/t/Options.t
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/mysql-test/lib/t/Options.t	2008-01-07 19:44:45 +01:00
@@ -0,0 +1,120 @@
+# -*- cperl -*-
+use Test::More qw(no_plan);
+use strict;
+
+use_ok("My::Options");
+
+my @tests=
+(
+  [
+   ['--binlog-format=row', '--loose-skip-innodb', '--binlog-format=ms'],
+   ['--binlog-format=row', '--loose-skip-innodb', '--binlog-format=statement'],
+   ['--binlog-format=statement']
+  ],
+
+  [
+   ['--binlog-format=row', '--loose-skip-innodb', '--binlog-format=statement'],
+   ['--binlog-format=row', '--loose-skip-innodb', '--binlog-format=mixed'],
+   ['--binlog-format=mixed']
+  ],
+
+  [
+   ['--binlog-format=row', '--loose-skip-innodb', '--binlog-format=mixed'],
+   ['--binlog-format=row', '--loose-skip-innodb', '--binlog-format=statement'],
+   ['--binlog-format=statement']
+  ],
+
+  [
+   ['--binlog-format=mixed', '--loose-skip-innodb', '--binlog-format=row'],
+   ['--binlog-format=statement', '--loose-skip-innodb', '--binlog-format=row'],
+   [ ]
+  ],
+
+  [
+   ['--binlog-format=row'],
+   [ ],
+   ['--binlog-format=default']
+  ],
+
+  [
+   [ ],
+   ['--binlog-format=row'],
+   ['--binlog-format=row']
+  ],
+
+  [
+   [ ],
+   ['-O', 'max_binlog_size=1' ],
+   ['--max_binlog_size=1' ]
+  ],
+
+  [
+   ['-O', 'max_binlog_size=1' ],
+   ['-O', 'max_binlog_size=1' ],
+   [ ],
+  ],
+
+  [
+   ['-O', 'max_binlog_size=1' ],
+   [ ],
+   ['--max_binlog_size=default' ]
+  ],
+
+  [
+   [ ],
+   ['-O', 'max_binlog_size=1', '--binlog-format=row' ],
+   ['--max_binlog_size=1', '--binlog-format=row' ]
+  ],
+  [
+   ['--binlog-format=statement' ],
+   ['-O', 'max_binlog_size=1', '--binlog-format=row' ],
+   ['--max_binlog_size=1', '--binlog-format=row']
+  ],
+
+  [
+   [ '--binlog-format=statement' ],
+   ['-O', 'max_binlog_size=1', '--binlog-format=statement' ],
+   ['--max_binlog_size=1' ]
+  ],
+
+ [
+   [ '--binlog-format=statement' ],
+   ['-O', 'max_binlog_size=1', '--binlog-format=statement' ],
+   ['--max_binlog_size=1' ]
+ ],
+
+ [
+  [ '--binlog-format=statement' ],
+  ['--relay-log=/path/to/a/relay-log', '--binlog-format=row'],
+  ['--relay-log=/path/to/a/relay-log', '--binlog-format=row' ]
+ ],
+
+
+ [
+  [ '--binlog-format=statement' ],
+  ['--relay-log=/path/to/a/relay-log', '-O', 'max_binlog_size=1'],
+  ['--max_binlog_size=1', '--relay-log=/path/to/a/relay-log', '--binlog-format=default' ]
+ ],
+
+
+);
+
+
+my $test_no= 0;
+foreach my $test (@tests){
+  print "test", $test_no++, "\n";
+  foreach my $opts (@$test){
+    print My::Options::toStr("", @$opts);
+  }
+  my $from= $test->[0];
+  my $to= $test->[1];
+  my @result= My::Options::diff($from, $to);
+  ok(My::Options::same(\@result, $test->[2]));
+  if (!My::Options::same(\@result, $test->[2])){
+    print "failed\n";
+    print My::Options::toStr("result", @result);
+    print My::Options::toStr("expect", @{$test->[2]});
+  }
+  print My::Options::toSQL(@result), "\n";
+  print "\n";
+}
diff -Nrup a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl
--- a/mysql-test/mysql-test-run.pl	2007-12-21 13:06:54 +01:00
+++ b/mysql-test/mysql-test-run.pl	2008-01-07 19:44:44 +01:00
@@ -48,6 +48,7 @@ use File::Copy;
 use File::Temp qw / tempdir /;
 use My::SafeProcess;
 use My::ConfigFactory;
+use My::Options;
 use mtr_cases;
 
 our $is_win32_perl=  ($^O eq "MSWin32"); # ActiveState Win32 Perl
@@ -230,7 +231,7 @@ sub main {
 
   # Figure out which tests we are going to run
   mtr_report("Collecting tests...");
-  my $tests= collect_test_cases($opt_suites);
+  my $tests= collect_test_cases($opt_suites, \@opt_cases);
 
   initialize_servers();
 
@@ -2075,28 +2076,29 @@ sub run_testcase_check_skip_test($)
 }
 
 
-sub dynamic_binlog_format_switch {
-  my ($tinfo, $mysqld)= @_;
+sub run_query {
+  my ($tinfo, $mysqld, $query)= @_;
 
-  my $sql= "include/set_binlog_format_".$tinfo->{binlog_format_switch}.".sql";
   my $args;
   mtr_init_args(\$args);
   mtr_add_arg($args, "--defaults-file=%s", $path_config_file);
   mtr_add_arg($args, "--defaults-group-suffix=%s", $mysqld->after('mysqld'));
+
+  mtr_add_arg($args, "-e %s", $query);
+
   my $res= My::SafeProcess->run
     (
-     name          => "switch binlog format ".$mysqld->name(),
+     name          => "run_query -> ".$mysqld->name(),
      path          => $exe_mysql,
      args          => \$args,
-     input         => $sql,
+     output        => '/dev/null',
+     error         => '/dev/null'
     );
 
-  if ($res != 0)
-  {
-    mtr_error("Failed to switch binlog format");
-  }
+  return $res
 }
 
+
 sub do_before_run_mysqltest($)
 {
   my $tinfo= shift;
@@ -2570,7 +2572,7 @@ sub mysqld_stop {
 sub mysqld_arguments ($$$) {
   my $args=              shift;
   my $mysqld=            shift;
-  my $extra_opt=         shift;
+  my $extra_opts=        shift;
 
   my $prefix= "";               # If mysqltest server arg
   if ( $opt_embedded_server )
@@ -2585,7 +2587,7 @@ sub mysqld_arguments ($$$) {
   # to start unless we specify what user to run as, see BUG#30630
   my $euid= $>;
   if (!$is_win32 and $euid == 0 and
-      (grep(/^--user/, @$extra_opt, @opt_extra_mysqld_opt)) == 0) {
+      (grep(/^--user/, @$extra_opts)) == 0) {
     mtr_add_arg($args, "%s--user=root", $prefix);
   }
 
@@ -2606,8 +2608,7 @@ sub mysqld_arguments ($$$) {
   }
 
   # Check if "extra_opt" contains skip-log-bin
-  my $skip_binlog= grep(/^(--|--loose-)skip-log-bin/,
-			@$extra_opt, @opt_extra_mysqld_opt);
+  my $skip_binlog= grep(/^(--|--loose-)skip-log-bin/, @$extra_opts);
 
   if ( $opt_debug )
   {
@@ -2622,7 +2623,7 @@ sub mysqld_arguments ($$$) {
   }
 
   my $found_skip_core= 0;
-  foreach my $arg ( @opt_extra_mysqld_opt, @$extra_opt )
+  foreach my $arg ( @$extra_opts )
   {
     # Allow --skip-core-file to be set in <testname>-[master|slave].opt file
     if ($arg eq "--skip-core-file")
@@ -2651,9 +2652,12 @@ sub mysqld_arguments ($$$) {
 }
 
 
+
 sub mysqld_start ($$) {
   my $mysqld=            shift;
-  my $extra_opt=         shift;
+  my $extra_opts=        shift;
+
+  mtr_verbose(My::Options::toStr("mysqld_start", @$extra_opts));
 
   my $exe= $exe_mysqld;
   my $wait_for_pid_file= 1;
@@ -2669,7 +2673,7 @@ sub mysqld_start ($$) {
     valgrind_arguments($args, \$exe);
   }
 
-  mysqld_arguments($args,$mysqld,$extra_opt);
+  mysqld_arguments($args,$mysqld,$extra_opts);
 
   if ( $opt_gdb || $opt_manual_gdb )
   {
@@ -2738,7 +2742,7 @@ sub mysqld_start ($$) {
   }
 
   # Remember options used when starting
-  $mysqld->{'started_opts'}= $extra_opt;
+  $mysqld->{'started_opts'}= $extra_opts;
 
   return;
 }
@@ -2758,7 +2762,6 @@ sub stop_all_servers () {
 }
 
 
-
 # Find out if server should be restarted for this test
 sub server_need_restart {
   my ($tinfo, $server)= @_;
@@ -2811,35 +2814,34 @@ sub server_need_restart {
     }
   }
 
-  my $is_mysqld=  grep ($server eq $_, mysqlds());
+  my $is_mysqld= grep ($server eq $_, mysqlds());
   if ($is_mysqld)
   {
 
     # Check that running process was started with same options
     # as the current test requires
-    my $extra_opt= get_extra_opt($server, $tinfo);
+    my $extra_opts= get_extra_opts($server, $tinfo);
     my $started_opts= $server->{'started_opts'};
-    if (defined $started_opts and $extra_opt and
-	! mtr_same_opts($started_opts, $extra_opt) )
+
+    if (!My::Options::same($started_opts, $extra_opts) )
     {
-      # TODO Use a list  to find all options that can be set dynamically
+      mtr_verbose(My::Options::toStr("started_opts", @$started_opts));
+      mtr_verbose(My::Options::toStr("extra_opts", @$extra_opts));
 
-      # Check if diff is binlog format only
-      # and the next test has $binlog_format_switch set
-      my @diff_opts= mtr_diff_opts($started_opts, $extra_opt);
-      if (@diff_opts == 2 and
-	  $diff_opts[0] =~/^--binlog-format=/ and
-	  $diff_opts[1] =~/^--binlog-format=/ and
-	  defined $tinfo->{binlog_format_switch})
-      {
-	mtr_verbose("Using dynamic switch of binlog format from ",
-		    $diff_opts[0],"to", $diff_opts[1]);
-	dynamic_binlog_format_switch($tinfo, $server);
+      # Get diff and check if dynamic switch is possible
+      my @diff_opts= My::Options::diff($started_opts, $extra_opts);
+      mtr_verbose(My::Options::toStr("diff_opts", @diff_opts));
+
+      my $query= My::Options::toSQL(@diff_opts);
+      mtr_verbose("Attempting dynamic switch '$query'");
+      if (run_query($tinfo, $server, $query)){
+	mtr_verbose("Restart: Dynamic switch failed");
+	return 1;
       }
       else
       {
 	mtr_verbose("Restart: running with different options '" .
-		    join(" ", @{$extra_opt}) . "' != '" .
+		    join(" ", @{$extra_opts}) . "' != '" .
 		    join(" ", @{$server->{'started_opts'}}) . "'" );
 	return 1;
       }
@@ -2890,7 +2892,7 @@ sub started { return grep(defined $_, ma
 sub stopped { return grep(!defined $_, map($_->{proc}, @_)); }
 
 
-sub get_extra_opt {
+sub get_extra_opts {
   my ($mysqld, $tinfo)= @_;
 
   return
@@ -3026,8 +3028,8 @@ sub start_servers($) {
       return 1;
     }
 
-    my $extra_opt= get_extra_opt($mysqld, $tinfo);
-    mysqld_start($mysqld,$extra_opt);
+    my $extra_opts= get_extra_opts($mysqld, $tinfo);
+    mysqld_start($mysqld,$extra_opts);
 
     # Save this test case information, so next can examine it
     $mysqld->{'started_tinfo'}= $tinfo;
Thread
bk commit into 5.1 tree (msvensson:1.2674)msvensson7 Jan