summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2018-04-29 09:41:42 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2018-04-29 09:41:42 +0300
commit715e4f4320f5b9d830d6ce22792db0fa0ce4a690 (patch)
treebfeb74be2d92ff260ee1e7769ed3a6d04a725b34
parent9ed2b2b2b8ae3bd60f10995d72a6b7c8d7d037e3 (diff)
downloadmariadb-git-715e4f4320f5b9d830d6ce22792db0fa0ce4a690.tar.gz
MDEV-12218 Clean up InnoDB parameter validation
Bind more InnoDB parameters directly to MYSQL_SYSVAR and remove "shadow variables". innodb_change_buffering: Declare as ENUM, not STRING. innodb_flush_method: Declare as ENUM, not STRING. innodb_log_buffer_size: Bind directly to srv_log_buffer_size, without rounding it to a multiple of innodb_page_size. LOG_BUFFER_SIZE: Remove. SysTablespace::normalize_size(): Renamed from normalize(). innodb_init_params(): A new function to initialize and validate InnoDB startup parameters. innodb_init(): Renamed from innobase_init(). Invoke innodb_init_params() before actually trying to start up InnoDB. srv_start(bool): Renamed from innobase_start_or_create_for_mysql(). Added the input parameter create_new_db. SRV_ALL_O_DIRECT_FSYNC: Define only for _WIN32. xb_normalize_init_values(): Merge to innodb_init_param().
-rw-r--r--extra/mariabackup/backup_mysql.cc1
-rw-r--r--extra/mariabackup/changed_page_bitmap.cc1
-rw-r--r--extra/mariabackup/fil_cur.h1
-rw-r--r--extra/mariabackup/xtrabackup.cc123
-rw-r--r--mysql-test/suite/sys_vars/r/innodb_change_buffering_basic.result6
-rw-r--r--mysql-test/suite/sys_vars/r/innodb_flush_method_basic.result24
-rw-r--r--mysql-test/suite/sys_vars/r/innodb_flush_method_func.result15
-rw-r--r--mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff4
-rw-r--r--mysql-test/suite/sys_vars/r/sysvars_innodb.result20
-rw-r--r--mysql-test/suite/sys_vars/t/innodb_change_buffering_basic.test4
-rw-r--r--mysql-test/suite/sys_vars/t/innodb_flush_method_basic.test10
-rw-r--r--mysql-test/suite/sys_vars/t/innodb_flush_method_func.test26
-rw-r--r--storage/innobase/btr/btr0sea.cc29
-rw-r--r--storage/innobase/buf/buf0buf.cc10
-rw-r--r--storage/innobase/dict/dict0dict.cc22
-rw-r--r--storage/innobase/dict/dict0stats_bg.cc5
-rw-r--r--storage/innobase/fsp/fsp0sysspace.cc2
-rw-r--r--storage/innobase/handler/ha_innodb.cc646
-rw-r--r--storage/innobase/ibuf/ibuf0ibuf.cc10
-rw-r--r--storage/innobase/include/btr0sea.h66
-rw-r--r--storage/innobase/include/btr0sea.ic38
-rw-r--r--storage/innobase/include/fil0crypt.h2
-rw-r--r--storage/innobase/include/fil0fil.h2
-rw-r--r--storage/innobase/include/fsp0file.h3
-rw-r--r--storage/innobase/include/fsp0sysspace.h2
-rw-r--r--storage/innobase/include/ibuf0ibuf.h13
-rw-r--r--storage/innobase/include/log0log.h18
-rw-r--r--storage/innobase/include/log0log.ic8
-rw-r--r--storage/innobase/include/mtr0mtr.h4
-rw-r--r--storage/innobase/include/os0thread.h6
-rw-r--r--storage/innobase/include/srv0conc.h5
-rw-r--r--storage/innobase/include/srv0srv.h21
-rw-r--r--storage/innobase/include/srv0start.h14
-rw-r--r--storage/innobase/include/sync0arr.h15
-rw-r--r--storage/innobase/include/univ.i5
-rw-r--r--storage/innobase/lock/lock0wait.cc10
-rw-r--r--storage/innobase/log/log0log.cc64
-rw-r--r--storage/innobase/log/log0recv.cc6
-rw-r--r--storage/innobase/mtr/mtr0mtr.cc4
-rw-r--r--storage/innobase/os/os0file.cc8
-rw-r--r--storage/innobase/os/os0thread.cc2
-rw-r--r--storage/innobase/srv/srv0conc.cc6
-rw-r--r--storage/innobase/srv/srv0srv.cc55
-rw-r--r--storage/innobase/srv/srv0start.cc182
-rw-r--r--storage/innobase/sync/sync0arr.cc22
-rw-r--r--storage/innobase/sync/sync0debug.cc4
46 files changed, 622 insertions, 922 deletions
diff --git a/extra/mariabackup/backup_mysql.cc b/extra/mariabackup/backup_mysql.cc
index c50e401859b..2369b2d101f 100644
--- a/extra/mariabackup/backup_mysql.cc
+++ b/extra/mariabackup/backup_mysql.cc
@@ -48,6 +48,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA
#include <limits>
#include "common.h"
#include "xtrabackup.h"
+#include "srv0srv.h"
#include "mysql_version.h"
#include "backup_copy.h"
#include "backup_mysql.h"
diff --git a/extra/mariabackup/changed_page_bitmap.cc b/extra/mariabackup/changed_page_bitmap.cc
index 46bb3a7bcb5..b704c3a063d 100644
--- a/extra/mariabackup/changed_page_bitmap.cc
+++ b/extra/mariabackup/changed_page_bitmap.cc
@@ -26,6 +26,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
#include "common.h"
#include "xtrabackup.h"
+#include "srv0srv.h"
/* TODO: copy-pasted shared definitions from the XtraDB bitmap write code.
Remove these on the first opportunity, i.e. single-binary XtraBackup. */
diff --git a/extra/mariabackup/fil_cur.h b/extra/mariabackup/fil_cur.h
index e3f356a346c..6e0dda8c885 100644
--- a/extra/mariabackup/fil_cur.h
+++ b/extra/mariabackup/fil_cur.h
@@ -28,6 +28,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
#include <my_dir.h>
#include "read_filt.h"
#include "srv0start.h"
+#include "srv0srv.h"
struct xb_fil_cur_t {
pfs_os_file_t file; /*!< source file handle */
diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc
index d6d05b99d96..18997b745e7 100644
--- a/extra/mariabackup/xtrabackup.cc
+++ b/extra/mariabackup/xtrabackup.cc
@@ -4,7 +4,7 @@ MariaBackup: hot backup tool for InnoDB
Originally Created 3/3/2009 Yasufumi Kinoshita
Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko,
Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz.
-(c) 2017, MariaDB Corporation.
+(c) 2017, 2018, MariaDB Corporation.
Portions written by Marko Mäkelä.
This program is free software; you can redistribute it and/or modify
@@ -223,7 +223,6 @@ long innobase_buffer_pool_awe_mem_mb = 0;
long innobase_file_io_threads = 4;
long innobase_read_io_threads = 4;
long innobase_write_io_threads = 4;
-long innobase_log_buffer_size = 1024*1024L;
longlong innobase_page_size = (1LL << 14); /* 16KB */
char* innobase_buffer_pool_filename = NULL;
@@ -236,9 +235,6 @@ are determined in innobase_init below: */
static char* innobase_ignored_opt;
char* innobase_data_home_dir;
char* innobase_data_file_path;
-/* The following has a misleading name: starting from 4.0.5, this also
-affects Windows: */
-char* innobase_unix_file_flush_method;
my_bool innobase_use_doublewrite;
my_bool innobase_use_large_pages;
@@ -621,13 +617,9 @@ enum options_xtrabackup
OPT_INNODB_ADAPTIVE_HASH_INDEX,
OPT_INNODB_DOUBLEWRITE,
OPT_INNODB_FILE_PER_TABLE,
- OPT_INNODB_FLUSH_LOG_AT_TRX_COMMIT,
- OPT_INNODB_FLUSH_METHOD,
- OPT_INNODB_LOCKS_UNSAFE_FOR_BINLOG,
OPT_INNODB_LOG_GROUP_HOME_DIR,
OPT_INNODB_MAX_DIRTY_PAGES_PCT,
OPT_INNODB_MAX_PURGE_LAG,
- OPT_INNODB_ROLLBACK_ON_TIMEOUT,
OPT_INNODB_STATUS_FILE,
OPT_INNODB_AUTOEXTEND_INCREMENT,
OPT_INNODB_BUFFER_POOL_SIZE,
@@ -1127,15 +1119,10 @@ struct my_option xb_server_options[] =
(G_PTR*) &innobase_file_per_table, 0, GET_BOOL, NO_ARG,
FALSE, 0, 0, 0, 0, 0},
- {"innodb_flush_method", OPT_INNODB_FLUSH_METHOD,
- "With which method to flush data.", (G_PTR*) &innobase_unix_file_flush_method,
- (G_PTR*) &innobase_unix_file_flush_method, 0, GET_STR, REQUIRED_ARG, 0, 0, 0,
- 0, 0, 0},
-
{"innodb_log_buffer_size", OPT_INNODB_LOG_BUFFER_SIZE,
"The size of the buffer which InnoDB uses to write log to the log files on disk.",
- (G_PTR*) &innobase_log_buffer_size, (G_PTR*) &innobase_log_buffer_size, 0,
- GET_LONG, REQUIRED_ARG, 1024*1024L, 256*1024L, LONG_MAX, 0, 1024, 0},
+ (G_PTR*) &srv_log_buffer_size, (G_PTR*) &srv_log_buffer_size, 0,
+ GET_ULONG, REQUIRED_ARG, 1024*1024L, 256*1024L, LONG_MAX, 0, 1024, 0},
{"innodb_log_file_size", OPT_INNODB_LOG_FILE_SIZE,
"Ignored for mysqld option compatibility",
(G_PTR*) &srv_log_file_size, (G_PTR*) &srv_log_file_size, 0,
@@ -1479,11 +1466,6 @@ xb_get_one_option(int optid,
case OPT_INNODB_LOG_FILE_SIZE:
break;
- case OPT_INNODB_FLUSH_METHOD:
-
- ADD_PRINT_PARAM_OPT(innobase_unix_file_flush_method);
- break;
-
case OPT_INNODB_PAGE_SIZE:
ADD_PRINT_PARAM_OPT(innobase_page_size);
@@ -1587,15 +1569,14 @@ xb_get_one_option(int optid,
return 0;
}
-static my_bool
-innodb_init_param(void)
+static bool innodb_init_param()
{
srv_is_being_started = TRUE;
/* === some variables from mysqld === */
memset((G_PTR) &mysql_tmpdir_list, 0, sizeof(mysql_tmpdir_list));
if (init_tmpdir(&mysql_tmpdir_list, opt_mysql_tmpdir))
- exit(EXIT_FAILURE);
+ return true;
xtrabackup_tmpdir = my_tmpdir(&mysql_tmpdir_list);
/* dummy for initialize all_charsets[] */
get_charset_name(0);
@@ -1617,7 +1598,7 @@ innodb_init_param(void)
} else {
msg("InnoDB: Error: invalid value of "
"innobase_page_size: %lld", innobase_page_size);
- exit(EXIT_FAILURE);
+ goto error;
}
} else {
srv_page_size_shift = 14;
@@ -1684,6 +1665,9 @@ innodb_init_param(void)
goto error;
}
+ srv_sys_space.normalize_size();
+ srv_lock_table_size = 5 * (srv_buf_pool_size >> srv_page_size_shift);
+
/* -------------- Log files ---------------------------*/
/* The default dir for log files is the datadir of MySQL */
@@ -1707,16 +1691,13 @@ innodb_init_param(void)
srv_adaptive_flushing = FALSE;
- srv_file_flush_method_str = innobase_unix_file_flush_method;
-
- srv_log_buffer_size = (ulint) innobase_log_buffer_size;
-
/* We set srv_pool_size here in units of 1 kB. InnoDB internally
changes the value so that it becomes the number of database pages. */
srv_buf_pool_size = (ulint) xtrabackup_use_memory;
srv_buf_pool_chunk_unit = (ulong)srv_buf_pool_size;
srv_buf_pool_instances = 1;
+ srv_n_page_cleaners = 1;
srv_n_file_io_threads = (ulint) innobase_file_io_threads;
srv_n_read_io_threads = (ulint) innobase_read_io_threads;
@@ -1732,7 +1713,7 @@ innodb_init_param(void)
srv_locks_unsafe_for_binlog = (ibool) innobase_locks_unsafe_for_binlog;
- srv_max_n_open_files = ULINT_UNDEFINED;
+ srv_max_n_open_files = ULINT_UNDEFINED - 5;
srv_innodb_status = (ibool) innobase_create_status_file;
srv_print_verbose_log = 1;
@@ -1743,20 +1724,7 @@ innodb_init_param(void)
/* We cannot treat characterset here for now!! */
data_mysql_default_charset_coll = (ulint)default_charset_info->number;
- ut_a(DATA_MYSQL_BINARY_CHARSET_COLL == my_charset_bin.number);
-
- //innobase_commit_concurrency_init_default();
-
- /* Since we in this module access directly the fields of a trx
- struct, and due to different headers and flags it might happen that
- mutex_t has a different size in this module and in InnoDB
- modules, we check at run time that the size is the same in
- these compilation modules. */
-
- /* On 5.5+ srv_use_native_aio is TRUE by default. It is later reset
- if it is not supported by the platform in
- innobase_start_or_create_for_mysql(). As we don't call it in xtrabackup,
- we have to duplicate checks from that function here. */
+ ut_ad(DATA_MYSQL_BINARY_CHARSET_COLL == my_charset_bin.number);
#ifdef _WIN32
srv_use_native_aio = TRUE;
@@ -1789,16 +1757,27 @@ innodb_init_param(void)
? log_block_calc_checksum_crc32
: log_block_calc_checksum_none;
- return(FALSE);
+#ifdef _WIN32
+ srv_use_native_aio = TRUE;
+#endif
+ srv_file_flush_method = IF_WIN(SRV_ALL_O_DIRECT_FSYNC, SRV_FSYNC);
+ return false;
error:
msg("mariabackup: innodb_init_param(): Error occured.\n");
- return(TRUE);
+ return true;
}
static bool innodb_init()
{
- dberr_t err = innobase_start_or_create_for_mysql();
+ bool create_new_db = false;
+ /* Check if the data files exist or not. */
+ dberr_t err = srv_sys_space.check_file_spec(&create_new_db, 5U << 20);
+
+ if (err == DB_SUCCESS) {
+ err = srv_start(create_new_db);
+ }
+
if (err != DB_SUCCESS) {
msg("mariabackup: innodb_init() returned %d (%s).\n",
err, ut_strerr(err));
@@ -3583,19 +3562,6 @@ open_or_create_log_file(
return(DB_SUCCESS);
}
-/*********************************************************************//**
-Normalizes init parameter values to use units we use inside InnoDB.
-@return DB_SUCCESS or error code */
-static
-void
-xb_normalize_init_values(void)
-/*==========================*/
-{
- srv_sys_space.normalize();
- srv_log_buffer_size >>= srv_page_size_shift;
- srv_lock_table_size = 5 * (srv_buf_pool_size >> srv_page_size_shift);
-}
-
/***********************************************************************
Set the open files limit. Based on set_max_open_files().
@@ -3805,42 +3771,6 @@ fail:
return(false);
}
- xb_normalize_init_values();
-
-
- if (srv_file_flush_method_str == NULL) {
- /* These are the default options */
- srv_file_flush_method = SRV_FSYNC;
- } else if (0 == ut_strcmp(srv_file_flush_method_str, "fsync")) {
- srv_file_flush_method = SRV_FSYNC;
- } else if (0 == ut_strcmp(srv_file_flush_method_str, "O_DSYNC")) {
- srv_file_flush_method = SRV_O_DSYNC;
-
- } else if (0 == ut_strcmp(srv_file_flush_method_str, "O_DIRECT")) {
- srv_file_flush_method = SRV_O_DIRECT;
- msg("mariabackup: using O_DIRECT\n");
- } else if (0 == ut_strcmp(srv_file_flush_method_str, "littlesync")) {
- srv_file_flush_method = SRV_LITTLESYNC;
- } else if (0 == ut_strcmp(srv_file_flush_method_str, "nosync")) {
- srv_file_flush_method = SRV_NOSYNC;
- } else if (0 == ut_strcmp(srv_file_flush_method_str, "ALL_O_DIRECT")) {
- srv_file_flush_method = SRV_ALL_O_DIRECT_FSYNC;
- msg("mariabackup: using ALL_O_DIRECT\n");
- } else if (0 == ut_strcmp(srv_file_flush_method_str,
- "O_DIRECT_NO_FSYNC")) {
- srv_file_flush_method = SRV_O_DIRECT_NO_FSYNC;
- msg("mariabackup: using O_DIRECT_NO_FSYNC\n");
- } else {
- msg("mariabackup: Unrecognized value %s for "
- "innodb_flush_method\n", srv_file_flush_method_str);
- goto fail;
- }
-
-#ifdef _WIN32
- srv_file_flush_method = SRV_ALL_O_DIRECT_FSYNC;
- srv_use_native_aio = TRUE;
-#endif
-
if (srv_buf_pool_size >= 1000 * 1024 * 1024) {
/* Here we still have srv_pool_size counted
in kilobytes (in 4.0 this was in bytes)
@@ -5002,7 +4932,6 @@ xtrabackup_prepare_func(char** argv)
goto error_cleanup;
}
- xb_normalize_init_values();
sync_check_init();
ut_d(sync_check_enable());
ut_crc32_init();
diff --git a/mysql-test/suite/sys_vars/r/innodb_change_buffering_basic.result b/mysql-test/suite/sys_vars/r/innodb_change_buffering_basic.result
index f80ed54100f..92e22c6aa34 100644
--- a/mysql-test/suite/sys_vars/r/innodb_change_buffering_basic.result
+++ b/mysql-test/suite/sys_vars/r/innodb_change_buffering_basic.result
@@ -50,9 +50,11 @@ ERROR HY000: Variable 'innodb_change_buffering' is a GLOBAL variable and should
set global innodb_change_buffering=1.1;
ERROR 42000: Incorrect argument type to variable 'innodb_change_buffering'
set global innodb_change_buffering=1;
-ERROR 42000: Incorrect argument type to variable 'innodb_change_buffering'
+SELECT @@global.innodb_change_buffering;
+@@global.innodb_change_buffering
+inserts
set global innodb_change_buffering=-2;
-ERROR 42000: Incorrect argument type to variable 'innodb_change_buffering'
+ERROR 42000: Variable 'innodb_change_buffering' can't be set to the value of '-2'
set global innodb_change_buffering=1e1;
ERROR 42000: Incorrect argument type to variable 'innodb_change_buffering'
set global innodb_change_buffering='some';
diff --git a/mysql-test/suite/sys_vars/r/innodb_flush_method_basic.result b/mysql-test/suite/sys_vars/r/innodb_flush_method_basic.result
index 4a85748092d..21d56208141 100644
--- a/mysql-test/suite/sys_vars/r/innodb_flush_method_basic.result
+++ b/mysql-test/suite/sys_vars/r/innodb_flush_method_basic.result
@@ -1,27 +1,27 @@
'#---------------------BS_STVARS_029_01----------------------#'
SELECT COUNT(@@GLOBAL.innodb_flush_method);
COUNT(@@GLOBAL.innodb_flush_method)
-0
-0 Expected
+1
+1 Expected
'#---------------------BS_STVARS_029_02----------------------#'
SET @@GLOBAL.innodb_flush_method=1;
ERROR HY000: Variable 'innodb_flush_method' is a read only variable
Expected error 'Read only variable'
SELECT COUNT(@@GLOBAL.innodb_flush_method);
COUNT(@@GLOBAL.innodb_flush_method)
-0
-0 Expected
+1
+1 Expected
'#---------------------BS_STVARS_029_03----------------------#'
SELECT @@GLOBAL.innodb_flush_method = VARIABLE_VALUE
FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
WHERE VARIABLE_NAME='innodb_flush_method';
@@GLOBAL.innodb_flush_method = VARIABLE_VALUE
-NULL
+1
1 Expected
SELECT COUNT(@@GLOBAL.innodb_flush_method);
COUNT(@@GLOBAL.innodb_flush_method)
-0
-0 Expected
+1
+1 Expected
SELECT COUNT(VARIABLE_VALUE)
FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
WHERE VARIABLE_NAME='innodb_flush_method';
@@ -31,13 +31,13 @@ COUNT(VARIABLE_VALUE)
'#---------------------BS_STVARS_029_04----------------------#'
SELECT @@innodb_flush_method = @@GLOBAL.innodb_flush_method;
@@innodb_flush_method = @@GLOBAL.innodb_flush_method
-NULL
+1
1 Expected
'#---------------------BS_STVARS_029_05----------------------#'
SELECT COUNT(@@innodb_flush_method);
COUNT(@@innodb_flush_method)
-0
-0 Expected
+1
+1 Expected
SELECT COUNT(@@local.innodb_flush_method);
ERROR HY000: Variable 'innodb_flush_method' is a GLOBAL variable
Expected error 'Variable is a GLOBAL variable'
@@ -46,8 +46,8 @@ ERROR HY000: Variable 'innodb_flush_method' is a GLOBAL variable
Expected error 'Variable is a GLOBAL variable'
SELECT COUNT(@@GLOBAL.innodb_flush_method);
COUNT(@@GLOBAL.innodb_flush_method)
-0
-0 Expected
+1
+1 Expected
SELECT innodb_flush_method = @@SESSION.innodb_flush_method;
ERROR 42S22: Unknown column 'innodb_flush_method' in 'field list'
Expected error 'Readonly variable'
diff --git a/mysql-test/suite/sys_vars/r/innodb_flush_method_func.result b/mysql-test/suite/sys_vars/r/innodb_flush_method_func.result
new file mode 100644
index 00000000000..a7c8a2d3cc6
--- /dev/null
+++ b/mysql-test/suite/sys_vars/r/innodb_flush_method_func.result
@@ -0,0 +1,15 @@
+call mtr.add_suppression("InnoDB: Failed to set .*DIRECT");
+select @@innodb_flush_method;
+@@innodb_flush_method
+fsync
+create table t(a serial) engine=innodb;
+FLUSH TABLES;
+select @@innodb_flush_method;
+@@innodb_flush_method
+O_DIRECT_NO_FSYNC
+insert into t values(0);
+FLUSH TABLES;
+select @@innodb_flush_method;
+@@innodb_flush_method
+fsync
+drop table t;
diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff b/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff
index 03db1f5c29f..d99d0aeaf35 100644
--- a/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff
+++ b/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff
@@ -293,8 +293,8 @@
GLOBAL_VALUE_ORIGIN CONFIG
DEFAULT_VALUE 16777216
VARIABLE_SCOPE GLOBAL
--VARIABLE_TYPE BIGINT
-+VARIABLE_TYPE INT
+-VARIABLE_TYPE BIGINT UNSIGNED
++VARIABLE_TYPE INT UNSIGNED
VARIABLE_COMMENT The size of the buffer which InnoDB uses to write log to the log files on disk.
NUMERIC_MIN_VALUE 262144
-NUMERIC_MAX_VALUE 9223372036854775807
diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb.result b/mysql-test/suite/sys_vars/r/sysvars_innodb.result
index 611eee7418b..74152628562 100644
--- a/mysql-test/suite/sys_vars/r/sysvars_innodb.result
+++ b/mysql-test/suite/sys_vars/r/sysvars_innodb.result
@@ -363,12 +363,12 @@ GLOBAL_VALUE all
GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE all
VARIABLE_SCOPE GLOBAL
-VARIABLE_TYPE VARCHAR
-VARIABLE_COMMENT Buffer changes to reduce random access: OFF, ON, inserting, deleting, changing, or purging.
+VARIABLE_TYPE ENUM
+VARIABLE_COMMENT Buffer changes to secondary indexes.
NUMERIC_MIN_VALUE NULL
NUMERIC_MAX_VALUE NULL
NUMERIC_BLOCK_SIZE NULL
-ENUM_VALUE_LIST NULL
+ENUM_VALUE_LIST none,inserts,deletes,changes,purges,all
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME INNODB_CHANGE_BUFFERING_DEBUG
@@ -543,7 +543,7 @@ VARIABLE_NAME INNODB_DATA_FILE_PATH
SESSION_VALUE NULL
GLOBAL_VALUE ibdata1:12M:autoextend
GLOBAL_VALUE_ORIGIN CONFIG
-DEFAULT_VALUE
+DEFAULT_VALUE ibdata1:12M:autoextend
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE VARCHAR
VARIABLE_COMMENT Path to individual files and their sizes.
@@ -989,16 +989,16 @@ READ_ONLY NO
COMMAND_LINE_ARGUMENT OPTIONAL
VARIABLE_NAME INNODB_FLUSH_METHOD
SESSION_VALUE NULL
-GLOBAL_VALUE
+GLOBAL_VALUE fsync
GLOBAL_VALUE_ORIGIN COMPILE-TIME
-DEFAULT_VALUE
+DEFAULT_VALUE fsync
VARIABLE_SCOPE GLOBAL
-VARIABLE_TYPE VARCHAR
+VARIABLE_TYPE ENUM
VARIABLE_COMMENT With which method to flush data.
NUMERIC_MIN_VALUE NULL
NUMERIC_MAX_VALUE NULL
NUMERIC_BLOCK_SIZE NULL
-ENUM_VALUE_LIST NULL
+ENUM_VALUE_LIST fsync,O_DSYNC,littlesync,nosync,O_DIRECT,O_DIRECT_NO_FSYNC
READ_ONLY YES
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME INNODB_FLUSH_NEIGHBORS
@@ -1357,7 +1357,7 @@ GLOBAL_VALUE 1048576
GLOBAL_VALUE_ORIGIN CONFIG
DEFAULT_VALUE 16777216
VARIABLE_SCOPE GLOBAL
-VARIABLE_TYPE BIGINT
+VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT The size of the buffer which InnoDB uses to write log to the log files on disk.
NUMERIC_MIN_VALUE 262144
NUMERIC_MAX_VALUE 9223372036854775807
@@ -2251,7 +2251,7 @@ VARIABLE_NAME INNODB_TEMP_DATA_FILE_PATH
SESSION_VALUE NULL
GLOBAL_VALUE ibtmp1:12M:autoextend
GLOBAL_VALUE_ORIGIN COMPILE-TIME
-DEFAULT_VALUE
+DEFAULT_VALUE ibtmp1:12M:autoextend
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE VARCHAR
VARIABLE_COMMENT Path to files and their sizes making temp-tablespace.
diff --git a/mysql-test/suite/sys_vars/t/innodb_change_buffering_basic.test b/mysql-test/suite/sys_vars/t/innodb_change_buffering_basic.test
index aba3b1e3479..19f0890feff 100644
--- a/mysql-test/suite/sys_vars/t/innodb_change_buffering_basic.test
+++ b/mysql-test/suite/sys_vars/t/innodb_change_buffering_basic.test
@@ -48,9 +48,9 @@ set @@session.innodb_change_buffering='some';
#
--error ER_WRONG_TYPE_FOR_VAR
set global innodb_change_buffering=1.1;
---error ER_WRONG_TYPE_FOR_VAR
set global innodb_change_buffering=1;
---error ER_WRONG_TYPE_FOR_VAR
+SELECT @@global.innodb_change_buffering;
+--error ER_WRONG_VALUE_FOR_VAR
set global innodb_change_buffering=-2;
--error ER_WRONG_TYPE_FOR_VAR
set global innodb_change_buffering=1e1;
diff --git a/mysql-test/suite/sys_vars/t/innodb_flush_method_basic.test b/mysql-test/suite/sys_vars/t/innodb_flush_method_basic.test
index 9f99c1305fd..76a9ed9cefd 100644
--- a/mysql-test/suite/sys_vars/t/innodb_flush_method_basic.test
+++ b/mysql-test/suite/sys_vars/t/innodb_flush_method_basic.test
@@ -29,7 +29,7 @@
# Displaying default value #
####################################################################
SELECT COUNT(@@GLOBAL.innodb_flush_method);
---echo 0 Expected
+--echo 1 Expected
--echo '#---------------------BS_STVARS_029_02----------------------#'
@@ -42,7 +42,7 @@ SET @@GLOBAL.innodb_flush_method=1;
--echo Expected error 'Read only variable'
SELECT COUNT(@@GLOBAL.innodb_flush_method);
---echo 0 Expected
+--echo 1 Expected
@@ -60,7 +60,7 @@ WHERE VARIABLE_NAME='innodb_flush_method';
--echo 1 Expected
SELECT COUNT(@@GLOBAL.innodb_flush_method);
---echo 0 Expected
+--echo 1 Expected
--disable_warnings
SELECT COUNT(VARIABLE_VALUE)
@@ -86,7 +86,7 @@ SELECT @@innodb_flush_method = @@GLOBAL.innodb_flush_method;
################################################################################
SELECT COUNT(@@innodb_flush_method);
---echo 0 Expected
+--echo 1 Expected
--Error ER_INCORRECT_GLOBAL_LOCAL_VAR
SELECT COUNT(@@local.innodb_flush_method);
@@ -97,7 +97,7 @@ SELECT COUNT(@@SESSION.innodb_flush_method);
--echo Expected error 'Variable is a GLOBAL variable'
SELECT COUNT(@@GLOBAL.innodb_flush_method);
---echo 0 Expected
+--echo 1 Expected
--Error ER_BAD_FIELD_ERROR
SELECT innodb_flush_method = @@SESSION.innodb_flush_method;
diff --git a/mysql-test/suite/sys_vars/t/innodb_flush_method_func.test b/mysql-test/suite/sys_vars/t/innodb_flush_method_func.test
new file mode 100644
index 00000000000..aad91d0f4a3
--- /dev/null
+++ b/mysql-test/suite/sys_vars/t/innodb_flush_method_func.test
@@ -0,0 +1,26 @@
+--source include/have_innodb.inc
+# Embedded server tests do not support restarting.
+--source include/not_embedded.inc
+
+call mtr.add_suppression("InnoDB: Failed to set .*DIRECT");
+--replace_result unbuffered fsync
+select @@innodb_flush_method;
+
+create table t(a serial) engine=innodb;
+
+# kill and restart
+FLUSH TABLES;
+let $shutdown_timeout= 0;
+let $restart_parameters=--innodb-flush-method=5;
+--source include/restart_mysqld.inc
+select @@innodb_flush_method;
+
+insert into t values(0);
+# kill and restart
+FLUSH TABLES;
+let $shutdown_timeout= 0;
+let $restart_parameters=--innodb-flush-method=0;
+--source include/restart_mysqld.inc
+select @@innodb_flush_method;
+
+drop table t;
diff --git a/storage/innobase/btr/btr0sea.cc b/storage/innobase/btr/btr0sea.cc
index a2aeea28e60..bba2b3fbe72 100644
--- a/storage/innobase/btr/btr0sea.cc
+++ b/storage/innobase/btr/btr0sea.cc
@@ -224,8 +224,7 @@ btr_search_check_free_space_in_heap(const dict_index_t* index)
/** Creates and initializes the adaptive search system at a database start.
@param[in] hash_size hash table size. */
-void
-btr_search_sys_create(ulint hash_size)
+void btr_search_sys_create(ulint hash_size)
{
/* Search System is divided into n parts.
Each part controls access to distinct set of hash buckets from
@@ -266,8 +265,7 @@ btr_search_sys_create(ulint hash_size)
/** Resize hash index hash table.
@param[in] hash_size hash index hash table size */
-void
-btr_search_sys_resize(ulint hash_size)
+void btr_search_sys_resize(ulint hash_size)
{
/* Step-1: Lock all search latches in exclusive mode. */
btr_search_x_lock_all();
@@ -303,10 +301,14 @@ btr_search_sys_resize(ulint hash_size)
}
/** Frees the adaptive search system at a database shutdown. */
-void
-btr_search_sys_free()
+void btr_search_sys_free()
{
- ut_ad(btr_search_sys != NULL && btr_search_latches != NULL);
+ if (!btr_search_sys) {
+ ut_ad(!btr_search_latches);
+ return;
+ }
+
+ ut_ad(btr_search_latches);
/* Step-1: Release the hash tables. */
for (ulint i = 0; i < btr_ahi_parts; ++i) {
@@ -351,9 +353,7 @@ btr_search_disable_ref_count(
/** Disable the adaptive hash search system and empty the index.
@param[in] need_mutex need to acquire dict_sys->mutex */
-void
-btr_search_disable(
- bool need_mutex)
+void btr_search_disable(bool need_mutex)
{
dict_table_t* table;
@@ -406,8 +406,7 @@ btr_search_disable(
}
/** Enable the adaptive hash search system. */
-void
-btr_search_enable()
+void btr_search_enable()
{
buf_pool_mutex_enter_all();
if (srv_buf_pool_old_size != srv_buf_pool_size) {
@@ -1080,8 +1079,7 @@ fail:
block->buf_fix_count == 0 or it is an index page which
has already been removed from the buf_pool->page_hash
i.e.: it is in state BUF_BLOCK_REMOVE_HASH */
-void
-btr_search_drop_page_hash_index(buf_block_t* block)
+void btr_search_drop_page_hash_index(buf_block_t* block)
{
ulint n_fields;
ulint n_bytes;
@@ -1652,8 +1650,7 @@ btr_search_move_or_delete_hash_entries(
/** Updates the page hash index when a single record is deleted from a page.
@param[in] cursor cursor which was positioned on the record to delete
using btr_cur_search_, the record is not yet deleted.*/
-void
-btr_search_update_hash_on_delete(btr_cur_t* cursor)
+void btr_search_update_hash_on_delete(btr_cur_t* cursor)
{
hash_table_t* table;
buf_block_t* block;
diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc
index f55029c3cf6..6e1c5c1ff5b 100644
--- a/storage/innobase/buf/buf0buf.cc
+++ b/storage/innobase/buf/buf0buf.cc
@@ -1192,11 +1192,11 @@ buf_madvise_do_dump()
buf_chunk_t* chunk;
/* mirrors allocation in log_sys_init() */
- if (log_sys->buf)
- {
- ret+= madvise(log_sys->first_in_use ? log_sys->buf
- : log_sys->buf - log_sys->buf_size,
- log_sys->buf_size,
+ if (log_sys->buf) {
+ ret+= madvise(log_sys->first_in_use
+ ? log_sys->buf
+ : log_sys->buf - srv_log_buffer_size,
+ srv_log_buffer_size * 2,
MADV_DODUMP);
}
/* mirrors recv_sys_init() */
diff --git a/storage/innobase/dict/dict0dict.cc b/storage/innobase/dict/dict0dict.cc
index 2d5c0651271..dbad7a8fa31 100644
--- a/storage/innobase/dict/dict0dict.cc
+++ b/storage/innobase/dict/dict0dict.cc
@@ -6702,11 +6702,18 @@ void
dict_close(void)
/*============*/
{
- ulint i;
+ if (dict_sys == NULL) {
+ /* This should only happen if a failure occurred
+ during redo log processing. */
+ return;
+ }
+
+ /* Acquire only because it's a pre-condition. */
+ mutex_enter(&dict_sys->mutex);
/* Free the hash elements. We don't remove them from the table
because we are going to destroy the table anyway. */
- for (i = 0; i < hash_get_n_cells(dict_sys->table_hash); i++) {
+ for (ulint i = 0; i < hash_get_n_cells(dict_sys->table_id_hash); i++) {
dict_table_t* table;
table = static_cast<dict_table_t*>(
@@ -6718,12 +6725,7 @@ dict_close(void)
table = static_cast<dict_table_t*>(
HASH_GET_NEXT(name_hash, prev_table));
ut_ad(prev_table->magic_n == DICT_TABLE_MAGIC_N);
- /* Acquire only because it's a pre-condition. */
- mutex_enter(&dict_sys->mutex);
-
dict_table_remove_from_cache(prev_table);
-
- mutex_exit(&dict_sys->mutex);
}
}
@@ -6733,6 +6735,7 @@ dict_close(void)
therefore we don't delete the individual elements. */
hash_table_free(dict_sys->table_id_hash);
+ mutex_exit(&dict_sys->mutex);
mutex_free(&dict_sys->mutex);
rw_lock_free(dict_operation_lock);
@@ -6742,6 +6745,11 @@ dict_close(void)
mutex_free(&dict_foreign_err_mutex);
+ if (dict_foreign_err_file) {
+ fclose(dict_foreign_err_file);
+ dict_foreign_err_file = NULL;
+ }
+
ut_free(dict_sys);
dict_sys = NULL;
diff --git a/storage/innobase/dict/dict0stats_bg.cc b/storage/innobase/dict/dict0stats_bg.cc
index 6c9a17c8a7c..9553eed8d97 100644
--- a/storage/innobase/dict/dict0stats_bg.cc
+++ b/storage/innobase/dict/dict0stats_bg.cc
@@ -110,6 +110,7 @@ dict_stats_recalc_pool_deinit()
recalc_pool->clear();
UT_DELETE(recalc_pool);
+ recalc_pool = NULL;
}
/*****************************************************************//**
@@ -307,6 +308,10 @@ dict_stats_thread_deinit()
ut_a(!srv_read_only_mode);
ut_ad(!srv_dict_stats_thread_active);
+ if (recalc_pool == NULL) {
+ return;
+ }
+
dict_stats_recalc_pool_deinit();
dict_defrag_pool_deinit();
diff --git a/storage/innobase/fsp/fsp0sysspace.cc b/storage/innobase/fsp/fsp0sysspace.cc
index 1c1c9417f1f..2a120989532 100644
--- a/storage/innobase/fsp/fsp0sysspace.cc
+++ b/storage/innobase/fsp/fsp0sysspace.cc
@@ -942,7 +942,7 @@ SysTablespace::open_or_create(
/** Normalize the file size, convert from megabytes to number of pages. */
void
-SysTablespace::normalize()
+SysTablespace::normalize_size()
{
files_t::iterator end = m_files.end();
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index 00a20a72cec..1989802bd15 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -187,12 +187,9 @@ static const long AUTOINC_OLD_STYLE_LOCKING = 0;
static const long AUTOINC_NEW_STYLE_LOCKING = 1;
static const long AUTOINC_NO_LOCKING = 2;
-static long innobase_log_buffer_size;
static ulong innobase_open_files;
static long innobase_autoinc_lock_mode;
-static ulong innobase_commit_concurrency = 0;
-static ulong innobase_read_io_threads;
-static ulong innobase_write_io_threads;
+static ulong innobase_commit_concurrency;
static ulonglong innobase_buffer_pool_size;
@@ -200,19 +197,20 @@ static ulonglong innobase_buffer_pool_size;
Connected to buf_LRU_old_ratio. */
static uint innobase_old_blocks_pct;
+static char* innobase_data_file_path;
+static char* innobase_temp_data_file_path;
+
/* The default values for the following char* start-up parameters
-are determined in innobase_init below: */
+are determined in innodb_init_params(). */
static char* innobase_data_home_dir;
-static char* innobase_data_file_path;
-static char* innobase_temp_data_file_path;
-static char* innobase_change_buffering;
static char* innobase_enable_monitor_counter;
static char* innobase_disable_monitor_counter;
static char* innobase_reset_monitor_counter;
static char* innobase_reset_all_monitor_counter;
-static char* innobase_file_flush_method;
+static ulong innodb_change_buffering;
+static ulong innodb_flush_method;
/* This variable can be set in the server configure file, specifying
stopword table to be used */
@@ -222,7 +220,6 @@ static char* innobase_server_stopword_table;
values */
static my_bool innobase_use_atomic_writes;
-static my_bool innobase_use_doublewrite;
static my_bool innobase_use_checksums;
static my_bool innobase_locks_unsafe_for_binlog;
static my_bool innobase_rollback_on_timeout;
@@ -433,6 +430,30 @@ static TYPELIB innodb_lock_schedule_algorithm_typelib = {
NULL
};
+/** Names of allowed values of innodb_flush_method */
+static const char* innodb_flush_method_names[] = {
+ "fsync",
+ "O_DSYNC",
+ "littlesync",
+ "nosync",
+ "O_DIRECT",
+ "O_DIRECT_NO_FSYNC",
+#ifdef _WIN32
+ "unbuffered",
+ "async_unbuffered" /* alias for "unbuffered" */,
+ "normal" /* alias for "fsync" */,
+#endif
+ NullS
+};
+
+/** Enumeration of innodb_flush_method */
+static TYPELIB innodb_flush_method_typelib = {
+ array_elements(innodb_flush_method_names) - 1,
+ "innodb_flush_method_typelib",
+ innodb_flush_method_names,
+ NULL
+};
+
/* The following counter is used to convey information to InnoDB
about server activity: in case of normal DML ops it is not
sensible to call srv_active_wake_master_thread after each
@@ -444,13 +465,22 @@ static ulong innobase_active_counter = 0;
static hash_table_t* innobase_open_tables;
/** Allowed values of innodb_change_buffering */
-static const char* innobase_change_buffering_values[IBUF_USE_COUNT] = {
+static const char* innodb_change_buffering_names[] = {
"none", /* IBUF_USE_NONE */
"inserts", /* IBUF_USE_INSERT */
"deletes", /* IBUF_USE_DELETE_MARK */
"changes", /* IBUF_USE_INSERT_DELETE_MARK */
"purges", /* IBUF_USE_DELETE */
- "all" /* IBUF_USE_ALL */
+ "all", /* IBUF_USE_ALL */
+ NullS
+};
+
+/** Enumeration of innodb_change_buffering */
+static TYPELIB innodb_change_buffering_typelib = {
+ array_elements(innodb_change_buffering_names) - 1,
+ "innodb_change_buffering_typelib",
+ innodb_change_buffering_names,
+ NULL
};
/** Retrieve the FTS Relevance Ranking result for doc with doc_id
@@ -3486,28 +3516,15 @@ innobase_space_shutdown()
DBUG_VOID_RETURN;
}
-/*********************************************************************//**
-Free any resources that were allocated and return failure.
+/** Free any resources that were allocated and return failure.
@return always return 1 */
-static
-int
-innobase_init_abort()
-/*=================*/
+static int innodb_init_abort()
{
- DBUG_ENTER("innobase_init_abort");
+ DBUG_ENTER("innodb_init_abort");
innobase_space_shutdown();
DBUG_RETURN(1);
}
-/** Return partitioning flags. */
-static uint innobase_partition_flags()
-{
- /* JAN: TODO: MYSQL 5.7
- return(HA_CAN_EXCHANGE_PARTITION | HA_CANNOT_PARTITION_FK);
- */
- return (0);
-}
-
/** Update log_checksum_algorithm_ptr with a pointer to the function
corresponding to whether checksums are enabled.
@param[in,out] thd client session, or NULL if at startup
@@ -3584,117 +3601,90 @@ static ulonglong innodb_prepare_commit_versioned(THD* thd, ulonglong *trx_id)
return 0;
}
-/*********************************************************************//**
-Opens an InnoDB database.
-@return 0 on success, 1 on failure */
-static
-int
-innobase_init(
-/*==========*/
- void *p) /*!< in: InnoDB handlerton */
+/** Initialize and normalize innodb_buffer_pool_size. */
+static void innodb_buffer_pool_size_init()
+{
+ if (srv_buf_pool_size >= BUF_POOL_SIZE_THRESHOLD) {
+
+ if (srv_buf_pool_instances == srv_buf_pool_instances_default) {
+#if defined(_WIN32) && !defined(_WIN64)
+ /* Do not allocate too large of a buffer pool on
+ Windows 32-bit systems, which can have trouble
+ allocating larger single contiguous memory blocks. */
+ srv_buf_pool_size = ulint(
+ ut_uint64_align_up(srv_buf_pool_size,
+ srv_buf_pool_chunk_unit));
+ srv_buf_pool_instances = std::min<ulong>(
+ MAX_BUFFER_POOLS,
+ ulong(srv_buf_pool_size
+ / srv_buf_pool_chunk_unit));
+#else /* defined(_WIN32) && !defined(_WIN64) */
+ /* Default to 8 instances when size > 1GB. */
+ srv_buf_pool_instances = 8;
+#endif /* defined(_WIN32) && !defined(_WIN64) */
+ }
+ } else {
+ /* If buffer pool is less than 1 GiB, assume fewer
+ threads. Also use only one buffer pool instance. */
+ if (srv_buf_pool_instances != srv_buf_pool_instances_default
+ && srv_buf_pool_instances != 1) {
+ /* We can't distinguish whether the user has explicitly
+ started mysqld with --innodb-buffer-pool-instances=0,
+ (srv_buf_pool_instances_default is 0) or has not
+ specified that option at all. Thus we have the
+ limitation that if the user started with =0, we
+ will not emit a warning here, but we should actually
+ do so. */
+ ib::info()
+ << "Adjusting innodb_buffer_pool_instances"
+ " from " << srv_buf_pool_instances << " to 1"
+ " since innodb_buffer_pool_size is less than "
+ << BUF_POOL_SIZE_THRESHOLD / (1024 * 1024)
+ << " MiB";
+ }
+
+ srv_buf_pool_instances = 1;
+ }
+
+ if (srv_buf_pool_chunk_unit * srv_buf_pool_instances
+ > srv_buf_pool_size) {
+ /* Size unit of buffer pool is larger than srv_buf_pool_size.
+ adjust srv_buf_pool_chunk_unit for srv_buf_pool_size. */
+ srv_buf_pool_chunk_unit
+ = static_cast<ulong>(srv_buf_pool_size)
+ / srv_buf_pool_instances;
+ if (srv_buf_pool_size % srv_buf_pool_instances != 0) {
+ ++srv_buf_pool_chunk_unit;
+ }
+ }
+
+ srv_buf_pool_size = buf_pool_size_align(srv_buf_pool_size);
+ innobase_buffer_pool_size = srv_buf_pool_size;
+}
+
+/** Initialize, validate and normalize the InnoDB startup parameters.
+@return failure code
+@retval 0 on success
+@retval HA_ERR_OUT_OF_MEM when out of memory
+@retval HA_ERR_INITIALIZATION when some parameters are out of range */
+static int innodb_init_params()
{
- static char current_dir[3]; /*!< Set if using current lib */
- int err;
+ DBUG_ENTER("innodb_init_params");
+
+ static char current_dir[3];
char *default_path;
ulong num_pll_degree;
- DBUG_ENTER("innobase_init");
- handlerton* innobase_hton= (handlerton*) p;
- innodb_hton_ptr = innobase_hton;
-
- innobase_hton->state = SHOW_OPTION_YES;
- innobase_hton->db_type = DB_TYPE_INNODB;
- innobase_hton->savepoint_offset = sizeof(trx_named_savept_t);
- innobase_hton->close_connection = innobase_close_connection;
- innobase_hton->kill_query = innobase_kill_query;
- innobase_hton->savepoint_set = innobase_savepoint;
- innobase_hton->savepoint_rollback = innobase_rollback_to_savepoint;
-
- innobase_hton->savepoint_rollback_can_release_mdl =
- innobase_rollback_to_savepoint_can_release_mdl;
-
- innobase_hton->savepoint_release = innobase_release_savepoint;
- innobase_hton->prepare_ordered= NULL;
- innobase_hton->commit_ordered= innobase_commit_ordered;
- innobase_hton->commit = innobase_commit;
- innobase_hton->rollback = innobase_rollback;
- innobase_hton->prepare = innobase_xa_prepare;
- innobase_hton->recover = innobase_xa_recover;
- innobase_hton->commit_by_xid = innobase_commit_by_xid;
- innobase_hton->rollback_by_xid = innobase_rollback_by_xid;
- innobase_hton->commit_checkpoint_request=innobase_checkpoint_request;
- innobase_hton->create = innobase_create_handler;
-
- innobase_hton->drop_database = innobase_drop_database;
- innobase_hton->panic = innobase_end;
- innobase_hton->partition_flags= innobase_partition_flags;
-
- innobase_hton->start_consistent_snapshot =
- innobase_start_trx_and_assign_read_view;
-
- innobase_hton->flush_logs = innobase_flush_logs;
- innobase_hton->show_status = innobase_show_status;
- innobase_hton->flags =
- HTON_SUPPORTS_EXTENDED_KEYS | HTON_SUPPORTS_FOREIGN_KEYS | HTON_NATIVE_SYS_VERSIONING;
-
-#ifdef WITH_WSREP
- innobase_hton->abort_transaction=wsrep_abort_transaction;
- innobase_hton->set_checkpoint=innobase_wsrep_set_checkpoint;
- innobase_hton->get_checkpoint=innobase_wsrep_get_checkpoint;
- innobase_hton->fake_trx_id=wsrep_fake_trx_id;
-#endif /* WITH_WSREP */
-
- if (srv_file_per_table) {
- innobase_hton->tablefile_extensions = ha_innobase_exts;
- }
-
- innobase_hton->table_options = innodb_table_option_list;
-
- /* System Versioning */
- innobase_hton->prepare_commit_versioned
- = innodb_prepare_commit_versioned;
-
- innodb_remember_check_sysvar_funcs();
-
- ut_a(DATA_MYSQL_TRUE_VARCHAR == (ulint)MYSQL_TYPE_VARCHAR);
-
-#ifndef DBUG_OFF
- static const char test_filename[] = "-@";
- char test_tablename[sizeof test_filename
- + sizeof(srv_mysql50_table_name_prefix) - 1];
- if ((sizeof(test_tablename)) - 1
- != filename_to_tablename(test_filename,
- test_tablename,
- sizeof(test_tablename), true)
- || strncmp(test_tablename,
- srv_mysql50_table_name_prefix,
- sizeof(srv_mysql50_table_name_prefix) - 1)
- || strcmp(test_tablename
- + sizeof(srv_mysql50_table_name_prefix) - 1,
- test_filename)) {
-
- sql_print_error("tablename encoding has been changed");
- DBUG_RETURN(innobase_init_abort());
- }
-#endif /* DBUG_OFF */
-
/* Check that values don't overflow on 32-bit systems. */
if (sizeof(ulint) == 4) {
if (innobase_buffer_pool_size > UINT_MAX32) {
sql_print_error(
"innodb_buffer_pool_size can't be over 4GB"
" on 32-bit systems");
-
- DBUG_RETURN(innobase_init_abort());
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
}
- os_file_set_umask(my_umask);
-
- /* Setup the memory alloc/free tracing mechanisms before calling
- any functions that could possibly allocate memory. */
- ut_new_boot();
-
/* The buffer pool needs to be able to accommodate enough many
pages, even for larger pages */
if (srv_page_size > UNIV_PAGE_SIZE_DEF
@@ -3703,7 +3693,7 @@ innobase_init(
<< srv_page_size << " requires "
<< "innodb_buffer_pool_size > 24M current "
<< innobase_buffer_pool_size;
- goto error;
+ DBUG_RETURN(HA_ERR_INITIALIZATION);
}
#ifdef WITH_WSREP
@@ -3720,7 +3710,7 @@ innobase_init(
sql_print_error("InnoDB: innodb_compression_algorithm = %lu unsupported.\n"
"InnoDB: liblz4 is not installed. \n",
innodb_compression_algorithm);
- goto error;
+ DBUG_RETURN(HA_ERR_INITIALIZATION);
}
#endif
@@ -3729,7 +3719,7 @@ innobase_init(
sql_print_error("InnoDB: innodb_compression_algorithm = %lu unsupported.\n"
"InnoDB: liblzo is not installed. \n",
innodb_compression_algorithm);
- goto error;
+ DBUG_RETURN(HA_ERR_INITIALIZATION);
}
#endif
@@ -3738,7 +3728,7 @@ innobase_init(
sql_print_error("InnoDB: innodb_compression_algorithm = %lu unsupported.\n"
"InnoDB: liblzma is not installed. \n",
innodb_compression_algorithm);
- goto error;
+ DBUG_RETURN(HA_ERR_INITIALIZATION);
}
#endif
@@ -3747,7 +3737,7 @@ innobase_init(
sql_print_error("InnoDB: innodb_compression_algorithm = %lu unsupported.\n"
"InnoDB: libbz2 is not installed. \n",
innodb_compression_algorithm);
- goto error;
+ DBUG_RETURN(HA_ERR_INITIALIZATION);
}
#endif
@@ -3756,7 +3746,7 @@ innobase_init(
sql_print_error("InnoDB: innodb_compression_algorithm = %lu unsupported.\n"
"InnoDB: libsnappy is not installed. \n",
innodb_compression_algorithm);
- goto error;
+ DBUG_RETURN(HA_ERR_INITIALIZATION);
}
#endif
@@ -3764,9 +3754,18 @@ innobase_init(
&& !encryption_key_id_exists(FIL_DEFAULT_ENCRYPTION_KEY)) {
sql_print_error("InnoDB: cannot enable encryption, "
"encryption plugin is not available");
- goto error;
+ DBUG_RETURN(HA_ERR_INITIALIZATION);
}
+#ifdef _WIN32
+ if (!is_filename_allowed(srv_buf_dump_filename,
+ strlen(srv_buf_dump_filename), FALSE)) {
+ sql_print_error("InnoDB: innodb_buffer_pool_filename"
+ " cannot have colon (:) in the file name.");
+ DBUG_RETURN(HA_ERR_INITIALIZATION);
+ }
+#endif
+
/* First calculate the default path for innodb_data_home_dir etc.,
in case the user has not given any value.
@@ -3804,13 +3803,7 @@ innobase_init(
if (!srv_page_size_shift) {
sql_print_error("InnoDB: Invalid page size=%lu.\n",
srv_page_size);
- DBUG_RETURN(innobase_init_abort());
- }
-
- /* Set default InnoDB temp data file size to 12 MB and let it be
- auto-extending. */
- if (!innobase_data_file_path) {
- innobase_data_file_path = (char*) "ibdata1:12M:autoextend";
+ DBUG_RETURN(HA_ERR_INITIALIZATION);
}
/* This is the first time univ_page_size is used.
@@ -3825,34 +3818,27 @@ innobase_init(
/* Supports raw devices */
if (!srv_sys_space.parse_params(innobase_data_file_path, true)) {
- DBUG_RETURN(innobase_init_abort());
+ DBUG_RETURN(HA_ERR_INITIALIZATION);
}
- /* Set default InnoDB temp data file size to 12 MB and let it be
- auto-extending. */
-
- if (!innobase_temp_data_file_path) {
- innobase_temp_data_file_path = (char*) "ibtmp1:12M:autoextend";
- }
-
- /* We set the temporary tablspace id later, after recovery.
- The temp tablespace doesn't support raw devices.
- Set the name and path. */
srv_tmp_space.set_name("innodb_temporary");
srv_tmp_space.set_path(srv_data_home);
srv_tmp_space.set_flags(FSP_FLAGS_PAGE_SSIZE());
if (!srv_tmp_space.parse_params(innobase_temp_data_file_path, false)) {
- DBUG_RETURN(innobase_init_abort());
+ DBUG_RETURN(HA_ERR_INITIALIZATION);
}
/* Perform all sanity check before we take action of deleting files*/
if (srv_sys_space.intersection(&srv_tmp_space)) {
sql_print_error("%s and %s file names seem to be the same.",
srv_tmp_space.name(), srv_sys_space.name());
- DBUG_RETURN(innobase_init_abort());
+ DBUG_RETURN(HA_ERR_INITIALIZATION);
}
+ srv_sys_space.normalize_size();
+ srv_tmp_space.normalize_size();
+
/* ------------ UNDO tablespaces files ---------------------*/
if (!srv_undo_dir) {
srv_undo_dir = default_path;
@@ -3862,7 +3848,7 @@ innobase_init(
if (strchr(srv_undo_dir, ';')) {
sql_print_error("syntax error in innodb_undo_directory");
- DBUG_RETURN(innobase_init_abort());
+ DBUG_RETURN(HA_ERR_INITIALIZATION);
}
/* -------------- All log files ---------------------------*/
@@ -3877,33 +3863,22 @@ innobase_init(
if (strchr(srv_log_group_home_dir, ';')) {
sql_print_error("syntax error in innodb_log_group_home_dir");
- DBUG_RETURN(innobase_init_abort());
+ DBUG_RETURN(HA_ERR_INITIALIZATION);
}
- if (innobase_change_buffering) {
- ulint use;
-
- for (use = 0;
- use < UT_ARR_SIZE(innobase_change_buffering_values);
- use++) {
- if (!innobase_strcasecmp(
- innobase_change_buffering,
- innobase_change_buffering_values[use])) {
- ibuf_use = (ibuf_use_t) use;
- goto innobase_change_buffering_inited_ok;
- }
- }
-
- sql_print_error("InnoDB: invalid value"
- " innodb_change_buffering=%s",
- innobase_change_buffering);
- DBUG_RETURN(innobase_init_abort());
+ if (srv_n_log_files * srv_log_file_size
+ >= 512ULL * 1024ULL * 1024ULL * 1024ULL) {
+ /* log_block_convert_lsn_to_no() limits the returned block
+ number to 1G and given that OS_FILE_LOG_BLOCK_SIZE is 512
+ bytes, then we have a limit of 512 GB. If that limit is to
+ be raised, then log_block_convert_lsn_to_no() must be
+ modified. */
+ ib::error() << "Combined size of log files must be < 512 GB";
+ DBUG_RETURN(HA_ERR_INITIALIZATION);
}
-innobase_change_buffering_inited_ok:
- ut_a((ulint) ibuf_use < UT_ARR_SIZE(innobase_change_buffering_values));
- innobase_change_buffering = (char*)
- innobase_change_buffering_values[ibuf_use];
+ DBUG_ASSERT(innodb_change_buffering <= IBUF_USE_ALL);
+ ibuf_use = ibuf_use_t(innodb_change_buffering);
/* Check that interdependent parameters have sane values. */
if (srv_max_buf_pool_modified_pct < srv_max_dirty_pages_pct_lwm) {
@@ -3939,17 +3914,6 @@ innobase_change_buffering_inited_ok:
srv_io_capacity = srv_max_io_capacity;
}
- if (!is_filename_allowed(srv_buf_dump_filename,
- strlen(srv_buf_dump_filename), FALSE)) {
- sql_print_error("InnoDB: innodb_buffer_pool_filename"
- " cannot have colon (:) in the file name.");
- DBUG_RETURN(innobase_init_abort());
- }
-
- /* --------------------------------------------------*/
-
- srv_file_flush_method_str = innobase_file_flush_method;
-
if (UNIV_PAGE_SIZE_DEF != srv_page_size) {
ib::info() << "innodb_page_size=" << srv_page_size;
@@ -3976,15 +3940,8 @@ innobase_change_buffering_inited_ok:
}
}
- srv_log_buffer_size = (ulint) innobase_log_buffer_size;
-
srv_buf_pool_size = ulint(innobase_buffer_pool_size);
- srv_n_read_io_threads = (ulint) innobase_read_io_threads;
- srv_n_write_io_threads = (ulint) innobase_write_io_threads;
-
- srv_use_doublewrite_buf = (ibool) innobase_use_doublewrite;
-
if (!innobase_use_checksums) {
ib::warn() << "Setting innodb_checksums to OFF is DEPRECATED."
" This option may be removed in future releases. You"
@@ -4064,15 +4021,153 @@ innobase_change_buffering_inited_ok:
unbuffered)
*/
#ifndef _WIN32
- if (!innobase_file_flush_method ||
- !strstr(innobase_file_flush_method, "O_DIRECT")) {
- innobase_file_flush_method =
- srv_file_flush_method_str = (char*)"O_DIRECT";
+ switch (innodb_flush_method) {
+ case SRV_O_DIRECT:
+ case SRV_O_DIRECT_NO_FSYNC:
+ break;
+ default:
+ innodb_flush_method = SRV_O_DIRECT;
fprintf(stderr, "InnoDB: using O_DIRECT due to atomic writes.\n");
}
#endif
}
+ if (srv_read_only_mode) {
+ ib::info() << "Started in read only mode";
+ srv_use_doublewrite_buf = FALSE;
+ }
+
+#ifdef LINUX_NATIVE_AIO
+ if (srv_use_native_aio) {
+ ib::info() << "Using Linux native AIO";
+ }
+#elif !defined _WIN32
+ /* Currently native AIO is supported only on windows and linux
+ and that also when the support is compiled in. In all other
+ cases, we ignore the setting of innodb_use_native_aio. */
+ srv_use_native_aio = FALSE;
+#endif
+
+#ifndef _WIN32
+ ut_ad(innodb_flush_method <= SRV_O_DIRECT_NO_FSYNC);
+#else
+ switch (innodb_flush_method) {
+ case SRV_ALL_O_DIRECT_FSYNC + 1 /* "async_unbuffered"="unbuffered" */:
+ innodb_flush_method = SRV_ALL_O_DIRECT_FSYNC;
+ break;
+ case SRV_ALL_O_DIRECT_FSYNC + 2 /* "normal"="fsync" */:
+ innodb_flush_method = SRV_FSYNC;
+ break;
+ default:
+ ut_ad(innodb_flush_method <= SRV_ALL_O_DIRECT_FSYNC);
+ }
+#endif
+ srv_file_flush_method = srv_flush_t(innodb_flush_method);
+
+ innodb_buffer_pool_size_init();
+
+ if (srv_n_page_cleaners > srv_buf_pool_instances) {
+ /* limit of page_cleaner parallelizability
+ is number of buffer pool instances. */
+ srv_n_page_cleaners = srv_buf_pool_instances;
+ }
+
+ srv_lock_table_size = 5 * (srv_buf_pool_size >> srv_page_size_shift);
+ DBUG_RETURN(0);
+}
+
+/** Initialize the InnoDB storage engine plugin.
+@param[in,out] p InnoDB handlerton
+@return error code
+@retval 0 on success */
+static int innodb_init(void* p)
+{
+ DBUG_ENTER("innodb_init");
+ handlerton* innobase_hton= static_cast<handlerton*>(p);
+ innodb_hton_ptr = innobase_hton;
+
+ innobase_hton->state = SHOW_OPTION_YES;
+ innobase_hton->db_type = DB_TYPE_INNODB;
+ innobase_hton->savepoint_offset = sizeof(trx_named_savept_t);
+ innobase_hton->close_connection = innobase_close_connection;
+ innobase_hton->kill_query = innobase_kill_query;
+ innobase_hton->savepoint_set = innobase_savepoint;
+ innobase_hton->savepoint_rollback = innobase_rollback_to_savepoint;
+
+ innobase_hton->savepoint_rollback_can_release_mdl =
+ innobase_rollback_to_savepoint_can_release_mdl;
+
+ innobase_hton->savepoint_release = innobase_release_savepoint;
+ innobase_hton->prepare_ordered= NULL;
+ innobase_hton->commit_ordered= innobase_commit_ordered;
+ innobase_hton->commit = innobase_commit;
+ innobase_hton->rollback = innobase_rollback;
+ innobase_hton->prepare = innobase_xa_prepare;
+ innobase_hton->recover = innobase_xa_recover;
+ innobase_hton->commit_by_xid = innobase_commit_by_xid;
+ innobase_hton->rollback_by_xid = innobase_rollback_by_xid;
+ innobase_hton->commit_checkpoint_request=innobase_checkpoint_request;
+ innobase_hton->create = innobase_create_handler;
+
+ innobase_hton->drop_database = innobase_drop_database;
+ innobase_hton->panic = innobase_end;
+
+ innobase_hton->start_consistent_snapshot =
+ innobase_start_trx_and_assign_read_view;
+
+ innobase_hton->flush_logs = innobase_flush_logs;
+ innobase_hton->show_status = innobase_show_status;
+ innobase_hton->flags =
+ HTON_SUPPORTS_EXTENDED_KEYS | HTON_SUPPORTS_FOREIGN_KEYS
+ | HTON_NATIVE_SYS_VERSIONING;
+
+#ifdef WITH_WSREP
+ innobase_hton->abort_transaction=wsrep_abort_transaction;
+ innobase_hton->set_checkpoint=innobase_wsrep_set_checkpoint;
+ innobase_hton->get_checkpoint=innobase_wsrep_get_checkpoint;
+ innobase_hton->fake_trx_id=wsrep_fake_trx_id;
+#endif /* WITH_WSREP */
+
+ innobase_hton->tablefile_extensions = ha_innobase_exts;
+ innobase_hton->table_options = innodb_table_option_list;
+
+ /* System Versioning */
+ innobase_hton->prepare_commit_versioned
+ = innodb_prepare_commit_versioned;
+
+ innodb_remember_check_sysvar_funcs();
+
+ compile_time_assert(DATA_MYSQL_TRUE_VARCHAR == MYSQL_TYPE_VARCHAR);
+
+#ifndef DBUG_OFF
+ static const char test_filename[] = "-@";
+ char test_tablename[sizeof test_filename
+ + sizeof(srv_mysql50_table_name_prefix) - 1];
+ DBUG_ASSERT(sizeof test_tablename - 1
+ == filename_to_tablename(test_filename,
+ test_tablename,
+ sizeof test_tablename, true));
+ DBUG_ASSERT(!strncmp(test_tablename,
+ srv_mysql50_table_name_prefix,
+ sizeof srv_mysql50_table_name_prefix - 1));
+ DBUG_ASSERT(!strcmp(test_tablename
+ + sizeof srv_mysql50_table_name_prefix - 1,
+ test_filename));
+#endif /* DBUG_OFF */
+
+ os_file_set_umask(my_umask);
+
+ /* Setup the memory alloc/free tracing mechanisms before calling
+ any functions that could possibly allocate memory. */
+ ut_new_boot();
+
+ if (int error = innodb_init_params()) {
+ DBUG_RETURN(error);
+ }
+
+ /* After this point, error handling has to use
+ innodb_init_abort(). */
+
#ifdef HAVE_PSI_INTERFACE
/* Register keys with MySQL performance schema */
int count;
@@ -4104,13 +4199,20 @@ innobase_change_buffering_inited_ok:
mysql_cond_register("innodb", all_innodb_conds, count);
#endif /* HAVE_PSI_INTERFACE */
- err = innobase_start_or_create_for_mysql();
+ bool create_new_db = false;
- innobase_buffer_pool_size = srv_buf_pool_size;
+ /* Check whether the data files exist. */
+ dberr_t err = srv_sys_space.check_file_spec(&create_new_db, 5U << 20);
+
+ if (err != DB_SUCCESS) {
+ DBUG_RETURN(innodb_init_abort());
+ }
+
+ err = srv_start(create_new_db);
if (err != DB_SUCCESS) {
innodb_shutdown();
- DBUG_RETURN(innobase_init_abort());
+ DBUG_RETURN(innodb_init_abort());
} else if (!srv_read_only_mode) {
mysql_thread_create(thd_destructor_thread_key,
&thd_destructor_thread,
@@ -4162,7 +4264,6 @@ innobase_change_buffering_inited_ok:
/* Turn on monitor counters that are default on */
srv_mon_default_on();
-
/* Unit Tests */
#ifdef UNIV_ENABLE_UNIT_TEST_GET_PARENT_DIR
unit_test_os_file_get_parent_dir();
@@ -4183,9 +4284,6 @@ innobase_change_buffering_inited_ok:
#endif /* UNIV_ENABLE_UNIT_TEST_ROW_RAW_FORMAT_INT */
DBUG_RETURN(0);
-
-error:
- DBUG_RETURN(1);
}
/** Shut down the InnoDB storage engine.
@@ -17609,108 +17707,6 @@ innodb_make_page_dirty(
}
#endif // UNIV_DEBUG
/*************************************************************//**
-Find the corresponding ibuf_use_t value that indexes into
-innobase_change_buffering_values[] array for the input
-change buffering option name.
-@return corresponding IBUF_USE_* value for the input variable
-name, or IBUF_USE_COUNT if not able to find a match */
-static
-ibuf_use_t
-innodb_find_change_buffering_value(
-/*===============================*/
- const char* input_name) /*!< in: input change buffering
- option name */
-{
- for (ulint i = 0;
- i < UT_ARR_SIZE(innobase_change_buffering_values);
- ++i) {
-
- /* found a match */
- if (!innobase_strcasecmp(
- input_name, innobase_change_buffering_values[i])) {
- return(static_cast<ibuf_use_t>(i));
- }
- }
-
- /* Did not find any match */
- return(IBUF_USE_COUNT);
-}
-
-/*************************************************************//**
-Check if it is a valid value of innodb_change_buffering. This function is
-registered as a callback with MySQL.
-@return 0 for valid innodb_change_buffering */
-static
-int
-innodb_change_buffering_validate(
-/*=============================*/
- THD* thd, /*!< in: thread handle */
- struct st_mysql_sys_var* var, /*!< in: pointer to system
- variable */
- void* save, /*!< out: immediate result
- for update function */
- struct st_mysql_value* value) /*!< in: incoming string */
-{
- const char* change_buffering_input;
- char buff[STRING_BUFFER_USUAL_SIZE];
- int len = sizeof(buff);
-
- ut_a(save != NULL);
- ut_a(value != NULL);
-
- change_buffering_input = value->val_str(value, buff, &len);
-
- if (change_buffering_input != NULL) {
- ibuf_use_t use;
-
- use = innodb_find_change_buffering_value(
- change_buffering_input);
-
- if (use != IBUF_USE_COUNT) {
- /* Find a matching change_buffering option value. */
- *static_cast<const char**>(save) =
- innobase_change_buffering_values[use];
-
- return(0);
- }
- }
-
- /* No corresponding change buffering option for user supplied
- "change_buffering_input" */
- return(1);
-}
-
-/****************************************************************//**
-Update the system variable innodb_change_buffering using the "saved"
-value. This function is registered as a callback with MySQL. */
-static
-void
-innodb_change_buffering_update(
-/*===========================*/
- THD* thd, /*!< in: thread handle */
- struct st_mysql_sys_var* var, /*!< in: pointer to
- system variable */
- void* var_ptr,/*!< out: where the
- formal string goes */
- const void* save) /*!< in: immediate result
- from check function */
-{
- ibuf_use_t use;
-
- ut_a(var_ptr != NULL);
- ut_a(save != NULL);
-
- use = innodb_find_change_buffering_value(
- *static_cast<const char*const*>(save));
-
- ut_a(use < IBUF_USE_COUNT);
-
- ibuf_use = use;
- *static_cast<const char**>(var_ptr) =
- *static_cast<const char*const*>(save);
-}
-
-/*************************************************************//**
Just emit a warning that the usage of the variable is deprecated.
@return 0 */
static
@@ -18174,9 +18170,7 @@ innodb_srv_buf_dump_filename_validate(
ut_a(save != NULL);
ut_a(value != NULL);
- const char* buf_name = value->val_str(value, buff, &len);
-
- if (buf_name != NULL) {
+ if (const char* buf_name = value->val_str(value, buff, &len)) {
if (is_filename_allowed(buf_name, len, FALSE)){
*static_cast<const char**>(save) = buf_name;
return(0);
@@ -19261,7 +19255,7 @@ static MYSQL_SYSVAR_STR(data_home_dir, innobase_data_home_dir,
"The common part for InnoDB table spaces.",
NULL, NULL, NULL);
-static MYSQL_SYSVAR_BOOL(doublewrite, innobase_use_doublewrite,
+static MYSQL_SYSVAR_BOOL(doublewrite, srv_use_doublewrite_buf,
PLUGIN_VAR_NOCMDARG | PLUGIN_VAR_READONLY,
"Enable InnoDB doublewrite buffer (enabled by default)."
" Disable with --skip-innodb-doublewrite.",
@@ -19389,9 +19383,11 @@ static MYSQL_SYSVAR_ULONG(flush_log_at_trx_commit, srv_flush_log_at_trx_commit,
" guarantees in case of crash. 0 and 2 can be faster than 1 or 3.",
NULL, NULL, 1, 0, 3, 0);
-static MYSQL_SYSVAR_STR(flush_method, innobase_file_flush_method,
+static MYSQL_SYSVAR_ENUM(flush_method, innodb_flush_method,
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
- "With which method to flush data.", NULL, NULL, NULL);
+ "With which method to flush data.",
+ NULL, NULL, IF_WIN(SRV_ALL_O_DIRECT_FSYNC, SRV_FSYNC),
+ &innodb_flush_method_typelib);
static MYSQL_SYSVAR_BOOL(force_load_corrupted, srv_load_corrupted,
PLUGIN_VAR_NOCMDARG | PLUGIN_VAR_READONLY,
@@ -19843,12 +19839,12 @@ static MYSQL_SYSVAR_BOOL(optimize_fulltext_only, innodb_optimize_fulltext_only,
"Only optimize the Fulltext index of the table",
NULL, NULL, FALSE);
-static MYSQL_SYSVAR_ULONG(read_io_threads, innobase_read_io_threads,
+static MYSQL_SYSVAR_ULONG(read_io_threads, srv_n_read_io_threads,
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
"Number of background read I/O threads in InnoDB.",
NULL, NULL, 4, 1, 64, 0);
-static MYSQL_SYSVAR_ULONG(write_io_threads, innobase_write_io_threads,
+static MYSQL_SYSVAR_ULONG(write_io_threads, srv_n_write_io_threads,
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
"Number of background write I/O threads in InnoDB.",
NULL, NULL, 4, 1, 64, 0);
@@ -19864,10 +19860,10 @@ static MYSQL_SYSVAR_ULONG(page_size, srv_page_size,
NULL, NULL, UNIV_PAGE_SIZE_DEF,
UNIV_PAGE_SIZE_MIN, UNIV_PAGE_SIZE_MAX, 0);
-static MYSQL_SYSVAR_LONG(log_buffer_size, innobase_log_buffer_size,
+static MYSQL_SYSVAR_ULONG(log_buffer_size, srv_log_buffer_size,
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
"The size of the buffer which InnoDB uses to write log to the log files on disk.",
- NULL, NULL, 16*1024*1024L, 256*1024L, LONG_MAX, 1024);
+ NULL, NULL, 16L << 20, 256L << 10, LONG_MAX, 1024);
static MYSQL_SYSVAR_ULONGLONG(log_file_size, srv_log_file_size,
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
@@ -19947,12 +19943,12 @@ static MYSQL_SYSVAR_ULONG(thread_sleep_delay, srv_thread_sleep_delay,
static MYSQL_SYSVAR_STR(data_file_path, innobase_data_file_path,
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
"Path to individual files and their sizes.",
- NULL, NULL, NULL);
+ NULL, NULL, "ibdata1:12M:autoextend");
static MYSQL_SYSVAR_STR(temp_data_file_path, innobase_temp_data_file_path,
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
"Path to files and their sizes making temp-tablespace.",
- NULL, NULL, NULL);
+ NULL, NULL, "ibtmp1:12M:autoextend");
static MYSQL_SYSVAR_STR(undo_directory, srv_undo_dir,
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
@@ -20030,12 +20026,10 @@ static MYSQL_SYSVAR_BOOL(numa_interleave, srv_numa_interleave,
NULL, NULL, FALSE);
#endif /* HAVE_LIBNUMA */
-static MYSQL_SYSVAR_STR(change_buffering, innobase_change_buffering,
+static MYSQL_SYSVAR_ENUM(change_buffering, innodb_change_buffering,
PLUGIN_VAR_RQCMDARG,
- "Buffer changes to reduce random access:"
- " OFF, ON, inserting, deleting, changing, or purging.",
- innodb_change_buffering_validate,
- innodb_change_buffering_update, "all");
+ "Buffer changes to secondary indexes.",
+ NULL, NULL, IBUF_USE_ALL, &innodb_change_buffering_typelib);
static MYSQL_SYSVAR_UINT(change_buffer_max_size,
srv_change_buffer_max_size,
@@ -20611,7 +20605,7 @@ maria_declare_plugin(innobase)
plugin_author,
"Supports transactions, row-level locking, foreign keys and encryption for tables",
PLUGIN_LICENSE_GPL,
- innobase_init, /* Plugin Init */
+ innodb_init, /* Plugin Init */
NULL, /* Plugin Deinit */
INNODB_VERSION_SHORT,
innodb_status_variables_export,/* status variables */
diff --git a/storage/innobase/ibuf/ibuf0ibuf.cc b/storage/innobase/ibuf/ibuf0ibuf.cc
index 5551aba853b..b0032397f9c 100644
--- a/storage/innobase/ibuf/ibuf0ibuf.cc
+++ b/storage/innobase/ibuf/ibuf0ibuf.cc
@@ -454,6 +454,10 @@ void
ibuf_close(void)
/*============*/
{
+ if (ibuf == NULL) {
+ return;
+ }
+
mutex_free(&ibuf_pessimistic_insert_mutex);
mutex_free(&ibuf_mutex);
@@ -3725,8 +3729,6 @@ ibuf_insert(
case IBUF_USE_INSERT_DELETE_MARK:
case IBUF_USE_ALL:
goto check_watch;
- case IBUF_USE_COUNT:
- break;
}
break;
case IBUF_OP_DELETE_MARK:
@@ -3740,8 +3742,6 @@ ibuf_insert(
case IBUF_USE_ALL:
ut_ad(!no_counter);
goto check_watch;
- case IBUF_USE_COUNT:
- break;
}
break;
case IBUF_OP_DELETE:
@@ -3755,8 +3755,6 @@ ibuf_insert(
case IBUF_USE_ALL:
ut_ad(!no_counter);
goto skip_watch;
- case IBUF_USE_COUNT:
- break;
}
break;
case IBUF_OP_COUNT:
diff --git a/storage/innobase/include/btr0sea.h b/storage/innobase/include/btr0sea.h
index 04fb7014afe..182bcf20c91 100644
--- a/storage/innobase/include/btr0sea.h
+++ b/storage/innobase/include/btr0sea.h
@@ -38,26 +38,20 @@ Created 2/17/1996 Heikki Tuuri
/** Creates and initializes the adaptive search system at a database start.
@param[in] hash_size hash table size. */
-void
-btr_search_sys_create(ulint hash_size);
+void btr_search_sys_create(ulint hash_size);
/** Resize hash index hash table.
@param[in] hash_size hash index hash table size */
-void
-btr_search_sys_resize(ulint hash_size);
+void btr_search_sys_resize(ulint hash_size);
/** Frees the adaptive search system at a database shutdown. */
-void
-btr_search_sys_free();
+void btr_search_sys_free();
/** Disable the adaptive hash search system and empty the index.
@param need_mutex need to acquire dict_sys->mutex */
-void
-btr_search_disable(
- bool need_mutex);
+void btr_search_disable(bool need_mutex);
/** Enable the adaptive hash search system. */
-void
-btr_search_enable();
+void btr_search_enable();
/** Returns the value of ref_count. The value is protected by latch.
@param[in] info search info
@@ -123,8 +117,7 @@ btr_search_move_or_delete_hash_entries(
block->buf_fix_count == 0 or it is an index page which
has already been removed from the buf_pool->page_hash
i.e.: it is in state BUF_BLOCK_REMOVE_HASH */
-void
-btr_search_drop_page_hash_index(buf_block_t* block);
+void btr_search_drop_page_hash_index(buf_block_t* block);
/** Drop any adaptive hash index entries that may point to an index
page that may be in the buffer pool, when a page is evicted from the
@@ -153,69 +146,52 @@ btr_search_update_hash_on_insert(btr_cur_t* cursor, rw_lock_t* ahi_latch);
/** Updates the page hash index when a single record is deleted from a page.
@param[in] cursor cursor which was positioned on the record to delete
using btr_cur_search_, the record is not yet deleted.*/
-void
-btr_search_update_hash_on_delete(btr_cur_t* cursor);
+void btr_search_update_hash_on_delete(btr_cur_t* cursor);
/** Validates the search system.
@return true if ok */
-bool
-btr_search_validate();
+bool btr_search_validate();
/** Lock all search latches in exclusive mode. */
-UNIV_INLINE
-void
-btr_search_x_lock_all();
+static inline void btr_search_x_lock_all();
/** Unlock all search latches from exclusive mode. */
-UNIV_INLINE
-void
-btr_search_x_unlock_all();
+static inline void btr_search_x_unlock_all();
/** Lock all search latches in shared mode. */
-UNIV_INLINE
-void
-btr_search_s_lock_all();
+static inline void btr_search_s_lock_all();
#ifdef UNIV_DEBUG
/** Check if thread owns all the search latches.
@param[in] mode lock mode check
@retval true if owns all of them
@retval false if does not own some of them */
-UNIV_INLINE
-bool
-btr_search_own_all(ulint mode);
+static inline bool btr_search_own_all(ulint mode);
/** Check if thread owns any of the search latches.
@param[in] mode lock mode check
@retval true if owns any of them
@retval false if owns no search latch */
-UNIV_INLINE
-bool
-btr_search_own_any(ulint mode);
+static inline bool btr_search_own_any(ulint mode);
#endif /* UNIV_DEBUG */
/** Unlock all search latches from shared mode. */
-UNIV_INLINE
-void
-btr_search_s_unlock_all();
+static inline void btr_search_s_unlock_all();
/** Get the latch based on index attributes.
A latch is selected from an array of latches using pair of index-id, space-id.
@param[in] index index handler
@return latch */
-UNIV_INLINE
-rw_lock_t*
-btr_get_search_latch(const dict_index_t* index);
+static inline rw_lock_t* btr_get_search_latch(const dict_index_t* index);
/** Get the hash-table based on index attributes.
A table is selected from an array of tables using pair of index-id, space-id.
@param[in] index index handler
@return hash table */
-UNIV_INLINE
-hash_table_t*
-btr_get_search_table(const dict_index_t* index);
+static inline hash_table_t* btr_get_search_table(const dict_index_t* index);
#else /* BTR_CUR_HASH_ADAPT */
# define btr_search_sys_create(size)
+# define btr_search_sys_free()
# define btr_search_drop_page_hash_index(block)
# define btr_search_s_lock_all(index)
# define btr_search_s_unlock_all(index)
@@ -230,15 +206,11 @@ btr_get_search_table(const dict_index_t* index);
/** Create and initialize search info.
@param[in,out] heap heap where created
@return own: search info struct */
-UNIV_INLINE
-btr_search_t*
-btr_search_info_create(mem_heap_t* heap)
+static inline btr_search_t* btr_search_info_create(mem_heap_t* heap)
MY_ATTRIBUTE((nonnull, warn_unused_result));
/** @return the search info of an index */
-UNIV_INLINE
-btr_search_t*
-btr_search_get_info(dict_index_t* index)
+static inline btr_search_t* btr_search_get_info(dict_index_t* index)
{
return(index->search_info);
}
diff --git a/storage/innobase/include/btr0sea.ic b/storage/innobase/include/btr0sea.ic
index fba97835395..c99cb2d8d06 100644
--- a/storage/innobase/include/btr0sea.ic
+++ b/storage/innobase/include/btr0sea.ic
@@ -31,9 +31,7 @@ Created 2/17/1996 Heikki Tuuri
/** Create and initialize search info.
@param[in,out] heap heap where created
@return own: search info struct */
-UNIV_INLINE
-btr_search_t*
-btr_search_info_create(mem_heap_t* heap)
+static inline btr_search_t* btr_search_info_create(mem_heap_t* heap)
{
btr_search_t* info = static_cast<btr_search_t*>(
mem_heap_zalloc(heap, sizeof(btr_search_t)));
@@ -54,7 +52,7 @@ btr_search_info_update_slow(btr_search_t* info, btr_cur_t* cursor);
/*********************************************************************//**
Updates the search info. */
-UNIV_INLINE
+static inline
void
btr_search_info_update(
/*===================*/
@@ -87,9 +85,7 @@ btr_search_info_update(
}
/** Lock all search latches in exclusive mode. */
-UNIV_INLINE
-void
-btr_search_x_lock_all()
+static inline void btr_search_x_lock_all()
{
for (ulint i = 0; i < btr_ahi_parts; ++i) {
rw_lock_x_lock(btr_search_latches[i]);
@@ -97,9 +93,7 @@ btr_search_x_lock_all()
}
/** Unlock all search latches from exclusive mode. */
-UNIV_INLINE
-void
-btr_search_x_unlock_all()
+static inline void btr_search_x_unlock_all()
{
for (ulint i = 0; i < btr_ahi_parts; ++i) {
rw_lock_x_unlock(btr_search_latches[i]);
@@ -107,9 +101,7 @@ btr_search_x_unlock_all()
}
/** Lock all search latches in shared mode. */
-UNIV_INLINE
-void
-btr_search_s_lock_all()
+static inline void btr_search_s_lock_all()
{
for (ulint i = 0; i < btr_ahi_parts; ++i) {
rw_lock_s_lock(btr_search_latches[i]);
@@ -117,9 +109,7 @@ btr_search_s_lock_all()
}
/** Unlock all search latches from shared mode. */
-UNIV_INLINE
-void
-btr_search_s_unlock_all()
+static inline void btr_search_s_unlock_all()
{
for (ulint i = 0; i < btr_ahi_parts; ++i) {
rw_lock_s_unlock(btr_search_latches[i]);
@@ -131,9 +121,7 @@ btr_search_s_unlock_all()
@param[in] mode lock mode check
@retval true if owns all of them
@retval false if does not own some of them */
-UNIV_INLINE
-bool
-btr_search_own_all(ulint mode)
+static inline bool btr_search_own_all(ulint mode)
{
for (ulint i = 0; i < btr_ahi_parts; ++i) {
if (!rw_lock_own(btr_search_latches[i], mode)) {
@@ -147,9 +135,7 @@ btr_search_own_all(ulint mode)
@param[in] mode lock mode check
@retval true if owns any of them
@retval false if owns no search latch */
-UNIV_INLINE
-bool
-btr_search_own_any(ulint mode)
+static inline bool btr_search_own_any(ulint mode)
{
for (ulint i = 0; i < btr_ahi_parts; ++i) {
if (rw_lock_own(btr_search_latches[i], mode)) {
@@ -163,9 +149,7 @@ btr_search_own_any(ulint mode)
/** Get the adaptive hash search index latch for a b-tree.
@param[in] index b-tree index
@return latch */
-UNIV_INLINE
-rw_lock_t*
-btr_get_search_latch(const dict_index_t* index)
+static inline rw_lock_t* btr_get_search_latch(const dict_index_t* index)
{
ut_ad(index != NULL);
ut_ad(index->table->space->id == index->table->space_id);
@@ -180,9 +164,7 @@ btr_get_search_latch(const dict_index_t* index)
A table is selected from an array of tables using pair of index-id, space-id.
@param[in] index index handler
@return hash table */
-UNIV_INLINE
-hash_table_t*
-btr_get_search_table(const dict_index_t* index)
+static inline hash_table_t* btr_get_search_table(const dict_index_t* index)
{
ut_ad(index != NULL);
ut_ad(index->table->space->id == index->table->space_id);
diff --git a/storage/innobase/include/fil0crypt.h b/storage/innobase/include/fil0crypt.h
index 13b3ec4e37e..55d05f85610 100644
--- a/storage/innobase/include/fil0crypt.h
+++ b/storage/innobase/include/fil0crypt.h
@@ -27,9 +27,9 @@ Created 04/01/2015 Jan Lindström
#define fil0crypt_h
#ifndef UNIV_INNOCHECKSUM
-
#include "os0event.h"
#include "my_crypt.h"
+#include "fil0fil.h"
#endif /*! UNIV_INNOCHECKSUM */
/**
diff --git a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h
index e08c7684061..2faee1363c3 100644
--- a/storage/innobase/include/fil0fil.h
+++ b/storage/innobase/include/fil0fil.h
@@ -36,7 +36,7 @@ Created 10/25/1995 Heikki Tuuri
#include "ibuf0types.h"
// Forward declaration
-extern ibool srv_use_doublewrite_buf;
+extern my_bool srv_use_doublewrite_buf;
extern struct buf_dblwr_t* buf_dblwr;
struct trx_t;
class page_id_t;
diff --git a/storage/innobase/include/fsp0file.h b/storage/innobase/include/fsp0file.h
index 68e9f687fcd..1c4c51e9f52 100644
--- a/storage/innobase/include/fsp0file.h
+++ b/storage/innobase/include/fsp0file.h
@@ -417,7 +417,8 @@ private:
/** Flags to use for opening the data file */
os_file_create_t m_open_flags;
- /** size in database pages */
+ /** size in megabytes or pages; converted from megabytes to
+ pages in SysTablespace::normalize_size() */
ulint m_size;
/** ordinal position of this datafile in the tablespace */
diff --git a/storage/innobase/include/fsp0sysspace.h b/storage/innobase/include/fsp0sysspace.h
index 4a36c9dcbd8..80b006f2dd7 100644
--- a/storage/innobase/include/fsp0sysspace.h
+++ b/storage/innobase/include/fsp0sysspace.h
@@ -103,7 +103,7 @@ public:
void shutdown();
/** Normalize the file size, convert to extents. */
- void normalize();
+ void normalize_size();
/**
@return true if a new raw device was created. */
diff --git a/storage/innobase/include/ibuf0ibuf.h b/storage/innobase/include/ibuf0ibuf.h
index 446000a39de..b5e3d1eddf7 100644
--- a/storage/innobase/include/ibuf0ibuf.h
+++ b/storage/innobase/include/ibuf0ibuf.h
@@ -49,19 +49,16 @@ typedef enum {
IBUF_OP_COUNT = 3
} ibuf_op_t;
-/** Combinations of operations that can be buffered. Because the enum
-values are used for indexing innobase_change_buffering_values[], they
-should start at 0 and there should not be any gaps. */
-typedef enum {
+/** Combinations of operations that can be buffered.
+@see innodb_change_buffering_names */
+enum ibuf_use_t {
IBUF_USE_NONE = 0,
IBUF_USE_INSERT, /* insert */
IBUF_USE_DELETE_MARK, /* delete */
IBUF_USE_INSERT_DELETE_MARK, /* insert+delete */
IBUF_USE_DELETE, /* delete+purge */
- IBUF_USE_ALL, /* insert+delete+purge */
-
- IBUF_USE_COUNT /* number of entries in ibuf_use_t */
-} ibuf_use_t;
+ IBUF_USE_ALL /* insert+delete+purge */
+};
/** Operations that can currently be buffered. */
extern ibuf_use_t ibuf_use;
diff --git a/storage/innobase/include/log0log.h b/storage/innobase/include/log0log.h
index 31cc0f2afd0..093044aa4fc 100644
--- a/storage/innobase/include/log0log.h
+++ b/storage/innobase/include/log0log.h
@@ -82,9 +82,7 @@ log_free_check(void);
/** Extends the log buffer.
@param[in] len requested minimum size in bytes */
-void
-log_buffer_extend(
- ulint len);
+void log_buffer_extend(ulong len);
/** Check margin not to overwrite transaction log from the last checkpoint.
If would estimate the log write to exceed the log_group_capacity,
@@ -422,8 +420,6 @@ extern my_bool innodb_log_checksums;
/* The counting of lsn's starts from this value: this must be non-zero */
#define LOG_START_LSN ((lsn_t) (16 * OS_FILE_LOG_BLOCK_SIZE))
-#define LOG_BUFFER_SIZE (srv_log_buffer_size << srv_page_size_shift)
-
/* Offsets of a log block header */
#define LOG_BLOCK_HDR_NO 0 /* block number which must be > 0 and
is allowed to wrap around at 2G; the
@@ -470,7 +466,7 @@ extern my_bool innodb_log_checksums;
#define LOG_CHECKPOINT_LSN 8
/** Byte offset of the log record corresponding to LOG_CHECKPOINT_LSN */
#define LOG_CHECKPOINT_OFFSET 16
-/** log_sys_t::buf_size at the time of the checkpoint (not used) */
+/** srv_log_buffer_size at the time of the checkpoint (not used) */
#define LOG_CHECKPOINT_LOG_BUF_SIZE 24
/** MariaDB 10.2.5 encrypted redo log encryption key version (32 bits)*/
#define LOG_CHECKPOINT_CRYPT_KEY 32
@@ -597,7 +593,7 @@ struct log_t{
update hotspots from residing on the
same memory cache line */
lsn_t lsn; /*!< log sequence number */
- ulint buf_free; /*!< first free offset within the log
+ ulong buf_free; /*!< first free offset within the log
buffer in use */
char pad2[CACHE_LINE_SIZE];/*!< Padding */
@@ -614,7 +610,8 @@ struct log_t{
mtr_commit and still ensure that
insertions in the flush_list happen
in the LSN order. */
- byte* buf; /*!< Memory of double the buf_size is
+ byte* buf; /*!< Memory of double the
+ srv_log_buffer_size is
allocated here. This pointer will change
however to either the first half or the
second half in turns, so that log
@@ -626,8 +623,7 @@ struct log_t{
bool first_in_use; /*!< true if buf points to the first
half of the aligned(buf_ptr), false
if the second half */
- ulint buf_size; /*!< log buffer size of each in bytes */
- ulint max_buf_free; /*!< recommended maximum value of
+ ulong max_buf_free; /*!< recommended maximum value of
buf_free for the buffer in use, after
which the buffer is flushed */
bool check_flush_or_checkpoint;
@@ -644,7 +640,7 @@ struct log_t{
/** The fields involved in the log buffer flush @{ */
- ulint buf_next_to_write;/*!< first offset in the log buffer
+ ulong buf_next_to_write;/*!< first offset in the log buffer
where the byte content may not exist
written to file, e.g., the start
offset of a log record catenated
diff --git a/storage/innobase/include/log0log.ic b/storage/innobase/include/log0log.ic
index 58da7bacc6f..b491a06eb6a 100644
--- a/storage/innobase/include/log0log.ic
+++ b/storage/innobase/include/log0log.ic
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved.
-Copyright (c) 2017, MariaDB Corporation.
+Copyright (c) 2017, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -26,12 +26,12 @@ Created 12/9/1995 Heikki Tuuri
#include "mach0data.h"
#include "srv0mon.h"
-#include "srv0srv.h"
#include "ut0crc32.h"
#ifdef UNIV_LOG_LSN_DEBUG
#include "mtr0types.h"
#endif /* UNIV_LOG_LSN_DEBUG */
+extern ulong srv_log_buffer_size;
/************************************************************//**
Gets a log block flush bit.
@@ -376,9 +376,9 @@ log_reserve_and_write_fast(
OS_FILE_LOG_BLOCK_SIZE)),
data_len);
- log_sys->buf_free += len;
+ log_sys->buf_free += ulong(len);
- ut_ad(log_sys->buf_free <= log_sys->buf_size);
+ ut_ad(log_sys->buf_free <= srv_log_buffer_size);
log_sys->lsn += len;
diff --git a/storage/innobase/include/mtr0mtr.h b/storage/innobase/include/mtr0mtr.h
index 79ff7638ab7..eea74c17fc7 100644
--- a/storage/innobase/include/mtr0mtr.h
+++ b/storage/innobase/include/mtr0mtr.h
@@ -321,9 +321,9 @@ struct mtr_t {
@param[in] space user or system tablespace */
void set_named_space(fil_space_t* space)
{
- ut_ad(m_impl.m_user_space_id == TRX_SYS_SPACE);
+ ut_ad(!m_impl.m_user_space_id);
ut_d(m_impl.m_user_space_id = space->id);
- if (space->id != TRX_SYS_SPACE) {
+ if (space->id) {
m_impl.m_user_space = space;
}
}
diff --git a/storage/innobase/include/os0thread.h b/storage/innobase/include/os0thread.h
index c1b96ef7a1f..b6838c919a0 100644
--- a/storage/innobase/include/os0thread.h
+++ b/storage/innobase/include/os0thread.h
@@ -30,12 +30,6 @@ Created 9/8/1995 Heikki Tuuri
#include "univ.i"
-/* Maximum number of threads which can be created in the program;
-this is also the size of the wait slot array for MySQL threads which
-can wait inside InnoDB */
-
-#define OS_THREAD_MAX_N srv_max_n_threads
-
/* Possible fixed priorities for threads */
#define OS_THREAD_PRIORITY_NONE 100
#define OS_THREAD_PRIORITY_BACKGROUND 1
diff --git a/storage/innobase/include/srv0conc.h b/storage/innobase/include/srv0conc.h
index 9573c5add84..35937fe1204 100644
--- a/storage/innobase/include/srv0conc.h
+++ b/storage/innobase/include/srv0conc.h
@@ -1,6 +1,7 @@
/*****************************************************************************
Copyright (c) 2011, 2014, Oracle and/or its affiliates. All Rights Reserved.
+Copyright (c) 2018, MariaDB Corporation.
Portions of this file contain modifications contributed and copyrighted by
Google, Inc. Those modifications are gratefully acknowledged and are described
@@ -41,9 +42,7 @@ Created 2011/04/18 Sunny Bains
#define srv_conc_h
/** We are prepared for a situation that we have this many threads waiting for
-a semaphore inside InnoDB. innobase_start_or_create_for_mysql() sets the
-value. */
-
+a semaphore inside InnoDB. srv_start() sets the value. */
extern ulint srv_max_n_threads;
/** The following controls how many threads we let inside InnoDB concurrently:
diff --git a/storage/innobase/include/srv0srv.h b/storage/innobase/include/srv0srv.h
index 9c002329cd6..29492aa7bb6 100644
--- a/storage/innobase/include/srv0srv.h
+++ b/storage/innobase/include/srv0srv.h
@@ -48,7 +48,6 @@ Created 10/10/1995 Heikki Tuuri
#include "mysql/psi/psi.h"
#include "univ.i"
-#include "log0log.h"
#include "os0event.h"
#include "que0types.h"
#include "trx0types.h"
@@ -346,11 +345,11 @@ extern ulong srv_n_log_files;
/** The InnoDB redo log file size, or 0 when changing the redo log format
at startup (while disallowing writes to the redo log). */
extern ulonglong srv_log_file_size;
-extern ulint srv_log_buffer_size;
+extern ulong srv_log_buffer_size;
extern ulong srv_flush_log_at_trx_commit;
extern uint srv_flush_log_at_timeout;
extern ulong srv_log_write_ahead_size;
-extern char srv_adaptive_flushing;
+extern my_bool srv_adaptive_flushing;
extern my_bool srv_flush_sync;
#ifdef WITH_INNODB_DISALLOW_WRITES
@@ -400,8 +399,8 @@ extern ulint srv_lock_table_size;
extern ulint srv_n_file_io_threads;
extern my_bool srv_random_read_ahead;
extern ulong srv_read_ahead_threshold;
-extern ulint srv_n_read_io_threads;
-extern ulint srv_n_write_io_threads;
+extern ulong srv_n_read_io_threads;
+extern ulong srv_n_write_io_threads;
/* Defragmentation, Origianlly facebook default value is 100, but it's too high */
#define SRV_DEFRAGMENT_FREQUENCY_DEFAULT 40
@@ -435,8 +434,6 @@ to treat NULL value when collecting statistics. It is not defined
as enum type because the configure option takes unsigned integer type. */
extern ulong srv_innodb_stats_method;
-extern char* srv_file_flush_method_str;
-
extern ulint srv_max_n_open_files;
extern ulong srv_n_page_cleaners;
@@ -471,7 +468,7 @@ extern my_bool srv_stats_include_delete_marked;
extern unsigned long long srv_stats_modified_counter;
extern my_bool srv_stats_sample_traditional;
-extern ibool srv_use_doublewrite_buf;
+extern my_bool srv_use_doublewrite_buf;
extern ulong srv_doublewrite_batch_size;
extern ulong srv_checksum_algorithm;
@@ -666,7 +663,7 @@ extern PSI_stage_info srv_stage_buffer_pool_load;
/** Alternatives for the file flush option in Unix; see the InnoDB manual
about what these mean */
enum srv_flush_t {
- SRV_FSYNC = 1, /*!< fsync, the default */
+ SRV_FSYNC = 0, /*!< fsync, the default */
SRV_O_DSYNC, /*!< open log files in O_SYNC mode */
SRV_LITTLESYNC, /*!< do not call os_file_flush()
when writing data files, but do flush
@@ -678,16 +675,18 @@ enum srv_flush_t {
the reason for which is that some FS
do not flush meta-data when
unbuffered IO happens */
- SRV_O_DIRECT_NO_FSYNC,
+ SRV_O_DIRECT_NO_FSYNC
/*!< do not use fsync() when using
direct IO i.e.: it can be set to avoid
the fsync() call that we make when
using SRV_UNIX_O_DIRECT. However, in
this case user/DBA should be sure about
the integrity of the meta-data */
- SRV_ALL_O_DIRECT_FSYNC
+#ifdef _WIN32
+ ,SRV_ALL_O_DIRECT_FSYNC
/*!< Traditional Windows appoach to open
all files without caching, and do FileFlushBuffers()*/
+#endif
};
extern enum srv_flush_t srv_file_flush_method;
diff --git a/storage/innobase/include/srv0start.h b/storage/innobase/include/srv0start.h
index 3575f2e40b9..ee263f6c1f6 100644
--- a/storage/innobase/include/srv0start.h
+++ b/storage/innobase/include/srv0start.h
@@ -44,20 +44,16 @@ only one buffer pool instance is used. */
dberr_t
srv_undo_tablespaces_init(bool create_new_db);
-/****************************************************************//**
-Starts Innobase and creates a new database if database files
-are not found and the user wants.
+/** Start InnoDB.
+@param[in] create_new_db whether to create a new database
@return DB_SUCCESS or error code */
-dberr_t
-innobase_start_or_create_for_mysql();
+dberr_t srv_start(bool create_new_db);
/** Shut down InnoDB. */
-void
-innodb_shutdown();
+void innodb_shutdown();
/** Shut down background threads that can generate undo log. */
-void
-srv_shutdown_bg_undo_sources();
+void srv_shutdown_bg_undo_sources();
/*************************************************************//**
Copy the file path component of the physical file to parameter. It will
diff --git a/storage/innobase/include/sync0arr.h b/storage/innobase/include/sync0arr.h
index 4104e594cf9..b3180c1779d 100644
--- a/storage/innobase/include/sync0arr.h
+++ b/storage/innobase/include/sync0arr.h
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
-Copyright (c) 2015, 2017, MariaDB Corporation.
+Copyright (c) 2015, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -99,16 +99,11 @@ void
sync_array_print(
FILE* file); /*!< in: file where to print */
-/**********************************************************************//**
-Create the primary system wait array(s), they are protected by an OS mutex */
-void
-sync_array_init(
- ulint n_threads); /*!< in: Number of slots to create */
+/** Create the primary system wait arrays */
+void sync_array_init();
-/**********************************************************************//**
-Close sync array wait sub-system. */
-void
-sync_array_close();
+/** Destroy the sync array wait sub-system. */
+void sync_array_close();
/**********************************************************************//**
Get an instance of the sync wait array. */
diff --git a/storage/innobase/include/univ.i b/storage/innobase/include/univ.i
index c78f6f81ef3..68c904ebd9f 100644
--- a/storage/innobase/include/univ.i
+++ b/storage/innobase/include/univ.i
@@ -172,9 +172,8 @@ for all cases. This is used by ut0lst.h related code. */
/* When this macro is defined then additional test functions will be
compiled. These functions live at the end of each relevant source file
and have "test_" prefix. These functions can be called from the end of
-innobase_init() or they can be called from gdb after
-innobase_start_or_create_for_mysql() has executed using the call
-command. */
+innodb_init() or they can be called from gdb after srv_start() has executed
+using the call command. */
/*
#define UNIV_COMPILE_TEST_FUNCS
#define UNIV_ENABLE_UNIT_TEST_GET_PARENT_DIR
diff --git a/storage/innobase/lock/lock0wait.cc b/storage/innobase/lock/lock0wait.cc
index ca35c072c00..4a3adaa4757 100644
--- a/storage/innobase/lock/lock0wait.cc
+++ b/storage/innobase/lock/lock0wait.cc
@@ -48,7 +48,7 @@ lock_wait_table_print(void)
const srv_slot_t* slot = lock_sys.waiting_threads;
- for (ulint i = 0; i < OS_THREAD_MAX_N; i++, ++slot) {
+ for (ulint i = 0; i < srv_max_n_threads; i++, ++slot) {
fprintf(stderr,
"Slot %lu: thread type %lu,"
@@ -72,7 +72,7 @@ lock_wait_table_release_slot(
srv_slot_t* slot) /*!< in: slot to release */
{
#ifdef UNIV_DEBUG
- srv_slot_t* upper = lock_sys.waiting_threads + OS_THREAD_MAX_N;
+ srv_slot_t* upper = lock_sys.waiting_threads + srv_max_n_threads;
#endif /* UNIV_DEBUG */
lock_wait_mutex_enter();
@@ -142,7 +142,7 @@ lock_wait_table_reserve_slot(
slot = lock_sys.waiting_threads;
- for (i = OS_THREAD_MAX_N; i--; ++slot) {
+ for (i = srv_max_n_threads; i--; ++slot) {
if (!slot->in_use) {
slot->in_use = TRUE;
slot->thr = thr;
@@ -163,13 +163,13 @@ lock_wait_table_reserve_slot(
}
ut_ad(lock_sys.last_slot
- <= lock_sys.waiting_threads + OS_THREAD_MAX_N);
+ <= lock_sys.waiting_threads + srv_max_n_threads);
return(slot);
}
}
- ib::error() << "There appear to be " << OS_THREAD_MAX_N << " user"
+ ib::error() << "There appear to be " << srv_max_n_threads << " user"
" threads currently waiting inside InnoDB, which is the upper"
" limit. Cannot continue operation. Before aborting, we print"
" a list of waiting threads.";
diff --git a/storage/innobase/log/log0log.cc b/storage/innobase/log/log0log.cc
index 13e1c0e01d4..8b36f901e07 100644
--- a/storage/innobase/log/log0log.cc
+++ b/storage/innobase/log/log0log.cc
@@ -166,12 +166,8 @@ log_buf_pool_get_oldest_modification(void)
/** Extends the log buffer.
@param[in] len requested minimum size in bytes */
-void
-log_buffer_extend(
- ulint len)
+void log_buffer_extend(ulong len)
{
- ulint move_start;
- ulint move_end;
byte tmp_buf[OS_FILE_LOG_BLOCK_SIZE];
log_mutex_enter_all();
@@ -185,21 +181,21 @@ log_buffer_extend(
log_mutex_enter_all();
- if (srv_log_buffer_size > (len >> srv_page_size_shift)) {
+ if (srv_log_buffer_size > len) {
/* Already extended enough by the others */
log_mutex_exit_all();
return;
}
}
- if (len >= log_sys->buf_size / 2) {
+ if (len >= srv_log_buffer_size / 2) {
DBUG_EXECUTE_IF("ib_log_buffer_is_short_crash",
DBUG_SUICIDE(););
/* log_buffer is too small. try to extend instead of crash. */
- ib::warn() << "The transaction log size is too large"
- " for innodb_log_buffer_size (" << len << " >= "
- << LOG_BUFFER_SIZE << " / 2). Trying to extend it.";
+ ib::warn() << "The redo log transaction size " << len <<
+ " exceeds innodb_log_buffer_size="
+ << srv_log_buffer_size << " / 2). Trying to extend it.";
}
log_sys->is_extending = true;
@@ -216,10 +212,10 @@ log_buffer_extend(
log_mutex_enter_all();
}
- move_start = ut_calc_align_down(
+ ulong move_start = ut_calc_align_down(
log_sys->buf_free,
OS_FILE_LOG_BLOCK_SIZE);
- move_end = log_sys->buf_free;
+ ulong move_end = log_sys->buf_free;
/* store the last log block in buffer */
ut_memcpy(tmp_buf, log_sys->buf + move_start,
@@ -230,20 +226,19 @@ log_buffer_extend(
/* free previous after getting the right address */
if (!log_sys->first_in_use) {
- log_sys->buf -= log_sys->buf_size;
+ log_sys->buf -= srv_log_buffer_size;
}
- ut_free_dodump(log_sys->buf, log_sys->buf_size * 2);
+ ut_free_dodump(log_sys->buf, srv_log_buffer_size * 2);
/* reallocate log buffer */
- srv_log_buffer_size = (len >> srv_page_size_shift) + 1;
- log_sys->buf_size = LOG_BUFFER_SIZE;
+ srv_log_buffer_size = len;
log_sys->buf = static_cast<byte*>(
- ut_malloc_dontdump(log_sys->buf_size * 2));
+ ut_malloc_dontdump(srv_log_buffer_size * 2));
log_sys->first_in_use = true;
- log_sys->max_buf_free = log_sys->buf_size / LOG_BUF_FLUSH_RATIO
+ log_sys->max_buf_free = srv_log_buffer_size / LOG_BUF_FLUSH_RATIO
- LOG_BUF_FLUSH_MARGIN;
/* restore the last log block */
@@ -255,7 +250,7 @@ log_buffer_extend(
log_mutex_exit_all();
ib::info() << "innodb_log_buffer_size was extended to "
- << LOG_BUFFER_SIZE << ".";
+ << srv_log_buffer_size << ".";
}
/** Calculate actual length in redo buffer and file including
@@ -384,7 +379,7 @@ loop:
len_upper_limit = LOG_BUF_WRITE_MARGIN + srv_log_write_ahead_size
+ (5 * len) / 4;
- if (log_sys->buf_free + len_upper_limit > log_sys->buf_size) {
+ if (log_sys->buf_free + len_upper_limit > srv_log_buffer_size) {
log_mutex_exit();
DEBUG_SYNC_C("log_buf_size_exceeded");
@@ -464,7 +459,7 @@ part_loop:
log->buf_free += len;
- ut_ad(log->buf_free <= log->buf_size);
+ ut_ad(log->buf_free <= srv_log_buffer_size);
if (str_len > 0) {
goto part_loop;
@@ -722,17 +717,15 @@ log_sys_init()
log_sys->lsn = LOG_START_LSN;
- ut_a(LOG_BUFFER_SIZE >= 16 * OS_FILE_LOG_BLOCK_SIZE);
- ut_a(LOG_BUFFER_SIZE >= 4U << srv_page_size_shift);
-
- log_sys->buf_size = LOG_BUFFER_SIZE;
+ ut_ad(srv_log_buffer_size >= 16 * OS_FILE_LOG_BLOCK_SIZE);
+ ut_ad(srv_log_buffer_size >= 4U << srv_page_size_shift);
log_sys->buf = static_cast<byte*>(
- ut_malloc_dontdump(log_sys->buf_size * 2));
+ ut_malloc_dontdump(srv_log_buffer_size * 2));
log_sys->first_in_use = true;
- log_sys->max_buf_free = log_sys->buf_size / LOG_BUF_FLUSH_RATIO
+ log_sys->max_buf_free = srv_log_buffer_size / LOG_BUF_FLUSH_RATIO
- LOG_BUF_FLUSH_MARGIN;
log_sys->check_flush_or_checkpoint = true;
@@ -837,7 +830,9 @@ log_io_complete(
case SRV_LITTLESYNC:
case SRV_O_DIRECT:
case SRV_O_DIRECT_NO_FSYNC:
+#ifdef _WIN32
case SRV_ALL_O_DIRECT_FSYNC:
+#endif
fil_flush(SRV_LOG_SPACE_FIRST_ID);
}
@@ -1088,10 +1083,10 @@ log_buffer_switch()
log_sys->first_in_use = false;
ut_ad(log_sys->buf == ut_align(log_sys->buf,
OS_FILE_LOG_BLOCK_SIZE));
- log_sys->buf += log_sys->buf_size;
+ log_sys->buf += srv_log_buffer_size;
} else {
log_sys->first_in_use = true;
- log_sys->buf -= log_sys->buf_size;
+ log_sys->buf -= srv_log_buffer_size;
ut_ad(log_sys->buf == ut_align(log_sys->buf,
OS_FILE_LOG_BLOCK_SIZE));
}
@@ -1262,7 +1257,7 @@ loop:
Needs to be written padded data once. */
pad_size = std::min<ulint>(
ulint(write_ahead_size) - end_offset_in_unit,
- log_sys->buf_size - area_end);
+ srv_log_buffer_size - area_end);
::memset(write_buf + area_end, 0, pad_size);
}
}
@@ -1512,7 +1507,8 @@ log_group_checkpoint(lsn_t end_lsn)
lsn_offset = log_group_calc_lsn_offset(log_sys->next_checkpoint_lsn,
group);
mach_write_to_8(buf + LOG_CHECKPOINT_OFFSET, lsn_offset);
- mach_write_to_8(buf + LOG_CHECKPOINT_LOG_BUF_SIZE, log_sys->buf_size);
+ mach_write_to_8(buf + LOG_CHECKPOINT_LOG_BUF_SIZE,
+ srv_log_buffer_size);
mach_write_to_8(buf + LOG_CHECKPOINT_END_LSN, end_lsn);
log_block_set_checksum(buf, log_block_calc_checksum_crc32(buf));
@@ -1644,7 +1640,9 @@ log_checkpoint(
case SRV_LITTLESYNC:
case SRV_O_DIRECT:
case SRV_O_DIRECT_NO_FSYNC:
+#ifdef _WIN32
case SRV_ALL_O_DIRECT_FSYNC:
+#endif
fil_flush_file_spaces(FIL_TYPE_TABLESPACE);
}
@@ -2261,9 +2259,9 @@ log_shutdown()
log_group_close_all();
if (!log_sys->first_in_use) {
- log_sys->buf -= log_sys->buf_size;
+ log_sys->buf -= srv_log_buffer_size;
}
- ut_free_dodump(log_sys->buf, log_sys->buf_size * 2);
+ ut_free_dodump(log_sys->buf, srv_log_buffer_size * 2);
log_sys->buf = NULL;
ut_free(log_sys->checkpoint_buf_ptr);
log_sys->checkpoint_buf_ptr = NULL;
diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc
index fb04db253ef..08e88389eaf 100644
--- a/storage/innobase/log/log0recv.cc
+++ b/storage/innobase/log/log0recv.cc
@@ -3175,7 +3175,7 @@ recv_recovery_from_checkpoint_start(lsn_t flush_lsn)
recv_sys->mlog_checkpoint_lsn = 0;
- ut_ad(RECV_SCAN_SIZE <= log_sys->buf_size);
+ ut_ad(RECV_SCAN_SIZE <= srv_log_buffer_size);
group = &log_sys->log;
const lsn_t end_lsn = mach_read_from_8(
@@ -3389,7 +3389,7 @@ recv_recovery_from_checkpoint_start(lsn_t flush_lsn)
srv_start_lsn = recv_sys->recovered_lsn;
}
- log_sys->buf_free = (ulint) log_sys->lsn % OS_FILE_LOG_BLOCK_SIZE;
+ log_sys->buf_free = ulong(log_sys->lsn % OS_FILE_LOG_BLOCK_SIZE);
log_sys->buf_next_to_write = log_sys->buf_free;
log_sys->write_lsn = log_sys->lsn;
@@ -3523,7 +3523,7 @@ recv_reset_logs(
log_sys->next_checkpoint_no = 0;
log_sys->last_checkpoint_lsn = 0;
- memset(log_sys->buf, 0, log_sys->buf_size);
+ memset(log_sys->buf, 0, srv_log_buffer_size);
log_block_init(log_sys->buf, log_sys->lsn);
log_block_set_first_rec_group(log_sys->buf, LOG_BLOCK_HDR_SIZE);
diff --git a/storage/innobase/mtr/mtr0mtr.cc b/storage/innobase/mtr/mtr0mtr.cc
index 86540a3bc2d..a76886d1d57 100644
--- a/storage/innobase/mtr/mtr0mtr.cc
+++ b/storage/innobase/mtr/mtr0mtr.cc
@@ -785,8 +785,8 @@ mtr_t::Command::prepare_write()
ut_ad(len > 0);
ut_ad(n_recs > 0);
- if (len > log_sys->buf_size / 2) {
- log_buffer_extend((len + 1) * 2);
+ if (len > srv_log_buffer_size / 2) {
+ log_buffer_extend(ulong((len + 1) * 2));
}
ut_ad(m_impl->m_n_log_recs == n_recs);
diff --git a/storage/innobase/os/os0file.cc b/storage/innobase/os/os0file.cc
index 5e5f05d6071..195059c160b 100644
--- a/storage/innobase/os/os0file.cc
+++ b/storage/innobase/os/os0file.cc
@@ -5207,7 +5207,7 @@ os_file_set_nocache(
ib::error()
<< "Failed to set DIRECTIO_ON on file "
- << file_name << ": " << operation_name
+ << file_name << "; " << operation_name << ": "
<< strerror(errno_save) << ","
" continuing anyway.";
}
@@ -5221,9 +5221,9 @@ os_file_set_nocache(
# ifdef UNIV_LINUX
ib::warn()
<< "Failed to set O_DIRECT on file"
- << file_name << ";" << operation_name
+ << file_name << "; " << operation_name
<< ": " << strerror(errno_save) << ", "
- << "ccontinuing anyway. O_DIRECT is "
+ "continuing anyway. O_DIRECT is "
"known to result in 'Invalid argument' "
"on Linux on tmpfs, "
"see MySQL Bug#26662.";
@@ -5239,7 +5239,7 @@ short_warning:
<< "Failed to set O_DIRECT on file "
<< file_name << "; " << operation_name
<< " : " << strerror(errno_save)
- << " continuing anyway.";
+ << ", continuing anyway.";
}
}
#endif /* defined(UNIV_SOLARIS) && defined(DIRECTIO_ON) */
diff --git a/storage/innobase/os/os0thread.cc b/storage/innobase/os/os0thread.cc
index 2ee6305b8f2..bbb24fae3b8 100644
--- a/storage/innobase/os/os0thread.cc
+++ b/storage/innobase/os/os0thread.cc
@@ -142,7 +142,7 @@ os_thread_create_func(
#endif /* not _WIN32 */
- ut_a(os_thread_count <= OS_THREAD_MAX_N);
+ ut_a(os_thread_count <= srv_max_n_threads);
/* Return the thread_id if the caller requests it. */
if (thread_id != NULL) {
diff --git a/storage/innobase/srv/srv0conc.cc b/storage/innobase/srv/srv0conc.cc
index 93008489c4e..d26e61253cd 100644
--- a/storage/innobase/srv/srv0conc.cc
+++ b/storage/innobase/srv/srv0conc.cc
@@ -58,10 +58,8 @@ ulong srv_thread_sleep_delay = 10000;
/** We are prepared for a situation that we have this many threads waiting for
-a semaphore inside InnoDB. innobase_start_or_create_for_mysql() sets the
-value. */
-
-ulint srv_max_n_threads = 0;
+a semaphore inside InnoDB. srv_start() sets the value. */
+ulint srv_max_n_threads;
/** The following controls how many threads we let inside InnoDB concurrently:
threads waiting for locks are not counted into the number because otherwise
diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc
index 341ec688b3a..10dcf2084e0 100644
--- a/storage/innobase/srv/srv0srv.cc
+++ b/storage/innobase/srv/srv0srv.cc
@@ -170,7 +170,7 @@ use simulated aio we build below with threads.
Currently we support native aio on windows and linux */
my_bool srv_use_native_aio;
my_bool srv_numa_interleave;
-/** copy of innodb_use_atomic_writes; @see innobase_init() */
+/** copy of innodb_use_atomic_writes; @see innodb_init_params() */
my_bool srv_use_atomic_writes;
/** innodb_compression_algorithm; used with page compression */
ulong innodb_compression_algorithm;
@@ -189,15 +189,15 @@ ulong srv_n_log_files;
/** The InnoDB redo log file size, or 0 when changing the redo log format
at startup (while disallowing writes to the redo log). */
ulonglong srv_log_file_size;
-/** copy of innodb_log_buffer_size, but in database pages */
-ulint srv_log_buffer_size;
+/** innodb_log_buffer_size, in bytes */
+ulong srv_log_buffer_size;
/** innodb_flush_log_at_trx_commit */
ulong srv_flush_log_at_trx_commit;
/** innodb_flush_log_at_timeout */
uint srv_flush_log_at_timeout;
/** innodb_page_size */
ulong srv_page_size;
-/** log2 of innodb_page_size; @see innobase_init() */
+/** log2 of innodb_page_size; @see innodb_init_params() */
ulong srv_page_size_shift;
/** innodb_log_write_ahead_size */
ulong srv_log_write_ahead_size;
@@ -262,10 +262,10 @@ ulint srv_lock_table_size = ULINT_MAX;
/** innodb_idle_flush_pct */
ulong srv_idle_flush_pct;
-/** copy of innodb_read_io_threads */
-ulint srv_n_read_io_threads;
-/** copy of innodb_write_io_threads */
-ulint srv_n_write_io_threads;
+/** innodb_read_io_threads */
+ulong srv_n_read_io_threads;
+/** innodb_write_io_threads */
+ulong srv_n_write_io_threads;
/** innodb_random_read_ahead */
my_bool srv_random_read_ahead;
@@ -278,13 +278,10 @@ ulong srv_read_ahead_threshold;
buffer in terms of percentage of the buffer pool. */
uint srv_change_buffer_max_size;
-char* srv_file_flush_method_str;
+enum srv_flush_t srv_file_flush_method;
-enum srv_flush_t srv_file_flush_method = IF_WIN(SRV_ALL_O_DIRECT_FSYNC,SRV_FSYNC);
-
-
-/** copy of innodb_open_files, initialized by innobase_init() */
+/** copy of innodb_open_files; @see innodb_init_params() */
ulint srv_max_n_open_files;
/** innodb_io_capacity */
@@ -381,8 +378,7 @@ unsigned long long srv_stats_modified_counter;
based on number of configured pages */
my_bool srv_stats_sample_traditional;
-/** copy of innodb_doublewrite */
-ibool srv_use_doublewrite_buf;
+my_bool srv_use_doublewrite_buf;
/** innodb_doublewrite_batch_size (a debug parameter) specifies the
number of pages to use in LRU and flush_list batch flushing.
@@ -1113,40 +1109,15 @@ srv_free(void)
}
/*********************************************************************//**
-Normalizes init parameter values to use units we use inside InnoDB. */
-static
-void
-srv_normalize_init_values(void)
-/*===========================*/
-{
- srv_sys_space.normalize();
-
- srv_tmp_space.normalize();
-
- srv_log_buffer_size >>= srv_page_size_shift;
-
- srv_lock_table_size = 5 * (srv_buf_pool_size >> srv_page_size_shift);
-}
-
-/*********************************************************************//**
Boots the InnoDB server. */
void
srv_boot(void)
/*==========*/
{
- /* Transform the init parameter values given by MySQL to
- use units we use inside InnoDB: */
-
- srv_normalize_init_values();
-
sync_check_init();
- /* Reset the system variables in the recovery module. */
recv_sys_var_init();
trx_pool_init();
row_mysql_init();
-
- /* Initialize this module */
-
srv_init();
}
@@ -2443,10 +2414,6 @@ suspend_thread:
srv_suspend_thread(slot);
- /* DO NOT CHANGE THIS STRING. innobase_start_or_create_for_mysql()
- waits for database activity to die down when converting < 4.1.x
- databases, and relies on this string being exactly as it is. InnoDB
- manual also mentions this string in several places. */
srv_main_thread_op_info = "waiting for server activity";
srv_resume_thread(slot);
diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc
index af42f288089..dcbf1bd0878 100644
--- a/storage/innobase/srv/srv0start.cc
+++ b/storage/innobase/srv/srv0start.cc
@@ -133,7 +133,7 @@ bool srv_sys_tablespaces_open;
bool srv_was_started;
/** The original value of srv_log_file_size (innodb_log_file_size) */
static ulonglong srv_log_file_size_requested;
-/** TRUE if innobase_start_or_create_for_mysql() has been called */
+/** whether srv_start() has been called */
static bool srv_start_has_been_called;
/** Whether any undo log records can be generated */
@@ -195,9 +195,6 @@ static bool thread_started[SRV_MAX_N_IO_THREADS + 6 + 32] = {false};
/** Name of srv_monitor_file */
static char* srv_monitor_file_name;
-/** Minimum expected tablespace size. (10M) */
-static const ulint MIN_EXPECTED_TABLESPACE_SIZE = 5 * 1024 * 1024;
-
/** */
#define SRV_MAX_N_PENDING_SYNC_IOS 100
@@ -305,7 +302,7 @@ DECLARE_THREAD(io_handler_thread)(
#endif
/* For read only mode, we don't need ibuf and log I/O thread.
- Please see innobase_start_or_create_for_mysql() */
+ Please see srv_start() */
ulint start = (srv_read_only_mode) ? 0 : 2;
if (segment < start) {
@@ -1446,14 +1443,11 @@ srv_prepare_to_delete_redo_log_files(
DBUG_RETURN(flushed_lsn);
}
-/********************************************************************
-Starts InnoDB and creates a new database if database files
-are not found and the user wants.
+/** Start InnoDB.
+@param[in] create_new_db whether to create a new database
@return DB_SUCCESS or error code */
-dberr_t
-innobase_start_or_create_for_mysql()
+dberr_t srv_start(bool create_new_db)
{
- bool create_new_db = false;
lsn_t flushed_lsn;
dberr_t err = DB_SUCCESS;
ulint srv_n_log_files_found = srv_n_log_files;
@@ -1467,6 +1461,7 @@ innobase_start_or_create_for_mysql()
|| srv_operation == SRV_OPERATION_RESTORE
|| srv_operation == SRV_OPERATION_RESTORE_EXPORT);
+
if (srv_force_recovery == SRV_FORCE_NO_LOG_REDO) {
srv_read_only_mode = true;
}
@@ -1478,15 +1473,6 @@ innobase_start_or_create_for_mysql()
/* Reset the start state. */
srv_start_state = SRV_START_STATE_NONE;
- if (srv_read_only_mode) {
- ib::info() << "Started in read only mode";
-
- /* There is no write to InnoDB tablespaces (not even
- temporary ones, because also CREATE TEMPORARY TABLE is
- refused in read-only mode). */
- srv_use_doublewrite_buf = FALSE;
- }
-
compile_time_assert(sizeof(ulint) == sizeof(void*));
#ifdef UNIV_DEBUG
@@ -1542,62 +1528,10 @@ innobase_start_or_create_for_mysql()
srv_is_being_started = true;
-#ifdef _WIN32
- srv_use_native_aio = TRUE;
-
-#elif defined(LINUX_NATIVE_AIO)
-
- if (srv_use_native_aio) {
- ib::info() << "Using Linux native AIO";
- }
-#else
- /* Currently native AIO is supported only on windows and linux
- and that also when the support is compiled in. In all other
- cases, we ignore the setting of innodb_use_native_aio. */
- srv_use_native_aio = FALSE;
-#endif /* _WIN32 */
-
/* Register performance schema stages before any real work has been
started which may need to be instrumented. */
mysql_stage_register("innodb", srv_stages, UT_ARR_SIZE(srv_stages));
- if (srv_file_flush_method_str == NULL) {
- /* These are the default options */
- srv_file_flush_method = IF_WIN(SRV_ALL_O_DIRECT_FSYNC,SRV_FSYNC);
- } else if (0 == ut_strcmp(srv_file_flush_method_str, "fsync")) {
- srv_file_flush_method = SRV_FSYNC;
-
- } else if (0 == ut_strcmp(srv_file_flush_method_str, "O_DSYNC")) {
- srv_file_flush_method = SRV_O_DSYNC;
-
- } else if (0 == ut_strcmp(srv_file_flush_method_str, "O_DIRECT")) {
- srv_file_flush_method = SRV_O_DIRECT;
-
- } else if (0 == ut_strcmp(srv_file_flush_method_str, "O_DIRECT_NO_FSYNC")) {
- srv_file_flush_method = SRV_O_DIRECT_NO_FSYNC;
-
- } else if (0 == ut_strcmp(srv_file_flush_method_str, "littlesync")) {
- srv_file_flush_method = SRV_LITTLESYNC;
-
- } else if (0 == ut_strcmp(srv_file_flush_method_str, "nosync")) {
- srv_file_flush_method = SRV_NOSYNC;
-#ifdef _WIN32
- } else if (0 == ut_strcmp(srv_file_flush_method_str, "normal")) {
- srv_file_flush_method = SRV_FSYNC;
- } else if (0 == ut_strcmp(srv_file_flush_method_str, "unbuffered")) {
- } else if (0 == ut_strcmp(srv_file_flush_method_str,
- "async_unbuffered")) {
-#endif /* _WIN32 */
- } else {
- ib::error() << "Unrecognized value "
- << srv_file_flush_method_str
- << " for innodb_flush_method";
- err = DB_ERROR;
- }
-
- /* Note that the call srv_boot() also changes the values of
- some variables to the units used by InnoDB internally */
-
/* Set the maximum number of threads which can wait for a semaphore
inside InnoDB: this is the 'sync wait array' size, as well as the
maximum number of threads that can wait in the 'srv_conc array' for
@@ -1626,65 +1560,6 @@ innobase_start_or_create_for_mysql()
+ fts_sort_pll_degree * FTS_NUM_AUX_INDEX
* max_connections;
- if (srv_buf_pool_size >= BUF_POOL_SIZE_THRESHOLD) {
-
- if (srv_buf_pool_instances == srv_buf_pool_instances_default) {
-#if defined(_WIN32) && !defined(_WIN64)
- /* Do not allocate too large of a buffer pool on
- Windows 32-bit systems, which can have trouble
- allocating larger single contiguous memory blocks. */
- srv_buf_pool_size = static_cast<ulint>(ut_uint64_align_up(srv_buf_pool_size, srv_buf_pool_chunk_unit));
- srv_buf_pool_instances = ut_min(
- static_cast<ulong>(MAX_BUFFER_POOLS),
- static_cast<ulong>(srv_buf_pool_size / srv_buf_pool_chunk_unit));
-#else /* defined(_WIN32) && !defined(_WIN64) */
- /* Default to 8 instances when size > 1GB. */
- srv_buf_pool_instances = 8;
-#endif /* defined(_WIN32) && !defined(_WIN64) */
- }
- } else {
- /* If buffer pool is less than 1 GiB, assume fewer
- threads. Also use only one buffer pool instance. */
- if (srv_buf_pool_instances != srv_buf_pool_instances_default
- && srv_buf_pool_instances != 1) {
- /* We can't distinguish whether the user has explicitly
- started mysqld with --innodb-buffer-pool-instances=0,
- (srv_buf_pool_instances_default is 0) or has not
- specified that option at all. Thus we have the
- limitation that if the user started with =0, we
- will not emit a warning here, but we should actually
- do so. */
- ib::info()
- << "Adjusting innodb_buffer_pool_instances"
- " from " << srv_buf_pool_instances << " to 1"
- " since innodb_buffer_pool_size is less than "
- << BUF_POOL_SIZE_THRESHOLD / (1024 * 1024)
- << " MiB";
- }
-
- srv_buf_pool_instances = 1;
- }
-
- if (srv_buf_pool_chunk_unit * srv_buf_pool_instances
- > srv_buf_pool_size) {
- /* Size unit of buffer pool is larger than srv_buf_pool_size.
- adjust srv_buf_pool_chunk_unit for srv_buf_pool_size. */
- srv_buf_pool_chunk_unit
- = static_cast<ulong>(srv_buf_pool_size)
- / srv_buf_pool_instances;
- if (srv_buf_pool_size % srv_buf_pool_instances != 0) {
- ++srv_buf_pool_chunk_unit;
- }
- }
-
- srv_buf_pool_size = buf_pool_size_align(srv_buf_pool_size);
-
- if (srv_n_page_cleaners > srv_buf_pool_instances) {
- /* limit of page_cleaner parallelizability
- is number of buffer pool instances. */
- srv_n_page_cleaners = srv_buf_pool_instances;
- }
-
srv_boot();
ib::info() << ut_crc32_implementation;
@@ -1815,7 +1690,6 @@ innobase_start_or_create_for_mysql()
#endif /* UNIV_DEBUG */
log_sys_init();
-
recv_sys_init();
lock_sys.create(srv_lock_table_size);
@@ -1849,27 +1723,6 @@ innobase_start_or_create_for_mysql()
srv_start_state_set(SRV_START_STATE_IO);
}
- if (srv_n_log_files * srv_log_file_size >= 512ULL << 30) {
- /* log_block_convert_lsn_to_no() limits the returned block
- number to 1G and given that OS_FILE_LOG_BLOCK_SIZE is 512
- bytes, then we have a limit of 512 GB. If that limit is to
- be raised, then log_block_convert_lsn_to_no() must be
- modified. */
- ib::error() << "Combined size of log files must be < 512 GB";
-
- return(srv_init_abort(DB_ERROR));
- }
-
- os_normalize_path(srv_data_home);
-
- /* Check if the data files exist or not. */
- err = srv_sys_space.check_file_spec(
- &create_new_db, MIN_EXPECTED_TABLESPACE_SIZE);
-
- if (err != DB_SUCCESS) {
- return(srv_init_abort(DB_ERROR));
- }
-
srv_startup_is_before_trx_rollback_phase = !create_new_db;
/* Check if undo tablespaces and redo log files exist before creating
@@ -2758,8 +2611,7 @@ srv_fts_close(void)
#endif
/** Shut down background threads that can generate undo log. */
-void
-srv_shutdown_bg_undo_sources()
+void srv_shutdown_bg_undo_sources()
{
if (srv_undo_sources) {
ut_ad(!srv_read_only_mode);
@@ -2774,8 +2626,7 @@ srv_shutdown_bg_undo_sources()
}
/** Shut down InnoDB. */
-void
-innodb_shutdown()
+void innodb_shutdown()
{
ut_ad(!my_atomic_loadptr_explicit(reinterpret_cast<void**>
(&srv_running),
@@ -2865,22 +2716,13 @@ innodb_shutdown()
lock_sys.close();
trx_pool_close();
- /* We don't create these mutexes in RO mode because we don't create
- the temp files that the cover. */
if (!srv_read_only_mode) {
mutex_free(&srv_monitor_file_mutex);
mutex_free(&srv_misc_tmpfile_mutex);
}
- if (dict_sys) {
- dict_close();
- }
-
-#ifdef BTR_CUR_HASH_ADAPT
- if (btr_search_sys) {
- btr_search_sys_free();
- }
-#endif /* BTR_CUR_HASH_ADAPT */
+ dict_close();
+ btr_search_sys_free();
/* 3. Free all InnoDB's own mutexes and the os_fast_mutexes inside
them */
@@ -2901,10 +2743,6 @@ innodb_shutdown()
sync_check_close();
- if (dict_foreign_err_file) {
- fclose(dict_foreign_err_file);
- }
-
if (srv_was_started && srv_print_verbose_log) {
ib::info() << "Shutdown completed; log sequence number "
<< srv_shutdown_lsn
diff --git a/storage/innobase/sync/sync0arr.cc b/storage/innobase/sync/sync0arr.cc
index d8c6753ff22..7c0c6503b21 100644
--- a/storage/innobase/sync/sync0arr.cc
+++ b/storage/innobase/sync/sync0arr.cc
@@ -2,7 +2,7 @@
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2008, Google Inc.
-Copyright (c) 2013, 2017, MariaDB Corporation.
+Copyright (c) 2013, 2018, MariaDB Corporation.
Portions of this file contain modifications contributed and copyrighted by
Google, Inc. Those modifications are gratefully acknowledged and are described
@@ -1157,23 +1157,18 @@ sync_array_print_info(
sync_array_exit(arr);
}
-/**********************************************************************//**
-Create the primary system wait array(s), they are protected by an OS mutex */
-void
-sync_array_init(
-/*============*/
- ulint n_threads) /*!< in: Number of slots to
- create in all arrays */
+/** Create the primary system wait arrays */
+void sync_array_init()
{
ut_a(sync_wait_array == NULL);
ut_a(srv_sync_array_size > 0);
- ut_a(n_threads > 0);
+ ut_a(srv_max_n_threads > 0);
sync_array_size = srv_sync_array_size;
sync_wait_array = UT_NEW_ARRAY_NOKEY(sync_array_t*, sync_array_size);
- ulint n_slots = 1 + (n_threads - 1) / sync_array_size;
+ ulint n_slots = 1 + (srv_max_n_threads - 1) / sync_array_size;
for (ulint i = 0; i < sync_array_size; ++i) {
@@ -1181,11 +1176,8 @@ sync_array_init(
}
}
-/**********************************************************************//**
-Close sync array wait sub-system. */
-void
-sync_array_close(void)
-/*==================*/
+/** Destroy the sync array wait sub-system. */
+void sync_array_close()
{
for (ulint i = 0; i < sync_array_size; ++i) {
sync_array_free(sync_wait_array[i]);
diff --git a/storage/innobase/sync/sync0debug.cc b/storage/innobase/sync/sync0debug.cc
index 6574bf529e2..2053b36e61d 100644
--- a/storage/innobase/sync/sync0debug.cc
+++ b/storage/innobase/sync/sync0debug.cc
@@ -738,7 +738,7 @@ LatchDebug::check_order(
if (srv_is_being_started) {
/* This is violated during trx_sys_create_rsegs()
when creating additional rollback segments when
- upgrading in innobase_start_or_create_for_mysql(). */
+ upgrading in srv_start(). */
break;
}
@@ -1739,7 +1739,7 @@ sync_check_init()
ut_d(LatchDebug::init());
- sync_array_init(OS_THREAD_MAX_N);
+ sync_array_init();
}
/** Free the InnoDB synchronization data structures. */