List:Commits« Previous MessageNext Message »
From:Alfranio Correia Date:May 23 2009 8:07am
Subject:bzr commit into mysql-5.1-bugteam branch (alfranio.correia:2897)
Bug#43929
View as plain text  
#At file:///home/acorreia/workspace.sun/repository.mysql/bzrwork/bug-43929/mysql-5.1-bugteam/ based on revid:matthias.leich@stripped

 2897 Alfranio Correia	2009-05-23
      BUG#43929 binlog corruption when max_binlog_cache_size is exceeded
      
      Large transactions and statements may corrupt the binary log if the size of the
      cache, which is set by the max_binlog_cache_size, is not enough to store the
      the changes.
      
      In order to fix the problem, we save the position of the next character in the
      cache before writing to it. Thus if there is a problem, we simply restore this
      position.
      
      Unfortunately, to avoid corrupting the binary log, we may end up loosing changes
      on non-transactional tables if such changes do not fit in the remaining space in
      cache. There is nothing we can do to circumvent this limitation.

    added:
      mysql-test/suite/rpl/include/bug43929_binlog.sql
      mysql-test/suite/rpl/r/rpl_binlog_max_cache_size_row.result
      mysql-test/suite/rpl/t/rpl_binlog_max_cache_size_mix_stmt-master.opt
      mysql-test/suite/rpl/t/rpl_binlog_max_cache_size_mix_stmt.test
      mysql-test/suite/rpl/t/rpl_binlog_max_cache_size_row-master.opt
      mysql-test/suite/rpl/t/rpl_binlog_max_cache_size_row.test
    modified:
      sql/log.cc
      sql/sql_class.cc
      sql/sql_delete.cc
      sql/sql_insert.cc
      sql/sql_update.cc
