diff options
-rw-r--r-- | include/myisamchk.h | 1 | ||||
-rw-r--r-- | storage/maria/ma_check.c | 34 | ||||
-rw-r--r-- | storage/maria/maria_chk.c | 24 |
3 files changed, 46 insertions, 13 deletions
diff --git a/include/myisamchk.h b/include/myisamchk.h index 3b1f9b6db0e..29f523558aa 100644 --- a/include/myisamchk.h +++ b/include/myisamchk.h @@ -60,6 +60,7 @@ #define T_WAIT_FOREVER (1L << 30) #define T_WRITE_LOOP ((ulong) 1L << 31) #define T_ZEROFILL ((ulonglong) 1L << 32) +#define T_ZEROFILL_KEEP_LSN ((ulonglong) 1L << 33) /** If repair should not bump create_rename_lsn */ #define T_NO_CREATE_RENAME_LSN ((ulonglong) 1L << 33) diff --git a/storage/maria/ma_check.c b/storage/maria/ma_check.c index b9873b37db5..7921af857be 100644 --- a/storage/maria/ma_check.c +++ b/storage/maria/ma_check.c @@ -2952,7 +2952,8 @@ static my_bool maria_zerofill_index(HA_CHECK *param, MARIA_HA *info, my_off_t pos; my_off_t key_file_length= share->state.state.key_file_length; uint block_size= share->block_size; - my_bool transactional= share->base.born_transactional; + my_bool zero_lsn= share->base.born_transactional && + !(param->testflag & T_ZEROFILL_KEEP_LSN); DBUG_ENTER("maria_zerofill_index"); if (!(param->testflag & T_SILENT)) @@ -2979,7 +2980,7 @@ static my_bool maria_zerofill_index(HA_CHECK *param, MARIA_HA *info, llstr(pos, llbuff), my_errno); DBUG_RETURN(1); } - if (transactional) + if (zero_lsn) bzero(buff, LSN_SIZE); length= _ma_get_page_used(share, buff); /* Skip mailformed blocks */ @@ -3021,6 +3022,7 @@ static my_bool maria_zerofill_data(HA_CHECK *param, MARIA_HA *info, pgcache_page_no_t page; uint block_size= share->block_size; MARIA_FILE_BITMAP *bitmap= &share->bitmap; + my_bool zero_lsn= !(param->testflag & T_ZEROFILL_KEEP_LSN); DBUG_ENTER("maria_zerofill_data"); /* This works only with BLOCK_RECORD files */ @@ -3055,16 +3057,23 @@ static my_bool maria_zerofill_data(HA_CHECK *param, MARIA_HA *info, page_type= buff[PAGE_TYPE_OFFSET] & PAGE_TYPE_MASK; switch ((enum en_page_type) page_type) { case UNALLOCATED_PAGE: - bzero(buff, block_size); + if (zero_lsn) + bzero(buff, block_size); + else + bzero(buff + LSN_SIZE, block_size - LSN_SIZE); break; case BLOB_PAGE: if (_ma_bitmap_get_page_bits(info, bitmap, page) == 0) { /* Unallocated page */ - bzero(buff, block_size); + if (zero_lsn) + bzero(buff, block_size); + else + bzero(buff + LSN_SIZE, block_size - LSN_SIZE); } else - bzero(buff, LSN_SIZE); + if (zero_lsn) + bzero(buff, LSN_SIZE); break; case HEAD_PAGE: case TAIL_PAGE: @@ -3073,7 +3082,8 @@ static my_bool maria_zerofill_data(HA_CHECK *param, MARIA_HA *info, uint offset, dir_start; uchar *dir; - bzero(buff, LSN_SIZE); + if (zero_lsn) + bzero(buff, LSN_SIZE); if (max_entry != 0) { dir= dir_entry_pos(buff, block_size, max_entry - 1); @@ -3123,7 +3133,8 @@ err: int maria_zerofill(HA_CHECK *param, MARIA_HA *info, const char *name) { - my_bool error, reenable_logging; + my_bool error, reenable_logging, + zero_lsn= !(param->testflag & T_ZEROFILL_KEEP_LSN); DBUG_ENTER("maria_zerofill"); if ((reenable_logging= info->s->now_transactional)) _ma_tmp_disable_logging_for_table(info, 0); @@ -3132,11 +3143,12 @@ int maria_zerofill(HA_CHECK *param, MARIA_HA *info, const char *name) _ma_set_uuid(info, 0)))) { /* - Mark that table is movable and that we have done zerofill of data and - index + Mark that we have done zerofill of data and index. If we zeroed pages' + LSN, table is movable. */ - info->s->state.changed&= ~(STATE_NOT_ZEROFILLED | STATE_NOT_MOVABLE | - STATE_MOVED); + info->s->state.changed&= ~STATE_NOT_ZEROFILLED; + if (zero_lsn) + info->s->state.changed&= ~(STATE_NOT_MOVABLE | STATE_MOVED); /* Ensure state are flushed to disk */ info->update= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); } diff --git a/storage/maria/maria_chk.c b/storage/maria/maria_chk.c index 69d833e49fb..e51a243a5a0 100644 --- a/storage/maria/maria_chk.c +++ b/storage/maria/maria_chk.c @@ -183,7 +183,7 @@ enum options_mc { OPT_SORT_KEY_BLOCKS, OPT_DECODE_BITS, OPT_FT_MIN_WORD_LEN, OPT_FT_MAX_WORD_LEN, OPT_FT_STOPWORD_FILE, OPT_MAX_RECORD_LENGTH, OPT_AUTO_CLOSE, OPT_STATS_METHOD, OPT_TRANSACTION_LOG, - OPT_SKIP_SAFEMALLOC + OPT_SKIP_SAFEMALLOC, OPT_ZEROFILL_KEEP_LSN }; static struct my_option my_long_options[] = @@ -375,6 +375,12 @@ static struct my_option my_long_options[] = { "zerofill", 'z', "Fill empty space in data and index files with zeroes", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, +#ifdef IDENTICAL_PAGES_AFTER_RECOVERY + { "zerofill-keep-lsn", OPT_ZEROFILL_KEEP_LSN, + "Like --zerofill but does not zero out LSN of data/index pages;" + " used only for testing and debugging", +#endif + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} }; @@ -505,7 +511,13 @@ static void usage(void) (It may be VERY slow to do a sort the first time!).\n\ -b, --block-search=#\n\ Find a record, a block at given offset belongs to.\n\ - -z, --zerofill Fill empty space in data and index files with zeroes."); + -z, --zerofill Fill empty space in data and index files with zeroes" +#ifdef IDENTICAL_PAGES_AFTER_RECOVERY +"\n\ + --zerofill-keep-lsn Like --zerofill but does not zero out LSN of\n\ + data/index pages; used only for testing and debugging" +#endif + "."); print_defaults("my", load_default_groups); my_print_variables(my_long_options); @@ -778,6 +790,14 @@ get_one_option(int optid, else check_param.testflag|= T_ZEROFILL; break; +#ifdef IDENTICAL_PAGES_AFTER_RECOVERY + case OPT_ZEROFILL_KEEP_LSN: + if (argument == disabled_my_option) + check_param.testflag&= ~(T_ZEROFILL_KEEP_LSN | T_ZEROFILL); + else + check_param.testflag|= (T_ZEROFILL_KEEP_LSN | T_ZEROFILL); + break; +#endif case 'H': my_print_help(my_long_options); exit(0); |