diff options
author | Paul McCullagh <paul.mccullagh@primebase.org> | 2009-12-01 10:50:46 +0100 |
---|---|---|
committer | Paul McCullagh <paul.mccullagh@primebase.org> | 2009-12-01 10:50:46 +0100 |
commit | 4ba949204dc1056fedc7bfce539f6675d242a31d (patch) | |
tree | 0186c4115fd3819027fdf9be07037fb9cf7a9e4a /storage/pbxt | |
parent | 54f2ca0003d6a00d2cdd076857feae1397883433 (diff) | |
download | mariadb-git-4ba949204dc1056fedc7bfce539f6675d242a31d.tar.gz |
Fixed bug #489088
Diffstat (limited to 'storage/pbxt')
-rw-r--r-- | storage/pbxt/ChangeLog | 4 | ||||
-rw-r--r-- | storage/pbxt/src/myxt_xt.cc | 31 |
2 files changed, 33 insertions, 2 deletions
diff --git a/storage/pbxt/ChangeLog b/storage/pbxt/ChangeLog index 9e7dd0af21b..eb0613b8c68 100644 --- a/storage/pbxt/ChangeLog +++ b/storage/pbxt/ChangeLog @@ -1,7 +1,9 @@ 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. diff --git a/storage/pbxt/src/myxt_xt.cc b/storage/pbxt/src/myxt_xt.cc index 18074a9d85f..d4d917da8a8 100644 --- a/storage/pbxt/src/myxt_xt.cc +++ b/storage/pbxt/src/myxt_xt.cc @@ -3041,6 +3041,14 @@ xtPublic MX_CHARSET_INFO *myxt_getcharset(bool convert) 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() { #ifdef DRIZZLED @@ -3093,12 +3101,22 @@ xtPublic void *myxt_create_thread() return NULL; } - if (!(new_thd = new THD())) { + if (!(new_thd = new THD)) { my_thread_end(); xt_register_error(XT_REG_CONTEXT, XT_ERR_MYSQL_ERROR, 0, "Unable to create MySQL thread (THD)"); 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->store_globals(); lex_start(new_thd); @@ -3134,6 +3152,17 @@ xtPublic void myxt_destroy_thread(void *thread, xtBool end_threads) close_thread_tables(thd); #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; /* Remember that we don't have a THD */ |