=== added file 'mysql-test/suite/rpl/include/bug43929_binlog.sql'
--- a/mysql-test/suite/rpl/include/bug43929_binlog.sql	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl/include/bug43929_binlog.sql	2009-05-23 08:07:26 +0000
@@ -0,0 +1,36 @@
+let $data='vb
+alxxMCC5o X3dAkvHXY,WhFV72Z6;oNHpL,WfTAOYKMdb8OQ tUfYXjlNcois8V7hcnk5;.ixojWOcBpMGOVQl9,p3	v313eQ3j6mbGH7nh3sQeJn,
+G aEbB8 :YorJ1 wPzDerR8kLazeliXwxedpxhNUel0XpBO.KLdjNW MGlkaNSbtQVpfcmR wZPeyLWK0avXphFRd:5c4dCEMC XHsZvEZy Q1CrNIGTaJuKIkH5UEaDuacHzICkRugIn	nW1Z MHYV7w d ZYA:U;V4Kku99ioob4TQHlLlanD RH	vUq64phzC77pPIhf3PWxlB	dLhimAG ;l0UMCqxV2alAHV  iW,uIfp2,UH2	7Kf
+dJHeh4VmzxmAP6lG6ih2uIwfl;KwcLN	qGrF70W , :QxfiB	X7	dhEMEP: r3RllCaS.CTCCBaMQa;87vvEZnO6NmLsoEeoQx:zG6UTKvHRSyWcYC7bcWDF,jngS7QNZQwyoY H7ZC0ocebLf NpTy42NJ cupL	LYQ7Xg2X16h2T
+csX,sqT B	hRDsocDBBuu9j Iz9k EL1VuamulUc3zsFHI.dKWQRyCPTE0NEiy4eMNhBT4 L1Klqey YmWYuXZkrFUV89c:AONXIg
+ DsvgkPgNwZOTi; 9DGec F2XHLWH1yY R1Cjh	5PmE60jAl3B4SOz.coG:Oy.G boG 4;kZRTpIBda3eG3S6
+s2;	Y.a	vEV:MZKvOf6
+U3jkTX49wafxd;i:gJ
+sxTpvLa2B2jj 4cBG Bazi5  XpKqfTcBW0iUhKDlD6KamzWUk
+R9i
+n,STLTyG6DP:WH1fmw5:N wmQU3kpSJsGeXwxJ	.BnmaMdcfqqinSpryqgTBvQ	,B:feTao.xkF.:l tY	pW3u;D CbU
+8ahKp4rteHuaX
+, zXZ4kT 9DX;8Rwwi6JNaDWkSO6JHtjczuZat.NxW,UM0w2s5gCOgbx:jlfEeq4XDe1xsFHORNa 0RTT	ftMPj7eqP OkqUteCtOyfweMZ;LdvYwGFjM7xOfa9jSQv6Ypmhd;MIZ.rBb,p7Ce3aPDra8eoKy6YxLsqxPIzAO  pZPVTrmmj7Jyc.QVmF57gdRMv3X8kXcvTz TArOZ wZr4acAu8eJjr
+7Z;.Sy3p9nGivSprQjVR:X0,Af4iYk,WAoXRyT tu09b6c:v.Ci 7EMjstiR7,f	L653d hfswxvY;IB.gWXEVFn3EhhxoYCcL0fftXcf Ec3ZW9 A2hYMa;F9GWeCvshNZc2:Bwa5VzwaarfVpf
+HSA4iREIbgg		a,;61.
+
+5 rnGNC	CsaoRevNeDjhN80 wB.bS7oL ,ioctAQWi9gQS 6pV .pgLtnbPA:gEz:Mq:DkAtpulNoziTWitVAoMu;zwrKibXoQEHU0ji4CJ4GSUuzZ,yrmPe1Tx	2n8mJ15Aa7f
+abtu
+rgaf
+yWY2m8pM2Ps gmiMdJXiYQkU0Girlk;OhB;mdClF.dWhvl:NhkIUoWEO0b6b13pxB3XXa3V Kr3l.edsfoX950p:cmPPlNrOiAl.Oat934PC
+dM	hBgUUk:RCgi.uGTu.tG0Umia7	9.2u1L.yE6ToYn7sB;aF9mups.v3XJYJh3gkaOojNU7:;Q2OpiIrnee1VRn 6q DY9nFwe9zjZ8ciJ 	oUQLaEooVFhuner;ZFRO2
+lHu:w0Lu
+dajd2lZ3FBw
+j
+X
+aaUARW xmaccUvRc3b6V5nrVHnOTQFpWYCoqvat1dtNl8aY
+KEa6YzWL8,Le53mjfK
+FQp8r4RFOj7:xVSWr1GQbKKXiKd4C7tblGaSy8VU9w7Wkr6 SVKaJn6Nd1hWymraIH0K13bb3 K,0ersTE.hX2
+Z xS1lC98j,g9V:4kU1E ZR;Fhpa2Jfr3MY:Vsz
+T1c2aV8q5b4;NCEnu5;M5S.i9	tI1EIK;Lban	Z
+06nyfms94A7ukJ2h8utxZSa6PX52k81L1VR 6Z TXlVfLa;18bSy;LhHpOY,B3Z0 e5N0WXgVqh,1AV25CHLJ;yFtz;Pr011 Mqhya.phYDvzzJYrPY6;Znji
+cYC2kIv;FqS otKpKQ:hOThDkwU2AnGZs848aF6kH1rgyRJWGcihB
+kXhjBfb0zM2bL,Jmpb3K3GEIMNzc35V	THnO495KjefyL.Lvfmt  nk saDs qo;hHpOW,;12
+ZTXRWxxt
+qKIfVus3D:mvPd8wq4Vw0cItYLeta2E6MP78kdJlBPxGbtSRyPtG6MD4GNYIroTNohSWwiy5v0iXeFzeaDkdb:qfK9eICd LD	GStfa
+mOe,Uhs ul;Ziev3 mleNCPku8aDKovqPd,OX:JN	3,Sb 9WwS:gprHC	 n6E1';

