summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <sasha@mysql.sashanet.com>2002-03-26 22:23:51 -0700
committerunknown <sasha@mysql.sashanet.com>2002-03-26 22:23:51 -0700
commitef261914d3fdaaf25f1415b8625cc9ff89f9266a (patch)
treeaddd464870d8ce2dc41b174031430761b68ff23e /sql
parent4252578b687e972cb482ab22efca01b8ea484221 (diff)
parent079a551ca735e79f3d7a2ebbecf8be4d4ba7608a (diff)
downloadmariadb-git-ef261914d3fdaaf25f1415b8625cc9ff89f9266a.tar.gz
Merge work:/home/bk/mysql-4.0
into mysql.sashanet.com:/reiser-data/mysql-4.0 sql/lex.h: Auto merged sql/mysqld.cc: Auto merged sql/slave.cc: Auto merged sql/sql_yacc.yy: Auto merged
Diffstat (limited to 'sql')
-rw-r--r--sql/lex.h2
-rw-r--r--sql/log.cc1
-rw-r--r--sql/log_event.cc3
-rw-r--r--sql/mysqld.cc24
-rw-r--r--sql/slave.cc10
-rw-r--r--sql/sql_lex.cc1
-rw-r--r--sql/sql_lex.h2
-rw-r--r--sql/sql_repl.cc47
-rw-r--r--sql/sql_yacc.yy16
9 files changed, 94 insertions, 12 deletions
diff --git a/sql/lex.h b/sql/lex.h
index 10c1ad766d5..8c7beb64b9b 100644
--- a/sql/lex.h
+++ b/sql/lex.h
@@ -280,6 +280,8 @@ static SYMBOL symbols[] = {
{ "READ", SYM(READ_SYM),0,0},
{ "REAL", SYM(REAL),0,0},
{ "REFERENCES", SYM(REFERENCES),0,0},
+ { "RELAY_LOG_FILE", SYM(RELAY_LOG_FILE_SYM),0,0},
+ { "RELAY_LOG_POS", SYM(RELAY_LOG_POS_SYM),0,0},
{ "RELOAD", SYM(RELOAD),0,0},
{ "REGEXP", SYM(REGEXP),0,0},
{ "RENAME", SYM(RENAME),0,0},
diff --git a/sql/log.cc b/sql/log.cc
index 1052b3379b3..dc6b1d35cef 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -479,6 +479,7 @@ err:
rli->relay_log_pos = 4;
strnmov(rli->relay_log_name,rli->linfo.log_file_name,
sizeof(rli->relay_log_name));
+ flush_relay_log_info(rli);
}
/*
No need to free io_buf because we allocated both fname and io_buf in
diff --git a/sql/log_event.cc b/sql/log_event.cc
index 528110deb74..8db10a84661 100644
--- a/sql/log_event.cc
+++ b/sql/log_event.cc
@@ -1607,7 +1607,8 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli)
{
mysql_parse(thd, thd->query, q_len);
if (expected_error !=
- (actual_error = thd->net.last_errno) && expected_error)
+ (actual_error = thd->net.last_errno) && expected_error &&
+ !ignored_error_code(actual_error))
{
const char* errmsg = "Slave: did not get the expected error\
running query from master - expected: '%s' (%d), got '%s' (%d)";
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index d33ec9b92ca..a0154f980f1 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -38,7 +38,17 @@
#define ONE_THREAD
#endif
-/* do stack traces are only supported on linux intel */
+#ifdef SAFEMALLOC
+#define SHUTDOWN_THD shutdown_th=pthread_self();
+#define MAIN_THD main_th=pthread_self();
+#define SIGNAL_THD signal_th=pthread_self();
+#else
+#define SHUTDOWN_THD
+#define MAIN_THD
+#define SIGNAL_THD
+#endif
+
+/* stack traces are only supported on linux intel */
#if defined(__linux__) && defined(__i386__) && defined(USE_PSTACK)
#define HAVE_STACK_TRACE_ON_SEGV
#include "../pstack/pstack.h"
@@ -701,6 +711,7 @@ static void __cdecl kill_server(int sig_ptr)
sql_print_error(ER(ER_GOT_SIGNAL),my_progname,sig); /* purecov: inspected */
#if defined(USE_ONE_SIGNAL_HAND) && !defined(__WIN__) && !defined(OS2)
+ SHUTDOWN_THD;
my_thread_init(); // If this is a new thread
#endif
close_connections();
@@ -716,6 +727,7 @@ static void __cdecl kill_server(int sig_ptr)
#ifdef USE_ONE_SIGNAL_HAND
static pthread_handler_decl(kill_server_thread,arg __attribute__((unused)))
{
+ SHUTDOWN_THD;
my_thread_init(); // Initialize new thread
kill_server(0);
my_thread_end(); // Normally never reached
@@ -1262,6 +1274,7 @@ static void init_signals(void)
signal(SIGALRM, SIG_IGN);
signal(SIGBREAK,SIG_IGN);
signal_thread = pthread_self();
+ SIGNAL_THD;
}
static void start_signal_handler(void)
@@ -1387,6 +1400,7 @@ static void init_signals(void)
sigaction(SIGBUS, &sa, NULL);
#endif
sigaction(SIGILL, &sa, NULL);
+ sigaction(SIGFPE, &sa, NULL);
}
(void) sigemptyset(&set);
#ifdef THREAD_SPECIFIC_SIGPIPE
@@ -1454,7 +1468,7 @@ static void *signal_hand(void *arg __attribute__((unused)))
int sig;
my_thread_init(); // Init new thread
DBUG_ENTER("signal_hand");
-
+ SIGNAL_THD;
/* Setup alarm handler */
init_thr_alarm(max_connections+max_insert_delayed_threads);
#if SIGINT != THR_KILL_SIGNAL
@@ -1509,7 +1523,10 @@ static void *signal_hand(void *arg __attribute__((unused)))
else
while ((error=my_sigwait(&set,&sig)) == EINTR) ;
if (cleanup_done)
+ {
+ my_thread_end();
pthread_exit(0); // Safety
+ }
switch (sig) {
case SIGTERM:
case SIGQUIT:
@@ -1603,6 +1620,7 @@ int uname(struct utsname *a)
pthread_handler_decl(handle_shutdown,arg)
{
MSG msg;
+ SHUTDOWN_THD;
my_thread_init();
/* this call should create the message queue for this thread */
@@ -1629,6 +1647,7 @@ int __stdcall handle_kill(ulong ctrl_type)
#ifdef OS2
pthread_handler_decl(handle_shutdown,arg)
{
+ SHUTDOWN_THD;
my_thread_init();
// wait semaphore
@@ -1700,6 +1719,7 @@ int main(int argc, char **argv)
my_umask=0660; // Default umask for new files
my_umask_dir=0700; // Default umask for new directories
+ MAIN_THD;
MY_INIT(argv[0]); // init my_sys library & pthreads
tzset(); // Set tzname
diff --git a/sql/slave.cc b/sql/slave.cc
index 176f5db2f79..9050bf7362f 100644
--- a/sql/slave.cc
+++ b/sql/slave.cc
@@ -345,7 +345,13 @@ int terminate_slave_thread(THD* thd, pthread_mutex_t* term_lock,
}
}
DBUG_ASSERT(thd != 0);
- KICK_SLAVE(thd);
+ /* is is criticate to test if the slave is running. Otherwise, we might
+ be referening freed memory trying to kick it
+ */
+ if (*slave_running)
+ {
+ KICK_SLAVE(thd);
+ }
while (*slave_running)
{
/* there is a small chance that slave thread might miss the first
@@ -367,7 +373,9 @@ int terminate_slave_thread(THD* thd, pthread_mutex_t* term_lock,
DBUG_ASSERT_LOCK(cond_lock);
pthread_cond_timedwait(term_cond, cond_lock, &abstime);
if (*slave_running)
+ {
KICK_SLAVE(thd);
+ }
}
if (term_lock)
pthread_mutex_unlock(term_lock);
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index 43195bc908b..42a8a700da3 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -151,6 +151,7 @@ LEX *lex_start(THD *thd, uchar *buf,uint length)
lex->yacc_yyss=lex->yacc_yyvs=0;
lex->ignore_space=test(thd->sql_mode & MODE_IGNORE_SPACE);
lex->slave_thd_opt=0;
+ bzero(&lex->mi,sizeof(lex->mi));
return lex;
}
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index ecfb3dec99c..6961ab8c712 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -98,6 +98,8 @@ typedef struct st_lex_master_info
uint port, connect_retry;
ulonglong pos;
ulong server_id;
+ char* relay_log_name;
+ ulong relay_log_pos;
} LEX_MASTER_INFO;
diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc
index c6384817512..bbe92f3e526 100644
--- a/sql/sql_repl.cc
+++ b/sql/sql_repl.cc
@@ -690,6 +690,7 @@ int change_master(THD* thd, MASTER_INFO* mi)
{
int error=0,restart_thread_mask;
const char* errmsg=0;
+ bool need_relay_log_purge=1;
// kill slave thread
lock_slave_threads(mi);
@@ -742,17 +743,47 @@ int change_master(THD* thd, MASTER_INFO* mi)
if (lex_mi->connect_retry)
mi->connect_retry = lex_mi->connect_retry;
+ if (lex_mi->relay_log_name)
+ {
+ need_relay_log_purge = 0;
+ strnmov(mi->rli.relay_log_name,lex_mi->relay_log_name,
+ sizeof(mi->rli.relay_log_name));
+ }
+
+ if (lex_mi->relay_log_pos)
+ {
+ need_relay_log_purge=0;
+ mi->rli.relay_log_pos=lex_mi->relay_log_pos;
+ }
+
flush_master_info(mi);
- pthread_mutex_unlock(&mi->data_lock);
- thd->proc_info="purging old relay logs";
- if (purge_relay_logs(&mi->rli,0 /* not only reset, but also reinit*/,
- &errmsg))
+ if (need_relay_log_purge)
{
- send_error(&thd->net, 0, "Failed purging old relay logs");
- unlock_slave_threads(mi);
- return 1;
+ pthread_mutex_unlock(&mi->data_lock);
+ thd->proc_info="purging old relay logs";
+ if (purge_relay_logs(&mi->rli,0 /* not only reset, but also reinit*/,
+ &errmsg))
+ {
+ send_error(&thd->net, 0, "Failed purging old relay logs");
+ unlock_slave_threads(mi);
+ return 1;
+ }
+ pthread_mutex_lock(&mi->rli.data_lock);
+ }
+ else
+ {
+ const char* msg;
+ if (init_relay_log_pos(&mi->rli,0/*log already inited*/,
+ 0 /*pos already inited*/,
+ 0 /*no data lock*/,
+ &msg))
+ {
+ net_printf(&thd->net,0,"Failed initializing relay log position: %s",msg);
+ unlock_slave_threads(mi);
+ return 1;
+ }
+
}
- pthread_mutex_lock(&mi->rli.data_lock);
mi->rli.master_log_pos = mi->master_log_pos;
strnmov(mi->rli.master_log_name,mi->master_log_name,
sizeof(mi->rli.master_log_name));
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 00330c7cab7..8012768e508 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -241,6 +241,8 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%token MASTER_PORT_SYM
%token MASTER_CONNECT_RETRY_SYM
%token MASTER_SERVER_ID_SYM
+%token RELAY_LOG_FILE_SYM
+%token RELAY_LOG_POS_SYM
%token MATCH
%token MAX_ROWS
%token MAX_QUERIES_PER_HOUR
@@ -701,6 +703,16 @@ master_def:
{
Lex->mi.connect_retry = $3;
}
+ |
+ RELAY_LOG_FILE_SYM EQ TEXT_STRING
+ {
+ Lex->mi.relay_log_name = $3.str;
+ }
+ |
+ RELAY_LOG_POS_SYM EQ ULONG_NUM
+ {
+ Lex->mi.relay_log_pos = $3;
+ }
/* create a table */
@@ -3013,6 +3025,7 @@ keyword:
| ISSUER_SYM {}
| INNOBASE_SYM {}
| INSERT_METHOD {}
+ | IO_THREAD {}
| LAST_SYM {}
| LEVEL_SYM {}
| LOCAL_SYM {}
@@ -3055,6 +3068,8 @@ keyword:
| RAID_CHUNKSIZE {}
| RAID_STRIPED_SYM {}
| RAID_TYPE {}
+ | RELAY_LOG_FILE_SYM {}
+ | RELAY_LOG_POS_SYM {}
| RELOAD {}
| REPAIR {}
| REPEATABLE_SYM {}
@@ -3074,6 +3089,7 @@ keyword:
| SQL_CACHE_SYM {}
| SQL_NO_CACHE_SYM {}
| SQL_QUERY_CACHE_TYPE_SYM {}
+ | SQL_THREAD {}
| START_SYM {}
| STATUS_SYM {}
| STOP_SYM {}