mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
improvements for stopping the slave in SLAVE STOP and on shutdown
This commit is contained in:
@@ -39,6 +39,8 @@
|
|||||||
#include "errmsg.h"
|
#include "errmsg.h"
|
||||||
#include <violite.h>
|
#include <violite.h>
|
||||||
|
|
||||||
|
extern ulong net_read_timeout;
|
||||||
|
|
||||||
extern "C" { // Because of SCO 3.2V4.2
|
extern "C" { // Because of SCO 3.2V4.2
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
@@ -62,6 +64,7 @@ extern "C" { // Because of SCO 3.2V4.2
|
|||||||
#endif
|
#endif
|
||||||
#if defined(THREAD) && !defined(__WIN__)
|
#if defined(THREAD) && !defined(__WIN__)
|
||||||
#include <my_pthread.h> /* because of signal() */
|
#include <my_pthread.h> /* because of signal() */
|
||||||
|
#include <thr_alarm.h>
|
||||||
#endif
|
#endif
|
||||||
#ifndef INADDR_NONE
|
#ifndef INADDR_NONE
|
||||||
#define INADDR_NONE -1
|
#define INADDR_NONE -1
|
||||||
@@ -479,18 +482,25 @@ mc_mysql_connect(MYSQL *mysql,const char *host, const char *user,
|
|||||||
struct sockaddr_in sock_addr;
|
struct sockaddr_in sock_addr;
|
||||||
uint pkt_length;
|
uint pkt_length;
|
||||||
NET *net= &mysql->net;
|
NET *net= &mysql->net;
|
||||||
|
thr_alarm_t alarmed;
|
||||||
|
#if !defined(__WIN__)
|
||||||
|
ALARM alarm_buff;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __WIN__
|
#ifdef __WIN__
|
||||||
HANDLE hPipe=INVALID_HANDLE_VALUE;
|
HANDLE hPipe=INVALID_HANDLE_VALUE;
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_SYS_UN_H
|
#ifdef HAVE_SYS_UN_H
|
||||||
struct sockaddr_un UNIXaddr;
|
struct sockaddr_un UNIXaddr;
|
||||||
#endif
|
#endif
|
||||||
DBUG_ENTER("mysql_real_connect");
|
DBUG_ENTER("mc_mysql_connect");
|
||||||
|
|
||||||
DBUG_PRINT("enter",("host: %s db: %s user: %s",
|
DBUG_PRINT("enter",("host: %s db: %s user: %s",
|
||||||
host ? host : "(Null)",
|
host ? host : "(Null)",
|
||||||
db ? db : "(Null)",
|
db ? db : "(Null)",
|
||||||
user ? user : "(Null)"));
|
user ? user : "(Null)"));
|
||||||
|
thr_alarm_init(&alarmed);
|
||||||
|
thr_alarm(&alarmed,(uint) net_read_timeout,&alarm_buff);
|
||||||
|
|
||||||
bzero((char*) &mysql->options,sizeof(mysql->options));
|
bzero((char*) &mysql->options,sizeof(mysql->options));
|
||||||
net->vio = 0; /* If something goes wrong */
|
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));
|
DBUG_PRINT("error",("Got error %d on connect to '%s'",ERRNO,host));
|
||||||
net->last_errno= CR_CONN_HOST_ERROR;
|
net->last_errno= CR_CONN_HOST_ERROR;
|
||||||
sprintf(net->last_error ,ER(CR_CONN_HOST_ERROR), host, ERRNO);
|
sprintf(net->last_error ,ER(CR_CONN_HOST_ERROR), host, ERRNO);
|
||||||
|
if (thr_alarm_in_use(&alarmed))
|
||||||
|
thr_end_alarm(&alarmed);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
if (thr_alarm_in_use(&alarmed))
|
||||||
|
thr_end_alarm(&alarmed);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!net->vio || my_net_init(net, net->vio))
|
if (!net->vio || my_net_init(net, net->vio))
|
||||||
|
@@ -487,6 +487,7 @@ static void close_connections(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
end_thr_alarm(); // Don't allow alarms
|
end_thr_alarm(); // Don't allow alarms
|
||||||
|
end_slave();
|
||||||
|
|
||||||
/* First signal all threads that it's time to die */
|
/* 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);
|
x_free(opt_bin_logname);
|
||||||
bitmap_free(&temp_pool);
|
bitmap_free(&temp_pool);
|
||||||
free_max_user_conn();
|
free_max_user_conn();
|
||||||
end_slave();
|
|
||||||
#ifndef __WIN__
|
#ifndef __WIN__
|
||||||
if (!opt_bootstrap)
|
if (!opt_bootstrap)
|
||||||
(void) my_delete(pidfile_name,MYF(0)); // This may not always exist
|
(void) my_delete(pidfile_name,MYF(0)); // This may not always exist
|
||||||
|
@@ -611,7 +611,25 @@ int stop_slave(THD* thd, bool net_report )
|
|||||||
// thd->killed for the slave thread
|
// thd->killed for the slave thread
|
||||||
thd->proc_info = "waiting for slave to die";
|
thd->proc_info = "waiting for slave to die";
|
||||||
while(slave_running)
|
while(slave_running)
|
||||||
pthread_cond_wait(&COND_slave_stopped, &LOCK_slave);
|
{
|
||||||
|
/* 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
|
else
|
||||||
slave_errno = ER_SLAVE_NOT_RUNNING;
|
slave_errno = ER_SLAVE_NOT_RUNNING;
|
||||||
|
Reference in New Issue
Block a user