summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Vojtovich <svoj@mariadb.org>2015-03-16 18:54:45 +0400
committerSergey Vojtovich <svoj@mariadb.org>2015-03-16 19:07:52 +0400
commit4cb86b79dd61b51ab09811a8c5ef383a16638fc9 (patch)
tree4bbe044a01563ced3cfd316c5dd32c7209637a29
parent6bd24deab46efc7d67401ac1b30194f03a03ad02 (diff)
downloadmariadb-git-4cb86b79dd61b51ab09811a8c5ef383a16638fc9.tar.gz
MDEV-7728 - Improve xid cache scalability by using lock-free hash
Spider support for new xid cache implementation.
-rw-r--r--storage/spider/spd_table.cc6
-rw-r--r--storage/spider/spd_trx.cc15
2 files changed, 19 insertions, 2 deletions
diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc
index 36768ae85c1..411c7ae675d 100644
--- a/storage/spider/spd_table.cc
+++ b/storage/spider/spd_table.cc
@@ -41,11 +41,13 @@
#include "spd_malloc.h"
ulong *spd_db_att_thread_id;
+#if MYSQL_VERSION_ID < 100103
#ifdef XID_CACHE_IS_SPLITTED
uint *spd_db_att_xid_cache_split_num;
#endif
pthread_mutex_t *spd_db_att_LOCK_xid_cache;
HASH *spd_db_att_xid_cache;
+#endif
struct charset_info_st *spd_charset_utf8_bin;
const char **spd_defaults_extra_file;
const char **spd_defaults_file;
@@ -6263,7 +6265,7 @@ int spider_db_init(
"?LOCK_xid_cache@@3PAUst_mysql_mutex@@A"));
spd_db_att_xid_cache = *((HASH **)
GetProcAddress(current_module, "?xid_cache@@3PAUst_hash@@A"));
-#else
+#elif MYSQL_VERSION_ID < 100103
spd_db_att_LOCK_xid_cache = (pthread_mutex_t *)
#if MYSQL_VERSION_ID < 50500
GetProcAddress(current_module,
@@ -6289,7 +6291,7 @@ int spider_db_init(
spd_db_att_xid_cache_split_num = &opt_xid_cache_split_num;
spd_db_att_LOCK_xid_cache = LOCK_xid_cache;
spd_db_att_xid_cache = xid_cache;
-#else
+#elif MYSQL_VERSION_ID < 100103
spd_db_att_LOCK_xid_cache = &LOCK_xid_cache;
spd_db_att_xid_cache = &xid_cache;
#endif
diff --git a/storage/spider/spd_trx.cc b/storage/spider/spd_trx.cc
index a66fa5a7f5d..1b02bb8c641 100644
--- a/storage/spider/spd_trx.cc
+++ b/storage/spider/spd_trx.cc
@@ -38,11 +38,13 @@
#include "spd_ping_table.h"
#include "spd_malloc.h"
+#if MYSQL_VERSION_ID < 100103
#ifdef XID_CACHE_IS_SPLITTED
extern uint *spd_db_att_xid_cache_split_num;
#endif
extern pthread_mutex_t *spd_db_att_LOCK_xid_cache;
extern HASH *spd_db_att_xid_cache;
+#endif
extern struct charset_info_st *spd_charset_utf8_bin;
extern handlerton *spider_hton_ptr;
@@ -1641,6 +1643,13 @@ int spider_xa_lock(
int error_num;
const char *old_proc_info;
DBUG_ENTER("spider_xa_lock");
+#if MYSQL_VERSION_ID >= 100103
+ old_proc_info = thd_proc_info(thd, "Locking xid by Spider");
+ error_num= 0;
+ if (xid_cache_insert(thd, xid_state))
+ error_num= thd->get_stmt_da()->sql_errno() == ER_XAER_DUPID ?
+ ER_SPIDER_XA_LOCKED_NUM : HA_ERR_OUT_OF_MEM;
+#else
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
my_hash_value_type hash_value = my_calc_hash(spd_db_att_xid_cache,
(uchar*) xid_state->xid.key(), xid_state->xid.key_length());
@@ -1699,6 +1708,7 @@ error:
#else
pthread_mutex_unlock(spd_db_att_LOCK_xid_cache);
#endif
+#endif
thd_proc_info(thd, old_proc_info);
DBUG_RETURN(error_num);
}
@@ -1709,6 +1719,10 @@ int spider_xa_unlock(
THD *thd = current_thd;
const char *old_proc_info;
DBUG_ENTER("spider_xa_unlock");
+#if MYSQL_VERSION_ID >= 100103
+ old_proc_info = thd_proc_info(thd, "Unlocking xid by Spider");
+ xid_cache_delete(thd, xid_state);
+#else
#if defined(SPIDER_HAS_HASH_VALUE_TYPE) && defined(HASH_UPDATE_WITH_HASH_VALUE)
my_hash_value_type hash_value = my_calc_hash(spd_db_att_xid_cache,
(uchar*) xid_state->xid.key(), xid_state->xid.key_length());
@@ -1738,6 +1752,7 @@ int spider_xa_unlock(
#else
pthread_mutex_unlock(spd_db_att_LOCK_xid_cache);
#endif
+#endif
thd_proc_info(thd, old_proc_info);
DBUG_RETURN(0);
}