List:Commits« Previous MessageNext Message »
From:Luís Soares Date:September 21 2009 11:11am
Subject:Re: bzr commit into nuts branch (Serge.Kozlov:350) WL#5061
View as plain text  
Hi Serge,

  Nice Work. Please find my review comments below.

Cheers,
Luís

STATUS
------
  Approved. (with one suggestion/request below).

REQUIRED CHANGES
----------------
 n/a

REQUESTS
--------

  R1. Please, move the supported_engines into the standard nuts
      library. It's not a blocker for the WL to be pushed, but
      would be nice to have it as a general function. See
      previous review comments for arguments: 
   
      http://lists.mysql.com/commits/83265

SUGGESTIONS
-----------
 n/a

DETAILS 
-------
 n/a

On Sat, 2009-09-19 at 20:42 +0400, Serge Kozlov wrote:
> #At file:///home/ksm/sun/repo/WL5061/nuts-commit-2/ based on
> revid:serge.kozlov@stripped
> 
>   350 Serge Kozlov	2009-09-19
>       WL#5061 Test case.
>       added:
>         suites/rep/chained_diff_engine.pm
> 
> === added file 'suites/rep/chained_diff_engine.pm'
> --- a/suites/rep/chained_diff_engine.pm	1970-01-01 00:00:00 +0000
> +++ b/suites/rep/chained_diff_engine.pm	2009-09-19 16:42:24 +0000
> @@ -0,0 +1,178 @@
> +package rep::chained_diff_engine;
> +use Exporter;
> +our @ISA = qw(Exporter My::Nuts::Library::Tests::SimpleTest);
> +use strict;
> +use warnings;
> +use My;
> +use My::Nuts::Library::Kernel::Server;
> +use My::Nuts::Library::Kernel::ServerResult;
> +use My::Nuts::Library::Kernel::Manager;
> +use My::Nuts::Library::Kernel::Result;
> +use My::Nuts::Library::Tests::SimpleTest;
> +use My::Nuts::Library::Kernel::Replication;
> +use Test::More;
> +use DataSource;
> +
> +sub prepare
> +{
> +    return;
> +}
> +
> +sub startup
> +{
> +    return;
> +}
> +
> +sub fire
> +{
> +    my ($test) = @_;
> +    # Server A
> +    my $master = ok_server ($test);
> +    # Supported engines for A
> +    my $engines_a = supported_engines($master);
> +    # Server B (middle)
> +    my $master_middle = ok_server ($test);
> +    # Supported engines for B
> +    my $engines_b = supported_engines($master_middle);
> +    # Server C
> +    my $slave = ok_server ($test);
> +    # Test DB name
> +    my $dbname  = "test";
> +    
> +    # Read list of statements from data source
> +    my $src_data = get_data_from_source();
> +    
> +    # Calculate test plan and check statements before them into $data
> +    my $test_plan= 0;
> +    my $data = [];
> +    sql ($slave, "CREATE DATABASE IF NOT EXISTS " . $dbname);    
> +    foreach my $engine_a (@$engines_a)
> +    {
> +      foreach my $engine_b (@$engines_b)
> +      {
> +	if ($engine_a ne $engine_b)
> +	{
> +	  # Init data
> +	  push(@$data, [$master, undef, "DROP DATABASE IF EXISTS " . $dbname]);
> +	  push(@$data, [$master, undef, "CREATE DATABASE " . $dbname]);
> +	  push(@$data, [$master, undef, "USE " . $dbname]);
> +	  push(@$data, [$master, $master_middle, "TEST: synchronize"]);
> +	  push(@$data, [$master_middle, undef, "USE " . $dbname]);
> +	  push(@$data, [$master_middle, $slave, "TEST: synchronize"]);
> +	  push(@$data, [$slave, undef, "USE " . $dbname]);
> +	  foreach my $query (@$src_data)
> +	  {
> +	    my $rs;
> +	    # Each CREATE TABLE statement should be checked and added with updated engine 
> +	    if ($query =~ m/CREATE\ +TABLE\ +([a-zA-Z0-9_]+)/i)
> +	    {
> +	      my $table_name = $1;
> +	      my $cur_query = $query;
> +	      if ($cur_query !~ m/;/i)
> +	      {
> +	        $cur_query .= ";";
> +	      }
> +	      my $cur_query_a = $cur_query;
> +	      my $cur_query_b = $cur_query;
> +	      if ($cur_query =~ m/(ENGINE=[a-zA-Z_0-9])/i)
> +	      {
> +	        $cur_query_a =~ s/$1/$engine_a/;
> +	        $cur_query_b =~ s/$1/$engine_b/;
> +	      }
> +	      else
> +	      {
> +	        $cur_query_a =~ s/\;/ ENGINE=$engine_a;/;	        
> +	        $cur_query_b =~ s/\;/ ENGINE=$engine_b;/;	        
> +	      }
> +	      $rs = sql ($slave, "DROP TABLE IF EXISTS $table_name;");    
> +	      next if (is_error($rs));
> +	      $rs = sql ($slave, $cur_query_a);    
> +	      next if (is_error($rs));
> +	      $rs = sql ($slave, "DROP TABLE IF EXISTS $table_name;");    
> +	      next if (is_error($rs));
> +	      $rs = sql ($slave, $cur_query_b);    
> +	      next if (is_error($rs));
> +	      push(@$data, [$master, undef, "DROP TABLE IF EXISTS $table_name;"]);
> +	      push(@$data, [$master, undef, $cur_query_a]);
> +	      push(@$data, [$master, $master_middle, "TEST: synchronize"]);
> +	      push(@$data, [$master_middle, undef, "ALTER TABLE $table_name ENGINE =
> $engine_b;"]);
> +	      push(@$data, [$master_middle, $slave, "TEST: synchronize"]);
> +	      push(@$data, [$slave, undef, "ALTER TABLE $table_name ENGINE =
> $engine_a;"]);
> +	    }
> +	    else
> +	    {
> +	      $rs = sql ($slave, $query);    
> +	      next if (is_error($rs));
> +	      #push(@$data, [$master, undef, "SET \@x='$engine_a -> $engine_b';"]);	    
>      
> +	      push(@$data, [$master, undef, $query]);
> +	    }            
> +	  }
> +	  push(@$data, [$master, $master_middle, "TEST: synchronize"]);
> +	  push(@$data, [$master_middle, $slave, "TEST: synchronize"]);
> +	  push(@$data, [undef, undef, "TEST: compare_db"]);	          
> +	}	
> +      }	
> +    }
> +    plan tests => scalar(@$data);
> +    sql ($slave, "DROP DATABASE " . $dbname);    
> +
> +    # Setup topology
> +    attach ( $master, $master_middle );
> +    attach ( $master_middle, $slave );
> +
> +    # Main loop of test: run all statements
> +    foreach my $qinfo (@$data)
> +    {
> +      if ($qinfo->[2] =~ m/TEST\: synchronize/i)
> +      {
> +        ok_synchronize($qinfo->[0], $qinfo->[1]);
> +      }
> +      elsif ($qinfo->[2] =~ m/TEST\: compare\_db/i)
> +      {
> +        ok_compare_dbs([
> +    	  {"conn" => $master, "dbname" => "test"},
> +    	  {"conn" => $master_middle, "dbname" => "test"},
> +    	  {"conn" => $slave, "dbname" => "test"}        
> +        ]);
> +      }
> +      else
> +      {
> +        ok_sql($qinfo->[0], $qinfo->[2]);
> +      }
> +    }
> +}
> +
> +sub shutdown
> +{
> +    return;
> +}
> +
> +sub supported_engines
> +{
> +  my $conn = shift;
> +  my $engines = [];
> +  my $rs = sql ( $conn, "SHOW ENGINES;" );
> +  my @rs_data = get_next($rs);
> +  while (defined $rs_data[0])
> +  {
> +    if ($rs_data[1] =~ m/(YES|DEFAULT)/ig && $rs_data[0] =~
> m/(^MYISAM|INNODB|MEMORY)/ig)
> +    {
> +	push(@$engines, $rs_data[0]);
> +    }
> +    @rs_data = get_next($rs);
> +  }
> +  return $engines;
> +}
> +
> +1;
> +__END__;
> +
> +=head1 NAME
> +
> +rep::chained_diff_engine - Replication for chain A->B->C, where B has
> different engine than A,C
> +
> +=head1 SYNOPSIS
> +
> +Replication for chain A->B->C, where tables on B have different engine than A
> and C
> +
> +=back
> 
> 
-- 
Luís

Thread
bzr commit into nuts branch (Serge.Kozlov:350) WL#5061Serge Kozlov19 Sep
  • Re: bzr commit into nuts branch (Serge.Kozlov:350) WL#5061Luís Soares21 Sep