Commit 9297872d authored by unknown's avatar unknown
Browse files

auto-ROLLBACK if binlog was not closed properly

auto-commit on Xid_log_event


client/mysqlbinlog.cc:
  auto-ROLLBACK if binlog was not closed properly.
mysql-test/r/ctype_ucs.result:
  results updated
mysql-test/r/mix_innodb_myisam_binlog.result:
  results updated
mysql-test/r/mysqlbinlog2.result:
  results updated
mysql-test/r/rpl_relayrotate.result:
  results updated
mysql-test/r/user_var.result:
  results updated
mysql-test/t/ctype_ucs.test:
  finalize binlog before calling mysqlbinlog
mysql-test/t/user_var.test:
  finalize binlog before calling mysqlbinlog
sql/log_event.cc:
  commit at Xid_log_event
  comments edited
sql/mysqld.cc:
  free(0) fixed
sql/slave.cc:
  rollback at fake Rotate_log_event
sql/sql_class.h:
  no commit_or_rollback argument for binlog->write(THD *thd, IO_CACHE *cache)
sql/log.cc:
  don't write "COMMIT" query, Xid_log_event is enough
sql/log_event.h:
  more comments for LOG_EVENT_BINLOG_IN_USE_F
  LOG_EVENT_FORCE_ROLLBACK_F added
sql/sql_repl.cc:
  rollback at Rotate_log_event.
  don't consider binlog corrupted if it was open when we read Formar_description but closed when we got to the end
sql/sql_repl.h:
  style fix
