diff --git a/mysql-test/extra/binlog_tests/binlog.test b/mysql-test/extra/binlog_tests/binlog.test index 57008b6af3c639f37ad5eb8d0f7a5b679ec55e25..0d2ed7ad509ed2bff8ace4801a90d16fd55b94de 100644 --- a/mysql-test/extra/binlog_tests/binlog.test +++ b/mysql-test/extra/binlog_tests/binlog.test @@ -80,72 +80,11 @@ drop table t1; --replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/ /Server ver: [^,]*,/Server version,/ show binlog events from 0; -set autocommit= 1; -reset master; -create table t1(n int) engine=innodb; -insert into t1 values (1); -insert into t1 values (2); -insert into t1 values (3); -commit; -drop table t1; ---replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/ /Server ver: [^,]*,/Server version,/ -show binlog events from 0; - -reset master; -create table t1(n int) engine=myisam; -begin; -insert into t1 values (4); -insert into t1 values (5); -insert into t1 values (6); -commit; -drop table t1; ---replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/ /Server ver: [^,]*,/Server version,/ -show binlog events from 0; - -# now show this also works for SHOW MASTER STATUS -# as this is what "mysqldump --master-data=1" uses. - -set autocommit= 1; -reset master; -create table t1(n int) engine=innodb; -show master status; -insert into t1 values (1); -show master status; -insert into t1 values (2); -insert into t1 values (3); -show master status; -commit; -show master status; -drop table t1; ---replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/ /Server ver: [^,]*,/Server version,/ -show binlog events from 0; - -set autocommit= 0; -reset master; -create table t1(n int) engine=myisam; -show master status; -insert into t1 values (4); -show master status; -insert into t1 values (5); -insert into t1 values (6); - -show master status; -commit; -show master status; -drop table t1; ---replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/ /Server ver: [^,]*,/Server version,/ -show binlog events from 0; - -set session autocommit = @ac; - # now show that nothing breaks if we need to read from the cache more # than once, resulting in split event-headers set @bcs = @@binlog_cache_size; -set @ac = @@autocommit; - set global binlog_cache_size=4096; -set autocommit= 0; reset master; create table t1 (a int) engine=innodb; diff --git a/mysql-test/suite/binlog/r/binlog_stm_binlog.result b/mysql-test/suite/binlog/r/binlog_stm_binlog.result index 238cafa6f68afae4ee9eff225cb197e899c80ef7..80908e6b450769f33781b52f42d8f990515aa911 100644 --- a/mysql-test/suite/binlog/r/binlog_stm_binlog.result +++ b/mysql-test/suite/binlog/r/binlog_stm_binlog.result @@ -165,105 +165,8 @@ master-bin.000001 361 Query 1 449 use `test`; insert into t1 values (2) master-bin.000001 449 Query 1 537 use `test`; insert into t1 values (3) master-bin.000001 537 Xid 1 564 COMMIT /* XID */ master-bin.000001 564 Query 1 640 use `test`; drop table t1 -set autocommit= 1; -reset master; -create table t1(n int) engine=innodb; -insert into t1 values (1); -insert into t1 values (2); -insert into t1 values (3); -commit; -drop table t1; -show binlog events from 0; -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 4 Format_desc 1 106 Server version, Binlog ver: 4 -master-bin.000001 106 Query 1 205 use `test`; create table t1(n int) engine=innodb -master-bin.000001 205 Query 1 293 use `test`; insert into t1 values (1) -master-bin.000001 293 Xid 1 320 COMMIT /* XID */ -master-bin.000001 320 Query 1 408 use `test`; insert into t1 values (2) -master-bin.000001 408 Xid 1 435 COMMIT /* XID */ -master-bin.000001 435 Query 1 523 use `test`; insert into t1 values (3) -master-bin.000001 523 Xid 1 550 COMMIT /* XID */ -master-bin.000001 550 Query 1 626 use `test`; drop table t1 -reset master; -create table t1(n int) engine=myisam; -begin; -insert into t1 values (4); -insert into t1 values (5); -insert into t1 values (6); -commit; -drop table t1; -show binlog events from 0; -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 4 Format_desc 1 106 Server version, Binlog ver: 4 -master-bin.000001 106 Query 1 205 use `test`; create table t1(n int) engine=myisam -master-bin.000001 205 Query 1 293 use `test`; insert into t1 values (4) -master-bin.000001 293 Query 1 381 use `test`; insert into t1 values (5) -master-bin.000001 381 Query 1 469 use `test`; insert into t1 values (6) -master-bin.000001 469 Query 1 545 use `test`; drop table t1 -set autocommit= 1; -reset master; -create table t1(n int) engine=innodb; -show master status; -File Position Binlog_Do_DB Binlog_Ignore_DB -master-bin.000001 205 -insert into t1 values (1); -show master status; -File Position Binlog_Do_DB Binlog_Ignore_DB -master-bin.000001 320 -insert into t1 values (2); -insert into t1 values (3); -show master status; -File Position Binlog_Do_DB Binlog_Ignore_DB -master-bin.000001 550 -commit; -show master status; -File Position Binlog_Do_DB Binlog_Ignore_DB -master-bin.000001 550 -drop table t1; -show binlog events from 0; -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 4 Format_desc 1 106 Server version, Binlog ver: 4 -master-bin.000001 106 Query 1 205 use `test`; create table t1(n int) engine=innodb -master-bin.000001 205 Query 1 293 use `test`; insert into t1 values (1) -master-bin.000001 293 Xid 1 320 COMMIT /* XID */ -master-bin.000001 320 Query 1 408 use `test`; insert into t1 values (2) -master-bin.000001 408 Xid 1 435 COMMIT /* XID */ -master-bin.000001 435 Query 1 523 use `test`; insert into t1 values (3) -master-bin.000001 523 Xid 1 550 COMMIT /* XID */ -master-bin.000001 550 Query 1 626 use `test`; drop table t1 -set autocommit= 0; -reset master; -create table t1(n int) engine=myisam; -show master status; -File Position Binlog_Do_DB Binlog_Ignore_DB -master-bin.000001 205 -insert into t1 values (4); -show master status; -File Position Binlog_Do_DB Binlog_Ignore_DB -master-bin.000001 293 -insert into t1 values (5); -insert into t1 values (6); -show master status; -File Position Binlog_Do_DB Binlog_Ignore_DB -master-bin.000001 469 -commit; -show master status; -File Position Binlog_Do_DB Binlog_Ignore_DB -master-bin.000001 469 -drop table t1; -show binlog events from 0; -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 4 Format_desc 1 106 Server version, Binlog ver: 4 -master-bin.000001 106 Query 1 205 use `test`; create table t1(n int) engine=myisam -master-bin.000001 205 Query 1 293 use `test`; insert into t1 values (4) -master-bin.000001 293 Query 1 381 use `test`; insert into t1 values (5) -master-bin.000001 381 Query 1 469 use `test`; insert into t1 values (6) -master-bin.000001 469 Query 1 545 use `test`; drop table t1 -set session autocommit = @ac; set @bcs = @@binlog_cache_size; -set @ac = @@autocommit; set global binlog_cache_size=4096; -set autocommit= 0; reset master; create table t1 (a int) engine=innodb; show binlog events from 0; diff --git a/sql/log.cc b/sql/log.cc index cd1acb35eceddb641363b16b5d49da7b810bc2a6..0bf77d68410f15dea8fb4fbc4fbf7f308be84ea5 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -3942,7 +3942,7 @@ int MYSQL_BIN_LOG::write_cache(IO_CACHE *cache, bool lock_log, bool sync_log) if (reinit_io_cache(cache, READ_CACHE, 0, 0, 0)) return ER_ERROR_ON_WRITE; - uint bytes= my_b_bytes_in_cache(cache), group, carry, hdr_offs; + uint length= my_b_bytes_in_cache(cache), group, carry, hdr_offs; long val; uchar header[LOG_EVENT_HEADER_LEN]; @@ -3999,7 +3999,7 @@ int MYSQL_BIN_LOG::write_cache(IO_CACHE *cache, bool lock_log, bool sync_log) /* if there is anything to write, process it. */ - if (likely(bytes > 0)) + if (likely(length > 0)) { /* process all event-headers in this (partial) cache. @@ -4008,18 +4008,18 @@ int MYSQL_BIN_LOG::write_cache(IO_CACHE *cache, bool lock_log, bool sync_log) very next iteration, just "eventually"). */ - while (hdr_offs < bytes) + while (hdr_offs < length) { /* partial header only? save what we can get, process once we get the rest. */ - if (hdr_offs + LOG_EVENT_HEADER_LEN > bytes) + if (hdr_offs + LOG_EVENT_HEADER_LEN > length) { - carry= bytes - hdr_offs; + carry= length - hdr_offs; memcpy(header, (char *)cache->read_pos + hdr_offs, carry); - bytes= hdr_offs; + length= hdr_offs; } else { @@ -4039,21 +4039,23 @@ int MYSQL_BIN_LOG::write_cache(IO_CACHE *cache, bool lock_log, bool sync_log) } /* - Adjust hdr_offs. Note that this doesn't mean it will necessarily - be valid in the next iteration; if the current event is very long, - it may take a couple of read-iterations (and subsequent fixings - of hdr_offs) for it to become valid again. - if we had a split header, hdr_offs was already fixed above. + Adjust hdr_offs. Note that it may still point beyond the segment + read in the next iteration; if the current event is very long, + it may take a couple of read-iterations (and subsequent adjustments + of hdr_offs) for it to point into the then-current segment. + If we have a split header (!carry), hdr_offs will be set at the + beginning of the next iteration, overwriting the value we set here: */ - if (carry == 0) - hdr_offs -= bytes; + hdr_offs -= length; } /* Write data to the binary log file */ - if (my_b_write(&log_file, cache->read_pos, bytes)) + if (my_b_write(&log_file, cache->read_pos, length)) return ER_ERROR_ON_WRITE; cache->read_pos=cache->read_end; // Mark buffer used up - } while ((bytes=my_b_fill(cache))); + } while ((length= my_b_fill(cache))); + + DBUG_ASSERT(carry == 0); if (sync_log) flush_and_sync();