From 2eb954a27a6aa6bf0f4e9c480dc8a633649595f1 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 21 Aug 2004 05:07:32 +0200 Subject: [PATCH 1/2] Bug #4629 Crash after SLAVE STOP, if the IO thread is in special state. client.c: Added call to clear_slave_vio inside end_server only when under Windows with repliaction slave.cc: Added clear_slave_vio function for clearing active vio on THD under Windows replication sql/slave.cc: Added clear_slave_vio function for clearing active vio on THD under Windows replication sql-common/client.c: Added call to clear_slave_vio inside end_server only when under Windows with repliaction --- sql-common/client.c | 11 +++++++++++ sql/slave.cc | 22 ++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/sql-common/client.c b/sql-common/client.c index 68878df50e8..dc0889a3ba8 100644 --- a/sql-common/client.c +++ b/sql-common/client.c @@ -133,6 +133,11 @@ static void mysql_close_free(MYSQL *mysql); static int wait_for_data(my_socket fd, uint timeout); #endif +#if defined(__WIN__) && defined(HAVE_REPLICATION) && defined(MYSQL_SERVER) +void clear_slave_vio( MYSQL* mysql ); +#endif + + /**************************************************************************** A modified version of connect(). my_connect() allows you to specify a timeout value, in seconds, that we should wait until we @@ -818,6 +823,12 @@ void end_server(MYSQL *mysql) init_sigpipe_variables DBUG_PRINT("info",("Net: %s", vio_description(mysql->net.vio))); set_sigpipe(mysql); + +#if defined(__WIN__) && defined(HAVE_REPLICATION) && defined(MYSQL_SERVER) + /* if this mysql is one of our connections to the master, then clear it */ + clear_slave_vio( mysql ); +#endif + vio_delete(mysql->net.vio); reset_sigpipe(mysql); mysql->net.vio= 0; /* Marker */ diff --git a/sql/slave.cc b/sql/slave.cc index 7fb7fbdade4..51421533a5b 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -4383,4 +4383,26 @@ template class I_List_iterator; template class I_List_iterator; #endif + +#ifdef __WIN__ +extern "C" void clear_slave_vio( MYSQL* mysql ) +{ + if (active_mi->mysql == mysql) + active_mi->io_thd->clear_active_vio(); + /* TODO: use code like below when multi-master is in place */ + /* LIST *cur = &master_list; + if (((MASTER_INFO*)cur->data)->mysql == mysql) + { + MASTER_INFO *mi = (MASTER_INFO*)cur->data; + mi->io_thd->clear_active_vio(); + return; + } + else + cur = cur->next;*/ +} +#endif + + + + #endif /* HAVE_REPLICATION */ From e0a12e898c1645b450c69503d481ab1f92d1e012 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 23 Aug 2004 18:55:12 +0200 Subject: [PATCH 2/2] Bug #4629 Crash after SLAVE STOP, if the IO thread is in special state. client.c: Removed call to clear_slave_vio in end_server(). Removed header declaration of clear_slave_vio slave.cc: Removed clear_slave_vio function and added calls to thd->clear_active_vio before each call to end_server() sql/slave.cc: Removed clear_slave_vio function and added calls to thd->clear_active_vio before each call to end_server() sql-common/client.c: Removed call to clear_slave_vio in end_server(). Removed header declaration of clear_slave_vio --- sql-common/client.c | 10 ---------- sql/slave.cc | 27 ++++++--------------------- 2 files changed, 6 insertions(+), 31 deletions(-) diff --git a/sql-common/client.c b/sql-common/client.c index dc0889a3ba8..1941e6bc517 100644 --- a/sql-common/client.c +++ b/sql-common/client.c @@ -133,10 +133,6 @@ static void mysql_close_free(MYSQL *mysql); static int wait_for_data(my_socket fd, uint timeout); #endif -#if defined(__WIN__) && defined(HAVE_REPLICATION) && defined(MYSQL_SERVER) -void clear_slave_vio( MYSQL* mysql ); -#endif - /**************************************************************************** A modified version of connect(). my_connect() allows you to specify @@ -823,12 +819,6 @@ void end_server(MYSQL *mysql) init_sigpipe_variables DBUG_PRINT("info",("Net: %s", vio_description(mysql->net.vio))); set_sigpipe(mysql); - -#if defined(__WIN__) && defined(HAVE_REPLICATION) && defined(MYSQL_SERVER) - /* if this mysql is one of our connections to the master, then clear it */ - clear_slave_vio( mysql ); -#endif - vio_delete(mysql->net.vio); reset_sigpipe(mysql); mysql->net.vio= 0; /* Marker */ diff --git a/sql/slave.cc b/sql/slave.cc index 51421533a5b..cb37a798037 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -3056,6 +3056,9 @@ dump"); } thd->proc_info= "Waiting to reconnect after a failed binlog dump request"; +#ifdef SIGNAL_WITH_VIO_CLOSE + thd->clear_active_vio(); +#endif end_server(mysql); /* First time retry immediately, assuming that we can recover @@ -3129,6 +3132,9 @@ max_allowed_packet", goto err; } thd->proc_info = "Waiting to reconnect after a failed master event read"; +#ifdef SIGNAL_WITH_VIO_CLOSE + thd->clear_active_vio(); +#endif end_server(mysql); if (retry_count++) { @@ -4384,25 +4390,4 @@ template class I_List_iterator; #endif -#ifdef __WIN__ -extern "C" void clear_slave_vio( MYSQL* mysql ) -{ - if (active_mi->mysql == mysql) - active_mi->io_thd->clear_active_vio(); - /* TODO: use code like below when multi-master is in place */ - /* LIST *cur = &master_list; - if (((MASTER_INFO*)cur->data)->mysql == mysql) - { - MASTER_INFO *mi = (MASTER_INFO*)cur->data; - mi->io_thd->clear_active_vio(); - return; - } - else - cur = cur->next;*/ -} -#endif - - - - #endif /* HAVE_REPLICATION */