summaryrefslogtreecommitdiff
path: root/sql/slave.cc
diff options
context:
space:
mode:
authorunknown <mats@mysql.com>2006-06-20 20:46:45 +0200
committerunknown <mats@mysql.com>2006-06-20 20:46:45 +0200
commitdad508ea1a23aff53a9c9edde80c2caa1b9cf460 (patch)
tree88a4098e84a5fe0a34239b24c528cca788adc2d6 /sql/slave.cc
parent3435f614c2951714c3c93ff7fcdc6325f7ad2e05 (diff)
downloadmariadb-git-dad508ea1a23aff53a9c9edde80c2caa1b9cf460.tar.gz
Bug#19437 (Connection refused by server: "2002 Can't connect... /master.sock"):
Clearing active VIO before calling mysql_close() in the slave I/O thread. sql/slave.cc: Clearing active VIO before calling mysql_close() in the slave I/O thread.
Diffstat (limited to 'sql/slave.cc')
-rw-r--r--sql/slave.cc20
1 files changed, 20 insertions, 0 deletions
diff --git a/sql/slave.cc b/sql/slave.cc
index caeefc1ad3c..2b31d722f26 100644
--- a/sql/slave.cc
+++ b/sql/slave.cc
@@ -1653,6 +1653,15 @@ int fetch_master_table(THD *thd, const char *db_name, const char *table_name,
if (connect_to_master(thd, mysql, mi))
{
my_error(ER_CONNECT_TO_MASTER, MYF(0), mysql_error(mysql));
+ /*
+ We need to clear the active VIO since, theoretically, somebody
+ might issue an awake() on this thread. If we are then in the
+ middle of closing and destroying the VIO inside the
+ mysql_close(), we will have a problem.
+ */
+#ifdef SIGNAL_WITH_VIO_CLOSE
+ thd->clear_active_vio();
+#endif
mysql_close(mysql);
DBUG_RETURN(1);
}
@@ -3709,6 +3718,17 @@ err:
VOID(pthread_mutex_unlock(&LOCK_thread_count));
if (mysql)
{
+ /*
+ Here we need to clear the active VIO before closing the
+ connection with the master. The reason is that THD::awake()
+ might be called from terminate_slave_thread() because somebody
+ issued a STOP SLAVE. If that happends, the close_active_vio()
+ can be called in the middle of closing the VIO associated with
+ the 'mysql' object, causing a crash.
+ */
+#ifdef SIGNAL_WITH_VIO_CLOSE
+ thd->clear_active_vio();
+#endif
mysql_close(mysql);
mi->mysql=0;
}