=== added file 'mysql-test/suite/rpl/r/rpl_binlog_max_cache_size_row.result'
--- a/mysql-test/suite/rpl/r/rpl_binlog_max_cache_size_row.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl/r/rpl_binlog_max_cache_size_row.result	2009-05-23 08:07:26 +0000
@@ -0,0 +1,100 @@
+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 t1(a INT PRIMARY KEY, data VARCHAR(9000)) ENGINE=innodb;
+CREATE TABLE t2(a INT PRIMARY KEY, data VARCHAR(9000)) ENGINE=myisam;
+########################################################################################
+#                                     SINGLE STATEMENT
+########################################################################################
+Got one of the listed errors
+Level	Code	Message
+Warning	1265	Data truncated for column 'data' at row 1
+Error	1598	Binary logging not possible. Message: Error writing events
+ROLLBACK;
+SELECT a FROM t1;
+a
+SELECT a FROM t1;
+a
+########################################################################################
+#                                     BEGIN - BEGIN
+########################################################################################
+TRUNCATE TABLE t1;
+TRUNCATE TABLE t2;
+BEGIN;
+Got one of the listed errors
+Level	Code	Message
+Error	1598	Binary logging not possible. Message: Error writing events
+BEGIN;
+INSERT INTO t1(a, data) VALUES (5, 's');
+INSERT INTO t1(a, data) VALUES (6, 's');
+COMMIT;
+SELECT a FROM t1;
+a
+1
+2
+3
+4
+5
+6
+SELECT a FROM t2;
+a
+4
+SELECT a FROM t1;
+a
+1
+2
+3
+4
+5
+6
+SELECT a FROM t2;
+a
+4
+########################################################################################
+#                                     BEGIN - COMMIT
+########################################################################################
+TRUNCATE TABLE t1;
+TRUNCATE TABLE t2;
+BEGIN;
+Got one of the listed errors
+Level	Code	Message
+Error	1598	Binary logging not possible. Message: Error writing events
+COMMIT;
+SELECT a FROM t1;
+a
+1
+2
+3
+4
+SELECT a FROM t2;
+a
+4
+SELECT a FROM t1;
+a
+1
+2
+3
+4
+SELECT a FROM t2;
+a
+4
+########################################################################################
+#                                      BEGIN - ROLLBACK
+########################################################################################
+TRUNCATE TABLE t1;
+TRUNCATE TABLE t2;
+BEGIN;
+Got one of the listed errors
+Level	Code	Message
+Error	1598	Binary logging not possible. Message: Error writing events
+Warnings:
+Warning	1196	Some non-transactional changed tables couldn't be rolled back
+a
+a
+4
+a
+a
+4

=== added file 'mysql-test/suite/rpl/t/rpl_binlog_max_cache_size_mix_stmt-master.opt'
--- a/mysql-test/suite/rpl/t/rpl_binlog_max_cache_size_mix_stmt-master.opt	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl/t/rpl_binlog_max_cache_size_mix_stmt-master.opt	2009-05-23 08:07:26 +0000
@@ -0,0 +1 @@
+--max_binlog_cache_size=2024

