mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Implementation of Multi-source replication (MDEV:253)
Documentation of the feature can be found at: http://kb.askmonty.org/en/multi-source-replication/ This code is based on code from Taobao, developed by Plinux BUILD/SETUP.sh: Added -Wno-invalid-offsetof to get rid of warning of offsetof() on C++ class (safe in the contex we use it) client/mysqltest.cc: Added support for error names starting with 'W' Added connection_name support to --sync_with_master cmake/maintainer.cmake: Added -Wno-invalid-offsetof to get rid of warning of offsetof() on C++ class (safe in the contex we use it) mysql-test/r/mysqltest.result: Updated results mysql-test/r/parser.result: Updated results mysql-test/suite/multi_source/my.cnf: Setup of multi-master tests mysql-test/suite/multi_source/simple.result: Simple basic test of multi-source functionality mysql-test/suite/multi_source/simple.test: Simple basic test of multi-source functionality mysql-test/suite/multi_source/syntax.result: Test of multi-source syntax mysql-test/suite/multi_source/syntax.test: Test of multi-source syntax mysql-test/suite/rpl/r/rpl_rotate_logs.result: Updated results because of new error messages mysql-test/t/parser.test: Updated test as master_pos_wait() now takes more arguments than before sql/event_scheduler.cc: No reason to initialize slave_thread (it's guaranteed to be zero here) sql/item_create.cc: Added connection_name argument to master_pos_wait() Simplified code sql/item_func.cc: Added connection_name argument to master_pos_wait() sql/item_func.h: Added connection_name argument to master_pos_wait() sql/log.cc: Added tag "Master 'connection_name'" to slave errors that has a connection name. sql/mysqld.cc: Added variable mysqld_server_initialized so that other functions can test if server is fully initialized. Free all slave data in one place (fewer ifdef's) Removed not needed call to close_active_mi() Initialize slaves() later in startup to ensure that everthing is really initialized when slaves start. Made status variable slave_running multi-source safe sql/mysqld.h: Added mysqld_server_initialized sql/rpl_mi.cc: Store connection name and cmp_connection_name (only used for show full slave status) in Master_info Added code for Master_info_index, which handles storage of multi-master information Don't write the empty "" connection_name to multi-master.info file. This is handled by the original code. sql/rpl_mi.h: Added connection_name and Master_info_index sql/rpl_rli.cc: Added connection_name to relay log files. sql/rpl_rli.h: Fixed type of slave_skip_counter as we now access it directly in sys_vars.cc, so it must be uint sql/share/errmsg-utf8.txt: Added new error messages needed for multi-source Added multi-source name to error ER_MASTER_INFO and WARN_NO_MASTER_INFO sql/slave.cc: Moved things a bit around to make it easier to handle error conditions. Create a global master_info_index and add the "" connection to it Ensure that new Master_info doesn't fail. Don't call terminate_slave_threads(active_mi..) on end_slave() as this is now done automaticly when deleting master_info_index. Delete not needed function close_active_mi(). One can achive same thing by calling end_slave(). Added support for SHOW FULL SLAVE STATUS (show status for all master connections with connection_name as first column) sql/slave.h: Added new prototypes sql/sql_base.cc: More DBUG_PRINT sql/sql_class.cc: Reset thd->connection_name and thd-->default_master_connection sql/sql_class.h: Added thd->connection_name and thd-->default_master_connection Added slave_skip_count to variables to make changing the @@sql_slave_skip_count variable thread safe sql/sql_const.h: Added MAX_CONNECTION_NAME sql/sql_lex.cc: Reset 'lex->verbose' (to simplify some sql_yacc.yy code) sql/sql_lex.h: Added connection_name sql/sql_parse.cc: Added support for connection_name to all SLAVE commands. - Instead of using active_mi, we now get the current Master_info from master_info_index. - Create new replication threads with CHANGE MASTER - Added support for show_all_master_info() sql/sql_reload.cc: Made reset/full slave use master_info_index->get_master_info() instead of active_mi. If one uses 'RESET SLAVE "connection_name" all' the connection is removed from master_info_index. sql/sql_repl.cc: sql_slave_skip_counter is moved to thd->variables to make it thread safe and fix some bugs with it Add connection name to relay log files. Added connection name to errors. Added some logging for multi-master if log_warnings > 1 stop_slave(): - Don't check if thd is set. It's guaranteed to always be set. change_master(): - Check for duplicate connection names in change_master() - Check for wrong arguments first in file (to simplify error handling) - Register new connections in master_info_index sql/sql_yacc.yy: Added optional connection_name to a all relevant master/slave commands sql/strfunc.cc: my_global.h shoud always be included first. sql/sys_vars.cc: Added variable default_master_connection Made variable sql_slave_skip_counter multi-source safe sql/sys_vars.h: Added Sys_var_session_lexstring (needed for default_master_connection) Added Sys_var_multi_source_uint (needed for sql_slave_skip_counter).
This commit is contained in:
@ -673,8 +673,7 @@ pthread_attr_t connection_attrib;
|
||||
mysql_mutex_t LOCK_server_started;
|
||||
mysql_cond_t COND_server_started;
|
||||
|
||||
int mysqld_server_started= 0;
|
||||
|
||||
int mysqld_server_started=0, mysqld_server_initialized= 0;
|
||||
File_parser_dummy_hook file_parser_dummy_hook;
|
||||
|
||||
/* replication parameters, if master_host is not NULL, we are a slave */
|
||||
@ -1761,7 +1760,12 @@ void clean_up(bool print_message)
|
||||
if (cleanup_done++)
|
||||
return; /* purecov: inspected */
|
||||
|
||||
close_active_mi();
|
||||
#ifdef HAVE_REPLICATION
|
||||
// We must call end_slave() as clean_up may have been called during startup
|
||||
end_slave();
|
||||
if (use_slave_mask)
|
||||
bitmap_free(&slave_error_mask);
|
||||
#endif
|
||||
stop_handle_manager();
|
||||
release_ddl_log();
|
||||
|
||||
@ -1776,10 +1780,6 @@ void clean_up(bool print_message)
|
||||
injector::free_instance();
|
||||
mysql_bin_log.cleanup();
|
||||
|
||||
#ifdef HAVE_REPLICATION
|
||||
if (use_slave_mask)
|
||||
bitmap_free(&slave_error_mask);
|
||||
#endif
|
||||
my_tz_free();
|
||||
my_dboptions_cache_free();
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
@ -4626,6 +4626,7 @@ int mysqld_main(int argc, char **argv)
|
||||
}
|
||||
#endif
|
||||
|
||||
mysqld_server_started= mysqld_server_initialized= 0;
|
||||
orig_argc= argc;
|
||||
orig_argv= argv;
|
||||
my_getopt_use_args_separator= TRUE;
|
||||
@ -4890,16 +4891,6 @@ int mysqld_main(int argc, char **argv)
|
||||
opt_skip_slave_start= 1;
|
||||
|
||||
binlog_unsafe_map_init();
|
||||
/*
|
||||
init_slave() must be called after the thread keys are created.
|
||||
Some parts of the code (e.g. SHOW STATUS LIKE 'slave_running' and other
|
||||
places) assume that active_mi != 0, so let's fail if it's 0 (out of
|
||||
memory); a message has already been printed.
|
||||
*/
|
||||
if (init_slave() && !active_mi)
|
||||
{
|
||||
unireg_abort(1);
|
||||
}
|
||||
|
||||
#ifdef WITH_PERFSCHEMA_STORAGE_ENGINE
|
||||
initialize_performance_schema_acl(opt_bootstrap);
|
||||
@ -4917,9 +4908,17 @@ int mysqld_main(int argc, char **argv)
|
||||
|
||||
execute_ddl_log_recovery();
|
||||
|
||||
/*
|
||||
We must have LOCK_open before LOCK_global_system_variables because
|
||||
LOCK_open is hold while sql_plugin.c::intern_sys_var_ptr() is called.
|
||||
*/
|
||||
mysql_mutex_record_order(&LOCK_open, &LOCK_global_system_variables);
|
||||
|
||||
if (Events::init(opt_noacl || opt_bootstrap))
|
||||
unireg_abort(1);
|
||||
|
||||
mysqld_server_initialized= 1;
|
||||
|
||||
if (opt_bootstrap)
|
||||
{
|
||||
select_thread_in_use= 0; // Allow 'kill' to work
|
||||
@ -4932,21 +4931,27 @@ int mysqld_main(int argc, char **argv)
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
create_shutdown_thread();
|
||||
start_handle_manager();
|
||||
|
||||
/*
|
||||
init_slave() must be called after the thread keys are created.
|
||||
Some parts of the code (e.g. SHOW STATUS LIKE 'slave_running' and other
|
||||
places) assume that active_mi != 0, so let's fail if it's 0 (out of
|
||||
memory); a message has already been printed.
|
||||
*/
|
||||
if (init_slave() && !active_mi)
|
||||
{
|
||||
unireg_abort(1);
|
||||
}
|
||||
|
||||
if (opt_init_file && *opt_init_file)
|
||||
{
|
||||
if (read_init_file(opt_init_file))
|
||||
unireg_abort(1);
|
||||
}
|
||||
|
||||
/*
|
||||
We must have LOCK_open before LOCK_global_system_variables because
|
||||
LOCK_open is hold while sql_plugin.c::intern_sys_var_ptr() is called.
|
||||
*/
|
||||
mysql_mutex_record_order(&LOCK_open, &LOCK_global_system_variables);
|
||||
|
||||
create_shutdown_thread();
|
||||
start_handle_manager();
|
||||
|
||||
sql_print_information(ER_DEFAULT(ER_STARTUP),my_progname,server_version,
|
||||
((unix_sock == INVALID_SOCKET) ? (char*) ""
|
||||
: mysqld_unix_port),
|
||||
@ -6524,12 +6529,17 @@ static int show_rpl_status(THD *thd, SHOW_VAR *var, char *buff)
|
||||
|
||||
static int show_slave_running(THD *thd, SHOW_VAR *var, char *buff)
|
||||
{
|
||||
Master_info *mi;
|
||||
var->type= SHOW_MY_BOOL;
|
||||
mysql_mutex_lock(&LOCK_active_mi);
|
||||
var->value= buff;
|
||||
*((my_bool *)buff)= (my_bool) (active_mi &&
|
||||
active_mi->slave_running == MYSQL_SLAVE_RUN_CONNECT &&
|
||||
active_mi->rli.slave_running);
|
||||
mi= master_info_index->
|
||||
get_master_info(&thd->variables.default_master_connection,
|
||||
MYSQL_ERROR::WARN_LEVEL_WARN);
|
||||
*((my_bool *)buff)= (my_bool) (mi &&
|
||||
mi->slave_running ==
|
||||
MYSQL_SLAVE_RUN_CONNECT &&
|
||||
mi->rli.slave_running);
|
||||
mysql_mutex_unlock(&LOCK_active_mi);
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user