List:Commits« Previous MessageNext Message »
From:Jon Olav Hauglid Date:April 19 2011 1:07pm
Subject:bzr commit into mysql-5.5 branch (jon.hauglid:3456) Bug#12346411
View as plain text  
#At file:///export/home/x/mysql-5.5-bug12346411/ based on revid:serge.kozlov@stripped

 3456 Jon Olav Hauglid	2011-04-19
      Bug#12346411 SQL/LOG.CC:6509: ASSERTION `PREPARED_XIDS > 0' FAILED
      
      This assert could be triggered during two phase commit if binary
      log was used as transaction coordinator log. The triggered assert
      checks that the same number of transaction IDs are processed in
      the prepare and commit phases.
      
      The reason it was triggered, was that the transaction consisted
      of an INSERT/UPDATE IGNORE that had an ignorable error. Since it
      had an error, no row log events were made and therefore
      prepared_xids was 0. However, since it was an IGNORE statement,
      the statement started a read/write statement transaction, committed
      it and completed successfully.
      
      This patch fixes the problem by adjusting the assert to take
      this possibility into account.
      
      Test case added to binlog.binlog_innodb_row.test.

    modified:
      mysql-test/suite/binlog/r/binlog_innodb_row.result
      mysql-test/suite/binlog/t/binlog_innodb_row.test
      sql/log.cc
=== modified file 'mysql-test/suite/binlog/r/binlog_innodb_row.result'
--- a/mysql-test/suite/binlog/r/binlog_innodb_row.result	2010-08-20 02:59:58 +0000
+++ b/mysql-test/suite/binlog/r/binlog_innodb_row.result	2011-04-19 13:07:05 +0000
@@ -59,3 +59,20 @@ show binlog events from <binlog_start>;
 Log_name	Pos	Event_type	Server_id	End_log_pos	Info
 master-bin.000001	#	Query	#	#	use `test`; DROP TEMPORARY TABLE IF EXISTS `t1` /* generated by server */
 ###############################################
+#
+# Bug#12346411 SQL/LOG.CC:6509: ASSERTION `PREPARED_XIDS > 0' FAILED
+#
+DROP TABLE IF EXISTS t1, t2;
+CREATE TABLE t1(a INT PRIMARY KEY) engine=innodb;
+CREATE TABLE t2(a INT) engine=myisam;
+INSERT INTO t1 VALUES (1);
+START TRANSACTION;
+INSERT INTO t2 VALUES (1);
+INSERT IGNORE INTO t1 VALUES (1);
+COMMIT;
+INSERT INTO t1 VALUES (2);
+START TRANSACTION;
+INSERT INTO t2 VALUES (2);
+UPDATE IGNORE t1 SET a=1 WHERE a=2;
+COMMIT;
+DROP TABLE t1, t2;

=== modified file 'mysql-test/suite/binlog/t/binlog_innodb_row.test'
--- a/mysql-test/suite/binlog/t/binlog_innodb_row.test	2010-03-09 23:41:21 +0000
+++ b/mysql-test/suite/binlog/t/binlog_innodb_row.test	2011-04-19 13:07:05 +0000
@@ -77,3 +77,29 @@ DROP TEMPORARY TABLE t1;
 -- echo ###############################################
 -- source include/show_binlog_events.inc
 -- echo ###############################################
+
+
+--echo #
+--echo # Bug#12346411 SQL/LOG.CC:6509: ASSERTION `PREPARED_XIDS > 0' FAILED
+--echo #
+
+--disable_warnings
+DROP TABLE IF EXISTS t1, t2;
+--enable_warnings
+
+CREATE TABLE t1(a INT PRIMARY KEY) engine=innodb;
+CREATE TABLE t2(a INT) engine=myisam;
+
+INSERT INTO t1 VALUES (1);
+START TRANSACTION;
+INSERT INTO t2 VALUES (1);
+INSERT IGNORE INTO t1 VALUES (1);
+COMMIT;
+
+INSERT INTO t1 VALUES (2);
+START TRANSACTION;
+INSERT INTO t2 VALUES (2);
+UPDATE IGNORE t1 SET a=1 WHERE a=2;
+COMMIT;
+
+DROP TABLE t1, t2;

=== modified file 'sql/log.cc'
--- a/sql/log.cc	2011-03-11 09:12:58 +0000
+++ b/sql/log.cc	2011-04-19 13:07:05 +0000
@@ -6506,8 +6506,11 @@ int TC_LOG_BINLOG::unlog(ulong cookie, m
 {
   DBUG_ENTER("TC_LOG_BINLOG::unlog");
   mysql_mutex_lock(&LOCK_prep_xids);
-  DBUG_ASSERT(prepared_xids > 0);
-  if (--prepared_xids == 0) {
+  // prepared_xids can be 0 if the transaction had ignorable errors.
+  DBUG_ASSERT(prepared_xids >= 0);
+  if (prepared_xids > 0)
+    prepared_xids--;
+  if (prepared_xids == 0) {
     DBUG_PRINT("info", ("prepared_xids=%lu", prepared_xids));
     mysql_cond_signal(&COND_prep_xids);
   }


Attachment: [text/bzr-bundle] bzr/jon.hauglid@oracle.com-20110419130705-nd9rfsqhzmvarhlp.bundle
Thread
bzr commit into mysql-5.5 branch (jon.hauglid:3456) Bug#12346411Jon Olav Hauglid19 Apr
  • Re: bzr commit into mysql-5.5 branch (jon.hauglid:3456) Bug#12346411Davi Arnaut11 May