#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#43929 | Alfranio Correia | 23 May |