mirror of
https://github.com/MariaDB/server.git
synced 2025-02-02 03:51:50 +01:00
8d0dc9b58b
FLUSH TABLES <list> WITH READ LOCK are incompatible" to be pushed as separate patch. Replaced thread state name "Waiting for table", which was used by threads waiting for a metadata lock or table flush, with a set of names which better reflect types of resources being waited for. Also replaced "Table lock" thread state name, which was used by threads waiting on thr_lock.c table level lock, with more elaborate "Waiting for table level lock", to make it more consistent with other thread state names. Updated test cases and their results according to these changes. Fixed sys_vars.query_cache_wlock_invalidate_func test to not to wait for timeout of wait_condition.inc script. mysql-test/r/query_cache.result: Added test coverage for query_cache_wlock_invalidate behavior for implicitly locked tables. mysql-test/suite/sys_vars/r/query_cache_wlock_invalidate_func.result: Fixed sys_vars.query_cache_wlock_invalidate_func test to not to wait for timeout of wait_condition.inc script. Reverted changes to test which introduced timeout and replaced waiting condition with a more appropriate one. Test coverage for query_cache_wlock_invalidate behavior for implicitly locked tables was added to query_cache.test. mysql-test/suite/sys_vars/t/query_cache_wlock_invalidate_func.test: Fixed sys_vars.query_cache_wlock_invalidate_func test to not to wait for timeout of wait_condition.inc script. Reverted changes to test which introduced timeout and replaced waiting condition with a more appropriate one. Test coverage for query_cache_wlock_invalidate behavior for implicitly locked tables was added to query_cache.test. mysql-test/t/query_cache.test: Added test coverage for query_cache_wlock_invalidate behavior for implicitly locked tables. mysys/thr_lock.c: Replaced "Table lock" thread state name, which was used by threads waiting on thr_lock.c table level lock, with more elaborate "Waiting for table level lock", to make it consistent with thread state names which are used while waiting for metadata locks and table flush. sql/mdl.cc: Replaced thread state name "Waiting for table", which was used by threads waiting for a metadata lock or table flush, with a set of names which better reflect types of resources being waited for. To implement this: - Adjusted MDL_wait::timed_wait() to take thread state name as parameter. - Introduced method of MDL_key class which allows to get thread state name to be used while waiting for resource corresponding to the key and changed code to use it. Added array translating namespaces to thread state names as part of this change. sql/mdl.h: To implement this: - Adjusted MDL_wait::timed_wait() to take thread state name as parameter. - Introduced method of MDL_key class which allows to get thread state name to be used while waiting for resource corresponding to the key and changed code to use it. Added array translating namespaces to thread state names as part of this change. sql/sql_base.cc: Replaced thread state name "Waiting for table", which was used by threads waiting for table flush, with a more elaborate "Waiting for table flush".
129 lines
2.9 KiB
Text
129 lines
2.9 KiB
Text
-- source include/have_innodb.inc
|
|
|
|
#
|
|
# Check and select innodb lock type
|
|
#
|
|
|
|
set global innodb_table_locks=1;
|
|
|
|
select @@innodb_table_locks;
|
|
|
|
#
|
|
# Testing of explicit table locks with enforced table locks
|
|
#
|
|
|
|
connect (con1,localhost,root,,);
|
|
connect (con2,localhost,root,,);
|
|
|
|
--disable_warnings
|
|
drop table if exists t1;
|
|
--enable_warnings
|
|
|
|
#
|
|
# Testing of explicit table locks with enforced table locks
|
|
#
|
|
|
|
set @@innodb_table_locks=1;
|
|
|
|
connection con1;
|
|
create table t1 (id integer, x integer) engine=INNODB;
|
|
insert into t1 values(0, 0);
|
|
set autocommit=0;
|
|
SELECT * from t1 where id = 0 FOR UPDATE;
|
|
|
|
connection con2;
|
|
set autocommit=0;
|
|
|
|
# The following statement should hang because con1 is locking the page
|
|
--send
|
|
lock table t1 write;
|
|
--sleep 2
|
|
|
|
connection con1;
|
|
update t1 set x=1 where id = 0;
|
|
select * from t1;
|
|
commit;
|
|
|
|
connection con2;
|
|
reap;
|
|
update t1 set x=2 where id = 0;
|
|
commit;
|
|
unlock tables;
|
|
|
|
connection con1;
|
|
select * from t1;
|
|
commit;
|
|
|
|
drop table t1;
|
|
|
|
--echo #
|
|
--echo # Old lock method (where LOCK TABLE was ignored by InnoDB) no longer
|
|
--echo # works when LOCK TABLE ... WRITE is used due to fix for bugs #46272
|
|
--echo # "MySQL 5.4.4, new MDL: unnecessary and bug #37346 "innodb does not
|
|
--echo # detect deadlock between update and alter table". But it still works
|
|
--echo # for LOCK TABLE ... READ.
|
|
--echo #
|
|
|
|
set @@innodb_table_locks=0;
|
|
|
|
create table t1 (id integer primary key, x integer) engine=INNODB;
|
|
insert into t1 values(0, 0),(1,1),(2,2);
|
|
commit;
|
|
SELECT * from t1 where id = 0 FOR UPDATE;
|
|
|
|
--echo # Connection 'con2'.
|
|
connection con2;
|
|
set autocommit=0;
|
|
set @@innodb_table_locks=0;
|
|
|
|
--echo # The following statement should block because SQL-level lock
|
|
--echo # is taken on t1 which will wait until concurrent transaction
|
|
--echo # is commited.
|
|
--echo # Sending:
|
|
--send lock table t1 write;
|
|
|
|
--echo # Connection 'con1'.
|
|
connection con1;
|
|
--echo # Wait until LOCK TABLE is blocked on SQL-level lock.
|
|
let $wait_condition=
|
|
select count(*) = 1 from information_schema.processlist
|
|
where state = "Waiting for table metadata lock" and
|
|
info = "lock table t1 write";
|
|
--source include/wait_condition.inc
|
|
--echo # We should be able to do UPDATEs and SELECTs within transaction.
|
|
update t1 set x=1 where id = 0;
|
|
select * from t1;
|
|
--echo # Unblock LOCK TABLE.
|
|
commit;
|
|
|
|
--echo # Connection 'con2'.
|
|
connection con2;
|
|
--echo # Reap LOCK TABLE.
|
|
--reap
|
|
unlock tables;
|
|
|
|
--echo # Connection 'con1'.
|
|
connection con1;
|
|
|
|
select * from t1 where id = 0 for update;
|
|
|
|
--echo # Connection 'con2'.
|
|
connection con2;
|
|
--echo # The below statement should not be blocked as LOCK TABLES ... READ
|
|
--echo # does not take strong SQL-level lock on t1. SELECTs which do not
|
|
--echo # conflict with transaction in the first connections should not be
|
|
--echo # blocked.
|
|
lock table t1 read;
|
|
select * from t1;
|
|
select * from t1 where id = 1 lock in share mode;
|
|
unlock tables;
|
|
select * from t1;
|
|
commit;
|
|
|
|
--echo # Connection 'con1'.
|
|
connection con1;
|
|
commit;
|
|
|
|
drop table t1;
|
|
|
|
# End of 4.1 tests
|