From 8e84b9e740ff3641f1fc500a616962cb3bc75a64 Mon Sep 17 00:00:00 2001 From: Seppo Jaakola Date: Thu, 30 Aug 2012 12:22:37 +0300 Subject: [PATCH] Merged in change sets 3772-3779 from lp:codership-mysql/5.5 --- Docs/README-wsrep | 11 +++- cmake/wsrep.cmake | 2 +- scripts/wsrep_sst_rsync.sh | 8 +-- sql/mysqld.cc | 2 +- sql/sql_class.cc | 2 + sql/sql_class.h | 1 + sql/sql_parse.cc | 2 +- sql/wsrep_mysqld.cc | 103 +++++++++++++++++++++------------ sql/wsrep_mysqld.h | 3 +- sql/wsrep_priv.h | 6 +- sql/wsrep_sst.cc | 13 ++--- sql/wsrep_utils.cc | 103 +++++++++++++++++++-------------- sql/wsrep_var.cc | 29 ++++++---- storage/innobase/row/row0ins.c | 30 ++-------- storage/xtradb/row/row0ins.c | 30 ++-------- 15 files changed, 186 insertions(+), 159 deletions(-) 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 */