From 4f4f3a5e328524bf1b467a1885b0a21a4e995d9b Mon Sep 17 00:00:00 2001 From: Alexey Yurchenko Date: Sat, 2 May 2015 22:25:39 +0300 Subject: [PATCH 01/82] Fixes codership/mysql-wsrep#118 --- sql/wsrep_mysqld.cc | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index 340ff3233e7..a154809d132 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -833,19 +833,10 @@ bool wsrep_start_replication() wsrep_sst_donor, bootstrap))) { - if (-ESOCKTNOSUPPORT == rcode) - { - DBUG_PRINT("wsrep",("unrecognized cluster address: '%s', rcode: %d", - wsrep_cluster_address, rcode)); - WSREP_ERROR("unrecognized cluster address: '%s', rcode: %d", - wsrep_cluster_address, rcode); - } - else - { - DBUG_PRINT("wsrep",("wsrep->connect() failed: %d", rcode)); - WSREP_ERROR("wsrep::connect() failed: %d", rcode); - } - + DBUG_PRINT("wsrep",("wsrep->connect(%s) failed: %d", + wsrep_cluster_address, rcode)); + WSREP_ERROR("wsrep::connect(%s) failed: %d", + wsrep_cluster_address, rcode); return false; } else From d78110e7fae1588afcb6bc5ea08be0d84ee18857 Mon Sep 17 00:00:00 2001 From: Alexey Yurchenko Date: Sat, 6 Jun 2015 01:08:41 +0300 Subject: [PATCH 02/82] Refs codership/mysql-wsrep#141: this commit 1. Passes wsrep_sst_auth_value to SST scripts via WSREP_SST_OPT_AUTH envronmental variable, so it never appears on the command line 2. In mysqldump and xtrabackup* SST scripts which rely on MySQL authentication, instead of passing password on the command line, SST script sets MYSQL_PWD environment variable, so that password also never appears on the mysqldump/innobackupex command line. --- scripts/wsrep_sst_common.sh | 35 ++++-- scripts/wsrep_sst_mysqldump.sh | 34 +++--- scripts/wsrep_sst_rsync.sh | 2 +- scripts/wsrep_sst_xtrabackup-v2.sh | 14 +-- scripts/wsrep_sst_xtrabackup.sh | 14 +-- sql/wsrep_notify.cc | 2 +- sql/wsrep_sst.cc | 188 ++++++++++++++++++----------- sql/wsrep_utils.cc | 94 ++++++++++++++- sql/wsrep_utils.h | 24 +++- 9 files changed, 294 insertions(+), 113 deletions(-) diff --git a/scripts/wsrep_sst_common.sh b/scripts/wsrep_sst_common.sh index 2546074f7bd..ec582c4840d 100644 --- a/scripts/wsrep_sst_common.sh +++ b/scripts/wsrep_sst_common.sh @@ -1,4 +1,4 @@ -# Copyright (C) 2012-2014 Codership Oy +# Copyright (C) 2012-2015 Codership Oy # # 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 @@ -20,7 +20,9 @@ set -u WSREP_SST_OPT_BYPASS=0 WSREP_SST_OPT_DATA="" -WSREP_SST_OPT_AUTH="" +WSREP_SST_OPT_AUTH=${WSREP_SST_OPT_AUTH:-} +WSREP_SST_OPT_USER=${WSREP_SST_OPT_USER:-} +WSREP_SST_OPT_PSWD=${WSREP_SST_OPT_PSWD:-} while [ $# -gt 0 ]; do case "$1" in @@ -28,10 +30,6 @@ case "$1" in readonly WSREP_SST_OPT_ADDR="$2" shift ;; - '--auth') - WSREP_SST_OPT_AUTH="$2" - shift - ;; '--bypass') WSREP_SST_OPT_BYPASS=1 ;; @@ -114,12 +112,30 @@ else MY_PRINT_DEFAULTS=$(which my_print_defaults) fi +wsrep_auth_not_set() +{ + [ -z "$WSREP_SST_OPT_AUTH" -o "$WSREP_SST_OPT_AUTH" = "(null)" ] +} + # For Bug:1200727 -if $MY_PRINT_DEFAULTS -c $WSREP_SST_OPT_CONF sst | grep -q "wsrep_sst_auth";then - if [ -z "$WSREP_SST_OPT_AUTH" -o "$WSREP_SST_OPT_AUTH" = "(null)" ];then - WSREP_SST_OPT_AUTH=$(my_print_defaults -c $WSREP_SST_OPT_CONF sst | grep -- "--wsrep_sst_auth" | cut -d= -f2) +if $MY_PRINT_DEFAULTS -c $WSREP_SST_OPT_CONF sst | grep -q "wsrep_sst_auth" +then + if wsrep_auth_not_set + then + WSREP_SST_OPT_AUTH=$(MY_PRINT_DEFAULTS -c $WSREP_SST_OPT_CONF sst | grep -- "--wsrep_sst_auth" | cut -d= -f2) fi fi +readonly WSREP_SST_OPT_AUTH + +# Splitting AUTH into potential user:password pair +if ! wsrep_auth_not_set +then + readonly AUTH_VEC=(${WSREP_SST_OPT_AUTH//:/ }) + [ -n "${AUTH_VEC[0]}" ] && WSREP_SST_OPT_USER="${AUTH_VEC[0]}" + [ -n "${AUTH_VEC[1]}" ] && WSREP_SST_OPT_PSWD="${AUTH_VEC[1]}" +fi +readonly WSREP_SST_OPT_USER +readonly WSREP_SST_OPT_PSWD if [ -n "${WSREP_SST_OPT_DATA:-}" ] then @@ -128,7 +144,6 @@ else SST_PROGRESS_FILE="" fi - wsrep_log() { # echo everything to stderr so that it gets into common error log diff --git a/scripts/wsrep_sst_mysqldump.sh b/scripts/wsrep_sst_mysqldump.sh index e21e1cd01bc..b470ea6095b 100644 --- a/scripts/wsrep_sst_mysqldump.sh +++ b/scripts/wsrep_sst_mysqldump.sh @@ -1,5 +1,5 @@ -#!/bin/bash -e -# Copyright (C) 2009 Codership Oy +#!/bin/bash -ue +# Copyright (C) 2009-2015 Codership Oy # # 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 @@ -38,7 +38,6 @@ local_ip() return 1 } -if test -z "$WSREP_SST_OPT_USER"; then wsrep_log_error "USER cannot be nil"; exit $EINVAL; fi if test -z "$WSREP_SST_OPT_HOST"; then wsrep_log_error "HOST cannot be nil"; exit $EINVAL; fi if test -z "$WSREP_SST_OPT_PORT"; then wsrep_log_error "PORT cannot be nil"; exit $EINVAL; fi if test -z "$WSREP_SST_OPT_LPORT"; then wsrep_log_error "LPORT cannot be nil"; exit $EINVAL; fi @@ -54,7 +53,7 @@ then fi # Check client version -CLIENT_MINOR=$(mysql --version | cut -d ' ' -f 6 | cut -d '.' -f 2) +CLIENT_MINOR=$($MYSQL_CLIENT --version | cut -d ' ' -f 6 | cut -d '.' -f 2) if [ $CLIENT_MINOR -lt "5" ] then $MYSQL_CLIENT --version >&2 @@ -62,13 +61,18 @@ then exit $EINVAL fi -# For Bug:1293798 -if [ -z "$WSREP_SST_OPT_PSWD" -a -n "$WSREP_SST_OPT_AUTH" ]; then - WSREP_SST_OPT_USER=$(echo $WSREP_SST_OPT_AUTH | cut -d: -f1) - WSREP_SST_OPT_PSWD=$(echo $WSREP_SST_OPT_AUTH | cut -d: -f2) -fi -AUTH="-u$WSREP_SST_OPT_USER" -if test -n "$WSREP_SST_OPT_PSWD"; then AUTH="$AUTH -p$WSREP_SST_OPT_PSWD"; fi +[ -n "$WSREP_SST_OPT_USER" ] && AUTH="-u$WSREP_SST_OPT_USER" || AUTH= + +# Refs https://github.com/codership/mysql-wsrep/issues/141 +# Passing password in MYSQL_PWD environment variable is considered +# "extremely insecure" by MySQL Guidelines for Password Security +# (https://dev.mysql.com/doc/refman/5.6/en/password-security-user.html) +# that is even less secure than passing it on a command line! It is doubtful: +# the whole command line is easily observable by any unprivileged user via ps, +# whereas (at least on Linux) unprivileged user can't see process environment +# that he does not own. So while it may be not secure in the NSA sense of the +# word, it is arguably more secure than passing password on the command line. +[ -n "$WSREP_SST_OPT_PSWD" ] && export MYSQL_PWD="$WSREP_SST_OPT_PSWD" STOP_WSREP="SET wsrep_on=OFF;" @@ -104,10 +108,10 @@ MYSQL="$MYSQL_CLIENT $AUTH -h$WSREP_SST_OPT_HOST -P$WSREP_SST_OPT_PORT "\ # need to disable logging when loading the dump # reason is that dump contains ALTER TABLE for log tables, and # this causes an error if logging is enabled -GENERAL_LOG_OPT=`$MYSQL --skip-column-names -e"$STOP_WSREP SELECT @@GENERAL_LOG"` -SLOW_LOG_OPT=`$MYSQL --skip-column-names -e"$STOP_WSREP SELECT @@SLOW_QUERY_LOG"` -$MYSQL -e"$STOP_WSREP SET GLOBAL GENERAL_LOG=OFF" -$MYSQL -e"$STOP_WSREP SET GLOBAL SLOW_QUERY_LOG=OFF" +GENERAL_LOG_OPT=`$MYSQL --skip-column-names -e "$STOP_WSREP SELECT @@GENERAL_LOG"` +SLOW_LOG_OPT=`$MYSQL --skip-column-names -e "$STOP_WSREP SELECT @@SLOW_QUERY_LOG"` +$MYSQL -e "$STOP_WSREP SET GLOBAL GENERAL_LOG=OFF" +$MYSQL -e "$STOP_WSREP SET GLOBAL SLOW_QUERY_LOG=OFF" # commands to restore log settings RESTORE_GENERAL_LOG="SET GLOBAL GENERAL_LOG=$GENERAL_LOG_OPT;" diff --git a/scripts/wsrep_sst_rsync.sh b/scripts/wsrep_sst_rsync.sh index 494ed4b5c02..3202087f526 100644 --- a/scripts/wsrep_sst_rsync.sh +++ b/scripts/wsrep_sst_rsync.sh @@ -32,8 +32,8 @@ wsrep_check_programs rsync cleanup_joiner() { - wsrep_log_info "Joiner cleanup." local PID=$(cat "$RSYNC_PID" 2>/dev/null || echo 0) + wsrep_log_info "Joiner cleanup. rsync PID: $PID" [ "0" != "$PID" ] && kill $PID && sleep 0.5 && kill -9 $PID >/dev/null 2>&1 \ || : rm -rf "$RSYNC_CONF" diff --git a/scripts/wsrep_sst_xtrabackup-v2.sh b/scripts/wsrep_sst_xtrabackup-v2.sh index 9af5c758a17..5339fd721da 100644 --- a/scripts/wsrep_sst_xtrabackup-v2.sh +++ b/scripts/wsrep_sst_xtrabackup-v2.sh @@ -77,7 +77,6 @@ pcmd="pv $pvopts" declare -a RC INNOBACKUPEX_BIN=innobackupex -readonly AUTH=(${WSREP_SST_OPT_AUTH//:/ }) DATA="${WSREP_SST_OPT_DATA}" INFO_FILE="xtrabackup_galera_info" IST_FILE="xtrabackup_ist" @@ -576,13 +575,14 @@ then itmpdir=$(mktemp -d) wsrep_log_info "Using $itmpdir as innobackupex temporary directory" - if [ "${AUTH[0]}" != "(null)" ]; then - INNOEXTRA+=" --user=${AUTH[0]}" - fi + if [ "$WSREP_SST_OPT_USER" != "(null)" ]; then + INNOEXTRA+=" --user=$WSREP_SST_OPT_USER" + fi - if [ ${#AUTH[*]} -eq 2 ]; then - INNOEXTRA+=" --password=${AUTH[1]}" - elif [ "${AUTH[0]}" != "(null)" ]; then + if [ -n "$WSREP_SST_OPT_PSWD" ]; then +# INNOEXTRA+=" --password=$WSREP_SST_OPT_PSWD" + export MYSQL_PWD="$WSREP_SST_OPT_PSWD" + else # Empty password, used for testing, debugging etc. INNOEXTRA+=" --password=" fi diff --git a/scripts/wsrep_sst_xtrabackup.sh b/scripts/wsrep_sst_xtrabackup.sh index 044f9995580..9c264586149 100644 --- a/scripts/wsrep_sst_xtrabackup.sh +++ b/scripts/wsrep_sst_xtrabackup.sh @@ -61,7 +61,6 @@ pcmd="pv $pvopts" declare -a RC INNOBACKUPEX_BIN=innobackupex -readonly AUTH=(${WSREP_SST_OPT_AUTH//:/ }) DATA="${WSREP_SST_OPT_DATA}" INFO_FILE="xtrabackup_galera_info" IST_FILE="xtrabackup_ist" @@ -435,13 +434,14 @@ then then TMPDIR="${TMPDIR:-/tmp}" - if [ "${AUTH[0]}" != "(null)" ]; then - INNOEXTRA+=" --user=${AUTH[0]}" - fi + if [ "$WSREP_SST_OPT_USER" != "(null)" ]; then + INNOEXTRA+=" --user=$WSREP_SST_OPT_USER" + fi - if [ ${#AUTH[*]} -eq 2 ]; then - INNOEXTRA+=" --password=${AUTH[1]}" - elif [ "${AUTH[0]}" != "(null)" ]; then + if [ -n "$WSREP_SST_OPT_PSWD" ]; then +# INNOEXTRA+=" --password=$WSREP_SST_OPT_PSWD" + export MYSQL_PWD="$WSREP_SST_OPT_PSWD" + else # Empty password, used for testing, debugging etc. INNOEXTRA+=" --password=" fi diff --git a/sql/wsrep_notify.cc b/sql/wsrep_notify.cc index 6eefb961b62..e7d30d5a9c1 100644 --- a/sql/wsrep_notify.cc +++ b/sql/wsrep_notify.cc @@ -97,7 +97,7 @@ void wsrep_notify_status (wsrep_member_status_t status, return; } - wsp::process p(cmd_ptr, "r"); + wsp::process p(cmd_ptr, "r", NULL); p.wait(); int err = p.error(); diff --git a/sql/wsrep_sst.cc b/sql/wsrep_sst.cc index 4167740236f..5e1a4973c2a 100644 --- a/sql/wsrep_sst.cc +++ b/sql/wsrep_sst.cc @@ -270,12 +270,14 @@ void wsrep_sst_continue () struct sst_thread_arg { const char* cmd; - int err; + char** env; char* ret_str; + int err; mysql_mutex_t lock; mysql_cond_t cond; - sst_thread_arg (const char* c) : cmd(c), err(-1), ret_str(0) + sst_thread_arg (const char* c, char** e) + : cmd(c), env(e), ret_str(0), err(-1) { mysql_mutex_init(key_LOCK_wsrep_sst_thread, &lock, MY_MUTEX_INIT_FAST); mysql_cond_init(key_COND_wsrep_sst_thread, &cond, NULL); @@ -333,7 +335,7 @@ static void* sst_joiner_thread (void* a) WSREP_INFO("Running: '%s'", arg->cmd); - wsp::process proc (arg->cmd, "r"); + wsp::process proc (arg->cmd, "r", arg->env); if (proc.pipe() && !proc.error()) { @@ -407,23 +409,54 @@ static void* sst_joiner_thread (void* a) return NULL; } +#define WSREP_SST_AUTH_ENV "WSREP_SST_OPT_AUTH" + +static int sst_append_auth_env(wsp::env& env, const char* sst_auth) +{ + int const sst_auth_size= strlen(WSREP_SST_AUTH_ENV) + 1 /* = */ + + (sst_auth ? strlen(sst_auth) : 0) + 1 /* \0 */; + + wsp::string sst_auth_str(sst_auth_size); // for automatic cleanup on return + if (!sst_auth_str()) return -ENOMEM; + + int ret= snprintf(sst_auth_str(), sst_auth_size, "%s=%s", + WSREP_SST_AUTH_ENV, sst_auth ? sst_auth : ""); + + if (ret < 0 || ret >= sst_auth_size) + { + WSREP_ERROR("sst_append_auth_env(): snprintf() failed: %d", ret); + return (ret < 0 ? ret : -EMSGSIZE); + } + + env.append(sst_auth_str()); + return -env.error(); +} + static ssize_t sst_prepare_other (const char* method, + const char* sst_auth, const char* addr_in, const char** addr_out) { - char cmd_str[1024]; - const char* sst_dir= mysql_real_data_home; + int const cmd_len= 4096; + wsp::string cmd_str(cmd_len); - int ret= snprintf (cmd_str, sizeof(cmd_str), + if (!cmd_str()) + { + WSREP_ERROR("sst_prepare_other(): could not allocate cmd buffer of %d bytes", + cmd_len); + return -ENOMEM; + } + + int ret= snprintf (cmd_str(), cmd_len, "wsrep_sst_%s " WSREP_SST_OPT_ROLE" 'joiner' " WSREP_SST_OPT_ADDR" '%s' " - WSREP_SST_OPT_AUTH" '%s' " WSREP_SST_OPT_DATA" '%s' " WSREP_SST_OPT_CONF" '%s' " WSREP_SST_OPT_PARENT" '%d'", - method, addr_in, (sst_auth_real) ? sst_auth_real : "", - sst_dir, wsrep_defaults_file, (int)getpid()); + method, addr_in, + mysql_real_data_home, + wsrep_defaults_file, (int)getpid()); if (ret < 0 || ret >= (int)sizeof(cmd_str)) { @@ -431,8 +464,21 @@ static ssize_t sst_prepare_other (const char* method, return (ret < 0 ? ret : -EMSGSIZE); } + wsp::env env(NULL); + if (env.error()) + { + WSREP_ERROR("sst_prepare_other(): env. var ctor failed: %d", -env.error()); + return -env.error(); + } + + if ((ret= sst_append_auth_env(env, sst_auth))) + { + WSREP_ERROR("sst_prepare_other(): appending auth failed: %d", ret); + return ret; + } + pthread_t tmp; - sst_thread_arg arg(cmd_str); + sst_thread_arg arg(cmd_str(), env()); mysql_mutex_lock (&arg.lock); ret = pthread_create (&tmp, NULL, sst_joiner_thread, &arg); if (ret) @@ -582,7 +628,8 @@ ssize_t wsrep_sst_prepare (void** msg) return 0; } - addr_len = sst_prepare_other (wsrep_sst_method, addr_in, &addr_out); + addr_len = sst_prepare_other (wsrep_sst_method, sst_auth_real, + addr_in, &addr_out); if (addr_len < 0) { WSREP_ERROR("Failed to prepare for '%s' SST. Unrecoverable.", @@ -615,13 +662,13 @@ ssize_t wsrep_sst_prepare (void** msg) } // helper method for donors -static int sst_run_shell (const char* cmd_str, int max_tries) +static int sst_run_shell (const char* cmd_str, char** env, int max_tries) { int ret = 0; for (int tries=1; tries <= max_tries; tries++) { - wsp::process proc (cmd_str, "r"); + wsp::process proc (cmd_str, "r", env); if (NULL != proc.pipe()) { @@ -651,17 +698,12 @@ static void sst_reject_queries(my_bool close_conn) if (TRUE == close_conn) wsrep_close_client_connections(FALSE); } -static int sst_mysqldump_check_addr (const char* user, const char* pswd, - const char* host, const char* port) -{ - return 0; -} - static int sst_donate_mysqldump (const char* addr, const wsrep_uuid_t* uuid, const char* uuid_str, wsrep_seqno_t seqno, - bool bypass) + bool bypass, + char** env) // carries auth info { size_t host_len; const char* port = strchr (addr, ':'); @@ -682,54 +724,42 @@ static int sst_donate_mysqldump (const char* addr, strncpy (host, addr, host_len - 1); host[host_len - 1] = '\0'; - const char* auth = sst_auth_real; - const char* pswd = (auth) ? strchr (auth, ':') : NULL; - size_t user_len; + int const cmd_len= 4096; + wsp::string cmd_str(cmd_len); - if (pswd) + if (!cmd_str()) { - pswd += 1; - user_len = pswd - auth; - } - else - { - pswd = ""; - user_len = (auth) ? strlen (auth) + 1 : 1; + WSREP_ERROR("sst_donate_mysqldump(): " + "could not allocate cmd buffer of %d bytes", cmd_len); + return -ENOMEM; } - char *user= (char *) alloca(user_len); + if (!bypass && wsrep_sst_donor_rejects_queries) sst_reject_queries(TRUE); - strncpy (user, (auth) ? auth : "", user_len - 1); - user[user_len - 1] = '\0'; + int ret= snprintf (cmd_str(), cmd_len, + "wsrep_sst_mysqldump " + WSREP_SST_OPT_HOST" '%s' " + WSREP_SST_OPT_PORT" '%s' " + WSREP_SST_OPT_LPORT" '%u' " + WSREP_SST_OPT_SOCKET" '%s' " + WSREP_SST_OPT_DATA" '%s' " + WSREP_SST_OPT_CONF" '%s' " + WSREP_SST_OPT_GTID" '%s:%lld'" + "%s", + host, port, mysqld_port, mysqld_unix_port, + mysql_real_data_home, wsrep_defaults_file, uuid_str, + (long long)seqno, bypass ? " "WSREP_SST_OPT_BYPASS : ""); - int ret = sst_mysqldump_check_addr (user, pswd, host, port); - if (!ret) + if (ret < 0 || ret >= cmd_len) { - char cmd_str[1024]; - - if (!bypass && wsrep_sst_donor_rejects_queries) sst_reject_queries(TRUE); - - snprintf (cmd_str, sizeof(cmd_str), - "wsrep_sst_mysqldump " - WSREP_SST_OPT_USER" '%s' " - WSREP_SST_OPT_PSWD" '%s' " - WSREP_SST_OPT_HOST" '%s' " - WSREP_SST_OPT_PORT" '%s' " - WSREP_SST_OPT_LPORT" '%u' " - WSREP_SST_OPT_SOCKET" '%s' " - WSREP_SST_OPT_DATA" '%s' " - WSREP_SST_OPT_CONF" '%s' " - WSREP_SST_OPT_GTID" '%s:%lld'" - "%s", - user, pswd, host, port, mysqld_port, mysqld_unix_port, - mysql_real_data_home, wsrep_defaults_file, uuid_str, - (long long)seqno, bypass ? " "WSREP_SST_OPT_BYPASS : ""); - - WSREP_DEBUG("Running: '%s'", cmd_str); - - ret= sst_run_shell (cmd_str, 3); + WSREP_ERROR("sst_donate_mysqldump(): snprintf() failed: %d", ret); + return (ret < 0 ? ret : -EMSGSIZE); } + WSREP_DEBUG("Running: '%s'", cmd_str()); + + ret= sst_run_shell (cmd_str(), env, 3); + wsrep_gtid_t const state_id = { *uuid, (ret ? WSREP_SEQNO_UNDEFINED : seqno)}; wsrep->sst_sent (wsrep, &state_id, ret); @@ -883,7 +913,7 @@ static void* sst_donor_thread (void* a) wsp::thd thd(FALSE); // we turn off wsrep_on for this THD so that it can // operate with wsrep_ready == OFF - wsp::process proc(arg->cmd, "r"); + wsp::process proc(arg->cmd, "r", arg->env); err= proc.error(); @@ -968,21 +998,29 @@ static int sst_donate_other (const char* method, const char* addr, const char* uuid, wsrep_seqno_t seqno, - bool bypass) + bool bypass, + char** env) // carries auth info { - char cmd_str[4096]; + int const cmd_len= 4096; + wsp::string cmd_str(cmd_len); - int ret= snprintf (cmd_str, sizeof(cmd_str), + if (!cmd_str()) + { + WSREP_ERROR("sst_donate_other(): " + "could not allocate cmd buffer of %d bytes", cmd_len); + return -ENOMEM; + } + + int ret= snprintf (cmd_str(), cmd_len, "wsrep_sst_%s " WSREP_SST_OPT_ROLE" 'donor' " WSREP_SST_OPT_ADDR" '%s' " - WSREP_SST_OPT_AUTH" '%s' " WSREP_SST_OPT_SOCKET" '%s' " WSREP_SST_OPT_DATA" '%s' " WSREP_SST_OPT_CONF" '%s' " WSREP_SST_OPT_GTID" '%s:%lld'" "%s", - method, addr, sst_auth_real, mysqld_unix_port, + method, addr, mysqld_unix_port, mysql_real_data_home, wsrep_defaults_file, uuid, (long long) seqno, bypass ? " "WSREP_SST_OPT_BYPASS : ""); @@ -996,7 +1034,7 @@ static int sst_donate_other (const char* method, if (!bypass && wsrep_sst_donor_rejects_queries) sst_reject_queries(FALSE); pthread_t tmp; - sst_thread_arg arg(cmd_str); + sst_thread_arg arg(cmd_str(), env); mysql_mutex_lock (&arg.lock); ret = pthread_create (&tmp, NULL, sst_donor_thread, &arg); if (ret) @@ -1029,15 +1067,29 @@ wsrep_cb_status_t wsrep_sst_donate_cb (void* app_ctx, void* recv_ctx, char uuid_str[37]; wsrep_uuid_print (¤t_gtid->uuid, uuid_str, sizeof(uuid_str)); + wsp::env env(NULL); + if (env.error()) + { + WSREP_ERROR("sst_donate_other(): env var ctor failed: %d", -env.error()); + return WSREP_CB_FAILURE; + } + int ret; + if ((ret= sst_append_auth_env(env, sst_auth_real))) + { + WSREP_ERROR("sst_donate_other(): appending auth env failed: %d", ret); + return WSREP_CB_FAILURE; + } + if (!strcmp (WSREP_SST_MYSQLDUMP, method)) { ret = sst_donate_mysqldump(data, ¤t_gtid->uuid, uuid_str, - current_gtid->seqno, bypass); + current_gtid->seqno, bypass, env()); } else { - ret = sst_donate_other(method, data, uuid_str, current_gtid->seqno,bypass); + ret = sst_donate_other(method, data, uuid_str, + current_gtid->seqno, bypass, env()); } return (ret > 0 ? WSREP_CB_SUCCESS : WSREP_CB_FAILURE); diff --git a/sql/wsrep_utils.cc b/sql/wsrep_utils.cc index ee87b9615a8..13a3b4a7438 100644 --- a/sql/wsrep_utils.cc +++ b/sql/wsrep_utils.cc @@ -63,7 +63,7 @@ wsrep_prepend_PATH (const char* path) size_t const new_path_len(strlen(old_path) + strlen(":") + strlen(path) + 1); - char* const new_path (reinterpret_cast(malloc(new_path_len))); + char* const new_path (static_cast(malloc(new_path_len))); if (new_path) { @@ -89,6 +89,91 @@ wsrep_prepend_PATH (const char* path) namespace wsp { +bool +env::ctor_common(char** e) +{ + env_ = static_cast(malloc((len_ + 1) * sizeof(char*))); + + if (env_) + { + for (size_t i(0); i < len_; ++i) + { + assert(e[i]); // caller should make sure about len_ + env_[i] = strdup(e[i]); + if (!env_[i]) + { + errno_ = errno; + WSREP_ERROR("Failed to allocate env. var: %s", e[i]); + return true; + } + } + + env_[len_] = NULL; + return false; + } + else + { + errno_ = errno; + WSREP_ERROR("Failed to allocate env. var vector of length: %zu", len_); + return true; + } +} + +void +env::dtor() +{ + if (env_) + { + /* don't need to go beyond the first NULL */ + for (size_t i(0); env_[i] != NULL; ++i) { free(env_[i]); } + free(env_); + env_ = NULL; + } + len_ = 0; +} + +env::env(char** e) + : len_(0), env_(NULL), errno_(0) +{ + if (!e) { e = environ; } + /* count the size of the vector */ + while (e[len_]) { ++len_; } + + if (ctor_common(e)) dtor(); +} + +env::env(const env& e) + : len_(e.len_), env_(0), errno_(0) +{ + if (ctor_common(e.env_)) dtor(); +} + +env::~env() { dtor(); } + +int +env::append(const char* val) +{ + char** tmp = static_cast(realloc(env_, (len_ + 2)*sizeof(char*))); + + if (tmp) + { + env_ = tmp; + env_[len_] = strdup(val); + + if (env_[len_]) + { + ++len_; + env_[len_] = NULL; + } + } + + /* if either realloc() or strdup() failed, errno had been set */ + errno_ = errno; + + return errno_; +} + + #define PIPE_READ 0 #define PIPE_WRITE 1 #define STDIN_FD 0 @@ -98,7 +183,7 @@ namespace wsp # define POSIX_SPAWN_USEVFORK 0 #endif -process::process (const char* cmd, const char* type) +process::process (const char* cmd, const char* type, char** env) : str_(cmd ? strdup(cmd) : strdup("")), io_(NULL), err_(EINVAL), pid_(0) { if (0 == str_) @@ -120,6 +205,8 @@ process::process (const char* cmd, const char* type) return; } + if (NULL == env) { env = environ; } // default to global environment + int pipe_fds[2] = { -1, }; if (::pipe(pipe_fds)) { @@ -215,7 +302,7 @@ process::process (const char* cmd, const char* type) goto cleanup_fact; } - err_ = posix_spawnp (&pid_, pargv[0], &fact, &attr, pargv, environ); + err_ = posix_spawnp (&pid_, pargv[0], &fact, &attr, pargv, env); if (err_) { WSREP_ERROR ("posix_spawnp(%s) failed: %d (%s)", @@ -309,6 +396,7 @@ process::wait () { case 126: err_ = EACCES; break; /* Permission denied */ case 127: err_ = ENOENT; break; /* No such file or directory */ + case 143: err_ = EINTR; break; /* Subprocess killed */ } WSREP_ERROR("Process completed with error: %s: %d (%s)", str_, err_, strerror(err_)); diff --git a/sql/wsrep_utils.h b/sql/wsrep_utils.h index dfb68bcd1b7..c43febf249a 100644 --- a/sql/wsrep_utils.h +++ b/sql/wsrep_utils.h @@ -44,6 +44,25 @@ private: extern wsp::node_status local_status; namespace wsp { +/* a class to manage env vars array */ +class env +{ +private: + size_t len_; + char** env_; + int errno_; + bool ctor_common(char** e); + void dtor(); + env& operator =(env); +public: + explicit env(char** env); + explicit env(const env&); + ~env(); + int append(const char* var); /* add a new env. var */ + int error() const { return errno_; } + char** operator()() { return env_; } +}; + /* A small class to run external programs. */ class process { @@ -56,8 +75,9 @@ private: public: /*! @arg type is a pointer to a null-terminated string which must contain either the letter 'r' for reading or the letter 'w' for writing. + @arg env optional null-terminated vector of environment variables */ - process (const char* cmd, const char* type); + process (const char* cmd, const char* type, char** env); ~process (); FILE* pipe () { return io_; } @@ -90,6 +110,8 @@ class string { public: string() : string_(0) {} + explicit string(size_t s) : string_(static_cast(malloc(s))) {} + char* operator()() { return string_; } void set(char* str) { if (string_) free (string_); string_ = str; } ~string() { set (0); } private: From a7ea3ec34d7c542542dc11e324b1667fd9ba1a48 Mon Sep 17 00:00:00 2001 From: Alexey Yurchenko Date: Sat, 6 Jun 2015 01:38:07 +0300 Subject: [PATCH 03/82] Synced xtrabackup SST fixes from Percona tree (as of PXC 5.6.24-25.11 release). This fixes/adresses the following LP bugs: - LP1380697: wsrep_sst_xtrabackup-v2 doesn't stop when mysql is SIGKILLed. (full fix for this (as engineeered by Percona) requires Linux-specific patch that we don't carry, but keep xtrabackup scripts as close as possible) - LP1399134: Log the innobackupex/SST logs in SST to syslog if possible. (fixed) - LP1405668: Race condition between donor and joiner in PXB SST. (fixed) - LP1405985: Fail early if xtrabackup_checkkpoints is missing. (fixed) - LP1407599: wsrep_sst_xtrabackup-v2 script causes innobackupex to print a false positive stack trace into the log. (fixed) - LP1441762: IST Fails with SST script error. (fixed) - LP1451670: Fail when move-back fails in xtrabackup SST. (fixed) --- scripts/wsrep_sst_common.sh | 12 ++ scripts/wsrep_sst_xtrabackup-v2.sh | 304 +++++++++++++++++++---------- scripts/wsrep_sst_xtrabackup.sh | 6 +- 3 files changed, 214 insertions(+), 108 deletions(-) diff --git a/scripts/wsrep_sst_common.sh b/scripts/wsrep_sst_common.sh index ec582c4840d..f7cd9e91849 100644 --- a/scripts/wsrep_sst_common.sh +++ b/scripts/wsrep_sst_common.sh @@ -19,6 +19,8 @@ set -u WSREP_SST_OPT_BYPASS=0 +WSREP_SST_OPT_BINLOG="" +WSREP_SST_OPT_CONF_SUFFIX="" WSREP_SST_OPT_DATA="" WSREP_SST_OPT_AUTH=${WSREP_SST_OPT_AUTH:-} WSREP_SST_OPT_USER=${WSREP_SST_OPT_USER:-} @@ -41,6 +43,10 @@ case "$1" in readonly WSREP_SST_OPT_CONF="$2" shift ;; + '--defaults-group-suffix') + WSREP_SST_OPT_CONF_SUFFIX="$2" + shift + ;; '--host') readonly WSREP_SST_OPT_HOST="$2" shift @@ -77,6 +83,10 @@ case "$1" in readonly WSREP_SST_OPT_GTID="$2" shift ;; + '--binlog') + WSREP_SST_OPT_BINLOG="$2" + shift + ;; *) # must be command # usage # exit 1 @@ -85,6 +95,8 @@ esac shift done readonly WSREP_SST_OPT_BYPASS +readonly WSREP_SST_OPT_BINLOG +readonly WSREP_SST_OPT_CONF_SUFFIX # try to use my_print_defaults, mysql and mysqldump that come with the sources # (for MTR suite) diff --git a/scripts/wsrep_sst_xtrabackup-v2.sh b/scripts/wsrep_sst_xtrabackup-v2.sh index 5339fd721da..c7eb474c919 100644 --- a/scripts/wsrep_sst_xtrabackup-v2.sh +++ b/scripts/wsrep_sst_xtrabackup-v2.sh @@ -29,6 +29,8 @@ ekeyfile="" encrypt=0 nproc=1 ecode=0 +ssyslog="" +ssystag="" XTRABACKUP_PID="" SST_PORT="" REMOTEIP="" @@ -40,15 +42,15 @@ progress="" ttime=0 totime=0 lsn="" -incremental=0 ecmd="" rlimit="" # Initially stagemsg="${WSREP_SST_OPT_ROLE}" cpat="" -speciald=0 +speciald=1 ib_home_dir="" ib_log_dir="" +ib_undo_dir="" sfmt="tar" strmcmd="" @@ -70,6 +72,11 @@ xtmpdir="" scomp="" sdecomp="" +# Required for backup locks +# For backup locks it is 1 sent by joiner +# 5.6.21 PXC and later can't donate to an older joiner +sst_ver=1 + if which pv &>/dev/null && pv --help | grep -q FORMAT;then pvopts+=$pvformat fi @@ -168,7 +175,11 @@ get_transfer() fi wsrep_log_info "Using netcat as streamer" if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]];then - tcmd="nc -dl ${TSST_PORT}" + if nc -h | grep -q ncat;then + tcmd="nc -l ${TSST_PORT}" + else + tcmd="nc -dl ${TSST_PORT}" + fi else tcmd="nc ${REMOTEIP} ${TSST_PORT}" fi @@ -252,6 +263,16 @@ get_footprint() adjust_progress() { + + if [[ ! -x `which pv` ]];then + wsrep_log_error "pv not found in path: $PATH" + wsrep_log_error "Disabling all progress/rate-limiting" + pcmd="" + rlimit="" + progress="" + return + fi + if [[ -n $progress && $progress != '1' ]];then if [[ -e $progress ]];then pcmd+=" 2>>$progress" @@ -281,8 +302,7 @@ read_cnf() progress=$(parse_cnf sst progress "") rebuild=$(parse_cnf sst rebuild 0) ttime=$(parse_cnf sst time 0) - cpat=$(parse_cnf sst cpat '.*galera\.cache$\|.*sst_in_progress$\|.*grastate\.dat$\|.*gvwstate\.dat$\|.*\.err$\|.*\.log$\|.*RPM_UPGRADE_MARKER$\|.*RPM_UPGRADE_HISTORY$') - incremental=$(parse_cnf sst incremental 0) + cpat=$(parse_cnf sst cpat '.*galera\.cache$\|.*sst_in_progress$\|.*\.sst$\|.*gvwstate\.dat$\|.*grastate\.dat$\|.*\.err$\|.*\.log$\|.*RPM_UPGRADE_MARKER$\|.*RPM_UPGRADE_HISTORY$') ealgo=$(parse_cnf xtrabackup encrypt "") ekey=$(parse_cnf xtrabackup encrypt-key "") ekeyfile=$(parse_cnf xtrabackup encrypt-key-file "") @@ -297,12 +317,26 @@ read_cnf() ekeyfile=$(parse_cnf sst encrypt-key-file "") fi rlimit=$(parse_cnf sst rlimit "") - uextra=$(parse_cnf sst use_extra 0) + uextra=$(parse_cnf sst use-extra 0) speciald=$(parse_cnf sst sst-special-dirs 1) iopts=$(parse_cnf sst inno-backup-opts "") iapts=$(parse_cnf sst inno-apply-opts "") impts=$(parse_cnf sst inno-move-opts "") stimeout=$(parse_cnf sst sst-initial-timeout 100) + ssyslog=$(parse_cnf sst sst-syslog 0) + ssystag=$(parse_cnf mysqld_safe syslog-tag "${SST_SYSLOG_TAG:-}") + ssystag+="-" + + if [[ $speciald -eq 0 ]];then + wsrep_log_error "sst-special-dirs equal to 0 is not supported, falling back to 1" + speciald=1 + fi + + if [[ $ssyslog -ne -1 ]];then + if my_print_defaults -c $WSREP_SST_OPT_CONF mysqld_safe | tr '_' '-' | grep -q -- "--syslog";then + ssyslog=1 + fi + fi } get_stream() @@ -346,8 +380,7 @@ cleanup_joiner() local estatus=$? if [[ $estatus -ne 0 ]];then wsrep_log_error "Cleanup after exit with status:$estatus" - fi - if [ "${WSREP_SST_OPT_ROLE}" = "joiner" ];then + elif [ "${WSREP_SST_OPT_ROLE}" = "joiner" ];then wsrep_log_info "Removing the sst_in_progress file" wsrep_cleanup_progress_file fi @@ -358,6 +391,23 @@ cleanup_joiner() if [[ -n ${STATDIR:-} ]];then [[ -d $STATDIR ]] && rm -rf $STATDIR fi + + # Final cleanup + pgid=$(ps -o pgid= $$ | grep -o '[0-9]*') + + # This means no setsid done in mysqld. + # We don't want to kill mysqld here otherwise. + if [[ $$ -eq $pgid ]];then + + # This means a signal was delivered to the process. + # So, more cleanup. + if [[ $estatus -ge 128 ]];then + kill -KILL -$$ || true + fi + + fi + + exit $estatus } check_pid() @@ -398,6 +448,24 @@ cleanup_donor() if [[ -n $itmpdir ]];then [[ -d $itmpdir ]] && rm -rf $itmpdir || true fi + + # Final cleanup + pgid=$(ps -o pgid= $$ | grep -o '[0-9]*') + + # This means no setsid done in mysqld. + # We don't want to kill mysqld here otherwise. + if [[ $$ -eq $pgid ]];then + + # This means a signal was delivered to the process. + # So, more cleanup. + if [[ $estatus -ge 128 ]];then + kill -KILL -$$ || true + fi + + fi + + exit $estatus + } kill_xtrabackup() @@ -414,6 +482,7 @@ setup_ports() SST_PORT=$(echo $WSREP_SST_OPT_ADDR | awk -F '[:/]' '{ print $2 }') REMOTEIP=$(echo $WSREP_SST_OPT_ADDR | awk -F ':' '{ print $1 }') lsn=$(echo $WSREP_SST_OPT_ADDR | awk -F '[:/]' '{ print $4 }') + sst_ver=$(echo $WSREP_SST_OPT_ADDR | awk -F '[:/]' '{ print $5 }') else SST_PORT=$(echo ${WSREP_SST_OPT_ADDR} | awk -F ':' '{ print $2 }') fi @@ -431,11 +500,7 @@ wait_for_listen() ss -p state listening "( sport = :$PORT )" | grep -qE 'socat|nc' && break sleep 0.2 done - if [[ $incremental -eq 1 ]];then - echo "ready ${ADDR}/${MODULE}/$lsn" - else - echo "ready ${ADDR}/${MODULE}" - fi + echo "ready ${ADDR}/${MODULE}//$sst_ver" } check_extra() @@ -443,7 +508,7 @@ check_extra() local use_socket=1 if [[ $uextra -eq 1 ]];then if $MY_PRINT_DEFAULTS -c $WSREP_SST_OPT_CONF mysqld | tr '_' '-' | grep -- "--thread-handling=" | grep -q 'pool-of-threads';then - local eport=$($MY_PRINT_DEFAULTS -c $WSREP_SST_OPT_CONF mysqld | tr '_' '-' | grep -- "--extra-port=" | cut -d= -f2) + local eport=$(my_print_defaults -c $WSREP_SST_OPT_CONF mysqld | tr '_' '-' | grep -- "--extra-port=" | cut -d= -f2) if [[ -n $eport ]];then # Xtrabackup works only locally. # Hence, setting host to 127.0.0.1 unconditionally. @@ -468,8 +533,14 @@ recv_joiner() local dir=$1 local msg=$2 local tmt=$3 + local checkf=$4 local ltcmd + if [[ ! -d ${dir} ]];then + # This indicates that IST is in progress + return + fi + pushd ${dir} 1>/dev/null set +e @@ -477,7 +548,7 @@ recv_joiner() if timeout --help | grep -q -- '-k';then ltcmd="timeout -k $(( tmt+10 )) $tmt $tcmd" else - ltcmd="timeout $tmt $tcmd" + ltcmd="timeout -s9 $tmt $tcmd" fi timeit "$msg" "$ltcmd | $strmcmd; RC=( "\${PIPESTATUS[@]}" )" else @@ -500,7 +571,7 @@ recv_joiner() fi done - if [ ! -r "${MAGIC_FILE}" ];then + if [[ $checkf -eq 1 && ! -r "${MAGIC_FILE}" ]];then # this message should cause joiner to abort wsrep_log_error "xtrabackup process ended without creating '${MAGIC_FILE}'" wsrep_log_info "Contents of datadir" @@ -546,18 +617,52 @@ fi read_cnf setup_ports -get_stream -get_transfer -if ${INNOBACKUPEX_BIN} /tmp --help | grep -- '--version-check' >/dev/null ; then +if ${INNOBACKUPEX_BIN} /tmp --help 2>/dev/null | grep -q -- '--version-check'; then disver="--no-version-check" fi +if [[ ${FORCE_FTWRL:-0} -eq 1 ]];then + wsrep_log_info "Forcing FTWRL due to environment variable FORCE_FTWRL equal to $FORCE_FTWRL" + iopts+=" --no-backup-locks " +fi + INNOEXTRA="" -INNOAPPLY="${INNOBACKUPEX_BIN} $disver $iapts --apply-log \$rebuildcmd \${DATA} &>\${DATA}/innobackup.prepare.log" -INNOMOVE="${INNOBACKUPEX_BIN} --defaults-file=${WSREP_SST_OPT_CONF} $disver $impts --move-back --force-non-empty-directories \${DATA} &>\${DATA}/innobackup.move.log" -INNOBACKUP="${INNOBACKUPEX_BIN} --defaults-file=${WSREP_SST_OPT_CONF} $disver $iopts \$tmpopts \$INNOEXTRA --galera-info --stream=\$sfmt \$itmpdir 2>\${DATA}/innobackup.backup.log" + +if [[ $ssyslog -eq 1 ]];then + + if [[ ! -x `which logger` ]];then + wsrep_log_error "logger not in path: $PATH. Ignoring" + else + + wsrep_log_info "Logging all stderr of SST/Innobackupex to syslog" + + exec 2> >(logger -p daemon.err -t ${ssystag}wsrep-sst-$WSREP_SST_OPT_ROLE) + + wsrep_log_error() + { + logger -p daemon.err -t ${ssystag}wsrep-sst-$WSREP_SST_OPT_ROLE "$@" + } + + wsrep_log_info() + { + logger -p daemon.info -t ${ssystag}wsrep-sst-$WSREP_SST_OPT_ROLE "$@" + } + + INNOAPPLY="${INNOBACKUPEX_BIN} $disver $iapts --apply-log \$rebuildcmd \${DATA} 2>&1 | logger -p daemon.err -t ${ssystag}innobackupex-apply " + INNOMOVE="${INNOBACKUPEX_BIN} --defaults-file=${WSREP_SST_OPT_CONF} $disver $impts --move-back --force-non-empty-directories \${DATA} 2>&1 | logger -p daemon.err -t ${ssystag}innobackupex-move " + INNOBACKUP="${INNOBACKUPEX_BIN} --defaults-file=${WSREP_SST_OPT_CONF} $disver $iopts \$tmpopts \$INNOEXTRA --galera-info --stream=\$sfmt \$itmpdir 2> >(logger -p daemon.err -t ${ssystag}innobackupex-backup)" + fi + +else + INNOAPPLY="${INNOBACKUPEX_BIN} $disver $iapts --apply-log \$rebuildcmd \${DATA} &>\${DATA}/innobackup.prepare.log" + INNOMOVE="${INNOBACKUPEX_BIN} --defaults-file=${WSREP_SST_OPT_CONF} --defaults-group=mysqld${WSREP_SST_OPT_CONF_SUFFIX} $disver $impts --move-back --force-non-empty-directories \${DATA} &>\${DATA}/innobackup.move.log" + INNOBACKUP="${INNOBACKUPEX_BIN} --defaults-file=${WSREP_SST_OPT_CONF} --defaults-group=mysqld${WSREP_SST_OPT_CONF_SUFFIX} $disver $iopts \$tmpopts \$INNOEXTRA --galera-info --stream=\$sfmt \$itmpdir 2>\${DATA}/innobackup.backup.log" +fi + +get_stream +get_transfer if [ "$WSREP_SST_OPT_ROLE" = "donor" ] then @@ -565,6 +670,11 @@ then if [ $WSREP_SST_OPT_BYPASS -eq 0 ] then + if [[ -z $sst_ver ]];then + wsrep_log_error "Upgrade joiner to 5.6.21 or higher for backup locks support" + wsrep_log_error "The joiner is not supported for this version of donor" + exit 93 + fi if [[ -z $(parse_cnf mysqld tmpdir "") && -z $(parse_cnf xtrabackup tmpdir "") ]];then xtmpdir=$(mktemp -d) @@ -596,9 +706,6 @@ then fi fi - if [[ -n $lsn ]];then - INNOEXTRA+=" --incremental --incremental-lsn=$lsn " - fi check_extra @@ -686,29 +793,12 @@ then [[ -e $SST_PROGRESS_FILE ]] && wsrep_log_info "Stale sst_in_progress file: $SST_PROGRESS_FILE" [[ -n $SST_PROGRESS_FILE ]] && touch $SST_PROGRESS_FILE - if [[ $speciald -eq 1 ]];then - wsrep_log_info "WARNING: sst-special-dirs feature requires PXC 2.1.6 or latter." - fi - - if [[ $speciald -eq 1 ]];then - ib_home_dir=$(parse_cnf mysqld innodb-data-home-dir "") - ib_log_dir=$(parse_cnf mysqld innodb-log-group-home-dir "") - if [[ -z $ib_home_dir && -z $ib_log_dir ]];then - speciald=0 - fi - fi + ib_home_dir=$(parse_cnf mysqld innodb-data-home-dir "") + ib_log_dir=$(parse_cnf mysqld innodb-log-group-home-dir "") + ib_undo_dir=$(parse_cnf mysqld innodb-undo-directory "") stagemsg="Joiner-Recv" - if [[ ! -e ${DATA}/ibdata1 ]];then - incremental=0 - fi - - if [[ $incremental -eq 1 ]];then - wsrep_log_info "Incremental SST enabled: NOT SUPPORTED yet" - lsn=$(grep to_lsn xtrabackup_checkpoints | cut -d= -f2 | tr -d ' ') - wsrep_log_info "Recovered LSN: $lsn" - fi sencrypted=1 nthreads=1 @@ -737,12 +827,6 @@ then tcmd+=" | $pcmd" fi - if [[ $incremental -eq 1 ]];then - BDATA=$DATA - DATA=$(mktemp -d) - MAGIC_FILE="${DATA}/${INFO_FILE}" - fi - get_keys if [[ $encrypt -eq 1 && $sencrypted -eq 1 ]];then if [[ -n $sdecomp ]];then @@ -756,7 +840,8 @@ then STATDIR=$(mktemp -d) MAGIC_FILE="${STATDIR}/${INFO_FILE}" - recv_joiner $STATDIR "${stagemsg}-gtid" $stimeout + recv_joiner $STATDIR "${stagemsg}-gtid" $stimeout 1 + if ! ps -p ${WSREP_SST_OPT_PARENT} &>/dev/null then @@ -766,50 +851,48 @@ then if [ ! -r "${STATDIR}/${IST_FILE}" ] then + + if [[ -d ${DATA}/.sst ]];then + wsrep_log_info "WARNING: Stale temporary SST directory: ${DATA}/.sst from previous state transfer" + fi + mkdir -p ${DATA}/.sst + (recv_joiner $DATA/.sst "${stagemsg}-SST" 0 0) & + jpid=$! wsrep_log_info "Proceeding with SST" - if [[ $speciald -eq 1 && -d ${DATA}/.sst ]];then - wsrep_log_info "WARNING: Stale temporary SST directory: ${DATA}/.sst from previous SST" - fi - if [[ $incremental -ne 1 ]];then - if [[ $speciald -eq 1 ]];then - wsrep_log_info "Cleaning the existing datadir and innodb-data/log directories" - find $ib_home_dir $ib_log_dir $DATA -mindepth 1 -regex $cpat -prune -o -exec rm -rfv {} 1>&2 \+ - else - wsrep_log_info "Cleaning the existing datadir" - find $DATA -mindepth 1 -regex $cpat -prune -o -exec rm -rfv {} 1>&2 \+ + wsrep_log_info "Cleaning the existing datadir and innodb-data/log directories" + find $ib_home_dir $ib_log_dir $ib_undo_dir $DATA -mindepth 1 -regex $cpat -prune -o -exec rm -rfv {} 1>&2 \+ + + tempdir=$(parse_cnf mysqld log-bin "") + if [[ -n ${tempdir:-} ]];then + binlog_dir=$(dirname $tempdir) + binlog_file=$(basename $tempdir) + if [[ -n ${binlog_dir:-} && $binlog_dir != '.' && $binlog_dir != $DATA ]];then + pattern="$binlog_dir/$binlog_file\.[0-9]+$" + wsrep_log_info "Cleaning the binlog directory $binlog_dir as well" + find $binlog_dir -maxdepth 1 -type f -regex $pattern -exec rm -fv {} 1>&2 \+ || true + rm $binlog_dir/*.index || true fi - tempdir=$(parse_cnf mysqld log-bin "") - if [[ -n ${tempdir:-} ]];then - binlog_dir=$(dirname $tempdir) - binlog_file=$(basename $tempdir) - if [[ -n ${binlog_dir:-} && $binlog_dir != '.' && $binlog_dir != $DATA ]];then - pattern="$binlog_dir/$binlog_file\.[0-9]+$" - wsrep_log_info "Cleaning the binlog directory $binlog_dir as well" - find $binlog_dir -maxdepth 1 -type f -regex $pattern -exec rm -fv {} 1>&2 \+ - rm $binlog_dir/*.index || true - fi - fi - - else - wsrep_log_info "Removing existing ib_logfile files" - rm -f ${BDATA}/ib_logfile* fi - if [[ $speciald -eq 1 ]];then - mkdir -p ${DATA}/.sst - TDATA=${DATA} - DATA="${DATA}/.sst" - fi + + TDATA=${DATA} + DATA="${DATA}/.sst" MAGIC_FILE="${DATA}/${INFO_FILE}" - recv_joiner $DATA "${stagemsg}-SST" 0 + wsrep_log_info "Waiting for SST streaming to complete!" + wait $jpid get_proc + if [[ ! -s ${DATA}/xtrabackup_checkpoints ]];then + wsrep_log_error "xtrabackup_checkpoints missing, failed innobackupex/SST on donor" + exit 2 + fi + # Rebuild indexes for compact backups if grep -q 'compact = 1' ${DATA}/xtrabackup_checkpoints;then wsrep_log_info "Index compaction detected" @@ -864,12 +947,24 @@ then fi fi - if [[ $incremental -eq 1 ]];then - # Added --ibbackup=xtrabackup_55 because it fails otherwise citing connection issues. - INNOAPPLY="${INNOBACKUPEX_BIN} --defaults-file=${WSREP_SST_OPT_CONF} \ - --ibbackup=xtrabackup_55 --apply-log $rebuildcmd --redo-only $BDATA --incremental-dir=${DATA} &>>${BDATA}/innobackup.prepare.log" + + if [[ ! -z $WSREP_SST_OPT_BINLOG ]];then + + BINLOG_DIRNAME=$(dirname $WSREP_SST_OPT_BINLOG) + BINLOG_FILENAME=$(basename $WSREP_SST_OPT_BINLOG) + + # To avoid comparing data directory and BINLOG_DIRNAME + mv $DATA/${BINLOG_FILENAME}.* $BINLOG_DIRNAME/ 2>/dev/null || true + + pushd $BINLOG_DIRNAME &>/dev/null + for bfiles in $(ls -1 ${BINLOG_FILENAME}.*);do + echo ${BINLOG_DIRNAME}/${bfiles} >> ${BINLOG_FILENAME}.index + done + popd &> /dev/null + fi + wsrep_log_info "Preparing the backup at ${DATA}" timeit "Xtrabackup prepare stage" "$INNOAPPLY" @@ -879,28 +974,22 @@ then exit 22 fi - if [[ $speciald -eq 1 ]];then - MAGIC_FILE="${TDATA}/${INFO_FILE}" - set +e - rm $TDATA/innobackup.prepare.log $TDATA/innobackup.move.log - set -e - wsrep_log_info "Moving the backup to ${TDATA}" - timeit "Xtrabackup move stage" "$INNOMOVE" - if [[ $? -eq 0 ]];then - wsrep_log_info "Move successful, removing ${DATA}" - rm -rf $DATA - DATA=${TDATA} - else - wsrep_log_error "Move failed, keeping ${DATA} for further diagnosis" - wsrep_log_error "Check ${DATA}/innobackup.move.log for details" - fi + MAGIC_FILE="${TDATA}/${INFO_FILE}" + set +e + rm $TDATA/innobackup.prepare.log $TDATA/innobackup.move.log + set -e + wsrep_log_info "Moving the backup to ${TDATA}" + timeit "Xtrabackup move stage" "$INNOMOVE" + if [[ $? -eq 0 ]];then + wsrep_log_info "Move successful, removing ${DATA}" + rm -rf $DATA + DATA=${TDATA} + else + wsrep_log_error "Move failed, keeping ${DATA} for further diagnosis" + wsrep_log_error "Check ${DATA}/innobackup.move.log for details" + exit 22 fi - if [[ $incremental -eq 1 ]];then - wsrep_log_info "Cleaning up ${DATA} after incremental SST" - [[ -d ${DATA} ]] && rm -rf ${DATA} - DATA=$BDATA - fi else wsrep_log_info "${IST_FILE} received from donor: Running IST" @@ -910,6 +999,7 @@ then wsrep_log_error "SST magic file ${MAGIC_FILE} not found/readable" exit 2 fi + wsrep_log_info "Galera co-ords from recovery: $(cat ${MAGIC_FILE})" cat "${MAGIC_FILE}" # output UUID:seqno wsrep_log_info "Total time on joiner: $totime seconds" fi diff --git a/scripts/wsrep_sst_xtrabackup.sh b/scripts/wsrep_sst_xtrabackup.sh index 9c264586149..7279c623288 100644 --- a/scripts/wsrep_sst_xtrabackup.sh +++ b/scripts/wsrep_sst_xtrabackup.sh @@ -149,7 +149,11 @@ get_transfer() fi wsrep_log_info "Using netcat as streamer" if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]];then - tcmd="nc -dl ${TSST_PORT}" + if nc -h | grep -q ncat;then + tcmd="nc -l ${TSST_PORT}" + else + tcmd="nc -dl ${TSST_PORT}" + fi else tcmd="nc ${REMOTEIP} ${TSST_PORT}" fi From 62c25393767179b6ace73a94b07e9fe2cfff5ba2 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Mon, 8 Jun 2015 01:46:20 -0700 Subject: [PATCH 04/82] Refs codership/mysql-wsrep#143 . Account for the case where the SST password is empty --- scripts/wsrep_sst_common.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/wsrep_sst_common.sh b/scripts/wsrep_sst_common.sh index f7cd9e91849..f6d838ef425 100644 --- a/scripts/wsrep_sst_common.sh +++ b/scripts/wsrep_sst_common.sh @@ -144,7 +144,7 @@ if ! wsrep_auth_not_set then readonly AUTH_VEC=(${WSREP_SST_OPT_AUTH//:/ }) [ -n "${AUTH_VEC[0]}" ] && WSREP_SST_OPT_USER="${AUTH_VEC[0]}" - [ -n "${AUTH_VEC[1]}" ] && WSREP_SST_OPT_PSWD="${AUTH_VEC[1]}" + [ -n "${AUTH_VEC[1]:-}" ] && WSREP_SST_OPT_PSWD="${AUTH_VEC[1]:-}" fi readonly WSREP_SST_OPT_USER readonly WSREP_SST_OPT_PSWD From 1b1410c449c651739590dba3d61ea5494c149ed3 Mon Sep 17 00:00:00 2001 From: Alexey Yurchenko Date: Mon, 8 Jun 2015 12:23:53 +0300 Subject: [PATCH 05/82] Slight cleanup improvement on a previous commit. --- scripts/wsrep_sst_common.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/wsrep_sst_common.sh b/scripts/wsrep_sst_common.sh index f6d838ef425..0aa338510e0 100644 --- a/scripts/wsrep_sst_common.sh +++ b/scripts/wsrep_sst_common.sh @@ -143,8 +143,8 @@ readonly WSREP_SST_OPT_AUTH if ! wsrep_auth_not_set then readonly AUTH_VEC=(${WSREP_SST_OPT_AUTH//:/ }) - [ -n "${AUTH_VEC[0]}" ] && WSREP_SST_OPT_USER="${AUTH_VEC[0]}" - [ -n "${AUTH_VEC[1]:-}" ] && WSREP_SST_OPT_PSWD="${AUTH_VEC[1]:-}" + WSREP_SST_OPT_USER="${AUTH_VEC[0]:-}" + WSREP_SST_OPT_PSWD="${AUTH_VEC[1]:-}" fi readonly WSREP_SST_OPT_USER readonly WSREP_SST_OPT_PSWD From d809fcc3011c8fa8cfd62aa6232f45469a829611 Mon Sep 17 00:00:00 2001 From: Alexey Yurchenko Date: Mon, 8 Jun 2015 21:06:22 +0300 Subject: [PATCH 06/82] This commit fixes - errno handling in wsp::env::append() method, where error could be returned by mistake - return code of sst_prepare_other() when pthread_create() fails - it was returning positive error code which by convention is treated as success. --- sql/wsrep_sst.cc | 4 ++-- sql/wsrep_utils.cc | 7 +++---- sql/wsrep_utils.h | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/sql/wsrep_sst.cc b/sql/wsrep_sst.cc index 5e1a4973c2a..dd6f169eb48 100644 --- a/sql/wsrep_sst.cc +++ b/sql/wsrep_sst.cc @@ -1,4 +1,4 @@ -/* Copyright 2008-2012 Codership Oy +/* Copyright 2008-2015 Codership Oy 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 @@ -485,7 +485,7 @@ static ssize_t sst_prepare_other (const char* method, { WSREP_ERROR("sst_prepare_other(): pthread_create() failed: %d (%s)", ret, strerror(ret)); - return ret; + return -ret; } mysql_cond_wait (&arg.cond, &arg.lock); diff --git a/sql/wsrep_utils.cc b/sql/wsrep_utils.cc index 13a3b4a7438..951007c2660 100644 --- a/sql/wsrep_utils.cc +++ b/sql/wsrep_utils.cc @@ -1,4 +1,4 @@ -/* Copyright 2010 Codership Oy +/* Copyright 2010-2015 Codership Oy 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 @@ -165,10 +165,9 @@ env::append(const char* val) ++len_; env_[len_] = NULL; } + else errno_ = errno; } - - /* if either realloc() or strdup() failed, errno had been set */ - errno_ = errno; + else errno_ = errno; return errno_; } diff --git a/sql/wsrep_utils.h b/sql/wsrep_utils.h index c43febf249a..7d864603c7f 100644 --- a/sql/wsrep_utils.h +++ b/sql/wsrep_utils.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2013 Codership Oy +/* Copyright (C) 2013-2015 Codership Oy 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 From 0465e3a117f6c0c2e7c20441007c1e92d9c563ca Mon Sep 17 00:00:00 2001 From: Alexey Yurchenko Date: Tue, 9 Jun 2015 11:36:31 +0300 Subject: [PATCH 07/82] Logging message cleanup --- sql/wsrep_sst.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/wsrep_sst.cc b/sql/wsrep_sst.cc index dd6f169eb48..cda8ec7418d 100644 --- a/sql/wsrep_sst.cc +++ b/sql/wsrep_sst.cc @@ -1070,14 +1070,14 @@ wsrep_cb_status_t wsrep_sst_donate_cb (void* app_ctx, void* recv_ctx, wsp::env env(NULL); if (env.error()) { - WSREP_ERROR("sst_donate_other(): env var ctor failed: %d", -env.error()); + WSREP_ERROR("wsrep_sst_donate_cb(): env var ctor failed: %d", -env.error()); return WSREP_CB_FAILURE; } int ret; if ((ret= sst_append_auth_env(env, sst_auth_real))) { - WSREP_ERROR("sst_donate_other(): appending auth env failed: %d", ret); + WSREP_ERROR("wsrep_sst_donate_cb(): appending auth env failed: %d", ret); return WSREP_CB_FAILURE; } From 55dfddff1d99db73f19cdbd1eff3222f2acd181d Mon Sep 17 00:00:00 2001 From: Alexey Yurchenko Date: Tue, 9 Jun 2015 17:02:26 +0300 Subject: [PATCH 08/82] Fixing donate callback return code --- sql/wsrep_sst.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/wsrep_sst.cc b/sql/wsrep_sst.cc index cda8ec7418d..a73c9706c7d 100644 --- a/sql/wsrep_sst.cc +++ b/sql/wsrep_sst.cc @@ -1092,7 +1092,7 @@ wsrep_cb_status_t wsrep_sst_donate_cb (void* app_ctx, void* recv_ctx, current_gtid->seqno, bypass, env()); } - return (ret > 0 ? WSREP_CB_SUCCESS : WSREP_CB_FAILURE); + return (ret >= 0 ? WSREP_CB_SUCCESS : WSREP_CB_FAILURE); } void wsrep_SE_init_grab() From bee94cc9f4ef58c5bb3d10393a9e92bcd32994f0 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Tue, 7 Jul 2015 22:34:25 -0700 Subject: [PATCH 09/82] Fixes codership/mysql-wsrep#153 use --defaults-extra-file with mysqldump SST --- scripts/wsrep_sst_mysqldump.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/wsrep_sst_mysqldump.sh b/scripts/wsrep_sst_mysqldump.sh index b470ea6095b..988f9232da8 100644 --- a/scripts/wsrep_sst_mysqldump.sh +++ b/scripts/wsrep_sst_mysqldump.sh @@ -77,7 +77,8 @@ fi STOP_WSREP="SET wsrep_on=OFF;" # NOTE: we don't use --routines here because we're dumping mysql.proc table -MYSQLDUMP="$MYSQLDUMP $AUTH -S$WSREP_SST_OPT_SOCKET \ +MYSQLDUMP="$MYSQLDUMP --defaults-extra-file=$WSREP_SST_OPT_CONF \ +$AUTH -S$WSREP_SST_OPT_SOCKET \ --add-drop-database --add-drop-table --skip-add-locks --create-options \ --disable-keys --extended-insert --skip-lock-tables --quick --set-charset \ --skip-comments --flush-privileges --all-databases --events" @@ -102,7 +103,8 @@ DROP PREPARE stmt;" SET_START_POSITION="SET GLOBAL wsrep_start_position='$WSREP_SST_OPT_GTID';" -MYSQL="$MYSQL_CLIENT $AUTH -h$WSREP_SST_OPT_HOST -P$WSREP_SST_OPT_PORT "\ +MYSQL="$MYSQL_CLIENT --defaults-extra-file=$WSREP_SST_OPT_CONF "\ +"$AUTH -h$WSREP_SST_OPT_HOST -P$WSREP_SST_OPT_PORT "\ "--disable-reconnect --connect_timeout=10" # need to disable logging when loading the dump From 760b0c4758ee463c8c97c1a756709d3d25506eed Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Thu, 27 Aug 2015 00:41:56 -0700 Subject: [PATCH 10/82] Bump WSREP_PATCH_VERSION in cmake/wsrep.cmake to 12 --- cmake/wsrep.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/wsrep.cmake b/cmake/wsrep.cmake index 50698b7bb8f..9870710d65b 100644 --- a/cmake/wsrep.cmake +++ b/cmake/wsrep.cmake @@ -18,7 +18,7 @@ # so WSREP_VERSION is produced regardless # Set the patch version -SET(WSREP_PATCH_VERSION "11") +SET(WSREP_PATCH_VERSION "12") # MariaDB addition: Revision number of the last revision merged from # codership branch visible in @@visible_comment. From 37ae601a8766f37cdd919efc801133d2a8cfaf70 Mon Sep 17 00:00:00 2001 From: Nirbhay Choubey Date: Wed, 9 Sep 2015 18:54:14 -0400 Subject: [PATCH 11/82] Update WSREP_PATCH_REVNO --- cmake/wsrep.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/wsrep.cmake b/cmake/wsrep.cmake index 9870710d65b..7740a4608f6 100644 --- a/cmake/wsrep.cmake +++ b/cmake/wsrep.cmake @@ -22,8 +22,8 @@ SET(WSREP_PATCH_VERSION "12") # MariaDB addition: Revision number of the last revision merged from # codership branch visible in @@visible_comment. -# Branch : codership-mysql/5.5 -SET(WSREP_PATCH_REVNO "4026") # Should be updated on every merge. +# Branch : https://github.com/codership/mysql-wsrep/tree/5.5 +SET(WSREP_PATCH_REVNO "4f81026") # Should be updated on every merge. # MariaDB: Obtain patch revision number: # Update WSREP_PATCH_REVNO if WSREP_REV environment variable is set. From 9f716ae9d372926eddc4a14e41fab6dc4664417f Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Sun, 29 Mar 2015 23:56:21 -0700 Subject: [PATCH 12/82] Galera MTR: Disable rpl.rpl_rotate_logs binlog.binlog_index due to codership/mysql-wsrep#71 --- mysql-test/suite/jp/disabled.def | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mysql-test/suite/jp/disabled.def b/mysql-test/suite/jp/disabled.def index 888298bbb09..b74382895d2 100644 --- a/mysql-test/suite/jp/disabled.def +++ b/mysql-test/suite/jp/disabled.def @@ -9,3 +9,5 @@ # Do not use any TAB characters for whitespace. # ############################################################################## + +binlog_index : codership/mysql-wsrep##71 Regression: Duplicate "file was not purged because it is the active log file" warning From f8b724db289a540bf4e2d8cba4deceb2e68c9587 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Tue, 31 Mar 2015 06:43:38 -0700 Subject: [PATCH 13/82] Galera MTR Tests: Enable the use of --parallel for port-intensive Galera tests by additionally specifying --port-group-size=50 --- mysql-test/mysql-test-run.pl | 16 ++++++++++------ .../suite/galera/r/galera_fulltext.result | 10 +++++----- .../suite/galera/r/galera_many_rows.result | 2 ++ .../galera/r/galera_transaction_replay.result | 4 ++-- mysql-test/suite/galera/t/galera_fulltext.test | 8 ++++---- mysql-test/suite/galera/t/galera_many_rows.test | 4 ++++ .../galera/t/galera_restart_nochanges.test | 1 + .../galera/t/galera_transaction_replay.test | 6 +++--- .../r/galera_certification_ccc.result | 3 +++ .../suite/galera_3nodes/r/galera_garbd.result | 3 +++ .../galera_3nodes/r/galera_pc_weight.result | 7 ++++--- .../suite/galera_3nodes/t/galera_garbd.test | 12 ++++++++++++ .../suite/galera_3nodes/t/galera_pc_weight.test | 17 +++++++++++++++-- 13 files changed, 68 insertions(+), 25 deletions(-) diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index 1acada98776..60d34ae5e8a 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -363,6 +363,7 @@ my $opt_max_save_datadir= env_or_val(MTR_MAX_SAVE_DATADIR => 20); my $opt_max_test_fail= env_or_val(MTR_MAX_TEST_FAIL => 10); my $opt_parallel= $ENV{MTR_PARALLEL} || 1; +my $opt_port_group_size = $ENV{MTR_PORT_GROUP_SIZE} || 10; # lock file to stop tests my $opt_stop_file= $ENV{MTR_STOP_FILE}; @@ -1147,6 +1148,7 @@ sub command_line_setup { # Specify ports 'build-thread|mtr-build-thread=i' => \$opt_build_thread, 'port-base|mtr-port-base=i' => \$opt_port_base, + 'port-group-size=s' => \$opt_port_group_size, # Test case authoring 'record' => \$opt_record, @@ -1838,16 +1840,16 @@ sub set_build_thread_ports($) { $ENV{MTR_BUILD_THREAD}= $build_thread; # Calculate baseport - $baseport= $build_thread * 20 + 10000; - if ( $baseport < 5001 or $baseport + 19 >= 32767 ) + $baseport= $build_thread * $opt_port_group_size + 10000; + if ( $baseport < 5001 or $baseport + $opt_port_group_size >= 32767 ) { mtr_error("MTR_BUILD_THREAD number results in a port", "outside 5001 - 32767", - "($baseport - $baseport + 19)"); + "($baseport - $baseport + $opt_port_group_size)"); } mtr_report("Using MTR_BUILD_THREAD $build_thread,", - "with reserved ports $baseport..".($baseport+19)); + "with reserved ports $baseport..".($baseport+($opt_port_group_size-1))); } @@ -3392,8 +3394,8 @@ sub kill_leftovers ($) { sub check_ports_free ($) { my $bthread= shift; - my $portbase = $bthread * 10 + 10000; - for ($portbase..$portbase+9){ + my $portbase = $bthread * $opt_port_group_size + 10000; + for ($portbase..$portbase+($opt_port_group_size-1)){ if (mtr_ping_port($_)){ mtr_report(" - 'localhost:$_' was not free"); return 0; # One port was not free @@ -6493,6 +6495,8 @@ Options that specify ports build-thread=# Can be set in environment variable MTR_BUILD_THREAD. Set MTR_BUILD_THREAD="auto" to automatically aquire a build thread id that is unique to current host + port-group-size=N Reserve groups of TCP ports of size N for each MTR thread + Options for test case authoring diff --git a/mysql-test/suite/galera/r/galera_fulltext.result b/mysql-test/suite/galera/r/galera_fulltext.result index 72577695202..84ae0a116a1 100644 --- a/mysql-test/suite/galera/r/galera_fulltext.result +++ b/mysql-test/suite/galera/r/galera_fulltext.result @@ -4,13 +4,13 @@ CREATE TABLE t1 (f1 INT PRIMARY KEY AUTO_INCREMENT, f2 VARCHAR(100), FULLTEXT (f SELECT COUNT(*) = 13 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE name LIKE 'test/%'; COUNT(*) = 13 1 -INSERT INTO t1 (f2) SELECT 'foobarbaz' FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; -SELECT COUNT(f2) = 10000 FROM t1 WHERE MATCH(f2) AGAINST ('foobarbaz'); -COUNT(f2) = 10000 +INSERT INTO t1 (f2) SELECT 'foobarbaz' FROM ten AS a1, ten AS a2, ten AS a3; +SELECT COUNT(f2) = 1000 FROM t1 WHERE MATCH(f2) AGAINST ('foobarbaz'); +COUNT(f2) = 1000 1 UPDATE t1 SET f2 = 'abcdefjhk'; -SELECT COUNT(f2) = 10000 FROM t1 WHERE MATCH(f2) AGAINST ('abcdefjhk'); -COUNT(f2) = 10000 +SELECT COUNT(f2) = 1000 FROM t1 WHERE MATCH(f2) AGAINST ('abcdefjhk'); +COUNT(f2) = 1000 1 DROP TABLE t1; CREATE TABLE t1 (f1 VARCHAR(100), FULLTEXT (f1)) ENGINE=InnoDB; diff --git a/mysql-test/suite/galera/r/galera_many_rows.result b/mysql-test/suite/galera/r/galera_many_rows.result index 6ec0add8ba8..340307ac00e 100644 --- a/mysql-test/suite/galera/r/galera_many_rows.result +++ b/mysql-test/suite/galera/r/galera_many_rows.result @@ -1,3 +1,5 @@ +SET SESSION innodb_lock_wait_timeout=300; +SET SESSION lock_wait_timeout=300; CREATE TABLE ten (f1 INTEGER); INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); CREATE TABLE t1 (f1 INTEGER AUTO_INCREMENT PRIMARY KEY, f2 INTEGER) Engine=InnoDB; diff --git a/mysql-test/suite/galera/r/galera_transaction_replay.result b/mysql-test/suite/galera/r/galera_transaction_replay.result index 23ed87ffe22..54ea8db699d 100644 --- a/mysql-test/suite/galera/r/galera_transaction_replay.result +++ b/mysql-test/suite/galera/r/galera_transaction_replay.result @@ -7,12 +7,12 @@ UPDATE t1 SET f2 = 'b' WHERE f1 = 1; SELECT * FROM t1 WHERE f1 = 2 FOR UPDATE; f1 f2 2 a -SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_enter_sync'; +SET GLOBAL wsrep_provider_options = 'dbug=d,commit_monitor_enter_sync'; COMMIT;; SET SESSION wsrep_sync_wait = 0; UPDATE t1 SET f2 = 'c' WHERE f1 = 2; SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_enter_sync'; +SET GLOBAL wsrep_provider_options = 'signal=commit_monitor_enter_sync'; SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'b'; COUNT(*) = 1 1 diff --git a/mysql-test/suite/galera/t/galera_fulltext.test b/mysql-test/suite/galera/t/galera_fulltext.test index aa93a336f92..a90cab1aa1a 100644 --- a/mysql-test/suite/galera/t/galera_fulltext.test +++ b/mysql-test/suite/galera/t/galera_fulltext.test @@ -24,16 +24,16 @@ SELECT COUNT(*) = 13 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE name LIKE ' # --connection node_1 -# Insert 10K rows -INSERT INTO t1 (f2) SELECT 'foobarbaz' FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; +# Insert 1K rows +INSERT INTO t1 (f2) SELECT 'foobarbaz' FROM ten AS a1, ten AS a2, ten AS a3; --connection node_2 -SELECT COUNT(f2) = 10000 FROM t1 WHERE MATCH(f2) AGAINST ('foobarbaz'); +SELECT COUNT(f2) = 1000 FROM t1 WHERE MATCH(f2) AGAINST ('foobarbaz'); UPDATE t1 SET f2 = 'abcdefjhk'; --connection node_1 -SELECT COUNT(f2) = 10000 FROM t1 WHERE MATCH(f2) AGAINST ('abcdefjhk'); +SELECT COUNT(f2) = 1000 FROM t1 WHERE MATCH(f2) AGAINST ('abcdefjhk'); --connection node_2 diff --git a/mysql-test/suite/galera/t/galera_many_rows.test b/mysql-test/suite/galera/t/galera_many_rows.test index 0f4c4c0db78..7df9eedca9b 100644 --- a/mysql-test/suite/galera/t/galera_many_rows.test +++ b/mysql-test/suite/galera/t/galera_many_rows.test @@ -3,6 +3,10 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +--connection node_1 +SET SESSION innodb_lock_wait_timeout=300; +SET SESSION lock_wait_timeout=300; + CREATE TABLE ten (f1 INTEGER); INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); diff --git a/mysql-test/suite/galera/t/galera_restart_nochanges.test b/mysql-test/suite/galera/t/galera_restart_nochanges.test index 4021ab39cc0..d2fceebb97f 100644 --- a/mysql-test/suite/galera/t/galera_restart_nochanges.test +++ b/mysql-test/suite/galera/t/galera_restart_nochanges.test @@ -22,6 +22,7 @@ INSERT INTO t1 VALUES (1); --let $galera_server_number = 2 --source include/galera_connect.inc --connection node_2a +--source include/galera_wait_ready.inc SELECT COUNT(*) = 1 FROM t1; SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; diff --git a/mysql-test/suite/galera/t/galera_transaction_replay.test b/mysql-test/suite/galera/t/galera_transaction_replay.test index d2c74ab192b..e67ce43de39 100644 --- a/mysql-test/suite/galera/t/galera_transaction_replay.test +++ b/mysql-test/suite/galera/t/galera_transaction_replay.test @@ -23,7 +23,7 @@ SELECT * FROM t1 WHERE f1 = 2 FOR UPDATE; # Block the commit --connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 -SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_enter_sync'; +SET GLOBAL wsrep_provider_options = 'dbug=d,commit_monitor_enter_sync'; --connection node_1 --send COMMIT; @@ -31,7 +31,7 @@ SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_enter_sync'; # Wait until commit is blocked --connection node_1a SET SESSION wsrep_sync_wait = 0; ---let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_debug_sync_waiters' AND VARIABLE_VALUE = 'apply_monitor_enter_sync' +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_debug_sync_waiters' AND VARIABLE_VALUE = 'commit_monitor_enter_sync' --source include/wait_condition.inc # Issue a conflicting update on node #2 @@ -41,7 +41,7 @@ UPDATE t1 SET f2 = 'c' WHERE f1 = 2; # Unblock the commit --connection node_1a SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_enter_sync'; +SET GLOBAL wsrep_provider_options = 'signal=commit_monitor_enter_sync'; # Commit succeeds --connection node_1 diff --git a/mysql-test/suite/galera_3nodes/r/galera_certification_ccc.result b/mysql-test/suite/galera_3nodes/r/galera_certification_ccc.result index 96a2bec0d7f..fd617a0c7ec 100644 --- a/mysql-test/suite/galera_3nodes/r/galera_certification_ccc.result +++ b/mysql-test/suite/galera_3nodes/r/galera_certification_ccc.result @@ -15,3 +15,6 @@ SELECT COUNT(*) = 2 FROM t1; COUNT(*) = 2 1 DROP TABLE t1; +CALL mtr.add_suppression("SYNC message from member 1 in non-primary configuration"); +CALL mtr.add_suppression("SYNC message from member 1 in non-primary configuration"); +CALL mtr.add_suppression("SYNC message from member 1 in non-primary configuration"); diff --git a/mysql-test/suite/galera_3nodes/r/galera_garbd.result b/mysql-test/suite/galera_3nodes/r/galera_garbd.result index 616c9d33303..180aade029c 100644 --- a/mysql-test/suite/galera_3nodes/r/galera_garbd.result +++ b/mysql-test/suite/galera_3nodes/r/galera_garbd.result @@ -12,3 +12,6 @@ COUNT(*) = 2 1 DROP TABLE t1; Restarting node #3 to satisfy MTR's end-of-test checks +CALL mtr.add_suppression("WSREP: Protocol violation\. JOIN message sender 1\.0 \(.*\) is not in state transfer \(SYNCED\)"); +CALL mtr.add_suppression("WSREP: Protocol violation\. JOIN message sender 1\.0 \(.*\) is not in state transfer \(SYNCED\)"); +CALL mtr.add_suppression("WSREP: Protocol violation\. JOIN message sender 1\.0 \(.*\) is not in state transfer \(SYNCED\)"); diff --git a/mysql-test/suite/galera_3nodes/r/galera_pc_weight.result b/mysql-test/suite/galera_3nodes/r/galera_pc_weight.result index ca051436491..85f923ad55e 100644 --- a/mysql-test/suite/galera_3nodes/r/galera_pc_weight.result +++ b/mysql-test/suite/galera_3nodes/r/galera_pc_weight.result @@ -39,9 +39,6 @@ SHOW STATUS LIKE 'wsrep_local_state_comment'; Variable_name Value wsrep_local_state_comment Initialized Resuming node ... -SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; -VARIABLE_VALUE = 1 -1 SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; VARIABLE_VALUE = 'Primary' 1 @@ -57,6 +54,7 @@ VARIABLE_VALUE = 4 SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; VARIABLE_VALUE = 'Synced' 1 +SET GLOBAL wsrep_provider_options = 'pc.weight=1'; SET SESSION wsrep_sync_wait=0; SET SESSION wsrep_sync_wait=0; SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; @@ -113,6 +111,9 @@ VARIABLE_VALUE = 4 SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; VARIABLE_VALUE = 'Synced' 1 +SET GLOBAL wsrep_provider_options = 'pc.weight=1'; CALL mtr.add_suppression('WSREP: gcs_caused\\(\\) returned -1'); +CALL mtr.add_suppression('overriding reported weight for'); CALL mtr.add_suppression('WSREP: user message in state LEAVING'); CALL mtr.add_suppression('sending install message failed: Transport endpoint is not connected'); +CALL mtr.add_suppression('overriding reported weight for'); diff --git a/mysql-test/suite/galera_3nodes/t/galera_garbd.test b/mysql-test/suite/galera_3nodes/t/galera_garbd.test index 3f58783ad31..71ef4acda82 100644 --- a/mysql-test/suite/galera_3nodes/t/galera_garbd.test +++ b/mysql-test/suite/galera_3nodes/t/galera_garbd.test @@ -48,3 +48,15 @@ DROP TABLE t1; --echo Restarting node #3 to satisfy MTR's end-of-test checks --connection node_3 --source include/start_mysqld.inc + + +# Workaround for galera#101 + +--connection node_1 +CALL mtr.add_suppression("WSREP: Protocol violation\. JOIN message sender 1\.0 \(.*\) is not in state transfer \(SYNCED\)"); + +--connection node_2 +CALL mtr.add_suppression("WSREP: Protocol violation\. JOIN message sender 1\.0 \(.*\) is not in state transfer \(SYNCED\)"); + +--connection node_3 +CALL mtr.add_suppression("WSREP: Protocol violation\. JOIN message sender 1\.0 \(.*\) is not in state transfer \(SYNCED\)"); diff --git a/mysql-test/suite/galera_3nodes/t/galera_pc_weight.test b/mysql-test/suite/galera_3nodes/t/galera_pc_weight.test index 8956bae98ec..6585f1934a4 100644 --- a/mysql-test/suite/galera_3nodes/t/galera_pc_weight.test +++ b/mysql-test/suite/galera_3nodes/t/galera_pc_weight.test @@ -7,7 +7,7 @@ --source include/galera_cluster.inc --source include/have_innodb.inc ---let $wsrep_provider_options_node1 = `SELECT @@wsrep_provider_options` +--connection node_1 SET GLOBAL wsrep_provider_options = 'pc.weight=3'; --source include/wait_until_connected_again.inc @@ -50,13 +50,17 @@ SHOW STATUS LIKE 'wsrep_local_state_comment'; # For Node #1, we expect a primary component of size 1 -SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected'; SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state'; SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +SET GLOBAL wsrep_provider_options = 'pc.weight=1'; + # Restore the cluster by resetting wsrep_cluster_address on nodes #1 and #2 --connection node_2 @@ -103,8 +107,17 @@ SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_N SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; --connection node_1 + +SET GLOBAL wsrep_provider_options = 'pc.weight=1'; +--let $wait_condition = SELECT @@wsrep_provider_options LIKE '%pc.weight = 1%' +--source include/wait_condition.inc + CALL mtr.add_suppression('WSREP: gcs_caused\\(\\) returned -1'); +--connection node_2 +CALL mtr.add_suppression('overriding reported weight for'); + --connection node_3 CALL mtr.add_suppression('WSREP: user message in state LEAVING'); CALL mtr.add_suppression('sending install message failed: Transport endpoint is not connected'); +CALL mtr.add_suppression('overriding reported weight for'); From d0e24c67998a8b887a4ec785669d4a0ae9355058 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Wed, 1 Apr 2015 02:52:24 -0700 Subject: [PATCH 14/82] Galera MTR Tests: Attempt to remove rare sporadic failures in galera_transaction_replay.test by waiting for all transactions to get blocked before proceeding. --- mysql-test/suite/galera/t/galera_transaction_replay.test | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mysql-test/suite/galera/t/galera_transaction_replay.test b/mysql-test/suite/galera/t/galera_transaction_replay.test index e67ce43de39..632aa5cc0d5 100644 --- a/mysql-test/suite/galera/t/galera_transaction_replay.test +++ b/mysql-test/suite/galera/t/galera_transaction_replay.test @@ -38,6 +38,14 @@ SET SESSION wsrep_sync_wait = 0; --connection node_2 UPDATE t1 SET f2 = 'c' WHERE f1 = 2; +# Wait for both transactions to be blocked +--connection node_1a +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'System lock'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'init' AND INFO = 'COMMIT'; +--source include/wait_condition.inc + # Unblock the commit --connection node_1a SET GLOBAL wsrep_provider_options = 'dbug='; From dc9e32540744a0e44e6e80c36a82ea6ee1ef2657 Mon Sep 17 00:00:00 2001 From: Teemu Ollakka Date: Mon, 20 Apr 2015 13:18:21 +0300 Subject: [PATCH 15/82] refs codership/mysql-wsrep#110 - clear table map events on SAVEPOINT Clear binlog table maps before writing SAVEPOINT query event into binlog cache. This enforces recreation of table map events for the following row event. --- sql/log.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sql/log.cc b/sql/log.cc index d9f63157f4b..4868902b524 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -2282,6 +2282,11 @@ static int binlog_savepoint_set(handlerton *hton, THD *thd, void *sv) char buf[1024]; #ifdef WITH_WSREP if (wsrep_emulate_bin_log) DBUG_RETURN(0); + /* + Clear table maps before writing SAVEPOINT event. This enforces + recreation of table map events for the following row event. + */ + thd->clear_binlog_table_maps(); #endif /* WITH_WSREP */ String log_query(buf, sizeof(buf), &my_charset_bin); if (log_query.copy(STRING_WITH_LEN("SAVEPOINT "), &my_charset_bin) || From 045b31c8f45079f617ff6c8a1da09710979bc5f8 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Mon, 20 Apr 2015 05:58:24 -0700 Subject: [PATCH 16/82] Test cases for codership/mysql-wsrep/110 --- .../suite/galera/r/mysql-wsrep#110.result | 38 ++++++++++++++ .../suite/galera/t/mysql-wsrep#110.test | 51 +++++++++++++++++++ .../suite/rpl/r/mysql-wsrep#110-2.result | 28 ++++++++++ mysql-test/suite/rpl/t/mysql-wsrep#110-2.test | 44 ++++++++++++++++ 4 files changed, 161 insertions(+) create mode 100644 mysql-test/suite/galera/r/mysql-wsrep#110.result create mode 100644 mysql-test/suite/galera/t/mysql-wsrep#110.test create mode 100644 mysql-test/suite/rpl/r/mysql-wsrep#110-2.result create mode 100644 mysql-test/suite/rpl/t/mysql-wsrep#110-2.test diff --git a/mysql-test/suite/galera/r/mysql-wsrep#110.result b/mysql-test/suite/galera/r/mysql-wsrep#110.result new file mode 100644 index 00000000000..551c3666fb4 --- /dev/null +++ b/mysql-test/suite/galera/r/mysql-wsrep#110.result @@ -0,0 +1,38 @@ +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY); +CREATE TABLE t3 (f1 INTEGER PRIMARY KEY); +CREATE TRIGGER tr1 AFTER INSERT ON t1 FOR EACH ROW CALL p1(NEW.f1); +CREATE PROCEDURE p1 (IN x INT) +BEGIN +DECLARE EXIT HANDLER FOR SQLEXCEPTION +BEGIN +ROLLBACK TO event_logging; +INSERT t3 VALUES (x); +END; +SAVEPOINT event_logging; +INSERT INTO t2 VALUES (x); +END| +INSERT INTO t2 VALUES (1); +INSERT INTO t1 VALUES (1); +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +SELECT COUNT(*) = 1 FROM t2; +COUNT(*) = 1 +1 +SELECT COUNT(*) = 1 FROM t3; +COUNT(*) = 1 +1 +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +SELECT COUNT(*) = 1 FROM t2; +COUNT(*) = 1 +1 +SELECT COUNT(*) = 1 FROM t3; +COUNT(*) = 1 +1 +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; +DROP PROCEDURE p1; diff --git a/mysql-test/suite/galera/t/mysql-wsrep#110.test b/mysql-test/suite/galera/t/mysql-wsrep#110.test new file mode 100644 index 00000000000..43520f257a1 --- /dev/null +++ b/mysql-test/suite/galera/t/mysql-wsrep#110.test @@ -0,0 +1,51 @@ +# +# codership/mysql-wsrep/110 - Assertion `table_found' failed in unpack_row() with SAVEPOINT, trigger, error handler +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY); +CREATE TABLE t3 (f1 INTEGER PRIMARY KEY); + +CREATE TRIGGER tr1 AFTER INSERT ON t1 FOR EACH ROW CALL p1(NEW.f1); + + +DELIMITER |; + +CREATE PROCEDURE p1 (IN x INT) +BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK TO event_logging; + INSERT t3 VALUES (x); + END; + SAVEPOINT event_logging; + + INSERT INTO t2 VALUES (x); +END| +DELIMITER ;| + + +INSERT INTO t2 VALUES (1); +INSERT INTO t1 VALUES (1); + +SELECT COUNT(*) = 1 FROM t1; +SELECT COUNT(*) = 1 FROM t2; +SELECT COUNT(*) = 1 FROM t3; + +--connection node_2 + +SELECT COUNT(*) = 1 FROM t1; +SELECT COUNT(*) = 1 FROM t2; +SELECT COUNT(*) = 1 FROM t3; + +--connection node_1 + +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; +DROP PROCEDURE p1; diff --git a/mysql-test/suite/rpl/r/mysql-wsrep#110-2.result b/mysql-test/suite/rpl/r/mysql-wsrep#110-2.result new file mode 100644 index 00000000000..1bc802a41f7 --- /dev/null +++ b/mysql-test/suite/rpl/r/mysql-wsrep#110-2.result @@ -0,0 +1,28 @@ +include/master-slave.inc +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +[connection master] +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY); +CREATE TABLE t3 (f1 INTEGER PRIMARY KEY); +CREATE TRIGGER tr1 AFTER INSERT ON t1 FOR EACH ROW CALL p1(NEW.f1); +CREATE PROCEDURE p1 (IN x INT) +BEGIN +DECLARE EXIT HANDLER FOR SQLEXCEPTION +BEGIN +ROLLBACK TO event_logging; +INSERT t3 VALUES (x); +END; +SAVEPOINT event_logging; +INSERT INTO t2 VALUES (x); +RELEASE SAVEPOINT event_logging; +END| +INSERT INTO t2 VALUES (1); +INSERT INTO t1 VALUES (1); +DROP TABLE t3; +DROP TABLE t2; +DROP TABLE t1; +DROP PROCEDURE p1; +include/sync_slave_sql_with_master.inc +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/mysql-wsrep#110-2.test b/mysql-test/suite/rpl/t/mysql-wsrep#110-2.test new file mode 100644 index 00000000000..4a8aa1edef6 --- /dev/null +++ b/mysql-test/suite/rpl/t/mysql-wsrep#110-2.test @@ -0,0 +1,44 @@ +# +# codership/mysql-wsrep/110 - Assertion `table_found' failed in unpack_row() with SAVEPOINT, trigger, error handler +# + +--source include/have_innodb.inc +--source include/have_binlog_format_row.inc +--source include/master-slave.inc + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY); +CREATE TABLE t3 (f1 INTEGER PRIMARY KEY); + +CREATE TRIGGER tr1 AFTER INSERT ON t1 FOR EACH ROW CALL p1(NEW.f1); + +DELIMITER |; + +CREATE PROCEDURE p1 (IN x INT) +BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK TO event_logging; + INSERT t3 VALUES (x); + END; + SAVEPOINT event_logging; + + INSERT INTO t2 VALUES (x); + + RELEASE SAVEPOINT event_logging; +END| +DELIMITER ;| + +INSERT INTO t2 VALUES (1); +INSERT INTO t1 VALUES (1); + + +DROP TABLE t3; +DROP TABLE t2; +DROP TABLE t1; + +DROP PROCEDURE p1; + +--source include/sync_slave_sql_with_master.inc +--source include/rpl_end.inc + From c66609017b25bf066008a3dec9e3ecd00fc5ce8b Mon Sep 17 00:00:00 2001 From: sjaakola Date: Tue, 21 Apr 2015 16:22:53 +0300 Subject: [PATCH 17/82] Refs codership/mysql-wsrep#113 Protecting non replicated FLUSH session from brute force aborts --- sql/sql_class.cc | 1 + sql/sql_parse.cc | 17 +++++++++++++++++ sql/wsrep_hton.cc | 2 +- sql/wsrep_mysqld.cc | 7 ++++--- sql/wsrep_mysqld.h | 2 ++ 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 4ce99da7c7d..af03a3b10b3 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -861,6 +861,7 @@ extern "C" const char *wsrep_thd_exec_mode_str(THD *thd) return (!thd) ? "void" : (thd->wsrep_exec_mode == LOCAL_STATE) ? "local" : + (thd->wsrep_exec_mode == LOCAL_FLUSH) ? "flush" : (thd->wsrep_exec_mode == REPL_RECV) ? "applier" : (thd->wsrep_exec_mode == TOTAL_ORDER) ? "total order" : (thd->wsrep_exec_mode == LOCAL_COMMIT) ? "local commit" : "void"; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 42ad69d84ec..13646c3a0c6 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -4165,6 +4165,11 @@ end_with_restore_list: } case SQLCOM_UNLOCK_TABLES: +#ifdef WITH_WSREP + mysql_mutex_lock(&thd->LOCK_wsrep_thd); + if (thd->wsrep_exec_mode == LOCAL_FLUSH) thd->wsrep_exec_mode = LOCAL_STATE; + mysql_mutex_unlock(&thd->LOCK_wsrep_thd); +#endif /* WITH_WSREP */ /* It is critical for mysqldump --single-transaction --master-data that UNLOCK TABLES does not implicitely commit a connection which has only @@ -4667,6 +4672,12 @@ end_with_restore_list: FALSE, UINT_MAX, FALSE)) goto error; +#ifdef WITH_WSREP + mysql_mutex_lock(&thd->LOCK_wsrep_thd); + thd->wsrep_exec_mode = LOCAL_FLUSH; + mysql_mutex_unlock(&thd->LOCK_wsrep_thd); +#endif /* WITH_WSREP */ + if (flush_tables_with_read_lock(thd, all_tables)) goto error; @@ -4687,6 +4698,12 @@ end_with_restore_list: { WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL) } + else + { + mysql_mutex_lock(&thd->LOCK_wsrep_thd); + thd->wsrep_exec_mode = LOCAL_FLUSH; + mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + } #endif /* WITH_WSREP*/ /* diff --git a/sql/wsrep_hton.cc b/sql/wsrep_hton.cc index 03bf072edcc..9809b5d9550 100644 --- a/sql/wsrep_hton.cc +++ b/sql/wsrep_hton.cc @@ -40,7 +40,7 @@ void wsrep_cleanup_transaction(THD *thd) thd->wsrep_ws_handle.trx_id= WSREP_UNDEFINED_TRX_ID; thd->wsrep_trx_meta.gtid= WSREP_GTID_UNDEFINED; thd->wsrep_trx_meta.depends_on= WSREP_SEQNO_UNDEFINED; - thd->wsrep_exec_mode= LOCAL_STATE; + if (thd->wsrep_exec_mode != LOCAL_FLUSH) thd->wsrep_exec_mode= LOCAL_STATE; return; } diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index 548db8245c3..1e46d577875 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -1499,12 +1499,13 @@ wsrep_grant_mdl_exception(MDL_context *requestor_ctx, mysql_mutex_unlock(&granted_thd->LOCK_wsrep_thd); ret = TRUE; } - else if (granted_thd->lex->sql_command == SQLCOM_FLUSH) + else if (granted_thd->lex->sql_command == SQLCOM_FLUSH || + granted_thd->wsrep_exec_mode == LOCAL_FLUSH) { - WSREP_DEBUG("mdl granted over FLUSH BF"); + WSREP_DEBUG("BF thread waiting for FLUSH"); ticket->wsrep_report(wsrep_debug); mysql_mutex_unlock(&granted_thd->LOCK_wsrep_thd); - ret = TRUE; + ret = FALSE; } else if (request_thd->lex->sql_command == SQLCOM_DROP_TABLE) { diff --git a/sql/wsrep_mysqld.h b/sql/wsrep_mysqld.h index 414284f45fd..55323d68a48 100644 --- a/sql/wsrep_mysqld.h +++ b/sql/wsrep_mysqld.h @@ -30,6 +30,8 @@ class THD; enum wsrep_exec_mode { /* Transaction processing before replication. */ LOCAL_STATE, + /* Local flush. */ + LOCAL_FLUSH, /* Slave thread applying write sets from other nodes or replaying thread. */ REPL_RECV, /* Total-order-isolation mode */ From 6bb890c9b6655b409d0eb81725853415157b5b0c Mon Sep 17 00:00:00 2001 From: sjaakola Date: Fri, 24 Apr 2015 10:39:42 +0300 Subject: [PATCH 18/82] refs codership/mysql-wsrep#114 - skipping TOI if not using wsrep provider --- sql/sql_partition_admin.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/sql_partition_admin.cc b/sql/sql_partition_admin.cc index 1d5cebfbbfd..f520281135a 100644 --- a/sql/sql_partition_admin.cc +++ b/sql/sql_partition_admin.cc @@ -782,7 +782,7 @@ bool Sql_cmd_alter_table_truncate_partition::execute(THD *thd) /* Forward declaration */ TABLE *find_temporary_table(THD *thd, const TABLE_LIST *tl); - if ((!thd->is_current_stmt_binlog_format_row() || + if (WSREP(thd) && (!thd->is_current_stmt_binlog_format_row() || !find_temporary_table(thd, first_table)) && wsrep_to_isolation_begin( thd, first_table->db, first_table->table_name, NULL) From 417f778e53f6d3c111ef25976d7f1b2d532ca2a3 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Tue, 28 Apr 2015 00:55:50 -0700 Subject: [PATCH 19/82] Galera MTR tests: disable innodb.innodb_stats_* due to mysql-wsrep#114 --- mysql-test/suite/innodb/t/galera.skip | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/mysql-test/suite/innodb/t/galera.skip b/mysql-test/suite/innodb/t/galera.skip index a09bd47d7e7..5c7bff3bcf5 100644 --- a/mysql-test/suite/innodb/t/galera.skip +++ b/mysql-test/suite/innodb/t/galera.skip @@ -22,3 +22,28 @@ innodb_bug59733 : Test contains statements unsafe to replicate in statement-base innodb_gis : Test contains statements unsafe to replicate in statement-based replication innodb_prefix_index_restart_server : crash, lp1372288 innodb_stats_external_pages : Test contains statements unsafe to replicate in statement-based replication +innodb-2byte-collation : Unsafe statement written to the binary log +innodb-change-buffer-recovery : Test contains statements unsafe to replicate in statement-based replication +innodb_bug53756 : Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT +innodb-alter-autoinc : AUTO_INCREMENT differences +innodb_bug13635833 : Test contains statements unsafe to replicate in statement-based replication +innodb_bug13867871 : mysql-wsrep#3 - innodb_bug13867871 test fails with wsrep loaded +innodb_bug14006907 : DDL lock wait timeout +innodb_bug38231 : Deadlock on UNLOCK TABLE +innodb_bug-13628249 : mysql-wsrep#12 InnoDB: Failing assertion: !srv_read_only_mode with server restart +innodb-wl6445-1 : mysql-wsrep#12 InnoDB: Failing assertion: !srv_read_only_mode with server restart +innodb-wl6445-2 : mysql-wsrep#12 InnoDB: Failing assertion: !srv_read_only_mode with server restart +innodb_bug12400341 : Test does not account for applier threads when performing SHOW PROCESSLIST +innodb-blob : 'Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging' +innodb_corrupt_bit : 'Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.' +innodb-index-online : ALTER succeeds as it is given a higher priority +innodb-table-online : ALTER succeeds as it is given a higher priority +innodb-index-online-purge : ALTER succeeds as it is given a higher priority +innodb-wl5522-debug : Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. +innodb_stats_table_flag_auto_recalc : Performs multiple restarts in a row which causes '1047: Unknown command' errors +innodb_stats : mysql-wsrep#114 Regression: Assertion thd->wsrep_exec_mode == LOCAL_STATE failed in wsrep_to_isolation_begin +innodb_stats_auto_recalc_on_nonexistent : mysql-wsrep#114 Regression: Assertion thd->wsrep_exec_mode == LOCAL_STATE failed in wsrep_to_isolation_begin +innodb_stats_fetch : mysql-wsrep#114 Regression: Assertion thd->wsrep_exec_mode == LOCAL_STATE failed in wsrep_to_isolation_begin +innodb_stats_fetch_corrupted : mysql-wsrep#114 Regression: Assertion thd->wsrep_exec_mode == LOCAL_STATE failed in wsrep_to_isolation_begin +innodb_stats_fetch_nonexistent : mysql-wsrep#114 Regression: Assertion thd->wsrep_exec_mode == LOCAL_STATE failed in wsrep_to_isolation_begin + From 63c5bee535f0827721484c93a2ba8798437fadf5 Mon Sep 17 00:00:00 2001 From: sjaakola Date: Tue, 28 Apr 2015 20:38:25 +0300 Subject: [PATCH 20/82] Refs codership/mysql-wsrep#113 - Extended the protection of local FLUSH sessions to cover all exclusive MDL locks --- sql/mdl.cc | 17 +++++++++++++++++ sql/mdl.h | 3 ++- sql/sql_class.cc | 1 - sql/sql_parse.cc | 17 ----------------- sql/wsrep_hton.cc | 2 +- sql/wsrep_mysqld.cc | 2 +- sql/wsrep_mysqld.h | 2 -- sql/wsrep_thd.cc | 5 +++++ 8 files changed, 26 insertions(+), 23 deletions(-) diff --git a/sql/mdl.cc b/sql/mdl.cc index f6390983ad9..e18194e8663 100644 --- a/sql/mdl.cc +++ b/sql/mdl.cc @@ -3373,4 +3373,21 @@ void MDL_ticket::wsrep_report(bool debug) psi_stage->m_name); } } +bool MDL_context::wsrep_has_explicit_locks() +{ + MDL_ticket *ticket = NULL; + + Ticket_iterator it(m_tickets[MDL_EXPLICIT]); + + while ((ticket = it++)) + { + if (ticket->m_type == MDL_EXCLUSIVE) + { + return true; + } + } + + return false; +} + #endif /* WITH_WSREP */ diff --git a/sql/mdl.h b/sql/mdl.h index 421258c2ab7..0898a0f75b7 100644 --- a/sql/mdl.h +++ b/sql/mdl.h @@ -934,7 +934,8 @@ private: public: #ifdef WITH_WSREP THD *wsrep_get_thd() const { return get_thd(); } -#endif + bool wsrep_has_explicit_locks(); +#endif /* WITH_WSREP */ void find_deadlock(); ulong get_thread_id() const { return thd_get_thread_id(get_thd()); } diff --git a/sql/sql_class.cc b/sql/sql_class.cc index af03a3b10b3..4ce99da7c7d 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -861,7 +861,6 @@ extern "C" const char *wsrep_thd_exec_mode_str(THD *thd) return (!thd) ? "void" : (thd->wsrep_exec_mode == LOCAL_STATE) ? "local" : - (thd->wsrep_exec_mode == LOCAL_FLUSH) ? "flush" : (thd->wsrep_exec_mode == REPL_RECV) ? "applier" : (thd->wsrep_exec_mode == TOTAL_ORDER) ? "total order" : (thd->wsrep_exec_mode == LOCAL_COMMIT) ? "local commit" : "void"; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 13646c3a0c6..42ad69d84ec 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -4165,11 +4165,6 @@ end_with_restore_list: } case SQLCOM_UNLOCK_TABLES: -#ifdef WITH_WSREP - mysql_mutex_lock(&thd->LOCK_wsrep_thd); - if (thd->wsrep_exec_mode == LOCAL_FLUSH) thd->wsrep_exec_mode = LOCAL_STATE; - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); -#endif /* WITH_WSREP */ /* It is critical for mysqldump --single-transaction --master-data that UNLOCK TABLES does not implicitely commit a connection which has only @@ -4672,12 +4667,6 @@ end_with_restore_list: FALSE, UINT_MAX, FALSE)) goto error; -#ifdef WITH_WSREP - mysql_mutex_lock(&thd->LOCK_wsrep_thd); - thd->wsrep_exec_mode = LOCAL_FLUSH; - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); -#endif /* WITH_WSREP */ - if (flush_tables_with_read_lock(thd, all_tables)) goto error; @@ -4698,12 +4687,6 @@ end_with_restore_list: { WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL) } - else - { - mysql_mutex_lock(&thd->LOCK_wsrep_thd); - thd->wsrep_exec_mode = LOCAL_FLUSH; - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); - } #endif /* WITH_WSREP*/ /* diff --git a/sql/wsrep_hton.cc b/sql/wsrep_hton.cc index 9809b5d9550..03bf072edcc 100644 --- a/sql/wsrep_hton.cc +++ b/sql/wsrep_hton.cc @@ -40,7 +40,7 @@ void wsrep_cleanup_transaction(THD *thd) thd->wsrep_ws_handle.trx_id= WSREP_UNDEFINED_TRX_ID; thd->wsrep_trx_meta.gtid= WSREP_GTID_UNDEFINED; thd->wsrep_trx_meta.depends_on= WSREP_SEQNO_UNDEFINED; - if (thd->wsrep_exec_mode != LOCAL_FLUSH) thd->wsrep_exec_mode= LOCAL_STATE; + thd->wsrep_exec_mode= LOCAL_STATE; return; } diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index 1e46d577875..20ba2d7a51a 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -1500,7 +1500,7 @@ wsrep_grant_mdl_exception(MDL_context *requestor_ctx, ret = TRUE; } else if (granted_thd->lex->sql_command == SQLCOM_FLUSH || - granted_thd->wsrep_exec_mode == LOCAL_FLUSH) + granted_thd->mdl_context.wsrep_has_explicit_locks()) { WSREP_DEBUG("BF thread waiting for FLUSH"); ticket->wsrep_report(wsrep_debug); diff --git a/sql/wsrep_mysqld.h b/sql/wsrep_mysqld.h index 55323d68a48..414284f45fd 100644 --- a/sql/wsrep_mysqld.h +++ b/sql/wsrep_mysqld.h @@ -30,8 +30,6 @@ class THD; enum wsrep_exec_mode { /* Transaction processing before replication. */ LOCAL_STATE, - /* Local flush. */ - LOCAL_FLUSH, /* Slave thread applying write sets from other nodes or replaying thread. */ REPL_RECV, /* Total-order-isolation mode */ diff --git a/sql/wsrep_thd.cc b/sql/wsrep_thd.cc index 2b251ef5d58..d898c982b1d 100644 --- a/sql/wsrep_thd.cc +++ b/sql/wsrep_thd.cc @@ -611,3 +611,8 @@ int wsrep_thd_in_locking_session(void *thd_ptr) return 0; } +bool wsrep_thd_has_explicit_locks(THD *thd) +{ + assert(thd); + return (thd->mdl_context.wsrep_has_explicit_locks()); +} From b5ef2bbc5ea3f21432eff2e98149b9a6612238b3 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Tue, 28 Apr 2015 23:34:47 -0700 Subject: [PATCH 21/82] Re-enable tests previously disabled due to mysql-wsrep#114 --- mysql-test/suite/innodb/t/galera.skip | 5 ----- 1 file changed, 5 deletions(-) diff --git a/mysql-test/suite/innodb/t/galera.skip b/mysql-test/suite/innodb/t/galera.skip index 5c7bff3bcf5..5b6aeb13c32 100644 --- a/mysql-test/suite/innodb/t/galera.skip +++ b/mysql-test/suite/innodb/t/galera.skip @@ -41,9 +41,4 @@ innodb-table-online : ALTER succeeds as it is given a higher priority innodb-index-online-purge : ALTER succeeds as it is given a higher priority innodb-wl5522-debug : Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. innodb_stats_table_flag_auto_recalc : Performs multiple restarts in a row which causes '1047: Unknown command' errors -innodb_stats : mysql-wsrep#114 Regression: Assertion thd->wsrep_exec_mode == LOCAL_STATE failed in wsrep_to_isolation_begin -innodb_stats_auto_recalc_on_nonexistent : mysql-wsrep#114 Regression: Assertion thd->wsrep_exec_mode == LOCAL_STATE failed in wsrep_to_isolation_begin -innodb_stats_fetch : mysql-wsrep#114 Regression: Assertion thd->wsrep_exec_mode == LOCAL_STATE failed in wsrep_to_isolation_begin -innodb_stats_fetch_corrupted : mysql-wsrep#114 Regression: Assertion thd->wsrep_exec_mode == LOCAL_STATE failed in wsrep_to_isolation_begin -innodb_stats_fetch_nonexistent : mysql-wsrep#114 Regression: Assertion thd->wsrep_exec_mode == LOCAL_STATE failed in wsrep_to_isolation_begin From bace2a97527cf817257ea3ee4e801b640ba0bf9c Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Tue, 5 May 2015 01:21:55 -0700 Subject: [PATCH 22/82] Galera MTR Tests: add a test for socket.ssl_compression --- .../suite/galera/t/galera_ssl_compression.cnf | 7 ++++ .../galera/t/galera_ssl_compression.test | 34 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 mysql-test/suite/galera/t/galera_ssl_compression.cnf create mode 100644 mysql-test/suite/galera/t/galera_ssl_compression.test diff --git a/mysql-test/suite/galera/t/galera_ssl_compression.cnf b/mysql-test/suite/galera/t/galera_ssl_compression.cnf new file mode 100644 index 00000000000..d6fd2c4d510 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ssl_compression.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;socket.ssl=yes;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem;socket.ssl_compression=YES' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;socket.ssl=yes;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem;socket.ssl_compression=YES' diff --git a/mysql-test/suite/galera/t/galera_ssl_compression.test b/mysql-test/suite/galera/t/galera_ssl_compression.test new file mode 100644 index 00000000000..cdecf4807d4 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ssl_compression.test @@ -0,0 +1,34 @@ +# +# Test SSL compression. The accompanying galera_ssl_compression.cnf has a customized wsrep_provider_options setting that enables SSL and compression. +# +# Unfortunately there is no wire-level traffic bytes counter that would allow us to determine that compression kicked in, so we can only +# perform a most basic replication check. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +--connection node_2 +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +--connection node_1 + +# Check that the socket.ssl_compression provider option is not dynamic +--error ER_WRONG_ARGUMENTS +SET GLOBAL wsrep_provider_options = "socket.ssl_compression=No"; + +CREATE TABLE t1 (f1 VARCHAR(333) PRIMARY KEY, f2 BLOB) Engine=InnoDB; +INSERT INTO t1 VALUES (REPEAT('a', 333), REPEAT('b', 65535)); + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1 WHERE f1 = REPEAT('a', 333) AND f2 = REPEAT('b', 65535); + +--connection node_1 +DROP TABLE t1; + +CALL mtr.add_suppression("Unknown parameter 'socket\.ssl_compression'"); +CALL mtr.add_suppression("Set options returned 7"); From ef7b08978b9300d456217ae55b623ff9c5b30744 Mon Sep 17 00:00:00 2001 From: Alexey Yurchenko Date: Wed, 6 May 2015 10:35:02 +0300 Subject: [PATCH 23/82] Fixes codership/mysql-wsrep#122 - causal/casual typos fixed in wsrep code --- mysql-test/suite/galera/t/galera_ftwrl.test | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mysql-test/suite/galera/t/galera_ftwrl.test b/mysql-test/suite/galera/t/galera_ftwrl.test index db9bd132566..de8310e52d2 100644 --- a/mysql-test/suite/galera/t/galera_ftwrl.test +++ b/mysql-test/suite/galera/t/galera_ftwrl.test @@ -2,9 +2,10 @@ --source include/have_innodb.inc # -# At this time, issing a FLUSH TABLES WITH READ LOCK causes SELECT and SHOW to hang if -# casuality can not be ensured because another node issued a statement in the meantime -# which could not be applied because FTWRL blocks the applier as well +# At this time, issing a FLUSH TABLES WITH READ LOCK causes SELECT and SHOW to +# hang if causality can not be ensured because another node issued a statement +# in the meantime which could not be applied because FTWRL blocks the applier +# as well # # See LP bug 1271177 # From f9805e4c984d251fec76f39bcd6a675e6cf5e6df Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Fri, 8 May 2015 03:21:50 -0700 Subject: [PATCH 24/82] Galera MTR Tests: tests for WAN restart, xtrabackup options and others. --- .../r/galera_autoinc_sst_xtrabackup.result | 36 +++++ .../suite/galera/r/galera_drop_multi.result | 20 +++ .../suite/galera/r/galera_kill_applier.result | 4 + .../galera/r/galera_ssl_compression.result | 22 +++ .../r/galera_sst_xtrabackup-v2-options.result | 3 + .../galera/r/galera_wan_restart_ist.result | 53 +++++++ .../galera/r/galera_wan_restart_sst.result | 53 +++++++ .../t/galera_autoinc_sst_xtrabackup.cnf | 13 ++ .../t/galera_autoinc_sst_xtrabackup.test | 95 +++++++++++ .../suite/galera/t/galera_drop_multi.test | 41 +++++ .../suite/galera/t/galera_kill_applier.test | 26 +++ .../t/galera_sst_xtrabackup-v2-options.cnf | 24 +++ .../t/galera_sst_xtrabackup-v2-options.test | 13 ++ .../suite/galera/t/galera_wan_restart_ist.cnf | 14 ++ .../galera/t/galera_wan_restart_ist.test | 148 ++++++++++++++++++ .../suite/galera/t/galera_wan_restart_sst.cnf | 14 ++ .../galera/t/galera_wan_restart_sst.test | 145 +++++++++++++++++ 17 files changed, 724 insertions(+) create mode 100644 mysql-test/suite/galera/r/galera_autoinc_sst_xtrabackup.result create mode 100644 mysql-test/suite/galera/r/galera_drop_multi.result create mode 100644 mysql-test/suite/galera/r/galera_kill_applier.result create mode 100644 mysql-test/suite/galera/r/galera_ssl_compression.result create mode 100644 mysql-test/suite/galera/r/galera_sst_xtrabackup-v2-options.result create mode 100644 mysql-test/suite/galera/r/galera_wan_restart_ist.result create mode 100644 mysql-test/suite/galera/r/galera_wan_restart_sst.result create mode 100644 mysql-test/suite/galera/t/galera_autoinc_sst_xtrabackup.cnf create mode 100644 mysql-test/suite/galera/t/galera_autoinc_sst_xtrabackup.test create mode 100644 mysql-test/suite/galera/t/galera_drop_multi.test create mode 100644 mysql-test/suite/galera/t/galera_kill_applier.test create mode 100644 mysql-test/suite/galera/t/galera_sst_xtrabackup-v2-options.cnf create mode 100644 mysql-test/suite/galera/t/galera_sst_xtrabackup-v2-options.test create mode 100644 mysql-test/suite/galera/t/galera_wan_restart_ist.cnf create mode 100644 mysql-test/suite/galera/t/galera_wan_restart_ist.test create mode 100644 mysql-test/suite/galera/t/galera_wan_restart_sst.cnf create mode 100644 mysql-test/suite/galera/t/galera_wan_restart_sst.test diff --git a/mysql-test/suite/galera/r/galera_autoinc_sst_xtrabackup.result b/mysql-test/suite/galera/r/galera_autoinc_sst_xtrabackup.result new file mode 100644 index 00000000000..228d7c6f041 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_autoinc_sst_xtrabackup.result @@ -0,0 +1,36 @@ +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; +CREATE PROCEDURE p1 () +BEGIN +DECLARE x INT DEFAULT 1; +DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; +WHILE 1 DO +INSERT INTO t1 VALUES (DEFAULT); +COMMIT; +END WHILE; +END| +CALL p1();; +CALL p1();; +Killing server ... +INSERT INTO t1 VALUES (DEFAULT); +INSERT INTO t1 VALUES (DEFAULT); +Got one of the listed errors +Got one of the listed errors +count_equal +1 +CALL mtr.add_suppression("WSREP: Action message in non-primary configuration from member 0"); +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE +2 +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 2 +1 +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE +2 +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 2 +1 +DROP PROCEDURE p1; +DROP TABLE t1; +CALL mtr.add_suppression("gcs_caused\\(\\) returned -1 \\(Operation not permitted\\)"); +CALL mtr.add_suppression("WSREP: Action message in non-primary configuration from member 0"); diff --git a/mysql-test/suite/galera/r/galera_drop_multi.result b/mysql-test/suite/galera/r/galera_drop_multi.result new file mode 100644 index 00000000000..d82ae3bec1a --- /dev/null +++ b/mysql-test/suite/galera/r/galera_drop_multi.result @@ -0,0 +1,20 @@ +CREATE TABLE t1 (f1 INTEGER) ENGINE=MyISAM; +CREATE TEMPORARY TABLE t2 (f1 INTEGER) ENGINE=MyISAM; +CREATE TABLE t3 (f1 INTEGER) ENGINE=InnoDB; +CREATE TEMPORARY TABLE t4 (f1 INTEGER) ENGINE=InnoDB; +CREATE TABLE t5 (f1 INTEGER); +SET AUTOCOMMIT=OFF; +START TRANSACTION; +DROP TABLE t1, t2, t3, t4; +INSERT INTO t5 VALUES (1); +COMMIT; +SHOW CREATE TABLE t1; +ERROR 42S02: Table 'test.t1' doesn't exist +SHOW CREATE TABLE t2; +ERROR 42S02: Table 'test.t2' doesn't exist +SHOW CREATE TABLE t3; +ERROR 42S02: Table 'test.t3' doesn't exist +SHOW CREATE TABLE t4; +ERROR 42S02: Table 'test.t4' doesn't exist +CALL mtr.add_suppression("Slave SQL: Error 'Unknown table 'test.t2,test.t4'' on query\. Default database: 'test'\. Query: 'DROP TABLE t1, t2, t3, t4', Error_code: 1051"); +DROP TABLE t5; diff --git a/mysql-test/suite/galera/r/galera_kill_applier.result b/mysql-test/suite/galera/r/galera_kill_applier.result new file mode 100644 index 00000000000..fe4911639ed --- /dev/null +++ b/mysql-test/suite/galera/r/galera_kill_applier.result @@ -0,0 +1,4 @@ +Got one of the listed errors +Got one of the listed errors +Got one of the listed errors +Got one of the listed errors diff --git a/mysql-test/suite/galera/r/galera_ssl_compression.result b/mysql-test/suite/galera/r/galera_ssl_compression.result new file mode 100644 index 00000000000..f25b614d139 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_ssl_compression.result @@ -0,0 +1,22 @@ +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +VARIABLE_VALUE = 'Synced' +1 +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 2 +1 +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +VARIABLE_VALUE = 'Synced' +1 +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 2 +1 +SET GLOBAL wsrep_provider_options = "socket.ssl_compression=No"; +ERROR HY000: Incorrect arguments to SET +CREATE TABLE t1 (f1 VARCHAR(333) PRIMARY KEY, f2 BLOB) Engine=InnoDB; +INSERT INTO t1 VALUES (REPEAT('a', 333), REPEAT('b', 65535)); +SELECT COUNT(*) = 1 FROM t1 WHERE f1 = REPEAT('a', 333) AND f2 = REPEAT('b', 65535); +COUNT(*) = 1 +1 +DROP TABLE t1; +CALL mtr.add_suppression("Unknown parameter 'socket\.ssl_compression'"); +CALL mtr.add_suppression("Set options returned 7"); diff --git a/mysql-test/suite/galera/r/galera_sst_xtrabackup-v2-options.result b/mysql-test/suite/galera/r/galera_sst_xtrabackup-v2-options.result new file mode 100644 index 00000000000..990e0a29506 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_sst_xtrabackup-v2-options.result @@ -0,0 +1,3 @@ +SELECT 1; +1 +1 diff --git a/mysql-test/suite/galera/r/galera_wan_restart_ist.result b/mysql-test/suite/galera/r/galera_wan_restart_ist.result new file mode 100644 index 00000000000..e58bff34e54 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_wan_restart_ist.result @@ -0,0 +1,53 @@ +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 4 +1 +CREATE TABLE t1 (f1 INTEGER); +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (3); +INSERT INTO t1 VALUES (4); +INSERT INTO t1 VALUES (13); +Shutting down server ... +INSERT INTO t1 VALUES (11); +INSERT INTO t1 VALUES (12); +INSERT INTO t1 VALUES (14); +INSERT INTO t1 VALUES (131); +INSERT INTO t1 VALUES (22); +Shutting down server ... +INSERT INTO t1 VALUES (21); +INSERT INTO t1 VALUES (23); +INSERT INTO t1 VALUES (24); +INSERT INTO t1 VALUES (221); +INSERT INTO t1 VALUES (34); +Shutting down server ... +INSERT INTO t1 VALUES (31); +INSERT INTO t1 VALUES (32); +INSERT INTO t1 VALUES (33); +INSERT INTO t1 VALUES (341); +SELECT COUNT(*) = 19 FROM t1; +COUNT(*) = 19 +1 +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 4 +1 +SELECT COUNT(*) = 19 FROM t1; +COUNT(*) = 19 +1 +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 4 +1 +SELECT COUNT(*) = 19 FROM t1; +COUNT(*) = 19 +1 +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 4 +1 +SELECT COUNT(*) = 19 FROM t1; +COUNT(*) = 19 +1 +DROP TABLE t1; +CALL mtr.add_suppression("There are no nodes in the same segment that will ever be able to become donors, yet there is a suitable donor outside"); +CALL mtr.add_suppression("Action message in non-primary configuration from member 0"); +CALL mtr.add_suppression("There are no nodes in the same segment that will ever be able to become donors, yet there is a suitable donor outside"); +CALL mtr.add_suppression("Action message in non-primary configuration from member 0"); +CALL mtr.add_suppression("Action message in non-primary configuration from member 0"); diff --git a/mysql-test/suite/galera/r/galera_wan_restart_sst.result b/mysql-test/suite/galera/r/galera_wan_restart_sst.result new file mode 100644 index 00000000000..ead4f115b91 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_wan_restart_sst.result @@ -0,0 +1,53 @@ +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 4 +1 +CREATE TABLE t1 (f1 INTEGER); +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (3); +INSERT INTO t1 VALUES (4); +INSERT INTO t1 VALUES (13); +Killing server ... +INSERT INTO t1 VALUES (11); +INSERT INTO t1 VALUES (12); +INSERT INTO t1 VALUES (14); +INSERT INTO t1 VALUES (131); +INSERT INTO t1 VALUES (22); +Killing server ... +INSERT INTO t1 VALUES (21); +INSERT INTO t1 VALUES (23); +INSERT INTO t1 VALUES (24); +INSERT INTO t1 VALUES (221); +INSERT INTO t1 VALUES (34); +Killing server ... +INSERT INTO t1 VALUES (31); +INSERT INTO t1 VALUES (32); +INSERT INTO t1 VALUES (33); +INSERT INTO t1 VALUES (341); +SELECT COUNT(*) = 19 FROM t1; +COUNT(*) = 19 +1 +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 4 +1 +SELECT COUNT(*) = 19 FROM t1; +COUNT(*) = 19 +1 +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 4 +1 +SELECT COUNT(*) = 19 FROM t1; +COUNT(*) = 19 +1 +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 4 +1 +SELECT COUNT(*) = 19 FROM t1; +COUNT(*) = 19 +1 +DROP TABLE t1; +CALL mtr.add_suppression("There are no nodes in the same segment that will ever be able to become donors, yet there is a suitable donor outside"); +CALL mtr.add_suppression("Action message in non-primary configuration from member 0"); +CALL mtr.add_suppression("There are no nodes in the same segment that will ever be able to become donors, yet there is a suitable donor outside"); +CALL mtr.add_suppression("Action message in non-primary configuration from member 0"); +CALL mtr.add_suppression("Action message in non-primary configuration from member 0"); diff --git a/mysql-test/suite/galera/t/galera_autoinc_sst_xtrabackup.cnf b/mysql-test/suite/galera/t/galera_autoinc_sst_xtrabackup.cnf new file mode 100644 index 00000000000..7d684cef67d --- /dev/null +++ b/mysql-test/suite/galera/t/galera_autoinc_sst_xtrabackup.cnf @@ -0,0 +1,13 @@ +!include ../galera_2nodes.cnf + +[mysqld] +#wsrep_sst_method=xtrabackup-v2 +#wsrep_sst_auth="root:" +#wsrep_debug=ON + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true' + diff --git a/mysql-test/suite/galera/t/galera_autoinc_sst_xtrabackup.test b/mysql-test/suite/galera/t/galera_autoinc_sst_xtrabackup.test new file mode 100644 index 00000000000..251450f7099 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_autoinc_sst_xtrabackup.test @@ -0,0 +1,95 @@ +# +# Test that autoincrement works correctly while the cluster membership +# is changing and IST takes place. +# + +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +--let $connection_id = `SELECT CONNECTION_ID()` + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; + +# Issue an endless stream of autoincrement inserts + +DELIMITER |; +CREATE PROCEDURE p1 () +BEGIN + DECLARE x INT DEFAULT 1; + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; + + WHILE 1 DO + INSERT INTO t1 VALUES (DEFAULT); + COMMIT; + END WHILE; +END| +DELIMITER ;| + +--send CALL p1(); +--sleep 2 + +--connection node_2 +--send CALL p1(); +--sleep 2 + +# Kill and restart node #2 + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +--source include/kill_galera.inc + +--sleep 10 +--source include/start_mysqld.inc +--sleep 25 +--source include/wait_until_connected_again.inc + +INSERT INTO t1 VALUES (DEFAULT); + +# Terminate the stored procedure + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +--disable_query_log +--eval KILL CONNECTION $connection_id +--enable_query_log + +INSERT INTO t1 VALUES (DEFAULT); + +--connection node_1 +# CR_SERVER_LOST +--error 2013,2006 +--reap + +--connection node_2 +# CR_SERVER_LOST +--error 2013,2006 +--reap + +--sleep 10 + +# Confirm that the count is correct and that the cluster is intact + +--connection node_1a +--let $count = `SELECT COUNT(*) FROM t1` + +--connection node_2a +--disable_query_log +--eval SELECT COUNT(*) = $count AS count_equal FROM t1 +--enable_query_log + +CALL mtr.add_suppression("WSREP: Action message in non-primary configuration from member 0"); + +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +--connection node_1a +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +DROP PROCEDURE p1; +DROP TABLE t1; + +CALL mtr.add_suppression("gcs_caused\\(\\) returned -1 \\(Operation not permitted\\)"); +CALL mtr.add_suppression("WSREP: Action message in non-primary configuration from member 0"); diff --git a/mysql-test/suite/galera/t/galera_drop_multi.test b/mysql-test/suite/galera/t/galera_drop_multi.test new file mode 100644 index 00000000000..44b1b619b2b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_drop_multi.test @@ -0,0 +1,41 @@ +# +# Test that multi-table DROP TABLE statements are properly replicated +# See http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-20.html +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INTEGER) ENGINE=MyISAM; +CREATE TEMPORARY TABLE t2 (f1 INTEGER) ENGINE=MyISAM; +CREATE TABLE t3 (f1 INTEGER) ENGINE=InnoDB; +CREATE TEMPORARY TABLE t4 (f1 INTEGER) ENGINE=InnoDB; + +CREATE TABLE t5 (f1 INTEGER); + +SET AUTOCOMMIT=OFF; +START TRANSACTION; + +DROP TABLE t1, t2, t3, t4; + +INSERT INTO t5 VALUES (1); + +COMMIT; + +--connection node_2 +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t1; + +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t2; + +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t3; + +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t4; + +CALL mtr.add_suppression("Slave SQL: Error 'Unknown table 'test.t2,test.t4'' on query\. Default database: 'test'\. Query: 'DROP TABLE t1, t2, t3, t4', Error_code: 1051"); + +--connection node_1 +DROP TABLE t5; diff --git a/mysql-test/suite/galera/t/galera_kill_applier.test b/mysql-test/suite/galera/t/galera_kill_applier.test new file mode 100644 index 00000000000..e14a8b9af23 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_kill_applier.test @@ -0,0 +1,26 @@ +# +# This test checks that applier threads are immune to KILL QUERY and KILL STATEMENT +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 + +--let $applier_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE != 'wsrep aborter idle' OR STATE IS NULL LIMIT 1` + +--disable_query_log +--error ER_KILL_DENIED_ERROR,ER_KILL_DENIED_ERROR +--eval KILL $applier_thread + +--error ER_KILL_DENIED_ERROR,ER_KILL_DENIED_ERROR +--eval KILL QUERY $applier_thread + +--let $aborter_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'wsrep aborter idle' LIMIT 1` + +--error ER_KILL_DENIED_ERROR,ER_KILL_DENIED_ERROR +--eval KILL $aborter_thread + +--error ER_KILL_DENIED_ERROR,ER_KILL_DENIED_ERROR +--eval KILL QUERY $aborter_thread +--enable_query_log diff --git a/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2-options.cnf b/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2-options.cnf new file mode 100644 index 00000000000..31bd1af07c2 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2-options.cnf @@ -0,0 +1,24 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=xtrabackup-v2 +wsrep_sst_auth="root:" +wsrep_debug=ON + +[xtrabackup] +backup-locks +close-files +compact +# compression requires qpress from the Percona repositories +# compress +# compress-threads=2 +encryption=AES256 +encrypt-key=4FA92C5873672E20FB163A0BCB2BB4A4 +galera-info +history=backup +parallel=2 + +[SST] +encrypt=1 +encrypt-algo=AES256 +encrypt-key=4FA92C5873672E20FB163A0BCB2BB4A4 diff --git a/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2-options.test b/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2-options.test new file mode 100644 index 00000000000..4573f176482 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2-options.test @@ -0,0 +1,13 @@ +# +# This test checks that various options can be passed to xtrabackup via the my.cnf file +# Initial SST happens via xtrabackup, so there is not much to do in the body of the test +# + +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +SELECT 1; + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc diff --git a/mysql-test/suite/galera/t/galera_wan_restart_ist.cnf b/mysql-test/suite/galera/t/galera_wan_restart_ist.cnf new file mode 100644 index 00000000000..3f7d2a2448f --- /dev/null +++ b/mysql-test/suite/galera/t/galera_wan_restart_ist.cnf @@ -0,0 +1,14 @@ +!include ../galera_4nodes.cnf + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gmcast.segment=1' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gmcast.segment=1' + +[mysqld.3] +wsrep_provider_options='base_port=@mysqld.3.#galera_port;gmcast.segment=2' + +[mysqld.4] +wsrep_provider_options='base_port=@mysqld.4.#galera_port;gmcast.segment=2' + diff --git a/mysql-test/suite/galera/t/galera_wan_restart_ist.test b/mysql-test/suite/galera/t/galera_wan_restart_ist.test new file mode 100644 index 00000000000..42f63df3acc --- /dev/null +++ b/mysql-test/suite/galera/t/galera_wan_restart_ist.test @@ -0,0 +1,148 @@ +# +# Test that even after multiple restarts in a WAN context with two segments, the cluster continues to operate correctly. +# +# We can not easily restart the first node, so instead we restart all the other nodes. MTR does not allow multiple nodes +# to be down at the same time, so restarts are sequential. +# +# We can not test any of the actual WAN optimizations from inside MTR and no +# status variables are provided. So we only check that simple replication works. +# + +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER); +INSERT INTO t1 VALUES (1); + +--connection node_2 +INSERT INTO t1 VALUES (2); + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connection node_3 +INSERT INTO t1 VALUES (3); + +--connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4 +--connection node_4 +INSERT INTO t1 VALUES (4); + +# +# Restart node #3 +# + +--connection node_3 +INSERT INTO t1 VALUES (13); + +--echo Shutting down server ... +--source include/shutdown_mysqld.inc +--sleep 5 + +--connection node_1 +INSERT INTO t1 VALUES (11); + +--connection node_2 +INSERT INTO t1 VALUES (12); + +--connection node_4 +INSERT INTO t1 VALUES (14); + +--connection node_3 +--source include/start_mysqld.inc +--sleep 5 +--source include/wait_until_connected_again.inc + +INSERT INTO t1 VALUES (131); + +# +# Restart node #2 +# + +--connection node_2 +INSERT INTO t1 VALUES (22); + +--echo Shutting down server ... +--source include/shutdown_mysqld.inc +--sleep 5 + +--connection node_1 +INSERT INTO t1 VALUES (21); + +--connection node_3 +INSERT INTO t1 VALUES (23); + +--connection node_4 +INSERT INTO t1 VALUES (24); + +--connection node_2 +--source include/start_mysqld.inc +--sleep 5 +--source include/wait_until_connected_again.inc + +INSERT INTO t1 VALUES (221); + +# +# Restart node #4 +# + +--connection node_4 +INSERT INTO t1 VALUES (34); + +--echo Shutting down server ... +--source include/shutdown_mysqld.inc +--sleep 5 + +--connection node_1 +INSERT INTO t1 VALUES (31); + +--connection node_2 +INSERT INTO t1 VALUES (32); + +--connection node_3 +INSERT INTO t1 VALUES (33); + +--connection node_4 +--source include/start_mysqld.inc +--sleep 5 +--source include/wait_until_connected_again.inc + +INSERT INTO t1 VALUES (341); + + +# +# Check all nodes +# + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +SELECT COUNT(*) = 19 FROM t1; + +--connection node_2 +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +SELECT COUNT(*) = 19 FROM t1; + +--connection node_3 +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +SELECT COUNT(*) = 19 FROM t1; + +--connection node_4 +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +SELECT COUNT(*) = 19 FROM t1; + +--connection node_1 +DROP TABLE t1; +CALL mtr.add_suppression("There are no nodes in the same segment that will ever be able to become donors, yet there is a suitable donor outside"); + +--connection node_2 +CALL mtr.add_suppression("Action message in non-primary configuration from member 0"); + +--connection node_3 +CALL mtr.add_suppression("There are no nodes in the same segment that will ever be able to become donors, yet there is a suitable donor outside"); +CALL mtr.add_suppression("Action message in non-primary configuration from member 0"); + +--connection node_4 +CALL mtr.add_suppression("Action message in non-primary configuration from member 0"); diff --git a/mysql-test/suite/galera/t/galera_wan_restart_sst.cnf b/mysql-test/suite/galera/t/galera_wan_restart_sst.cnf new file mode 100644 index 00000000000..3f7d2a2448f --- /dev/null +++ b/mysql-test/suite/galera/t/galera_wan_restart_sst.cnf @@ -0,0 +1,14 @@ +!include ../galera_4nodes.cnf + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gmcast.segment=1' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gmcast.segment=1' + +[mysqld.3] +wsrep_provider_options='base_port=@mysqld.3.#galera_port;gmcast.segment=2' + +[mysqld.4] +wsrep_provider_options='base_port=@mysqld.4.#galera_port;gmcast.segment=2' + diff --git a/mysql-test/suite/galera/t/galera_wan_restart_sst.test b/mysql-test/suite/galera/t/galera_wan_restart_sst.test new file mode 100644 index 00000000000..6fd1d19ab9a --- /dev/null +++ b/mysql-test/suite/galera/t/galera_wan_restart_sst.test @@ -0,0 +1,145 @@ +# +# Test that even after multiple restarts in a WAN context with two segments, the cluster continues to operate correctly. +# +# We can not easily restart the first node, so instead we restart all the other nodes. MTR does not allow multiple nodes +# to be down at the same time, so restarts are sequential. +# +# We can not test any of the actual WAN optimizations from inside MTR and no +# status variables are provided. So we only check that simple replication works. +# + +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER); +INSERT INTO t1 VALUES (1); + +--connection node_2 +INSERT INTO t1 VALUES (2); + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connection node_3 +INSERT INTO t1 VALUES (3); + +--connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4 +--connection node_4 +INSERT INTO t1 VALUES (4); + +# +# Restart node #3 +# + +--connection node_3 +INSERT INTO t1 VALUES (13); + +--source include/kill_galera.inc +--sleep 5 + +--connection node_1 +INSERT INTO t1 VALUES (11); + +--connection node_2 +INSERT INTO t1 VALUES (12); + +--connection node_4 +INSERT INTO t1 VALUES (14); + +--connection node_3 +--source include/start_mysqld.inc +--sleep 5 +--source include/wait_until_connected_again.inc + +INSERT INTO t1 VALUES (131); + +# +# Restart node #2 +# + +--connection node_2 +INSERT INTO t1 VALUES (22); + +--source include/kill_galera.inc +--sleep 5 + +--connection node_1 +INSERT INTO t1 VALUES (21); + +--connection node_3 +INSERT INTO t1 VALUES (23); + +--connection node_4 +INSERT INTO t1 VALUES (24); + +--connection node_2 +--source include/start_mysqld.inc +--sleep 5 +--source include/wait_until_connected_again.inc + +INSERT INTO t1 VALUES (221); + +# +# Restart node #4 +# + +--connection node_4 +INSERT INTO t1 VALUES (34); + +--source include/kill_galera.inc +--sleep 5 + +--connection node_1 +INSERT INTO t1 VALUES (31); + +--connection node_2 +INSERT INTO t1 VALUES (32); + +--connection node_3 +INSERT INTO t1 VALUES (33); + +--connection node_4 +--source include/start_mysqld.inc +--sleep 5 +--source include/wait_until_connected_again.inc + +INSERT INTO t1 VALUES (341); + + +# +# Check all nodes +# + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +SELECT COUNT(*) = 19 FROM t1; + +--connection node_2 +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +SELECT COUNT(*) = 19 FROM t1; + +--connection node_3 +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +SELECT COUNT(*) = 19 FROM t1; + +--connection node_4 +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +SELECT COUNT(*) = 19 FROM t1; + +--connection node_1 +DROP TABLE t1; +CALL mtr.add_suppression("There are no nodes in the same segment that will ever be able to become donors, yet there is a suitable donor outside"); + +--connection node_2 +CALL mtr.add_suppression("Action message in non-primary configuration from member 0"); + +--connection node_3 +CALL mtr.add_suppression("There are no nodes in the same segment that will ever be able to become donors, yet there is a suitable donor outside"); +CALL mtr.add_suppression("Action message in non-primary configuration from member 0"); + +--connection node_4 +CALL mtr.add_suppression("Action message in non-primary configuration from member 0"); From 2106fed865f6827418b16efcf6dd8368c3a092c5 Mon Sep 17 00:00:00 2001 From: sjaakola Date: Sun, 10 May 2015 21:49:36 +0300 Subject: [PATCH 25/82] Refs codership/mysql-wsrep#113 - changed BF thread's MDL wait to never timeout - all explicit locks are now honored by BF threads --- sql/mdl.cc | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/sql/mdl.cc b/sql/mdl.cc index e18194e8663..8c446e5d65f 100644 --- a/sql/mdl.cc +++ b/sql/mdl.cc @@ -1449,7 +1449,7 @@ MDL_wait::timed_wait(MDL_context_owner *owner, struct timespec *abs_timeout, wait_result= mysql_cond_wait(&m_COND_wait_status, &m_LOCK_wait_status); } else -#endif +#endif /* WITH_WSREP */ wait_result= mysql_cond_timedwait(&m_COND_wait_status, &m_LOCK_wait_status, abs_timeout); } @@ -3381,10 +3381,7 @@ bool MDL_context::wsrep_has_explicit_locks() while ((ticket = it++)) { - if (ticket->m_type == MDL_EXCLUSIVE) - { - return true; - } + return true; } return false; From 4102d5258d0c12fcbc833bf415474aaa1a12ddb2 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Mon, 11 May 2015 02:21:39 -0700 Subject: [PATCH 26/82] Refs codership/mysql-wsrep#113 - tests around FLUSH TABLE, FLUSH TABLES, LOCK TABLE --- .../r/galera_applier_ftwrl_table.result | 15 ++++++++ .../r/galera_applier_ftwrl_table_alter.result | 26 +++++++++++++ .../r/galera_bf_abort_flush_for_export.result | 13 +++++++ .../r/galera_bf_abort_lock_table.result | 6 ++- .../galera/t/galera_applier_ftwrl_table.test | 34 +++++++++++++++++ ...alera_applier_ftwrl_table_alter-master.opt | 1 + .../t/galera_applier_ftwrl_table_alter.test | 37 +++++++++++++++++++ .../t/galera_bf_abort_flush_for_export.test | 37 +++++++++++++++++++ .../galera/t/galera_bf_abort_lock_table.test | 23 +++++++----- 9 files changed, 181 insertions(+), 11 deletions(-) create mode 100644 mysql-test/suite/galera/r/galera_applier_ftwrl_table.result create mode 100644 mysql-test/suite/galera/r/galera_applier_ftwrl_table_alter.result create mode 100644 mysql-test/suite/galera/r/galera_bf_abort_flush_for_export.result create mode 100644 mysql-test/suite/galera/t/galera_applier_ftwrl_table.test create mode 100644 mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter-master.opt create mode 100644 mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter.test create mode 100644 mysql-test/suite/galera/t/galera_bf_abort_flush_for_export.test diff --git a/mysql-test/suite/galera/r/galera_applier_ftwrl_table.result b/mysql-test/suite/galera/r/galera_applier_ftwrl_table.result new file mode 100644 index 00000000000..cecbfc1f3cf --- /dev/null +++ b/mysql-test/suite/galera/r/galera_applier_ftwrl_table.result @@ -0,0 +1,15 @@ +SET SESSION wsrep_sync_wait = 0; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +FLUSH TABLE t1 WITH READ LOCK; +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +SET SESSION wsrep_sync_wait = 0; +SELECT COUNT(*) = 0 FROM t1; +COUNT(*) = 0 +1 +UNLOCK TABLES; +SET SESSION wsrep_sync_wait = 7; +SELECT COUNT(*) = 2 FROM t1; +COUNT(*) = 2 +1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/r/galera_applier_ftwrl_table_alter.result b/mysql-test/suite/galera/r/galera_applier_ftwrl_table_alter.result new file mode 100644 index 00000000000..ee967356c85 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_applier_ftwrl_table_alter.result @@ -0,0 +1,26 @@ +SET SESSION wsrep_sync_wait = 0; +SET SESSION lock_wait_timeout = 60; +SET SESSION innodb_lock_wait_timeout=60; +SET SESSION wait_timeout=60; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +FLUSH TABLE t1 WITH READ LOCK; +ALTER TABLE t1 ADD COLUMN f2 INTEGER; +SELECT 1 FROM DUAL; +1 +1 +SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'Waiting for table metadata lock'; +COUNT(*) = 1 +1 +UNLOCK TABLES; +SET SESSION wsrep_sync_wait = 7; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `f1` int(11) NOT NULL, + `f2` int(11) DEFAULT NULL, + PRIMARY KEY (`f1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'Waiting for table metadata lock'; +COUNT(*) = 0 +1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/r/galera_bf_abort_flush_for_export.result b/mysql-test/suite/galera/r/galera_bf_abort_flush_for_export.result new file mode 100644 index 00000000000..d22fd694279 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_bf_abort_flush_for_export.result @@ -0,0 +1,13 @@ +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +SET AUTOCOMMIT=OFF; +FLUSH TABLES t1 FOR EXPORT; +INSERT INTO t1 VALUES (2); +SET SESSION wsrep_sync_wait = 0; +UNLOCK TABLES; +COMMIT; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +wsrep_local_aborts_increment +1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/r/galera_bf_abort_lock_table.result b/mysql-test/suite/galera/r/galera_bf_abort_lock_table.result index e657e724a8b..7510e48ee83 100644 --- a/mysql-test/suite/galera/r/galera_bf_abort_lock_table.result +++ b/mysql-test/suite/galera/r/galera_bf_abort_lock_table.result @@ -1,8 +1,12 @@ CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; SET AUTOCOMMIT=OFF; LOCK TABLE t1 WRITE; -INSERT INTO t1 VALUES (1);; INSERT INTO t1 VALUES (2); +UNLOCK TABLES; +COMMIT; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 wsrep_local_aborts_increment 1 DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_applier_ftwrl_table.test b/mysql-test/suite/galera/t/galera_applier_ftwrl_table.test new file mode 100644 index 00000000000..6747977812b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_applier_ftwrl_table.test @@ -0,0 +1,34 @@ +# +# Test that applying plays well with FLUSH TABLE table_name WITH READ LOCK. The applier +# thread should block until UNLOCK TABLEs. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +SET SESSION wsrep_sync_wait = 0; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +FLUSH TABLE t1 WITH READ LOCK; + +--connection node_2 +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +SET SESSION wsrep_sync_wait = 0; + +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'Waiting for table metadata lock' +--source include/wait_condition.inc + +SELECT COUNT(*) = 0 FROM t1; + +--connection node_1 +UNLOCK TABLES; + +SET SESSION wsrep_sync_wait = 7; +SELECT COUNT(*) = 2 FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter-master.opt b/mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter-master.opt new file mode 100644 index 00000000000..d8ecaacaa4c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter-master.opt @@ -0,0 +1 @@ +--lock_wait_timeout=5 --innodb_lock_wait_timeout=5 --wait_timeout=5 diff --git a/mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter.test b/mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter.test new file mode 100644 index 00000000000..99c45c04ba0 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter.test @@ -0,0 +1,37 @@ +# +# Test that applying a DDL plays well with FLUSH TABLE table_name WITH READ LOCK. The applier +# thread should block until UNLOCK TABLEs. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +SET SESSION wsrep_sync_wait = 0; + +# Those values are valid only for connection node_1. The global values from the -master.opt file apply to applier threads. +SET SESSION lock_wait_timeout = 60; +SET SESSION innodb_lock_wait_timeout=60; +SET SESSION wait_timeout=60; + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +FLUSH TABLE t1 WITH READ LOCK; + +--connection node_2 +ALTER TABLE t1 ADD COLUMN f2 INTEGER; + +--connection node_1 +SELECT 1 FROM DUAL; +# Sleep for longer than the global timeout ... +--sleep 6 +SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'Waiting for table metadata lock'; + +UNLOCK TABLES; + +SET SESSION wsrep_sync_wait = 7; + +SHOW CREATE TABLE t1; +SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'Waiting for table metadata lock'; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_bf_abort_flush_for_export.test b/mysql-test/suite/galera/t/galera_bf_abort_flush_for_export.test new file mode 100644 index 00000000000..84f7e21e685 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_abort_flush_for_export.test @@ -0,0 +1,37 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Test that a local FLUSH TABLES FOR BACKUP will NOT be broken by an incoming remote transaction against that table +# + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +--connection node_2 +SET AUTOCOMMIT=OFF; +--let $wsrep_local_bf_aborts_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` +FLUSH TABLES t1 FOR EXPORT; + +--connection node_1 +INSERT INTO t1 VALUES (2); + +--connection node_2 +SET SESSION wsrep_sync_wait = 0; +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'Waiting for table metadata lock' +--source include/wait_condition.inc + +UNLOCK TABLES; + +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'Waiting for table metadata lock' +--source include/wait_condition.inc + +COMMIT; +SELECT COUNT(*) = 1 FROM t1; + +--let $wsrep_local_bf_aborts_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` + +--disable_query_log +--eval SELECT $wsrep_local_bf_aborts_after - $wsrep_local_bf_aborts_before = 0 AS wsrep_local_aborts_increment; +--enable_query_log + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_bf_abort_lock_table.test b/mysql-test/suite/galera/t/galera_bf_abort_lock_table.test index 788427103a5..4582f3f972d 100644 --- a/mysql-test/suite/galera/t/galera_bf_abort_lock_table.test +++ b/mysql-test/suite/galera/t/galera_bf_abort_lock_table.test @@ -2,7 +2,7 @@ --source include/have_innodb.inc # -# Test that a local LOCK TABLE will be broken by an incoming remote transaction against that table +# Test that a local LOCK TABLE will NOT be broken by an incoming remote transaction against that table # CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; @@ -12,22 +12,25 @@ SET AUTOCOMMIT=OFF; --let $wsrep_local_bf_aborts_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` LOCK TABLE t1 WRITE; -# Issue a concurrent INSERT against the lock table that will block ---connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 ---send INSERT INTO t1 VALUES (1); - --connection node_1 INSERT INTO t1 VALUES (2); -# The concurent insert is allowed to complete because the LOCK TABLE is now broken ---connection node_2a ---error 0 ---reap +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'Waiting for table metadata lock' +--source include/wait_condition.inc + +UNLOCK TABLES; + +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'Waiting for table metadata lock' +--source include/wait_condition.inc + +COMMIT; +SELECT COUNT(*) = 1 FROM t1; --let $wsrep_local_bf_aborts_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` --disable_query_log ---eval SELECT $wsrep_local_bf_aborts_after - $wsrep_local_bf_aborts_before = 1 AS wsrep_local_aborts_increment; +--eval SELECT $wsrep_local_bf_aborts_after - $wsrep_local_bf_aborts_before = 0 AS wsrep_local_aborts_increment; --enable_query_log DROP TABLE t1; From 483078b1b17c97d90e5aa245ef366092fb28fbd3 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Fri, 15 May 2015 02:15:58 -0700 Subject: [PATCH 27/82] Fixes codership/QA#87 . An MTR test for SERIALIZABLE --- .../suite/galera/r/galera_serializable.result | 27 +++++++ .../suite/galera/t/galera_serializable.test | 76 +++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 mysql-test/suite/galera/r/galera_serializable.result create mode 100644 mysql-test/suite/galera/t/galera_serializable.test diff --git a/mysql-test/suite/galera/r/galera_serializable.result b/mysql-test/suite/galera/r/galera_serializable.result new file mode 100644 index 00000000000..90fe628e505 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_serializable.result @@ -0,0 +1,27 @@ +CREATE TABLE t1 (id INT PRIMARY KEY, f2 INTEGER) ENGINE=InnoDB; +SET AUTOCOMMIT=OFF; +SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; +START TRANSACTION; +SELECT * FROM t1; +id f2 +INSERT INTO t1 VALUES (1,1); +SELECT * FROM t1; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +ROLLBACK; +DELETE FROM t1; +INSERT INTO t1 VALUES (1,1); +START TRANSACTION; +SELECT * FROM t1; +id f2 +1 1 +UPDATE t1 SET f2 = 2; +UPDATE t1 SET f2 = 3; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +ROLLBACK; +DELETE FROM t1; +START TRANSACTION; +INSERT INTO t1 VALUES (1,1); +INSERT INTO t1 VALUES (1,2); +COMMIT; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_serializable.test b/mysql-test/suite/galera/t/galera_serializable.test new file mode 100644 index 00000000000..b12d57fd488 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_serializable.test @@ -0,0 +1,76 @@ +# +# Test that the SERIALIZABLE isolation level behaves as expected. +# A local serializable transaction is aborted by an incoming remote update +# +# wsrep_sync_wait does not work well with serializable, see mysql-wsrep#130 +# hence the need to use --sleep . +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 + +CREATE TABLE t1 (id INT PRIMARY KEY, f2 INTEGER) ENGINE=InnoDB; + +# +# Read (local transaction) / Write (remote transaction) conflict +# + +SET AUTOCOMMIT=OFF; +SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; +START TRANSACTION; + +SELECT * FROM t1; + +--connection node_2 +INSERT INTO t1 VALUES (1,1); + +--sleep 2 +--connection node_1 +--error ER_LOCK_DEADLOCK +SELECT * FROM t1; + +ROLLBACK; +DELETE FROM t1; + +# +# Write (local transaction) / Write (remote transaction) conflict +# + +--connection node_1 +INSERT INTO t1 VALUES (1,1); +START TRANSACTION; +SELECT * FROM t1; + +--connection node_2 +UPDATE t1 SET f2 = 2; + +--sleep 2 +--connection node_1 +--error ER_LOCK_DEADLOCK +UPDATE t1 SET f2 = 3; + +ROLLBACK; +DELETE FROM t1; + +# +# Write (local transaction) / Write (remote transaction) conflict +# Local transaction writes before remote one. +# Nothing special happens here - ordinary deadlock on COMMIT +# + +--connection node_1 +START TRANSACTION; + +--connection node_1 +INSERT INTO t1 VALUES (1,1); + +--connection node_2 +INSERT INTO t1 VALUES (1,2); + +--connection node_1 +--error ER_LOCK_DEADLOCK +COMMIT; + +DROP TABLE t1; From 197e9d2559907b97905f7d1536b481bba2e9ffe3 Mon Sep 17 00:00:00 2001 From: sjaakola Date: Tue, 26 May 2015 15:44:34 +0300 Subject: [PATCH 28/82] Refs codership/mysql-wsrep#132 - fix for THD::m_digest initialization, according to Raghu --- sql/sql_parse.cc | 1 + sql/wsrep_thd.cc | 1 + 2 files changed, 2 insertions(+) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 42ad69d84ec..f1a3e7cb58e 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -7016,6 +7016,7 @@ static void wsrep_mysql_parse(THD *thd, char *rawbuf, uint length, /* Performance Schema Interface instrumentation, end */ MYSQL_END_STATEMENT(thd->m_statement_psi, thd->get_stmt_da()); thd->m_statement_psi= NULL; + thd->m_digest= NULL; close_thread_tables(thd); thd->wsrep_conflict_state= RETRY_AUTOCOMMIT; diff --git a/sql/wsrep_thd.cc b/sql/wsrep_thd.cc index d898c982b1d..776a640cabe 100644 --- a/sql/wsrep_thd.cc +++ b/sql/wsrep_thd.cc @@ -214,6 +214,7 @@ void wsrep_replay_transaction(THD *thd) */ MYSQL_END_STATEMENT(thd->m_statement_psi, thd->get_stmt_da()); thd->m_statement_psi= NULL; + thd->m_digest= NULL; thd_proc_info(thd, "wsrep replaying trx"); WSREP_DEBUG("replay trx: %s %lld", thd->query() ? thd->query() : "void", From 86ee30cea95b4a3c8b34398e75e4fc62d0501616 Mon Sep 17 00:00:00 2001 From: Alexey Yurchenko Date: Sat, 6 Jun 2015 01:08:41 +0300 Subject: [PATCH 29/82] Refs codership/mysql-wsrep#141: this commit 1. Passes wsrep_sst_auth_value to SST scripts via WSREP_SST_OPT_AUTH envronmental variable, so it never appears on the command line 2. In mysqldump and xtrabackup* SST scripts which rely on MySQL authentication, instead of passing password on the command line, SST script sets MYSQL_PWD environment variable, so that password also never appears on the mysqldump/innobackupex command line. --- scripts/wsrep_sst_common.sh | 4 ++-- scripts/wsrep_sst_mysqldump.sh | 11 +++++++++++ sql/wsrep_utils.cc | 5 +++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/scripts/wsrep_sst_common.sh b/scripts/wsrep_sst_common.sh index 0aa338510e0..f7cd9e91849 100644 --- a/scripts/wsrep_sst_common.sh +++ b/scripts/wsrep_sst_common.sh @@ -143,8 +143,8 @@ readonly WSREP_SST_OPT_AUTH if ! wsrep_auth_not_set then readonly AUTH_VEC=(${WSREP_SST_OPT_AUTH//:/ }) - WSREP_SST_OPT_USER="${AUTH_VEC[0]:-}" - WSREP_SST_OPT_PSWD="${AUTH_VEC[1]:-}" + [ -n "${AUTH_VEC[0]}" ] && WSREP_SST_OPT_USER="${AUTH_VEC[0]}" + [ -n "${AUTH_VEC[1]}" ] && WSREP_SST_OPT_PSWD="${AUTH_VEC[1]}" fi readonly WSREP_SST_OPT_USER readonly WSREP_SST_OPT_PSWD diff --git a/scripts/wsrep_sst_mysqldump.sh b/scripts/wsrep_sst_mysqldump.sh index 9a061f89e43..7a5695851d4 100644 --- a/scripts/wsrep_sst_mysqldump.sh +++ b/scripts/wsrep_sst_mysqldump.sh @@ -76,6 +76,17 @@ fi # word, it is arguably more secure than passing password on the command line. [ -n "$WSREP_SST_OPT_PSWD" ] && export MYSQL_PWD="$WSREP_SST_OPT_PSWD" +# Refs https://github.com/codership/mysql-wsrep/issues/141 +# Passing password in MYSQL_PWD environment variable is considered +# "extremely insecure" by MySQL Guidelines for Password Security +# (https://dev.mysql.com/doc/refman/5.6/en/password-security-user.html) +# that is even less secure than passing it on a command line! It is doubtful: +# the whole command line is easily observable by any unprivileged user via ps, +# whereas (at least on Linux) unprivileged user can't see process environment +# that he does not own. So while it may be not secure in the NSA sense of the +# word, it is arguably more secure than passing password on the command line. +[ -n "$WSREP_SST_OPT_PSWD" ] && export MYSQL_PWD="$WSREP_SST_OPT_PSWD" + STOP_WSREP="SET wsrep_on=OFF;" # mysqldump cannot restore CSV tables, fix this issue diff --git a/sql/wsrep_utils.cc b/sql/wsrep_utils.cc index 719e8e6b473..b6b50ae7443 100644 --- a/sql/wsrep_utils.cc +++ b/sql/wsrep_utils.cc @@ -165,9 +165,10 @@ env::append(const char* val) ++len_; env_[len_] = NULL; } - else errno_ = errno; } - else errno_ = errno; + + /* if either realloc() or strdup() failed, errno had been set */ + errno_ = errno; return errno_; } From bc796c29b35ed307fd721543f2171572093d88f4 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Mon, 8 Jun 2015 01:43:27 -0700 Subject: [PATCH 30/82] Refs codership/mysql-wsrep#143 . Account for the case where the SST password is empty --- scripts/wsrep_sst_common.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/wsrep_sst_common.sh b/scripts/wsrep_sst_common.sh index f7cd9e91849..f6d838ef425 100644 --- a/scripts/wsrep_sst_common.sh +++ b/scripts/wsrep_sst_common.sh @@ -144,7 +144,7 @@ if ! wsrep_auth_not_set then readonly AUTH_VEC=(${WSREP_SST_OPT_AUTH//:/ }) [ -n "${AUTH_VEC[0]}" ] && WSREP_SST_OPT_USER="${AUTH_VEC[0]}" - [ -n "${AUTH_VEC[1]}" ] && WSREP_SST_OPT_PSWD="${AUTH_VEC[1]}" + [ -n "${AUTH_VEC[1]:-}" ] && WSREP_SST_OPT_PSWD="${AUTH_VEC[1]:-}" fi readonly WSREP_SST_OPT_USER readonly WSREP_SST_OPT_PSWD From 0ccbbffb78a1ae266d5bcd322de10f21e08a34ea Mon Sep 17 00:00:00 2001 From: Alexey Yurchenko Date: Mon, 8 Jun 2015 12:23:53 +0300 Subject: [PATCH 31/82] Slight cleanup improvement on a previous commit. --- scripts/wsrep_sst_common.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/wsrep_sst_common.sh b/scripts/wsrep_sst_common.sh index f6d838ef425..0aa338510e0 100644 --- a/scripts/wsrep_sst_common.sh +++ b/scripts/wsrep_sst_common.sh @@ -143,8 +143,8 @@ readonly WSREP_SST_OPT_AUTH if ! wsrep_auth_not_set then readonly AUTH_VEC=(${WSREP_SST_OPT_AUTH//:/ }) - [ -n "${AUTH_VEC[0]}" ] && WSREP_SST_OPT_USER="${AUTH_VEC[0]}" - [ -n "${AUTH_VEC[1]:-}" ] && WSREP_SST_OPT_PSWD="${AUTH_VEC[1]:-}" + WSREP_SST_OPT_USER="${AUTH_VEC[0]:-}" + WSREP_SST_OPT_PSWD="${AUTH_VEC[1]:-}" fi readonly WSREP_SST_OPT_USER readonly WSREP_SST_OPT_PSWD From 2ea16b995de01f1f5347abee8a050c26eaef55ec Mon Sep 17 00:00:00 2001 From: Alexey Yurchenko Date: Mon, 8 Jun 2015 21:06:22 +0300 Subject: [PATCH 32/82] This commit fixes - errno handling in wsp::env::append() method, where error could be returned by mistake - return code of sst_prepare_other() when pthread_create() fails - it was returning positive error code which by convention is treated as success. --- sql/wsrep_utils.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sql/wsrep_utils.cc b/sql/wsrep_utils.cc index b6b50ae7443..719e8e6b473 100644 --- a/sql/wsrep_utils.cc +++ b/sql/wsrep_utils.cc @@ -165,10 +165,9 @@ env::append(const char* val) ++len_; env_[len_] = NULL; } + else errno_ = errno; } - - /* if either realloc() or strdup() failed, errno had been set */ - errno_ = errno; + else errno_ = errno; return errno_; } From f1a00ed51447f96c140f594784919800bda750d6 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Wed, 17 Jun 2015 05:14:36 -0700 Subject: [PATCH 33/82] Galera MTR Tests: Use wsrep_sst_auth for tests that use xtrabackup + IST --- mysql-test/suite/galera/t/galera_ist_innodb_flush_logs.cnf | 2 ++ mysql-test/suite/galera/t/galera_ist_xtrabackup-v2.cnf | 1 + 2 files changed, 3 insertions(+) diff --git a/mysql-test/suite/galera/t/galera_ist_innodb_flush_logs.cnf b/mysql-test/suite/galera/t/galera_ist_innodb_flush_logs.cnf index 85245ff464a..41a1aab382b 100644 --- a/mysql-test/suite/galera/t/galera_ist_innodb_flush_logs.cnf +++ b/mysql-test/suite/galera/t/galera_ist_innodb_flush_logs.cnf @@ -2,6 +2,8 @@ [mysqld] wsrep_sst_method=xtrabackup-v2 +wsrep_sst_auth=root: + innodb_flush_log_at_trx_commit=0 [mysqld.1] diff --git a/mysql-test/suite/galera/t/galera_ist_xtrabackup-v2.cnf b/mysql-test/suite/galera/t/galera_ist_xtrabackup-v2.cnf index 21e597445a8..a762b939f69 100644 --- a/mysql-test/suite/galera/t/galera_ist_xtrabackup-v2.cnf +++ b/mysql-test/suite/galera/t/galera_ist_xtrabackup-v2.cnf @@ -2,6 +2,7 @@ [mysqld] wsrep_sst_method=xtrabackup-v2 +wsrep_sst_auth=root: [mysqld.1] wsrep_provider_options='base_port=@mysqld.1.#galera_port;pc.ignore_sb=true' From 5a002adb5fda82df8f6bfe7b4f49f07585e13c39 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Fri, 26 Jun 2015 01:30:01 -0700 Subject: [PATCH 34/82] Galera MTR Tests: various tests and test fixes --- .../std_data/galera-upgrade-ca-cert.pem | 40 ++++++++++++++++ .../std_data/galera-upgrade-server-cert.pem | 20 ++++++++ .../std_data/galera-upgrade-server-key.pem | 28 +++++++++++ .../suite/galera/r/galera_gcs_fc_limit.result | 3 -- .../galera/r/galera_prepared_statement.result | 33 +++++++++++++ .../suite/galera/r/galera_ssl_upgrade.result | 24 ++++++++++ .../galera/r/galera_status_local_index.result | 13 ++++++ .../galera/r/galera_var_node_address.result | 9 ++++ mysql-test/suite/galera/r/lp1438990.result | 21 +++++++++ .../suite/galera/t/galera_gcs_fc_limit.test | 5 +- .../galera/t/galera_prepared_statement.test | 44 ++++++++++++++++++ .../suite/galera/t/galera_ssl_upgrade.cnf | 7 +++ .../suite/galera/t/galera_ssl_upgrade.test | 46 +++++++++++++++++++ .../galera/t/galera_status_local_index.test | 21 +++++++++ .../galera/t/galera_var_node_address.cnf | 10 ++++ .../galera/t/galera_var_node_address.test | 22 +++++++++ mysql-test/suite/galera/t/lp1438990.test | 38 +++++++++++++++ 17 files changed, 379 insertions(+), 5 deletions(-) create mode 100644 mysql-test/std_data/galera-upgrade-ca-cert.pem create mode 100644 mysql-test/std_data/galera-upgrade-server-cert.pem create mode 100644 mysql-test/std_data/galera-upgrade-server-key.pem create mode 100644 mysql-test/suite/galera/r/galera_prepared_statement.result create mode 100644 mysql-test/suite/galera/r/galera_ssl_upgrade.result create mode 100644 mysql-test/suite/galera/r/galera_status_local_index.result create mode 100644 mysql-test/suite/galera/r/galera_var_node_address.result create mode 100644 mysql-test/suite/galera/r/lp1438990.result create mode 100644 mysql-test/suite/galera/t/galera_prepared_statement.test create mode 100644 mysql-test/suite/galera/t/galera_ssl_upgrade.cnf create mode 100644 mysql-test/suite/galera/t/galera_ssl_upgrade.test create mode 100644 mysql-test/suite/galera/t/galera_status_local_index.test create mode 100644 mysql-test/suite/galera/t/galera_var_node_address.cnf create mode 100644 mysql-test/suite/galera/t/galera_var_node_address.test create mode 100644 mysql-test/suite/galera/t/lp1438990.test diff --git a/mysql-test/std_data/galera-upgrade-ca-cert.pem b/mysql-test/std_data/galera-upgrade-ca-cert.pem new file mode 100644 index 00000000000..13d27e84bb3 --- /dev/null +++ b/mysql-test/std_data/galera-upgrade-ca-cert.pem @@ -0,0 +1,40 @@ +-----BEGIN CERTIFICATE----- +MIIDWTCCAkGgAwIBAgIJAIlW4JmZGnU4MA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNV +BAYTAkZJMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0RlZmF1bHQg +Q29tcGFueSBMdGQwIBcNMTQxMDI0MDc1MTU1WhgPMzAxNDAyMjQwNzUxNTVaMEIx +CzAJBgNVBAYTAkZJMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0Rl +ZmF1bHQgQ29tcGFueSBMdGQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQDDzU6xLZDD5rZENsOpTpTmqS8YisBaefU3ZeN7VJepZZ/7unM/1YLGJtuRh2Qa +MyTkvyjzf7bSFsDt9L5lfQwBBblVeWkrCvGnQmHDQQYB7JrSmFDPz9W9Mxf9Q2BW +B3lcoKXXJgMnWw0WGrt0lEdFp9gWbq8H9hwJdjpyyk4ZTIuucSOD4JUP3QFEhYU5 +kdcIbDRVw81J4eAZ6EdvbjDN05S7qWjW7rJTnCHAHEd18hcsMGwjpwhjEaSdhMrM +mhOeL8kuQV0fI8v2xfYBliIn9xBZGOVzySPzwFmQceORlW6F3V5w6mwFkmuXqXWX +Qo98swTu7mb89qVYmR71d3L3AgMBAAGjUDBOMB0GA1UdDgQWBBRdWet/kGNTyvXK +wuBdP/eSldOgWjAfBgNVHSMEGDAWgBRdWet/kGNTyvXKwuBdP/eSldOgWjAMBgNV +HRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQCcJpP+DR4AJxVelNTSZa+V38c+ +jgrMD2Ku2eU8NQlsjgMfNEU5Md/g7FpP8aCFzVf0kAAT7DxZmSE3uWXQbMXyVJmy +bF+qXinf71QzdWULm6sASoshC6wbHnXL9ZjWQ3gh1nqVgo3MmLQYrb3eJfKaaLoc +wpjhYxVxGFOx1ITN3jED64lUfoLHvR6NFbESYKAuAAzSNqX4HOQ3uGk2THM8JocZ +oH2+38d81Kd4HQ7DDDKS/isG0+rR60Ti1cMgu7OT7p1dZCwT/KQuI5eGjE9lubkc +yAJjaod4rVLdBri3XVvtySfS2+/75qUgv2TF7d/s7mxMq4DDt29yeKSUhZCs +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDVzCCAj+gAwIBAgIJALBO5bqmtlYkMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNV +BAYTAkZJMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0RlZmF1bHQg +Q29tcGFueSBMdGQwHhcNMTUwNjI2MDcxMjQ1WhcNMjUwNTA0MDcxMjQ1WjBCMQsw +CQYDVQQGEwJGSTEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MRwwGgYDVQQKDBNEZWZh +dWx0IENvbXBhbnkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +1DlcztIzSngGeTUFibj9GZ4ZO78ASpgYySZv/DRIVn/3hbF41ZRD/6uJlb5rf1R7 +fpFsurbXNDDxeap7b/Gz2XSQy96Dbm0SbsFSZttV/R2WtlT1Wf5n9ix6RLqhKSbg +nPyL2fsDaxtZh2uywGJEXhwXFtdx3deIo/tYivDfl5Tcsv0NnZY8Vg0boBRP+FEn +ReJOdSa5LLn+QJN2Xa+wutbLHe0hI6huKUXU2YUeBfgyk1nWol5241ZUDCgDsoaW +8r2YeJNHmNInd3wERbqFgFHsR4N1+Atcyrfn/uQSj9zrTPO/Pp51KpjWf/gjxjXP +biu5De50qZ4+U4no20EIOwIDAQABo1AwTjAdBgNVHQ4EFgQU3kSPGchrOoQJ5gq1 +mmV2HEra6GswHwYDVR0jBBgwFoAU3kSPGchrOoQJ5gq1mmV2HEra6GswDAYDVR0T +BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAfoBD64FJ9fAR19+vwueFGmpWNIqF +PzN7QmEpCMduV3DXuxYO73q2ikXgrVO5HWFz9IjNvzXbSRmWNzJGaZ3QYZ+Xx1JJ +8MrAOUr6djWuyD659f64dh/2jMxiQNoEHrknXm9HSqR5oJVwndFyr/zvSkYSRexE +KFciIprb9LOba9G3ZMBYBdqK+f3Ky16BMjaD6XfaTx+xjHk/8peSueXIQl+v2biz +zSfpEUa0dKCIxckrzD4JknDHFimTsrzlRftcg8t8piOXwZomFcnVunyGs2bJ/Npj +25c2e6sx7XSc5bUgPGuQcSGflZPLg9zWyJ69sVYUNAz+gqfvWfOOJuzPNg== +-----END CERTIFICATE----- diff --git a/mysql-test/std_data/galera-upgrade-server-cert.pem b/mysql-test/std_data/galera-upgrade-server-cert.pem new file mode 100644 index 00000000000..3af8b1ae7dd --- /dev/null +++ b/mysql-test/std_data/galera-upgrade-server-cert.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDVzCCAj+gAwIBAgIJALBO5bqmtlYkMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNV +BAYTAkZJMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0RlZmF1bHQg +Q29tcGFueSBMdGQwHhcNMTUwNjI2MDcxMjQ1WhcNMjUwNTA0MDcxMjQ1WjBCMQsw +CQYDVQQGEwJGSTEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MRwwGgYDVQQKDBNEZWZh +dWx0IENvbXBhbnkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +1DlcztIzSngGeTUFibj9GZ4ZO78ASpgYySZv/DRIVn/3hbF41ZRD/6uJlb5rf1R7 +fpFsurbXNDDxeap7b/Gz2XSQy96Dbm0SbsFSZttV/R2WtlT1Wf5n9ix6RLqhKSbg +nPyL2fsDaxtZh2uywGJEXhwXFtdx3deIo/tYivDfl5Tcsv0NnZY8Vg0boBRP+FEn +ReJOdSa5LLn+QJN2Xa+wutbLHe0hI6huKUXU2YUeBfgyk1nWol5241ZUDCgDsoaW +8r2YeJNHmNInd3wERbqFgFHsR4N1+Atcyrfn/uQSj9zrTPO/Pp51KpjWf/gjxjXP +biu5De50qZ4+U4no20EIOwIDAQABo1AwTjAdBgNVHQ4EFgQU3kSPGchrOoQJ5gq1 +mmV2HEra6GswHwYDVR0jBBgwFoAU3kSPGchrOoQJ5gq1mmV2HEra6GswDAYDVR0T +BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAfoBD64FJ9fAR19+vwueFGmpWNIqF +PzN7QmEpCMduV3DXuxYO73q2ikXgrVO5HWFz9IjNvzXbSRmWNzJGaZ3QYZ+Xx1JJ +8MrAOUr6djWuyD659f64dh/2jMxiQNoEHrknXm9HSqR5oJVwndFyr/zvSkYSRexE +KFciIprb9LOba9G3ZMBYBdqK+f3Ky16BMjaD6XfaTx+xjHk/8peSueXIQl+v2biz +zSfpEUa0dKCIxckrzD4JknDHFimTsrzlRftcg8t8piOXwZomFcnVunyGs2bJ/Npj +25c2e6sx7XSc5bUgPGuQcSGflZPLg9zWyJ69sVYUNAz+gqfvWfOOJuzPNg== +-----END CERTIFICATE----- diff --git a/mysql-test/std_data/galera-upgrade-server-key.pem b/mysql-test/std_data/galera-upgrade-server-key.pem new file mode 100644 index 00000000000..d243c9e0381 --- /dev/null +++ b/mysql-test/std_data/galera-upgrade-server-key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDUOVzO0jNKeAZ5 +NQWJuP0Znhk7vwBKmBjJJm/8NEhWf/eFsXjVlEP/q4mVvmt/VHt+kWy6ttc0MPF5 +qntv8bPZdJDL3oNubRJuwVJm21X9HZa2VPVZ/mf2LHpEuqEpJuCc/IvZ+wNrG1mH +a7LAYkReHBcW13Hd14ij+1iK8N+XlNyy/Q2dljxWDRugFE/4USdF4k51Jrksuf5A +k3Zdr7C61ssd7SEjqG4pRdTZhR4F+DKTWdaiXnbjVlQMKAOyhpbyvZh4k0eY0id3 +fARFuoWAUexHg3X4C1zKt+f+5BKP3OtM878+nnUqmNZ/+CPGNc9uK7kN7nSpnj5T +iejbQQg7AgMBAAECggEBAJ4m7VG3db+uOGzFJY5fzEX1+qn6ibYNKJNmUJfrQmkr +zgLUoc7QQehbJhnwoN1v0OQebZ+rOC7NtnZLpNdkkPmhk3JKLTnykIT3DnhWRftt +vG2+XGUnYMQkmy1ywz0Omt6CmZnlJMQByrNPgBM8Z+SWHGLKRTHkOBCz82T/YjDr +wqug1Yv6W0wMNM/cikgoBldVG7hABCJuShjffIbUgVysK3dEPNywNAC78neoGECm +evPZOaIkWEr86SpAlwA6Yh+zTQZ03CXATcGonJdWJ015DvlKRv6QyRR0Q/Y1ONwb +f115kll15MJBEspFdSyhlMcVJlwO8WMaZ2qIzlQZmdECgYEA//P469QzX00L/urK +7IRvtSVu5CP/A/Wui90U4KoP7XgXIeExnEtzLVs1K7vjuzdpTyq+68XuC40gPcJW +RvoX229m6gRV8nC53UiV71jM8IvkyEqFYT/gfZC9KQCMSRJLtVnDMpZ3gMxAY6/5 +p20o616Au8DKFFetQV0aD4Hj1/MCgYEA1ENV1WkgvN6yItB77E9kN/vbKLRh0hrg +9xj0SmMXGYyDM9NpjbgbgJIZo3ukkBtp3kEY8P9JQZRcd1EcnnSrwTB7ChdInWkR +m/LpIZBEMqNQbeu4QSzZYYS6z4tcGGx43aHqzzNBZdnQnqhYL1CvlLwhkgX6oQCo +woXqyfMNKJkCgYEA63gD1NGPwWkcVBSlQxpDup8JeZE0Fux6++kUP+u0Y39LqLuH +7IXtHBkAvY9JXv8HPvHQWw/og2/97VNQFFQYhqPiRgBfIX9bPpx8c4l6YQISI8GL +G4CsglgZ7hK2/LJ8PAascWnD3xYJVqyaPNFMB90VCaW/Qx+2IKAKTaHtfskCgYBu +1f5C4pMqrCpeTXj4Cvis1wE4PwB5QnnH7SrakOVl/N4huLn8O2948lEa8Zwbd4UP +ffR1Gwh4iuzBjQQhpZBt30/QFBphv5RnVy7uzLMfsfF0hEqBFdcoubMGXqGnSzTN +nhfLO9thQJxTzFnH0xzr0FTDOAYH/h0g/eZ8r0JmuQKBgQDjhXM+hJ3Pkwua+Fnl +nZfY5MeSzkJki/9iwVo8rSDwmZS9Nsc83oZnddM7c2x63t+zYOAcMxsVCiByMDzo +5IB781HWRBGcU8TnW1b0bAnZimjKp/qsZ/Szr38rvImqG8TjzbcSD7w0SpyRQ/Ot +A7SZFkWYfem8/q/VImjU/CNbOQ== +-----END PRIVATE KEY----- diff --git a/mysql-test/suite/galera/r/galera_gcs_fc_limit.result b/mysql-test/suite/galera/r/galera_gcs_fc_limit.result index 99c710f25a5..6284b885c7e 100644 --- a/mysql-test/suite/galera/r/galera_gcs_fc_limit.result +++ b/mysql-test/suite/galera/r/galera_gcs_fc_limit.result @@ -6,9 +6,6 @@ INSERT INTO t1 VALUES (2); INSERT INTO t1 VALUES (3); INSERT INTO t1 VALUES (4); INSERT INTO t1 VALUES (5); -SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'query end' AND INFO = 'INSERT INTO t1 VALUES (5)'; -COUNT(*) = 1 -1 UNLOCK TABLES; INSERT INTO t1 VALUES (6); SELECT COUNT(*) = 6 FROM t1; diff --git a/mysql-test/suite/galera/r/galera_prepared_statement.result b/mysql-test/suite/galera/r/galera_prepared_statement.result new file mode 100644 index 00000000000..138d4431e3d --- /dev/null +++ b/mysql-test/suite/galera/r/galera_prepared_statement.result @@ -0,0 +1,33 @@ +CREATE TABLE t1 (f1 CHAR(5)) ENGINE=InnoDB; +CREATE TABLE t2 (f1 CHAR(5)) ENGINE=InnoDB; +CREATE TABLE t3 (f1 CHAR(5)) ENGINE=InnoDB; +CREATE TABLE t4 (f1 CHAR(5)) ENGINE=InnoDB; +SET SESSION sql_mode='STRICT_ALL_TABLES'; +PREPARE st1 FROM 'INSERT INTO t1 VALUES ("abc")'; +PREPARE st2 FROM 'INSERT INTO t2 VALUES ("abc")'; +PREPARE st3 FROM 'INSERT INTO t3 VALUES ("abc")'; +PREPARE st4 FROM 'INSERT INTO t4 VALUES ("abc")'; +EXECUTE st1; +EXECUTE st2; +EXECUTE st3; +EXECUTE st4; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +SELECT COUNT(*) = 1 FROM t2; +COUNT(*) = 1 +1 +SELECT COUNT(*) = 1 FROM t3; +COUNT(*) = 1 +1 +SELECT COUNT(*) = 1 FROM t4; +COUNT(*) = 1 +1 +ALTER TABLE t1 ADD COLUMN f2 INTEGER; +ALTER TABLE t1 DROP COLUMN f1; +EXECUTE st1; +ERROR HY000: Incorrect integer value: 'abc' for column 'f2' at row 1 +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; +DROP TABLE t4; diff --git a/mysql-test/suite/galera/r/galera_ssl_upgrade.result b/mysql-test/suite/galera/r/galera_ssl_upgrade.result new file mode 100644 index 00000000000..c0f2e84dc6f --- /dev/null +++ b/mysql-test/suite/galera/r/galera_ssl_upgrade.result @@ -0,0 +1,24 @@ +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +VARIABLE_VALUE = 'Synced' +1 +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 2 +1 +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +VARIABLE_VALUE = 'Synced' +1 +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 2 +1 +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +VARIABLE_VALUE = 'Synced' +1 +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 2 +1 +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +VARIABLE_VALUE = 'Synced' +1 +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 2 +1 diff --git a/mysql-test/suite/galera/r/galera_status_local_index.result b/mysql-test/suite/galera/r/galera_status_local_index.result new file mode 100644 index 00000000000..4e886ac8921 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_status_local_index.result @@ -0,0 +1,13 @@ +CREATE TABLE wsrep_local_indexes (wsrep_local_index INTEGER); +INSERT INTO wsrep_local_indexes VALUES ((SELECT variable_value FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE variable_name = 'wsrep_local_index')); +INSERT INTO wsrep_local_indexes VALUES ((SELECT variable_value FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE variable_name = 'wsrep_local_index')); +SELECT COUNT(*) = 2 FROM wsrep_local_indexes; +COUNT(*) = 2 +1 +SELECT COUNT(DISTINCT wsrep_local_index) = 2 FROM wsrep_local_indexes; +COUNT(DISTINCT wsrep_local_index) = 2 +1 +SELECT COUNT(*) = 0 FROM wsrep_local_indexes WHERE wsrep_local_index NOT IN (0, 1); +COUNT(*) = 0 +1 +DROP TABLE wsrep_local_indexes; diff --git a/mysql-test/suite/galera/r/galera_var_node_address.result b/mysql-test/suite/galera/r/galera_var_node_address.result new file mode 100644 index 00000000000..fa88f4b3128 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_var_node_address.result @@ -0,0 +1,9 @@ +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 4 +1 +CREATE TABLE t1 (f1 INTEGER); +INSERT INTO t1 VALUES (1); +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/r/lp1438990.result b/mysql-test/suite/galera/r/lp1438990.result new file mode 100644 index 00000000000..b53bc186953 --- /dev/null +++ b/mysql-test/suite/galera/r/lp1438990.result @@ -0,0 +1,21 @@ +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY); +CREATE TABLE t3 (f1 INTEGER PRIMARY KEY); +CREATE TRIGGER tr1 AFTER INSERT ON t1 FOR EACH ROW CALL p1(NEW.f1); +CREATE PROCEDURE p1 (IN x INT) +BEGIN +DECLARE EXIT HANDLER FOR SQLEXCEPTION +BEGIN +ROLLBACK TO event_logging; +INSERT t3 VALUES (x); +END; +SAVEPOINT event_logging; +INSERT INTO t2 VALUES (x); +RELEASE SAVEPOINT event_logging; +END| +INSERT INTO t2 VALUES (1); +INSERT INTO t1 VALUES (1); +DROP PROCEDURE p1; +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; diff --git a/mysql-test/suite/galera/t/galera_gcs_fc_limit.test b/mysql-test/suite/galera/t/galera_gcs_fc_limit.test index e15da0e35ad..07f0a00b8b2 100644 --- a/mysql-test/suite/galera/t/galera_gcs_fc_limit.test +++ b/mysql-test/suite/galera/t/galera_gcs_fc_limit.test @@ -24,13 +24,14 @@ INSERT INTO t1 VALUES (4); # This query will hang because flow control will kick in --send INSERT INTO t1 VALUES (5); ---sleep 1 +--sleep 2 --let $galera_connection_name = node_1a --let $galera_server_number = 1 --source include/galera_connect.inc --connection node_1a -SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'query end' AND INFO = 'INSERT INTO t1 VALUES (5)'; +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'query end' AND INFO = 'INSERT INTO t1 VALUES (5)'; +--source include/wait_condition.inc --connection node_2 # Unblock the slave applier thread diff --git a/mysql-test/suite/galera/t/galera_prepared_statement.test b/mysql-test/suite/galera/t/galera_prepared_statement.test new file mode 100644 index 00000000000..1d561e3cf87 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_prepared_statement.test @@ -0,0 +1,44 @@ +# +# A simple test for PREPARE / EXECUTE -style prepared statements with Galera +# +# C-API-level prepared-statements can not be triggered from inside mysqltest, however +# can be exercised when running an MTR test suite with the --ps-protocol switch. +# + +--source include/galera_cluster.inc + +CREATE TABLE t1 (f1 CHAR(5)) ENGINE=InnoDB; +CREATE TABLE t2 (f1 CHAR(5)) ENGINE=InnoDB; +CREATE TABLE t3 (f1 CHAR(5)) ENGINE=InnoDB; +CREATE TABLE t4 (f1 CHAR(5)) ENGINE=InnoDB; + +SET SESSION sql_mode='STRICT_ALL_TABLES'; + +PREPARE st1 FROM 'INSERT INTO t1 VALUES ("abc")'; +PREPARE st2 FROM 'INSERT INTO t2 VALUES ("abc")'; +PREPARE st3 FROM 'INSERT INTO t3 VALUES ("abc")'; +PREPARE st4 FROM 'INSERT INTO t4 VALUES ("abc")'; + +EXECUTE st1; +EXECUTE st2; +EXECUTE st3; +EXECUTE st4; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; +SELECT COUNT(*) = 1 FROM t2; +SELECT COUNT(*) = 1 FROM t3; +SELECT COUNT(*) = 1 FROM t4; + +ALTER TABLE t1 ADD COLUMN f2 INTEGER; +ALTER TABLE t1 DROP COLUMN f1; + +--connection node_1 +--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD +EXECUTE st1; + +--connection node_1 +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; +DROP TABLE t4; diff --git a/mysql-test/suite/galera/t/galera_ssl_upgrade.cnf b/mysql-test/suite/galera/t/galera_ssl_upgrade.cnf new file mode 100644 index 00000000000..2954ae0f4cb --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ssl_upgrade.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;socket.ssl=yes;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;socket.ssl=yes;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem' diff --git a/mysql-test/suite/galera/t/galera_ssl_upgrade.test b/mysql-test/suite/galera/t/galera_ssl_upgrade.test new file mode 100644 index 00000000000..07aac0fbe92 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ssl_upgrade.test @@ -0,0 +1,46 @@ +# +# Test upgrading the SSL certificates in a rolling fashion. +# +# 1. The starting state with the old key and cert is is described in galera_ssl_upgrade.cnf +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +# 2. Restart node #1 with a socket.ssl_ca that includes both the new and the old certificate + +--connection node_1 +--source include/shutdown_mysqld.inc +--let $start_mysqld_params = --wsrep-cluster-address=gcomm://127.0.0.1:$NODE_GALERAPORT_2 --wsrep_provider_options=base_port=$NODE_GALERAPORT_1;socket.ssl=yes;socket.ssl_ca=$MYSQL_TEST_DIR/std_data/galera-upgrade-ca-cert.pem;socket.ssl_cert=$MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=$MYSQL_TEST_DIR/std_data/galera-key.pem +--source include/start_mysqld.inc +--source include/wait_until_connected_again.inc + +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +# 3. Restart node #2 with the new socket.ssl_ca , socket.ssl_cert and socket.ssl_key + +--connection node_2 +--source include/shutdown_mysqld.inc +--let $start_mysqld_params = --wsrep_provider_options=base_port=$NODE_GALERAPORT_2;socket.ssl=yes;socket.ssl_ca=$MYSQL_TEST_DIR/std_data/galera-upgrade-ca-cert.pem;socket.ssl_cert=$MYSQL_TEST_DIR/std_data/galera-upgrade-server-cert.pem;socket.ssl_key=$MYSQL_TEST_DIR/std_data/galera-upgrade-server-key.pem +--source include/start_mysqld.inc +--source include/wait_until_connected_again.inc + +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +# 4. Restart node #1 with the new socket.ssl_ca , socket.ssl_cert and socket.ssl_key + +--connection node_1 +--source include/shutdown_mysqld.inc +--let $start_mysqld_params = --wsrep-cluster-address=gcomm://127.0.0.1:$NODE_GALERAPORT_2 --wsrep_provider_options=base_port=$NODE_GALERAPORT_1;socket.ssl=yes;socket.ssl_ca=$MYSQL_TEST_DIR/std_data/galera-upgrade-ca-cert.pem;socket.ssl_cert=$MYSQL_TEST_DIR/std_data/galera-upgrade-server-cert.pem;socket.ssl_key=$MYSQL_TEST_DIR/std_data/galera-upgrade-server-key.pem +--source include/start_mysqld.inc +--source include/wait_until_connected_again.inc + +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +# Upgrade complete. Both nodes now use the new key and certificate diff --git a/mysql-test/suite/galera/t/galera_status_local_index.test b/mysql-test/suite/galera/t/galera_status_local_index.test new file mode 100644 index 00000000000..b61b8ced863 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_status_local_index.test @@ -0,0 +1,21 @@ +# +# Test that a two-node cluster has distinct values for wsrep_local_index for its nodes +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +CREATE TABLE wsrep_local_indexes (wsrep_local_index INTEGER); +INSERT INTO wsrep_local_indexes VALUES ((SELECT variable_value FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE variable_name = 'wsrep_local_index')); + +--connection node_2 +INSERT INTO wsrep_local_indexes VALUES ((SELECT variable_value FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE variable_name = 'wsrep_local_index')); + + +--connection node_1 +SELECT COUNT(*) = 2 FROM wsrep_local_indexes; +SELECT COUNT(DISTINCT wsrep_local_index) = 2 FROM wsrep_local_indexes; +SELECT COUNT(*) = 0 FROM wsrep_local_indexes WHERE wsrep_local_index NOT IN (0, 1); + +DROP TABLE wsrep_local_indexes; diff --git a/mysql-test/suite/galera/t/galera_var_node_address.cnf b/mysql-test/suite/galera/t/galera_var_node_address.cnf new file mode 100644 index 00000000000..0de0edaa396 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_node_address.cnf @@ -0,0 +1,10 @@ +!include ../galera_4nodes.cnf + +[mysqld.2] +wsrep_node_address=127.0.0.1 + +[mysqld.3] +wsrep_node_address=localhost + +[mysqld.4] +wsrep_node_address=lo diff --git a/mysql-test/suite/galera/t/galera_var_node_address.test b/mysql-test/suite/galera/t/galera_var_node_address.test new file mode 100644 index 00000000000..cf118cf9934 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_node_address.test @@ -0,0 +1,22 @@ +# +# Test wsrep_node_address . The galera_var_node_address.cnf contains various settings for +# wsrep_node_address, so in this test we simply confirm that the cluster has started up correctly. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER); + +--connection node_2 +INSERT INTO t1 VALUES (1); + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connection node_3 +SELECT COUNT(*) = 1 FROM t1; + +--connection node_1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/lp1438990.test b/mysql-test/suite/galera/t/lp1438990.test new file mode 100644 index 00000000000..5d54c3338e5 --- /dev/null +++ b/mysql-test/suite/galera/t/lp1438990.test @@ -0,0 +1,38 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY); +CREATE TABLE t3 (f1 INTEGER PRIMARY KEY); + +CREATE TRIGGER tr1 AFTER INSERT ON t1 FOR EACH ROW CALL p1(NEW.f1); + + +DELIMITER |; + +CREATE PROCEDURE p1 (IN x INT) +BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK TO event_logging; + INSERT t3 VALUES (x); + END; + SAVEPOINT event_logging; + + INSERT INTO t2 VALUES (x); + + RELEASE SAVEPOINT event_logging; +END| +DELIMITER ;| + + +INSERT INTO t2 VALUES (1); +INSERT INTO t1 VALUES (1); + +DROP PROCEDURE p1; + +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; From fbe739cbb15d6a50e5ec6494528fe0441667eb75 Mon Sep 17 00:00:00 2001 From: Raghavendra D Prabhu Date: Mon, 29 Jun 2015 16:42:58 +0530 Subject: [PATCH 35/82] Bug#1421360: Add 'FLUSH TABLES' to Total Order Isolation execution. Before this, FLUSH TABLES and FLUSH TABLES t1 (REFRESH_TABLES hereafter) were executed locally, which also had implications for GTID. MySQL async replication does replicate FLUSH TABLES. Hence, this commit a) Adds REFRESH_TABLES to TOI. b) Skips LOCK-based REFRESH_TABLES from TOI, ie. FLUSH TABLES WITH READ LOCK and FLUSH TABLES FOR EXPORT. c) Executes them after reload_acl_and_cache. This is done since reload_acl_and_cache checks for thd->locked_tables_mode and does upgrade of MDL locks accordingly. A failure here means REFRESH_TABLES cannot run. i) This is also important since LOCK TABLES is not replicated in galera. d) Test galera_flush has been modified for i) wsrep_replicate_myisam SESSION variable. ii) Testing REFRESH_TABLES. iii) Testing REFRESH_TABLES + LOCK TABLES. e) Use different WSREP_TO_ISOLATION_BEGIN for global FLUSH TABLES and FLUSH TABLES . --- mysql-test/suite/galera/r/galera_flush.result | 24 ++++++- mysql-test/suite/galera/t/galera_flush.test | 70 ++++++++++++++++++- sql/sql_parse.cc | 19 +++++ 3 files changed, 110 insertions(+), 3 deletions(-) diff --git a/mysql-test/suite/galera/r/galera_flush.result b/mysql-test/suite/galera/r/galera_flush.result index 68266439414..2cc1e944371 100644 --- a/mysql-test/suite/galera/r/galera_flush.result +++ b/mysql-test/suite/galera/r/galera_flush.result @@ -8,7 +8,7 @@ SET GLOBAL wsrep_replicate_myisam = TRUE; INSERT INTO mysql.user VALUES('localhost','user1',PASSWORD('pass1'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0,'mysql_native_password','','N','N'); FLUSH PRIVILEGES; DELETE FROM mysql.user WHERE user = 'user1'; -SET GLOBAL wsrep_replicate_myisam = FALSE; +SET SESSION wsrep_replicate_myisam = FALSE; FLUSH PRIVILEGES; FLUSH QUERY CACHE; wsrep_last_committed_diff @@ -19,6 +19,13 @@ wsrep_last_committed_diff FLUSH USER_RESOURCES; wsrep_last_committed_diff 1 +FLUSH TABLES; +wsrep_last_committed_diff +1 +CREATE TABLE t2 (f1 INTEGER); +FLUSH TABLES t2; +wsrep_last_committed_diff +1 CREATE TABLE t1 (f1 INTEGER); FLUSH LOGS; FLUSH TABLES WITH READ LOCK; @@ -29,4 +36,19 @@ FLUSH TABLES t1 FOR EXPORT; UNLOCK TABLES; wsrep_last_committed_diff 1 +LOCK TABLES t1 WRITE; +FLUSH TABLES t1; +UNLOCK TABLES; +wsrep_last_committed_diff +1 +LOCK TABLES t1 READ; +FLUSH TABLES t1; +ERROR HY000: Table 't1' was locked with a READ lock and can't be updated +UNLOCK TABLES; +wsrep_last_committed_diff +1 +FLUSH TABLES t1; +wsrep_last_committed_diff +1 DROP TABLE t1; +DROP TABLE t2; diff --git a/mysql-test/suite/galera/t/galera_flush.test b/mysql-test/suite/galera/t/galera_flush.test index cd6b40b5b4e..7d0132fa6cc 100644 --- a/mysql-test/suite/galera/t/galera_flush.test +++ b/mysql-test/suite/galera/t/galera_flush.test @@ -39,7 +39,7 @@ FLUSH PRIVILEGES; --connect node_2a, 127.0.0.1, user1, pass1, test, $NODE_MYPORT_2 --connection node_1 DELETE FROM mysql.user WHERE user = 'user1'; -SET GLOBAL wsrep_replicate_myisam = FALSE; +SET SESSION wsrep_replicate_myisam = FALSE; FLUSH PRIVILEGES; @@ -77,8 +77,32 @@ FLUSH USER_RESOURCES; --enable_query_log +--connection node_2 +--let $wsrep_last_committed_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` +--connection node_1 +FLUSH TABLES; +--connection node_2 +--let $wsrep_last_committed_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` +--disable_query_log +--eval SELECT $wsrep_last_committed_after = $wsrep_last_committed_before + 1 AS wsrep_last_committed_diff; +--enable_query_log + +--connection node_1 +CREATE TABLE t2 (f1 INTEGER); + +--connection node_2 +--let $wsrep_last_committed_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` +--connection node_1 +FLUSH TABLES t2; +--connection node_2 +--let $wsrep_last_committed_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` +--disable_query_log +--eval SELECT $wsrep_last_committed_after = $wsrep_last_committed_before + 1 AS wsrep_last_committed_diff; +--enable_query_log + + # -# The following statements should not be replicated: FLUSH LOGS, FLUSH TABLES +# The following statements should not be replicated: FLUSH LOGS, FLUSH TABLES WITH LOCKS # @@ -103,5 +127,47 @@ UNLOCK TABLES; --eval SELECT $wsrep_last_committed_after = $wsrep_last_committed_before AS wsrep_last_committed_diff; --enable_query_log + +## Test LOCK TABLES with FLUSH TABLES +## LOCK TABLES t1 write followed by flush tables t1 should succeed due to MDL upgrade. +## LOCK tables t2 read followed by flush tables t2 should fail with ER_TABLE_NOT_LOCKED_FOR_WRITE + + +--connection node_2 +--let $wsrep_last_committed_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` +--connection node_1 +LOCK TABLES t1 WRITE; +FLUSH TABLES t1; +UNLOCK TABLES; +--connection node_2 +--let $wsrep_last_committed_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` +--disable_query_log +--eval SELECT $wsrep_last_committed_after = $wsrep_last_committed_before + 1 AS wsrep_last_committed_diff; +--enable_query_log + + +--connection node_2 +--let $wsrep_last_committed_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` +--connection node_1 +LOCK TABLES t1 READ; +--error ER_TABLE_NOT_LOCKED_FOR_WRITE +FLUSH TABLES t1; +UNLOCK TABLES; +--connection node_2 +--let $wsrep_last_committed_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` +--disable_query_log +--eval SELECT $wsrep_last_committed_after = $wsrep_last_committed_before AS wsrep_last_committed_diff; +--enable_query_log +--connection node_1 +FLUSH TABLES t1; +--connection node_2 +--let $wsrep_last_committed_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` +--disable_query_log +--eval SELECT $wsrep_last_committed_after = $wsrep_last_committed_before + 1 AS wsrep_last_committed_diff; +--enable_query_log + + + --connection node_1 DROP TABLE t1; +DROP TABLE t2; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index f1a3e7cb58e..af35a2a3b55 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -4695,6 +4695,25 @@ end_with_restore_list: */ if (!reload_acl_and_cache(thd, lex->type, first_table, &write_to_binlog)) { +#ifdef WITH_WSREP + if ((lex->type & REFRESH_TABLES) && !(lex->type & (REFRESH_FOR_EXPORT|REFRESH_READ_LOCK))) + { + /* + This is done after reload_acl_and_cache is because + LOCK TABLES is not replicated in galera, the upgrade of which + is checked in reload_acl_and_cache. + Hence, done after/if we are able to upgrade locks. + */ + if (first_table) + { + WSREP_TO_ISOLATION_BEGIN(NULL, NULL, first_table); + } + else + { + WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL); + } + } +#endif /* WITH_WSREP */ /* We WANT to write and we CAN write. ! we write after unlocking the table. From 5d531f07bfb39dce84cb1e42c36f8b01e331e37f Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Wed, 1 Jul 2015 03:13:04 -0700 Subject: [PATCH 36/82] Galera MTR Tests: Use SET GLOBAL when setting wsrep_replicate_myisam, as it is a GLOBAL variable in MySQL Galera Cluster and SESSION in Percona XTraDB Cluster --- mysql-test/suite/galera/r/galera_flush.result | 2 +- mysql-test/suite/galera/t/galera_flush.test | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/suite/galera/r/galera_flush.result b/mysql-test/suite/galera/r/galera_flush.result index 2cc1e944371..5f15bee14a8 100644 --- a/mysql-test/suite/galera/r/galera_flush.result +++ b/mysql-test/suite/galera/r/galera_flush.result @@ -8,7 +8,7 @@ SET GLOBAL wsrep_replicate_myisam = TRUE; INSERT INTO mysql.user VALUES('localhost','user1',PASSWORD('pass1'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0,'mysql_native_password','','N','N'); FLUSH PRIVILEGES; DELETE FROM mysql.user WHERE user = 'user1'; -SET SESSION wsrep_replicate_myisam = FALSE; +SET GLOBAL wsrep_replicate_myisam = FALSE; FLUSH PRIVILEGES; FLUSH QUERY CACHE; wsrep_last_committed_diff diff --git a/mysql-test/suite/galera/t/galera_flush.test b/mysql-test/suite/galera/t/galera_flush.test index 7d0132fa6cc..b773af03592 100644 --- a/mysql-test/suite/galera/t/galera_flush.test +++ b/mysql-test/suite/galera/t/galera_flush.test @@ -39,7 +39,7 @@ FLUSH PRIVILEGES; --connect node_2a, 127.0.0.1, user1, pass1, test, $NODE_MYPORT_2 --connection node_1 DELETE FROM mysql.user WHERE user = 'user1'; -SET SESSION wsrep_replicate_myisam = FALSE; +SET GLOBAL wsrep_replicate_myisam = FALSE; FLUSH PRIVILEGES; From edd9bd3ea7438f0b9e9c1c9bd368ddb360ceee29 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Tue, 7 Jul 2015 03:42:03 -0700 Subject: [PATCH 37/82] Fixes codership/mysql-wsrep#153 use --defaults-extra-file with mysqldump SST --- .../r/galera_sst_mysqldump_with_key.result | 106 ++++++++++++++++++ .../t/galera_sst_mysqldump_with_key.cnf | 22 ++++ .../t/galera_sst_mysqldump_with_key.test | 22 ++++ 3 files changed, 150 insertions(+) create mode 100644 mysql-test/suite/galera/r/galera_sst_mysqldump_with_key.result create mode 100644 mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.cnf create mode 100644 mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.test diff --git a/mysql-test/suite/galera/r/galera_sst_mysqldump_with_key.result b/mysql-test/suite/galera/r/galera_sst_mysqldump_with_key.result new file mode 100644 index 00000000000..3b5e52caa8b --- /dev/null +++ b/mysql-test/suite/galera/r/galera_sst_mysqldump_with_key.result @@ -0,0 +1,106 @@ +Setting SST method to mysqldump ... +GRANT ALL PRIVILEGES ON *.* TO 'sst' IDENTIFIED BY 'sst'; +SET GLOBAL wsrep_sst_auth = 'sst:sst'; +SET GLOBAL wsrep_sst_method = 'mysqldump'; +CREATE USER sslsst; +GRANT ALL PRIVILEGES ON *.* TO sslsst; +GRANT USAGE ON *.* TO sslsst REQUIRE SSL; +SET GLOBAL wsrep_sst_auth = 'sslsst:'; +Performing State Transfer on a server that has been temporarily disconnected +CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +COMMIT; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +COMMIT; +Unloading wsrep provider ... +SET GLOBAL wsrep_provider = 'none'; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +COMMIT; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +Loading wsrep provider ... +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +COMMIT; +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +COMMIT; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +COMMIT; +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +ROLLBACK; +SELECT COUNT(*) = 35 FROM t1; +COUNT(*) = 35 +1 +SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; +COUNT(*) = 0 +1 +COMMIT; +SET AUTOCOMMIT=ON; +SELECT COUNT(*) = 35 FROM t1; +COUNT(*) = 35 +1 +SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; +COUNT(*) = 0 +1 +DROP TABLE t1; +COMMIT; +SET AUTOCOMMIT=ON; +CALL mtr.add_suppression("Slave SQL: Error 'The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement' on query"); +DROP USER sst; +CALL mtr.add_suppression("Slave SQL: Error 'The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement' on query"); +CALL mtr.add_suppression("InnoDB: Error: Table \"mysql\"\\.\"innodb_index_stats\" not found"); +CALL mtr.add_suppression("InnoDB: New log files created"); +CALL mtr.add_suppression("InnoDB: Creating foreign key constraint system tables"); +CALL mtr.add_suppression("Can't open and lock time zone table"); +CALL mtr.add_suppression("Can't open and lock privilege tables"); +CALL mtr.add_suppression("Info table is not ready to be used"); +CALL mtr.add_suppression("Native table .* has the wrong structure"); +DROP USER sslsst; diff --git a/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.cnf b/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.cnf new file mode 100644 index 00000000000..e108484b248 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.cnf @@ -0,0 +1,22 @@ +!include ../galera_2nodes.cnf + +# We do not set mysqldump-related SST options here because doing so on startup +# causes the first MTR connection to be forefully dropped by Galera, which in turn confuses MTR + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true' + +[mysqld] +wsrep_debug=ON + +ssl-ca=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem +ssl-cert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem +ssl-key=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem + +[client] +ssl-ca=@ENV.MYSQL_TEST_DIR/std_data/cacert.pem +ssl-cert=@ENV.MYSQL_TEST_DIR/std_data/client-cert.pem +ssl-key=@ENV.MYSQL_TEST_DIR/std_data/client-key.pem diff --git a/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.test b/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.test new file mode 100644 index 00000000000..0b3edeb75ff --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.test @@ -0,0 +1,22 @@ +# +# Test mysqldump SST with client SSL key. See galera_sst_mysqldump_with_key.cnf for the configuration on the client side. +# + +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_openssl.inc + +--source suite/galera/include/galera_sst_set_mysqldump.inc + +--connection node_1 +CREATE USER sslsst; +GRANT ALL PRIVILEGES ON *.* TO sslsst; +GRANT USAGE ON *.* TO sslsst REQUIRE SSL; + +SET GLOBAL wsrep_sst_auth = 'sslsst:'; + +--source suite/galera/include/galera_st_disconnect_slave.inc + +--source suite/galera/include/galera_sst_restore.inc +DROP USER sslsst; From 4a630ce6ad50bc81c91a018eaad7ca7fb0046040 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Tue, 7 Jul 2015 06:00:22 -0700 Subject: [PATCH 38/82] Galera MTR Tests: A test for xtrabackup with key+cert encryption. --- ...galera_sst_xtrabackup-v2_encrypt_with_key.result | 3 +++ .../t/galera_sst_xtrabackup-v2_encrypt_with_key.cnf | 11 +++++++++++ .../galera_sst_xtrabackup-v2_encrypt_with_key.test | 13 +++++++++++++ 3 files changed, 27 insertions(+) create mode 100644 mysql-test/suite/galera/r/galera_sst_xtrabackup-v2_encrypt_with_key.result create mode 100644 mysql-test/suite/galera/t/galera_sst_xtrabackup-v2_encrypt_with_key.cnf create mode 100644 mysql-test/suite/galera/t/galera_sst_xtrabackup-v2_encrypt_with_key.test diff --git a/mysql-test/suite/galera/r/galera_sst_xtrabackup-v2_encrypt_with_key.result b/mysql-test/suite/galera/r/galera_sst_xtrabackup-v2_encrypt_with_key.result new file mode 100644 index 00000000000..990e0a29506 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_sst_xtrabackup-v2_encrypt_with_key.result @@ -0,0 +1,3 @@ +SELECT 1; +1 +1 diff --git a/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2_encrypt_with_key.cnf b/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2_encrypt_with_key.cnf new file mode 100644 index 00000000000..969516f5f3b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2_encrypt_with_key.cnf @@ -0,0 +1,11 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=xtrabackup-v2 +wsrep_sst_auth="root:" +wsrep_debug=ON + +[SST] +tkey=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem +tcert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem +encrypt=3 diff --git a/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2_encrypt_with_key.test b/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2_encrypt_with_key.test new file mode 100644 index 00000000000..24d9589d111 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2_encrypt_with_key.test @@ -0,0 +1,13 @@ +# +# This test checks that key and cert encryption options can be passed to xtrabackup via the my.cnf file +# Initial SST happens via xtrabackup, so there is not much to do in the body of the test +# + +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +SELECT 1; + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc From 6104a27c98ce1664214f4edf3d8840320d35cb9b Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Tue, 7 Jul 2015 06:01:00 -0700 Subject: [PATCH 39/82] Galera MTR Tests: increase lock wait timeout in suite/galera/t/galera_many_rows.test --- mysql-test/suite/galera/r/galera_many_rows.result | 4 ++-- mysql-test/suite/galera/t/galera_many_rows.test | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mysql-test/suite/galera/r/galera_many_rows.result b/mysql-test/suite/galera/r/galera_many_rows.result index 340307ac00e..10d829c168d 100644 --- a/mysql-test/suite/galera/r/galera_many_rows.result +++ b/mysql-test/suite/galera/r/galera_many_rows.result @@ -1,5 +1,5 @@ -SET SESSION innodb_lock_wait_timeout=300; -SET SESSION lock_wait_timeout=300; +SET SESSION innodb_lock_wait_timeout=600; +SET SESSION lock_wait_timeout=600; CREATE TABLE ten (f1 INTEGER); INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); CREATE TABLE t1 (f1 INTEGER AUTO_INCREMENT PRIMARY KEY, f2 INTEGER) Engine=InnoDB; diff --git a/mysql-test/suite/galera/t/galera_many_rows.test b/mysql-test/suite/galera/t/galera_many_rows.test index 7df9eedca9b..3e4ac22164a 100644 --- a/mysql-test/suite/galera/t/galera_many_rows.test +++ b/mysql-test/suite/galera/t/galera_many_rows.test @@ -4,8 +4,8 @@ --source include/have_innodb.inc --connection node_1 -SET SESSION innodb_lock_wait_timeout=300; -SET SESSION lock_wait_timeout=300; +SET SESSION innodb_lock_wait_timeout=600; +SET SESSION lock_wait_timeout=600; CREATE TABLE ten (f1 INTEGER); INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); From 10f5c08f4bdbefc910f66126d6732a2e9e875075 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Wed, 8 Jul 2015 01:52:45 -0700 Subject: [PATCH 40/82] Refs codership/QA#47. Additional tests for FTWRL. --- .../suite/galera/r/galera_ftwrl_drain.result | 24 +++++++ .../suite/galera/t/galera_ftwrl_drain.test | 68 +++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 mysql-test/suite/galera/r/galera_ftwrl_drain.result create mode 100644 mysql-test/suite/galera/t/galera_ftwrl_drain.test diff --git a/mysql-test/suite/galera/r/galera_ftwrl_drain.result b/mysql-test/suite/galera/r/galera_ftwrl_drain.result new file mode 100644 index 00000000000..a4879838d11 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_ftwrl_drain.result @@ -0,0 +1,24 @@ +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +INSERT INTO t1 VALUES (1); +SET SESSION wsrep_sync_wait = 0; +SELECT COUNT(*) = 0 FROM t1; +COUNT(*) = 0 +1 +FLUSH TABLES WITH READ LOCK;; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +SET SESSION lock_wait_timeout = 1; +SET SESSION innodb_lock_wait_timeout=1; +SET SESSION wait_timeout=1; +INSERT INTO t2 VALUES (2); +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +UNLOCK TABLES; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +INSERT INTO t1 VALUES (3); +SELECT COUNT(*) = 2 FROM t1; +COUNT(*) = 2 +1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_ftwrl_drain.test b/mysql-test/suite/galera/t/galera_ftwrl_drain.test new file mode 100644 index 00000000000..f022a9437c2 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ftwrl_drain.test @@ -0,0 +1,68 @@ +# +# Test the following sequence of events: +# +# 1. issue a remote transaction +# 2. applier is blocked from applying the transaction locally using apply_monitor_slave_enter_sync +# 3. FTWRL is issued and blocks in ApplyOrder>::drain_common +# 4. applier is unblocked +# 5. remote transaction is applied +# 6. FTWRL is granted +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc +--source suite/galera/include/galera_have_debug_sync.inc + +--connection node_1 +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; + +--connection node_2 +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; + +--connection node_1 +INSERT INTO t1 VALUES (1); + +--connection node_2 +SET SESSION wsrep_sync_wait = 0; + +# Wait until applier has blocked +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_debug_sync_waiters' AND VARIABLE_VALUE = 'apply_monitor_slave_enter_sync' +--source include/wait_condition.inc + +SELECT COUNT(*) = 0 FROM t1; + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +--send FLUSH TABLES WITH READ LOCK; + +--connection node_2 +--sleep 1 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'Init' AND INFO = 'FLUSH TABLES WITH READ LOCK' +--source include/wait_condition.inc + +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; + +--connection node_2a +--reap + +--connection node_2 + +SET SESSION lock_wait_timeout = 1; +SET SESSION innodb_lock_wait_timeout=1; +SET SESSION wait_timeout=1; + +--error ER_LOCK_WAIT_TIMEOUT +INSERT INTO t2 VALUES (2); + +--connection node_2a +UNLOCK TABLES; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; +INSERT INTO t1 VALUES (3); + +--connection node_1 +SELECT COUNT(*) = 2 FROM t1; +DROP TABLE t1; From 83579c2ff326a1033e2ac854766409be06476e78 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Fri, 10 Jul 2015 07:17:20 -0700 Subject: [PATCH 41/82] Galera MTR Tests: fixes for mysqldump SST/IST tests --- .../suite/galera/include/galera_sst_set_mysqldump.inc | 5 +++-- mysql-test/suite/galera/include/kill_galera.inc | 1 + mysql-test/suite/galera/r/galera_ist_mysqldump.result | 4 ++-- mysql-test/suite/galera/r/galera_migrate.result | 6 +++--- mysql-test/suite/galera/r/galera_sst_mysqldump.result | 4 ++-- .../suite/galera/r/galera_sst_mysqldump_with_key.result | 4 ++-- mysql-test/suite/galera/r/mysql-wsrep#33.result | 4 ++-- mysql-test/suite/galera/t/galera_migrate.test | 6 +++--- 8 files changed, 18 insertions(+), 16 deletions(-) diff --git a/mysql-test/suite/galera/include/galera_sst_set_mysqldump.inc b/mysql-test/suite/galera/include/galera_sst_set_mysqldump.inc index 405c16ce4f1..5f87d23dcc1 100644 --- a/mysql-test/suite/galera/include/galera_sst_set_mysqldump.inc +++ b/mysql-test/suite/galera/include/galera_sst_set_mysqldump.inc @@ -6,12 +6,13 @@ --connection node_1 # We need a user with a password to perform SST, otherwise we hit LP #1378253 -GRANT ALL PRIVILEGES ON *.* TO 'sst' IDENTIFIED BY 'sst'; +GRANT ALL PRIVILEGES ON *.* TO 'sst'; --let $wsrep_sst_auth_orig = `SELECT @@wsrep_sst_auth` -SET GLOBAL wsrep_sst_auth = 'sst:sst'; +SET GLOBAL wsrep_sst_auth = 'sst:'; --connection node_2 +--source include/wait_until_connected_again.inc --let $wsrep_sst_method_orig = `SELECT @@wsrep_sst_method` --let $wsrep_sst_receive_address_orig = `SELECT @@wsrep_sst_receive_address` diff --git a/mysql-test/suite/galera/include/kill_galera.inc b/mysql-test/suite/galera/include/kill_galera.inc index d7f665df6c7..c61bad8e19d 100644 --- a/mysql-test/suite/galera/include/kill_galera.inc +++ b/mysql-test/suite/galera/include/kill_galera.inc @@ -1,6 +1,7 @@ --echo Killing server ... # Write file to make mysql-test-run.pl expect the crash, but don't start it +--source include/wait_until_connected_again.inc --let $_server_id= `SELECT @@server_id` --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.$_server_id.expect --exec echo "wait" > $_expect_file_name diff --git a/mysql-test/suite/galera/r/galera_ist_mysqldump.result b/mysql-test/suite/galera/r/galera_ist_mysqldump.result index 4b5a8fe948a..9a5b4e8a76f 100644 --- a/mysql-test/suite/galera/r/galera_ist_mysqldump.result +++ b/mysql-test/suite/galera/r/galera_ist_mysqldump.result @@ -1,6 +1,6 @@ Setting SST method to mysqldump ... -GRANT ALL PRIVILEGES ON *.* TO 'sst' IDENTIFIED BY 'sst'; -SET GLOBAL wsrep_sst_auth = 'sst:sst'; +GRANT ALL PRIVILEGES ON *.* TO 'sst'; +SET GLOBAL wsrep_sst_auth = 'sst:'; SET GLOBAL wsrep_sst_method = 'mysqldump'; Performing State Transfer on a server that has been shut down cleanly and restarted CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; diff --git a/mysql-test/suite/galera/r/galera_migrate.result b/mysql-test/suite/galera/r/galera_migrate.result index 7c92d66ff97..aab3ffbd6b6 100644 --- a/mysql-test/suite/galera/r/galera_migrate.result +++ b/mysql-test/suite/galera/r/galera_migrate.result @@ -21,9 +21,9 @@ SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_N VARIABLE_VALUE = 1 1 INSERT INTO t1 VALUES (6); -GRANT ALL PRIVILEGES ON *.* TO 'sst' IDENTIFIED BY 'sst'; -SET GLOBAL wsrep_sst_auth = 'sst:sst'; -GRANT ALL PRIVILEGES ON *.* TO 'sst' IDENTIFIED BY 'sst'; +GRANT ALL PRIVILEGES ON *.* TO 'sst'; +SET GLOBAL wsrep_sst_auth = 'sst:'; +GRANT ALL PRIVILEGES ON *.* TO 'sst'; SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; VARIABLE_VALUE = 'Synced' 1 diff --git a/mysql-test/suite/galera/r/galera_sst_mysqldump.result b/mysql-test/suite/galera/r/galera_sst_mysqldump.result index 1be2002001b..e35c4055f45 100644 --- a/mysql-test/suite/galera/r/galera_sst_mysqldump.result +++ b/mysql-test/suite/galera/r/galera_sst_mysqldump.result @@ -1,6 +1,6 @@ Setting SST method to mysqldump ... -GRANT ALL PRIVILEGES ON *.* TO 'sst' IDENTIFIED BY 'sst'; -SET GLOBAL wsrep_sst_auth = 'sst:sst'; +GRANT ALL PRIVILEGES ON *.* TO 'sst'; +SET GLOBAL wsrep_sst_auth = 'sst:'; SET GLOBAL wsrep_sst_method = 'mysqldump'; Performing State Transfer on a server that has been temporarily disconnected CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; diff --git a/mysql-test/suite/galera/r/galera_sst_mysqldump_with_key.result b/mysql-test/suite/galera/r/galera_sst_mysqldump_with_key.result index 3b5e52caa8b..93557cc91d4 100644 --- a/mysql-test/suite/galera/r/galera_sst_mysqldump_with_key.result +++ b/mysql-test/suite/galera/r/galera_sst_mysqldump_with_key.result @@ -1,6 +1,6 @@ Setting SST method to mysqldump ... -GRANT ALL PRIVILEGES ON *.* TO 'sst' IDENTIFIED BY 'sst'; -SET GLOBAL wsrep_sst_auth = 'sst:sst'; +GRANT ALL PRIVILEGES ON *.* TO 'sst'; +SET GLOBAL wsrep_sst_auth = 'sst:'; SET GLOBAL wsrep_sst_method = 'mysqldump'; CREATE USER sslsst; GRANT ALL PRIVILEGES ON *.* TO sslsst; diff --git a/mysql-test/suite/galera/r/mysql-wsrep#33.result b/mysql-test/suite/galera/r/mysql-wsrep#33.result index 153d8084bec..62af519ad32 100644 --- a/mysql-test/suite/galera/r/mysql-wsrep#33.result +++ b/mysql-test/suite/galera/r/mysql-wsrep#33.result @@ -1,6 +1,6 @@ Setting SST method to mysqldump ... -GRANT ALL PRIVILEGES ON *.* TO 'sst' IDENTIFIED BY 'sst'; -SET GLOBAL wsrep_sst_auth = 'sst:sst'; +GRANT ALL PRIVILEGES ON *.* TO 'sst'; +SET GLOBAL wsrep_sst_auth = 'sst:'; SET GLOBAL wsrep_sst_method = 'mysqldump'; Performing State Transfer on a server that has been temporarily disconnected CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; diff --git a/mysql-test/suite/galera/t/galera_migrate.test b/mysql-test/suite/galera/t/galera_migrate.test index 873640b88d4..84897b66c6d 100644 --- a/mysql-test/suite/galera/t/galera_migrate.test +++ b/mysql-test/suite/galera/t/galera_migrate.test @@ -104,11 +104,11 @@ INSERT INTO t1 VALUES (6); --connection node_3 # We need a user with a password for mysqldump SST -GRANT ALL PRIVILEGES ON *.* TO 'sst' IDENTIFIED BY 'sst'; -SET GLOBAL wsrep_sst_auth = 'sst:sst'; +GRANT ALL PRIVILEGES ON *.* TO 'sst'; +SET GLOBAL wsrep_sst_auth = 'sst:'; --connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4 -GRANT ALL PRIVILEGES ON *.* TO 'sst' IDENTIFIED BY 'sst'; +GRANT ALL PRIVILEGES ON *.* TO 'sst'; --disable_query_log --eval SET GLOBAL wsrep_sst_method = 'mysqldump'; From 3893b5c6daf960281e56b4e3cfd141c2814563fd Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Thu, 23 Jul 2015 04:29:40 -0700 Subject: [PATCH 42/82] Galera MTR Tests: mark all tests operating on large data sets with --source include/big-test.inc to help with Valgrind --- mysql-test/suite/galera/t/galera_binlog_event_max_size_max.test | 1 + mysql-test/suite/galera/t/galera_gcs_max_packet_size.test | 1 + mysql-test/suite/galera/t/galera_parallel_autoinc_largetrx.test | 1 + mysql-test/suite/galera/t/galera_parallel_autoinc_manytrx.test | 1 + mysql-test/suite/galera/t/galera_var_load_data_splitting.test | 1 + 5 files changed, 5 insertions(+) diff --git a/mysql-test/suite/galera/t/galera_binlog_event_max_size_max.test b/mysql-test/suite/galera/t/galera_binlog_event_max_size_max.test index 600432ce0ca..d0cc23446b2 100644 --- a/mysql-test/suite/galera/t/galera_binlog_event_max_size_max.test +++ b/mysql-test/suite/galera/t/galera_binlog_event_max_size_max.test @@ -4,6 +4,7 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/big_test.inc CREATE TABLE ten (f1 INTEGER); INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); diff --git a/mysql-test/suite/galera/t/galera_gcs_max_packet_size.test b/mysql-test/suite/galera/t/galera_gcs_max_packet_size.test index cafd8acfdd9..98be4f6a300 100644 --- a/mysql-test/suite/galera/t/galera_gcs_max_packet_size.test +++ b/mysql-test/suite/galera/t/galera_gcs_max_packet_size.test @@ -6,6 +6,7 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/big_test.inc CREATE TABLE ten (f1 INTEGER); INSERT INTO ten VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); diff --git a/mysql-test/suite/galera/t/galera_parallel_autoinc_largetrx.test b/mysql-test/suite/galera/t/galera_parallel_autoinc_largetrx.test index a192044754d..f280e49d206 100644 --- a/mysql-test/suite/galera/t/galera_parallel_autoinc_largetrx.test +++ b/mysql-test/suite/galera/t/galera_parallel_autoinc_largetrx.test @@ -4,6 +4,7 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/big_test.inc # Create a second connection to node1 so that we can run transactions concurrently --let $galera_connection_name = node_1a diff --git a/mysql-test/suite/galera/t/galera_parallel_autoinc_manytrx.test b/mysql-test/suite/galera/t/galera_parallel_autoinc_manytrx.test index cf984f92b2f..8680d62a36d 100644 --- a/mysql-test/suite/galera/t/galera_parallel_autoinc_manytrx.test +++ b/mysql-test/suite/galera/t/galera_parallel_autoinc_manytrx.test @@ -4,6 +4,7 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/big_test.inc # Create a second connection to node1 so that we can run transactions concurrently --let $galera_connection_name = node_1a diff --git a/mysql-test/suite/galera/t/galera_var_load_data_splitting.test b/mysql-test/suite/galera/t/galera_var_load_data_splitting.test index 0783dc897f8..38dab0a981b 100644 --- a/mysql-test/suite/galera/t/galera_var_load_data_splitting.test +++ b/mysql-test/suite/galera/t/galera_var_load_data_splitting.test @@ -1,5 +1,6 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/big_test.inc --let $wsrep_load_data_splitting_orig = `SELECT @@wsrep_load_data_splitting` From 1e2906892a1403734c246082cc90ac2cf9d91053 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Thu, 23 Jul 2015 04:30:07 -0700 Subject: [PATCH 43/82] Galera MTR Tests: Valgrind suppression for codership/galera#306 --- mysql-test/valgrind.supp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/mysql-test/valgrind.supp b/mysql-test/valgrind.supp index 5c54c4ff30c..2a80c08863d 100644 --- a/mysql-test/valgrind.supp +++ b/mysql-test/valgrind.supp @@ -1282,3 +1282,26 @@ fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 } + +{ + GitHub codership/galera#306 + Memcheck:Leak + match-leak-kinds: definite + fun:malloc + fun:strdup + fun:_Z16wsrep_get_paramsRKN6galera10ReplicatorE + fun:galera_parameters_get + fun:_ZL24refresh_provider_optionsv + fun:_Z29wsrep_provider_options_updateP7sys_varP3THD13enum_var_type + fun:_ZN7sys_var6updateEP3THDP7set_var + fun:_ZN7set_var6updateEP3THD + fun:_Z17sql_set_variablesP3THDP4ListI12set_var_baseE + fun:_Z21mysql_execute_commandP3THD + fun:_Z11mysql_parseP3THDPcjP12Parser_state + fun:_ZL17wsrep_mysql_parseP3THDPcjP12Parser_state + fun:_Z16dispatch_command19enum_server_commandP3THDPcj + fun:_Z10do_commandP3THD + fun:_Z24do_handle_one_connectionP3THD + fun:handle_one_connection +} + From a1a7414b1d448be38463d23c5f91b0280e603e09 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Mon, 3 Aug 2015 03:20:52 -0700 Subject: [PATCH 44/82] Galera MTR Tests: An end-to-end test with restoring a node from xtrabackup; a test for restoring the primary component via pc.bootstrap --- .../suite/galera/r/galera_var_log_bin.result | 10 +++ .../suite/galera/t/galera_var_log_bin.cnf | 9 ++ .../suite/galera/t/galera_var_log_bin.test | 22 +++++ .../r/galera_innobackupex_backup.result | 11 +++ .../r/galera_pc_bootstrap.result | 29 ++++++ .../t/galera_innobackupex_backup.test | 56 ++++++++++++ .../galera_3nodes/t/galera_pc_bootstrap.test | 90 +++++++++++++++++++ 7 files changed, 227 insertions(+) create mode 100644 mysql-test/suite/galera/r/galera_var_log_bin.result create mode 100644 mysql-test/suite/galera/t/galera_var_log_bin.cnf create mode 100644 mysql-test/suite/galera/t/galera_var_log_bin.test create mode 100644 mysql-test/suite/galera_3nodes/r/galera_innobackupex_backup.result create mode 100644 mysql-test/suite/galera_3nodes/r/galera_pc_bootstrap.result create mode 100644 mysql-test/suite/galera_3nodes/t/galera_innobackupex_backup.test create mode 100644 mysql-test/suite/galera_3nodes/t/galera_pc_bootstrap.test diff --git a/mysql-test/suite/galera/r/galera_var_log_bin.result b/mysql-test/suite/galera/r/galera_var_log_bin.result new file mode 100644 index 00000000000..a6ab62350b1 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_var_log_bin.result @@ -0,0 +1,10 @@ +CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +UPDATE t1 SET f1 = 2 WHERE f1 = 1; +SELECT COUNT(*) = 1 FROM t1 WHERE f1 = 2; +COUNT(*) = 1 +1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_var_log_bin.cnf b/mysql-test/suite/galera/t/galera_var_log_bin.cnf new file mode 100644 index 00000000000..68bc0a0823f --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_log_bin.cnf @@ -0,0 +1,9 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +log-bin=log1 + +[mysqld.2] +log-bin=log2 + + diff --git a/mysql-test/suite/galera/t/galera_var_log_bin.test b/mysql-test/suite/galera/t/galera_var_log_bin.test new file mode 100644 index 00000000000..c0ab124dcec --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_log_bin.test @@ -0,0 +1,22 @@ +# +# A simple test that confirms that Galera works with log-bin enabled, that is +# when MySQL's binlog is in effect rather than the Galera 'dummy' implementation. +# + +--source include/have_binlog_format_row.inc +--source include/galera_cluster.inc + +CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB; + +INSERT INTO t1 VALUES (1); + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; + +--connection node_1 +UPDATE t1 SET f1 = 2 WHERE f1 = 1; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1 WHERE f1 = 2; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera_3nodes/r/galera_innobackupex_backup.result b/mysql-test/suite/galera_3nodes/r/galera_innobackupex_backup.result new file mode 100644 index 00000000000..85000db8e77 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/r/galera_innobackupex_backup.result @@ -0,0 +1,11 @@ +CREATE TABLE t1 (f1 INTEGER); +INSERT INTO t1 VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); +SELECT COUNT(*) = 10 FROM t1; +COUNT(*) = 10 +1 +Killing server ... +INSERT INTO t1 VALUES (11),(12),(13),(14),(15),(16),(17),(18),(19),(20); +SELECT COUNT(*) = 20 FROM t1; +COUNT(*) = 20 +1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera_3nodes/r/galera_pc_bootstrap.result b/mysql-test/suite/galera_3nodes/r/galera_pc_bootstrap.result new file mode 100644 index 00000000000..f5a4cad4a23 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/r/galera_pc_bootstrap.result @@ -0,0 +1,29 @@ +CREATE TABLE t1 (f1 INTEGER); +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; +SET SESSION wsrep_sync_wait = 0; +SHOW STATUS LIKE 'wsrep_cluster_status'; +Variable_name Value +wsrep_cluster_status non-Primary +SET GLOBAL wsrep_provider_options = 'pc.bootstrap=1'; +SHOW STATUS LIKE 'wsrep_cluster_size'; +Variable_name Value +wsrep_cluster_size 1 +SHOW STATUS LIKE 'wsrep_cluster_status'; +Variable_name Value +wsrep_cluster_status Primary +INSERT INTO t1 VALUES (1); +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0'; +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0'; +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0'; +SELECT COUNT(*) FROM t1; +COUNT(*) +1 +SELECT COUNT(*) FROM t1; +COUNT(*) +1 +SELECT COUNT(*) FROM t1; +COUNT(*) +1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera_3nodes/t/galera_innobackupex_backup.test b/mysql-test/suite/galera_3nodes/t/galera_innobackupex_backup.test new file mode 100644 index 00000000000..2003aaa1b4e --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_innobackupex_backup.test @@ -0,0 +1,56 @@ +# +# This test uses innobackupex to take a backup on node #2 and then restores that node from backup +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER); +INSERT INTO t1 VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); + +--connection node_2 +SELECT COUNT(*) = 10 FROM t1; + +--exec innobackupex $MYSQL_TMP_DIR/innobackupex_backup --galera-info --defaults-file=$MYSQLTEST_VARDIR/my.cnf --defaults-group=mysqld.2 --port=$NODE_MYPORT_2 --host=127.0.0.1 --no-timestamp > $MYSQL_TMP_DIR/innobackupex-backup.log +--exec innobackupex $MYSQL_TMP_DIR/innobackupex_backup --apply-log --galera-info --defaults-file=$MYSQLTEST_VARDIR/my.cnf --defaults-group=mysqld.2 --port=$NODE_MYPORT_2 --host=127.0.0.1 --no-timestamp > $MYSQL_TMP_DIR/innobackupex-apply.log + +--source include/kill_galera.inc +--sleep 1 + +--connection node_1 +INSERT INTO t1 VALUES (11),(12),(13),(14),(15),(16),(17),(18),(19),(20); + +--exec rm -rf $MYSQLTEST_VARDIR/mysqld.2/data/* +--exec innobackupex --copy-back $MYSQL_TMP_DIR/innobackupex_backup --defaults-file=$MYSQLTEST_VARDIR/my.cnf --defaults-group=mysqld.2 --port=$NODE_MYPORT_2 --host=127.0.0.1 > $MYSQL_TMP_DIR/innobackupex-restore.log + +# +# Convert the xtrabackup_galera_info into a grastate.dat file +# + +--perl + use strict; + my $xtrabackup_galera_info_file = $ENV{'MYSQL_TMP_DIR'}.'/innobackupex_backup/xtrabackup_galera_info'; + open(XTRABACKUP_GALERA_INFO, $xtrabackup_galera_info_file) or die "Can not open $xtrabackup_galera_info_file: $!"; + my $xtrabackup_galera_info = ; + my ($uuid, $seqno) = split(':', $xtrabackup_galera_info); + + my $grastate_dat_file = $ENV{'MYSQLTEST_VARDIR'}.'/mysqld.2/data/grastate.dat'; + die "grastate.dat already exists" if -e $grastate_dat_file; + + open(GRASTATE_DAT, ">$grastate_dat_file") or die "Can not write to $grastate_dat_file: $!"; + print GRASTATE_DAT "version: 2.1\n"; + print GRASTATE_DAT "uuid: $uuid\n"; + print GRASTATE_DAT "seqno: $seqno\n"; + print GRASTATE_DAT "cert_index:\n"; + exit(0); +EOF + +--source include/start_mysqld.inc + +--source include/wait_until_connected_again.inc +SELECT COUNT(*) = 20 FROM t1; + +DROP TABLE t1; + +--sleep 10 diff --git a/mysql-test/suite/galera_3nodes/t/galera_pc_bootstrap.test b/mysql-test/suite/galera_3nodes/t/galera_pc_bootstrap.test new file mode 100644 index 00000000000..6172ffcc743 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_pc_bootstrap.test @@ -0,0 +1,90 @@ +# +# Test the operation of pc.bootstrap +# + +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INTEGER); + +# Force all nodes to become non-primary +--connection node_1 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; + +--connection node_2 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connection node_3 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; + +--sleep 10 + +# Node #2 should be non-primary +SET SESSION wsrep_sync_wait = 0; +SHOW STATUS LIKE 'wsrep_cluster_status'; + +# Signal node #2 to bootstrap +--connection node_2 +SET GLOBAL wsrep_provider_options = 'pc.bootstrap=1'; + +# Wait until node becomes available for queries again +--source include/wait_until_connected_again.inc + +# Node #2 should now be a primary of a 1-node cluster + +SHOW STATUS LIKE 'wsrep_cluster_size'; +SHOW STATUS LIKE 'wsrep_cluster_status'; + +# Perform an insert on node #2 +INSERT INTO t1 VALUES (1); + +# Reconnect all nodes +--connection node_2 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0'; +--sleep 10 +--source include/wait_until_connected_again.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + + +--connection node_1 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0'; +--source include/wait_until_connected_again.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + + +--connection node_3 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0'; +--sleep 10 +--source include/wait_until_connected_again.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +# Check that all nodes have the same view of the database + +--connection node_1 +SELECT COUNT(*) FROM t1; + +--connection node_2 +SELECT COUNT(*) FROM t1; + +--connection node_3 +SELECT COUNT(*) FROM t1; + +# Test cleanup +DROP TABLE t1; From 2316a4e19ff9b5ac388bf888a8ac6aa8154eed1f Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Thu, 6 Aug 2015 00:34:00 -0700 Subject: [PATCH 45/82] Galera MTR Tests: Tests for GRA*.log files, replication bundle, preordered events, forced binlog format --- mysql-test/std_data/binlog-header.log | Bin 0 -> 120 bytes .../r/galera_as_slave_preordered.result | 19 ++++ .../galera_as_slave_replication_bundle.result | 15 ++++ .../r/galera_forced_binlog_format.result | 18 ++++ .../suite/galera/r/galera_gra_log.result | 41 +++++++++ .../galera/t/galera_as_slave_preordered.cnf | 3 + .../galera/t/galera_as_slave_preordered.test | 84 ++++++++++++++++++ .../t/galera_as_slave_replication_bundle.cnf | 4 + .../t/galera_as_slave_replication_bundle.test | 48 ++++++++++ .../t/galera_forced_binlog_format-master.opt | 1 + .../galera/t/galera_forced_binlog_format.test | 25 ++++++ mysql-test/suite/galera/t/galera_gra_log.test | 38 ++++++++ 12 files changed, 296 insertions(+) create mode 100644 mysql-test/std_data/binlog-header.log create mode 100644 mysql-test/suite/galera/r/galera_as_slave_preordered.result create mode 100644 mysql-test/suite/galera/r/galera_as_slave_replication_bundle.result create mode 100644 mysql-test/suite/galera/r/galera_forced_binlog_format.result create mode 100644 mysql-test/suite/galera/r/galera_gra_log.result create mode 100644 mysql-test/suite/galera/t/galera_as_slave_preordered.cnf create mode 100644 mysql-test/suite/galera/t/galera_as_slave_preordered.test create mode 100644 mysql-test/suite/galera/t/galera_as_slave_replication_bundle.cnf create mode 100644 mysql-test/suite/galera/t/galera_as_slave_replication_bundle.test create mode 100644 mysql-test/suite/galera/t/galera_forced_binlog_format-master.opt create mode 100644 mysql-test/suite/galera/t/galera_forced_binlog_format.test create mode 100644 mysql-test/suite/galera/t/galera_gra_log.test diff --git a/mysql-test/std_data/binlog-header.log b/mysql-test/std_data/binlog-header.log new file mode 100644 index 0000000000000000000000000000000000000000..c415a57e61612b723f773414898f9dcf0871f98e GIT binary patch literal 120 zcmeyDl$p1y@<1p*69WT72@qERF(U&DgQ=dGo{@=eN@`MRx^7N>I#8GZ02w1}!OOtG kAjH4|1VRi9F$^qH96)Ux92_9?xwyC_B^ekN=c)b#0H!YxNdN!< literal 0 HcmV?d00001 diff --git a/mysql-test/suite/galera/r/galera_as_slave_preordered.result b/mysql-test/suite/galera/r/galera_as_slave_preordered.result new file mode 100644 index 00000000000..27a08e73491 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_as_slave_preordered.result @@ -0,0 +1,19 @@ +START SLAVE USER='root'; +Warnings: +Note 1759 Sending passwords in plain text without SSL/TLS is extremely insecure. +CREATE TABLE ten (f1 INTEGER); +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY AUTO_INCREMENT, f2 INTEGER) ENGINE=InnoDB; +SELECT COUNT(DISTINCT f1) = 2 * 100 * 10 * 10 FROM t1; +COUNT(DISTINCT f1) = 2 * 100 * 10 * 10 +1 +SELECT COUNT(*) = 2 * 100 * 10 * 10 FROM t1; +COUNT(*) = 2 * 100 * 10 * 10 +1 +SELECT COUNT(DISTINCT f1) = 2 * 100 * 10 * 10 FROM t1; +COUNT(DISTINCT f1) = 2 * 100 * 10 * 10 +1 +DROP TABLE t1; +DROP TABLE ten; +STOP SLAVE; +RESET SLAVE ALL; diff --git a/mysql-test/suite/galera/r/galera_as_slave_replication_bundle.result b/mysql-test/suite/galera/r/galera_as_slave_replication_bundle.result new file mode 100644 index 00000000000..a86bfd20e2f --- /dev/null +++ b/mysql-test/suite/galera/r/galera_as_slave_replication_bundle.result @@ -0,0 +1,15 @@ +START SLAVE USER='root'; +Warnings: +Note 1759 Sending passwords in plain text without SSL/TLS is extremely insecure. +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES(1); +INSERT INTO t1 VALUES(2); +INSERT INTO t1 VALUES(3); +INSERT INTO t1 VALUES(4); +INSERT INTO t1 VALUES(5); +SELECT COUNT(*) = 4 FROM t1; +COUNT(*) = 4 +1 +DROP TABLE t1; +STOP SLAVE; +RESET SLAVE ALL; diff --git a/mysql-test/suite/galera/r/galera_forced_binlog_format.result b/mysql-test/suite/galera/r/galera_forced_binlog_format.result new file mode 100644 index 00000000000..857e44d2dfc --- /dev/null +++ b/mysql-test/suite/galera/r/galera_forced_binlog_format.result @@ -0,0 +1,18 @@ +RESET MASTER; +SET SESSION binlog_format = 'STATEMENT'; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +SET SESSION binlog_format = 'MIXED'; +INSERT INTO t1 VALUES (2); +SHOW BINLOG EVENTS IN 'mysqld-bin.000001' FROM 120; +Log_name Pos Event_type Server_id End_log_pos Info +mysqld-bin.000001 Query 1 use `test`; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB +mysqld-bin.000001 Query 1 BEGIN +mysqld-bin.000001 Table_map 1 table_id: ### (test.t1) +mysqld-bin.000001 Write_rows 1 table_id: ### flags: STMT_END_F +mysqld-bin.000001 Xid 1 COMMIT /* xid=### */ +mysqld-bin.000001 Query 1 BEGIN +mysqld-bin.000001 Table_map 1 table_id: ### (test.t1) +mysqld-bin.000001 Write_rows 1 table_id: ### flags: STMT_END_F +mysqld-bin.000001 Xid 1 COMMIT /* xid=### */ +DROP TABLE t1; diff --git a/mysql-test/suite/galera/r/galera_gra_log.result b/mysql-test/suite/galera/r/galera_gra_log.result new file mode 100644 index 00000000000..e98eaee8cc8 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_gra_log.result @@ -0,0 +1,41 @@ +SET SESSION wsrep_on=OFF; +CREATE TABLE t1 (f1 INTEGER); +CREATE TABLE t1 (f1 INTEGER); +SELECT COUNT(*) = 0 FROM t1; +COUNT(*) = 0 +1 +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; +/*!40019 SET @@session.max_insert_delayed_threads=0*/; +/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; +DELIMITER /*!*/; +# at 4 + server id 2 end_log_pos 120 Start: binlog v 4, server v 5.6.24-debug-log created 150804 11:37:14 at startup +# Warning: this binlog is either in use or was not closed properly. +ROLLBACK/*!*/; +BINLOG ' +unnAVQ8CAAAAdAAAAHgAAAABAAQANS42LjI0LWRlYnVnLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAC6ecBVEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAKNu +Jfk= +'/*!*/; +# at 120 + server id 1 end_log_pos 91 Query thread_id=7 exec_time=0 error_code=0 +use `test`/*!*/; +SET TIMESTAMP=/*!*/; +SET @@session.pseudo_thread_id=7/*!*/; +SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; +SET @@session.sql_mode=1073741824/*!*/; +SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; +/*!\C latin1 *//*!*/; +SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/; +SET @@session.lc_time_names=0/*!*/; +SET @@session.collation_database=DEFAULT/*!*/; +CREATE TABLE t1 (f1 INTEGER) +/*!*/; +DELIMITER ; +# End of log file +ROLLBACK /* added by mysqlbinlog */; +/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; +SET SESSION wsrep_on=ON; +CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query"); +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_as_slave_preordered.cnf b/mysql-test/suite/galera/t/galera_as_slave_preordered.cnf new file mode 100644 index 00000000000..d1a0fb15ff3 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave_preordered.cnf @@ -0,0 +1,3 @@ +!include ../galera_2nodes_as_slave.cnf +[mysqld] +wsrep-preordered=TRUE diff --git a/mysql-test/suite/galera/t/galera_as_slave_preordered.test b/mysql-test/suite/galera/t/galera_as_slave_preordered.test new file mode 100644 index 00000000000..6f221f83b3a --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave_preordered.test @@ -0,0 +1,84 @@ +# +# Test Galera as a slave to a MySQL master with --wsrep-preordered=TRUE +# +# The galera/galera_2node_slave.cnf describes the setup of the nodes +# + +--source include/have_innodb.inc +--source include/have_log_bin.inc + +# As node #1 is not a Galera node, we connect to node #2 in order to run include/galera_cluster.inc +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--source include/galera_cluster.inc + +--connection node_2 +--disable_query_log +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=$NODE_MYPORT_1; +--enable_query_log +START SLAVE USER='root'; + +# +# Issue many large-ish transaction on the async master +# + +--connection node_1 +CREATE TABLE ten (f1 INTEGER); +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY AUTO_INCREMENT, f2 INTEGER) ENGINE=InnoDB; + +--disable_query_log +--let $count = 100 +while ($count) +{ + --eval INSERT INTO t1 (f2) SELECT 1 FROM ten AS a1, ten AS a2; + --dec $count +} +--enable_query_log + +# +# While the async transactions are being applied, issue another set of transactions +# on the Galera node. +# + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--let $count = 100 +--disable_query_log +while ($count) +{ + --eval INSERT INTO t1 (f2) SELECT 1 FROM ten AS a1, ten AS a2; + --dec $count +} +--enable_query_log + +# +# Confirm that all transactions successfully committed +# + +--let $wait_condition = SELECT COUNT(*) = 2 * 100 * 10 * 10 FROM t1; +--source include/wait_condition.inc + +SELECT COUNT(DISTINCT f1) = 2 * 100 * 10 * 10 FROM t1; + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connection node_3 +SELECT COUNT(*) = 2 * 100 * 10 * 10 FROM t1; +SELECT COUNT(DISTINCT f1) = 2 * 100 * 10 * 10 FROM t1; + +# +# Cleanup +# + +--connection node_1 +DROP TABLE t1; +DROP TABLE ten; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +STOP SLAVE; +RESET SLAVE ALL; diff --git a/mysql-test/suite/galera/t/galera_as_slave_replication_bundle.cnf b/mysql-test/suite/galera/t/galera_as_slave_replication_bundle.cnf new file mode 100644 index 00000000000..d092d88bfaf --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave_replication_bundle.cnf @@ -0,0 +1,4 @@ +!include ../galera_2nodes_as_slave.cnf + +[mysqld] +wsrep-mysql-replication-bundle=2 diff --git a/mysql-test/suite/galera/t/galera_as_slave_replication_bundle.test b/mysql-test/suite/galera/t/galera_as_slave_replication_bundle.test new file mode 100644 index 00000000000..f873294143e --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave_replication_bundle.test @@ -0,0 +1,48 @@ +# +# Test the wsrep_replication_bundle variable. We expect that multiple async replication events +# will be grouped together and thus a smaller number of wsrep_last_committed transactions will +# be reported. +# + +--source include/have_innodb.inc +--source include/have_log_bin.inc + +# As node #1 is not a Galera node, we connect to node #2 in order to run include/galera_cluster.inc +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--source include/galera_cluster.inc + +--connection node_2 +--disable_query_log +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=$NODE_MYPORT_1; +--enable_query_log +START SLAVE USER='root'; + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES(1); +INSERT INTO t1 VALUES(2); +INSERT INTO t1 VALUES(3); +INSERT INTO t1 VALUES(4); +INSERT INTO t1 VALUES(5); + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT COUNT(*) = 4 FROM t1; +--source include/wait_condition.inc + +# With wsrep_mysql_replication_bundle = 2, the last insert is not delivered +# because there are not enough events remaining to complete an entire bundle +SELECT COUNT(*) = 4 FROM t1; + +# Bundle is now complete, the last INSERT and the DROP are delivered +--connection node_1 +DROP TABLE t1; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +STOP SLAVE; +RESET SLAVE ALL; diff --git a/mysql-test/suite/galera/t/galera_forced_binlog_format-master.opt b/mysql-test/suite/galera/t/galera_forced_binlog_format-master.opt new file mode 100644 index 00000000000..8c58b59b45d --- /dev/null +++ b/mysql-test/suite/galera/t/galera_forced_binlog_format-master.opt @@ -0,0 +1 @@ +--log-bin --wsrep_forced_binlog_format=ROW diff --git a/mysql-test/suite/galera/t/galera_forced_binlog_format.test b/mysql-test/suite/galera/t/galera_forced_binlog_format.test new file mode 100644 index 00000000000..934c15399e0 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_forced_binlog_format.test @@ -0,0 +1,25 @@ +# +# Test that wsrep_forced_binlog_format=ROW indeed prevents the log to be switched to STATEMENT format on a per-connection basis +# + +--source include/have_log_bin.inc +--source include/have_innodb.inc +--source include/galera_cluster.inc + +--connection node_1 +RESET MASTER; + +SET SESSION binlog_format = 'STATEMENT'; + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +SET SESSION binlog_format = 'MIXED'; + +INSERT INTO t1 VALUES (2); + +--replace_regex /xid=[0-9]+/xid=###/ /table_id: [0-9]+/table_id: ###/ +--replace_column 2 5 +SHOW BINLOG EVENTS IN 'mysqld-bin.000001' FROM 120; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_gra_log.test b/mysql-test/suite/galera/t/galera_gra_log.test new file mode 100644 index 00000000000..f666920b2cf --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gra_log.test @@ -0,0 +1,38 @@ +# +# Test that GRA_* files are generated on applier failure and are readable. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_2 +--exec rm -rf $MYSQLTEST_VARDIR/mysqld.2/data/GRA_*.log + +# Create applier failure + +SET SESSION wsrep_on=OFF; +CREATE TABLE t1 (f1 INTEGER); + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER); + +--connection node_2 +SELECT COUNT(*) = 0 FROM t1; + +# Compose a valid binlog from a header file and the GRA file + +--let $gra_binlog_file = $MYSQLTEST_VARDIR/tmp/gra.log +--exec rm -rf $gra_binlog_file + +--exec cp std_data/binlog-header.log $gra_binlog_file +--exec cat $MYSQLTEST_VARDIR/mysqld.2/data/GRA_*.log >> $gra_binlog_file + +# Make sure the binlog thus produced is readable and contains the failure +--replace_regex /SET TIMESTAMP=[0-9]+/SET TIMESTAMP=/ /#[0-9]+ [0-9]+:[0-9]+:[0-9]+// +--exec $MYSQL_BINLOG $gra_binlog_file + +SET SESSION wsrep_on=ON; + +CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query"); + +DROP TABLE t1; From c9d4581e8a0ce05e6c9c19bd55bde3ea463bbd2d Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Thu, 6 Aug 2015 20:55:30 -0700 Subject: [PATCH 46/82] Galera MTR Tests: remove variable output from galera_gra_log.test --- mysql-test/suite/galera/r/galera_gra_log.result | 4 ++-- mysql-test/suite/galera/t/galera_gra_log.test | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mysql-test/suite/galera/r/galera_gra_log.result b/mysql-test/suite/galera/r/galera_gra_log.result index e98eaee8cc8..e092e0423ab 100644 --- a/mysql-test/suite/galera/r/galera_gra_log.result +++ b/mysql-test/suite/galera/r/galera_gra_log.result @@ -20,8 +20,8 @@ Jfk= # at 120 server id 1 end_log_pos 91 Query thread_id=7 exec_time=0 error_code=0 use `test`/*!*/; -SET TIMESTAMP=/*!*/; -SET @@session.pseudo_thread_id=7/*!*/; +SET TIMESTAMP=/*!*/; +SET @@session.pseudo_thread_id=/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=1073741824/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; diff --git a/mysql-test/suite/galera/t/galera_gra_log.test b/mysql-test/suite/galera/t/galera_gra_log.test index f666920b2cf..5aeff7763cf 100644 --- a/mysql-test/suite/galera/t/galera_gra_log.test +++ b/mysql-test/suite/galera/t/galera_gra_log.test @@ -28,7 +28,7 @@ SELECT COUNT(*) = 0 FROM t1; --exec cat $MYSQLTEST_VARDIR/mysqld.2/data/GRA_*.log >> $gra_binlog_file # Make sure the binlog thus produced is readable and contains the failure ---replace_regex /SET TIMESTAMP=[0-9]+/SET TIMESTAMP=/ /#[0-9]+ [0-9]+:[0-9]+:[0-9]+// +--replace_regex /SET TIMESTAMP=[0-9]+/SET TIMESTAMP=/ /#[0-9]+ +[0-9]+:[0-9]+:[0-9]+// /pseudo_thread_id=[0-9]+/pseudo_thread_id=/ --exec $MYSQL_BINLOG $gra_binlog_file SET SESSION wsrep_on=ON; From 182b237d4090aad846cda78c85c5596f1f544b2a Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Fri, 7 Aug 2015 21:15:02 -0700 Subject: [PATCH 47/82] Galera MTR Tests: remove variable output from galera_gra_log.test (take #2) --- mysql-test/suite/galera/r/galera_gra_log.result | 2 +- mysql-test/suite/galera/t/galera_gra_log.test | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/suite/galera/r/galera_gra_log.result b/mysql-test/suite/galera/r/galera_gra_log.result index e092e0423ab..9f5cbdd75fc 100644 --- a/mysql-test/suite/galera/r/galera_gra_log.result +++ b/mysql-test/suite/galera/r/galera_gra_log.result @@ -18,7 +18,7 @@ AAAAAAAAAAAAAAAAAAC6ecBVEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAKNu Jfk= '/*!*/; # at 120 - server id 1 end_log_pos 91 Query thread_id=7 exec_time=0 error_code=0 + server id 1 end_log_pos 91 Query thread_id= exec_time=0 error_code=0 use `test`/*!*/; SET TIMESTAMP=/*!*/; SET @@session.pseudo_thread_id=/*!*/; diff --git a/mysql-test/suite/galera/t/galera_gra_log.test b/mysql-test/suite/galera/t/galera_gra_log.test index 5aeff7763cf..5329dc24546 100644 --- a/mysql-test/suite/galera/t/galera_gra_log.test +++ b/mysql-test/suite/galera/t/galera_gra_log.test @@ -28,7 +28,7 @@ SELECT COUNT(*) = 0 FROM t1; --exec cat $MYSQLTEST_VARDIR/mysqld.2/data/GRA_*.log >> $gra_binlog_file # Make sure the binlog thus produced is readable and contains the failure ---replace_regex /SET TIMESTAMP=[0-9]+/SET TIMESTAMP=/ /#[0-9]+ +[0-9]+:[0-9]+:[0-9]+// /pseudo_thread_id=[0-9]+/pseudo_thread_id=/ +--replace_regex /SET TIMESTAMP=[0-9]+/SET TIMESTAMP=/ /#[0-9]+ +[0-9]+:[0-9]+:[0-9]+// /pseudo_thread_id=[0-9]+/pseudo_thread_id=/ /thread_id=[0-9]+/thread_id=/ --exec $MYSQL_BINLOG $gra_binlog_file SET SESSION wsrep_on=ON; From 997119dafefc1cf0d016d0b0da7989151d3e4f81 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Tue, 11 Aug 2015 04:22:38 -0700 Subject: [PATCH 48/82] Galera MTR Tests: Various test stability fixes. --- .../r/galera_bf_abort_flush_for_export.result | 1 + .../suite/galera/r/galera_gcs_fc_limit.result | 3 +++ .../suite/galera/r/galera_many_rows.result | 15 +------------ .../t/galera_bf_abort_flush_for_export.test | 1 + .../suite/galera/t/galera_gcs_fc_limit.test | 2 ++ .../suite/galera/t/galera_many_rows.test | 21 ++++++------------- .../suite/galera_3nodes/t/galera_garbd.test | 2 ++ .../t/galera_innobackupex_backup.test | 2 ++ 8 files changed, 18 insertions(+), 29 deletions(-) diff --git a/mysql-test/suite/galera/r/galera_bf_abort_flush_for_export.result b/mysql-test/suite/galera/r/galera_bf_abort_flush_for_export.result index d22fd694279..d6ff0c20008 100644 --- a/mysql-test/suite/galera/r/galera_bf_abort_flush_for_export.result +++ b/mysql-test/suite/galera/r/galera_bf_abort_flush_for_export.result @@ -5,6 +5,7 @@ INSERT INTO t1 VALUES (2); SET SESSION wsrep_sync_wait = 0; UNLOCK TABLES; COMMIT; +SET AUTOCOMMIT=ON; SELECT COUNT(*) = 1 FROM t1; COUNT(*) = 1 1 diff --git a/mysql-test/suite/galera/r/galera_gcs_fc_limit.result b/mysql-test/suite/galera/r/galera_gcs_fc_limit.result index 6284b885c7e..ad60ead4b8a 100644 --- a/mysql-test/suite/galera/r/galera_gcs_fc_limit.result +++ b/mysql-test/suite/galera/r/galera_gcs_fc_limit.result @@ -1,5 +1,8 @@ CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; INSERT INTO t1 VALUES (1); +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 SET GLOBAL wsrep_provider_options = 'gcs.fc_limit=1'; FLUSH TABLES WITH READ LOCK; INSERT INTO t1 VALUES (2); diff --git a/mysql-test/suite/galera/r/galera_many_rows.result b/mysql-test/suite/galera/r/galera_many_rows.result index 10d829c168d..43454ced993 100644 --- a/mysql-test/suite/galera/r/galera_many_rows.result +++ b/mysql-test/suite/galera/r/galera_many_rows.result @@ -12,23 +12,10 @@ SELECT COUNT(*) = 200000 FROM t1; COUNT(*) = 200000 1 UPDATE t1 SET f2 = 1; +SET GLOBAL wsrep_provider_options = 'repl.causal_read_timeout=PT5M'; SELECT COUNT(*) = 200000 FROM t1 WHERE f2 = 1; COUNT(*) = 200000 1 -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 (f2) SELECT a1.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5; -ROLLBACK; -SELECT COUNT(*) = 200000 FROM t1; -COUNT(*) = 200000 -1 -SELECT COUNT(*) = 200000 FROM t1; -COUNT(*) = 200000 -1 -SET AUTOCOMMIT=OFF; -START TRANSACTION; -UPDATE t1 SET f2 = 2; -ROLLBACK; START TRANSACTION; SELECT COUNT(*) = 200000 FROM t1; COUNT(*) = 200000 diff --git a/mysql-test/suite/galera/t/galera_bf_abort_flush_for_export.test b/mysql-test/suite/galera/t/galera_bf_abort_flush_for_export.test index 84f7e21e685..e98a76850fa 100644 --- a/mysql-test/suite/galera/t/galera_bf_abort_flush_for_export.test +++ b/mysql-test/suite/galera/t/galera_bf_abort_flush_for_export.test @@ -26,6 +26,7 @@ UNLOCK TABLES; --source include/wait_condition.inc COMMIT; +SET AUTOCOMMIT=ON; SELECT COUNT(*) = 1 FROM t1; --let $wsrep_local_bf_aborts_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` diff --git a/mysql-test/suite/galera/t/galera_gcs_fc_limit.test b/mysql-test/suite/galera/t/galera_gcs_fc_limit.test index 07f0a00b8b2..8b8299f0f03 100644 --- a/mysql-test/suite/galera/t/galera_gcs_fc_limit.test +++ b/mysql-test/suite/galera/t/galera_gcs_fc_limit.test @@ -9,6 +9,8 @@ CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; INSERT INTO t1 VALUES (1); --connection node_2 +SELECT COUNT(*) = 1 FROM t1; + --let $wsrep_provider_options_orig = `SELECT @@wsrep_provider_options` SET GLOBAL wsrep_provider_options = 'gcs.fc_limit=1'; diff --git a/mysql-test/suite/galera/t/galera_many_rows.test b/mysql-test/suite/galera/t/galera_many_rows.test index 3e4ac22164a..b2f931bec3a 100644 --- a/mysql-test/suite/galera/t/galera_many_rows.test +++ b/mysql-test/suite/galera/t/galera_many_rows.test @@ -22,23 +22,10 @@ SELECT COUNT(*) = 200000 FROM t1; UPDATE t1 SET f2 = 1; --connection node_2 +--let $wsrep_provider_options_node2 = `SELECT @@wsrep_provider_options` +SET GLOBAL wsrep_provider_options = 'repl.causal_read_timeout=PT5M'; SELECT COUNT(*) = 200000 FROM t1 WHERE f2 = 1; -# Rollback ---connection node_1 -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 (f2) SELECT a1.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5; -ROLLBACK; -SELECT COUNT(*) = 200000 FROM t1; - ---connection node_2 -SELECT COUNT(*) = 200000 FROM t1; -SET AUTOCOMMIT=OFF; -START TRANSACTION; -UPDATE t1 SET f2 = 2; -ROLLBACK; - --connection node_1 START TRANSACTION; SELECT COUNT(*) = 200000 FROM t1; @@ -55,5 +42,9 @@ COMMIT; --error ER_LOCK_DEADLOCK COMMIT; +--disable_query_log +--eval SET GLOBAL wsrep_provider_options = '$wsrep_provider_options_node2'; +--enable_query_log + DROP TABLE t1; DROP TABLE ten; diff --git a/mysql-test/suite/galera_3nodes/t/galera_garbd.test b/mysql-test/suite/galera_3nodes/t/galera_garbd.test index 71ef4acda82..a68ba8ce15b 100644 --- a/mysql-test/suite/galera_3nodes/t/galera_garbd.test +++ b/mysql-test/suite/galera_3nodes/t/galera_garbd.test @@ -34,6 +34,8 @@ SELECT COUNT(*) = 1 FROM t1; --echo Killing garbd ... --exec pkill --oldest --full garbd.*$NODE_GALERAPORT_3 +--sleep 5 + --connection node_1 --let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' --source include/wait_condition.inc diff --git a/mysql-test/suite/galera_3nodes/t/galera_innobackupex_backup.test b/mysql-test/suite/galera_3nodes/t/galera_innobackupex_backup.test index 2003aaa1b4e..af4a5fbf9d6 100644 --- a/mysql-test/suite/galera_3nodes/t/galera_innobackupex_backup.test +++ b/mysql-test/suite/galera_3nodes/t/galera_innobackupex_backup.test @@ -12,6 +12,7 @@ INSERT INTO t1 VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); --connection node_2 SELECT COUNT(*) = 10 FROM t1; +--exec rm -rf $MYSQL_TMP_DIR/innobackupex_backup --exec innobackupex $MYSQL_TMP_DIR/innobackupex_backup --galera-info --defaults-file=$MYSQLTEST_VARDIR/my.cnf --defaults-group=mysqld.2 --port=$NODE_MYPORT_2 --host=127.0.0.1 --no-timestamp > $MYSQL_TMP_DIR/innobackupex-backup.log --exec innobackupex $MYSQL_TMP_DIR/innobackupex_backup --apply-log --galera-info --defaults-file=$MYSQLTEST_VARDIR/my.cnf --defaults-group=mysqld.2 --port=$NODE_MYPORT_2 --host=127.0.0.1 --no-timestamp > $MYSQL_TMP_DIR/innobackupex-apply.log @@ -47,6 +48,7 @@ INSERT INTO t1 VALUES (11),(12),(13),(14),(15),(16),(17),(18),(19),(20); EOF --source include/start_mysqld.inc +--sleep 5 --source include/wait_until_connected_again.inc SELECT COUNT(*) = 20 FROM t1; From fd0aaad5479ee447aa7d0f5f71f23c26faf6cbc8 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Wed, 12 Aug 2015 01:03:21 -0700 Subject: [PATCH 49/82] Galera MTR Tests: Various test stability fixes (take #2) --- .../suite/galera/r/galera_many_rows.result | 4 +++- .../galera/r/galera_parallel_simple.result | 17 ++++++++++------- .../suite/galera/t/galera_gcs_fc_limit.test | 1 + mysql-test/suite/galera/t/galera_many_rows.test | 8 ++++++-- .../suite/galera/t/galera_parallel_simple.test | 8 +++++--- .../suite/galera/t/galera_wan_restart_sst.test | 1 + 6 files changed, 26 insertions(+), 13 deletions(-) diff --git a/mysql-test/suite/galera/r/galera_many_rows.result b/mysql-test/suite/galera/r/galera_many_rows.result index 43454ced993..a34367d6e46 100644 --- a/mysql-test/suite/galera/r/galera_many_rows.result +++ b/mysql-test/suite/galera/r/galera_many_rows.result @@ -4,6 +4,9 @@ CREATE TABLE ten (f1 INTEGER); INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); CREATE TABLE t1 (f1 INTEGER AUTO_INCREMENT PRIMARY KEY, f2 INTEGER) Engine=InnoDB; INSERT INTO t1 (f2) SELECT a1.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5; +SET SESSION wsrep_sync_wait = 0; +SET SESSION wsrep_sync_wait = 7; +SET GLOBAL wsrep_provider_options = 'repl.causal_read_timeout=PT1H'; SELECT COUNT(*) = 100000 FROM t1; COUNT(*) = 100000 1 @@ -12,7 +15,6 @@ SELECT COUNT(*) = 200000 FROM t1; COUNT(*) = 200000 1 UPDATE t1 SET f2 = 1; -SET GLOBAL wsrep_provider_options = 'repl.causal_read_timeout=PT5M'; SELECT COUNT(*) = 200000 FROM t1 WHERE f2 = 1; COUNT(*) = 200000 1 diff --git a/mysql-test/suite/galera/r/galera_parallel_simple.result b/mysql-test/suite/galera/r/galera_parallel_simple.result index 880d4e8ae3d..d6743780b2d 100644 --- a/mysql-test/suite/galera/r/galera_parallel_simple.result +++ b/mysql-test/suite/galera/r/galera_parallel_simple.result @@ -13,13 +13,16 @@ INSERT INTO t1 VALUES (1); INSERT INTO t2 VALUES (1); INSERT INTO t1 VALUES (1); INSERT INTO t2 VALUES (1); -SELECT COUNT(*) = 6 FROM t1; -COUNT(*) = 6 -1 -SELECT COUNT(*) = 6 FROM t2; -COUNT(*) = 6 -1 -SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'closing tables'; +SELECT COUNT(*) = 10 FROM t1; +COUNT(*) = 10 +0 +SELECT COUNT(*) = 10 FROM t2; +COUNT(*) = 10 +0 +SELECT COUNT(DISTINCT ID) FROM INFORMATION_SCHEMA.PROCESSLIST; +COUNT(DISTINCT ID) +4 +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'committed%'; COUNT(*) = 2 1 SET GLOBAL wsrep_slave_threads = 1;; diff --git a/mysql-test/suite/galera/t/galera_gcs_fc_limit.test b/mysql-test/suite/galera/t/galera_gcs_fc_limit.test index 8b8299f0f03..fd77ec0a0eb 100644 --- a/mysql-test/suite/galera/t/galera_gcs_fc_limit.test +++ b/mysql-test/suite/galera/t/galera_gcs_fc_limit.test @@ -10,6 +10,7 @@ INSERT INTO t1 VALUES (1); --connection node_2 SELECT COUNT(*) = 1 FROM t1; +--sleep 1 --let $wsrep_provider_options_orig = `SELECT @@wsrep_provider_options` SET GLOBAL wsrep_provider_options = 'gcs.fc_limit=1'; diff --git a/mysql-test/suite/galera/t/galera_many_rows.test b/mysql-test/suite/galera/t/galera_many_rows.test index b2f931bec3a..653dc2dd75a 100644 --- a/mysql-test/suite/galera/t/galera_many_rows.test +++ b/mysql-test/suite/galera/t/galera_many_rows.test @@ -14,6 +14,12 @@ CREATE TABLE t1 (f1 INTEGER AUTO_INCREMENT PRIMARY KEY, f2 INTEGER) Engine=InnoD INSERT INTO t1 (f2) SELECT a1.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5; --connection node_2 +SET SESSION wsrep_sync_wait = 0; +--let $wsrep_provider_options_node2 = `SELECT @@wsrep_provider_options` +SET SESSION wsrep_sync_wait = 7; + +SET GLOBAL wsrep_provider_options = 'repl.causal_read_timeout=PT1H'; + SELECT COUNT(*) = 100000 FROM t1; INSERT INTO t1 (f2) SELECT a1.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5; @@ -22,8 +28,6 @@ SELECT COUNT(*) = 200000 FROM t1; UPDATE t1 SET f2 = 1; --connection node_2 ---let $wsrep_provider_options_node2 = `SELECT @@wsrep_provider_options` -SET GLOBAL wsrep_provider_options = 'repl.causal_read_timeout=PT5M'; SELECT COUNT(*) = 200000 FROM t1 WHERE f2 = 1; --connection node_1 diff --git a/mysql-test/suite/galera/t/galera_parallel_simple.test b/mysql-test/suite/galera/t/galera_parallel_simple.test index a1429954980..5b2fd6b3479 100644 --- a/mysql-test/suite/galera/t/galera_parallel_simple.test +++ b/mysql-test/suite/galera/t/galera_parallel_simple.test @@ -35,9 +35,11 @@ INSERT INTO t2 VALUES (1); --connection node_2 -SELECT COUNT(*) = 6 FROM t1; -SELECT COUNT(*) = 6 FROM t2; -SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'closing tables'; +SELECT COUNT(*) = 10 FROM t1; +SELECT COUNT(*) = 10 FROM t2; +SHOW PROCESSLIST; +SELECT COUNT(DISTINCT ID) FROM INFORMATION_SCHEMA.PROCESSLIST; +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'committed%'; --eval SET GLOBAL wsrep_slave_threads = $wsrep_slave_threads_orig; diff --git a/mysql-test/suite/galera/t/galera_wan_restart_sst.test b/mysql-test/suite/galera/t/galera_wan_restart_sst.test index 6fd1d19ab9a..1406ba67386 100644 --- a/mysql-test/suite/galera/t/galera_wan_restart_sst.test +++ b/mysql-test/suite/galera/t/galera_wan_restart_sst.test @@ -92,6 +92,7 @@ INSERT INTO t1 VALUES (34); --sleep 5 --connection node_1 +--source include/wait_until_connected_again.inc INSERT INTO t1 VALUES (31); --connection node_2 From ff76214a46f8f97e1539d11fd9512620f28c2602 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Wed, 12 Aug 2015 05:32:18 -0700 Subject: [PATCH 50/82] Galera MTR Tests: Various test stability fixes (take #3) --- mysql-test/include/wait_condition.inc | 1 + mysql-test/suite/galera/r/galera_as_slave.result | 1 + mysql-test/suite/galera/t/galera_as_slave.test | 3 +++ mysql-test/suite/galera/t/galera_parallel_simple.test | 2 -- 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/mysql-test/include/wait_condition.inc b/mysql-test/include/wait_condition.inc index ac61b76db32..7828256e33a 100644 --- a/mysql-test/include/wait_condition.inc +++ b/mysql-test/include/wait_condition.inc @@ -39,6 +39,7 @@ let $wait_timeout= 0; let $wait_condition_reps= 0; while ($wait_counter) { + --error 0,ER_NO_SUCH_TABLE,ER_LOCK_WAIT_TIMEOUT let $success= `$wait_condition`; inc $wait_condition_reps; if ($success) diff --git a/mysql-test/suite/galera/r/galera_as_slave.result b/mysql-test/suite/galera/r/galera_as_slave.result index 1e86afa35b7..2d7d689aa36 100644 --- a/mysql-test/suite/galera/r/galera_as_slave.result +++ b/mysql-test/suite/galera/r/galera_as_slave.result @@ -12,3 +12,4 @@ COUNT(*) = 3 DROP TABLE t1; STOP SLAVE; RESET SLAVE ALL; +RESET MASTER; diff --git a/mysql-test/suite/galera/t/galera_as_slave.test b/mysql-test/suite/galera/t/galera_as_slave.test index 79b9e5071a3..849b75eadd1 100644 --- a/mysql-test/suite/galera/t/galera_as_slave.test +++ b/mysql-test/suite/galera/t/galera_as_slave.test @@ -45,3 +45,6 @@ DROP TABLE t1; STOP SLAVE; RESET SLAVE ALL; + +--connection node_1 +RESET MASTER; diff --git a/mysql-test/suite/galera/t/galera_parallel_simple.test b/mysql-test/suite/galera/t/galera_parallel_simple.test index 5b2fd6b3479..b1dc14deb5b 100644 --- a/mysql-test/suite/galera/t/galera_parallel_simple.test +++ b/mysql-test/suite/galera/t/galera_parallel_simple.test @@ -37,8 +37,6 @@ INSERT INTO t2 VALUES (1); SELECT COUNT(*) = 10 FROM t1; SELECT COUNT(*) = 10 FROM t2; -SHOW PROCESSLIST; -SELECT COUNT(DISTINCT ID) FROM INFORMATION_SCHEMA.PROCESSLIST; SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'committed%'; --eval SET GLOBAL wsrep_slave_threads = $wsrep_slave_threads_orig; From 7d73931cbcc03e4b6f0939f29be7e998585b555e Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Wed, 12 Aug 2015 06:40:59 -0700 Subject: [PATCH 51/82] Galera MTR Tests: Various test stability fixes (take #4) --- mysql-test/suite/galera/r/galera_parallel_simple.result | 3 --- mysql-test/suite/galera/r/galera_wan_restart_sst.result | 1 + mysql-test/suite/galera/t/galera_wan_restart_sst.test | 3 +++ 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/mysql-test/suite/galera/r/galera_parallel_simple.result b/mysql-test/suite/galera/r/galera_parallel_simple.result index d6743780b2d..294a94baed3 100644 --- a/mysql-test/suite/galera/r/galera_parallel_simple.result +++ b/mysql-test/suite/galera/r/galera_parallel_simple.result @@ -19,9 +19,6 @@ COUNT(*) = 10 SELECT COUNT(*) = 10 FROM t2; COUNT(*) = 10 0 -SELECT COUNT(DISTINCT ID) FROM INFORMATION_SCHEMA.PROCESSLIST; -COUNT(DISTINCT ID) -4 SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'committed%'; COUNT(*) = 2 1 diff --git a/mysql-test/suite/galera/r/galera_wan_restart_sst.result b/mysql-test/suite/galera/r/galera_wan_restart_sst.result index ead4f115b91..15de0fab342 100644 --- a/mysql-test/suite/galera/r/galera_wan_restart_sst.result +++ b/mysql-test/suite/galera/r/galera_wan_restart_sst.result @@ -47,6 +47,7 @@ COUNT(*) = 19 1 DROP TABLE t1; CALL mtr.add_suppression("There are no nodes in the same segment that will ever be able to become donors, yet there is a suitable donor outside"); +CALL mtr.add_suppression("WSREP: gcs_caused\\(\\) returned -1 \\(Operation not permitted\\)"); CALL mtr.add_suppression("Action message in non-primary configuration from member 0"); CALL mtr.add_suppression("There are no nodes in the same segment that will ever be able to become donors, yet there is a suitable donor outside"); CALL mtr.add_suppression("Action message in non-primary configuration from member 0"); diff --git a/mysql-test/suite/galera/t/galera_wan_restart_sst.test b/mysql-test/suite/galera/t/galera_wan_restart_sst.test index 1406ba67386..9b12eeed1ac 100644 --- a/mysql-test/suite/galera/t/galera_wan_restart_sst.test +++ b/mysql-test/suite/galera/t/galera_wan_restart_sst.test @@ -40,6 +40,7 @@ INSERT INTO t1 VALUES (13); --sleep 5 --connection node_1 +--source include/wait_until_connected_again.inc INSERT INTO t1 VALUES (11); --connection node_2 @@ -66,6 +67,7 @@ INSERT INTO t1 VALUES (22); --sleep 5 --connection node_1 +--source include/wait_until_connected_again.inc INSERT INTO t1 VALUES (21); --connection node_3 @@ -134,6 +136,7 @@ SELECT COUNT(*) = 19 FROM t1; --connection node_1 DROP TABLE t1; CALL mtr.add_suppression("There are no nodes in the same segment that will ever be able to become donors, yet there is a suitable donor outside"); +CALL mtr.add_suppression("WSREP: gcs_caused\\(\\) returned -1 \\(Operation not permitted\\)"); --connection node_2 CALL mtr.add_suppression("Action message in non-primary configuration from member 0"); From ee22ac3808101d912a1b110d5613c165bcf1aad7 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Fri, 14 Aug 2015 01:16:25 -0700 Subject: [PATCH 52/82] Galera MTR Tests: Various test stability fixes (take #5) --- mysql-test/include/wait_condition.inc | 2 +- mysql-test/suite/galera/t/galera_split_brain.test | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/include/wait_condition.inc b/mysql-test/include/wait_condition.inc index 7828256e33a..5fbde6950c8 100644 --- a/mysql-test/include/wait_condition.inc +++ b/mysql-test/include/wait_condition.inc @@ -39,7 +39,7 @@ let $wait_timeout= 0; let $wait_condition_reps= 0; while ($wait_counter) { - --error 0,ER_NO_SUCH_TABLE,ER_LOCK_WAIT_TIMEOUT + --error 0,ER_NO_SUCH_TABLE,ER_LOCK_WAIT_TIMEOUT,ER_UNKNOWN_COM_ERROR let $success= `$wait_condition`; inc $wait_condition_reps; if ($success) diff --git a/mysql-test/suite/galera/t/galera_split_brain.test b/mysql-test/suite/galera/t/galera_split_brain.test index c3e779618df..e0298e55422 100644 --- a/mysql-test/suite/galera/t/galera_split_brain.test +++ b/mysql-test/suite/galera/t/galera_split_brain.test @@ -38,7 +38,7 @@ SET GLOBAL wsrep_cluster_address = ''; --let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' --source include/wait_condition.inc ---sleep 5 +--sleep 10 --connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 --source include/wait_until_connected_again.inc From e5b595e9d17485c612bd00784f5846113815dc5c Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Fri, 14 Aug 2015 05:14:53 -0700 Subject: [PATCH 53/82] Galera MTR Tests: fix typo in suite/galera/galera_2nodes_as_slave.cnf --- mysql-test/suite/galera/galera_2nodes_as_slave.cnf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/suite/galera/galera_2nodes_as_slave.cnf b/mysql-test/suite/galera/galera_2nodes_as_slave.cnf index 3822301fc6e..bcfa560b309 100644 --- a/mysql-test/suite/galera/galera_2nodes_as_slave.cnf +++ b/mysql-test/suite/galera/galera_2nodes_as_slave.cnf @@ -57,8 +57,8 @@ NODE_MYSOCK_1= @mysqld.1.socket NODE_MYPORT_2= @mysqld.2.port NODE_MYSOCK_2= @mysqld.2.socket -NODE_MYPORT_3= @mysqld.2.port -NODE_MYSOCK_3= @mysqld.2.socket +NODE_MYPORT_3= @mysqld.3.port +NODE_MYSOCK_3= @mysqld.3.socket NODE_GALERAPORT_2= @mysqld.2.#galera_port NODE_GALERAPORT_3= @mysqld.3.#galera_port From 371dc336ea3210c00d4f37d6b77f9757f7eb2ec9 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Mon, 24 Aug 2015 06:56:30 -0700 Subject: [PATCH 54/82] refs codership/mysql-wsrep#90 MTR test case for mysql-wsrep#90 --- .../suite/galera/r/mysql-wsrep#90.result | 31 +++++++++ mysql-test/suite/galera/t/mysql-wsrep#90.test | 65 +++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 mysql-test/suite/galera/r/mysql-wsrep#90.result create mode 100644 mysql-test/suite/galera/t/mysql-wsrep#90.test diff --git a/mysql-test/suite/galera/r/mysql-wsrep#90.result b/mysql-test/suite/galera/r/mysql-wsrep#90.result new file mode 100644 index 00000000000..da57b9d0068 --- /dev/null +++ b/mysql-test/suite/galera/r/mysql-wsrep#90.result @@ -0,0 +1,31 @@ +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) Engine=InnoDB; +SET GLOBAL wsrep_OSU_method = "RSU"; +SET DEBUG_SYNC = 'alter_table_before_open_tables WAIT_FOR continue'; +ALTER TABLE t1 ADD COLUMN f2 INTEGER;; +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_OSU_method = "TOI"; +SET DEBUG_SYNC= 'now SIGNAL continue'; +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; +COUNT(*) = 2 +1 +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; +COUNT(*) = 2 +1 +DROP TABLE t1; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) Engine=InnoDB; +SET GLOBAL wsrep_OSU_method = "TOI"; +SET DEBUG_SYNC = 'alter_table_before_open_tables WAIT_FOR continue'; +ALTER TABLE t1 ADD COLUMN f2 INTEGER;; +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_OSU_method = "RSU"; +SET DEBUG_SYNC= 'now SIGNAL continue'; +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; +COUNT(*) = 2 +1 +INSERT INTO t1 VALUES (1,2); +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; +COUNT(*) = 2 +1 +INSERT INTO t1 VALUES (3,4); +DROP TABLE t1; +SET GLOBAL WSREP_OSU_METHOD = TOI; diff --git a/mysql-test/suite/galera/t/mysql-wsrep#90.test b/mysql-test/suite/galera/t/mysql-wsrep#90.test new file mode 100644 index 00000000000..5af86fb2872 --- /dev/null +++ b/mysql-test/suite/galera/t/mysql-wsrep#90.test @@ -0,0 +1,65 @@ +# Crash in galera_to_execute_end when wsrep_OSU_method is changed from RSU to TOI during a DDL + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) Engine=InnoDB; + +--connection node_1 +SET GLOBAL wsrep_OSU_method = "RSU"; +SET DEBUG_SYNC = 'alter_table_before_open_tables WAIT_FOR continue'; +--send ALTER TABLE t1 ADD COLUMN f2 INTEGER; + + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +SET SESSION wsrep_sync_wait = 0; +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'debug sync point: alter_table_before_open_tables' +--source include/wait_condition.inc + +SET GLOBAL wsrep_OSU_method = "TOI"; +SET DEBUG_SYNC= 'now SIGNAL continue'; + +--connection node_1 +--reap + +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; + +--connection node_2 +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; + +--connection node_1 +DROP TABLE t1; + + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) Engine=InnoDB; + +--connection node_1 +SET GLOBAL wsrep_OSU_method = "TOI"; +SET DEBUG_SYNC = 'alter_table_before_open_tables WAIT_FOR continue'; +--send ALTER TABLE t1 ADD COLUMN f2 INTEGER; + +--connection node_1a +SET SESSION wsrep_sync_wait = 0; + +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'debug sync point: alter_table_before_open_tables' +--source include/wait_condition.inc + +SET GLOBAL wsrep_OSU_method = "RSU"; +SET DEBUG_SYNC= 'now SIGNAL continue'; + +--connection node_1 +--reap + +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; +INSERT INTO t1 VALUES (1,2); + +--connection node_2 +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; +INSERT INTO t1 VALUES (3,4); + +--connection node_1 +DROP TABLE t1; + +SET GLOBAL WSREP_OSU_METHOD = TOI; From 52c9235e6266089a5a9f98523b678ef6beb07b24 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Tue, 25 Aug 2015 06:15:20 -0700 Subject: [PATCH 55/82] Galera MTR Tests: Add known Galera and mysql-wsrep Valgrind issues to valgrind.supp --- mysql-test/valgrind.supp | 342 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 341 insertions(+), 1 deletion(-) diff --git a/mysql-test/valgrind.supp b/mysql-test/valgrind.supp index 2a80c08863d..09f5514f3b3 100644 --- a/mysql-test/valgrind.supp +++ b/mysql-test/valgrind.supp @@ -1284,7 +1284,298 @@ } { - GitHub codership/galera#306 + GitHub codership/galera#308 + Memcheck:Leak + match-leak-kinds: definite + fun:malloc + fun:_ZNK6galera13ReplicatorSMM9stats_getEv + fun:_ZL28export_wsrep_status_to_mysqlP3THD + fun:_Z17wsrep_show_statusP3THDP17st_mysql_show_varPc + fun:_ZL17show_status_arrayP3THDPKcP17st_mysql_show_var13enum_var_typeP17system_status_varS2_P5TABLEbP4Item + fun:_Z11fill_statusP3THDP10TABLE_LISTP4Item + fun:_ZL13do_fill_tableP3THDP10TABLE_LISTP13st_join_table + fun:_Z24get_schema_tables_resultP4JOIN23enum_schema_table_state + fun:_ZN4JOIN14prepare_resultEPP4ListI4ItemE + fun:_ZN4JOIN4execEv + fun:_ZL20mysql_execute_selectP3THDP13st_select_lexb + fun:_Z12mysql_selectP3THDP10TABLE_LISTjR4ListI4ItemEPS4_P10SQL_I_ListI8st_orderESB_S7_yP13select_resultP18st_select_lex_unitP13st_select_lex + fun:_Z13handle_selectP3THDP13select_resultm + fun:_ZL21execute_sqlcom_selectP3THDP10TABLE_LIST + fun:_Z21mysql_execute_commandP3THD + fun:_Z11mysql_parseP3THDPcjP12Parser_state +} + +{ + GitHub codership/mysql-wsrep#176 + Memcheck:Leak + fun:_Z16wsrep_get_paramsRKN6galera10ReplicatorE + fun:galera_parameters_get + fun:_ZL24refresh_provider_optionsv + fun:_Z29wsrep_provider_options_updateP7sys_varP3THD13enum_var_type + fun:_ZN7sys_var6updateEP3THDP7set_var + fun:_ZN7set_var6updateEP3THD + fun:_Z17sql_set_variablesP3THDP4ListI12set_var_baseE + fun:_Z21mysql_execute_commandP3THD + fun:_Z11mysql_parseP3THDPcjP12Parser_state + fun:_ZL17wsrep_mysql_parseP3THDPcjP12Parser_state + fun:_Z16dispatch_command19enum_server_commandP3THDPcj + fun:_Z10do_commandP3THD + fun:_Z24do_handle_one_connectionP3THD + fun:handle_one_connection +} + +{ + GitHub codership/galera#330 + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + fun:CRYPTO_malloc + fun:sk_new + obj:/usr/lib64/libssl.so.1.0.1e + fun:SSL_COMP_get_compression_methods + fun:SSL_library_init + fun:_ZN4asio3ssl6detail12openssl_initILb1EE7do_initC1Ev + fun:_ZN4asio3ssl6detail12openssl_initILb1EE7do_init8instanceEv + fun:_ZN4asio3ssl6detail12openssl_initILb1EEC1Ev + fun:_Z41__static_initialization_and_destruction_0ii.constprop.120 + fun:call_init.part.0 + fun:_dl_init + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit +} +{ + GitHub codership/galera#330 + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + fun:CRYPTO_malloc + fun:sk_new + obj:/usr/lib64/libssl.so.1.0.1e + fun:SSL_COMP_get_compression_methods + fun:SSL_library_init + fun:_ZN4asio3ssl6detail12openssl_initILb1EE7do_initC1Ev + fun:_ZN4asio3ssl6detail12openssl_initILb1EE7do_init8instanceEv + fun:_ZN4asio3ssl6detail12openssl_initILb1EEC1Ev + fun:_Z41__static_initialization_and_destruction_0ii.constprop.120 + fun:call_init.part.0 + fun:_dl_init + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit +} + +{ + GitHub codership/mysql-wsrep#175 + Memcheck:Leak + match-leak-kinds: reachable + fun:calloc + fun:do_lookup_x + fun:_dl_lookup_symbol_x + fun:_dl_relocate_object + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.2.5 + fun:wsrep_load + fun:_Z10wsrep_initv + fun:_Z18wsrep_init_startupb + fun:_ZL22init_server_componentsv + fun:_Z11mysqld_mainiPPc +} + +{ + galera/mysql-wsrep#147 + Memcheck:Leak + match-leak-kinds: possible + fun:malloc + fun:_ZNK6galera13ReplicatorSMM9stats_getEv + fun:_ZL28export_wsrep_status_to_mysqlP3THD + fun:_Z17wsrep_show_statusP3THDP17st_mysql_show_varPc + fun:_ZL17show_status_arrayP3THDPKcP17st_mysql_show_var13enum_var_typeP17system_status_varS2_P5TABLEbP4Item + fun:_Z11fill_statusP3THDP10TABLE_LISTP4Item + fun:_ZL13do_fill_tableP3THDP10TABLE_LISTP13st_join_table + fun:_Z24get_schema_tables_resultP4JOIN23enum_schema_table_state + fun:_ZN4JOIN14prepare_resultEPP4ListI4ItemE + fun:_ZN4JOIN4execEv + fun:_ZL20mysql_execute_selectP3THDP13st_select_lexb + fun:_Z12mysql_selectP3THDP10TABLE_LISTjR4ListI4ItemEPS4_P10SQL_I_ListI8st_orderESB_S7_yP13select_resultP18st_select_lex_unitP13st_select_lex + fun:_Z13handle_selectP3THDP13select_resultm + fun:_ZL21execute_sqlcom_selectP3THDP10TABLE_LIST + fun:_Z21mysql_execute_commandP3THD + fun:_Z11mysql_parseP3THDPcjP12Parser_state +} + +{ +g codership/mysql-wsrep/issues#176 + Memcheck:Leak + fun:_Z16wsrep_set_paramsRN6galera10ReplicatorEPKc +} + +{ + codership/mysql-wsrep/issues#176 + Memcheck:Leak + fun:_Z16wsrep_get_paramsRKN6galera10ReplicatorE +} + +{ + codership/mysql-wsrep/issues#176 + Memcheck:Leak + fun:_Z16wsrep_get_paramsRKN6galera10ReplicatorE + fun:galera_parameters_get + fun:_ZL24refresh_provider_optionsv + fun:_Z21wsrep_provider_updateP7sys_varP3THD13enum_var_type + fun:_ZN7sys_var6updateEP3THDP7set_var + fun:_ZN7set_var6updateEP3THD + fun:_Z17sql_set_variablesP3THDP4ListI12set_var_baseE + fun:_Z21mysql_execute_commandP3THD + fun:_Z11mysql_parseP3THDPcjP12Parser_state + fun:_ZL17wsrep_mysql_parseP3THDPcjP12Parser_state + fun:_Z16dispatch_command19enum_server_commandP3THDPcj + fun:_Z10do_commandP3THD + fun:_Z24do_handle_one_connectionP3THD + fun:handle_one_connection +} + +{ + codership/mysql-wsrep/issues#176 + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + fun:DbugMalloc + fun:ListParse + fun:_gu_db_push_ + fun:_Z16wsrep_set_paramsRN6galera10ReplicatorEPKc + fun:galera_parameters_set + fun:_Z29wsrep_provider_options_updateP7sys_varP3THD13enum_var_type + fun:_ZN7sys_var6updateEP3THDP7set_var + fun:_ZN7set_var6updateEP3THD + fun:_Z17sql_set_variablesP3THDP4ListI12set_var_baseE + fun:_Z21mysql_execute_commandP3THD + fun:_Z11mysql_parseP3THDPcjP12Parser_state + fun:_ZL17wsrep_mysql_parseP3THDPcjP12Parser_state + fun:_Z16dispatch_command19enum_server_commandP3THDPcj + fun:_Z10do_commandP3THD + fun:_Z24do_handle_one_connectionP3THD +} + +{ + codership/mysql-wsrep/issues#176 + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + fun:state_map_insert + fun:code_state + fun:_gu_db_push_ + fun:_Z16wsrep_set_paramsRN6galera10ReplicatorEPKc + fun:galera_parameters_set + fun:_Z29wsrep_provider_options_updateP7sys_varP3THD13enum_var_type + fun:_ZN7sys_var6updateEP3THDP7set_var + fun:_ZN7set_var6updateEP3THD + fun:_Z17sql_set_variablesP3THDP4ListI12set_var_baseE + fun:_Z21mysql_execute_commandP3THD + fun:_Z11mysql_parseP3THDPcjP12Parser_state + fun:_ZL17wsrep_mysql_parseP3THDPcjP12Parser_state + fun:_Z16dispatch_command19enum_server_commandP3THDPcj + fun:_Z10do_commandP3THD + fun:_Z24do_handle_one_connectionP3THD +} + +{ + codership/mysql-wsrep/issues#176 + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + fun:DbugMalloc + fun:StrDup + fun:ListParse + fun:_gu_db_push_ + fun:_Z16wsrep_set_paramsRN6galera10ReplicatorEPKc + fun:galera_parameters_set + fun:_Z29wsrep_provider_options_updateP7sys_varP3THD13enum_var_type + fun:_ZN7sys_var6updateEP3THDP7set_var + fun:_ZN7set_var6updateEP3THD + fun:_Z17sql_set_variablesP3THDP4ListI12set_var_baseE + fun:_Z21mysql_execute_commandP3THD + fun:_Z11mysql_parseP3THDPcjP12Parser_state + fun:_ZL17wsrep_mysql_parseP3THDPcjP12Parser_state + fun:_Z16dispatch_command19enum_server_commandP3THDPcj + fun:_Z10do_commandP3THD +} + +{ + codership/mysql-wsrep/issues#176 + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + fun:code_state + fun:_gu_db_push_ + fun:_Z16wsrep_set_paramsRN6galera10ReplicatorEPKc + fun:galera_parameters_set + fun:_Z29wsrep_provider_options_updateP7sys_varP3THD13enum_var_type + fun:_ZN7sys_var6updateEP3THDP7set_var + fun:_ZN7set_var6updateEP3THD + fun:_Z17sql_set_variablesP3THDP4ListI12set_var_baseE + fun:_Z21mysql_execute_commandP3THD + fun:_Z11mysql_parseP3THDPcjP12Parser_state + fun:_ZL17wsrep_mysql_parseP3THDPcjP12Parser_state + fun:_Z16dispatch_command19enum_server_commandP3THDPcj + fun:_Z10do_commandP3THD + fun:_Z24do_handle_one_connectionP3THD + fun:handle_one_connection +} + +{ + codership/mysql-wsrep/issues#176 + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + fun:DbugMalloc + fun:PushState + fun:_gu_db_push_ + fun:_Z16wsrep_set_paramsRN6galera10ReplicatorEPKc + fun:galera_parameters_set + fun:_Z29wsrep_provider_options_updateP7sys_varP3THD13enum_var_type + fun:_ZN7sys_var6updateEP3THDP7set_var + fun:_ZN7set_var6updateEP3THD + fun:_Z17sql_set_variablesP3THDP4ListI12set_var_baseE + fun:_Z21mysql_execute_commandP3THD + fun:_Z11mysql_parseP3THDPcjP12Parser_state + fun:_ZL17wsrep_mysql_parseP3THDPcjP12Parser_state + fun:_Z16dispatch_command19enum_server_commandP3THDPcj + fun:_Z10do_commandP3THD + fun:_Z24do_handle_one_connectionP3THD +} + +{ + codership/mysql-wsrep/issues#176 + Memcheck:Leak + match-leak-kinds: possible + fun:malloc + fun:strdup + fun:_Z16wsrep_get_paramsRKN6galera10ReplicatorE + fun:galera_parameters_get + fun:_ZL24refresh_provider_optionsv + fun:_Z29wsrep_provider_options_updateP7sys_varP3THD13enum_var_type + fun:_ZN7sys_var6updateEP3THDP7set_var + fun:_ZN7set_var6updateEP3THD + fun:_Z17sql_set_variablesP3THDP4ListI12set_var_baseE + fun:_Z21mysql_execute_commandP3THD + fun:_Z11mysql_parseP3THDPcjP12Parser_state + fun:_ZL17wsrep_mysql_parseP3THDPcjP12Parser_state + fun:_Z16dispatch_command19enum_server_commandP3THDPcj + fun:_Z10do_commandP3THD + fun:_Z24do_handle_one_connectionP3THD + fun:handle_one_connection +} + +{ + codership/mysql-wsrep/issues#176 Memcheck:Leak match-leak-kinds: definite fun:malloc @@ -1305,3 +1596,52 @@ fun:handle_one_connection } +{ + codership/mysql-wsrep/issues#176 + Memcheck:Leak + match-leak-kinds: definite + fun:malloc + fun:strdup + fun:_Z16wsrep_get_paramsRKN6galera10ReplicatorE + fun:galera_parameters_get + fun:_ZL24refresh_provider_optionsv + fun:_Z21wsrep_provider_updateP7sys_varP3THD13enum_var_type + fun:_ZN7sys_var6updateEP3THDP7set_var + fun:_ZN7set_var6updateEP3THD + fun:_Z17sql_set_variablesP3THDP4ListI12set_var_baseE + fun:_Z21mysql_execute_commandP3THD + fun:_Z11mysql_parseP3THDPcjP12Parser_state + fun:_ZL17wsrep_mysql_parseP3THDPcjP12Parser_state + fun:_Z16dispatch_command19enum_server_commandP3THDPcj + fun:_Z10do_commandP3THD + fun:_Z24do_handle_one_connectionP3THD + fun:handle_one_connection +} + +{ + codership/galera#331 + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + fun:state_map_insert + fun:code_state + fun:_gu_db_keyword_ + fun:_ZN6galera3ist6Sender4sendEll + fun:run_async_sender + fun:start_thread + fun:clone +} + +{ + codership/galera#331 + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + fun:code_state + fun:_gu_db_keyword_ + fun:_ZN6galera3ist6Sender4sendEll + fun:run_async_sender + fun:start_thread + fun:clone +} + From f7885fb6312c1431f1dabf5b92e4afe8cdd7cde2 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Thu, 27 Aug 2015 00:54:26 -0700 Subject: [PATCH 56/82] Correct WSREP_PATCH_VERSION for 5.6 is 11 --- cmake/wsrep.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/wsrep.cmake b/cmake/wsrep.cmake index 7740a4608f6..dbc05301815 100644 --- a/cmake/wsrep.cmake +++ b/cmake/wsrep.cmake @@ -18,7 +18,7 @@ # so WSREP_VERSION is produced regardless # Set the patch version -SET(WSREP_PATCH_VERSION "12") +SET(WSREP_PATCH_VERSION "11") # MariaDB addition: Revision number of the last revision merged from # codership branch visible in @@visible_comment. From b6f8033073f7076b8c2c1dfff04f2844ccf64179 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Mon, 31 Aug 2015 02:15:37 -0700 Subject: [PATCH 57/82] Galera MTR Tests: Tests around do-* and ignore-* binlog options --- .../r/galera_slave_options_do.result | 28 +++++++++++++++ .../r/galera_slave_options_ignore.result | 28 +++++++++++++++ .../t/galera_slave_options_do.cnf | 7 ++++ .../t/galera_slave_options_do.test | 34 +++++++++++++++++++ .../t/galera_slave_options_ignore.cnf | 7 ++++ .../t/galera_slave_options_ignore.test | 34 +++++++++++++++++++ 6 files changed, 138 insertions(+) create mode 100644 mysql-test/suite/galera_3nodes/r/galera_slave_options_do.result create mode 100644 mysql-test/suite/galera_3nodes/r/galera_slave_options_ignore.result create mode 100644 mysql-test/suite/galera_3nodes/t/galera_slave_options_do.cnf create mode 100644 mysql-test/suite/galera_3nodes/t/galera_slave_options_do.test create mode 100644 mysql-test/suite/galera_3nodes/t/galera_slave_options_ignore.cnf create mode 100644 mysql-test/suite/galera_3nodes/t/galera_slave_options_ignore.test diff --git a/mysql-test/suite/galera_3nodes/r/galera_slave_options_do.result b/mysql-test/suite/galera_3nodes/r/galera_slave_options_do.result new file mode 100644 index 00000000000..7185e92863d --- /dev/null +++ b/mysql-test/suite/galera_3nodes/r/galera_slave_options_do.result @@ -0,0 +1,28 @@ +CREATE DATABASE db1; +CREATE DATABASE db2; +CREATE TABLE db1.t1 (f1 INTEGER) ENGINE=InnoDB; +CREATE TABLE db2.t2A (f1 INTEGER) ENGINE=InnoDB; +CREATE TABLE db2.t2B (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO db1.t1 VALUES (1); +INSERT INTO db2.t2A VALUES (2); +INSERT INTO db2.t2B VALUES (3); +SELECT COUNT(*) = 0 FROM db1.t1; +COUNT(*) = 0 +1 +SELECT COUNT(*) = 0 FROM db2.t2A; +COUNT(*) = 0 +1 +SELECT COUNT(*) = 1 FROM db2.t2B; +COUNT(*) = 1 +1 +SELECT COUNT(*) = 0 FROM db1.t1; +COUNT(*) = 0 +1 +SELECT COUNT(*) = 1 FROM db2.t2A; +COUNT(*) = 1 +1 +SELECT COUNT(*) = 1 FROM db2.t2B; +COUNT(*) = 1 +1 +DROP SCHEMA db1; +DROP SCHEMA db2; diff --git a/mysql-test/suite/galera_3nodes/r/galera_slave_options_ignore.result b/mysql-test/suite/galera_3nodes/r/galera_slave_options_ignore.result new file mode 100644 index 00000000000..7185e92863d --- /dev/null +++ b/mysql-test/suite/galera_3nodes/r/galera_slave_options_ignore.result @@ -0,0 +1,28 @@ +CREATE DATABASE db1; +CREATE DATABASE db2; +CREATE TABLE db1.t1 (f1 INTEGER) ENGINE=InnoDB; +CREATE TABLE db2.t2A (f1 INTEGER) ENGINE=InnoDB; +CREATE TABLE db2.t2B (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO db1.t1 VALUES (1); +INSERT INTO db2.t2A VALUES (2); +INSERT INTO db2.t2B VALUES (3); +SELECT COUNT(*) = 0 FROM db1.t1; +COUNT(*) = 0 +1 +SELECT COUNT(*) = 0 FROM db2.t2A; +COUNT(*) = 0 +1 +SELECT COUNT(*) = 1 FROM db2.t2B; +COUNT(*) = 1 +1 +SELECT COUNT(*) = 0 FROM db1.t1; +COUNT(*) = 0 +1 +SELECT COUNT(*) = 1 FROM db2.t2A; +COUNT(*) = 1 +1 +SELECT COUNT(*) = 1 FROM db2.t2B; +COUNT(*) = 1 +1 +DROP SCHEMA db1; +DROP SCHEMA db2; diff --git a/mysql-test/suite/galera_3nodes/t/galera_slave_options_do.cnf b/mysql-test/suite/galera_3nodes/t/galera_slave_options_do.cnf new file mode 100644 index 00000000000..1ebde6186c1 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_slave_options_do.cnf @@ -0,0 +1,7 @@ +!include ../galera_3nodes.cnf + +[mysqld.1] +binlog-do-db=db2 + +[mysqld.2] +replicate-wild-do-table=db2.t2B diff --git a/mysql-test/suite/galera_3nodes/t/galera_slave_options_do.test b/mysql-test/suite/galera_3nodes/t/galera_slave_options_do.test new file mode 100644 index 00000000000..1437c90c670 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_slave_options_do.test @@ -0,0 +1,34 @@ +# +# This tests checks the operation of binlog-do-db , replicate-wild-do-table +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +CREATE DATABASE db1; +CREATE DATABASE db2; + +CREATE TABLE db1.t1 (f1 INTEGER) ENGINE=InnoDB; +CREATE TABLE db2.t2A (f1 INTEGER) ENGINE=InnoDB; +CREATE TABLE db2.t2B (f1 INTEGER) ENGINE=InnoDB; + +INSERT INTO db1.t1 VALUES (1); +INSERT INTO db2.t2A VALUES (2); +INSERT INTO db2.t2B VALUES (3); + +--connection node_2 +SELECT COUNT(*) = 0 FROM db1.t1; +SELECT COUNT(*) = 0 FROM db2.t2A; +SELECT COUNT(*) = 1 FROM db2.t2B; + + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connection node_3 +SELECT COUNT(*) = 0 FROM db1.t1; +SELECT COUNT(*) = 1 FROM db2.t2A; +SELECT COUNT(*) = 1 FROM db2.t2B; + +--connection node_1 +DROP SCHEMA db1; +DROP SCHEMA db2; diff --git a/mysql-test/suite/galera_3nodes/t/galera_slave_options_ignore.cnf b/mysql-test/suite/galera_3nodes/t/galera_slave_options_ignore.cnf new file mode 100644 index 00000000000..9b78d47e254 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_slave_options_ignore.cnf @@ -0,0 +1,7 @@ +!include ../galera_3nodes.cnf + +[mysqld.1] +binlog-ignore-db=db1 + +[mysqld.2] +replicate-wild-ignore-table=db2.t2A diff --git a/mysql-test/suite/galera_3nodes/t/galera_slave_options_ignore.test b/mysql-test/suite/galera_3nodes/t/galera_slave_options_ignore.test new file mode 100644 index 00000000000..3e8b1557e7b --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_slave_options_ignore.test @@ -0,0 +1,34 @@ +# +# This tests checks the operation of binlog-ignore-db , replicate-wild-ignore-table +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +CREATE DATABASE db1; +CREATE DATABASE db2; + +CREATE TABLE db1.t1 (f1 INTEGER) ENGINE=InnoDB; +CREATE TABLE db2.t2A (f1 INTEGER) ENGINE=InnoDB; +CREATE TABLE db2.t2B (f1 INTEGER) ENGINE=InnoDB; + +INSERT INTO db1.t1 VALUES (1); +INSERT INTO db2.t2A VALUES (2); +INSERT INTO db2.t2B VALUES (3); + +--connection node_2 +SELECT COUNT(*) = 0 FROM db1.t1; +SELECT COUNT(*) = 0 FROM db2.t2A; +SELECT COUNT(*) = 1 FROM db2.t2B; + + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connection node_3 +SELECT COUNT(*) = 0 FROM db1.t1; +SELECT COUNT(*) = 1 FROM db2.t2A; +SELECT COUNT(*) = 1 FROM db2.t2B; + +--connection node_1 +DROP SCHEMA db1; +DROP SCHEMA db2; From 25bbfe883975f6d14b620a149a636542dff894a0 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Mon, 31 Aug 2015 02:16:43 -0700 Subject: [PATCH 58/82] Galera MTR Tests: Instruct xtrabackup SST's socat to use 1024-bit DH keys to avoid 'error:14082174:SSL routines:SSL3_CHECK_CERT_AND_ALGORITHM:dh key too small' --- mysql-test/std_data/galera-cert.pem | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mysql-test/std_data/galera-cert.pem b/mysql-test/std_data/galera-cert.pem index 3b48002f47a..2996b330cc0 100644 --- a/mysql-test/std_data/galera-cert.pem +++ b/mysql-test/std_data/galera-cert.pem @@ -18,3 +18,9 @@ wpjhYxVxGFOx1ITN3jED64lUfoLHvR6NFbESYKAuAAzSNqX4HOQ3uGk2THM8JocZ oH2+38d81Kd4HQ7DDDKS/isG0+rR60Ti1cMgu7OT7p1dZCwT/KQuI5eGjE9lubkc yAJjaod4rVLdBri3XVvtySfS2+/75qUgv2TF7d/s7mxMq4DDt29yeKSUhZCs -----END CERTIFICATE----- +-----BEGIN DH PARAMETERS----- +MIGHAoGBAJWyvKjE+s7OP4Lj1jXKGlJGWT4Vd5YaxPljihTsRe1aXkWAgsuwISXk +/TQ8Rx5Zmze7rtwtU0PoYxvuam9FMXYqhw2dVe4qRdeSX78DSiL/YBkQzaxlfWVy +RE9+9dzHbCtRVDlN7K1kA+mGWH4/r7NAu4Qm/003V0NTtMwQSqebAgEC +-----END DH PARAMETERS----- + From c915d8caa6980001f5a2ee92dfb8db81bd6d40d8 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Tue, 1 Sep 2015 00:57:20 -0700 Subject: [PATCH 59/82] Galera MTR Tests: attempt to work around codership/mysql-wsrep#179 --- .../suite/galera/t/galera_as_slave_replication_bundle.test | 1 + 1 file changed, 1 insertion(+) diff --git a/mysql-test/suite/galera/t/galera_as_slave_replication_bundle.test b/mysql-test/suite/galera/t/galera_as_slave_replication_bundle.test index f873294143e..df1d72f38c7 100644 --- a/mysql-test/suite/galera/t/galera_as_slave_replication_bundle.test +++ b/mysql-test/suite/galera/t/galera_as_slave_replication_bundle.test @@ -41,6 +41,7 @@ SELECT COUNT(*) = 4 FROM t1; DROP TABLE t1; --connection node_2 +--sleep 1 --let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; --source include/wait_condition.inc From 2012a810ab07e0e283fef6736a13c57b4b0cedf0 Mon Sep 17 00:00:00 2001 From: Nirbhay Choubey Date: Thu, 10 Sep 2015 00:14:24 -0400 Subject: [PATCH 60/82] refs codership/mysql-wsrep#181 - Galera related errors in mysql slave applying will now cause slave to abort --- sql/slave.cc | 79 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 59 insertions(+), 20 deletions(-) diff --git a/sql/slave.cc b/sql/slave.cc index 0a5e0943a31..6921e580972 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -3291,6 +3291,15 @@ int apply_event_and_update_pos(Log_event* ev, THD* thd, if (reason == Log_event::EVENT_SKIP_NOT) exec_res= ev->apply_event(rgi); +#ifdef WITH_WSREP + if (exec_res && thd->wsrep_conflict_state != NO_CONFLICT) + { + WSREP_DEBUG("SQL apply failed, res %d conflict state: %d", + exec_res, thd->wsrep_conflict_state); + rli->abort_slave= 1; + } +#endif + #ifndef DBUG_OFF /* This only prints information to the debug trace. @@ -3609,6 +3618,10 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli, serial_rgi->event_relay_log_pos= rli->event_relay_log_pos; exec_res= apply_event_and_update_pos(ev, thd, serial_rgi, NULL); +#ifdef WITH_WSREP + WSREP_DEBUG("apply_event_and_update_pos() result: %d", exec_res); +#endif /* WITH_WSREP */ + delete_or_keep_event_post_apply(serial_rgi, typ, ev); /* @@ -3618,6 +3631,12 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli, if (exec_res == 2) DBUG_RETURN(1); +#ifdef WITH_WSREP + mysql_mutex_lock(&thd->LOCK_wsrep_thd); + if (thd->wsrep_conflict_state == NO_CONFLICT) + { + mysql_mutex_unlock(&thd->LOCK_wsrep_thd); +#endif /* WITH_WSREP */ if (slave_trans_retries) { int temp_err; @@ -3691,6 +3710,12 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli, serial_rgi->trans_retries)); } } +#ifdef WITH_WSREP + } else { + mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + } +#endif /* WITH_WSREP */ + thread_safe_increment64(&rli->executed_entries, &slave_executed_entries_lock); DBUG_RETURN(exec_res); @@ -4711,6 +4736,14 @@ log '%s' at position %s, relay log '%s' position: %s%s", RPL_LOG_NAME, if (exec_relay_log_event(thd, rli, serial_rgi)) { +#ifdef WITH_WSREP + if (thd->wsrep_conflict_state != NO_CONFLICT) + { + wsrep_node_dropped= TRUE; + rli->abort_slave= TRUE; + } +#endif /* WITH_WSREP */ + DBUG_PRINT("info", ("exec_relay_log_event() failed")); // do not scare the user if SQL thread was simply killed or stopped if (!sql_slave_killed(serial_rgi)) @@ -4720,8 +4753,8 @@ log '%s' at position %s, relay log '%s' position: %s%s", RPL_LOG_NAME, uint32 const last_errno= rli->last_error().number; if (WSREP_ON && last_errno == ER_UNKNOWN_COM_ERROR) { - wsrep_node_dropped= TRUE; - } + wsrep_node_dropped= TRUE; + } #endif /* WITH_WSREP */ } goto err; @@ -4849,27 +4882,33 @@ err_during_init: thd->rgi_fake= thd->rgi_slave= NULL; delete serial_rgi; mysql_mutex_unlock(&LOCK_thread_count); + #ifdef WITH_WSREP - /* if slave stopped due to node going non primary, we set global flag to - trigger automatic restart of slave when node joins back to cluster + /* + If slave stopped due to node going non primary, we set global flag to + trigger automatic restart of slave when node joins back to cluster. */ - if (wsrep_node_dropped && wsrep_restart_slave) - { - if (wsrep_ready) - { - WSREP_INFO("Slave error due to node temporarily non-primary" - "SQL slave will continue"); - wsrep_node_dropped= FALSE; - mysql_mutex_unlock(&rli->run_lock); - goto wsrep_restart_point; - } else { - WSREP_INFO("Slave error due to node going non-primary"); - WSREP_INFO("wsrep_restart_slave was set and therefore slave will be " - "automatically restarted when node joins back to cluster"); - wsrep_restart_slave_activated= TRUE; - } - } + if (wsrep_node_dropped && wsrep_restart_slave) + { + if (wsrep_ready) + { + WSREP_INFO("Slave error due to node temporarily non-primary" + "SQL slave will continue"); + wsrep_node_dropped= FALSE; + mysql_mutex_unlock(&rli->run_lock); + WSREP_DEBUG("wsrep_conflict_state now: %d", thd->wsrep_conflict_state); + WSREP_INFO("slave restart: %d", thd->wsrep_conflict_state); + thd->wsrep_conflict_state= NO_CONFLICT; + goto wsrep_restart_point; + } else { + WSREP_INFO("Slave error due to node going non-primary"); + WSREP_INFO("wsrep_restart_slave was set and therefore slave will be " + "automatically restarted when node joins back to cluster."); + wsrep_restart_slave_activated= TRUE; + } + } #endif /* WITH_WSREP */ + /* Note: the order of the broadcast and unlock calls below (first broadcast, then unlock) is important. Otherwise a killer_thread can execute between the calls and From db66d2f92d029212265f0bbc3dd2076189ebdf3d Mon Sep 17 00:00:00 2001 From: Nirbhay Choubey Date: Thu, 10 Sep 2015 00:20:49 -0400 Subject: [PATCH 61/82] refs codership/mysql-wsrep#188 - setting error code for slave, if mysql slave node dropped from cluster --- sql/slave.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sql/slave.cc b/sql/slave.cc index 6921e580972..2db78d2532d 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -3297,6 +3297,8 @@ int apply_event_and_update_pos(Log_event* ev, THD* thd, WSREP_DEBUG("SQL apply failed, res %d conflict state: %d", exec_res, thd->wsrep_conflict_state); rli->abort_slave= 1; + rli->report(ERROR_LEVEL, ER_UNKNOWN_COM_ERROR, rgi->gtid_info(), + "Node has dropped from cluster"); } #endif From b3ec0a85893365bbd9051fa1bb27d14a50f755af Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Tue, 8 Sep 2015 05:04:47 -0700 Subject: [PATCH 62/82] Galera MTR Tests: a test for async slave + non-prim --- .../suite/galera/galera_3nodes_as_slave.cnf | 91 ++++++++++++++++++ .../galera/r/galera_as_slave_nonprim.result | 20 ++++ .../galera/t/galera_as_slave_nonprim.cnf | 1 + .../galera/t/galera_as_slave_nonprim.test | 96 +++++++++++++++++++ 4 files changed, 208 insertions(+) create mode 100644 mysql-test/suite/galera/galera_3nodes_as_slave.cnf create mode 100644 mysql-test/suite/galera/r/galera_as_slave_nonprim.result create mode 100644 mysql-test/suite/galera/t/galera_as_slave_nonprim.cnf create mode 100644 mysql-test/suite/galera/t/galera_as_slave_nonprim.test diff --git a/mysql-test/suite/galera/galera_3nodes_as_slave.cnf b/mysql-test/suite/galera/galera_3nodes_as_slave.cnf new file mode 100644 index 00000000000..a566d3e3f6f --- /dev/null +++ b/mysql-test/suite/galera/galera_3nodes_as_slave.cnf @@ -0,0 +1,91 @@ +# +# This .cnf file creates a setup with 1 standard MySQL server, followed by a 2-node Galera cluster +# + +# Use default setting for mysqld processes +!include include/default_mysqld.cnf + +[mysqld] +log-slave-updates +log-bin=mysqld-bin +binlog-format=row + +[mysqld.1] +server-id=1 + +[mysqld.2] +server-id=2 + +wsrep_provider=@ENV.WSREP_PROVIDER +wsrep_cluster_address='gcomm://' +wsrep_provider_options='base_port=@mysqld.2.#galera_port;evs.install_timeout = PT15S; evs.max_install_timeouts=1;' + +# enforce read-committed characteristics across the cluster +wsrep_causal_reads=ON +wsrep_sync_wait = 7 + +wsrep_node_address=127.0.0.1 +wsrep_sst_receive_address=127.0.0.2:@mysqld.2.#sst_port +wsrep_node_incoming_address=127.0.0.1:@mysqld.2.port + +# Required for Galera +innodb_autoinc_lock_mode=2 + +innodb_flush_log_at_trx_commit=2 + +[mysqld.3] +wsrep_provider=@ENV.WSREP_PROVIDER +wsrep_cluster_address='gcomm://127.0.0.1:@mysqld.2.#galera_port' +wsrep_provider_options='base_port=@mysqld.3.#galera_port;evs.install_timeout = PT15S; evs.max_install_timeouts = 1;' + +# enforce read-committed characteristics across the cluster +wsrep_causal_reads=ON +wsrep_sync_wait = 7 + +wsrep_node_address=127.0.0.1 +wsrep_sst_receive_address=127.0.0.2:@mysqld.3.#sst_port +wsrep_node_incoming_address=127.0.0.1:@mysqld.3.port + +# Required for Galera +innodb_autoinc_lock_mode=2 + +innodb_flush_log_at_trx_commit=2 + +[mysqld.4] +wsrep_provider=@ENV.WSREP_PROVIDER +wsrep_cluster_address='gcomm://127.0.0.1:@mysqld.2.#galera_port' +wsrep_provider_options='base_port=@mysqld.4.#galera_port;evs.install_timeout = PT15S; evs.max_install_timeouts = 1;' + +# enforce read-committed characteristics across the cluster +wsrep_causal_reads=ON +wsrep_sync_wait = 7 + +wsrep_node_address=192.168.95.128 +wsrep_sst_receive_address=192.168.95.128:@mysqld.4.#sst_port +wsrep_node_incoming_address=192.168.95.128:@mysqld.4.port + +# Required for Galera +innodb_autoinc_lock_mode=2 + +innodb_flush_log_at_trx_commit=2 + +[ENV] +NODE_MYPORT_1= @mysqld.1.port +NODE_MYSOCK_1= @mysqld.1.socket + +NODE_MYPORT_2= @mysqld.2.port +NODE_MYSOCK_2= @mysqld.2.socket + +NODE_MYPORT_3= @mysqld.3.port +NODE_MYSOCK_3= @mysqld.3.socket + +NODE_MYPORT_3= @mysqld.4.port +NODE_MYSOCK_3= @mysqld.4.socket + +NODE_GALERAPORT_2= @mysqld.2.#galera_port +NODE_GALERAPORT_3= @mysqld.3.#galera_port +NODE_GALERAPORT_4= @mysqld.4.#galera_port + +NODE_SSTPORT_2= @mysqld.2.#sst_port +NODE_SSTPORT_3= @mysqld.3.#sst_port +NODE_SSTPORT_4= @mysqld.4.#sst_port diff --git a/mysql-test/suite/galera/r/galera_as_slave_nonprim.result b/mysql-test/suite/galera/r/galera_as_slave_nonprim.result new file mode 100644 index 00000000000..ded3caecf89 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_as_slave_nonprim.result @@ -0,0 +1,20 @@ +START SLAVE USER='root'; +Warnings: +Note 1759 Sending passwords in plain text without SSL/TLS is extremely insecure. +SET SESSION wsrep_sync_wait = 0; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; +INSERT INTO t1 VALUES (1),(2),(3),(4),(5); +expected_error +1 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0'; +START SLAVE; +DROP TABLE t1; +STOP SLAVE; +RESET SLAVE ALL; +CALL mtr.add_suppression("Slave SQL: Error 'Unknown command' on query"); +CALL mtr.add_suppression("Slave: Unknown command Error_code: 1047"); +CALL mtr.add_suppression("Send action {\\(nil\\), 328, TORDERED} returned -107 \\(Transport endpoint is not connected\\)"); +CALL mtr.add_suppression("Slave SQL: Error in Xid_log_event: Commit could not be completed, 'Deadlock found when trying to get lock; try restarting transaction', Error_code: 1213"); +CALL mtr.add_suppression("Slave SQL: Node has dropped from cluster, Error_code: 1047"); +RESET MASTER; diff --git a/mysql-test/suite/galera/t/galera_as_slave_nonprim.cnf b/mysql-test/suite/galera/t/galera_as_slave_nonprim.cnf new file mode 100644 index 00000000000..5a44e5664b5 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave_nonprim.cnf @@ -0,0 +1 @@ +!include ../galera_3nodes_as_slave.cnf diff --git a/mysql-test/suite/galera/t/galera_as_slave_nonprim.test b/mysql-test/suite/galera/t/galera_as_slave_nonprim.test new file mode 100644 index 00000000000..5c53ff79cc1 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave_nonprim.test @@ -0,0 +1,96 @@ +# +# Test the behavior of a Galera async slave if it goes non-prim. Async replication +# should abort with an error but it should be possible to restart it. +# +# The galera/galera_2node_slave.cnf describes the setup of the nodes +# + +--source include/have_innodb.inc +--source include/have_log_bin.inc +--source include/big_test.inc + +# Step #1. Establish replication +# +# As node #1 is not a Galera node, we connect to node #2 in order to run include/galera_cluster.inc +# +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--source include/galera_cluster.inc + +--connection node_2 +--disable_query_log +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=$NODE_MYPORT_1; +--enable_query_log +START SLAVE USER='root'; +SET SESSION wsrep_sync_wait = 0; + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +# Step #2. Force async slave to go non-primary + +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connection node_3 +--source include/wait_until_connected_again.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +# Step #3. Force async replication to fail by creating a replication event while the slave is non-prim + +--connection node_1 +INSERT INTO t1 VALUES (1),(2),(3),(4),(5); + +--connection node_2 +--sleep 5 + +--let $value = query_get_value(SHOW SLAVE STATUS, Last_SQL_Error, 1) +--connection node_3 +--disable_query_log +--eval SELECT "$value" IN ("Error 'Unknown command' on query. Default database: 'test'. Query: 'BEGIN'", "Node has dropped from cluster") AS expected_error +--enable_query_log + +# Step #4. Bring back the async slave and restart replication +--connection node_2 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0'; + +--connection node_3 +--source include/wait_until_connected_again.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +--connection node_2 +--source include/galera_wait_ready.inc +--source include/wait_until_connected_again.inc + +START SLAVE; + +# Confirm that the replication events have arrived + +--let $wait_condition = SELECT COUNT(*) = 5 FROM t1; +--source include/wait_condition.inc + +--connection node_1 +DROP TABLE t1; + +--sleep 2 +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +STOP SLAVE; +RESET SLAVE ALL; + +CALL mtr.add_suppression("Slave SQL: Error 'Unknown command' on query"); +CALL mtr.add_suppression("Slave: Unknown command Error_code: 1047"); +CALL mtr.add_suppression("Send action {\\(nil\\), 328, TORDERED} returned -107 \\(Transport endpoint is not connected\\)"); +CALL mtr.add_suppression("Slave SQL: Error in Xid_log_event: Commit could not be completed, 'Deadlock found when trying to get lock; try restarting transaction', Error_code: 1213"); +CALL mtr.add_suppression("Slave SQL: Node has dropped from cluster, Error_code: 1047"); + + +--connection node_1 +RESET MASTER; From f9510717a4a9c00d24b91edbe6d358f9e4665058 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Tue, 8 Sep 2015 22:11:56 -0700 Subject: [PATCH 63/82] Galera MTR Tests: fix typo in the galera_as_slave_nonprim test, in suite/galera/galera_3nodes_as_slave.cnf --- mysql-test/suite/galera/galera_3nodes_as_slave.cnf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mysql-test/suite/galera/galera_3nodes_as_slave.cnf b/mysql-test/suite/galera/galera_3nodes_as_slave.cnf index a566d3e3f6f..4f3fdb02045 100644 --- a/mysql-test/suite/galera/galera_3nodes_as_slave.cnf +++ b/mysql-test/suite/galera/galera_3nodes_as_slave.cnf @@ -60,9 +60,9 @@ wsrep_provider_options='base_port=@mysqld.4.#galera_port;evs.install_timeout = P wsrep_causal_reads=ON wsrep_sync_wait = 7 -wsrep_node_address=192.168.95.128 -wsrep_sst_receive_address=192.168.95.128:@mysqld.4.#sst_port -wsrep_node_incoming_address=192.168.95.128:@mysqld.4.port +wsrep_node_address=127.0.0.1 +wsrep_sst_receive_address=127.0.0.2:@mysqld.4.#sst_port +wsrep_node_incoming_address=127.0.0.1:@mysqld.4.port # Required for Galera innodb_autoinc_lock_mode=2 From f479b5a16e0bb32d628e46e417d1d84e0a6a4e79 Mon Sep 17 00:00:00 2001 From: Nirbhay Choubey Date: Thu, 10 Sep 2015 00:29:06 -0400 Subject: [PATCH 64/82] Update WSREP_PATCH_REVNO --- cmake/wsrep.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/wsrep.cmake b/cmake/wsrep.cmake index dbc05301815..ac2acb73313 100644 --- a/cmake/wsrep.cmake +++ b/cmake/wsrep.cmake @@ -22,8 +22,8 @@ SET(WSREP_PATCH_VERSION "11") # MariaDB addition: Revision number of the last revision merged from # codership branch visible in @@visible_comment. -# Branch : https://github.com/codership/mysql-wsrep/tree/5.5 -SET(WSREP_PATCH_REVNO "4f81026") # Should be updated on every merge. +# Branch : https://github.com/codership/mysql-wsrep/tree/5.6 +SET(WSREP_PATCH_REVNO "21a2415") # Should be updated on every merge. # MariaDB: Obtain patch revision number: # Update WSREP_PATCH_REVNO if WSREP_REV environment variable is set. From ceac34404b9cbb32886781986acedc2af0de7f25 Mon Sep 17 00:00:00 2001 From: Nirbhay Choubey Date: Thu, 10 Sep 2015 09:57:08 -0400 Subject: [PATCH 65/82] lp:1372840 - test case --- .../suite/galera/r/galera_var_slave_threads.result | 8 ++++++++ .../suite/galera/t/galera_var_slave_threads.test | 14 ++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/mysql-test/suite/galera/r/galera_var_slave_threads.result b/mysql-test/suite/galera/r/galera_var_slave_threads.result index 6b84f03737b..603dfaeacc7 100644 --- a/mysql-test/suite/galera/r/galera_var_slave_threads.result +++ b/mysql-test/suite/galera/r/galera_var_slave_threads.result @@ -104,3 +104,11 @@ COUNT(*) = 1 SET GLOBAL wsrep_slave_threads = 1; DROP TABLE t1; DROP TABLE t2; +# +# lp:1372840 - Changing wsrep_slave_threads causes future connections to hang +# +CREATE TABLE t1 (i INT AUTO_INCREMENT PRIMARY KEY) ENGINE=INNODB; +SET GLOBAL wsrep_slave_threads = 4; +SET GLOBAL wsrep_slave_threads = 1; +DROP TABLE t1; +# End of tests diff --git a/mysql-test/suite/galera/t/galera_var_slave_threads.test b/mysql-test/suite/galera/t/galera_var_slave_threads.test index a83924c13ce..50e22fbef66 100644 --- a/mysql-test/suite/galera/t/galera_var_slave_threads.test +++ b/mysql-test/suite/galera/t/galera_var_slave_threads.test @@ -68,3 +68,17 @@ SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system use DROP TABLE t1; DROP TABLE t2; + +--echo # +--echo # lp:1372840 - Changing wsrep_slave_threads causes future connections to hang +--echo # + +--connection node_1 +CREATE TABLE t1 (i INT AUTO_INCREMENT PRIMARY KEY) ENGINE=INNODB; + +--connection node_2 +SET GLOBAL wsrep_slave_threads = 4; +SET GLOBAL wsrep_slave_threads = 1; +DROP TABLE t1; + +--echo # End of tests From a401c11c4e0c8cb7223a1f53366083e843afc9bd Mon Sep 17 00:00:00 2001 From: Nirbhay Choubey Date: Mon, 14 Sep 2015 15:26:50 -0400 Subject: [PATCH 66/82] Fix failing test cases * Also modified name regex to include '#' as a valid symbol for tests under disabled.def. --- mysql-test/lib/mtr_cases.pm | 2 +- mysql-test/suite/galera/disabled.def | 6 ++++++ mysql-test/suite/galera/galera_2nodes_as_slave.cnf | 6 ++++++ .../suite/galera/r/galera_prepared_statement.result | 2 +- .../galera/t/galera_as_slave_replication_bundle.test | 5 ++--- mysql-test/suite/galera/t/galera_prepared_statement.test | 1 + mysql-test/suite/galera/t/galera_restart_nochanges.test | 2 +- mysql-test/suite/galera/t/galera_var_log_bin.cnf | 8 ++------ mysql-test/suite/galera/t/galera_var_log_bin.test | 2 +- mysql-test/suite/galera_3nodes/disabled.def | 3 +++ .../suite/galera_3nodes/r/galera_certification_ccc.result | 3 --- mysql-test/suite/galera_3nodes/suite.pm | 1 + 12 files changed, 25 insertions(+), 16 deletions(-) diff --git a/mysql-test/lib/mtr_cases.pm b/mysql-test/lib/mtr_cases.pm index b95fcb3825c..23ae5988465 100644 --- a/mysql-test/lib/mtr_cases.pm +++ b/mysql-test/lib/mtr_cases.pm @@ -321,7 +321,7 @@ sub parse_disabled { chomp; next if /^\s*#/ or /^\s*$/; mtr_error("Syntax error in $filename line $.") - unless /^\s*(?:([-0-9A-Za-z_\/]+)\.)?([-0-9A-Za-z_]+)\s*:\s*(.*?)\s*$/; + unless /^\s*(?:([-0-9A-Za-z_\/]+)\.)?([-0-9A-Za-z_#]+)\s*:\s*(.*?)\s*$/; mtr_error("Wrong suite name in $filename line $.") if defined $1 and defined $suitename and $1 ne $suitename; $disabled{($1 || $suitename || '') . ".$2"} = $3; diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index 9c38c1296fe..80aad7d4ff3 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -19,3 +19,9 @@ galera_var_auto_inc_control_on : Failing sporadically with content mismatch galera_parallel_simple : Failing sporadically galera_bf_abort : Failing sporadically galera_log_output_csv : Failing sporadically +galera_as_slave_preordered : wsrep-preordered is not available in MariaDB Galera cluster +galera_forced_binlog_format : TODO: investigate +galera_gra_log : TODO: investigate +galera_as_slave_replication_bundle : TODO: investigate +galera_ssl_upgrade : TODO: investigate +mysql-wsrep#90 : TODO: investigate diff --git a/mysql-test/suite/galera/galera_2nodes_as_slave.cnf b/mysql-test/suite/galera/galera_2nodes_as_slave.cnf index bcfa560b309..2a4b18da5f8 100644 --- a/mysql-test/suite/galera/galera_2nodes_as_slave.cnf +++ b/mysql-test/suite/galera/galera_2nodes_as_slave.cnf @@ -17,6 +17,9 @@ server-id=1 #ist_port=@OPT.port #sst_port=@OPT.port +log-bin +log-slave-updates + innodb-autoinc-lock-mode=2 default-storage-engine=innodb wsrep-provider=@ENV.WSREP_PROVIDER @@ -36,6 +39,9 @@ server-id=2 #ist_port=@OPT.port #sst_port=@OPT.port +log-bin +log-slave-updates + innodb-autoinc-lock-mode=2 default-storage-engine=innodb wsrep-provider=@ENV.WSREP_PROVIDER diff --git a/mysql-test/suite/galera/r/galera_prepared_statement.result b/mysql-test/suite/galera/r/galera_prepared_statement.result index 138d4431e3d..de5ac9c760a 100644 --- a/mysql-test/suite/galera/r/galera_prepared_statement.result +++ b/mysql-test/suite/galera/r/galera_prepared_statement.result @@ -26,7 +26,7 @@ COUNT(*) = 1 ALTER TABLE t1 ADD COLUMN f2 INTEGER; ALTER TABLE t1 DROP COLUMN f1; EXECUTE st1; -ERROR HY000: Incorrect integer value: 'abc' for column 'f2' at row 1 +ERROR 22007: Incorrect integer value: 'abc' for column 'f2' at row 1 DROP TABLE t1; DROP TABLE t2; DROP TABLE t3; diff --git a/mysql-test/suite/galera/t/galera_as_slave_replication_bundle.test b/mysql-test/suite/galera/t/galera_as_slave_replication_bundle.test index df1d72f38c7..460e040c010 100644 --- a/mysql-test/suite/galera/t/galera_as_slave_replication_bundle.test +++ b/mysql-test/suite/galera/t/galera_as_slave_replication_bundle.test @@ -5,7 +5,6 @@ # --source include/have_innodb.inc ---source include/have_log_bin.inc # As node #1 is not a Galera node, we connect to node #2 in order to run include/galera_cluster.inc --connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 @@ -13,9 +12,9 @@ --connection node_2 --disable_query_log ---eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=$NODE_MYPORT_1; +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$NODE_MYPORT_1; --enable_query_log -START SLAVE USER='root'; +START SLAVE; --connection node_1 CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; diff --git a/mysql-test/suite/galera/t/galera_prepared_statement.test b/mysql-test/suite/galera/t/galera_prepared_statement.test index 1d561e3cf87..3bee097ff39 100644 --- a/mysql-test/suite/galera/t/galera_prepared_statement.test +++ b/mysql-test/suite/galera/t/galera_prepared_statement.test @@ -6,6 +6,7 @@ # --source include/galera_cluster.inc +--source include/have_innodb.inc CREATE TABLE t1 (f1 CHAR(5)) ENGINE=InnoDB; CREATE TABLE t2 (f1 CHAR(5)) ENGINE=InnoDB; diff --git a/mysql-test/suite/galera/t/galera_restart_nochanges.test b/mysql-test/suite/galera/t/galera_restart_nochanges.test index d2fceebb97f..a61332cefd6 100644 --- a/mysql-test/suite/galera/t/galera_restart_nochanges.test +++ b/mysql-test/suite/galera/t/galera_restart_nochanges.test @@ -22,7 +22,7 @@ INSERT INTO t1 VALUES (1); --let $galera_server_number = 2 --source include/galera_connect.inc --connection node_2a ---source include/galera_wait_ready.inc +--source include/wait_until_ready.inc SELECT COUNT(*) = 1 FROM t1; SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; diff --git a/mysql-test/suite/galera/t/galera_var_log_bin.cnf b/mysql-test/suite/galera/t/galera_var_log_bin.cnf index 68bc0a0823f..f7f17e3720a 100644 --- a/mysql-test/suite/galera/t/galera_var_log_bin.cnf +++ b/mysql-test/suite/galera/t/galera_var_log_bin.cnf @@ -1,9 +1,5 @@ !include ../galera_2nodes.cnf -[mysqld.1] -log-bin=log1 - -[mysqld.2] -log-bin=log2 - +[mysqld] +log-bin diff --git a/mysql-test/suite/galera/t/galera_var_log_bin.test b/mysql-test/suite/galera/t/galera_var_log_bin.test index c0ab124dcec..1b1886b996d 100644 --- a/mysql-test/suite/galera/t/galera_var_log_bin.test +++ b/mysql-test/suite/galera/t/galera_var_log_bin.test @@ -3,8 +3,8 @@ # when MySQL's binlog is in effect rather than the Galera 'dummy' implementation. # ---source include/have_binlog_format_row.inc --source include/galera_cluster.inc +--source include/have_innodb.inc CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB; diff --git a/mysql-test/suite/galera_3nodes/disabled.def b/mysql-test/suite/galera_3nodes/disabled.def index ec02e73b4a3..fb23a81bfb8 100644 --- a/mysql-test/suite/galera_3nodes/disabled.def +++ b/mysql-test/suite/galera_3nodes/disabled.def @@ -1,2 +1,5 @@ galera_garbd : Fix the test case galera_evs_suspect_timeout : TODO: investigate +galera_innobackupex_backup : TODO: investigate +galera_slave_options_do :MDEV-8798 +galera_slave_options_ignore : MDEV-8798 diff --git a/mysql-test/suite/galera_3nodes/r/galera_certification_ccc.result b/mysql-test/suite/galera_3nodes/r/galera_certification_ccc.result index fd617a0c7ec..96a2bec0d7f 100644 --- a/mysql-test/suite/galera_3nodes/r/galera_certification_ccc.result +++ b/mysql-test/suite/galera_3nodes/r/galera_certification_ccc.result @@ -15,6 +15,3 @@ SELECT COUNT(*) = 2 FROM t1; COUNT(*) = 2 1 DROP TABLE t1; -CALL mtr.add_suppression("SYNC message from member 1 in non-primary configuration"); -CALL mtr.add_suppression("SYNC message from member 1 in non-primary configuration"); -CALL mtr.add_suppression("SYNC message from member 1 in non-primary configuration"); diff --git a/mysql-test/suite/galera_3nodes/suite.pm b/mysql-test/suite/galera_3nodes/suite.pm index 1f00e37bdc3..39d5acbcc1b 100644 --- a/mysql-test/suite/galera_3nodes/suite.pm +++ b/mysql-test/suite/galera_3nodes/suite.pm @@ -42,6 +42,7 @@ push @::global_suppressions, qr|WSREP: Ignoring possible split-brain (allowed by configuration) from view:.*|, qr(WSREP: Could not find peer:), qr(WSREP: Protocol violation. JOIN message sender .*), + qr(WSREP: JOIN message from member [0-9]* in non-primary configuration. Ignored.), ); From eac8e43541afdbc60b7e6c954d310db9b37db2d5 Mon Sep 17 00:00:00 2001 From: Nirbhay Choubey Date: Mon, 14 Sep 2015 15:43:16 -0400 Subject: [PATCH 67/82] Avoid caching wsrep threads (fixed the erroneous condition). --- sql/mysqld.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/mysqld.cc b/sql/mysqld.cc index fab1477a87b..9154b84cfe8 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -3049,7 +3049,7 @@ bool one_thread_per_connection_end(THD *thd, bool put_in_cache) set_current_thd(0); #ifdef WITH_WSREP - if (put_in_cache && cache_thread() && !wsrep_applier) + if (!wsrep_applier && put_in_cache && cache_thread()) #else if (put_in_cache && cache_thread()) #endif /* WITH_WSREP */ From 653aadcd59f4ac94750d9ebf398d6e44029ebe3f Mon Sep 17 00:00:00 2001 From: Nirbhay Choubey Date: Tue, 15 Sep 2015 16:27:04 -0400 Subject: [PATCH 68/82] MDEV-8804: bootstrap command missing in debian init script Add 'bootstrap' to debian init script. --- debian/mariadb-galera-server-5.5.mysql.init | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/debian/mariadb-galera-server-5.5.mysql.init b/debian/mariadb-galera-server-5.5.mysql.init index 07edda2f079..d604075b9e4 100644 --- a/debian/mariadb-galera-server-5.5.mysql.init +++ b/debian/mariadb-galera-server-5.5.mysql.init @@ -179,8 +179,15 @@ case "${1:-''}" in fi ;; + 'bootstrap') + # Bootstrap the cluster, start the first node + # that initiates the cluster + log_daemon_msg "Bootstrapping the cluster" "mysqld" + $SELF start "${@:2}" --wsrep-new-cluster + ;; + *) - echo "Usage: $SELF start|stop|restart|reload|force-reload|status" + echo "Usage: $SELF start|stop|restart|reload|force-reload|status|bootstrap" exit 1 ;; esac From fd1b2e486a9a81ffb5416e7a0a0d85d15598c77c Mon Sep 17 00:00:00 2001 From: Nirbhay Choubey Date: Tue, 15 Sep 2015 17:07:41 -0400 Subject: [PATCH 69/82] MDEV-8803: Debian jessie 8.2 + MariaDB 10.1.7 + GaleraCluster * Merge fix for issue #127 from mysql-wsrep (commit : a0ba0d7) * Also, cherry-picked a similar fix for OpenSUSE (commit : 7790cb1) --- debian/mariadb-galera-server-5.5.mysql.init | 3 +++ support-files/mysql.server.sh | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/debian/mariadb-galera-server-5.5.mysql.init b/debian/mariadb-galera-server-5.5.mysql.init index d604075b9e4..874d099a0c6 100644 --- a/debian/mariadb-galera-server-5.5.mysql.init +++ b/debian/mariadb-galera-server-5.5.mysql.init @@ -17,6 +17,9 @@ set -e set -u ${DEBIAN_SCRIPT_DEBUG:+ set -v -x} +# Prevent Debian's init scripts from calling systemctl +_SYSTEMCTL_SKIP_REDIRECT=true + test -x /usr/sbin/mysqld || exit 0 . /lib/lsb/init-functions diff --git a/support-files/mysql.server.sh b/support-files/mysql.server.sh index 30d1ecd5f4c..fb9e01ded43 100644 --- a/support-files/mysql.server.sh +++ b/support-files/mysql.server.sh @@ -24,6 +24,14 @@ # Short-Description: start and stop MySQL # Description: MySQL is a very fast and reliable SQL database engine. ### END INIT INFO + +# Prevent OpenSUSE's init scripts from calling systemd, so that +# both 'bootstrap' and 'start' are handled entirely within this +# script +SYSTEMD_NO_WRAP=1 + +# Prevent Debian's init scripts from calling systemctl +_SYSTEMCTL_SKIP_REDIRECT=true # If you install MySQL on some other places than @prefix@, then you # have to do one of the following things for this script to work: From db2e21bf3ea32115e25bc6d9f67249042f16cadb Mon Sep 17 00:00:00 2001 From: Nirbhay Choubey Date: Wed, 16 Sep 2015 23:20:57 -0400 Subject: [PATCH 70/82] MDEV-8208: Sporadic SEGFAULT on startup Problem: When mysqld starts as a galera node, it creates 2 system threads (applier & rollbacker) using start_wsrep_THD(). These threads are created before plugin initialization (plugin_init()) for SST methods like rsync and xtrabackup. The threads' initialization itself can proceed in parallel to mysqld's main thread of execution. As a result, the thread initialization code (start_wsrep_THD()) can end up accessing some un/partially initialized structures (like maria_hton, in this particular case) resulting in segfault. Solution: Fixed by calling THD::init_for_queries() (which accesses maria_hton) only after the plugins have been initialized. --- sql/mysqld.cc | 66 ++++++++++++++++++++++++++++++++------------- sql/wsrep_mysqld.cc | 8 ++++++ sql/wsrep_mysqld.h | 1 + 3 files changed, 57 insertions(+), 18 deletions(-) diff --git a/sql/mysqld.cc b/sql/mysqld.cc index a59780f8f4f..415f6c3d617 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -4507,11 +4507,6 @@ will be ignored as the --log-bin option is not defined."); // to know mysqld_port now - lp:1071882 #endif /* !EMBEDDED_LIBRARY */ - /* - Plugin initialization (plugin_init()) hasn't happened yet, set - maria_hton to 0. - */ - maria_hton= 0; wsrep_init_startup(true); } } @@ -4593,6 +4588,29 @@ a file name for --log-bin-index option", opt_binlog_index_name); } plugins_are_initialized= TRUE; /* Don't separate from init function */ +#ifdef WITH_WSREP + /* Wait for wsrep threads to get created. */ + if (wsrep_creating_startup_threads == 1) { + mysql_mutex_lock(&LOCK_thread_count); + while (wsrep_running_threads < 2) + { + mysql_cond_wait(&COND_thread_count, &LOCK_thread_count); + } + + /* Now is the time to initialize threads for queries. */ + THD *tmp; + I_List_iterator it(threads); + while ((tmp= it++)) + { + if (tmp->wsrep_applier == true) + { + tmp->init_for_queries(); + } + } + mysql_mutex_unlock(&LOCK_thread_count); + } +#endif + have_csv= plugin_status(STRING_WITH_LEN("csv"), MYSQL_STORAGE_ENGINE_PLUGIN); have_ndbcluster= plugin_status(STRING_WITH_LEN("ndbcluster"), @@ -4825,16 +4843,11 @@ pthread_handler_t start_wsrep_THD(void *arg) THD *thd; wsrep_thd_processor_fun processor= (wsrep_thd_processor_fun)arg; - if (my_thread_init()) + if (my_thread_init() || (!(thd= new THD(true)))) { - WSREP_ERROR("Could not initialize thread"); - return(NULL); + goto error; } - if (!(thd= new THD(true))) - { - return(NULL); - } mysql_mutex_lock(&LOCK_thread_count); thd->thread_id=thread_id++; @@ -4859,13 +4872,13 @@ pthread_handler_t start_wsrep_THD(void *arg) mysql_thread_set_psi_id(thd->thread_id); thd->thr_create_utime= microsecond_interval_timer(); + if (MYSQL_CALLBACK_ELSE(thread_scheduler, init_new_connection_thread, (), 0)) { close_connection(thd, ER_OUT_OF_RESOURCES); statistic_increment(aborted_connects,&LOCK_status); MYSQL_CALLBACK(thread_scheduler, end_thread, (thd, 0)); - - return(NULL); + goto error; } // @@ -4888,8 +4901,7 @@ pthread_handler_t start_wsrep_THD(void *arg) statistic_increment(aborted_connects,&LOCK_status); MYSQL_CALLBACK(thread_scheduler, end_thread, (thd, 0)); delete thd; - - return(NULL); + goto error; } thd->system_thread= SYSTEM_THREAD_SLAVE_SQL; @@ -4899,12 +4911,21 @@ pthread_handler_t start_wsrep_THD(void *arg) //thd->version= refresh_version; thd->proc_info= 0; thd->command= COM_SLEEP; - thd->set_time(); - thd->init_for_queries(); + + if (plugins_are_initialized) + { + thd->init_for_queries(); + } mysql_mutex_lock(&LOCK_thread_count); wsrep_running_threads++; mysql_cond_broadcast(&COND_thread_count); + + if (wsrep_running_threads > 2) + { + wsrep_creating_startup_threads= 0; + } + mysql_mutex_unlock(&LOCK_thread_count); processor(thd); @@ -4942,6 +4963,15 @@ pthread_handler_t start_wsrep_THD(void *arg) mysql_mutex_unlock(&LOCK_thread_count); } return(NULL); + +error: + WSREP_ERROR("Failed to create/initialize system thread"); + + /* Abort if its the first applier/rollbacker thread. */ + if (wsrep_creating_startup_threads < 2) + unireg_abort(1); + else + return NULL; } /**/ diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index a154809d132..c570c7b831d 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -65,6 +65,13 @@ my_bool wsrep_restart_slave_activated = 0; // node has dropped, and slave // restart will be needed my_bool wsrep_slave_UK_checks = 0; // slave thread does UK checks my_bool wsrep_slave_FK_checks = 0; // slave thread does FK checks + +/* + Set during the creation of first wsrep applier and rollback threads. + Since these threads are critical, abort if the thread creation fails. +*/ +my_bool wsrep_creating_startup_threads = 0; + /* * End configuration options */ @@ -700,6 +707,7 @@ void wsrep_init_startup (bool first) if (!wsrep_start_replication()) unireg_abort(1); + wsrep_creating_startup_threads= 1; wsrep_create_rollbacker(); wsrep_create_appliers(1); diff --git a/sql/wsrep_mysqld.h b/sql/wsrep_mysqld.h index dd47d4dc1a4..e6fe0c04fac 100644 --- a/sql/wsrep_mysqld.h +++ b/sql/wsrep_mysqld.h @@ -99,6 +99,7 @@ extern my_bool wsrep_restart_slave; extern my_bool wsrep_restart_slave_activated; extern my_bool wsrep_slave_FK_checks; extern my_bool wsrep_slave_UK_checks; +extern my_bool wsrep_creating_startup_threads; enum enum_wsrep_OSU_method { WSREP_OSU_TOI, WSREP_OSU_RSU }; enum enum_wsrep_sync_wait { From 9d5767cf43e1243e039b20c1853f5b7812587f2d Mon Sep 17 00:00:00 2001 From: Nirbhay Choubey Date: Mon, 21 Sep 2015 20:47:05 -0400 Subject: [PATCH 71/82] Post-merge fix. --- sql/wsrep_sst.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/wsrep_sst.cc b/sql/wsrep_sst.cc index a73c9706c7d..8008a977a84 100644 --- a/sql/wsrep_sst.cc +++ b/sql/wsrep_sst.cc @@ -458,7 +458,7 @@ static ssize_t sst_prepare_other (const char* method, mysql_real_data_home, wsrep_defaults_file, (int)getpid()); - if (ret < 0 || ret >= (int)sizeof(cmd_str)) + if (ret < 0 || ret >= cmd_len) { WSREP_ERROR("sst_prepare_other(): snprintf() failed: %d", ret); return (ret < 0 ? ret : -EMSGSIZE); @@ -1025,7 +1025,7 @@ static int sst_donate_other (const char* method, uuid, (long long) seqno, bypass ? " "WSREP_SST_OPT_BYPASS : ""); - if (ret < 0 || ret >= (int) sizeof(cmd_str)) + if (ret < 0 || ret >= cmd_len) { WSREP_ERROR("sst_donate_other(): snprintf() failed: %d", ret); return (ret < 0 ? ret : -EMSGSIZE); From d54bc3c0d1ed50b3c5aa3a22b2cb653851315e8a Mon Sep 17 00:00:00 2001 From: Nirbhay Choubey Date: Mon, 21 Sep 2015 20:49:31 -0400 Subject: [PATCH 72/82] Cleanup: remove dead code which could also lead to race. --- .../suite/galera/r/galera_read_only.result | 18 +++++++++ .../suite/galera/t/galera_read_only.test | 39 +++++++++++++++++++ sql/sql_parse.cc | 20 +--------- 3 files changed, 59 insertions(+), 18 deletions(-) create mode 100644 mysql-test/suite/galera/r/galera_read_only.result create mode 100644 mysql-test/suite/galera/t/galera_read_only.test diff --git a/mysql-test/suite/galera/r/galera_read_only.result b/mysql-test/suite/galera/r/galera_read_only.result new file mode 100644 index 00000000000..82736c5f4ba --- /dev/null +++ b/mysql-test/suite/galera/r/galera_read_only.result @@ -0,0 +1,18 @@ +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; +SET GLOBAL read_only=TRUE; +INSERT INTO t1 VALUES (1); +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +CREATE USER foo@localhost; +# Open connection to node 2 using 'foo' user. + +# Connect with foo_node_2 +INSERT INTO t1 VALUES (2); +ERROR HY000: The MariaDB server is running with the --read-only option so it cannot execute this statement +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +SET GLOBAL read_only=FALSE; +DROP TABLE t1; +DROP USER foo@localhost; diff --git a/mysql-test/suite/galera/t/galera_read_only.test b/mysql-test/suite/galera/t/galera_read_only.test new file mode 100644 index 00000000000..c0fa4af07e0 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_read_only.test @@ -0,0 +1,39 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Ensure that the read_only option does not apply to Galera appliers and that replication +# continues, the way MySQL replication would. +# + +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; + +--connection node_2 +SET GLOBAL read_only=TRUE; + +--connection node_1 +INSERT INTO t1 VALUES (1); + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; + +CREATE USER foo@localhost; + +--echo # Open connection to node 2 using 'foo' user. +--let $port_2= \$NODE_MYPORT_2 +--connect(foo_node_2,127.0.0.1,foo,,test,$port_2,) + +--echo +--echo # Connect with foo_node_2 +--connection foo_node_2 +--error ER_OPTION_PREVENTS_STATEMENT +INSERT INTO t1 VALUES (2); + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; + +# Cleanup +SET GLOBAL read_only=FALSE; +DROP TABLE t1; +DROP USER foo@localhost; + diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 3629f3dd198..566a50340aa 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -982,22 +982,6 @@ static my_bool deny_updates_if_read_only_option(THD *thd, } #ifdef WITH_WSREP -static my_bool wsrep_read_only_option(THD *thd, TABLE_LIST *all_tables) -{ - int opt_readonly_saved = opt_readonly; - ulong flag_saved = (ulong)(thd->security_ctx->master_access & SUPER_ACL); - - opt_readonly = 0; - thd->security_ctx->master_access &= ~SUPER_ACL; - - my_bool ret = !deny_updates_if_read_only_option(thd, all_tables); - - opt_readonly = opt_readonly_saved; - thd->security_ctx->master_access |= flag_saved; - - return ret; -} - static void wsrep_copy_query(THD *thd) { thd->wsrep_retry_command = thd->command; @@ -1011,6 +995,7 @@ static void wsrep_copy_query(THD *thd) thd->wsrep_retry_query[thd->wsrep_retry_query_len] = '\0'; } #endif /* WITH_WSREP */ + /** Perform one connection-level (COM_XXXX) command. @@ -6355,8 +6340,7 @@ static void wsrep_mysql_parse(THD *thd, char *rawbuf, uint length, bool is_autocommit= !thd->in_multi_stmt_transaction_mode() && thd->wsrep_conflict_state == NO_CONFLICT && - !thd->wsrep_applier && - wsrep_read_only_option(thd, thd->lex->query_tables); + !thd->wsrep_applier; do { From 13615c5e18eed62fa2dee80402dfebe3e74053c4 Mon Sep 17 00:00:00 2001 From: Nirbhay Choubey Date: Fri, 25 Sep 2015 13:56:02 -0400 Subject: [PATCH 73/82] MDEV-8208: Sporadic SEGFAULT on startup Addendum: * Before calling THD::init_for_queries(), flip the current_thd to wsrep thread so that memory gets allocated for the right THD. * Use wsrep_creating_startup_threads instead of plugins_are_initialized as the condition for the execution of THD::init_for_queries() within start_wsrep_THD(), as use of latter could still leave some room for race. --- mysys/my_alloc.c | 5 ++++- sql/mysqld.cc | 12 +++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/mysys/my_alloc.c b/mysys/my_alloc.c index 1054db6cee4..9e44707b1a2 100644 --- a/mysys/my_alloc.c +++ b/mysys/my_alloc.c @@ -93,6 +93,7 @@ void init_alloc_root(MEM_ROOT *mem_root, size_t block_size, void reset_root_defaults(MEM_ROOT *mem_root, size_t block_size, size_t pre_alloc_size __attribute__((unused))) { + DBUG_ENTER("reset_root_defaults"); DBUG_ASSERT(alloc_root_inited(mem_root)); mem_root->block_size= block_size - ALLOC_ROOT_MIN_BLOCK_SIZE; @@ -114,7 +115,7 @@ void reset_root_defaults(MEM_ROOT *mem_root, size_t block_size, { /* We found a suitable block, no need to do anything else */ mem_root->pre_alloc= mem; - return; + DBUG_VOID_RETURN; } if (mem->left + ALIGN_SIZE(sizeof(USED_MEM)) == mem->size) { @@ -142,6 +143,8 @@ void reset_root_defaults(MEM_ROOT *mem_root, size_t block_size, else #endif mem_root->pre_alloc= 0; + + DBUG_VOID_RETURN; } diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 415f6c3d617..b42d586d748 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -4604,7 +4604,17 @@ a file name for --log-bin-index option", opt_binlog_index_name); { if (tmp->wsrep_applier == true) { + /* + Set THR_THD to temporally point to this THD to register all the + variables that allocates memory for this THD. + */ + THD *current_thd_saved= current_thd; + my_pthread_setspecific_ptr(THR_THD, tmp); + tmp->init_for_queries(); + + /* Restore current_thd. */ + my_pthread_setspecific_ptr(THR_THD, current_thd_saved); } } mysql_mutex_unlock(&LOCK_thread_count); @@ -4912,7 +4922,7 @@ pthread_handler_t start_wsrep_THD(void *arg) thd->proc_info= 0; thd->command= COM_SLEEP; - if (plugins_are_initialized) + if (wsrep_creating_startup_threads == 0) { thd->init_for_queries(); } From 43b2a451fe62e7a1172fa3d611039b3d11c1dd36 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Mon, 19 Oct 2015 01:56:04 -0700 Subject: [PATCH 74/82] refs codership/mysql-wsrep#202 Added schema info into wsrep messages Added schema info to wsrep messages above debug level. --- sql/events.cc | 6 +++-- sql/mdl.cc | 8 +++--- sql/mdl.h | 1 + sql/sp.cc | 3 ++- sql/wsrep_hton.cc | 18 ++++++++----- sql/wsrep_mysqld.cc | 65 ++++++++++++++++++++++++++++++++------------- sql/wsrep_thd.cc | 6 +++-- sql/wsrep_var.cc | 8 ++++-- 8 files changed, 79 insertions(+), 36 deletions(-) diff --git a/sql/events.cc b/sql/events.cc index 357695cdced..1feb285e3a0 100644 --- a/sql/events.cc +++ b/sql/events.cc @@ -1195,7 +1195,8 @@ int wsrep_create_event_query(THD *thd, uchar** buf, size_t* buf_len) if (create_query_string(thd, &log_query)) { - WSREP_WARN("events create string failed: %s", thd->query()); + WSREP_WARN("events create string failed: schema: %s, query: %s", + (thd->db ? thd->db : "(null)"), thd->query()); return 1; } return wsrep_to_buf_helper(thd, log_query.ptr(), log_query.length(), buf, buf_len); @@ -1222,7 +1223,8 @@ int wsrep_alter_event_query(THD *thd, uchar** buf, size_t* buf_len) if (wsrep_alter_query_string(thd, &log_query)) { - WSREP_WARN("events alter string failed: %s", thd->query()); + WSREP_WARN("events alter string failed: schema: %s, query: %s", + (thd->db ? thd->db : "(null)"), thd->query()); return 1; } return wsrep_to_buf_helper(thd, log_query.ptr(), log_query.length(), buf, buf_len); diff --git a/sql/mdl.cc b/sql/mdl.cc index 8c446e5d65f..44831c55b44 100644 --- a/sql/mdl.cc +++ b/sql/mdl.cc @@ -33,7 +33,8 @@ void sql_print_information(const char *format, ...) extern bool wsrep_grant_mdl_exception(MDL_context *requestor_ctx, - MDL_ticket *ticket); + MDL_ticket *ticket, + const MDL_key *key); #endif /* WITH_WSREP */ #ifdef HAVE_PSI_INTERFACE static PSI_mutex_key key_MDL_map_mutex; @@ -1549,7 +1550,8 @@ void MDL_lock::Ticket_list::add_ticket(MDL_ticket *ticket) if (granted->get_ctx() != ticket->get_ctx() && granted->is_incompatible_when_granted(ticket->get_type())) { - if (!wsrep_grant_mdl_exception(ticket->get_ctx(), granted)) + if (!wsrep_grant_mdl_exception(ticket->get_ctx(), granted, + &ticket->get_lock()->key)) { WSREP_DEBUG("MDL victim killed at add_ticket"); } @@ -1941,7 +1943,7 @@ MDL_lock::can_grant_lock(enum_mdl_type type_arg, wsrep_thd_query(requestor_ctx->wsrep_get_thd())); can_grant = true; } - else if (!wsrep_grant_mdl_exception(requestor_ctx, ticket)) + else if (!wsrep_grant_mdl_exception(requestor_ctx, ticket, &key)) { wsrep_can_grant= FALSE; if (wsrep_log_conflicts) diff --git a/sql/mdl.h b/sql/mdl.h index 0898a0f75b7..7fb303d4720 100644 --- a/sql/mdl.h +++ b/sql/mdl.h @@ -457,6 +457,7 @@ public: MDL_key key; public: + static void *operator new(size_t size, MEM_ROOT *mem_root) throw () { return alloc_root(mem_root, size); } static void operator delete(void *ptr, MEM_ROOT *mem_root) {} diff --git a/sql/sp.cc b/sql/sp.cc index c4cd847bc02..4a0e890e0cb 100644 --- a/sql/sp.cc +++ b/sql/sp.cc @@ -2302,7 +2302,8 @@ int wsrep_create_sp(THD *thd, uchar** buf, size_t* buf_len) &(thd->lex->definer->host), saved_mode)) { - WSREP_WARN("SP create string failed: %s", thd->query()); + WSREP_WARN("SP create string failed: schema: %s, query: %s", + (thd->db ? thd->db : "(null)"), thd->query()); return 1; } return wsrep_to_buf_helper(thd, log_query.ptr(), log_query.length(), buf, buf_len); diff --git a/sql/wsrep_hton.cc b/sql/wsrep_hton.cc index 03bf072edcc..c096d2610eb 100644 --- a/sql/wsrep_hton.cc +++ b/sql/wsrep_hton.cc @@ -239,8 +239,9 @@ static int wsrep_rollback(handlerton *hton, THD *thd, bool all) if (WSREP(thd) && wsrep->post_rollback(wsrep, &thd->wsrep_ws_handle)) { DBUG_PRINT("wsrep", ("setting rollback fail")); - WSREP_ERROR("settting rollback fail: thd: %llu SQL: %s", - (long long)thd->real_id, thd->query()); + WSREP_ERROR("settting rollback fail: thd: %llu, schema: %s, SQL: %s", + (long long)thd->real_id, (thd->db ? thd->db : "(null)"), + thd->query()); } wsrep_cleanup_transaction(thd); } @@ -279,8 +280,9 @@ int wsrep_commit(handlerton *hton, THD *thd, bool all) if (WSREP(thd) && wsrep->post_rollback(wsrep, &thd->wsrep_ws_handle)) { DBUG_PRINT("wsrep", ("setting rollback fail")); - WSREP_ERROR("settting rollback fail: thd: %llu SQL: %s", - (long long)thd->real_id, thd->query()); + WSREP_ERROR("settting rollback fail: thd: %llu, schema: %s, SQL: %s", + (long long)thd->real_id, (thd->db ? thd->db : "(null)"), + thd->query()); } wsrep_cleanup_transaction(thd); } @@ -441,9 +443,11 @@ wsrep_run_wsrep_commit(THD *thd, handlerton *hton, bool all) if (WSREP_UNDEFINED_TRX_ID == thd->wsrep_ws_handle.trx_id) { WSREP_WARN("SQL statement was ineffective, THD: %lu, buf: %zu\n" + "schema: %s \n" "QUERY: %s\n" " => Skipping replication", - thd->thread_id, data_len, thd->query()); + thd->thread_id, data_len, + (thd->db ? thd->db : "(null)"), thd->query()); rcode = WSREP_TRX_FAIL; } else if (!rcode) @@ -458,8 +462,8 @@ wsrep_run_wsrep_commit(THD *thd, handlerton *hton, bool all) &thd->wsrep_trx_meta); if (rcode == WSREP_TRX_MISSING) { - WSREP_WARN("Transaction missing in provider, thd: %ld, SQL: %s", - thd->thread_id, thd->query()); + WSREP_WARN("Transaction missing in provider, thd: %ld, schema: %s, SQL: %s", + thd->thread_id, (thd->db ? thd->db : "(null)"), thd->query()); rcode = WSREP_TRX_FAIL; } else if (rcode == WSREP_BF_ABORT) { WSREP_DEBUG("thd %lu seqno %lld BF aborted by provider, will replay", diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index b05214682e6..a9cdb5b5b11 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -1253,9 +1253,11 @@ static int wsrep_TOI_begin(THD *thd, char *db_, char *table_, } else if (key_arr.keys_len > 0) { /* jump to error handler in mysql_execute_command() */ - WSREP_WARN("TO isolation failed for: %d, sql: %s. Check wsrep " + WSREP_WARN("TO isolation failed for: %d, schema: %s, sql: %s. Check wsrep " "connection state and retry the query.", - ret, (thd->query()) ? thd->query() : "void"); + ret, + (thd->db ? thd->db : "(null)"), + (thd->query()) ? thd->query() : "void"); my_error(ER_LOCK_DEADLOCK, MYF(0), "WSREP replication failed. Check " "your wsrep connection state and retry the query."); wsrep_keys_free(&key_arr); @@ -1288,8 +1290,10 @@ static void wsrep_TOI_end(THD *thd) { WSREP_DEBUG("TO END: %lld", (long long)wsrep_thd_trx_seqno(thd)); } else { - WSREP_WARN("TO isolation end failed for: %d, sql: %s", - ret, (thd->query()) ? thd->query() : "void"); + WSREP_WARN("TO isolation end failed for: %d, schema: %s, sql: %s", + ret, + (thd->db ? thd->db : "(null)"), + (thd->query()) ? thd->query() : "void"); } } @@ -1302,7 +1306,10 @@ static int wsrep_RSU_begin(THD *thd, char *db_, char *table_) ret = wsrep->desync(wsrep); if (ret != WSREP_OK) { - WSREP_WARN("RSU desync failed %d for %s", ret, thd->query()); + WSREP_WARN("RSU desync failed %d for schema: %s, query: %s", + ret, + (thd->db ? thd->db : "(null)"), + thd->query()); my_error(ER_LOCK_DEADLOCK, MYF(0)); return(ret); } @@ -1313,7 +1320,9 @@ static int wsrep_RSU_begin(THD *thd, char *db_, char *table_) if (wsrep_wait_committing_connections_close(5000)) { /* no can do, bail out from DDL */ - WSREP_WARN("RSU failed due to pending transactions, %s", thd->query()); + WSREP_WARN("RSU failed due to pending transactions, schema: %s, query %s", + (thd->db ? thd->db : "(null)"), + thd->query()); mysql_mutex_lock(&LOCK_wsrep_replaying); wsrep_replaying--; mysql_mutex_unlock(&LOCK_wsrep_replaying); @@ -1321,7 +1330,10 @@ static int wsrep_RSU_begin(THD *thd, char *db_, char *table_) ret = wsrep->resync(wsrep); if (ret != WSREP_OK) { - WSREP_WARN("resync failed %d for %s", ret, thd->query()); + WSREP_WARN("resync failed %d for schema: %s, query: %s", + ret, + (thd->db ? thd->db : "(null)"), + thd->query()); } my_error(ER_LOCK_DEADLOCK, MYF(0)); return(1); @@ -1330,7 +1342,9 @@ static int wsrep_RSU_begin(THD *thd, char *db_, char *table_) wsrep_seqno_t seqno = wsrep->pause(wsrep); if (seqno == WSREP_SEQNO_UNDEFINED) { - WSREP_WARN("pause failed %lld for %s", (long long)seqno, thd->query()); + WSREP_WARN("pause failed %lld for schema: %s, query: %s", (long long)seqno, + (thd->db ? thd->db : "(null)"), + thd->query()); return(1); } WSREP_DEBUG("paused at %lld", (long long)seqno); @@ -1352,12 +1366,16 @@ static void wsrep_RSU_end(THD *thd) ret = wsrep->resume(wsrep); if (ret != WSREP_OK) { - WSREP_WARN("resume failed %d for %s", ret, thd->query()); + WSREP_WARN("resume failed %d for schema: %s, query: %s", ret, + (thd->db ? thd->db : "(null)"), + thd->query()); } ret = wsrep->resync(wsrep); if (ret != WSREP_OK) { - WSREP_WARN("resync failed %d for %s", ret, thd->query()); + WSREP_WARN("resync failed %d for schema: %s, query: %s", ret, + (thd->db ? thd->db : "(null)"), + thd->query()); return; } thd->variables.wsrep_on = 1; @@ -1377,8 +1395,10 @@ int wsrep_to_isolation_begin(THD *thd, char *db_, char *table_, if (thd->wsrep_conflict_state == MUST_ABORT) { - WSREP_INFO("thread: %lu, %s has been aborted due to multi-master conflict", - thd->thread_id, thd->query()); + WSREP_INFO("thread: %lu, schema: %s, query: %s has been aborted due to multi-master conflict", + thd->thread_id, + (thd->db ? thd->db : "(null)"), + thd->query()); mysql_mutex_unlock(&thd->LOCK_wsrep_thd); return WSREP_TRX_FAIL; } @@ -1456,12 +1476,12 @@ void wsrep_to_isolation_end(THD *thd) } } -#define WSREP_MDL_LOG(severity, msg, req, gra) \ +#define WSREP_MDL_LOG(severity, msg, schema, schema_len, req, gra) \ WSREP_##severity( \ - "%s\n" \ + "schema: %.*s\n" \ "request: (%lu \tseqno %lld \twsrep (%d, %d, %d) cmd %d %d \t%s)\n" \ "granted: (%lu \tseqno %lld \twsrep (%d, %d, %d) cmd %d %d \t%s)", \ - msg, \ + msg, schema_len, schema, \ req->thread_id, (long long)wsrep_thd_trx_seqno(req), \ req->wsrep_exec_mode, req->wsrep_query_state, req->wsrep_conflict_state, \ req->get_command(), req->lex->sql_command, req->query(), \ @@ -1481,7 +1501,8 @@ void wsrep_to_isolation_end(THD *thd) bool wsrep_grant_mdl_exception(MDL_context *requestor_ctx, - MDL_ticket *ticket + MDL_ticket *ticket, + const MDL_key *key ) { /* Fallback to the non-wsrep behaviour */ if (!WSREP_ON) return FALSE; @@ -1490,19 +1511,24 @@ wsrep_grant_mdl_exception(MDL_context *requestor_ctx, THD *granted_thd = ticket->get_ctx()->wsrep_get_thd(); bool ret = FALSE; + const char* schema= key->db_name(); + int schema_len= key->db_name_length(); + mysql_mutex_lock(&request_thd->LOCK_wsrep_thd); if (request_thd->wsrep_exec_mode == TOTAL_ORDER || request_thd->wsrep_exec_mode == REPL_RECV) { mysql_mutex_unlock(&request_thd->LOCK_wsrep_thd); - WSREP_MDL_LOG(DEBUG, "MDL conflict ", request_thd, granted_thd); + WSREP_MDL_LOG(DEBUG, "MDL conflict ", schema, schema_len, + request_thd, granted_thd); ticket->wsrep_report(wsrep_debug); mysql_mutex_lock(&granted_thd->LOCK_wsrep_thd); if (granted_thd->wsrep_exec_mode == TOTAL_ORDER || granted_thd->wsrep_exec_mode == REPL_RECV) { - WSREP_MDL_LOG(INFO, "MDL BF-BF conflict", request_thd, granted_thd); + WSREP_MDL_LOG(INFO, "MDL BF-BF conflict", schema, schema_len, + request_thd, granted_thd); ticket->wsrep_report(true); mysql_mutex_unlock(&granted_thd->LOCK_wsrep_thd); ret = TRUE; @@ -1533,7 +1559,8 @@ wsrep_grant_mdl_exception(MDL_context *requestor_ctx, } else { - WSREP_MDL_LOG(DEBUG, "MDL conflict-> BF abort", request_thd, granted_thd); + WSREP_MDL_LOG(DEBUG, "MDL conflict-> BF abort", schema, schema_len, + request_thd, granted_thd); ticket->wsrep_report(wsrep_debug); mysql_mutex_unlock(&granted_thd->LOCK_wsrep_thd); wsrep_abort_thd((void*)request_thd, (void*)granted_thd, 1); diff --git a/sql/wsrep_thd.cc b/sql/wsrep_thd.cc index 776a640cabe..464a68a8221 100644 --- a/sql/wsrep_thd.cc +++ b/sql/wsrep_thd.cc @@ -274,8 +274,10 @@ void wsrep_replay_transaction(THD *thd) wsrep->post_rollback(wsrep, &thd->wsrep_ws_handle); break; default: - WSREP_ERROR("trx_replay failed for: %d, query: %s", - rcode, thd->query() ? thd->query() : "void"); + WSREP_ERROR("trx_replay failed for: %d, schema: %s, query: %s", + rcode, + (thd->db ? thd->db : "(null)"), + thd->query() ? thd->query() : "void"); /* we're now in inconsistent state, must abort */ /* http://bazaar.launchpad.net/~codership/codership-mysql/5.6/revision/3962#sql/wsrep_thd.cc */ diff --git a/sql/wsrep_var.cc b/sql/wsrep_var.cc index bbfa79ac3fd..a3366000fc5 100644 --- a/sql/wsrep_var.cc +++ b/sql/wsrep_var.cc @@ -512,14 +512,18 @@ bool wsrep_desync_update (sys_var *self, THD* thd, enum_var_type type) if (wsrep_desync) { ret = wsrep->desync (wsrep); if (ret != WSREP_OK) { - WSREP_WARN ("SET desync failed %d for %s", ret, thd->query()); + WSREP_WARN ("SET desync failed %d for schema: %s, query: %s", ret, + (thd->db ? thd->db : "(null)"), + thd->query()); my_error (ER_CANNOT_USER, MYF(0), "'desync'", thd->query()); return true; } } else { ret = wsrep->resync (wsrep); if (ret != WSREP_OK) { - WSREP_WARN ("SET resync failed %d for %s", ret, thd->query()); + WSREP_WARN ("SET resync failed %d for schema: %s, query: %s", ret, + (thd->db ? thd->db : "(null)"), + thd->query()); my_error (ER_CANNOT_USER, MYF(0), "'resync'", thd->query()); return true; } From 52a910395a18088af5988883989274066bb212d8 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Mon, 19 Oct 2015 04:14:51 -0700 Subject: [PATCH 75/82] refs codership/mysql-wsrep#202 Fix bad cherry-pick (and the compiler warnings it generated) --- sql/wsrep_mysqld.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index a9cdb5b5b11..31a642e3624 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -1478,13 +1478,14 @@ void wsrep_to_isolation_end(THD *thd) #define WSREP_MDL_LOG(severity, msg, schema, schema_len, req, gra) \ WSREP_##severity( \ + "%s\n" \ "schema: %.*s\n" \ "request: (%lu \tseqno %lld \twsrep (%d, %d, %d) cmd %d %d \t%s)\n" \ "granted: (%lu \tseqno %lld \twsrep (%d, %d, %d) cmd %d %d \t%s)", \ - msg, schema_len, schema, \ + msg, schema_len, schema, \ req->thread_id, (long long)wsrep_thd_trx_seqno(req), \ req->wsrep_exec_mode, req->wsrep_query_state, req->wsrep_conflict_state, \ - req->get_command(), req->lex->sql_command, req->query(), \ + req->get_command(), req->lex->sql_command, req->query(), \ gra->thread_id, (long long)wsrep_thd_trx_seqno(gra), \ gra->wsrep_exec_mode, gra->wsrep_query_state, gra->wsrep_conflict_state, \ gra->get_command(), gra->lex->sql_command, gra->query()); From f3e362464bb67c02236a2ecb7526fb0c046e8474 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Tue, 20 Oct 2015 13:41:14 +0300 Subject: [PATCH 76/82] MDEV-8869: Potential lock_sys->mutex deadlock Analysis: We are alreading holing lock_sys mutex when we call thd::awake. This could lead mutex deadlock if trx->current_lock_mutex_owner is not correctly set. Fix: Make sure that trx->current_lock_mutex_owner is correctly set. --- storage/innobase/handler/ha_innodb.cc | 39 +++++++++++++++++++-------- storage/innobase/lock/lock0lock.cc | 25 ++++++++++++----- storage/xtradb/handler/ha_innodb.cc | 38 +++++++++++++++++--------- storage/xtradb/lock/lock0lock.cc | 25 ++++++++++++----- 4 files changed, 90 insertions(+), 37 deletions(-) diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index f18eca7cf2b..4b3bd4ca806 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -4,7 +4,7 @@ Copyright (c) 2000, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, 2009 Google Inc. Copyright (c) 2009, Percona Inc. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2013, 2014 SkySQL Ab. All Rights Reserved. +Copyright (c) 2013, 2015 MariaDB Corporation. All Rights Reserved. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -4328,6 +4328,8 @@ innobase_kill_query( enum thd_kill_levels level) /*!< in: kill level */ { trx_t* trx; + bool took_lock_sys = false; + DBUG_ENTER("innobase_kill_query"); DBUG_ASSERT(hton == innodb_hton_ptr); @@ -4353,14 +4355,24 @@ innobase_kill_query( /* Cancel a pending lock request. */ if (owner != cur) { + ut_ad(!lock_mutex_own()); lock_mutex_enter(); + took_lock_sys = true; } + + ut_ad(!trx_mutex_own(trx)); trx_mutex_enter(trx); + if (trx->lock.wait_lock) { lock_cancel_waiting_and_release(trx->lock.wait_lock); } + + ut_ad(lock_mutex_own()); + ut_ad(trx_mutex_own(trx)); + trx_mutex_exit(trx); - if (owner != cur) { + + if (took_lock_sys) { lock_mutex_exit(); } } @@ -17320,6 +17332,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr, WSREP_WARN("no THD for trx: %lu", victim_trx->id); DBUG_RETURN(1); } + if (!bf_thd) { DBUG_PRINT("wsrep", ("no BF thd for conflicting lock")); WSREP_WARN("no BF THD for trx: %lu", (bf_trx) ? bf_trx->id : 0); @@ -17343,6 +17356,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr, wsrep_thd_UNLOCK(thd); DBUG_RETURN(0); } + if(wsrep_thd_exec_mode(thd) != LOCAL_STATE) { WSREP_DEBUG("withdraw for BF trx: %lu, state: %d", victim_trx->id, @@ -17350,7 +17364,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr, } switch (wsrep_thd_conflict_state(thd)) { - case NO_CONFLICT: + case NO_CONFLICT: wsrep_thd_set_conflict_state(thd, MUST_ABORT); break; case MUST_ABORT: @@ -17472,6 +17486,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr, mysql_mutex_lock(&LOCK_wsrep_rollback); abortees = wsrep_aborting_thd; + while (abortees && !skip_abort) { /* check if we have a kill message for this already */ if (abortees->aborting_thd == thd) { @@ -17481,6 +17496,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr, } abortees = abortees->next; } + if (!skip_abort) { wsrep_aborting_thd_t aborting = (wsrep_aborting_thd_t) my_malloc(sizeof(struct wsrep_aborting_thd), @@ -17522,17 +17538,17 @@ wsrep_abort_transaction(handlerton* hton, THD *bf_thd, THD *victim_thd, wsrep_thd_query(bf_thd), wsrep_thd_query(victim_thd)); - if (victim_trx) - { - lock_mutex_enter(); - trx_mutex_enter(victim_trx); + if (victim_trx) { + victim_trx->current_lock_mutex_owner = victim_thd; + lock_mutex_enter(); + trx_mutex_enter(victim_trx); int rcode = wsrep_innobase_kill_one_trx(bf_thd, bf_trx, victim_trx, signal); - trx_mutex_exit(victim_trx); - lock_mutex_exit(); + trx_mutex_exit(victim_trx); + victim_trx->current_lock_mutex_owner = NULL; + lock_mutex_exit(); wsrep_srv_conc_cancel_wait(victim_trx); - - DBUG_RETURN(rcode); + DBUG_RETURN(rcode); } else { WSREP_DEBUG("victim does not have transaction"); wsrep_thd_LOCK(victim_thd); @@ -17540,6 +17556,7 @@ wsrep_abort_transaction(handlerton* hton, THD *bf_thd, THD *victim_thd, wsrep_thd_UNLOCK(victim_thd); wsrep_thd_awake(victim_thd, signal); } + DBUG_RETURN(-1); } diff --git a/storage/innobase/lock/lock0lock.cc b/storage/innobase/lock/lock0lock.cc index d4f60550558..28021a2d31b 100644 --- a/storage/innobase/lock/lock0lock.cc +++ b/storage/innobase/lock/lock0lock.cc @@ -6767,14 +6767,16 @@ lock_clust_rec_modify_check_and_lock( lock_rec_convert_impl_to_expl(block, rec, index, offsets); lock_mutex_enter(); - - ut_ad(lock_table_has(thr_get_trx(thr), index->table, LOCK_IX)); + trx_t* trx = thr_get_trx(thr); + trx->current_lock_mutex_owner = trx->mysql_thd; + ut_ad(lock_table_has(trx, index->table, LOCK_IX)); err = lock_rec_lock(TRUE, LOCK_X | LOCK_REC_NOT_GAP, block, heap_no, index, thr); MONITOR_INC(MONITOR_NUM_RECLOCK_REQ); + trx->current_lock_mutex_owner = NULL; lock_mutex_exit(); ut_ad(lock_rec_queue_validate(FALSE, block, rec, index, offsets)); @@ -6826,15 +6828,18 @@ lock_sec_rec_modify_check_and_lock( index record, and this would not have been possible if another active transaction had modified this secondary index record. */ + trx_t* trx = thr_get_trx(thr); lock_mutex_enter(); + trx->current_lock_mutex_owner = trx->mysql_thd; - ut_ad(lock_table_has(thr_get_trx(thr), index->table, LOCK_IX)); + ut_ad(lock_table_has(trx, index->table, LOCK_IX)); err = lock_rec_lock(TRUE, LOCK_X | LOCK_REC_NOT_GAP, block, heap_no, index, thr); MONITOR_INC(MONITOR_NUM_RECLOCK_REQ); + trx->current_lock_mutex_owner = NULL; lock_mutex_exit(); #ifdef UNIV_DEBUG @@ -6925,18 +6930,21 @@ lock_sec_rec_read_check_and_lock( lock_rec_convert_impl_to_expl(block, rec, index, offsets); } + trx_t* trx = thr_get_trx(thr); lock_mutex_enter(); + trx->current_lock_mutex_owner = trx->mysql_thd; ut_ad(mode != LOCK_X - || lock_table_has(thr_get_trx(thr), index->table, LOCK_IX)); + || lock_table_has(trx, index->table, LOCK_IX)); ut_ad(mode != LOCK_S - || lock_table_has(thr_get_trx(thr), index->table, LOCK_IS)); + || lock_table_has(trx, index->table, LOCK_IS)); err = lock_rec_lock(FALSE, mode | gap_mode, block, heap_no, index, thr); MONITOR_INC(MONITOR_NUM_RECLOCK_REQ); + trx->current_lock_mutex_owner = NULL; lock_mutex_exit(); ut_ad(lock_rec_queue_validate(FALSE, block, rec, index, offsets)); @@ -6998,17 +7006,20 @@ lock_clust_rec_read_check_and_lock( } lock_mutex_enter(); + trx_t* trx = thr_get_trx(thr); + trx->current_lock_mutex_owner = trx->mysql_thd; ut_ad(mode != LOCK_X - || lock_table_has(thr_get_trx(thr), index->table, LOCK_IX)); + || lock_table_has(trx, index->table, LOCK_IX)); ut_ad(mode != LOCK_S - || lock_table_has(thr_get_trx(thr), index->table, LOCK_IS)); + || lock_table_has(trx, index->table, LOCK_IS)); err = lock_rec_lock(FALSE, mode | gap_mode, block, heap_no, index, thr); MONITOR_INC(MONITOR_NUM_RECLOCK_REQ); + trx->current_lock_mutex_owner = NULL; lock_mutex_exit(); ut_ad(lock_rec_queue_validate(FALSE, block, rec, index, offsets)); diff --git a/storage/xtradb/handler/ha_innodb.cc b/storage/xtradb/handler/ha_innodb.cc index 9579fbba6f5..beed8adcea6 100644 --- a/storage/xtradb/handler/ha_innodb.cc +++ b/storage/xtradb/handler/ha_innodb.cc @@ -4,7 +4,7 @@ Copyright (c) 2000, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, 2009 Google Inc. Copyright (c) 2009, Percona Inc. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2013, 2014 SkySQL Ab. All Rights Reserved. +Copyright (c) 2013, 2015 MariaDB Corporation. All Rights Reserved. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -4930,6 +4930,7 @@ innobase_kill_connection( thd_kill_levels) { trx_t* trx; + bool took_lock_sys = false; DBUG_ENTER("innobase_kill_connection"); DBUG_ASSERT(hton == innodb_hton_ptr); @@ -4956,16 +4957,24 @@ innobase_kill_connection( THD *owner = trx->current_lock_mutex_owner; if (owner != cur) { + ut_ad(!lock_mutex_own()); lock_mutex_enter(); + took_lock_sys = true; } + + ut_ad(!trx_mutex_own(trx)); trx_mutex_enter(trx); /* Cancel a pending lock request. */ if (trx->lock.wait_lock) lock_cancel_waiting_and_release(trx->lock.wait_lock); + ut_ad(lock_mutex_own()); + ut_ad(trx_mutex_own(trx)); + trx_mutex_exit(trx); - if (owner != cur) { + + if (took_lock_sys) { lock_mutex_exit(); } } @@ -18333,6 +18342,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr, WSREP_WARN("no THD for trx: %lu", victim_trx->id); DBUG_RETURN(1); } + if (!bf_thd) { DBUG_PRINT("wsrep", ("no BF thd for conflicting lock")); WSREP_WARN("no BF THD for trx: %lu", (bf_trx) ? bf_trx->id : 0); @@ -18356,6 +18366,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr, wsrep_thd_UNLOCK(thd); DBUG_RETURN(0); } + if(wsrep_thd_exec_mode(thd) != LOCAL_STATE) { WSREP_DEBUG("withdraw for BF trx: %lu, state: %d", victim_trx->id, @@ -18363,7 +18374,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr, } switch (wsrep_thd_conflict_state(thd)) { - case NO_CONFLICT: + case NO_CONFLICT: wsrep_thd_set_conflict_state(thd, MUST_ABORT); break; case MUST_ABORT: @@ -18485,6 +18496,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr, mysql_mutex_lock(&LOCK_wsrep_rollback); abortees = wsrep_aborting_thd; + while (abortees && !skip_abort) { /* check if we have a kill message for this already */ if (abortees->aborting_thd == thd) { @@ -18494,6 +18506,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr, } abortees = abortees->next; } + if (!skip_abort) { wsrep_aborting_thd_t aborting = (wsrep_aborting_thd_t) my_malloc(sizeof(struct wsrep_aborting_thd), @@ -18524,7 +18537,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr, DBUG_RETURN(0); } -static int +static int wsrep_abort_transaction(handlerton* hton, THD *bf_thd, THD *victim_thd, my_bool signal) { @@ -18535,17 +18548,17 @@ wsrep_abort_transaction(handlerton* hton, THD *bf_thd, THD *victim_thd, wsrep_thd_query(bf_thd), wsrep_thd_query(victim_thd)); - if (victim_trx) - { - lock_mutex_enter(); - trx_mutex_enter(victim_trx); + if (victim_trx) { + victim_trx->current_lock_mutex_owner = victim_thd; + lock_mutex_enter(); + trx_mutex_enter(victim_trx); int rcode = wsrep_innobase_kill_one_trx(bf_thd, bf_trx, victim_trx, signal); - trx_mutex_exit(victim_trx); - lock_mutex_exit(); + trx_mutex_exit(victim_trx); + victim_trx->current_lock_mutex_owner = NULL; + lock_mutex_exit(); wsrep_srv_conc_cancel_wait(victim_trx); - - DBUG_RETURN(rcode); + DBUG_RETURN(rcode); } else { WSREP_DEBUG("victim does not have transaction"); wsrep_thd_LOCK(victim_thd); @@ -18553,6 +18566,7 @@ wsrep_abort_transaction(handlerton* hton, THD *bf_thd, THD *victim_thd, wsrep_thd_UNLOCK(victim_thd); wsrep_thd_awake(victim_thd, signal); } + DBUG_RETURN(-1); } diff --git a/storage/xtradb/lock/lock0lock.cc b/storage/xtradb/lock/lock0lock.cc index 54dd69a726e..2291ba0db50 100644 --- a/storage/xtradb/lock/lock0lock.cc +++ b/storage/xtradb/lock/lock0lock.cc @@ -6835,14 +6835,16 @@ lock_clust_rec_modify_check_and_lock( lock_rec_convert_impl_to_expl(block, rec, index, offsets); lock_mutex_enter(); - - ut_ad(lock_table_has(thr_get_trx(thr), index->table, LOCK_IX)); + trx_t* trx = thr_get_trx(thr); + trx->current_lock_mutex_owner = trx->mysql_thd; + ut_ad(lock_table_has(trx, index->table, LOCK_IX)); err = lock_rec_lock(TRUE, LOCK_X | LOCK_REC_NOT_GAP, block, heap_no, index, thr); MONITOR_INC(MONITOR_NUM_RECLOCK_REQ); + trx->current_lock_mutex_owner = NULL; lock_mutex_exit(); ut_ad(lock_rec_queue_validate(FALSE, block, rec, index, offsets)); @@ -6898,15 +6900,18 @@ lock_sec_rec_modify_check_and_lock( index record, and this would not have been possible if another active transaction had modified this secondary index record. */ + trx_t* trx = thr_get_trx(thr); lock_mutex_enter(); + trx->current_lock_mutex_owner = trx->mysql_thd; - ut_ad(lock_table_has(thr_get_trx(thr), index->table, LOCK_IX)); + ut_ad(lock_table_has(trx, index->table, LOCK_IX)); err = lock_rec_lock(TRUE, LOCK_X | LOCK_REC_NOT_GAP, block, heap_no, index, thr); MONITOR_INC(MONITOR_NUM_RECLOCK_REQ); + trx->current_lock_mutex_owner = NULL; lock_mutex_exit(); #ifdef UNIV_DEBUG @@ -7006,18 +7011,21 @@ lock_sec_rec_read_check_and_lock( lock_rec_convert_impl_to_expl(block, rec, index, offsets); } + trx_t* trx = thr_get_trx(thr); lock_mutex_enter(); + trx->current_lock_mutex_owner = trx->mysql_thd; ut_ad(mode != LOCK_X - || lock_table_has(thr_get_trx(thr), index->table, LOCK_IX)); + || lock_table_has(trx, index->table, LOCK_IX)); ut_ad(mode != LOCK_S - || lock_table_has(thr_get_trx(thr), index->table, LOCK_IS)); + || lock_table_has(trx, index->table, LOCK_IS)); err = lock_rec_lock(FALSE, mode | gap_mode, block, heap_no, index, thr); MONITOR_INC(MONITOR_NUM_RECLOCK_REQ); + trx->current_lock_mutex_owner = NULL; lock_mutex_exit(); ut_ad(lock_rec_queue_validate(FALSE, block, rec, index, offsets)); @@ -7088,17 +7096,20 @@ lock_clust_rec_read_check_and_lock( } lock_mutex_enter(); + trx_t* trx = thr_get_trx(thr); + trx->current_lock_mutex_owner = trx->mysql_thd; ut_ad(mode != LOCK_X - || lock_table_has(thr_get_trx(thr), index->table, LOCK_IX)); + || lock_table_has(trx, index->table, LOCK_IX)); ut_ad(mode != LOCK_S - || lock_table_has(thr_get_trx(thr), index->table, LOCK_IS)); + || lock_table_has(trx, index->table, LOCK_IS)); err = lock_rec_lock(FALSE, mode | gap_mode, block, heap_no, index, thr); MONITOR_INC(MONITOR_NUM_RECLOCK_REQ); + trx->current_lock_mutex_owner = NULL; lock_mutex_exit(); ut_ad(lock_rec_queue_validate(FALSE, block, rec, index, offsets)); From 17b0b45b1de41a1b188c5de6c3e9d8e6ecc48a72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Wed, 21 Oct 2015 09:20:54 +0300 Subject: [PATCH 77/82] Code cleanup. --- storage/innobase/handler/ha_innodb.cc | 48 ++++++++++++++++----------- storage/xtradb/handler/ha_innodb.cc | 14 ++++---- 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 4b3bd4ca806..0b483d3745d 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -4,7 +4,7 @@ Copyright (c) 2000, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, 2009 Google Inc. Copyright (c) 2009, Percona Inc. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2013, 2015 MariaDB Corporation. All Rights Reserved. +Copyright (c) 2013, 2015, MariaDB Corporation. All Rights Reserved. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -17311,11 +17311,13 @@ wsrep_abort_slave_trx(wsrep_seqno_t bf_seqno, wsrep_seqno_t victim_seqno) } /*******************************************************************//** This function is used to kill one transaction in BF. */ - +UNIV_INTERN int -wsrep_innobase_kill_one_trx(void * const bf_thd_ptr, - const trx_t * const bf_trx, - trx_t *victim_trx, ibool signal) +wsrep_innobase_kill_one_trx( + void * const bf_thd_ptr, + const trx_t * const bf_trx, + trx_t *victim_trx, + ibool signal) { ut_ad(lock_mutex_own()); ut_ad(trx_mutex_own(victim_trx)); @@ -17341,12 +17343,12 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr, WSREP_LOG_CONFLICT(bf_thd, thd, TRUE); - WSREP_DEBUG("BF kill (%lu, seqno: %lld), victim: (%lu) trx: %lu", + WSREP_DEBUG("BF kill (%lu, seqno: %lld), victim: (%lu) trx: %lu", signal, (long long)bf_seqno, wsrep_thd_thread_id(thd), victim_trx->id); - WSREP_DEBUG("Aborting query: %s", + WSREP_DEBUG("Aborting query: %s", (thd && wsrep_thd_query(thd)) ? wsrep_thd_query(thd) : "void"); wsrep_thd_LOCK(thd); @@ -17429,7 +17431,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr, wsrep_thd_awake(thd, signal); break; case QUERY_EXEC: - /* it is possible that victim trx is itself waiting for some + /* it is possible that victim trx is itself waiting for some * other lock. We need to cancel this waiting */ WSREP_DEBUG("kill trx QUERY_EXEC for %lu", victim_trx->id); @@ -17449,7 +17451,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr, wsrep_thd_awake(thd, signal); } else { /* abort currently executing query */ - DBUG_PRINT("wsrep",("sending KILL_QUERY to: %ld", + DBUG_PRINT("wsrep",("sending KILL_QUERY to: %ld", wsrep_thd_thread_id(thd))); WSREP_DEBUG("kill query for: %ld", wsrep_thd_thread_id(thd)); @@ -17469,7 +17471,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr, { bool skip_abort= false; wsrep_aborting_thd_t abortees; - + WSREP_DEBUG("kill IDLE for %lu", victim_trx->id); if (wsrep_thd_exec_mode(thd) == REPL_RECV) { @@ -17491,7 +17493,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr, /* check if we have a kill message for this already */ if (abortees->aborting_thd == thd) { skip_abort = true; - WSREP_WARN("duplicate thd aborter %lu", + WSREP_WARN("duplicate thd aborter %lu", wsrep_thd_thread_id(thd)); } abortees = abortees->next; @@ -17499,7 +17501,7 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr, if (!skip_abort) { wsrep_aborting_thd_t aborting = (wsrep_aborting_thd_t) - my_malloc(sizeof(struct wsrep_aborting_thd), + my_malloc(sizeof(struct wsrep_aborting_thd), MYF(0)); aborting->aborting_thd = thd; aborting->next = wsrep_aborting_thd; @@ -17519,28 +17521,34 @@ wsrep_innobase_kill_one_trx(void * const bf_thd_ptr, break; } default: - WSREP_WARN("bad wsrep query state: %d", + WSREP_WARN("bad wsrep query state: %d", wsrep_thd_query_state(thd)); wsrep_thd_UNLOCK(thd); break; } - + DBUG_RETURN(0); } -static int -wsrep_abort_transaction(handlerton* hton, THD *bf_thd, THD *victim_thd, - my_bool signal) + +static +int +wsrep_abort_transaction( + handlerton* hton, + THD *bf_thd, + THD *victim_thd, + my_bool signal) { DBUG_ENTER("wsrep_innobase_abort_thd"); trx_t* victim_trx = thd_to_trx(victim_thd); trx_t* bf_trx = (bf_thd) ? thd_to_trx(bf_thd) : NULL; - WSREP_DEBUG("abort transaction: BF: %s victim: %s", + + WSREP_DEBUG("abort transaction: BF: %s victim: %s", wsrep_thd_query(bf_thd), wsrep_thd_query(victim_thd)); if (victim_trx) { - victim_trx->current_lock_mutex_owner = victim_thd; lock_mutex_enter(); + victim_trx->current_lock_mutex_owner = victim_thd; trx_mutex_enter(victim_trx); int rcode = wsrep_innobase_kill_one_trx(bf_thd, bf_trx, victim_trx, signal); @@ -17554,7 +17562,7 @@ wsrep_abort_transaction(handlerton* hton, THD *bf_thd, THD *victim_thd, wsrep_thd_LOCK(victim_thd); wsrep_thd_set_conflict_state(victim_thd, MUST_ABORT); wsrep_thd_UNLOCK(victim_thd); - wsrep_thd_awake(victim_thd, signal); + wsrep_thd_awake(victim_thd, signal); } DBUG_RETURN(-1); diff --git a/storage/xtradb/handler/ha_innodb.cc b/storage/xtradb/handler/ha_innodb.cc index beed8adcea6..161c21efa16 100644 --- a/storage/xtradb/handler/ha_innodb.cc +++ b/storage/xtradb/handler/ha_innodb.cc @@ -4,7 +4,7 @@ Copyright (c) 2000, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, 2009 Google Inc. Copyright (c) 2009, Percona Inc. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2013, 2015 MariaDB Corporation. All Rights Reserved. +Copyright (c) 2013, 2015, MariaDB Corporation. All Rights Reserved. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -18321,11 +18321,13 @@ wsrep_abort_slave_trx(wsrep_seqno_t bf_seqno, wsrep_seqno_t victim_seqno) } /*******************************************************************//** This function is used to kill one transaction in BF. */ - +UNIV_INTERN int -wsrep_innobase_kill_one_trx(void * const bf_thd_ptr, - const trx_t * const bf_trx, - trx_t *victim_trx, ibool signal) +wsrep_innobase_kill_one_trx( + void * const bf_thd_ptr, + const trx_t * const bf_trx, + trx_t *victim_trx, + ibool signal) { ut_ad(lock_mutex_own()); ut_ad(trx_mutex_own(victim_trx)); @@ -18549,8 +18551,8 @@ wsrep_abort_transaction(handlerton* hton, THD *bf_thd, THD *victim_thd, wsrep_thd_query(victim_thd)); if (victim_trx) { - victim_trx->current_lock_mutex_owner = victim_thd; lock_mutex_enter(); + victim_trx->current_lock_mutex_owner = victim_thd; trx_mutex_enter(victim_trx); int rcode = wsrep_innobase_kill_one_trx(bf_thd, bf_trx, victim_trx, signal); From 2399f1aee77d9f9558f4d65979448d44a98f8879 Mon Sep 17 00:00:00 2001 From: Nirbhay Choubey Date: Wed, 4 Nov 2015 21:56:46 -0500 Subject: [PATCH 78/82] Fix for build failure. --- storage/innobase/handler/ha_innodb.cc | 2 +- storage/xtradb/handler/ha_innodb.cc | 23 ++++++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 3df10f55893..7afc90d9709 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -9852,7 +9852,7 @@ ha_innobase::wsrep_append_keys( ibool is_null; len = wsrep_store_key_val_for_row( - thd, table, 0, key, WSREP_MAX_SUPPORTED_KEY_LENGTH, + thd, table, 0, key, WSREP_MAX_SUPPORTED_KEY_LENGTH, record0, &is_null); if (!is_null) { diff --git a/storage/xtradb/handler/ha_innodb.cc b/storage/xtradb/handler/ha_innodb.cc index c4cf228aa82..886a3efb5d7 100644 --- a/storage/xtradb/handler/ha_innodb.cc +++ b/storage/xtradb/handler/ha_innodb.cc @@ -10474,6 +10474,27 @@ wsrep_append_key( extern void compute_md5_hash(char *digest, const char *buf, int len); #define MD5_HASH compute_md5_hash +static bool +referenced_by_foreign_key2(dict_table_t* table, + dict_index_t* index) { + ut_ad(table != NULL); + ut_ad(index != NULL); + + const dict_foreign_set* fks = &table->referenced_set; + for (dict_foreign_set::const_iterator it = fks->begin(); + it != fks->end(); + ++it) + { + dict_foreign_t* foreign = *it; + if (foreign->referenced_index != index) { + continue; + } + ut_ad(table == foreign->referenced_table); + return true; + } + return false; +} + int ha_innobase::wsrep_append_keys( /*==================*/ @@ -10553,7 +10574,7 @@ ha_innobase::wsrep_append_keys( /* !hasPK == table with no PK, must append all non-unique keys */ if (!hasPK || key_info->flags & HA_NOSAME || ((tab && - dict_table_get_referenced_constraint(tab, idx)) || + referenced_by_foreign_key2(tab, idx)) || (!tab && referenced_by_foreign_key()))) { len = wsrep_store_key_val_for_row( From e947a526970d31150cf3e9803a796706c6be3da2 Mon Sep 17 00:00:00 2001 From: Nirbhay Choubey Date: Wed, 4 Nov 2015 21:58:07 -0500 Subject: [PATCH 79/82] Update global_suppressions. --- mysql-test/suite/galera/suite.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysql-test/suite/galera/suite.pm b/mysql-test/suite/galera/suite.pm index 21f7a6e5adb..89dadf4c275 100644 --- a/mysql-test/suite/galera/suite.pm +++ b/mysql-test/suite/galera/suite.pm @@ -59,7 +59,7 @@ push @::global_suppressions, qr(WSREP: .*Failed to open backend connection: -110 .*), qr(WSREP: .*Failed to open channel 'my_wsrep_cluster' at .*), qr(WSREP: gcs connect failed: Connection timed out), - qr|WSREP: wsrep::connect\(\) failed: 7|, + qr|WSREP: wsrep::connect\(.*\) failed: 7|, qr(WSREP: SYNC message from member .* in non-primary configuration. Ignored.), qr(WSREP: Could not find peer:), qr(WSREP: TO isolation failed for: .*), From dcb7996cb7f07a8d7cafc9b564c382359b412fe2 Mon Sep 17 00:00:00 2001 From: Nirbhay Choubey Date: Sun, 15 Nov 2015 17:24:47 -0500 Subject: [PATCH 80/82] Fix/disable failing tests. --- mysql-test/suite/galera/disabled.def | 2 ++ .../suite/galera/r/galera_bf_abort_flush_for_export.result | 6 +++--- .../suite/galera/t/galera_bf_abort_flush_for_export.test | 6 ++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index 80aad7d4ff3..85d8614c91f 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -25,3 +25,5 @@ galera_gra_log : TODO: investigate galera_as_slave_replication_bundle : TODO: investigate galera_ssl_upgrade : TODO: investigate mysql-wsrep#90 : TODO: investigate +galera_flush : mysql-wsrep/issues/229 +galera_transaction_read_only : mysql-wsrep/issues/229 diff --git a/mysql-test/suite/galera/r/galera_bf_abort_flush_for_export.result b/mysql-test/suite/galera/r/galera_bf_abort_flush_for_export.result index d6ff0c20008..8c07d87eec3 100644 --- a/mysql-test/suite/galera/r/galera_bf_abort_flush_for_export.result +++ b/mysql-test/suite/galera/r/galera_bf_abort_flush_for_export.result @@ -6,9 +6,9 @@ SET SESSION wsrep_sync_wait = 0; UNLOCK TABLES; COMMIT; SET AUTOCOMMIT=ON; -SELECT COUNT(*) = 1 FROM t1; -COUNT(*) = 1 -1 +SELECT * FROM t1; +f1 +2 wsrep_local_aborts_increment 1 DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_bf_abort_flush_for_export.test b/mysql-test/suite/galera/t/galera_bf_abort_flush_for_export.test index e98a76850fa..dbbe3b3c483 100644 --- a/mysql-test/suite/galera/t/galera_bf_abort_flush_for_export.test +++ b/mysql-test/suite/galera/t/galera_bf_abort_flush_for_export.test @@ -2,7 +2,7 @@ --source include/have_innodb.inc # -# Test that a local FLUSH TABLES FOR BACKUP will NOT be broken by an incoming remote transaction against that table +# Test that a local FLUSH TABLES FOR EXPORT will NOT be broken by an incoming remote transaction against that table # CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; @@ -27,7 +27,9 @@ UNLOCK TABLES; COMMIT; SET AUTOCOMMIT=ON; -SELECT COUNT(*) = 1 FROM t1; +--let $wait_condition = SELECT COUNT(*) = 1 FROM t1 +--source include/wait_condition.inc +SELECT * FROM t1; --let $wsrep_local_bf_aborts_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` From c78fc8b1ea95dfab4dbf17678143d650ef645263 Mon Sep 17 00:00:00 2001 From: Nirbhay Choubey Date: Mon, 16 Nov 2015 12:35:06 -0500 Subject: [PATCH 81/82] MTR: rsync process is left running if pid file is removed MTR drops the datadir in the event of a test failure. In case mysqld is running as a Galera node and a failure occurs while the SST is in progress, the rsync pid file gets removed as part of the cleanup and wsrep_sst_rsync, which relies on this file, fails to kill the rsync. Fixed by using the cached $RSYNC_REAL_PID to kill rsync daemon. --- scripts/wsrep_sst_rsync.sh | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/scripts/wsrep_sst_rsync.sh b/scripts/wsrep_sst_rsync.sh index b3a07f8bbf6..6d8181a0b14 100644 --- a/scripts/wsrep_sst_rsync.sh +++ b/scripts/wsrep_sst_rsync.sh @@ -18,8 +18,10 @@ # This is a reference script for rsync-based state snapshot tansfer -RSYNC_PID= -RSYNC_CONF= +RSYNC_PID= # rsync pid file +RSYNC_CONF= # rsync configuration file +RSYNC_REAL_PID= # rsync process id + OS=$(uname) [ "$OS" == "Darwin" ] && export -n LD_LIBRARY_PATH @@ -32,10 +34,12 @@ wsrep_check_programs rsync cleanup_joiner() { - local PID=$(cat "$RSYNC_PID" 2>/dev/null || echo 0) - wsrep_log_info "Joiner cleanup. rsync PID: $PID" - [ "0" != "$PID" ] && kill $PID && sleep 0.5 && kill -9 $PID >/dev/null 2>&1 \ - || : + wsrep_log_info "Joiner cleanup. rsync PID: $RSYNC_REAL_PID" + [ "0" != "$RSYNC_REAL_PID" ] && \ + kill $RSYNC_REAL_PID && \ + sleep 0.5 && \ + kill -9 $RSYNC_REAL_PID >/dev/null 2>&1 || \ + : rm -rf "$RSYNC_CONF" rm -rf "$MAGIC_FILE" rm -rf "$RSYNC_PID" @@ -45,6 +49,7 @@ cleanup_joiner() fi } +# Check whether rsync process is still running. check_pid() { local pid_file=$1 From f4421c893b50f05078f14d33c47d21f52f59f8a7 Mon Sep 17 00:00:00 2001 From: Nirbhay Choubey Date: Mon, 16 Nov 2015 12:39:56 -0500 Subject: [PATCH 82/82] Fix for some failing tests. --- mysql-test/suite/rpl/r/mysql-wsrep#110-2.result | 4 ---- mysql-test/suite/rpl/t/mysql-wsrep#110-2.test | 2 +- mysql-test/suite/sys_vars/r/wsrep_desync_basic.result | 2 +- mysql-test/suite/sys_vars/t/wsrep_desync_basic.test | 2 +- 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/mysql-test/suite/rpl/r/mysql-wsrep#110-2.result b/mysql-test/suite/rpl/r/mysql-wsrep#110-2.result index 1bc802a41f7..fd07dfce188 100644 --- a/mysql-test/suite/rpl/r/mysql-wsrep#110-2.result +++ b/mysql-test/suite/rpl/r/mysql-wsrep#110-2.result @@ -1,7 +1,4 @@ include/master-slave.inc -Warnings: -Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. -Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. [connection master] CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); CREATE TABLE t2 (f1 INTEGER PRIMARY KEY); @@ -24,5 +21,4 @@ DROP TABLE t3; DROP TABLE t2; DROP TABLE t1; DROP PROCEDURE p1; -include/sync_slave_sql_with_master.inc include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/mysql-wsrep#110-2.test b/mysql-test/suite/rpl/t/mysql-wsrep#110-2.test index 4a8aa1edef6..2b6d07913ab 100644 --- a/mysql-test/suite/rpl/t/mysql-wsrep#110-2.test +++ b/mysql-test/suite/rpl/t/mysql-wsrep#110-2.test @@ -39,6 +39,6 @@ DROP TABLE t1; DROP PROCEDURE p1; ---source include/sync_slave_sql_with_master.inc +sync_slave_with_master; --source include/rpl_end.inc diff --git a/mysql-test/suite/sys_vars/r/wsrep_desync_basic.result b/mysql-test/suite/sys_vars/r/wsrep_desync_basic.result index 69599c4b47a..6225b444cfd 100644 --- a/mysql-test/suite/sys_vars/r/wsrep_desync_basic.result +++ b/mysql-test/suite/sys_vars/r/wsrep_desync_basic.result @@ -1,7 +1,7 @@ # # wsrep_desync # -call mtr.add_suppression("WSREP: SET desync failed 9 for SET @@global.wsrep_desync=ON"); +call mtr.add_suppression("WSREP: SET desync failed 9 for schema: test, query: SET @@global.wsrep_desync=ON"); # save the initial value SET @wsrep_desync_global_saved = @@global.wsrep_desync; # default diff --git a/mysql-test/suite/sys_vars/t/wsrep_desync_basic.test b/mysql-test/suite/sys_vars/t/wsrep_desync_basic.test index 15226c75d8b..0af1d3307f9 100644 --- a/mysql-test/suite/sys_vars/t/wsrep_desync_basic.test +++ b/mysql-test/suite/sys_vars/t/wsrep_desync_basic.test @@ -5,7 +5,7 @@ --echo # # expected as no wsrep provider is currently loaded -call mtr.add_suppression("WSREP: SET desync failed 9 for SET @@global.wsrep_desync=ON"); +call mtr.add_suppression("WSREP: SET desync failed 9 for schema: test, query: SET @@global.wsrep_desync=ON"); --echo # save the initial value SET @wsrep_desync_global_saved = @@global.wsrep_desync;