From: Mayank Prasad Date: May 13 2011 11:29am Subject: bzr commit into mysql-5.1 branch (mayank.prasad:3620) Bug#11764633 List-Archive: http://lists.mysql.com/commits/137308 X-Bug: 11764633 Message-Id: <201105131129.p4DBTh1O001333@acsmt358.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0524734237==" --===============0524734237== 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_3/ based on revid:tatjana.nuernberg@stripped 3620 Mayank Prasad 2011-05-13 Bug#11764633 : 57491: THD->MAIN_DA.IS_OK() ASSERT IN EMBEDDED Issue: While running embedded server, if client issues TEE command (\T foo/bar) and "foo/bar" directory doesn't exist, it is suppose to give error. But it was aborting. This was happening because wrong error handler was being called. Solution: Modified calls to correct error handler. In embedded server case, there are two error handler (client and server) which are supposed to be called based on which context code is in. If it is in client context, client error handler should be called otherwise server. Test case: Test case automation is not possible as current (following) code doesn't allow '\T' to be executed from command line (OR command read from a file): [client/mysql.cc] ... static int com_tee(String *buffer __attribute__((unused)), char *line __attribute__((unused))) { char file_name[FN_REFLEN], *end, *param; if (status.batch) << THIS IS TRUE WHILE EXECUTING FROM COMMAND LINE. return 0; ... So, not adding test case in GA. WIll add a test case in mysql-trunk after removing above code so that this could be properly tested before GA. @ libmysqld/lib_sql.cc Added code to call client/server error handler based on in control is in client/server code respectively. @ sql/mysql_priv.h Added comments for THR_THD, THR_MALLOC keys. @ sql/sql_class.cc Function definition of new function restore_global to removes thread specific data from stack (which was stored in store global). @ sql/sql_class.h Function declaration of new function restore_global. modified: libmysqld/lib_sql.cc sql/mysql_priv.h sql/sql_class.cc sql/sql_class.h === modified file 'libmysqld/lib_sql.cc' --- a/libmysqld/lib_sql.cc 2009-12-18 18:44:24 +0000 +++ b/libmysqld/lib_sql.cc 2011-05-13 11:29:20 +0000 @@ -41,7 +41,11 @@ 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); - +/* + Wrapper error handler to call client/server error handler based on whether + thread is in client/server context +*/ +static int embedded_error_handler(uint error, const char *str, myf MyFlags); extern "C" void unireg_clear(int exit_code) { @@ -51,6 +55,23 @@ extern "C" void unireg_clear(int exit_co DBUG_VOID_RETURN; } +/* + Wrapper error handler for embedded server. Based on thread's state, call + the error handler accordingly. +*/ + +int embedded_error_handler(uint error, const char *str, myf MyFlags) +{ + DBUG_ENTER("embedded_error_handler"); + + /* + If current_thd is NULL, it means restore_global has been called and + thread is in client context, then call client error handler else call + server error handler. + */ + DBUG_RETURN(current_thd ? my_message_sql(error, str, MyFlags): + my_message_no_curses(error, str, MyFlags)); +} /* Reads error information from the MYSQL_DATA and puts @@ -107,7 +128,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; + result= 1; + goto end; } /* Clear result variables */ @@ -147,6 +169,9 @@ emb_advanced_command(MYSQL *mysql, enum #if defined(ENABLED_PROFILING) && defined(COMMUNITY_SERVER) thd->profiling.finish_current_query(); #endif + +end: + thd->restore_globals(); return result; } @@ -525,7 +550,10 @@ int init_embedded_server(int argc, char return 1; } - error_handler_hook = my_message_sql; + /* + set error_handler_hook to embedded_error_handler wrapper. + */ + error_handler_hook= embedded_error_handler; acl_error= 0; #ifndef NO_EMBEDDED_ACCESS_CHECKS === modified file 'sql/mysql_priv.h' --- a/sql/mysql_priv.h 2011-03-15 11:36:12 +0000 +++ b/sql/mysql_priv.h 2011-05-13 11:29:20 +0000 @@ -670,6 +670,10 @@ enum enum_check_fields extern "C" THD *_current_thd_noinline(); #define _current_thd() _current_thd_noinline() #else +/* + THR_THD is a key which will be used to set/get THD* for a thread, + using my_pthread_setspecific_ptr()/my_thread_getspecific_ptr(). +*/ extern pthread_key(THD*, THR_THD); inline THD *_current_thd(void) { @@ -2022,6 +2026,10 @@ extern TABLE_LIST general_log, slow_log; extern FILE *bootstrap_file; extern int bootstrap_error; extern FILE *stderror_file; +/* + THR_MALLOC is a key which will be used to set/get MEM_ROOT** for a thread, + using my_pthread_setspecific_ptr()/my_thread_getspecific_ptr(). +*/ extern pthread_key(MEM_ROOT**,THR_MALLOC); extern pthread_mutex_t LOCK_mysql_create_db,LOCK_Acl,LOCK_open, LOCK_lock_db, LOCK_mapped_file,LOCK_user_locks, LOCK_status, === modified file 'sql/sql_class.cc' --- a/sql/sql_class.cc 2011-04-07 18:12:54 +0000 +++ b/sql/sql_class.cc 2011-05-13 11:29:20 +0000 @@ -1196,6 +1196,25 @@ bool THD::store_globals() return 0; } +/* + Remove the thread specific info (THD and mem_root pointer) stored during + store_global call for this thread. +*/ +bool THD::restore_globals() +{ + /* + Assert that thread_stack is initialized: it's necessary to be able + to track stack overrun. + */ + DBUG_ASSERT(thread_stack); + + /* Undocking the thread specific data. */ + my_pthread_setspecific_ptr(THR_THD, NULL); + my_pthread_setspecific_ptr(THR_MALLOC, NULL); + + return 0; +} + /* Cleanup after query. === modified file 'sql/sql_class.h' --- a/sql/sql_class.h 2011-02-22 21:03:32 +0000 +++ b/sql/sql_class.h 2011-05-13 11:29:20 +0000 @@ -1943,6 +1943,7 @@ public: void cleanup(void); void cleanup_after_query(); bool store_globals(); + bool restore_globals(); #ifdef SIGNAL_WITH_VIO_CLOSE inline void set_active_vio(Vio* vio) { --===============0524734237== 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\ # 310gr76olynh8vtj # target_branch: file:///home/mayank/mysql-tree/mydefects\ # /5.1_11764633_3/ # testament_sha1: 24bcd5f0f6e58f7ce029b13dcaa159416a618b65 # timestamp: 2011-05-13 16:59:36 +0530 # base_revision_id: tatjana.nuernberg@stripped\ # z6n4wu05zwvt7c46 # # Begin bundle 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 --===============0524734237==--