summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <sasha@mysql.sashanet.com>2001-08-15 15:42:25 -0600
committerunknown <sasha@mysql.sashanet.com>2001-08-15 15:42:25 -0600
commit2b8614210d1db003a6827f301dad0321b1a7478e (patch)
treebe7172f79152192d63d3c04ead1ba664f5796f43
parent810f45462ce5448bb8c8c72760317daf6ee8adfe (diff)
parent1f4334652f703d21c254e2b9dcca64538a0bc898 (diff)
downloadmariadb-git-2b8614210d1db003a6827f301dad0321b1a7478e.tar.gz
Merge work:/home/bk/mysql
into mysql.sashanet.com:/home/sasha/src/bk/mysql
-rw-r--r--sql/mini_client.cc16
-rw-r--r--sql/mysqld.cc2
-rw-r--r--sql/sql_repl.cc22
3 files changed, 36 insertions, 4 deletions
diff --git a/sql/mini_client.cc b/sql/mini_client.cc
index 38180c0c6c8..2886b6e02d2 100644
--- a/sql/mini_client.cc
+++ b/sql/mini_client.cc
@@ -39,6 +39,8 @@
#include "errmsg.h"
#include <violite.h>
+extern ulong net_read_timeout;
+
extern "C" { // Because of SCO 3.2V4.2
#include <sys/stat.h>
#include <signal.h>
@@ -62,6 +64,7 @@ extern "C" { // Because of SCO 3.2V4.2
#endif
#if defined(THREAD) && !defined(__WIN__)
#include <my_pthread.h> /* because of signal() */
+#include <thr_alarm.h>
#endif
#ifndef INADDR_NONE
#define INADDR_NONE -1
@@ -479,18 +482,25 @@ mc_mysql_connect(MYSQL *mysql,const char *host, const char *user,
struct sockaddr_in sock_addr;
uint pkt_length;
NET *net= &mysql->net;
+ thr_alarm_t alarmed;
+#if !defined(__WIN__)
+ ALARM alarm_buff;
+#endif
+
#ifdef __WIN__
HANDLE hPipe=INVALID_HANDLE_VALUE;
#endif
#ifdef HAVE_SYS_UN_H
struct sockaddr_un UNIXaddr;
#endif
- DBUG_ENTER("mysql_real_connect");
+ DBUG_ENTER("mc_mysql_connect");
DBUG_PRINT("enter",("host: %s db: %s user: %s",
host ? host : "(Null)",
db ? db : "(Null)",
user ? user : "(Null)"));
+ thr_alarm_init(&alarmed);
+ thr_alarm(&alarmed,(uint) net_read_timeout,&alarm_buff);
bzero((char*) &mysql->options,sizeof(mysql->options));
net->vio = 0; /* If something goes wrong */
@@ -625,8 +635,12 @@ mc_mysql_connect(MYSQL *mysql,const char *host, const char *user,
DBUG_PRINT("error",("Got error %d on connect to '%s'",ERRNO,host));
net->last_errno= CR_CONN_HOST_ERROR;
sprintf(net->last_error ,ER(CR_CONN_HOST_ERROR), host, ERRNO);
+ if (thr_alarm_in_use(&alarmed))
+ thr_end_alarm(&alarmed);
goto error;
}
+ if (thr_alarm_in_use(&alarmed))
+ thr_end_alarm(&alarmed);
}
if (!net->vio || my_net_init(net, net->vio))
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 24754d88746..800e1f038f3 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -487,6 +487,7 @@ static void close_connections(void)
}
#endif
end_thr_alarm(); // Don't allow alarms
+ end_slave();
/* First signal all threads that it's time to die */
@@ -694,7 +695,6 @@ void clean_up(bool print_message)
x_free(opt_bin_logname);
bitmap_free(&temp_pool);
free_max_user_conn();
- end_slave();
#ifndef __WIN__
if (!opt_bootstrap)
(void) my_delete(pidfile_name,MYF(0)); // This may not always exist
diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc
index 3cb805ed796..32c4c5c6509 100644
--- a/sql/sql_repl.cc
+++ b/sql/sql_repl.cc
@@ -610,8 +610,26 @@ int stop_slave(THD* thd, bool net_report )
// do not abort the slave in the middle of a query, so we do not set
// thd->killed for the slave thread
thd->proc_info = "waiting for slave to die";
- while(slave_running)
- pthread_cond_wait(&COND_slave_stopped, &LOCK_slave);
+ while(slave_running)
+ {
+ /* there is a small change that slave thread might miss the first
+ alarm. To protect againts it, resend the signal until it reacts
+ */
+
+ struct timespec abstime;
+#ifdef HAVE_TIMESPEC_TS_SEC
+ abstime.ts_sec=time(NULL)+2;
+ abstime.ts_nsec=0;
+#else
+ struct timeval tv;
+ gettimeofday(&tv,0);
+ abstime.tv_sec=tv.tv_sec+2;
+ abstime.tv_nsec=tv.tv_usec*1000;
+#endif
+ pthread_cond_timedwait(&COND_slave_stopped, &LOCK_slave, &abstime);
+ if (slave_running)
+ thr_alarm_kill(slave_real_id);
+ }
}
else
slave_errno = ER_SLAVE_NOT_RUNNING;