diff --git a/Docs/README-wsrep b/Docs/README-wsrep
index ea6a62621ed..78934811984 100644
--- a/Docs/README-wsrep
+++ b/Docs/README-wsrep
@@ -236,7 +236,7 @@ mysql> SHOW STATUS LIKE 'wsrep%';
- If performing a rolling upgrade on a running cluster, set
wsrep_sst_method=mysqldump.
You might also need to configure wsrep_sst_receive_address and
- wsrep_sst_auth appropriately. Mysqldump is the only way to transfer data
+ wsrep_sst_auth appropriately. mysqldump is the only way to transfer data
from 5.1.x to 5.5.x reliably.
- remove innodb_plugin settings from configuration files.
@@ -292,6 +292,15 @@ wsrep_cluster_address=
wsrep_cluster_name="my_wsrep_cluster"
Logical cluster name, must be the same for all nodes of the cluster.
+wsrep_node_address=
+ An option to explicitly specify the network address of the node in the form
+
[:port] if autoguessing for some reason does not produce desirable
+ results (multiple network interfaces, NAT, etc.)
+ If not explicitly overridden by wsrep_sst_receive_address, the part
+ will be used to listen for SST (see below). And the whole [:port]
+ will be passed to wsrep provider to be used as a base address in its
+ communications.
+
wsrep_node_name=
Human readable node name (for easier log reading only). Defaults to hostname.
diff --git a/cmake/wsrep.cmake b/cmake/wsrep.cmake
index 3c10c5b3836..bb646028285 100644
--- a/cmake/wsrep.cmake
+++ b/cmake/wsrep.cmake
@@ -17,7 +17,7 @@
# so WSREP_VERSION is produced regardless
# Set the patch version
-SET(WSREP_PATCH_VERSION "6")
+SET(WSREP_PATCH_VERSION "7")
# Obtain patch revision number
SET(WSREP_PATCH_REVNO $ENV{WSREP_REV})
diff --git a/scripts/wsrep_sst_rsync.sh b/scripts/wsrep_sst_rsync.sh
index c0b54159eda..ef3dda8231f 100644
--- a/scripts/wsrep_sst_rsync.sh
+++ b/scripts/wsrep_sst_rsync.sh
@@ -23,14 +23,14 @@ RSYNC_CONF=
cleanup_joiner()
{
- echo "Joiner cleanup:" >&2
-set -x
+ echo -n "Joiner rsync SST cleanup..." >&2
local PID=$(cat "$RSYNC_PID" 2>/dev/null || echo 0)
- [ "0" != "$PID" ] && kill $PID && sleep 0.5 && kill -9 $PID || :
-set +x
+ [ "0" != "$PID" ] && kill $PID && sleep 0.5 && kill -9 $PID >/dev/null 2>&1 \
+ || :
rm -rf "$RSYNC_CONF"
rm -rf "$MAGIC_FILE"
rm -rf "$RSYNC_PID"
+ echo " done." >&2
}
check_pid()
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index dfdf1c41c0f..c4ed7c1e31b 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -5080,7 +5080,7 @@ void wsrep_wait_appliers_close(THD *thd)
/* and wait for them to die */
mysql_mutex_lock(&LOCK_thread_count);
while (have_wsrep_appliers(thd) > 0)
- {
+ {
mysql_cond_wait(&COND_thread_count,&LOCK_thread_count);
DBUG_PRINT("quit",("One thread died (count=%u)",thread_count));
}
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index 99d54e437d2..795e1524390 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -1005,6 +1005,7 @@ THD::THD()
wsrep_retry_query_len = 0;
wsrep_retry_command = COM_CONNECT;
wsrep_consistency_check = NO_CONSISTENCY_CHECK;
+ wsrep_status_vars = 0;
#endif
/* Call to init() below requires fully initialized Open_tables_state. */
reset_open_tables_state(this);
@@ -1557,6 +1558,7 @@ THD::~THD()
mysql_mutex_unlock(&LOCK_wsrep_thd);
mysql_mutex_destroy(&LOCK_wsrep_thd);
if (wsrep_rli) delete wsrep_rli;
+ if (wsrep_status_vars) wsrep->stats_free(wsrep, wsrep_status_vars);
#endif
/* Close connection */
#ifndef EMBEDDED_LIBRARY
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 844f56fac6f..e2c528ab05f 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -2400,6 +2400,7 @@ public:
enum enum_server_command wsrep_retry_command;
enum wsrep_consistency_check_mode
wsrep_consistency_check;
+ wsrep_stats_var* wsrep_status_vars;
#endif /* WITH_WSREP */
/**
Internal parser state.
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 0ca412be17d..fbb47b5c03b 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -2535,7 +2535,7 @@ mysql_execute_command(THD *thd)
case SQLCOM_SHOW_STATUS:
{
#ifdef WITH_WSREP
- if (WSREP_CLIENT(thd) && wsrep_causal_wait(thd)) goto error;
+ if (lex->sql_command == SQLCOM_SHOW_STATUS) wsrep_free_status(thd);
#endif /* WITH_WSREP */
execute_show_status(thd, all_tables);
break;
diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc
index a5d7134a201..8627d0ff53b 100644
--- a/sql/wsrep_mysqld.cc
+++ b/sql/wsrep_mysqld.cc
@@ -54,7 +54,7 @@ my_bool wsrep_replicate_myisam = 0; // enable myisam replication
* End configuration options
*/
-static wsrep_uuid_t cluster_uuid = WSREP_UUID_UNDEFINED;
+static const wsrep_uuid_t cluster_uuid = WSREP_UUID_UNDEFINED;
const wsrep_uuid_t* wsrep_cluster_uuid()
{
return &cluster_uuid;
@@ -120,11 +120,11 @@ static void wsrep_log_cb(wsrep_log_level_t level, const char *msg) {
}
}
-static void wsrep_log_states (wsrep_log_level_t level,
- wsrep_uuid_t* group_uuid,
- wsrep_seqno_t group_seqno,
- wsrep_uuid_t* node_uuid,
- wsrep_seqno_t node_seqno)
+static void wsrep_log_states (wsrep_log_level_t const level,
+ const wsrep_uuid_t* const group_uuid,
+ wsrep_seqno_t const group_seqno,
+ const wsrep_uuid_t* const node_uuid,
+ wsrep_seqno_t const node_seqno)
{
char uuid_str[37];
char msg[256];
@@ -195,7 +195,7 @@ static void wsrep_view_handler_cb (void* app_ctx,
if (memcmp(&cluster_uuid, &view->uuid, sizeof(wsrep_uuid_t)))
{
- cluster_uuid= view->uuid;
+ memcpy((wsrep_uuid_t*)&cluster_uuid, &view->uuid, sizeof(cluster_uuid));
wsrep_uuid_print (&cluster_uuid, cluster_uuid_str,
sizeof(cluster_uuid_str));
}
@@ -213,7 +213,7 @@ static void wsrep_view_handler_cb (void* app_ctx,
/* Proceed further only if view is PRIMARY */
if (WSREP_VIEW_PRIMARY != view->status) {
- wsrep_ready= FALSE;
+ wsrep_ready_set(FALSE);
new_status= WSREP_MEMBER_UNDEFINED;
/* Always record local_uuid and local_seqno in non-prim since this
* may lead to re-initializing provider and start position is
@@ -234,13 +234,13 @@ static void wsrep_view_handler_cb (void* app_ctx,
if (view->proto_ver != wsrep_protocol_version)
{
my_bool wsrep_ready_saved= wsrep_ready;
- wsrep_ready= FALSE;
+ wsrep_ready_set(FALSE);
WSREP_INFO("closing client connections for "
"protocol change %ld -> %d",
wsrep_protocol_version, view->proto_ver);
wsrep_close_client_connections(TRUE);
wsrep_protocol_version= view->proto_ver;
- wsrep_ready= wsrep_ready_saved;
+ wsrep_ready_set(wsrep_ready_saved);
}
break;
default:
@@ -255,7 +255,7 @@ static void wsrep_view_handler_cb (void* app_ctx,
/* After that wsrep will call wsrep_sst_prepare. */
/* keep ready flag 0 until we receive the snapshot */
- wsrep_ready= FALSE;
+ wsrep_ready_set(FALSE);
/* Close client connections to ensure that they don't interfere
* with SST */
@@ -411,7 +411,7 @@ int wsrep_init()
{
int rcode= -1;
- wsrep_ready= FALSE;
+ wsrep_ready_set(FALSE);
assert(wsrep_provider);
wsrep_init_position();
@@ -438,8 +438,9 @@ int wsrep_init()
!strcmp(wsrep_provider, WSREP_NONE))
{
// enable normal operation in case no provider is specified
- wsrep_ready= TRUE;
+ wsrep_ready_set(TRUE);
global_system_variables.wsrep_on = 0;
+ return 0;
}
else
{
@@ -452,41 +453,69 @@ int wsrep_init()
wsrep->provider_vendor, sizeof(provider_vendor) - 1);
}
- struct wsrep_init_args wsrep_args;
-
if (!wsrep_data_home_dir || strlen(wsrep_data_home_dir) == 0)
wsrep_data_home_dir = mysql_real_data_home;
- if (strcmp (wsrep_provider, WSREP_NONE) &&
- (!wsrep_node_incoming_address ||
- !strcmp (wsrep_node_incoming_address, WSREP_NODE_INCOMING_AUTO))) {
- static char inc_addr[256];
- size_t inc_addr_max = sizeof (inc_addr);
- size_t ret = default_address (inc_addr, inc_addr_max);
- if (ret > 0 && ret < inc_addr_max) {
- wsrep_node_incoming_address = inc_addr;
- }
- else {
- wsrep_node_incoming_address = NULL;
- }
- }
-
- char node_addr[256] = {0, };
+ char node_addr[512]= { 0, };
if (!wsrep_node_address || !strcmp(wsrep_node_address, ""))
{
- size_t node_addr_max= sizeof(node_addr);
- size_t ret= default_ip(node_addr, node_addr_max);
+ size_t const node_addr_max= sizeof(node_addr);
+ size_t const ret= guess_ip(node_addr, node_addr_max);
if (!(ret > 0 && ret < node_addr_max))
{
- WSREP_WARN("Failed to autoguess base node address");
- node_addr[0]= 0;
+ WSREP_WARN("Failed to guess base node address. Set it explicitly via "
+ "wsrep_node_address.");
+ node_addr[0]= '\0';
}
}
- else if (wsrep_node_address)
+ else
{
strncpy(node_addr, wsrep_node_address, sizeof(node_addr) - 1);
}
+ static char inc_addr[512]= { 0, };
+ if ((!wsrep_node_incoming_address ||
+ !strcmp (wsrep_node_incoming_address, WSREP_NODE_INCOMING_AUTO))) {
+ size_t const node_addr_len= strlen(node_addr);
+ if (node_addr_len > 0)
+ {
+ const char* const colon= strrchr(node_addr, ':');
+ if (strchr(node_addr, ':') == colon) // 1 or 0 ':'
+ {
+ size_t const inc_addr_max= sizeof (inc_addr);
+ size_t const ip_len= colon ? colon - node_addr : node_addr_len;
+ if (ip_len + 7 /* :55555\0 */ < inc_addr_max)
+ {
+ memcpy (inc_addr, node_addr, ip_len);
+ snprintf(inc_addr + ip_len, inc_addr_max - ip_len, ":%u",mysqld_port);
+ }
+ else
+ {
+ WSREP_WARN("Guessing address for incoming client connections: "
+ "address too long.");
+ inc_addr[0]= '\0';
+ }
+ }
+ else
+ {
+ WSREP_WARN("Guessing address for incoming client connections: "
+ "too many colons :) .");
+ inc_addr[0]= '\0';
+ }
+ }
+
+ // this is to display detected address on SHOW VARIABLES...
+ wsrep_node_incoming_address = inc_addr;
+
+ if (!strlen(wsrep_node_incoming_address))
+ {
+ WSREP_WARN("Guessing address for incoming client connections failed. "
+ "Try setting wsrep_node_incoming_address explicitly.");
+ }
+ }
+
+ struct wsrep_init_args wsrep_args;
+
wsrep_args.data_dir = wsrep_data_home_dir;
wsrep_args.node_name = (wsrep_node_name) ? wsrep_node_name : "";
wsrep_args.node_address = node_addr;
@@ -599,14 +628,14 @@ bool wsrep_start_replication()
!strcmp(wsrep_provider, WSREP_NONE))
{
// enable normal operation in case no provider is specified
- wsrep_ready = TRUE;
+ wsrep_ready_set(TRUE);
return true;
}
if (!wsrep_cluster_address || strlen(wsrep_cluster_address)== 0)
{
// if provider is non-trivial, but no address is specified, wait for address
- wsrep_ready = FALSE;
+ wsrep_ready_set(FALSE);
return true;
}
diff --git a/sql/wsrep_mysqld.h b/sql/wsrep_mysqld.h
index 968281a2c98..ce74cef4e64 100644
--- a/sql/wsrep_mysqld.h
+++ b/sql/wsrep_mysqld.h
@@ -18,10 +18,8 @@
#include "mysqld.h"
typedef struct st_mysql_show_var SHOW_VAR;
-//#include
#include
#include "../wsrep/wsrep_api.h"
-//#include
class set_var;
class THD;
@@ -77,6 +75,7 @@ extern const char* wsrep_provider_name;
extern const char* wsrep_provider_version;
extern const char* wsrep_provider_vendor;
extern int wsrep_show_status(THD *thd, SHOW_VAR *var, char *buff);
+extern void wsrep_free_status(THD *thd);
#define WSREP_SST_ADDRESS_AUTO "AUTO"
// MySQL variables funcs
diff --git a/sql/wsrep_priv.h b/sql/wsrep_priv.h
index 32d0cebfd33..700639ebcb1 100644
--- a/sql/wsrep_priv.h
+++ b/sql/wsrep_priv.h
@@ -37,14 +37,14 @@ extern int wsrep_sst_donate_cb (void* app_ctx,
const char* state, size_t state_len,
bool bypass);
-extern size_t default_ip (char* buf, size_t buf_len);
-extern size_t default_address(char* buf, size_t buf_len);
+extern size_t guess_ip (char* buf, size_t buf_len);
+extern size_t guess_address(char* buf, size_t buf_len);
extern wsrep_uuid_t local_uuid;
extern wsrep_seqno_t local_seqno;
/*! SST thread signals init thread about sst completion */
-extern void wsrep_sst_complete(wsrep_uuid_t* uuid, wsrep_seqno_t seqno, bool);
+extern void wsrep_sst_complete(const wsrep_uuid_t* uuid, wsrep_seqno_t, bool);
extern void wsrep_notify_status (wsrep_member_status_t new_status,
const wsrep_view_info_t* view = 0);
diff --git a/sql/wsrep_sst.cc b/sql/wsrep_sst.cc
index df39db3caa4..8beadeb2ff2 100644
--- a/sql/wsrep_sst.cc
+++ b/sql/wsrep_sst.cc
@@ -202,7 +202,7 @@ bool wsrep_sst_wait ()
}
// Signal end of SST
-void wsrep_sst_complete (wsrep_uuid_t* sst_uuid,
+void wsrep_sst_complete (const wsrep_uuid_t* sst_uuid,
wsrep_seqno_t sst_seqno,
bool needed)
{
@@ -242,8 +242,7 @@ struct sst_thread_arg
sst_thread_arg (const char* c) : cmd(c), err(-1), ret_str(0)
{
- mysql_mutex_init(key_LOCK_wsrep_sst_thread,
- &lock, MY_MUTEX_INIT_FAST);
+ mysql_mutex_init(key_LOCK_wsrep_sst_thread, &lock, MY_MUTEX_INIT_FAST);
mysql_cond_init(key_COND_wsrep_sst_thread, &cond, NULL);
}
@@ -382,8 +381,8 @@ static ssize_t sst_prepare_other (const char* method,
const char* sst_dir= mysql_real_data_home;
int ret= snprintf (cmd_str, cmd_len,
- "wsrep_sst_%s 'joiner' '%s' '%s' '%s' '%s' '%d' 2>sst.err",
- method, addr_in, (sst_auth_real) ? sst_auth_real : "",
+ "wsrep_sst_%s 'joiner' '%s' '%s' '%s' '%s' '%d'",
+ method, addr_in, (sst_auth_real) ? sst_auth_real : "",
sst_dir, wsrep_defaults_file, (int)getpid());
if (ret < 0 || ret >= cmd_len)
@@ -416,7 +415,7 @@ static ssize_t sst_prepare_other (const char* method,
//extern ulong my_bind_addr;
extern uint mysqld_port;
-/*! Just tells donor where ti sent mysqldump */
+/*! Just tells donor where to send mysqldump */
static ssize_t sst_prepare_mysqldump (const char* addr_in,
const char** addr_out)
{
@@ -497,7 +496,7 @@ ssize_t wsrep_sst_prepare (void** msg)
}
else
{
- ssize_t ret= default_ip (ip_buf, ip_max);
+ ssize_t ret= guess_ip (ip_buf, ip_max);
if (ret && ret < ip_max)
{
diff --git a/sql/wsrep_utils.cc b/sql/wsrep_utils.cc
index 00919b3163e..b1bd6de07cf 100644
--- a/sql/wsrep_utils.cc
+++ b/sql/wsrep_utils.cc
@@ -316,7 +316,7 @@ thd::~thd ()
extern ulong my_bind_addr;
extern uint mysqld_port;
-size_t default_ip (char* buf, size_t buf_len)
+size_t guess_ip (char* buf, size_t buf_len)
{
size_t ip_len = 0;
@@ -325,64 +325,83 @@ size_t default_ip (char* buf, size_t buf_len)
return 0;
}
- if (htonl(INADDR_ANY) == my_bind_addr) {
- // binds to all interfaces, try to find the address of the first one
-#if (TARGET_OS_LINUX == 1)
- const char cmd[] = "/sbin/ifconfig | "
- "grep -m1 -1 -E '^[a-z]?eth[0-9]' | tail -n 1 | "
- "awk '{ print $2 }' | awk -F : '{ print $2 }'";
-#elif defined(__sun__)
- const char cmd[] = "/sbin/ifconfig -a | "
- "/usr/gnu/bin/grep -m1 -1 -E 'net[0-9]:' | tail -n 1 | awk '{ print $2 }'";
-#else
- char *cmd;
-#error "OS not supported"
-#endif
- wsp::process proc (cmd, "r");
+ if (htonl(INADDR_ANY) != my_bind_addr) {
+ uint8_t* b = (uint8_t*)&my_bind_addr;
+ ip_len = snprintf (buf, buf_len,
+ "%hhu.%hhu.%hhu.%hhu", b[0],b[1],b[2],b[3]);
+ return ip_len;
+ }
- if (NULL != proc.pipe()) {
- char* ret;
+ // mysqld binds to all interfaces - try IP from wsrep_node_address
+ if (wsrep_node_address && wsrep_node_address[0] != '\0') {
+ const char* const colon_ptr = strchr(wsrep_node_address, ':');
- ret = fgets (buf, buf_len, proc.pipe());
+ if (colon_ptr)
+ ip_len = colon_ptr - wsrep_node_address;
+ else
+ ip_len = strlen(wsrep_node_address);
- if (proc.wait()) return 0;
-
- if (NULL == ret) {
- WSREP_ERROR("Failed to read output of: '%s'", cmd);
- return 0;
- }
- }
- else {
- WSREP_ERROR("Failed to execute: '%s'", cmd);
+ if (ip_len >= buf_len) {
+ WSREP_WARN("default_ip(): buffer too short: %zu <= %zd", buf_len, ip_len);
return 0;
}
- // clear possible \n at the end of ip string left by fgets()
- ip_len = strlen (buf);
- if (ip_len > 0 && '\n' == buf[ip_len - 1]) {
- ip_len--;
- buf[ip_len] = '\0';
- }
+ memcpy (buf, wsrep_node_address, ip_len);
+ buf[ip_len] = '\0';
+ return ip_len;
+ }
- if (INADDR_NONE == inet_addr(buf)) {
- if (strlen(buf) != 0) {
- WSREP_WARN("Shell command returned invalid address: '%s'", buf);
- }
+ // try to find the address of the first one
+#if (TARGET_OS_LINUX == 1)
+ const char cmd[] = "/sbin/ifconfig | "
+ "grep -m1 -1 -E '^[a-z]?eth[0-9]' | tail -n 1 | "
+ "awk '{ print $2 }' | awk -F : '{ print $2 }'";
+#elif defined(__sun__)
+ const char cmd[] = "/sbin/ifconfig -a | "
+ "/usr/gnu/bin/grep -m1 -1 -E 'net[0-9]:' | tail -n 1 | awk '{ print $2 }'";
+#else
+ char *cmd;
+#error "OS not supported"
+#endif
+ wsp::process proc (cmd, "r");
+
+ if (NULL != proc.pipe()) {
+ char* ret;
+
+ ret = fgets (buf, buf_len, proc.pipe());
+
+ if (proc.wait()) return 0;
+
+ if (NULL == ret) {
+ WSREP_ERROR("Failed to read output of: '%s'", cmd);
return 0;
}
}
else {
- uint8_t* b = (uint8_t*)&my_bind_addr;
- ip_len = snprintf (buf, buf_len,
- "%hhu.%hhu.%hhu.%hhu", b[0],b[1],b[2],b[3]);
+ WSREP_ERROR("Failed to execute: '%s'", cmd);
+ return 0;
+ }
+
+ // clear possible \n at the end of ip string left by fgets()
+ ip_len = strlen (buf);
+ if (ip_len > 0 && '\n' == buf[ip_len - 1]) {
+ ip_len--;
+ buf[ip_len] = '\0';
+ }
+
+ if (INADDR_NONE == inet_addr(buf)) {
+ if (strlen(buf) != 0) {
+ WSREP_WARN("Shell command returned invalid address: '%s'", buf);
+ }
+ return 0;
}
return ip_len;
}
-size_t default_address(char* buf, size_t buf_len)
+size_t guess_address(char* buf, size_t buf_len)
{
- size_t addr_len = default_ip (buf, buf_len);
+ size_t addr_len = guess_ip (buf, buf_len);
if (addr_len && addr_len < buf_len) {
addr_len += snprintf (buf + addr_len, buf_len - addr_len,
diff --git a/sql/wsrep_var.cc b/sql/wsrep_var.cc
index fb5c3b339cd..3136f905109 100644
--- a/sql/wsrep_var.cc
+++ b/sql/wsrep_var.cc
@@ -464,31 +464,27 @@ wsrep_assign_to_mysql (SHOW_VAR* mysql, wsrep_stats_var* wsrep)
}
}
-static wsrep_stats_var* wsrep_status_vars = NULL;
-
#if DYNAMIC
// somehow this mysql status thing works only with statically allocated arrays.
static SHOW_VAR* mysql_status_vars = NULL;
static int mysql_status_len = -1;
#else
-static SHOW_VAR mysql_status_vars[100 + 1];
-static const int mysql_status_len = 100;
+static SHOW_VAR mysql_status_vars[512 + 1];
+static const int mysql_status_len = 512;
#endif
-static void export_wsrep_status_to_mysql()
+static void export_wsrep_status_to_mysql(THD* thd)
{
int wsrep_status_len, i;
- if (wsrep_status_vars) wsrep->stats_free (wsrep, wsrep_status_vars);
+ thd->wsrep_status_vars = wsrep->stats_get(wsrep);
- wsrep_status_vars = wsrep->stats_get (wsrep);
-
- if (!wsrep_status_vars) {
+ if (!thd->wsrep_status_vars) {
return;
}
for (wsrep_status_len = 0;
- wsrep_status_vars[wsrep_status_len].name != NULL;
+ thd->wsrep_status_vars[wsrep_status_len].name != NULL;
wsrep_status_len++);
#if DYNAMIC
@@ -511,7 +507,7 @@ static void export_wsrep_status_to_mysql()
#endif
for (i = 0; i < wsrep_status_len; i++)
- wsrep_assign_to_mysql (mysql_status_vars + i, wsrep_status_vars + i);
+ wsrep_assign_to_mysql (mysql_status_vars + i, thd->wsrep_status_vars + i);
mysql_status_vars[wsrep_status_len].name = NullS;
mysql_status_vars[wsrep_status_len].value = NullS;
@@ -520,8 +516,17 @@ static void export_wsrep_status_to_mysql()
int wsrep_show_status (THD *thd, SHOW_VAR *var, char *buff)
{
- export_wsrep_status_to_mysql();
+ export_wsrep_status_to_mysql(thd);
var->type= SHOW_ARRAY;
var->value= (char *) &mysql_status_vars;
return 0;
}
+
+void wsrep_free_status (THD* thd)
+{
+ if (thd->wsrep_status_vars)
+ {
+ wsrep->stats_free (wsrep, thd->wsrep_status_vars);
+ thd->wsrep_status_vars = 0;
+ }
+}
diff --git a/storage/innobase/row/row0ins.c b/storage/innobase/row/row0ins.c
index d7823c140bf..7164295098c 100644
--- a/storage/innobase/row/row0ins.c
+++ b/storage/innobase/row/row0ins.c
@@ -1423,22 +1423,12 @@ run_again:
if (check_ref) {
err = DB_SUCCESS;
#ifdef WITH_WSREP
- if (thr->fk_cascade_depth == 0) {
- err = wsrep_append_foreign_key(
- thr_get_trx(thr),
- foreign,
- rec,
- check_index,
- check_ref, TRUE);
- } else {
- fprintf(stderr, "WSREP: skipping FK key append\n");
- err = wsrep_append_foreign_key(
- thr_get_trx(thr),
- foreign,
- rec,
- check_index,
- TRUE, TRUE);
- }
+ err = wsrep_append_foreign_key(
+ thr_get_trx(thr),
+ foreign,
+ rec,
+ check_index,
+ check_ref, TRUE);
#endif /* WITH_WSREP */
goto end_scan;
} else if (foreign->type != 0) {
@@ -1469,14 +1459,6 @@ run_again:
goto end_scan;
}
-#ifdef WITH_WSREP_REMOVED
- err = wsrep_append_foreign_key(
- thr_get_trx(thr),
- foreign,
- rec,
- check_index,
- FALSE);
-#endif /* WITH_WSREP */
/* row_ins_foreign_check_on_constraint
may have repositioned pcur on a
different block */
diff --git a/storage/xtradb/row/row0ins.c b/storage/xtradb/row/row0ins.c
index 9fbb5122a82..67b94315772 100644
--- a/storage/xtradb/row/row0ins.c
+++ b/storage/xtradb/row/row0ins.c
@@ -1429,22 +1429,12 @@ run_again:
if (check_ref) {
err = DB_SUCCESS;
#ifdef WITH_WSREP
- if (thr->fk_cascade_depth == 0) {
- err = wsrep_append_foreign_key(
- thr_get_trx(thr),
- foreign,
- rec,
- check_index,
- check_ref, TRUE);
- } else {
- fprintf(stderr, "WSREP: skipping FK key append\n");
- err = wsrep_append_foreign_key(
- thr_get_trx(thr),
- foreign,
- rec,
- check_index,
- TRUE, TRUE);
- }
+ err = wsrep_append_foreign_key(
+ thr_get_trx(thr),
+ foreign,
+ rec,
+ check_index,
+ check_ref, TRUE);
#endif /* WITH_WSREP */
goto end_scan;
} else if (foreign->type != 0) {
@@ -1475,14 +1465,6 @@ run_again:
goto end_scan;
}
-#ifdef WITH_WSREP_REMOVED
- err = wsrep_append_foreign_key(
- thr_get_trx(thr),
- foreign,
- rec,
- check_index,
- FALSE);
-#endif /* WITH_WSREP */
/* row_ins_foreign_check_on_constraint
may have repositioned pcur on a
different block */