diff -rupN percona-server-5.1.51-11.5-132.lenny/debian/changelog percona-server-5.1.51-11.5-132.lenny-patched/debian/changelog --- percona-server-5.1.51-11.5-132.lenny/debian/changelog 2010-10-21 09:59:48.000000000 +0000 +++ percona-server-5.1.51-11.5-132.lenny-patched/debian/changelog 2010-11-03 22:46:52.000000000 +0000 @@ -1,3 +1,9 @@ +percona-server-dfsg-5.1 (5.1.51-11.5-132.lenny-kii-1) experimental; urgency=low + + * Ported KILL IF_IDLE from Google V2 patch, via 5.0_5.0.87-d10-ourdelta65 + + -- David Stainton Thu, 3 Nov 2010 02:00:00 +0000 + percona-server-dfsg-5.1 (5.1.51-11.5-132.lenny) lenny; urgency=low * XtraDB Release 11.5 diff -rupN percona-server-5.1.51-11.5-132.lenny/include/mysql_com.h percona-server-5.1.51-11.5-132.lenny-patched/include/mysql_com.h --- percona-server-5.1.51-11.5-132.lenny/include/mysql_com.h 2010-10-21 09:58:37.000000000 +0000 +++ percona-server-5.1.51-11.5-132.lenny-patched/include/mysql_com.h 2010-11-03 22:29:12.000000000 +0000 @@ -230,6 +230,7 @@ enum enum_server_command #define NET_WAIT_TIMEOUT 8*60*60 /* Wait for new query */ #define ONLY_KILL_QUERY 1 +#define ONLY_KILL_IF_IDLE 2 struct st_vio; /* Only C */ diff -rupN percona-server-5.1.51-11.5-132.lenny/sql/lex.h percona-server-5.1.51-11.5-132.lenny-patched/sql/lex.h --- percona-server-5.1.51-11.5-132.lenny/sql/lex.h 2010-10-21 09:58:37.000000000 +0000 +++ percona-server-5.1.51-11.5-132.lenny-patched/sql/lex.h 2010-11-03 22:29:12.000000000 +0000 @@ -241,6 +241,7 @@ static SYMBOL symbols[] = { { "HOUR_SECOND", SYM(HOUR_SECOND_SYM)}, { "IDENTIFIED", SYM(IDENTIFIED_SYM)}, { "IF", SYM(IF)}, + { "IF_IDLE", SYM(IF_IDLE_SYM)}, { "IGNORE", SYM(IGNORE_SYM)}, { "IMPORT", SYM(IMPORT)}, { "IN", SYM(IN_SYM)}, diff -rupN percona-server-5.1.51-11.5-132.lenny/sql/mysql_priv.h percona-server-5.1.51-11.5-132.lenny-patched/sql/mysql_priv.h --- percona-server-5.1.51-11.5-132.lenny/sql/mysql_priv.h 2010-10-21 09:58:54.000000000 +0000 +++ percona-server-5.1.51-11.5-132.lenny-patched/sql/mysql_priv.h 2010-11-03 22:29:12.000000000 +0000 @@ -101,8 +101,10 @@ char *sql_strmake_with_convert(const cha CHARSET_INFO *from_cs, size_t max_res_length, CHARSET_INFO *to_cs, size_t *result_length); -uint kill_one_thread(THD *thd, ulong id, bool only_kill_query); -void sql_kill(THD *thd, ulong id, bool only_kill_query); +uint kill_one_thread(THD *thd, ulong id, bool only_kill_query, + bool only_kill_if_idle); +void sql_kill(THD *thd, ulong id, bool only_kill_query, + bool only_kill_if_idle); bool net_request_file(NET* net, const char* fname); char* query_table_status(THD *thd,const char *db,const char *table_name); diff -rupN percona-server-5.1.51-11.5-132.lenny/sql/sql_parse.cc percona-server-5.1.51-11.5-132.lenny-patched/sql/sql_parse.cc --- percona-server-5.1.51-11.5-132.lenny/sql/sql_parse.cc 2010-10-21 09:58:54.000000000 +0000 +++ percona-server-5.1.51-11.5-132.lenny-patched/sql/sql_parse.cc 2010-11-03 22:29:12.000000000 +0000 @@ -1614,7 +1614,7 @@ bool dispatch_command(enum enum_server_c { status_var_increment(thd->status_var.com_stat[SQLCOM_KILL]); ulong id=(ulong) uint4korr(packet); - sql_kill(thd,id,false); + sql_kill(thd,id,false,false); break; } case COM_SET_OPTION: @@ -4141,7 +4141,8 @@ end_with_restore_list: MYF(0)); goto error; } - sql_kill(thd, (ulong)it->val_int(), lex->type & ONLY_KILL_QUERY); + sql_kill(thd, (ulong)it->val_int(), lex->type & ONLY_KILL_QUERY, + lex->type & ONLY_KILL_IF_IDLE); break; } #ifndef NO_EMBEDDED_ACCESS_CHECKS @@ -7255,12 +7256,14 @@ bool reload_acl_and_cache(THD *thd, ulon @param thd Thread class @param id Thread id @param only_kill_query Should it kill the query or the connection + @param only_kill_if_idle Should it only kill idle connections @note This is written such that we have a short lock on LOCK_thread_count */ -uint kill_one_thread(THD *thd, ulong id, bool only_kill_query) +uint kill_one_thread(THD *thd, ulong id, bool only_kill_query, + bool only_kill_if_idle) { THD *tmp; uint error=ER_NO_SUCH_THREAD; @@ -7302,7 +7305,11 @@ uint kill_one_thread(THD *thd, ulong id, if ((thd->security_ctx->master_access & SUPER_ACL) || thd->security_ctx->user_matches(tmp->security_ctx)) { - tmp->awake(only_kill_query ? THD::KILL_QUERY : THD::KILL_CONNECTION); + // Kill a session when either: + // * it is sleeping and only_kill_if_idle is true + // * only_kill_if_idle is false + if (!only_kill_if_idle || tmp->command == COM_SLEEP) + tmp->awake(only_kill_query ? THD::KILL_QUERY : THD::KILL_CONNECTION); error=0; } else @@ -7322,12 +7329,13 @@ uint kill_one_thread(THD *thd, ulong id, thd Thread class id Thread id only_kill_query Should it kill the query or the connection + only_kill_if_idle Should it only kill idle connections */ -void sql_kill(THD *thd, ulong id, bool only_kill_query) +void sql_kill(THD *thd, ulong id, bool only_kill_query, bool only_kill_if_idle) { uint error; - if (!(error= kill_one_thread(thd, id, only_kill_query))) + if (!(error= kill_one_thread(thd, id, only_kill_query, only_kill_if_idle))) my_ok(thd); else my_error(error, MYF(0), id); diff -rupN percona-server-5.1.51-11.5-132.lenny/sql/sql_yacc.yy percona-server-5.1.51-11.5-132.lenny-patched/sql/sql_yacc.yy --- percona-server-5.1.51-11.5-132.lenny/sql/sql_yacc.yy 2010-10-21 09:58:37.000000000 +0000 +++ percona-server-5.1.51-11.5-132.lenny-patched/sql/sql_yacc.yy 2010-11-03 22:39:22.000000000 +0000 @@ -678,7 +678,7 @@ bool my_yyoverflow(short **a, YYSTYPE ** Currently there are 169 shift/reduce conflicts. We should not introduce new conflicts any more. */ -%expect 169 +%expect 170 /* Comments for TOKENS. @@ -900,6 +900,7 @@ bool my_yyoverflow(short **a, YYSTYPE ** %token IDENTIFIED_SYM %token IDENT_QUOTED %token IF +%token IF_IDLE_SYM %token IGNORE_SYM %token IMPORT %token INDEXES @@ -10695,6 +10696,7 @@ kill_option: /* empty */ { Lex->type= 0; } | CONNECTION_SYM { Lex->type= 0; } | QUERY_SYM { Lex->type= ONLY_KILL_QUERY; } + | IF_IDLE_SYM { Lex->type= ONLY_KILL_IF_IDLE; } ; /* change database */ @@ -11795,6 +11797,7 @@ keyword_sp: | HOSTS_SYM {} | HOUR_SYM {} | IDENTIFIED_SYM {} + | IF_IDLE_SYM {} | INDEX_STATS_SYM {} | INVOKER_SYM {} | IMPORT {}