summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNayuta Yanagisawa <nayuta.yanagisawa@hey.com>2022-04-25 18:29:01 +0900
committerNayuta Yanagisawa <nayuta.yanagisawa@hey.com>2022-07-20 09:36:11 +0900
commit1f255953345d2ae5fda1369d1d9b7d1e22bd4ef6 (patch)
tree223839a65c75acc33293071b5cd99cc30f7273df
parent0092301e3998f14287b43f4aa52532ac572c6bcf (diff)
downloadmariadb-git-bb-10.4-MDEV-27233-2.tar.gz
MDEV-27233 Server hangs when using --init-file which loads Spider and creates a Spider tablebb-10.4-MDEV-27233-2
Spider waits until the server initialization is complete (i.e., mysqld_server_started == 1) before creating the Spider system tables like mysql.spider_XX. Spider also wait until the tables are created before instantiating ha_spider. This results in dead lock when Spider is loaded and a non-system Spider table is created by --in-file because queries passed by --in-file are executed during the server initialization (i.e., mysqld_server_started == 0). In the first place, there seems to be no need for Spider to wait until the server initialization is completed before creating the system tables. Thus, we simply remove that synchronization.
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_27233.result3
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_27233.opt1
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_27233.sql3
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_27233.test3
-rw-r--r--storage/spider/mysql-test/spider/include/deinit_spider.inc4
-rw-r--r--storage/spider/mysql-test/spider/include/init_spider.inc4
-rw-r--r--storage/spider/spd_include.h1
-rw-r--r--storage/spider/spd_init_query.h101
-rw-r--r--storage/spider/spd_table.cc125
9 files changed, 59 insertions, 186 deletions
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_27233.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_27233.result
new file mode 100644
index 00000000000..53622bb6a23
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_27233.result
@@ -0,0 +1,3 @@
+#
+# MDEV-27233 Server hangs when using --init-file which loads Spider and creates a Spider table
+#
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_27233.opt b/storage/spider/mysql-test/spider/bugfix/t/mdev_27233.opt
new file mode 100644
index 00000000000..7bc1c2127a6
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_27233.opt
@@ -0,0 +1 @@
+--init-file=$MYSQL_TEST_DIR/../storage/spider/mysql-test/spider/bugfix/t/mdev_27233.sql
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_27233.sql b/storage/spider/mysql-test/spider/bugfix/t/mdev_27233.sql
new file mode 100644
index 00000000000..2be9ec1fad6
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_27233.sql
@@ -0,0 +1,3 @@
+INSTALL SONAME 'ha_spider.so';
+USE test;
+CREATE TABLE t (c INT) ENGINE=SPIDER;
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_27233.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_27233.test
new file mode 100644
index 00000000000..79603439d35
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_27233.test
@@ -0,0 +1,3 @@
+--echo #
+--echo # MDEV-27233 Server hangs when using --init-file which loads Spider and creates a Spider table
+--echo #
diff --git a/storage/spider/mysql-test/spider/include/deinit_spider.inc b/storage/spider/mysql-test/spider/include/deinit_spider.inc
index 51cc075edaa..ef39cea534d 100644
--- a/storage/spider/mysql-test/spider/include/deinit_spider.inc
+++ b/storage/spider/mysql-test/spider/include/deinit_spider.inc
@@ -20,7 +20,6 @@ if (`SELECT IF($PLUGIN_VERSION = 3, 1, 0)`)
if ($HAS_REWRITE)
{
DROP FUNCTION spider_flush_rewrite_cache;
- UNINSTALL PLUGIN spider_rewrite;
DROP TABLE IF EXISTS mysql.spider_rewrite_tables;
DROP TABLE IF EXISTS mysql.spider_rewrite_table_tables;
DROP TABLE IF EXISTS mysql.spider_rewrite_table_partitions;
@@ -33,8 +32,7 @@ DROP FUNCTION spider_copy_tables;
DROP FUNCTION spider_ping_table;
DROP FUNCTION spider_bg_direct_sql;
DROP FUNCTION spider_direct_sql;
-UNINSTALL PLUGIN spider_alloc_mem;
-UNINSTALL PLUGIN spider;
+UNINSTALL SONAME "ha_spider.so";
DROP TABLE IF EXISTS mysql.spider_xa;
DROP TABLE IF EXISTS mysql.spider_xa_member;
DROP TABLE IF EXISTS mysql.spider_xa_failed_log;
diff --git a/storage/spider/mysql-test/spider/include/init_spider.inc b/storage/spider/mysql-test/spider/include/init_spider.inc
index 69d1fae425e..e4fad14998b 100644
--- a/storage/spider/mysql-test/spider/include/init_spider.inc
+++ b/storage/spider/mysql-test/spider/include/init_spider.inc
@@ -2,7 +2,7 @@ let $VERSION_COMPILE_OS_WIN=
`SELECT IF(@@version_compile_os like 'Win%', 1, 0)`;
if ($VERSION_COMPILE_OS_WIN)
{
- INSTALL PLUGIN spider SONAME 'ha_spider.dll';
+ INSTALL SONAME 'ha_spider.dll';
if ($CHILD2_1_MYPORT)
{
eval CREATE SERVER s_2_1 FOREIGN DATA WRAPPER mysql OPTIONS (
@@ -66,7 +66,7 @@ if ($VERSION_COMPILE_OS_WIN)
}
if (!$VERSION_COMPILE_OS_WIN)
{
- INSTALL PLUGIN spider SONAME 'ha_spider.so';
+ INSTALL SONAME 'ha_spider.so';
if ($CHILD2_1_MYSOCK)
{
eval CREATE SERVER s_2_1 FOREIGN DATA WRAPPER mysql OPTIONS (
diff --git a/storage/spider/spd_include.h b/storage/spider/spd_include.h
index 81d812280d7..df5c880d29e 100644
--- a/storage/spider/spd_include.h
+++ b/storage/spider/spd_include.h
@@ -297,7 +297,6 @@ typedef struct st_spider_thread
volatile bool killed;
volatile bool thd_wait;
volatile bool first_free_wait;
- volatile bool init_command;
volatile int error;
pthread_t thread;
pthread_cond_t cond;
diff --git a/storage/spider/spd_init_query.h b/storage/spider/spd_init_query.h
index 4c58f8d80a4..bb28020921d 100644
--- a/storage/spider/spd_init_query.h
+++ b/storage/spider/spd_init_query.h
@@ -612,57 +612,6 @@ static LEX_STRING spider_init_queries[] = {
"create procedure mysql.spider_plugin_installer()"
"begin"
" set @win_plugin := IF(@@version_compile_os like 'Win%', 1, 0);"
-/*
- Install spider plugin
-*/
-/*
- " set @have_spider_i_s_plugin := 0;"
- " select @have_spider_i_s_plugin := 1 from INFORMATION_SCHEMA.plugins"
- " where PLUGIN_NAME = 'SPIDER';"
- " set @have_spider_plugin := 0;"
- " select @have_spider_plugin := 1 from mysql.plugin"
- " where name = 'spider';"
- " if @have_spider_i_s_plugin = 0 then"
- " if @have_spider_plugin = 1 then"
- " / *"
- " spider plugin is present in mysql.plugin but not in"
- " information_schema.plugins. Remove spider plugin entry"
- " in mysql.plugin first."
- " * /"
- " delete from mysql.plugin where name = 'spider';"
- " end if;"
- " if @win_plugin = 0 then "
- " install plugin spider soname 'ha_spider.so';"
- " else"
- " install plugin spider soname 'ha_spider.dll';"
- " end if;"
- " end if;"
-*/
-/*
- Install spider_alloc_mem plugin
-*/
- " set @have_spider_i_s_alloc_mem_plugin := 0;"
- " select @have_spider_i_s_alloc_mem_plugin := 1"
- " from INFORMATION_SCHEMA.plugins"
- " where PLUGIN_NAME = 'SPIDER_ALLOC_MEM';"
- " set @have_spider_alloc_mem_plugin := 0;"
- " select @have_spider_alloc_mem_plugin := 1 from mysql.plugin"
- " where name = 'spider_alloc_mem';"
- " if @have_spider_i_s_alloc_mem_plugin = 0 then"
- " if @have_spider_alloc_mem_plugin = 1 then"
- " /*"
- " spider_alloc_mem plugin is present in mysql.plugin but not in"
- " information_schema.plugins. Remove spider_alloc_mem plugin entry"
- " in mysql.plugin first."
- " */"
- " delete from mysql.plugin where name = 'spider_alloc_mem';"
- " end if;"
- " if @win_plugin = 0 then "
- " install plugin spider_alloc_mem soname 'ha_spider.so';"
- " else"
- " install plugin spider_alloc_mem soname 'ha_spider.dll';"
- " end if;"
- " end if;"
" set @have_spider_direct_sql_udf := 0;"
" select @have_spider_direct_sql_udf := 1 from mysql.func"
" where name = 'spider_direct_sql';"
@@ -723,53 +672,6 @@ static LEX_STRING spider_init_queries[] = {
" soname 'ha_spider.dll';"
" end if;"
" end if;"
- " if @server_name = 'MariaDB' and"
- " ("
- " @server_major_version > 10 or"
- " ("
- " @server_major_version = 10 and"
- " @server_minor_version >= 6"
- " )"
- " )"
- " then"
-/*
- Install spider_rewrite plugin
-*/
- " set @have_spider_i_s_rewrite_plugin := 0;"
- " select @have_spider_i_s_rewrite_plugin := 1"
- " from INFORMATION_SCHEMA.plugins"
- " where PLUGIN_NAME = 'SPIDER_REWRITE';"
- " set @have_spider_rewrite_plugin := 0;"
- " select @have_spider_rewrite_plugin := 1 from mysql.plugin"
- " where name = 'spider_rewrite';"
- " if @have_spider_i_s_rewrite_plugin = 0 then"
- " if @have_spider_rewrite_plugin = 1 then"
- " /*"
- " spider_rewrite plugin is present in mysql.plugin but not in"
- " information_schema.plugins. Remove spider_rewrite plugin entry"
- " in mysql.plugin first."
- " */"
- " delete from mysql.plugin where name = 'spider_rewrite';"
- " end if;"
- " if @win_plugin = 0 then "
- " install plugin spider_rewrite soname 'ha_spider.so';"
- " else"
- " install plugin spider_rewrite soname 'ha_spider.dll';"
- " end if;"
- " end if;"
- " set @have_spider_flush_rewrite_cache_udf := 0;"
- " select @have_spider_flush_rewrite_cache_udf := 1 from mysql.func"
- " where name = 'spider_flush_rewrite_cache';"
- " if @have_spider_flush_rewrite_cache_udf = 0 then"
- " if @win_plugin = 0 then "
- " create function spider_flush_rewrite_cache returns int"
- " soname 'ha_spider.so';"
- " else"
- " create function spider_flush_rewrite_cache returns int"
- " soname 'ha_spider.dll';"
- " end if;"
- " end if;"
- " end if;"
"end;"
)},
{C_STRING_WITH_LEN(
@@ -777,6 +679,5 @@ static LEX_STRING spider_init_queries[] = {
)},
{C_STRING_WITH_LEN(
"drop procedure mysql.spider_plugin_installer"
- )},
- {C_STRING_WITH_LEN("")}
+ )}
};
diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc
index 7a00061e3a2..4e57cbd1394 100644
--- a/storage/spider/spd_table.cc
+++ b/storage/spider/spd_table.cc
@@ -129,9 +129,6 @@ const char **spd_mysqld_unix_port;
uint *spd_mysqld_port;
bool volatile *spd_abort_loop;
Time_zone *spd_tz_system;
-static int *spd_mysqld_server_started;
-static pthread_mutex_t *spd_LOCK_server_started;
-static pthread_cond_t *spd_COND_server_started;
extern long spider_conn_mutex_id;
handlerton *spider_hton_ptr;
SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
@@ -6571,30 +6568,6 @@ handler* spider_create_handler(
MEM_ROOT *mem_root
) {
DBUG_ENTER("spider_create_handler");
-#ifndef WITHOUT_SPIDER_BG_SEARCH
- SPIDER_THREAD *thread = &spider_table_sts_threads[0];
- if (unlikely(thread->init_command))
- {
- THD *thd = current_thd;
- pthread_cond_t *cond = thd->mysys_var->current_cond;
- pthread_mutex_t *mutex = thd->mysys_var->current_mutex;
- /* wait for finishing init_command */
- pthread_mutex_lock(&thread->mutex);
- if (unlikely(thread->init_command))
- {
- thd->mysys_var->current_cond = &thread->sync_cond;
- thd->mysys_var->current_mutex = &thread->mutex;
- pthread_cond_wait(&thread->sync_cond, &thread->mutex);
- }
- pthread_mutex_unlock(&thread->mutex);
- thd->mysys_var->current_cond = cond;
- thd->mysys_var->current_mutex = mutex;
- if (thd->killed)
- {
- DBUG_RETURN(NULL);
- }
- }
-#endif
DBUG_RETURN(new (mem_root) ha_spider(hton, table));
}
@@ -6915,6 +6888,45 @@ int spider_panic(
DBUG_RETURN(0);
}
+/*
+ Create or fix the system tables. See spd_init_query.h for the details.
+*/
+bool spider_init_system_tables()
+{
+ DBUG_ENTER("spider_init_system_tables");
+
+ MYSQL *mysql= mysql_init(NULL);
+
+ if (mysql_real_connect_local(mysql) == NULL)
+ {
+ DBUG_RETURN(TRUE);
+ }
+
+ int size= sizeof(spider_init_queries)/sizeof(spider_init_queries[0]);
+ for (int i= 0; i < size; i++)
+ {
+ if (mysql_real_query(mysql, spider_init_queries[i].str,
+ spider_init_queries[i].length))
+ {
+ fprintf(stderr,
+ "[ERROR] SPIDER plugin initialization failed at '%s' by '%s'\n",
+ spider_init_queries[i].str, mysql_error(mysql));
+
+ mysql_close(mysql);
+ DBUG_RETURN(TRUE);
+ }
+
+ if (MYSQL_RES *res= mysql_store_result(mysql))
+ {
+ mysql_free_result(res);
+ }
+ }
+
+ mysql_close(mysql);
+
+ DBUG_RETURN(FALSE);
+}
+
int spider_db_init(
void *p
) {
@@ -7018,13 +7030,6 @@ int spider_db_init(
#else
GetProcAddress(current_module, "?my_tz_SYSTEM@@3PAVTime_zone@@A");
#endif
- spd_mysqld_server_started = (int *)
- GetProcAddress(current_module, "?mysqld_server_started@@3HA");
- spd_LOCK_server_started = (pthread_mutex_t *)
- GetProcAddress(current_module,
- "?LOCK_server_started@@3Ust_mysql_mutex@@A");
- spd_COND_server_started = (pthread_cond_t *)
- GetProcAddress(current_module, "?COND_server_started@@3Ust_mysql_cond@@A");
#else
#ifndef SPIDER_HAS_NEXT_THREAD_ID
spd_db_att_thread_id = &thread_id;
@@ -7047,9 +7052,6 @@ int spider_db_init(
spd_mysqld_port = &mysqld_port;
spd_abort_loop = &abort_loop;
spd_tz_system = my_tz_SYSTEM;
- spd_mysqld_server_started = &mysqld_server_started;
- spd_LOCK_server_started = &LOCK_server_started;
- spd_COND_server_started = &COND_server_started;
#endif
#ifdef HAVE_PSI_INTERFACE
@@ -7325,6 +7327,11 @@ int spider_db_init(
spider_udf_table_mon_list_hash[roop_count].array.size_of_element);
}
+ if (spider_init_system_tables())
+ {
+ goto error_system_table_creation;
+ }
+
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (!(spider_table_sts_threads = (SPIDER_THREAD *)
spider_bulk_malloc(NULL, 256, MYF(MY_WME | MY_ZEROFILL),
@@ -7335,7 +7342,6 @@ int spider_db_init(
NullS))
)
goto error_alloc_mon_mutxes;
- spider_table_sts_threads[0].init_command = TRUE;
for (roop_count = 0;
roop_count < (int) spider_param_table_sts_thread_count();
@@ -7426,6 +7432,7 @@ error_init_udf_table_mon_list_hash:
error_init_udf_table_mon_cond:
for (; roop_count >= 0; roop_count--)
pthread_cond_destroy(&spider_udf_table_mon_conds[roop_count]);
+error_system_table_creation:
roop_count = spider_param_udf_table_mon_mutex_count() - 1;
error_init_udf_table_mon_mutex:
for (; roop_count >= 0; roop_count--)
@@ -10027,48 +10034,6 @@ void *spider_table_bg_sts_action(
trx->thd = thd;
/* init end */
- if (thread->init_command)
- {
- uint i = 0;
- tmp_disable_binlog(thd);
- thd->security_ctx->skip_grants();
- thd->client_capabilities |= CLIENT_MULTI_RESULTS;
- if (!(*spd_mysqld_server_started) && !thd->killed)
- {
- pthread_mutex_lock(spd_LOCK_server_started);
- thd->mysys_var->current_cond = spd_COND_server_started;
- thd->mysys_var->current_mutex = spd_LOCK_server_started;
- if (!(*spd_mysqld_server_started) && !thd->killed)
- {
- pthread_cond_wait(spd_COND_server_started, spd_LOCK_server_started);
- }
- pthread_mutex_unlock(spd_LOCK_server_started);
- thd->mysys_var->current_cond = &thread->cond;
- thd->mysys_var->current_mutex = &thread->mutex;
- }
- while (spider_init_queries[i].length && !thd->killed)
- {
- dispatch_command(COM_QUERY, thd, spider_init_queries[i].str,
- (uint) spider_init_queries[i].length, FALSE, FALSE);
- if (unlikely(thd->is_error()))
- {
- fprintf(stderr, "[ERROR] %s\n", spider_stmt_da_message(thd));
- thd->clear_error();
- break;
- }
- ++i;
- }
- thd->mysys_var->current_cond = &thread->cond;
- thd->mysys_var->current_mutex = &thread->mutex;
- thd->client_capabilities -= CLIENT_MULTI_RESULTS;
- reenable_binlog(thd);
- thread->init_command = FALSE;
- pthread_cond_broadcast(&thread->sync_cond);
- }
- if (thd->killed)
- {
- thread->killed = TRUE;
- }
if (thd->killed)
{
thread->killed = TRUE;