summaryrefslogtreecommitdiff
path: root/storage/pbxt
diff options
context:
space:
mode:
authorPaul McCullagh <paul.mccullagh@primebase.org>2009-12-01 10:50:46 +0100
committerPaul McCullagh <paul.mccullagh@primebase.org>2009-12-01 10:50:46 +0100
commit4ba949204dc1056fedc7bfce539f6675d242a31d (patch)
tree0186c4115fd3819027fdf9be07037fb9cf7a9e4a /storage/pbxt
parent54f2ca0003d6a00d2cdd076857feae1397883433 (diff)
downloadmariadb-git-4ba949204dc1056fedc7bfce539f6675d242a31d.tar.gz
Fixed bug #489088
Diffstat (limited to 'storage/pbxt')
-rw-r--r--storage/pbxt/ChangeLog4
-rw-r--r--storage/pbxt/src/myxt_xt.cc31
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 */