=== added file 'mysql-test/suite/rpl/t/rpl_binlog_max_cache_size_mix_stmt.test'
--- a/mysql-test/suite/rpl/t/rpl_binlog_max_cache_size_mix_stmt.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl/t/rpl_binlog_max_cache_size_mix_stmt.test	2009-05-23 08:07:26 +0000
@@ -0,0 +1,189 @@
+########################################################################################
+#    This test verifies if the binlog is not corrupted when the cache buffer is not
+#    big enough to accomodate the updates.
+########################################################################################
+
+########################################################################################
+#                                Configuring the environment
+########################################################################################
+-- source include/have_innodb.inc
+--source include/master-slave.inc
+--source include/have_binlog_format_mixed_or_statement.inc
+
+CREATE TABLE t1(a INT PRIMARY KEY, data VARCHAR(9000)) ENGINE=innodb;
+CREATE TABLE t2(a INT PRIMARY KEY, data VARCHAR(9000)) ENGINE=myisam;
+
+--source suite/rpl/include/bug43929_binlog.sql
+
+--echo ########################################################################################
+--echo #                                     SINGLE STATEMENT
+--echo ########################################################################################
+
+--disable_query_log
+--error ER_TRANS_CACHE_FULL, ER_BINLOG_LOGGING_IMPOSSIBLE
+eval INSERT INTO t1 (a, data) VALUES (1, 
+     CONCAT($data, $data, $data, $data, $data,
+            $data, $data, $data, $data, $data,
+            $data, $data, $data, $data, $data,
+            $data, $data, $data, $data, $data,
+            $data));
+SHOW WARNINGS;
+--eval INSERT INTO t2 (a, data) VALUES (1, $data);
+--disable_query_log
+ROLLBACK;
+
+sync_slave_with_master;
+connection master;
+SELECT a FROM t1;
+SELECT a FROM t2;
+connection slave;
+SELECT a FROM t1;
+SELECT a FROM t2;
+
+--echo ########################################################################################
+--echo #                                     BEGIN - BEGIN
+--echo ########################################################################################
+
+connection master;
+TRUNCATE TABLE t1;
+TRUNCATE TABLE t2;
+
+BEGIN;
+--disable_query_log
+--eval INSERT INTO t1 (a, data) VALUES (1, $data);
+--eval INSERT INTO t1 (a, data) VALUES (2, $data);
+--eval INSERT INTO t1 (a, data) VALUES (3, $data);
+--eval INSERT INTO t1 (a, data) VALUES (4, $data);
+--eval INSERT INTO t1 (a, data) VALUES (5, $data);
+--eval INSERT INTO t1 (a, data) VALUES (6, $data);
+--eval INSERT INTO t1 (a, data) VALUES (7, $data);
+--eval INSERT INTO t1 (a, data) VALUES (8, $data);
+--eval INSERT INTO t1 (a, data) VALUES (10, $data);
+--eval INSERT INTO t1 (a, data) VALUES (11, $data);
+--eval INSERT INTO t1 (a, data) VALUES (12, $data);
+--eval INSERT INTO t1 (a, data) VALUES (13, $data);
+--eval INSERT INTO t1 (a, data) VALUES (14, $data);
+--error ER_TRANS_CACHE_FULL, ER_BINLOG_LOGGING_IMPOSSIBLE
+--eval INSERT INTO t1 (a, data) VALUES (15, $data);
+SHOW WARNINGS;
+--error ER_TRANS_CACHE_FULL, ER_BINLOG_LOGGING_IMPOSSIBLE
+--eval INSERT INTO t1 (a, data) VALUES (15, $data);
+SHOW WARNINGS;
+--error ER_TRANS_CACHE_FULL, ER_BINLOG_LOGGING_IMPOSSIBLE
+--eval INSERT INTO t2 (a, data) VALUES (15, $data);
+SHOW WARNINGS;
+--eval INSERT INTO t1 (a, data) VALUES (16, 's');
+--eval INSERT INTO t2 (a, data) VALUES (16, "s");
+--enable_query_log
+
+BEGIN;
+INSERT INTO t1(a, data) VALUES (17, 's');
+INSERT INTO t1(a, data) VALUES (18, 's');
+COMMIT;
+
+sync_slave_with_master;
+connection master;
+SELECT a FROM t1;
+SELECT a FROM t2;
+connection slave;
+SELECT a FROM t1;
+SELECT a FROM t2;
+
+--echo ########################################################################################
+--echo #                                     BEGIN - COMMIT
+--echo ########################################################################################
+
+connection master;
+TRUNCATE TABLE t1;
+TRUNCATE TABLE t2;
+
+--disable_query_log
+BEGIN;
+--eval INSERT INTO t1 (a, data) VALUES (1, $data);
+--eval INSERT INTO t1 (a, data) VALUES (2, $data);
+--eval INSERT INTO t1 (a, data) VALUES (3, $data);
+--eval INSERT INTO t1 (a, data) VALUES (4, $data);
+--eval INSERT INTO t1 (a, data) VALUES (5, $data);
+--eval INSERT INTO t1 (a, data) VALUES (6, $data);
+--eval INSERT INTO t1 (a, data) VALUES (7, $data);
+--eval INSERT INTO t1 (a, data) VALUES (8, $data);
+--eval INSERT INTO t1 (a, data) VALUES (10, $data);
+--eval INSERT INTO t1 (a, data) VALUES (11, $data);
+--eval INSERT INTO t1 (a, data) VALUES (12, $data);
+--eval INSERT INTO t1 (a, data) VALUES (13, $data);
+--eval INSERT INTO t1 (a, data) VALUES (14, $data);
+--error ER_TRANS_CACHE_FULL, ER_BINLOG_LOGGING_IMPOSSIBLE
+--eval INSERT INTO t1 (a, data) VALUES (15, $data);
+SHOW WARNINGS;
+--error ER_TRANS_CACHE_FULL, ER_BINLOG_LOGGING_IMPOSSIBLE
+--eval INSERT INTO t1 (a, data) VALUES (15, $data);
+SHOW WARNINGS;
+--error ER_TRANS_CACHE_FULL, ER_BINLOG_LOGGING_IMPOSSIBLE
+--eval INSERT INTO t2 (a, data) VALUES (15, $data);
+SHOW WARNINGS;
+--eval INSERT INTO t1 (a, data) VALUES (16, 's');
+--eval INSERT INTO t2 (a, data) VALUES (16, 's');
+--enable_query_log
+COMMIT;
+
+sync_slave_with_master;
+connection master;
+SELECT a FROM t1;
+SELECT a FROM t2;
+connection slave;
+SELECT a FROM t1;
+SELECT a FROM t2;
+
+--echo ########################################################################################
+--echo #                                      BEGIN - ROLLBACK
+--echo ########################################################################################
+
+connection master;
+TRUNCATE TABLE t1;
+TRUNCATE TABLE t2;
+
+--disable_query_log
+BEGIN;
+--eval INSERT INTO t1 (a, data) VALUES (1, $data);
+--eval INSERT INTO t1 (a, data) VALUES (2, $data);
+--eval INSERT INTO t1 (a, data) VALUES (3, $data);
+--eval INSERT INTO t1 (a, data) VALUES (4, $data);
+--eval INSERT INTO t1 (a, data) VALUES (5, $data);
+--eval INSERT INTO t1 (a, data) VALUES (6, $data);
+--eval INSERT INTO t1 (a, data) VALUES (7, $data);
+--eval INSERT INTO t1 (a, data) VALUES (8, $data);
+--eval INSERT INTO t1 (a, data) VALUES (10, $data);
+--eval INSERT INTO t1 (a, data) VALUES (11, $data);
+--eval INSERT INTO t1 (a, data) VALUES (12, $data);
+--eval INSERT INTO t1 (a, data) VALUES (13, $data);
+--eval INSERT INTO t1 (a, data) VALUES (14, $data);
+--error ER_TRANS_CACHE_FULL, ER_BINLOG_LOGGING_IMPOSSIBLE
+--eval INSERT INTO t1 (a, data) VALUES (15, $data);
+SHOW WARNINGS;
+--error ER_TRANS_CACHE_FULL, ER_BINLOG_LOGGING_IMPOSSIBLE
+--eval INSERT INTO t1 (a, data) VALUES (15, $data);
+SHOW WARNINGS;
+--error ER_TRANS_CACHE_FULL, ER_BINLOG_LOGGING_IMPOSSIBLE
+--eval INSERT INTO t1 (a, data) VALUES (15, $data);
+SHOW WARNINGS;
+--eval INSERT INTO t1 (a, data) VALUES (16, 's');
+--eval INSERT INTO t2 (a, data) VALUES (16, 's');
+--enable_query_log
+ROLLBACK;
+
+sync_slave_with_master;
+connection master;
+SELECT a FROM t1;
+SELECT a FROM t2;
+connection slave;
+SELECT a FROM t1;
+SELECT a FROM t2;
+
+--echo ########################################################################################
+--echo #                                        CLEAN
+--echo ########################################################################################
+
+connection master;
+DROP TABLE t1;
+DROP TABLE t2;
+sync_slave_with_master;

=== added file 'mysql-test/suite/rpl/t/rpl_binlog_max_cache_size_row-master.opt'
--- a/mysql-test/suite/rpl/t/rpl_binlog_max_cache_size_row-master.opt	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl/t/rpl_binlog_max_cache_size_row-master.opt	2009-05-23 08:07:26 +0000
@@ -0,0 +1 @@
+--max_binlog_cache_size=2024 --binlog_cache_size=2024

=== added file 'mysql-test/suite/rpl/t/rpl_binlog_max_cache_size_row.test'
--- a/mysql-test/suite/rpl/t/rpl_binlog_max_cache_size_row.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl/t/rpl_binlog_max_cache_size_row.test	2009-05-23 08:07:26 +0000
@@ -0,0 +1,130 @@
+########################################################################################
+#    This test verifies if the binlog is not corrupted when the cache buffer is not
+#    big enough to accomodate the updates.
+#    loss was circumvented by the recovery process.
+########################################################################################
+
+########################################################################################
+#                                Configuring the environment
+########################################################################################
+-- source include/have_innodb.inc
+--source include/master-slave.inc
+--source include/have_binlog_format_row.inc
+
+CREATE TABLE t1(a INT PRIMARY KEY, data VARCHAR(9000)) ENGINE=innodb;
+CREATE TABLE t2(a INT PRIMARY KEY, data VARCHAR(9000)) ENGINE=myisam;
+
+--source suite/rpl/include/bug43929_binlog.sql
+
+--echo ########################################################################################
+--echo #                                     SINGLE STATEMENT
+--echo ########################################################################################
+--disable_query_log
+--error ER_TRANS_CACHE_FULL, ER_BINLOG_LOGGING_IMPOSSIBLE
+--eval INSERT INTO t1 (a, data) VALUES (1, CONCAT($data, $data, $data, $data));
+SHOW WARNINGS;
+--eval INSERT INTO t2 (a, data) VALUES (1, $data);
+--enable_query_log
+ROLLBACK;
+
+sync_slave_with_master;
+connection master;
+SELECT a FROM t1;
+connection slave;
+SELECT a FROM t1;
+
+--echo ########################################################################################
+--echo #                                     BEGIN - BEGIN
+--echo ########################################################################################
+connection master;
+TRUNCATE TABLE t1;
+TRUNCATE TABLE t2;
+
+BEGIN;
+--disable_query_log
+--eval INSERT INTO t1 (a, data) VALUES (1, $data);
+--eval INSERT INTO t1 (a, data) VALUES (2, $data);
+--eval INSERT INTO t1 (a, data) VALUES (3, $data);
+--error ER_TRANS_CACHE_FULL, ER_BINLOG_LOGGING_IMPOSSIBLE
+--eval INSERT INTO t1 (a, data) VALUES (4, $data);
+SHOW WARNINGS;
+--eval INSERT INTO t1 (a, data) VALUES (4, 's');
+--eval INSERT INTO t2 (a, data) VALUES (4, 's');
+--enable_query_log
+
+BEGIN;
+INSERT INTO t1(a, data) VALUES (5, 's');
+INSERT INTO t1(a, data) VALUES (6, 's');
+COMMIT;
+
+sync_slave_with_master;
+connection master;
+SELECT a FROM t1;
+SELECT a FROM t2;
+connection slave;
+SELECT a FROM t1;
+SELECT a FROM t2;
+
+--echo ########################################################################################
+--echo #                                     BEGIN - COMMIT
+--echo ########################################################################################
+
+connection master;
+TRUNCATE TABLE t1;
+TRUNCATE TABLE t2;
+
+BEGIN;
+--disable_query_log
+--eval INSERT INTO t1 (a, data) VALUES (1, $data);
+--eval INSERT INTO t1 (a, data) VALUES (2, $data);
+--eval INSERT INTO t1 (a, data) VALUES (3, $data);
+--error ER_TRANS_CACHE_FULL, ER_BINLOG_LOGGING_IMPOSSIBLE
+--eval INSERT INTO t1 (a, data) VALUES (4, $data);
+SHOW WARNINGS;
+--eval INSERT INTO t1 (a, data) VALUES (4, 's');
+--eval INSERT INTO t2 (a, data) VALUES (4, 's');
+--enable_query_log
+COMMIT;
+
+sync_slave_with_master;
+connection master;
+SELECT a FROM t1;
+SELECT a FROM t2;
+connection slave;
+SELECT a FROM t1;
+SELECT a FROM t2;
+
+--echo ########################################################################################
+--echo #                                      BEGIN - ROLLBACK
+--echo ########################################################################################
+
+connection master;
+TRUNCATE TABLE t1;
+TRUNCATE TABLE t2;
+
+BEGIN;
+--disable_query_log
+--eval INSERT INTO t1 (a, data) VALUES (1, $data);
+--eval INSERT INTO t1 (a, data) VALUES (2, $data);
+--eval INSERT INTO t1 (a, data) VALUES (3, $data);
+--error ER_TRANS_CACHE_FULL, ER_BINLOG_LOGGING_IMPOSSIBLE
+--eval INSERT INTO t1 (a, data) VALUES (4, $data);
+SHOW WARNINGS;
+--eval INSERT INTO t1 (a, data) VALUES (4, 's');
+--eval INSERT INTO t2 (a, data) VALUES (4, 's');
+ROLLBACK;
+
+sync_slave_with_master;
+connection master;
+SELECT a FROM t1;
+SELECT a FROM t2;
+connection slave;
+SELECT a FROM t1;
+SELECT a FROM t2;
+
+############## CLEAN
+
+connection master;
+DROP TABLE t1;
+DROP TABLE t2;
+sync_slave_with_master;

