Commit 21424657 authored by sasha@mysql.sashanet.com's avatar sasha@mysql.sashanet.com

merged replication fixes from 3.23

parents cd63d8e5 c68d7caa
...@@ -18,6 +18,7 @@ paul@teton.kitebird.com ...@@ -18,6 +18,7 @@ paul@teton.kitebird.com
root@x3.internalnet root@x3.internalnet
sasha@mysql.sashanet.com sasha@mysql.sashanet.com
serg@serg.mysql.com serg@serg.mysql.com
tfr@sarvik.tfr.cafe.ee
tim@bitch.mysql.fi tim@bitch.mysql.fi
tim@black.box tim@black.box
tim@hundin.mysql.fi tim@hundin.mysql.fi
......
...@@ -2103,6 +2103,7 @@ row_sel_store_mysql_rec( ...@@ -2103,6 +2103,7 @@ row_sel_store_mysql_rec(
if (extern_field_heap) { if (extern_field_heap) {
mem_heap_free(extern_field_heap); mem_heap_free(extern_field_heap);
extern_field_heap = NULL;
} }
} else { } else {
mysql_rec[templ->mysql_null_byte_offset] |= mysql_rec[templ->mysql_null_byte_offset] |=
......
...@@ -141,21 +141,21 @@ srv_normalize_path_for_win( ...@@ -141,21 +141,21 @@ srv_normalize_path_for_win(
} }
/************************************************************************* /*************************************************************************
Adds a slash or a backslash to the end of a string if it is missing. */ Adds a slash or a backslash to the end of a string if it is missing
and the string is not empty. */
static static
char* char*
srv_add_path_separator_if_needed( srv_add_path_separator_if_needed(
/*=============================*/ /*=============================*/
/* out, own: string which has the separator */ /* out, own: string which has the separator if the
string is not empty */
char* str) /* in: null-terminated character string */ char* str) /* in: null-terminated character string */
{ {
char* out_str; char* out_str;
if (ut_strlen(str) == 0) { if (ut_strlen(str) == 0) {
out_str = ut_malloc(2);
sprintf(out_str, "%s", SRV_PATH_SEPARATOR);
return(out_str); return(str);
} }
if (str[ut_strlen(str) - 1] == SRV_PATH_SEPARATOR[0]) { if (str[ut_strlen(str) - 1] == SRV_PATH_SEPARATOR[0]) {
......
...@@ -167,7 +167,7 @@ struct sync_level_struct{ ...@@ -167,7 +167,7 @@ struct sync_level_struct{
}; };
#if defined(__GNUC__) && defined(UNIV_INTEL_X86) #if defined(notdefined) && defined(__GNUC__) && defined(UNIV_INTEL_X86)
ulint ulint
sync_gnuc_intelx86_test_and_set( sync_gnuc_intelx86_test_and_set(
......
...@@ -259,12 +259,15 @@ innobase_parse_data_file_paths_and_sizes(void) ...@@ -259,12 +259,15 @@ innobase_parse_data_file_paths_and_sizes(void)
str = innobase_data_file_path; str = innobase_data_file_path;
/* First calculate the number of data files and check syntax: /* First calculate the number of data files and check syntax:
path:size[M];path:size[M]... */ path:size[M];path:size[M]... . Note that a Windows path may
contain a drive name and a ':'. */
while (*str != '\0') { while (*str != '\0') {
path = str; path = str;
while (*str != ':' && *str != '\0') { while ((*str != ':' && *str != '\0')
|| (*str == ':'
&& (*(str + 1) == '\\' || *(str + 1) == '/'))) {
str++; str++;
} }
...@@ -335,7 +338,11 @@ innobase_parse_data_file_paths_and_sizes(void) ...@@ -335,7 +338,11 @@ innobase_parse_data_file_paths_and_sizes(void)
while (*str != '\0') { while (*str != '\0') {
path = str; path = str;
while (*str != ':' && *str != '\0') { /* Note that we must ignore the ':' in a Windows path */
while ((*str != ':' && *str != '\0')
|| (*str == ':'
&& (*(str + 1) == '\\' || *(str + 1) == '/'))) {
str++; str++;
} }
......
...@@ -40,6 +40,8 @@ ...@@ -40,6 +40,8 @@
#include "mysqld_error.h" #include "mysqld_error.h"
#include "errmsg.h" #include "errmsg.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>
...@@ -63,6 +65,7 @@ extern "C" { // Because of SCO 3.2V4.2 ...@@ -63,6 +65,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
...@@ -493,18 +496,25 @@ mc_mysql_connect(MYSQL *mysql,const char *host, const char *user, ...@@ -493,18 +496,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 */
...@@ -639,8 +649,12 @@ mc_mysql_connect(MYSQL *mysql,const char *host, const char *user, ...@@ -639,8 +649,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))
......
...@@ -500,6 +500,7 @@ static void close_connections(void) ...@@ -500,6 +500,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 */
...@@ -716,8 +717,8 @@ void clean_up(bool print_message) ...@@ -716,8 +717,8 @@ 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();
end_slave_list(); end_slave_list();
#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
...@@ -1405,7 +1406,8 @@ static void *signal_hand(void *arg __attribute__((unused))) ...@@ -1405,7 +1406,8 @@ static void *signal_hand(void *arg __attribute__((unused)))
} }
break; break;
case SIGHUP: case SIGHUP:
reload_acl_and_cache((THD*) 0,~0, (TABLE_LIST*) 0); // Flush everything reload_acl_and_cache((THD*) 0,REFRESH_LOG,
(TABLE_LIST*) 0); // Flush logs
mysql_print_status((THD*) 0); // Send debug some info mysql_print_status((THD*) 0); // Send debug some info
break; break;
#ifdef USE_ONE_SIGNAL_HAND #ifdef USE_ONE_SIGNAL_HAND
......
...@@ -688,8 +688,26 @@ int stop_slave(THD* thd, bool net_report ) ...@@ -688,8 +688,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 // do not abort the slave in the middle of a query, so we do not set
// 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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment