From 03e04c02cdf33c443db5b46b48f8c4ef02ad1b9e Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 20 Nov 2003 18:12:49 +0200 Subject: database invalidation invalidate queries only of given database (BUG#1898) mysql-test/r/query_cache.result: test of drop database mysql-test/t/query_cache.test: test of drop database sql/sql_cache.cc: database invalidation invalidate queries only of given database every freed block header marked as FREE even if it will be merged to make moving & deleting tables block safe layout fixed (too long line) --- sql/sql_cache.cc | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) (limited to 'sql/sql_cache.cc') diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc index 5d525c7be4e..8610fcb8f22 100644 --- a/sql/sql_cache.cc +++ b/sql/sql_cache.cc @@ -1151,9 +1151,29 @@ void Query_cache::invalidate(char *db) if (query_cache_size > 0) { DUMP(this); - /* invalidate_table reduce list while only root of list remain */ - while (tables_blocks !=0 ) - invalidate_table(tables_blocks); + restart_search: + if (tables_blocks) + { + Query_cache_block *curr= tables_blocks; + Query_cache_block *next; + do + { + next= curr->next; + if (strcmp(db, (char*)(curr->table()->db())) == 0) + invalidate_table(curr); + /* + invalidate_table can freed block on which point 'next' (if + table of this block used only in queries which was deleted + by invalidate_table). As far as we do not allocate new blocks + and mark all headers of freed blocks as 'FREE' (even if they are + merged with other blocks) we can just test type of block + to be sure that block is not deleted + */ + if (next->type == Query_cache_block::FREE) + goto restart_search; + curr= next; + } while (curr != tables_blocks); + } } STRUCT_UNLOCK(&structure_guard_mutex); } @@ -2158,9 +2178,11 @@ void Query_cache::free_memory_block(Query_cache_block *block) { DBUG_ENTER("Query_cache::free_memory_block"); block->used=0; - DBUG_PRINT("qcache",("first_block 0x%lx, block 0x%lx, pnext 0x%lx pprev 0x%lx", - (ulong) first_block, (ulong) block,block->pnext, - (ulong) block->pprev)); + block->type= Query_cache_block::FREE; // mark block as free in any case + DBUG_PRINT("qcache", + ("first_block 0x%lx, block 0x%lx, pnext 0x%lx pprev 0x%lx", + (ulong) first_block, (ulong) block,block->pnext, + (ulong) block->pprev)); if (block->pnext != first_block && block->pnext->is_free()) block = join_free_blocks(block, block->pnext); -- cgit v1.2.1 From 417d2b193adacb122d88c4443c1a982803e5eea0 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 10 Dec 2003 12:03:54 +0200 Subject: Add cast to remove compiler warning --- sql/sql_cache.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sql/sql_cache.cc') diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc index 8610fcb8f22..63d4e4222b4 100644 --- a/sql/sql_cache.cc +++ b/sql/sql_cache.cc @@ -2181,7 +2181,7 @@ void Query_cache::free_memory_block(Query_cache_block *block) block->type= Query_cache_block::FREE; // mark block as free in any case DBUG_PRINT("qcache", ("first_block 0x%lx, block 0x%lx, pnext 0x%lx pprev 0x%lx", - (ulong) first_block, (ulong) block,block->pnext, + (ulong) first_block, (ulong) block, (ulong) block->pnext, (ulong) block->pprev)); if (block->pnext != first_block && block->pnext->is_free()) -- cgit v1.2.1