mirror of
https://github.com/MariaDB/server.git
synced 2025-05-08 15:01:49 +03:00
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".
258 lines
8.4 KiB
Plaintext
258 lines
8.4 KiB
Plaintext
################################################################################
|
|
# #
|
|
# Variable Name: delayed_insert_limit #
|
|
# Scope: GLOBAL #
|
|
# Access Type: Dynamic #
|
|
# Data Type: Numeric #
|
|
# Default Value: 100 #
|
|
# Range: 1 - 4294967295 #
|
|
# #
|
|
# #
|
|
# Creation Date: 2008-02-25 #
|
|
# Author: Sharique Abdullah #
|
|
# Modified: HHunger 2009-02-26 Replaced 2 sleeps by wait conditions #
|
|
# Modified: mleich 2009-03-18 Partially reimplemented #
|
|
# #
|
|
# Description: Test Cases of Dynamic System Variable "delayed_insert_limit" #
|
|
# that checks behavior of this variable in the following ways #
|
|
# * Functionality based on different values #
|
|
# #
|
|
# Reference: #
|
|
# http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html #
|
|
# #
|
|
################################################################################
|
|
|
|
--echo ** Setup **
|
|
--echo
|
|
#
|
|
# Setup
|
|
#
|
|
|
|
--source include/not_embedded.inc
|
|
|
|
--echo Creating connection con0
|
|
connect (con0,localhost,root,,);
|
|
let $con0_id=`SELECT CONNECTION_ID()`;
|
|
--echo Creating connection con1
|
|
connect (con1,localhost,root,,);
|
|
let $con1_id=`SELECT CONNECTION_ID()`;
|
|
|
|
connection default;
|
|
|
|
SET @global_delayed_insert_limit = @@GLOBAL.delayed_insert_limit;
|
|
|
|
#
|
|
# Create Table
|
|
#
|
|
|
|
CREATE TABLE t1 (a VARCHAR(100),b VARCHAR(100),c VARCHAR(100));
|
|
CREATE VIEW v1 as select * from t1;
|
|
|
|
--echo '#--------------------FN_DYNVARS_25_01-------------------------#'
|
|
|
|
# delayed_insert_limit is smaller than the number of inserted rows
|
|
|
|
SET GLOBAL delayed_insert_limit = 14;
|
|
|
|
INSERT INTO t1 VALUES('1','1','1');
|
|
INSERT INTO t1 VALUES('2','1','1');
|
|
INSERT INTO t1 VALUES('3','1','1');
|
|
INSERT INTO t1 VALUES('4','1','1');
|
|
INSERT INTO t1 VALUES('5','1','1');
|
|
INSERT INTO t1 VALUES('6','1','1');
|
|
|
|
LOCK TABLE v1 WRITE;
|
|
|
|
--echo ** Connection con1 **
|
|
connection con1;
|
|
|
|
delimiter |;
|
|
send
|
|
INSERT DELAYED INTO t1 VALUES('7','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('8','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('9','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('10','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('11','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('12','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('13','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('14','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('15','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('16','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('17','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('18','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('19','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('20','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('21','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('22','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('23','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('24','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('25','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('26','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('27','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('28','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('29','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('30','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('31','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('32','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('33','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('34','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('35','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('36','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('37','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('38','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('39','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('40','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('41','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('42','1','1');
|
|
INSERT DELAYED INTO t1 VALUES('43','1','1');|
|
|
delimiter ;|
|
|
|
|
--echo ** Connection con0 **
|
|
connection con0;
|
|
let $wait_condition=
|
|
SELECT variable_value > @@global.delayed_insert_limit
|
|
FROM information_schema.global_status
|
|
WHERE variable_name like 'Not_flushed_delayed_rows';
|
|
--source include/wait_condition.inc
|
|
let $my_select= SELECT COUNT(*) FROM t1;
|
|
send;
|
|
eval $my_select;
|
|
|
|
--echo ** Connection default **
|
|
connection default;
|
|
--echo ** Wait till con0 is blocked **
|
|
let $wait_condition=
|
|
SELECT COUNT(*) = 1 FROM information_schema.processlist
|
|
WHERE state = 'Waiting for table level lock' AND info = '$my_select';
|
|
--source include/wait_condition.inc
|
|
UNLOCK TABLES;
|
|
|
|
--echo ** Connection con1 **
|
|
connection con1;
|
|
--echo Asynchronous "reap" result
|
|
reap;
|
|
|
|
--echo ** Connection con0 **
|
|
connection con0;
|
|
--echo Asynchronous "reap" result
|
|
--echo The next result suffers from
|
|
--echo '# Bug#35386 insert delayed inserts 1 + limit rows instead of just limit rows'
|
|
#
|
|
# on UNLOCK TABLES both SELECT in the con0 and delayed insert thread in the
|
|
# con1 were awaken. There's no FIFO for TL_WRITE_DELAYED and TL_READ,
|
|
# so either the first delayed_insert_limit rows will be inserted
|
|
# before select (which will see 21 row) or select will go first (and see 6 rows)
|
|
#
|
|
--replace_result 6 21
|
|
reap;
|
|
|
|
--echo ** Connection default **
|
|
connection default;
|
|
let $wait_condition= SELECT count(*) = 43 FROM t1;
|
|
--source include/wait_condition.inc
|
|
--echo Checking if the delayed insert continued afterwards
|
|
SELECT COUNT(*) FROM t1;
|
|
|
|
DROP TABLE t1;
|
|
DROP VIEW v1;
|
|
|
|
|
|
--echo '#--------------------FN_DYNVARS_25_02-------------------------#'
|
|
|
|
# delayed_insert_limit is bigger than the number of inserted rows
|
|
|
|
CREATE TABLE t1 (a VARCHAR(100));
|
|
CREATE VIEW v1 AS SELECT * FROM t1;
|
|
|
|
SET GLOBAL delayed_insert_limit = 20;
|
|
|
|
INSERT INTO t1 VALUES('1');
|
|
INSERT INTO t1 VALUES('2');
|
|
INSERT INTO t1 VALUES('3');
|
|
INSERT INTO t1 VALUES('4');
|
|
INSERT INTO t1 VALUES('5');
|
|
INSERT INTO t1 VALUES('6');
|
|
|
|
LOCK TABLE v1 WRITE;
|
|
|
|
--echo ** Connection con1 **
|
|
connection con1;
|
|
|
|
--echo Asynchronous execute
|
|
delimiter |;
|
|
|
|
send
|
|
INSERT DELAYED INTO t1 VALUES('7');
|
|
INSERT DELAYED INTO t1 VALUES('8');
|
|
INSERT DELAYED INTO t1 VALUES('9');
|
|
INSERT DELAYED INTO t1 VALUES('10');
|
|
INSERT DELAYED INTO t1 VALUES('11');
|
|
INSERT DELAYED INTO t1 VALUES('12');
|
|
INSERT DELAYED INTO t1 VALUES('13');
|
|
INSERT DELAYED INTO t1 VALUES('14');
|
|
INSERT DELAYED INTO t1 VALUES('15');
|
|
INSERT DELAYED INTO t1 VALUES('16');
|
|
INSERT DELAYED INTO t1 VALUES('17');
|
|
INSERT DELAYED INTO t1 VALUES('18');
|
|
INSERT DELAYED INTO t1 VALUES('19');
|
|
INSERT DELAYED INTO t1 VALUES('20');
|
|
INSERT DELAYED INTO t1 VALUES('21');
|
|
INSERT DELAYED INTO t1 VALUES('22');|
|
|
|
|
delimiter ;|
|
|
|
|
--echo ** Connection con0 **
|
|
connection con0;
|
|
let $wait_condition=
|
|
SELECT variable_value > 0 FROM information_schema.global_status
|
|
WHERE variable_name like 'Not_flushed_delayed_rows';
|
|
--source include/wait_condition.inc
|
|
--echo Asynchronous execute
|
|
# Due to performance and server behaveiour the test observes values between 6 and 22.
|
|
# In any case the value must not be outside of that range.
|
|
let $my_select= SELECT COUNT(*) BETWEEN 6 AND 22 FROM t1;
|
|
send;
|
|
eval $my_select;
|
|
|
|
--echo ** Connection default **
|
|
connection default;
|
|
--echo ** Wait till con0 is blocked **
|
|
let $wait_condition=
|
|
SELECT COUNT(*) = 1 FROM information_schema.processlist
|
|
WHERE state = 'Waiting for table level lock' AND info = '$my_select';
|
|
--source include/wait_condition.inc
|
|
UNLOCK TABLES;
|
|
|
|
--echo ** Connection con1 **
|
|
connection con1;
|
|
reap;
|
|
|
|
--echo ** Connection con0 **
|
|
connection con0;
|
|
--echo Asynchronous "reap" result
|
|
reap;
|
|
|
|
--echo ** Connection default**
|
|
connection default;
|
|
--echo Checking if the delayed insert gives the same result afterwards
|
|
eval $my_select;
|
|
|
|
|
|
#
|
|
# Cleanup
|
|
#
|
|
|
|
--echo ** Connection default**
|
|
connection default;
|
|
DROP TABLE t1;
|
|
DROP VIEW v1;
|
|
SET @@GLOBAL.delayed_insert_limit = @global_delayed_insert_limit;
|
|
|
|
--echo Disconnecting from con1, con0
|
|
disconnect con0;
|
|
disconnect con1;
|
|
let $wait_condition=
|
|
SELECT COUNT(*) = 0 FROM information_schema.processlist
|
|
WHERE id IN ($con0_id,$con1_id);
|
|
--source include/wait_condition.inc
|