1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

Merge remote-tracking branch 'origin/10.2' into bb-10.2-ext

This commit is contained in:
Alexander Barkov
2018-02-08 19:06:25 +04:00
522 changed files with 11092 additions and 4684 deletions

View File

@ -1188,7 +1188,11 @@ void Query_cache::end_of_result(THD *thd)
#endif
if (try_lock(thd, Query_cache::WAIT))
{
if (is_disabled())
query_cache_tls->first_query_block= NULL; // do not try again with QC
DBUG_VOID_RETURN;
}
query_block= query_cache_tls->first_query_block;
if (query_block)
@ -1565,6 +1569,8 @@ def_week_frmt: %lu, in_trans: %d, autocommit: %d",
unlock();
DEBUG_SYNC(thd, "wait_in_query_cache_store_query");
// init_n_lock make query block locked
BLOCK_UNLOCK_WR(query_block);
}
@ -2570,6 +2576,7 @@ void Query_cache::init()
*/
if (global_system_variables.query_cache_type == 0)
{
m_cache_status= DISABLE_REQUEST;
free_cache();
m_cache_status= DISABLED;
}
@ -2778,13 +2785,17 @@ void Query_cache::make_disabled()
This function frees all resources allocated by the cache. You
have to call init_cache() before using the cache again. This function
requires the structure_guard_mutex to be locked.
requires the cache to be locked (LOCKED_NO_WAIT, lock_and_suspend) or
disabling.
*/
void Query_cache::free_cache()
{
DBUG_ENTER("Query_cache::free_cache");
DBUG_ASSERT(m_cache_lock_status == LOCKED_NO_WAIT ||
m_cache_status == DISABLE_REQUEST);
/* Destroy locks */
Query_cache_block *block= queries_blocks;
if (block)
@ -2792,6 +2803,13 @@ void Query_cache::free_cache()
do
{
Query_cache_query *query= block->query();
/*
There will not be new requests but some maybe not finished yet,
so wait for them by trying lock/unlock
*/
BLOCK_LOCK_WR(block);
BLOCK_UNLOCK_WR(block);
mysql_rwlock_destroy(&query->lock);
block= block->next;
} while (block != queries_blocks);