parent be255d65
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -1157,7 +1157,14 @@ static int dump_local_log_entries(const char* logname)
    Log_event* ev = Log_event::read_log_event(file, description_event);
    if (!ev)
    {
      if (file->error)
      /*
        if binlog wasn't closed properly ("in use" flag is set) don't complain
        about a corruption, but issue a "ROLLBACK" to annihilate half-logged
        transaction. Otherwise, treat it as EOF and move to the next binlog.
      */
      if (description_event->flags & LOG_EVENT_BINLOG_IN_USE_F)
        fprintf(result_file, "ROLLBACK;\n");
      else if (file->error)
      {
        fprintf(stderr,
                "Could not read entry at offset %s:"
+1 −0
Original line number Diff line number Diff line
@@ -527,6 +527,7 @@ show binlog events from 96;
Log_name	Pos	Event_type	Server_id	End_log_pos	Info
master-bin.000001	96	User var	1	136	@`v`=_ucs2 0x006100620063 COLLATE ucs2_general_ci
master-bin.000001	136	Query	1	219	use `test`; insert into t2 values (@v)
flush logs;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
SET @`v`:=_ucs2 0x006100620063 COLLATE ucs2_general_ci;
use test;
+15 −25
Original line number Diff line number Diff line
@@ -11,8 +11,7 @@ Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001	96	Query	1	#	use `test`; BEGIN
master-bin.000001	158	Query	1	#	use `test`; insert into t1 values(1)
master-bin.000001	239	Query	1	#	use `test`; insert into t2 select * from t1
master-bin.000001	327	Xid	1	#	xid=7
master-bin.000001	354	Query	1	#	use `test`; COMMIT
master-bin.000001	327	Xid	1	#	COMMIT /* xid=7 */
delete from t1;
delete from t2;
reset master;
@@ -48,8 +47,7 @@ master-bin.000001 239 Query 1 # use `test`; savepoint my_savepoint
master-bin.000001	318	Query	1	#	use `test`; insert into t1 values(4)
master-bin.000001	399	Query	1	#	use `test`; insert into t2 select * from t1
master-bin.000001	487	Query	1	#	use `test`; rollback to savepoint my_savepoint
master-bin.000001	578	Xid	1	#	xid=24
master-bin.000001	605	Query	1	#	use `test`; COMMIT
master-bin.000001	578	Xid	1	#	COMMIT /* xid=24 */
delete from t1;
delete from t2;
reset master;
@@ -76,8 +74,7 @@ master-bin.000001 318 Query 1 # use `test`; insert into t1 values(6)
master-bin.000001	399	Query	1	#	use `test`; insert into t2 select * from t1
master-bin.000001	487	Query	1	#	use `test`; rollback to savepoint my_savepoint
master-bin.000001	578	Query	1	#	use `test`; insert into t1 values(7)
master-bin.000001	659	Xid	1	#	xid=36
master-bin.000001	686	Query	1	#	use `test`; COMMIT
master-bin.000001	659	Xid	1	#	COMMIT /* xid=36 */
delete from t1;
delete from t2;
reset master;
@@ -106,9 +103,8 @@ show binlog events from 96;
Log_name	Pos	Event_type	Server_id	End_log_pos	Info
master-bin.000001	96	Query	1	#	use `test`; BEGIN
master-bin.000001	158	Query	1	#	use `test`; insert into t1 values(9)
master-bin.000001	239	Xid	1	#	xid=59
master-bin.000001	266	Query	1	#	use `test`; COMMIT
master-bin.000001	329	Query	1	#	use `test`; insert into t2 select * from t1
master-bin.000001	239	Xid	1	#	COMMIT /* xid=59 */
master-bin.000001	266	Query	1	#	use `test`; insert into t2 select * from t1
delete from t1;
delete from t2;
reset master;
@@ -119,22 +115,19 @@ show binlog events from 96;
Log_name	Pos	Event_type	Server_id	End_log_pos	Info
master-bin.000001	96	Query	1	#	use `test`; BEGIN
master-bin.000001	158	Query	1	#	use `test`; insert into t1 values(10)
master-bin.000001	240	Xid	1	#	xid=65
master-bin.000001	267	Query	1	#	use `test`; COMMIT
master-bin.000001	330	Query	1	#	use `test`; insert into t2 select * from t1
master-bin.000001	240	Xid	1	#	COMMIT /* xid=65 */
master-bin.000001	267	Query	1	#	use `test`; insert into t2 select * from t1
insert into t1 values(11);
commit;
show binlog events from 96;
Log_name	Pos	Event_type	Server_id	End_log_pos	Info
master-bin.000001	96	Query	1	#	use `test`; BEGIN
master-bin.000001	158	Query	1	#	use `test`; insert into t1 values(10)
master-bin.000001	240	Xid	1	#	xid=65
master-bin.000001	267	Query	1	#	use `test`; COMMIT
master-bin.000001	330	Query	1	#	use `test`; insert into t2 select * from t1
master-bin.000001	418	Query	1	#	use `test`; BEGIN
master-bin.000001	480	Query	1	#	use `test`; insert into t1 values(11)
master-bin.000001	562	Xid	1	#	xid=67
master-bin.000001	589	Query	1	#	use `test`; COMMIT
master-bin.000001	240	Xid	1	#	COMMIT /* xid=65 */
master-bin.000001	267	Query	1	#	use `test`; insert into t2 select * from t1
master-bin.000001	355	Query	1	#	use `test`; BEGIN
master-bin.000001	417	Query	1	#	use `test`; insert into t1 values(11)
master-bin.000001	499	Xid	1	#	COMMIT /* xid=67 */
alter table t2 engine=INNODB;
delete from t1;
delete from t2;
@@ -148,8 +141,7 @@ Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001	96	Query	1	#	use `test`; BEGIN
master-bin.000001	158	Query	1	#	use `test`; insert into t1 values(12)
master-bin.000001	240	Query	1	#	use `test`; insert into t2 select * from t1
master-bin.000001	328	Xid	1	#	xid=77
master-bin.000001	355	Query	1	#	use `test`; COMMIT
master-bin.000001	328	Xid	1	#	COMMIT /* xid=77 */
delete from t1;
delete from t2;
reset master;
@@ -173,8 +165,7 @@ show binlog events from 96;
Log_name	Pos	Event_type	Server_id	End_log_pos	Info
master-bin.000001	96	Query	1	#	use `test`; BEGIN
master-bin.000001	158	Query	1	#	use `test`; insert into t1 values(14)
master-bin.000001	240	Xid	1	#	xid=93
master-bin.000001	267	Query	1	#	use `test`; COMMIT
master-bin.000001	240	Xid	1	#	COMMIT /* xid=93 */
delete from t1;
delete from t2;
reset master;
@@ -195,8 +186,7 @@ Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001	96	Query	1	#	use `test`; BEGIN
master-bin.000001	158	Query	1	#	use `test`; insert into t1 values(16)
master-bin.000001	240	Query	1	#	use `test`; insert into t1 values(18)
master-bin.000001	322	Xid	1	#	xid=104
master-bin.000001	349	Query	1	#	use `test`; COMMIT
master-bin.000001	322	Xid	1	#	COMMIT /* xid=104 */
delete from t1;
delete from t2;
alter table t2 type=MyISAM;
+4 −0
Original line number Diff line number Diff line
@@ -144,6 +144,7 @@ SET TIMESTAMP=1579609943;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1;
SET @@session.sql_mode=0;
insert into t1 values(null, "f");
ROLLBACK;

--- offset --
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
@@ -171,6 +172,7 @@ SET TIMESTAMP=1579609943;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1;
SET @@session.sql_mode=0;
insert into t1 values(null, "f");
ROLLBACK;

--- start-position --
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
@@ -188,6 +190,7 @@ SET TIMESTAMP=1579609943;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1;
SET @@session.sql_mode=0;
insert into t1 values(null, "f");
ROLLBACK;

--- stop-position --
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
@@ -233,6 +236,7 @@ SET TIMESTAMP=1579609943;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1;
SET @@session.sql_mode=0;
insert into t1 values(null, "f");
ROLLBACK;

--- stop-datetime --
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
+1 −1
Original line number Diff line number Diff line
@@ -18,5 +18,5 @@ max(a)
8000
show slave status;
Slave_IO_State	Master_Host	Master_User	Master_Port	Connect_Retry	Master_Log_File	Read_Master_Log_Pos	Relay_Log_File	Relay_Log_Pos	Relay_Master_Log_File	Slave_IO_Running	Slave_SQL_Running	Replicate_Do_DB	Replicate_Ignore_DB	Replicate_Do_Table	Replicate_Ignore_Table	Replicate_Wild_Do_Table	Replicate_Wild_Ignore_Table	Last_Errno	Last_Error	Skip_Counter	Exec_Master_Log_Pos	Relay_Log_Space	Until_Condition	Until_Log_File	Until_Log_Pos	Master_SSL_Allowed	Master_SSL_CA_File	Master_SSL_CA_Path	Master_SSL_Cert	Master_SSL_Cipher	Master_SSL_Key	Seconds_Behind_Master
#	127.0.0.1	root	MASTER_MYPORT	1	master-bin.000001	687235	#	#	master-bin.000001	Yes	Yes							0		0	687235	#	None		0	No						#
#	127.0.0.1	root	MASTER_MYPORT	1	master-bin.000001	687172	#	#	master-bin.000001	Yes	Yes							0		0	687172	#	None		0	No						#
drop table t1;
Loading