mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Here comes a nasty patch, although I am not ready to push it yet. I will
first pull, merge,test, and get it to work. The main change is the new replication code - now we have two slave threads SQL thread and I/O thread. I have also re-written a lot of the code to prepare for multi-master implementation. I also documented IO_CACHE quite extensively and to some extend, THD class. Makefile.am: moved tags target script into a separate file include/my_sys.h: fixes in IO_CACHE for SEQ_READ_APPEND + some documentation libmysqld/lib_sql.cc: updated replication locks, but now I see I did it wrong and it won't compile. Will fix before the push. mysql-test/r/rpl000014.result: test result update mysql-test/r/rpl000015.result: test result update mysql-test/r/rpl000016.result: test result update mysql-test/r/rpl_log.result: test result update mysql-test/t/rpl000016-slave.sh: remove relay logs mysql-test/t/rpl000017-slave.sh: remove relay logs mysql-test/t/rpl_log.test: updated test mysys/mf_iocache.c: IO_CACHE updates to make replication work mysys/mf_iocache2.c: IO_CACHE update to make replication work mysys/thr_mutex.c: cosmetic change sql/item_func.cc: new replication code sql/lex.h: new replication sql/log.cc: new replication sql/log_event.cc: new replication sql/log_event.h: new replication sql/mini_client.cc: new replication sql/mini_client.h: new replication sql/mysql_priv.h: new replication sql/mysqld.cc: new replication sql/repl_failsafe.cc: new replication sql/slave.cc: new replication sql/slave.h: new replication sql/sql_class.cc: new replication sql/sql_class.h: new replication sql/sql_lex.h: new replication sql/sql_parse.cc: new replication sql/sql_repl.cc: new replication sql/sql_repl.h: new replication sql/sql_show.cc: new replication sql/sql_yacc.yy: new replication sql/stacktrace.c: more robust stack tracing sql/structs.h: new replication code BitKeeper/etc/ignore: Added mysql-test/r/rpl000002.eval mysql-test/r/rpl000014.eval mysql-test/r/rpl000015.eval mysql-test/r/rpl000016.eval mysql-test/r/slave-running.eval mysql-test/r/slave-stopped.eval to the ignore list
This commit is contained in:
@ -206,7 +206,7 @@ SHOW_COMP_OPTION have_openssl=SHOW_OPTION_NO;
|
||||
SHOW_COMP_OPTION have_symlink=SHOW_OPTION_YES;
|
||||
|
||||
|
||||
static bool opt_skip_slave_start = 0; // If set, slave is not autostarted
|
||||
bool opt_skip_slave_start = 0; // If set, slave is not autostarted
|
||||
static bool opt_do_pstack = 0;
|
||||
static ulong opt_specialflag=SPECIAL_ENGLISH;
|
||||
static ulong back_log,connect_timeout,concurrency;
|
||||
@ -225,8 +225,6 @@ bool opt_sql_bin_update = 0, opt_log_slave_updates = 0, opt_safe_show_db=0,
|
||||
opt_safe_user_create = 0, opt_no_mix_types = 0;
|
||||
FILE *bootstrap_file=0;
|
||||
int segfaulted = 0; // ensure we do not enter SIGSEGV handler twice
|
||||
extern MASTER_INFO glob_mi;
|
||||
extern int init_master_info(MASTER_INFO* mi);
|
||||
|
||||
/*
|
||||
If sql_bin_update is true, SQL_LOG_UPDATE and SQL_LOG_BIN are kept in sync,
|
||||
@ -238,7 +236,7 @@ static struct rand_struct sql_rand;
|
||||
static int cleanup_done;
|
||||
static char **defaults_argv,time_zone[30];
|
||||
static const char *default_table_type_name;
|
||||
static char glob_hostname[FN_REFLEN];
|
||||
char glob_hostname[FN_REFLEN];
|
||||
|
||||
#include "sslopt-vars.h"
|
||||
#ifdef HAVE_OPENSSL
|
||||
@ -274,7 +272,9 @@ volatile ulong cached_thread_count=0;
|
||||
|
||||
// replication parameters, if master_host is not NULL, we are a slave
|
||||
my_string master_user = (char*) "test", master_password = 0, master_host=0,
|
||||
master_info_file = (char*) "master.info", master_ssl_key=0, master_ssl_cert=0;
|
||||
master_info_file = (char*) "master.info",
|
||||
relay_log_info_file = (char*) "relay-log.info",
|
||||
master_ssl_key=0, master_ssl_cert=0;
|
||||
my_string report_user = 0, report_password = 0, report_host=0;
|
||||
|
||||
const char *localhost=LOCAL_HOST;
|
||||
@ -321,6 +321,7 @@ bool mysql_embedded=1;
|
||||
#endif
|
||||
|
||||
char *opt_bin_logname = 0; // this one needs to be seen in sql_parse.cc
|
||||
char *opt_relay_logname = 0, *opt_relaylog_index_name=0;
|
||||
char server_version[SERVER_VERSION_LENGTH]=MYSQL_SERVER_VERSION;
|
||||
const char *first_keyword="first";
|
||||
const char **errmesg; /* Error messages */
|
||||
@ -356,11 +357,10 @@ pthread_mutex_t LOCK_mysql_create_db, LOCK_Acl, LOCK_open, LOCK_thread_count,
|
||||
LOCK_error_log,
|
||||
LOCK_delayed_insert, LOCK_delayed_status, LOCK_delayed_create,
|
||||
LOCK_crypt, LOCK_bytes_sent, LOCK_bytes_received,
|
||||
LOCK_binlog_update, LOCK_slave, LOCK_server_id,
|
||||
LOCK_user_conn, LOCK_slave_list;
|
||||
LOCK_server_id,
|
||||
LOCK_user_conn, LOCK_slave_list, LOCK_active_mi;
|
||||
|
||||
pthread_cond_t COND_refresh,COND_thread_count,COND_binlog_update,
|
||||
COND_slave_stopped, COND_slave_start;
|
||||
pthread_cond_t COND_refresh,COND_thread_count;
|
||||
pthread_cond_t COND_thread_cache,COND_flush_thread_cache;
|
||||
pthread_t signal_thread;
|
||||
pthread_attr_t connection_attrib;
|
||||
@ -759,6 +759,7 @@ void clean_up(bool print_message)
|
||||
my_free(allocated_mysql_tmpdir,MYF(MY_ALLOW_ZERO_PTR));
|
||||
my_free(slave_load_tmpdir,MYF(MY_ALLOW_ZERO_PTR));
|
||||
x_free(opt_bin_logname);
|
||||
x_free(opt_relay_logname);
|
||||
bitmap_free(&temp_pool);
|
||||
free_max_user_conn();
|
||||
end_slave_list();
|
||||
@ -1095,6 +1096,8 @@ void end_thread(THD *thd, bool put_in_cache)
|
||||
DBUG_PRINT("info", ("sending a broadcast"))
|
||||
|
||||
/* Tell main we are ready */
|
||||
// TODO: explain why we broadcast outside of the lock or
|
||||
// fix the bug - Sasha
|
||||
(void) pthread_mutex_unlock(&LOCK_thread_count);
|
||||
(void) pthread_cond_broadcast(&COND_thread_count);
|
||||
DBUG_PRINT("info", ("unlocked thread_count mutex"))
|
||||
@ -1266,6 +1269,7 @@ the thread stack. Please read http://www.mysql.com/doc/L/i/Linux.html\n\n",
|
||||
#ifdef HAVE_STACKTRACE
|
||||
if(!(test_flags & TEST_NO_STACKTRACE))
|
||||
{
|
||||
fprintf(stderr,"thd=%p\n",thd);
|
||||
print_stacktrace(thd ? (gptr) thd->thread_stack : (gptr) 0,
|
||||
thread_stack);
|
||||
}
|
||||
@ -1594,9 +1598,10 @@ const char *load_default_groups[]= { "mysqld","server",0 };
|
||||
char *libwrapName=NULL;
|
||||
#endif
|
||||
|
||||
static void open_log(MYSQL_LOG *log, const char *hostname,
|
||||
void open_log(MYSQL_LOG *log, const char *hostname,
|
||||
const char *opt_name, const char *extension,
|
||||
enum_log_type type)
|
||||
enum_log_type type, bool read_append,
|
||||
bool no_auto_events)
|
||||
{
|
||||
char tmp[FN_REFLEN];
|
||||
if (!opt_name || !opt_name[0])
|
||||
@ -1620,7 +1625,8 @@ static void open_log(MYSQL_LOG *log, const char *hostname,
|
||||
opt_name=tmp;
|
||||
}
|
||||
}
|
||||
log->open(opt_name,type);
|
||||
log->open(opt_name,type,0,(read_append) ? SEQ_READ_APPEND : WRITE_CACHE,
|
||||
no_auto_events);
|
||||
}
|
||||
|
||||
|
||||
@ -1716,19 +1722,15 @@ int main(int argc, char **argv)
|
||||
(void) pthread_mutex_init(&LOCK_bytes_sent,MY_MUTEX_INIT_FAST);
|
||||
(void) pthread_mutex_init(&LOCK_bytes_received,MY_MUTEX_INIT_FAST);
|
||||
(void) pthread_mutex_init(&LOCK_timezone,MY_MUTEX_INIT_FAST);
|
||||
(void) pthread_mutex_init(&LOCK_binlog_update, MY_MUTEX_INIT_FAST); // QQ NOT USED
|
||||
(void) pthread_mutex_init(&LOCK_slave, MY_MUTEX_INIT_FAST);
|
||||
(void) pthread_mutex_init(&LOCK_server_id, MY_MUTEX_INIT_FAST);
|
||||
(void) pthread_mutex_init(&LOCK_user_conn, MY_MUTEX_INIT_FAST);
|
||||
(void) pthread_mutex_init(&LOCK_rpl_status, MY_MUTEX_INIT_FAST);
|
||||
(void) pthread_mutex_init(&LOCK_active_mi, MY_MUTEX_INIT_FAST);
|
||||
(void) pthread_cond_init(&COND_thread_count,NULL);
|
||||
(void) pthread_cond_init(&COND_refresh,NULL);
|
||||
(void) pthread_cond_init(&COND_thread_cache,NULL);
|
||||
(void) pthread_cond_init(&COND_flush_thread_cache,NULL);
|
||||
(void) pthread_cond_init(&COND_manager,NULL);
|
||||
(void) pthread_cond_init(&COND_binlog_update, NULL);
|
||||
(void) pthread_cond_init(&COND_slave_stopped, NULL);
|
||||
(void) pthread_cond_init(&COND_slave_start, NULL);
|
||||
(void) pthread_cond_init(&COND_rpl_status, NULL);
|
||||
init_signals();
|
||||
|
||||
@ -1825,20 +1827,9 @@ int main(int argc, char **argv)
|
||||
LOG_NEW);
|
||||
using_update_log=1;
|
||||
}
|
||||
|
||||
/*
|
||||
make sure slave thread gets started if server_id is set,
|
||||
valid master.info is present, and master_host has not been specified
|
||||
*/
|
||||
if (server_id && !master_host)
|
||||
{
|
||||
char fname[FN_REFLEN+128];
|
||||
MY_STAT stat_area;
|
||||
fn_format(fname, master_info_file, mysql_data_home, "", 4+16+32);
|
||||
if (my_stat(fname, &stat_area, MYF(0)) && !init_master_info(&glob_mi))
|
||||
master_host = glob_mi.host;
|
||||
}
|
||||
|
||||
|
||||
init_slave();
|
||||
|
||||
if (opt_bin_log && !server_id)
|
||||
{
|
||||
server_id= !master_host ? 1 : 2;
|
||||
@ -1991,17 +1982,6 @@ The server will not act as a slave.");
|
||||
sql_print_error("Warning: Can't create thread to manage maintenance");
|
||||
}
|
||||
|
||||
// slave thread
|
||||
if (master_host)
|
||||
{
|
||||
pthread_t hThread;
|
||||
if (!opt_skip_slave_start &&
|
||||
pthread_create(&hThread, &connection_attrib, handle_slave, 0))
|
||||
sql_print_error("Warning: Can't create thread to handle slave");
|
||||
else if(opt_skip_slave_start)
|
||||
init_master_info(&glob_mi);
|
||||
}
|
||||
|
||||
printf(ER(ER_READY),my_progname,server_version,"");
|
||||
fflush(stdout);
|
||||
|
||||
@ -2665,7 +2645,8 @@ enum options {
|
||||
OPT_REPORT_USER, OPT_REPORT_PASSWORD, OPT_REPORT_PORT,
|
||||
OPT_SHOW_SLAVE_AUTH_INFO, OPT_OLD_RPL_COMPAT,
|
||||
OPT_SLAVE_LOAD_TMPDIR, OPT_NO_MIX_TYPE,
|
||||
OPT_RPL_RECOVERY_RANK,OPT_INIT_RPL_ROLE
|
||||
OPT_RPL_RECOVERY_RANK,OPT_INIT_RPL_ROLE,
|
||||
OPT_RELAY_LOG, OPT_RELAY_LOG_INDEX, OPT_RELAY_LOG_INFO_FILE
|
||||
};
|
||||
|
||||
static struct option long_options[] = {
|
||||
@ -2790,6 +2771,8 @@ static struct option long_options[] = {
|
||||
{"report-password", required_argument, 0, (int) OPT_REPORT_PASSWORD},
|
||||
{"report-port", required_argument, 0, (int) OPT_REPORT_PORT},
|
||||
{"rpl-recovery-rank", required_argument, 0, (int) OPT_RPL_RECOVERY_RANK},
|
||||
{"relay-log", required_argument, 0, (int) OPT_RELAY_LOG},
|
||||
{"relay-log-index", required_argument, 0, (int) OPT_RELAY_LOG_INDEX},
|
||||
{"safe-mode", no_argument, 0, (int) OPT_SAFE},
|
||||
{"safe-show-database", no_argument, 0, (int) OPT_SAFE_SHOW_DB},
|
||||
{"safe-user-create", no_argument, 0, (int) OPT_SAFE_USER_CREATE},
|
||||
@ -2813,6 +2796,8 @@ static struct option long_options[] = {
|
||||
{"skip-stack-trace", no_argument, 0, (int) OPT_SKIP_STACK_TRACE},
|
||||
{"skip-symlink", no_argument, 0, (int) OPT_SKIP_SYMLINKS},
|
||||
{"skip-thread-priority", no_argument, 0, (int) OPT_SKIP_PRIOR},
|
||||
{"relay-log-info-file", required_argument, 0,
|
||||
(int) OPT_RELAY_LOG_INFO_FILE},
|
||||
{"slave-load-tmpdir", required_argument, 0, (int) OPT_SLAVE_LOAD_TMPDIR},
|
||||
{"socket", required_argument, 0, (int) OPT_SOCKET},
|
||||
{"sql-bin-update-same", no_argument, 0, (int) OPT_SQL_BIN_UPDATE_SAME},
|
||||
@ -3151,8 +3136,8 @@ struct show_var_st status_vars[]= {
|
||||
{"Select_range", (char*) &select_range_count, SHOW_LONG},
|
||||
{"Select_range_check", (char*) &select_range_check_count, SHOW_LONG},
|
||||
{"Select_scan", (char*) &select_scan_count, SHOW_LONG},
|
||||
{"Slave_running", (char*) &slave_running, SHOW_BOOL},
|
||||
{"Slave_open_temp_tables", (char*) &slave_open_temp_tables, SHOW_LONG},
|
||||
{"Slave_running", (char*) 0, SHOW_SLAVE_RUNNING},
|
||||
{"Slow_launch_threads", (char*) &slow_launch_threads, SHOW_LONG},
|
||||
{"Slow_queries", (char*) &long_query_count, SHOW_LONG},
|
||||
{"Sort_merge_passes", (char*) &filesort_merge_passes, SHOW_LONG},
|
||||
@ -3548,6 +3533,14 @@ static void get_options(int argc,char **argv)
|
||||
opt_update_log=1;
|
||||
opt_update_logname=optarg; // Use hostname.# if null
|
||||
break;
|
||||
case (int) OPT_RELAY_LOG_INDEX:
|
||||
opt_relaylog_index_name = optarg;
|
||||
break;
|
||||
case (int) OPT_RELAY_LOG:
|
||||
x_free(opt_relay_logname);
|
||||
if (optarg && optarg[0])
|
||||
opt_relay_logname=my_strdup(optarg,MYF(0));
|
||||
break;
|
||||
case (int) OPT_BIN_LOG_INDEX:
|
||||
opt_binlog_index_name = optarg;
|
||||
break;
|
||||
@ -4007,6 +4000,9 @@ static void get_options(int argc,char **argv)
|
||||
case OPT_MASTER_INFO_FILE:
|
||||
master_info_file=optarg;
|
||||
break;
|
||||
case OPT_RELAY_LOG_INFO_FILE:
|
||||
relay_log_info_file=optarg;
|
||||
break;
|
||||
case OPT_MASTER_PORT:
|
||||
master_port= atoi(optarg);
|
||||
break;
|
||||
|
Reference in New Issue
Block a user