List:Commits« Previous MessageNext Message »
From:Luís Soares Date:March 30 2010 4:07pm
Subject:Re: WL#5096 review
View as plain text  
Hi Sven,

On Tue, 2010-03-30 at 14:45 +0200, Sven Sandberg wrote:
> Hi Luís,
> 
> Wow, great work! You reworked it quite a bit. The test logic is *much*
> easier to understand now.

Thank you. There's a lot of your work in it as well.

> In this email, I first review rpl_row_img.test and files that it uses. 
> Then I reply to your previous email.
> 

OK.

> In rpl_chained_3_hosts_sync.inc, there's an extra "save_master_pos". I
> suggest to remove this.
> 

Removed.

> rpl_row_img_diff_keys.inc:

I think you meant: rpl_row_img_diff_indexes.inc

> >     -- echo ### Master with Key, slaves with no PKs on different fields
> 
> Remove the word 'no' (cases $i=9, $i=10).

Done.

> 
> In rpl_row_img_blobs.test, the comments in the beginning of each case 
> are not really understandable: see comments below
> 
> rpl_row_img_blobs.test:
> >   # 
> >   # The comments below (on create table) must be read with the SQL
> >   # instructions issued later in mind. Declaring a table obviously is 
> >   # not enough to assert anything.
> >   #
> >   # Also, the tests in this file make more sense when performed with
> >   # binlog_row_image configured as NOBLOB.
> >   #
> > 
> >   if (`SELECT $i=1`) {
> >     -- echo ### R1: replicate blobs always because they are part of PK
> 
> This probably refers to R1 in WL#5096. So the comment is not 
> self-contained. (There are also four different R1 in the WL.) Better to 
> state explicitly what we test. The comment in case $i=3 is good - can we 
> use a similar comment for case $i=2 and $i=1 too?

Fixed.

> >     -- connection mysqld_a
> >     --eval CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512)))
> engine= $mysqld_a_engine;
> >     -- connection mysqld_b
> >     --eval CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512)))
> engine= $mysqld_b_engine;
> >     -- connection mysqld_c 
> >     --eval CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c2(512)))
> engine= $mysqld_c_engine;
> >   }
> >   if (`SELECT $i=2`)
> >   { 
> >     -- echo ### Asserts that R1 does not break replication
> 
> See case $i=1

Fixed.

> >     -- connection mysqld_a
> >     --eval CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique
> key(c2(512))) engine= $mysqld_a_engine;
> >     -- connection mysqld_b
> >     --eval CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique
> key(c2(512))) engine= $mysqld_b_engine;
> >     -- connection mysqld_c
> >     --eval CREATE TABLE t (c1 int, c2 blob NOT NULL, c3 int, unique
> key(c2(512))) engine= $mysqld_c_engine;
> >   }
> >   if (`SELECT $i=3`)
> >   {
> >     -- echo ### Asserts that declaring a blob in a key does not break
> replication
> 
> Good.

Good.

> >     -- connection mysqld_a
> >     --eval CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine=
> $mysqld_a_engine;
> >     -- connection mysqld_b
> >     --eval CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine=
> $mysqld_b_engine;
> >     -- connection mysqld_c
> >     --eval CREATE TABLE t (c1 int, c2 blob, c3 int, key(c2(512))) engine=
> $mysqld_c_engine;
> > 
> >   }
> >   if (`SELECT $i=4`) {
> >     -- echo ### This asserts that R2 does not break replication
> 
> This comment too is not self-contained. But does this test really cover 
> anything that the other cases don't cover? I think a blob outside a PK 
> is covered by $i=5.

Yes, it does. In this case we have an explicit PK, while on $i==5
we have an implicit PK (UK NOT NULL). I want to keep this.

> >     -- connection mysqld_a
> >     --eval CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine=
> $mysqld_a_engine;
> >     -- connection mysqld_b
> >     --eval CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine=
> $mysqld_b_engine;
> >     -- connection mysqld_c 
> >     --eval CREATE TABLE t (c1 int, c2 blob, c3 int, primary key(c1)) engine=
> $mysqld_c_engine;
> > 
> >   }
> >   if (`SELECT $i=5`)
> >   { 
> >     -- echo ### Asserts R4 - when using NOBLOB c2 shall not be replicated if it
> is not updated 
> 
> We don't check that c2 is not replicated (the test would succeed even if 
> c2 was replicated), so this comment is wrong. What I think we do test is 
> something like "replication works when a blob column is left out due to 
> the setting binlog_row_image=NOBLOB." Same thing for case $i=6 and $i=7.

Fixed.

