From: Mayank Prasad Date: April 11 2011 3:33am Subject: bzr commit into mysql-5.1 branch (mayank.prasad:3640) Bug#11764633 List-Archive: http://lists.mysql.com/commits/135162 X-Bug: 11764633 Message-Id: <201104110333.p3B3XskP008368@acsmt356.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1972622884==" --===============1972622884== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/mayank/mysql-tree/mydefects/5.1_11764633_2/ based on revid:sergey.glukhov@stripped 3640 Mayank Prasad 2011-04-11 Bug#11764633 : 57491: THD->MAIN_DA.IS_OK() ASSERT IN EMBEDDED Issue: TEE command '\T foo/bar' was aborting. This is because, foo/bar directory doesn't exist. To report this error, server error handler was invoked and diagnostic area was found not reset. So abort was happenning. Solution: Call server/client error handler based on if control is in server/client code respectively. PS: need to add a test case fot the issue. Working on it. @ include/my_pthread.h Added a flag to indicate if control is in server code. @ libmysqld/lib_sql.cc Added code to call server/client error handler according to flag my_thread_var->is_in_server_code value. modified: include/my_pthread.h libmysqld/lib_sql.cc === modified file 'include/my_pthread.h' --- a/include/my_pthread.h 2011-02-22 21:03:32 +0000 +++ b/include/my_pthread.h 2011-04-11 03:33:23 +0000 @@ -695,6 +695,7 @@ struct st_my_thread_var void *dbug; char name[THREAD_NAME_SIZE+1]; #endif + my_bool is_in_server_code; }; extern struct st_my_thread_var *_my_thread_var(void) __attribute__ ((const)); === modified file 'libmysqld/lib_sql.cc' --- a/libmysqld/lib_sql.cc 2009-12-18 18:44:24 +0000 +++ b/libmysqld/lib_sql.cc 2011-04-11 03:33:23 +0000 @@ -22,6 +22,12 @@ #define main main1 #define mysql_unix_port mysql_inix_port1 #define mysql_port mysql_port1 +#define SET_THREAD_STATE_IN_SERVER_CODE \ + my_thread_var->is_in_server_code = 1; +#define RESET_THREAD_STATE_IN_SERVER_CODE \ + my_thread_var->is_in_server_code = 0; +#define IS_THREAD_STATE_IN_SERVER_CODE \ + my_thread_var->is_in_server_code extern "C" { @@ -41,6 +47,8 @@ C_MODE_START extern unsigned int mysql_server_last_errno; extern char mysql_server_last_error[MYSQL_ERRMSG_SIZE]; static my_bool emb_read_query_result(MYSQL *mysql); +static int embedded_error_handler(uint error, const char *str, myf MyFlags); +static int (*client_error_handler_hook)(uint my_err, const char *str,myf MyFlags); extern "C" void unireg_clear(int exit_code) @@ -51,6 +59,24 @@ extern "C" void unireg_clear(int exit_co DBUG_VOID_RETURN; } +/* + Wrapper for error handler for embedded server. Based on thread state, call + the error handler accordingly +*/ + +int embedded_error_handler(uint error, const char *str, myf MyFlags) +{ + DBUG_ENTER("embedded_error_handler"); + + /* + If thread is in server code, call server error handler + else call client error handler + */ + IS_THREAD_STATE_IN_SERVER_CODE ? my_message_sql(error,str,MyFlags): + client_error_handler_hook(error,str,MyFlags); + DBUG_RETURN(0); +} + /* Reads error information from the MYSQL_DATA and puts @@ -86,15 +112,21 @@ emb_advanced_command(MYSQL *mysql, enum MYSQL_STMT *stmt) { my_bool result= 1; + my_bool ret_value = 0; THD *thd=(THD *) mysql->thd; NET *net= &mysql->net; my_bool stmt_skip= stmt ? stmt->state != MYSQL_STMT_INIT_DONE : FALSE; + SET_THREAD_STATE_IN_SERVER_CODE; + if (!thd) { /* Do "reconnect" if possible */ if (mysql_reconnect(mysql) || stmt_skip) - return 1; + { + ret_value = 1; + goto end; + } thd= (THD *) mysql->thd; } @@ -107,7 +139,8 @@ emb_advanced_command(MYSQL *mysql, enum if (mysql->status != MYSQL_STATUS_READY) { set_mysql_error(mysql, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate); - return 1; + ret_value = 1; + goto end; } /* Clear result variables */ @@ -147,12 +180,17 @@ emb_advanced_command(MYSQL *mysql, enum #if defined(ENABLED_PROFILING) && defined(COMMUNITY_SERVER) thd->profiling.finish_current_query(); #endif - return result; + ret_value = result; + +end: + RESET_THREAD_STATE_IN_SERVER_CODE; + return ret_value; } static void emb_flush_use_result(MYSQL *mysql) { THD *thd= (THD*) mysql->thd; + SET_THREAD_STATE_IN_SERVER_CODE; if (thd->cur_data) { free_rows(thd->cur_data); @@ -164,6 +202,8 @@ static void emb_flush_use_result(MYSQL * thd->first_data= data->embedded_info->next; free_rows(data); } + + RESET_THREAD_STATE_IN_SERVER_CODE; } @@ -187,34 +227,52 @@ emb_read_rows(MYSQL *mysql, MYSQL_FIELD unsigned int fields __attribute__((unused))) { MYSQL_DATA *result= ((THD*)mysql->thd)->cur_data; + MYSQL_DATA *ret_value = NULL; ((THD*)mysql->thd)->cur_data= 0; + SET_THREAD_STATE_IN_SERVER_CODE; if (result->embedded_info->last_errno) { embedded_get_error(mysql, result); - return NULL; + ret_value = NULL; + goto end; } *result->embedded_info->prev_ptr= NULL; - return result; + ret_value = result; + +end: + RESET_THREAD_STATE_IN_SERVER_CODE; + return ret_value; } static MYSQL_FIELD *emb_list_fields(MYSQL *mysql) { MYSQL_DATA *res; + MYSQL_FIELD *ret_value = NULL; + SET_THREAD_STATE_IN_SERVER_CODE; if (emb_read_query_result(mysql)) - return 0; + { + ret_value = 0; + goto end; + } res= ((THD*) mysql->thd)->cur_data; ((THD*) mysql->thd)->cur_data= 0; mysql->field_alloc= res->alloc; my_free(res,MYF(0)); mysql->status= MYSQL_STATUS_READY; - return mysql->fields; + ret_value = mysql->fields; + +end: + RESET_THREAD_STATE_IN_SERVER_CODE; + return ret_value; } static my_bool emb_read_prepare_result(MYSQL *mysql, MYSQL_STMT *stmt) { THD *thd= (THD*) mysql->thd; MYSQL_DATA *res; + my_bool ret_value = 0; + SET_THREAD_STATE_IN_SERVER_CODE; stmt->stmt_id= thd->client_stmt_id; stmt->param_count= thd->client_param_count; @@ -224,7 +282,10 @@ static my_bool emb_read_prepare_result(M if (thd->first_data) { if (emb_read_query_result(mysql)) - return 1; + { + ret_value = 1; + goto end; + } stmt->field_count= mysql->field_count; mysql->status= MYSQL_STATUS_READY; res= thd->cur_data; @@ -238,7 +299,11 @@ static my_bool emb_read_prepare_result(M my_free(res,MYF(0)); } - return 0; + ret_value = 0; + +end: + RESET_THREAD_STATE_IN_SERVER_CODE; + return ret_value; } /************************************************************************** @@ -258,15 +323,18 @@ static void emb_fetch_lengths(ulong *to, static my_bool emb_read_query_result(MYSQL *mysql) { + my_bool ret_value = 0; THD *thd= (THD*) mysql->thd; MYSQL_DATA *res= thd->first_data; DBUG_ASSERT(!thd->cur_data); + SET_THREAD_STATE_IN_SERVER_CODE; thd->first_data= res->embedded_info->next; if (res->embedded_info->last_errno && !res->embedded_info->fields_list) { embedded_get_error(mysql, res); - return 1; + ret_value = 1; + goto end; } mysql->warning_count= res->embedded_info->warning_count; @@ -294,7 +362,11 @@ static my_bool emb_read_query_result(MYS else my_free(res, MYF(0)); - return 0; + ret_value = 0; + +end: + RESET_THREAD_STATE_IN_SERVER_CODE; + return ret_value; } static int emb_stmt_execute(MYSQL_STMT *stmt) @@ -303,6 +375,9 @@ static int emb_stmt_execute(MYSQL_STMT * uchar header[5]; THD *thd; my_bool res; + int ret_value = 0; + + SET_THREAD_STATE_IN_SERVER_CODE; int4store(header, stmt->stmt_id); header[4]= (uchar) stmt->flags; @@ -320,23 +395,36 @@ static int emb_stmt_execute(MYSQL_STMT * { NET *net= &stmt->mysql->net; set_stmt_errmsg(stmt, net); - DBUG_RETURN(1); + ret_value = 1; + goto end; } - DBUG_RETURN(0); + ret_value = 0; + +end: + RESET_THREAD_STATE_IN_SERVER_CODE; + DBUG_RETURN(ret_value); } int emb_read_binary_rows(MYSQL_STMT *stmt) { MYSQL_DATA *data; + int ret_value = 0; + SET_THREAD_STATE_IN_SERVER_CODE; + if (!(data= emb_read_rows(stmt->mysql, 0, 0))) { set_stmt_errmsg(stmt, &stmt->mysql->net); - return 1; + ret_value = 1; + goto end; } stmt->result= *data; my_free((char *) data, MYF(0)); set_stmt_errmsg(stmt, &stmt->mysql->net); - return 0; + ret_value = 0; + +end: + RESET_THREAD_STATE_IN_SERVER_CODE; + return ret_value; } int emb_read_rows_from_cursor(MYSQL_STMT *stmt) @@ -344,13 +432,17 @@ int emb_read_rows_from_cursor(MYSQL_STMT MYSQL *mysql= stmt->mysql; THD *thd= (THD*) mysql->thd; MYSQL_DATA *res= thd->first_data; + int ret_value = 0; + + SET_THREAD_STATE_IN_SERVER_CODE; DBUG_ASSERT(!thd->first_data->embedded_info->next); thd->first_data= 0; if (res->embedded_info->last_errno) { embedded_get_error(mysql, res); set_stmt_errmsg(stmt, &mysql->net); - return 1; + ret_value = 1; + goto end; } thd->cur_data= res; @@ -358,18 +450,27 @@ int emb_read_rows_from_cursor(MYSQL_STMT mysql->server_status= res->embedded_info->server_status; net_clear_error(&mysql->net); - return emb_read_binary_rows(stmt); + ret_value = emb_read_binary_rows(stmt); + +end: + RESET_THREAD_STATE_IN_SERVER_CODE; + return ret_value; } int emb_unbuffered_fetch(MYSQL *mysql, char **row) { THD *thd= (THD*) mysql->thd; MYSQL_DATA *data= thd->cur_data; + int ret_value = 0; + + SET_THREAD_STATE_IN_SERVER_CODE; + if (data && data->embedded_info->last_errno) { embedded_get_error(mysql, data); thd->cur_data= 0; - return 1; + ret_value = 1; + goto end; } if (!data || !data->data) { @@ -386,12 +487,17 @@ int emb_unbuffered_fetch(MYSQL *mysql, c *row= (char *)data->data->data; data->data= data->data->next; } - return 0; + ret_value = 0; + +end: + RESET_THREAD_STATE_IN_SERVER_CODE; + return ret_value; } static void emb_free_embedded_thd(MYSQL *mysql) { THD *thd= (THD*)mysql->thd; + SET_THREAD_STATE_IN_SERVER_CODE; thd->clear_data_list(); thread_count--; thd->store_globals(); @@ -399,18 +505,27 @@ static void emb_free_embedded_thd(MYSQL delete thd; my_pthread_setspecific_ptr(THR_THD, 0); mysql->thd=0; + RESET_THREAD_STATE_IN_SERVER_CODE; } static const char * emb_read_statistics(MYSQL *mysql) { THD *thd= (THD*)mysql->thd; - return thd->is_error() ? thd->main_da.message() : ""; + const char* ret_value = NULL; + SET_THREAD_STATE_IN_SERVER_CODE; + ret_value = thd->is_error() ? thd->main_da.message() : ""; + RESET_THREAD_STATE_IN_SERVER_CODE; + return ret_value; } static MYSQL_RES * emb_store_result(MYSQL *mysql) { - return mysql_store_result(mysql); + SET_THREAD_STATE_IN_SERVER_CODE; + MYSQL_RES * ret_value = NULL; + ret_value = mysql_store_result(mysql); + RESET_THREAD_STATE_IN_SERVER_CODE; + return ret_value; } int emb_read_change_user_result(MYSQL *mysql, @@ -480,6 +595,7 @@ int init_embedded_server(int argc, char char *fake_argv[] = { (char *)"", 0 }; const char *fake_groups[] = { "server", "embedded", 0 }; my_bool acl_error; + int ret_code= 0; if (argc) { argcp= &argc; @@ -504,7 +620,8 @@ int init_embedded_server(int argc, char if (init_common_variables("my", *argcp, *argvp, (const char **)groups)) { mysql_server_end(); - return 1; + ret_code= 1; + goto end; } /* Get default temporary directory */ @@ -522,10 +639,17 @@ int init_embedded_server(int argc, char if (init_server_components()) { mysql_server_end(); - return 1; + ret_code= 1; + goto end; } - error_handler_hook = my_message_sql; + /* + store the client error handler hook and set error handler to + embedded_error_handler_hook wrapper. + */ + client_error_handler_hook = error_handler_hook; + error_handler_hook = embedded_error_handler; + SET_THREAD_STATE_IN_SERVER_CODE; acl_error= 0; #ifndef NO_EMBEDDED_ACCESS_CHECKS @@ -536,7 +660,8 @@ int init_embedded_server(int argc, char if (acl_error || my_tz_init((THD *)0, default_tz_name, opt_bootstrap)) { mysql_server_end(); - return 1; + ret_code= 1; + goto end; } init_max_user_conn(); @@ -563,12 +688,17 @@ int init_embedded_server(int argc, char if (read_init_file(opt_init_file)) { mysql_server_end(); - return 1; + ret_code= 1; + goto end; } } execute_ddl_log_recovery(); - return 0; + ret_code= 0; + +end: + RESET_THREAD_STATE_IN_SERVER_CODE; + return ret_code; } void end_embedded_server() --===============1972622884== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/mayank.prasad@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: mayank.prasad@stripped\ # 0qez0ne3qtqi27r8 # target_branch: file:///home/mayank/mysql-tree/mydefects\ # /5.1_11764633_2/ # testament_sha1: 14b52d1d109dd25057422c03c8a39754c2212859 # timestamp: 2011-04-11 09:03:49 +0530 # base_revision_id: sergey.glukhov@stripped\ # kj14pkrflohle6dv # # Begin bundle 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 --===============1972622884==--