diff options
author | unknown <thek@adventure.(none)> | 2008-01-03 15:36:48 +0100 |
---|---|---|
committer | unknown <thek@adventure.(none)> | 2008-01-03 15:36:48 +0100 |
commit | a3561354a2593a24c820111e0d1f6000ca8a508e (patch) | |
tree | 5315de64ab2d57cc678862f60b52a9618655602c /mysql-test/t/query_cache.test | |
parent | 54953ec25cdb1340be98f400eb31f53f3c49bf55 (diff) | |
download | mariadb-git-a3561354a2593a24c820111e0d1f6000ca8a508e.tar.gz |
Bug#30887 Server crashes on SET GLOBAL query_cache_size=0
Reseting the query cache by issuing a SET GLOBAL query_cache_size=0 caused the server
to crash if a the server concurrently was saving a new result set to the query cache. The
reason for this was that the invalidation wasn't waiting on the result writers to
release the block level locks on the query cache.
mysql-test/r/query_cache.result:
Added test for verifying that 'SET query_cache_size= 0' while inserting new
statements into the query cache won't cause the server to crash.
mysql-test/t/query_cache.test:
Added test for verifying that 'SET query_cache_size= 0' while inserting new
statements into the query cache won't cause the server to crash.
sql/sql_cache.cc:
- Applying a block level lock iteration of all query-type blocks prevents
writers and readers from crashing when the query cache is removed.
Diffstat (limited to 'mysql-test/t/query_cache.test')
-rw-r--r-- | mysql-test/t/query_cache.test | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/mysql-test/t/query_cache.test b/mysql-test/t/query_cache.test index 9e250372d51..14cd9385ca6 100644 --- a/mysql-test/t/query_cache.test +++ b/mysql-test/t/query_cache.test @@ -1316,6 +1316,47 @@ SELECT 1 FROM t1 GROUP BY (SELECT LAST_INSERT_ID() FROM t1 ORDER BY MIN(a) ASC LIMIT 1); DROP TABLE t1; +# +# Bug #30887 Server crashes on SET GLOBAL query_cache_size=0 +# +flush status; +set query_cache_type=DEMAND; +set global query_cache_size= 1024*1024*512; +--disable_warnings +drop table if exists t1; +--enable_warnings +create table t1 (a varchar(100)); +insert into t1 values ('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'),('bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'); +connect (bug30887con1, localhost, root, ,test); +connect (bug30887con2, localhost, root, ,test); + +connection bug30887con1; +--echo Activate debug hook and attempt to retrieve the statement from the cache. +set session debug='+d,wait_in_query_cache_insert'; +--send select SQL_CACHE * from t1; + +connection default; +let $wait_condition= select count(*)= 1 from information_schema.processlist where state= 'wait_in_query_cache_insert'; +--source include/wait_condition.inc + +connection bug30887con2; +--echo On a second connection; clear the query cache. +show status like 'Qcache_queries_in_cache'; +--send set global query_cache_size= 0; + +connection default; +--echo Signal the debug hook to release the lock. +select id from information_schema.processlist where state='wait_in_query_cache_insert' into @thread_id; +kill query @thread_id; + +--echo Show query cache status. +show status like 'Qcache_queries_in_cache'; + +disconnect bug30887con1; +disconnect bug30887con2; +set global query_cache_size= 0; +use test; +drop table t1; --echo End of 5.1 tests |