> >     -- connection mysqld_a
> >     --eval CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique
> key(c1)) engine= $mysqld_a_engine;
> >     -- connection mysqld_b
> >     --eval CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique
> key(c1)) engine= $mysqld_b_engine;
> >     -- connection mysqld_c
> >     --eval CREATE TABLE t (c1 int NOT NULL, c2 blob NOT NULL, c3 int, unique
> key(c1)) engine= $mysqld_c_engine;
> > 
> >   }
> >   if (`SELECT $i=6`)
> >   { 
> >     -- echo ### Asserts R4 - when using NOBLOB c2 shall not be replicated if it
> is not updated/written
> 
> See above.

Fixed.

> >     -- connection mysqld_a
> >     --eval CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine=
> $mysqld_a_engine;
> >     -- connection mysqld_b
> >     --eval CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine=
> $mysqld_b_engine;
> >     -- connection mysqld_c
> >     --eval CREATE TABLE t (c1 int, c2 blob, c3 int, key(c1)) engine=
> $mysqld_c_engine;
> > 
> >   }
> >   if (`SELECT $i=7`)
> >   { 
> >     -- echo ### Asserts R4 - when using NOBLOB c2 shall not be replicated if it
> is not updated/written
> 
> See above.

Fixed.

> >     -- connection mysqld_a
> >     --eval CREATE TABLE t (c1 int, c2 blob, c3 int) engine= $mysqld_a_engine;
> >     -- connection mysqld_b
> >     --eval CREATE TABLE t (c1 int, c2 blob, c3 int) engine= $mysqld_b_engine;
> >     -- connection mysqld_c
> >     --eval CREATE TABLE t (c1 int, c2 blob, c3 int) engine= $mysqld_c_engine;
> >   }
> 
> 
> 
> Luís Soares wrote:
> [...]
> >> (S19) rpl_row_img_set.inc is a generic file used for the chained 3 hosts 
> >> setup - maybe it should be named rpl_chained_3_hosts_set_img.inc or 
> >> something like that? Also, what's the logic of the division into 
> >> mysql-test/extra/rpl_tests vs mysql-test/suite/rpl/include ? Can't we 
> >> have all files in one place?
> > 
> > rpl_row_img_set.inc is now usable in all scenarios.
> > I usually reason like this:
> >   - accessories/auxiliar stuff put in mysql-test/suite/rpl/include
> >   - more strictly related to testing (assertion wise) put in
> >     mysql-test/extra/rpl_tests and mysql-test/suite/rpl/t
> 
> This doesn't sound like a bad principle. But it doesn't seem to work
> this way for existing files. suite/rpl/include is quite new. Before we
> had this, we used include/ for generic auxiliary files
> (master-slave.inc, wait_for_slave_* etc) and extra/rpl_tests/ for
> test-specific include files with assertions etc. Also, e.g.,
> mysql-test/suite/rpl/include/rpl_mixed_dml.inc isn't a generic auxiliary
> file, but more like a test with assertions.
> 

Moved everything, related to WL#5096, under suite/rpl/include 
to include/ as we had agreed.

> [...]
> >>> -- perl END_OF_FILE
> >>>
> >> (S17) I suggest to add this to the top of
> rpl_row_mysqlbinlog_img_check.inc:
> >>
> >>    -- sync_slave_with_master
> >>    -- let $MYSQLD_DATADIR= `select @@datadir;`
> >>    -- exec $MYSQL_BINLOG -v $MYSQLD_DATADIR/slave-bin.000001 > $TMP_FILE
> >>
> >> Then these commands can be eliminated from the rpl_row_img_sanity.test, 
> >> where they are repeated a lot.
> > 
> > Done. However, I must note that now mysqlbinlog is called on every
> > rpl_row_img_parts_assertion.inc include. I think that's probably one
> > thing we can't escape if we want to reduce the scope of the pattern
> > matching (I provide details later on in this email).
> 
> I think that's ok. Correctness wins over optimization :-)

Good.

> [...]
> >>    # Save IMG_EXPECTED in $img and check if it has correct format
> >>    my $img = $ENV{'IMG_EXPECTED'};
> >>    $img =~ /^([0-9]+:\S+ )*\|( [0-9]+:\S+)*$/
> >>      or die "Invalid format of IMG_EXPECTED parameter";
> >>    # Turn $img into the format of the binlog, and get BI and AI
> >>    $img =~ s/ *([0-9]+):(\S*) */###   \@$1=$2\n/g;
> >>    my ($ai, $bi)= split(/\|/, $img);
> > 
> > I reversed ($ai and $bi) here. Makes it more intuitive while 
> > reading/writing the expected values before the include... 
> > Any special reason for you to put it $ai, $bi ?
> 
> It was a mistake. I probably just put them in alphabetic order :-)
> Thanks for correcting it.

No problem.

> [...]
> >> (S16) I suggest to add "RESET MASTER" to the bottom of 
> >> rpl_row_mysqlbinlog_img_check.inc. See comment (S16) in 
> >> rpl_row_img_sanity.test, below.
> > 
> > I think it's better to take other approach. Let this script 
> > take the start position of the binary log for the event one
> > is scanning. (If we have the need we can later had the stop
> > position as well). 
> 
> Sounds good too.

Great!

Cset: http://lists.mysql.com/commits/104642

Regards,
Luís

Thread
WL#5096 reviewSven Sandberg9 Nov
  • Re: WL#5096 reviewLuís Soares24 Nov
    • Re: WL#5096 reviewLuís Soares25 Nov
    • Re: WL#5096 reviewSven Sandberg2 Dec
      • Re: WL#5096 reviewLuís Soares26 Mar
        • Re: WL#5096 reviewSven Sandberg30 Mar
          • Re: WL#5096 reviewLuís Soares30 Mar