Commit 3e206a51 authored by Sergei Golubchik's avatar Sergei Golubchik

Merge branch 'kentoku/10.0' into 10.0

parents 6b4cc43f 14eea2f8
This diff is collapsed.
/* Copyright (C) 2008-2014 Kentoku Shiba /* Copyright (C) 2008-2015 Kentoku Shiba
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -738,6 +738,7 @@ public: ...@@ -738,6 +738,7 @@ public:
void set_ft_discard_bitmap(); void set_ft_discard_bitmap();
void set_searched_bitmap(); void set_searched_bitmap();
void set_clone_searched_bitmap(); void set_clone_searched_bitmap();
void set_searched_bitmap_from_item_list();
void set_select_column_mode(); void set_select_column_mode();
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
void check_select_column(bool rnd); void check_select_column(bool rnd);
......
/* Copyright (C) 2008-2014 Kentoku Shiba /* Copyright (C) 2008-2015 Kentoku Shiba
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -662,6 +662,7 @@ SPIDER_CONN *spider_create_conn( ...@@ -662,6 +662,7 @@ SPIDER_CONN *spider_create_conn(
spider_conn_queue_connect(share, conn, link_idx); spider_conn_queue_connect(share, conn, link_idx);
conn->ping_time = (time_t) time((time_t*) 0); conn->ping_time = (time_t) time((time_t*) 0);
conn->connect_error_time = conn->ping_time;
pthread_mutex_lock(&spider_conn_id_mutex); pthread_mutex_lock(&spider_conn_id_mutex);
conn->conn_id = spider_conn_id; conn->conn_id = spider_conn_id;
++spider_conn_id; ++spider_conn_id;
...@@ -1085,6 +1086,17 @@ SPIDER_CONN *spider_get_conn( ...@@ -1085,6 +1086,17 @@ SPIDER_CONN *spider_get_conn(
} }
conn->link_idx = base_link_idx; conn->link_idx = base_link_idx;
if (conn->queued_connect)
spider_conn_queue_connect_rewrite(share, conn, link_idx);
if (conn->queued_ping)
{
if (spider)
spider_conn_queue_ping_rewrite(spider, conn, base_link_idx);
else
conn->queued_ping = FALSE;
}
DBUG_PRINT("info",("spider conn=%p", conn)); DBUG_PRINT("info",("spider conn=%p", conn));
DBUG_RETURN(conn); DBUG_RETURN(conn);
...@@ -1195,8 +1207,10 @@ void spider_conn_queue_connect( ...@@ -1195,8 +1207,10 @@ void spider_conn_queue_connect(
DBUG_ENTER("spider_conn_queue_connect"); DBUG_ENTER("spider_conn_queue_connect");
DBUG_PRINT("info", ("spider conn=%p", conn)); DBUG_PRINT("info", ("spider conn=%p", conn));
conn->queued_connect = TRUE; conn->queued_connect = TRUE;
/*
conn->queued_connect_share = share; conn->queued_connect_share = share;
conn->queued_connect_link_idx = link_idx; conn->queued_connect_link_idx = link_idx;
*/
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
...@@ -1225,6 +1239,18 @@ void spider_conn_queue_ping( ...@@ -1225,6 +1239,18 @@ void spider_conn_queue_ping(
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
void spider_conn_queue_ping_rewrite(
ha_spider *spider,
SPIDER_CONN *conn,
int link_idx
) {
DBUG_ENTER("spider_conn_queue_ping_rewrite");
DBUG_PRINT("info", ("spider conn=%p", conn));
conn->queued_ping_spider = spider;
conn->queued_ping_link_idx = link_idx;
DBUG_VOID_RETURN;
}
void spider_conn_queue_trx_isolation( void spider_conn_queue_trx_isolation(
SPIDER_CONN *conn, SPIDER_CONN *conn,
int trx_isolation int trx_isolation
...@@ -1285,6 +1311,7 @@ void spider_conn_queue_start_transaction( ...@@ -1285,6 +1311,7 @@ void spider_conn_queue_start_transaction(
) { ) {
DBUG_ENTER("spider_conn_queue_start_transaction"); DBUG_ENTER("spider_conn_queue_start_transaction");
DBUG_PRINT("info", ("spider conn=%p", conn)); DBUG_PRINT("info", ("spider conn=%p", conn));
DBUG_ASSERT(!conn->trx_start);
conn->queued_trx_start = TRUE; conn->queued_trx_start = TRUE;
conn->trx_start = TRUE; conn->trx_start = TRUE;
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
...@@ -1325,7 +1352,11 @@ void spider_conn_clear_queue_at_commit( ...@@ -1325,7 +1352,11 @@ void spider_conn_clear_queue_at_commit(
) { ) {
DBUG_ENTER("spider_conn_clear_queue_at_commit"); DBUG_ENTER("spider_conn_clear_queue_at_commit");
DBUG_PRINT("info", ("spider conn=%p", conn)); DBUG_PRINT("info", ("spider conn=%p", conn));
conn->queued_trx_start = FALSE; if (conn->queued_trx_start)
{
conn->queued_trx_start = FALSE;
conn->trx_start = FALSE;
}
conn->queued_xa_start = FALSE; conn->queued_xa_start = FALSE;
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
...@@ -2280,6 +2311,13 @@ void *spider_bg_conn_action( ...@@ -2280,6 +2311,13 @@ void *spider_bg_conn_action(
thd->clear_error(); thd->clear_error();
pthread_cond_wait(&conn->bg_conn_cond, &conn->bg_conn_mutex); pthread_cond_wait(&conn->bg_conn_cond, &conn->bg_conn_mutex);
DBUG_PRINT("info",("spider bg roop start")); DBUG_PRINT("info",("spider bg roop start"));
#ifndef DBUG_OFF
DBUG_PRINT("info",("spider conn->thd=%p", conn->thd));
if (conn->thd)
{
DBUG_PRINT("info",("spider query_id=%lld", conn->thd->query_id));
}
#endif
if (conn->bg_caller_sync_wait) if (conn->bg_caller_sync_wait)
{ {
pthread_mutex_lock(&conn->bg_conn_sync_mutex); pthread_mutex_lock(&conn->bg_conn_sync_mutex);
...@@ -2925,6 +2963,7 @@ void *spider_bg_sts_action( ...@@ -2925,6 +2963,7 @@ void *spider_bg_sts_action(
0, 0,
share->monitoring_kind[spider.search_link_idx], share->monitoring_kind[spider.search_link_idx],
share->monitoring_limit[spider.search_link_idx], share->monitoring_limit[spider.search_link_idx],
share->monitoring_flag[spider.search_link_idx],
TRUE TRUE
); );
lex_end(thd->lex); lex_end(thd->lex);
...@@ -2934,6 +2973,7 @@ void *spider_bg_sts_action( ...@@ -2934,6 +2973,7 @@ void *spider_bg_sts_action(
} }
if (spider.search_link_idx != -1 && conns[spider.search_link_idx]) if (spider.search_link_idx != -1 && conns[spider.search_link_idx])
{ {
DBUG_ASSERT(!conns[spider.search_link_idx]->thd);
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
if (spider_get_sts(share, spider.search_link_idx, if (spider_get_sts(share, spider.search_link_idx,
share->bg_sts_try_time, &spider, share->bg_sts_try_time, &spider,
...@@ -2965,6 +3005,7 @@ void *spider_bg_sts_action( ...@@ -2965,6 +3005,7 @@ void *spider_bg_sts_action(
0, 0,
share->monitoring_kind[spider.search_link_idx], share->monitoring_kind[spider.search_link_idx],
share->monitoring_limit[spider.search_link_idx], share->monitoring_limit[spider.search_link_idx],
share->monitoring_flag[spider.search_link_idx],
TRUE TRUE
); );
lex_end(thd->lex); lex_end(thd->lex);
...@@ -3317,6 +3358,7 @@ void *spider_bg_crd_action( ...@@ -3317,6 +3358,7 @@ void *spider_bg_crd_action(
0, 0,
share->monitoring_kind[spider.search_link_idx], share->monitoring_kind[spider.search_link_idx],
share->monitoring_limit[spider.search_link_idx], share->monitoring_limit[spider.search_link_idx],
share->monitoring_flag[spider.search_link_idx],
TRUE TRUE
); );
lex_end(thd->lex); lex_end(thd->lex);
...@@ -3326,6 +3368,7 @@ void *spider_bg_crd_action( ...@@ -3326,6 +3368,7 @@ void *spider_bg_crd_action(
} }
if (spider.search_link_idx != -1 && conns[spider.search_link_idx]) if (spider.search_link_idx != -1 && conns[spider.search_link_idx])
{ {
DBUG_ASSERT(!conns[spider.search_link_idx]->thd);
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
if (spider_get_crd(share, spider.search_link_idx, if (spider_get_crd(share, spider.search_link_idx,
share->bg_crd_try_time, &spider, &table, share->bg_crd_try_time, &spider, &table,
...@@ -3357,6 +3400,7 @@ void *spider_bg_crd_action( ...@@ -3357,6 +3400,7 @@ void *spider_bg_crd_action(
0, 0,
share->monitoring_kind[spider.search_link_idx], share->monitoring_kind[spider.search_link_idx],
share->monitoring_limit[spider.search_link_idx], share->monitoring_limit[spider.search_link_idx],
share->monitoring_flag[spider.search_link_idx],
TRUE TRUE
); );
lex_end(thd->lex); lex_end(thd->lex);
...@@ -3714,6 +3758,7 @@ void *spider_bg_mon_action( ...@@ -3714,6 +3758,7 @@ void *spider_bg_mon_action(
0, 0,
share->monitoring_bg_kind[link_idx], share->monitoring_bg_kind[link_idx],
share->monitoring_limit[link_idx], share->monitoring_limit[link_idx],
share->monitoring_bg_flag[link_idx],
TRUE TRUE
); );
lex_end(thd->lex); lex_end(thd->lex);
......
...@@ -100,6 +100,12 @@ void spider_conn_queue_ping( ...@@ -100,6 +100,12 @@ void spider_conn_queue_ping(
int link_idx int link_idx
); );
void spider_conn_queue_ping_rewrite(
ha_spider *spider,
SPIDER_CONN *conn,
int link_idx
);
void spider_conn_queue_trx_isolation( void spider_conn_queue_trx_isolation(
SPIDER_CONN *conn, SPIDER_CONN *conn,
int trx_isolation int trx_isolation
......
...@@ -1032,36 +1032,47 @@ long long spider_copy_tables_body( ...@@ -1032,36 +1032,47 @@ long long spider_copy_tables_body(
else else
copy_tables->access_charset = system_charset_info; copy_tables->access_charset = system_charset_info;
src_tbl_conn = copy_tables->table_conn[0]; bulk_insert_rows = spider_param_udf_ct_bulk_insert_rows(
select_ct = src_tbl_conn->copy_table; copy_tables->bulk_insert_rows);
src_tbl_conn->share->access_charset = copy_tables->access_charset; for (src_tbl_conn = copy_tables->table_conn[0]; src_tbl_conn;
select_ct->set_sql_charset(copy_tables->access_charset); src_tbl_conn = src_tbl_conn->next)
if ( {
select_ct->append_select_str() || select_ct = src_tbl_conn->copy_table;
select_ct->append_table_columns(table_share) src_tbl_conn->share->access_charset = copy_tables->access_charset;
) { select_ct->set_sql_charset(copy_tables->access_charset);
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM); if (
goto error; select_ct->append_select_str() ||
} select_ct->append_table_columns(table_share)
) {
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
goto error;
}
if ( if (
select_ct->append_from_str() || select_ct->append_from_str() ||
select_ct->append_table_name(0) select_ct->append_table_name(0)
) { ) {
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM); my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
goto error; goto error;
} }
select_ct->set_sql_pos(); select_ct->set_sql_pos();
bulk_insert_rows = spider_param_udf_ct_bulk_insert_rows( if (
copy_tables->bulk_insert_rows); select_ct->append_key_order_str(key_info, 0, FALSE) ||
if ( select_ct->append_limit(0, bulk_insert_rows)
select_ct->append_key_order_str(key_info, 0, FALSE) || ) {
select_ct->append_limit(0, bulk_insert_rows) my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
) { goto error;
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM); }
goto error;
if (
copy_tables->use_transaction &&
select_ct->append_select_lock_str(SPIDER_LOCK_MODE_SHARED)
) {
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
goto error;
}
} }
for (dst_tbl_conn = copy_tables->table_conn[1]; dst_tbl_conn; for (dst_tbl_conn = copy_tables->table_conn[1]; dst_tbl_conn;
...@@ -1188,14 +1199,6 @@ long long spider_copy_tables_body( ...@@ -1188,14 +1199,6 @@ long long spider_copy_tables_body(
table_conn->spider = tmp_spider; table_conn->spider = tmp_spider;
} }
if (
copy_tables->use_transaction &&
select_ct->append_select_lock_str(SPIDER_LOCK_MODE_SHARED)
) {
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
goto error;
}
if ((error_num = spider_db_udf_copy_tables(copy_tables, spider, table, if ((error_num = spider_db_udf_copy_tables(copy_tables, spider, table,
bulk_insert_rows))) bulk_insert_rows)))
goto error_db_udf_copy_tables; goto error_db_udf_copy_tables;
......
This diff is collapsed.
/* Copyright (C) 2008-2014 Kentoku Shiba /* Copyright (C) 2008-2015 Kentoku Shiba
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -93,7 +93,7 @@ ...@@ -93,7 +93,7 @@
#define SPIDER_SQL_LIMIT_LEN (sizeof(SPIDER_SQL_LIMIT_STR) - 1) #define SPIDER_SQL_LIMIT_LEN (sizeof(SPIDER_SQL_LIMIT_STR) - 1)
#define SPIDER_SQL_INTO_STR "into " #define SPIDER_SQL_INTO_STR "into "
#define SPIDER_SQL_INTO_LEN (sizeof(SPIDER_SQL_INTO_STR) - 1) #define SPIDER_SQL_INTO_LEN (sizeof(SPIDER_SQL_INTO_STR) - 1)
#define SPIDER_SQL_VALUES_STR ")values" #define SPIDER_SQL_VALUES_STR "values"
#define SPIDER_SQL_VALUES_LEN (sizeof(SPIDER_SQL_VALUES_STR) - 1) #define SPIDER_SQL_VALUES_LEN (sizeof(SPIDER_SQL_VALUES_STR) - 1)
#define SPIDER_SQL_SHARED_LOCK_STR " lock in share mode" #define SPIDER_SQL_SHARED_LOCK_STR " lock in share mode"
#define SPIDER_SQL_SHARED_LOCK_LEN (sizeof(SPIDER_SQL_SHARED_LOCK_STR) - 1) #define SPIDER_SQL_SHARED_LOCK_LEN (sizeof(SPIDER_SQL_SHARED_LOCK_STR) - 1)
...@@ -197,6 +197,25 @@ ...@@ -197,6 +197,25 @@
#define SPIDER_SQL_MINUS_STR " - " #define SPIDER_SQL_MINUS_STR " - "
#define SPIDER_SQL_MINUS_LEN (sizeof(SPIDER_SQL_MINUS_STR) - 1) #define SPIDER_SQL_MINUS_LEN (sizeof(SPIDER_SQL_MINUS_STR) - 1)
#define SPIDER_SQL_YEAR_STR "year"
#define SPIDER_SQL_YEAR_LEN (sizeof(SPIDER_SQL_YEAR_STR) - 1)
#define SPIDER_SQL_QUARTER_STR "quarter"
#define SPIDER_SQL_QUARTER_LEN (sizeof(SPIDER_SQL_QUARTER_STR) - 1)
#define SPIDER_SQL_MONTH_STR "month"
#define SPIDER_SQL_MONTH_LEN (sizeof(SPIDER_SQL_MONTH_STR) - 1)
#define SPIDER_SQL_WEEK_STR "week"
#define SPIDER_SQL_WEEK_LEN (sizeof(SPIDER_SQL_WEEK_STR) - 1)
#define SPIDER_SQL_DAY_STR "day"
#define SPIDER_SQL_DAY_LEN (sizeof(SPIDER_SQL_DAY_STR) - 1)
#define SPIDER_SQL_HOUR_STR "hour"
#define SPIDER_SQL_HOUR_LEN (sizeof(SPIDER_SQL_HOUR_STR) - 1)
#define SPIDER_SQL_MINUTE_STR "minute"
#define SPIDER_SQL_MINUTE_LEN (sizeof(SPIDER_SQL_MINUTE_STR) - 1)
#define SPIDER_SQL_SECOND_STR "second"
#define SPIDER_SQL_SECOND_LEN (sizeof(SPIDER_SQL_SECOND_STR) - 1)
#define SPIDER_SQL_MICROSECOND_STR "microsecond"
#define SPIDER_SQL_MICROSECOND_LEN (sizeof(SPIDER_SQL_MICROSECOND_STR) - 1)
#define SPIDER_SQL_SHOW_RECORDS_STR "select count(*) from " #define SPIDER_SQL_SHOW_RECORDS_STR "select count(*) from "
#define SPIDER_SQL_SHOW_RECORDS_LEN sizeof(SPIDER_SQL_SHOW_RECORDS_STR) - 1 #define SPIDER_SQL_SHOW_RECORDS_LEN sizeof(SPIDER_SQL_SHOW_RECORDS_STR) - 1
#define SPIDER_SQL_SHOW_INDEX_STR "show index from " #define SPIDER_SQL_SHOW_INDEX_STR "show index from "
...@@ -234,8 +253,9 @@ ...@@ -234,8 +253,9 @@
#define SPIDER_SQL_INT_LEN 20 #define SPIDER_SQL_INT_LEN 20
#define SPIDER_SQL_HANDLER_CID_LEN 6 #define SPIDER_SQL_HANDLER_CID_LEN 6
#define SPIDER_SQL_HANDLER_CID_FORMAT "t%05u" #define SPIDER_SQL_HANDLER_CID_FORMAT "t%05u"
#define SPIDER_UDF_PING_TABLE_PING_ONLY (1 << 0) #define SPIDER_UDF_PING_TABLE_PING_ONLY (1 << 0)
#define SPIDER_UDF_PING_TABLE_USE_WHERE (1 << 1) #define SPIDER_UDF_PING_TABLE_USE_WHERE (1 << 1)
#define SPIDER_UDF_PING_TABLE_USE_ALL_MONITORING_NODES (1 << 2)
int spider_db_connect( int spider_db_connect(
const SPIDER_SHARE *share, const SPIDER_SHARE *share,
...@@ -887,6 +907,15 @@ int spider_db_open_item_cache( ...@@ -887,6 +907,15 @@ int spider_db_open_item_cache(
uint dbton_id uint dbton_id
); );
int spider_db_open_item_insert_value(
Item_insert_value *item_insert_value,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
uint dbton_id
);
int spider_db_append_condition( int spider_db_append_condition(
ha_spider *spider, ha_spider *spider,
const char *alias, const char *alias,
......
...@@ -2786,7 +2786,11 @@ int spider_db_handlersocket_util::open_item_func( ...@@ -2786,7 +2786,11 @@ int spider_db_handlersocket_util::open_item_func(
{ {
if ( if (
!strncasecmp("rand", func_name, func_name_length) && !strncasecmp("rand", func_name, func_name_length) &&
#ifdef SPIDER_Item_args_arg_count_IS_PROTECTED
!item_func->argument_count()
#else
!item_func->arg_count !item_func->arg_count
#endif
) { ) {
if (str) if (str)
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
...@@ -2946,13 +2950,99 @@ int spider_db_handlersocket_util::open_item_func( ...@@ -2946,13 +2950,99 @@ int spider_db_handlersocket_util::open_item_func(
last_str_length = SPIDER_SQL_AS_TIME_LEN; last_str_length = SPIDER_SQL_AS_TIME_LEN;
break; break;
} }
} else if (func_name_length == 13 && } else if (func_name_length == 13)
!strncasecmp("utc_timestamp", func_name, func_name_length) {
) { if (!strncasecmp("utc_timestamp", func_name, func_name_length))
if (str) {
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); if (str)
DBUG_RETURN(spider_db_open_item_string(item_func, spider, str, str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
alias, alias_length, dbton_id)); DBUG_RETURN(spider_db_open_item_string(item_func, spider, str,
alias, alias_length, dbton_id));
} else if (!strncasecmp("timestampdiff", func_name, func_name_length))
{
#ifdef ITEM_FUNC_TIMESTAMPDIFF_ARE_PUBLIC
Item_func_timestamp_diff *item_func_timestamp_diff =
(Item_func_timestamp_diff *) item_func;
if (str)
{
const char *interval_str;
uint interval_len;
switch (item_func_timestamp_diff->int_type)
{
case INTERVAL_YEAR:
interval_str = SPIDER_SQL_YEAR_STR;
interval_len = SPIDER_SQL_YEAR_LEN;
break;
case INTERVAL_QUARTER:
interval_str = SPIDER_SQL_QUARTER_STR;
interval_len = SPIDER_SQL_QUARTER_LEN;
break;
case INTERVAL_MONTH:
interval_str = SPIDER_SQL_MONTH_STR;
interval_len = SPIDER_SQL_MONTH_LEN;
break;
case INTERVAL_WEEK:
interval_str = SPIDER_SQL_WEEK_STR;
interval_len = SPIDER_SQL_WEEK_LEN;
break;
case INTERVAL_DAY:
interval_str = SPIDER_SQL_DAY_STR;
interval_len = SPIDER_SQL_DAY_LEN;
break;
case INTERVAL_HOUR:
interval_str = SPIDER_SQL_HOUR_STR;
interval_len = SPIDER_SQL_HOUR_LEN;
break;
case INTERVAL_MINUTE:
interval_str = SPIDER_SQL_MINUTE_STR;
interval_len = SPIDER_SQL_MINUTE_LEN;
break;
case INTERVAL_SECOND:
interval_str = SPIDER_SQL_SECOND_STR;
interval_len = SPIDER_SQL_SECOND_LEN;
break;
case INTERVAL_MICROSECOND:
interval_str = SPIDER_SQL_MICROSECOND_STR;
interval_len = SPIDER_SQL_MICROSECOND_LEN;
break;
default:
interval_str = "";
interval_len = 0;
break;
}
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN +
interval_len + SPIDER_SQL_COMMA_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(func_name, func_name_length);
str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
str->q_append(interval_str, interval_len);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
}
if ((error_num = spider_db_print_item_type(item_list[0], spider,
str, alias, alias_length, dbton_id)))
DBUG_RETURN(error_num);
if (str)
{
if (str->reserve(SPIDER_SQL_COMMA_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
}
if ((error_num = spider_db_print_item_type(item_list[1], spider,
str, alias, alias_length, dbton_id)))
DBUG_RETURN(error_num);
if (str)
{
if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
SPIDER_SQL_CLOSE_PAREN_LEN);
}
DBUG_RETURN(0);
#else
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
#endif
}
} else if (func_name_length == 14) } else if (func_name_length == 14)
{ {
if (!strncasecmp("cast_as_binary", func_name, func_name_length)) if (!strncasecmp("cast_as_binary", func_name, func_name_length))
...@@ -3142,6 +3232,54 @@ int spider_db_handlersocket_util::open_item_func( ...@@ -3142,6 +3232,54 @@ int spider_db_handlersocket_util::open_item_func(
} }
break; break;
case Item_func::NOT_FUNC: case Item_func::NOT_FUNC:
DBUG_PRINT("info",("spider NOT_FUNC"));
if (item_list[0]->type() == Item::COND_ITEM)
{
DBUG_PRINT("info",("spider item_list[0] is COND_ITEM"));
Item_cond *item_cond = (Item_cond *) item_list[0];
if (item_cond->functype() == Item_func::COND_AND_FUNC)
{
DBUG_PRINT("info",("spider item_cond is COND_AND_FUNC"));
List_iterator_fast<Item> lif(*(item_cond->argument_list()));
bool has_expr_cache_item = FALSE;
bool has_isnotnull_func = FALSE;
bool has_other_item = FALSE;
while((item = lif++))
{
if (
item->type() == Item::EXPR_CACHE_ITEM
) {
DBUG_PRINT("info",("spider EXPR_CACHE_ITEM"));
has_expr_cache_item = TRUE;
} else if (
item->type() == Item::FUNC_ITEM &&
((Item_func *) item)->functype() == Item_func::ISNOTNULL_FUNC
) {
DBUG_PRINT("info",("spider ISNOTNULL_FUNC"));
has_isnotnull_func = TRUE;
} else {
DBUG_PRINT("info",("spider has other item"));
DBUG_PRINT("info",("spider COND type=%d", item->type()));
has_other_item = TRUE;
}
}
if (has_expr_cache_item && has_isnotnull_func && !has_other_item)
{
DBUG_PRINT("info",("spider NOT EXISTS skip"));
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
}
}
}
if (str)
{
func_name = (char*) item_func->func_name();
func_name_length = strlen(func_name);
if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(func_name, func_name_length);
str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
}
break;
case Item_func::NEG_FUNC: case Item_func::NEG_FUNC:
if (str) if (str)
{ {
...@@ -3494,8 +3632,7 @@ int spider_db_handlersocket_util::append_escaped_util( ...@@ -3494,8 +3632,7 @@ int spider_db_handlersocket_util::append_escaped_util(
) { ) {
DBUG_ENTER("spider_db_handlersocket_util::append_escaped_util"); DBUG_ENTER("spider_db_handlersocket_util::append_escaped_util");
DBUG_PRINT("info",("spider this=%p", this)); DBUG_PRINT("info",("spider this=%p", this));
if (to->append_for_single_quote(from)) to->append_escape_string(from->ptr(), from->length());
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
DBUG_RETURN(0); DBUG_RETURN(0);
} }
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#define SPIDER_HAS_APPEND_FOR_SINGLE_QUOTE #define SPIDER_HAS_APPEND_FOR_SINGLE_QUOTE
#define SPIDER_HAS_SHOW_SIMPLE_FUNC #define SPIDER_HAS_SHOW_SIMPLE_FUNC
#define SPIDER_HAS_JT_HASH_INDEX_MERGE #define SPIDER_HAS_JT_HASH_INDEX_MERGE
#define SPIDER_HAS_EXPR_CACHE_ITEM
#else #else
#define SPIDER_NEED_CHECK_CONDITION_AT_CHECKING_DIRECT_ORDER_LIMIT #define SPIDER_NEED_CHECK_CONDITION_AT_CHECKING_DIRECT_ORDER_LIMIT
#endif #endif
...@@ -41,6 +42,9 @@ ...@@ -41,6 +42,9 @@
#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100014 #if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100014
#define SPIDER_ITEM_STRING_WITHOUT_SET_STR_WITH_COPY #define SPIDER_ITEM_STRING_WITHOUT_SET_STR_WITH_COPY
#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100100
#define SPIDER_ITEM_STRING_WITHOUT_SET_STR_WITH_COPY_AND_THDPTR
#endif
#endif #endif
#if defined(MARIADB_BASE_VERSION) #if defined(MARIADB_BASE_VERSION)
...@@ -501,6 +505,10 @@ public: ...@@ -501,6 +505,10 @@ public:
uint32 arg_length, uint32 arg_length,
uint32 step_alloc uint32 step_alloc
); );
void append_escape_string(
const char *st,
uint len
);
bool append_for_single_quote( bool append_for_single_quote(
const char *st, const char *st,
uint len uint len
......
This diff is collapsed.
This diff is collapsed.
/* Copyright (C) 2009-2014 Kentoku Shiba /* Copyright (C) 2009-2015 Kentoku Shiba
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -557,6 +557,7 @@ SPIDER_CONN *spider_udf_direct_sql_create_conn( ...@@ -557,6 +557,7 @@ SPIDER_CONN *spider_udf_direct_sql_create_conn(
if ((*error_num = spider_db_udf_direct_sql_connect(direct_sql, conn))) if ((*error_num = spider_db_udf_direct_sql_connect(direct_sql, conn)))
goto error; goto error;
conn->ping_time = (time_t) time((time_t*) 0); conn->ping_time = (time_t) time((time_t*) 0);
conn->connect_error_time = conn->ping_time;
DBUG_RETURN(conn); DBUG_RETURN(conn);
...@@ -761,6 +762,16 @@ SPIDER_CONN *spider_udf_direct_sql_get_conn( ...@@ -761,6 +762,16 @@ SPIDER_CONN *spider_udf_direct_sql_get_conn(
#endif #endif
} }
if (conn->queued_connect)
{
if ((*error_num = spider_db_udf_direct_sql_connect(direct_sql, conn)))
goto error;
conn->queued_connect = FALSE;
}
if (conn->queued_ping)
conn->queued_ping = FALSE;
DBUG_PRINT("info",("spider conn=%p", conn)); DBUG_PRINT("info",("spider conn=%p", conn));
DBUG_PRINT("info",("spider conn->conn_kind=%u", conn->conn_kind)); DBUG_PRINT("info",("spider conn->conn_kind=%u", conn->conn_kind));
DBUG_RETURN(conn); DBUG_RETURN(conn);
......
...@@ -63,6 +63,8 @@ ...@@ -63,6 +63,8 @@
#define ER_SPIDER_REQUEST_KEY_STR "Request key not found" #define ER_SPIDER_REQUEST_KEY_STR "Request key not found"
#define ER_SPIDER_CANT_OPEN_SYS_TABLE_NUM 12524 #define ER_SPIDER_CANT_OPEN_SYS_TABLE_NUM 12524
#define ER_SPIDER_CANT_OPEN_SYS_TABLE_STR "Can't open system table %s.%s" #define ER_SPIDER_CANT_OPEN_SYS_TABLE_STR "Can't open system table %s.%s"
#define ER_SPIDER_LINK_MON_JUST_NG_NUM 12525
#define ER_SPIDER_LINK_MON_JUST_NG_STR "Table '%s.%s' just got a problem"
#define ER_SPIDER_CANT_USE_BOTH_INNER_XA_AND_SNAPSHOT_NUM 12601 #define ER_SPIDER_CANT_USE_BOTH_INNER_XA_AND_SNAPSHOT_NUM 12601
#define ER_SPIDER_CANT_USE_BOTH_INNER_XA_AND_SNAPSHOT_STR "Can't use both spider_use_consistent_snapshot = 1 and spider_internal_xa = 1" #define ER_SPIDER_CANT_USE_BOTH_INNER_XA_AND_SNAPSHOT_STR "Can't use both spider_use_consistent_snapshot = 1 and spider_internal_xa = 1"
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#define SPIDER_DETAIL_VERSION "3.2.21" #define SPIDER_DETAIL_VERSION "3.2.37"
#define SPIDER_HEX_VERSION 0x0302 #define SPIDER_HEX_VERSION 0x0302
#if MYSQL_VERSION_ID < 50500 #if MYSQL_VERSION_ID < 50500
...@@ -117,6 +117,18 @@ ...@@ -117,6 +117,18 @@
#define SPIDER_TEST(A) test(A) #define SPIDER_TEST(A) test(A)
#endif #endif
#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100100
#define SPIDER_FIELD_FIELDPTR_REQUIRES_THDPTR
#define SPIDER_ENGINE_CONDITION_PUSHDOWN_IS_ALWAYS_ON
#define SPIDER_XID_USES_xid_cache_iterate
#else
#define SPIDER_XID_STATE_HAS_in_thd
#endif
#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100108
#define SPIDER_Item_args_arg_count_IS_PROTECTED
#endif
#if MYSQL_VERSION_ID >= 50500 #if MYSQL_VERSION_ID >= 50500
#define SPIDER_HAS_HASH_VALUE_TYPE #define SPIDER_HAS_HASH_VALUE_TYPE
#endif #endif
...@@ -141,7 +153,7 @@ ...@@ -141,7 +153,7 @@
#define SPIDER_TMP_SHARE_CHAR_PTR_COUNT 19 #define SPIDER_TMP_SHARE_CHAR_PTR_COUNT 19
#define SPIDER_TMP_SHARE_UINT_COUNT 17 #define SPIDER_TMP_SHARE_UINT_COUNT 17
#define SPIDER_TMP_SHARE_LONG_COUNT 16 #define SPIDER_TMP_SHARE_LONG_COUNT 18
#define SPIDER_TMP_SHARE_LONGLONG_COUNT 3 #define SPIDER_TMP_SHARE_LONGLONG_COUNT 3
#define SPIDER_MEM_CALC_LIST_NUM 247 #define SPIDER_MEM_CALC_LIST_NUM 247
...@@ -436,6 +448,13 @@ typedef struct st_spider_conn ...@@ -436,6 +448,13 @@ typedef struct st_spider_conn
int bulk_access_error_num; int bulk_access_error_num;
st_spider_conn *bulk_access_next; st_spider_conn *bulk_access_next;
#endif #endif
bool connect_error_with_message;
char connect_error_msg[MYSQL_ERRMSG_SIZE];
int connect_error;
THD *connect_error_thd;
query_id_t connect_error_query_id;
time_t connect_error_time;
} SPIDER_CONN; } SPIDER_CONN;
typedef struct st_spider_lgtm_tblhnd_share typedef struct st_spider_lgtm_tblhnd_share
...@@ -656,6 +675,7 @@ typedef struct st_spider_share ...@@ -656,6 +675,7 @@ typedef struct st_spider_share
volatile bool init_error; volatile bool init_error;
volatile time_t init_error_time; volatile time_t init_error_time;
volatile bool link_status_init; volatile bool link_status_init;
uchar *table_mon_mutex_bitmap;
volatile bool sts_init; volatile bool sts_init;
volatile time_t sts_get_time; volatile time_t sts_get_time;
#ifndef WITHOUT_SPIDER_BG_SEARCH #ifndef WITHOUT_SPIDER_BG_SEARCH
...@@ -844,8 +864,10 @@ typedef struct st_spider_share ...@@ -844,8 +864,10 @@ typedef struct st_spider_share
long *tgt_ssl_vscs; long *tgt_ssl_vscs;
long *link_statuses; long *link_statuses;
#ifndef WITHOUT_SPIDER_BG_SEARCH #ifndef WITHOUT_SPIDER_BG_SEARCH
long *monitoring_bg_flag;
long *monitoring_bg_kind; long *monitoring_bg_kind;
#endif #endif
long *monitoring_flag;
long *monitoring_kind; long *monitoring_kind;
#ifndef WITHOUT_SPIDER_BG_SEARCH #ifndef WITHOUT_SPIDER_BG_SEARCH
longlong *monitoring_bg_interval; longlong *monitoring_bg_interval;
...@@ -948,8 +970,10 @@ typedef struct st_spider_share ...@@ -948,8 +970,10 @@ typedef struct st_spider_share
uint tgt_ssl_vscs_length; uint tgt_ssl_vscs_length;
uint link_statuses_length; uint link_statuses_length;
#ifndef WITHOUT_SPIDER_BG_SEARCH #ifndef WITHOUT_SPIDER_BG_SEARCH
uint monitoring_bg_flag_length;
uint monitoring_bg_kind_length; uint monitoring_bg_kind_length;
#endif #endif
uint monitoring_flag_length;
uint monitoring_kind_length; uint monitoring_kind_length;
#ifndef WITHOUT_SPIDER_BG_SEARCH #ifndef WITHOUT_SPIDER_BG_SEARCH
uint monitoring_bg_interval_length; uint monitoring_bg_interval_length;
...@@ -1239,8 +1263,12 @@ typedef struct st_spider_int_hld ...@@ -1239,8 +1263,12 @@ typedef struct st_spider_int_hld
typedef struct st_spider_item_hld typedef struct st_spider_item_hld
{ {
uint tgt_num; uint tgt_num;
Item *item; Item *item;
#ifdef SPIDER_ITEM_STRING_WITHOUT_SET_STR_WITH_COPY_AND_THDPTR
bool init_mem_root;
MEM_ROOT mem_root;
#endif
st_spider_item_hld *next; st_spider_item_hld *next;
} SPIDER_ITEM_HLD; } SPIDER_ITEM_HLD;
......
...@@ -1222,6 +1222,20 @@ bool spider_string::append( ...@@ -1222,6 +1222,20 @@ bool spider_string::append(
DBUG_RETURN(res); DBUG_RETURN(res);
} }
void spider_string::append_escape_string(
const char *st,
uint len
) {
DBUG_ENTER("spider_string::append_escape_string");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_ASSERT(mem_calc_inited);
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
current_alloc_mem == str.alloced_length());
str.length(str.length() + escape_string_for_mysql(
str.charset(), (char *) str.ptr() + str.length(), 0, st, len));
DBUG_VOID_RETURN;
}
bool spider_string::append_for_single_quote( bool spider_string::append_for_single_quote(
const char *st, const char *st,
uint len uint len
......
/* Copyright (C) 2008-2014 Kentoku Shiba /* Copyright (C) 2008-2015 Kentoku Shiba
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -178,6 +178,29 @@ my_bool spider_param_connect_mutex() ...@@ -178,6 +178,29 @@ my_bool spider_param_connect_mutex()
DBUG_RETURN(spider_connect_mutex); DBUG_RETURN(spider_connect_mutex);
} }
static uint spider_connect_error_interval;
/*
0-: interval
*/
static MYSQL_SYSVAR_UINT(
connect_error_interval,
spider_connect_error_interval,
PLUGIN_VAR_RQCMDARG,
"Return same error code until interval passes if connection is failed",
NULL,
NULL,
1,
0,
4294967295U,
0
);
uint spider_param_connect_error_interval()
{
DBUG_ENTER("spider_param_connect_error_interval");
DBUG_RETURN(spider_connect_error_interval);
}
static uint spider_table_init_error_interval; static uint spider_table_init_error_interval;
/* /*
0-: interval 0-: interval
...@@ -3120,6 +3143,7 @@ static struct st_mysql_sys_var* spider_system_variables[] = { ...@@ -3120,6 +3143,7 @@ static struct st_mysql_sys_var* spider_system_variables[] = {
MYSQL_SYSVAR(dry_access), MYSQL_SYSVAR(dry_access),
MYSQL_SYSVAR(delete_all_rows_type), MYSQL_SYSVAR(delete_all_rows_type),
MYSQL_SYSVAR(bka_table_name_type), MYSQL_SYSVAR(bka_table_name_type),
MYSQL_SYSVAR(connect_error_interval),
NULL NULL
}; };
......
/* Copyright (C) 2008-2014 Kentoku Shiba /* Copyright (C) 2008-2015 Kentoku Shiba
This program is free software); you can redistribute it and/or modify This program is free software); you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
my_bool spider_param_support_xa(); my_bool spider_param_support_xa();
my_bool spider_param_connect_mutex(); my_bool spider_param_connect_mutex();
uint spider_param_connect_error_interval();
uint spider_param_table_init_error_interval(); uint spider_param_table_init_error_interval();
int spider_param_use_table_charset( int spider_param_use_table_charset(
int use_table_charset int use_table_charset
......
/* Copyright (C) 2009-2014 Kentoku Shiba /* Copyright (C) 2009-2015 Kentoku Shiba
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -626,6 +626,17 @@ SPIDER_CONN *spider_get_ping_table_tgt_conn( ...@@ -626,6 +626,17 @@ SPIDER_CONN *spider_get_ping_table_tgt_conn(
*error_num = ER_CONNECT_TO_FOREIGN_DATA_SOURCE; *error_num = ER_CONNECT_TO_FOREIGN_DATA_SOURCE;
goto error; goto error;
} }
#ifndef DBUG_OFF
if (trx == spider_global_trx)
{
DBUG_ASSERT(!conn->thd);
}
DBUG_PRINT("info",("spider conn->thd=%p", conn->thd));
if (conn->thd)
{
DBUG_PRINT("info",("spider query_id=%lld", conn->thd->query_id));
}
#endif
conn->error_mode = 0; conn->error_mode = 0;
#ifndef WITHOUT_SPIDER_BG_SEARCH #ifndef WITHOUT_SPIDER_BG_SEARCH
if (trx == spider_global_trx) if (trx == spider_global_trx)
...@@ -992,37 +1003,56 @@ long long spider_ping_table_body( ...@@ -992,37 +1003,56 @@ long long spider_ping_table_body(
limit limit
)) ))
) { ) {
DBUG_PRINT("info",("spider table_mon_list->mon_status == SPIDER_LINK_MON_NG:%s",
table_mon_list->mon_status == SPIDER_LINK_MON_NG ? "TRUE" : "FALSE"));
DBUG_PRINT("info",("spider error_num=%d", error_num));
DBUG_PRINT("info",("spider tmp_error_num=%d", tmp_error_num));
if (tmp_error_num == HA_ERR_OUT_OF_MEM) if (tmp_error_num == HA_ERR_OUT_OF_MEM)
goto error_with_free_table_mon_list; goto error_with_free_table_mon_list;
else if(tmp_error_num) else if(tmp_error_num)
thd->clear_error(); thd->clear_error();
fault_count++; if (tmp_error_num != ER_CON_COUNT_ERROR)
error_num = 0;
if (fault_count > full_mon_count / 2)
{ {
mon_table_result->result_status = SPIDER_LINK_MON_NG; fault_count++;
DBUG_PRINT("info",("spider mon_table_result->result_status=SPIDER_LINK_MON_NG 2")); error_num = 0;
if (table_mon_list->mon_status != SPIDER_LINK_MON_NG) if (
{ !(flags & SPIDER_UDF_PING_TABLE_USE_ALL_MONITORING_NODES) &&
pthread_mutex_lock(&table_mon_list->update_status_mutex); fault_count > full_mon_count / 2
) {
mon_table_result->result_status = SPIDER_LINK_MON_NG;
DBUG_PRINT("info",("spider mon_table_result->result_status=SPIDER_LINK_MON_NG 2"));
if (table_mon_list->mon_status != SPIDER_LINK_MON_NG) if (table_mon_list->mon_status != SPIDER_LINK_MON_NG)
{ {
table_mon_list->mon_status = SPIDER_LINK_MON_NG; /*
table_mon_list->share->link_statuses[0] = SPIDER_LINK_STATUS_NG; pthread_mutex_lock(&table_mon_list->update_status_mutex);
spider_sys_update_tables_link_status(trx->thd, */
conv_name.c_ptr(), conv_name_length, link_idx, pthread_mutex_lock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]);
SPIDER_LINK_STATUS_NG, TRUE); if (table_mon_list->mon_status != SPIDER_LINK_MON_NG)
spider_sys_log_tables_link_failed(trx->thd, {
conv_name.c_ptr(), conv_name_length, link_idx, TRUE); table_mon_list->mon_status = SPIDER_LINK_MON_NG;
table_mon_list->share->link_statuses[0] = SPIDER_LINK_STATUS_NG;
spider_update_link_status_for_share(conv_name.c_ptr(),
conv_name_length, link_idx, SPIDER_LINK_STATUS_NG);
spider_sys_update_tables_link_status(trx->thd,
conv_name.c_ptr(), conv_name_length, link_idx,
SPIDER_LINK_STATUS_NG, TRUE);
spider_sys_log_tables_link_failed(trx->thd,
conv_name.c_ptr(), conv_name_length, link_idx, TRUE);
}
/*
pthread_mutex_unlock(&table_mon_list->update_status_mutex);
*/
pthread_mutex_unlock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]);
} }
pthread_mutex_unlock(&table_mon_list->update_status_mutex); goto end;
} }
goto end;
} }
} else { } else {
success_count++; success_count++;
if (success_count > full_mon_count / 2) if (
{ !(flags & SPIDER_UDF_PING_TABLE_USE_ALL_MONITORING_NODES) &&
success_count > full_mon_count / 2
) {
mon_table_result->result_status = SPIDER_LINK_MON_OK; mon_table_result->result_status = SPIDER_LINK_MON_OK;
DBUG_PRINT("info",("spider mon_table_result->result_status=SPIDER_LINK_MON_OK 1")); DBUG_PRINT("info",("spider mon_table_result->result_status=SPIDER_LINK_MON_OK 1"));
goto end; goto end;
...@@ -1048,7 +1078,42 @@ long long spider_ping_table_body( ...@@ -1048,7 +1078,42 @@ long long spider_ping_table_body(
table_mon->server_id == first_sid || table_mon->server_id == first_sid ||
current_mon_count > full_mon_count current_mon_count > full_mon_count
) { ) {
if (success_count + fault_count > full_mon_count / 2) if (
(flags & SPIDER_UDF_PING_TABLE_USE_ALL_MONITORING_NODES) &&
fault_count > full_mon_count / 2
) {
mon_table_result->result_status = SPIDER_LINK_MON_NG;
DBUG_PRINT("info",("spider mon_table_result->result_status=SPIDER_LINK_MON_NG 3"));
if (table_mon_list->mon_status != SPIDER_LINK_MON_NG)
{
/*
pthread_mutex_lock(&table_mon_list->update_status_mutex);
*/
pthread_mutex_lock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]);
if (table_mon_list->mon_status != SPIDER_LINK_MON_NG)
{
table_mon_list->mon_status = SPIDER_LINK_MON_NG;
table_mon_list->share->link_statuses[0] = SPIDER_LINK_STATUS_NG;
spider_update_link_status_for_share(conv_name.c_ptr(),
conv_name_length, link_idx, SPIDER_LINK_STATUS_NG);
spider_sys_update_tables_link_status(trx->thd,
conv_name.c_ptr(), conv_name_length, link_idx,
SPIDER_LINK_STATUS_NG, TRUE);
spider_sys_log_tables_link_failed(trx->thd,
conv_name.c_ptr(), conv_name_length, link_idx, TRUE);
}
/*
pthread_mutex_unlock(&table_mon_list->update_status_mutex);
*/
pthread_mutex_unlock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]);
}
} else if (
(flags & SPIDER_UDF_PING_TABLE_USE_ALL_MONITORING_NODES) &&
success_count > full_mon_count / 2
) {
mon_table_result->result_status = SPIDER_LINK_MON_OK;
DBUG_PRINT("info",("spider mon_table_result->result_status=SPIDER_LINK_MON_OK 2"));
} else if (success_count + fault_count > full_mon_count / 2)
{ {
mon_table_result->result_status = SPIDER_LINK_MON_DRAW; mon_table_result->result_status = SPIDER_LINK_MON_DRAW;
DBUG_PRINT("info",( DBUG_PRINT("info",(
...@@ -1074,18 +1139,26 @@ long long spider_ping_table_body( ...@@ -1074,18 +1139,26 @@ long long spider_ping_table_body(
mon_table_result->result_status == SPIDER_LINK_MON_NG && mon_table_result->result_status == SPIDER_LINK_MON_NG &&
table_mon_list->mon_status != SPIDER_LINK_MON_NG table_mon_list->mon_status != SPIDER_LINK_MON_NG
) { ) {
/*
pthread_mutex_lock(&table_mon_list->update_status_mutex); pthread_mutex_lock(&table_mon_list->update_status_mutex);
*/
pthread_mutex_lock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]);
if (table_mon_list->mon_status != SPIDER_LINK_MON_NG) if (table_mon_list->mon_status != SPIDER_LINK_MON_NG)
{ {
table_mon_list->mon_status = SPIDER_LINK_MON_NG; table_mon_list->mon_status = SPIDER_LINK_MON_NG;
table_mon_list->share->link_statuses[0] = SPIDER_LINK_STATUS_NG; table_mon_list->share->link_statuses[0] = SPIDER_LINK_STATUS_NG;
spider_update_link_status_for_share(conv_name.c_ptr(),
conv_name_length, link_idx, SPIDER_LINK_STATUS_NG);
spider_sys_update_tables_link_status(trx->thd, spider_sys_update_tables_link_status(trx->thd,
conv_name.c_ptr(), conv_name_length, link_idx, conv_name.c_ptr(), conv_name_length, link_idx,
SPIDER_LINK_STATUS_NG, TRUE); SPIDER_LINK_STATUS_NG, TRUE);
spider_sys_log_tables_link_failed(trx->thd, spider_sys_log_tables_link_failed(trx->thd,
conv_name.c_ptr(), conv_name_length, link_idx, TRUE); conv_name.c_ptr(), conv_name_length, link_idx, TRUE);
} }
/*
pthread_mutex_unlock(&table_mon_list->update_status_mutex); pthread_mutex_unlock(&table_mon_list->update_status_mutex);
*/
pthread_mutex_unlock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]);
} }
table_mon_list->last_receptor_result = table_mon_list->last_receptor_result =
mon_table_result->result_status; mon_table_result->result_status;
...@@ -1245,6 +1318,7 @@ int spider_ping_table_mon_from_table( ...@@ -1245,6 +1318,7 @@ int spider_ping_table_mon_from_table(
uint where_clause_length, uint where_clause_length,
long monitoring_kind, long monitoring_kind,
longlong monitoring_limit, longlong monitoring_limit,
long monitoring_flag,
bool need_lock bool need_lock
) { ) {
int error_num = 0, current_mon_count, flags; int error_num = 0, current_mon_count, flags;
...@@ -1312,6 +1386,9 @@ int spider_ping_table_mon_from_table( ...@@ -1312,6 +1386,9 @@ int spider_ping_table_mon_from_table(
else else
flags = 0; flags = 0;
if (monitoring_flag & 1)
flags |= SPIDER_UDF_PING_TABLE_USE_ALL_MONITORING_NODES;
if (!(table_mon_list = spider_get_ping_table_mon_list(trx, thd, if (!(table_mon_list = spider_get_ping_table_mon_list(trx, thd,
&conv_name_str, conv_name_length, link_idx, server_id, need_lock, &conv_name_str, conv_name_length, link_idx, server_id, need_lock,
&error_num))) &error_num)))
...@@ -1321,7 +1398,9 @@ int spider_ping_table_mon_from_table( ...@@ -1321,7 +1398,9 @@ int spider_ping_table_mon_from_table(
{ {
DBUG_PRINT("info", DBUG_PRINT("info",
("spider share->link_statuses[%d]=SPIDER_LINK_STATUS_NG", link_idx)); ("spider share->link_statuses[%d]=SPIDER_LINK_STATUS_NG", link_idx));
pthread_mutex_lock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]);
share->link_statuses[link_idx] = SPIDER_LINK_STATUS_NG; share->link_statuses[link_idx] = SPIDER_LINK_STATUS_NG;
pthread_mutex_unlock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]);
error_num = ER_SPIDER_LINK_MON_NG_NUM; error_num = ER_SPIDER_LINK_MON_NG_NUM;
my_printf_error(error_num, my_printf_error(error_num,
ER_SPIDER_LINK_MON_NG_STR, MYF(0), ER_SPIDER_LINK_MON_NG_STR, MYF(0),
...@@ -1386,7 +1465,10 @@ int spider_ping_table_mon_from_table( ...@@ -1386,7 +1465,10 @@ int spider_ping_table_mon_from_table(
mon_table_result.result_status == SPIDER_LINK_MON_NG && mon_table_result.result_status == SPIDER_LINK_MON_NG &&
table_mon_list->mon_status != SPIDER_LINK_MON_NG table_mon_list->mon_status != SPIDER_LINK_MON_NG
) { ) {
/*
pthread_mutex_lock(&table_mon_list->update_status_mutex); pthread_mutex_lock(&table_mon_list->update_status_mutex);
*/
pthread_mutex_lock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]);
if (table_mon_list->mon_status != SPIDER_LINK_MON_NG) if (table_mon_list->mon_status != SPIDER_LINK_MON_NG)
{ {
table_mon_list->mon_status = SPIDER_LINK_MON_NG; table_mon_list->mon_status = SPIDER_LINK_MON_NG;
...@@ -1400,7 +1482,10 @@ int spider_ping_table_mon_from_table( ...@@ -1400,7 +1482,10 @@ int spider_ping_table_mon_from_table(
spider_sys_log_tables_link_failed(thd, conv_name, spider_sys_log_tables_link_failed(thd, conv_name,
conv_name_length, link_idx, need_lock); conv_name_length, link_idx, need_lock);
} }
/*
pthread_mutex_unlock(&table_mon_list->update_status_mutex); pthread_mutex_unlock(&table_mon_list->update_status_mutex);
*/
pthread_mutex_unlock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]);
} }
table_mon_list->last_caller_result = mon_table_result.result_status; table_mon_list->last_caller_result = mon_table_result.result_status;
if (mon_table_result.result_status == SPIDER_LINK_MON_OK) if (mon_table_result.result_status == SPIDER_LINK_MON_OK)
......
...@@ -98,5 +98,6 @@ int spider_ping_table_mon_from_table( ...@@ -98,5 +98,6 @@ int spider_ping_table_mon_from_table(
uint where_clause_length, uint where_clause_length,
long monitoring_kind, long monitoring_kind,
longlong monitoring_limit, longlong monitoring_limit,
long monitoring_flag,
bool need_lock bool need_lock
); );
/* Copyright (C) 2008-2014 Kentoku Shiba /* Copyright (C) 2008-2015 Kentoku Shiba
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -2280,7 +2280,9 @@ int spider_get_link_statuses( ...@@ -2280,7 +2280,9 @@ int spider_get_link_statuses(
if ( if (
(error_num == HA_ERR_KEY_NOT_FOUND || error_num == HA_ERR_END_OF_FILE) (error_num == HA_ERR_KEY_NOT_FOUND || error_num == HA_ERR_END_OF_FILE)
) { ) {
/*
table->file->print_error(error_num, MYF(0)); table->file->print_error(error_num, MYF(0));
*/
DBUG_RETURN(error_num); DBUG_RETURN(error_num);
} }
} else if ((error_num = } else if ((error_num =
...@@ -2390,8 +2392,13 @@ TABLE *spider_mk_sys_tmp_table( ...@@ -2390,8 +2392,13 @@ TABLE *spider_mk_sys_tmp_table(
goto error_alloc_field; goto error_alloc_field;
field->init(table); field->init(table);
#ifdef SPIDER_FIELD_FIELDPTR_REQUIRES_THDPTR
if (!(i_field = new (thd->mem_root) Item_field(thd, (Field *) field)))
goto error_alloc_item_field;
#else
if (!(i_field = new Item_field((Field *) field))) if (!(i_field = new Item_field((Field *) field)))
goto error_alloc_item_field; goto error_alloc_item_field;
#endif
if (i_list.push_back(i_field)) if (i_list.push_back(i_field))
goto error_push_item; goto error_push_item;
...@@ -2443,8 +2450,13 @@ TABLE *spider_mk_sys_tmp_table_for_result( ...@@ -2443,8 +2450,13 @@ TABLE *spider_mk_sys_tmp_table_for_result(
goto error_alloc_field1; goto error_alloc_field1;
field1->init(table); field1->init(table);
#ifdef SPIDER_FIELD_FIELDPTR_REQUIRES_THDPTR
if (!(i_field1 = new (thd->mem_root) Item_field(thd, (Field *) field1)))
goto error_alloc_item_field1;
#else
if (!(i_field1 = new Item_field((Field *) field1))) if (!(i_field1 = new Item_field((Field *) field1)))
goto error_alloc_item_field1; goto error_alloc_item_field1;
#endif
if (i_list.push_back(i_field1)) if (i_list.push_back(i_field1))
goto error_push_item1; goto error_push_item1;
...@@ -2454,8 +2466,13 @@ TABLE *spider_mk_sys_tmp_table_for_result( ...@@ -2454,8 +2466,13 @@ TABLE *spider_mk_sys_tmp_table_for_result(
goto error_alloc_field2; goto error_alloc_field2;
field2->init(table); field2->init(table);
#ifdef SPIDER_FIELD_FIELDPTR_REQUIRES_THDPTR
if (!(i_field2 = new (thd->mem_root) Item_field(thd, (Field *) field2)))
goto error_alloc_item_field2;
#else
if (!(i_field2 = new Item_field((Field *) field2))) if (!(i_field2 = new Item_field((Field *) field2)))
goto error_alloc_item_field2; goto error_alloc_item_field2;
#endif
if (i_list.push_back(i_field2)) if (i_list.push_back(i_field2))
goto error_push_item2; goto error_push_item2;
...@@ -2465,8 +2482,13 @@ TABLE *spider_mk_sys_tmp_table_for_result( ...@@ -2465,8 +2482,13 @@ TABLE *spider_mk_sys_tmp_table_for_result(
goto error_alloc_field3; goto error_alloc_field3;
field3->init(table); field3->init(table);
#ifdef SPIDER_FIELD_FIELDPTR_REQUIRES_THDPTR
if (!(i_field3 = new (thd->mem_root) Item_field(thd, (Field *) field3)))
goto error_alloc_item_field3;
#else
if (!(i_field3 = new Item_field((Field *) field3))) if (!(i_field3 = new Item_field((Field *) field3)))
goto error_alloc_item_field3; goto error_alloc_item_field3;
#endif
if (i_list.push_back(i_field3)) if (i_list.push_back(i_field3))
goto error_push_item3; goto error_push_item3;
......
This diff is collapsed.
...@@ -204,6 +204,13 @@ int spider_free_share( ...@@ -204,6 +204,13 @@ int spider_free_share(
SPIDER_SHARE *share SPIDER_SHARE *share
); );
void spider_update_link_status_for_share(
const char *table_name,
uint table_name_length,
int link_idx,
long link_status
);
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
SPIDER_PARTITION_SHARE *spider_get_pt_share( SPIDER_PARTITION_SHARE *spider_get_pt_share(
SPIDER_SHARE *share, SPIDER_SHARE *share,
......
/* Copyright (C) 2008-2014 Kentoku Shiba /* Copyright (C) 2008-2015 Kentoku Shiba
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -38,11 +38,14 @@ ...@@ -38,11 +38,14 @@
#include "spd_ping_table.h" #include "spd_ping_table.h"
#include "spd_malloc.h" #include "spd_malloc.h"
#ifdef SPIDER_XID_USES_xid_cache_iterate
#else
#ifdef XID_CACHE_IS_SPLITTED #ifdef XID_CACHE_IS_SPLITTED
extern uint *spd_db_att_xid_cache_split_num; extern uint *spd_db_att_xid_cache_split_num;
#endif #endif
extern pthread_mutex_t *spd_db_att_LOCK_xid_cache; extern pthread_mutex_t *spd_db_att_LOCK_xid_cache;
extern HASH *spd_db_att_xid_cache; extern HASH *spd_db_att_xid_cache;
#endif
extern struct charset_info_st *spd_charset_utf8_bin; extern struct charset_info_st *spd_charset_utf8_bin;
extern handlerton *spider_hton_ptr; extern handlerton *spider_hton_ptr;
...@@ -1641,14 +1644,24 @@ int spider_xa_lock( ...@@ -1641,14 +1644,24 @@ int spider_xa_lock(
int error_num; int error_num;
const char *old_proc_info; const char *old_proc_info;
DBUG_ENTER("spider_xa_lock"); DBUG_ENTER("spider_xa_lock");
#ifdef SPIDER_XID_USES_xid_cache_iterate
#else
#ifdef SPIDER_HAS_HASH_VALUE_TYPE #ifdef SPIDER_HAS_HASH_VALUE_TYPE
my_hash_value_type hash_value = my_calc_hash(spd_db_att_xid_cache, my_hash_value_type hash_value = my_calc_hash(spd_db_att_xid_cache,
(uchar*) xid_state->xid.key(), xid_state->xid.key_length()); (uchar*) xid_state->xid.key(), xid_state->xid.key_length());
#ifdef XID_CACHE_IS_SPLITTED #ifdef XID_CACHE_IS_SPLITTED
uint idx = hash_value % *spd_db_att_xid_cache_split_num; uint idx = hash_value % *spd_db_att_xid_cache_split_num;
#endif #endif
#endif
#endif #endif
old_proc_info = thd_proc_info(thd, "Locking xid by Spider"); old_proc_info = thd_proc_info(thd, "Locking xid by Spider");
#ifdef SPIDER_XID_USES_xid_cache_iterate
if (xid_cache_insert(thd, xid_state))
{
error_num = my_errno;
goto error;
}
#else
#ifdef XID_CACHE_IS_SPLITTED #ifdef XID_CACHE_IS_SPLITTED
pthread_mutex_lock(&spd_db_att_LOCK_xid_cache[idx]); pthread_mutex_lock(&spd_db_att_LOCK_xid_cache[idx]);
#else #else
...@@ -1689,15 +1702,19 @@ int spider_xa_lock( ...@@ -1689,15 +1702,19 @@ int spider_xa_lock(
pthread_mutex_unlock(&spd_db_att_LOCK_xid_cache[idx]); pthread_mutex_unlock(&spd_db_att_LOCK_xid_cache[idx]);
#else #else
pthread_mutex_unlock(spd_db_att_LOCK_xid_cache); pthread_mutex_unlock(spd_db_att_LOCK_xid_cache);
#endif
#endif #endif
thd_proc_info(thd, old_proc_info); thd_proc_info(thd, old_proc_info);
DBUG_RETURN(0); DBUG_RETURN(0);
error: error:
#ifdef SPIDER_XID_USES_xid_cache_iterate
#else
#ifdef XID_CACHE_IS_SPLITTED #ifdef XID_CACHE_IS_SPLITTED
pthread_mutex_unlock(&spd_db_att_LOCK_xid_cache[idx]); pthread_mutex_unlock(&spd_db_att_LOCK_xid_cache[idx]);
#else #else
pthread_mutex_unlock(spd_db_att_LOCK_xid_cache); pthread_mutex_unlock(spd_db_att_LOCK_xid_cache);
#endif
#endif #endif
thd_proc_info(thd, old_proc_info); thd_proc_info(thd, old_proc_info);
DBUG_RETURN(error_num); DBUG_RETURN(error_num);
...@@ -1709,14 +1726,20 @@ int spider_xa_unlock( ...@@ -1709,14 +1726,20 @@ int spider_xa_unlock(
THD *thd = current_thd; THD *thd = current_thd;
const char *old_proc_info; const char *old_proc_info;
DBUG_ENTER("spider_xa_unlock"); DBUG_ENTER("spider_xa_unlock");
#ifdef SPIDER_XID_USES_xid_cache_iterate
#else
#if defined(SPIDER_HAS_HASH_VALUE_TYPE) && defined(HASH_UPDATE_WITH_HASH_VALUE) #if defined(SPIDER_HAS_HASH_VALUE_TYPE) && defined(HASH_UPDATE_WITH_HASH_VALUE)
my_hash_value_type hash_value = my_calc_hash(spd_db_att_xid_cache, my_hash_value_type hash_value = my_calc_hash(spd_db_att_xid_cache,
(uchar*) xid_state->xid.key(), xid_state->xid.key_length()); (uchar*) xid_state->xid.key(), xid_state->xid.key_length());
#ifdef XID_CACHE_IS_SPLITTED #ifdef XID_CACHE_IS_SPLITTED
uint idx = hash_value % *spd_db_att_xid_cache_split_num; uint idx = hash_value % *spd_db_att_xid_cache_split_num;
#endif #endif
#endif
#endif #endif
old_proc_info = thd_proc_info(thd, "Unlocking xid by Spider"); old_proc_info = thd_proc_info(thd, "Unlocking xid by Spider");
#ifdef SPIDER_XID_USES_xid_cache_iterate
xid_cache_delete(thd, xid_state);
#else
#ifdef XID_CACHE_IS_SPLITTED #ifdef XID_CACHE_IS_SPLITTED
pthread_mutex_lock(&spd_db_att_LOCK_xid_cache[idx]); pthread_mutex_lock(&spd_db_att_LOCK_xid_cache[idx]);
#else #else
...@@ -1737,6 +1760,7 @@ int spider_xa_unlock( ...@@ -1737,6 +1760,7 @@ int spider_xa_unlock(
pthread_mutex_unlock(&spd_db_att_LOCK_xid_cache[idx]); pthread_mutex_unlock(&spd_db_att_LOCK_xid_cache[idx]);
#else #else
pthread_mutex_unlock(spd_db_att_LOCK_xid_cache); pthread_mutex_unlock(spd_db_att_LOCK_xid_cache);
#endif
#endif #endif
thd_proc_info(thd, old_proc_info); thd_proc_info(thd, old_proc_info);
DBUG_RETURN(0); DBUG_RETURN(0);
...@@ -1857,7 +1881,9 @@ int spider_internal_start_trx( ...@@ -1857,7 +1881,9 @@ int spider_internal_start_trx(
trx->internal_xid_state.xa_state = XA_ACTIVE; trx->internal_xid_state.xa_state = XA_ACTIVE;
trx->internal_xid_state.xid.set(&trx->xid); trx->internal_xid_state.xid.set(&trx->xid);
#ifdef SPIDER_XID_STATE_HAS_in_thd
trx->internal_xid_state.in_thd = 1; trx->internal_xid_state.in_thd = 1;
#endif
if ((error_num = spider_xa_lock(&trx->internal_xid_state))) if ((error_num = spider_xa_lock(&trx->internal_xid_state)))
{ {
if (error_num == ER_SPIDER_XA_LOCKED_NUM) if (error_num == ER_SPIDER_XA_LOCKED_NUM)
...@@ -3729,6 +3755,7 @@ int spider_check_trx_and_get_conn( ...@@ -3729,6 +3755,7 @@ int spider_check_trx_and_get_conn(
spider->hs_w_conns[roop_count] = NULL; spider->hs_w_conns[roop_count] = NULL;
#endif #endif
} }
bool search_link_idx_is_checked = FALSE;
for ( for (
roop_count = spider_conn_link_idx_next(share->link_statuses, roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count, spider->conn_link_idx, -1, share->link_count,
...@@ -3740,6 +3767,8 @@ int spider_check_trx_and_get_conn( ...@@ -3740,6 +3767,8 @@ int spider_check_trx_and_get_conn(
) { ) {
uint tgt_conn_kind = (use_conn_kind ? spider->conn_kind[roop_count] : uint tgt_conn_kind = (use_conn_kind ? spider->conn_kind[roop_count] :
SPIDER_CONN_KIND_MYSQL); SPIDER_CONN_KIND_MYSQL);
if (roop_count == spider->search_link_idx)
search_link_idx_is_checked = TRUE;
if ( if (
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
( (
...@@ -3780,6 +3809,7 @@ int spider_check_trx_and_get_conn( ...@@ -3780,6 +3809,7 @@ int spider_check_trx_and_get_conn(
0, 0,
share->monitoring_kind[roop_count], share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count], share->monitoring_limit[roop_count],
share->monitoring_flag[roop_count],
TRUE TRUE
); );
} }
...@@ -3821,6 +3851,7 @@ int spider_check_trx_and_get_conn( ...@@ -3821,6 +3851,7 @@ int spider_check_trx_and_get_conn(
0, 0,
share->monitoring_kind[roop_count], share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count], share->monitoring_limit[roop_count],
share->monitoring_flag[roop_count],
TRUE TRUE
); );
} }
...@@ -3834,9 +3865,41 @@ int spider_check_trx_and_get_conn( ...@@ -3834,9 +3865,41 @@ int spider_check_trx_and_get_conn(
#endif #endif
#endif #endif
} }
if (!search_link_idx_is_checked)
{
TABLE *table = spider->get_table();
TABLE_SHARE *table_share = table->s;
#ifdef _MSC_VER
char *db, *table_name;
if (!(db = (char *)
spider_bulk_malloc(spider_current_trx, 57, MYF(MY_WME),
&db, table_share->db.length + 1,
&table_name, table_share->table_name.length + 1,
NullS))
) {
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
#else
char db[table_share->db.length + 1],
table_name[table_share->table_name.length + 1];
#endif
memcpy(db, table_share->db.str, table_share->db.length);
db[table_share->db.length] = '\0';
memcpy(table_name, table_share->table_name.str,
table_share->table_name.length);
table_name[table_share->table_name.length] = '\0';
my_printf_error(ER_SPIDER_LINK_MON_JUST_NG_NUM,
ER_SPIDER_LINK_MON_JUST_NG_STR, MYF(0), db, table_name);
#ifdef _MSC_VER
spider_free(trx, db, MYF(MY_WME));
#endif
DBUG_RETURN(ER_SPIDER_LINK_MON_JUST_NG_NUM);
}
} else { } else {
DBUG_PRINT("info",("spider link_status = %ld", DBUG_PRINT("info",("spider link_status = %ld",
share->link_statuses[spider->conn_link_idx[spider->search_link_idx]])); share->link_statuses[spider->conn_link_idx[spider->search_link_idx]]));
bool search_link_idx_is_checked = FALSE;
for ( for (
roop_count = spider_conn_link_idx_next(share->link_statuses, roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count, spider->conn_link_idx, -1, share->link_count,
...@@ -3846,6 +3909,8 @@ int spider_check_trx_and_get_conn( ...@@ -3846,6 +3909,8 @@ int spider_check_trx_and_get_conn(
spider->conn_link_idx, roop_count, share->link_count, spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY) SPIDER_LINK_STATUS_RECOVERY)
) { ) {
if (roop_count == spider->search_link_idx)
search_link_idx_is_checked = TRUE;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if ( if (
!use_conn_kind || !use_conn_kind ||
...@@ -3890,6 +3955,7 @@ int spider_check_trx_and_get_conn( ...@@ -3890,6 +3955,7 @@ int spider_check_trx_and_get_conn(
0, 0,
share->monitoring_kind[roop_count], share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count], share->monitoring_limit[roop_count],
share->monitoring_flag[roop_count],
TRUE TRUE
); );
} }
...@@ -3932,6 +3998,7 @@ int spider_check_trx_and_get_conn( ...@@ -3932,6 +3998,7 @@ int spider_check_trx_and_get_conn(
0, 0,
share->monitoring_kind[roop_count], share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count], share->monitoring_limit[roop_count],
share->monitoring_flag[roop_count],
TRUE TRUE
); );
} }
...@@ -3944,6 +4011,37 @@ int spider_check_trx_and_get_conn( ...@@ -3944,6 +4011,37 @@ int spider_check_trx_and_get_conn(
#endif #endif
#endif #endif
} }
if (!search_link_idx_is_checked)
{
TABLE *table = spider->get_table();
TABLE_SHARE *table_share = table->s;
#ifdef _MSC_VER
char *db, *table_name;
if (!(db = (char *)
spider_bulk_malloc(spider_current_trx, 57, MYF(MY_WME),
&db, table_share->db.length + 1,
&table_name, table_share->table_name.length + 1,
NullS))
) {
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
#else
char db[table_share->db.length + 1],
table_name[table_share->table_name.length + 1];
#endif
memcpy(db, table_share->db.str, table_share->db.length);
db[table_share->db.length] = '\0';
memcpy(table_name, table_share->table_name.str,
table_share->table_name.length);
table_name[table_share->table_name.length] = '\0';
my_printf_error(ER_SPIDER_LINK_MON_JUST_NG_NUM,
ER_SPIDER_LINK_MON_JUST_NG_STR, MYF(0), db, table_name);
#ifdef _MSC_VER
spider_free(trx, db, MYF(MY_WME));
#endif
DBUG_RETURN(ER_SPIDER_LINK_MON_JUST_NG_NUM);
}
} }
spider->set_first_link_idx(); spider->set_first_link_idx();
DBUG_RETURN(spider_create_trx_ha(trx, spider, trx_ha)); DBUG_RETURN(spider_create_trx_ha(trx, spider, trx_ha));
......
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