Commit 67522fcb authored by unknown's avatar unknown

Fix for bug #29976: Excessive Slave I/O errors in replication tests

Problem:

The "Slave I/O thread couldn't register on master" error sporadically
occurred in replication tests because the slave I/O thread got
killed by STOP SLAVE before or while registering on master.

Fixed by checking the state of the I/O thread, and issueing
the error only if it was not explicitely killed by a user.


sql/slave.cc:
  When the slave I/O thread fails to register on master, issue an error
  message only if it is not explicitely killed by a user with STOP SLAVE.
parent 619bb76b
...@@ -137,6 +137,7 @@ static int terminate_slave_thread(THD *thd, ...@@ -137,6 +137,7 @@ static int terminate_slave_thread(THD *thd,
pthread_cond_t* term_cond, pthread_cond_t* term_cond,
volatile uint *slave_running, volatile uint *slave_running,
bool skip_lock); bool skip_lock);
static bool check_io_slave_killed(THD *thd, Master_info *mi, const char *info);
/* /*
Find out which replications threads are running Find out which replications threads are running
...@@ -821,7 +822,7 @@ static int get_master_version_and_clock(MYSQL* mysql, Master_info* mi) ...@@ -821,7 +822,7 @@ static int get_master_version_and_clock(MYSQL* mysql, Master_info* mi)
mi->clock_diff_with_master= mi->clock_diff_with_master=
(long) (time((time_t*) 0) - strtoul(master_row[0], 0, 10)); (long) (time((time_t*) 0) - strtoul(master_row[0], 0, 10));
} }
else else if (!check_io_slave_killed(mi->io_thd, mi, NULL))
{ {
mi->clock_diff_with_master= 0; /* The "most sensible" value */ mi->clock_diff_with_master= 0; /* The "most sensible" value */
sql_print_warning("\"SELECT UNIX_TIMESTAMP()\" failed on master, " sql_print_warning("\"SELECT UNIX_TIMESTAMP()\" failed on master, "
...@@ -1223,7 +1224,7 @@ int register_slave_on_master(MYSQL* mysql, Master_info *mi, ...@@ -1223,7 +1224,7 @@ int register_slave_on_master(MYSQL* mysql, Master_info *mi,
{ {
*suppress_warnings= TRUE; // Suppress reconnect warning *suppress_warnings= TRUE; // Suppress reconnect warning
} }
else else if (!check_io_slave_killed(mi->io_thd, mi, NULL))
{ {
char buf[256]; char buf[256];
my_snprintf(buf, sizeof(buf), "%s (Errno: %d)", mysql_error(mysql), my_snprintf(buf, sizeof(buf), "%s (Errno: %d)", mysql_error(mysql),
...@@ -1985,7 +1986,7 @@ static bool check_io_slave_killed(THD *thd, Master_info *mi, const char *info) ...@@ -1985,7 +1986,7 @@ static bool check_io_slave_killed(THD *thd, Master_info *mi, const char *info)
{ {
if (io_slave_killed(thd, mi)) if (io_slave_killed(thd, mi))
{ {
if (global_system_variables.log_warnings) if (info && global_system_variables.log_warnings)
sql_print_information(info); sql_print_information(info);
return TRUE; return TRUE;
} }
...@@ -2170,11 +2171,15 @@ connected: ...@@ -2170,11 +2171,15 @@ connected:
thd->proc_info = "Registering slave on master"; thd->proc_info = "Registering slave on master";
if (register_slave_on_master(mysql, mi, &suppress_warnings)) if (register_slave_on_master(mysql, mi, &suppress_warnings))
{ {
sql_print_error("Slave I/O thread couldn't register on master"); if (!check_io_slave_killed(thd, mi, "Slave I/O thread killed "
if (check_io_slave_killed(thd, mi, "Slave I/O thread killed while \ "while registering slave on master"))
registering slave on master") || {
try_to_reconnect(thd, mysql, mi, &retry_count, suppress_warnings, sql_print_error("Slave I/O thread couldn't register on master");
reconnect_messages[SLAVE_RECON_ACT_REG])) if (try_to_reconnect(thd, mysql, mi, &retry_count, suppress_warnings,
reconnect_messages[SLAVE_RECON_ACT_REG]))
goto err;
}
else
goto err; goto err;
goto connected; goto connected;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment