Commit 3004c8de authored by unknown's avatar unknown

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
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;
--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;
...@@ -1975,7 +1975,7 @@ void item_user_lock_release(User_level_lock *ull) ...@@ -1975,7 +1975,7 @@ void item_user_lock_release(User_level_lock *ull)
tmp.copy(command, strlen(command), tmp.charset()); tmp.copy(command, strlen(command), tmp.charset());
tmp.append(ull->key,ull->key_length); tmp.append(ull->key,ull->key_length);
tmp.append("\")", 2); 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 qev.error_code=0; // this query is always safe to run on slave
mysql_bin_log.write(&qev); mysql_bin_log.write(&qev);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment