Commit 3004c8de authored by unknown's avatar unknown
Browse files

fix for BUG#7947 - failure to log DO RELEASE_LOCK() if we disconnect in the middle of

transaction while holding the lock. Also test to make sure other binlogging issues
reported in the bug have been addressed.


sql/item_func.cc:
  fix for BUG#7947
mysql-test/r/rpl_bug7947.result:
  New BitKeeper file ``mysql-test/r/rpl_bug7947.result''
mysql-test/t/rpl_bug7947.test:
  New BitKeeper file ``mysql-test/t/rpl_bug7947.test''
parent 3a5a518d
Loading
Loading
Loading
Loading
+48 −0
Original line number Diff line number Diff line
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;
begin;
create temporary table ti (a int) engine=innodb;
rollback;
Warnings:
Warning	1196	Some non-transactional changed tables couldn't be rolled back
insert into ti values(1);
set autocommit=0;
create temporary table t1 (a int) type=myisam;
Warnings:
Warning	1287	'TYPE=storage_engine' is deprecated; use 'ENGINE=storage_engine' instead
commit;
insert t1 values (1);
rollback;
create table t0 (n int);
insert t0 select * from t1;
set autocommit=1;
insert into t0 select GET_LOCK("lock1",null);
set autocommit=0;
create table t2 (n int) engine=innodb;
insert into t2 values (3);
select get_lock("lock1",null);
get_lock("lock1",null)
1
show binlog events from 79;
Log_name	Pos	Event_type	Server_id	Orig_log_pos	Info
master-bin.000001	79	Query	1	79	use `test`; BEGIN
master-bin.000001	119	Query	1	79	use `test`; create temporary table ti (a int) engine=innodb
master-bin.000001	201	Query	1	201	use `test`; ROLLBACK
master-bin.000001	244	Query	1	244	use `test`; insert into ti values(1)
master-bin.000001	303	Query	1	303	use `test`; BEGIN
master-bin.000001	343	Query	1	303	use `test`; create temporary table t1 (a int) type=myisam
master-bin.000001	423	Query	1	423	use `test`; COMMIT
master-bin.000001	464	Query	1	464	use `test`; create table t0 (n int)
master-bin.000001	522	Query	1	522	use `test`; insert t0 select * from t1
master-bin.000001	583	Query	1	583	use `test`; insert into t0 select GET_LOCK("lock1",null)
master-bin.000001	662	Query	1	662	use `test`; create table t2 (n int) engine=innodb
master-bin.000001	734	Query	1	734	use `test`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `test`.`t1`,`test`.`ti`
master-bin.000001	835	Query	1	835	use `test`; DO RELEASE_LOCK("lock1")
select release_lock("lock1");
release_lock("lock1")
1
drop table t0,t2;
+22 −0
Original line number Diff line number Diff line
--source include/master-slave.inc
connection master;
begin;
create temporary table ti (a int) engine=innodb;
rollback;
insert into ti values(1);
set autocommit=0;
create temporary table t1 (a int) type=myisam; commit;
insert t1 values (1); rollback;
create table t0 (n int);
insert t0 select * from t1;
set autocommit=1;
insert into t0 select GET_LOCK("lock1",null);
set autocommit=0;
create table t2 (n int) engine=innodb;
insert into t2 values (3); 
disconnect master;
connect (master,localhost,root,,test,$MASTER_MYPORT,master.sock);
select get_lock("lock1",null);
show binlog events from 79;
select release_lock("lock1");
drop table t0,t2;
+1 −1
Original line number Diff line number Diff line
@@ -1975,7 +1975,7 @@ void item_user_lock_release(User_level_lock *ull)
    tmp.copy(command, strlen(command), tmp.charset());
    tmp.append(ull->key,ull->key_length);
    tmp.append("\")", 2);
    Query_log_event qev(current_thd, tmp.ptr(), tmp.length(),1, FALSE);
    Query_log_event qev(current_thd, tmp.ptr(), tmp.length(),0, FALSE);
    qev.error_code=0; // this query is always safe to run on slave
    mysql_bin_log.write(&qev);
  }