summaryrefslogtreecommitdiff
path: root/sql/semisync_slave.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/semisync_slave.cc')
-rw-r--r--sql/semisync_slave.cc48
1 files changed, 30 insertions, 18 deletions
diff --git a/sql/semisync_slave.cc b/sql/semisync_slave.cc
index df8baf045ac..b09571d6dc7 100644
--- a/sql/semisync_slave.cc
+++ b/sql/semisync_slave.cc
@@ -114,11 +114,19 @@ int Repl_semi_sync_slave::slave_start(Master_info *mi)
int Repl_semi_sync_slave::slave_stop(Master_info *mi)
{
+ int ret= 0;
+ if (get_slave_enabled())
+ {
+ if ((ret= kill_connection(mi->mysql)))
+ {
+ sql_print_warning("Failed to kill the active semi-sync connection");
+ }
+ }
+
if (rpl_semi_sync_slave_status)
rpl_semi_sync_slave_status= 0;
- if (get_slave_enabled())
- kill_connection(mi->mysql);
- return 0;
+
+ return ret;
}
int Repl_semi_sync_slave::reset_slave(Master_info *mi)
@@ -126,31 +134,35 @@ int Repl_semi_sync_slave::reset_slave(Master_info *mi)
return 0;
}
-void Repl_semi_sync_slave::kill_connection(MYSQL *mysql)
+int Repl_semi_sync_slave::kill_connection(MYSQL *mysql)
{
- if (!mysql)
- return;
-
+ bool ret= 0;
char kill_buffer[30];
MYSQL *kill_mysql = NULL;
+ size_t kill_buffer_length;
+
+ if (!mysql)
+ goto end;
+
kill_mysql = mysql_init(kill_mysql);
mysql_options(kill_mysql, MYSQL_OPT_CONNECT_TIMEOUT, &m_kill_conn_timeout);
mysql_options(kill_mysql, MYSQL_OPT_READ_TIMEOUT, &m_kill_conn_timeout);
mysql_options(kill_mysql, MYSQL_OPT_WRITE_TIMEOUT, &m_kill_conn_timeout);
- bool ret= (!mysql_real_connect(kill_mysql, mysql->host,
+ ret= (!mysql_real_connect(kill_mysql, mysql->host,
mysql->user, mysql->passwd,0, mysql->port, mysql->unix_socket, 0));
- if (DBUG_EVALUATE_IF("semisync_slave_failed_kill", 1, 0) || ret)
- {
- sql_print_information("cannot connect to master to kill slave io_thread's "
- "connection");
- mysql_close(kill_mysql);
- return;
- }
- size_t kill_buffer_length = my_snprintf(kill_buffer, 30, "KILL %lu",
- mysql->thread_id);
- mysql_real_query(kill_mysql, kill_buffer, (ulong)kill_buffer_length);
+ if (DBUG_EVALUATE_IF("semisync_slave_failed_kill", (ret= 1), 0) || ret)
+ goto end;
+
+ DBUG_EXECUTE_IF("slave_delay_killing_semisync_connection", my_sleep(400000););
+
+ kill_buffer_length=
+ my_snprintf(kill_buffer, 30, "KILL %lu", mysql->thread_id);
+ ret= mysql_real_query(kill_mysql, kill_buffer, (ulong)kill_buffer_length);
+
+end:
mysql_close(kill_mysql);
+ return ret;
}
int Repl_semi_sync_slave::request_transmit(Master_info *mi)