summaryrefslogtreecommitdiff
path: root/storage
diff options
context:
space:
mode:
authorunknown <sanja@askmonty.org>2011-09-02 15:10:10 +0300
committerunknown <sanja@askmonty.org>2011-09-02 15:10:10 +0300
commitb152c4c71dff8b2142e220850d9329fe63f4cfbd (patch)
tree585b0d57da5c535a64dc5393a268e2d4c81c2066 /storage
parentea8aa329099ee28ec6f1266d8d01a6fc664259cf (diff)
parent37a8497d494ea256ff4b13a89e62150e06a17dae (diff)
downloadmariadb-git-b152c4c71dff8b2142e220850d9329fe63f4cfbd.tar.gz
Merge 5.2->5.3
Diffstat (limited to 'storage')
-rw-r--r--storage/maria/ha_maria.cc25
-rw-r--r--storage/maria/ma_check.c10
-rw-r--r--storage/maria/ma_checkpoint.c89
-rw-r--r--storage/maria/ma_recovery.c6
-rw-r--r--storage/maria/maria_def.h1
-rw-r--r--storage/maria/trnman.c1
-rw-r--r--storage/myisam/ha_myisam.cc12
-rw-r--r--storage/myisam/mi_check.c30
-rw-r--r--storage/myisam/sort.c4
9 files changed, 120 insertions, 58 deletions
diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc
index f378aae6263..2d469ff87c2 100644
--- a/storage/maria/ha_maria.cc
+++ b/storage/maria/ha_maria.cc
@@ -150,10 +150,16 @@ static MYSQL_SYSVAR_ULONG(block_size, maria_block_size,
static MYSQL_SYSVAR_ULONG(checkpoint_interval, checkpoint_interval,
PLUGIN_VAR_RQCMDARG,
- "Interval between automatic checkpoints, in seconds; 0 means"
+ "Interval between tries to do an automatic checkpoints. In seconds; 0 means"
" 'no automatic checkpoints' which makes sense only for testing.",
NULL, update_checkpoint_interval, 30, 0, UINT_MAX, 1);
+static MYSQL_SYSVAR_ULONG(checkpoint_log_activity, maria_checkpoint_min_log_activity,
+ PLUGIN_VAR_RQCMDARG,
+ "Number of bytes that the transaction log has to grow between checkpoints before a new "
+ "checkpoint is written to the log.",
+ NULL, NULL, 1024*1024, 0, UINT_MAX, 1);
+
static MYSQL_SYSVAR_ULONG(force_start_after_recovery_failures,
force_start_after_recovery_failures,
/*
@@ -304,7 +310,7 @@ static void _ma_check_print_msg(HA_CHECK *param, const char *msg_type,
if (!thd->vio_ok())
{
- sql_print_error(fmt, args);
+ sql_print_error("%s.%s: %s", param->db_name, param->table_name, msgbuf);
return;
}
@@ -312,6 +318,8 @@ static void _ma_check_print_msg(HA_CHECK *param, const char *msg_type,
(T_CREATE_MISSING_KEYS | T_SAFE_REPAIR | T_AUTO_REPAIR))
{
my_message(ER_NOT_KEYFILE, msgbuf, MYF(MY_WME));
+ if (thd->variables.log_warnings > 2)
+ sql_print_error("%s.%s: %s", param->db_name, param->table_name, msgbuf);
return;
}
length= (uint) (strxmov(name, param->db_name, ".", param->table_name,
@@ -330,8 +338,11 @@ static void _ma_check_print_msg(HA_CHECK *param, const char *msg_type,
protocol->store(msg_type, system_charset_info);
protocol->store(msgbuf, msg_length, system_charset_info);
if (protocol->write())
- sql_print_error("Failed on my_net_write, writing to stderr instead: %s\n",
- msgbuf);
+ sql_print_error("Failed on my_net_write, writing to stderr instead: %s.%s: %s\n",
+ param->db_name, param->table_name, msgbuf);
+ else if (thd->variables.log_warnings > 2)
+ sql_print_error("%s.%s: %s", param->db_name, param->table_name, msgbuf);
+
return;
}
@@ -2184,13 +2195,17 @@ bool ha_maria::check_and_repair(THD *thd)
if (crashed)
{
+ bool save_log_all_errors;
sql_print_warning("Recovering table: '%s'", table->s->path.str);
+ save_log_all_errors= thd->log_all_errors;
+ thd->log_all_errors|= (thd->variables.log_warnings > 2);
check_opt.flags=
((maria_recover_options & HA_RECOVER_BACKUP ? T_BACKUP_DATA : 0) |
(maria_recover_options & HA_RECOVER_FORCE ? 0 : T_SAFE_REPAIR) |
T_AUTO_REPAIR);
if (repair(thd, &check_opt))
error= 1;
+ thd->log_all_errors= save_log_all_errors;
}
pthread_mutex_lock(&LOCK_thread_count);
thd->query_string= old_query;
@@ -3556,6 +3571,7 @@ my_bool ha_maria::register_query_cache_table(THD *thd, char *table_name,
struct st_mysql_sys_var* system_variables[]= {
MYSQL_SYSVAR(block_size),
MYSQL_SYSVAR(checkpoint_interval),
+ MYSQL_SYSVAR(checkpoint_log_activity),
MYSQL_SYSVAR(force_start_after_recovery_failures),
MYSQL_SYSVAR(group_commit),
MYSQL_SYSVAR(group_commit_interval),
@@ -3589,6 +3605,7 @@ static void update_checkpoint_interval(MYSQL_THD thd,
ma_checkpoint_init(*(ulong *)var_ptr= (ulong)(*(long *)save));
}
+
/**
@brief Updates group commit mode
*/
diff --git a/storage/maria/ma_check.c b/storage/maria/ma_check.c
index 221a96c8285..72c01fc9995 100644
--- a/storage/maria/ma_check.c
+++ b/storage/maria/ma_check.c
@@ -2344,7 +2344,7 @@ static int initialize_variables_for_repair(HA_CHECK *param,
return 1;
}
- /* Allow us to restore state and check how state changed */
+ /* Make a copy to allow us to restore state and check how state changed */
memcpy(org_share, share, sizeof(*share));
/* Repair code relies on share->state.state so we have to update it here */
@@ -2364,6 +2364,14 @@ static int initialize_variables_for_repair(HA_CHECK *param,
param->testflag&= ~T_QUICK;
param->org_key_map= share->state.key_map;
+ /*
+ Clear check variables set by repair. This is needed to allow one to run
+ several repair's in a row with same param
+ */
+ param->retry_repair= 0;
+ param->warning_printed= 0;
+ param->error_printed= 0;
+
sort_param->sort_info= sort_info;
sort_param->fix_datafile= ! rep_quick;
sort_param->calc_checksum= test(param->testflag & T_CALC_CHECKSUM);
diff --git a/storage/maria/ma_checkpoint.c b/storage/maria/ma_checkpoint.c
index 19ec7c9c1d4..ae705fc2c0c 100644
--- a/storage/maria/ma_checkpoint.c
+++ b/storage/maria/ma_checkpoint.c
@@ -533,8 +533,9 @@ filter_flush_file_evenly(enum pagecache_page_type type,
risk could be that while a checkpoint happens no LRD flushing happens.
*/
-static uint maria_checkpoint_min_activity= 2*1024*1024;
-
+static ulong maria_checkpoint_min_cache_activity= 10*1024*1024;
+/* Set in ha_maria.cc */
+ulong maria_checkpoint_min_log_activity= 1*1024*1024;
pthread_handler_t ma_checkpoint_background(void *arg)
{
@@ -578,53 +579,61 @@ pthread_handler_t ma_checkpoint_background(void *arg)
switch (sleeps % interval)
{
case 0:
+ {
/* If checkpoints are disabled, wait 1 second and try again */
if (maria_checkpoint_disabled)
{
sleep_time= 1;
break;
}
- /*
- With background flushing evenly distributed over the time
- between two checkpoints, we should have only little flushing to do
- in the checkpoint.
- */
- /*
- No checkpoint if little work of interest for recovery was done
- since last checkpoint. Such work includes log writing (lengthens
- recovery, checkpoint would shorten it), page flushing (checkpoint
- would decrease the amount of read pages in recovery).
- In case of one short statement per minute (very low load), we don't
- want to checkpoint every minute, hence the positive
- maria_checkpoint_min_activity.
- */
-
- if (((translog_get_horizon() - log_horizon_at_last_checkpoint) +
- (maria_pagecache->global_cache_write -
- pagecache_flushes_at_last_checkpoint) *
- maria_pagecache->block_size) < maria_checkpoint_min_activity)
{
- /* don't take checkpoint, so don't know what to flush */
- pages_to_flush_before_next_checkpoint= 0;
- sleep_time= interval;
- break;
+ TRANSLOG_ADDRESS horizon= translog_get_horizon();
+
+ /*
+ With background flushing evenly distributed over the time
+ between two checkpoints, we should have only little flushing to do
+ in the checkpoint.
+ */
+ /*
+ No checkpoint if little work of interest for recovery was done
+ since last checkpoint. Such work includes log writing (lengthens
+ recovery, checkpoint would shorten it), page flushing (checkpoint
+ would decrease the amount of read pages in recovery).
+ In case of one short statement per minute (very low load), we don't
+ want to checkpoint every minute, hence the positive
+ maria_checkpoint_min_activity.
+ */
+ if (horizon != log_horizon_at_last_checkpoint &&
+ (ulonglong) (horizon - log_horizon_at_last_checkpoint) <=
+ maria_checkpoint_min_log_activity &&
+ ((ulonglong) (maria_pagecache->global_cache_write -
+ pagecache_flushes_at_last_checkpoint) *
+ maria_pagecache->block_size) <=
+ maria_checkpoint_min_cache_activity)
+ {
+ /* don't take checkpoint, so don't know what to flush */
+ pages_to_flush_before_next_checkpoint= 0;
+ sleep_time= interval;
+ break;
+ }
+ sleep_time= 1;
+ ma_checkpoint_execute(CHECKPOINT_MEDIUM, TRUE);
+ /*
+ Snapshot this kind of "state" of the engine. Note that the value below
+ is possibly greater than last_checkpoint_lsn.
+ */
+ log_horizon_at_last_checkpoint= translog_get_horizon();
+ pagecache_flushes_at_last_checkpoint=
+ maria_pagecache->global_cache_write;
+ /*
+ If the checkpoint above succeeded it has set d|kfiles and
+ d|kfiles_end. If is has failed, it has set
+ pages_to_flush_before_next_checkpoint to 0 so we will skip flushing
+ and sleep until the next checkpoint.
+ */
}
- sleep_time= 1;
- ma_checkpoint_execute(CHECKPOINT_MEDIUM, TRUE);
- /*
- Snapshot this kind of "state" of the engine. Note that the value below
- is possibly greater than last_checkpoint_lsn.
- */
- log_horizon_at_last_checkpoint= translog_get_horizon();
- pagecache_flushes_at_last_checkpoint=
- maria_pagecache->global_cache_write;
- /*
- If the checkpoint above succeeded it has set d|kfiles and
- d|kfiles_end. If is has failed, it has set
- pages_to_flush_before_next_checkpoint to 0 so we will skip flushing
- and sleep until the next checkpoint.
- */
break;
+ }
case 1:
/* set up parameters for background page flushing */
filter_param.up_to_lsn= last_checkpoint_lsn;
diff --git a/storage/maria/ma_recovery.c b/storage/maria/ma_recovery.c
index d4c1d91325d..33112a1ec5e 100644
--- a/storage/maria/ma_recovery.c
+++ b/storage/maria/ma_recovery.c
@@ -3215,9 +3215,11 @@ static LSN parse_checkpoint_record(LSN lsn)
tprint(tracef, "Loading data from checkpoint record at LSN (%lu,0x%lx)\n",
LSN_IN_PARTS(lsn));
- if ((len= translog_read_record_header(lsn, &rec)) == RECHEADER_READ_ERROR)
+ if ((len= translog_read_record_header(lsn, &rec)) == RECHEADER_READ_ERROR ||
+ rec.type != LOGREC_CHECKPOINT)
{
- tprint(tracef, "Cannot find checkpoint record where it should be\n");
+ eprint(tracef, "Cannot find checkpoint record at LSN (%lu,0x%lx)",
+ LSN_IN_PARTS(lsn));
return LSN_ERROR;
}
diff --git a/storage/maria/maria_def.h b/storage/maria/maria_def.h
index 6932ae0d4f1..392e0f8d95c 100644
--- a/storage/maria/maria_def.h
+++ b/storage/maria/maria_def.h
@@ -828,6 +828,7 @@ extern uchar maria_zero_string[];
extern my_bool maria_inited, maria_in_ha_maria, maria_recovery_changed_data;
extern my_bool maria_recovery_verbose, maria_checkpoint_disabled;
extern my_bool maria_assert_if_crashed_table;
+extern ulong maria_checkpoint_min_log_activity;
extern HASH maria_stored_state;
extern int (*maria_create_trn_hook)(MARIA_HA *);
extern my_bool (*ma_killed)(MARIA_HA *);
diff --git a/storage/maria/trnman.c b/storage/maria/trnman.c
index 05330baed76..36880a59b51 100644
--- a/storage/maria/trnman.c
+++ b/storage/maria/trnman.c
@@ -179,6 +179,7 @@ int trnman_init(TrID initial_trid)
trnman_allocated_transactions= 0;
/* This is needed for recovery and repair */
dummy_transaction_object.min_read_from= ~(TrID) 0;
+ dummy_transaction_object.first_undo_lsn= TRANSACTION_LOGGED_LONG_ID;
pool= 0;
global_trid_generator= initial_trid;
diff --git a/storage/myisam/ha_myisam.cc b/storage/myisam/ha_myisam.cc
index ac4386d4012..97815205586 100644
--- a/storage/myisam/ha_myisam.cc
+++ b/storage/myisam/ha_myisam.cc
@@ -91,14 +91,16 @@ static void mi_check_print_msg(HA_CHECK *param, const char* msg_type,
if (!thd->vio_ok())
{
- sql_print_error("%s", msgbuf);
+ sql_print_error("%s.%s: %s", param->db_name, param->table_name, msgbuf);
return;
}
if (param->testflag & (T_CREATE_MISSING_KEYS | T_SAFE_REPAIR |
T_AUTO_REPAIR))
{
- my_message(ER_NOT_KEYFILE,msgbuf,MYF(MY_WME));
+ my_message(ER_NOT_KEYFILE, msgbuf, MYF(MY_WME));
+ if (thd->variables.log_warnings > 2 && ! thd->log_all_errors)
+ sql_print_error("%s.%s: %s", param->db_name, param->table_name, msgbuf);
return;
}
length=(uint) (strxmov(name, param->db_name,".",param->table_name,NullS) -
@@ -124,7 +126,7 @@ static void mi_check_print_msg(HA_CHECK *param, const char* msg_type,
sql_print_error("Failed on my_net_write, writing to stderr instead: %s\n",
msgbuf);
else if (thd->variables.log_warnings > 2)
- sql_print_error("%s", msgbuf);
+ sql_print_error("%s.%s: %s", param->db_name, param->table_name, msgbuf);
#ifdef THREAD
if (param->need_print_msg_lock)
@@ -1699,7 +1701,10 @@ bool ha_myisam::check_and_repair(THD *thd)
if ((marked_crashed= mi_is_crashed(file)) || check(thd, &check_opt))
{
+ bool save_log_all_errors;
sql_print_warning("Recovering table: '%s'",table->s->path.str);
+ save_log_all_errors= thd->log_all_errors;
+ thd->log_all_errors|= (thd->variables.log_warnings > 2);
if (myisam_recover_options & HA_RECOVER_FULL_BACKUP)
{
char buff[MY_BACKUP_NAME_EXTRA_LENGTH+1];
@@ -1717,6 +1722,7 @@ bool ha_myisam::check_and_repair(THD *thd)
T_AUTO_REPAIR);
if (repair(thd, &check_opt))
error=1;
+ thd->log_all_errors= save_log_all_errors;
}
thd->set_query(old_query, old_query_length);
DBUG_RETURN(error);
diff --git a/storage/myisam/mi_check.c b/storage/myisam/mi_check.c
index 91f2cf11fee..d97ae41ecc7 100644
--- a/storage/myisam/mi_check.c
+++ b/storage/myisam/mi_check.c
@@ -1539,6 +1539,9 @@ int mi_repair(HA_CHECK *param, register MI_INFO *info,
got_error=1;
new_file= -1;
sort_param.sort_info=&sort_info;
+ param->retry_repair= 0;
+ param->warning_printed= 0;
+ param->error_printed= 0;
if (!(param->testflag & T_SILENT))
{
@@ -1683,7 +1686,7 @@ int mi_repair(HA_CHECK *param, register MI_INFO *info,
if (rep_quick && del+sort_info.dupp != info->state->del)
{
mi_check_print_error(param,"Couldn't fix table with quick recovery: Found wrong number of deleted records");
- mi_check_print_error(param,"Run recovery again without -q");
+ mi_check_print_error(param,"Run recovery again without --quick");
got_error=1;
param->retry_repair=1;
param->testflag|=T_RETRY_WITHOUT_QUICK;
@@ -1914,7 +1917,7 @@ int flush_blocks(HA_CHECK *param, KEY_CACHE *key_cache, File file,
{
if (flush_key_blocks(key_cache, file, dirty_part_map, FLUSH_RELEASE))
{
- mi_check_print_error(param,"%d when trying to write bufferts",my_errno);
+ mi_check_print_error(param,"%d when trying to write buffers",my_errno);
return(1);
}
if (!param->using_global_keycache)
@@ -2228,7 +2231,7 @@ int mi_repair_by_sort(HA_CHECK *param, register MI_INFO *info,
MYISAM_SHARE *share=info->s;
HA_KEYSEG *keyseg;
ulong *rec_per_key_part;
- char llbuff[22];
+ char llbuff[22], llbuff2[22];
MI_SORT_INFO sort_info;
ulonglong UNINIT_VAR(key_map);
DBUG_ENTER("mi_repair_by_sort");
@@ -2244,12 +2247,16 @@ int mi_repair_by_sort(HA_CHECK *param, register MI_INFO *info,
printf("Data records: %s\n", llstr(start_records,llbuff));
}
param->testflag|=T_REP; /* for easy checking */
+ param->retry_repair= 0;
+ param->warning_printed= 0;
+ param->error_printed= 0;
if (info->s->options & (HA_OPTION_CHECKSUM | HA_OPTION_COMPRESS_RECORD))
param->testflag|=T_CALC_CHECKSUM;
bzero((char*)&sort_info,sizeof(sort_info));
bzero((char *)&sort_param, sizeof(sort_param));
+
if (!(sort_info.key_block=
alloc_key_blocks(param,
(uint) param->sort_key_blocks,
@@ -2261,7 +2268,7 @@ int mi_repair_by_sort(HA_CHECK *param, register MI_INFO *info,
init_io_cache(&info->rec_cache,info->dfile,
(uint) param->write_buffer_length,
WRITE_CACHE,new_header_length,1,
- MYF(MY_WME | MY_WAIT_IF_FULL) & param->myf_rw)))
+ MYF((param->myf_rw & MY_WAIT_IF_FULL) | MY_WME))))
goto err;
sort_info.key_block_end=sort_info.key_block+param->sort_key_blocks;
info->opt_flag|=WRITE_CACHE_USED;
@@ -2433,7 +2440,10 @@ int mi_repair_by_sort(HA_CHECK *param, register MI_INFO *info,
(my_bool) (!(param->testflag & T_VERBOSE)),
(uint) param->sort_buffer_length))
{
- param->retry_repair=1;
+ param->retry_repair= 1;
+ if (! param->error_printed)
+ mi_check_print_error(param, "Couldn't fix table with create_index_by_sort(). Error: %d",
+ my_errno);
goto err;
}
/* No need to calculate checksum again. */
@@ -2462,7 +2472,10 @@ int mi_repair_by_sort(HA_CHECK *param, register MI_INFO *info,
/* Don't repair if we loosed more than one row */
if (info->state->records+1 < start_records)
{
- info->state->records=start_records;
+ mi_check_print_error(param,
+ "Couldn't fix table as SAFE_REPAIR was requested and we would loose too many rows. %s -> %s",
+ llstr(start_records, llbuff), llstr(info->state->records, llbuff2));
+ info->state->records= start_records;
goto err;
}
}
@@ -2492,7 +2505,7 @@ int mi_repair_by_sort(HA_CHECK *param, register MI_INFO *info,
if (rep_quick && del+sort_info.dupp != info->state->del)
{
mi_check_print_error(param,"Couldn't fix table with quick recovery: Found wrong number of deleted records");
- mi_check_print_error(param,"Run recovery again without -q");
+ mi_check_print_error(param,"Run recovery again without --quick");
got_error=1;
param->retry_repair=1;
param->testflag|=T_RETRY_WITHOUT_QUICK;
@@ -2664,6 +2677,9 @@ int mi_repair_parallel(HA_CHECK *param, register MI_INFO *info,
printf("Data records: %s\n", llstr(start_records,llbuff));
}
param->testflag|=T_REP; /* for easy checking */
+ param->retry_repair= 0;
+ param->warning_printed= 0;
+ param->error_printed= 0;
if (info->s->options & (HA_OPTION_CHECKSUM | HA_OPTION_COMPRESS_RECORD))
param->testflag|=T_CALC_CHECKSUM;
diff --git a/storage/myisam/sort.c b/storage/myisam/sort.c
index 2b6d5167c93..db589759128 100644
--- a/storage/myisam/sort.c
+++ b/storage/myisam/sort.c
@@ -151,6 +151,7 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages,
{
mi_check_print_error(info->sort_info->param,
"myisam_sort_buffer_size is too small");
+ my_errno= ENOMEM;
goto err;
}
}
@@ -175,7 +176,8 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages,
if (memavl < MIN_SORT_BUFFER)
{
mi_check_print_error(info->sort_info->param,"MyISAM sort buffer too small"); /* purecov: tested */
- goto err; /* purecov: tested */
+ my_errno= ENOMEM; /* purecov: tested */
+ goto err; /* purecov: tested */
}
(*info->lock_in_memory)(info->sort_info->param);/* Everything is allocated */