Commit 24257638 authored by Guilhem Bichot's avatar Guilhem Bichot

Fix for BUG#37288 "Maria - zerofill corrupts table". Testcase is running...

Fix for BUG#37288 "Maria - zerofill corrupts table". Testcase is running ma_test_recovery.pl on Windows.

storage/maria/ma_blockrec.c:
  comment
storage/maria/ma_check.c:
  When zerofilling the data file, _ma_compact_block_page() may increase free space in a
  page so bitmap page needs to be corrected.
parent fdebe278
......@@ -1345,21 +1345,22 @@ static void calc_record_size(MARIA_HA *info, const uchar *record,
}
/*
/**
Compact page by removing all space between rows
IMPLEMENTATION
Move up all rows to start of page.
Move blocks that are directly after each other with one memmove.
Moves up all rows to start of page. Moves blocks that are directly after
each other with one memmove.
SYNOPSIS
_ma_compact_block_page()
buff Page to compact
block_size Size of page
rownr Put empty data after this row
extend_block If 1, extend the block at 'rownr' to cover the
@note if rownr is the last row in the page, and extend_block is false,
caller has to make sure to update bitmap page afterwards to reflect freed
space.
@param buff Page to compact
@param block_size Size of page
@param rownr Put empty data after this row
@param extend_block If 1, extend the block at 'rownr' to cover the
whole block.
min_read_from If <> 0, remove all trid's that are less than this
@param min_read_from If <> 0, remove all trid's that are less than this
*/
void _ma_compact_block_page(uchar *buff, uint block_size, uint rownr,
......
......@@ -3308,11 +3308,16 @@ static my_bool maria_zerofill_data(HA_CHECK *param, MARIA_HA *info,
bzero(buff, LSN_SIZE);
if (max_entry != 0)
{
my_bool is_head_page= (page_type == HEAD_PAGE);
dir= dir_entry_pos(buff, block_size, max_entry - 1);
_ma_compact_block_page(buff, block_size, max_entry -1, 0,
page_type == HEAD_PAGE ? ~(TrID) 0 : 0,
page_type == HEAD_PAGE ?
is_head_page ? ~(TrID) 0 : 0,
is_head_page ?
share->base.min_block_length : 0);
/* compactation may have increased free space */
if (_ma_bitmap_set(info, page, is_head_page,
uint2korr(buff + EMPTY_SPACE_OFFSET)))
goto err;
/* Zerofill the not used part */
offset= uint2korr(dir) + uint2korr(dir+2);
......@@ -3334,10 +3339,9 @@ static my_bool maria_zerofill_data(HA_CHECK *param, MARIA_HA *info,
PAGECACHE_UNPIN, LSN_IMPOSSIBLE,
LSN_IMPOSSIBLE, 1);
}
if (flush_pagecache_blocks(share->pagecache, &info->dfile,
FLUSH_FORCE_WRITE))
DBUG_RETURN(1);
DBUG_RETURN(0);
DBUG_RETURN(_ma_bitmap_flush(share) ||
flush_pagecache_blocks(share->pagecache, &info->dfile,
FLUSH_FORCE_WRITE));
err:
pagecache_unlock_by_link(share->pagecache, page_link.link,
......
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