mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +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:
@ -545,7 +545,6 @@ optimize table t1;
|
||||
connection default;
|
||||
handler t1 read next;
|
||||
c1
|
||||
1
|
||||
handler t1 close;
|
||||
connection con2;
|
||||
Table Op Msg_type Msg_text
|
||||
@ -1296,19 +1295,27 @@ commit;
|
||||
# an open HANDLER, ER_LOCK_DEADLOCK is reported.
|
||||
#
|
||||
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);
|
||||
get_lock('lock1', 10)
|
||||
1
|
||||
connection default;
|
||||
drop table t2;
|
||||
select get_lock('lock1', 10);
|
||||
connection con2;
|
||||
# Waiting for 'drop table t2' to get blocked...
|
||||
# Waiting for 'select get_lock('lock1', 10)' to get blocked...
|
||||
connection con1;
|
||||
drop table t1;
|
||||
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
|
||||
unlock tables;
|
||||
select release_lock('lock1');
|
||||
release_lock('lock1')
|
||||
1
|
||||
connection default;
|
||||
get_lock('lock1', 10)
|
||||
1
|
||||
select release_lock('lock1');
|
||||
release_lock('lock1')
|
||||
1
|
||||
# Demonstrate that there is no deadlock with FLUSH TABLE,
|
||||
# even though it is waiting for the other table to go away
|
||||
create table t2 like t1;
|
||||
@ -1347,6 +1354,10 @@ handler t1 read a next;
|
||||
a
|
||||
1
|
||||
# Unblock 'lock tables t1 write'.
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
2
|
||||
commit;
|
||||
connection con1;
|
||||
# Reap 'lock tables t1 write'.
|
||||
@ -1516,10 +1527,6 @@ handler t1 read a last;
|
||||
a b
|
||||
7 7
|
||||
commit;
|
||||
connection con1;
|
||||
# Demonstrate that the HANDLER doesn't hold MDL_SHARED_WRITE.
|
||||
lock table t1 write;
|
||||
unlock tables;
|
||||
connection default;
|
||||
handler t1 read a prev;
|
||||
a b
|
||||
|
Reference in New Issue
Block a user