List:Commits« Previous MessageNext Message »
From:Alfranio Correia Date:August 13 2009 4:21pm
Subject:bzr commit into mysql-5.1-bugteam branch (alfranio.correia:3053)
Bug#46130
View as plain text  
#At file:///home/acorreia/workspace.sun/repository.mysql/bzrwork/bug-46130/mysql-5.1-bugteam/ based on revid:satya.bn@stripped

 3053 Alfranio Correia	2009-08-13
      BUG#46130 Slave does not correctly handle "expected errors"
      
      In STATEMENT based replication, a statement that failed on the master but that
      updated non-transactional tables is written to binary log with the error code
      appended to it. On the slave, the statement is executed and the same error is
      expected. However, when an "expected error" did not happen on the slave and was
      either ignored or was related to a concurrency issue on the master, the slave
      did not rollback the effects of the statement and as such inconsistencies might
      happen.
      
      To fix the problem, we automatically rollback a statement that should have
      failed on a slave but succeded and whose expected failure is either ignored or
      stems from a concurrency issue on the master.

    modified:
      mysql-test/suite/rpl/r/rpl_concurrency_error.result
      mysql-test/suite/rpl/t/rpl_concurrency_error.test
      sql/log_event.cc
=== modified file 'mysql-test/suite/rpl/r/rpl_concurrency_error.result'
--- a/mysql-test/suite/rpl/r/rpl_concurrency_error.result	2009-07-18 20:07:56 +0000
+++ b/mysql-test/suite/rpl/r/rpl_concurrency_error.result	2009-08-13 16:21:01 +0000
@@ -101,6 +101,8 @@ master-bin.000001	#	Query	#	#	use `test`
 master-bin.000001	#	Query	#	#	use `test`; INSERT INTO t VALUES (6 + (1 * 10),"brown")
 master-bin.000001	#	Query	#	#	use `test`; INSERT INTO n VALUES (now(),"brown")
 master-bin.000001	#	Xid	#	#	COMMIT /* XID */
+source include/diff_master_slave.inc;
+source include/diff_master_slave.inc;
 ########################################################################
 #                                Cleanup
 ########################################################################

=== modified file 'mysql-test/suite/rpl/t/rpl_concurrency_error.test'
--- a/mysql-test/suite/rpl/t/rpl_concurrency_error.test	2009-07-18 20:07:56 +0000
+++ b/mysql-test/suite/rpl/t/rpl_concurrency_error.test	2009-08-13 16:21:01 +0000
@@ -125,14 +125,13 @@ while ($type)
 connection master;
 sync_slave_with_master;
 
-# Re-enable this after fixing BUG#46130
-#connection master;
-#let $diff_statement= SELECT * FROM t order by i;
-#source include/diff_master_slave.inc;
-
-#connection master;
-#let $diff_statement= SELECT * FROM n order by d, f;
-#source include/diff_master_slave.inc;
+connection master;
+let $diff_statement= SELECT * FROM t order by i;
+source include/diff_master_slave.inc;
+
+connection master;
+let $diff_statement= SELECT * FROM n order by d, f;
+source include/diff_master_slave.inc;
 
 --echo ########################################################################
 --echo #                                Cleanup

=== modified file 'sql/log_event.cc'
--- a/sql/log_event.cc	2009-07-24 16:04:55 +0000
+++ b/sql/log_event.cc	2009-08-13 16:21:01 +0000
@@ -3160,7 +3160,7 @@ compare_errors:
 
      /*
       If we expected a non-zero error code, and we don't get the same error
-      code, and none of them should be ignored.
+      code, and it should be ignored or is related to a concurrency issue.
     */
     actual_error= thd->is_error() ? thd->main_da.sql_errno() : 0;
     DBUG_PRINT("info",("expected_error: %d  sql_errno: %d",
@@ -3183,7 +3183,8 @@ Default database: '%s'. Query: '%s'",
       thd->is_slave_error= 1;
     }
     /*
-      If we get the same error code as expected, or they should be ignored. 
+      If we get the same error code as expected and it is not a concurrency
+      issue, or should be ignored.
     */
     else if ((expected_error == actual_error && 
               !concurrency_error_code(expected_error)) ||
@@ -3194,6 +3195,14 @@ Default database: '%s'. Query: '%s'",
       thd->killed= THD::NOT_KILLED;
     }
     /*
+      If we expected a non-zero error code and get nothing and, it is a concurrency
+      issue or should be ignored.
+    */
+    else if (expected_error && !actual_error && 
+             (concurrency_error_code(expected_error) ||
+              ignored_error_code(expected_error)))
+      ha_autocommit_or_rollback(thd, TRUE);
+    /*
       Other cases: mostly we expected no error and get one.
     */
     else if (thd->is_slave_error || thd->is_fatal_error)


Attachment: [text/bzr-bundle]
Thread
bzr commit into mysql-5.1-bugteam branch (alfranio.correia:3053)Bug#46130Alfranio Correia13 Aug
  • Re: bzr commit into mysql-5.1-bugteam branch (alfranio.correia:3053)Bug#46130He Zhenxing14 Aug