diff options
Diffstat (limited to 'sql/repl_failsafe.cc')
-rw-r--r-- | sql/repl_failsafe.cc | 97 |
1 files changed, 56 insertions, 41 deletions
diff --git a/sql/repl_failsafe.cc b/sql/repl_failsafe.cc index 961047d883a..6645f7a1eed 100644 --- a/sql/repl_failsafe.cc +++ b/sql/repl_failsafe.cc @@ -40,16 +40,20 @@ const char *rpl_role_type[] = {"MASTER","SLAVE",NullS}; TYPELIB rpl_role_typelib = {array_elements(rpl_role_type)-1,"", rpl_role_type}; -const char* rpl_status_type[] = {"AUTH_MASTER","ACTIVE_SLAVE","IDLE_SLAVE", - "LOST_SOLDIER","TROOP_SOLDIER", - "RECOVERY_CAPTAIN","NULL",NullS}; +const char* rpl_status_type[]= +{ + "AUTH_MASTER","ACTIVE_SLAVE","IDLE_SLAVE", "LOST_SOLDIER","TROOP_SOLDIER", + "RECOVERY_CAPTAIN","NULL",NullS +}; TYPELIB rpl_status_typelib= {array_elements(rpl_status_type)-1,"", rpl_status_type}; + static Slave_log_event* find_slave_event(IO_CACHE* log, const char* log_file_name, char* errmsg); + static int init_failsafe_rpl_thread(THD* thd) { DBUG_ENTER("init_failsafe_rpl_thread"); @@ -93,6 +97,7 @@ static int init_failsafe_rpl_thread(THD* thd) DBUG_RETURN(0); } + void change_rpl_status(RPL_STATUS from_status, RPL_STATUS to_status) { pthread_mutex_lock(&LOCK_rpl_status); @@ -102,6 +107,7 @@ void change_rpl_status(RPL_STATUS from_status, RPL_STATUS to_status) pthread_mutex_unlock(&LOCK_rpl_status); } + #define get_object(p, obj) \ {\ uint len = (uint)*p++; \ @@ -111,28 +117,33 @@ void change_rpl_status(RPL_STATUS from_status, RPL_STATUS to_status) p+= len; \ }\ + static inline int cmp_master_pos(Slave_log_event* sev, LEX_MASTER_INFO* mi) { return cmp_master_pos(sev->master_log, sev->master_pos, mi->log_file_name, mi->pos); } + void unregister_slave(THD* thd, bool only_mine, bool need_mutex) { - if (need_mutex) - pthread_mutex_lock(&LOCK_slave_list); if (thd->server_id) { + if (need_mutex) + pthread_mutex_lock(&LOCK_slave_list); + SLAVE_INFO* old_si; if ((old_si = (SLAVE_INFO*)hash_search(&slave_list, (byte*)&thd->server_id, 4)) && (!only_mine || old_si->thd == thd)) hash_delete(&slave_list, (byte*)old_si); + + if (need_mutex) + pthread_mutex_unlock(&LOCK_slave_list); } - if (need_mutex) - pthread_mutex_unlock(&LOCK_slave_list); } + int register_slave(THD* thd, uchar* packet, uint packet_length) { SLAVE_INFO *si; @@ -199,16 +210,15 @@ void end_slave_list() } } -static int find_target_pos(LEX_MASTER_INFO* mi, IO_CACHE* log, char* errmsg) +static int find_target_pos(LEX_MASTER_INFO *mi, IO_CACHE *log, char *errmsg) { - uint32 log_pos = (uint32) mi->pos; + my_off_t log_pos = (my_off_t) mi->pos; uint32 target_server_id = mi->server_id; for (;;) { Log_event* ev; - if (!(ev = Log_event::read_log_event(log, (pthread_mutex_t*)0, - 0))) + if (!(ev = Log_event::read_log_event(log, (pthread_mutex_t*) 0, 0))) { if (log->error > 0) strmov(errmsg, "Binary log truncated in the middle of event"); @@ -225,9 +235,9 @@ static int find_target_pos(LEX_MASTER_INFO* mi, IO_CACHE* log, char* errmsg) mi->pos = my_b_tell(log); return 0; } - delete ev; } + /* Impossible */ } @@ -258,8 +268,6 @@ int translate_master(THD* thd, LEX_MASTER_INFO* mi, char* errmsg) } linfo.index_file_offset = 0; - - search_file_name[0] = 0; if (mysql_bin_log.find_first_log(&linfo, search_file_name)) @@ -357,7 +365,11 @@ err: return error; } -// caller must delete result when done + +/* + Caller must delete result when done +*/ + static Slave_log_event* find_slave_event(IO_CACHE* log, const char* log_file_name, char* errmsg) @@ -431,6 +443,7 @@ int show_new_master(THD* thd) } } + int update_slave_list(MYSQL* mysql) { MYSQL_RES* res=0; @@ -446,8 +459,7 @@ int update_slave_list(MYSQL* mysql) goto err; } - switch (mc_mysql_num_fields(res)) - { + switch (mc_mysql_num_fields(res)) { case 5: have_auth_info = 0; port_ind=2; @@ -463,13 +475,13 @@ int update_slave_list(MYSQL* mysql) pthread_mutex_lock(&LOCK_slave_list); - while ((row = mc_mysql_fetch_row(res))) + while ((row= mc_mysql_fetch_row(res))) { uint32 server_id; SLAVE_INFO* si, *old_si; server_id = atoi(row[0]); - if ((old_si = (SLAVE_INFO*)hash_search(&slave_list, - (byte*)&server_id,4))) + if ((old_si= (SLAVE_INFO*)hash_search(&slave_list, + (byte*)&server_id,4))) si = old_si; else { @@ -482,17 +494,18 @@ int update_slave_list(MYSQL* mysql) si->server_id = server_id; hash_insert(&slave_list, (byte*)si); } - strnmov(si->host, row[1], sizeof(si->host)); + strmake(si->host, row[1], sizeof(si->host)-1); si->port = atoi(row[port_ind]); si->rpl_recovery_rank = atoi(row[port_ind+1]); si->master_id = atoi(row[port_ind+2]); if (have_auth_info) { - strnmov(si->user, row[2], sizeof(si->user)); - strnmov(si->password, row[3], sizeof(si->password)); + strmake(si->user, row[2], sizeof(si->user)-1); + strmake(si->password, row[3], sizeof(si->password)-1); } } pthread_mutex_unlock(&LOCK_slave_list); + err: if (res) mc_mysql_free_result(res); @@ -504,12 +517,13 @@ err: return 0; } + int find_recovery_captain(THD* thd, MYSQL* mysql) { - return 0; } + pthread_handler_decl(handle_failsafe_rpl,arg) { DBUG_ENTER("handle_failsafe_rpl"); @@ -532,8 +546,7 @@ pthread_handler_decl(handle_failsafe_rpl,arg) thd->proc_info="Processing request"; while (!break_req_chain) { - switch (rpl_status) - { + switch (rpl_status) { case RPL_LOST_SOLDIER: if (find_recovery_captain(thd, recovery_captain)) rpl_status=RPL_TROOP_SOLDIER; @@ -558,6 +571,7 @@ err: DBUG_RETURN(0); } + int show_slave_hosts(THD* thd) { List<Item> field_list; @@ -606,6 +620,7 @@ int show_slave_hosts(THD* thd) DBUG_RETURN(0); } + int connect_to_master(THD *thd, MYSQL* mysql, MASTER_INFO* mi) { if (!mi->host || !*mi->host) /* empty host */ @@ -623,9 +638,9 @@ int connect_to_master(THD *thd, MYSQL* mysql, MASTER_INFO* mi) static inline void cleanup_mysql_results(MYSQL_RES* db_res, - MYSQL_RES** cur, MYSQL_RES** start) + MYSQL_RES** cur, MYSQL_RES** start) { - for( ; cur >= start; --cur) + for (; cur >= start; --cur) { if (*cur) mc_mysql_free_result(*cur); @@ -638,7 +653,7 @@ static inline int fetch_db_tables(THD* thd, MYSQL* mysql, const char* db, MYSQL_RES* table_res, MASTER_INFO* mi) { MYSQL_ROW row; - for( row = mc_mysql_fetch_row(table_res); row; + for (row = mc_mysql_fetch_row(table_res); row; row = mc_mysql_fetch_row(table_res)) { TABLE_LIST table; @@ -690,7 +705,7 @@ int load_master_data(THD* thd) if (connect_to_master(thd, &mysql, active_mi)) { net_printf(&thd->net, error = ER_CONNECT_TO_MASTER, - mc_mysql_error(&mysql)); + mc_mysql_error(&mysql)); goto err; } @@ -742,8 +757,8 @@ int load_master_data(THD* thd) table_res_end = table_res + num_dbs; - for(cur_table_res = table_res; cur_table_res < table_res_end; - cur_table_res++) + for (cur_table_res = table_res; cur_table_res < table_res_end; + cur_table_res++) { // since we know how many rows we have, this can never be NULL MYSQL_ROW row = mc_mysql_fetch_row(db_res); @@ -761,7 +776,7 @@ int load_master_data(THD* thd) */ if (!db_ok(db, replicate_do_db, replicate_ignore_db) || - !strcmp(db,"mysql")) + !strcmp(db,"mysql")) { *cur_table_res = 0; continue; @@ -777,7 +792,7 @@ int load_master_data(THD* thd) if (mc_mysql_select_db(&mysql, db) || mc_mysql_query(&mysql, "show tables", 0) || - !(*cur_table_res = mc_mysql_store_result(&mysql))) + !(*cur_table_res = mc_mysql_store_result(&mysql))) { net_printf(&thd->net, error = ER_QUERY_ON_MASTER, mc_mysql_error(&mysql)); @@ -804,7 +819,7 @@ int load_master_data(THD* thd) We need this check because the master may not be running with log-bin, but it will still allow us to do all the steps of LOAD DATA FROM MASTER - no reason to forbid it, really, - although it does not make much sense for the user to do it + although it does not make much sense for the user to do it */ if (row[0] && row[1]) { @@ -838,18 +853,18 @@ int load_master_data(THD* thd) } pthread_mutex_lock(&active_mi->rli.data_lock); active_mi->rli.master_log_pos = active_mi->master_log_pos; - strnmov(active_mi->rli.master_log_name,active_mi->master_log_name, - sizeof(active_mi->rli.master_log_name)); + strmake(active_mi->rli.master_log_name,active_mi->master_log_name, + sizeof(active_mi->rli.master_log_name)-1); flush_relay_log_info(&active_mi->rli); pthread_cond_broadcast(&active_mi->rli.data_cond); pthread_mutex_unlock(&active_mi->rli.data_lock); thd->proc_info = "starting slave"; if (restart_thread_mask) { - error=start_slave_threads(0 /* mutex not needed*/, - 1 /* wait for start*/, - active_mi,master_info_file,relay_log_info_file, - restart_thread_mask); + error=start_slave_threads(0 /* mutex not needed */, + 1 /* wait for start */, + active_mi,master_info_file,relay_log_info_file, + restart_thread_mask); } err: |