summaryrefslogtreecommitdiff
path: root/storage/spider/spd_trx.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/spider/spd_trx.cc')
-rw-r--r--storage/spider/spd_trx.cc532
1 files changed, 298 insertions, 234 deletions
diff --git a/storage/spider/spd_trx.cc b/storage/spider/spd_trx.cc
index 8ba46774cfb..179156a0950 100644
--- a/storage/spider/spd_trx.cc
+++ b/storage/spider/spd_trx.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2015 Kentoku Shiba
+/* Copyright (C) 2008-2017 Kentoku Shiba
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -11,10 +11,12 @@
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#define MYSQL_SERVER 1
+#include <my_global.h>
#include "mysql_version.h"
+#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>
@@ -502,6 +504,7 @@ int spider_create_trx_alter_table(
char **tmp_tgt_ssl_keys;
char **tmp_tgt_default_files;
char **tmp_tgt_default_groups;
+ char **tmp_static_link_ids;
uint *tmp_server_names_lengths;
uint *tmp_tgt_table_names_lengths;
uint *tmp_tgt_dbs_lengths;
@@ -517,8 +520,10 @@ int spider_create_trx_alter_table(
uint *tmp_tgt_ssl_keys_lengths;
uint *tmp_tgt_default_files_lengths;
uint *tmp_tgt_default_groups_lengths;
+ uint *tmp_static_link_ids_lengths;
long *tmp_tgt_ports;
long *tmp_tgt_ssl_vscs;
+ long *tmp_monitoring_binlog_pos_at_failing;
long *tmp_link_statuses;
char *tmp_server_names_char;
char *tmp_tgt_table_names_char;
@@ -535,6 +540,7 @@ int spider_create_trx_alter_table(
char *tmp_tgt_ssl_keys_char;
char *tmp_tgt_default_files_char;
char *tmp_tgt_default_groups_char;
+ char *tmp_static_link_ids_char;
uint old_elements;
DBUG_ENTER("spider_create_trx_alter_table");
@@ -560,6 +566,7 @@ int spider_create_trx_alter_table(
&tmp_tgt_ssl_keys, sizeof(char *) * share->all_link_count,
&tmp_tgt_default_files, sizeof(char *) * share->all_link_count,
&tmp_tgt_default_groups, sizeof(char *) * share->all_link_count,
+ &tmp_static_link_ids, sizeof(char *) * share->all_link_count,
&tmp_server_names_lengths, sizeof(uint) * share->all_link_count,
&tmp_tgt_table_names_lengths, sizeof(uint) * share->all_link_count,
@@ -576,9 +583,12 @@ int spider_create_trx_alter_table(
&tmp_tgt_ssl_keys_lengths, sizeof(uint) * share->all_link_count,
&tmp_tgt_default_files_lengths, sizeof(uint) * share->all_link_count,
&tmp_tgt_default_groups_lengths, sizeof(uint) * share->all_link_count,
+ &tmp_static_link_ids_lengths, sizeof(uint) * share->all_link_count,
&tmp_tgt_ports, sizeof(long) * share->all_link_count,
&tmp_tgt_ssl_vscs, sizeof(long) * share->all_link_count,
+ &tmp_monitoring_binlog_pos_at_failing,
+ sizeof(long) * share->all_link_count,
&tmp_link_statuses, sizeof(long) * share->all_link_count,
&tmp_server_names_char, sizeof(char) *
@@ -611,6 +621,8 @@ int spider_create_trx_alter_table(
(share_alter->tmp_tgt_default_files_charlen + 1),
&tmp_tgt_default_groups_char, sizeof(char) *
(share_alter->tmp_tgt_default_groups_charlen + 1),
+ &tmp_static_link_ids_char, sizeof(char) *
+ (share_alter->tmp_static_link_ids_charlen + 1),
NullS))
) {
error_num = HA_ERR_OUT_OF_MEM;
@@ -644,9 +656,12 @@ int spider_create_trx_alter_table(
alter_table->tmp_tgt_ssl_keys = tmp_tgt_ssl_keys;
alter_table->tmp_tgt_default_files = tmp_tgt_default_files;
alter_table->tmp_tgt_default_groups = tmp_tgt_default_groups;
+ alter_table->tmp_static_link_ids = tmp_static_link_ids;
alter_table->tmp_tgt_ports = tmp_tgt_ports;
alter_table->tmp_tgt_ssl_vscs = tmp_tgt_ssl_vscs;
+ alter_table->tmp_monitoring_binlog_pos_at_failing =
+ tmp_monitoring_binlog_pos_at_failing;
alter_table->tmp_link_statuses = tmp_link_statuses;
alter_table->tmp_server_names_lengths = tmp_server_names_lengths;
@@ -664,6 +679,7 @@ int spider_create_trx_alter_table(
alter_table->tmp_tgt_ssl_keys_lengths = tmp_tgt_ssl_keys_lengths;
alter_table->tmp_tgt_default_files_lengths = tmp_tgt_default_files_lengths;
alter_table->tmp_tgt_default_groups_lengths = tmp_tgt_default_groups_lengths;
+ alter_table->tmp_static_link_ids_lengths = tmp_static_link_ids_lengths;
for(roop_count = 0; roop_count < (int) share->all_link_count; roop_count++)
{
@@ -762,12 +778,25 @@ int spider_create_trx_alter_table(
sizeof(char) * share_alter->tmp_tgt_default_groups_lengths[roop_count]);
tmp_tgt_default_groups_char +=
share_alter->tmp_tgt_default_groups_lengths[roop_count] + 1;
+
+ if (share_alter->tmp_static_link_ids[roop_count])
+ {
+ tmp_static_link_ids[roop_count] = tmp_static_link_ids_char;
+ memcpy(tmp_static_link_ids_char,
+ share_alter->tmp_static_link_ids[roop_count],
+ sizeof(char) * share_alter->tmp_static_link_ids_lengths[roop_count]);
+ tmp_static_link_ids_char +=
+ share_alter->tmp_static_link_ids_lengths[roop_count] + 1;
+ }
}
memcpy(tmp_tgt_ports, share_alter->tmp_tgt_ports,
sizeof(long) * share->all_link_count);
memcpy(tmp_tgt_ssl_vscs, share_alter->tmp_tgt_ssl_vscs,
sizeof(long) * share->all_link_count);
+ memcpy(tmp_monitoring_binlog_pos_at_failing,
+ share_alter->tmp_monitoring_binlog_pos_at_failing,
+ sizeof(long) * share->all_link_count);
memcpy(tmp_link_statuses, share_alter->tmp_link_statuses,
sizeof(long) * share->all_link_count);
@@ -803,6 +832,9 @@ int spider_create_trx_alter_table(
memcpy(tmp_tgt_default_groups_lengths,
share_alter->tmp_tgt_default_groups_lengths,
sizeof(uint) * share->all_link_count);
+ memcpy(tmp_static_link_ids_lengths,
+ share_alter->tmp_static_link_ids_lengths,
+ sizeof(uint) * share->all_link_count);
alter_table->tmp_server_names_length =
share_alter->tmp_server_names_length;
@@ -834,10 +866,14 @@ int spider_create_trx_alter_table(
share_alter->tmp_tgt_default_files_length;
alter_table->tmp_tgt_default_groups_length =
share_alter->tmp_tgt_default_groups_length;
+ alter_table->tmp_static_link_ids_length =
+ share_alter->tmp_static_link_ids_length;
alter_table->tmp_tgt_ports_length =
share_alter->tmp_tgt_ports_length;
alter_table->tmp_tgt_ssl_vscs_length =
share_alter->tmp_tgt_ssl_vscs_length;
+ alter_table->tmp_monitoring_binlog_pos_at_failing_length =
+ share_alter->tmp_monitoring_binlog_pos_at_failing_length;
alter_table->tmp_link_statuses_length =
share_alter->tmp_link_statuses_length;
@@ -1033,9 +1069,21 @@ bool spider_cmp_trx_alter_table(
cmp2->tmp_tgt_default_groups[roop_count])
)
) ||
+ (
+ cmp1->tmp_static_link_ids[roop_count] !=
+ cmp2->tmp_static_link_ids[roop_count] &&
+ (
+ !cmp1->tmp_static_link_ids[roop_count] ||
+ !cmp2->tmp_static_link_ids[roop_count] ||
+ strcmp(cmp1->tmp_static_link_ids[roop_count],
+ cmp2->tmp_static_link_ids[roop_count])
+ )
+ ) ||
cmp1->tmp_tgt_ports[roop_count] != cmp2->tmp_tgt_ports[roop_count] ||
cmp1->tmp_tgt_ssl_vscs[roop_count] !=
cmp2->tmp_tgt_ssl_vscs[roop_count] ||
+ cmp1->tmp_monitoring_binlog_pos_at_failing[roop_count] !=
+ cmp2->tmp_monitoring_binlog_pos_at_failing[roop_count] ||
cmp1->tmp_link_statuses[roop_count] !=
cmp2->tmp_link_statuses[roop_count]
)
@@ -1658,7 +1706,8 @@ int spider_xa_lock(
#ifdef SPIDER_XID_USES_xid_cache_iterate
if (xid_cache_insert(thd, xid_state))
{
- error_num = my_errno;
+ error_num = (spider_stmt_da_sql_errno(thd) == ER_XAER_DUPID ?
+ ER_SPIDER_XA_LOCKED_NUM : HA_ERR_OUT_OF_MEM);
goto error;
}
#else
@@ -1904,6 +1953,8 @@ int spider_internal_start_trx(
}
trx->trx_start = TRUE;
trx->trx_xa_prepared = FALSE;
+ trx->updated_in_this_trx = FALSE;
+ DBUG_PRINT("info",("spider trx->updated_in_this_trx=FALSE"));
}
DBUG_PRINT("info",("spider sync_autocommit = %d", sync_autocommit));
@@ -1982,7 +2033,7 @@ int spider_internal_xa_commit(
TABLE *table_xa,
TABLE *table_xa_member
) {
- int error_num, tmp_error_num;
+ int error_num = 0, tmp_error_num;
char xa_key[MAX_KEY_LENGTH];
SPIDER_CONN *conn;
uint force_commit = spider_param_force_commit(thd);
@@ -1996,72 +2047,75 @@ int spider_internal_xa_commit(
bool table_xa_member_opened = FALSE;
DBUG_ENTER("spider_internal_xa_commit");
- /*
- select
- status
- from
- mysql.spider_xa
- where
- format_id = xid->format_id and
- gtrid_length = xid->gtrid_length and
- data = xid->data
- */
- if (
- !(table_xa = spider_open_sys_table(
- thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
- TRUE, &open_tables_backup, TRUE, &error_num))
- )
- goto error_open_table;
- table_xa_opened = TRUE;
- spider_store_xa_pk(table_xa, &trx->xid);
- if (
- (error_num = spider_check_sys_table(table_xa, xa_key))
- ) {
- if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
- {
- table_xa->file->print_error(error_num, MYF(0));
+ if (trx->updated_in_this_trx || spider_param_xa_register_mode(thd) == 0)
+ {
+ /*
+ select
+ status
+ from
+ mysql.spider_xa
+ where
+ format_id = xid->format_id and
+ gtrid_length = xid->gtrid_length and
+ data = xid->data
+ */
+ if (
+ !(table_xa = spider_open_sys_table(
+ thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
+ TRUE, &open_tables_backup, TRUE, &error_num))
+ )
+ goto error_open_table;
+ table_xa_opened = TRUE;
+ spider_store_xa_pk(table_xa, &trx->xid);
+ if (
+ (error_num = spider_check_sys_table(table_xa, xa_key))
+ ) {
+ if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
+ {
+ table_xa->file->print_error(error_num, MYF(0));
+ goto error;
+ }
+ my_message(ER_SPIDER_XA_NOT_EXISTS_NUM, ER_SPIDER_XA_NOT_EXISTS_STR,
+ MYF(0));
+ error_num = ER_SPIDER_XA_NOT_EXISTS_NUM;
+ goto error;
+ }
+ SPD_INIT_ALLOC_ROOT(&mem_root, 4096, 0, MYF(MY_WME));
+ if (
+ force_commit != 2 &&
+ (error_num = spider_check_sys_xa_status(
+ table_xa,
+ SPIDER_SYS_XA_PREPARED_STR,
+ SPIDER_SYS_XA_COMMIT_STR,
+ NULL,
+ ER_SPIDER_XA_NOT_PREPARED_NUM,
+ &mem_root))
+ ) {
+ free_root(&mem_root, MYF(0));
+ if (error_num == ER_SPIDER_XA_NOT_PREPARED_NUM)
+ my_message(error_num, ER_SPIDER_XA_NOT_PREPARED_STR, MYF(0));
goto error;
}
- my_message(ER_SPIDER_XA_NOT_EXISTS_NUM, ER_SPIDER_XA_NOT_EXISTS_STR,
- MYF(0));
- error_num = ER_SPIDER_XA_NOT_EXISTS_NUM;
- goto error;
- }
- SPD_INIT_ALLOC_ROOT(&mem_root, 4096, 0, MYF(MY_WME));
- if (
- force_commit != 2 &&
- (error_num = spider_check_sys_xa_status(
- table_xa,
- SPIDER_SYS_XA_PREPARED_STR,
- SPIDER_SYS_XA_COMMIT_STR,
- NULL,
- ER_SPIDER_XA_NOT_PREPARED_NUM,
- &mem_root))
- ) {
free_root(&mem_root, MYF(0));
- if (error_num == ER_SPIDER_XA_NOT_PREPARED_NUM)
- my_message(error_num, ER_SPIDER_XA_NOT_PREPARED_STR, MYF(0));
- goto error;
- }
- free_root(&mem_root, MYF(0));
- /*
- update
- mysql.spider_xa
- set
- status = 'COMMIT'
- where
- format_id = trx->xid.format_id and
- gtrid_length = trx->xid.gtrid_length and
- data = trx->xid.data
- */
- if (
- (error_num = spider_update_xa(
- table_xa, &trx->xid, SPIDER_SYS_XA_COMMIT_STR))
- )
- goto error;
- spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
- table_xa_opened = FALSE;
+ /*
+ update
+ mysql.spider_xa
+ set
+ status = 'COMMIT'
+ where
+ format_id = trx->xid.format_id and
+ gtrid_length = trx->xid.gtrid_length and
+ data = trx->xid.data
+ */
+ if (
+ (error_num = spider_update_xa(
+ table_xa, &trx->xid, SPIDER_SYS_XA_COMMIT_STR))
+ )
+ goto error;
+ spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
+ table_xa_opened = FALSE;
+ }
SPIDER_BACKUP_DASTATUS;
if ((conn = spider_tree_first(trx->join_trx_top)))
@@ -2099,46 +2153,49 @@ int spider_internal_xa_commit(
if (error_num)
goto error_in_commit;
- /*
- delete from
- mysql.spider_xa_member
- where
- format_id = xid->format_id and
- gtrid_length = xid->gtrid_length and
- data = xid->data
- */
- if (
- !(table_xa_member = spider_open_sys_table(
- thd, SPIDER_SYS_XA_MEMBER_TABLE_NAME_STR,
- SPIDER_SYS_XA_MEMBER_TABLE_NAME_LEN, TRUE, &open_tables_backup, TRUE,
- &error_num))
- )
- goto error_open_table;
- table_xa_member_opened = TRUE;
- if ((error_num = spider_delete_xa_member(table_xa_member, &trx->xid)))
- goto error;
- spider_close_sys_table(thd, table_xa_member, &open_tables_backup, TRUE);
- table_xa_member_opened = FALSE;
+ if (trx->updated_in_this_trx || spider_param_xa_register_mode(thd) == 0)
+ {
+ /*
+ delete from
+ mysql.spider_xa_member
+ where
+ format_id = xid->format_id and
+ gtrid_length = xid->gtrid_length and
+ data = xid->data
+ */
+ if (
+ !(table_xa_member = spider_open_sys_table(
+ thd, SPIDER_SYS_XA_MEMBER_TABLE_NAME_STR,
+ SPIDER_SYS_XA_MEMBER_TABLE_NAME_LEN, TRUE, &open_tables_backup, TRUE,
+ &error_num))
+ )
+ goto error_open_table;
+ table_xa_member_opened = TRUE;
+ if ((error_num = spider_delete_xa_member(table_xa_member, &trx->xid)))
+ goto error;
+ spider_close_sys_table(thd, table_xa_member, &open_tables_backup, TRUE);
+ table_xa_member_opened = FALSE;
- /*
- delete from
- mysql.spider_xa
- where
- format_id = xid->format_id and
- gtrid_length = xid->gtrid_length and
- data = xid->data
- */
- if (
- !(table_xa = spider_open_sys_table(
- thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
- TRUE, &open_tables_backup, TRUE, &error_num))
- )
- goto error_open_table;
- table_xa_opened = TRUE;
- if ((error_num = spider_delete_xa(table_xa, &trx->xid)))
- goto error;
- spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
- table_xa_opened = FALSE;
+ /*
+ delete from
+ mysql.spider_xa
+ where
+ format_id = xid->format_id and
+ gtrid_length = xid->gtrid_length and
+ data = xid->data
+ */
+ if (
+ !(table_xa = spider_open_sys_table(
+ thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
+ TRUE, &open_tables_backup, TRUE, &error_num))
+ )
+ goto error_open_table;
+ table_xa_opened = TRUE;
+ if ((error_num = spider_delete_xa(table_xa, &trx->xid)))
+ goto error;
+ spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
+ table_xa_opened = FALSE;
+ }
spider_xa_unlock(&trx->internal_xid_state);
trx->internal_xid_state.xa_state = XA_NOTR;
DBUG_RETURN(0);
@@ -2175,8 +2232,13 @@ int spider_internal_xa_rollback(
bool table_xa_member_opened = FALSE;
DBUG_ENTER("spider_internal_xa_rollback");
- if (trx->trx_xa_prepared)
- {
+ if (
+ trx->trx_xa_prepared &&
+ (
+ trx->updated_in_this_trx ||
+ spider_param_xa_register_mode(thd) == 0
+ )
+ ) {
/*
select
status
@@ -2325,7 +2387,11 @@ int spider_internal_xa_rollback(
if (
trx->trx_xa_prepared &&
- !server_lost
+ !server_lost &&
+ (
+ trx->updated_in_this_trx ||
+ spider_param_xa_register_mode(thd) == 0
+ )
) {
/*
delete from
@@ -2402,35 +2468,38 @@ int spider_internal_xa_prepare(
bool table_xa_opened = FALSE;
bool table_xa_member_opened = FALSE;
DBUG_ENTER("spider_internal_xa_prepare");
- /*
- insert into mysql.spider_xa
- (format_id, gtrid_length, bqual_length, data, status) values
- (trx->xid.format_id, trx->xid.gtrid_length, trx->xid.bqual_length,
- trx->xid.data, 'NOT YET')
- */
- if (
- !(table_xa = spider_open_sys_table(
- thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
- TRUE, &open_tables_backup, TRUE, &error_num))
- )
- goto error_open_table;
- table_xa_opened = TRUE;
- if (
- (error_num = spider_insert_xa(
- table_xa, &trx->xid, SPIDER_SYS_XA_NOT_YET_STR))
- )
- goto error;
- spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
- table_xa_opened = FALSE;
+ if (trx->updated_in_this_trx || spider_param_xa_register_mode(thd) == 0)
+ {
+ /*
+ insert into mysql.spider_xa
+ (format_id, gtrid_length, bqual_length, data, status) values
+ (trx->xid.format_id, trx->xid.gtrid_length, trx->xid.bqual_length,
+ trx->xid.data, 'NOT YET')
+ */
+ if (
+ !(table_xa = spider_open_sys_table(
+ thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
+ TRUE, &open_tables_backup, TRUE, &error_num))
+ )
+ goto error_open_table;
+ table_xa_opened = TRUE;
+ if (
+ (error_num = spider_insert_xa(
+ table_xa, &trx->xid, SPIDER_SYS_XA_NOT_YET_STR))
+ )
+ goto error;
+ spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
+ table_xa_opened = FALSE;
- if (
- !(table_xa_member = spider_open_sys_table(
- thd, SPIDER_SYS_XA_MEMBER_TABLE_NAME_STR,
- SPIDER_SYS_XA_MEMBER_TABLE_NAME_LEN, TRUE, &open_tables_backup, TRUE,
- &error_num))
- )
- goto error_open_table;
- table_xa_member_opened = TRUE;
+ if (
+ !(table_xa_member = spider_open_sys_table(
+ thd, SPIDER_SYS_XA_MEMBER_TABLE_NAME_STR,
+ SPIDER_SYS_XA_MEMBER_TABLE_NAME_LEN, TRUE, &open_tables_backup, TRUE,
+ &error_num))
+ )
+ goto error_open_table;
+ table_xa_member_opened = TRUE;
+ }
SPIDER_BACKUP_DASTATUS;
if ((conn = spider_tree_first(trx->join_trx_top)))
{
@@ -2456,26 +2525,29 @@ int spider_internal_xa_prepare(
}
conn->join_trx = 0;
} else {
- /*
- insert into mysql.spider_xa_member
- (format_id, gtrid_length, bqual_length, data,
- scheme, host, port, socket, username, password) values
- (trx->xid.format_id, trx->xid.gtrid_length,
- trx->xid.bqual_length, trx->xid.data,
- conn->tgt_wrapper,
- conn->tgt_host,
- conn->tgt_port,
- conn->tgt_socket,
- conn->tgt_username,
- conn->tgt_password)
- */
- if (
- (error_num = spider_insert_xa_member(
- table_xa_member, &trx->xid, conn))
- ) {
- SPIDER_CONN_RESTORE_DASTATUS_AND_RESET_ERROR_NUM;
- if (error_num)
- goto error;
+ if (trx->updated_in_this_trx || spider_param_xa_register_mode(thd) == 0)
+ {
+ /*
+ insert into mysql.spider_xa_member
+ (format_id, gtrid_length, bqual_length, data,
+ scheme, host, port, socket, username, password) values
+ (trx->xid.format_id, trx->xid.gtrid_length,
+ trx->xid.bqual_length, trx->xid.data,
+ conn->tgt_wrapper,
+ conn->tgt_host,
+ conn->tgt_port,
+ conn->tgt_socket,
+ conn->tgt_username,
+ conn->tgt_password)
+ */
+ if (
+ (error_num = spider_insert_xa_member(
+ table_xa_member, &trx->xid, conn))
+ ) {
+ SPIDER_CONN_RESTORE_DASTATUS_AND_RESET_ERROR_NUM;
+ if (error_num)
+ goto error;
+ }
}
if ((error_num = spider_db_xa_end(conn, &trx->xid)))
@@ -2513,33 +2585,36 @@ int spider_internal_xa_prepare(
trx->join_trx_top = NULL;
*/
}
- spider_close_sys_table(thd, table_xa_member, &open_tables_backup, TRUE);
- table_xa_member_opened = FALSE;
+ if (trx->updated_in_this_trx || spider_param_xa_register_mode(thd) == 0)
+ {
+ spider_close_sys_table(thd, table_xa_member, &open_tables_backup, TRUE);
+ table_xa_member_opened = FALSE;
- /*
- update
- mysql.spider_xa
- set
- status = 'PREPARED'
- where
- format_id = trx->xid.format_id and
- gtrid_length = trx->xid.gtrid_length and
- data = trx->xid.data
- */
- if (
- !(table_xa = spider_open_sys_table(
- thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
- TRUE, &open_tables_backup, TRUE, &error_num))
- )
- goto error_open_table;
- table_xa_opened = TRUE;
- if (
- (error_num = spider_update_xa(
- table_xa, &trx->xid, SPIDER_SYS_XA_PREPARED_STR))
- )
- goto error;
- spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
- table_xa_opened = FALSE;
+ /*
+ update
+ mysql.spider_xa
+ set
+ status = 'PREPARED'
+ where
+ format_id = trx->xid.format_id and
+ gtrid_length = trx->xid.gtrid_length and
+ data = trx->xid.data
+ */
+ if (
+ !(table_xa = spider_open_sys_table(
+ thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
+ TRUE, &open_tables_backup, TRUE, &error_num))
+ )
+ goto error_open_table;
+ table_xa_opened = TRUE;
+ if (
+ (error_num = spider_update_xa(
+ table_xa, &trx->xid, SPIDER_SYS_XA_PREPARED_STR))
+ )
+ goto error;
+ spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
+ table_xa_opened = FALSE;
+ }
if (internal_xa)
trx->internal_xid_state.xa_state = XA_PREPARED;
DBUG_RETURN(0);
@@ -2683,11 +2758,11 @@ int spider_initinal_xa_recover(
FALSE, open_tables_backup, TRUE, &error_num))
)
goto error_open_table;
- init_read_record(read_record, thd, table_xa, NULL, NULL, TRUE, FALSE,
- FALSE);
+ SPIDER_init_read_record(read_record, thd, table_xa, NULL, NULL, TRUE,
+ FALSE, FALSE);
}
SPD_INIT_ALLOC_ROOT(&mem_root, 4096, 0, MYF(MY_WME));
- while ((!(read_record->read_record(read_record))) && cnt < (int) len)
+ while ((!(read_record->read_record())) && cnt < (int) len)
{
spider_get_sys_xid(table_xa, &xid_list[cnt], &mem_root);
cnt++;
@@ -3369,7 +3444,9 @@ int spider_commit(
}
}
trx->trx_start = FALSE;
+ trx->updated_in_this_trx = FALSE;
DBUG_PRINT("info",("spider trx->trx_start=FALSE"));
+ DBUG_PRINT("info",("spider trx->updated_in_this_trx=FALSE"));
}
spider_reuse_trx_ha(trx);
spider_free_trx_conn(trx, FALSE);
@@ -3440,7 +3517,9 @@ int spider_rollback(
}
}
trx->trx_start = FALSE;
+ trx->updated_in_this_trx = FALSE;
DBUG_PRINT("info",("spider trx->trx_start=FALSE"));
+ DBUG_PRINT("info",("spider trx->updated_in_this_trx=FALSE"));
}
spider_reuse_trx_ha(trx);
spider_free_trx_conn(trx, FALSE);
@@ -3711,21 +3790,14 @@ int spider_check_trx_and_get_conn(
{
TABLE *table = spider->get_table();
TABLE_SHARE *table_share = table->s;
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- char *db, *table_name;
- if (!(db = (char *)
- spider_bulk_malloc(spider_current_trx, 57, MYF(MY_WME),
- &db, table_share->db.length + 1,
- &table_name, table_share->table_name.length + 1,
- NullS))
- ) {
- my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
+ char *db = (char *) my_alloca(
+ table_share->db.length + 1 + table_share->table_name.length + 1);
+ if (!db)
+ {
+ my_error(HA_ERR_OUT_OF_MEM, MYF(0));
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
-#else
- char db[table_share->db.length + 1],
- table_name[table_share->table_name.length + 1];
-#endif
+ char *table_name = db + table_share->db.length + 1;
memcpy(db, table_share->db.str, table_share->db.length);
db[table_share->db.length] = '\0';
memcpy(table_name, table_share->table_name.str,
@@ -3733,10 +3805,12 @@ int spider_check_trx_and_get_conn(
table_name[table_share->table_name.length] = '\0';
my_printf_error(ER_SPIDER_ALL_LINKS_FAILED_NUM,
ER_SPIDER_ALL_LINKS_FAILED_STR, MYF(0), db, table_name);
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_free(trx, db, MYF(MY_WME));
-#endif
+ my_afree(db);
DBUG_RETURN(ER_SPIDER_ALL_LINKS_FAILED_NUM);
+ } else if (search_link_idx == -2)
+ {
+ my_error(HA_ERR_OUT_OF_MEM, MYF(0));
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
spider->search_link_idx = search_link_idx;
spider->search_link_query_id = thd->query_id;
@@ -3802,6 +3876,7 @@ int spider_check_trx_and_get_conn(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -3844,6 +3919,7 @@ int spider_check_trx_and_get_conn(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -3870,21 +3946,14 @@ int spider_check_trx_and_get_conn(
{
TABLE *table = spider->get_table();
TABLE_SHARE *table_share = table->s;
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- char *db, *table_name;
- if (!(db = (char *)
- spider_bulk_malloc(spider_current_trx, 57, MYF(MY_WME),
- &db, table_share->db.length + 1,
- &table_name, table_share->table_name.length + 1,
- NullS))
- ) {
- my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
+ char *db = (char *) my_alloca(
+ table_share->db.length + 1 + table_share->table_name.length + 1);
+ if (!db)
+ {
+ my_error(HA_ERR_OUT_OF_MEM, MYF(0));
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
-#else
- char db[table_share->db.length + 1],
- table_name[table_share->table_name.length + 1];
-#endif
+ char *table_name = db + table_share->db.length + 1;
memcpy(db, table_share->db.str, table_share->db.length);
db[table_share->db.length] = '\0';
memcpy(table_name, table_share->table_name.str,
@@ -3892,9 +3961,7 @@ int spider_check_trx_and_get_conn(
table_name[table_share->table_name.length] = '\0';
my_printf_error(ER_SPIDER_LINK_MON_JUST_NG_NUM,
ER_SPIDER_LINK_MON_JUST_NG_STR, MYF(0), db, table_name);
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_free(trx, db, MYF(MY_WME));
-#endif
+ my_afree(db);
DBUG_RETURN(ER_SPIDER_LINK_MON_JUST_NG_NUM);
}
} else {
@@ -3948,6 +4015,7 @@ int spider_check_trx_and_get_conn(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -3991,6 +4059,7 @@ int spider_check_trx_and_get_conn(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -4016,21 +4085,14 @@ int spider_check_trx_and_get_conn(
{
TABLE *table = spider->get_table();
TABLE_SHARE *table_share = table->s;
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- char *db, *table_name;
- if (!(db = (char *)
- spider_bulk_malloc(spider_current_trx, 57, MYF(MY_WME),
- &db, table_share->db.length + 1,
- &table_name, table_share->table_name.length + 1,
- NullS))
- ) {
- my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
+ char *db = (char *) my_alloca(
+ table_share->db.length + 1 + table_share->table_name.length + 1);
+ if (!db)
+ {
+ my_error(HA_ERR_OUT_OF_MEM, MYF(0));
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
-#else
- char db[table_share->db.length + 1],
- table_name[table_share->table_name.length + 1];
-#endif
+ char *table_name = db + table_share->db.length + 1;
memcpy(db, table_share->db.str, table_share->db.length);
db[table_share->db.length] = '\0';
memcpy(table_name, table_share->table_name.str,
@@ -4038,9 +4100,7 @@ int spider_check_trx_and_get_conn(
table_name[table_share->table_name.length] = '\0';
my_printf_error(ER_SPIDER_LINK_MON_JUST_NG_NUM,
ER_SPIDER_LINK_MON_JUST_NG_STR, MYF(0), db, table_name);
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_free(trx, db, MYF(MY_WME));
-#endif
+ my_afree(db);
DBUG_RETURN(ER_SPIDER_LINK_MON_JUST_NG_NUM);
}
}
@@ -4055,7 +4115,7 @@ THD *spider_create_tmp_thd()
{
THD *thd;
DBUG_ENTER("spider_create_tmp_thd");
- if (!(thd = new THD(0)))
+ if (!(thd = SPIDER_new_THD((my_thread_id) 0)))
DBUG_RETURN(NULL);
#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000
thd->killed = NOT_KILLED;
@@ -4066,6 +4126,10 @@ THD *spider_create_tmp_thd()
thd->locked_tables = FALSE;
#endif
thd->proc_info = "";
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100200
+#else
+ thd->thread_id = thd->variables.pseudo_thread_id = 0;
+#endif
thd->thread_stack = (char*) &thd;
if (thd->store_globals())
DBUG_RETURN(NULL);