Fix possible race condition in Query cache.
This commit is contained in:
parent
96340a405a
commit
220623572d
@ -1312,17 +1312,17 @@ ulong Query_cache::resize(ulong query_cache_size_arg)
|
|||||||
{
|
{
|
||||||
BLOCK_LOCK_WR(block);
|
BLOCK_LOCK_WR(block);
|
||||||
Query_cache_query *query= block->query();
|
Query_cache_query *query= block->query();
|
||||||
if (query && query->writer())
|
if (query->writer())
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Drop the writer; this will cancel any attempts to store
|
Drop the writer; this will cancel any attempts to store
|
||||||
the processed statement associated with this writer.
|
the processed statement associated with this writer.
|
||||||
*/
|
*/
|
||||||
query->writer()->first_query_block= NULL;
|
query->writer()->first_query_block= NULL;
|
||||||
query->writer(0);
|
query->writer(0);
|
||||||
refused++;
|
refused++;
|
||||||
}
|
}
|
||||||
BLOCK_UNLOCK_WR(block);
|
query->unlock_n_destroy();
|
||||||
block= block->next;
|
block= block->next;
|
||||||
} while (block != queries_blocks);
|
} while (block != queries_blocks);
|
||||||
}
|
}
|
||||||
@ -4247,11 +4247,11 @@ my_bool Query_cache::move_by_type(uchar **border,
|
|||||||
size_t key_length;
|
size_t key_length;
|
||||||
key=query_cache_query_get_key((uchar*) block, &key_length, 0);
|
key=query_cache_query_get_key((uchar*) block, &key_length, 0);
|
||||||
my_hash_first(&queries, (uchar*) key, key_length, &record_idx);
|
my_hash_first(&queries, (uchar*) key, key_length, &record_idx);
|
||||||
// Move table of used tables
|
|
||||||
memmove((char*) new_block->table(0), (char*) block->table(0),
|
|
||||||
ALIGN_SIZE(n_tables*sizeof(Query_cache_block_table)));
|
|
||||||
block->query()->unlock_n_destroy();
|
block->query()->unlock_n_destroy();
|
||||||
block->destroy();
|
block->destroy();
|
||||||
|
// Move table of used tables
|
||||||
|
memmove((char*) new_block->table(0), (char*) block->table(0),
|
||||||
|
ALIGN_SIZE(n_tables*sizeof(Query_cache_block_table)));
|
||||||
new_block->init(len);
|
new_block->init(len);
|
||||||
new_block->type=Query_cache_block::QUERY;
|
new_block->type=Query_cache_block::QUERY;
|
||||||
new_block->used=used;
|
new_block->used=used;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user