Commit d23ad366 authored by Nayuta Yanagisawa's avatar Nayuta Yanagisawa

Revert "MDEV-27233 Server hangs when using --init-file which loads Spider and...

Revert "MDEV-27233 Server hangs when using --init-file which loads Spider and creates a Spider table"

This reverts commit c160a115.
parent 1ebfa2af
#
# MDEV-27233 Server hangs when using --init-file which loads Spider and creates a Spider table
#
--init-file=$MYSQL_TEST_DIR/../storage/spider/mysql-test/spider/bugfix/t/mdev_27233.sql
INSTALL SONAME 'ha_spider.so';
USE test;
CREATE TABLE t (c INT) ENGINE=SPIDER;
--echo #
--echo # MDEV-27233 Server hangs when using --init-file which loads Spider and creates a Spider table
--echo #
...@@ -20,6 +20,7 @@ if (`SELECT IF($PLUGIN_VERSION = 3, 1, 0)`) ...@@ -20,6 +20,7 @@ if (`SELECT IF($PLUGIN_VERSION = 3, 1, 0)`)
if ($HAS_REWRITE) if ($HAS_REWRITE)
{ {
DROP FUNCTION spider_flush_rewrite_cache; 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_tables;
DROP TABLE IF EXISTS mysql.spider_rewrite_table_tables; DROP TABLE IF EXISTS mysql.spider_rewrite_table_tables;
DROP TABLE IF EXISTS mysql.spider_rewrite_table_partitions; DROP TABLE IF EXISTS mysql.spider_rewrite_table_partitions;
...@@ -32,7 +33,9 @@ DROP FUNCTION spider_copy_tables; ...@@ -32,7 +33,9 @@ DROP FUNCTION spider_copy_tables;
DROP FUNCTION spider_ping_table; DROP FUNCTION spider_ping_table;
DROP FUNCTION spider_bg_direct_sql; DROP FUNCTION spider_bg_direct_sql;
DROP FUNCTION spider_direct_sql; DROP FUNCTION spider_direct_sql;
UNINSTALL SONAME "ha_spider.so"; UNINSTALL PLUGIN spider_wrapper_protocols;
UNINSTALL PLUGIN spider_alloc_mem;
UNINSTALL PLUGIN spider;
DROP TABLE IF EXISTS mysql.spider_xa; DROP TABLE IF EXISTS mysql.spider_xa;
DROP TABLE IF EXISTS mysql.spider_xa_member; DROP TABLE IF EXISTS mysql.spider_xa_member;
DROP TABLE IF EXISTS mysql.spider_xa_failed_log; DROP TABLE IF EXISTS mysql.spider_xa_failed_log;
......
...@@ -2,7 +2,7 @@ let $VERSION_COMPILE_OS_WIN= ...@@ -2,7 +2,7 @@ let $VERSION_COMPILE_OS_WIN=
`SELECT IF(@@version_compile_os like 'Win%', 1, 0)`; `SELECT IF(@@version_compile_os like 'Win%', 1, 0)`;
if ($VERSION_COMPILE_OS_WIN) if ($VERSION_COMPILE_OS_WIN)
{ {
INSTALL SONAME 'ha_spider.dll'; INSTALL PLUGIN spider SONAME 'ha_spider.dll';
if ($MASTER_1_MYPORT) if ($MASTER_1_MYPORT)
{ {
eval CREATE SERVER s_1 FOREIGN DATA WRAPPER mysql OPTIONS ( eval CREATE SERVER s_1 FOREIGN DATA WRAPPER mysql OPTIONS (
...@@ -76,7 +76,7 @@ if ($VERSION_COMPILE_OS_WIN) ...@@ -76,7 +76,7 @@ if ($VERSION_COMPILE_OS_WIN)
} }
if (!$VERSION_COMPILE_OS_WIN) if (!$VERSION_COMPILE_OS_WIN)
{ {
INSTALL SONAME 'ha_spider.so'; INSTALL PLUGIN spider SONAME 'ha_spider.so';
if ($MASTER_1_MYSOCK) if ($MASTER_1_MYSOCK)
{ {
eval CREATE SERVER s_1 FOREIGN DATA WRAPPER mysql OPTIONS ( eval CREATE SERVER s_1 FOREIGN DATA WRAPPER mysql OPTIONS (
......
...@@ -324,6 +324,7 @@ typedef struct st_spider_thread ...@@ -324,6 +324,7 @@ typedef struct st_spider_thread
volatile bool killed; volatile bool killed;
volatile bool thd_wait; volatile bool thd_wait;
volatile bool first_free_wait; volatile bool first_free_wait;
volatile bool init_command;
volatile int error; volatile int error;
pthread_t thread; pthread_t thread;
pthread_cond_t cond; pthread_cond_t cond;
......
...@@ -662,6 +662,82 @@ static LEX_STRING spider_init_queries[] = { ...@@ -662,6 +662,82 @@ static LEX_STRING spider_init_queries[] = {
"create procedure mysql.spider_plugin_installer()" "create procedure mysql.spider_plugin_installer()"
"begin" "begin"
" set @win_plugin := IF(@@version_compile_os like 'Win%', 1, 0);" " 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;"
/*
Install spider_wrapper_protocols plugin
*/
" set @have_spider_i_s_wrapper_protocols_plugin := 0;"
" select @have_spider_i_s_wrapper_protocols_plugin := 1"
" from INFORMATION_SCHEMA.plugins"
" where PLUGIN_NAME = 'SPIDER_WRAPPER_PROTOCOLS';"
" set @have_spider_wrapper_protocols_plugin := 0;"
" select @have_spider_wrapper_protocols_plugin := 1 from mysql.plugin"
" where name = 'spider_wrapper_protocols';"
" if @have_spider_i_s_wrapper_protocols_plugin = 0 then"
" if @have_spider_wrapper_protocols_plugin = 1 then"
" /*"
" spider_wrapper_protocols plugin is present in mysql.plugin but not in"
" information_schema.plugins. Remove spider_wrapper_protocols plugin entry"
" in mysql.plugin first."
" */"
" delete from mysql.plugin where name = 'spider_wrapper_protocols';"
" end if;"
" if @win_plugin = 0 then "
" install plugin spider_wrapper_protocols soname 'ha_spider.so';"
" else"
" install plugin spider_wrapper_protocols soname 'ha_spider.dll';"
" end if;"
" end if;"
" set @have_spider_direct_sql_udf := 0;" " set @have_spider_direct_sql_udf := 0;"
" select @have_spider_direct_sql_udf := 1 from mysql.func" " select @have_spider_direct_sql_udf := 1 from mysql.func"
" where name = 'spider_direct_sql';" " where name = 'spider_direct_sql';"
...@@ -722,6 +798,53 @@ static LEX_STRING spider_init_queries[] = { ...@@ -722,6 +798,53 @@ static LEX_STRING spider_init_queries[] = {
" soname 'ha_spider.dll';" " soname 'ha_spider.dll';"
" end if;" " end if;"
" end if;" " end if;"
" if @server_name = 'MariaDB' and"
" ("
" @server_major_version > 10 or"
" ("
" @server_major_version = 10 and"
" @server_minor_version >= 8"
" )"
" )"
" 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;" "end;"
)}, )},
{C_STRING_WITH_LEN( {C_STRING_WITH_LEN(
...@@ -729,5 +852,6 @@ static LEX_STRING spider_init_queries[] = { ...@@ -729,5 +852,6 @@ static LEX_STRING spider_init_queries[] = {
)}, )},
{C_STRING_WITH_LEN( {C_STRING_WITH_LEN(
"drop procedure mysql.spider_plugin_installer" "drop procedure mysql.spider_plugin_installer"
)} )},
{C_STRING_WITH_LEN("")}
}; };
...@@ -129,6 +129,9 @@ const char **spd_mysqld_unix_port; ...@@ -129,6 +129,9 @@ const char **spd_mysqld_unix_port;
uint *spd_mysqld_port; uint *spd_mysqld_port;
bool volatile *spd_abort_loop; bool volatile *spd_abort_loop;
Time_zone *spd_tz_system; 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; extern long spider_conn_mutex_id;
handlerton *spider_hton_ptr; handlerton *spider_hton_ptr;
SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE]; SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
...@@ -7050,6 +7053,30 @@ handler* spider_create_handler( ...@@ -7050,6 +7053,30 @@ handler* spider_create_handler(
MEM_ROOT *mem_root MEM_ROOT *mem_root
) { ) {
DBUG_ENTER("spider_create_handler"); 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)); DBUG_RETURN(new (mem_root) ha_spider(hton, table));
} }
...@@ -7370,50 +7397,6 @@ int spider_panic( ...@@ -7370,50 +7397,6 @@ int spider_panic(
DBUG_RETURN(0); 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)
{
DBUG_RETURN(TRUE);
}
if (!mysql_real_connect_local(mysql))
{
mysql_close(mysql);
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( int spider_db_init(
void *p void *p
) { ) {
...@@ -7501,6 +7484,9 @@ int spider_db_init( ...@@ -7501,6 +7484,9 @@ int spider_db_init(
spd_mysqld_port = &mysqld_port; spd_mysqld_port = &mysqld_port;
spd_abort_loop = &abort_loop; spd_abort_loop = &abort_loop;
spd_tz_system = my_tz_SYSTEM; 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;
#ifdef HAVE_PSI_INTERFACE #ifdef HAVE_PSI_INTERFACE
init_spider_psi_keys(); init_spider_psi_keys();
...@@ -7776,11 +7762,6 @@ int spider_db_init( ...@@ -7776,11 +7762,6 @@ int spider_db_init(
spider_udf_table_mon_list_hash[roop_count].array.size_of_element); 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 #ifndef WITHOUT_SPIDER_BG_SEARCH
if (!(spider_table_sts_threads = (SPIDER_THREAD *) if (!(spider_table_sts_threads = (SPIDER_THREAD *)
spider_bulk_malloc(NULL, 256, MYF(MY_WME | MY_ZEROFILL), spider_bulk_malloc(NULL, 256, MYF(MY_WME | MY_ZEROFILL),
...@@ -7791,6 +7772,7 @@ int spider_db_init( ...@@ -7791,6 +7772,7 @@ int spider_db_init(
NullS)) NullS))
) )
goto error_alloc_mon_mutxes; goto error_alloc_mon_mutxes;
spider_table_sts_threads[0].init_command = TRUE;
for (roop_count = 0; for (roop_count = 0;
roop_count < (int) spider_param_table_sts_thread_count(); roop_count < (int) spider_param_table_sts_thread_count();
...@@ -7881,7 +7863,6 @@ int spider_db_init( ...@@ -7881,7 +7863,6 @@ int spider_db_init(
error_init_udf_table_mon_cond: error_init_udf_table_mon_cond:
for (; roop_count >= 0; roop_count--) for (; roop_count >= 0; roop_count--)
pthread_cond_destroy(&spider_udf_table_mon_conds[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; roop_count = spider_param_udf_table_mon_mutex_count() - 1;
error_init_udf_table_mon_mutex: error_init_udf_table_mon_mutex:
for (; roop_count >= 0; roop_count--) for (; roop_count >= 0; roop_count--)
...@@ -10497,6 +10478,57 @@ void *spider_table_bg_sts_action( ...@@ -10497,6 +10478,57 @@ void *spider_table_bg_sts_action(
trx->thd = thd; trx->thd = thd;
/* init end */ /* 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)
{
do
{
struct timespec abstime;
set_timespec_nsec(abstime, 1000);
error_num = pthread_cond_timedwait(spd_COND_server_started,
spd_LOCK_server_started, &abstime);
} while (
(error_num == ETIMEDOUT || error_num == ETIME) &&
!(*spd_mysqld_server_started) && !thd->killed && !thread->killed
);
}
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 && !thread->killed)
{
dispatch_command(COM_QUERY, thd, spider_init_queries[i].str,
(uint) spider_init_queries[i].length);
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) if (thd->killed)
{ {
thread->killed = TRUE; thread->killed = TRUE;
......
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