List:Commits« Previous MessageNext Message »
From:Luis Soares Date:September 15 2009 9:55am
Subject:bzr commit into mysql-5.1-bugteam branch (luis.soares:3124) Bug#47312
View as plain text  
#At file:///home/lsoares/Workspace/bzr/work/bugfixing/47312/mysql-5.1-bugteam/ based on revid:luis.soares@stripped

 3124 Luis Soares	2009-09-15
      BUG#47312: RBR: Disabling key on slave breaks replication:
      HA_ERR_WRONG_INDEX
      
      In RBR, if disabling keys on slave table it breaks replication if
      updating or deleting a record. When the slave thread tries to
      finding the row, by searching the storage engine, it checkes
      whether the table has a key or not. If it has one, then the slave
      thread uses it to search the record.
      
      Unfortunately, the slave only checks whether the key exists or
      not, it does not verify if it is active. Should the key be
      disabled (eg, DBA has issued an ALTER TABLE ... DISABLE KEYS)
      then it will result in error: HA_ERR_WRONG_INDEX.
      
      This patch addresses this issue by making the slave thread also
      verify whether the key is active or not.

    added:
      mysql-test/suite/rpl/r/rpl_row_disabled_slave_key.result
      mysql-test/suite/rpl/t/rpl_row_disabled_slave_key.test
    modified:
      sql/log_event.cc
=== added file 'mysql-test/suite/rpl/r/rpl_row_disabled_slave_key.result'
--- a/mysql-test/suite/rpl/r/rpl_row_disabled_slave_key.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl/r/rpl_row_disabled_slave_key.result	2009-09-15 09:55:53 +0000
@@ -0,0 +1,26 @@
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+SET SQL_LOG_BIN=0;
+CREATE TABLE t (a int, b int, c int, key(b));
+SET SQL_LOG_BIN=1;
+CREATE TABLE t (a int, b int, c int);
+INSERT INTO t VALUES (1,2,4);
+INSERT INTO t VALUES (4,3,4);
+DELETE FROM t;
+DROP TABLE t;
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+CREATE TABLE t (a int, b int, c int, key(b));
+ALTER TABLE t DISABLE KEYS;
+INSERT INTO t VALUES (1,2,4);
+INSERT INTO t VALUES (4,3,4);
+DELETE FROM t;
+DROP TABLE t;

=== added file 'mysql-test/suite/rpl/t/rpl_row_disabled_slave_key.test'
--- a/mysql-test/suite/rpl/t/rpl_row_disabled_slave_key.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl/t/rpl_row_disabled_slave_key.test	2009-09-15 09:55:53 +0000
@@ -0,0 +1,73 @@
+# BUG#47312: RBR: Disabling key on slave breaks replication:
+# HA_ERR_WRONG_INDEX
+#
+# Description
+# ===========
+#   
+#   This test case checks whether disabling a key on a slave breaks
+#   replication or not.
+#   
+#   Case #1, shows that while not using ALTER TABLE... DISABLE KEYS and
+#   the slave has no key defined while the master has one, replication
+#   won't break.
+#
+#   Case #2, shows that before patch for BUG#47312, if defining key on
+#   slave table, and later disable it, replication would break. This
+#   has been fixed.
+# 
+
+-- source include/master-slave.inc
+-- source include/have_binlog_format_row.inc
+
+#
+# Case #1: master has key, but slave has not. 
+#          Replication does not break.
+# 
+
+SET SQL_LOG_BIN=0;
+CREATE TABLE t (a int, b int, c int, key(b));
+SET SQL_LOG_BIN=1;
+
+-- connection slave
+
+CREATE TABLE t (a int, b int, c int);
+
+-- connection master
+
+INSERT INTO t VALUES (1,2,4);
+INSERT INTO t VALUES (4,3,4);
+DELETE FROM t;
+
+-- sync_slave_with_master
+
+-- connection master
+DROP TABLE t;
+
+-- sync_slave_with_master
+
+#
+# Case #2: master has key, slave also has one, 
+#          but it gets disabled sometime.
+#          Replication does not break anymore.
+# 
+-- source include/master-slave-reset.inc
+-- connection master
+
+CREATE TABLE t (a int, b int, c int, key(b));
+
+-- sync_slave_with_master
+
+ALTER TABLE t DISABLE KEYS;
+
+-- connection master
+
+INSERT INTO t VALUES (1,2,4);
+INSERT INTO t VALUES (4,3,4);
+DELETE FROM t;
+
+-- sync_slave_with_master
+
+-- connection master
+DROP TABLE t;
+
+-- sync_slave_with_master

=== modified file 'sql/log_event.cc'
--- a/sql/log_event.cc	2009-09-10 10:05:53 +0000
+++ b/sql/log_event.cc	2009-09-15 09:55:53 +0000
@@ -8835,11 +8835,11 @@ int Rows_log_event::find_row(const Relay
    */ 
   store_record(table,record[1]);    
 
-  if (table->s->keys > 0)
+  if (table->s->keys > 0 && table->s->keys_in_use.is_set(0))
   {
     DBUG_PRINT("info",("locating record using primary key (index_read)"));
 
-    /* We have a key: search the table using the index */
+    /* We have an active key: search the table using the index */
     if (!table->file->inited && (error= table->file->ha_index_init(0, FALSE)))
     {
       DBUG_PRINT("info",("ha_index_init returns error %d",error));


Attachment: [text/bzr-bundle] bzr/luis.soares@sun.com-20090915095553-f3f74h2nzzhli6kz.bundle
Thread
bzr commit into mysql-5.1-bugteam branch (luis.soares:3124) Bug#47312Luis Soares15 Sep
  • Re: bzr commit into mysql-5.1-bugteam branch (luis.soares:3124)Bug#47312He Zhenxing17 Sep
  • Re: bzr commit into mysql-5.1-bugteam branch (luis.soares:3124)Bug#47312Andrei Elkin18 Sep
    • Re: bzr commit into mysql-5.1-bugteam branch (luis.soares:3124)Bug#47312Paul DuBois18 Sep
      • Re: bzr commit into mysql-5.1-bugteam branch (luis.soares:3124)Bug#47312Andrei Elkin18 Sep