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