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