diff options
author | Sven Sandberg <sven.sandberg@oracle.com> | 2011-02-16 17:27:35 +0100 |
---|---|---|
committer | Sven Sandberg <sven.sandberg@oracle.com> | 2011-02-16 17:27:35 +0100 |
commit | 2f9198a0f246b601179fe4304855cad25cc4e98d (patch) | |
tree | d8cc39cc890b2d2af8859e9cbef52e17542bdaad /sql | |
parent | f65f016aeeba1e7cee6cd3f4f07599cfb92d3001 (diff) | |
download | mariadb-git-2f9198a0f246b601179fe4304855cad25cc4e98d.tar.gz |
WL#5670: Proposal: Remove SHOW NEW MASTER statement
Removes SHOW NEW MASTER statement and all related code.
Also removes the unused function update_slave_list from repl_failsafe.cc.
mysql-test/r/signal_code.result:
Updated result file.
The output of SHOW PROCEDURE CODE has changed, because the numerical values
of some SQLCOM_ commands have changes. This is not a problem, because
SHOW PROCEDURE CODE only exists in debug builds and the numerical values of
SQLCOM_ constants are not exposed elsewhere.
mysql-test/r/sp-code.result:
Updated result file.
The output of SHOW PROCEDURE CODE has changed, because the numerical values
of some SQLCOM_ commands have changes. This is not a problem, because
SHOW PROCEDURE CODE only exists in debug builds and the numerical values of
SQLCOM_ constants are not exposed elsewhere.
sql/mysqld.cc:
Remove SQLCOM_SHOW_NEW_MASTER.
sql/repl_failsafe.cc:
Remove show_new_master, which was only used by the removed SHOW NEW MASTER statement.
Remove translate_master, which was only used by show_new_master.
Remove find_slave_event, which was only used by translate_master.
Remove find_target_pos, which was only used by translate_master.
Remove cmp_master_pos, which was only used by translate_master.
Remove update_slave_list, which was not used at all.
sql/repl_failsafe.h:
Remove declarations of functions removed by this patch:
update_slave_list, show_new_master, translate_master, update_slave_list
Remove declarations of functions that did not exist before this patch:
handle_failsafe_rpl, load_master_data
Remove declaration of function that is static in slave.cc:
connect_to_master
sql/sp_head.cc:
Removed SQLCOM_SHOW_NEW_MASTER
sql/sql_lex.h:
Removed SQLCOM_SHOW_NEW_MASTER
sql/sql_parse.cc:
Removed SQLCOM_SHOW_NEW_MASTER
sql/sql_repl.cc:
Removed cmp_master_pos(char*,ulonglong,char*,ulonglong), which was
only used by cmp_master_pos*Slave_log_event* sev, LEX_MASTER_INFO* mi) in repl_failsafe.cc,
which has been removed.
sql/sql_repl.h:
removed cmp_master_pos
sql/sql_yacc.yy:
removed syntax SHOW NEW MASTER.
Diffstat (limited to 'sql')
-rw-r--r-- | sql/mysqld.cc | 1 | ||||
-rw-r--r-- | sql/repl_failsafe.cc | 366 | ||||
-rw-r--r-- | sql/repl_failsafe.h | 7 | ||||
-rw-r--r-- | sql/sp_head.cc | 1 | ||||
-rw-r--r-- | sql/sql_lex.h | 5 | ||||
-rw-r--r-- | sql/sql_parse.cc | 14 | ||||
-rw-r--r-- | sql/sql_repl.cc | 17 | ||||
-rw-r--r-- | sql/sql_repl.h | 2 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 13 |
9 files changed, 2 insertions, 424 deletions
diff --git a/sql/mysqld.cc b/sql/mysqld.cc index c81d8bd75e2..c1bad398f80 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -3028,7 +3028,6 @@ SHOW_VAR com_status_vars[]= { {"show_grants", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_GRANTS]), SHOW_LONG_STATUS}, {"show_keys", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_KEYS]), SHOW_LONG_STATUS}, {"show_master_status", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_MASTER_STAT]), SHOW_LONG_STATUS}, - {"show_new_master", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_NEW_MASTER]), SHOW_LONG_STATUS}, {"show_open_tables", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_OPEN_TABLES]), SHOW_LONG_STATUS}, {"show_plugins", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_PLUGINS]), SHOW_LONG_STATUS}, {"show_privileges", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_PRIVILEGES]), SHOW_LONG_STATUS}, diff --git a/sql/repl_failsafe.cc b/sql/repl_failsafe.cc index 540b62b9d3b..bc710616a4c 100644 --- a/sql/repl_failsafe.cc +++ b/sql/repl_failsafe.cc @@ -56,10 +56,6 @@ const char* rpl_status_type[]= "RECOVERY_CAPTAIN","NULL",NullS }; -static Slave_log_event* find_slave_event(IO_CACHE* log, - const char* log_file_name, - char* errmsg); - /* All of the functions defined in this file which are not used (the ones to handle failsafe) are not used; their code has not been updated for more than @@ -91,13 +87,6 @@ void change_rpl_status(ulong from_status, ulong to_status) }\ -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 (thd->server_id) @@ -228,361 +217,6 @@ void end_slave_list() } } -static int find_target_pos(LEX_MASTER_INFO *mi, IO_CACHE *log, char *errmsg) -{ - 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, (mysql_mutex_t*) 0, 0))) - { - if (log->error > 0) - strmov(errmsg, "Binary log truncated in the middle of event"); - else if (log->error < 0) - strmov(errmsg, "I/O error reading binary log"); - else - strmov(errmsg, "Could not find target event in the binary log"); - return 1; - } - - if (ev->log_pos >= log_pos && ev->server_id == target_server_id) - { - delete ev; - mi->pos = my_b_tell(log); - return 0; - } - delete ev; - } - /* Impossible */ -} - -/** - @details - Before 4.0.15 we had a member of THD called log_pos, it was meant for - failsafe replication code in repl_failsafe.cc which is disabled until - it is reworked. Event's log_pos used to be preserved through - log-slave-updates to make code in repl_failsafe.cc work (this - function, SHOW NEW MASTER); but on the other side it caused unexpected - values in Exec_Master_Log_Pos in A->B->C replication setup, - synchronization problems in master_pos_wait(), ... So we - (Dmitri & Guilhem) removed it. - - So for now this function is broken. -*/ - -int translate_master(THD* thd, LEX_MASTER_INFO* mi, char* errmsg) -{ - LOG_INFO linfo; - char last_log_name[FN_REFLEN]; - IO_CACHE log; - File file = -1, last_file = -1; - mysql_mutex_t *log_lock; - const char* errmsg_p; - Slave_log_event* sev = 0; - my_off_t last_pos = 0; - int error = 1; - int cmp_res; - LINT_INIT(cmp_res); - DBUG_ENTER("translate_master"); - - if (!mysql_bin_log.is_open()) - { - strmov(errmsg,"Binary log is not open"); - DBUG_RETURN(1); - } - - if (!server_id_supplied) - { - strmov(errmsg, "Misconfigured master - server id was not set"); - DBUG_RETURN(1); - } - - if (mysql_bin_log.find_log_pos(&linfo, NullS, 1)) - { - strmov(errmsg,"Could not find first log"); - DBUG_RETURN(1); - } - thd->current_linfo = &linfo; - - bzero((char*) &log,sizeof(log)); - log_lock = mysql_bin_log.get_log_lock(); - mysql_mutex_lock(log_lock); - - for (;;) - { - if ((file=open_binlog(&log, linfo.log_file_name, &errmsg_p)) < 0) - { - strmov(errmsg, errmsg_p); - goto err; - } - - if (!(sev = find_slave_event(&log, linfo.log_file_name, errmsg))) - goto err; - - cmp_res = cmp_master_pos(sev, mi); - delete sev; - - if (!cmp_res) - { - /* Copy basename */ - fn_format(mi->log_file_name, linfo.log_file_name, "","",1); - mi->pos = my_b_tell(&log); - goto mi_inited; - } - else if (cmp_res > 0) - { - if (!last_pos) - { - strmov(errmsg, - "Slave event in first log points past the target position"); - goto err; - } - end_io_cache(&log); - mysql_file_close(file, MYF(MY_WME)); - if (init_io_cache(&log, (file = last_file), IO_SIZE, READ_CACHE, 0, 0, - MYF(MY_WME))) - { - errmsg[0] = 0; - goto err; - } - break; - } - - strmov(last_log_name, linfo.log_file_name); - last_pos = my_b_tell(&log); - - switch (mysql_bin_log.find_next_log(&linfo, 1)) { - case LOG_INFO_EOF: - if (last_file >= 0) - mysql_file_close(last_file, MYF(MY_WME)); - last_file = -1; - goto found_log; - case 0: - break; - default: - strmov(errmsg, "Error reading log index"); - goto err; - } - - end_io_cache(&log); - if (last_file >= 0) - mysql_file_close(last_file, MYF(MY_WME)); - last_file = file; - } - -found_log: - my_b_seek(&log, last_pos); - if (find_target_pos(mi,&log,errmsg)) - goto err; - fn_format(mi->log_file_name, last_log_name, "","",1); /* Copy basename */ - -mi_inited: - error = 0; -err: - mysql_mutex_unlock(log_lock); - end_io_cache(&log); - mysql_mutex_lock(&LOCK_thread_count); - thd->current_linfo = 0; - mysql_mutex_unlock(&LOCK_thread_count); - if (file >= 0) - mysql_file_close(file, MYF(MY_WME)); - if (last_file >= 0 && last_file != file) - mysql_file_close(last_file, MYF(MY_WME)); - - DBUG_RETURN(error); -} - - -/** - Caller must delete result when done. -*/ - -static Slave_log_event* find_slave_event(IO_CACHE* log, - const char* log_file_name, - char* errmsg) -{ - Log_event* ev; - int i; - bool slave_event_found = 0; - LINT_INIT(ev); - - for (i = 0; i < 2; i++) - { - if (!(ev= Log_event::read_log_event(log, (mysql_mutex_t*)0, 0))) - { - my_snprintf(errmsg, SLAVE_ERRMSG_SIZE, - "Error reading event in log '%s'", - (char*)log_file_name); - return 0; - } - if (ev->get_type_code() == SLAVE_EVENT) - { - slave_event_found = 1; - break; - } - delete ev; - } - if (!slave_event_found) - { - my_snprintf(errmsg, SLAVE_ERRMSG_SIZE, - "Could not find slave event in log '%s'", - (char*)log_file_name); - return 0; - } - - return (Slave_log_event*)ev; -} - -/** - This function is broken now. - - @seealso translate_master() -*/ - -bool show_new_master(THD* thd) -{ - Protocol *protocol= thd->protocol; - DBUG_ENTER("show_new_master"); - List<Item> field_list; - char errmsg[SLAVE_ERRMSG_SIZE]; - LEX_MASTER_INFO* lex_mi= &thd->lex->mi; - - errmsg[0]=0; // Safety - if (translate_master(thd, lex_mi, errmsg)) - { - if (errmsg[0]) - my_error(ER_ERROR_WHEN_EXECUTING_COMMAND, MYF(0), - "SHOW NEW MASTER", errmsg); - DBUG_RETURN(TRUE); - } - else - { - field_list.push_back(new Item_empty_string("Log_name", 20)); - field_list.push_back(new Item_return_int("Log_pos", 10, - MYSQL_TYPE_LONGLONG)); - if (protocol->send_result_set_metadata(&field_list, - Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF)) - DBUG_RETURN(TRUE); - protocol->prepare_for_resend(); - protocol->store(lex_mi->log_file_name, &my_charset_bin); - protocol->store((ulonglong) lex_mi->pos); - if (protocol->write()) - DBUG_RETURN(TRUE); - my_eof(thd); - DBUG_RETURN(FALSE); - } -} - -/** - Asks the master for the list of its other connected slaves. - - This is for failsafe replication: - in order for failsafe replication to work, the servers involved in - replication must know of each other. We accomplish this by having each - slave report to the master how to reach it, and on connection, each - slave receives information about where the other slaves are. - - @param mysql pre-existing connection to the master - @param mi master info - - @note - mi is used only to give detailed error messages which include the - hostname/port of the master, the username used by the slave to connect to - the master. - If the user used by the slave to connect to the master does not have the - REPLICATION SLAVE privilege, it will pop in this function because - SHOW SLAVE HOSTS will fail on the master. - - @retval - 1 error - @retval - 0 success -*/ - -int update_slave_list(MYSQL* mysql, Master_info* mi) -{ - MYSQL_RES* res=0; - MYSQL_ROW row; - const char* error=0; - bool have_auth_info; - int port_ind; - DBUG_ENTER("update_slave_list"); - - if (mysql_real_query(mysql, STRING_WITH_LEN("SHOW SLAVE HOSTS")) || - !(res = mysql_store_result(mysql))) - { - error= mysql_error(mysql); - goto err; - } - - switch (mysql_num_fields(res)) { - case 5: - have_auth_info = 0; - port_ind=2; - break; - case 7: - have_auth_info = 1; - port_ind=4; - break; - default: - error= "the master returned an invalid number of fields for SHOW SLAVE \ -HOSTS"; - goto err; - } - - mysql_mutex_lock(&LOCK_slave_list); - - while ((row= mysql_fetch_row(res))) - { - uint32 log_server_id; - SLAVE_INFO* si, *old_si; - log_server_id = atoi(row[0]); - if ((old_si= (SLAVE_INFO*)my_hash_search(&slave_list, - (uchar*)&log_server_id,4))) - si = old_si; - else - { - if (!(si = (SLAVE_INFO*)my_malloc(sizeof(SLAVE_INFO), MYF(MY_WME)))) - { - error= "the slave is out of memory"; - mysql_mutex_unlock(&LOCK_slave_list); - goto err; - } - si->server_id = log_server_id; - if (my_hash_insert(&slave_list, (uchar*)si)) - { - error= "the slave is out of memory"; - mysql_mutex_unlock(&LOCK_slave_list); - goto err; - } - } - 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) - { - strmake(si->user, row[2], sizeof(si->user)-1); - strmake(si->password, row[3], sizeof(si->password)-1); - } - } - mysql_mutex_unlock(&LOCK_slave_list); - -err: - if (res) - mysql_free_result(res); - if (error) - { - sql_print_error("While trying to obtain the list of slaves from the master " - "'%s:%d', user '%s' got the following error: '%s'", - mi->host, mi->port, mi->user, error); - DBUG_RETURN(1); - } - DBUG_RETURN(0); -} - /** Execute a SHOW SLAVE HOSTS statement. diff --git a/sql/repl_failsafe.h b/sql/repl_failsafe.h index a0c41686696..2ba1f25c591 100644 --- a/sql/repl_failsafe.h +++ b/sql/repl_failsafe.h @@ -33,19 +33,12 @@ extern mysql_cond_t COND_rpl_status; extern TYPELIB rpl_role_typelib; extern const char* rpl_role_type[], *rpl_status_type[]; -pthread_handler_t handle_failsafe_rpl(void *arg); void change_rpl_status(ulong from_status, ulong to_status); int find_recovery_captain(THD* thd, MYSQL* mysql); -int update_slave_list(MYSQL* mysql, Master_info* mi); extern HASH slave_list; -bool load_master_data(THD* thd); -int connect_to_master(THD *thd, MYSQL* mysql, Master_info* mi); - -bool show_new_master(THD* thd); bool show_slave_hosts(THD* thd); -int translate_master(THD* thd, LEX_MASTER_INFO* mi, char* errmsg); void init_slave_list(); void end_slave_list(); int register_slave(THD* thd, uchar* packet, uint packet_length); diff --git a/sql/sp_head.cc b/sql/sp_head.cc index 6959d21abd6..e87e03c1db7 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -237,7 +237,6 @@ sp_get_flags_for_command(LEX *lex) case SQLCOM_SHOW_EVENTS: case SQLCOM_SHOW_KEYS: case SQLCOM_SHOW_MASTER_STAT: - case SQLCOM_SHOW_NEW_MASTER: case SQLCOM_SHOW_OPEN_TABLES: case SQLCOM_SHOW_PRIVILEGES: case SQLCOM_SHOW_PROCESSLIST: diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 2d11bc7aad7..a9abe174d6e 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -162,7 +162,7 @@ enum enum_sql_command { SQLCOM_SHOW_OPEN_TABLES, SQLCOM_HA_OPEN, SQLCOM_HA_CLOSE, SQLCOM_HA_READ, SQLCOM_SHOW_SLAVE_HOSTS, SQLCOM_DELETE_MULTI, SQLCOM_UPDATE_MULTI, - SQLCOM_SHOW_BINLOG_EVENTS, SQLCOM_SHOW_NEW_MASTER, SQLCOM_DO, + SQLCOM_SHOW_BINLOG_EVENTS, SQLCOM_DO, SQLCOM_SHOW_WARNS, SQLCOM_EMPTY_QUERY, SQLCOM_SHOW_ERRORS, SQLCOM_SHOW_STORAGE_ENGINES, SQLCOM_SHOW_PRIVILEGES, SQLCOM_HELP, SQLCOM_CREATE_USER, SQLCOM_DROP_USER, SQLCOM_RENAME_USER, @@ -269,8 +269,7 @@ typedef struct st_lex_server_options /** - Structure to hold parameters for CHANGE MASTER or START/STOP SLAVE - or SHOW NEW MASTER. + Structure to hold parameters for CHANGE MASTER, START SLAVE, and STOP SLAVE. Remark: this should not be confused with Master_info (and perhaps would better be renamed to st_lex_replication_info). Some fields, diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 2086100db98..d9e1245bf66 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -316,7 +316,6 @@ void init_update_queries(void) sql_command_flags[SQLCOM_SHOW_VARIABLES]= CF_STATUS_COMMAND | CF_REEXECUTION_FRAGILE; sql_command_flags[SQLCOM_SHOW_CHARSETS]= CF_STATUS_COMMAND | CF_REEXECUTION_FRAGILE; sql_command_flags[SQLCOM_SHOW_COLLATIONS]= CF_STATUS_COMMAND | CF_REEXECUTION_FRAGILE; - sql_command_flags[SQLCOM_SHOW_NEW_MASTER]= CF_STATUS_COMMAND; sql_command_flags[SQLCOM_SHOW_BINLOGS]= CF_STATUS_COMMAND; sql_command_flags[SQLCOM_SHOW_SLAVE_HOSTS]= CF_STATUS_COMMAND; sql_command_flags[SQLCOM_SHOW_BINLOG_EVENTS]= CF_STATUS_COMMAND; @@ -2145,19 +2144,6 @@ case SQLCOM_PREPARE: #endif break; } - case SQLCOM_SHOW_NEW_MASTER: - { - if (check_global_access(thd, REPL_SLAVE_ACL)) - goto error; - /* This query don't work now. See comment in repl_failsafe.cc */ -#ifndef WORKING_NEW_MASTER - my_error(ER_NOT_SUPPORTED_YET, MYF(0), "SHOW NEW MASTER"); - goto error; -#else - res = show_new_master(thd); - break; -#endif - } #ifdef HAVE_REPLICATION case SQLCOM_SHOW_SLAVE_HOSTS: diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index bc0cca4d887..9783917aaf0 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -1694,23 +1694,6 @@ int reset_master(THD* thd) return 0; } -int cmp_master_pos(const char* log_file_name1, ulonglong log_pos1, - const char* log_file_name2, ulonglong log_pos2) -{ - int res; - size_t log_file_name1_len= strlen(log_file_name1); - size_t log_file_name2_len= strlen(log_file_name2); - - // We assume that both log names match up to '.' - if (log_file_name1_len == log_file_name2_len) - { - if ((res= strcmp(log_file_name1, log_file_name2))) - return res; - return (log_pos1 < log_pos2) ? -1 : (log_pos1 == log_pos2) ? 0 : 1; - } - return ((log_file_name1_len < log_file_name2_len) ? -1 : 1); -} - /** Execute a SHOW BINLOG EVENTS statement. diff --git a/sql/sql_repl.h b/sql/sql_repl.h index 4d3b0b8d62c..dfe41d8e688 100644 --- a/sql/sql_repl.h +++ b/sql/sql_repl.h @@ -43,8 +43,6 @@ int start_slave(THD* thd, Master_info* mi, bool net_report); int stop_slave(THD* thd, Master_info* mi, bool net_report); bool change_master(THD* thd, Master_info* mi); bool mysql_show_binlog_events(THD* thd); -int cmp_master_pos(const char* log_file_name1, ulonglong log_pos1, - const char* log_file_name2, ulonglong log_pos2); int reset_slave(THD *thd, Master_info* mi); int reset_master(THD* thd); bool purge_master_logs(THD* thd, const char* to_log); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 397afd26d8d..02e0d347ef7 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -10921,19 +10921,6 @@ show_param: if (prepare_schema_table(YYTHD, lex, $4, SCH_COLUMNS)) MYSQL_YYABORT; } - | NEW_SYM MASTER_SYM FOR_SYM SLAVE - WITH MASTER_LOG_FILE_SYM EQ - TEXT_STRING_sys /* $8 */ - AND_SYM MASTER_LOG_POS_SYM EQ - ulonglong_num /* $12 */ - AND_SYM MASTER_SERVER_ID_SYM EQ - ulong_num /* $16 */ - { - Lex->sql_command = SQLCOM_SHOW_NEW_MASTER; - Lex->mi.log_file_name = $8.str; - Lex->mi.pos = $12; - Lex->mi.server_id = $16; - } | master_or_binary LOGS_SYM { Lex->sql_command = SQLCOM_SHOW_BINLOGS; |