Commit f0f21036 authored by Michael Widenius's avatar Michael Widenius

Automatic merge

parents 7d1ce2e8 f66d2500
SELECT @@GLOBAL.innodb_use_sys_malloc;
@@GLOBAL.innodb_use_sys_malloc
1
1 Expected
SET @@GLOBAL.innodb_use_sys_malloc=0;
ERROR HY000: Variable 'innodb_use_sys_malloc' is a read only variable
Expected error 'Read only variable'
SELECT @@GLOBAL.innodb_use_sys_malloc;
@@GLOBAL.innodb_use_sys_malloc
1
1 Expected
drop table if exists t1;
create table t1(a int not null) engine=innodb DEFAULT CHARSET=latin1;
insert into t1 values (1),(2),(3),(4),(5),(6),(7);
select * from t1;
a
1
2
3
4
5
6
7
drop table t1;
SELECT @@GLOBAL.innodb_use_sys_malloc;
@@GLOBAL.innodb_use_sys_malloc
1
1 Expected
SET @@GLOBAL.innodb_use_sys_malloc=0;
ERROR HY000: Variable 'innodb_use_sys_malloc' is a read only variable
Expected error 'Read only variable'
SELECT @@GLOBAL.innodb_use_sys_malloc;
@@GLOBAL.innodb_use_sys_malloc
1
1 Expected
drop table if exists t1;
create table t1(a int not null) engine=innodb DEFAULT CHARSET=latin1;
insert into t1 values (1),(2),(3),(4),(5),(6),(7);
select * from t1;
a
1
2
3
4
5
6
7
drop table t1;
...@@ -109,7 +109,8 @@ prototype_undo_exec_hook(UNDO_KEY_DELETE); ...@@ -109,7 +109,8 @@ prototype_undo_exec_hook(UNDO_KEY_DELETE);
prototype_undo_exec_hook(UNDO_KEY_DELETE_WITH_ROOT); prototype_undo_exec_hook(UNDO_KEY_DELETE_WITH_ROOT);
prototype_undo_exec_hook(UNDO_BULK_INSERT); prototype_undo_exec_hook(UNDO_BULK_INSERT);
static int run_redo_phase(LSN lsn, enum maria_apply_log_way apply); static int run_redo_phase(LSN lsn, LSN end_lsn,
enum maria_apply_log_way apply);
static uint end_of_redo_phase(my_bool prepare_for_undo_phase); static uint end_of_redo_phase(my_bool prepare_for_undo_phase);
static int run_undo_phase(uint uncommitted); static int run_undo_phase(uint uncommitted);
static void display_record_position(const LOG_DESC *log_desc, static void display_record_position(const LOG_DESC *log_desc,
...@@ -217,8 +218,8 @@ int maria_recovery_from_log(void) ...@@ -217,8 +218,8 @@ int maria_recovery_from_log(void)
#endif #endif
tprint(trace_file, "TRACE of the last MARIA recovery from mysqld\n"); tprint(trace_file, "TRACE of the last MARIA recovery from mysqld\n");
DBUG_ASSERT(maria_pagecache->inited); DBUG_ASSERT(maria_pagecache->inited);
res= maria_apply_log(LSN_IMPOSSIBLE, MARIA_LOG_APPLY, trace_file, res= maria_apply_log(LSN_IMPOSSIBLE, LSN_IMPOSSIBLE, MARIA_LOG_APPLY,
TRUE, TRUE, TRUE, &warnings_count); trace_file, TRUE, TRUE, TRUE, &warnings_count);
if (!res) if (!res)
{ {
if (warnings_count == 0 && recovery_found_crashed_tables == 0) if (warnings_count == 0 && recovery_found_crashed_tables == 0)
...@@ -239,6 +240,7 @@ int maria_recovery_from_log(void) ...@@ -239,6 +240,7 @@ int maria_recovery_from_log(void)
@param from_lsn LSN from which log reading/applying should start; @param from_lsn LSN from which log reading/applying should start;
LSN_IMPOSSIBLE means "use last checkpoint" LSN_IMPOSSIBLE means "use last checkpoint"
@param end_lsn Apply until this. LSN_IMPOSSIBLE means until end.
@param apply how log records should be applied or not @param apply how log records should be applied or not
@param trace_file trace file where progress/debug messages will go @param trace_file trace file where progress/debug messages will go
@param skip_DDLs_arg Should DDL records (CREATE/RENAME/DROP/REPAIR) @param skip_DDLs_arg Should DDL records (CREATE/RENAME/DROP/REPAIR)
...@@ -255,7 +257,8 @@ int maria_recovery_from_log(void) ...@@ -255,7 +257,8 @@ int maria_recovery_from_log(void)
@retval !=0 Error @retval !=0 Error
*/ */
int maria_apply_log(LSN from_lsn, enum maria_apply_log_way apply, int maria_apply_log(LSN from_lsn, LSN end_lsn,
enum maria_apply_log_way apply,
FILE *trace_file, FILE *trace_file,
my_bool should_run_undo_phase, my_bool skip_DDLs_arg, my_bool should_run_undo_phase, my_bool skip_DDLs_arg,
my_bool take_checkpoints, uint *warnings_count) my_bool take_checkpoints, uint *warnings_count)
...@@ -263,6 +266,7 @@ int maria_apply_log(LSN from_lsn, enum maria_apply_log_way apply, ...@@ -263,6 +266,7 @@ int maria_apply_log(LSN from_lsn, enum maria_apply_log_way apply,
int error= 0; int error= 0;
uint uncommitted_trans; uint uncommitted_trans;
ulonglong old_now; ulonglong old_now;
my_bool abort_message_printed= 0;
DBUG_ENTER("maria_apply_log"); DBUG_ENTER("maria_apply_log");
DBUG_ASSERT(apply == MARIA_LOG_APPLY || !should_run_undo_phase); DBUG_ASSERT(apply == MARIA_LOG_APPLY || !should_run_undo_phase);
...@@ -271,6 +275,7 @@ int maria_apply_log(LSN from_lsn, enum maria_apply_log_way apply, ...@@ -271,6 +275,7 @@ int maria_apply_log(LSN from_lsn, enum maria_apply_log_way apply,
maria_recovery_changed_data= 0; maria_recovery_changed_data= 0;
/* checkpoints can happen only if TRNs have been built */ /* checkpoints can happen only if TRNs have been built */
DBUG_ASSERT(should_run_undo_phase || !take_checkpoints); DBUG_ASSERT(should_run_undo_phase || !take_checkpoints);
DBUG_ASSERT(end_lsn == LSN_IMPOSSIBLE || should_run_undo_phase == 0);
all_active_trans= (struct st_trn_for_recovery *) all_active_trans= (struct st_trn_for_recovery *)
my_malloc((SHORT_TRID_MAX + 1) * sizeof(struct st_trn_for_recovery), my_malloc((SHORT_TRID_MAX + 1) * sizeof(struct st_trn_for_recovery),
MYF(MY_ZEROFILL)); MYF(MY_ZEROFILL));
...@@ -316,7 +321,7 @@ int maria_apply_log(LSN from_lsn, enum maria_apply_log_way apply, ...@@ -316,7 +321,7 @@ int maria_apply_log(LSN from_lsn, enum maria_apply_log_way apply,
now= my_getsystime(); now= my_getsystime();
in_redo_phase= TRUE; in_redo_phase= TRUE;
trnman_init(max_trid_in_control_file); trnman_init(max_trid_in_control_file);
if (run_redo_phase(from_lsn, apply)) if (run_redo_phase(from_lsn, end_lsn, apply))
{ {
ma_message_no_user(0, "Redo phase failed"); ma_message_no_user(0, "Redo phase failed");
trnman_destroy(); trnman_destroy();
...@@ -324,6 +329,15 @@ int maria_apply_log(LSN from_lsn, enum maria_apply_log_way apply, ...@@ -324,6 +329,15 @@ int maria_apply_log(LSN from_lsn, enum maria_apply_log_way apply,
} }
trnman_destroy(); trnman_destroy();
if (end_lsn != LSN_IMPOSSIBLE)
{
abort_message_printed= 1;
my_message(HA_ERR_INITIALIZATION,
"Maria recovery aborted as end_lsn/end of file was reached",
MYF(0));
goto err2;
}
if ((uncommitted_trans= if ((uncommitted_trans=
end_of_redo_phase(should_run_undo_phase)) == (uint)-1) end_of_redo_phase(should_run_undo_phase)) == (uint)-1)
{ {
...@@ -440,10 +454,15 @@ int maria_apply_log(LSN from_lsn, enum maria_apply_log_way apply, ...@@ -440,10 +454,15 @@ int maria_apply_log(LSN from_lsn, enum maria_apply_log_way apply,
goto end; goto end;
err: err:
error= 1;
tprint(tracef, "\nRecovery of tables with transaction logs FAILED\n"); tprint(tracef, "\nRecovery of tables with transaction logs FAILED\n");
err2:
if (trns_created) if (trns_created)
delete_all_transactions(); delete_all_transactions();
error= 1;
if (close_all_tables())
{
ma_message_no_user(0, "closing of tables failed");
}
end: end:
error_handler_hook= save_error_handler_hook; error_handler_hook= save_error_handler_hook;
hash_free(&all_dirty_pages); hash_free(&all_dirty_pages);
...@@ -480,7 +499,7 @@ end: ...@@ -480,7 +499,7 @@ end:
maria_recovery_changed_data= 1; maria_recovery_changed_data= 1;
} }
if (error) if (error && !abort_message_printed)
my_message(HA_ERR_INITIALIZATION, my_message(HA_ERR_INITIALIZATION,
"Maria recovery failed. Please run maria_chk -r on all maria " "Maria recovery failed. Please run maria_chk -r on all maria "
"tables and delete all maria_log.######## files", MYF(0)); "tables and delete all maria_log.######## files", MYF(0));
...@@ -2370,7 +2389,7 @@ prototype_undo_exec_hook(UNDO_BULK_INSERT) ...@@ -2370,7 +2389,7 @@ prototype_undo_exec_hook(UNDO_BULK_INSERT)
} }
static int run_redo_phase(LSN lsn, enum maria_apply_log_way apply) static int run_redo_phase(LSN lsn, LSN lsn_end, enum maria_apply_log_way apply)
{ {
TRANSLOG_HEADER_BUFFER rec; TRANSLOG_HEADER_BUFFER rec;
struct st_translog_scanner_data scanner; struct st_translog_scanner_data scanner;
...@@ -2498,6 +2517,17 @@ static int run_redo_phase(LSN lsn, enum maria_apply_log_way apply) ...@@ -2498,6 +2517,17 @@ static int run_redo_phase(LSN lsn, enum maria_apply_log_way apply)
tprint(tracef, "Cannot find record where it should be\n"); tprint(tracef, "Cannot find record where it should be\n");
goto err; goto err;
} }
if (lsn_end != LSN_IMPOSSIBLE && rec2.lsn >= lsn_end)
{
tprint(tracef,
"lsn_end reached at (%lu,0x%lx). "
"Skipping rest of redo entries",
LSN_IN_PARTS(rec2.lsn));
translog_destroy_scanner(&scanner);
translog_free_record_header(&rec);
return(0);
}
if (translog_scanner_init(rec2.lsn, 1, &scanner2, 1)) if (translog_scanner_init(rec2.lsn, 1, &scanner2, 1))
{ {
tprint(tracef, "Scanner2 init failed\n"); tprint(tracef, "Scanner2 init failed\n");
......
...@@ -26,7 +26,7 @@ C_MODE_START ...@@ -26,7 +26,7 @@ C_MODE_START
enum maria_apply_log_way enum maria_apply_log_way
{ MARIA_LOG_APPLY, MARIA_LOG_DISPLAY_HEADER, MARIA_LOG_CHECK }; { MARIA_LOG_APPLY, MARIA_LOG_DISPLAY_HEADER, MARIA_LOG_CHECK };
int maria_recovery_from_log(void); int maria_recovery_from_log(void);
int maria_apply_log(LSN lsn, enum maria_apply_log_way apply, int maria_apply_log(LSN lsn, LSN lsn_end, enum maria_apply_log_way apply,
FILE *trace_file, FILE *trace_file,
my_bool execute_undo_phase, my_bool skip_DDLs, my_bool execute_undo_phase, my_bool skip_DDLs,
my_bool take_checkpoints, uint *warnings_count); my_bool take_checkpoints, uint *warnings_count);
......
...@@ -1987,9 +1987,9 @@ static my_bool _ma_log_split(MARIA_PAGE *ma_page, ...@@ -1987,9 +1987,9 @@ static my_bool _ma_log_split(MARIA_PAGE *ma_page,
uint changed_length) uint changed_length)
{ {
LSN lsn; LSN lsn;
uchar log_data[FILEID_STORE_SIZE + PAGE_STORE_SIZE + 3+3+3+3+3+2]; uchar log_data[FILEID_STORE_SIZE + PAGE_STORE_SIZE + 3+3+3+3+3+2 +7];
uchar *log_pos; uchar *log_pos;
LEX_CUSTRING log_array[TRANSLOG_INTERNAL_PARTS + 3]; LEX_CUSTRING log_array[TRANSLOG_INTERNAL_PARTS + 4];
uint offset= (uint) (key_pos - ma_page->buff); uint offset= (uint) (key_pos - ma_page->buff);
uint translog_parts, extra_length; uint translog_parts, extra_length;
MARIA_HA *info= ma_page->info; MARIA_HA *info= ma_page->info;
...@@ -2085,6 +2085,22 @@ static my_bool _ma_log_split(MARIA_PAGE *ma_page, ...@@ -2085,6 +2085,22 @@ static my_bool _ma_log_split(MARIA_PAGE *ma_page,
log_array[TRANSLOG_INTERNAL_PARTS + 0].str= log_data; log_array[TRANSLOG_INTERNAL_PARTS + 0].str= log_data;
log_array[TRANSLOG_INTERNAL_PARTS + 0].length= (uint) (log_pos - log_array[TRANSLOG_INTERNAL_PARTS + 0].length= (uint) (log_pos -
log_data); log_data);
#ifdef EXTRA_DEBUG_KEY_CHANGES
{
int page_length= ma_page->size;
ha_checksum crc;
crc= my_checksum(0, ma_page->buff + LSN_STORE_SIZE,
page_length - LSN_STORE_SIZE);
log_pos[0]= KEY_OP_CHECK;
int2store(log_pos+1, page_length);
int4store(log_pos+3, crc);
log_array[TRANSLOG_INTERNAL_PARTS + translog_parts].str= log_pos;
log_array[TRANSLOG_INTERNAL_PARTS + translog_parts].length= 7;
extra_length+= 7;
translog_parts++;
}
#endif
DBUG_RETURN(translog_write_record(&lsn, LOGREC_REDO_INDEX, DBUG_RETURN(translog_write_record(&lsn, LOGREC_REDO_INDEX,
info->trn, info, info->trn, info,
(translog_size_t) (translog_size_t)
...@@ -2122,8 +2138,8 @@ static my_bool _ma_log_del_prefix(MARIA_PAGE *ma_page, ...@@ -2122,8 +2138,8 @@ static my_bool _ma_log_del_prefix(MARIA_PAGE *ma_page,
int move_length) int move_length)
{ {
LSN lsn; LSN lsn;
uchar log_data[FILEID_STORE_SIZE + PAGE_STORE_SIZE + 12], *log_pos; uchar log_data[FILEID_STORE_SIZE + PAGE_STORE_SIZE + 12 + 7], *log_pos;
LEX_CUSTRING log_array[TRANSLOG_INTERNAL_PARTS + 2]; LEX_CUSTRING log_array[TRANSLOG_INTERNAL_PARTS + 3];
uint offset= (uint) (key_pos - ma_page->buff); uint offset= (uint) (key_pos - ma_page->buff);
uint diff_length= org_length + move_length - new_length; uint diff_length= org_length + move_length - new_length;
uint translog_parts, extra_length; uint translog_parts, extra_length;
...@@ -2190,6 +2206,22 @@ static my_bool _ma_log_del_prefix(MARIA_PAGE *ma_page, ...@@ -2190,6 +2206,22 @@ static my_bool _ma_log_del_prefix(MARIA_PAGE *ma_page,
log_array[TRANSLOG_INTERNAL_PARTS + 0].str= log_data; log_array[TRANSLOG_INTERNAL_PARTS + 0].str= log_data;
log_array[TRANSLOG_INTERNAL_PARTS + 0].length= (uint) (log_pos - log_array[TRANSLOG_INTERNAL_PARTS + 0].length= (uint) (log_pos -
log_data); log_data);
#ifdef EXTRA_DEBUG_KEY_CHANGES
{
int page_length= ma_page->size;
ha_checksum crc;
crc= my_checksum(0, ma_page->buff + LSN_STORE_SIZE,
page_length - LSN_STORE_SIZE);
log_pos[0]= KEY_OP_CHECK;
int2store(log_pos+1, page_length);
int4store(log_pos+3, crc);
log_array[TRANSLOG_INTERNAL_PARTS + translog_parts].str= log_pos;
log_array[TRANSLOG_INTERNAL_PARTS + translog_parts].length= 7;
extra_length+= 7;
translog_parts++;
}
#endif
DBUG_RETURN(translog_write_record(&lsn, LOGREC_REDO_INDEX, DBUG_RETURN(translog_write_record(&lsn, LOGREC_REDO_INDEX,
info->trn, info, info->trn, info,
(translog_size_t) (translog_size_t)
...@@ -2215,9 +2247,9 @@ static my_bool _ma_log_key_middle(MARIA_PAGE *ma_page, ...@@ -2215,9 +2247,9 @@ static my_bool _ma_log_key_middle(MARIA_PAGE *ma_page,
uint key_length, int move_length) uint key_length, int move_length)
{ {
LSN lsn; LSN lsn;
uchar log_data[FILEID_STORE_SIZE + PAGE_STORE_SIZE + 3+5+3+3+3]; uchar log_data[FILEID_STORE_SIZE + PAGE_STORE_SIZE + 3+5+3+3+3 + 7];
uchar *log_pos; uchar *log_pos;
LEX_CUSTRING log_array[TRANSLOG_INTERNAL_PARTS + 4]; LEX_CUSTRING log_array[TRANSLOG_INTERNAL_PARTS + 5];
uint key_offset; uint key_offset;
uint translog_parts, extra_length; uint translog_parts, extra_length;
my_off_t page; my_off_t page;
...@@ -2300,6 +2332,22 @@ static my_bool _ma_log_key_middle(MARIA_PAGE *ma_page, ...@@ -2300,6 +2332,22 @@ static my_bool _ma_log_key_middle(MARIA_PAGE *ma_page,
key_length); key_length);
} }
#ifdef EXTRA_DEBUG_KEY_CHANGES
{
int page_length= ma_page->size;
ha_checksum crc;
crc= my_checksum(0, ma_page->buff + LSN_STORE_SIZE,
page_length - LSN_STORE_SIZE);
log_pos[0]= KEY_OP_CHECK;
int2store(log_pos+1, page_length);
int4store(log_pos+3, crc);
log_array[TRANSLOG_INTERNAL_PARTS + translog_parts].str= log_pos;
log_array[TRANSLOG_INTERNAL_PARTS + translog_parts].length= 7;
extra_length+= 7;
translog_parts++;
}
#endif
DBUG_RETURN(translog_write_record(&lsn, LOGREC_REDO_INDEX, DBUG_RETURN(translog_write_record(&lsn, LOGREC_REDO_INDEX,
info->trn, info, info->trn, info,
(translog_size_t) (translog_size_t)
...@@ -2327,6 +2375,7 @@ static my_bool _ma_log_middle(MARIA_PAGE *ma_page, ...@@ -2327,6 +2375,7 @@ static my_bool _ma_log_middle(MARIA_PAGE *ma_page,
uchar log_data[FILEID_STORE_SIZE + PAGE_STORE_SIZE + 3 + 5], *log_pos; uchar log_data[FILEID_STORE_SIZE + PAGE_STORE_SIZE + 3 + 5], *log_pos;
MARIA_HA *info= ma_page->info; MARIA_HA *info= ma_page->info;
my_off_t page; my_off_t page;
uint translog_parts, extra_length;
DBUG_ENTER("_ma_log_middle"); DBUG_ENTER("_ma_log_middle");
DBUG_PRINT("enter", ("page: %lu", (ulong) page)); DBUG_PRINT("enter", ("page: %lu", (ulong) page));
...@@ -2352,12 +2401,31 @@ static my_bool _ma_log_middle(MARIA_PAGE *ma_page, ...@@ -2352,12 +2401,31 @@ static my_bool _ma_log_middle(MARIA_PAGE *ma_page,
log_array[TRANSLOG_INTERNAL_PARTS + 1].str= ((char*) buff + log_array[TRANSLOG_INTERNAL_PARTS + 1].str= ((char*) buff +
info->s->keypage_header); info->s->keypage_header);
log_array[TRANSLOG_INTERNAL_PARTS + 1].length= data_changed_first; log_array[TRANSLOG_INTERNAL_PARTS + 1].length= data_changed_first;
translog_parts= 2;
extra_length= data_changed_first;
#ifdef EXTRA_DEBUG_KEY_CHANGES
{
int page_length= ma_page->size;
ha_checksum crc;
crc= my_checksum(0, ma_page->buff + LSN_STORE_SIZE,
page_length - LSN_STORE_SIZE);
log_pos[0]= KEY_OP_CHECK;
int2store(log_pos+1, page_length);
int4store(log_pos+3, crc);
log_array[TRANSLOG_INTERNAL_PARTS + translog_parts].str= log_pos;
log_array[TRANSLOG_INTERNAL_PARTS + translog_parts].length= 7;
extra_length+= 7;
translog_parts++;
}
#endif
DBUG_RETURN(translog_write_record(&lsn, LOGREC_REDO_INDEX, DBUG_RETURN(translog_write_record(&lsn, LOGREC_REDO_INDEX,
info->trn, info, info->trn, info,
(translog_size_t) (translog_size_t)
log_array[TRANSLOG_INTERNAL_PARTS + log_array[TRANSLOG_INTERNAL_PARTS +
0].length + data_changed_first, 0].length + extra_length,
TRANSLOG_INTERNAL_PARTS + 2, TRANSLOG_INTERNAL_PARTS + translog_parts,
log_array, log_data, NULL)); log_array, log_data, NULL));
} }
#endif #endif
...@@ -42,6 +42,7 @@ static CHARSET_INFO *set_collation; ...@@ -42,6 +42,7 @@ static CHARSET_INFO *set_collation;
static int stopwords_inited= 0; static int stopwords_inited= 0;
static MY_TMPDIR maria_chk_tmpdir; static MY_TMPDIR maria_chk_tmpdir;
static my_bool opt_transaction_logging, opt_debug, opt_require_control_file; static my_bool opt_transaction_logging, opt_debug, opt_require_control_file;
static my_bool opt_warning_for_wrong_transid;
static const char *type_names[]= static const char *type_names[]=
{ {
...@@ -193,7 +194,7 @@ enum options_mc { ...@@ -193,7 +194,7 @@ enum options_mc {
OPT_FT_MAX_WORD_LEN, OPT_FT_STOPWORD_FILE, OPT_FT_MAX_WORD_LEN, OPT_FT_STOPWORD_FILE,
OPT_MAX_RECORD_LENGTH, OPT_AUTO_CLOSE, OPT_STATS_METHOD, OPT_TRANSACTION_LOG, OPT_MAX_RECORD_LENGTH, OPT_AUTO_CLOSE, OPT_STATS_METHOD, OPT_TRANSACTION_LOG,
OPT_SKIP_SAFEMALLOC, OPT_ZEROFILL_KEEP_LSN, OPT_REQUIRE_CONTROL_FILE, OPT_SKIP_SAFEMALLOC, OPT_ZEROFILL_KEEP_LSN, OPT_REQUIRE_CONTROL_FILE,
OPT_LOG_DIR, OPT_DATADIR OPT_LOG_DIR, OPT_DATADIR, OPT_WARNING_FOR_WRONG_TRANSID
}; };
static struct my_option my_long_options[] = static struct my_option my_long_options[] =
...@@ -337,7 +338,9 @@ static struct my_option my_long_options[] = ...@@ -337,7 +338,9 @@ static struct my_option my_long_options[] =
&opt_transaction_logging, &opt_transaction_logging, &opt_transaction_logging, &opt_transaction_logging,
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
{"update-state", 'U', {"update-state", 'U',
"Mark tables as crashed if any errors were found.", "Mark tables as crashed if any errors were found and clean if check didn't "
"find any errors. This allows one to get rid of warnings like 'table not "
"properly closed'",
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
{"unpack", 'u', {"unpack", 'u',
"Unpack file packed with mariapack.", "Unpack file packed with mariapack.",
...@@ -349,6 +352,11 @@ static struct my_option my_long_options[] = ...@@ -349,6 +352,11 @@ static struct my_option my_long_options[] =
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
{"wait", 'w', "Wait if table is locked.", {"wait", 'w', "Wait if table is locked.",
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
{"warning-for-wrong-transaction-id", OPT_WARNING_FOR_WRONG_TRANSID,
"Give a warning if we find a transaction id in the table that is bigger"
"than what exists in the control file. Use --skip-... to disable warning",
&opt_warning_for_wrong_transid, &opt_warning_for_wrong_transid,
0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
{ "page_buffer_size", OPT_PAGE_BUFFER_SIZE, { "page_buffer_size", OPT_PAGE_BUFFER_SIZE,
"Size of page buffer. Used by --safe-repair", "Size of page buffer. Used by --safe-repair",
&check_param.use_buffers, &check_param.use_buffers, 0, &check_param.use_buffers, &check_param.use_buffers, 0,
...@@ -1241,6 +1249,8 @@ static int maria_chk(HA_CHECK *param, char *filename) ...@@ -1241,6 +1249,8 @@ static int maria_chk(HA_CHECK *param, char *filename)
llstr(info->state->records,llbuff), llstr(info->state->records,llbuff),
llstr(info->state->del,llbuff2)); llstr(info->state->del,llbuff2));
maria_chk_init_for_check(param, info); maria_chk_init_for_check(param, info);
if (opt_warning_for_wrong_transid == 0)
param->max_trid= ~ (ulonglong) 0;
error= maria_chk_status(param,info); error= maria_chk_status(param,info);
maria_intersect_keys_active(share->state.key_map, param->keys_in_use); maria_intersect_keys_active(share->state.key_map, param->keys_in_use);
error|= maria_chk_size(param,info); error|= maria_chk_size(param,info);
...@@ -1277,8 +1287,11 @@ static int maria_chk(HA_CHECK *param, char *filename) ...@@ -1277,8 +1287,11 @@ static int maria_chk(HA_CHECK *param, char *filename)
} }
if (!error) if (!error)
{ {
if ((share->state.changed & STATE_CHANGED) && if (((share->state.changed &
(param->testflag & T_UPDATE_STATE)) (STATE_CHANGED | STATE_CRASHED | STATE_CRASHED_ON_REPAIR |
STATE_IN_REPAIR)) ||
share->state.open_count != 0)
&& (param->testflag & T_UPDATE_STATE))
info->update|=HA_STATE_CHANGED | HA_STATE_ROW_CHANGED; info->update|=HA_STATE_CHANGED | HA_STATE_ROW_CHANGED;
DBUG_PRINT("info", ("Reseting crashed state")); DBUG_PRINT("info", ("Reseting crashed state"));
share->state.changed&= ~(STATE_CHANGED | STATE_CRASHED | share->state.changed&= ~(STATE_CHANGED | STATE_CRASHED |
......
...@@ -33,7 +33,7 @@ static my_bool opt_display_only, opt_apply, opt_apply_undo, opt_silent; ...@@ -33,7 +33,7 @@ static my_bool opt_display_only, opt_apply, opt_apply_undo, opt_silent;
static my_bool opt_check; static my_bool opt_check;
static const char *opt_tmpdir; static const char *opt_tmpdir;
static ulong opt_page_buffer_size; static ulong opt_page_buffer_size;
static ulonglong opt_start_from_lsn; static ulonglong opt_start_from_lsn, opt_end_lsn;
static MY_TMPDIR maria_chk_tmpdir; static MY_TMPDIR maria_chk_tmpdir;
...@@ -120,8 +120,14 @@ int main(int argc, char **argv) ...@@ -120,8 +120,14 @@ int main(int argc, char **argv)
LSN_IN_PARTS(lsn)); LSN_IN_PARTS(lsn));
} }
if (opt_end_lsn != LSN_IMPOSSIBLE)
{
/* We can't apply undo if we use end_lsn */
opt_apply_undo= 0;
}
fprintf(stdout, "TRACE of the last maria_read_log\n"); fprintf(stdout, "TRACE of the last maria_read_log\n");
if (maria_apply_log(lsn, opt_apply ? MARIA_LOG_APPLY : if (maria_apply_log(lsn, opt_end_lsn, opt_apply ? MARIA_LOG_APPLY :
(opt_check ? MARIA_LOG_CHECK : (opt_check ? MARIA_LOG_CHECK :
MARIA_LOG_DISPLAY_HEADER), opt_silent ? NULL : stdout, MARIA_LOG_DISPLAY_HEADER), opt_silent ? NULL : stdout,
opt_apply_undo, FALSE, FALSE, &warnings_count)) opt_apply_undo, FALSE, FALSE, &warnings_count))
...@@ -178,18 +184,21 @@ static struct my_option my_long_options[] = ...@@ -178,18 +184,21 @@ static struct my_option my_long_options[] =
{"display-only", 'd', "display brief info read from records' header", {"display-only", 'd', "display brief info read from records' header",
(uchar **) &opt_display_only, (uchar **) &opt_display_only, 0, GET_BOOL, (uchar **) &opt_display_only, (uchar **) &opt_display_only, 0, GET_BOOL,
NO_ARG,0, 0, 0, 0, 0, 0}, NO_ARG,0, 0, 0, 0, 0, 0},
{"maria_log_dir_path", 'l', {"maria-log-dir-path", 'l',
"Path to the directory where to store transactional log", "Path to the directory where to store transactional log",
(uchar **) &maria_data_root, (uchar **) &maria_data_root, 0, (uchar **) &maria_data_root, (uchar **) &maria_data_root, 0,
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{ "page_buffer_size", 'P', "", { "page-buffer-size", 'P', "",
&opt_page_buffer_size, &opt_page_buffer_size, 0, &opt_page_buffer_size, &opt_page_buffer_size, 0,
GET_ULONG, REQUIRED_ARG, (long) USE_BUFFER_INIT, GET_ULONG, REQUIRED_ARG, (long) USE_BUFFER_INIT,
(long) USE_BUFFER_INIT, (long) ~(ulong) 0, (long) MALLOC_OVERHEAD, (long) USE_BUFFER_INIT, (long) ~(ulong) 0, (long) MALLOC_OVERHEAD,
(long) IO_SIZE, 0}, (long) IO_SIZE, 0},
{ "start_from_lsn", 'o', "Start reading log from this lsn", { "start-from-lsn", 'o', "Start reading log from this lsn",
&opt_start_from_lsn, &opt_start_from_lsn, &opt_start_from_lsn, &opt_start_from_lsn,
0, GET_ULL, REQUIRED_ARG, 0, 0, ~(longlong) 0, 0, 0, 0 }, 0, GET_ULL, REQUIRED_ARG, 0, 0, ~(longlong) 0, 0, 0, 0 },
{ "end-lsn", 'e', "Stop applying at this lsn. If end-lsn is used, UNDO:s "
"will not be applied", &opt_end_lsn, &opt_end_lsn,
0, GET_ULL, REQUIRED_ARG, 0, 0, ~(longlong) 0, 0, 0, 0 },
{"silent", 's', "Print less information during apply/undo phase", {"silent", 's', "Print less information during apply/undo phase",
(uchar **) &opt_silent, (uchar **) &opt_silent, 0, (uchar **) &opt_silent, (uchar **) &opt_silent, 0,
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
......
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