1 /* Copyright (C) 2008-2019 Kentoku Shiba 2 Copyright (C) 2019 MariaDB corp 3 4 This program is free software; you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation; version 2 of the License. 7 8 This program is distributed in the hope that it will be useful, 9 but WITHOUT ANY WARRANTY; without even the implied warranty of 10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 GNU General Public License for more details. 12 13 You should have received a copy of the GNU General Public License 14 along with this program; if not, write to the Free Software 15 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ 16 17 #define SPIDER_DETAIL_VERSION "3.3.15" 18 #define SPIDER_HEX_VERSION 0x0303 19 20 #if MYSQL_VERSION_ID < 50500 21 #define spider_my_free(A,B) my_free(A,B) 22 #define pthread_mutex_assert_owner(A) 23 #define pthread_mutex_assert_not_owner(A) 24 #else 25 #define spider_my_free(A,B) my_free(A) 26 #ifdef pthread_mutex_t 27 #undef pthread_mutex_t 28 #endif 29 #define pthread_mutex_t mysql_mutex_t 30 #ifdef pthread_mutex_lock 31 #undef pthread_mutex_lock 32 #endif 33 #define pthread_mutex_lock mysql_mutex_lock 34 #ifdef pthread_mutex_trylock 35 #undef pthread_mutex_trylock 36 #endif 37 #define pthread_mutex_trylock mysql_mutex_trylock 38 #ifdef pthread_mutex_unlock 39 #undef pthread_mutex_unlock 40 #endif 41 #define pthread_mutex_unlock mysql_mutex_unlock 42 #ifdef pthread_mutex_destroy 43 #undef pthread_mutex_destroy 44 #endif 45 #define pthread_mutex_destroy mysql_mutex_destroy 46 #define pthread_mutex_assert_owner(A) mysql_mutex_assert_owner(A) 47 #define pthread_mutex_assert_not_owner(A) mysql_mutex_assert_not_owner(A) 48 #ifdef pthread_cond_t 49 #undef pthread_cond_t 50 #endif 51 #define pthread_cond_t mysql_cond_t 52 #ifdef pthread_cond_wait 53 #undef pthread_cond_wait 54 #endif 55 #define pthread_cond_wait mysql_cond_wait 56 #ifdef pthread_cond_timedwait 57 #undef pthread_cond_timedwait 58 #endif 59 #define pthread_cond_timedwait mysql_cond_timedwait 60 #ifdef pthread_cond_signal 61 #undef pthread_cond_signal 62 #endif 63 #define pthread_cond_signal mysql_cond_signal 64 #ifdef pthread_cond_broadcast 65 #undef pthread_cond_broadcast 66 #endif 67 #define pthread_cond_broadcast mysql_cond_broadcast 68 #ifdef pthread_cond_destroy 69 #undef pthread_cond_destroy 70 #endif 71 #define pthread_cond_destroy mysql_cond_destroy 72 #define my_sprintf(A,B) sprintf B 73 #endif 74 75 76 #if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100004 77 #define spider_stmt_da_message(A) thd_get_error_message(A) 78 #define spider_stmt_da_sql_errno(A) thd_get_error_number(A) 79 #define spider_user_defined_key_parts(A) (A)->user_defined_key_parts 80 #define spider_join_table_count(A) (A)->table_count 81 #define SPIDER_CAN_BG_UPDATE (1LL << 39) 82 #if MYSQL_VERSION_ID >= 100304 83 #define SPIDER_ALTER_PARTITION_ADD ALTER_PARTITION_ADD 84 #define SPIDER_ALTER_PARTITION_DROP ALTER_PARTITION_DROP 85 #define SPIDER_ALTER_PARTITION_COALESCE ALTER_PARTITION_COALESCE 86 #define SPIDER_ALTER_PARTITION_REORGANIZE ALTER_PARTITION_REORGANIZE 87 #define SPIDER_ALTER_PARTITION_TABLE_REORG ALTER_PARTITION_TABLE_REORG 88 #define SPIDER_ALTER_PARTITION_REBUILD ALTER_PARTITION_REBUILD 89 #else 90 #define SPIDER_ALTER_PARTITION_ADD Alter_info::ALTER_ADD_PARTITION 91 #define SPIDER_ALTER_PARTITION_DROP Alter_info::ALTER_DROP_PARTITION 92 #define SPIDER_ALTER_PARTITION_COALESCE Alter_info::ALTER_COALESCE_PARTITION 93 #define SPIDER_ALTER_PARTITION_REORGANIZE Alter_info::ALTER_REORGANIZE_PARTITION 94 #define SPIDER_ALTER_PARTITION_TABLE_REORG Alter_info::ALTER_TABLE_REORG 95 #define SPIDER_ALTER_PARTITION_REBUILD Alter_info::ALTER_REBUILD_PARTITION 96 #endif 97 #define SPIDER_WARN_LEVEL_WARN Sql_condition::WARN_LEVEL_WARN 98 #define SPIDER_WARN_LEVEL_NOTE Sql_condition::WARN_LEVEL_NOTE 99 #define SPIDER_THD_KILL_CONNECTION KILL_CONNECTION 100 #else 101 #if MYSQL_VERSION_ID < 50500 102 #define spider_stmt_da_message(A) (A)->main_da.message() 103 #define spider_stmt_da_sql_errno(A) (A)->main_da.sql_errno() 104 #else 105 #if MYSQL_VERSION_ID < 50600 106 #define spider_stmt_da_message(A) (A)->stmt_da->message() 107 #define spider_stmt_da_sql_errno(A) (A)->stmt_da->sql_errno() 108 #else 109 #define spider_stmt_da_message(A) (A)->get_stmt_da()->message() 110 #define spider_stmt_da_sql_errno(A) (A)->get_stmt_da()->sql_errno() 111 #endif 112 #endif 113 #define spider_user_defined_key_parts(A) (A)->key_parts 114 #define spider_join_table_count(A) (A)->tables 115 #define SPIDER_ALTER_PARTITION_ADD ALTER_ADD_PARTITION 116 #define SPIDER_ALTER_PARTITION_DROP ALTER_DROP_PARTITION 117 #define SPIDER_ALTER_PARTITION_COALESCE ALTER_COALESCE_PARTITION 118 #define SPIDER_ALTER_PARTITION_REORGANIZE ALTER_REORGANIZE_PARTITION 119 #define SPIDER_ALTER_PARTITION_TABLE_REORG ALTER_TABLE_REORG 120 #define SPIDER_ALTER_PARTITION_REBUILD ALTER_REBUILD_PARTITION 121 #define SPIDER_WARN_LEVEL_WARN MYSQL_ERROR::WARN_LEVEL_WARN 122 #define SPIDER_WARN_LEVEL_NOTE MYSQL_ERROR::WARN_LEVEL_NOTE 123 #define SPIDER_THD_KILL_CONNECTION THD::KILL_CONNECTION 124 #endif 125 126 #if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100005 127 #define SPIDER_HAS_EXPLAIN_QUERY 128 #endif 129 130 #if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100009 131 #define SPIDER_TEST(A) MY_TEST(A) 132 #else 133 #define SPIDER_TEST(A) test(A) 134 #endif 135 136 #if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100100 137 #define SPIDER_FIELD_FIELDPTR_REQUIRES_THDPTR 138 #define SPIDER_ENGINE_CONDITION_PUSHDOWN_IS_ALWAYS_ON 139 #define SPIDER_XID_USES_xid_cache_iterate 140 #else 141 #define SPIDER_XID_STATE_HAS_in_thd 142 #endif 143 144 #if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100108 145 #define SPIDER_Item_args_arg_count_IS_PROTECTED 146 #endif 147 148 #if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100112 149 #define SPIDER_Item_func_conv_charset_conv_charset collation.collation 150 #else 151 #define SPIDER_Item_func_conv_charset_conv_charset conv_charset 152 #endif 153 154 #if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100200 155 #define SPIDER_WITHOUT_HA_STATISTIC_INCREMENT 156 #define SPIDER_init_read_record(A,B,C,D,E,F,G,H) init_read_record(A,B,C,D,E,F,G,H) 157 #define SPIDER_HAS_NEXT_THREAD_ID 158 #define SPIDER_new_THD(A) (new THD(A)) 159 #define SPIDER_order_direction_is_asc(A) (A->direction == ORDER::ORDER_ASC) 160 #else 161 #define SPIDER_init_read_record(A,B,C,D,E,F,G,H) init_read_record(A,B,C,D,F,G,H) 162 #define SPIDER_new_THD(A) (new THD()) 163 #define SPIDER_order_direction_is_asc(A) (A->asc) 164 #endif 165 166 #if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100201 167 #define SPIDER_HAS_MY_CHARLEN 168 #define SPIDER_open_temporary_table 169 #endif 170 171 #if defined(MARIADB_BASE_VERSION) 172 #if MYSQL_VERSION_ID >= 100209 173 #define SPIDER_generate_partition_syntax(A,B,C,D,E,F,G,H) generate_partition_syntax(A,B,C,E,F,G) 174 #elif MYSQL_VERSION_ID >= 100200 175 #define SPIDER_generate_partition_syntax(A,B,C,D,E,F,G,H) generate_partition_syntax(A,B,C,D,E,F,G,H) 176 #elif MYSQL_VERSION_ID >= 100007 177 #define SPIDER_generate_partition_syntax(A,B,C,D,E,F,G,H) generate_partition_syntax(B,C,D,E,F,G,H) 178 #else 179 #define SPIDER_generate_partition_syntax(A,B,C,D,E,F,G,H) generate_partition_syntax(B,C,D,E,F,G) 180 #endif 181 #else 182 #define SPIDER_generate_partition_syntax(A,B,C,D,E,F,G,H) 183 #endif 184 185 #if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100209 186 #define SPIDER_create_partition_name(A,B,C,D,E,F) create_partition_name(A,B,C,D,E,F) 187 #define SPIDER_create_subpartition_name(A,B,C,D,E,F) create_subpartition_name(A,B,C,D,E,F) 188 #define SPIDER_free_part_syntax(A,B) 189 #else 190 #define SPIDER_create_partition_name(A,B,C,D,E,F) create_partition_name(A,C,D,E,F) 191 #define SPIDER_create_subpartition_name(A,B,C,D,E,F) create_subpartition_name(A,C,D,E,F) 192 #define SPIDER_free_part_syntax(A,B) spider_my_free(A,B) 193 #endif 194 195 #if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100306 196 #define SPIDER_read_record_read_record(A) read_record() 197 #define SPIDER_has_Item_with_subquery 198 #define SPIDER_use_LEX_CSTRING_for_KEY_Field_name 199 #define SPIDER_use_LEX_CSTRING_for_Field_blob_constructor 200 #define SPIDER_use_LEX_CSTRING_for_database_tablename_alias 201 #define SPIDER_THD_db_str(A) (A)->db.str 202 #define SPIDER_THD_db_length(A) (A)->db.length 203 #define SPIDER_TABLE_LIST_db_str(A) (A)->db.str 204 #define SPIDER_TABLE_LIST_db_length(A) (A)->db.length 205 #define SPIDER_TABLE_LIST_table_name_str(A) (A)->table_name.str 206 #define SPIDER_TABLE_LIST_table_name_length(A) (A)->table_name.length 207 #define SPIDER_TABLE_LIST_alias_str(A) (A)->alias.str 208 #define SPIDER_TABLE_LIST_alias_length(A) (A)->alias.length 209 #define SPIDER_field_name_str(A) (A)->field_name.str 210 #define SPIDER_field_name_length(A) (A)->field_name.length 211 #define SPIDER_item_name_str(A) (A)->name.str 212 #define SPIDER_item_name_length(A) (A)->name.length 213 const LEX_CSTRING SPIDER_empty_string = {"", 0}; 214 #else 215 #define SPIDER_read_record_read_record(A) read_record(A) 216 #define SPIDER_THD_db_str(A) (A)->db 217 #define SPIDER_THD_db_length(A) (A)->db_length 218 #define SPIDER_TABLE_LIST_db_str(A) (A)->db 219 #define SPIDER_TABLE_LIST_db_length(A) (A)->db_length 220 #define SPIDER_TABLE_LIST_table_name_str(A) (A)->table_name 221 #define SPIDER_TABLE_LIST_table_name_length(A) (A)->table_name_length 222 #define SPIDER_TABLE_LIST_alias_str(A) (A)->alias 223 #define SPIDER_TABLE_LIST_alias_length(A) strlen((A)->alias) 224 #define SPIDER_field_name_str(A) (A)->field_name 225 #define SPIDER_field_name_length(A) strlen((A)->field_name) 226 #define SPIDER_item_name_str(A) (A)->name 227 #define SPIDER_item_name_length(A) strlen((A)->name) 228 const char SPIDER_empty_string = ""; 229 #endif 230 231 #if MYSQL_VERSION_ID >= 50500 232 #define SPIDER_HAS_HASH_VALUE_TYPE 233 #endif 234 235 #if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100400 236 #define SPIDER_date_mode_t(A) date_mode_t(A) 237 #define SPIDER_str_to_datetime(A,B,C,D,E) str_to_datetime_or_date(A,B,C,D,E) 238 #define SPIDER_get_linkage(A) A->get_linkage() 239 #else 240 #define SPIDER_date_mode_t(A) A 241 #define SPIDER_str_to_datetime(A,B,C,D,E) str_to_datetime(A,B,C,D,E) 242 #define SPIDER_get_linkage(A) A->linkage 243 #endif 244 245 #define spider_bitmap_size(A) ((A + 7) / 8) 246 #define spider_set_bit(BITMAP, BIT) \ 247 ((BITMAP)[(BIT) / 8] |= (1 << ((BIT) & 7))) 248 #define spider_clear_bit(BITMAP, BIT) \ 249 ((BITMAP)[(BIT) / 8] &= ~(1 << ((BIT) & 7))) 250 #define spider_bit_is_set(BITMAP, BIT) \ 251 (uint) ((BITMAP)[(BIT) / 8] & (1 << ((BIT) & 7))) 252 253 #define SPIDER_LINK_STATUS_NO_CHANGE 0 254 #define SPIDER_LINK_STATUS_OK 1 255 #define SPIDER_LINK_STATUS_RECOVERY 2 256 #define SPIDER_LINK_STATUS_NG 3 257 258 #define SPIDER_LINK_MON_OK 0 259 #define SPIDER_LINK_MON_NG -1 260 #define SPIDER_LINK_MON_DRAW_FEW_MON 1 261 #define SPIDER_LINK_MON_DRAW 2 262 263 #define SPIDER_TMP_SHARE_CHAR_PTR_COUNT 20 264 #define SPIDER_TMP_SHARE_UINT_COUNT 17 265 #define SPIDER_TMP_SHARE_LONG_COUNT 19 266 #define SPIDER_TMP_SHARE_LONGLONG_COUNT 3 267 268 #define SPIDER_MEM_CALC_LIST_NUM 268 269 #define SPIDER_CONN_META_BUF_LEN 64 270 271 #define SPIDER_BACKUP_DASTATUS \ 272 bool da_status; if (thd) da_status = thd->is_error(); else da_status = FALSE; 273 #define SPIDER_RESTORE_DASTATUS \ 274 if (!da_status && thd->is_error()) thd->clear_error(); 275 #define SPIDER_CONN_RESTORE_DASTATUS \ 276 if (thd && conn->error_mode) {SPIDER_RESTORE_DASTATUS;} 277 #define SPIDER_CONN_RESTORE_DASTATUS_AND_RESET_ERROR_NUM \ 278 if (thd && conn->error_mode) {SPIDER_RESTORE_DASTATUS; error_num = 0;} 279 #define SPIDER_CONN_RESTORE_DASTATUS_AND_RESET_TMP_ERROR_NUM \ 280 if (thd && conn->error_mode) {SPIDER_RESTORE_DASTATUS; tmp_error_num = 0;} 281 282 #define SPIDER_SET_FILE_POS(A) \ 283 {(A)->thd = current_thd; (A)->func_name = __func__; (A)->file_name = __FILE__; (A)->line_no = __LINE__;} 284 #define SPIDER_CLEAR_FILE_POS(A) \ 285 {DBUG_PRINT("info", ("spider thd=%p func_name=%s file_name=%s line_no=%lu", (A)->thd, (A)->func_name ? (A)->func_name : "NULL", (A)->file_name ? (A)->file_name : "NULL", (A)->line_no)); (A)->thd = NULL; (A)->func_name = NULL; (A)->file_name = NULL; (A)->line_no = 0;} 286 287 class ha_spider; 288 typedef struct st_spider_share SPIDER_SHARE; 289 typedef struct st_spider_table_mon_list SPIDER_TABLE_MON_LIST; 290 typedef struct st_spider_ip_port_conn SPIDER_IP_PORT_CONN; 291 292 #ifndef WITHOUT_SPIDER_BG_SEARCH 293 typedef struct st_spider_thread 294 { 295 uint thread_idx; 296 THD *thd; 297 volatile bool killed; 298 volatile bool thd_wait; 299 volatile bool first_free_wait; 300 volatile bool init_command; 301 volatile int error; 302 pthread_t thread; 303 pthread_cond_t cond; 304 pthread_mutex_t mutex; 305 pthread_cond_t sync_cond; 306 volatile SPIDER_SHARE *queue_first; 307 volatile SPIDER_SHARE *queue_last; 308 } SPIDER_THREAD; 309 #endif 310 311 typedef struct st_spider_file_pos 312 { 313 THD *thd; 314 const char *func_name; 315 const char *file_name; 316 ulong line_no; 317 } SPIDER_FILE_POS; 318 319 typedef struct st_spider_link_for_hash 320 { 321 ha_spider *spider; 322 int link_idx; 323 spider_string *db_table_str; 324 #ifdef SPIDER_HAS_HASH_VALUE_TYPE 325 my_hash_value_type db_table_str_hash_value; 326 #endif 327 } SPIDER_LINK_FOR_HASH; 328 329 /* alter table */ 330 typedef struct st_spider_alter_table 331 { 332 bool now_create; 333 char *table_name; 334 uint table_name_length; 335 char *tmp_char; 336 #ifdef SPIDER_HAS_HASH_VALUE_TYPE 337 my_hash_value_type table_name_hash_value; 338 #endif 339 longlong tmp_priority; 340 uint link_count; 341 uint all_link_count; 342 343 char **tmp_server_names; 344 char **tmp_tgt_table_names; 345 char **tmp_tgt_dbs; 346 char **tmp_tgt_hosts; 347 char **tmp_tgt_usernames; 348 char **tmp_tgt_passwords; 349 char **tmp_tgt_sockets; 350 char **tmp_tgt_wrappers; 351 char **tmp_tgt_ssl_cas; 352 char **tmp_tgt_ssl_capaths; 353 char **tmp_tgt_ssl_certs; 354 char **tmp_tgt_ssl_ciphers; 355 char **tmp_tgt_ssl_keys; 356 char **tmp_tgt_default_files; 357 char **tmp_tgt_default_groups; 358 char **tmp_static_link_ids; 359 long *tmp_tgt_ports; 360 long *tmp_tgt_ssl_vscs; 361 long *tmp_monitoring_binlog_pos_at_failing; 362 long *tmp_link_statuses; 363 364 uint *tmp_server_names_lengths; 365 uint *tmp_tgt_table_names_lengths; 366 uint *tmp_tgt_dbs_lengths; 367 uint *tmp_tgt_hosts_lengths; 368 uint *tmp_tgt_usernames_lengths; 369 uint *tmp_tgt_passwords_lengths; 370 uint *tmp_tgt_sockets_lengths; 371 uint *tmp_tgt_wrappers_lengths; 372 uint *tmp_tgt_ssl_cas_lengths; 373 uint *tmp_tgt_ssl_capaths_lengths; 374 uint *tmp_tgt_ssl_certs_lengths; 375 uint *tmp_tgt_ssl_ciphers_lengths; 376 uint *tmp_tgt_ssl_keys_lengths; 377 uint *tmp_tgt_default_files_lengths; 378 uint *tmp_tgt_default_groups_lengths; 379 uint *tmp_static_link_ids_lengths; 380 381 uint tmp_server_names_charlen; 382 uint tmp_tgt_table_names_charlen; 383 uint tmp_tgt_dbs_charlen; 384 uint tmp_tgt_hosts_charlen; 385 uint tmp_tgt_usernames_charlen; 386 uint tmp_tgt_passwords_charlen; 387 uint tmp_tgt_sockets_charlen; 388 uint tmp_tgt_wrappers_charlen; 389 uint tmp_tgt_ssl_cas_charlen; 390 uint tmp_tgt_ssl_capaths_charlen; 391 uint tmp_tgt_ssl_certs_charlen; 392 uint tmp_tgt_ssl_ciphers_charlen; 393 uint tmp_tgt_ssl_keys_charlen; 394 uint tmp_tgt_default_files_charlen; 395 uint tmp_tgt_default_groups_charlen; 396 uint tmp_static_link_ids_charlen; 397 398 uint tmp_server_names_length; 399 uint tmp_tgt_table_names_length; 400 uint tmp_tgt_dbs_length; 401 uint tmp_tgt_hosts_length; 402 uint tmp_tgt_usernames_length; 403 uint tmp_tgt_passwords_length; 404 uint tmp_tgt_sockets_length; 405 uint tmp_tgt_wrappers_length; 406 uint tmp_tgt_ssl_cas_length; 407 uint tmp_tgt_ssl_capaths_length; 408 uint tmp_tgt_ssl_certs_length; 409 uint tmp_tgt_ssl_ciphers_length; 410 uint tmp_tgt_ssl_keys_length; 411 uint tmp_tgt_default_files_length; 412 uint tmp_tgt_default_groups_length; 413 uint tmp_static_link_ids_length; 414 uint tmp_tgt_ports_length; 415 uint tmp_tgt_ssl_vscs_length; 416 uint tmp_monitoring_binlog_pos_at_failing_length; 417 uint tmp_link_statuses_length; 418 } SPIDER_ALTER_TABLE; 419 420 /* database connection */ 421 typedef struct st_spider_conn 422 { 423 uint conn_kind; 424 char *conn_key; 425 uint conn_key_length; 426 #ifdef SPIDER_HAS_HASH_VALUE_TYPE 427 my_hash_value_type conn_key_hash_value; 428 #endif 429 int link_idx; 430 spider_db_conn *db_conn; 431 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) 432 query_id_t hsc_query_id; 433 ulonglong hs_pre_age; 434 ulonglong hs_age; 435 #endif 436 uint opened_handlers; 437 ulonglong conn_id; 438 ulonglong connection_id; 439 query_id_t casual_read_query_id; 440 uint casual_read_current_id; 441 st_spider_conn *casual_read_base_conn; 442 pthread_mutex_t mta_conn_mutex; 443 volatile bool mta_conn_mutex_lock_already; 444 volatile bool mta_conn_mutex_unlock_later; 445 SPIDER_FILE_POS mta_conn_mutex_file_pos; 446 uint join_trx; 447 int trx_isolation; 448 bool semi_trx_isolation_chk; 449 int semi_trx_isolation; 450 bool semi_trx_chk; 451 bool semi_trx; 452 bool trx_start; 453 bool table_locked; 454 int table_lock; 455 bool disable_xa; 456 bool disable_reconnect; 457 int autocommit; 458 int sql_log_off; 459 int wait_timeout; 460 sql_mode_t sql_mode; 461 THD *thd; 462 void *another_ha_first; 463 void *another_ha_last; 464 st_spider_conn *p_small; 465 st_spider_conn *p_big; 466 st_spider_conn *c_small; 467 st_spider_conn *c_big; 468 longlong priority; 469 bool server_lost; 470 bool ignore_dup_key; 471 char *error_str; 472 int error_length; 473 time_t ping_time; 474 CHARSET_INFO *access_charset; 475 Time_zone *time_zone; 476 uint connect_timeout; 477 uint net_read_timeout; 478 uint net_write_timeout; 479 int error_mode; 480 spider_string default_database; 481 482 char *tgt_host; 483 char *tgt_username; 484 char *tgt_password; 485 char *tgt_socket; 486 char *tgt_wrapper; 487 char *tgt_ssl_ca; 488 char *tgt_ssl_capath; 489 char *tgt_ssl_cert; 490 char *tgt_ssl_cipher; 491 char *tgt_ssl_key; 492 char *tgt_default_file; 493 char *tgt_default_group; 494 long tgt_port; 495 long tgt_ssl_vsc; 496 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) 497 char *hs_sock; 498 long hs_port; 499 #endif 500 501 uint tgt_host_length; 502 uint tgt_username_length; 503 uint tgt_password_length; 504 uint tgt_socket_length; 505 uint tgt_wrapper_length; 506 uint tgt_ssl_ca_length; 507 uint tgt_ssl_capath_length; 508 uint tgt_ssl_cert_length; 509 uint tgt_ssl_cipher_length; 510 uint tgt_ssl_key_length; 511 uint tgt_default_file_length; 512 uint tgt_default_group_length; 513 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) 514 uint hs_sock_length; 515 #endif 516 uint dbton_id; 517 518 #ifndef WITHOUT_SPIDER_BG_SEARCH 519 volatile 520 #endif 521 void *quick_target; 522 #ifndef WITHOUT_SPIDER_BG_SEARCH 523 volatile bool bg_init; 524 volatile bool bg_break; 525 volatile bool bg_kill; 526 volatile bool bg_caller_wait; 527 volatile bool bg_caller_sync_wait; 528 volatile bool bg_search; 529 volatile bool bg_discard_result; 530 volatile bool bg_direct_sql; 531 volatile bool bg_exec_sql; 532 volatile bool bg_get_job_stack; 533 volatile bool bg_get_job_stack_off; 534 volatile uint bg_simple_action; 535 THD *bg_thd; 536 pthread_t bg_thread; 537 pthread_cond_t bg_conn_cond; 538 pthread_mutex_t bg_conn_mutex; 539 pthread_cond_t bg_conn_sync_cond; 540 pthread_mutex_t bg_conn_sync_mutex; 541 pthread_mutex_t bg_conn_chain_mutex; 542 pthread_mutex_t *bg_conn_chain_mutex_ptr; 543 volatile void *bg_target; 544 volatile int *bg_error_num; 545 volatile ulong bg_sql_type; 546 pthread_mutex_t bg_job_stack_mutex; 547 DYNAMIC_ARRAY bg_job_stack; 548 uint bg_job_stack_id; 549 const char *bg_job_stack_func_name; 550 const char *bg_job_stack_file_name; 551 ulong bg_job_stack_line_no; 552 uint bg_job_stack_cur_pos; 553 #endif 554 #ifndef WITHOUT_SPIDER_BG_SEARCH 555 volatile 556 #endif 557 int *need_mon; 558 int *conn_need_mon; 559 560 bool use_for_active_standby; 561 bool in_before_query; 562 563 bool queued_connect; 564 bool queued_ping; 565 bool queued_trx_isolation; 566 bool queued_semi_trx_isolation; 567 bool queued_wait_timeout; 568 bool queued_autocommit; 569 bool queued_sql_log_off; 570 bool queued_sql_mode; 571 bool queued_time_zone; 572 bool queued_trx_start; 573 bool queued_xa_start; 574 bool queued_net_timeout; 575 SPIDER_SHARE *queued_connect_share; 576 int queued_connect_link_idx; 577 ha_spider *queued_ping_spider; 578 int queued_ping_link_idx; 579 int queued_trx_isolation_val; 580 int queued_semi_trx_isolation_val; 581 int queued_wait_timeout_val; 582 bool queued_autocommit_val; 583 bool queued_sql_log_off_val; 584 sql_mode_t queued_sql_mode_val; 585 Time_zone *queued_time_zone_val; 586 XID *queued_xa_start_xid; 587 588 #ifdef HA_CAN_BULK_ACCESS 589 uint bulk_access_requests; 590 uint bulk_access_sended; 591 int bulk_access_error_num; 592 st_spider_conn *bulk_access_next; 593 #endif 594 595 bool disable_connect_retry; /* TRUE if it is unnecessary to 596 retry to connect after a 597 connection error */ 598 bool connect_error_with_message; 599 char connect_error_msg[MYSQL_ERRMSG_SIZE]; 600 int connect_error; 601 THD *connect_error_thd; 602 query_id_t connect_error_query_id; 603 time_t connect_error_time; 604 605 #ifdef SPIDER_HAS_GROUP_BY_HANDLER 606 SPIDER_CONN_HOLDER *conn_holder_for_direct_join; 607 SPIDER_LINK_IDX_CHAIN *link_idx_chain; 608 #endif 609 SPIDER_IP_PORT_CONN *ip_port_conn; 610 } SPIDER_CONN; 611 612 typedef struct st_spider_lgtm_tblhnd_share 613 { 614 char *table_name; 615 uint table_name_length; 616 #ifdef SPIDER_HAS_HASH_VALUE_TYPE 617 my_hash_value_type table_path_hash_value; 618 #endif 619 pthread_mutex_t auto_increment_mutex; 620 volatile bool auto_increment_init; 621 volatile ulonglong auto_increment_lclval; 622 ulonglong auto_increment_value; 623 } SPIDER_LGTM_TBLHND_SHARE; 624 625 #ifdef WITH_PARTITION_STORAGE_ENGINE 626 typedef struct st_spider_patition_handler_share 627 { 628 uint use_count; 629 TABLE *table; 630 #ifdef SPIDER_HAS_HASH_VALUE_TYPE 631 my_hash_value_type table_hash_value; 632 #endif 633 void *creator; 634 void **handlers; 635 uchar *searched_bitmap; 636 uchar *ft_discard_bitmap; 637 uchar *idx_read_bitmap; 638 uchar *idx_write_bitmap; 639 uchar *rnd_read_bitmap; 640 uchar *rnd_write_bitmap; 641 bool between_flg; 642 bool idx_bitmap_is_set; 643 bool rnd_bitmap_is_set; 644 query_id_t parallel_search_query_id; 645 } SPIDER_PARTITION_HANDLER_SHARE; 646 647 typedef struct st_spider_patition_share 648 { 649 char *table_name; 650 uint table_name_length; 651 #ifdef SPIDER_HAS_HASH_VALUE_TYPE 652 my_hash_value_type table_path_hash_value; 653 #endif 654 uint use_count; 655 pthread_mutex_t sts_mutex; 656 pthread_mutex_t crd_mutex; 657 pthread_mutex_t pt_handler_mutex; 658 HASH pt_handler_hash; 659 uint pt_handler_hash_id; 660 const char *pt_handler_hash_func_name; 661 const char *pt_handler_hash_file_name; 662 ulong pt_handler_hash_line_no; 663 664 volatile bool sts_init; 665 volatile bool crd_init; 666 volatile time_t sts_get_time; 667 volatile time_t crd_get_time; 668 ha_statistics stat; 669 670 longlong *cardinality; 671 /* 672 volatile SPIDER_PARTITION_HANDLER_SHARE *partition_handler_share; 673 */ 674 } SPIDER_PARTITION_SHARE; 675 #endif 676 677 typedef struct st_spider_transaction 678 { 679 bool trx_start; 680 bool trx_xa; 681 bool trx_consistent_snapshot; 682 bool trx_xa_prepared; 683 684 bool use_consistent_snapshot; 685 bool internal_xa; 686 uint internal_xa_snapshot; 687 688 query_id_t query_id; 689 bool tmp_flg; 690 bool registed_allocated_thds; 691 692 bool updated_in_this_trx; 693 694 THD *thd; 695 #ifdef SPIDER_HAS_HASH_VALUE_TYPE 696 my_hash_value_type thd_hash_value; 697 #endif 698 XID xid; 699 HASH trx_conn_hash; 700 uint trx_conn_hash_id; 701 const char *trx_conn_hash_func_name; 702 const char *trx_conn_hash_file_name; 703 ulong trx_conn_hash_line_no; 704 HASH trx_another_conn_hash; 705 uint trx_another_conn_hash_id; 706 const char *trx_another_conn_hash_func_name; 707 const char *trx_another_conn_hash_file_name; 708 ulong trx_another_conn_hash_line_no; 709 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) 710 HASH trx_hs_r_conn_hash; 711 uint trx_hs_r_conn_hash_id; 712 const char *trx_hs_r_conn_hash_func_name; 713 const char *trx_hs_r_conn_hash_file_name; 714 ulong trx_hs_r_conn_hash_line_no; 715 HASH trx_hs_w_conn_hash; 716 uint trx_hs_w_conn_hash_id; 717 const char *trx_hs_w_conn_hash_func_name; 718 const char *trx_hs_w_conn_hash_file_name; 719 ulong trx_hs_w_conn_hash_line_no; 720 #endif 721 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) 722 HASH trx_direct_hs_r_conn_hash; 723 uint trx_direct_hs_r_conn_hash_id; 724 const char *trx_direct_hs_r_conn_hash_func_name; 725 const char *trx_direct_hs_r_conn_hash_file_name; 726 ulong trx_direct_hs_r_conn_hash_line_no; 727 HASH trx_direct_hs_w_conn_hash; 728 uint trx_direct_hs_w_conn_hash_id; 729 const char *trx_direct_hs_w_conn_hash_func_name; 730 const char *trx_direct_hs_w_conn_hash_file_name; 731 ulong trx_direct_hs_w_conn_hash_line_no; 732 #endif 733 HASH trx_alter_table_hash; 734 uint trx_alter_table_hash_id; 735 const char *trx_alter_table_hash_func_name; 736 const char *trx_alter_table_hash_file_name; 737 ulong trx_alter_table_hash_line_no; 738 HASH trx_ha_hash; 739 uint trx_ha_hash_id; 740 const char *trx_ha_hash_func_name; 741 const char *trx_ha_hash_file_name; 742 ulong trx_ha_hash_line_no; 743 uint trx_ha_reuse_count; 744 XID_STATE internal_xid_state; 745 SPIDER_CONN *join_trx_top; 746 ulonglong spider_thread_id; 747 ulonglong trx_conn_adjustment; 748 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) 749 ulonglong trx_hs_r_conn_adjustment; 750 ulonglong trx_hs_w_conn_adjustment; 751 #endif 752 uint locked_connections; 753 754 ulonglong direct_update_count; 755 ulonglong direct_delete_count; 756 ulonglong direct_order_limit_count; 757 ulonglong direct_aggregate_count; 758 ulonglong parallel_search_count; 759 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) 760 ulonglong hs_result_free_count; 761 #endif 762 763 #ifdef HA_CAN_BULK_ACCESS 764 SPIDER_CONN *bulk_access_conn_first; 765 SPIDER_CONN *bulk_access_conn_last; 766 #endif 767 768 pthread_mutex_t *udf_table_mutexes; 769 CHARSET_INFO *udf_access_charset; 770 spider_string *udf_set_names; 771 772 time_t mem_calc_merge_time; 773 const char *alloc_func_name[SPIDER_MEM_CALC_LIST_NUM]; 774 const char *alloc_file_name[SPIDER_MEM_CALC_LIST_NUM]; 775 ulong alloc_line_no[SPIDER_MEM_CALC_LIST_NUM]; 776 ulonglong total_alloc_mem[SPIDER_MEM_CALC_LIST_NUM]; 777 longlong current_alloc_mem[SPIDER_MEM_CALC_LIST_NUM]; 778 ulonglong alloc_mem_count[SPIDER_MEM_CALC_LIST_NUM]; 779 ulonglong free_mem_count[SPIDER_MEM_CALC_LIST_NUM]; 780 ulonglong total_alloc_mem_buffer[SPIDER_MEM_CALC_LIST_NUM]; 781 longlong current_alloc_mem_buffer[SPIDER_MEM_CALC_LIST_NUM]; 782 ulonglong alloc_mem_count_buffer[SPIDER_MEM_CALC_LIST_NUM]; 783 ulonglong free_mem_count_buffer[SPIDER_MEM_CALC_LIST_NUM]; 784 785 MEM_ROOT mem_root; 786 787 /* for transaction level query */ 788 SPIDER_SHARE *tmp_share; 789 char *tmp_connect_info[SPIDER_TMP_SHARE_CHAR_PTR_COUNT]; 790 uint tmp_connect_info_length[SPIDER_TMP_SHARE_UINT_COUNT]; 791 long tmp_long[SPIDER_TMP_SHARE_LONG_COUNT]; 792 longlong tmp_longlong[SPIDER_TMP_SHARE_LONGLONG_COUNT]; 793 ha_spider *tmp_spider; 794 int tmp_need_mon; 795 spider_db_handler *tmp_dbton_handler[SPIDER_DBTON_SIZE]; 796 } SPIDER_TRX; 797 798 typedef struct st_spider_share 799 { 800 char *table_name; 801 uint table_name_length; 802 uint use_count; 803 uint link_count; 804 uint all_link_count; 805 uint link_bitmap_size; 806 pthread_mutex_t mutex; 807 pthread_mutex_t sts_mutex; 808 pthread_mutex_t crd_mutex; 809 /* 810 pthread_mutex_t auto_increment_mutex; 811 */ 812 THR_LOCK lock; 813 TABLE_SHARE *table_share; 814 SPIDER_LGTM_TBLHND_SHARE *lgtm_tblhnd_share; 815 #ifdef SPIDER_HAS_HASH_VALUE_TYPE 816 my_hash_value_type table_name_hash_value; 817 #ifdef WITH_PARTITION_STORAGE_ENGINE 818 my_hash_value_type table_path_hash_value; 819 #endif 820 #endif 821 822 volatile bool init; 823 volatile bool init_error; 824 volatile time_t init_error_time; 825 volatile bool link_status_init; 826 uchar *table_mon_mutex_bitmap; 827 volatile bool sts_init; 828 volatile time_t sts_get_time; 829 #ifndef WITHOUT_SPIDER_BG_SEARCH 830 volatile time_t bg_sts_try_time; 831 volatile double bg_sts_interval; 832 volatile int bg_sts_mode; 833 #ifdef WITH_PARTITION_STORAGE_ENGINE 834 volatile int bg_sts_sync; 835 #endif 836 volatile bool bg_sts_init; 837 volatile bool bg_sts_kill; 838 volatile bool bg_sts_thd_wait; 839 THD *bg_sts_thd; 840 pthread_t bg_sts_thread; 841 pthread_cond_t bg_sts_cond; 842 pthread_cond_t bg_sts_sync_cond; 843 volatile bool crd_init; 844 #endif 845 volatile time_t crd_get_time; 846 #ifndef WITHOUT_SPIDER_BG_SEARCH 847 volatile time_t bg_crd_try_time; 848 volatile double bg_crd_interval; 849 volatile int bg_crd_mode; 850 #ifdef WITH_PARTITION_STORAGE_ENGINE 851 volatile int bg_crd_sync; 852 #endif 853 volatile bool bg_crd_init; 854 volatile bool bg_crd_kill; 855 volatile bool bg_crd_thd_wait; 856 THD *bg_crd_thd; 857 pthread_t bg_crd_thread; 858 pthread_cond_t bg_crd_cond; 859 pthread_cond_t bg_crd_sync_cond; 860 #endif 861 #ifndef WITHOUT_SPIDER_BG_SEARCH 862 volatile bool bg_mon_init; 863 volatile bool bg_mon_kill; 864 THD **bg_mon_thds; 865 pthread_t *bg_mon_threads; 866 pthread_mutex_t *bg_mon_mutexes; 867 pthread_cond_t *bg_mon_conds; 868 pthread_cond_t *bg_mon_sleep_conds; 869 #endif 870 #ifndef WITHOUT_SPIDER_BG_SEARCH 871 /* static bg thread for sts and crd */ 872 TABLE table; 873 ha_spider *sts_spider; 874 ha_spider *crd_spider; 875 SPIDER_THREAD *sts_thread; 876 SPIDER_THREAD *crd_thread; 877 volatile bool sts_spider_init; 878 volatile bool sts_working; 879 volatile bool sts_wait; 880 volatile bool crd_spider_init; 881 volatile bool crd_working; 882 volatile bool crd_wait; 883 volatile SPIDER_SHARE *sts_prev; 884 volatile SPIDER_SHARE *sts_next; 885 volatile SPIDER_SHARE *crd_prev; 886 volatile SPIDER_SHARE *crd_next; 887 #endif 888 889 MEM_ROOT mem_root; 890 891 /* 892 volatile bool auto_increment_init; 893 volatile ulonglong auto_increment_lclval; 894 */ 895 ha_statistics stat; 896 897 longlong static_records_for_status; 898 longlong static_mean_rec_length; 899 900 int bitmap_size; 901 spider_string *key_hint; 902 CHARSET_INFO *access_charset; 903 longlong *static_key_cardinality; 904 longlong *cardinality; 905 uchar *cardinality_upd; 906 longlong additional_table_flags; 907 bool have_recovery_link; 908 909 #ifndef WITHOUT_SPIDER_BG_SEARCH 910 int sts_bg_mode; 911 #endif 912 double sts_interval; 913 int sts_mode; 914 #ifdef WITH_PARTITION_STORAGE_ENGINE 915 int sts_sync; 916 #endif 917 int store_last_sts; 918 int load_sts_at_startup; 919 #ifndef WITHOUT_SPIDER_BG_SEARCH 920 int crd_bg_mode; 921 #endif 922 double crd_interval; 923 int crd_mode; 924 #ifdef WITH_PARTITION_STORAGE_ENGINE 925 int crd_sync; 926 #endif 927 int store_last_crd; 928 int load_crd_at_startup; 929 int crd_type; 930 double crd_weight; 931 longlong internal_offset; 932 longlong internal_limit; 933 longlong split_read; 934 double semi_split_read; 935 longlong semi_split_read_limit; 936 int init_sql_alloc_size; 937 int reset_sql_alloc; 938 int multi_split_read; 939 int max_order; 940 int semi_table_lock; 941 int semi_table_lock_conn; 942 int selupd_lock_mode; 943 int query_cache; 944 int query_cache_sync; 945 int internal_delayed; 946 int bulk_size; 947 int bulk_update_mode; 948 int bulk_update_size; 949 int internal_optimize; 950 int internal_optimize_local; 951 double scan_rate; 952 double read_rate; 953 longlong priority; 954 int quick_mode; 955 longlong quick_page_size; 956 longlong quick_page_byte; 957 int low_mem_read; 958 int table_count_mode; 959 int select_column_mode; 960 #ifndef WITHOUT_SPIDER_BG_SEARCH 961 int bgs_mode; 962 longlong bgs_first_read; 963 longlong bgs_second_read; 964 #endif 965 longlong first_read; 966 longlong second_read; 967 int auto_increment_mode; 968 int use_table_charset; 969 int use_pushdown_udf; 970 int skip_default_condition; 971 int skip_parallel_search; 972 int direct_dup_insert; 973 longlong direct_order_limit; 974 int read_only_mode; 975 int error_read_mode; 976 int error_write_mode; 977 int active_link_count; 978 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) 979 longlong hs_result_free_size; 980 #endif 981 #ifdef HA_CAN_BULK_ACCESS 982 int bulk_access_free; 983 #endif 984 #ifdef HA_CAN_FORCE_BULK_UPDATE 985 int force_bulk_update; 986 #endif 987 #ifdef HA_CAN_FORCE_BULK_DELETE 988 int force_bulk_delete; 989 #endif 990 int casual_read; 991 int delete_all_rows_type; 992 993 int bka_mode; 994 char *bka_engine; 995 int bka_engine_length; 996 997 #ifdef SPIDER_HAS_HASH_VALUE_TYPE 998 my_hash_value_type *conn_keys_hash_value; 999 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) 1000 my_hash_value_type *hs_read_conn_keys_hash_value; 1001 my_hash_value_type *hs_write_conn_keys_hash_value; 1002 #endif 1003 #endif 1004 char **server_names; 1005 char **tgt_table_names; 1006 char **tgt_dbs; 1007 char **tgt_hosts; 1008 char **tgt_usernames; 1009 char **tgt_passwords; 1010 char **tgt_sockets; 1011 char **tgt_wrappers; 1012 char **tgt_ssl_cas; 1013 char **tgt_ssl_capaths; 1014 char **tgt_ssl_certs; 1015 char **tgt_ssl_ciphers; 1016 char **tgt_ssl_keys; 1017 char **tgt_default_files; 1018 char **tgt_default_groups; 1019 char **static_link_ids; 1020 char **tgt_pk_names; 1021 char **tgt_sequence_names; 1022 char **conn_keys; 1023 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) 1024 char **hs_read_socks; 1025 char **hs_write_socks; 1026 char **hs_read_conn_keys; 1027 char **hs_write_conn_keys; 1028 #endif 1029 long *tgt_ports; 1030 long *tgt_ssl_vscs; 1031 long *link_statuses; 1032 #ifndef WITHOUT_SPIDER_BG_SEARCH 1033 long *monitoring_bg_flag; 1034 long *monitoring_bg_kind; 1035 #endif 1036 long *monitoring_binlog_pos_at_failing; 1037 long *monitoring_flag; 1038 long *monitoring_kind; 1039 #ifndef WITHOUT_SPIDER_BG_SEARCH 1040 longlong *monitoring_bg_interval; 1041 #endif 1042 longlong *monitoring_limit; 1043 longlong *monitoring_sid; 1044 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) 1045 long *use_hs_reads; 1046 long *use_hs_writes; 1047 long *hs_read_ports; 1048 long *hs_write_ports; 1049 long *hs_write_to_reads; 1050 #endif 1051 long *use_handlers; 1052 long *connect_timeouts; 1053 long *net_read_timeouts; 1054 long *net_write_timeouts; 1055 long *access_balances; 1056 long *bka_table_name_types; 1057 1058 uint *server_names_lengths; 1059 uint *tgt_table_names_lengths; 1060 uint *tgt_dbs_lengths; 1061 uint *tgt_hosts_lengths; 1062 uint *tgt_usernames_lengths; 1063 uint *tgt_passwords_lengths; 1064 uint *tgt_sockets_lengths; 1065 uint *tgt_wrappers_lengths; 1066 uint *tgt_ssl_cas_lengths; 1067 uint *tgt_ssl_capaths_lengths; 1068 uint *tgt_ssl_certs_lengths; 1069 uint *tgt_ssl_ciphers_lengths; 1070 uint *tgt_ssl_keys_lengths; 1071 uint *tgt_default_files_lengths; 1072 uint *tgt_default_groups_lengths; 1073 uint *static_link_ids_lengths; 1074 uint *tgt_pk_names_lengths; 1075 uint *tgt_sequence_names_lengths; 1076 uint *conn_keys_lengths; 1077 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) 1078 uint *hs_read_socks_lengths; 1079 uint *hs_write_socks_lengths; 1080 uint *hs_read_conn_keys_lengths; 1081 uint *hs_write_conn_keys_lengths; 1082 #endif 1083 uint *sql_dbton_ids; 1084 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) 1085 uint *hs_dbton_ids; 1086 #endif 1087 1088 uint server_names_charlen; 1089 uint tgt_table_names_charlen; 1090 uint tgt_dbs_charlen; 1091 uint tgt_hosts_charlen; 1092 uint tgt_usernames_charlen; 1093 uint tgt_passwords_charlen; 1094 uint tgt_sockets_charlen; 1095 uint tgt_wrappers_charlen; 1096 uint tgt_ssl_cas_charlen; 1097 uint tgt_ssl_capaths_charlen; 1098 uint tgt_ssl_certs_charlen; 1099 uint tgt_ssl_ciphers_charlen; 1100 uint tgt_ssl_keys_charlen; 1101 uint tgt_default_files_charlen; 1102 uint tgt_default_groups_charlen; 1103 uint static_link_ids_charlen; 1104 uint tgt_pk_names_charlen; 1105 uint tgt_sequence_names_charlen; 1106 uint conn_keys_charlen; 1107 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) 1108 uint hs_read_socks_charlen; 1109 uint hs_write_socks_charlen; 1110 uint hs_read_conn_keys_charlen; 1111 uint hs_write_conn_keys_charlen; 1112 #endif 1113 1114 uint server_names_length; 1115 uint tgt_table_names_length; 1116 uint tgt_dbs_length; 1117 uint tgt_hosts_length; 1118 uint tgt_usernames_length; 1119 uint tgt_passwords_length; 1120 uint tgt_sockets_length; 1121 uint tgt_wrappers_length; 1122 uint tgt_ssl_cas_length; 1123 uint tgt_ssl_capaths_length; 1124 uint tgt_ssl_certs_length; 1125 uint tgt_ssl_ciphers_length; 1126 uint tgt_ssl_keys_length; 1127 uint tgt_default_files_length; 1128 uint tgt_default_groups_length; 1129 uint static_link_ids_length; 1130 uint tgt_pk_names_length; 1131 uint tgt_sequence_names_length; 1132 uint conn_keys_length; 1133 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) 1134 uint hs_read_socks_length; 1135 uint hs_write_socks_length; 1136 uint hs_read_conn_keys_length; 1137 uint hs_write_conn_keys_length; 1138 #endif 1139 uint tgt_ports_length; 1140 uint tgt_ssl_vscs_length; 1141 uint link_statuses_length; 1142 #ifndef WITHOUT_SPIDER_BG_SEARCH 1143 uint monitoring_bg_flag_length; 1144 uint monitoring_bg_kind_length; 1145 #endif 1146 uint monitoring_binlog_pos_at_failing_length; 1147 uint monitoring_flag_length; 1148 uint monitoring_kind_length; 1149 #ifndef WITHOUT_SPIDER_BG_SEARCH 1150 uint monitoring_bg_interval_length; 1151 #endif 1152 uint monitoring_limit_length; 1153 uint monitoring_sid_length; 1154 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) 1155 uint use_hs_reads_length; 1156 uint use_hs_writes_length; 1157 uint hs_read_ports_length; 1158 uint hs_write_ports_length; 1159 uint hs_write_to_reads_length; 1160 #endif 1161 uint use_handlers_length; 1162 uint connect_timeouts_length; 1163 uint net_read_timeouts_length; 1164 uint net_write_timeouts_length; 1165 uint access_balances_length; 1166 uint bka_table_name_types_length; 1167 1168 /* for dbton */ 1169 uchar dbton_bitmap[spider_bitmap_size(SPIDER_DBTON_SIZE)]; 1170 spider_db_share *dbton_share[SPIDER_DBTON_SIZE]; 1171 uint use_dbton_count; 1172 uint use_dbton_ids[SPIDER_DBTON_SIZE]; 1173 uint dbton_id_to_seq[SPIDER_DBTON_SIZE]; 1174 uint use_sql_dbton_count; 1175 uint use_sql_dbton_ids[SPIDER_DBTON_SIZE]; 1176 uint sql_dbton_id_to_seq[SPIDER_DBTON_SIZE]; 1177 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) 1178 uint use_hs_dbton_count; 1179 uint use_hs_dbton_ids[SPIDER_DBTON_SIZE]; 1180 uint hs_dbton_id_to_seq[SPIDER_DBTON_SIZE]; 1181 #endif 1182 1183 SPIDER_ALTER_TABLE alter_table; 1184 #ifdef WITH_PARTITION_STORAGE_ENGINE 1185 SPIDER_PARTITION_SHARE *partition_share; 1186 #endif 1187 } SPIDER_SHARE; 1188 1189 typedef struct st_spider_link_pack 1190 { 1191 SPIDER_SHARE *share; 1192 int link_idx; 1193 } SPIDER_LINK_PACK; 1194 1195 typedef struct st_spider_init_error_table 1196 { 1197 char *table_name; 1198 uint table_name_length; 1199 #ifdef SPIDER_HAS_HASH_VALUE_TYPE 1200 my_hash_value_type table_name_hash_value; 1201 #endif 1202 bool init_error_with_message; 1203 char init_error_msg[MYSQL_ERRMSG_SIZE]; 1204 volatile int init_error; 1205 volatile time_t init_error_time; 1206 } SPIDER_INIT_ERROR_TABLE; 1207 1208 typedef struct st_spider_direct_sql 1209 { 1210 int table_count; 1211 char **db_names; 1212 char **table_names; 1213 TABLE **tables; 1214 int *iop; 1215 1216 #if MYSQL_VERSION_ID < 50500 1217 #else 1218 /* for using real table */ 1219 bool real_table_used; 1220 TABLE_LIST *table_list_first; 1221 TABLE_LIST *table_list; 1222 uchar *real_table_bitmap; 1223 Open_tables_backup open_tables_backup; 1224 THD *open_tables_thd; 1225 #endif 1226 1227 char *sql; 1228 ulong sql_length; 1229 1230 SPIDER_TRX *trx; 1231 SPIDER_CONN *conn; 1232 1233 bool modified_non_trans_table; 1234 1235 int table_loop_mode; 1236 longlong priority; 1237 int connect_timeout; 1238 int net_read_timeout; 1239 int net_write_timeout; 1240 longlong bulk_insert_rows; 1241 int connection_channel; 1242 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) 1243 int access_mode; 1244 #endif 1245 #if MYSQL_VERSION_ID < 50500 1246 #else 1247 int use_real_table; 1248 #endif 1249 int error_rw_mode; 1250 1251 char *server_name; 1252 char *tgt_default_db_name; 1253 char *tgt_host; 1254 char *tgt_username; 1255 char *tgt_password; 1256 char *tgt_socket; 1257 char *tgt_wrapper; 1258 char *tgt_ssl_ca; 1259 char *tgt_ssl_capath; 1260 char *tgt_ssl_cert; 1261 char *tgt_ssl_cipher; 1262 char *tgt_ssl_key; 1263 char *tgt_default_file; 1264 char *tgt_default_group; 1265 char *conn_key; 1266 long tgt_port; 1267 long tgt_ssl_vsc; 1268 1269 uint server_name_length; 1270 uint tgt_default_db_name_length; 1271 uint tgt_host_length; 1272 uint tgt_username_length; 1273 uint tgt_password_length; 1274 uint tgt_socket_length; 1275 uint tgt_wrapper_length; 1276 uint tgt_ssl_ca_length; 1277 uint tgt_ssl_capath_length; 1278 uint tgt_ssl_cert_length; 1279 uint tgt_ssl_cipher_length; 1280 uint tgt_ssl_key_length; 1281 uint tgt_default_file_length; 1282 uint tgt_default_group_length; 1283 uint conn_key_length; 1284 uint dbton_id; 1285 #ifdef SPIDER_HAS_HASH_VALUE_TYPE 1286 my_hash_value_type conn_key_hash_value; 1287 #endif 1288 1289 pthread_mutex_t *bg_mutex; 1290 pthread_cond_t *bg_cond; 1291 volatile st_spider_direct_sql *prev; 1292 volatile st_spider_direct_sql *next; 1293 void *parent; 1294 } SPIDER_DIRECT_SQL; 1295 1296 typedef struct st_spider_bg_direct_sql 1297 { 1298 longlong called_cnt; 1299 char bg_error_msg[MYSQL_ERRMSG_SIZE]; 1300 volatile int bg_error; 1301 volatile bool modified_non_trans_table; 1302 pthread_mutex_t bg_mutex; 1303 pthread_cond_t bg_cond; 1304 volatile SPIDER_DIRECT_SQL *direct_sql; 1305 } SPIDER_BG_DIRECT_SQL; 1306 1307 typedef struct st_spider_mon_table_result 1308 { 1309 int result_status; 1310 SPIDER_TRX *trx; 1311 } SPIDER_MON_TABLE_RESULT; 1312 1313 typedef struct st_spider_table_mon 1314 { 1315 SPIDER_SHARE *share; 1316 uint32 server_id; 1317 st_spider_table_mon_list *parent; 1318 st_spider_table_mon *next; 1319 } SPIDER_TABLE_MON; 1320 1321 typedef struct st_spider_table_mon_list 1322 { 1323 char *key; 1324 uint key_length; 1325 #ifdef SPIDER_HAS_HASH_VALUE_TYPE 1326 my_hash_value_type key_hash_value; 1327 #endif 1328 1329 uint use_count; 1330 uint mutex_hash; 1331 ulonglong mon_table_cache_version; 1332 1333 char *table_name; 1334 int link_id; 1335 uint table_name_length; 1336 1337 int list_size; 1338 SPIDER_TABLE_MON *first; 1339 SPIDER_TABLE_MON *current; 1340 volatile int mon_status; 1341 1342 SPIDER_SHARE *share; 1343 1344 pthread_mutex_t caller_mutex; 1345 pthread_mutex_t receptor_mutex; 1346 pthread_mutex_t monitor_mutex; 1347 pthread_mutex_t update_status_mutex; 1348 volatile int last_caller_result; 1349 volatile int last_receptor_result; 1350 volatile int last_mon_result; 1351 } SPIDER_TABLE_MON_LIST; 1352 1353 typedef struct st_spider_copy_table_conn 1354 { 1355 SPIDER_SHARE *share; 1356 int link_idx; 1357 SPIDER_CONN *conn; 1358 spider_db_copy_table *copy_table; 1359 ha_spider *spider; 1360 int need_mon; 1361 #ifndef WITHOUT_SPIDER_BG_SEARCH 1362 int bg_error_num; 1363 #endif 1364 st_spider_copy_table_conn *next; 1365 } SPIDER_COPY_TABLE_CONN; 1366 1367 typedef struct st_spider_copy_tables 1368 { 1369 SPIDER_TRX *trx; 1370 char *spider_db_name; 1371 int spider_db_name_length; 1372 char *spider_table_name; 1373 int spider_table_name_length; 1374 char *spider_real_table_name; 1375 int spider_real_table_name_length; 1376 TABLE_LIST spider_table_list; 1377 CHARSET_INFO *access_charset; 1378 1379 SPIDER_COPY_TABLE_CONN *table_conn[2]; 1380 bool use_auto_mode[2]; 1381 int link_idx_count[2]; 1382 int *link_idxs[2]; 1383 1384 int bulk_insert_interval; 1385 longlong bulk_insert_rows; 1386 int use_table_charset; 1387 int use_transaction; 1388 #ifndef WITHOUT_SPIDER_BG_SEARCH 1389 int bg_mode; 1390 #endif 1391 1392 char *database; 1393 1394 int database_length; 1395 } SPIDER_COPY_TABLES; 1396 1397 class SPIDER_SORT 1398 { 1399 public: 1400 ulong sort; 1401 }; 1402 1403 typedef struct st_spider_trx_ha 1404 { 1405 char *table_name; 1406 uint table_name_length; 1407 SPIDER_TRX *trx; 1408 SPIDER_SHARE *share; 1409 uint link_count; 1410 uint link_bitmap_size; 1411 uint *conn_link_idx; 1412 uchar *conn_can_fo; 1413 bool wait_for_reusing; 1414 } SPIDER_TRX_HA; 1415 1416 #ifdef HA_CAN_BULK_ACCESS 1417 typedef struct st_spider_bulk_access_link 1418 { 1419 ha_spider *spider; 1420 uint sequence_num; 1421 bool used; 1422 bool called; 1423 MEM_ROOT mem_root; 1424 st_spider_bulk_access_link *next; 1425 } SPIDER_BULK_ACCESS_LINK; 1426 #endif 1427 1428 #define SPIDER_INT_HLD_TGT_SIZE 100 1429 typedef struct st_spider_int_hld 1430 { 1431 uint tgt_num; 1432 int tgt[SPIDER_INT_HLD_TGT_SIZE]; 1433 st_spider_int_hld *next; 1434 } SPIDER_INT_HLD; 1435 1436 typedef struct st_spider_item_hld 1437 { 1438 uint tgt_num; 1439 Item *item; 1440 #ifdef SPIDER_ITEM_STRING_WITHOUT_SET_STR_WITH_COPY_AND_THDPTR 1441 bool init_mem_root; 1442 MEM_ROOT mem_root; 1443 #endif 1444 st_spider_item_hld *next; 1445 } SPIDER_ITEM_HLD; 1446 1447 char *spider_create_string( 1448 const char *str, 1449 uint length 1450 ); 1451 1452 1453 typedef struct st_spider_ip_port_conn { 1454 char *key; 1455 size_t key_len; 1456 #ifdef SPIDER_HAS_HASH_VALUE_TYPE 1457 my_hash_value_type key_hash_value; 1458 #endif 1459 char *remote_ip_str; 1460 long remote_port; 1461 ulong ip_port_count; 1462 volatile ulong waiting_count; 1463 pthread_mutex_t mutex; 1464 pthread_cond_t cond; 1465 ulonglong conn_id; /* each conn has it's own conn_id */ 1466 } SPIDER_IP_PORT_CONN; 1467