Commit f6099e53 authored by sasha@mysql.sashanet.com's avatar sasha@mysql.sashanet.com
Browse files

improvements for stopping the slave in SLAVE STOP and on shutdown

parent 8c432605
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -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))
+1 −1
Original line number Diff line number Diff line
@@ -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
+20 −2
Original line number Diff line number Diff line
@@ -611,7 +611,25 @@ int stop_slave(THD* thd, bool net_report )
    // 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);
    {
      /* 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;