1
/* Copyright (C) 2008-2009 Kentoku Shiba
3
This program is free software; you can redistribute it and/or modify
4
it under the terms of the GNU General Public License as published by
5
the Free Software Foundation; version 2 of the License.
7
This program is distributed in the hope that it will be useful,
8
but WITHOUT ANY WARRANTY; without even the implied warranty of
9
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
GNU General Public License for more details.
12
You should have received a copy of the GNU General Public License
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
16
#define MYSQL_SERVER 1
17
#include "mysql_priv.h"
18
#include <mysql/plugin.h>
20
#include "spd_param.h"
21
#include "spd_db_include.h"
22
#include "spd_include.h"
23
#include "spd_sys_table.h"
24
#include "ha_spider.h"
26
#include "spd_db_conn.h"
27
#include "spd_table.h"
30
extern handlerton *spider_hton_ptr;
31
volatile ulonglong spider_thread_id = 1;
33
// for spider_alter_tables
34
uchar *spider_alter_tbl_get_key(
35
SPIDER_ALTER_TABLE *alter_table,
37
my_bool not_used __attribute__ ((unused))
39
DBUG_ENTER("spider_alter_tbl_get_key");
40
*length = alter_table->table_name_length;
41
DBUG_PRINT("info",("spider table_name_length=%d", *length));
42
DBUG_PRINT("info",("spider table_name=%s", alter_table->table_name));
43
DBUG_RETURN((uchar*) alter_table->table_name);
46
int spider_free_trx_conn(
52
DBUG_ENTER("spider_free_trx_conn");
55
THDVAR(trx->thd, conn_recycle_mode) != 2
57
while ((conn = (SPIDER_CONN*) hash_element(&trx->trx_conn_hash,
62
DBUG_ASSERT(!trx_free);
65
spider_free_conn_from_trx(trx, conn, FALSE, trx_free, &roop_count);
67
trx->trx_conn_adjustment++;
72
int spider_free_trx_another_conn(
76
int error_num, tmp_error_num;
80
DBUG_ENTER("spider_free_trx_another_conn");
82
while ((conn = (SPIDER_CONN*) hash_element(&trx->trx_another_conn_hash,
85
tmp_spider.conn = conn;
87
if (lock && (tmp_error_num = spider_db_unlock_tables(&tmp_spider)))
88
error_num = tmp_error_num;
89
spider_free_conn_from_trx(trx, conn, TRUE, TRUE, &roop_count);
91
DBUG_RETURN(error_num);
94
int spider_trx_another_lock_tables(
100
ha_spider tmp_spider;
101
SPIDER_SHARE tmp_share;
102
DBUG_ENTER("spider_trx_another_lock_tables");
103
memset(&tmp_spider, 0, sizeof(ha_spider));
104
memset(&tmp_share, 0, sizeof(SPIDER_SHARE));
105
tmp_spider.share = &tmp_share;
106
tmp_spider.trx = trx;
107
tmp_share.access_charset = system_charset_info;
108
if ((error_num = spider_db_append_set_names(&tmp_share)))
109
DBUG_RETURN(error_num);
110
while ((conn = (SPIDER_CONN*) hash_element(&trx->trx_another_conn_hash,
113
tmp_spider.conn = conn;
114
if ((error_num = spider_db_lock_tables(&tmp_spider)))
116
spider_db_free_set_names(&tmp_share);
117
DBUG_RETURN(error_num);
121
spider_db_free_set_names(&tmp_share);
125
int spider_trx_another_flush_tables(
131
ha_spider tmp_spider;
132
DBUG_ENTER("spider_trx_another_flush_tables");
133
memset(&tmp_spider, 0, sizeof(ha_spider));
134
while ((conn = (SPIDER_CONN*) hash_element(&trx->trx_another_conn_hash,
137
tmp_spider.conn = conn;
138
if ((error_num = spider_db_flush_tables(&tmp_spider, FALSE)))
139
DBUG_RETURN(error_num);
145
int spider_trx_all_flush_tables(
151
ha_spider tmp_spider;
152
DBUG_ENTER("spider_trx_all_flush_tables");
153
memset(&tmp_spider, 0, sizeof(ha_spider));
154
while ((conn = (SPIDER_CONN*) hash_element(&trx->trx_conn_hash,
157
tmp_spider.conn = conn;
158
if ((error_num = spider_db_flush_tables(&tmp_spider, TRUE)))
159
DBUG_RETURN(error_num);
165
int spider_trx_all_unlock_tables(
171
ha_spider tmp_spider;
172
DBUG_ENTER("spider_trx_all_unlock_tables");
173
memset(&tmp_spider, 0, sizeof(ha_spider));
174
while ((conn = (SPIDER_CONN*) hash_element(&trx->trx_conn_hash,
177
tmp_spider.conn = conn;
178
tmp_spider.trx = trx;
179
if ((error_num = spider_db_unlock_tables(&tmp_spider)))
180
DBUG_RETURN(error_num);
186
int spider_trx_all_start_trx(
192
ha_spider tmp_spider;
193
DBUG_ENTER("spider_trx_all_start_trx");
194
memset(&tmp_spider, 0, sizeof(ha_spider));
195
tmp_spider.trx = trx;
196
while ((conn = (SPIDER_CONN*) hash_element(&trx->trx_conn_hash,
199
tmp_spider.conn = conn;
201
(THDVAR(trx->thd, sync_trx_isolation) &&
202
(error_num = spider_check_and_set_trx_isolation(conn))) ||
203
(error_num = spider_internal_start_trx(&tmp_spider))
205
DBUG_RETURN(error_num);
211
int spider_trx_all_flush_logs(
217
ha_spider tmp_spider;
218
DBUG_ENTER("spider_trx_all_flush_logs");
219
memset(&tmp_spider, 0, sizeof(ha_spider));
220
while ((conn = (SPIDER_CONN*) hash_element(&trx->trx_conn_hash,
223
tmp_spider.conn = conn;
224
if ((error_num = spider_db_flush_logs(&tmp_spider)))
225
DBUG_RETURN(error_num);
231
void spider_free_trx_alter_table_alloc(
233
SPIDER_ALTER_TABLE *alter_table
235
DBUG_ENTER("spider_free_trx_alter_table_alloc");
236
hash_delete(&trx->trx_alter_table_hash, (uchar*) alter_table);
237
if (alter_table->tmp_char)
238
my_free(alter_table->tmp_char, MYF(0));
239
my_free(alter_table, MYF(0));
243
int spider_free_trx_alter_table(
246
SPIDER_ALTER_TABLE *alter_table;
247
DBUG_ENTER("spider_free_trx_alter_table");
248
while ((alter_table =
249
(SPIDER_ALTER_TABLE*) hash_element(&trx->trx_alter_table_hash, 0)))
251
spider_free_trx_alter_table_alloc(trx, alter_table);
256
int spider_create_trx_alter_table(
262
SPIDER_ALTER_TABLE *alter_table, *share_alter;
264
char *tmp_server_name;
265
char *tmp_tgt_table_name;
268
char *tmp_tgt_username;
269
char *tmp_tgt_password;
270
char *tmp_tgt_socket;
271
char *tmp_tgt_wrapper;
272
DBUG_ENTER("spider_create_trx_alter_table");
273
share_alter = &share->alter_table;
274
if (!(alter_table = (SPIDER_ALTER_TABLE *)
275
my_multi_malloc(MYF(MY_WME | MY_ZEROFILL),
276
&alter_table, sizeof(*alter_table),
277
&tmp_name, share->table_name_length + 1,
279
(share_alter->tmp_server_name ?
280
share_alter->tmp_server_name_length + 1 : 0),
282
(share_alter->tmp_tgt_table_name ?
283
share_alter->tmp_tgt_table_name_length + 1 : 0),
285
(share_alter->tmp_tgt_db ?
286
share_alter->tmp_tgt_db_length + 1 : 0),
288
(share_alter->tmp_tgt_host ?
289
share_alter->tmp_tgt_host_length + 1 : 0),
291
(share_alter->tmp_tgt_username ?
292
share_alter->tmp_tgt_username_length + 1 : 0),
294
(share_alter->tmp_tgt_password ?
295
share_alter->tmp_tgt_password_length + 1 : 0),
297
(share_alter->tmp_tgt_socket ?
298
share_alter->tmp_tgt_socket_length + 1 : 0),
300
(share_alter->tmp_tgt_wrapper ?
301
share_alter->tmp_tgt_wrapper_length + 1 : 0),
304
error_num = HA_ERR_OUT_OF_MEM;
305
goto error_alloc_alter_table;
307
alter_table->now_create = now_create;
308
alter_table->table_name = tmp_name;
309
memcpy(alter_table->table_name, share->table_name, share->table_name_length);
310
alter_table->table_name_length = share->table_name_length;
311
alter_table->tmp_priority = share->priority;
312
if (share_alter->tmp_server_name)
314
alter_table->tmp_server_name = tmp_server_name;
315
memcpy(alter_table->tmp_server_name,
316
share_alter->tmp_server_name, share_alter->tmp_server_name_length);
318
if (share_alter->tmp_tgt_table_name)
320
alter_table->tmp_tgt_table_name = tmp_tgt_table_name;
321
memcpy(alter_table->tmp_tgt_table_name,
322
share_alter->tmp_tgt_table_name, share_alter->tmp_tgt_table_name_length);
324
if (share_alter->tmp_tgt_db)
326
alter_table->tmp_tgt_db = tmp_tgt_db;
327
memcpy(alter_table->tmp_tgt_db,
328
share_alter->tmp_tgt_db, share_alter->tmp_tgt_db_length);
330
if (share_alter->tmp_tgt_host)
332
alter_table->tmp_tgt_host = tmp_tgt_host;
333
memcpy(alter_table->tmp_tgt_host,
334
share_alter->tmp_tgt_host, share_alter->tmp_tgt_host_length);
336
if (share_alter->tmp_tgt_username)
338
alter_table->tmp_tgt_username = tmp_tgt_username;
339
memcpy(alter_table->tmp_tgt_username,
340
share_alter->tmp_tgt_username, share_alter->tmp_tgt_username_length);
342
if (share_alter->tmp_tgt_password)
344
alter_table->tmp_tgt_password = tmp_tgt_password;
345
memcpy(alter_table->tmp_tgt_password,
346
share_alter->tmp_tgt_password, share_alter->tmp_tgt_password_length);
348
if (share_alter->tmp_tgt_socket)
350
alter_table->tmp_tgt_socket = tmp_tgt_socket;
351
memcpy(alter_table->tmp_tgt_socket,
352
share_alter->tmp_tgt_socket, share_alter->tmp_tgt_socket_length);
354
if (share_alter->tmp_tgt_wrapper)
356
alter_table->tmp_tgt_wrapper = tmp_tgt_wrapper;
357
memcpy(alter_table->tmp_tgt_wrapper,
358
share_alter->tmp_tgt_wrapper, share_alter->tmp_tgt_wrapper_length);
360
alter_table->tmp_tgt_port = share_alter->tmp_tgt_port;
361
alter_table->tmp_server_name_length = share_alter->tmp_server_name_length;
362
alter_table->tmp_tgt_table_name_length =
363
share_alter->tmp_tgt_table_name_length;
364
alter_table->tmp_tgt_db_length = share_alter->tmp_tgt_db_length;
365
alter_table->tmp_tgt_host_length = share_alter->tmp_tgt_host_length;
366
alter_table->tmp_tgt_username_length = share_alter->tmp_tgt_username_length;
367
alter_table->tmp_tgt_password_length = share_alter->tmp_tgt_password_length;
368
alter_table->tmp_tgt_socket_length = share_alter->tmp_tgt_socket_length;
369
alter_table->tmp_tgt_wrapper_length = share_alter->tmp_tgt_wrapper_length;
370
if (my_hash_insert(&trx->trx_alter_table_hash, (uchar*) alter_table))
372
error_num = HA_ERR_OUT_OF_MEM;
378
my_free(alter_table, MYF(0));
379
error_alloc_alter_table:
380
DBUG_RETURN(error_num);
383
bool spider_cmp_trx_alter_table(
384
SPIDER_ALTER_TABLE *cmp1,
385
SPIDER_ALTER_TABLE *cmp2
387
DBUG_ENTER("spider_cmp_trx_alter_table");
389
cmp1->tmp_priority != cmp2->tmp_priority ||
391
cmp1->tmp_server_name != cmp2->tmp_server_name &&
393
!cmp1->tmp_server_name ||
394
!cmp2->tmp_server_name ||
395
strcmp(cmp1->tmp_server_name, cmp2->tmp_server_name)
399
cmp1->tmp_tgt_table_name != cmp2->tmp_tgt_table_name &&
401
!cmp1->tmp_tgt_table_name ||
402
!cmp2->tmp_tgt_table_name ||
403
strcmp(cmp1->tmp_tgt_table_name, cmp2->tmp_tgt_table_name)
407
cmp1->tmp_tgt_db != cmp2->tmp_tgt_db &&
411
strcmp(cmp1->tmp_tgt_db, cmp2->tmp_tgt_db)
415
cmp1->tmp_tgt_host != cmp2->tmp_tgt_host &&
417
!cmp1->tmp_tgt_host ||
418
!cmp2->tmp_tgt_host ||
419
strcmp(cmp1->tmp_tgt_host, cmp2->tmp_tgt_host)
423
cmp1->tmp_tgt_username != cmp2->tmp_tgt_username &&
425
!cmp1->tmp_tgt_username ||
426
!cmp2->tmp_tgt_username ||
427
strcmp(cmp1->tmp_tgt_username, cmp2->tmp_tgt_username)
431
cmp1->tmp_tgt_password != cmp2->tmp_tgt_password &&
433
!cmp1->tmp_tgt_password ||
434
!cmp2->tmp_tgt_password ||
435
strcmp(cmp1->tmp_tgt_password, cmp2->tmp_tgt_password)
439
cmp1->tmp_tgt_socket != cmp2->tmp_tgt_socket &&
441
!cmp1->tmp_tgt_socket ||
442
!cmp2->tmp_tgt_socket ||
443
strcmp(cmp1->tmp_tgt_socket, cmp2->tmp_tgt_socket)
447
cmp1->tmp_tgt_wrapper != cmp2->tmp_tgt_wrapper &&
449
!cmp1->tmp_tgt_wrapper ||
450
!cmp2->tmp_tgt_wrapper ||
451
strcmp(cmp1->tmp_tgt_wrapper, cmp2->tmp_tgt_wrapper)
454
cmp1->tmp_tgt_port != cmp2->tmp_tgt_port
460
int spider_free_trx_alloc(
463
DBUG_ENTER("spider_free_trx_alloc");
464
spider_free_trx_conn(trx, TRUE);
465
spider_free_trx_alter_table(trx);
466
hash_free(&trx->trx_conn_hash);
467
hash_free(&trx->trx_another_conn_hash);
468
hash_free(&trx->trx_alter_table_hash);
472
SPIDER_TRX *spider_get_trx(
477
DBUG_ENTER("spider_get_trx");
481
!(trx = (SPIDER_TRX*) thd_get_ha_data(thd, spider_hton_ptr))
483
DBUG_PRINT("info",("spider create new trx"));
484
if (!(trx = (SPIDER_TRX *)
485
my_malloc(sizeof(*trx), MYF(MY_WME | MY_ZEROFILL)))
487
goto error_alloc_trx;
490
hash_init(&trx->trx_conn_hash, system_charset_info, 32, 0, 0,
491
(hash_get_key) spider_conn_get_key, 0, 0)
493
goto error_init_hash;
496
hash_init(&trx->trx_another_conn_hash, system_charset_info, 32, 0, 0,
497
(hash_get_key) spider_conn_get_key, 0, 0)
499
goto error_init_another_hash;
502
hash_init(&trx->trx_alter_table_hash, system_charset_info, 32, 0, 0,
503
(hash_get_key) spider_alter_tbl_get_key, 0, 0)
505
goto error_init_alter_hash;
507
trx->thd = (THD*) thd;
508
trx->spider_thread_id = spider_thread_id++;
509
trx->trx_conn_adjustment = 1;
512
thd_set_ha_data(thd, spider_hton_ptr, trx);
515
DBUG_PRINT("info",("spider trx=%x", trx));
518
error_init_alter_hash:
519
hash_free(&trx->trx_another_conn_hash);
520
error_init_another_hash:
521
hash_free(&trx->trx_conn_hash);
523
my_free(trx, MYF(0));
526
*error_num = HA_ERR_OUT_OF_MEM;
533
DBUG_ENTER("spider_free_trx");
535
thd_set_ha_data(trx->thd, spider_hton_ptr, NULL);
536
spider_free_trx_alloc(trx);
537
my_free(trx, MYF(0));
541
int spider_check_and_set_trx_isolation(
546
DBUG_ENTER("spider_check_and_set_trx_isolation");
548
trx_isolation = thd_tx_isolation(conn->thd);
549
DBUG_PRINT("info",("spider local trx_isolation=%d", trx_isolation));
550
DBUG_PRINT("info",("spider conn->trx_isolation=%d", conn->trx_isolation));
551
if (conn->trx_isolation != trx_isolation)
553
if ((error_num = spider_db_set_trx_isolation(conn, trx_isolation)))
554
DBUG_RETURN(error_num);
555
conn->trx_isolation = trx_isolation;
560
int spider_check_and_set_autocommit(
566
DBUG_ENTER("spider_check_and_set_autocommit");
568
autocommit = !thd_test_options(thd, OPTION_NOT_AUTOCOMMIT);
569
if (autocommit && conn->autocommit != 1)
571
if ((error_num = spider_db_set_autocommit(conn, TRUE)))
572
DBUG_RETURN(error_num);
573
conn->autocommit = 1;
574
} else if (!autocommit && conn->autocommit != 0)
576
if ((error_num = spider_db_set_autocommit(conn, FALSE)))
577
DBUG_RETURN(error_num);
578
conn->autocommit = 0;
583
int spider_check_and_set_sql_log_off(
588
bool internal_sql_log_off;
589
DBUG_ENTER("spider_check_and_set_sql_log_off");
591
internal_sql_log_off = THDVAR(thd, internal_sql_log_off);
592
if (internal_sql_log_off && conn->sql_log_off != 1)
594
if ((error_num = spider_db_set_sql_log_off(conn, TRUE)))
595
DBUG_RETURN(error_num);
596
conn->sql_log_off = 1;
597
} else if (!internal_sql_log_off && conn->sql_log_off != 0)
599
if ((error_num = spider_db_set_sql_log_off(conn, FALSE)))
600
DBUG_RETURN(error_num);
601
conn->sql_log_off = 0;
610
DBUG_ENTER("spider_xa_lock");
611
pthread_mutex_lock(&LOCK_xid_cache);
612
if (hash_search(&xid_cache,
613
xid_state->xid.key(), xid_state->xid.key_length()))
615
error_num = ER_SPIDER_XA_LOCKED_NUM;
618
if (my_hash_insert(&xid_cache, (uchar*)xid_state))
620
error_num = HA_ERR_OUT_OF_MEM;
623
pthread_mutex_unlock(&LOCK_xid_cache);
627
pthread_mutex_unlock(&LOCK_xid_cache);
628
DBUG_RETURN(error_num);
631
int spider_xa_unlock(
634
DBUG_ENTER("spider_xa_unlock");
635
pthread_mutex_lock(&LOCK_xid_cache);
636
hash_delete(&xid_cache, (uchar *)xid_state);
637
pthread_mutex_unlock(&LOCK_xid_cache);
641
int spider_start_internal_consistent_snapshot(
646
DBUG_ENTER("spider_start_internal_consistent_snapshot");
647
if (trx->trx_consistent_snapshot)
648
DBUG_RETURN(spider_db_consistent_snapshot(conn));
652
int spider_internal_start_trx(
656
SPIDER_TRX *trx = spider->trx;
657
SPIDER_CONN *conn = spider->conn;
658
bool sync_autocommit = THDVAR(trx->thd, sync_autocommit);
659
double ping_interval_at_trx_start =
660
THDVAR(trx->thd, ping_interval_at_trx_start);
661
bool xa_lock = FALSE;
662
time_t tmp_time = (time_t) time((time_t*) 0);
663
DBUG_ENTER("spider_internal_start_trx");
668
difftime(tmp_time, conn->ping_time) >= ping_interval_at_trx_start
670
(error_num = spider_db_ping(spider))
673
conn->disable_reconnect = TRUE;
676
if (!trx->trx_consistent_snapshot)
678
trx->use_consistent_snapshot = THDVAR(trx->thd, use_consistent_snapshot);
679
trx->internal_xa = THDVAR(trx->thd, internal_xa);
680
trx->internal_xa_snapshot = THDVAR(trx->thd, internal_xa_snapshot);
684
(error_num = spider_check_and_set_sql_log_off(trx->thd, conn)) ||
686
(error_num = spider_check_and_set_autocommit(trx->thd, conn)))
689
if (trx->trx_consistent_snapshot)
691
if (trx->internal_xa && trx->internal_xa_snapshot < 2)
693
error_num = ER_SPIDER_CANT_USE_BOTH_INNER_XA_AND_SNAPSHOT_NUM;
694
my_message(error_num, ER_SPIDER_CANT_USE_BOTH_INNER_XA_AND_SNAPSHOT_STR,
697
} else if (!trx->internal_xa || trx->internal_xa_snapshot == 2)
699
if ((error_num = spider_start_internal_consistent_snapshot(trx, conn)))
706
trx->thd->transaction.xid_state.xa_state == XA_ACTIVE &&
710
thd_get_xid(trx->thd, (MYSQL_XID*) &trx->xid);
713
if (!trx->trx_xa && trx->internal_xa)
715
if (!trx->trx_consistent_snapshot || trx->internal_xa_snapshot == 3)
718
trx->xid.formatID = 1;
719
trx->xid.gtrid_length
720
= my_sprintf(trx->xid.data,
721
(trx->xid.data, "%lx", thd_get_thread_id(trx->thd)));
722
trx->xid.bqual_length
723
= my_sprintf(trx->xid.data + trx->xid.gtrid_length,
724
(trx->xid.data + trx->xid.gtrid_length, "%x",
725
trx->thd->server_id));
727
trx->internal_xid_state.xa_state = XA_ACTIVE;
728
trx->internal_xid_state.xid.set(&trx->xid);
729
trx->internal_xid_state.in_thd = 1;
730
while ((error_num = spider_xa_lock(&trx->internal_xid_state)))
732
if (error_num != ER_SPIDER_XA_LOCKED_NUM)
734
else if (trx->xid.formatID == 0)
736
my_message(error_num, ER_SPIDER_XA_LOCKED_STR, MYF(0));
741
trx->internal_xid_state.xid.set(&trx->xid);
747
if (!trx->trx_consistent_snapshot)
749
trans_register_ha(trx->thd, FALSE, spider_hton_ptr);
750
if (thd_test_options(trx->thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
751
trans_register_ha(trx->thd, TRUE, spider_hton_ptr);
753
trx->trx_start = TRUE;
756
DBUG_PRINT("info",("spider sync_autocommit = %d", sync_autocommit));
757
DBUG_PRINT("info",("spider conn->semi_trx_chk = %d", conn->semi_trx_chk));
758
DBUG_PRINT("info",("spider conn->table_lock = %d", conn->table_lock));
759
DBUG_PRINT("info",("spider conn->autocommit = %d", conn->autocommit));
760
DBUG_PRINT("info",("spider semi_trx = %d", THDVAR(trx->thd, semi_trx)));
761
conn->semi_trx = FALSE;
762
if (conn->table_lock == 3)
764
DBUG_PRINT("info",("spider conn->table_lock == 3"));
765
conn->disable_xa = TRUE;
766
} else if (trx->trx_xa)
768
DBUG_PRINT("info",("spider trx->trx_xa"));
771
conn->semi_trx_chk &&
773
conn->autocommit == 1 &&
774
THDVAR(trx->thd, semi_trx)
776
DBUG_PRINT("info",("spider semi_trx is set"));
777
conn->semi_trx = TRUE;
779
if ((error_num = spider_db_xa_start(conn, &trx->xid)))
780
goto error_start_trx;
781
conn->disable_xa = FALSE;
783
!trx->trx_consistent_snapshot &&
784
!thd_test_options(trx->thd, OPTION_BEGIN) &&
786
conn->semi_trx_chk &&
788
conn->autocommit == 1 &&
789
THDVAR(trx->thd, semi_trx)
791
DBUG_PRINT("info",("spider semi_trx is set"));
792
if ((error_num = spider_db_start_transaction(conn)))
793
goto error_start_trx;
794
conn->semi_trx = TRUE;
796
!trx->trx_consistent_snapshot &&
797
thd_test_options(trx->thd, OPTION_BEGIN)
799
DBUG_PRINT("info",("spider start transaction"));
800
if ((error_num = spider_db_start_transaction(conn)))
801
goto error_start_trx;
805
if (trx->join_trx_top)
806
spider_tree_insert(trx->join_trx_top, conn);
808
conn->p_small = NULL;
810
conn->c_small = NULL;
812
trx->join_trx_top = conn;
819
spider_xa_unlock(&trx->internal_xid_state);
820
DBUG_RETURN(error_num);
823
int spider_internal_xa_commit(
828
TABLE *table_xa_member
831
char xa_key[MAX_KEY_LENGTH];
832
char xa_member_key[MAX_KEY_LENGTH];
834
uint force_commit = THDVAR(thd, force_commit);
836
Open_tables_state open_tables_backup;
837
bool table_xa_opened = FALSE;
838
bool table_xa_member_opened = FALSE;
839
DBUG_ENTER("spider_internal_xa_commit");
847
format_id = xid->format_id and
848
gtrid_length = xid->gtrid_length and
852
!(table_xa = spider_open_sys_table(
853
thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
854
TRUE, &open_tables_backup, TRUE, &error_num))
856
goto error_open_table;
857
table_xa_opened = TRUE;
858
spider_store_xa_pk(table_xa, &trx->xid);
860
(error_num = spider_check_sys_table(table_xa, xa_key))
862
if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
864
table_xa->file->print_error(error_num, MYF(0));
867
my_message(ER_SPIDER_XA_NOT_EXISTS_NUM, ER_SPIDER_XA_NOT_EXISTS_STR,
869
error_num = ER_SPIDER_XA_NOT_EXISTS_NUM;
872
init_alloc_root(&mem_root, 4096, 0);
875
(error_num = spider_check_sys_xa_status(
877
SPIDER_SYS_XA_PREPARED_STR,
878
SPIDER_SYS_XA_COMMIT_STR,
880
ER_SPIDER_XA_NOT_PREPARED_NUM,
883
free_root(&mem_root, MYF(0));
884
if (error_num == ER_SPIDER_XA_NOT_PREPARED_NUM)
885
my_message(error_num, ER_SPIDER_XA_NOT_PREPARED_STR, MYF(0));
888
free_root(&mem_root, MYF(0));
896
format_id = trx->xid.format_id and
897
gtrid_length = trx->xid.gtrid_length and
901
(error_num = spider_update_xa(
902
table_xa, &trx->xid, SPIDER_SYS_XA_COMMIT_STR))
905
spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
906
table_xa_opened = FALSE;
908
if ((conn = spider_tree_first(trx->join_trx_top)))
913
if ((error_num = spider_db_xa_commit(conn, &trx->xid)))
915
if (force_commit == 0 ||
916
(force_commit == 1 && error_num != ER_XAER_NOTA))
917
DBUG_RETURN(error_num);
919
if ((error_num = spider_end_trx(trx, conn)))
920
DBUG_RETURN(error_num);
923
} while ((conn = spider_tree_next(conn)));
924
trx->join_trx_top = NULL;
929
mysql.spider_xa_member
931
format_id = xid->format_id and
932
gtrid_length = xid->gtrid_length and
936
!(table_xa_member = spider_open_sys_table(
937
thd, SPIDER_SYS_XA_MEMBER_TABLE_NAME_STR,
938
SPIDER_SYS_XA_MEMBER_TABLE_NAME_LEN, TRUE, &open_tables_backup, TRUE,
941
goto error_open_table;
942
table_xa_member_opened = TRUE;
943
if ((error_num = spider_delete_xa_member(table_xa_member, &trx->xid)))
945
spider_close_sys_table(thd, table_xa_member, &open_tables_backup, TRUE);
946
table_xa_member_opened = FALSE;
952
format_id = xid->format_id and
953
gtrid_length = xid->gtrid_length and
957
!(table_xa = spider_open_sys_table(
958
thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
959
TRUE, &open_tables_backup, TRUE, &error_num))
961
goto error_open_table;
962
table_xa_opened = TRUE;
963
if ((error_num = spider_delete_xa(table_xa, &trx->xid)))
965
spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
966
table_xa_opened = FALSE;
967
spider_xa_unlock(&trx->internal_xid_state);
968
trx->internal_xid_state.xa_state = XA_NOTR;
973
spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
974
if (table_xa_member_opened)
975
spider_close_sys_table(thd, table_xa_member, &open_tables_backup, TRUE);
977
DBUG_RETURN(error_num);
980
int spider_internal_xa_rollback(
985
TABLE *table_xa, *table_xa_member;
986
char xa_key[MAX_KEY_LENGTH];
987
char xa_member_key[MAX_KEY_LENGTH];
989
uint force_commit = THDVAR(thd, force_commit);
991
Open_tables_state open_tables_backup;
992
bool server_lost = FALSE;
993
bool prepared = (thd->transaction.xid_state.xa_state == XA_PREPARED);
994
bool table_xa_opened = FALSE;
995
bool table_xa_member_opened = FALSE;
996
DBUG_ENTER("spider_internal_xa_rollback");
1006
format_id = xid->format_id and
1007
gtrid_length = xid->gtrid_length and
1011
!(table_xa = spider_open_sys_table(
1012
thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
1013
TRUE, &open_tables_backup, TRUE, &error_num))
1015
goto error_open_table;
1016
table_xa_opened = TRUE;
1017
spider_store_xa_pk(table_xa, &trx->xid);
1019
(error_num = spider_check_sys_table(table_xa, xa_key))
1021
if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
1023
table_xa->file->print_error(error_num, MYF(0));
1026
my_message(ER_SPIDER_XA_NOT_EXISTS_NUM, ER_SPIDER_XA_NOT_EXISTS_STR,
1028
error_num = ER_SPIDER_XA_NOT_EXISTS_NUM;
1031
init_alloc_root(&mem_root, 4096, 0);
1033
force_commit != 2 &&
1034
(error_num = spider_check_sys_xa_status(
1036
SPIDER_SYS_XA_PREPARED_STR,
1037
SPIDER_SYS_XA_ROLLBACK_STR,
1039
ER_SPIDER_XA_NOT_PREPARED_NUM,
1042
free_root(&mem_root, MYF(0));
1043
if (error_num == ER_SPIDER_XA_NOT_PREPARED_NUM)
1044
my_message(error_num, ER_SPIDER_XA_NOT_PREPARED_STR, MYF(0));
1047
free_root(&mem_root, MYF(0));
1055
format_id = trx->xid.format_id and
1056
gtrid_length = trx->xid.gtrid_length and
1057
data = trx->xid.data
1060
(error_num = spider_update_xa(
1061
table_xa, &trx->xid, SPIDER_SYS_XA_ROLLBACK_STR))
1064
spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
1065
table_xa_opened = FALSE;
1068
if ((conn = spider_tree_first(trx->join_trx_top)))
1073
if (conn->disable_xa)
1075
if (conn->table_lock != 3 && !prepared)
1078
!conn->server_lost &&
1079
(error_num = spider_db_rollback(conn))
1081
DBUG_RETURN(error_num);
1084
if (!conn->server_lost)
1088
(error_num = spider_db_xa_end(conn, &trx->xid))
1090
if (force_commit == 0 ||
1091
(force_commit == 1 && error_num != ER_XAER_NOTA))
1092
DBUG_RETURN(error_num);
1094
if ((error_num = spider_db_xa_rollback(conn, &trx->xid)))
1096
if (force_commit == 0 ||
1097
(force_commit == 1 && error_num != ER_XAER_NOTA))
1098
DBUG_RETURN(error_num);
1102
if ((error_num = spider_end_trx(trx, conn)))
1103
DBUG_RETURN(error_num);
1105
if (conn->server_lost)
1108
} while ((conn = spider_tree_next(conn)));
1109
trx->join_trx_top = NULL;
1118
mysql.spider_xa_member
1120
format_id = xid->format_id and
1121
gtrid_length = xid->gtrid_length and
1125
!(table_xa_member = spider_open_sys_table(
1126
thd, SPIDER_SYS_XA_MEMBER_TABLE_NAME_STR,
1127
SPIDER_SYS_XA_MEMBER_TABLE_NAME_LEN, TRUE, &open_tables_backup, TRUE,
1130
goto error_open_table;
1131
table_xa_member_opened = TRUE;
1132
if ((error_num = spider_delete_xa_member(table_xa_member, &trx->xid)))
1134
spider_close_sys_table(thd, table_xa_member, &open_tables_backup, TRUE);
1135
table_xa_member_opened = FALSE;
1141
format_id = xid->format_id and
1142
gtrid_length = xid->gtrid_length and
1146
!(table_xa = spider_open_sys_table(
1147
thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
1148
TRUE, &open_tables_backup, TRUE, &error_num))
1150
goto error_open_table;
1151
table_xa_opened = TRUE;
1152
if ((error_num = spider_delete_xa(table_xa, &trx->xid)))
1154
spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
1155
table_xa_opened = FALSE;
1157
spider_xa_unlock(&trx->internal_xid_state);
1158
trx->internal_xid_state.xa_state = XA_NOTR;
1162
if (table_xa_opened)
1163
spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
1164
if (table_xa_member_opened)
1165
spider_close_sys_table(thd, table_xa_member, &open_tables_backup, TRUE);
1167
DBUG_RETURN(error_num);
1170
int spider_internal_xa_prepare(
1174
TABLE *table_xa_member,
1177
char table_xa_key[MAX_KEY_LENGTH];
1178
int table_xa_key_length;
1181
uint force_commit = THDVAR(thd, force_commit);
1182
Open_tables_state open_tables_backup;
1183
bool table_xa_opened = FALSE;
1184
bool table_xa_member_opened = FALSE;
1185
DBUG_ENTER("spider_internal_xa_prepare");
1187
insert into mysql.spider_xa
1188
(format_id, gtrid_length, bqual_length, data, status) values
1189
(trx->xid.format_id, trx->xid.gtrid_length, trx->xid.bqual_length,
1190
trx->xid.data, 'NOT YET')
1193
!(table_xa = spider_open_sys_table(
1194
thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
1195
TRUE, &open_tables_backup, TRUE, &error_num))
1197
goto error_open_table;
1198
table_xa_opened = TRUE;
1200
(error_num = spider_insert_xa(
1201
table_xa, &trx->xid, SPIDER_SYS_XA_NOT_YET_STR))
1204
spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
1205
table_xa_opened = FALSE;
1208
!(table_xa_member = spider_open_sys_table(
1209
thd, SPIDER_SYS_XA_MEMBER_TABLE_NAME_STR,
1210
SPIDER_SYS_XA_MEMBER_TABLE_NAME_LEN, TRUE, &open_tables_backup, TRUE,
1213
goto error_open_table;
1214
table_xa_member_opened = TRUE;
1215
if ((conn = spider_tree_first(trx->join_trx_top)))
1218
if (conn->disable_xa)
1220
if (conn->table_lock != 3)
1222
if ((error_num = spider_db_rollback(conn)))
1225
if ((error_num = spider_end_trx(trx, conn)))
1226
DBUG_RETURN(error_num);
1230
insert into mysql.spider_xa_member
1231
(format_id, gtrid_length, bqual_length, data,
1232
scheme, host, port, socket, username, password) values
1233
(trx->xid.format_id, trx->xid.gtrid_length,
1234
trx->xid.bqual_length, trx->xid.data,
1243
(error_num = spider_insert_xa_member(
1244
table_xa_member, &trx->xid, conn))
1248
if ((error_num = spider_db_xa_end(conn, &trx->xid)))
1250
if (force_commit == 0 ||
1251
(force_commit == 1 && error_num != ER_XAER_NOTA))
1254
if ((error_num = spider_db_xa_prepare(conn, &trx->xid)))
1256
if (force_commit == 0 ||
1257
(force_commit == 1 && error_num != ER_XAER_NOTA))
1263
if ((error_num = spider_end_trx(trx, conn)))
1264
DBUG_RETURN(error_num);
1269
} while ((conn = spider_tree_next(conn)));
1272
trx->join_trx_top = NULL;
1275
spider_close_sys_table(thd, table_xa_member, &open_tables_backup, TRUE);
1276
table_xa_member_opened = FALSE;
1284
format_id = trx->xid.format_id and
1285
gtrid_length = trx->xid.gtrid_length and
1286
data = trx->xid.data
1289
!(table_xa = spider_open_sys_table(
1290
thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
1291
TRUE, &open_tables_backup, TRUE, &error_num))
1293
goto error_open_table;
1294
table_xa_opened = TRUE;
1296
(error_num = spider_update_xa(
1297
table_xa, &trx->xid, SPIDER_SYS_XA_PREPARED_STR))
1300
spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
1301
table_xa_opened = FALSE;
1303
trx->internal_xid_state.xa_state = XA_PREPARED;
1307
if (table_xa_opened)
1308
spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
1309
if (table_xa_member_opened)
1310
spider_close_sys_table(thd, table_xa_member, &open_tables_backup, TRUE);
1312
DBUG_RETURN(error_num);
1315
int spider_internal_xa_recover(
1322
char xa_key[MAX_KEY_LENGTH];
1324
Open_tables_state open_tables_backup;
1325
DBUG_ENTER("spider_internal_xa_recover");
1338
!(table_xa = spider_open_sys_table(
1339
thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
1340
FALSE, &open_tables_backup, TRUE, &my_errno))
1342
goto error_open_table;
1343
spider_store_xa_status(table_xa, SPIDER_SYS_XA_PREPARED_STR);
1345
(my_errno = spider_get_sys_table_by_idx(table_xa, xa_key, 1,
1346
SPIDER_SYS_XA_IDX1_COL_CNT))
1348
spider_sys_index_end(table_xa);
1349
if (my_errno != HA_ERR_KEY_NOT_FOUND && my_errno != HA_ERR_END_OF_FILE)
1351
table_xa->file->print_error(my_errno, MYF(0));
1357
init_alloc_root(&mem_root, 4096, 0);
1359
spider_get_sys_xid(table_xa, &xid_list[cnt], &mem_root);
1361
my_errno = spider_sys_index_next_same(table_xa, xa_key);
1362
} while (my_errno == 0 && cnt < len);
1363
free_root(&mem_root, MYF(0));
1364
spider_sys_index_end(table_xa);
1365
spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
1369
spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
1374
int spider_initinal_xa_recover(
1379
static THD *thd = NULL;
1380
static TABLE *table_xa = NULL;
1381
static READ_RECORD *read_record = NULL;
1382
static Open_tables_state *open_tables_backup = NULL;
1385
DBUG_ENTER("spider_initinal_xa_recover");
1386
if (!open_tables_backup)
1388
if (!(open_tables_backup = new Open_tables_state))
1390
error_num = HA_ERR_OUT_OF_MEM;
1391
goto error_create_state;
1396
if (!(read_record = new READ_RECORD))
1398
error_num = HA_ERR_OUT_OF_MEM;
1399
goto error_create_read_record;
1405
if (!(thd = spider_create_tmp_thd()))
1407
error_num = HA_ERR_OUT_OF_MEM;
1408
goto error_create_thd;
1424
!(table_xa = spider_open_sys_table(
1425
thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
1426
FALSE, open_tables_backup, TRUE, &error_num))
1428
goto error_open_table;
1429
init_read_record(read_record, thd, table_xa, NULL, TRUE, FALSE, FALSE);
1431
init_alloc_root(&mem_root, 4096, 0);
1432
while ((!(read_record->read_record(read_record))) && cnt < len)
1434
spider_get_sys_xid(table_xa, &xid_list[cnt], &mem_root);
1437
free_root(&mem_root, MYF(0));
1441
end_read_record(read_record);
1442
spider_close_sys_table(thd, table_xa, open_tables_backup, TRUE);
1444
spider_free_tmp_thd(thd);
1448
delete open_tables_backup;
1449
open_tables_backup = NULL;
1455
end_read_record(&read_record_info);
1456
spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
1460
spider_free_tmp_thd(thd);
1465
error_create_read_record:
1466
delete open_tables_backup;
1467
open_tables_backup = NULL;
1472
int spider_internal_xa_commit_by_xid(
1477
TABLE *table_xa, *table_xa_member;
1479
char xa_key[MAX_KEY_LENGTH];
1480
char xa_member_key[MAX_KEY_LENGTH];
1481
SPIDER_SHARE tmp_share;
1483
uint force_commit = THDVAR(thd, force_commit);
1485
Open_tables_state open_tables_backup;
1486
bool table_xa_opened = FALSE;
1487
bool table_xa_member_opened = FALSE;
1488
DBUG_ENTER("spider_internal_xa_commit_by_xid");
1495
format_id = xid->format_id and
1496
gtrid_length = xid->gtrid_length and
1500
!(table_xa = spider_open_sys_table(
1501
thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
1502
TRUE, &open_tables_backup, TRUE, &error_num))
1504
goto error_open_table;
1505
table_xa_opened = TRUE;
1506
spider_store_xa_pk(table_xa, xid);
1508
(error_num = spider_check_sys_table(table_xa, xa_key))
1510
if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
1512
table_xa->file->print_error(error_num, MYF(0));
1515
my_message(ER_SPIDER_XA_NOT_EXISTS_NUM, ER_SPIDER_XA_NOT_EXISTS_STR,
1517
error_num = ER_SPIDER_XA_NOT_EXISTS_NUM;
1520
init_alloc_root(&mem_root, 4096, 0);
1522
force_commit != 2 &&
1523
(error_num = spider_check_sys_xa_status(
1525
SPIDER_SYS_XA_PREPARED_STR,
1526
SPIDER_SYS_XA_COMMIT_STR,
1528
ER_SPIDER_XA_NOT_PREPARED_NUM,
1531
free_root(&mem_root, MYF(0));
1532
if (error_num == ER_SPIDER_XA_NOT_PREPARED_NUM)
1533
my_message(error_num, ER_SPIDER_XA_NOT_PREPARED_STR, MYF(0));
1543
format_id = trx->xid.format_id and
1544
gtrid_length = trx->xid.gtrid_length and
1545
data = trx->xid.data
1548
(error_num = spider_update_xa(
1549
table_xa, xid, SPIDER_SYS_XA_COMMIT_STR))
1551
free_root(&mem_root, MYF(0));
1554
spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
1555
table_xa_opened = FALSE;
1559
scheme tmp_share.tgt_wrapper,
1560
host tmp_share.tgt_host,
1561
port tmp_share.tgt_port,
1562
socket tmp_share.tgt_socket,
1563
username tmp_share.tgt_username,
1564
password tmp_share.tgt_password
1566
mysql.spider_xa_member
1568
format_id = xid->format_id and
1569
gtrid_length = xid->gtrid_length and
1573
!(table_xa_member = spider_open_sys_table(
1574
thd, SPIDER_SYS_XA_MEMBER_TABLE_NAME_STR,
1575
SPIDER_SYS_XA_MEMBER_TABLE_NAME_LEN, TRUE, &open_tables_backup, TRUE,
1578
free_root(&mem_root, MYF(0));
1579
goto error_open_table;
1581
table_xa_member_opened = TRUE;
1582
spider_store_xa_pk(table_xa_member, xid);
1584
(error_num = spider_get_sys_table_by_idx(table_xa_member, xa_member_key, 0,
1585
SPIDER_SYS_XA_PK_COL_CNT))
1587
if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
1589
free_root(&mem_root, MYF(0));
1590
table_xa_member->file->print_error(error_num, MYF(0));
1593
free_root(&mem_root, MYF(0));
1594
spider_close_sys_table(thd, table_xa_member, &open_tables_backup, TRUE);
1595
table_xa_member_opened = FALSE;
1600
memset(&tmp_share, 0, sizeof(SPIDER_SHARE));
1602
spider_get_sys_server_info(table_xa_member, &tmp_share, &mem_root);
1603
if ((error_num = spider_create_conn_key(&tmp_share)))
1605
spider_sys_index_end(table_xa_member);
1606
free_root(&mem_root, MYF(0));
1611
(!(conn = spider_get_conn(
1612
&tmp_share, trx, NULL, FALSE, FALSE, &error_num)) ||
1613
(error_num = spider_db_xa_commit(conn, xid))) &&
1614
(force_commit == 0 ||
1615
(force_commit == 1 && error_num != ER_XAER_NOTA))
1617
spider_sys_index_end(table_xa_member);
1618
spider_free_tmp_share_alloc(&tmp_share);
1619
free_root(&mem_root, MYF(0));
1622
spider_free_tmp_share_alloc(&tmp_share);
1623
error_num = spider_sys_index_next_same(table_xa_member, xa_member_key);
1624
} while (error_num == 0);
1625
if ((error_num = spider_sys_index_end(table_xa_member)))
1627
free_root(&mem_root, MYF(0));
1630
free_root(&mem_root, MYF(0));
1631
spider_free_trx_conn(trx, FALSE);
1635
mysql.spider_xa_member
1637
format_id = xid->format_id and
1638
gtrid_length = xid->gtrid_length and
1641
if ((error_num = spider_delete_xa_member(table_xa_member, xid)))
1643
spider_close_sys_table(thd, table_xa_member, &open_tables_backup, TRUE);
1644
table_xa_member_opened = FALSE;
1651
format_id = xid->format_id and
1652
gtrid_length = xid->gtrid_length and
1656
!(table_xa = spider_open_sys_table(
1657
thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
1658
TRUE, &open_tables_backup, TRUE, &error_num))
1660
goto error_open_table;
1661
table_xa_opened = TRUE;
1662
if ((error_num = spider_delete_xa(table_xa, xid)))
1664
spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
1665
table_xa_opened = FALSE;
1669
if (table_xa_opened)
1670
spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
1671
if (table_xa_member_opened)
1672
spider_close_sys_table(thd, table_xa_member, &open_tables_backup, TRUE);
1674
DBUG_RETURN(error_num);
1677
int spider_internal_xa_rollback_by_xid(
1682
TABLE *table_xa, *table_xa_member;
1684
char xa_key[MAX_KEY_LENGTH];
1685
char xa_member_key[MAX_KEY_LENGTH];
1686
SPIDER_SHARE tmp_share;
1688
uint force_commit = THDVAR(thd, force_commit);
1690
Open_tables_state open_tables_backup;
1691
bool table_xa_opened = FALSE;
1692
bool table_xa_member_opened = FALSE;
1693
DBUG_ENTER("spider_internal_xa_rollback_by_xid");
1700
format_id = xid->format_id and
1701
gtrid_length = xid->gtrid_length and
1705
!(table_xa = spider_open_sys_table(
1706
thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
1707
TRUE, &open_tables_backup, TRUE, &error_num))
1709
goto error_open_table;
1710
table_xa_opened = TRUE;
1711
spider_store_xa_pk(table_xa, xid);
1713
(error_num = spider_check_sys_table(table_xa, xa_key))
1715
if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
1717
table_xa->file->print_error(error_num, MYF(0));
1720
error_num = ER_SPIDER_XA_NOT_EXISTS_NUM;
1723
init_alloc_root(&mem_root, 4096, 0);
1725
force_commit != 2 &&
1726
(error_num = spider_check_sys_xa_status(
1728
SPIDER_SYS_XA_NOT_YET_STR,
1729
SPIDER_SYS_XA_PREPARED_STR,
1730
SPIDER_SYS_XA_ROLLBACK_STR,
1731
ER_SPIDER_XA_PREPARED_NUM,
1734
free_root(&mem_root, MYF(0));
1735
if (error_num == ER_SPIDER_XA_PREPARED_NUM)
1736
my_message(error_num, ER_SPIDER_XA_PREPARED_STR, MYF(0));
1746
format_id = trx->xid.format_id and
1747
gtrid_length = trx->xid.gtrid_length and
1748
data = trx->xid.data
1751
(error_num = spider_update_xa(
1752
table_xa, xid, SPIDER_SYS_XA_ROLLBACK_STR))
1754
free_root(&mem_root, MYF(0));
1757
spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
1758
table_xa_opened = FALSE;
1762
scheme tmp_share.tgt_wrapper,
1763
host tmp_share.tgt_host,
1764
port tmp_share.tgt_port,
1765
socket tmp_share.tgt_socket,
1766
username tmp_share.tgt_username,
1767
password tmp_share.tgt_password
1769
mysql.spider_xa_member
1771
format_id = xid->format_id and
1772
gtrid_length = xid->gtrid_length and
1776
!(table_xa_member = spider_open_sys_table(
1777
thd, SPIDER_SYS_XA_MEMBER_TABLE_NAME_STR,
1778
SPIDER_SYS_XA_MEMBER_TABLE_NAME_LEN, TRUE, &open_tables_backup, TRUE,
1781
free_root(&mem_root, MYF(0));
1782
goto error_open_table;
1784
table_xa_member_opened = TRUE;
1785
spider_store_xa_pk(table_xa_member, xid);
1787
(error_num = spider_get_sys_table_by_idx(table_xa_member, xa_member_key, 0,
1788
SPIDER_SYS_XA_PK_COL_CNT))
1790
if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
1792
free_root(&mem_root, MYF(0));
1793
table_xa_member->file->print_error(error_num, MYF(0));
1796
free_root(&mem_root, MYF(0));
1797
spider_close_sys_table(thd, table_xa_member, &open_tables_backup, TRUE);
1798
table_xa_member_opened = FALSE;
1803
memset(&tmp_share, 0, sizeof(SPIDER_SHARE));
1805
spider_get_sys_server_info(table_xa_member, &tmp_share, &mem_root);
1806
if ((error_num = spider_create_conn_key(&tmp_share)))
1808
spider_sys_index_end(table_xa_member);
1809
free_root(&mem_root, MYF(0));
1814
(!(conn = spider_get_conn(
1815
&tmp_share, trx, NULL, FALSE, FALSE, &error_num)) ||
1816
(error_num = spider_db_xa_rollback(conn, xid))) &&
1817
(force_commit == 0 ||
1818
(force_commit == 1 && error_num != ER_XAER_NOTA))
1820
spider_sys_index_end(table_xa_member);
1821
spider_free_tmp_share_alloc(&tmp_share);
1822
free_root(&mem_root, MYF(0));
1825
spider_free_tmp_share_alloc(&tmp_share);
1826
error_num = spider_sys_index_next_same(table_xa_member, xa_member_key);
1827
} while (error_num == 0);
1828
if ((error_num = spider_sys_index_end(table_xa_member)))
1830
free_root(&mem_root, MYF(0));
1833
free_root(&mem_root, MYF(0));
1834
spider_free_trx_conn(trx, FALSE);
1838
mysql.spider_xa_member
1840
format_id = xid->format_id and
1841
gtrid_length = xid->gtrid_length and
1844
if ((error_num = spider_delete_xa_member(table_xa_member, xid)))
1846
spider_close_sys_table(thd, table_xa_member, &open_tables_backup, TRUE);
1847
table_xa_member_opened = FALSE;
1854
format_id = xid->format_id and
1855
gtrid_length = xid->gtrid_length and
1859
!(table_xa = spider_open_sys_table(
1860
thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
1861
TRUE, &open_tables_backup, TRUE, &error_num))
1863
goto error_open_table;
1864
table_xa_opened = TRUE;
1865
if ((error_num = spider_delete_xa(table_xa, xid)))
1867
spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
1868
table_xa_opened = FALSE;
1872
if (table_xa_opened)
1873
spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
1874
if (table_xa_member_opened)
1875
spider_close_sys_table(thd, table_xa_member, &open_tables_backup, TRUE);
1877
DBUG_RETURN(error_num);
1880
int spider_start_consistent_snapshot(
1886
DBUG_ENTER("spider_start_consistent_snapshot");
1888
if (!(trx = spider_get_trx(thd, &error_num)))
1889
DBUG_RETURN(error_num);
1890
if (THDVAR(trx->thd, use_consistent_snapshot))
1892
if (THDVAR(trx->thd, internal_xa) &&
1893
THDVAR(trx->thd, internal_xa_snapshot) == 1)
1895
error_num = ER_SPIDER_CANT_USE_BOTH_INNER_XA_AND_SNAPSHOT_NUM;
1896
my_message(error_num, ER_SPIDER_CANT_USE_BOTH_INNER_XA_AND_SNAPSHOT_STR,
1900
trx->trx_consistent_snapshot = TRUE;
1901
trx->use_consistent_snapshot = TRUE;
1902
trx->internal_xa_snapshot = THDVAR(trx->thd, internal_xa_snapshot);
1903
trans_register_ha(trx->thd, FALSE, spider_hton_ptr);
1904
trans_register_ha(trx->thd, TRUE, spider_hton_ptr);
1905
if (THDVAR(trx->thd, use_all_conns_snapshot))
1907
trx->internal_xa = FALSE;
1908
if ((error_num = spider_open_all_tables(trx, TRUE)))
1909
goto error_open_all_tables;
1911
THDVAR(trx->thd, use_snapshot_with_flush_tables) == 1 &&
1912
(error_num = spider_trx_all_flush_tables(trx))
1914
goto error_trx_all_flush_tables;
1915
if (THDVAR(trx->thd, use_snapshot_with_flush_tables) == 2)
1917
if ((error_num = spider_trx_another_lock_tables(trx)))
1918
goto error_trx_another_lock_tables;
1919
if ((error_num = spider_trx_another_flush_tables(trx)))
1920
goto error_trx_another_flush_tables;
1922
if ((error_num = spider_trx_all_start_trx(trx)))
1923
goto error_trx_all_start_trx;
1924
if (THDVAR(trx->thd, use_snapshot_with_flush_tables) == 1)
1927
THDVAR(trx->thd, use_flash_logs) &&
1928
(error_num = spider_trx_all_flush_logs(trx))
1930
goto error_trx_all_flush_logs;
1931
if ((error_num = spider_trx_all_unlock_tables(trx)))
1932
goto error_trx_all_unlock_tables;
1934
if (THDVAR(trx->thd, use_snapshot_with_flush_tables) == 2)
1937
THDVAR(trx->thd, use_flash_logs) &&
1938
(error_num = spider_trx_all_flush_logs(trx))
1940
goto error_trx_all_flush_logs2;
1941
if (error_num = spider_free_trx_another_conn(trx, TRUE))
1942
goto error_free_trx_another_conn;
1945
trx->internal_xa = THDVAR(trx->thd, internal_xa);
1951
error_trx_all_flush_logs:
1952
error_trx_all_start_trx:
1953
error_trx_another_flush_tables:
1954
error_trx_another_lock_tables:
1955
error_trx_all_flush_tables:
1956
if (THDVAR(trx->thd, use_snapshot_with_flush_tables) == 1)
1957
VOID(spider_trx_all_unlock_tables(trx));
1958
error_trx_all_flush_logs2:
1959
error_trx_all_unlock_tables:
1960
error_open_all_tables:
1961
if (THDVAR(trx->thd, use_snapshot_with_flush_tables) == 2)
1962
VOID(spider_free_trx_another_conn(trx, TRUE));
1963
error_free_trx_another_conn:
1965
DBUG_RETURN(error_num);
1975
TABLE *table_xa_member;
1978
DBUG_ENTER("spider_commit");
1980
if (all || (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)))
1982
if (!(trx = (SPIDER_TRX*) thd_get_ha_data(thd, spider_hton_ptr)))
1983
DBUG_RETURN(0); /* transaction is not started */
1990
(trx->internal_xa &&
1991
(error_num = spider_internal_xa_prepare(
1992
thd, trx, table_xa, table_xa_member, TRUE))) ||
1993
(error_num = spider_internal_xa_commit(
1994
thd, trx, &trx->xid, table_xa, table_xa_member))
1996
DBUG_RETURN(error_num);
1998
trx->trx_xa = FALSE;
2000
if ((conn = spider_tree_first(trx->join_trx_top)))
2005
(conn->autocommit != 1 || conn->trx_start) &&
2006
(tmp_error_num = spider_db_commit(conn))
2008
error_num = tmp_error_num;
2009
if ((tmp_error_num = spider_end_trx(trx, conn)))
2010
error_num = tmp_error_num;
2012
} while ((conn = spider_tree_next(conn)));
2013
trx->join_trx_top = NULL;
2016
trx->trx_start = FALSE;
2018
spider_free_trx_conn(trx, FALSE);
2019
trx->trx_consistent_snapshot = FALSE;
2021
DBUG_RETURN(error_num);
2024
int spider_rollback(
2033
DBUG_ENTER("spider_rollback");
2035
if (all || (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)))
2037
if (!(trx = (SPIDER_TRX*) thd_get_ha_data(thd, spider_hton_ptr)))
2038
DBUG_RETURN(0); /* transaction is not started */
2045
(error_num = spider_internal_xa_rollback(thd, trx))
2047
DBUG_RETURN(error_num);
2048
trx->trx_xa = FALSE;
2050
if ((conn = spider_tree_first(trx->join_trx_top)))
2055
!conn->server_lost &&
2056
(conn->autocommit != 1 || conn->trx_start) &&
2057
(tmp_error_num = spider_db_rollback(conn))
2059
error_num = tmp_error_num;
2060
if ((tmp_error_num = spider_end_trx(trx, conn)))
2061
error_num = tmp_error_num;
2063
} while ((conn = spider_tree_next(conn)));
2064
trx->join_trx_top = NULL;
2067
trx->trx_start = FALSE;
2069
spider_free_trx_conn(trx, FALSE);
2070
trx->trx_consistent_snapshot = FALSE;
2073
DBUG_RETURN(error_num);
2076
int spider_xa_prepare(
2084
TABLE *table_xa_member;
2085
DBUG_ENTER("spider_xa_prepare");
2087
if (all || (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)))
2089
if (!(trx = (SPIDER_TRX*) thd_get_ha_data(thd, spider_hton_ptr)))
2090
DBUG_RETURN(0); /* transaction is not started */
2094
if ((error_num = spider_internal_xa_prepare(
2095
thd, trx, table_xa, table_xa_member, FALSE)))
2103
DBUG_RETURN(error_num);
2106
int spider_xa_recover(
2111
THD* thd = current_thd;
2112
DBUG_ENTER("spider_xa_recover");
2113
if (len == 0 || xid_list == NULL)
2117
DBUG_RETURN(spider_internal_xa_recover(thd, xid_list, len));
2119
DBUG_RETURN(spider_initinal_xa_recover(xid_list, len));
2122
int spider_xa_commit_by_xid(
2128
THD* thd = current_thd;
2129
DBUG_ENTER("spider_xa_commit_by_xid");
2131
if (!(trx = spider_get_trx(thd, &error_num)))
2134
if ((error_num = spider_internal_xa_commit_by_xid(thd, trx, xid)))
2141
DBUG_RETURN(error_num);
2144
int spider_xa_rollback_by_xid(
2150
THD* thd = current_thd;
2151
DBUG_ENTER("spider_xa_rollback_by_xid");
2153
if (!(trx = spider_get_trx(thd, &error_num)))
2156
if ((error_num = spider_internal_xa_rollback_by_xid(thd, trx, xid)))
2163
DBUG_RETURN(error_num);
2171
ha_spider tmp_spider;
2172
DBUG_ENTER("spider_end_trx");
2173
if (conn->table_lock == 3)
2175
conn->table_lock = 0;
2176
conn->disable_reconnect = FALSE;
2177
tmp_spider.conn = conn;
2178
tmp_spider.trx = trx;
2180
!conn->server_lost &&
2181
(error_num = spider_db_unlock_tables(&tmp_spider))
2183
if (error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM)
2186
} else if (!conn->table_lock)
2187
conn->disable_reconnect = FALSE;
2189
conn->semi_trx_isolation >= 0 &&
2190
conn->trx_isolation != conn->semi_trx_isolation
2193
!conn->server_lost &&
2194
(error_num = spider_db_set_trx_isolation(
2195
conn, THDVAR(trx->thd, semi_trx_isolation)))
2198
!conn->disable_reconnect &&
2199
error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM
2204
conn->semi_trx_isolation = -2;
2205
conn->semi_trx_isolation_chk = FALSE;
2206
conn->semi_trx_chk = FALSE;
2207
DBUG_RETURN(error_num);
2210
int spider_check_trx_and_get_conn(
2216
SPIDER_CONN *conn = spider->conn;
2217
DBUG_ENTER("spider_check_trx_and_get_conn");
2218
if (!(trx = spider_get_trx(thd, &error_num)))
2220
DBUG_PRINT("info",("spider get trx error"));
2221
DBUG_RETURN(error_num);
2223
if (trx->spider_thread_id != spider->spider_thread_id ||
2224
trx->trx_conn_adjustment != spider->trx_conn_adjustment)
2226
DBUG_PRINT("info",(trx != spider->trx ? "spider change thd" :
2227
"spider next trx"));
2229
spider->spider_thread_id = trx->spider_thread_id;
2230
spider->trx_conn_adjustment = trx->trx_conn_adjustment;
2232
!(spider->conn = conn =
2233
spider_get_conn(spider->share, trx, spider, FALSE, TRUE, &error_num))
2235
DBUG_PRINT("info",("spider get conn error"));
2236
DBUG_RETURN(error_num);
2240
DBUG_PRINT("info",("spider get conn"));
2242
!(spider->conn = conn =
2243
spider_get_conn(spider->share, trx, spider, FALSE, TRUE, &error_num))
2245
DBUG_PRINT("info",("spider get conn error"));
2246
DBUG_RETURN(error_num);
2252
THD *spider_create_tmp_thd()
2255
DBUG_ENTER("spider_create_tmp_thd");
2256
if (!(thd = new THD))
2258
thd->killed = THD::NOT_KILLED;
2259
thd->locked_tables = FALSE;
2260
thd->proc_info = "";
2261
thd->thread_id = thd->variables.pseudo_thread_id = 0;
2262
thd->thread_stack = (char*) &thd;
2263
if (thd->store_globals())
2269
void spider_free_tmp_thd(
2272
DBUG_ENTER("spider_free_tmp_thd");