summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/myisamchk.h1
-rw-r--r--storage/maria/ma_check.c34
-rw-r--r--storage/maria/maria_chk.c24
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);