71
78
SPIDER_TABLE_MON_LIST *table_mon_list;
80
ulonglong mon_table_cache_version;
72
81
DBUG_ENTER("spider_get_ping_table_mon_list");
82
if (spider_mon_table_cache_version != spider_mon_table_cache_version_req)
84
init_alloc_root(&mem_root, 4096, 0);
85
if ((*error_num = spider_init_ping_table_mon_cache(thd, &mem_root,
88
free_root(&mem_root, MYF(0));
91
free_root(&mem_root, MYF(0));
73
94
mutex_hash = spider_udf_calc_hash(str->c_ptr(),
74
95
spider_udf_table_mon_mutex_count);
75
96
DBUG_PRINT("info",("spider hash key=%s", str->c_ptr()));
76
DBUG_PRINT("info",("spider hash key length=%ld", str->length()));
97
DBUG_PRINT("info",("spider hash key length=%u", str->length()));
77
98
pthread_mutex_lock(&spider_udf_table_mon_mutexes[mutex_hash]);
99
mon_table_cache_version = (ulonglong) spider_mon_table_cache_version;
78
100
if (!(table_mon_list = (SPIDER_TABLE_MON_LIST *) my_hash_search(
79
101
&spider_udf_table_mon_list_hash[mutex_hash],
80
(uchar*) str->c_ptr(), str->length())))
102
(uchar*) str->c_ptr(), str->length())) ||
103
table_mon_list->mon_table_cache_version != mon_table_cache_version
82
105
DBUG_ASSERT(trx != spider_global_trx);
108
table_mon_list->mon_table_cache_version != mon_table_cache_version
110
spider_release_ping_table_mon_list_loop(mutex_hash, table_mon_list);
83
112
if (!(table_mon_list = spider_get_ping_table_tgt(thd, str->c_ptr(),
84
113
conv_name_length, link_idx, server_id, str, need_lock, error_num)))
212
250
spider_store_tables_name(table_link_mon, name, name_length);
213
251
spider_store_tables_link_idx(table_link_mon, link_idx);
214
if ((error_num = spider_get_sys_table_by_idx(table_link_mon, table_key,
215
table_link_mon->s->primary_key, 3)))
217
if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
219
table_link_mon->file->print_error(error_num, MYF(0));
252
if (!(error_num = spider_ping_table_cache_compare(table_link_mon, mem_root)))
223
253
goto create_table_mon;
226
spider_store_tables_link_idx(table_link_mon, 0);
227
if ((error_num = spider_get_sys_table_by_idx(table_link_mon, table_key,
228
table_link_mon->s->primary_key, 3)))
230
if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
232
table_link_mon->file->print_error(error_num, MYF(0));
236
goto create_table_mon;
254
if (error_num == HA_ERR_OUT_OF_MEM)
238
256
if ((tmp_ptr = strstr(name, "#P#")))
241
259
spider_store_tables_name(table_link_mon, name, strlen(name));
242
spider_store_tables_link_idx(table_link_mon, link_idx);
244
if ((error_num = spider_get_sys_table_by_idx(table_link_mon, table_key,
245
table_link_mon->s->primary_key, 3)))
247
if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
249
table_link_mon->file->print_error(error_num, MYF(0));
261
if (!(error_num = spider_ping_table_cache_compare(table_link_mon,
253
263
goto create_table_mon;
257
spider_store_tables_link_idx(table_link_mon, 0);
258
if ((error_num = spider_get_sys_table_by_idx(table_link_mon, table_key,
259
table_link_mon->s->primary_key, 3)))
262
error_num != HA_ERR_KEY_NOT_FOUND &&
263
error_num != HA_ERR_END_OF_FILE
265
table_link_mon->file->print_error(error_num, MYF(0));
269
goto create_table_mon;
264
if (error_num == HA_ERR_OUT_OF_MEM)
267
error_num = HA_ERR_KEY_NOT_FOUND;
272
268
table_link_mon->file->print_error(error_num, MYF(0));
275
271
create_table_mon:
272
if ((error_num = spider_get_sys_table_by_idx(table_link_mon, table_key,
273
table_link_mon->s->primary_key, 3)))
275
table_link_mon->file->print_error(error_num, MYF(0));
277
280
if (!(table_mon = (SPIDER_TABLE_MON *)
278
281
my_multi_malloc(MYF(MY_WME | MY_ZEROFILL),
279
282
&table_mon, sizeof(SPIDER_TABLE_MON),
280
283
&tmp_share, sizeof(SPIDER_SHARE),
281
&tmp_connect_info, sizeof(char *) * 15,
282
&tmp_connect_info_length, sizeof(uint) * 15,
283
&tmp_long, sizeof(long) * 5,
284
&tmp_longlong, sizeof(longlong) * 3,
284
&tmp_connect_info, sizeof(char *) * SPIDER_TMP_SHARE_CHAR_PTR_COUNT,
285
&tmp_connect_info_length, sizeof(uint) * SPIDER_TMP_SHARE_UINT_COUNT,
286
&tmp_long, sizeof(long) * SPIDER_TMP_SHARE_LONG_COUNT,
287
&tmp_longlong, sizeof(longlong) * SPIDER_TMP_SHARE_LONGLONG_COUNT,
287
290
spider_sys_index_end(table_link_mon);
396
402
my_multi_malloc(MYF(MY_WME | MY_ZEROFILL),
397
403
&table_mon_list, sizeof(SPIDER_TABLE_MON_LIST),
398
404
&tmp_share, sizeof(SPIDER_SHARE),
399
&tmp_connect_info, sizeof(char *) * 15,
400
&tmp_connect_info_length, sizeof(uint) * 15,
401
&tmp_long, sizeof(long) * 5,
402
&tmp_longlong, sizeof(longlong) * 3,
405
&tmp_connect_info, sizeof(char *) * SPIDER_TMP_SHARE_CHAR_PTR_COUNT,
406
&tmp_connect_info_length, sizeof(uint) * SPIDER_TMP_SHARE_UINT_COUNT,
407
&tmp_long, sizeof(long) * SPIDER_TMP_SHARE_LONG_COUNT,
408
&tmp_longlong, sizeof(longlong) * SPIDER_TMP_SHARE_LONGLONG_COUNT,
403
409
&key_str, str->length() + 1,
562
568
DBUG_RETURN(NULL);
571
int spider_init_ping_table_mon_cache(
577
TABLE *table_link_mon = NULL;
578
#if MYSQL_VERSION_ID < 50500
579
Open_tables_state open_tables_backup;
581
Open_tables_backup open_tables_backup;
583
SPIDER_MON_KEY mon_key;
584
DBUG_ENTER("spider_init_ping_table_mon_cache");
587
!(table_link_mon = spider_open_sys_table(
588
thd, SPIDER_SYS_LINK_MON_TABLE_NAME_STR,
589
SPIDER_SYS_LINK_MON_TABLE_NAME_LEN, FALSE, &open_tables_backup,
590
need_lock, &error_num))
592
my_error(error_num, MYF(0));
593
goto error_open_sys_table;
596
pthread_mutex_lock(&spider_mon_table_cache_mutex);
597
if (spider_mon_table_cache_version != spider_mon_table_cache_version_req)
600
spider_mon_table_cache.elements = 0;
602
if ((error_num = spider_sys_index_first(table_link_mon,
603
table_link_mon->s->primary_key)))
605
if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
607
table_link_mon->file->print_error(error_num, MYF(0));
608
goto error_sys_index_first;
614
mon_key.db_name_length = SPIDER_SYS_LINK_MON_TABLE_DB_NAME_SIZE + 1;
615
mon_key.table_name_length = SPIDER_SYS_LINK_MON_TABLE_TABLE_NAME_SIZE + 1;
616
mon_key.link_id_length = SPIDER_SYS_LINK_MON_TABLE_LINK_ID_SIZE + 1;
618
if ((error_num = spider_get_sys_link_mon_key(table_link_mon, &mon_key,
620
goto error_get_sys_link_mon_key;
624
mon_key.sort = spider_calc_for_sort(3, mon_key.db_name,
625
mon_key.table_name, mon_key.link_id);
626
if (push_dynamic(&spider_mon_table_cache, (uchar *) &mon_key))
628
error_num = HA_ERR_OUT_OF_MEM;
629
goto error_push_dynamic;
633
if ((error_num = spider_sys_index_next(table_link_mon)))
636
error_num != HA_ERR_KEY_NOT_FOUND &&
637
error_num != HA_ERR_END_OF_FILE
639
table_link_mon->file->print_error(error_num, MYF(0));
640
goto error_sys_index_next;
643
} while (!error_num);
644
spider_sys_index_end(table_link_mon);
647
(uchar *) dynamic_element(&spider_mon_table_cache, 0, SPIDER_MON_KEY *),
648
spider_mon_table_cache.elements, sizeof(SPIDER_MON_KEY),
649
(qsort_cmp) spider_compare_for_sort);
650
freeze_size(&spider_mon_table_cache);
651
spider_mon_table_cache_version = spider_mon_table_cache_version_req;
653
pthread_mutex_unlock(&spider_mon_table_cache_mutex);
654
spider_close_sys_table(thd, table_link_mon, &open_tables_backup, need_lock);
658
error_get_sys_link_mon_key:
659
error_sys_index_next:
660
spider_sys_index_end(table_link_mon);
661
error_sys_index_first:
662
pthread_mutex_unlock(&spider_mon_table_cache_mutex);
663
spider_close_sys_table(thd, table_link_mon, &open_tables_backup, need_lock);
664
error_open_sys_table:
665
DBUG_RETURN(error_num);
668
int spider_ping_table_cache_compare(
673
SPIDER_MON_KEY *mon_key;
674
char *db_name, *table_name, *link_id;
675
DBUG_ENTER("spider_ping_table_cache_compare");
678
!(db_name = get_field(mem_root, table->field[0])) ||
679
!(table_name = get_field(mem_root, table->field[1])) ||
680
!(link_id = get_field(mem_root, table->field[2]))
682
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
683
DBUG_PRINT("info", ("spider db_name=%s", db_name));
684
DBUG_PRINT("info", ("spider table_name=%s", table_name));
685
DBUG_PRINT("info", ("spider link_id=%s", link_id));
687
pthread_mutex_lock(&spider_mon_table_cache_mutex);
688
for (roop_count = 0; roop_count < spider_mon_table_cache.elements;
691
mon_key = dynamic_element(&spider_mon_table_cache, roop_count,
693
DBUG_PRINT("info", ("spider roop_count=%d", roop_count));
694
DBUG_PRINT("info", ("spider mon_key.db_name=%s", mon_key->db_name));
695
DBUG_PRINT("info", ("spider mon_key.table_name=%s", mon_key->table_name));
696
DBUG_PRINT("info", ("spider mon_key.link_id=%s", mon_key->link_id));
698
!wild_case_compare(system_charset_info, db_name, mon_key->db_name) &&
699
!wild_case_compare(system_charset_info, table_name,
700
mon_key->table_name) &&
701
!wild_case_compare(system_charset_info, link_id, mon_key->link_id)
703
spider_store_db_and_table_name(
706
mon_key->db_name_length,
708
mon_key->table_name_length
710
spider_store_tables_link_idx_str(
713
mon_key->link_id_length
715
pthread_mutex_unlock(&spider_mon_table_cache_mutex);
716
DBUG_PRINT("info", ("spider found"));
720
pthread_mutex_unlock(&spider_mon_table_cache_mutex);
721
DBUG_PRINT("info", ("spider not found"));
565
725
long long spider_ping_table_body(
566
726
UDF_INIT *initid,