summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Widenius <monty@askmonty.org>2011-09-01 21:13:09 +0300
committerMichael Widenius <monty@askmonty.org>2011-09-01 21:13:09 +0300
commit1a51fe363d3aec8a22e804b90e351ebe912ed837 (patch)
treef554ea0caa9a5aa42c21a67a9b327e9971fa6ad6
parent8b7a63b17f838c012f870e997a63d72c8d696fcf (diff)
downloadmariadb-git-1a51fe363d3aec8a22e804b90e351ebe912ed837.tar.gz
Added variable ARIA_CHECKPOINT_LOG_ACTIVITY to allow one to specify how often we should do a checkpoint.
Added more error printing to log if log_warnings > 2 Give an error if checkpoint record is not correct, mysql-test/suite/maria/r/compat_aliases.result: Added ARIA_CHECKPOINT_LOG_ACTIVITY mysql-test/suite/maria/r/maria3.result: Added ARIA_CHECKPOINT_LOG_ACTIVITY storage/maria/ha_maria.cc: Added ARIA_CHECKPOINT_LOG_ACTIVITY Added more error printing to log if log_warnings > 2 Added db and table name to error message when printing to log storage/maria/ma_check.c: Fixed bug where we didn't reset some variables between repair() calls storage/maria/ma_checkpoint.c: Made maria_checkpoint_min_activity global. Don't do checkpoint if no data logged. Changed test for if we should do checkpoint to test separately for if log has grown or if we have had a lot of of cache writes. storage/maria/ma_recovery.c: Give an error if checkpoint record is not correct storage/maria/trnman.c: Don't print not needed long_transaction_id entries for checkpoints.
-rw-r--r--mysql-test/suite/maria/r/compat_aliases.result1
-rw-r--r--mysql-test/suite/maria/r/maria3.result1
-rw-r--r--storage/maria/compat_aliases.cc5
-rw-r--r--storage/maria/ha_maria.cc25
-rw-r--r--storage/maria/ma_check.c10
-rw-r--r--storage/maria/ma_checkpoint.c19
-rw-r--r--storage/maria/ma_recovery.c6
-rw-r--r--storage/maria/maria_def.h1
-rw-r--r--storage/maria/trnman.c1
9 files changed, 56 insertions, 13 deletions
diff --git a/mysql-test/suite/maria/r/compat_aliases.result b/mysql-test/suite/maria/r/compat_aliases.result
index bcc9ece0986..f0cd5f1d719 100644
--- a/mysql-test/suite/maria/r/compat_aliases.result
+++ b/mysql-test/suite/maria/r/compat_aliases.result
@@ -23,6 +23,7 @@ on (maria_vars.variable_name = concat('m', aria_vars.variable_name))
where aria_vars.variable_name like 'aria_%'
and not (maria_vars.variable_value <=> aria_vars.variable_value);
variable_name variable_name
+NULL ARIA_CHECKPOINT_LOG_ACTIVITY
select maria_vars.variable_name, aria_vars.variable_name from
information_schema.session_status as aria_vars left join
information_schema.session_status as maria_vars
diff --git a/mysql-test/suite/maria/r/maria3.result b/mysql-test/suite/maria/r/maria3.result
index 490059587ad..383dce6fd57 100644
--- a/mysql-test/suite/maria/r/maria3.result
+++ b/mysql-test/suite/maria/r/maria3.result
@@ -305,6 +305,7 @@ select lower(variable_name) as Variable_name, Variable_value as Value from infor
Variable_name Value
aria_block_size 8192
aria_checkpoint_interval 30
+aria_checkpoint_log_activity 1048576
aria_force_start_after_recovery_failures 0
aria_group_commit none
aria_group_commit_interval 0
diff --git a/storage/maria/compat_aliases.cc b/storage/maria/compat_aliases.cc
index 2d3c67d69a7..ce8838b2da2 100644
--- a/storage/maria/compat_aliases.cc
+++ b/storage/maria/compat_aliases.cc
@@ -203,11 +203,16 @@ static struct st_mysql_sys_var* system_variables_aliases[]= {
THDVAR(0, name) == MYSQL_SYSVAR_NAME(name).def_val) \
THDVAR(0, name)= name ## _alias;
+/* Note:
+ The following list must be identical to the list for system_variables[] in ha_maria.cc
+*/
+
void copy_variable_aliases()
{
int i= 0;
COPY_SYSVAR(block_size);
COPY_SYSVAR(checkpoint_interval);
+ i++; // Skip checkpoint_min_log_activity
COPY_SYSVAR(force_start_after_recovery_failures);
COPY_SYSVAR(group_commit);
COPY_SYSVAR(group_commit_interval);
diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc
index 33609afcb9b..0c7c6839201 100644
--- a/storage/maria/ha_maria.cc
+++ b/storage/maria/ha_maria.cc
@@ -151,10 +151,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;
}
@@ -2097,13 +2108,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;
@@ -3411,6 +3426,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),
@@ -3444,6 +3460,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 1f683908642..f4470f846f5 100644
--- a/storage/maria/ma_check.c
+++ b/storage/maria/ma_check.c
@@ -2323,7 +2323,7 @@ static int initialize_variables_for_repair(HA_CHECK *param,
{
MARIA_SHARE *share= info->s;
- /* Ro 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 */
@@ -2343,6 +2343,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 90d4eeb0d33..d53417142b0 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,6 +579,9 @@ pthread_handler_t ma_checkpoint_background(void *arg)
switch (sleeps % interval)
{
case 0:
+ {
+ 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
@@ -592,10 +596,12 @@ pthread_handler_t ma_checkpoint_background(void *arg)
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)
+ 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;
@@ -618,6 +624,7 @@ pthread_handler_t ma_checkpoint_background(void *arg)
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 4263b0131a9..96504cfba2d 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 dcdb500f3a5..4692896212d 100644
--- a/storage/maria/maria_def.h
+++ b/storage/maria/maria_def.h
@@ -821,6 +821,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;
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 *);
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;