diff options
author | Michael Widenius <monty@askmonty.org> | 2011-01-12 01:50:56 +0200 |
---|---|---|
committer | Michael Widenius <monty@askmonty.org> | 2011-01-12 01:50:56 +0200 |
commit | 3e77b1dade6a93275479a93fba4272b59d366d65 (patch) | |
tree | e005a53ff60c1cf409496c8387930c548c15012d /storage | |
parent | 713999a4fe628fb89b81de50a4e87c44273f2c33 (diff) | |
download | mariadb-git-3e77b1dade6a93275479a93fba4272b59d366d65.tar.gz |
Fixed bug in Maria page cache that caused assert if block->request != 0 in free_block()
storage/maria/ma_pagecache.c:
- Ensure that we write also the last buffer in flush if buffer overflows.
- Don't set PCBLOCK_IN_FLUSH if we don't flush the page
- Added some new safety asserts.
Diffstat (limited to 'storage')
-rw-r--r-- | storage/maria/ma_pagecache.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/storage/maria/ma_pagecache.c b/storage/maria/ma_pagecache.c index 8105c6f752d..220d5eae0bf 100644 --- a/storage/maria/ma_pagecache.c +++ b/storage/maria/ma_pagecache.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2008 MySQL AB +/* Copyright (C) 2000-2008 MySQL AB, 2008-2011 Monty Program Ab This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -4187,6 +4187,7 @@ static void free_block(PAGECACHE *pagecache, PAGECACHE_BLOCK_LINK *block) DBUG_ASSERT(block->rlocks == 0); DBUG_ASSERT(block->rlocks_queue == 0); DBUG_ASSERT(block->pins == 0); + DBUG_ASSERT((block->status & ~(PCBLOCK_ERROR | PCBLOCK_READ | PCBLOCK_IN_FLUSH | PCBLOCK_CHANGED | PCBLOCK_REASSIGNED)) == 0); block->status= 0; #ifndef DBUG_OFF block->type= PAGECACHE_EMPTY_PAGE; @@ -4515,6 +4516,7 @@ static int flush_pagecache_blocks_int(PAGECACHE *pagecache, KEYCACHE_DBUG_ASSERT(count<= pagecache->blocks_used); } } + count++; /* Allocate one extra for easy end-of-buffer test */ /* Allocate a new buffer only if its bigger than the one we have */ if (count > FLUSH_CACHE && !(cache= @@ -4552,22 +4554,24 @@ restart: DBUG_ASSERT(filter_res == FLUSH_FILTER_OK); } { + DBUG_ASSERT(!(block->status & PCBLOCK_IN_FLUSH)); /* - Mark the block with BLOCK_IN_FLUSH in order not to let - other threads to use it for new pages and interfere with - our sequence of flushing dirty file pages + We care only for the blocks for which flushing was not + initiated by other threads as a result of page swapping */ - block->status|= PCBLOCK_IN_FLUSH; - if (! (block->status & PCBLOCK_IN_SWITCH)) { - /* - We care only for the blocks for which flushing was not - initiated by other threads as a result of page swapping + /* + Mark the block with BLOCK_IN_FLUSH in order not to let + other threads to use it for new pages and interfere with + our sequence of flushing dirty file pages */ + block->status|= PCBLOCK_IN_FLUSH; + reg_requests(pagecache, block, 1); if (type != FLUSH_IGNORE_CHANGED) { + *pos++= block; /* It's not a temporary file */ if (pos == end) { @@ -4587,7 +4591,6 @@ restart: */ goto restart; } - *pos++= block; } else { |