mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Merged in change sets 3772-3779 from lp:codership-mysql/5.5
This commit is contained in:
@ -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
|
||||
<address>[: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 <address> part
|
||||
will be used to listen for SST (see below). And the whole <address>[: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.
|
||||
|
||||
|
@ -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})
|
||||
|
@ -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()
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -18,10 +18,8 @@
|
||||
|
||||
#include "mysqld.h"
|
||||
typedef struct st_mysql_show_var SHOW_VAR;
|
||||
//#include <mysql.h>
|
||||
#include <sql_priv.h>
|
||||
#include "../wsrep/wsrep_api.h"
|
||||
//#include <sql_class.h>
|
||||
|
||||
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
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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 */
|
||||
|
@ -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 */
|
||||
|
Reference in New Issue
Block a user