diff options
Diffstat (limited to 'sql/mysqld.cc')
-rw-r--r-- | sql/mysqld.cc | 84 |
1 files changed, 40 insertions, 44 deletions
diff --git a/sql/mysqld.cc b/sql/mysqld.cc index c4af3366806..6d99db62f12 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -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; |