Commit 4ba94920 authored by Paul McCullagh's avatar Paul McCullagh

Fixed bug #489088

parent 54f2ca00
PBXT Release Notes PBXT Release Notes
================== ==================
------- 1.0.09f RC3 - 2009-11-25 ------- 1.0.09f RC3 - 2009-11-30
RN291: Fixed bug #489088: On shutdown MySQL reports: [Warning] Plugin 'PBXT' will be forced to shutdown.
RN290: Fixed bug #345524: pbxt does not compile on 64 bit windows. Currently atomic operations are not supported on this platform. RN290: Fixed bug #345524: pbxt does not compile on 64 bit windows. Currently atomic operations are not supported on this platform.
......
...@@ -3041,6 +3041,14 @@ xtPublic MX_CHARSET_INFO *myxt_getcharset(bool convert) ...@@ -3041,6 +3041,14 @@ xtPublic MX_CHARSET_INFO *myxt_getcharset(bool convert)
return (MX_CHARSET_INFO *)&my_charset_utf8_general_ci; return (MX_CHARSET_INFO *)&my_charset_utf8_general_ci;
} }
#ifdef DBUG_OFF
//typedef struct st_plugin_int *plugin_ref;
#define REF_MYSQL_PLUGIN(x) (x)
#else
//typedef struct st_plugin_int **plugin_ref;
#define REF_MYSQL_PLUGIN(x) (*(x))
#endif
xtPublic void *myxt_create_thread() xtPublic void *myxt_create_thread()
{ {
#ifdef DRIZZLED #ifdef DRIZZLED
...@@ -3093,12 +3101,22 @@ xtPublic void *myxt_create_thread() ...@@ -3093,12 +3101,22 @@ xtPublic void *myxt_create_thread()
return NULL; return NULL;
} }
if (!(new_thd = new THD())) { if (!(new_thd = new THD)) {
my_thread_end(); my_thread_end();
xt_register_error(XT_REG_CONTEXT, XT_ERR_MYSQL_ERROR, 0, "Unable to create MySQL thread (THD)"); xt_register_error(XT_REG_CONTEXT, XT_ERR_MYSQL_ERROR, 0, "Unable to create MySQL thread (THD)");
return NULL; return NULL;
} }
/*
* If PBXT is the default storage engine, then creating any THD objects will add extra
* references to the PBXT plugin object and will effectively deadlock the plugin so
* that server will have to force plugin shutdown. To avoid deadlocking and forced shutdown
* we must dereference the plugin after creating THD objects.
*/
LEX_STRING& plugin_name = REF_MYSQL_PLUGIN(new_thd->variables.table_plugin)->name;
if ((plugin_name.length == 4) && (strncmp(plugin_name.str, "PBXT", plugin_name.length) == 0)) {
REF_MYSQL_PLUGIN(new_thd->variables.table_plugin)->ref_count--;
}
new_thd->thread_stack = (char *) &new_thd; new_thd->thread_stack = (char *) &new_thd;
new_thd->store_globals(); new_thd->store_globals();
lex_start(new_thd); lex_start(new_thd);
...@@ -3134,6 +3152,17 @@ xtPublic void myxt_destroy_thread(void *thread, xtBool end_threads) ...@@ -3134,6 +3152,17 @@ xtPublic void myxt_destroy_thread(void *thread, xtBool end_threads)
close_thread_tables(thd); close_thread_tables(thd);
#endif #endif
/*
* In myxt_create_thread we decremented plugin ref-count to avoid dead-locking.
* Here we need to increment ref-count to avoid assertion failures.
*/
if (thd->variables.table_plugin) {
LEX_STRING& plugin_name = REF_MYSQL_PLUGIN(thd->variables.table_plugin)->name;
if ((plugin_name.length == 4) && (strncmp(plugin_name.str, "PBXT", plugin_name.length) == 0)) {
REF_MYSQL_PLUGIN(thd->variables.table_plugin)->ref_count++;
}
}
delete thd; delete thd;
/* Remember that we don't have a THD */ /* Remember that we don't have a THD */
......
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