diff options
author | Sergei Golubchik <serg@mysql.com> | 2009-12-22 10:35:56 +0100 |
---|---|---|
committer | Sergei Golubchik <serg@mysql.com> | 2009-12-22 10:35:56 +0100 |
commit | 1ad5bb1a69656808312efc40ca12c4897f8ea128 (patch) | |
tree | ffef2f9db240392c7f322d05058dfd7ea8c01a9d /sql/ha_ndbcluster.cc | |
parent | 22c65346986d63c906e1d5a57941cadc367c2a9f (diff) | |
download | mariadb-git-1ad5bb1a69656808312efc40ca12c4897f8ea128.tar.gz |
WL#4738 streamline/simplify @@variable creation process
Bug#16565 mysqld --help --verbose does not order variablesBug#20413 sql_slave_skip_counter is not shown in show variables
Bug#20415 Output of mysqld --help --verbose is incomplete
Bug#25430 variable not found in SELECT @@global.ft_max_word_len;
Bug#32902 plugin variables don't know their names
Bug#34599 MySQLD Option and Variable Reference need to be consistent in formatting!
Bug#34829 No default value for variable and setting default does not raise error
Bug#34834 ? Is accepted as a valid sql mode
Bug#34878 Few variables have default value according to documentation but error occurs
Bug#34883 ft_boolean_syntax cant be assigned from user variable to global var.
Bug#37187 `INFORMATION_SCHEMA`.`GLOBAL_VARIABLES`: inconsistent status
Bug#40988 log_output_basic.test succeeded though syntactically false.
Bug#41010 enum-style command-line options are not honoured (maria.maria-recover fails)
Bug#42103 Setting key_buffer_size to a negative value may lead to very large allocations
Bug#44691 Some plugins configured as MYSQL_PLUGIN_MANDATORY in can be disabled
Bug#44797 plugins w/o command-line options have no disabling option in --help
Bug#46314 string system variables don't support expressions
Bug#46470 sys_vars.max_binlog_cache_size_basic_32 is broken
Bug#46586 When using the plugin interface the type "set" for options caused a crash.
Bug#47212 Crash in DBUG_PRINT in mysqltest.cc when trying to print octal number
Bug#48758 mysqltest crashes on sys_vars.collation_server_basic in gcov builds
Bug#49417 some complaints about mysqld --help --verbose output
Bug#49540 DEFAULT value of binlog_format isn't the default value
Bug#49640 ambiguous option '--skip-skip-myisam' (double skip prefix)
Bug#49644 init_connect and \0
Bug#49645 init_slave and multi-byte characters
Bug#49646 mysql --show-warnings crashes when server dies
CMakeLists.txt:
Bug#44691 Some plugins configured as MYSQL_PLUGIN_MANDATORY in can be disabled
client/mysql.cc:
don't crash with --show-warnings when mysqld dies
config/ac-macros/plugins.m4:
Bug#44691 Some plugins configured as MYSQL_PLUGIN_MANDATORY in can be disabled
include/my_getopt.h:
comments
include/my_pthread.h:
fix double #define
mysql-test/mysql-test-run.pl:
run sys_vars suite by default
properly recognize envirinment variables (e.g. MTR_MAX_SAVE_CORE) set to 0
escape gdb command line arguments
mysql-test/suite/sys_vars/r/rpl_init_slave_func.result:
init_slave+utf8 bug
mysql-test/suite/sys_vars/t/rpl_init_slave_func.test:
init_slave+utf8 bug
mysys/my_getopt.c:
Bug#34599 MySQLD Option and Variable Reference need to be consistent in formatting!
Bug#46586 When using the plugin interface the type "set" for options caused a crash.
Bug#49640 ambiguous option '--skip-skip-myisam' (double skip prefix)
mysys/typelib.c:
support for flagset
sql/ha_ndbcluster.cc:
backport from telco tree
sql/item_func.cc:
Bug#49644 init_connect and \0
Bug#49645 init_slave and multi-byte characters
sql/sql_builtin.cc.in:
Bug#44691 Some plugins configured as MYSQL_PLUGIN_MANDATORY in can be disabled
sql/sql_plugin.cc:
Bug#44691 Some plugins configured as MYSQL_PLUGIN_MANDATORY in can be disabled
Bug#32902 plugin variables don't know their names
Bug#44797 plugins w/o command-line options have no disabling option in --help
sql/sys_vars.cc:
all server variables are defined here
storage/myisam/ft_parser.c:
remove unnecessary updates of param->quot
storage/myisam/ha_myisam.cc:
myisam_* variables belong here
strings/my_vsnprintf.c:
%o and %llx
unittest/mysys/my_vsnprintf-t.c:
%o and %llx tests
vio/viosocket.c:
bugfix: fix @@wait_timeout to work with socket timeouts (vs. alarm thread)
Diffstat (limited to 'sql/ha_ndbcluster.cc')
-rw-r--r-- | sql/ha_ndbcluster.cc | 407 |
1 files changed, 333 insertions, 74 deletions
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index 1103683b56c..b820b6d939d 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -56,26 +56,125 @@ int ha_ndb_dummy; #define assert(x) do { if(x) break; ::printf("%s %d: assert failed: %s\n", __FILE__, __LINE__, #x); ::fflush(stdout); ::signal(SIGABRT,SIG_DFL); ::abort(); ::kill(::getpid(),6); ::kill(::getpid(),9); } while (0) #endif -// options from from mysqld.cc -extern my_bool opt_ndb_optimized_node_selection; -extern const char *opt_ndbcluster_connectstring; -extern ulong opt_ndb_cache_check_time; - -// ndb interface initialization/cleanup -#ifdef __cplusplus -extern "C" { -#endif -extern void ndb_init_internal(); -extern void ndb_end_internal(); -#ifdef __cplusplus -} -#endif - -const char *ndb_distribution_names[]= {"KEYHASH", "LINHASH", NullS}; -TYPELIB ndb_distribution_typelib= { array_elements(ndb_distribution_names)-1, - "", ndb_distribution_names, NULL }; -const char *opt_ndb_distribution= ndb_distribution_names[ND_KEYHASH]; -enum ndb_distribution opt_ndb_distribution_id= ND_KEYHASH; +// ndb interface initialization/cleanup functions +extern "C" void ndb_init_internal(); +extern "C" void ndb_end_internal(); + +static const int DEFAULT_PARALLELISM= 0; +static const ha_rows DEFAULT_AUTO_PREFETCH= 32; +static const ulong ONE_YEAR_IN_SECONDS= (ulong) 3600L*24L*365L; + +ulong opt_ndb_extra_logging; +static ulong opt_ndb_cache_check_time; +static char* opt_ndb_connectstring; +static char* opt_ndb_mgmd_host; +static uint opt_ndb_nodeid; + + +static MYSQL_THDVAR_UINT( + autoincrement_prefetch_sz, /* name */ + PLUGIN_VAR_RQCMDARG, + "Specify number of autoincrement values that are prefetched.", + NULL, /* check func. */ + NULL, /* update func. */ + 1, /* default */ + 1, /* min */ + 256, /* max */ + 0 /* block */ +); + + +static MYSQL_THDVAR_BOOL( + force_send, /* name */ + PLUGIN_VAR_OPCMDARG, + "Force send of buffers to ndb immediately without waiting for " + "other threads.", + NULL, /* check func. */ + NULL, /* update func. */ + 1 /* default */ +); + + +static MYSQL_THDVAR_BOOL( + use_exact_count, /* name */ + PLUGIN_VAR_OPCMDARG, + "Use exact records count during query planning and for fast " + "select count(*), disable for faster queries.", + NULL, /* check func. */ + NULL, /* update func. */ + 1 /* default */ +); + + +static MYSQL_THDVAR_BOOL( + use_transactions, /* name */ + PLUGIN_VAR_OPCMDARG, + "Use transactions for large inserts, if enabled then large " + "inserts will be split into several smaller transactions", + NULL, /* check func. */ + NULL, /* update func. */ + 1 /* default */ +); + + +static MYSQL_THDVAR_BOOL( + use_copying_alter_table, /* name */ + PLUGIN_VAR_OPCMDARG, + "Force ndbcluster to always copy tables at alter table (should " + "only be used if on-line alter table fails).", + NULL, /* check func. */ + NULL, /* update func. */ + 0 /* default */ +); + + +static MYSQL_THDVAR_UINT( + optimized_node_selection, /* name */ + PLUGIN_VAR_OPCMDARG, + "Select nodes for transactions in a more optimal way.", + NULL, /* check func. */ + NULL, /* update func. */ + 3, /* default */ + 0, /* min */ + 3, /* max */ + 0 /* block */ +); + + +static MYSQL_THDVAR_BOOL( + index_stat_enable, /* name */ + PLUGIN_VAR_OPCMDARG, + "Use ndb index statistics in query optimization.", + NULL, /* check func. */ + NULL, /* update func. */ + FALSE /* default */ +); + + +static MYSQL_THDVAR_ULONG( + index_stat_cache_entries, /* name */ + PLUGIN_VAR_NOCMDARG, + "", + NULL, /* check func. */ + NULL, /* update func. */ + 32, /* default */ + 0, /* min */ + ULONG_MAX, /* max */ + 0 /* block */ +); + + +static MYSQL_THDVAR_ULONG( + index_stat_update_freq, /* name */ + PLUGIN_VAR_NOCMDARG, + "", + NULL, /* check func. */ + NULL, /* update func. */ + 20, /* default */ + 0, /* min */ + ULONG_MAX, /* max */ + 0 /* block */ +); // Default value for parallelism static const int parallelism= 0; @@ -186,7 +285,6 @@ pthread_mutex_t LOCK_ndb_util_thread; pthread_cond_t COND_ndb_util_thread; pthread_cond_t COND_ndb_util_ready; pthread_handler_t ndb_util_thread_func(void *arg); -ulong ndb_cache_check_time; /** Dummy buffer to read zero pack_length fields @@ -321,7 +419,7 @@ int execute_commit(THD *thd, NdbTransaction *trans) { return trans->execute(NdbTransaction::Commit, NdbOperation::AbortOnError, - thd->variables.ndb_force_send); + THDVAR(thd, force_send)); } inline @@ -1250,11 +1348,11 @@ int ha_ndbcluster::add_index_handle(THD *thd, NDBDICT *dict, KEY *key_info, NDB_INDEX_DATA& d=m_index[index_no]; delete d.index_stat; d.index_stat=NULL; - if (thd->variables.ndb_index_stat_enable) + if (THDVAR(thd, index_stat_enable)) { d.index_stat=new NdbIndexStat(index); - d.index_stat_cache_entries=thd->variables.ndb_index_stat_cache_entries; - d.index_stat_update_freq=thd->variables.ndb_index_stat_update_freq; + d.index_stat_cache_entries=THDVAR(thd, index_stat_cache_entries); + d.index_stat_update_freq=THDVAR(thd, index_stat_update_freq); d.index_stat_query_count=0; d.index_stat->alloc_cache(d.index_stat_cache_entries); DBUG_PRINT("info", ("index %s stat=on cache_entries=%u update_freq=%u", @@ -1314,10 +1412,12 @@ int ha_ndbcluster::open_indexes(Ndb *ndb, TABLE *tab, bool ignore_error) for (i= 0; i < tab->s->keys; i++, key_info++, key_name++) { if ((error= add_index_handle(thd, dict, key_info, *key_name, i))) + { if (ignore_error) m_index[i].index= m_index[i].unique_index= NULL; else break; + } m_index[i].null_in_unique_index= FALSE; if (check_index_fields_not_null(key_info)) m_index[i].null_in_unique_index= TRUE; @@ -4082,7 +4182,7 @@ int ha_ndbcluster::info(uint flag) { DBUG_RETURN(my_errno= HA_ERR_OUT_OF_MEM); } - if (current_thd->variables.ndb_use_exact_count && + if (THDVAR(current_thd, use_exact_count) && (result= ndb_get_table_statistics(this, TRUE, ndb, m_table, &stat)) == 0) { @@ -4412,12 +4512,12 @@ THR_LOCK_DATA **ha_ndbcluster::store_lock(THD *thd, #ifndef DBUG_OFF #define PRINT_OPTION_FLAGS(t) { \ - if (t->options & OPTION_NOT_AUTOCOMMIT) \ - DBUG_PRINT("thd->options", ("OPTION_NOT_AUTOCOMMIT")); \ - if (t->options & OPTION_BEGIN) \ - DBUG_PRINT("thd->options", ("OPTION_BEGIN")); \ - if (t->options & OPTION_TABLE_LOCK) \ - DBUG_PRINT("thd->options", ("OPTION_TABLE_LOCK")); \ + if (t->variables.option_bits & OPTION_NOT_AUTOCOMMIT) \ + DBUG_PRINT("thd->variables.option_bits", ("OPTION_NOT_AUTOCOMMIT")); \ + if (t->variables.option_bits & OPTION_BEGIN) \ + DBUG_PRINT("thd->variables.option_bits", ("OPTION_BEGIN")); \ + if (t->variables.option_bits & OPTION_TABLE_LOCK) \ + DBUG_PRINT("thd->variables.option_bits", ("OPTION_TABLE_LOCK")); \ } #else #define PRINT_OPTION_FLAGS(t) @@ -4504,7 +4604,7 @@ void ha_ndbcluster::transaction_checks(THD *thd) else if (!thd->transaction.on) m_transaction_on= FALSE; else - m_transaction_on= thd->variables.ndb_use_transactions; + m_transaction_on= THDVAR(thd, use_transactions); } int ha_ndbcluster::start_statement(THD *thd, @@ -4517,7 +4617,7 @@ int ha_ndbcluster::start_statement(THD *thd, trans_register_ha(thd, FALSE, ndbcluster_hton); if (!thd_ndb->trans) { - if (thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) + if (thd->variables.option_bits & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) trans_register_ha(thd, TRUE, ndbcluster_hton); DBUG_PRINT("trans",("Starting transaction")); thd_ndb->trans= ndb->startTransaction(); @@ -4527,7 +4627,7 @@ int ha_ndbcluster::start_statement(THD *thd, thd_ndb->query_state&= NDB_QUERY_NORMAL; thd_ndb->trans_options= 0; thd_ndb->m_slow_path= FALSE; - if (!(thd->options & OPTION_BIN_LOG) || + if (!(thd->variables.option_bits & OPTION_BIN_LOG) || thd->variables.binlog_format == BINLOG_FORMAT_STMT) { thd_ndb->trans_options|= TNTO_NO_LOGGING; @@ -4542,7 +4642,7 @@ int ha_ndbcluster::start_statement(THD *thd, Check if it should be read or write lock */ - if (thd->options & (OPTION_TABLE_LOCK)) + if (thd->variables.option_bits & OPTION_TABLE_LOCK) { //lockThisTable(); DBUG_PRINT("info", ("Locking the table..." )); @@ -4566,13 +4666,13 @@ int ha_ndbcluster::init_handler_for_statement(THD *thd, Thd_ndb *thd_ndb) DBUG_ENTER("ha_ndbcluster::init_handler_for_statement"); // store thread specific data first to set the right context - m_force_send= thd->variables.ndb_force_send; - m_ha_not_exact_count= !thd->variables.ndb_use_exact_count; + m_force_send= THDVAR(thd, force_send); + m_ha_not_exact_count= !THDVAR(thd, use_exact_count); m_autoincrement_prefetch= - (thd->variables.ndb_autoincrement_prefetch_sz > - NDB_DEFAULT_AUTO_PREFETCH) ? - (ha_rows) thd->variables.ndb_autoincrement_prefetch_sz - : (ha_rows) NDB_DEFAULT_AUTO_PREFETCH; + (THDVAR(thd, autoincrement_prefetch_sz) > + DEFAULT_AUTO_PREFETCH) ? + (ha_rows) THDVAR(thd, autoincrement_prefetch_sz) + : (ha_rows) DEFAULT_AUTO_PREFETCH; m_active_trans= thd_ndb->trans; DBUG_ASSERT(m_active_trans); // Start of transaction @@ -4587,7 +4687,7 @@ int ha_ndbcluster::init_handler_for_statement(THD *thd, Thd_ndb *thd_ndb) } #endif - if (thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) + if (thd->variables.option_bits & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) { const void *key= m_table; HASH_SEARCH_STATE state; @@ -4668,10 +4768,10 @@ int ha_ndbcluster::external_lock(THD *thd, int lock_type) { DBUG_PRINT("info", ("lock_type == F_UNLCK")); - if (ndb_cache_check_time && m_rows_changed) + if (opt_ndb_cache_check_time && m_rows_changed) { DBUG_PRINT("info", ("Rows has changed and util thread is running")); - if (thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) + if (thd->variables.option_bits & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) { DBUG_PRINT("info", ("Add share to list of tables to be invalidated")); /* NOTE push_back allocates memory using transactions mem_root! */ @@ -4690,7 +4790,7 @@ int ha_ndbcluster::external_lock(THD *thd, int lock_type) DBUG_PRINT("trans", ("Last external_lock")); PRINT_OPTION_FLAGS(thd); - if (!(thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))) + if (!(thd->variables.option_bits & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))) { if (thd_ndb->trans) { @@ -4801,7 +4901,7 @@ static int ndbcluster_commit(handlerton *hton, THD *thd, bool all) DBUG_PRINT("enter", ("Commit %s", (all ? "all" : "stmt"))); thd_ndb->start_stmt_count= 0; if (trans == NULL || (!all && - thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))) + thd->variables.option_bits & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))) { /* An odditity in the handler interface is that commit on handlerton @@ -4871,7 +4971,7 @@ static int ndbcluster_rollback(handlerton *hton, THD *thd, bool all) DBUG_ASSERT(ndb); thd_ndb->start_stmt_count= 0; if (trans == NULL || (!all && - thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))) + thd->variables.option_bits & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))) { /* Ignore end-of-statement until real rollback or commit is called */ DBUG_PRINT("info", ("Rollback before start or end-of-statement only")); @@ -5567,7 +5667,7 @@ int ha_ndbcluster::create(const char *name, if (!ndbcluster_create_event(ndb, m_table, event_name.c_ptr(), share, share && do_event_op ? 2 : 1/* push warning */)) { - if (ndb_extra_logging) + if (opt_ndb_extra_logging) sql_print_information("NDB Binlog: CREATE TABLE Event: %s", event_name.c_ptr()); if (share && @@ -6010,7 +6110,7 @@ int ha_ndbcluster::rename_table(const char *from, const char *to) if (!ndbcluster_create_event(ndb, ndbtab, event_name.c_ptr(), share, share && ndb_binlog_running ? 2 : 1/* push warning */)) { - if (ndb_extra_logging) + if (opt_ndb_extra_logging) sql_print_information("NDB Binlog: RENAME Event: %s", event_name.c_ptr()); if (share && @@ -6313,10 +6413,9 @@ void ha_ndbcluster::get_auto_increment(ulonglong offset, ulonglong increment, m_rows_to_insert+= m_autoincrement_prefetch; } uint remaining= m_rows_to_insert - m_rows_inserted; + ha_rows prefetch= THDVAR(thd, autoincrement_prefetch_sz); uint min_prefetch= - (remaining < thd->variables.ndb_autoincrement_prefetch_sz) ? - thd->variables.ndb_autoincrement_prefetch_sz - : remaining; + (remaining < prefetch) ? prefetch : remaining; cache_size= ((remaining < m_autoincrement_prefetch) ? min_prefetch : remaining); @@ -6406,7 +6505,7 @@ ha_ndbcluster::ha_ndbcluster(handlerton *hton, TABLE_SHARE *table_arg): m_dupkey((uint) -1), m_ha_not_exact_count(FALSE), m_force_send(TRUE), - m_autoincrement_prefetch((ha_rows) NDB_DEFAULT_AUTO_PREFETCH), + m_autoincrement_prefetch(DEFAULT_AUTO_PREFETCH), m_transaction_on(TRUE), m_cond(NULL), m_multi_cursor(NULL) @@ -7417,17 +7516,31 @@ static int ndbcluster_init(void *p) h->table_exists_in_engine= ndbcluster_table_exists_in_engine; } + // Format the connect string to be used for connecting to the cluster + int pos= 0; + char connectstring_buf[1024] = {0}; + if (opt_ndb_nodeid != 0) + pos+= my_snprintf(connectstring_buf, sizeof(connectstring_buf), + "nodeid=%u", opt_ndb_nodeid); + if (opt_ndb_mgmd_host) + pos+= my_snprintf(connectstring_buf+pos, sizeof(connectstring_buf)-pos, + "%s%s", pos ? "," : "", opt_ndb_mgmd_host); + if (opt_ndb_connectstring) + pos+= my_snprintf(connectstring_buf+pos, sizeof(connectstring_buf)-pos, + "%s%s", pos ? "," : "", opt_ndb_connectstring); + + // Initialize ndb interface ndb_init_internal(); // Set connectstring if specified - if (opt_ndbcluster_connectstring != 0) - DBUG_PRINT("connectstring", ("%s", opt_ndbcluster_connectstring)); + if (opt_ndb_connectstring != 0) + DBUG_PRINT("connectstring", ("%s", opt_ndb_connectstring)); if ((g_ndb_cluster_connection= - new Ndb_cluster_connection(opt_ndbcluster_connectstring)) == 0) + new Ndb_cluster_connection(opt_ndb_connectstring)) == 0) { DBUG_PRINT("error",("Ndb_cluster_connection(%s)", - opt_ndbcluster_connectstring)); + opt_ndb_connectstring)); my_errno= HA_ERR_OUT_OF_MEM; goto ndbcluster_init_error; } @@ -7437,7 +7550,7 @@ static int ndbcluster_init(void *p) g_ndb_cluster_connection->set_name(buf); } g_ndb_cluster_connection->set_optimized_node_selection - (opt_ndb_optimized_node_selection); + (THDVAR(0, optimized_node_selection)); // Create a Ndb object to open the connection to NDB if ( (g_ndb= new Ndb(g_ndb_cluster_connection, "sys")) == 0 ) @@ -7493,7 +7606,6 @@ static int ndbcluster_init(void *p) goto ndbcluster_init_error; #endif /* HAVE_NDB_BINLOG */ - ndb_cache_check_time = opt_ndb_cache_check_time; // Create utility thread pthread_t tmp; if (pthread_create(&tmp, &connection_attrib, ndb_util_thread_func, 0)) @@ -7953,7 +8065,7 @@ uint ndb_get_commitcount(THD *thd, char *dbname, char *tabname, pthread_mutex_unlock(&ndbcluster_mutex); pthread_mutex_lock(&share->mutex); - if (ndb_cache_check_time > 0) + if (opt_ndb_cache_check_time > 0) { if (share->commit_count != 0) { @@ -8056,7 +8168,7 @@ ndbcluster_cache_retrieval_allowed(THD *thd, ulonglong *engine_data) { Uint64 commit_count; - bool is_autocommit= !(thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)); + bool is_autocommit= !(thd->variables.option_bits & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)); char *dbname= full_name; char *tabname= dbname+strlen(dbname)+1; #ifndef DBUG_OFF @@ -8131,7 +8243,7 @@ ha_ndbcluster::register_query_cache_table(THD *thd, #ifndef DBUG_OFF char buff[22]; #endif - bool is_autocommit= !(thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)); + bool is_autocommit= !(thd->variables.option_bits & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)); DBUG_ENTER("ha_ndbcluster::register_query_cache_table"); DBUG_PRINT("enter",("dbname: %s, tabname: %s, is_autocommit: %d", m_dbname, m_tabname, is_autocommit)); @@ -8255,7 +8367,7 @@ int handle_trailing_share(NDB_SHARE *share) share->key, share->use_count)); if (!--share->use_count) { - if (ndb_extra_logging) + if (opt_ndb_extra_logging) sql_print_information("NDB_SHARE: trailing share " "%s(connect_count: %u) " "released by close_cached_tables at " @@ -8281,7 +8393,7 @@ int handle_trailing_share(NDB_SHARE *share) if (share->use_count == 0) { - if (ndb_extra_logging) + if (opt_ndb_extra_logging) sql_print_information("NDB_SHARE: trailing share " "%s(connect_count: %u) " "released after NSS_DROPPED check " @@ -9287,7 +9399,7 @@ pthread_handler_t ndb_util_thread_func(void *arg __attribute__((unused))) my_thread_init(); DBUG_ENTER("ndb_util_thread"); - DBUG_PRINT("enter", ("ndb_cache_check_time: %lu", ndb_cache_check_time)); + DBUG_PRINT("enter", ("cache_check_time: %lu", opt_ndb_cache_check_time)); pthread_mutex_lock(&LOCK_ndb_util_thread); @@ -9367,7 +9479,7 @@ pthread_handler_t ndb_util_thread_func(void *arg __attribute__((unused))) thd_ndb->options|= TNO_NO_LOG_SCHEMA_OP; #ifdef HAVE_NDB_BINLOG - if (ndb_extra_logging && ndb_binlog_running) + if (opt_ndb_extra_logging && ndb_binlog_running) sql_print_information("NDB Binlog: Ndb tables initially read only."); /* create tables needed by the replication */ ndbcluster_setup_binlog_table_shares(thd); @@ -9390,8 +9502,8 @@ pthread_handler_t ndb_util_thread_func(void *arg __attribute__((unused))) goto ndb_util_thread_end; pthread_mutex_unlock(&LOCK_ndb_util_thread); #ifdef NDB_EXTRA_DEBUG_UTIL_THREAD - DBUG_PRINT("ndb_util_thread", ("Started, ndb_cache_check_time: %lu", - ndb_cache_check_time)); + DBUG_PRINT("ndb_util_thread", ("Started, opt_ndb_cache_check_time: %lu", + opt_ndb_cache_check_time)); #endif #ifdef HAVE_NDB_BINLOG @@ -9404,7 +9516,7 @@ pthread_handler_t ndb_util_thread_func(void *arg __attribute__((unused))) ndbcluster_setup_binlog_table_shares(thd); #endif - if (ndb_cache_check_time == 0) + if (opt_ndb_cache_check_time == 0) { /* Wake up in 1 second to check if value has changed */ set_timespec(abstime, 1); @@ -9520,7 +9632,7 @@ pthread_handler_t ndb_util_thread_func(void *arg __attribute__((unused))) next: /* Calculate new time to wake up */ int secs= 0; - int msecs= ndb_cache_check_time; + int msecs= opt_ndb_cache_check_time; struct timeval tick_time; gettimeofday(&tick_time, 0); @@ -9796,12 +9908,33 @@ int ha_ndbcluster::get_default_no_partitions(HA_CREATE_INFO *create_info) and partition by hidden key otherwise. */ + +enum ndb_distribution_enum { ND_KEYHASH= 0, ND_LINHASH= 1 }; +static const char* distribution_names[]= { "KEYHASH", "LINHASH", NullS }; +static ulong default_ndb_distribution= ND_KEYHASH; +static TYPELIB distribution_typelib= { + array_elements(distribution_names) - 1, + "", + distribution_names, + NULL +}; +static MYSQL_SYSVAR_ENUM( + distribution, /* name */ + default_ndb_distribution, /* var */ + PLUGIN_VAR_RQCMDARG, + "Default distribution for new tables in ndb", + NULL, /* check func. */ + NULL, /* update func. */ + ND_KEYHASH, /* default */ + &distribution_typelib /* typelib */ +); + void ha_ndbcluster::set_auto_partitions(partition_info *part_info) { DBUG_ENTER("ha_ndbcluster::set_auto_partitions"); part_info->list_of_part_fields= TRUE; part_info->part_type= HASH_PARTITION; - switch (opt_ndb_distribution_id) + switch (default_ndb_distribution) { case ND_KEYHASH: part_info->linear_hash_ind= FALSE; @@ -10037,7 +10170,7 @@ bool ha_ndbcluster::check_if_incompatible_data(HA_CREATE_INFO *create_info, uint i; const NDBTAB *tab= (const NDBTAB *) m_table; - if (current_thd->variables.ndb_use_copying_alter_table) + if (THDVAR(current_thd, use_copying_alter_table)) { DBUG_PRINT("info", ("On-line alter table disabled")); DBUG_RETURN(COMPATIBLE_DATA_NO); @@ -10669,6 +10802,132 @@ SHOW_VAR ndb_status_variables_export[]= { {NullS, NullS, SHOW_LONG} }; +static MYSQL_SYSVAR_ULONG( + cache_check_time, /* name */ + opt_ndb_cache_check_time, /* var */ + PLUGIN_VAR_RQCMDARG, + "A dedicated thread is created to, at the given " + "millisecond interval, invalidate the query cache " + "if another MySQL server in the cluster has changed " + "the data in the database.", + NULL, /* check func. */ + NULL, /* update func. */ + 0, /* default */ + 0, /* min */ + ONE_YEAR_IN_SECONDS, /* max */ + 0 /* block */ +); + + +static MYSQL_SYSVAR_ULONG( + extra_logging, /* name */ + opt_ndb_extra_logging, /* var */ + PLUGIN_VAR_OPCMDARG, + "Turn on more logging in the error log.", + NULL, /* check func. */ + NULL, /* update func. */ + 1, /* default */ + 0, /* min */ + 0, /* max */ + 0 /* block */ +); + + +ulong opt_ndb_report_thresh_binlog_epoch_slip; +static MYSQL_SYSVAR_ULONG( + report_thresh_binlog_epoch_slip, /* name */ + opt_ndb_report_thresh_binlog_epoch_slip,/* var */ + PLUGIN_VAR_RQCMDARG, + "Threshold on number of epochs to be behind before reporting binlog " + "status. E.g. 3 means that if the difference between what epoch has " + "been received from the storage nodes and what has been applied to " + "the binlog is 3 or more, a status message will be sent to the cluster " + "log.", + NULL, /* check func. */ + NULL, /* update func. */ + 3, /* default */ + 0, /* min */ + 256, /* max */ + 0 /* block */ +); + + +ulong opt_ndb_report_thresh_binlog_mem_usage; +static MYSQL_SYSVAR_ULONG( + report_thresh_binlog_mem_usage, /* name */ + opt_ndb_report_thresh_binlog_mem_usage,/* var */ + PLUGIN_VAR_RQCMDARG, + "Threshold on percentage of free memory before reporting binlog " + "status. E.g. 10 means that if amount of available memory for " + "receiving binlog data from the storage nodes goes below 10%, " + "a status message will be sent to the cluster log.", + NULL, /* check func. */ + NULL, /* update func. */ + 10, /* default */ + 0, /* min */ + 100, /* max */ + 0 /* block */ +); + + +static MYSQL_SYSVAR_STR( + connectstring, /* name */ + opt_ndb_connectstring, /* var */ + PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, + "Connect string for ndbcluster.", + NULL, /* check func. */ + NULL, /* update func. */ + NULL /* default */ +); + + +static MYSQL_SYSVAR_STR( + mgmd_host, /* name */ + opt_ndb_mgmd_host, /* var */ + PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, + "Set host and port for ndb_mgmd. Syntax: hostname[:port]", + NULL, /* check func. */ + NULL, /* update func. */ + NULL /* default */ +); + + +static MYSQL_SYSVAR_UINT( + nodeid, /* name */ + opt_ndb_nodeid, /* var */ + PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, + "Nodeid for this mysqld in the cluster.", + NULL, /* check func. */ + NULL, /* update func. */ + 0, /* default */ + 0, /* min */ + 255, /* max */ + 0 /* block */ +); + +static struct st_mysql_sys_var* system_variables[]= { + MYSQL_SYSVAR(cache_check_time), + MYSQL_SYSVAR(extra_logging), + MYSQL_SYSVAR(report_thresh_binlog_mem_usage), + MYSQL_SYSVAR(report_thresh_binlog_epoch_slip), + MYSQL_SYSVAR(distribution), + MYSQL_SYSVAR(autoincrement_prefetch_sz), + MYSQL_SYSVAR(force_send), + MYSQL_SYSVAR(use_exact_count), + MYSQL_SYSVAR(use_transactions), + MYSQL_SYSVAR(use_copying_alter_table), + MYSQL_SYSVAR(optimized_node_selection), + MYSQL_SYSVAR(index_stat_enable), + MYSQL_SYSVAR(index_stat_cache_entries), + MYSQL_SYSVAR(index_stat_update_freq), + MYSQL_SYSVAR(connectstring), + MYSQL_SYSVAR(mgmd_host), + MYSQL_SYSVAR(nodeid), + + NULL +}; + + struct st_mysql_storage_engine ndbcluster_storage_engine= { MYSQL_HANDLERTON_INTERFACE_VERSION }; @@ -10684,7 +10943,7 @@ mysql_declare_plugin(ndbcluster) NULL, /* Plugin Deinit */ 0x0100 /* 1.0 */, ndb_status_variables_export,/* status variables */ - NULL, /* system variables */ + system_variables, /* system variables */ NULL /* config options */ } mysql_declare_plugin_end; |