changed signal by fd close to signal by vio_close

added support for kill expr
fixed coredump in set @A := foo;
added testcase for user_var
added testcase for kill
parent 55543081
((@id := kill_id) - kill_id)
0
4
4
@a - connection_id()
3
connect (con1, localhost, root,,test,0, mysql-master.sock);
connect (con2, localhost, root,,test,0, mysql-master.sock);
#remember id of con1
connection con1;
drop table if exists connection_kill;
create table connection_kill (kill_id int);
insert into connection_kill values(connection_id());
#kill con1
connection con2;
select ((@id := kill_id) - kill_id) from connection_kill;
kill @id;
# verify that con1 is really dead
connection con1;
error 2013;
select 1;
#make sure the server is still alive
connection con2;
select 4;
drop table connection_kill;
error 1204;
set @a := foo;
set @a := connection_id() + 3;
select @a - connection_id();
...@@ -1381,8 +1381,8 @@ static int safe_connect(THD* thd, MYSQL* mysql, MASTER_INFO* mi) ...@@ -1381,8 +1381,8 @@ static int safe_connect(THD* thd, MYSQL* mysql, MASTER_INFO* mi)
{ {
mysql_log.write(thd, COM_CONNECT_OUT, "%s@%s:%d", mysql_log.write(thd, COM_CONNECT_OUT, "%s@%s:%d",
mi->user, mi->host, mi->port); mi->user, mi->host, mi->port);
#ifdef STOP_IO_WITH_FD_CLOSE #ifdef SIGNAL_WITH_VIO_CLOSE
thd->set_active_fd(vio_fd(mysql->net.vio)); thd->set_active_vio(mysql->net.vio);
#endif #endif
} }
...@@ -1417,8 +1417,8 @@ replication resumed in log '%s' at position %s", glob_mi.user, ...@@ -1417,8 +1417,8 @@ replication resumed in log '%s' at position %s", glob_mi.user,
glob_mi.host, glob_mi.port, glob_mi.host, glob_mi.port,
RPL_LOG_NAME, RPL_LOG_NAME,
llstr(glob_mi.pos,llbuff)); llstr(glob_mi.pos,llbuff));
#ifdef STOP_IO_WITH_FD_CLOSE #ifdef SIGNAL_WITH_VIO_CLOSE
thd->set_active_fd(vio_fd(mysql->net.vio)); thd->set_active_vio(mysql->net.vio);
#endif #endif
} }
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "sql_acl.h" #include "sql_acl.h"
#include <m_ctype.h> #include <m_ctype.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <thr_alarm.h>
#ifdef __WIN__ #ifdef __WIN__
#include <io.h> #include <io.h>
#endif #endif
...@@ -79,14 +80,15 @@ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0), ...@@ -79,14 +80,15 @@ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0),
global_read_lock(0),bootstrap(0) global_read_lock(0),bootstrap(0)
{ {
proc_info="login"; proc_info="login";
where="field list";
host=user=priv_user=db=query=ip=0; host=user=priv_user=db=query=ip=0;
locked=killed=count_cuted_fields=some_tables_deleted=no_errors=password= locked=killed=count_cuted_fields=some_tables_deleted=no_errors=password=
query_start_used=0; query_start_used=0;
query_length=col_access=0; query_length=col_access=0;
query_error=0; query_error=0;
#ifdef STOP_IO_WITH_FD_CLOSE #ifdef SIGNAL_WITH_VIO_CLOSE
active_fd = -1; active_vio = 0;
pthread_mutex_init(&active_fd_lock, NULL); pthread_mutex_init(&active_vio_lock, NULL);
#endif #endif
server_id = ::server_id; server_id = ::server_id;
server_status=SERVER_STATUS_AUTOCOMMIT; server_status=SERVER_STATUS_AUTOCOMMIT;
...@@ -186,12 +188,34 @@ THD::~THD() ...@@ -186,12 +188,34 @@ THD::~THD()
safeFree(ip); safeFree(ip);
free_root(&mem_root,MYF(0)); free_root(&mem_root,MYF(0));
mysys_var=0; // Safety (shouldn't be needed) mysys_var=0; // Safety (shouldn't be needed)
#ifdef STOP_IO_WITH_FD_CLOSE #ifdef SIGNAL_WITH_VIO_CLOSE
pthread_mutex_destroy(&active_fd_lock); pthread_mutex_destroy(&active_vio_lock);
#endif #endif
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
void THD::prepare_to_die()
{
thr_alarm_kill(real_id);
killed = 1;
#ifdef SIGNAL_WITH_VIO_CLOSE
close_active_vio();
#endif
if (mysys_var)
{
pthread_mutex_lock(&mysys_var->mutex);
if (!system_thread) // Don't abort locks
mysys_var->abort=1;
if (mysys_var->current_mutex)
{
pthread_mutex_lock(mysys_var->current_mutex);
pthread_cond_broadcast(mysys_var->current_cond);
pthread_mutex_unlock(mysys_var->current_mutex);
}
pthread_mutex_unlock(&mysys_var->mutex);
}
}
// remember the location of thread info, the structure needed for // remember the location of thread info, the structure needed for
// sql_alloc() and the structure for the net buffer // sql_alloc() and the structure for the net buffer
......
...@@ -21,8 +21,6 @@ ...@@ -21,8 +21,6 @@
#pragma interface /* gcc class implementation */ #pragma interface /* gcc class implementation */
#endif #endif
#include <thr_alarm.h>
class Query_log_event; class Query_log_event;
class Load_log_event; class Load_log_event;
...@@ -258,9 +256,9 @@ public: ...@@ -258,9 +256,9 @@ public:
#ifndef __WIN__ #ifndef __WIN__
sigset_t signals,block_signals; sigset_t signals,block_signals;
#endif #endif
#ifdef STOP_IO_WITH_FD_CLOSE #ifdef SIGNAL_WITH_VIO_CLOSE
int active_fd; Vio* active_vio;
pthread_mutex_t active_fd_lock; pthread_mutex_t active_vio_lock;
#endif #endif
ulonglong next_insert_id,last_insert_id,current_insert_id; ulonglong next_insert_id,last_insert_id,current_insert_id;
ha_rows select_limit,offset_limit,default_select_limit,cuted_fields, ha_rows select_limit,offset_limit,default_select_limit,cuted_fields,
...@@ -293,51 +291,31 @@ public: ...@@ -293,51 +291,31 @@ public:
THD(); THD();
~THD(); ~THD();
bool store_globals(); bool store_globals();
#ifdef STOP_IO_WITH_FD_CLOSE #ifdef SIGNAL_WITH_VIO_CLOSE
inline void set_active_fd(int fd) inline void set_active_vio(Vio* vio)
{ {
pthread_mutex_lock(&active_fd_lock); pthread_mutex_lock(&active_vio_lock);
active_fd = fd; active_vio = vio;
pthread_mutex_unlock(&active_fd_lock); pthread_mutex_unlock(&active_vio_lock);
} }
inline void clear_active_fd() inline void clear_active_vio()
{ {
pthread_mutex_lock(&active_fd_lock); pthread_mutex_lock(&active_vio_lock);
active_fd = -1; active_vio = 0;
pthread_mutex_unlock(&active_fd_lock); pthread_mutex_unlock(&active_vio_lock);
} }
inline void close_active_fd() inline void close_active_vio()
{ {
pthread_mutex_lock(&active_fd_lock); pthread_mutex_lock(&active_vio_lock);
if(active_fd >= 0) if(active_vio)
{ {
my_close(active_fd, MYF(MY_WME)); vio_close(active_vio);
active_fd = -1; active_vio = 0;
} }
pthread_mutex_unlock(&active_fd_lock); pthread_mutex_unlock(&active_vio_lock);
} }
#endif #endif
inline void prepare_to_die() void prepare_to_die();
{
thr_alarm_kill(real_id);
killed = 1;
#ifdef STOP_IO_WITH_FD_CLOSE
close_active_fd();
#endif
if (mysys_var)
{
pthread_mutex_lock(&mysys_var->mutex);
if (!system_thread) // Don't abort locks
mysys_var->abort=1;
if (mysys_var->current_mutex)
{
pthread_mutex_lock(mysys_var->current_mutex);
pthread_cond_broadcast(mysys_var->current_cond);
pthread_mutex_unlock(mysys_var->current_mutex);
}
pthread_mutex_unlock(&mysys_var->mutex);
}
}
inline const char* enter_cond(pthread_cond_t *cond, pthread_mutex_t* mutex, inline const char* enter_cond(pthread_cond_t *cond, pthread_mutex_t* mutex,
const char* msg) const char* msg)
{ {
......
...@@ -572,8 +572,8 @@ int stop_slave(THD* thd, bool net_report ) ...@@ -572,8 +572,8 @@ int stop_slave(THD* thd, bool net_report )
{ {
abort_slave = 1; abort_slave = 1;
thr_alarm_kill(slave_real_id); thr_alarm_kill(slave_real_id);
#ifdef STOP_IO_WITH_FD_CLOSE #ifdef SIGNAL_WITH_VIO_CLOSE
slave_thd->close_active_fd(); slave_thd->close_active_vio();
#endif #endif
// 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
......
...@@ -2293,10 +2293,15 @@ purge: ...@@ -2293,10 +2293,15 @@ purge:
/* kill threads */ /* kill threads */
kill: kill:
KILL_SYM NUM KILL_SYM expr
{ {
if ($2->fix_fields(current_thd,0))
{
send_error(&current_thd->net, ER_SET_CONSTANTS_ONLY);
YYABORT;
}
Lex->sql_command=SQLCOM_KILL; Lex->sql_command=SQLCOM_KILL;
Lex->thread_id= (ulong) strtoul($2.str,NULL,10); Lex->thread_id= (ulong) $2->val_int();
} }
/* change database */ /* change database */
......
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