Commit 744942be authored by unknown's avatar unknown

SCRUM

two versions of KILL implementation


include/mysql_com.h:
  ONLY_KILL_QUERY flag definition
sql/lex.h:
  CONNECTION keyword added
sql/mysql_priv.h:
  kill_one_thread function extended
sql/sql_class.h:
  only_kill_query flag added to the THD structure
sql/sql_parse.cc:
  handling of KILL QUERY feature added
sql/sql_yacc.yy:
  KILL syntax extended with CONNECTION an QUERY options
parent 867efa28
...@@ -118,6 +118,8 @@ enum enum_server_command ...@@ -118,6 +118,8 @@ enum enum_server_command
#define NET_WRITE_TIMEOUT 60 /* Timeout on write */ #define NET_WRITE_TIMEOUT 60 /* Timeout on write */
#define NET_WAIT_TIMEOUT 8*60*60 /* Wait for new query */ #define NET_WAIT_TIMEOUT 8*60*60 /* Wait for new query */
#define ONLY_KILL_QUERY 1
struct st_vio; /* Only C */ struct st_vio; /* Only C */
typedef struct st_vio Vio; typedef struct st_vio Vio;
......
...@@ -102,6 +102,7 @@ static SYMBOL symbols[] = { ...@@ -102,6 +102,7 @@ static SYMBOL symbols[] = {
{ "COMMITTED", SYM(COMMITTED_SYM),0,0}, { "COMMITTED", SYM(COMMITTED_SYM),0,0},
{ "COMPRESSED", SYM(COMPRESSED_SYM),0,0}, { "COMPRESSED", SYM(COMPRESSED_SYM),0,0},
{ "CONCURRENT", SYM(CONCURRENT),0,0}, { "CONCURRENT", SYM(CONCURRENT),0,0},
{ "CONNECTION", SYM(CONNECTION_SYM),0,0},
{ "CONSTRAINT", SYM(CONSTRAINT),0,0}, { "CONSTRAINT", SYM(CONSTRAINT),0,0},
{ "CREATE", SYM(CREATE),0,0}, { "CREATE", SYM(CREATE),0,0},
{ "CROSS", SYM(CROSS),0,0}, { "CROSS", SYM(CROSS),0,0},
......
...@@ -45,7 +45,7 @@ char *sql_strdup(const char *str); ...@@ -45,7 +45,7 @@ char *sql_strdup(const char *str);
char *sql_strmake(const char *str,uint len); char *sql_strmake(const char *str,uint len);
gptr sql_memdup(const void * ptr,unsigned size); gptr sql_memdup(const void * ptr,unsigned size);
void sql_element_free(void *ptr); void sql_element_free(void *ptr);
void kill_one_thread(THD *thd, ulong id); void kill_one_thread(THD *thd, ulong id, bool only_kill_query);
bool net_request_file(NET* net, const char* fname); bool net_request_file(NET* net, const char* fname);
char* query_table_status(THD *thd,const char *db,const char *table_name); char* query_table_status(THD *thd,const char *db,const char *table_name);
......
...@@ -550,6 +550,7 @@ class THD :public ilink ...@@ -550,6 +550,7 @@ class THD :public ilink
bool system_thread,in_lock_tables,global_read_lock; bool system_thread,in_lock_tables,global_read_lock;
bool query_error, bootstrap, cleanup_done; bool query_error, bootstrap, cleanup_done;
bool volatile killed; bool volatile killed;
bool volatile only_kill_query;
bool prepare_command; bool prepare_command;
bool tmp_table_used; bool tmp_table_used;
sp_rcontext *spcont; // SP runtime context sp_rcontext *spcont; // SP runtime context
......
...@@ -848,7 +848,7 @@ pthread_handler_decl(handle_one_connection,arg) ...@@ -848,7 +848,7 @@ pthread_handler_decl(handle_one_connection,arg)
init_sql_alloc(&thd->mem_root, MEM_ROOT_BLOCK_SIZE, MEM_ROOT_PREALLOC); init_sql_alloc(&thd->mem_root, MEM_ROOT_BLOCK_SIZE, MEM_ROOT_PREALLOC);
init_sql_alloc(&thd->transaction.mem_root, init_sql_alloc(&thd->transaction.mem_root,
TRANS_MEM_ROOT_BLOCK_SIZE, TRANS_MEM_ROOT_PREALLOC); TRANS_MEM_ROOT_BLOCK_SIZE, TRANS_MEM_ROOT_PREALLOC);
while (!net->error && net->vio != 0 && !thd->killed) while (!net->error && net->vio != 0 && !(thd->killed && !thd->only_kill_query))
{ {
if (do_command(thd)) if (do_command(thd))
break; break;
...@@ -1054,6 +1054,12 @@ bool do_command(THD *thd) ...@@ -1054,6 +1054,12 @@ bool do_command(THD *thd)
} }
else else
{ {
if (thd->only_kill_query)
{
thd->killed= FALSE;
thd->only_kill_query= FALSE;
}
packet=(char*) net->read_pos; packet=(char*) net->read_pos;
command = (enum enum_server_command) (uchar) packet[0]; command = (enum enum_server_command) (uchar) packet[0];
if (command >= COM_END) if (command >= COM_END)
...@@ -1473,7 +1479,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1473,7 +1479,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
{ {
statistic_increment(com_stat[SQLCOM_KILL],&LOCK_status); statistic_increment(com_stat[SQLCOM_KILL],&LOCK_status);
ulong id=(ulong) uint4korr(packet); ulong id=(ulong) uint4korr(packet);
kill_one_thread(thd,id); kill_one_thread(thd,id,false);
break; break;
} }
case COM_DEBUG: case COM_DEBUG:
...@@ -2890,7 +2896,7 @@ mysql_execute_command(THD *thd) ...@@ -2890,7 +2896,7 @@ mysql_execute_command(THD *thd)
reload_acl_and_cache(thd, lex->type, tables) ; reload_acl_and_cache(thd, lex->type, tables) ;
break; break;
case SQLCOM_KILL: case SQLCOM_KILL:
kill_one_thread(thd,lex->thread_id); kill_one_thread(thd,lex->thread_id, lex->type & ONLY_KILL_QUERY);
break; break;
case SQLCOM_SHOW_GRANTS: case SQLCOM_SHOW_GRANTS:
res=0; res=0;
...@@ -4179,7 +4185,7 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables) ...@@ -4179,7 +4185,7 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables)
This is written such that we have a short lock on LOCK_thread_count This is written such that we have a short lock on LOCK_thread_count
*/ */
void kill_one_thread(THD *thd, ulong id) void kill_one_thread(THD *thd, ulong id, bool only_kill_query)
{ {
THD *tmp; THD *tmp;
uint error=ER_NO_SUCH_THREAD; uint error=ER_NO_SUCH_THREAD;
...@@ -4199,7 +4205,13 @@ void kill_one_thread(THD *thd, ulong id) ...@@ -4199,7 +4205,13 @@ void kill_one_thread(THD *thd, ulong id)
if ((thd->master_access & SUPER_ACL) || if ((thd->master_access & SUPER_ACL) ||
!strcmp(thd->user,tmp->user)) !strcmp(thd->user,tmp->user))
{ {
tmp->awake(1 /*prepare to die*/); if (only_kill_query)
{
tmp->killed= 1;
tmp->only_kill_query= 1;
}
else
tmp->awake(1 /*prepare to die*/);
error=0; error=0;
} }
else else
......
...@@ -201,6 +201,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); ...@@ -201,6 +201,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%token COLUMNS %token COLUMNS
%token COLUMN_SYM %token COLUMN_SYM
%token CONCURRENT %token CONCURRENT
%token CONNECTION_SYM
%token CONSTRAINT %token CONSTRAINT
%token CONVERT_SYM %token CONVERT_SYM
%token DATABASES %token DATABASES
...@@ -4231,18 +4232,23 @@ purge: ...@@ -4231,18 +4232,23 @@ purge:
/* kill threads */ /* kill threads */
kill: kill:
KILL_SYM expr KILL_SYM kill_option expr
{ {
LEX *lex=Lex; LEX *lex=Lex;
if ($2->fix_fields(lex->thd, 0, &$2) || $2->check_cols(1)) if ($3->fix_fields(lex->thd, 0, &$3) || $3->check_cols(1))
{ {
send_error(lex->thd, ER_SET_CONSTANTS_ONLY); send_error(lex->thd, ER_SET_CONSTANTS_ONLY);
YYABORT; YYABORT;
} }
lex->sql_command=SQLCOM_KILL; lex->sql_command=SQLCOM_KILL;
lex->thread_id= (ulong) $2->val_int(); lex->thread_id= (ulong) $3->val_int();
}; };
kill_option:
/* empty */ { Lex->type= 0; }
| CONNECTION_SYM { Lex->type= 0; }
| QUERY_SYM { Lex->type= ONLY_KILL_QUERY; };
/* change database */ /* change database */
use: USE_SYM ident use: USE_SYM ident
......
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