160
154
#endif /* MYSQL_DYNAMIC_PLUGIN && __WIN__ */
162
156
static plugin::XaStorageEngine* innodb_engine_ptr= NULL;
164
typedef constrained_check<uint32_t, UINT32_MAX, 10> open_files_constraint;
165
static open_files_constraint innobase_open_files;
166
typedef constrained_check<uint32_t, 10, 1> mirrored_log_groups_constraint;
167
static mirrored_log_groups_constraint innobase_mirrored_log_groups;
168
typedef constrained_check<uint32_t, 100, 2> log_files_in_group_constraint;
169
static log_files_in_group_constraint innobase_log_files_in_group;
170
typedef constrained_check<uint32_t, 6, 0> force_recovery_constraint;
171
force_recovery_constraint innobase_force_recovery;
172
typedef constrained_check<size_t, SIZE_MAX, 256*1024, 1024> log_buffer_constraint;
173
static log_buffer_constraint innobase_log_buffer_size;
174
typedef constrained_check<size_t, SIZE_MAX, 512*1024, 1024> additional_mem_pool_constraint;
175
static additional_mem_pool_constraint innobase_additional_mem_pool_size;
176
typedef constrained_check<unsigned int, 1000, 1> autoextend_constraint;
177
static autoextend_constraint innodb_auto_extend_increment;
178
typedef constrained_check<size_t, SIZE_MAX, 5242880, 1048576> buffer_pool_constraint;
179
static buffer_pool_constraint innobase_buffer_pool_size;
180
typedef constrained_check<uint32_t, MAX_BUFFER_POOLS, 1> buffer_pool_instances_constraint;
181
static buffer_pool_instances_constraint innobase_buffer_pool_instances;
182
typedef constrained_check<uint32_t, UINT32_MAX, 100> io_capacity_constraint;
183
static io_capacity_constraint innodb_io_capacity;
184
typedef constrained_check<uint32_t, 5000, 1> purge_batch_constraint;
185
static purge_batch_constraint innodb_purge_batch_size;
186
typedef constrained_check<uint32_t, 1, 0> purge_threads_constraint;
187
static purge_threads_constraint innodb_n_purge_threads;
188
typedef constrained_check<uint32_t, 2, 0> trinary_constraint;
189
static trinary_constraint innodb_flush_log_at_trx_commit;
190
typedef constrained_check<unsigned int, 99, 0> max_dirty_pages_constraint;
191
static max_dirty_pages_constraint innodb_max_dirty_pages_pct;
192
static uint64_constraint innodb_max_purge_lag;
193
static uint64_nonzero_constraint innodb_stats_sample_pages;
194
typedef constrained_check<uint32_t, 64, 1> io_threads_constraint;
195
static io_threads_constraint innobase_read_io_threads;
196
static io_threads_constraint innobase_write_io_threads;
198
typedef constrained_check<uint32_t, 1000, 0> concurrency_constraint;
199
static concurrency_constraint innobase_commit_concurrency;
200
static concurrency_constraint innobase_thread_concurrency;
201
static uint32_nonzero_constraint innodb_concurrency_tickets;
203
typedef constrained_check<int64_t, INT64_MAX, 1024*1024, 1024*1024> log_file_constraint;
204
static log_file_constraint innobase_log_file_size;
206
static uint64_constraint innodb_replication_delay;
157
static plugin::TableFunction* status_table_function_ptr= NULL;
158
static plugin::TableFunction* cmp_tool= NULL;
159
static plugin::TableFunction* cmp_reset_tool= NULL;
160
static plugin::TableFunction* cmp_mem_tool= NULL;
161
static plugin::TableFunction* cmp_mem_reset_tool= NULL;
162
static plugin::TableFunction* innodb_trx_tool= NULL;
163
static plugin::TableFunction* innodb_locks_tool= NULL;
164
static plugin::TableFunction* innodb_lock_waits_tool= NULL;
166
static long innobase_mirrored_log_groups, innobase_log_files_in_group,
167
innobase_log_buffer_size,
168
innobase_force_recovery, innobase_open_files;
169
static long innobase_additional_mem_pool_size= 8*1024*1024L;
170
static ulong innobase_commit_concurrency = 0;
171
static ulong innobase_read_io_threads;
172
static ulong innobase_write_io_threads;
175
* @TODO: Turn this into size_t as soon as we have a Variable<size_t>
177
static int64_t innobase_buffer_pool_size= 128*1024*1024;
178
static int64_t innobase_log_file_size;
208
180
/** Percentage of the buffer pool to reserve for 'old' blocks.
209
181
Connected to buf_LRU_old_ratio. */
210
typedef constrained_check<uint32_t, 95, 5> old_blocks_constraint;
211
static old_blocks_constraint innobase_old_blocks_pct;
213
static uint32_constraint innodb_sync_spin_loops;
214
static uint32_constraint innodb_spin_wait_delay;
215
static uint32_constraint innodb_thread_sleep_delay;
217
typedef constrained_check<uint32_t, 64, 0> read_ahead_threshold_constraint;
218
static read_ahead_threshold_constraint innodb_read_ahead_threshold;
182
static uint innobase_old_blocks_pct;
220
184
/* The default values for the following char* start-up parameters
221
185
are determined in innobase_init below: */
223
std::string innobase_data_home_dir;
224
std::string innobase_data_file_path;
225
std::string innobase_log_group_home_dir;
226
static string innobase_file_format_name;
227
static string innobase_change_buffering;
229
/* The highest file format being used in the database. The value can be
230
set by user, however, it will be adjusted to the newer file format if
231
a table of such format is created/opened. */
232
static string innobase_file_format_max;
187
static char* innobase_data_home_dir = NULL;
188
static char* innobase_data_file_path = NULL;
189
static char* innobase_log_group_home_dir = NULL;
190
static char* innobase_file_format_name = NULL;
191
static char* innobase_change_buffering = NULL;
193
/* Note: This variable can be set to on/off and any of the supported
194
file formats in the configuration file, but can only be set to any
195
of the supported file formats during runtime. */
196
static char* innobase_file_format_check = NULL;
198
static char* innobase_file_flush_method = NULL;
234
200
/* Below we have boolean-valued start-up parameters, and their default
237
typedef constrained_check<uint32_t, 2, 0> trinary_constraint;
238
static trinary_constraint innobase_fast_shutdown;
240
/* "innobase_file_format_check" decides whether we would continue
241
booting the server if the file format stamped on the system
242
table space exceeds the maximum file format supported
243
by the server. Can be set during server startup at command
244
line or configure file, and a read only variable after
247
/* If a new file format is introduced, the file format
248
name needs to be updated accordingly. Please refer to
249
file_format_name_map[] defined in trx0sys.c for the next
252
static my_bool innobase_file_format_check = TRUE;
203
static ulong innobase_fast_shutdown = 1;
204
#ifdef UNIV_LOG_ARCHIVE
205
static my_bool innobase_log_archive = FALSE;
206
static char* innobase_log_arch_dir = NULL;
207
#endif /* UNIV_LOG_ARCHIVE */
253
208
static my_bool innobase_use_doublewrite = TRUE;
254
209
static my_bool innobase_use_checksums = TRUE;
255
210
static my_bool innobase_rollback_on_timeout = FALSE;
256
211
static my_bool innobase_create_status_file = FALSE;
257
static bool innobase_use_replication_log;
258
static bool support_xa;
259
static bool strict_mode;
260
typedef constrained_check<uint32_t, 1024*1024*1024, 1> lock_wait_constraint;
261
static lock_wait_constraint lock_wait_timeout;
263
213
static char* internal_innobase_data_file_path = NULL;
215
static char* innodb_version_str = (char*) INNODB_VERSION_STR;
265
217
/* The following counter is used to convey information to InnoDB
266
218
about server activity: in selects it is not sensible to call
267
219
srv_active_wake_master_thread after each fetch or search, we only do
1806
1790
value= value - (value % align_val);
1809
static void auto_extend_update(Session *, sql_var_t)
1811
srv_auto_extend_increment= innodb_auto_extend_increment.get();
1814
static void io_capacity_update(Session *, sql_var_t)
1816
srv_io_capacity= innodb_io_capacity.get();
1819
static void purge_batch_update(Session *, sql_var_t)
1821
srv_purge_batch_size= innodb_purge_batch_size.get();
1824
static void purge_threads_update(Session *, sql_var_t)
1826
srv_n_purge_threads= innodb_n_purge_threads.get();
1829
static void innodb_adaptive_hash_index_update(Session *, sql_var_t)
1831
if (btr_search_enabled)
1833
btr_search_enable();
1835
btr_search_disable();
1839
static void innodb_old_blocks_pct_update(Session *, sql_var_t)
1841
innobase_old_blocks_pct= buf_LRU_old_ratio_update(innobase_old_blocks_pct.get(), TRUE);
1844
static void innodb_thread_concurrency_update(Session *, sql_var_t)
1846
srv_thread_concurrency= innobase_thread_concurrency.get();
1849
static void innodb_sync_spin_loops_update(Session *, sql_var_t)
1851
srv_n_spin_wait_rounds= innodb_sync_spin_loops.get();
1854
static void innodb_spin_wait_delay_update(Session *, sql_var_t)
1856
srv_spin_wait_delay= innodb_spin_wait_delay.get();
1859
static void innodb_thread_sleep_delay_update(Session *, sql_var_t)
1861
srv_thread_sleep_delay= innodb_thread_sleep_delay.get();
1864
static void innodb_read_ahead_threshold_update(Session *, sql_var_t)
1866
srv_read_ahead_threshold= innodb_read_ahead_threshold.get();
1870
static int innodb_commit_concurrency_validate(Session *session, set_var *var)
1872
uint64_t new_value= var->getInteger();
1874
if ((innobase_commit_concurrency.get() == 0 && new_value != 0) ||
1875
(innobase_commit_concurrency.get() != 0 && new_value == 0))
1877
push_warning_printf(session,
1878
DRIZZLE_ERROR::WARN_LEVEL_WARN,
1880
_("Once InnoDB is running, innodb_commit_concurrency "
1881
"must not change between zero and nonzero."));
1887
/*************************************************************//**
1888
Check if it is a valid file format. This function is registered as
1889
a callback with MySQL.
1890
@return 0 for valid file format */
1893
innodb_file_format_name_validate(
1894
/*=============================*/
1895
Session* , /*!< in: thread handle */
1898
const char *file_format_input = var->value->str_value.ptr();
1899
if (file_format_input == NULL)
1902
if (file_format_input != NULL) {
1905
format_id = innobase_file_format_name_lookup(
1908
if (format_id <= DICT_TF_FORMAT_MAX) {
1909
innobase_file_format_name =
1910
trx_sys_file_format_id_to_name(format_id);
1919
/*************************************************************//**
1920
Check if it is a valid value of innodb_change_buffering. This function is
1921
registered as a callback with MySQL.
1922
@return 0 for valid innodb_change_buffering */
1925
innodb_change_buffering_validate(
1926
/*=============================*/
1927
Session* , /*!< in: thread handle */
1930
const char *change_buffering_input = var->value->str_value.ptr();
1932
if (change_buffering_input == NULL)
1938
use < UT_ARR_SIZE(innobase_change_buffering_values);
1940
if (!innobase_strcasecmp(change_buffering_input,
1941
innobase_change_buffering_values[use]))
1943
ibuf_use= static_cast<ibuf_use_t>(use);
1952
/*************************************************************//**
1953
Check if valid argument to innodb_file_format_max. This function
1954
is registered as a callback with MySQL.
1955
@return 0 for valid file format */
1958
innodb_file_format_max_validate(
1959
/*==============================*/
1960
Session* session, /*!< in: thread handle */
1963
const char *file_format_input = var->value->str_value.ptr();
1964
if (file_format_input == NULL)
1967
if (file_format_input != NULL) {
1968
int format_id = innobase_file_format_validate_and_set(file_format_input);
1970
if (format_id > DICT_TF_FORMAT_MAX) {
1971
/* DEFAULT is "on", which is invalid at runtime. */
1975
if (format_id >= 0) {
1976
innobase_file_format_max.assign(
1977
trx_sys_file_format_id_to_name((uint)format_id));
1979
/* Update the max format id in the system tablespace. */
1980
const char *name_buff;
1982
if (trx_sys_file_format_max_set(format_id, &name_buff))
1984
errmsg_printf(error::WARN,
1985
" [Info] InnoDB: the file format in the system "
1986
"tablespace is now set to %s.\n", name_buff);
1987
innobase_file_format_max= name_buff;
1992
push_warning_printf(session,
1993
DRIZZLE_ERROR::WARN_LEVEL_WARN,
1995
"InnoDB: invalid innodb_file_format_max "
1996
"value; can be any format up to %s "
1997
"or equivalent id of %d",
1998
trx_sys_file_format_id_to_name(DICT_TF_FORMAT_MAX),
1999
DICT_TF_FORMAT_MAX);
2007
1793
/*********************************************************************//**
2008
1794
Opens an InnoDB database.
2009
1795
@return 0 on success, error code on failure */
2019
1805
InnobaseEngine *actuall_engine_ptr;
2020
1806
const module::option_map &vm= context.getOptions();
2022
srv_auto_extend_increment= innodb_auto_extend_increment.get();
2023
srv_io_capacity= innodb_io_capacity.get();
2024
srv_purge_batch_size= innodb_purge_batch_size.get();
2025
srv_n_purge_threads= innodb_n_purge_threads.get();
2026
srv_flush_log_at_trx_commit= innodb_flush_log_at_trx_commit.get();
2027
srv_max_buf_pool_modified_pct= innodb_max_dirty_pages_pct.get();
2028
srv_max_purge_lag= innodb_max_purge_lag.get();
2029
srv_stats_sample_pages= innodb_stats_sample_pages.get();
2030
srv_n_free_tickets_to_enter= innodb_concurrency_tickets.get();
2031
srv_replication_delay= innodb_replication_delay.get();
2032
srv_thread_concurrency= innobase_thread_concurrency.get();
2033
srv_n_spin_wait_rounds= innodb_sync_spin_loops.get();
2034
srv_spin_wait_delay= innodb_spin_wait_delay.get();
2035
srv_thread_sleep_delay= innodb_thread_sleep_delay.get();
2036
srv_read_ahead_threshold= innodb_read_ahead_threshold.get();
2038
1808
/* Inverted Booleans */
2040
1810
innobase_use_checksums= (vm.count("disable-checksums")) ? false : true;
2041
1811
innobase_use_doublewrite= (vm.count("disable-doublewrite")) ? false : true;
2042
1812
srv_adaptive_flushing= (vm.count("disable-adaptive-flushing")) ? false : true;
2043
1813
srv_use_sys_malloc= (vm.count("use-internal-malloc")) ? false : true;
2044
srv_use_native_aio= (vm.count("disable-native-aio")) ? false : true;
2045
support_xa= (vm.count("disable-xa")) ? false : true;
2046
btr_search_enabled= (vm.count("disable-adaptive-hash-index")) ? false : true;
2049
/* Hafta do this here because we need to late-bind the default value */
1814
(SessionVAR(NULL,support_xa))= (vm.count("disable-xa")) ? false : true;
1815
(SessionVAR(NULL,table_locks))= (vm.count("disable-table-locks")) ? false : true;
1817
if (vm.count("io-capacity"))
1819
if (srv_io_capacity < 100)
1821
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for io-capacity\n"));
2050
1826
if (vm.count("data-home-dir"))
2052
innobase_data_home_dir= vm["data-home-dir"].as<string>();
2056
innobase_data_home_dir= getDataHome().file_string();
1828
innobase_data_home_dir= strdup(vm["data-home-dir"].as<string>().c_str());
1832
innobase_data_home_dir= strdup(getDataHome().file_string().c_str());
1835
if (vm.count("fast-shutdown"))
1837
if (innobase_fast_shutdown > 2)
1839
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for fast-shutdown\n"));
1844
if (vm.count("file-format-check"))
1846
innobase_file_format_check= const_cast<char *>(vm["file-format-check"].as<string>().c_str());
1849
if (vm.count("flush-log-at-trx-commit"))
1851
if (srv_flush_log_at_trx_commit > 2)
1853
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for flush-log-at-trx-commit\n"));
1858
if (vm.count("flush-method"))
1860
innobase_file_flush_method= const_cast<char *>(vm["flush-method"].as<string>().c_str());
1864
innobase_file_flush_method= NULL;
1867
#ifdef UNIV_LOG_ARCHIVE
1868
if (vm.count("log-arch-dir"))
1870
innobase_log_arch_dir= const_cast<char *>(vm["log-arch-dir"].as<string>().c_str());
1875
innobase_log_arch_dir= NULL;
1877
#endif /* UNIV_LOG_ARCHIVE */
1879
if (vm.count("max-dirty-pages-pct"))
1881
if (srv_max_buf_pool_modified_pct > 99)
1883
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for max-dirty-pages-pct\n"));
1888
if (vm.count("stats-sample-pages"))
1890
if (srv_stats_sample_pages < 8)
1892
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for stats-sample-pages\n"));
1897
if (vm.count("additional-mem-pool-size"))
1899
align_value(innobase_additional_mem_pool_size);
1901
if (innobase_additional_mem_pool_size < 512*1024L)
1903
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for additional-mem-pool-size\n"));
1909
if (vm.count("autoextend-increment"))
1911
if (srv_auto_extend_increment < 1 || srv_auto_extend_increment > 1000)
1913
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for autoextend-increment\n"));
1918
if (vm.count("buffer-pool-size"))
1920
align_value(innobase_buffer_pool_size, 1024*1024);
1921
if (innobase_buffer_pool_size < 5*1024*1024)
1923
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for buffer-pool-size\n"));
1929
if (vm.count("commit-concurrency"))
1931
if (srv_replication_delay > 1000)
1933
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for commit-concurrency\n"));
1938
if (vm.count("concurrency-tickets"))
1940
if (srv_n_free_tickets_to_enter < 1)
1942
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for concurrency-tickets\n"));
1947
if (vm.count("read-io-threads"))
1949
if (innobase_read_io_threads < 1 || innobase_read_io_threads > 64)
1951
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for read-io-threads\n"));
1956
if (vm.count("write-io-threads"))
1958
if (innobase_write_io_threads < 1 || innobase_write_io_threads > 64)
1960
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for write-io-threads\n"));
1965
if (vm.count("force-recovery"))
1967
if (innobase_force_recovery > 6)
1969
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for force-recovery\n"));
1974
if (vm.count("log-buffer-size"))
1976
align_value(innobase_log_buffer_size);
1977
if (innobase_log_buffer_size < 256*1024L)
1979
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for log-file-size\n"));
1984
if (vm.count("log-file-size"))
1986
align_value(innobase_log_file_size, 1024*1024);
1987
if (innobase_log_file_size < 1*1024*1024L)
1989
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for log-file-size\n"));
1994
if (vm.count("log-files-in-group"))
1996
if (innobase_log_files_in_group < 2 || innobase_log_files_in_group > 100)
1998
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for log-files-in-group\n"));
2003
if (vm.count("mirrored-log-groups"))
2005
if (innobase_mirrored_log_groups < 1 || innobase_mirrored_log_groups > 10)
2007
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for mirrored-log-groups\n"));
2012
if (vm.count("open-files"))
2014
if (innobase_open_files < 10)
2016
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for open-files\n"));
2021
if (vm.count("thread-concurrency"))
2023
if (srv_thread_concurrency > 1000)
2025
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for thread-concurrency\n"));
2060
2030
if (vm.count("data-file-path"))
2062
innobase_data_file_path= vm["data-file-path"].as<string>();
2032
innobase_data_file_path= const_cast<char *>(vm["data-file-path"].as<string>().c_str());
2036
innobase_data_file_path= NULL;
2039
if (vm.count("version"))
2041
innodb_version_str= const_cast<char *>(vm["version"].as<string>().c_str());
2044
if (vm.count("read-ahead-threshold"))
2046
if (srv_read_ahead_threshold > 64)
2048
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for read-ahead-threshold\n"));
2053
if (vm.count("strict-mode"))
2055
(SessionVAR(NULL,strict_mode))= vm["strict-mode"].as<bool>();
2058
if (vm.count("lock-wait-timeout"))
2060
if (vm["lock-wait-timeout"].as<unsigned long>() < 1 || vm["lock-wait-timeout"].as<unsigned long>() > 1024*1024*1024)
2062
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value for lock-wait-timeout\n"));
2066
(SessionVAR(NULL,lock_wait_timeout))= vm["lock-wait-timeout"].as<unsigned long>();
2066
2069
innodb_engine_ptr= actuall_engine_ptr= new InnobaseEngine(innobase_engine_name);
2269
2314
err = innobase_start_or_create_for_mysql();
2271
if (err != DB_SUCCESS)
2273
goto mem_free_and_error;
2276
err = dict_create_sys_replication_log();
2278
2316
if (err != DB_SUCCESS) {
2279
2317
goto mem_free_and_error;
2283
innobase_old_blocks_pct = buf_LRU_old_ratio_update(innobase_old_blocks_pct.get(),
2286
2320
innobase_open_tables = hash_create(200);
2321
pthread_mutex_init(&innobase_share_mutex, MY_MUTEX_INIT_FAST);
2322
pthread_mutex_init(&prepare_commit_mutex, MY_MUTEX_INIT_FAST);
2323
pthread_mutex_init(&commit_threads_m, MY_MUTEX_INIT_FAST);
2324
pthread_mutex_init(&commit_cond_m, MY_MUTEX_INIT_FAST);
2325
pthread_cond_init(&commit_cond, NULL);
2287
2326
innodb_inited= 1;
2289
2328
actuall_engine_ptr->dropTemporarySchema();
2291
context.add(new InnodbStatusTool);
2330
status_table_function_ptr= new InnodbStatusTool;
2293
2332
context.add(innodb_engine_ptr);
2295
context.add(new(std::nothrow)CmpTool(false));
2297
context.add(new(std::nothrow)CmpTool(true));
2299
context.add(new(std::nothrow)CmpmemTool(false));
2301
context.add(new(std::nothrow)CmpmemTool(true));
2303
context.add(new(std::nothrow)InnodbTrxTool("INNODB_TRX"));
2305
context.add(new(std::nothrow)InnodbTrxTool("INNODB_LOCKS"));
2307
context.add(new(std::nothrow)InnodbTrxTool("INNODB_LOCK_WAITS"));
2309
context.add(new(std::nothrow)InnodbSysTablesTool());
2311
context.add(new(std::nothrow)InnodbSysTableStatsTool());
2313
context.add(new(std::nothrow)InnodbSysIndexesTool());
2315
context.add(new(std::nothrow)InnodbSysColumnsTool());
2317
context.add(new(std::nothrow)InnodbSysFieldsTool());
2319
context.add(new(std::nothrow)InnodbSysForeignTool());
2321
context.add(new(std::nothrow)InnodbSysForeignColsTool());
2334
context.add(status_table_function_ptr);
2336
cmp_tool= new(std::nothrow)CmpTool(false);
2337
context.add(cmp_tool);
2339
cmp_reset_tool= new(std::nothrow)CmpTool(true);
2340
context.add(cmp_reset_tool);
2342
cmp_mem_tool= new(std::nothrow)CmpmemTool(false);
2343
context.add(cmp_mem_tool);
2345
cmp_mem_reset_tool= new(std::nothrow)CmpmemTool(true);
2346
context.add(cmp_mem_reset_tool);
2348
innodb_trx_tool= new(std::nothrow)InnodbTrxTool("INNODB_TRX");
2349
context.add(innodb_trx_tool);
2351
innodb_locks_tool= new(std::nothrow)InnodbTrxTool("INNODB_LOCKS");
2352
context.add(innodb_locks_tool);
2354
innodb_lock_waits_tool= new(std::nothrow)InnodbTrxTool("INNODB_LOCK_WAITS");
2355
context.add(innodb_lock_waits_tool);
2323
2357
context.add(new(std::nothrow)InnodbInternalTables());
2324
context.add(new(std::nothrow)InnodbReplicationTable());
2326
if (innobase_use_replication_log)
2328
ReplicationLog *replication_logger= new(std::nothrow)ReplicationLog();
2329
context.add(replication_logger);
2330
ReplicationLog::setup(replication_logger);
2333
context.registerVariable(new sys_var_const_string_val("data-home-dir", innobase_data_home_dir));
2334
context.registerVariable(new sys_var_const_string_val("flush-method",
2335
vm.count("flush-method") ? vm["flush-method"].as<string>() : ""));
2336
context.registerVariable(new sys_var_const_string_val("log-group-home-dir", innobase_log_group_home_dir));
2337
context.registerVariable(new sys_var_const_string_val("data-file-path", innobase_data_file_path));
2338
context.registerVariable(new sys_var_const_string_val("version", vm["version"].as<string>()));
2341
context.registerVariable(new sys_var_bool_ptr_readonly("replication_log", &innobase_use_replication_log));
2342
context.registerVariable(new sys_var_bool_ptr_readonly("checksums", &innobase_use_checksums));
2343
context.registerVariable(new sys_var_bool_ptr_readonly("doublewrite", &innobase_use_doublewrite));
2344
context.registerVariable(new sys_var_bool_ptr("file-per-table", &srv_file_per_table));
2345
context.registerVariable(new sys_var_bool_ptr_readonly("file-format-check", &innobase_file_format_check));
2346
context.registerVariable(new sys_var_bool_ptr("adaptive-flushing", &srv_adaptive_flushing));
2347
context.registerVariable(new sys_var_bool_ptr("status-file", &innobase_create_status_file));
2348
context.registerVariable(new sys_var_bool_ptr_readonly("use-sys-malloc", &srv_use_sys_malloc));
2349
context.registerVariable(new sys_var_bool_ptr_readonly("use-native-aio", &srv_use_native_aio));
2351
context.registerVariable(new sys_var_bool_ptr("support-xa", &support_xa));
2352
context.registerVariable(new sys_var_bool_ptr("strict_mode", &strict_mode));
2353
context.registerVariable(new sys_var_constrained_value<uint32_t>("lock_wait_timeout", lock_wait_timeout));
2355
context.registerVariable(new sys_var_constrained_value_readonly<size_t>("additional_mem_pool_size",innobase_additional_mem_pool_size));
2356
context.registerVariable(new sys_var_constrained_value<uint32_t>("autoextend_increment",
2357
innodb_auto_extend_increment,
2358
auto_extend_update));
2359
context.registerVariable(new sys_var_constrained_value<uint32_t>("io_capacity",
2361
io_capacity_update));
2362
context.registerVariable(new sys_var_constrained_value<uint32_t>("purge_batch_size",
2363
innodb_purge_batch_size,
2364
purge_batch_update));
2365
context.registerVariable(new sys_var_constrained_value<uint32_t>("purge_threads",
2366
innodb_n_purge_threads,
2367
purge_threads_update));
2368
context.registerVariable(new sys_var_constrained_value<uint32_t>("fast_shutdown", innobase_fast_shutdown));
2369
context.registerVariable(new sys_var_std_string("file_format",
2370
innobase_file_format_name,
2371
innodb_file_format_name_validate));
2372
context.registerVariable(new sys_var_std_string("change_buffering",
2373
innobase_change_buffering,
2374
innodb_change_buffering_validate));
2375
context.registerVariable(new sys_var_std_string("file_format_max",
2376
innobase_file_format_max,
2377
innodb_file_format_max_validate));
2378
context.registerVariable(new sys_var_constrained_value_readonly<size_t>("buffer_pool_size", innobase_buffer_pool_size));
2379
context.registerVariable(new sys_var_constrained_value_readonly<int64_t>("log_file_size", innobase_log_file_size));
2380
context.registerVariable(new sys_var_constrained_value_readonly<uint32_t>("flush_log_at_trx_commit",
2381
innodb_flush_log_at_trx_commit));
2382
context.registerVariable(new sys_var_constrained_value_readonly<unsigned int>("max_dirty_pages_pct",
2383
innodb_max_dirty_pages_pct));
2384
context.registerVariable(new sys_var_constrained_value_readonly<uint64_t>("max_purge_lag", innodb_max_purge_lag));
2385
context.registerVariable(new sys_var_constrained_value_readonly<uint64_t>("stats_sample_pages", innodb_stats_sample_pages));
2386
context.registerVariable(new sys_var_bool_ptr("adaptive_hash_index", &btr_search_enabled, innodb_adaptive_hash_index_update));
2388
context.registerVariable(new sys_var_constrained_value<uint32_t>("commit_concurrency",
2389
innobase_commit_concurrency,
2390
innodb_commit_concurrency_validate));
2391
context.registerVariable(new sys_var_constrained_value<uint32_t>("concurrency_tickets",
2392
innodb_concurrency_tickets));
2393
context.registerVariable(new sys_var_constrained_value_readonly<uint32_t>("read_io_threads", innobase_read_io_threads));
2394
context.registerVariable(new sys_var_constrained_value_readonly<uint32_t>("write_io_threads", innobase_write_io_threads));
2395
context.registerVariable(new sys_var_constrained_value_readonly<uint64_t>("replication_delay", innodb_replication_delay));
2396
context.registerVariable(new sys_var_constrained_value_readonly<uint32_t>("force_recovery", innobase_force_recovery));
2397
context.registerVariable(new sys_var_constrained_value_readonly<size_t>("log_buffer_size", innobase_log_buffer_size));
2398
context.registerVariable(new sys_var_constrained_value_readonly<uint32_t>("log_files_in_group", innobase_log_files_in_group));
2399
context.registerVariable(new sys_var_constrained_value_readonly<uint32_t>("mirrored_log_groups", innobase_mirrored_log_groups));
2400
context.registerVariable(new sys_var_constrained_value_readonly<uint32_t>("open_files", innobase_open_files));
2401
context.registerVariable(new sys_var_constrained_value<uint32_t>("old_blocks_pct",
2402
innobase_old_blocks_pct,
2403
innodb_old_blocks_pct_update));
2404
context.registerVariable(new sys_var_uint32_t_ptr("old_blocks_time", &buf_LRU_old_threshold_ms));
2405
context.registerVariable(new sys_var_constrained_value<uint32_t>("sync_spin_loops", innodb_sync_spin_loops, innodb_sync_spin_loops_update));
2406
context.registerVariable(new sys_var_constrained_value<uint32_t>("spin_wait_delay", innodb_spin_wait_delay, innodb_spin_wait_delay_update));
2407
context.registerVariable(new sys_var_constrained_value<uint32_t>("thread_sleep_delay", innodb_thread_sleep_delay, innodb_thread_sleep_delay_update));
2408
context.registerVariable(new sys_var_constrained_value<uint32_t>("thread_concurrency",
2409
innobase_thread_concurrency,
2410
innodb_thread_concurrency_update));
2411
context.registerVariable(new sys_var_constrained_value<uint32_t>("read_ahead_threshold",
2412
innodb_read_ahead_threshold,
2413
innodb_read_ahead_threshold_update));
2414
2359
/* Get the current high water mark format. */
2415
innobase_file_format_max = trx_sys_file_format_max_get();
2416
btr_search_fully_disabled = (!btr_search_enabled);
2360
innobase_file_format_check = (char*) trx_sys_file_format_max_get();
9093
9003
/************************************************************//**
9004
Validate the file format check value, is it one of "on" or "off",
9005
as a side effect it sets the srv_check_file_format_at_startup variable.
9006
@return true if config value one of "on" or "off" */
9009
innobase_file_format_check_on_off(
9010
/*==============================*/
9011
const char* format_check) /*!< in: parameter value */
9015
if (!innobase_strcasecmp(format_check, "off")) {
9017
/* Set the value to disable checking. */
9018
srv_check_file_format_at_startup = DICT_TF_FORMAT_MAX + 1;
9020
} else if (!innobase_strcasecmp(format_check, "on")) {
9022
/* Set the value to the lowest supported format. */
9023
srv_check_file_format_at_startup = DICT_TF_FORMAT_51;
9031
/************************************************************//**
9094
9032
Validate the file format check config parameters, as a side effect it
9095
sets the srv_max_file_format_at_startup variable.
9033
sets the srv_check_file_format_at_startup variable.
9096
9034
@return the format_id if valid config value, otherwise, return -1 */
9099
9037
innobase_file_format_validate_and_set(
9100
9038
/*================================*/
9101
const char* format_max) /*!< in: parameter value */
9039
const char* format_check) /*!< in: parameter value */
9103
9041
uint format_id;
9105
format_id = innobase_file_format_name_lookup(format_max);
9043
format_id = innobase_file_format_name_lookup(format_check);
9107
9045
if (format_id < DICT_TF_FORMAT_MAX + 1) {
9108
srv_max_file_format_at_startup = format_id;
9046
srv_check_file_format_at_startup = format_id;
9109
9047
return((int) format_id);
9053
/*************************************************************//**
9054
Check if it is a valid file format. This function is registered as
9055
a callback with MySQL.
9056
@return 0 for valid file format */
9059
innodb_file_format_name_validate(
9060
/*=============================*/
9061
Session* , /*!< in: thread handle */
9062
drizzle_sys_var* , /*!< in: pointer to system
9064
void* save, /*!< out: immediate result
9065
for update function */
9066
drizzle_value* value) /*!< in: incoming string */
9068
const char* file_format_input;
9069
char buff[STRING_BUFFER_USUAL_SIZE];
9070
int len = sizeof(buff);
9073
ut_a(value != NULL);
9075
file_format_input = value->val_str(value, buff, &len);
9077
if (file_format_input != NULL) {
9080
format_id = innobase_file_format_name_lookup(
9083
if (format_id <= DICT_TF_FORMAT_MAX) {
9084
/* Save a pointer to the name in the
9085
'file_format_name_map' constant array. */
9086
*static_cast<const char**>(save) =
9087
trx_sys_file_format_id_to_name(format_id);
9093
*static_cast<const char**>(save) = NULL;
9097
/****************************************************************//**
9098
Update the system variable innodb_file_format using the "saved"
9099
value. This function is registered as a callback with MySQL. */
9102
innodb_file_format_name_update(
9103
/*===========================*/
9104
Session* , /*!< in: thread handle */
9105
drizzle_sys_var* , /*!< in: pointer to
9107
void* var_ptr, /*!< out: where the
9108
formal string goes */
9109
const void* save) /*!< in: immediate result
9110
from check function */
9112
const char* format_name;
9114
ut_a(var_ptr != NULL);
9117
format_name = *static_cast<const char*const*>(save);
9122
format_id = innobase_file_format_name_lookup(format_name);
9124
if (format_id <= DICT_TF_FORMAT_MAX) {
9125
srv_file_format = format_id;
9129
*static_cast<const char**>(var_ptr)
9130
= trx_sys_file_format_id_to_name(srv_file_format);
9133
/*************************************************************//**
9134
Check if valid argument to innodb_file_format_check. This
9135
function is registered as a callback with MySQL.
9136
@return 0 for valid file format */
9139
innodb_file_format_check_validate(
9140
/*==============================*/
9141
Session* session, /*!< in: thread handle */
9142
drizzle_sys_var* , /*!< in: pointer to system
9144
void* save, /*!< out: immediate result
9145
for update function */
9146
drizzle_value* value) /*!< in: incoming string */
9148
const char* file_format_input;
9149
char buff[STRING_BUFFER_USUAL_SIZE];
9150
int len = sizeof(buff);
9154
ut_a(value != NULL);
9156
file_format_input = value->val_str(value, buff, &len);
9158
if (file_format_input != NULL) {
9160
/* Check if user set on/off, we want to print a suitable
9161
message if they did so. */
9163
if (innobase_file_format_check_on_off(file_format_input)) {
9164
push_warning_printf(session,
9165
DRIZZLE_ERROR::WARN_LEVEL_WARN,
9167
"InnoDB: invalid innodb_file_format_check "
9168
"value; on/off can only be set at startup or "
9169
"in the configuration file");
9171
format_id = innobase_file_format_validate_and_set(file_format_input);
9172
if (format_id >= 0) {
9173
/* Save a pointer to the name in the
9174
'file_format_name_map' constant array. */
9175
*static_cast<const char**>(save) =
9176
trx_sys_file_format_id_to_name(
9182
push_warning_printf(session,
9183
DRIZZLE_ERROR::WARN_LEVEL_WARN,
9185
"InnoDB: invalid innodb_file_format_check "
9186
"value; can be any format up to %s "
9187
"or its equivalent numeric id",
9188
trx_sys_file_format_id_to_name(DICT_TF_FORMAT_MAX));
9193
*static_cast<const char**>(save) = NULL;
9197
/****************************************************************//**
9198
Update the system variable innodb_file_format_check using the "saved"
9199
value. This function is registered as a callback with MySQL. */
9202
innodb_file_format_check_update(
9203
/*============================*/
9204
Session* session, /*!< in: thread handle */
9205
drizzle_sys_var* , /*!< in: pointer to
9207
void* var_ptr, /*!< out: where the
9208
formal string goes */
9209
const void* save) /*!< in: immediate result
9210
from check function */
9212
const char* format_name_in;
9213
const char** format_name_out;
9217
ut_a(var_ptr != NULL);
9219
format_name_in = *static_cast<const char*const*>(save);
9221
if (!format_name_in) {
9226
format_id = innobase_file_format_name_lookup(format_name_in);
9228
if (format_id > DICT_TF_FORMAT_MAX) {
9229
/* DEFAULT is "on", which is invalid at runtime. */
9230
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
9232
"Ignoring SET innodb_file_format=%s",
9237
format_name_out = static_cast<const char**>(var_ptr);
9239
/* Update the max format id in the system tablespace. */
9240
if (trx_sys_file_format_max_set(format_id, format_name_out)) {
9241
ut_print_timestamp(stderr);
9243
" [Info] InnoDB: the file format in the system "
9244
"tablespace is now set to %s.\n", *format_name_out);
9248
/****************************************************************//**
9249
Update the system variable innodb_adaptive_hash_index using the "saved"
9250
value. This function is registered as a callback with MySQL. */
9253
innodb_adaptive_hash_index_update(
9254
/*==============================*/
9255
Session* , /*!< in: thread handle */
9256
drizzle_sys_var* , /*!< in: pointer to
9258
void* , /*!< out: where the
9259
formal string goes */
9260
const void* save) /*!< in: immediate result
9261
from check function */
9263
if (*(bool*) save) {
9264
btr_search_enable();
9266
btr_search_disable();
9270
/****************************************************************//**
9271
Update the system variable innodb_old_blocks_pct using the "saved"
9272
value. This function is registered as a callback with MySQL. */
9275
innodb_old_blocks_pct_update(
9276
/*=========================*/
9277
Session* , /*!< in: thread handle */
9278
drizzle_sys_var* , /*!< in: pointer to
9280
void* ,/*!< out: where the
9281
formal string goes */
9282
const void* save) /*!< in: immediate result
9283
from check function */
9285
innobase_old_blocks_pct = buf_LRU_old_ratio_update(
9286
*static_cast<const uint*>(save), TRUE);
9289
/*************************************************************//**
9290
Check if it is a valid value of innodb_change_buffering. This function is
9291
registered as a callback with MySQL.
9292
@return 0 for valid innodb_change_buffering */
9295
innodb_change_buffering_validate(
9296
/*=============================*/
9297
Session* , /*!< in: thread handle */
9298
drizzle_sys_var* , /*!< in: pointer to system
9300
void* save, /*!< out: immediate result
9301
for update function */
9302
drizzle_value* value) /*!< in: incoming string */
9304
const char* change_buffering_input;
9305
char buff[STRING_BUFFER_USUAL_SIZE];
9306
int len = sizeof(buff);
9309
ut_a(value != NULL);
9311
change_buffering_input = value->val_str(value, buff, &len);
9313
if (change_buffering_input != NULL) {
9316
for (use = 0; use < UT_ARR_SIZE(innobase_change_buffering_values);
9318
if (!innobase_strcasecmp(
9319
change_buffering_input,
9320
innobase_change_buffering_values[use])) {
9321
*(ibuf_use_t*) save = (ibuf_use_t) use;
9330
/****************************************************************//**
9331
Update the system variable innodb_change_buffering using the "saved"
9332
value. This function is registered as a callback with MySQL. */
9335
innodb_change_buffering_update(
9336
/*===========================*/
9337
Session* , /*!< in: thread handle */
9338
drizzle_sys_var* , /*!< in: pointer to
9340
void* var_ptr, /*!< out: where the
9341
formal string goes */
9342
const void* save) /*!< in: immediate result
9343
from check function */
9345
ut_a(var_ptr != NULL);
9347
ut_a((*(ibuf_use_t*) save) < IBUF_USE_COUNT);
9349
ibuf_use = *(const ibuf_use_t*) save;
9351
*(const char**) var_ptr = innobase_change_buffering_values[ibuf_use];
9354
/* plugin options */
9355
static DRIZZLE_SYSVAR_BOOL(checksums, innobase_use_checksums,
9356
PLUGIN_VAR_NOCMDARG | PLUGIN_VAR_READONLY,
9357
"Enable InnoDB checksums validation (enabled by default). ",
9360
static DRIZZLE_SYSVAR_STR(data_home_dir, innobase_data_home_dir,
9361
PLUGIN_VAR_READONLY,
9362
"The common part for InnoDB table spaces.",
9365
static DRIZZLE_SYSVAR_BOOL(doublewrite, innobase_use_doublewrite,
9366
PLUGIN_VAR_NOCMDARG | PLUGIN_VAR_READONLY,
9367
"Enable InnoDB doublewrite buffer (enabled by default). ",
9370
static DRIZZLE_SYSVAR_ULONG(io_capacity, srv_io_capacity,
9371
PLUGIN_VAR_RQCMDARG,
9372
"Number of IOPs the server can do. Tunes the background IO rate",
9373
NULL, NULL, 200, 100, ~0L, 0);
9375
static DRIZZLE_SYSVAR_ULONG(fast_shutdown, innobase_fast_shutdown,
9376
PLUGIN_VAR_OPCMDARG,
9377
"Speeds up the shutdown process of the InnoDB storage engine. Possible "
9378
"values are 0, 1 (faster)"
9379
" or 2 (fastest - crash-like)"
9381
NULL, NULL, 1, 0, 2, 0);
9383
static DRIZZLE_SYSVAR_BOOL(file_per_table, srv_file_per_table,
9384
PLUGIN_VAR_NOCMDARG,
9385
"Stores each InnoDB table to an .ibd file in the database dir.",
9388
static DRIZZLE_SYSVAR_STR(file_format, innobase_file_format_name,
9389
PLUGIN_VAR_RQCMDARG,
9390
"File format to use for new tables in .ibd files.",
9391
innodb_file_format_name_validate,
9392
innodb_file_format_name_update, "Antelope");
9394
/* If a new file format is introduced, the file format
9395
name needs to be updated accordingly. Please refer to
9396
file_format_name_map[] defined in trx0sys.c for the next
9397
file format name. */
9398
static DRIZZLE_SYSVAR_STR(file_format_check, innobase_file_format_check,
9399
PLUGIN_VAR_OPCMDARG,
9400
"The highest file format in the tablespace.",
9401
innodb_file_format_check_validate,
9402
innodb_file_format_check_update,
9405
static DRIZZLE_SYSVAR_ULONG(flush_log_at_trx_commit, srv_flush_log_at_trx_commit,
9406
PLUGIN_VAR_OPCMDARG,
9407
"Set to 0 (write and flush once per second),"
9408
" 1 (write and flush at each commit)"
9409
" or 2 (write at commit, flush once per second).",
9410
NULL, NULL, 1, 0, 2, 0);
9412
static DRIZZLE_SYSVAR_STR(flush_method, innobase_file_flush_method,
9413
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
9414
"With which method to flush data.", NULL, NULL, NULL);
9416
#ifdef UNIV_LOG_ARCHIVE
9417
static DRIZZLE_SYSVAR_STR(log_arch_dir, innobase_log_arch_dir,
9418
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
9419
"Where full logs should be archived.", NULL, NULL, NULL);
9421
static DRIZZLE_SYSVAR_BOOL(log_archive, innobase_log_archive,
9422
PLUGIN_VAR_OPCMDARG | PLUGIN_VAR_READONLY,
9423
"Set to 1 if you want to have logs archived.", NULL, NULL, FALSE);
9424
#endif /* UNIV_LOG_ARCHIVE */
9426
static DRIZZLE_SYSVAR_STR(log_group_home_dir, innobase_log_group_home_dir,
9427
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
9428
"Path to InnoDB log files.", NULL, NULL, NULL);
9430
static DRIZZLE_SYSVAR_ULONG(max_dirty_pages_pct, srv_max_buf_pool_modified_pct,
9431
PLUGIN_VAR_RQCMDARG,
9432
"Percentage of dirty pages allowed in bufferpool.",
9433
NULL, NULL, 75, 0, 99, 0);
9435
static DRIZZLE_SYSVAR_BOOL(adaptive_flushing, srv_adaptive_flushing,
9436
PLUGIN_VAR_NOCMDARG,
9437
"Attempt flushing dirty pages to avoid IO bursts at checkpoints.",
9440
static DRIZZLE_SYSVAR_ULONG(max_purge_lag, srv_max_purge_lag,
9441
PLUGIN_VAR_RQCMDARG,
9442
"Desired maximum length of the purge queue (0 = no limit)",
9443
NULL, NULL, 0, 0, ~0L, 0);
9445
static DRIZZLE_SYSVAR_BOOL(status_file, innobase_create_status_file,
9446
PLUGIN_VAR_OPCMDARG | PLUGIN_VAR_NOSYSVAR,
9447
"Enable SHOW INNODB STATUS output in the innodb_status.<pid> file",
9450
static DRIZZLE_SYSVAR_ULONGLONG(stats_sample_pages, srv_stats_sample_pages,
9451
PLUGIN_VAR_RQCMDARG,
9452
"The number of index pages to sample when calculating statistics (default 8)",
9453
NULL, NULL, 8, 1, ~0ULL, 0);
9455
static DRIZZLE_SYSVAR_BOOL(adaptive_hash_index, btr_search_enabled,
9456
PLUGIN_VAR_OPCMDARG,
9457
"Enable InnoDB adaptive hash index (enabled by default).",
9458
NULL, innodb_adaptive_hash_index_update, TRUE);
9460
static DRIZZLE_SYSVAR_ULONG(replication_delay, srv_replication_delay,
9461
PLUGIN_VAR_RQCMDARG,
9462
"Replication thread delay (ms) on the slave server if "
9463
"innodb_thread_concurrency is reached (0 by default)",
9464
NULL, NULL, 0, 0, ~0UL, 0);
9466
static DRIZZLE_SYSVAR_LONG(additional_mem_pool_size, innobase_additional_mem_pool_size,
9467
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
9468
"Size of a memory pool InnoDB uses to store data dictionary information and other internal data structures.",
9469
NULL, NULL, 8*1024*1024L, 512*1024L, LONG_MAX, 1024);
9471
static DRIZZLE_SYSVAR_UINT(autoextend_increment, srv_auto_extend_increment,
9472
PLUGIN_VAR_RQCMDARG,
9473
"Data file autoextend increment in megabytes",
9474
NULL, NULL, 8L, 1L, 1000L, 0);
9476
static DRIZZLE_SYSVAR_LONGLONG(buffer_pool_size, innobase_buffer_pool_size,
9477
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
9478
"The size of the memory buffer InnoDB uses to cache data and indexes of its tables.",
9479
NULL, NULL, 128*1024*1024L, 5*1024*1024L, INT64_MAX, 1024*1024L);
9481
static DRIZZLE_SYSVAR_ULONG(commit_concurrency, innobase_commit_concurrency,
9482
PLUGIN_VAR_RQCMDARG,
9483
"Helps in performance tuning in heavily concurrent environments.",
9484
innobase_commit_concurrency_validate, NULL, 0, 0, 1000, 0);
9486
static DRIZZLE_SYSVAR_ULONG(concurrency_tickets, srv_n_free_tickets_to_enter,
9487
PLUGIN_VAR_RQCMDARG,
9488
"Number of times a thread is allowed to enter InnoDB within the same SQL query after it has once got the ticket",
9489
NULL, NULL, 500L, 1L, ~0L, 0);
9491
static DRIZZLE_SYSVAR_ULONG(read_io_threads, innobase_read_io_threads,
9492
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
9493
"Number of background read I/O threads in InnoDB.",
9494
NULL, NULL, 4, 1, 64, 0);
9496
static DRIZZLE_SYSVAR_ULONG(write_io_threads, innobase_write_io_threads,
9497
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
9498
"Number of background write I/O threads in InnoDB.",
9499
NULL, NULL, 4, 1, 64, 0);
9501
static DRIZZLE_SYSVAR_LONG(force_recovery, innobase_force_recovery,
9502
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
9503
"Helps to save your data in case the disk image of the database becomes corrupt.",
9504
NULL, NULL, 0, 0, 6, 0);
9506
static DRIZZLE_SYSVAR_LONG(log_buffer_size, innobase_log_buffer_size,
9507
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
9508
"The size of the buffer which InnoDB uses to write log to the log files on disk.",
9509
NULL, NULL, 8*1024*1024L, 256*1024L, LONG_MAX, 1024);
9511
static DRIZZLE_SYSVAR_LONGLONG(log_file_size, innobase_log_file_size,
9512
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
9513
"Size of each log file in a log group.",
9514
NULL, NULL, 20*1024*1024L, 1*1024*1024L, INT64_MAX, 1024*1024L);
9516
static DRIZZLE_SYSVAR_LONG(log_files_in_group, innobase_log_files_in_group,
9517
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
9518
"Number of log files in the log group. InnoDB writes to the files in a circular fashion. Value 3 is recommended here.",
9519
NULL, NULL, 2, 2, 100, 0);
9521
static DRIZZLE_SYSVAR_LONG(mirrored_log_groups, innobase_mirrored_log_groups,
9522
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
9523
"Number of identical copies of log groups we keep for the database. Currently this should be set to 1.",
9524
NULL, NULL, 1, 1, 10, 0);
9526
static DRIZZLE_SYSVAR_UINT(old_blocks_pct, innobase_old_blocks_pct,
9527
PLUGIN_VAR_RQCMDARG,
9528
"Percentage of the buffer pool to reserve for 'old' blocks.",
9529
NULL, innodb_old_blocks_pct_update, 100 * 3 / 8, 5, 95, 0);
9531
static DRIZZLE_SYSVAR_UINT(old_blocks_time, buf_LRU_old_threshold_ms,
9532
PLUGIN_VAR_RQCMDARG,
9533
"Move blocks to the 'new' end of the buffer pool if the first access"
9534
" was at least this many milliseconds ago."
9535
" The timeout is disabled if 0 (the default).",
9536
NULL, NULL, 0, 0, UINT32_MAX, 0);
9538
static DRIZZLE_SYSVAR_LONG(open_files, innobase_open_files,
9539
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
9540
"How many files at the maximum InnoDB keeps open at the same time.",
9541
NULL, NULL, 300L, 10L, LONG_MAX, 0);
9543
static DRIZZLE_SYSVAR_ULONG(sync_spin_loops, srv_n_spin_wait_rounds,
9544
PLUGIN_VAR_RQCMDARG,
9545
"Count of spin-loop rounds in InnoDB mutexes (30 by default)",
9546
NULL, NULL, 30L, 0L, ~0L, 0);
9548
static DRIZZLE_SYSVAR_ULONG(spin_wait_delay, srv_spin_wait_delay,
9549
PLUGIN_VAR_OPCMDARG,
9550
"Maximum delay between polling for a spin lock (6 by default)",
9551
NULL, NULL, 6L, 0L, ~0L, 0);
9553
static DRIZZLE_SYSVAR_ULONG(thread_concurrency, srv_thread_concurrency,
9554
PLUGIN_VAR_RQCMDARG,
9555
"Helps in performance tuning in heavily concurrent environments. Sets the maximum number of threads allowed inside InnoDB. Value 0 will disable the thread throttling.",
9556
NULL, NULL, 0, 0, 1000, 0);
9558
static DRIZZLE_SYSVAR_ULONG(thread_sleep_delay, srv_thread_sleep_delay,
9559
PLUGIN_VAR_RQCMDARG,
9560
"Time of innodb thread sleeping before joining InnoDB queue (usec). Value 0 disable a sleep",
9561
NULL, NULL, 10000L, 0L, ~0L, 0);
9563
static DRIZZLE_SYSVAR_STR(data_file_path, innobase_data_file_path,
9564
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
9565
"Path to individual files and their sizes.",
9568
static DRIZZLE_SYSVAR_STR(version, innodb_version_str,
9569
PLUGIN_VAR_NOCMDOPT | PLUGIN_VAR_READONLY,
9570
"InnoDB version", NULL, NULL, INNODB_VERSION_STR);
9572
static DRIZZLE_SYSVAR_BOOL(use_sys_malloc, srv_use_sys_malloc,
9573
PLUGIN_VAR_NOCMDARG | PLUGIN_VAR_READONLY,
9574
"Use OS memory allocator instead of InnoDB's internal memory allocator",
9577
static DRIZZLE_SYSVAR_STR(change_buffering, innobase_change_buffering,
9578
PLUGIN_VAR_RQCMDARG,
9579
"Buffer changes to reduce random access: "
9580
"OFF, ON, none, inserts.",
9581
innodb_change_buffering_validate,
9582
innodb_change_buffering_update, NULL);
9584
static DRIZZLE_SYSVAR_ULONG(read_ahead_threshold, srv_read_ahead_threshold,
9585
PLUGIN_VAR_RQCMDARG,
9586
"Number of pages that must be accessed sequentially for InnoDB to "
9587
"trigger a readahead.",
9588
NULL, NULL, 56, 0, 64, 0);
9117
9590
static void init_options(drizzled::module::option_context &context)
9171
9642
context("disable-stats-on-metadata",
9172
9643
"Disable statistics gathering for metadata commands such as SHOW TABLE STATUS (on by default)");
9173
9644
context("stats-sample-pages",
9174
po::value<uint64_nonzero_constraint>(&innodb_stats_sample_pages)->default_value(8),
9645
po::value<uint64_t>(&srv_stats_sample_pages)->default_value(8),
9175
9646
"The number of index pages to sample when calculating statistics (default 8)");
9176
9647
context("disable-adaptive-hash-index",
9177
9648
"Enable InnoDB adaptive hash index (enabled by default)");
9178
9649
context("replication-delay",
9179
po::value<uint64_constraint>(&innodb_replication_delay)->default_value(0),
9650
po::value<unsigned long>(&srv_replication_delay)->default_value(0),
9180
9651
"Replication thread delay (ms) on the slave server if innodb_thread_concurrency is reached (0 by default)");
9181
9652
context("additional-mem-pool-size",
9182
po::value<additional_mem_pool_constraint>(&innobase_additional_mem_pool_size)->default_value(8*1024*1024L),
9653
po::value<long>(&innobase_additional_mem_pool_size)->default_value(8*1024*1024L),
9183
9654
"Size of a memory pool InnoDB uses to store data dictionary information and other internal data structures.");
9184
9655
context("autoextend-increment",
9185
po::value<autoextend_constraint>(&innodb_auto_extend_increment)->default_value(64L),
9656
po::value<uint32_t>(&srv_auto_extend_increment)->default_value(8L),
9186
9657
"Data file autoextend increment in megabytes");
9187
9658
context("buffer-pool-size",
9188
po::value<buffer_pool_constraint>(&innobase_buffer_pool_size)->default_value(128*1024*1024L),
9659
po::value<int64_t>(&innobase_buffer_pool_size)->default_value(128*1024*1024L),
9189
9660
"The size of the memory buffer InnoDB uses to cache data and indexes of its tables.");
9190
context("buffer-pool-instances",
9191
po::value<buffer_pool_instances_constraint>(&innobase_buffer_pool_instances)->default_value(1),
9192
"Number of buffer pool instances, set to higher value on high-end machines to increase scalability");
9194
9661
context("commit-concurrency",
9195
po::value<concurrency_constraint>(&innobase_commit_concurrency)->default_value(0),
9662
po::value<unsigned long>(&innobase_commit_concurrency)->default_value(0),
9196
9663
"Helps in performance tuning in heavily concurrent environments.");
9197
9664
context("concurrency-tickets",
9198
po::value<uint32_nonzero_constraint>(&innodb_concurrency_tickets)->default_value(500L),
9665
po::value<unsigned long>(&srv_n_free_tickets_to_enter)->default_value(500L),
9199
9666
"Number of times a thread is allowed to enter InnoDB within the same SQL query after it has once got the ticket");
9200
9667
context("read-io-threads",
9201
po::value<io_threads_constraint>(&innobase_read_io_threads)->default_value(4),
9668
po::value<unsigned long>(&innobase_read_io_threads)->default_value(4),
9202
9669
"Number of background read I/O threads in InnoDB.");
9203
9670
context("write-io-threads",
9204
po::value<io_threads_constraint>(&innobase_write_io_threads)->default_value(4),
9671
po::value<unsigned long>(&innobase_write_io_threads)->default_value(4),
9205
9672
"Number of background write I/O threads in InnoDB.");
9206
9673
context("force-recovery",
9207
po::value<force_recovery_constraint>(&innobase_force_recovery)->default_value(0),
9674
po::value<long>(&innobase_force_recovery)->default_value(0),
9208
9675
"Helps to save your data in case the disk image of the database becomes corrupt.");
9209
9676
context("log-buffer-size",
9210
po::value<log_buffer_constraint>(&innobase_log_buffer_size)->default_value(8*1024*1024L),
9677
po::value<long>(&innobase_log_buffer_size)->default_value(8*1024*1024L),
9211
9678
"The size of the buffer which InnoDB uses to write log to the log files on disk.");
9212
9679
context("log-file-size",
9213
po::value<log_file_constraint>(&innobase_log_file_size)->default_value(20*1024*1024L),
9680
po::value<int64_t>(&innobase_log_file_size)->default_value(20*1024*1024L),
9214
9681
"The size of the buffer which InnoDB uses to write log to the log files on disk.");
9215
9682
context("log-files-in-group",
9216
po::value<log_files_in_group_constraint>(&innobase_log_files_in_group)->default_value(2),
9683
po::value<long>(&innobase_log_files_in_group)->default_value(2),
9217
9684
"Number of log files in the log group. InnoDB writes to the files in a circular fashion.");
9218
9685
context("mirrored-log-groups",
9219
po::value<mirrored_log_groups_constraint>(&innobase_mirrored_log_groups)->default_value(1),
9686
po::value<long>(&innobase_mirrored_log_groups)->default_value(1),
9220
9687
"Number of identical copies of log groups we keep for the database. Currently this should be set to 1.");
9221
9688
context("open-files",
9222
po::value<open_files_constraint>(&innobase_open_files)->default_value(300L),
9689
po::value<long>(&innobase_open_files)->default_value(300L),
9223
9690
"How many files at the maximum InnoDB keeps open at the same time.");
9224
9691
context("sync-spin-loops",
9225
po::value<uint32_constraint>(&innodb_sync_spin_loops)->default_value(30L),
9692
po::value<unsigned long>(&srv_n_spin_wait_rounds)->default_value(30L),
9226
9693
"Count of spin-loop rounds in InnoDB mutexes (30 by default)");
9227
9694
context("spin-wait-delay",
9228
po::value<uint32_constraint>(&innodb_spin_wait_delay)->default_value(6L),
9695
po::value<unsigned long>(&srv_spin_wait_delay)->default_value(6L),
9229
9696
"Maximum delay between polling for a spin lock (6 by default)");
9230
9697
context("thread-concurrency",
9231
po::value<concurrency_constraint>(&innobase_thread_concurrency)->default_value(0),
9698
po::value<unsigned long>(&srv_thread_concurrency)->default_value(0),
9232
9699
"Helps in performance tuning in heavily concurrent environments. Sets the maximum number of threads allowed inside InnoDB. Value 0 will disable the thread throttling.");
9233
9700
context("thread-sleep-delay",
9234
po::value<uint32_constraint>(&innodb_thread_sleep_delay)->default_value(10000L),
9701
po::value<unsigned long>(&srv_thread_sleep_delay)->default_value(10000L),
9235
9702
"Time of innodb thread sleeping before joining InnoDB queue (usec). Value 0 disable a sleep");
9236
9703
context("data-file-path",
9237
9704
po::value<string>(),
9241
9708
"InnoDB version");
9242
9709
context("use-internal-malloc",
9243
9710
"Use InnoDB's internal memory allocator instal of the OS memory allocator.");
9244
context("disable-native-aio",
9245
_("Do not use Native AIO library for IO, even if available"));
9246
9711
context("change-buffering",
9247
po::value<string>(&innobase_change_buffering),
9712
po::value<string>(),
9248
9713
"Buffer changes to reduce random access: OFF, ON, inserting, deleting, changing, or purging.");
9249
9714
context("read-ahead-threshold",
9250
po::value<read_ahead_threshold_constraint>(&innodb_read_ahead_threshold)->default_value(56),
9715
po::value<unsigned long>(&srv_read_ahead_threshold)->default_value(56),
9251
9716
"Number of pages that must be accessed sequentially for InnoDB to trigger a readahead.");
9252
9717
context("disable-xa",
9253
9718
"Disable InnoDB support for the XA two-phase commit");
9254
9719
context("disable-table-locks",
9255
9720
"Disable InnoDB locking in LOCK TABLES");
9256
9721
context("strict-mode",
9257
po::value<bool>(&strict_mode)->default_value(false)->zero_tokens(),
9722
po::value<bool>()->default_value(false)->zero_tokens(),
9258
9723
"Use strict mode when evaluating create options.");
9259
context("replication-log",
9260
po::value<bool>(&innobase_use_replication_log)->default_value(false),
9261
_("Enable internal replication log."));
9262
9724
context("lock-wait-timeout",
9263
po::value<lock_wait_constraint>(&lock_wait_timeout)->default_value(50),
9264
_("Timeout in seconds an InnoDB transaction may wait for a lock before being rolled back. Values above 100000000 disable the timeout."));
9265
context("old-blocks-pct",
9266
po::value<old_blocks_constraint>(&innobase_old_blocks_pct)->default_value(100 * 3 / 8),
9267
_("Percentage of the buffer pool to reserve for 'old' blocks."));
9268
context("old-blocks-time",
9269
po::value<uint32_t>(&buf_LRU_old_threshold_ms)->default_value(0),
9270
_("ove blocks to the 'new' end of the buffer pool if the first access"
9271
" was at least this many milliseconds ago."
9272
" The timeout is disabled if 0 (the default)."));
9725
po::value<unsigned long>()->default_value(50),
9726
"Timeout in seconds an InnoDB transaction may wait for a lock before being rolled back. Values above 100000000 disable the timeout.");
9729
static drizzle_sys_var* innobase_system_variables[]= {
9730
DRIZZLE_SYSVAR(additional_mem_pool_size),
9731
DRIZZLE_SYSVAR(autoextend_increment),
9732
DRIZZLE_SYSVAR(buffer_pool_size),
9733
DRIZZLE_SYSVAR(checksums),
9734
DRIZZLE_SYSVAR(commit_concurrency),
9735
DRIZZLE_SYSVAR(concurrency_tickets),
9736
DRIZZLE_SYSVAR(data_file_path),
9737
DRIZZLE_SYSVAR(data_home_dir),
9738
DRIZZLE_SYSVAR(doublewrite),
9739
DRIZZLE_SYSVAR(fast_shutdown),
9740
DRIZZLE_SYSVAR(read_io_threads),
9741
DRIZZLE_SYSVAR(write_io_threads),
9742
DRIZZLE_SYSVAR(file_per_table),
9743
DRIZZLE_SYSVAR(file_format),
9744
DRIZZLE_SYSVAR(file_format_check),
9745
DRIZZLE_SYSVAR(flush_log_at_trx_commit),
9746
DRIZZLE_SYSVAR(flush_method),
9747
DRIZZLE_SYSVAR(force_recovery),
9748
DRIZZLE_SYSVAR(lock_wait_timeout),
9749
#ifdef UNIV_LOG_ARCHIVE
9750
DRIZZLE_SYSVAR(log_arch_dir),
9751
DRIZZLE_SYSVAR(log_archive),
9752
#endif /* UNIV_LOG_ARCHIVE */
9753
DRIZZLE_SYSVAR(log_buffer_size),
9754
DRIZZLE_SYSVAR(log_file_size),
9755
DRIZZLE_SYSVAR(log_files_in_group),
9756
DRIZZLE_SYSVAR(log_group_home_dir),
9757
DRIZZLE_SYSVAR(max_dirty_pages_pct),
9758
DRIZZLE_SYSVAR(max_purge_lag),
9759
DRIZZLE_SYSVAR(adaptive_flushing),
9760
DRIZZLE_SYSVAR(mirrored_log_groups),
9761
DRIZZLE_SYSVAR(old_blocks_pct),
9762
DRIZZLE_SYSVAR(old_blocks_time),
9763
DRIZZLE_SYSVAR(open_files),
9764
DRIZZLE_SYSVAR(stats_sample_pages),
9765
DRIZZLE_SYSVAR(adaptive_hash_index),
9766
DRIZZLE_SYSVAR(replication_delay),
9767
DRIZZLE_SYSVAR(status_file),
9768
DRIZZLE_SYSVAR(strict_mode),
9769
DRIZZLE_SYSVAR(support_xa),
9770
DRIZZLE_SYSVAR(sync_spin_loops),
9771
DRIZZLE_SYSVAR(spin_wait_delay),
9772
DRIZZLE_SYSVAR(table_locks),
9773
DRIZZLE_SYSVAR(thread_concurrency),
9774
DRIZZLE_SYSVAR(thread_sleep_delay),
9775
DRIZZLE_SYSVAR(version),
9776
DRIZZLE_SYSVAR(use_sys_malloc),
9777
DRIZZLE_SYSVAR(change_buffering),
9778
DRIZZLE_SYSVAR(read_ahead_threshold),
9779
DRIZZLE_SYSVAR(io_capacity),
9277
9783
DRIZZLE_DECLARE_PLUGIN