Commit 64be4ab4 authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-21870 Deprecate and ignore innodb_scrub_log and innodb_scrub_log_speed

The configuration parameter innodb_scrub_log never really worked, as
reported in MDEV-13019 and MDEV-18370.

Because MDEV-14425 is changing the redo log format, the innodb_scrub_log
feature would have to be adjusted for it. Due to the known problems,
it is easier to remove the feature for now, and to ignore and deprecate
the parameters.

If old log contents should be kept secret, then enabling innodb_encrypt_log
or setting a smaller innodb_log_file_size could help.
parent d62766a8
create table t1(a int not null primary key auto_increment,
b varchar(200), c char(100), d varchar(150)) engine=innodb;
DROP TABLE t1;
--source include/have_innodb.inc
#
# MDEV-11705: InnoDB: Failing assertion: (&log_sys.mutex)->is_owned() if server started with innodb-scrub-log
#
create table t1(a int not null primary key auto_increment,
b varchar(200), c char(100), d varchar(150)) engine=innodb;
let $wait_condition= SELECT variable_value FROM information_schema.global_status WHERE variable_name = 'innodb_scrub_log';
--source include/wait_condition.inc
DROP TABLE t1;
......@@ -3,12 +3,16 @@ SELECT @@GLOBAL.innodb_scrub_log_speed;
256
200 Expected
SET @@GLOBAL.innodb_scrub_log_speed=100;
Warnings:
Warning 138 The parameter innodb_scrub_log_speed is deprecated and has no effect.
1 Expected
SELECT @@GLOBAL.innodb_scrub_log_speed;
@@GLOBAL.innodb_scrub_log_speed
100
256
100 Expected
SET @@GLOBAL.innodb_scrub_log_speed=DEFAULT;
Warnings:
Warning 138 The parameter innodb_scrub_log_speed is deprecated and has no effect.
1 Expected
SELECT @@GLOBAL.innodb_scrub_log_speed;
@@GLOBAL.innodb_scrub_log_speed
......
......@@ -1682,7 +1682,7 @@ SESSION_VALUE NULL
DEFAULT_VALUE OFF
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE BOOLEAN
VARIABLE_COMMENT Enable background redo log scrubbing
VARIABLE_COMMENT Deprecated parameter with no effect.
NUMERIC_MIN_VALUE NULL
NUMERIC_MAX_VALUE NULL
NUMERIC_BLOCK_SIZE NULL
......@@ -1694,7 +1694,7 @@ SESSION_VALUE NULL
DEFAULT_VALUE 256
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT Background redo log scrubbing speed in bytes/sec
VARIABLE_COMMENT Deprecated parameter with no effect.
NUMERIC_MIN_VALUE 1
NUMERIC_MAX_VALUE 50000
NUMERIC_BLOCK_SIZE 0
......
......@@ -1094,7 +1094,6 @@ static SHOW_VAR innodb_status_variables[]= {
&export_vars.innodb_scrub_page_split_failures_missing_index, SHOW_SIZE_T},
{"scrub_background_page_split_failures_unknown",
&export_vars.innodb_scrub_page_split_failures_unknown, SHOW_SIZE_T},
{"scrub_log", &export_vars.innodb_scrub_log, SHOW_LONGLONG},
{"encryption_num_key_requests", &export_vars.innodb_encryption_key_requests,
SHOW_LONGLONG},
......@@ -3432,7 +3431,16 @@ static const char* innodb_log_compressed_pages_msg
static my_bool innodb_log_optimize_ddl;
static const char* innodb_log_optimize_ddl_msg
= "The parameter innodb_log_optimize_ddl is deprecated and has no effect.";
/** Deprecated parameter with no effect */
static my_bool innodb_scrub_log;
/** Deprecation message for innodb_scrub_log */
static const char* innodb_scrub_log_msg
= "The parameter innodb_scrub_log is deprecated and has no effect.";
/** Deprecated parameter with no effect */
static ulonglong innodb_scrub_log_speed;
/** Deprecation message for innodb_scrub_log_speed */
static const char* innodb_scrub_log_speed_msg
= "The parameter innodb_scrub_log_speed is deprecated and has no effect.";
/** Deprecated parameter with no effect */
static ulong innodb_undo_logs;
/** Deprecation message for innodb_undo_logs */
......@@ -3761,6 +3769,16 @@ static int innodb_init_params()
deprecated::innodb_log_optimize_ddl = FALSE;
}
if (UNIV_UNLIKELY(deprecated::innodb_scrub_log)) {
sql_print_warning(deprecated::innodb_scrub_log_msg);
deprecated::innodb_scrub_log = FALSE;
}
if (UNIV_UNLIKELY(deprecated::innodb_scrub_log_speed != 256)) {
sql_print_warning(deprecated::innodb_scrub_log_speed_msg);
deprecated::innodb_scrub_log_speed = 256;
}
if (UNIV_UNLIKELY(deprecated::innodb_buffer_pool_instances)) {
sql_print_warning("The parameter innodb_buffer_pool_instances"
" is deprecated and has no effect.");
......@@ -18906,6 +18924,16 @@ innodb_undo_logs_warn(THD* thd, st_mysql_sys_var*, void*, const void*)
deprecated::innodb_undo_logs_msg);
}
/** Issue a deprecation warning for SET GLOBAL innodb_scrub_log_speed.
@param[in,out] thd client connection */
static void
innodb_scrub_log_speed_warn(THD* thd, st_mysql_sys_var*, void*, const void*)
{
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
HA_ERR_UNSUPPORTED,
deprecated::innodb_scrub_log_speed_msg);
}
static SHOW_VAR innodb_status_variables_export[]= {
{"Innodb", (char*) &show_innodb_vars, SHOW_FUNC},
{NullS, NullS, SHOW_LONG}
......@@ -20147,18 +20175,15 @@ static MYSQL_SYSVAR_UINT(encryption_rotation_iops, srv_n_fil_crypt_iops,
innodb_encryption_rotation_iops_update,
srv_n_fil_crypt_iops, 0, UINT_MAX32, 0);
static MYSQL_SYSVAR_BOOL(scrub_log, srv_scrub_log,
static MYSQL_SYSVAR_BOOL(scrub_log, deprecated::innodb_scrub_log,
PLUGIN_VAR_OPCMDARG | PLUGIN_VAR_READONLY,
"Enable background redo log scrubbing",
innodb_deprecated_ignored,
0, 0, 0);
static MYSQL_SYSVAR_ULONGLONG(scrub_log_speed, innodb_scrub_log_speed,
static MYSQL_SYSVAR_ULONGLONG(scrub_log_speed, deprecated::innodb_scrub_log_speed,
PLUGIN_VAR_OPCMDARG,
"Background redo log scrubbing speed in bytes/sec",
NULL, NULL,
256, /* 256 bytes/sec, corresponds to 2000 ms scrub_log_interval */
1, /* min */
50000, 0); /* 50Kbyte/sec, corresponds to 10 ms scrub_log_interval */
innodb_deprecated_ignored, NULL, innodb_scrub_log_speed_warn,
256, 1, 50000, 0);
static MYSQL_SYSVAR_BOOL(encrypt_log, srv_encrypt_log,
PLUGIN_VAR_OPCMDARG | PLUGIN_VAR_READONLY,
......
......@@ -875,15 +875,6 @@ inline void log_t::file::set_lsn_offset(lsn_t a_lsn) {
/** Release the log sys mutex. */
#define log_mutex_exit() mutex_exit(&log_sys.mutex)
/* log scrubbing speed, in bytes/sec */
extern ulonglong innodb_scrub_log_speed;
/** Event to wake up log_scrub_thread */
extern os_event_t log_scrub_event;
/** Whether log_scrub_thread is active */
extern bool log_scrub_thread_active;
#include "log0log.ic"
#endif
......@@ -185,9 +185,6 @@ struct srv_stats_t
/** Number of encryption_get_latest_key_version calls */
ulint_ctr_64_t n_key_requests;
/** Number of log scrub operations */
ulint_ctr_64_t n_log_scrubs;
/** Number of spaces in keyrotation list */
ulint_ctr_64_t key_rotation_list_length;
......@@ -483,9 +480,6 @@ extern ibool srv_print_verbose_log;
extern bool srv_monitor_active;
/* TRUE if enable log scrubbing */
extern my_bool srv_scrub_log;
extern ulong srv_n_spin_wait_rounds;
extern ulong srv_n_free_tickets_to_enter;
extern ulong srv_thread_sleep_delay;
......@@ -971,7 +965,6 @@ struct export_var_t{
ulint innodb_scrub_page_split_failures_out_of_filespace;
ulint innodb_scrub_page_split_failures_missing_index;
ulint innodb_scrub_page_split_failures_unknown;
int64_t innodb_scrub_log;
};
/** Thread slot in the thread table. */
......
......@@ -66,10 +66,6 @@ to the InnoDB redo log. */
/** Redo log system */
log_t log_sys;
/* Next log block number to do dummy record filling if no log records written
for a while */
static ulint next_lbn_to_pad = 0;
/* These control how often we print warnings if the last checkpoint is too
old */
static bool log_has_printed_chkp_warning = false;
......@@ -102,15 +98,6 @@ the previous */
#define LOG_UNLOCK_NONE_FLUSHED_LOCK 1
#define LOG_UNLOCK_FLUSH_LOCK 2
/** Event to wake up log_scrub_thread */
os_event_t log_scrub_event;
/** Whether log_scrub_thread is active */
bool log_scrub_thread_active;
extern "C" UNIV_INTERN
os_thread_ret_t
DECLARE_THREAD(log_scrub_thread)(void*);
/****************************************************************//**
Returns the oldest modified block lsn in the pool, or log_sys.lsn if none
exists.
......@@ -553,12 +540,6 @@ void log_t::create()
buf_free= LOG_BLOCK_HDR_SIZE;
lsn= LOG_START_LSN + LOG_BLOCK_HDR_SIZE;
log_scrub_thread_active= !srv_read_only_mode && srv_scrub_log;
if (log_scrub_thread_active) {
log_scrub_event= os_event_create("log_scrub_event");
os_thread_create(log_scrub_thread, NULL, NULL);
}
}
mapped_file_t::~mapped_file_t() noexcept
......@@ -1766,18 +1747,13 @@ logs_empty_and_mark_files_at_shutdown(void)
}
}
if (log_scrub_thread_active) {
ut_ad(!srv_read_only_mode);
os_event_set(log_scrub_event);
}
if (log_sys.is_initialised()) {
log_mutex_enter();
const ulint n_write = log_sys.n_pending_checkpoint_writes;
const ulint n_flush = log_sys.pending_flushes;
log_mutex_exit();
if (log_scrub_thread_active || n_write || n_flush) {
if (n_write || n_flush) {
if (srv_print_verbose_log && count > 600) {
ib::info() << "Pending checkpoint_writes: "
<< n_write
......@@ -1789,8 +1765,6 @@ logs_empty_and_mark_files_at_shutdown(void)
}
}
ut_ad(!log_scrub_thread_active);
if (!buf_pool) {
ut_ad(!srv_was_started);
} else if (ulint pending_io = buf_pool_check_no_pending_io()) {
......@@ -1989,104 +1963,9 @@ void log_t::close()
mutex_free(&mutex);
mutex_free(&log_flush_order_mutex);
if (!srv_read_only_mode && srv_scrub_log)
os_event_destroy(log_scrub_event);
recv_sys.close();
}
/******************************************************//**
Pads the current log block full with dummy log records. Used in producing
consistent archived log file and scrubbing redo log. */
static
void
log_pad_current_log_block(void)
/*===========================*/
{
byte b = 0;
ulint pad_length;
ulint i;
lsn_t lsn;
ut_ad(!recv_no_log_write);
/* We retrieve lsn only because otherwise gcc crashed on HP-UX */
lsn = log_reserve_and_open(OS_FILE_LOG_BLOCK_SIZE);
pad_length = log_sys.trailer_offset()
- log_sys.buf_free % OS_FILE_LOG_BLOCK_SIZE;
if (pad_length == log_sys.payload_size()) {
pad_length = 0;
}
if (pad_length) {
srv_stats.n_log_scrubs.inc();
}
for (i = 0; i < pad_length; i++) {
log_write_low(&b, 1);
}
lsn = log_sys.lsn;
log_close();
ut_a(lsn % OS_FILE_LOG_BLOCK_SIZE == LOG_BLOCK_HDR_SIZE);
}
/*****************************************************************//*
If no log record has been written for a while, fill current log
block with dummy records. */
static
void
log_scrub()
/*=========*/
{
log_mutex_enter();
ulint cur_lbn = log_block_convert_lsn_to_no(log_sys.lsn);
if (next_lbn_to_pad == cur_lbn)
{
log_pad_current_log_block();
}
next_lbn_to_pad = log_block_convert_lsn_to_no(log_sys.lsn);
log_mutex_exit();
}
/* log scrubbing speed, in bytes/sec */
UNIV_INTERN ulonglong innodb_scrub_log_speed;
/*****************************************************************//**
This is the main thread for log scrub. It waits for an event and
when waked up fills current log block with dummy records and
sleeps again.
@return this function does not return, it calls os_thread_exit() */
extern "C" UNIV_INTERN
os_thread_ret_t
DECLARE_THREAD(log_scrub_thread)(void*)
{
ut_ad(!srv_read_only_mode);
while (srv_shutdown_state < SRV_SHUTDOWN_FLUSH_PHASE) {
/* log scrubbing interval in µs. */
ulonglong interval = 1000*1000*512/innodb_scrub_log_speed;
os_event_wait_time(log_scrub_event, static_cast<ulint>(interval));
log_scrub();
os_event_reset(log_scrub_event);
}
log_scrub_thread_active = false;
/* We count the number of threads in os_thread_exit(). A created
thread should always use that to exit and not use return() to exit. */
os_thread_exit();
OS_THREAD_DUMMY_RETURN;
}
std::string get_log_file_path(const char *filename)
{
const size_t size= strlen(srv_log_group_home_dir) + /* path separator */ 1 +
......
......@@ -84,8 +84,6 @@ UNIV_INTERN ulong srv_fatal_semaphore_wait_threshold = DEFAULT_SRV_FATAL_SEMAPH
in microseconds, in order to reduce the lagging of the purge thread. */
ulint srv_dml_needed_delay;
my_bool srv_scrub_log;
const char* srv_main_thread_op_info = "";
/** Prefix used by MySQL to indicate pre-5.1 table name encoding */
......@@ -1361,7 +1359,6 @@ srv_export_innodb_status(void)
scrub_stat.page_split_failures_missing_index;
export_vars.innodb_scrub_page_split_failures_unknown =
scrub_stat.page_split_failures_unknown;
export_vars.innodb_scrub_log = srv_stats.n_log_scrubs;
}
mutex_exit(&srv_innodb_monitor_mutex);
......
......@@ -892,10 +892,6 @@ srv_shutdown_all_bg_threads()
if (srv_n_fil_crypt_threads_started) {
os_event_set(fil_crypt_threads_event);
}
if (log_scrub_thread_active) {
os_event_set(log_scrub_event);
}
}
if (srv_start_state_is_set(SRV_START_STATE_IO)) {
......
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