diff options
author | Michael Widenius <monty@askmonty.org> | 2012-10-03 01:44:54 +0300 |
---|---|---|
committer | Michael Widenius <monty@askmonty.org> | 2012-10-03 01:44:54 +0300 |
commit | 572560f38c248d5020f0e63aeb3f8905cd568208 (patch) | |
tree | 55b81531f6fc63c061f97be54e6cc4ca51943155 /sql/rpl_mi.cc | |
parent | 8ac1b41cf358029b8e08e977f45bb6197a1c1c19 (diff) | |
download | mariadb-git-572560f38c248d5020f0e63aeb3f8905cd568208.tar.gz |
Changed SHOW_FUNC variabels that don't return SHOW_ARRAY to SHOW_SIMPLE_FUNC.
This allows us to avoid calculating variables (including those involving mutex) that doesn't match the given
wildcard in SHOW STATUS LIKE '...'
Removed all references to active_mi that could cause problems for multi-source replication.
Added START|STOP ALL SLAVES
Added SHOW ALL SLAVES STATUS
include/mysql/plugin.h:
Added SHOW_SIMPLE_FUNC
include/mysql/plugin_audit.h.pp:
Updated .pp file
include/mysql/plugin_auth.h.pp:
Updated .pp file
include/mysql/plugin_ftparser.h.pp:
Updated .pp file
mysql-test/suite/multi_source/info_logs.result:
New columns in SHOW ALL SLAVES STATUS
mysql-test/suite/multi_source/info_logs.test:
Test new syntax
mysql-test/suite/multi_source/simple.result:
New columns in SHOW ALL SLAVES STATUS
mysql-test/suite/multi_source/simple.test:
test new syntax
mysql-test/suite/multi_source/syntax.result:
Updated result
mysql-test/suite/multi_source/syntax.test:
Test new syntax
mysql-test/suite/rpl/r/rpl_skip_replication.result:
Updated result
plugin/semisync/semisync_master_plugin.cc:
SHOW_FUNC -> SHOW_SIMPLE_FUNC
sql/item_create.cc:
Simplify code
sql/lex.h:
Added SLAVES keyword
sql/log.cc:
Constant -> define
sql/log_event.cc:
Added comment
sql/mysqld.cc:
SHOW_FUNC -> SHOW_SIMPLE_FUNC
Made slave_retried_trans, slave_received_heartbeats and heartbeat_period multi-source safe
Clear variable denied_connections and slave_retried_transactions on startup
sql/mysqld.h:
Added slave_retried_transactions
sql/rpl_mi.cc:
create_signed_file_name -> create_logfile_name_with_suffix
Added start_all_slaves() and stop_all_slaves()
sql/rpl_mi.h:
Added prototypes
sql/rpl_rli.cc:
create_signed_file_name -> create_logfile_name_with_suffix
added executed_entries
sql/rpl_rli.h:
Added executed_entries
sql/share/errmsg-utf8.txt:
More and better error messages
sql/slave.cc:
Added more fields to SHOW ALL SLAVES STATUS
Added slave_retried_transactions
Changed constants -> defines
sql/sql_class.h:
Added comment
sql/sql_insert.cc:
active_mi.rli -> thd->rli_slave
sql/sql_lex.h:
Added SQLCOM_SLAVE_ALL_START & SQLCOM_SLAVE_ALL_STOP
sql/sql_load.cc:
active_mi.rli -> thd->rli_slave
sql/sql_parse.cc:
Added START|STOP ALL SLAVES
sql/sql_prepare.cc:
Added SQLCOM_SLAVE_ALL_START & SQLCOM_SLAVE_ALL_STOP
sql/sql_reload.cc:
Made REFRESH RELAY LOG multi-source safe
sql/sql_repl.cc:
create_signed_file_name -> create_logfile_name_with_suffix
Don't send my_ok() from start_slave() or stop_slave() so that we can call it for all master connections
sql/sql_show.cc:
Compare wild cards early for all variables
sql/sql_yacc.yy:
Added START|STOP ALL SLAVES
Added SHOW ALL SLAVES STATUS
sql/sys_vars.cc:
Made replicate_events_marked_for_skip,slave_net_timeout and rpl_filter multi-source safe.
sql/sys_vars.h:
Simplify Sys_var_rpl_filter
Diffstat (limited to 'sql/rpl_mi.cc')
-rw-r--r-- | sql/rpl_mi.cc | 144 |
1 files changed, 135 insertions, 9 deletions
diff --git a/sql/rpl_mi.cc b/sql/rpl_mi.cc index 1491d970472..e004e3495c7 100644 --- a/sql/rpl_mi.cc +++ b/sql/rpl_mi.cc @@ -21,6 +21,7 @@ #include "rpl_mi.h" #include "slave.h" // SLAVE_MAX_HEARTBEAT_PERIOD #include "strfunc.h" +#include "sql_repl.h" #ifdef HAVE_REPLICATION @@ -42,7 +43,10 @@ Master_info::Master_info(LEX_STRING *connection_name_arg, ssl_ca[0]= 0; ssl_capath[0]= 0; ssl_cert[0]= 0; ssl_cipher[0]= 0; ssl_key[0]= 0; - /* Store connection name and lower case connection name */ + /* + Store connection name and lower case connection name + It's safe to ignore any OMM errors as this is checked by error() + */ connection_name.length= cmp_connection_name.length= connection_name_arg->length; if ((connection_name.str= (char*) my_malloc(connection_name_arg->length*2+2, @@ -599,7 +603,7 @@ void free_key_master_info(Master_info *mi) /** Check if connection name for master_info is valid. - It's valid if it's a valid system name, is less than + It's valid if it's a valid system name of length less than MAX_CONNECTION_NAME. @return @@ -616,7 +620,7 @@ bool check_master_connection_name(LEX_STRING *name) /** - Create a log file with a signed suffix. + Create a log file with a given suffix. @param res_file_name Store result here @@ -635,7 +639,7 @@ bool check_master_connection_name(LEX_STRING *name) file names without a prefix. */ -void create_signed_file_name(char *res_file_name, uint length, +void create_logfile_name_with_suffix(char *res_file_name, uint length, const char *info_file, bool append, LEX_STRING *suffix) { @@ -761,9 +765,9 @@ bool Master_info_index::init_all_master_info() lock_slave_threads(mi); init_thread_mask(&thread_mask,mi,0 /*not inverse*/); - create_signed_file_name(buf_master_info_file, sizeof(buf_master_info_file), + create_logfile_name_with_suffix(buf_master_info_file, sizeof(buf_master_info_file), master_info_file, 0, &connection_name); - create_signed_file_name(buf_relay_log_info_file, + create_logfile_name_with_suffix(buf_relay_log_info_file, sizeof(buf_relay_log_info_file), relay_log_info_file, 0, &connection_name); if (global_system_variables.log_warnings > 1) @@ -827,7 +831,7 @@ bool Master_info_index::init_all_master_info() buf_relay_log_info_file, SLAVE_IO | SLAVE_SQL)) { - sql_print_error("Failed to create slave threads for connection %.*s", + sql_print_error("Failed to create slave threads for connection '%.*s'", (int) connection_name.length, connection_name.str); continue; @@ -1033,8 +1037,7 @@ bool Master_info_index::remove_master_info(LEX_STRING *name) } // Rewrite Master_info.index - uint i; - for (i= 0; i< master_info_hash.records; ++i) + for (uint i= 0; i< master_info_hash.records; ++i) { Master_info *tmp_mi; tmp_mi= (Master_info *) my_hash_element(&master_info_hash, i); @@ -1046,4 +1049,127 @@ bool Master_info_index::remove_master_info(LEX_STRING *name) DBUG_RETURN(FALSE); } + +/** + Master_info_index::give_error_if_slave_running() + + @return + TRUE If some slave is running. An error is printed + FALSE No slave is running +*/ + +bool Master_info_index::give_error_if_slave_running() +{ + DBUG_ENTER("warn_if_slave_running"); + mysql_mutex_assert_owner(&LOCK_active_mi); + + for (uint i= 0; i< master_info_hash.records; ++i) + { + Master_info *mi; + mi= (Master_info *) my_hash_element(&master_info_hash, i); + if (mi->rli.slave_running != MYSQL_SLAVE_NOT_RUN) + { + my_error(ER_SLAVE_MUST_STOP, MYF(0), (int) mi->connection_name.length, + mi->connection_name.str); + DBUG_RETURN(TRUE); + } + } + DBUG_RETURN(FALSE); +} + + +/** + Master_info_index::start_all_slaves() + + Start all slaves that was not running. + + @return + TRUE Error + FALSE Everything ok. +*/ + +bool Master_info_index::start_all_slaves(THD *thd) +{ + bool result= FALSE; + DBUG_ENTER("warn_if_slave_running"); + mysql_mutex_assert_owner(&LOCK_active_mi); + + for (uint i= 0; i< master_info_hash.records; ++i) + { + int error; + Master_info *mi; + mi= (Master_info *) my_hash_element(&master_info_hash, i); + + /* + Try to start all slaves that are configured (host is defined) + and are not already running + */ + if ((mi->slave_running != MYSQL_SLAVE_RUN_CONNECT || + !mi->rli.slave_running) && *mi->host) + { + if ((error= start_slave(thd, mi, 1))) + { + my_error(ER_CANT_START_STOP_SLAVE, MYF(0), + "START", + (int) mi->connection_name.length, + mi->connection_name.str); + result= 1; + if (error < 0) // fatal error + break; + } + else + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE, + ER_SLAVE_STARTED, ER(ER_SLAVE_STARTED), + (int) mi->connection_name.length, + mi->connection_name.str); + } + } + DBUG_RETURN(result); +} + + +/** + Master_info_index::stop_all_slaves() + + Start all slaves that was not running. + + @return + TRUE Error + FALSE Everything ok. +*/ + +bool Master_info_index::stop_all_slaves(THD *thd) +{ + bool result= FALSE; + DBUG_ENTER("warn_if_slave_running"); + mysql_mutex_assert_owner(&LOCK_active_mi); + + for (uint i= 0; i< master_info_hash.records; ++i) + { + int error; + Master_info *mi; + mi= (Master_info *) my_hash_element(&master_info_hash, i); + if ((mi->slave_running != MYSQL_SLAVE_NOT_RUN || + mi->rli.slave_running)) + { + if ((error= stop_slave(thd, mi, 1))) + { + my_error(ER_CANT_START_STOP_SLAVE, MYF(0), + "STOP", + (int) mi->connection_name.length, + mi->connection_name.str); + result= 1; + if (error < 0) // Fatal error + break; + } + else + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE, + ER_SLAVE_STOPPED, ER(ER_SLAVE_STOPPED), + (int) mi->connection_name.length, + mi->connection_name.str); + } + } + DBUG_RETURN(result); +} + #endif /* HAVE_REPLICATION */ |