=== modified file 'sql/log.cc'
--- a/sql/log.cc	2009-04-09 15:25:25 +0000
+++ b/sql/log.cc	2009-05-23 08:07:26 +0000
@@ -210,6 +210,29 @@ public:
     DBUG_ASSERT(empty());
   }
 
+  void save_cache_pos(my_off_t *saved)
+  {
+    DBUG_ENTER("save_cache_pos");
+    *saved= my_b_safe_tell(&trans_log);
+    DBUG_VOID_RETURN;
+  }
+
+  void restore_cache_pos(my_off_t *saved)
+  {
+    my_off_t diff= my_b_tell(&trans_log) - *saved;
+    DBUG_ENTER("restore_cache_pos");
+
+    if (diff  > 0)
+    {
+      DBUG_PRINT("info",("Before restoring saved position(%d) write position(%d)",
+                         (int) *saved, (int) my_b_tell(&trans_log)));
+      my_b_seek(&trans_log, *saved);
+      DBUG_PRINT("info",("After restoring saved position(%d) write position(%d)",
+                         (int) *saved, (int) my_b_tell(&trans_log)));
+    }
+    DBUG_VOID_RETURN;
+  }
+
   Rows_log_event *pending() const
   {
     return m_pending;
@@ -3901,6 +3924,8 @@ bool MYSQL_BIN_LOG::write(Log_event *eve
   THD *thd= event_info->thd;
   bool error= 1;
   DBUG_ENTER("MYSQL_BIN_LOG::write(Log_event *)");
+  binlog_trx_data *trx_data;
+  my_off_t saved_cache_pos= 0;
 
   if (thd->binlog_evt_union.do_union)
   {
@@ -3967,8 +3992,9 @@ bool MYSQL_BIN_LOG::write(Log_event *eve
       if (thd->binlog_setup_trx_data())
         goto err;
 
-      binlog_trx_data *const trx_data=
+      trx_data=
         (binlog_trx_data*) thd_get_ha_data(thd, binlog_hton);
+      trx_data->save_cache_pos(&saved_cache_pos);
       IO_CACHE *trans_log= &trx_data->trans_log;
       my_off_t trans_log_pos= my_b_tell(trans_log);
       if (event_info->get_cache_stmt() || trans_log_pos != 0)
@@ -4071,10 +4097,11 @@ err:
     if (error)
     {
       if (my_errno == EFBIG)
-	my_message(ER_TRANS_CACHE_FULL, ER(ER_TRANS_CACHE_FULL), MYF(0));
+        my_message(ER_TRANS_CACHE_FULL, ER(ER_TRANS_CACHE_FULL), MYF(MY_WME));
       else
 	my_error(ER_ERROR_ON_WRITE, MYF(0), name, errno);
-      write_error=1;
+      write_error= 1;
+      trx_data->restore_cache_pos(&saved_cache_pos);
     }
   }
 

=== modified file 'sql/sql_class.cc'
--- a/sql/sql_class.cc	2009-05-15 13:25:29 +0000
+++ b/sql/sql_class.cc	2009-05-23 08:07:26 +0000
@@ -3667,7 +3667,11 @@ int THD::binlog_query(THD::enum_binlog_q
   */
   if (this->prelocked_mode == NON_PRELOCKED)
     if (int error= binlog_flush_pending_rows_event(TRUE))
+    {
+      my_error(ER_BINLOG_LOGGING_IMPOSSIBLE, MYF(MY_WME), 
+               "Error writing events");
       DBUG_RETURN(error);
+    }
 
   /*
     If we are in statement mode and trying to log an unsafe statement,

=== modified file 'sql/sql_delete.cc'
--- a/sql/sql_delete.cc	2009-05-15 13:25:29 +0000
+++ b/sql/sql_delete.cc	2009-05-23 08:07:26 +0000
@@ -404,7 +404,7 @@ cleanup:
                                         thd->query, thd->query_length,
                                         is_trans, FALSE, killed_status);
 
-      if (log_result && transactional_table)
+      if (log_result)
       {
 	error=1;
       }

=== modified file 'sql/sql_insert.cc'
--- a/sql/sql_insert.cc	2009-05-15 12:57:51 +0000
+++ b/sql/sql_insert.cc	2009-05-23 08:07:26 +0000
@@ -893,8 +893,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *t
 	if (thd->binlog_query(THD::ROW_QUERY_TYPE,
 			      thd->query, thd->query_length,
 			      transactional_table, FALSE,
-			      (error>0) ? thd->killed : THD::NOT_KILLED) &&
-	    transactional_table)
+			      (error>0) ? thd->killed : THD::NOT_KILLED))
         {
 	  error=1;
 	}

=== modified file 'sql/sql_update.cc'
--- a/sql/sql_update.cc	2009-05-15 13:03:22 +0000
+++ b/sql/sql_update.cc	2009-05-23 08:07:26 +0000
@@ -799,8 +799,7 @@ int mysql_update(THD *thd,
         thd->clear_error();
       if (thd->binlog_query(THD::ROW_QUERY_TYPE,
                             thd->query, thd->query_length,
-                            transactional_table, FALSE, killed_status) &&
-          transactional_table)
+                            transactional_table, FALSE, killed_status))
       {
         error=1;				// Rollback update
       }
@@ -2079,8 +2078,7 @@ bool multi_update::send_eof()
         thd->clear_error();
       if (thd->binlog_query(THD::ROW_QUERY_TYPE,
                             thd->query, thd->query_length,
-                            transactional_tables, FALSE, killed_status) &&
-          trans_safe)
+                            transactional_tables, FALSE, killed_status))
       {
 	local_error= 1;				// Rollback update
       }


Attachment: [text/bzr-bundle]
Thread
bzr commit into mysql-5.1-bugteam branch (alfranio.correia:2897)Bug#43929Alfranio Correia23 May