1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

MDEV-7660 - MySQL WL#6671 "Improve scalability by not using thr_lock.c locks

for InnoDB tables"

Don't use thr_lock.c locks for InnoDB tables. Below is list of changes that
were needed to implement this:
- HANDLER OPEN acquireis MDL_SHARED_READ instead of MDL_SHARED
- HANDLER READ calls external_lock() even if SE is not going to be locked by
  THR_LOCK
- InnoDB lock wait timeouts are now honored which are much shorter by default
  than server lock wait timeouts (1 year vs 50 seconds)
- with @@autocommit= 1 LOCK TABLES disables autocommit implicitely, though
  user still sees @@autocommt= 1
- the above starts implicit transaction
- transactions started by LOCK TABLES are now rolled back on disconnect
  (previously everything was committed due to autocommit)
- transactions started by LOCK TABLES are now rolled back by ROLLBACK
  (previously everything was committed due to autocommit)
- it is now impossible to change BINLOG_FORMAT under LOCK TABLES (at least
  to statement) due to running transaction
- LOCK TABLES WRITE is additionally handled by MDL
- ...in contrast LOCK TABLES READ protection against DML is pure InnoDB
- combining transactional and non-transactional tables under LOCK TABLES
  may cause rolled back changes in transactional table and "committed"
  changes in non-transactional table
- user may disable innodb_table_locks, which will cause LOCK TABLES to be
  noop basically

Removed tests for BUG#45143 and BUG#55930 which cover InnoDB + THR_LOCK. To
operate properly these tests require code flow to go through THR_LOCK debug
sync points, which is not the case after this patch. These tests are removed
by WL#6671 as well. An alternative is to port them to different storage engine.
This commit is contained in:
Sergey Vojtovich
2016-05-06 13:44:07 +04:00
parent e2d6912609
commit d665e79c5b
31 changed files with 151 additions and 1034 deletions

View File

@@ -1054,24 +1054,24 @@ commit;
--echo # an open HANDLER, ER_LOCK_DEADLOCK is reported.
--echo #
create table t1 (a int, key a(a));
create table t2 like t1;
handler t1 open;
connection con1;
lock table t1 write, t2 write;
select get_lock('lock1', 10);
connection default;
send drop table t2;
send select get_lock('lock1', 10);
connection con2;
--echo # Waiting for 'drop table t2' to get blocked...
--echo # Waiting for 'select get_lock('lock1', 10)' to get blocked...
let $wait_condition=select count(*)=1 from information_schema.processlist
where state='Waiting for table metadata lock' and
info='drop table t2';
where state='User lock' and
info='select get_lock(\'lock1\', 10)';
--source include/wait_condition.inc
connection con1;
--error ER_LOCK_DEADLOCK
drop table t1;
unlock tables;
select release_lock('lock1');
connection default;
reap;
select release_lock('lock1');
--echo # Demonstrate that there is no deadlock with FLUSH TABLE,
--echo # even though it is waiting for the other table to go away
@@ -1118,6 +1118,7 @@ connection default;
handler t1 read a next;
--echo # Unblock 'lock tables t1 write'.
select * from t1; # Release MDL_SHARED_READ held by HANDLER
commit;
connection con1;
@@ -1132,7 +1133,7 @@ connection con1;
--echo # Waiting for 'handler t1 read a next' to get blocked...
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Waiting for table level lock" and
where state = "Waiting for table metadata lock" and
info = "handler t1 read a next";
--source include/wait_condition.inc
@@ -1259,10 +1260,6 @@ handler t1 read a last;
insert into t1 (a, b) values (7, 7);
handler t1 read a last;
commit;
connection con1;
--echo # Demonstrate that the HANDLER doesn't hold MDL_SHARED_WRITE.
lock table t1 write;
unlock tables;
connection default;
handler t1 read a prev;
handler t1 close;