mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
- fix for bug when creating bitmaps
- fix for bug seen when running test "type_datetime" with Maria (wrong data_file_length in maria_repair()) - fix for bug seen when running test "repair" with Maria (myisam_sort_buffer_size was influencing Maria) sql/handler.cc: Sounds illogical to store myisam_sort_buffer_size into a structure used by all engines. There are only MyISAM and Maria which used sort_buffer_size: they can get their value from their respective system variable (myisam|maria_sort_buffer_size). Using MyISAM's value for all engines was wrong (myisam_sort_buffer_size influenced Maria). sql/handler.h: not needed storage/maria/ha_maria.cc: check_opt->sort_buffer_size was myisam_sort_buffer_size; Maria must use maria_sort_buffer_size instead. storage/maria/ma_bitmap.c: don't use my_chsize() now that Monty re-explained the problem to me :) storage/maria/ma_check.c: making maria_repair() work like maria_repair_by_sort(): sort_param.filepos must be set at start then possibly corrected by create_new_data_handle(); in the opposite order, filepos is finally set to 0, and if the table has no records, it stays 0 and this causes state.data_file_length to be 0 which is incorrect for a BLOCK_RECORD table having always at least one bitmap page. storage/maria/ma_pagecache.c: Comments storage/myisam/ha_myisam.cc: check_opt->sort_buffer_size is gone
This commit is contained in:
@ -2735,7 +2735,6 @@ int ha_create_table_from_engine(THD* thd, const char *db, const char *name)
|
|||||||
void st_ha_check_opt::init()
|
void st_ha_check_opt::init()
|
||||||
{
|
{
|
||||||
flags= sql_flags= 0;
|
flags= sql_flags= 0;
|
||||||
sort_buffer_size = current_thd->variables.myisam_sort_buff_size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -890,7 +890,6 @@ typedef class Item COND;
|
|||||||
typedef struct st_ha_check_opt
|
typedef struct st_ha_check_opt
|
||||||
{
|
{
|
||||||
st_ha_check_opt() {} /* Remove gcc warning */
|
st_ha_check_opt() {} /* Remove gcc warning */
|
||||||
ulong sort_buffer_size;
|
|
||||||
uint flags; /* isam layer flags (e.g. for myisamchk) */
|
uint flags; /* isam layer flags (e.g. for myisamchk) */
|
||||||
uint sql_flags; /* sql layer flags - for something myisamchk cannot do */
|
uint sql_flags; /* sql layer flags - for something myisamchk cannot do */
|
||||||
KEY_CACHE *key_cache; /* new key cache when changing key cache */
|
KEY_CACHE *key_cache; /* new key cache when changing key cache */
|
||||||
|
@ -1149,7 +1149,7 @@ int ha_maria::repair(THD * thd, HA_CHECK_OPT *check_opt)
|
|||||||
param.testflag= ((check_opt->flags & ~(T_EXTEND)) |
|
param.testflag= ((check_opt->flags & ~(T_EXTEND)) |
|
||||||
T_SILENT | T_FORCE_CREATE | T_CALC_CHECKSUM |
|
T_SILENT | T_FORCE_CREATE | T_CALC_CHECKSUM |
|
||||||
(check_opt->flags & T_EXTEND ? T_REP : T_REP_BY_SORT));
|
(check_opt->flags & T_EXTEND ? T_REP : T_REP_BY_SORT));
|
||||||
param.sort_buffer_length= check_opt->sort_buffer_size;
|
param.sort_buffer_length= THDVAR(thd, sort_buffer_size);
|
||||||
start_records= file->state->records;
|
start_records= file->state->records;
|
||||||
while ((error= repair(thd, param, 0)) && param.retry_repair)
|
while ((error= repair(thd, param, 0)) && param.retry_repair)
|
||||||
{
|
{
|
||||||
@ -1196,7 +1196,7 @@ int ha_maria::zerofill(THD * thd, HA_CHECK_OPT *check_opt)
|
|||||||
param.thd= thd;
|
param.thd= thd;
|
||||||
param.op_name= "zerofill";
|
param.op_name= "zerofill";
|
||||||
param.testflag= check_opt->flags | T_SILENT | T_ZEROFILL;
|
param.testflag= check_opt->flags | T_SILENT | T_ZEROFILL;
|
||||||
param.sort_buffer_length= check_opt->sort_buffer_size;
|
param.sort_buffer_length= THDVAR(thd, sort_buffer_size);
|
||||||
error=maria_zerofill(¶m, file, file->s->open_file_name);
|
error=maria_zerofill(¶m, file, file->s->open_file_name);
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
@ -1214,7 +1214,7 @@ int ha_maria::optimize(THD * thd, HA_CHECK_OPT *check_opt)
|
|||||||
param.op_name= "optimize";
|
param.op_name= "optimize";
|
||||||
param.testflag= (check_opt->flags | T_SILENT | T_FORCE_CREATE |
|
param.testflag= (check_opt->flags | T_SILENT | T_FORCE_CREATE |
|
||||||
T_REP_BY_SORT | T_STATISTICS | T_SORT_INDEX);
|
T_REP_BY_SORT | T_STATISTICS | T_SORT_INDEX);
|
||||||
param.sort_buffer_length= check_opt->sort_buffer_size;
|
param.sort_buffer_length= THDVAR(thd, sort_buffer_size);
|
||||||
if ((error= repair(thd, param, 1)) && param.retry_repair)
|
if ((error= repair(thd, param, 1)) && param.retry_repair)
|
||||||
{
|
{
|
||||||
sql_print_warning("Warning: Optimize table got errno %d on %s.%s, retrying",
|
sql_print_warning("Warning: Optimize table got errno %d on %s.%s, retrying",
|
||||||
|
@ -2617,6 +2617,8 @@ void _ma_bitmap_set_pagecache_callbacks(PAGECACHE_FILE *file,
|
|||||||
/**
|
/**
|
||||||
Extends data file with zeroes and creates new bitmap pages into page cache.
|
Extends data file with zeroes and creates new bitmap pages into page cache.
|
||||||
|
|
||||||
|
Writes all bitmap pages in [from, to].
|
||||||
|
|
||||||
Non-bitmap pages of zeroes are correct as they are marked empty in
|
Non-bitmap pages of zeroes are correct as they are marked empty in
|
||||||
bitmaps. Bitmap pages will not be zeroes: they will get their CRC fixed when
|
bitmaps. Bitmap pages will not be zeroes: they will get their CRC fixed when
|
||||||
flushed. And if there is a crash before flush (so they are zeroes at
|
flushed. And if there is a crash before flush (so they are zeroes at
|
||||||
@ -2632,17 +2634,24 @@ _ma_bitmap_create_missing_into_pagecache(MARIA_SHARE *share,
|
|||||||
{
|
{
|
||||||
pgcache_page_no_t i;
|
pgcache_page_no_t i;
|
||||||
/*
|
/*
|
||||||
We use my_chsize() to not rely on OS filling gaps with zeroes and to have
|
We do not use my_chsize() because there can be a race between when it
|
||||||
sequential order in the file (allocate all new data and bitmap pages from
|
reads the physical size and when it writes (assume data_file_length is 10,
|
||||||
the filesystem).
|
physical length is 8 and two data pages are in cache, and here we do a
|
||||||
|
my_chsize: my_chsize sees physical length is 8, then the two data pages go
|
||||||
|
to disk then my_chsize writes from page 8 and so overwrites the two data
|
||||||
|
pages, wrongly).
|
||||||
|
We instead rely on the filesystem filling gaps with zeroes.
|
||||||
*/
|
*/
|
||||||
if (my_chsize(bitmap->file.file, (to + 1) * bitmap->block_size, 0,
|
|
||||||
MYF(MY_WME)))
|
|
||||||
goto err;
|
|
||||||
/* Write all bitmap pages in [from, to] */
|
|
||||||
for (i= from; i <= to; i+= bitmap->pages_covered)
|
for (i= from; i <= to; i+= bitmap->pages_covered)
|
||||||
{
|
{
|
||||||
/* no need to keep them pinned, they are new so flushable */
|
/**
|
||||||
|
No need to keep them pinned, they are new so flushable.
|
||||||
|
@todo but we may want to keep them pinned, as an optimization: if they
|
||||||
|
are not pinned they may go to disk before the data pages go (so, the
|
||||||
|
physical pages would be in non-ascending "sparse" order on disk), or the
|
||||||
|
filesystem may fill gaps with zeroes physically which is a waste of
|
||||||
|
time.
|
||||||
|
*/
|
||||||
if (pagecache_write(share->pagecache,
|
if (pagecache_write(share->pagecache,
|
||||||
&bitmap->file, i, 0,
|
&bitmap->file, i, 0,
|
||||||
zeroes, PAGECACHE_PLAIN_PAGE,
|
zeroes, PAGECACHE_PLAIN_PAGE,
|
||||||
|
@ -2249,8 +2249,8 @@ int maria_repair(HA_CHECK *param, register MARIA_HA *info,
|
|||||||
if (reenable_logging)
|
if (reenable_logging)
|
||||||
_ma_tmp_disable_logging_for_table(info, 0);
|
_ma_tmp_disable_logging_for_table(info, 0);
|
||||||
|
|
||||||
new_header_length= ((param->testflag & T_UNPACK) ? 0L :
|
sort_param.filepos= new_header_length=
|
||||||
share->pack.header_length);
|
((param->testflag & T_UNPACK) ? 0L : share->pack.header_length);
|
||||||
|
|
||||||
if (!rep_quick)
|
if (!rep_quick)
|
||||||
{
|
{
|
||||||
@ -2321,7 +2321,6 @@ int maria_repair(HA_CHECK *param, register MARIA_HA *info,
|
|||||||
|
|
||||||
sort_param.read_cache=param->read_cache;
|
sort_param.read_cache=param->read_cache;
|
||||||
sort_param.pos=sort_param.max_pos=share->pack.header_length;
|
sort_param.pos=sort_param.max_pos=share->pack.header_length;
|
||||||
sort_param.filepos=new_header_length;
|
|
||||||
param->read_cache.end_of_file= sort_info.filelength;
|
param->read_cache.end_of_file= sort_info.filelength;
|
||||||
sort_param.master=1;
|
sort_param.master=1;
|
||||||
sort_info.max_records= ~(ha_rows) 0;
|
sort_info.max_records= ~(ha_rows) 0;
|
||||||
@ -3414,7 +3413,7 @@ int maria_repair_by_sort(HA_CHECK *param, register MARIA_HA *info,
|
|||||||
/*
|
/*
|
||||||
for external plugin parser we cannot tell anything at all :(
|
for external plugin parser we cannot tell anything at all :(
|
||||||
so, we'll use all the sort memory and start from ~10 buffpeks.
|
so, we'll use all the sort memory and start from ~10 buffpeks.
|
||||||
(see _create_index_by_sort)
|
(see _ma_create_index_by_sort)
|
||||||
*/
|
*/
|
||||||
sort_info.max_records=
|
sort_info.max_records=
|
||||||
10*param->sort_buffer_length/sort_param.key_length;
|
10*param->sort_buffer_length/sort_param.key_length;
|
||||||
@ -5967,6 +5966,7 @@ static my_bool create_new_data_handle(MARIA_SORT_PARAM *param, File new_file)
|
|||||||
if (_ma_initialize_data_file(new_info->s, new_file))
|
if (_ma_initialize_data_file(new_info->s, new_file))
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
|
|
||||||
|
/* Take into account any bitmap page created above: */
|
||||||
param->filepos= new_info->state->data_file_length;
|
param->filepos= new_info->state->data_file_length;
|
||||||
|
|
||||||
/* Use new virtual functions for key generation */
|
/* Use new virtual functions for key generation */
|
||||||
|
@ -3396,6 +3396,7 @@ restart:
|
|||||||
DBUG_ASSERT(block->type == PAGECACHE_EMPTY_PAGE ||
|
DBUG_ASSERT(block->type == PAGECACHE_EMPTY_PAGE ||
|
||||||
block->type == PAGECACHE_READ_UNKNOWN_PAGE ||
|
block->type == PAGECACHE_READ_UNKNOWN_PAGE ||
|
||||||
block->type == type ||
|
block->type == type ||
|
||||||
|
/* this is for when going to non-trans to trans */
|
||||||
(block->type == PAGECACHE_PLAIN_PAGE &&
|
(block->type == PAGECACHE_PLAIN_PAGE &&
|
||||||
type == PAGECACHE_LSN_PAGE));
|
type == PAGECACHE_LSN_PAGE));
|
||||||
block->type= type;
|
block->type= type;
|
||||||
@ -4239,7 +4240,11 @@ my_bool pagecache_collect_changed_blocks_with_lsn(PAGECACHE *pagecache,
|
|||||||
*/
|
*/
|
||||||
DBUG_ASSERT(block->hash_link != NULL);
|
DBUG_ASSERT(block->hash_link != NULL);
|
||||||
DBUG_ASSERT(block->status & PCBLOCK_CHANGED);
|
DBUG_ASSERT(block->status & PCBLOCK_CHANGED);
|
||||||
/* Note that we don't store bitmap pages */
|
/*
|
||||||
|
Note that we don't store bitmap pages, or pages from non-transactional
|
||||||
|
(like temporary) tables. Don't checkpoint during Recovery which uses
|
||||||
|
PAGECACHE_PLAIN_PAGE.
|
||||||
|
*/
|
||||||
if (block->type != PAGECACHE_LSN_PAGE)
|
if (block->type != PAGECACHE_LSN_PAGE)
|
||||||
continue; /* no need to store it */
|
continue; /* no need to store it */
|
||||||
stored_list_size++;
|
stored_list_size++;
|
||||||
|
@ -969,7 +969,7 @@ int ha_myisam::repair(THD* thd, HA_CHECK_OPT *check_opt)
|
|||||||
param.testflag= ((check_opt->flags & ~(T_EXTEND)) |
|
param.testflag= ((check_opt->flags & ~(T_EXTEND)) |
|
||||||
T_SILENT | T_FORCE_CREATE | T_CALC_CHECKSUM |
|
T_SILENT | T_FORCE_CREATE | T_CALC_CHECKSUM |
|
||||||
(check_opt->flags & T_EXTEND ? T_REP : T_REP_BY_SORT));
|
(check_opt->flags & T_EXTEND ? T_REP : T_REP_BY_SORT));
|
||||||
param.sort_buffer_length= check_opt->sort_buffer_size;
|
param.sort_buffer_length= thd->variables.myisam_sort_buff_size;
|
||||||
start_records=file->state->records;
|
start_records=file->state->records;
|
||||||
while ((error=repair(thd,param,0)) && param.retry_repair)
|
while ((error=repair(thd,param,0)) && param.retry_repair)
|
||||||
{
|
{
|
||||||
@ -1015,7 +1015,7 @@ int ha_myisam::optimize(THD* thd, HA_CHECK_OPT *check_opt)
|
|||||||
param.op_name= "optimize";
|
param.op_name= "optimize";
|
||||||
param.testflag= (check_opt->flags | T_SILENT | T_FORCE_CREATE |
|
param.testflag= (check_opt->flags | T_SILENT | T_FORCE_CREATE |
|
||||||
T_REP_BY_SORT | T_STATISTICS | T_SORT_INDEX);
|
T_REP_BY_SORT | T_STATISTICS | T_SORT_INDEX);
|
||||||
param.sort_buffer_length= check_opt->sort_buffer_size;
|
param.sort_buffer_length= thd->variables.myisam_sort_buff_size;
|
||||||
if ((error= repair(thd,param,1)) && param.retry_repair)
|
if ((error= repair(thd,param,1)) && param.retry_repair)
|
||||||
{
|
{
|
||||||
sql_print_warning("Warning: Optimize table got errno %d on %s.%s, retrying",
|
sql_print_warning("Warning: Optimize table got errno %d on %s.%s, retrying",
|
||||||
|
Reference in New Issue
Block a user