Commit fb104d76 authored by unknown's avatar unknown

Fixed query cache align data bug.


Docs/manual.texi:
  change log modification
parent ef99fb2e
...@@ -49343,6 +49343,8 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}. ...@@ -49343,6 +49343,8 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}.
@itemize @bullet @itemize @bullet
@item @item
Fixed query cache align data bug.
@item
Fixed mutex bug in replication when reading from master fails. Fixed mutex bug in replication when reading from master fails.
@item @item
Added missing mutex in @code{TRUNCATE TABLE}; This fixes some core Added missing mutex in @code{TRUNCATE TABLE}; This fixes some core
...@@ -2679,14 +2679,17 @@ my_bool Query_cache::move_by_type(byte **border, ...@@ -2679,14 +2679,17 @@ my_bool Query_cache::move_by_type(byte **border,
*border += len; *border += len;
*before = new_block; *before = new_block;
/* If result writing complete && we have free space in block */ /* If result writing complete && we have free space in block */
ulong free_space = new_block->length - new_block->used; ulong free_space= new_block->length - new_block->used;
free_space-= free_space % ALIGN_SIZE(1);
if (query->result()->type == Query_cache_block::RESULT && if (query->result()->type == Query_cache_block::RESULT &&
new_block->length > new_block->used && new_block->length > new_block->used &&
*gap + free_space > min_allocation_unit && *gap + free_space > min_allocation_unit &&
new_block->length - free_space > min_allocation_unit) new_block->length - free_space > min_allocation_unit)
{ {
*border -= free_space; *border-= free_space;
*gap += free_space; *gap+= free_space;
DBUG_PRINT("qcache",
("rest of result free space added to gap (%lu)", *gap));
new_block->length -= free_space; new_block->length -= free_space;
} }
BLOCK_UNLOCK_WR(query_block); BLOCK_UNLOCK_WR(query_block);
...@@ -2747,7 +2750,7 @@ my_bool Query_cache::join_results(ulong join_limit) ...@@ -2747,7 +2750,7 @@ my_bool Query_cache::join_results(ulong join_limit)
header->length() > join_limit) header->length() > join_limit)
{ {
Query_cache_block *new_result_block = Query_cache_block *new_result_block =
get_free_block(header->length() + get_free_block(ALIGN_SIZE(header->length()) +
ALIGN_SIZE(sizeof(Query_cache_block)) + ALIGN_SIZE(sizeof(Query_cache_block)) +
ALIGN_SIZE(sizeof(Query_cache_result)), 1, 0); ALIGN_SIZE(sizeof(Query_cache_result)), 1, 0);
if (new_result_block != 0) if (new_result_block != 0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment