From: Mayank Prasad Date: May 9 2011 1:55pm Subject: [Resend] bzr commit into mysql-5.1 branch (mayank.prasad:3685) Bug#11764633 List-Archive: http://lists.mysql.com/commits/136895 X-Bug: 11764633 Message-Id: <201105091355.p49DtNfg013158@acsmt356.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1409896164==" --===============1409896164== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline [This commit e-mail is a repeat.] #At file:///home/mayank/mysql-tree/mydefects/5.1_11764633_3/ based on revid:karen.langford@stripped 3685 Mayank Prasad 2011-05-09 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. 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-09 10:17:49 +0000 @@ -41,7 +41,17 @@ 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); +/* + Pointer to client error handler. It gets assigned in init_embedded_server. + It is used to call client error handling routine in embedded_error_handler. +*/ +static int (*client_error_handler_hook)(uint my_err, const char *str, + myf MyFlags); extern "C" void unireg_clear(int exit_code) { @@ -51,6 +61,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() returns 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): + client_error_handler_hook(error, str, MyFlags)); +} /* Reads error information from the MYSQL_DATA and puts @@ -107,7 +134,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 +175,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 +556,12 @@ int init_embedded_server(int argc, char return 1; } - 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; 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-09 10:17:49 +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-09 10:17:49 +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-09 10:17:49 +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) { --===============1409896164== 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\ # qm1j9j5knu0jbfqq # target_branch: file:///home/mayank/mysql-tree/mydefects\ # /5.1_11764633_3/ # testament_sha1: 61eff44e361faa03ff87778edfdc88095978681e # timestamp: 2011-05-09 19:25:13 +0530 # base_revision_id: karen.langford@stripped\ # entd41h2zg2nk9rq # # Begin bundle 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 --===============1409896164==--