diff options
author | unknown <sasha@mysql.sashanet.com> | 2001-08-15 15:42:25 -0600 |
---|---|---|
committer | unknown <sasha@mysql.sashanet.com> | 2001-08-15 15:42:25 -0600 |
commit | 2b8614210d1db003a6827f301dad0321b1a7478e (patch) | |
tree | be7172f79152192d63d3c04ead1ba664f5796f43 | |
parent | 810f45462ce5448bb8c8c72760317daf6ee8adfe (diff) | |
parent | 1f4334652f703d21c254e2b9dcca64538a0bc898 (diff) | |
download | mariadb-git-2b8614210d1db003a6827f301dad0321b1a7478e.tar.gz |
Merge work:/home/bk/mysql
into mysql.sashanet.com:/home/sasha/src/bk/mysql
-rw-r--r-- | sql/mini_client.cc | 16 | ||||
-rw-r--r-- | sql/mysqld.cc | 2 | ||||
-rw-r--r-- | sql/sql_repl.cc | 22 |
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; |