From 391b1af0fbb9723ce768d0b06830865fa983a8dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Thu, 10 Aug 2017 13:09:27 +0300 Subject: [PATCH 01/54] MDEV-13471: Test failure on innodb.log_file_size,4k Problem was that 4k page size is not really supported in Galera. For reference see: codership/galera#398 Page size 4k is problematic because WSREP XID info location that was set to constant UNIV_PAGE_SIZE - 3500 and that is conflicting with rseg undo slots location if there is lot of undo tablespaces. Undo tablespace identifiers and page numbers require at least 126*8=1024 bytes starting from offset 56. Therefore, WSREP XID startig from offset 596 would overwrite several space_id,page_no pairs starting from 72th undo log tablespace space_id,page_no pair at offset 594. This will cause InnoDB startup failure seen as [ERROR] InnoDB: Unable to open undo tablespace './undo30579'. Originally, the undo tablespace ID would always be between 0 and 127. Starting with MySQL 5.6.36 which introduced Bug #25551311 BACKPORT BUG #23517560 REMOVE SPACE_ID RESTRICTION FOR UNDO TABLESPACES (merged to MariaDB 10.0.31) it is possible for an undo tablespace ID to be 0x7773. But in this case, the page number should be 3, not 0x72650003. This is just the first collision. The WSREP XID data would overwrite subsequent slots. trx0sys.h trx0sys.cc Code formatting and add comments. --- storage/innobase/include/trx0sys.h | 86 +++++++++++++-- storage/innobase/trx/trx0sys.cc | 161 +++++++++++++++-------------- storage/xtradb/include/trx0sys.h | 86 +++++++++++++-- storage/xtradb/trx/trx0sys.cc | 161 +++++++++++++++-------------- 4 files changed, 322 insertions(+), 172 deletions(-) diff --git a/storage/innobase/include/trx0sys.h b/storage/innobase/include/trx0sys.h index 8c6b13f9dd4..83814d088f3 100644 --- a/storage/innobase/include/trx0sys.h +++ b/storage/innobase/include/trx0sys.h @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. 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 the Free Software @@ -307,19 +308,26 @@ UNIV_INTERN void trx_sys_print_mysql_binlog_offset(void); /*===================================*/ + #ifdef WITH_WSREP -/** Update WSREP checkpoint XID in sys header. */ + +/** Update WSREP XID info in sys_header of TRX_SYS_PAGE_NO = 5. +@param[in] xid Transaction XID +@param[in,out] sys_header sys_header +@param[in] mtr minitransaction */ void trx_sys_update_wsrep_checkpoint( - const XID* xid, /*!< in: WSREP XID */ - trx_sysf_t* sys_header, /*!< in: sys_header */ - mtr_t* mtr); /*!< in: mtr */ + const XID* xid, + trx_sysf_t* sys_header, + mtr_t* mtr); +/** Read WSREP XID from sys_header of TRX_SYS_PAGE_NO = 5. +@param[out] xid Transaction XID */ void -/** Read WSREP checkpoint XID from sys header. */ -trx_sys_read_wsrep_checkpoint( - XID* xid); /*!< out: WSREP XID */ +trx_sys_read_wsrep_checkpoint(XID* xid); + #endif /* WITH_WSREP */ + /*****************************************************************//** Prints to stderr the MySQL master log offset info in the trx system header if the magic number shows it valid. */ @@ -548,13 +556,71 @@ this contains the same fields as TRX_SYS_MYSQL_LOG_INFO below */ within that file */ #define TRX_SYS_MYSQL_LOG_NAME 12 /*!< MySQL log file name */ +/** Memory map TRX_SYS_PAGE_NO = 5 when UNIV_PAGE_SIZE = 4096 + +0...37 FIL_HEADER +38...45 TRX_SYS_TRX_ID_STORE +46...55 TRX_SYS_FSEG_HEADER (FSEG_HEADER_SIZE == 10) +56 TRX_SYS_RSEGS + 56...59 TRX_SYS_RSEG_SPACE for slot 0 + 60...63 TRX_SYS_RSEG_PAGE_NO for slot 0 + 64...67 TRX_SYS_RSEG_SPACE for slot 1 + 68...71 TRX_SYS_RSEG_PAGE_NO for slot 1 +.... + 594..597 TRX_SYS_RSEG_SPACE for slot 72 + 598..601 TRX_SYS_RSEG_PAGE_NO for slot 72 +... + ...1063 TRX_SYS_RSEG_PAGE_NO for slot 126 + +(UNIV_PAGE_SIZE-3500 WSREP ::: FAIL would overwrite undo tablespace +space_id, page_no pairs :::) +596 TRX_SYS_WSREP_XID_INFO TRX_SYS_WSREP_XID_MAGIC_N_FLD +600 TRX_SYS_WSREP_XID_FORMAT +604 TRX_SYS_WSREP_XID_GTRID_LEN +608 TRX_SYS_WSREP_XID_BQUAL_LEN +612 TRX_SYS_WSREP_XID_DATA (len = 128) +739 TRX_SYS_WSREP_XID_DATA_END + +FIXED WSREP XID info offsets for 4k page size 10.0.32-galera +(UNIV_PAGE_SIZE-2500) +1596 TRX_SYS_WSREP_XID_INFO TRX_SYS_WSREP_XID_MAGIC_N_FLD +1600 TRX_SYS_WSREP_XID_FORMAT +1604 TRX_SYS_WSREP_XID_GTRID_LEN +1608 TRX_SYS_WSREP_XID_BQUAL_LEN +1612 TRX_SYS_WSREP_XID_DATA (len = 128) +1739 TRX_SYS_WSREP_XID_DATA_END + +(UNIV_PAGE_SIZE - 2000 MYSQL MASTER LOG) +2096 TRX_SYS_MYSQL_MASTER_LOG_INFO TRX_SYS_MYSQL_LOG_MAGIC_N_FLD +2100 TRX_SYS_MYSQL_LOG_OFFSET_HIGH +2104 TRX_SYS_MYSQL_LOG_OFFSET_LOW +2108 TRX_SYS_MYSQL_LOG_NAME + +(UNIV_PAGE_SIZE - 1000 MYSQL LOG) +3096 TRX_SYS_MYSQL_LOG_INFO TRX_SYS_MYSQL_LOG_MAGIC_N_FLD +3100 TRX_SYS_MYSQL_LOG_OFFSET_HIGH +3104 TRX_SYS_MYSQL_LOG_OFFSET_LOW +3108 TRX_SYS_MYSQL_LOG_NAME + +(UNIV_PAGE_SIZE - 200 DOUBLEWRITE) +3896 TRX_SYS_DOUBLEWRITE TRX_SYS_DOUBLEWRITE_FSEG +3906 TRX_SYS_DOUBLEWRITE_MAGIC +3910 TRX_SYS_DOUBLEWRITE_BLOCK1 +3914 TRX_SYS_DOUBLEWRITE_BLOCK2 +3918 TRX_SYS_DOUBLEWRITE_REPEAT +3930 TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED_N + +(UNIV_PAGE_SIZE - 8, TAILER) +4088..4096 FIL_TAILER + +*/ #ifdef WITH_WSREP -/* The offset to WSREP XID headers */ -#define TRX_SYS_WSREP_XID_INFO (UNIV_PAGE_SIZE - 3500) +/** The offset to WSREP XID headers */ +#define TRX_SYS_WSREP_XID_INFO (ut_max(UNIV_PAGE_SIZE - 3500, 1596)) #define TRX_SYS_WSREP_XID_MAGIC_N_FLD 0 #define TRX_SYS_WSREP_XID_MAGIC_N 0x77737265 -/* XID field: formatID, gtrid_len, bqual_len, xid_data */ +/** XID field: formatID, gtrid_len, bqual_len, xid_data */ #define TRX_SYS_WSREP_XID_LEN (4 + 4 + 4 + XIDDATASIZE) #define TRX_SYS_WSREP_XID_FORMAT 4 #define TRX_SYS_WSREP_XID_GTRID_LEN 8 diff --git a/storage/innobase/trx/trx0sys.cc b/storage/innobase/trx/trx0sys.cc index 7f8bbafe99c..152813d9f3b 100644 --- a/storage/innobase/trx/trx0sys.cc +++ b/storage/innobase/trx/trx0sys.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. 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 the Free Software @@ -325,112 +326,120 @@ trx_sys_print_mysql_binlog_offset(void) static long long trx_sys_cur_xid_seqno = -1; static unsigned char trx_sys_cur_xid_uuid[16]; -long long read_wsrep_xid_seqno(const XID* xid) +/** Read WSREP XID seqno */ +static inline long long read_wsrep_xid_seqno(const XID* xid) { - long long seqno; - memcpy(&seqno, xid->data + 24, sizeof(long long)); - return seqno; + long long seqno; + memcpy(&seqno, xid->data + 24, sizeof(long long)); + return seqno; } -void read_wsrep_xid_uuid(const XID* xid, unsigned char* buf) +/** Read WSREP XID UUID */ +static inline void read_wsrep_xid_uuid(const XID* xid, unsigned char* buf) { - memcpy(buf, xid->data + 8, 16); + memcpy(buf, xid->data + 8, 16); } #endif /* UNIV_DEBUG */ +/** Update WSREP XID info in sys_header of TRX_SYS_PAGE_NO = 5. +@param[in] xid Transaction XID +@param[in,out] sys_header sys_header +@param[in] mtr minitransaction */ void trx_sys_update_wsrep_checkpoint( - const XID* xid, /*!< in: transaction XID */ - trx_sysf_t* sys_header, /*!< in: sys_header */ - mtr_t* mtr) /*!< in: mtr */ + const XID* xid, + trx_sysf_t* sys_header, + mtr_t* mtr) { #ifdef UNIV_DEBUG - { - /* Check that seqno is monotonically increasing */ - unsigned char xid_uuid[16]; - long long xid_seqno = read_wsrep_xid_seqno(xid); - read_wsrep_xid_uuid(xid, xid_uuid); - if (!memcmp(xid_uuid, trx_sys_cur_xid_uuid, 8)) - { - ut_ad(xid_seqno > trx_sys_cur_xid_seqno); - trx_sys_cur_xid_seqno = xid_seqno; - } - else - { - memcpy(trx_sys_cur_xid_uuid, xid_uuid, 16); - } - trx_sys_cur_xid_seqno = xid_seqno; - } + if (xid->formatID != -1 + && mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_MAGIC_N_FLD) + == TRX_SYS_WSREP_XID_MAGIC_N) { + /* Check that seqno is monotonically increasing */ + unsigned char xid_uuid[16]; + long long xid_seqno = read_wsrep_xid_seqno(xid); + read_wsrep_xid_uuid(xid, xid_uuid); + + if (!memcmp(xid_uuid, trx_sys_cur_xid_uuid, 8)) { + ut_ad(xid_seqno > trx_sys_cur_xid_seqno); + trx_sys_cur_xid_seqno = xid_seqno; + } else { + memcpy(trx_sys_cur_xid_uuid, xid_uuid, 16); + } + + trx_sys_cur_xid_seqno = xid_seqno; + } #endif /* UNIV_DEBUG */ - ut_ad(xid && mtr); - ut_a(xid->formatID == -1 || wsrep_is_wsrep_xid(xid)); + ut_ad(xid && mtr); + ut_a(xid->formatID == -1 || wsrep_is_wsrep_xid((const void *)xid)); - if (mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_MAGIC_N_FLD) - != TRX_SYS_WSREP_XID_MAGIC_N) { - mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_MAGIC_N_FLD, - TRX_SYS_WSREP_XID_MAGIC_N, - MLOG_4BYTES, mtr); - } - - mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_FORMAT, - (int)xid->formatID, - MLOG_4BYTES, mtr); - mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_GTRID_LEN, - (int)xid->gtrid_length, - MLOG_4BYTES, mtr); - mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_BQUAL_LEN, - (int)xid->bqual_length, - MLOG_4BYTES, mtr); - mlog_write_string(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_DATA, - (const unsigned char*) xid->data, - XIDDATASIZE, mtr); + if (mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_MAGIC_N_FLD) + != TRX_SYS_WSREP_XID_MAGIC_N) { + mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_MAGIC_N_FLD, + TRX_SYS_WSREP_XID_MAGIC_N, + MLOG_4BYTES, mtr); + } + mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_FORMAT, + (int)xid->formatID, + MLOG_4BYTES, mtr); + mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_GTRID_LEN, + (int)xid->gtrid_length, + MLOG_4BYTES, mtr); + mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_BQUAL_LEN, + (int)xid->bqual_length, + MLOG_4BYTES, mtr); + mlog_write_string(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_DATA, + (const unsigned char*) xid->data, + XIDDATASIZE, mtr); } +/** Read WSREP XID from sys_header of TRX_SYS_PAGE_NO = 5. +@param[out] xid Transaction XID */ void trx_sys_read_wsrep_checkpoint(XID* xid) -/*===================================*/ { - trx_sysf_t* sys_header; + trx_sysf_t* sys_header; mtr_t mtr; - ulint magic; + ulint magic; - ut_ad(xid); + ut_ad(xid); mtr_start(&mtr); sys_header = trx_sysf_get(&mtr); - if ((magic = mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_MAGIC_N_FLD)) - != TRX_SYS_WSREP_XID_MAGIC_N) { - memset(xid, 0, sizeof(*xid)); - xid->formatID = -1; - trx_sys_update_wsrep_checkpoint(xid, sys_header, &mtr); - mtr_commit(&mtr); - return; + if ((magic = mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_MAGIC_N_FLD)) + != TRX_SYS_WSREP_XID_MAGIC_N) { + memset(xid, 0, sizeof(*xid)); + xid->formatID = -1; + trx_sys_update_wsrep_checkpoint(xid, sys_header, &mtr); + mtr_commit(&mtr); + return; } - xid->formatID = (int)mach_read_from_4( - sys_header - + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_FORMAT); - xid->gtrid_length = (int)mach_read_from_4( - sys_header - + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_GTRID_LEN); - xid->bqual_length = (int)mach_read_from_4( - sys_header - + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_BQUAL_LEN); - ut_memcpy(xid->data, - sys_header + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_DATA, - XIDDATASIZE); + xid->formatID = (int)mach_read_from_4( + sys_header + + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_FORMAT); + xid->gtrid_length = (int)mach_read_from_4( + sys_header + + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_GTRID_LEN); + xid->bqual_length = (int)mach_read_from_4( + sys_header + + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_BQUAL_LEN); + ut_memcpy(xid->data, + sys_header + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_DATA, + XIDDATASIZE); mtr_commit(&mtr); } diff --git a/storage/xtradb/include/trx0sys.h b/storage/xtradb/include/trx0sys.h index e4956c6a822..7f06d3247a1 100644 --- a/storage/xtradb/include/trx0sys.h +++ b/storage/xtradb/include/trx0sys.h @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. 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 the Free Software @@ -328,19 +329,26 @@ UNIV_INTERN void trx_sys_print_mysql_binlog_offset(void); /*===================================*/ + #ifdef WITH_WSREP -/** Update WSREP checkpoint XID in sys header. */ + +/** Update WSREP XID info in sys_header of TRX_SYS_PAGE_NO = 5. +@param[in] xid Transaction XID +@param[in,out] sys_header sys_header +@param[in] mtr minitransaction */ void trx_sys_update_wsrep_checkpoint( - const XID* xid, /*!< in: WSREP XID */ - trx_sysf_t* sys_header, /*!< in: sys_header */ - mtr_t* mtr); /*!< in: mtr */ + const XID* xid, + trx_sysf_t* sys_header, + mtr_t* mtr); +/** Read WSREP XID from sys_header of TRX_SYS_PAGE_NO = 5. +@param[out] xid Transaction XID */ void -/** Read WSREP checkpoint XID from sys header. */ -trx_sys_read_wsrep_checkpoint( - XID* xid); /*!< out: WSREP XID */ +trx_sys_read_wsrep_checkpoint(XID* xid); + #endif /* WITH_WSREP */ + /*****************************************************************//** Prints to stderr the MySQL master log offset info in the trx system header if the magic number shows it valid. */ @@ -569,13 +577,71 @@ this contains the same fields as TRX_SYS_MYSQL_LOG_INFO below */ within that file */ #define TRX_SYS_MYSQL_LOG_NAME 12 /*!< MySQL log file name */ +/** Memory map TRX_SYS_PAGE_NO = 5 when UNIV_PAGE_SIZE = 4096 + +0...37 FIL_HEADER +38...45 TRX_SYS_TRX_ID_STORE +46...55 TRX_SYS_FSEG_HEADER (FSEG_HEADER_SIZE == 10) +56 TRX_SYS_RSEGS + 56...59 TRX_SYS_RSEG_SPACE for slot 0 + 60...63 TRX_SYS_RSEG_PAGE_NO for slot 0 + 64...67 TRX_SYS_RSEG_SPACE for slot 1 + 68...71 TRX_SYS_RSEG_PAGE_NO for slot 1 +.... + 594..597 TRX_SYS_RSEG_SPACE for slot 72 + 598..601 TRX_SYS_RSEG_PAGE_NO for slot 72 +... + ...1063 TRX_SYS_RSEG_PAGE_NO for slot 126 + +(UNIV_PAGE_SIZE-3500 WSREP ::: FAIL would overwrite undo tablespace +space_id, page_no pairs :::) +596 TRX_SYS_WSREP_XID_INFO TRX_SYS_WSREP_XID_MAGIC_N_FLD +600 TRX_SYS_WSREP_XID_FORMAT +604 TRX_SYS_WSREP_XID_GTRID_LEN +608 TRX_SYS_WSREP_XID_BQUAL_LEN +612 TRX_SYS_WSREP_XID_DATA (len = 128) +739 TRX_SYS_WSREP_XID_DATA_END + +FIXED WSREP XID info offsets for 4k page size 10.0.32-galera +(UNIV_PAGE_SIZE-2500) +1596 TRX_SYS_WSREP_XID_INFO TRX_SYS_WSREP_XID_MAGIC_N_FLD +1600 TRX_SYS_WSREP_XID_FORMAT +1604 TRX_SYS_WSREP_XID_GTRID_LEN +1608 TRX_SYS_WSREP_XID_BQUAL_LEN +1612 TRX_SYS_WSREP_XID_DATA (len = 128) +1739 TRX_SYS_WSREP_XID_DATA_END + +(UNIV_PAGE_SIZE - 2000 MYSQL MASTER LOG) +2096 TRX_SYS_MYSQL_MASTER_LOG_INFO TRX_SYS_MYSQL_LOG_MAGIC_N_FLD +2100 TRX_SYS_MYSQL_LOG_OFFSET_HIGH +2104 TRX_SYS_MYSQL_LOG_OFFSET_LOW +2108 TRX_SYS_MYSQL_LOG_NAME + +(UNIV_PAGE_SIZE - 1000 MYSQL LOG) +3096 TRX_SYS_MYSQL_LOG_INFO TRX_SYS_MYSQL_LOG_MAGIC_N_FLD +3100 TRX_SYS_MYSQL_LOG_OFFSET_HIGH +3104 TRX_SYS_MYSQL_LOG_OFFSET_LOW +3108 TRX_SYS_MYSQL_LOG_NAME + +(UNIV_PAGE_SIZE - 200 DOUBLEWRITE) +3896 TRX_SYS_DOUBLEWRITE TRX_SYS_DOUBLEWRITE_FSEG +3906 TRX_SYS_DOUBLEWRITE_MAGIC +3910 TRX_SYS_DOUBLEWRITE_BLOCK1 +3914 TRX_SYS_DOUBLEWRITE_BLOCK2 +3918 TRX_SYS_DOUBLEWRITE_REPEAT +3930 TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED_N + +(UNIV_PAGE_SIZE - 8, TAILER) +4088..4096 FIL_TAILER + +*/ #ifdef WITH_WSREP -/* The offset to WSREP XID headers */ -#define TRX_SYS_WSREP_XID_INFO (UNIV_PAGE_SIZE - 3500) +/** The offset to WSREP XID headers */ +#define TRX_SYS_WSREP_XID_INFO (ut_max(UNIV_PAGE_SIZE - 3500, 1596)) #define TRX_SYS_WSREP_XID_MAGIC_N_FLD 0 #define TRX_SYS_WSREP_XID_MAGIC_N 0x77737265 -/* XID field: formatID, gtrid_len, bqual_len, xid_data */ +/** XID field: formatID, gtrid_len, bqual_len, xid_data */ #define TRX_SYS_WSREP_XID_LEN (4 + 4 + 4 + XIDDATASIZE) #define TRX_SYS_WSREP_XID_FORMAT 4 #define TRX_SYS_WSREP_XID_GTRID_LEN 8 diff --git a/storage/xtradb/trx/trx0sys.cc b/storage/xtradb/trx/trx0sys.cc index 9a0b7180435..8c11d22489a 100644 --- a/storage/xtradb/trx/trx0sys.cc +++ b/storage/xtradb/trx/trx0sys.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, MariaDB Corporation. 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 the Free Software @@ -325,112 +326,120 @@ trx_sys_print_mysql_binlog_offset(void) static long long trx_sys_cur_xid_seqno = -1; static unsigned char trx_sys_cur_xid_uuid[16]; -long long read_wsrep_xid_seqno(const XID* xid) +/** Read WSREP XID seqno */ +static inline long long read_wsrep_xid_seqno(const XID* xid) { - long long seqno; - memcpy(&seqno, xid->data + 24, sizeof(long long)); - return seqno; + long long seqno; + memcpy(&seqno, xid->data + 24, sizeof(long long)); + return seqno; } -void read_wsrep_xid_uuid(const XID* xid, unsigned char* buf) +/** Read WSREP XID UUID */ +static inline void read_wsrep_xid_uuid(const XID* xid, unsigned char* buf) { - memcpy(buf, xid->data + 8, 16); + memcpy(buf, xid->data + 8, 16); } #endif /* UNIV_DEBUG */ +/** Update WSREP XID info in sys_header of TRX_SYS_PAGE_NO = 5. +@param[in] xid Transaction XID +@param[in,out] sys_header sys_header +@param[in] mtr minitransaction */ void trx_sys_update_wsrep_checkpoint( - const XID* xid, /*!< in: transaction XID */ - trx_sysf_t* sys_header, /*!< in: sys_header */ - mtr_t* mtr) /*!< in: mtr */ + const XID* xid, + trx_sysf_t* sys_header, + mtr_t* mtr) { #ifdef UNIV_DEBUG - { - /* Check that seqno is monotonically increasing */ - unsigned char xid_uuid[16]; - long long xid_seqno = read_wsrep_xid_seqno(xid); - read_wsrep_xid_uuid(xid, xid_uuid); - if (!memcmp(xid_uuid, trx_sys_cur_xid_uuid, 8)) - { - ut_ad(xid_seqno > trx_sys_cur_xid_seqno); - trx_sys_cur_xid_seqno = xid_seqno; - } - else - { - memcpy(trx_sys_cur_xid_uuid, xid_uuid, 16); - } - trx_sys_cur_xid_seqno = xid_seqno; - } + if (xid->formatID != -1 + && mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_MAGIC_N_FLD) + == TRX_SYS_WSREP_XID_MAGIC_N) { + /* Check that seqno is monotonically increasing */ + unsigned char xid_uuid[16]; + long long xid_seqno = read_wsrep_xid_seqno(xid); + read_wsrep_xid_uuid(xid, xid_uuid); + + if (!memcmp(xid_uuid, trx_sys_cur_xid_uuid, 8)) { + ut_ad(xid_seqno > trx_sys_cur_xid_seqno); + trx_sys_cur_xid_seqno = xid_seqno; + } else { + memcpy(trx_sys_cur_xid_uuid, xid_uuid, 16); + } + + trx_sys_cur_xid_seqno = xid_seqno; + } #endif /* UNIV_DEBUG */ - ut_ad(xid && mtr); - ut_a(xid->formatID == -1 || wsrep_is_wsrep_xid((const void *)xid)); + ut_ad(xid && mtr); + ut_a(xid->formatID == -1 || wsrep_is_wsrep_xid((const void *)xid)); - if (mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_MAGIC_N_FLD) - != TRX_SYS_WSREP_XID_MAGIC_N) { - mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_MAGIC_N_FLD, - TRX_SYS_WSREP_XID_MAGIC_N, - MLOG_4BYTES, mtr); - } - - mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_FORMAT, - (int)xid->formatID, - MLOG_4BYTES, mtr); - mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_GTRID_LEN, - (int)xid->gtrid_length, - MLOG_4BYTES, mtr); - mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_BQUAL_LEN, - (int)xid->bqual_length, - MLOG_4BYTES, mtr); - mlog_write_string(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_DATA, - (const unsigned char*) xid->data, - XIDDATASIZE, mtr); + if (mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_MAGIC_N_FLD) + != TRX_SYS_WSREP_XID_MAGIC_N) { + mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_MAGIC_N_FLD, + TRX_SYS_WSREP_XID_MAGIC_N, + MLOG_4BYTES, mtr); + } + mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_FORMAT, + (int)xid->formatID, + MLOG_4BYTES, mtr); + mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_GTRID_LEN, + (int)xid->gtrid_length, + MLOG_4BYTES, mtr); + mlog_write_ulint(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_BQUAL_LEN, + (int)xid->bqual_length, + MLOG_4BYTES, mtr); + mlog_write_string(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_DATA, + (const unsigned char*) xid->data, + XIDDATASIZE, mtr); } +/** Read WSREP XID from sys_header of TRX_SYS_PAGE_NO = 5. +@param[out] xid Transaction XID */ void trx_sys_read_wsrep_checkpoint(XID* xid) -/*===================================*/ { - trx_sysf_t* sys_header; + trx_sysf_t* sys_header; mtr_t mtr; - ulint magic; + ulint magic; - ut_ad(xid); + ut_ad(xid); mtr_start(&mtr); sys_header = trx_sysf_get(&mtr); - if ((magic = mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO - + TRX_SYS_WSREP_XID_MAGIC_N_FLD)) - != TRX_SYS_WSREP_XID_MAGIC_N) { - memset(xid, 0, sizeof(*xid)); - xid->formatID = -1; - trx_sys_update_wsrep_checkpoint(xid, sys_header, &mtr); - mtr_commit(&mtr); - return; + if ((magic = mach_read_from_4(sys_header + TRX_SYS_WSREP_XID_INFO + + TRX_SYS_WSREP_XID_MAGIC_N_FLD)) + != TRX_SYS_WSREP_XID_MAGIC_N) { + memset(xid, 0, sizeof(*xid)); + xid->formatID = -1; + trx_sys_update_wsrep_checkpoint(xid, sys_header, &mtr); + mtr_commit(&mtr); + return; } - xid->formatID = (int)mach_read_from_4( - sys_header - + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_FORMAT); - xid->gtrid_length = (int)mach_read_from_4( - sys_header - + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_GTRID_LEN); - xid->bqual_length = (int)mach_read_from_4( - sys_header - + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_BQUAL_LEN); - ut_memcpy(xid->data, - sys_header + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_DATA, - XIDDATASIZE); + xid->formatID = (int)mach_read_from_4( + sys_header + + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_FORMAT); + xid->gtrid_length = (int)mach_read_from_4( + sys_header + + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_GTRID_LEN); + xid->bqual_length = (int)mach_read_from_4( + sys_header + + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_BQUAL_LEN); + ut_memcpy(xid->data, + sys_header + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_DATA, + XIDDATASIZE); mtr_commit(&mtr); } From 77f5b188d35ba5a5bf5f06c4e0ef25d25dacd963 Mon Sep 17 00:00:00 2001 From: Daniele Sciascia Date: Mon, 6 Feb 2017 18:07:21 +0100 Subject: [PATCH 02/54] MW-357 Reset thd->wsrep_apply_toi regardless of applier exiting Applier does not reset thd->wsrep_apply_toi if applier thread decides to exit by setting 'exit= true'. The problem is that galera side may decide not to kill the applier thread: for instance if we try to SET wsrep_slave_threads = 0; then galera refuses to kill the last applier thread. If this happens we are left with a thd which has not been reset to the initial state. This patch ensures that the thd is reset regardless of the applier thread exiting or not. --- mysql-test/suite/galera/r/MW-357.result | 6 ++++++ mysql-test/suite/galera/t/MW-357.test | 13 +++++++++++++ sql/wsrep_applier.cc | 4 +++- 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 mysql-test/suite/galera/r/MW-357.result create mode 100644 mysql-test/suite/galera/t/MW-357.test diff --git a/mysql-test/suite/galera/r/MW-357.result b/mysql-test/suite/galera/r/MW-357.result new file mode 100644 index 00000000000..d249d5997f7 --- /dev/null +++ b/mysql-test/suite/galera/r/MW-357.result @@ -0,0 +1,6 @@ +SET GLOBAL wsrep_slave_threads = 0; +Warnings: +Warning 1292 Truncated incorrect wsrep_slave_threads value: '0' +CREATE TABLE t1 (f1 INT PRIMARY KEY) Engine=InnoDB; +INSERT INTO t1 VALUES (1); +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MW-357.test b/mysql-test/suite/galera/t/MW-357.test new file mode 100644 index 00000000000..d13cf058aeb --- /dev/null +++ b/mysql-test/suite/galera/t/MW-357.test @@ -0,0 +1,13 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_2 +SET GLOBAL wsrep_slave_threads = 0; + +--connection node_1 +CREATE TABLE t1 (f1 INT PRIMARY KEY) Engine=InnoDB; + +--connection node_1 +INSERT INTO t1 VALUES (1); + +DROP TABLE t1; diff --git a/sql/wsrep_applier.cc b/sql/wsrep_applier.cc index 73a43185162..49087d09224 100644 --- a/sql/wsrep_applier.cc +++ b/sql/wsrep_applier.cc @@ -217,6 +217,8 @@ wsrep_cb_status_t wsrep_apply_cb(void* const ctx, { THD* const thd((THD*)ctx); + assert(thd->wsrep_apply_toi == false); + // Allow tests to block the applier thread using the DBUG facilities. DBUG_EXECUTE_IF("sync.wsrep_apply_cb", { @@ -380,7 +382,7 @@ wsrep_cb_status_t wsrep_commit_cb(void* const ctx, mysql_mutex_unlock(&LOCK_wsrep_slave_threads); } - if (*exit == false && thd->wsrep_applier) + if (thd->wsrep_applier) { /* From trans_begin() */ thd->variables.option_bits|= OPTION_BEGIN; From 7af44d7aa07e1678bb48d4f4b9ce2c809b611079 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Wed, 8 Feb 2017 06:56:00 -0800 Subject: [PATCH 03/54] Galera MTR Tests: MW-359 Include include/have_innodb.inc part of include/galera_cluster.inc --- mysql-test/include/galera_cluster.inc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mysql-test/include/galera_cluster.inc b/mysql-test/include/galera_cluster.inc index bc652225722..c1834c3c26f 100644 --- a/mysql-test/include/galera_cluster.inc +++ b/mysql-test/include/galera_cluster.inc @@ -8,3 +8,5 @@ --let $galera_cluster_size = 2 --source include/galera_init.inc + +--source include/have_innodb.inc From 364b15c090e7337eb752eec4bea239052f73b2ed Mon Sep 17 00:00:00 2001 From: Daniele Sciascia Date: Wed, 8 Feb 2017 23:36:34 +0100 Subject: [PATCH 04/54] MW-336 Avoid slave threads leaking This patch fixes two problems that may arise when changing the value of wsrep_slave_threads: 1) Threads may be leaked if wsrep_slave_threads is changed repeatedly. Specifically, when changing the number of slave threads, we keep track of wsrep_slave_count_change, the number of slaves to start / stop. The problem arises when wsrep_slave_count_change is updated before slaves had a chance to exit (threads may take some time to exit, as they exit only after commiting one more replication event). The fix is to update wsrep_slave_count_change such that it reflects the number of threads that already exited or are scheduled to exit. 2) Attempting to set out of range value for wsrep_slave_threads (below 1 / above 512) results in wsrep_slave_count_change to be computed based on the out of range value, even though a warning is generated and wsrep_slave_threads is set to a truncated value. wsrep_slave_count_change is computed in wsrep_slave_threads_check(), which is called before mysql checks for valid range. Fix is to update wsrep_count_change whenever wsrep_slave_threads is updated with a valid value. --- mysql-test/suite/galera/r/MW-336.result | 42 ++++++++++++++++ mysql-test/suite/galera/t/MW-336.test | 64 +++++++++++++++++++++++++ sql/sys_vars.cc | 2 +- sql/wsrep_var.cc | 13 +++-- 4 files changed, 113 insertions(+), 8 deletions(-) create mode 100644 mysql-test/suite/galera/r/MW-336.result create mode 100644 mysql-test/suite/galera/t/MW-336.test diff --git a/mysql-test/suite/galera/r/MW-336.result b/mysql-test/suite/galera/r/MW-336.result new file mode 100644 index 00000000000..9bdb61c1a9c --- /dev/null +++ b/mysql-test/suite/galera/r/MW-336.result @@ -0,0 +1,42 @@ +CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; +SET GLOBAL wsrep_slave_threads = 10; +SET GLOBAL wsrep_slave_threads = 1; +INSERT INTO t1 VALUES (1); +SET GLOBAL wsrep_slave_threads = 10; +SELECT COUNT(*) = 11 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; +COUNT(*) = 11 +1 +SET GLOBAL wsrep_slave_threads = 20; +SELECT COUNT(*) = 21 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; +COUNT(*) = 21 +1 +SET GLOBAL wsrep_slave_threads = 1; +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); +INSERT INTO t1 VALUES (6); +INSERT INTO t1 VALUES (7); +INSERT INTO t1 VALUES (8); +INSERT INTO t1 VALUES (9); +SET GLOBAL wsrep_slave_threads = 10; +SET GLOBAL wsrep_slave_threads = 0; +Warnings: +Warning 1292 Truncated incorrect wsrep_slave_threads value: '0' +INSERT INTO t1 VALUES (10); +INSERT INTO t1 VALUES (11); +INSERT INTO t1 VALUES (12); +INSERT INTO t1 VALUES (13); +INSERT INTO t1 VALUES (14); +INSERT INTO t1 VALUES (15); +INSERT INTO t1 VALUES (16); +INSERT INTO t1 VALUES (17); +INSERT INTO t1 VALUES (18); +INSERT INTO t1 VALUES (19); +INSERT INTO t1 VALUES (20); +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; +COUNT(*) = 2 +1 +SET GLOBAL wsrep_slave_threads = 1; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MW-336.test b/mysql-test/suite/galera/t/MW-336.test new file mode 100644 index 00000000000..79d8951a822 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-336.test @@ -0,0 +1,64 @@ +# +# MW-336 Slave threads may leak if variable wsrep_slave_threads is set repeatedly +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; + +--connection node_1 +SET GLOBAL wsrep_slave_threads = 10; +SET GLOBAL wsrep_slave_threads = 1; + +--connection node_2 +INSERT INTO t1 VALUES (1); + +--connection node_1 +--sleep 0.5 +SET GLOBAL wsrep_slave_threads = 10; +--sleep 0.5 +SELECT COUNT(*) = 11 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; + +SET GLOBAL wsrep_slave_threads = 20; +--sleep 0.5 +SELECT COUNT(*) = 21 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; + + +SET GLOBAL wsrep_slave_threads = 1; + +--connection node_2 +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); +INSERT INTO t1 VALUES (6); +INSERT INTO t1 VALUES (7); +INSERT INTO t1 VALUES (8); +INSERT INTO t1 VALUES (9); + + +--connection node_1 +SET GLOBAL wsrep_slave_threads = 10; +SET GLOBAL wsrep_slave_threads = 0; + +--connection node_2 +INSERT INTO t1 VALUES (10); +INSERT INTO t1 VALUES (11); +INSERT INTO t1 VALUES (12); +INSERT INTO t1 VALUES (13); +INSERT INTO t1 VALUES (14); +INSERT INTO t1 VALUES (15); +INSERT INTO t1 VALUES (16); +INSERT INTO t1 VALUES (17); +INSERT INTO t1 VALUES (18); +INSERT INTO t1 VALUES (19); +INSERT INTO t1 VALUES (20); + +--connection node_1 +--sleep 0.5 +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; + +SET GLOBAL wsrep_slave_threads = 1; +DROP TABLE t1; diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 000a424faeb..e234d441b78 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -4568,7 +4568,7 @@ static Sys_var_ulong Sys_wsrep_slave_threads( GLOBAL_VAR(wsrep_slave_threads), CMD_LINE(REQUIRED_ARG), VALID_RANGE(1, 512), DEFAULT(1), BLOCK_SIZE(1), &PLock_wsrep_slave_threads, NOT_IN_BINLOG, - ON_CHECK(wsrep_slave_threads_check), + ON_CHECK(NULL), ON_UPDATE(wsrep_slave_threads_update)); static Sys_var_charptr Sys_wsrep_dbug_option( diff --git a/sql/wsrep_var.cc b/sql/wsrep_var.cc index 8a507711daf..9a5c7b86068 100644 --- a/sql/wsrep_var.cc +++ b/sql/wsrep_var.cc @@ -36,6 +36,8 @@ const char* wsrep_node_address = 0; const char* wsrep_node_incoming_address = 0; const char* wsrep_start_position = 0; +static long wsrep_prev_slave_threads = wsrep_slave_threads; + int wsrep_init_vars() { wsrep_provider = my_strdup(WSREP_NONE, MYF(MY_WME)); @@ -497,18 +499,15 @@ void wsrep_node_address_init (const char* value) wsrep_node_address = (value) ? my_strdup(value, MYF(0)) : NULL; } -bool wsrep_slave_threads_check (sys_var *self, THD* thd, set_var* var) +static void wsrep_slave_count_change_update () { - mysql_mutex_lock(&LOCK_wsrep_slave_threads); - wsrep_slave_count_change += (var->save_result.ulonglong_value - - wsrep_slave_threads); - mysql_mutex_unlock(&LOCK_wsrep_slave_threads); - - return 0; + wsrep_slave_count_change += (wsrep_slave_threads - wsrep_prev_slave_threads); + wsrep_prev_slave_threads = wsrep_slave_threads; } bool wsrep_slave_threads_update (sys_var *self, THD* thd, enum_var_type type) { + wsrep_slave_count_change_update(); if (wsrep_slave_count_change > 0) { wsrep_create_appliers(wsrep_slave_count_change); From 7ef2d5aa5b5d0179d40bd42afea874235b8b60f8 Mon Sep 17 00:00:00 2001 From: sjaakola Date: Thu, 16 Feb 2017 23:19:10 +0200 Subject: [PATCH 05/54] Refs: MW-360 * splitting DROP TABLE query in separate DROP commands for temporary and real tables * not replicating temporary table DROP command * using wsrep_sidno GTID group only for innodb table drop command part all this follows more or less the logic of how mysql wants to split drop table list --- sql/sql_class.cc | 5 +- sql/sql_class.h | 2 + sql/sql_parse.cc | 28 +++++++---- sql/sql_parse.h | 26 ++-------- sql/sql_partition_admin.cc | 4 +- sql/sql_table.cc | 100 +++++++++++++++++++++++++++++++++++++ sql/sql_truncate.cc | 2 +- sql/wsrep_hton.cc | 1 + sql/wsrep_mysqld.cc | 11 ++-- sql/wsrep_mysqld.h | 26 +++++++++- 10 files changed, 163 insertions(+), 42 deletions(-) diff --git a/sql/sql_class.cc b/sql/sql_class.cc index f0543becc0c..5964f4475a4 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -1213,6 +1213,8 @@ THD::THD() wsrep_TOI_pre_query_len = 0; wsrep_sync_wait_gtid = WSREP_GTID_UNDEFINED; wsrep_affected_rows = 0; + wsrep_replicate_GTID = false; + wsrep_skip_wsrep_GTID = false; #endif /* Call to init() below requires fully initialized Open_tables_state. */ reset_open_tables_state(this); @@ -1631,7 +1633,8 @@ void THD::init(void) wsrep_TOI_pre_query_len = 0; wsrep_sync_wait_gtid = WSREP_GTID_UNDEFINED; wsrep_affected_rows = 0; - + wsrep_replicate_GTID = false; + wsrep_skip_wsrep_GTID = false; /* @@wsrep_causal_reads is now being handled via wsrep_sync_wait, update it appropriately. diff --git a/sql/sql_class.h b/sql/sql_class.h index beef22a8140..8c9b8f92040 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -3867,6 +3867,8 @@ public: bool wsrep_skip_append_keys; wsrep_gtid_t wsrep_sync_wait_gtid; ulong wsrep_affected_rows; + bool wsrep_replicate_GTID; + bool wsrep_skip_wsrep_GTID; #endif /* WITH_WSREP */ }; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 9f0b6e25a5c..a4442653839 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -4031,16 +4031,24 @@ end_with_restore_list: thd->variables.option_bits|= OPTION_KEEP_LOG; } #ifdef WITH_WSREP - for (TABLE_LIST *table= all_tables; table; table= table->next_global) - { - if (!lex->drop_temporary && - (!thd->is_current_stmt_binlog_format_row() || - !find_temporary_table(thd, table))) - { - WSREP_TO_ISOLATION_BEGIN(NULL, NULL, all_tables); - break; - } - } + bool has_tmp_tables= false; + for (TABLE_LIST *table= all_tables; table; table= table->next_global) + { + if (lex->drop_temporary || find_temporary_table(thd, table)) + { + has_tmp_tables= true; + break; + } + } + if (has_tmp_tables) + { + wsrep_replicate_drop_query(thd, first_table, lex->check_exists, + lex->drop_temporary, false); + } + else + { + WSREP_TO_ISOLATION_BEGIN(NULL, NULL, all_tables); + } #endif /* WITH_WSREP */ /* If we are a slave, we should add IF EXISTS if the query executed diff --git a/sql/sql_parse.h b/sql/sql_parse.h index 368bba91c20..c2dbb950f2a 100644 --- a/sql/sql_parse.h +++ b/sql/sql_parse.h @@ -208,31 +208,13 @@ inline bool is_supported_parser_charset(CHARSET_INFO *cs) { return MY_TEST(cs->mbminlen == 1); } -#ifdef WITH_WSREP - -#define WSREP_MYSQL_DB (char *)"mysql" -#define WSREP_TO_ISOLATION_BEGIN(db_, table_, table_list_) \ - if (WSREP(thd) && wsrep_to_isolation_begin(thd, db_, table_, table_list_)) goto error; - -#define WSREP_TO_ISOLATION_END \ - if (WSREP(thd) || (thd && thd->wsrep_exec_mode==TOTAL_ORDER)) \ - wsrep_to_isolation_end(thd); - -/* - Checks if lex->no_write_to_binlog is set for statements that use LOCAL or - NO_WRITE_TO_BINLOG. -*/ -#define WSREP_TO_ISOLATION_BEGIN_WRTCHK(db_, table_, table_list_) \ - if (WSREP(thd) && !thd->lex->no_write_to_binlog \ - && wsrep_to_isolation_begin(thd, db_, table_, table_list_)) goto error; - -#else +#ifndef WITH_WSREP #define WSREP_TO_ISOLATION_BEGIN(db_, table_, table_list_) +#define WSREP_TO_ISOLATION_BEGIN_QUERY(db_, query_, table_, table_list_) #define WSREP_TO_ISOLATION_END -#define WSREP_TO_ISOLATION_BEGIN_WRTCHK(db_, table_, table_list_) - -#endif /* WITH_WSREP */ +#define WSREP_TO_ISOLATION_BEGIN_WRTCHK(db_, query_, table_, table_list_) +#endif /* !WITH_WSREP */ #endif /* SQL_PARSE_INCLUDED */ diff --git a/sql/sql_partition_admin.cc b/sql/sql_partition_admin.cc index 2a76c8d6671..d50fe0379f3 100644 --- a/sql/sql_partition_admin.cc +++ b/sql/sql_partition_admin.cc @@ -537,7 +537,7 @@ bool Sql_cmd_alter_table_exchange_partition:: if ((!thd->is_current_stmt_binlog_format_row() || /* TODO: Do we really need to check for temp tables in this case? */ !find_temporary_table(thd, table_list)) && - wsrep_to_isolation_begin(thd, table_list->db, table_list->table_name, + wsrep_to_isolation_begin(thd, NULL, table_list->db, table_list->table_name, NULL)) { WSREP_WARN("ALTER TABLE EXCHANGE PARTITION isolation failure"); @@ -785,7 +785,7 @@ bool Sql_cmd_alter_table_truncate_partition::execute(THD *thd) 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) + thd, NULL, first_table->db, first_table->table_name, NULL) ) { WSREP_WARN("ALTER TABLE TRUNCATE PARTITION isolation failure"); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index e591b8a1eb7..6a9107cb240 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -2156,7 +2156,95 @@ static uint32 comment_length(THD *thd, uint32 comment_pos, return 0; } +#ifdef WITH_WSREP +static void +wsrep_append_name(THD *thd, String *packet, const char *name, uint length, + const CHARSET_INFO *from_cs, const CHARSET_INFO *to_cs) +{ + const char *to_name= name; + size_t to_length= length; + String to_string(name,length, from_cs); + if (from_cs != NULL && to_cs != NULL && from_cs != to_cs) + thd->convert_string(&to_string, from_cs, to_cs); + if (to_cs != NULL) + { + to_name= to_string.c_ptr(); + to_length= to_string.length(); + } + packet->append(to_name, to_length, packet->charset()); +} + +int wsrep_replicate_drop_query(THD *thd, TABLE_LIST *tables, bool if_exists, + bool drop_temporary, bool dont_log_query) +{ + TABLE_LIST *table; + int error= 0; + String built_query; + bool non_tmp_table_deleted= FALSE; + + DBUG_ENTER("wsrep_build_drop_query"); + + if (!dont_log_query) + { + if (!drop_temporary) + { + built_query.set_charset(system_charset_info); + if (if_exists) + built_query.append("DROP TABLE IF EXISTS "); + else + built_query.append("DROP TABLE "); + } + } + + for (table= tables; table; table= table->next_local) + { + char *db=table->db; + int db_len= table->db_length; + + DBUG_PRINT("table", ("table_l: '%s'.'%s' table: 0x%lx s: 0x%lx", + table->db, table->table_name, (long) table->table, + table->table ? (long) table->table->s : (long) -1)); + + if (!find_temporary_table(thd, table)) + { + non_tmp_table_deleted= TRUE; + + if (thd->db == NULL || strcmp(db,thd->db) != 0) + { + wsrep_append_name(thd, &built_query, db, db_len, + system_charset_info, thd->charset()); + built_query.append("."); + } + + thd->variables.option_bits &= ~OPTION_QUOTE_SHOW_CREATE; + wsrep_append_name(thd, &built_query, table->table_name, + strlen(table->table_name), system_charset_info, + thd->charset()); + built_query.append(","); + } + } + +err: + if (non_tmp_table_deleted) + { + /* Chop of the last comma */ + built_query.chop(); + built_query.append(" /* generated by server */"); + WSREP_DEBUG("TOI for %s", built_query.ptr()); + if (WSREP_TO_ISOLATION_BEGIN_QUERY(built_query.ptr(), NULL, NULL, tables)) + { + WSREP_DEBUG("TOI failed for DROP TABLE: %s", WSREP_QUERY(thd)); + error= 1; + goto end; + } + } + +end: + DBUG_RETURN(error); +} + +#endif /* WITH_WSREP */ /** Execute the drop of a normal or temporary table. @@ -2591,6 +2679,9 @@ err: /* Chop of the last comma */ built_non_trans_tmp_query.chop(); built_non_trans_tmp_query.append(" /* generated by server */"); +#ifdef WITH_WSREP + thd->wsrep_skip_wsrep_GTID = true; +#endif /* WITH_WSREP */ error |= thd->binlog_query(THD::STMT_QUERY_TYPE, built_non_trans_tmp_query.ptr(), built_non_trans_tmp_query.length(), @@ -2603,6 +2694,9 @@ err: /* Chop of the last comma */ built_trans_tmp_query.chop(); built_trans_tmp_query.append(" /* generated by server */"); +#ifdef WITH_WSREP + thd->wsrep_skip_wsrep_GTID = true; +#endif /* WITH_WSREP */ error |= thd->binlog_query(THD::STMT_QUERY_TYPE, built_trans_tmp_query.ptr(), built_trans_tmp_query.length(), @@ -2617,6 +2711,9 @@ err: built_query.append(" /* generated by server */"); int error_code = non_tmp_error ? thd->get_stmt_da()->sql_errno() : 0; +#ifdef WITH_WSREP + thd->wsrep_skip_wsrep_GTID = false; +#endif /* WITH_WSREP */ error |= thd->binlog_query(THD::STMT_QUERY_TYPE, built_query.ptr(), built_query.length(), @@ -2665,6 +2762,9 @@ err: } end: +#ifdef WITH_WSREP + thd->wsrep_skip_wsrep_GTID = false; +#endif /* WITH_WSREP */ DBUG_RETURN(error); } diff --git a/sql/sql_truncate.cc b/sql/sql_truncate.cc index 16c2a5027e3..d047186b2cf 100644 --- a/sql/sql_truncate.cc +++ b/sql/sql_truncate.cc @@ -487,7 +487,7 @@ bool Sql_cmd_truncate_table::truncate_table(THD *thd, TABLE_LIST *table_ref) bool hton_can_recreate; #ifdef WITH_WSREP - if (WSREP(thd) && wsrep_to_isolation_begin(thd, + if (WSREP(thd) && wsrep_to_isolation_begin(thd, NULL, table_ref->db, table_ref->table_name, NULL)) DBUG_RETURN(TRUE); diff --git a/sql/wsrep_hton.cc b/sql/wsrep_hton.cc index 78d189fbd61..47697c34eb4 100644 --- a/sql/wsrep_hton.cc +++ b/sql/wsrep_hton.cc @@ -45,6 +45,7 @@ void wsrep_cleanup_transaction(THD *thd) thd->wsrep_trx_meta.depends_on= WSREP_SEQNO_UNDEFINED; thd->wsrep_exec_mode= LOCAL_STATE; thd->wsrep_affected_rows= 0; + thd->wsrep_skip_wsrep_GTID= false; return; } diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index 353911dcfde..6d0c5e75592 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -1211,7 +1211,7 @@ create_view_query(THD *thd, uchar** buf, size_t* buf_len) 1: TOI replication was skipped -1: TOI replication failed */ -static int wsrep_TOI_begin(THD *thd, char *db_, char *table_, +static int wsrep_TOI_begin(THD *thd, const char *query, char *db_, char *table_, const TABLE_LIST* table_list) { wsrep_status_t ret(WSREP_WARNING); @@ -1247,8 +1247,9 @@ static int wsrep_TOI_begin(THD *thd, char *db_, char *table_, } /* fallthrough */ default: - buf_err= wsrep_to_buf_helper(thd, thd->query(), thd->query_length(), &buf, - &buf_len); + buf_err= wsrep_to_buf_helper(thd, (query) ? query : thd->query(), + (query) ? strlen(query) : thd->query_length(), + &buf, &buf_len); break; } @@ -1397,7 +1398,7 @@ static void wsrep_RSU_end(THD *thd) thd->variables.wsrep_on = 1; } -int wsrep_to_isolation_begin(THD *thd, char *db_, char *table_, +int wsrep_to_isolation_begin(THD *thd, const char *query, char *db_, char *table_, const TABLE_LIST* table_list) { @@ -1452,7 +1453,7 @@ int wsrep_to_isolation_begin(THD *thd, char *db_, char *table_, if (thd->variables.wsrep_on && thd->wsrep_exec_mode==LOCAL_STATE) { switch (thd->variables.wsrep_OSU_method) { - case WSREP_OSU_TOI: ret = wsrep_TOI_begin(thd, db_, table_, + case WSREP_OSU_TOI: ret = wsrep_TOI_begin(thd, query, db_, table_, table_list); break; case WSREP_OSU_RSU: ret = wsrep_RSU_begin(thd, db_, table_); break; default: diff --git a/sql/wsrep_mysqld.h b/sql/wsrep_mysqld.h index 5ec183f7186..fa069723021 100644 --- a/sql/wsrep_mysqld.h +++ b/sql/wsrep_mysqld.h @@ -254,6 +254,8 @@ extern wsrep_seqno_t wsrep_locked_seqno; #define WSREP_PROVIDER_EXISTS \ (wsrep_provider && strncasecmp(wsrep_provider, WSREP_NONE, FN_REFLEN)) +#define WSREP_QUERY(thd) (thd->query()) + extern void wsrep_ready_wait(); enum wsrep_trx_status { @@ -318,7 +320,7 @@ extern PSI_mutex_key key_LOCK_wsrep_slave_threads; extern PSI_mutex_key key_LOCK_wsrep_desync; #endif /* HAVE_PSI_INTERFACE */ struct TABLE_LIST; -int wsrep_to_isolation_begin(THD *thd, char *db_, char *table_, +int wsrep_to_isolation_begin(THD *thd, const char * query, char *db_, char *table_, const TABLE_LIST* table_list); void wsrep_to_isolation_end(THD *thd); void wsrep_cleanup_transaction(THD *thd); @@ -335,4 +337,26 @@ void wsrep_init_sidno(const wsrep_uuid_t&); bool wsrep_node_is_donor(); bool wsrep_node_is_synced(); +int wsrep_replicate_drop_query(THD *thd, TABLE_LIST *tables, bool if_exists, + bool drop_temporary, bool dont_log_query); + + +#define WSREP_MYSQL_DB (char *)"mysql" +#define WSREP_TO_ISOLATION_BEGIN(db_, table_, table_list_) \ + if (WSREP(thd) && wsrep_to_isolation_begin(thd, NULL, db_, table_, table_list_)) goto error; + +#define WSREP_TO_ISOLATION_BEGIN_QUERY(query, db_, table_, table_list_) \ + (WSREP(thd) && wsrep_to_isolation_begin(thd, query, db_, table_, table_list_)) + +#define WSREP_TO_ISOLATION_END \ + if (WSREP(thd) || (thd && thd->wsrep_exec_mode==TOTAL_ORDER)) \ + wsrep_to_isolation_end(thd); + +/* Checks if lex->no_write_to_binlog is set for statements that use + LOCAL or NO_WRITE_TO_BINLOG +*/ +#define WSREP_TO_ISOLATION_BEGIN_WRTCHK(db_, table_, table_list_) \ + if (WSREP(thd) && !thd->lex->no_write_to_binlog \ + && wsrep_to_isolation_begin(thd, NULL, db_, table_, table_list_)) goto error; + #endif /* WSREP_MYSQLD_H */ From a754387a09023c3715170527b8fe396acd6c67c2 Mon Sep 17 00:00:00 2001 From: sjaakola Date: Fri, 17 Feb 2017 10:25:05 +0200 Subject: [PATCH 06/54] Refs: MW-360, fix for compiler warning --- sql/sql_table.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 6a9107cb240..95a12abf986 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -2225,7 +2225,6 @@ int wsrep_replicate_drop_query(THD *thd, TABLE_LIST *tables, bool if_exists, } } -err: if (non_tmp_table_deleted) { /* Chop of the last comma */ From 04c6b03c9b2155500d82ce880f3b8bea88f0c5a5 Mon Sep 17 00:00:00 2001 From: sjaakola Date: Mon, 20 Feb 2017 23:29:25 +0200 Subject: [PATCH 07/54] Refs: MW-360 * merged relevant parts of DROP TABLE query splitting from mysql-wsrep-features --- sql/sql_parse.cc | 21 +--- sql/sql_table.cc | 88 -------------- sql/wsrep_mysqld.cc | 288 ++++++++++++++++++++++++++++++++------------ sql/wsrep_mysqld.h | 3 - 4 files changed, 209 insertions(+), 191 deletions(-) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index a4442653839..d63a61e0ab1 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -4030,26 +4030,6 @@ end_with_restore_list: /* So that DROP TEMPORARY TABLE gets to binlog at commit/rollback */ thd->variables.option_bits|= OPTION_KEEP_LOG; } -#ifdef WITH_WSREP - bool has_tmp_tables= false; - for (TABLE_LIST *table= all_tables; table; table= table->next_global) - { - if (lex->drop_temporary || find_temporary_table(thd, table)) - { - has_tmp_tables= true; - break; - } - } - if (has_tmp_tables) - { - wsrep_replicate_drop_query(thd, first_table, lex->check_exists, - lex->drop_temporary, false); - } - else - { - WSREP_TO_ISOLATION_BEGIN(NULL, NULL, all_tables); - } -#endif /* WITH_WSREP */ /* If we are a slave, we should add IF EXISTS if the query executed on the master without an error. This will help a slave to @@ -4060,6 +4040,7 @@ end_with_restore_list: slave_ddl_exec_mode_options == SLAVE_EXEC_MODE_IDEMPOTENT) lex->check_exists= 1; + WSREP_TO_ISOLATION_BEGIN(NULL, NULL, all_tables); /* DDL and binlog write order are protected by metadata locks. */ res= mysql_rm_table(thd, first_table, lex->check_exists, lex->drop_temporary); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 95a12abf986..e2b16d402bf 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -2156,94 +2156,6 @@ static uint32 comment_length(THD *thd, uint32 comment_pos, return 0; } -#ifdef WITH_WSREP -static void -wsrep_append_name(THD *thd, String *packet, const char *name, uint length, - const CHARSET_INFO *from_cs, const CHARSET_INFO *to_cs) -{ - const char *to_name= name; - size_t to_length= length; - String to_string(name,length, from_cs); - if (from_cs != NULL && to_cs != NULL && from_cs != to_cs) - thd->convert_string(&to_string, from_cs, to_cs); - - if (to_cs != NULL) - { - to_name= to_string.c_ptr(); - to_length= to_string.length(); - } - packet->append(to_name, to_length, packet->charset()); -} - -int wsrep_replicate_drop_query(THD *thd, TABLE_LIST *tables, bool if_exists, - bool drop_temporary, bool dont_log_query) -{ - TABLE_LIST *table; - int error= 0; - String built_query; - bool non_tmp_table_deleted= FALSE; - - DBUG_ENTER("wsrep_build_drop_query"); - - if (!dont_log_query) - { - if (!drop_temporary) - { - built_query.set_charset(system_charset_info); - if (if_exists) - built_query.append("DROP TABLE IF EXISTS "); - else - built_query.append("DROP TABLE "); - } - } - - for (table= tables; table; table= table->next_local) - { - char *db=table->db; - int db_len= table->db_length; - - DBUG_PRINT("table", ("table_l: '%s'.'%s' table: 0x%lx s: 0x%lx", - table->db, table->table_name, (long) table->table, - table->table ? (long) table->table->s : (long) -1)); - - if (!find_temporary_table(thd, table)) - { - non_tmp_table_deleted= TRUE; - - if (thd->db == NULL || strcmp(db,thd->db) != 0) - { - wsrep_append_name(thd, &built_query, db, db_len, - system_charset_info, thd->charset()); - built_query.append("."); - } - - thd->variables.option_bits &= ~OPTION_QUOTE_SHOW_CREATE; - wsrep_append_name(thd, &built_query, table->table_name, - strlen(table->table_name), system_charset_info, - thd->charset()); - built_query.append(","); - } - } - - if (non_tmp_table_deleted) - { - /* Chop of the last comma */ - built_query.chop(); - built_query.append(" /* generated by server */"); - WSREP_DEBUG("TOI for %s", built_query.ptr()); - if (WSREP_TO_ISOLATION_BEGIN_QUERY(built_query.ptr(), NULL, NULL, tables)) - { - WSREP_DEBUG("TOI failed for DROP TABLE: %s", WSREP_QUERY(thd)); - error= 1; - goto end; - } - } - -end: - DBUG_RETURN(error); -} - -#endif /* WITH_WSREP */ /** Execute the drop of a normal or temporary table. diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index 6d0c5e75592..fa8991709db 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -2,7 +2,7 @@ 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 - the Free Software Foundation; version 2 of the License. + the Free Software Foundation; version 2 of the License.x1 This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -16,6 +16,7 @@ #include #include #include +#include /* find_temporary_table() */ #include "wsrep_priv.h" #include "wsrep_thd.h" #include "wsrep_sst.h" @@ -948,86 +949,66 @@ static bool wsrep_prepare_keys_for_isolation(THD* thd, const TABLE_LIST* table_list, wsrep_key_arr_t* ka) { - ka->keys= 0; - ka->keys_len= 0; + ka->keys= 0; + ka->keys_len= 0; - extern TABLE* find_temporary_table(THD*, const TABLE_LIST*); - - if (db || table) + if (db || table) + { + if (!(ka->keys= (wsrep_key_t*)my_malloc(sizeof(wsrep_key_t), MYF(0)))) { - TABLE_LIST tmp_table; - MDL_request mdl_request; - - memset(&tmp_table, 0, sizeof(tmp_table)); - tmp_table.table_name= (char*)table; - tmp_table.db= (char*)db; - tmp_table.mdl_request.init(MDL_key::GLOBAL, (db) ? db : "", - (table) ? table : "", - MDL_INTENTION_EXCLUSIVE, MDL_STATEMENT); - - if (!table || !find_temporary_table(thd, &tmp_table)) - { - if (!(ka->keys= (wsrep_key_t*)my_malloc(sizeof(wsrep_key_t), MYF(0)))) - { - WSREP_ERROR("Can't allocate memory for key_array"); - goto err; - } - ka->keys_len= 1; - if (!(ka->keys[0].key_parts= (wsrep_buf_t*) - my_malloc(sizeof(wsrep_buf_t)*2, MYF(0)))) - { - WSREP_ERROR("Can't allocate memory for key_parts"); - goto err; - } - ka->keys[0].key_parts_num= 2; - if (!wsrep_prepare_key_for_isolation( - db, table, - (wsrep_buf_t*)ka->keys[0].key_parts, - &ka->keys[0].key_parts_num)) - { - WSREP_ERROR("Preparing keys for isolation failed"); - goto err; - } - } + WSREP_ERROR("Can't allocate memory for key_array"); + goto err; } - - for (const TABLE_LIST* table= table_list; table; table= table->next_global) + ka->keys_len= 1; + if (!(ka->keys[0].key_parts= (wsrep_buf_t*) + my_malloc(sizeof(wsrep_buf_t)*2, MYF(0)))) { - if (!find_temporary_table(thd, table)) - { - wsrep_key_t* tmp; - tmp= (wsrep_key_t*)my_realloc( - ka->keys, (ka->keys_len + 1) * sizeof(wsrep_key_t), - MYF(MY_ALLOW_ZERO_PTR)); - - if (!tmp) - { - WSREP_ERROR("Can't allocate memory for key_array"); - goto err; - } - ka->keys= tmp; - if (!(ka->keys[ka->keys_len].key_parts= (wsrep_buf_t*) - my_malloc(sizeof(wsrep_buf_t)*2, MYF(0)))) - { - WSREP_ERROR("Can't allocate memory for key_parts"); - goto err; - } - ka->keys[ka->keys_len].key_parts_num= 2; - ++ka->keys_len; - if (!wsrep_prepare_key_for_isolation( - table->db, table->table_name, - (wsrep_buf_t*)ka->keys[ka->keys_len - 1].key_parts, - &ka->keys[ka->keys_len - 1].key_parts_num)) - { - WSREP_ERROR("Preparing keys for isolation failed"); - goto err; - } - } + WSREP_ERROR("Can't allocate memory for key_parts"); + goto err; + } + ka->keys[0].key_parts_num= 2; + if (!wsrep_prepare_key_for_isolation( + db, table, + (wsrep_buf_t*)ka->keys[0].key_parts, + &ka->keys[0].key_parts_num)) + { + WSREP_ERROR("Preparing keys for isolation failed (1)"); + goto err; } - return true; + } + + for (const TABLE_LIST* table= table_list; table; table= table->next_global) + { + wsrep_key_t* tmp; + tmp= (wsrep_key_t*)my_realloc(ka->keys, + (ka->keys_len + 1) * sizeof(wsrep_key_t), + MYF(0)); + if (!tmp) + { + WSREP_ERROR("Can't allocate memory for key_array"); + goto err; + } + ka->keys= tmp; + if (!(ka->keys[ka->keys_len].key_parts= (wsrep_buf_t*) + my_malloc(sizeof(wsrep_buf_t)*2, MYF(0)))) + { + WSREP_ERROR("Can't allocate memory for key_parts"); + goto err; + } + ka->keys[ka->keys_len].key_parts_num= 2; + ++ka->keys_len; + if (!wsrep_prepare_key_for_isolation(table->db, table->table_name, + (wsrep_buf_t*)ka->keys[ka->keys_len - 1].key_parts, + &ka->keys[ka->keys_len - 1].key_parts_num)) + { + WSREP_ERROR("Preparing keys for isolation failed (2)"); + goto err; + } + } + return 0; err: wsrep_keys_free(ka); - return false; + return 1; } @@ -1205,6 +1186,144 @@ create_view_query(THD *thd, uchar** buf, size_t* buf_len) return wsrep_to_buf_helper(thd, buff.ptr(), buff.length(), buf, buf_len); } +/* + Rewrite DROP TABLE for TOI. Temporary tables are eliminated from + the query as they are visible only to client connection. + + TODO: See comments for sql_base.cc:drop_temporary_table() and refine + the function to deal with transactional locked tables. + */ +static int wsrep_drop_table_query(THD* thd, uchar** buf, size_t* buf_len) +{ + + LEX* lex= thd->lex; + SELECT_LEX* select_lex= &lex->select_lex; + TABLE_LIST* first_table= select_lex->table_list.first; + String buff; + + DBUG_ASSERT(!lex->drop_temporary); + + bool found_temp_table= false; + for (TABLE_LIST* table= first_table; table; table= table->next_global) + { + if (find_temporary_table(thd, table->db, table->table_name)) + { + found_temp_table= true; + break; + } + } + + if (found_temp_table) + { + buff.append("DROP TABLE "); + if (lex->check_exists) + buff.append("IF EXISTS "); + + for (TABLE_LIST* table= first_table; table; table= table->next_global) + { + if (!find_temporary_table(thd, table->db, table->table_name)) + { + append_identifier(thd, &buff, table->db, strlen(table->db)); + buff.append("."); + append_identifier(thd, &buff, table->table_name, + strlen(table->table_name)); + buff.append(","); + } + } + + /* Chop the last comma */ + buff.chop(); + buff.append(" /* generated by wsrep */"); + + WSREP_DEBUG("Rewrote '%s' as '%s'", thd->query(), buff.ptr()); + + return wsrep_to_buf_helper(thd, buff.ptr(), buff.length(), buf, buf_len); + } + else + { + return wsrep_to_buf_helper(thd, thd->query(), thd->query_length(), + buf, buf_len); + } +} + +/* + Decide if statement should run in TOI. + + Look if table or table_list contain temporary tables. If the + statement affects only temporary tables, statement should not run + in TOI. If the table list contains mix of regular and temporary tables + (DROP TABLE, OPTIMIZE, ANALYZE), statement should be run in TOI but + should be rewritten at later time for replication to contain only + non-temporary tables. + */ +static bool wsrep_can_run_in_toi(THD *thd, const char *db, const char *table, + const TABLE_LIST *table_list) +{ + DBUG_ASSERT(!table || db); + DBUG_ASSERT(table_list || db); + + LEX* lex= thd->lex; + SELECT_LEX* select_lex= &lex->select_lex; + TABLE_LIST* first_table= select_lex->table_list.first; + + switch (lex->sql_command) + { + case SQLCOM_CREATE_TABLE: + DBUG_ASSERT(!table_list); + if (thd->lex->create_info.options & HA_LEX_CREATE_TMP_TABLE) + { + return false; + } + return true; + + case SQLCOM_CREATE_VIEW: + + DBUG_ASSERT(!table_list); + DBUG_ASSERT(first_table); /* First table is view name */ + /* + If any of the remaining tables refer to temporary table error + is returned to client, so TOI can be skipped + */ + for (TABLE_LIST* it= first_table->next_global; it; it= it->next_global) + { + if (find_temporary_table(thd, it)) + { + return false; + } + } + return true; + + case SQLCOM_CREATE_TRIGGER: + + DBUG_ASSERT(!table_list); + DBUG_ASSERT(first_table); + + if (find_temporary_table(thd, first_table)) + { + return false; + } + return true; + + default: + if (table && !find_temporary_table(thd, db, table)) + { + return true; + } + + if (table_list) + { + for (TABLE_LIST* table= first_table; table; table= table->next_global) + { + if (!find_temporary_table(thd, table->db, table->table_name)) + { + return true; + } + } + } + return !(table || table_list); + } +} + /* returns: 0: statement was replicated as TOI @@ -1220,6 +1339,12 @@ static int wsrep_TOI_begin(THD *thd, const char *query, char *db_, char *table_, int buf_err; int rc= 0; + if (wsrep_can_run_in_toi(thd, db_, table_, table_list) == false) + { + WSREP_DEBUG("No TOI for %s", WSREP_QUERY(thd)); + return 1; + } + WSREP_DEBUG("TO BEGIN: %lld, %d : %s", (long long)wsrep_thd_trx_seqno(thd), thd->wsrep_exec_mode, thd->query() ); switch (thd->lex->sql_command) @@ -1255,9 +1380,9 @@ static int wsrep_TOI_begin(THD *thd, const char *query, char *db_, char *table_, wsrep_key_arr_t key_arr= {0, 0}; struct wsrep_buf buff = { buf, buf_len }; - if (!buf_err && - wsrep_prepare_keys_for_isolation(thd, db_, table_, table_list, &key_arr)&& - key_arr.keys_len > 0 && + if (!buf_err && + !wsrep_prepare_keys_for_isolation(thd, db_, table_, table_list, &key_arr) && + key_arr.keys_len > 0 && WSREP_OK == (ret = wsrep->to_execute_start(wsrep, thd->thread_id, key_arr.keys, key_arr.keys_len, &buff, 1, @@ -1453,9 +1578,12 @@ int wsrep_to_isolation_begin(THD *thd, const char *query, char *db_, char *table if (thd->variables.wsrep_on && thd->wsrep_exec_mode==LOCAL_STATE) { switch (thd->variables.wsrep_OSU_method) { - case WSREP_OSU_TOI: ret = wsrep_TOI_begin(thd, query, db_, table_, - table_list); break; - case WSREP_OSU_RSU: ret = wsrep_RSU_begin(thd, db_, table_); break; + case WSREP_OSU_TOI: + ret = wsrep_TOI_begin(thd, query, db_, table_, table_list); + break; + case WSREP_OSU_RSU: + ret = wsrep_RSU_begin(thd, db_, table_); + break; default: WSREP_ERROR("Unsupported OSU method: %lu", thd->variables.wsrep_OSU_method); diff --git a/sql/wsrep_mysqld.h b/sql/wsrep_mysqld.h index fa069723021..ea7e7df9e10 100644 --- a/sql/wsrep_mysqld.h +++ b/sql/wsrep_mysqld.h @@ -337,9 +337,6 @@ void wsrep_init_sidno(const wsrep_uuid_t&); bool wsrep_node_is_donor(); bool wsrep_node_is_synced(); -int wsrep_replicate_drop_query(THD *thd, TABLE_LIST *tables, bool if_exists, - bool drop_temporary, bool dont_log_query); - #define WSREP_MYSQL_DB (char *)"mysql" #define WSREP_TO_ISOLATION_BEGIN(db_, table_, table_list_) \ From 790a8274cd0ea471a81652aef932191660deb64b Mon Sep 17 00:00:00 2001 From: sjaakola Date: Wed, 22 Feb 2017 23:10:36 +0200 Subject: [PATCH 08/54] Refs: MW-360 * reverted WSREP_TO_ISOLATION macros back to original form --- sql/sql_parse.cc | 14 +++++++++++++- sql/sql_parse.h | 29 +++++++++++++++++++++++------ sql/sql_partition_admin.cc | 4 ++-- sql/sql_truncate.cc | 6 +++--- sql/wsrep_mysqld.cc | 4 ++-- sql/wsrep_mysqld.h | 20 +------------------- 6 files changed, 44 insertions(+), 33 deletions(-) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index d63a61e0ab1..e381f14f627 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -4040,7 +4040,19 @@ end_with_restore_list: slave_ddl_exec_mode_options == SLAVE_EXEC_MODE_IDEMPOTENT) lex->check_exists= 1; - WSREP_TO_ISOLATION_BEGIN(NULL, NULL, all_tables); +#ifdef WITH_WSREP + for (TABLE_LIST *table= all_tables; table; table= table->next_global) + { + if (!lex->drop_temporary && + (!thd->is_current_stmt_binlog_format_row() || + !find_temporary_table(thd, table))) + { + WSREP_TO_ISOLATION_BEGIN(NULL, NULL, all_tables); + break; + } + } +#endif /* WITH_WSREP */ + /* DDL and binlog write order are protected by metadata locks. */ res= mysql_rm_table(thd, first_table, lex->check_exists, lex->drop_temporary); diff --git a/sql/sql_parse.h b/sql/sql_parse.h index c2dbb950f2a..306ceed1863 100644 --- a/sql/sql_parse.h +++ b/sql/sql_parse.h @@ -209,12 +209,29 @@ inline bool is_supported_parser_charset(CHARSET_INFO *cs) return MY_TEST(cs->mbminlen == 1); } -#ifndef WITH_WSREP -#define WSREP_TO_ISOLATION_BEGIN(db_, table_, table_list_) -#define WSREP_TO_ISOLATION_BEGIN_QUERY(db_, query_, table_, table_list_) -#define WSREP_TO_ISOLATION_END -#define WSREP_TO_ISOLATION_BEGIN_WRTCHK(db_, query_, table_, table_list_) -#endif /* !WITH_WSREP */ +#ifdef WITH_WSREP +#define WSREP_MYSQL_DB (char *)"mysql" +#define WSREP_TO_ISOLATION_BEGIN(db_, table_, table_list_) \ + if (WSREP(thd) && wsrep_to_isolation_begin(thd, db_, table_, table_list_)) goto error; + +#define WSREP_TO_ISOLATION_END \ + if (WSREP(thd) || (thd && thd->wsrep_exec_mode==TOTAL_ORDER)) \ + wsrep_to_isolation_end(thd); + +/* Checks if lex->no_write_to_binlog is set for statements that use + LOCAL or NO_WRITE_TO_BINLOG +*/ +#define WSREP_TO_ISOLATION_BEGIN_WRTCHK(db_, table_, table_list_) \ + if (WSREP(thd) && !thd->lex->no_write_to_binlog \ + && wsrep_to_isolation_begin(thd, db_, table_, table_list_)) goto error; + +#else + +#define WSREP_TO_ISOLATION_BEGIN(db_, table_, table_list_) +#define WSREP_TO_ISOLATION_END +#define WSREP_TO_ISOLATION_BEGIN_WRTCHK(db_, table_, table_list_) + +#endif /* WITH_WSREP */ #endif /* SQL_PARSE_INCLUDED */ diff --git a/sql/sql_partition_admin.cc b/sql/sql_partition_admin.cc index d50fe0379f3..56c9c5bf3bf 100644 --- a/sql/sql_partition_admin.cc +++ b/sql/sql_partition_admin.cc @@ -537,7 +537,7 @@ bool Sql_cmd_alter_table_exchange_partition:: if ((!thd->is_current_stmt_binlog_format_row() || /* TODO: Do we really need to check for temp tables in this case? */ !find_temporary_table(thd, table_list)) && - wsrep_to_isolation_begin(thd, NULL, table_list->db, table_list->table_name, + wsrep_to_isolation_begin(thd, table_list->db, table_list->table_name, NULL)) { WSREP_WARN("ALTER TABLE EXCHANGE PARTITION isolation failure"); @@ -785,7 +785,7 @@ bool Sql_cmd_alter_table_truncate_partition::execute(THD *thd) if (WSREP(thd) && (!thd->is_current_stmt_binlog_format_row() || !find_temporary_table(thd, first_table)) && wsrep_to_isolation_begin( - thd, NULL, first_table->db, first_table->table_name, NULL) + thd, first_table->db, first_table->table_name, NULL) ) { WSREP_WARN("ALTER TABLE TRUNCATE PARTITION isolation failure"); diff --git a/sql/sql_truncate.cc b/sql/sql_truncate.cc index d047186b2cf..5182b35d80f 100644 --- a/sql/sql_truncate.cc +++ b/sql/sql_truncate.cc @@ -487,9 +487,9 @@ bool Sql_cmd_truncate_table::truncate_table(THD *thd, TABLE_LIST *table_ref) bool hton_can_recreate; #ifdef WITH_WSREP - if (WSREP(thd) && wsrep_to_isolation_begin(thd, NULL, - table_ref->db, - table_ref->table_name, NULL)) + if (WSREP(thd) && wsrep_to_isolation_begin(thd, + table_ref->db, + table_ref->table_name, NULL)) DBUG_RETURN(TRUE); #endif /* WITH_WSREP */ if (lock_table(thd, table_ref, &hton_can_recreate)) diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index fa8991709db..cf8ac25aa6a 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -1523,7 +1523,7 @@ static void wsrep_RSU_end(THD *thd) thd->variables.wsrep_on = 1; } -int wsrep_to_isolation_begin(THD *thd, const char *query, char *db_, char *table_, +int wsrep_to_isolation_begin(THD *thd, char *db_, char *table_, const TABLE_LIST* table_list) { @@ -1579,7 +1579,7 @@ int wsrep_to_isolation_begin(THD *thd, const char *query, char *db_, char *table { switch (thd->variables.wsrep_OSU_method) { case WSREP_OSU_TOI: - ret = wsrep_TOI_begin(thd, query, db_, table_, table_list); + ret = wsrep_TOI_begin(thd, thd->query(), db_, table_, table_list); break; case WSREP_OSU_RSU: ret = wsrep_RSU_begin(thd, db_, table_); diff --git a/sql/wsrep_mysqld.h b/sql/wsrep_mysqld.h index ea7e7df9e10..1cda5d23986 100644 --- a/sql/wsrep_mysqld.h +++ b/sql/wsrep_mysqld.h @@ -320,7 +320,7 @@ extern PSI_mutex_key key_LOCK_wsrep_slave_threads; extern PSI_mutex_key key_LOCK_wsrep_desync; #endif /* HAVE_PSI_INTERFACE */ struct TABLE_LIST; -int wsrep_to_isolation_begin(THD *thd, const char * query, char *db_, char *table_, +int wsrep_to_isolation_begin(THD *thd, char *db_, char *table_, const TABLE_LIST* table_list); void wsrep_to_isolation_end(THD *thd); void wsrep_cleanup_transaction(THD *thd); @@ -338,22 +338,4 @@ void wsrep_init_sidno(const wsrep_uuid_t&); bool wsrep_node_is_donor(); bool wsrep_node_is_synced(); -#define WSREP_MYSQL_DB (char *)"mysql" -#define WSREP_TO_ISOLATION_BEGIN(db_, table_, table_list_) \ - if (WSREP(thd) && wsrep_to_isolation_begin(thd, NULL, db_, table_, table_list_)) goto error; - -#define WSREP_TO_ISOLATION_BEGIN_QUERY(query, db_, table_, table_list_) \ - (WSREP(thd) && wsrep_to_isolation_begin(thd, query, db_, table_, table_list_)) - -#define WSREP_TO_ISOLATION_END \ - if (WSREP(thd) || (thd && thd->wsrep_exec_mode==TOTAL_ORDER)) \ - wsrep_to_isolation_end(thd); - -/* Checks if lex->no_write_to_binlog is set for statements that use - LOCAL or NO_WRITE_TO_BINLOG -*/ -#define WSREP_TO_ISOLATION_BEGIN_WRTCHK(db_, table_, table_list_) \ - if (WSREP(thd) && !thd->lex->no_write_to_binlog \ - && wsrep_to_isolation_begin(thd, NULL, db_, table_, table_list_)) goto error; - #endif /* WSREP_MYSQLD_H */ From 0ddf32c840b8b30957104d2a5b59d4edd9dcc297 Mon Sep 17 00:00:00 2001 From: sjaakola Date: Mon, 16 Jan 2017 16:10:37 +0200 Subject: [PATCH 09/54] refs: MW-322 * generating fake trx id for CTAS, requires trx_sys mutex protection to be safe for concurrent CTAS processors --- storage/innobase/handler/ha_innodb.cc | 2 +- storage/xtradb/handler/ha_innodb.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index a60c615828b..17fd02112d9 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -17945,7 +17945,7 @@ wsrep_fake_trx_id( mutex_enter(&trx_sys->mutex); trx_id_t trx_id = trx_sys_get_new_trx_id(); mutex_exit(&trx_sys->mutex); - + WSREP_DEBUG("innodb fake trx id: %lu thd: %s", trx_id, wsrep_thd_query(thd)); (void *)wsrep_ws_handle_for_trx(wsrep_thd_ws_handle(thd), trx_id); } diff --git a/storage/xtradb/handler/ha_innodb.cc b/storage/xtradb/handler/ha_innodb.cc index 8d48f63b962..ac2bf1010d6 100644 --- a/storage/xtradb/handler/ha_innodb.cc +++ b/storage/xtradb/handler/ha_innodb.cc @@ -19247,7 +19247,7 @@ wsrep_fake_trx_id( mutex_enter(&trx_sys->mutex); trx_id_t trx_id = trx_sys_get_new_trx_id(); mutex_exit(&trx_sys->mutex); - + WSREP_DEBUG("innodb fake trx id: %lu thd: %s", trx_id, wsrep_thd_query(thd)); (void *)wsrep_ws_handle_for_trx(wsrep_thd_ws_handle(thd), trx_id); } From ba3d26d3ab1bd7a58bb7455dc57c458e12eb72eb Mon Sep 17 00:00:00 2001 From: sjaakola Date: Sun, 26 Feb 2017 23:48:32 +0200 Subject: [PATCH 10/54] Refs: MW-360 * fixes required in pull request review --- sql/sql_table.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sql/sql_table.cc b/sql/sql_table.cc index e2b16d402bf..f789df26475 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -2110,6 +2110,7 @@ bool mysql_rm_table(THD *thd,TABLE_LIST *tables, my_bool if_exists, DBUG_RETURN(TRUE); my_ok(thd); DBUG_RETURN(FALSE); + } @@ -2674,7 +2675,7 @@ err: end: #ifdef WITH_WSREP - thd->wsrep_skip_wsrep_GTID = false; + thd->wsrep_skip_wsrep_GTID = false; #endif /* WITH_WSREP */ DBUG_RETURN(error); } From 5fb1260365a6dd8249414a58173ab238fe6d5996 Mon Sep 17 00:00:00 2001 From: sjaakola Date: Wed, 1 Mar 2017 11:27:33 +0200 Subject: [PATCH 11/54] Refs: MW-360, white space fix --- sql/sql_parse.h | 1 - 1 file changed, 1 deletion(-) diff --git a/sql/sql_parse.h b/sql/sql_parse.h index 306ceed1863..cf58ecb19e1 100644 --- a/sql/sql_parse.h +++ b/sql/sql_parse.h @@ -208,7 +208,6 @@ inline bool is_supported_parser_charset(CHARSET_INFO *cs) { return MY_TEST(cs->mbminlen == 1); } - #ifdef WITH_WSREP #define WSREP_MYSQL_DB (char *)"mysql" From 906426370318b4ab0af53485e7835c4ef43c7097 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Fri, 3 Mar 2017 03:51:07 -0800 Subject: [PATCH 12/54] Galera MTR Tests: Test for GAL-491: Progress output for IST --- .../suite/galera/r/galera_ist_progress.result | 19 +++++ .../suite/galera/t/galera_ist_progress.cnf | 5 ++ .../suite/galera/t/galera_ist_progress.test | 74 +++++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 mysql-test/suite/galera/r/galera_ist_progress.result create mode 100644 mysql-test/suite/galera/t/galera_ist_progress.cnf create mode 100644 mysql-test/suite/galera/t/galera_ist_progress.test diff --git a/mysql-test/suite/galera/r/galera_ist_progress.result b/mysql-test/suite/galera/r/galera_ist_progress.result new file mode 100644 index 00000000000..9fc7febbea5 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_ist_progress.result @@ -0,0 +1,19 @@ +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1'; +SET SESSION wsrep_on = OFF; +SET SESSION wsrep_on = ON; +CREATE TABLE t1 (f1 INTEGER) 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); +INSERT INTO t1 VALUES (6); +INSERT INTO t1 VALUES (7); +INSERT INTO t1 VALUES (8); +INSERT INTO t1 VALUES (9); +INSERT INTO t1 VALUES (10); +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 0'; +include/assert_grep.inc [Receiving IST: 11 writesets, seqnos] +include/assert_grep.inc [Receiving IST\.\.\. 0\.0% \( 0/11 events\) complete] +include/assert_grep.inc [Receiving IST\.\.\.100\.0% \(11/11 events\) complete] +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_ist_progress.cnf b/mysql-test/suite/galera/t/galera_ist_progress.cnf new file mode 100644 index 00000000000..0a26f6d6c83 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ist_progress.cnf @@ -0,0 +1,5 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;pc.ignore_sb=true' + diff --git a/mysql-test/suite/galera/t/galera_ist_progress.test b/mysql-test/suite/galera/t/galera_ist_progress.test new file mode 100644 index 00000000000..a4d331b37d7 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ist_progress.test @@ -0,0 +1,74 @@ +# +# Test progress output during IST +# + +--source include/galera_cluster.inc + +# Isolate node #2 +--connection node_2 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1'; + +--connection node_1 +--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_2 +SET SESSION wsrep_on = OFF; +--let $wait_condition = SELECT VARIABLE_VALUE = 'non-Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +SET SESSION wsrep_on = ON; + +# Node #2 is now isolated. Run some transactions to accumulate writesets for IST + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER) 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); +INSERT INTO t1 VALUES (6); +INSERT INTO t1 VALUES (7); +INSERT INTO t1 VALUES (8); +INSERT INTO t1 VALUES (9); +INSERT INTO t1 VALUES (10); + +# Restore node #2, IST is performed + +--connection node_2 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 0'; + +--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 + +--connection node_2 +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc + +# +# Grep for expected IST output in joiner log +# + +--connection node_1 + +--let $assert_count = 1 +--let $assert_file = $MYSQLTEST_VARDIR/log/mysqld.2.err +--let $assert_only_after = Need state transfer + +--let $assert_text = Receiving IST: 11 writesets, seqnos +--let $assert_select = Receiving IST: 11 writesets, seqnos +--source include/assert_grep.inc + +--let $assert_text = Receiving IST\.\.\. 0\.0% \( 0/11 events\) complete +--let $assert_select = Receiving IST\.\.\. 0\.0% \( 0/11 events\) complete +--source include/assert_grep.inc + +--let $assert_text = Receiving IST\.\.\.100\.0% \(11/11 events\) complete +--let $assert_select = Receiving IST\.\.\.100\.0% \(11/11 events\) complete +--source include/assert_grep.inc + +# Cleanup + +--connection node_1 +DROP TABLE t1; From 3ef3c467ad4ced24e7ed858fc080eb5ba985f1ee Mon Sep 17 00:00:00 2001 From: Daniele Sciascia Date: Thu, 2 Mar 2017 17:53:16 +0100 Subject: [PATCH 13/54] MW-365 Do not load/dump innodb buffer pool with wsrep_recover --- storage/innobase/buf/buf0dump.cc | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/storage/innobase/buf/buf0dump.cc b/storage/innobase/buf/buf0dump.cc index 83f870692a9..0682b8ef46e 100644 --- a/storage/innobase/buf/buf0dump.cc +++ b/storage/innobase/buf/buf0dump.cc @@ -41,6 +41,9 @@ Created April 08, 2011 Vasil Dimov #include "sync0rw.h" /* rw_lock_s_lock() */ #include "ut0byte.h" /* ut_ull_create() */ #include "ut0sort.h" /* UT_SORT_FUNCTION_BODY */ +#ifdef WITH_WSREP +extern my_bool wsrep_recovery; +#endif /* WITH_WSREP */ enum status_severity { STATUS_INFO, @@ -689,7 +692,13 @@ DECLARE_THREAD(buf_dump_thread)( buf_load_status(STATUS_INFO, "not started"); if (srv_buffer_pool_load_at_startup) { +#ifdef WITH_WSREP + if (!wsrep_recovery) { +#endif /* WITH_WSREP */ buf_load(); +#ifdef WITH_WSREP + } +#endif /* WITH_WSREP */ } while (!SHUTTING_DOWN()) { @@ -713,8 +722,14 @@ DECLARE_THREAD(buf_dump_thread)( } if (srv_buffer_pool_dump_at_shutdown && srv_fast_shutdown != 2) { +#ifdef WITH_WSREP + if (!wsrep_recovery) { +#endif /* WITH_WSREP */ buf_dump(FALSE /* ignore shutdown down flag, keep going even if we are in a shutdown state */); +#ifdef WITH_WSREP + } +#endif /* WITH_WSREP */ } srv_buf_dump_thread_active = FALSE; From 6da41e17d8cf833a5eb648fe8204e7031bb0e410 Mon Sep 17 00:00:00 2001 From: Daniele Sciascia Date: Thu, 2 Mar 2017 17:53:16 +0100 Subject: [PATCH 14/54] MW-365 Do not load/dump innodb buffer pool with wsrep_recover --- storage/xtradb/buf/buf0dump.cc | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/storage/xtradb/buf/buf0dump.cc b/storage/xtradb/buf/buf0dump.cc index 51c41cc1b78..d0892a4f6a5 100644 --- a/storage/xtradb/buf/buf0dump.cc +++ b/storage/xtradb/buf/buf0dump.cc @@ -41,6 +41,9 @@ Created April 08, 2011 Vasil Dimov #include "sync0rw.h" /* rw_lock_s_lock() */ #include "ut0byte.h" /* ut_ull_create() */ #include "ut0sort.h" /* UT_SORT_FUNCTION_BODY */ +#ifdef WITH_WSREP +extern my_bool wsrep_recovery; +#endif /* WITH_WSREP */ enum status_severity { STATUS_INFO, @@ -690,7 +693,13 @@ DECLARE_THREAD(buf_dump_thread)( buf_load_status(STATUS_INFO, "not started"); if (srv_buffer_pool_load_at_startup) { +#ifdef WITH_WSREP + if (!wsrep_recovery) { +#endif /* WITH_WSREP */ buf_load(); +#ifdef WITH_WSREP + } +#endif /* WITH_WSREP */ } while (!SHUTTING_DOWN()) { @@ -714,8 +723,14 @@ DECLARE_THREAD(buf_dump_thread)( } if (srv_buffer_pool_dump_at_shutdown && srv_fast_shutdown != 2) { +#ifdef WITH_WSREP + if (!wsrep_recovery) { +#endif /* WITH_WSREP */ buf_dump(FALSE /* ignore shutdown down flag, keep going even if we are in a shutdown state */); +#ifdef WITH_WSREP + } +#endif /* WITH_WSREP */ } srv_buf_dump_thread_active = FALSE; From 5108deded580998db3dbc7f9ef44134caeb42616 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Wed, 8 Mar 2017 01:35:05 -0800 Subject: [PATCH 15/54] Galera MTR Tests: Stability fixes --- mysql-test/suite/galera/t/GAL-401.test | 2 ++ mysql-test/suite/galera/t/lp1376747-4.test | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/mysql-test/suite/galera/t/GAL-401.test b/mysql-test/suite/galera/t/GAL-401.test index 05295d1b977..b419770f804 100644 --- a/mysql-test/suite/galera/t/GAL-401.test +++ b/mysql-test/suite/galera/t/GAL-401.test @@ -32,6 +32,8 @@ SET wsrep_dirty_reads=0; --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 +--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +--source include/wait_condition.inc # Must return 0: SHOW STATUS LIKE 'wsrep_desync_count'; diff --git a/mysql-test/suite/galera/t/lp1376747-4.test b/mysql-test/suite/galera/t/lp1376747-4.test index be56ee5edc1..0c707d6d681 100644 --- a/mysql-test/suite/galera/t/lp1376747-4.test +++ b/mysql-test/suite/galera/t/lp1376747-4.test @@ -45,7 +45,7 @@ SHOW CREATE TABLE t1; --connection node_2a --reap UNLOCK TABLES; ---sleep 1 +--sleep 2 SHOW CREATE TABLE t1; SELECT * from t1; From 83664e21e4fb6755c8c0c90d3dee8819d36928c9 Mon Sep 17 00:00:00 2001 From: Alexey Yurchenko Date: Fri, 3 Mar 2017 20:28:27 +0000 Subject: [PATCH 16/54] MW-366 Improved support for IPv6 networks - made mysqld and SST scripts to recognize []-escaped IPv6 addresses - pulled in latest Percona and MariaDB updates to SST scripts - instruct netcat and socat in wsrep_sst_xtrabackup-v2 to listen on IPv6 socket via sockopt parameter in the [sst] section of my.cnf In summary, wsrep_node_address and wsrep_sst_receive_address can now be set to IPv6 addresses escaped by []. Rsync SST works out ouf the box thanks to rsync daemon listening on both IPv4 and IPv6 sockets by default. For xtrabackup SST onver IPv6 one needs to set sockopt in the [sst] section of joiner's configuration file to ",pf=ip6" if using socat as a streamer or to "-6" if using netcat. --- scripts/wsrep_sst_common.sh | 57 +++++ scripts/wsrep_sst_mysqldump.sh | 6 +- scripts/wsrep_sst_rsync.sh | 44 ++-- scripts/wsrep_sst_xtrabackup-v2.sh | 386 ++++++++++++++++++++++------- sql/wsrep_mysqld.cc | 22 +- sql/wsrep_sst.cc | 37 +-- sql/wsrep_utils.cc | 15 ++ sql/wsrep_utils.h | 3 + 8 files changed, 415 insertions(+), 155 deletions(-) diff --git a/scripts/wsrep_sst_common.sh b/scripts/wsrep_sst_common.sh index 25ec0baae80..6906bcbc315 100644 --- a/scripts/wsrep_sst_common.sh +++ b/scripts/wsrep_sst_common.sh @@ -30,6 +30,22 @@ while [ $# -gt 0 ]; do case "$1" in '--address') readonly WSREP_SST_OPT_ADDR="$2" + # + # Break address string into host:port/path parts + # + if echo $WSREP_SST_OPT_ADDR | grep -qe '^\[.*\]' + then + # IPv6 notation + readonly WSREP_SST_OPT_HOST=${WSREP_SST_OPT_ADDR/\]*/\]} + readonly WSREP_SST_OPT_HOST_UNESCAPED=$(echo $WSREP_SST_OPT_HOST | \ + cut -d '[' -f 2 | cut -d ']' -f 1) + else + # "traditional" notation + readonly WSREP_SST_OPT_HOST=${WSREP_SST_OPT_ADDR%%[:/]*} + fi + readonly WSREP_SST_OPT_PORT=$(echo $WSREP_SST_OPT_ADDR | \ + cut -d ']' -f 2 | cut -s -d ':' -f 2 | cut -d '/' -f 1) + readonly WSREP_SST_OPT_PATH=${WSREP_SST_OPT_ADDR#*/} shift ;; '--bypass') @@ -169,6 +185,11 @@ wsrep_log_error() wsrep_log "[ERROR] $*" } +wsrep_log_warning() +{ + wsrep_log "[WARNING] $*" +} + wsrep_log_info() { wsrep_log "[INFO] $*" @@ -202,3 +223,39 @@ wsrep_check_programs() return $ret } + +# +# user can specify xtrabackup specific settings that will be used during sst +# process like encryption, etc..... +# parse such configuration option. (group for xb settings is [sst] in my.cnf +# +# 1st param: group : name of the config file section, e.g. mysqld +# 2nd param: var : name of the variable in the section, e.g. server-id +# 3rd param: - : default value for the param +parse_cnf() +{ + local group=$1 + local var=$2 + local reval="" + + # print the default settings for given group using my_print_default. + # normalize the variable names specified in cnf file (user can use _ or - for example log-bin or log_bin) + # then grep for needed variable + # finally get the variable value (if variables has been specified multiple time use the last value only) + + # look in group+suffix + if [[ -n $WSREP_SST_OPT_CONF_SUFFIX ]]; then + reval=$($MY_PRINT_DEFAULTS -c $WSREP_SST_OPT_CONF "${group}${WSREP_SST_OPT_CONF_SUFFIX}" | awk -F= '{if ($1 ~ /_/) { gsub(/_/,"-",$1); print $1"="$2 } else { print $0 }}' | grep -- "--$var=" | cut -d= -f2- | tail -1) + fi + + # look in group + if [[ -z $reval ]]; then + reval=$($MY_PRINT_DEFAULTS -c $WSREP_SST_OPT_CONF $group | awk -F= '{if ($1 ~ /_/) { gsub(/_/,"-",$1); print $1"="$2 } else { print $0 }}' | grep -- "--$var=" | cut -d= -f2- | tail -1) + fi + + # use default if we haven't found a value + if [[ -z $reval ]]; then + [[ -n $3 ]] && reval=$3 + fi + echo $reval +} diff --git a/scripts/wsrep_sst_mysqldump.sh b/scripts/wsrep_sst_mysqldump.sh index 9a061f89e43..f6f2187006d 100644 --- a/scripts/wsrep_sst_mysqldump.sh +++ b/scripts/wsrep_sst_mysqldump.sh @@ -30,6 +30,7 @@ local_ip() { [ "$1" = "127.0.0.1" ] && return 0 [ "$1" = "localhost" ] && return 0 + [ "$1" = "[::1]" ] && return 0 [ "$1" = "$(hostname -s)" ] && return 0 [ "$1" = "$(hostname -f)" ] && return 0 [ "$1" = "$(hostname -d)" ] && return 0 @@ -105,8 +106,9 @@ GTID_BINLOG_STATE=$(echo "SHOW GLOBAL VARIABLES LIKE 'gtid_binlog_state'" |\ $MYSQL_CLIENT $AUTH -S$WSREP_SST_OPT_SOCKET --disable-reconnect --connect_timeout=10 |\ tail -1 | awk -F ' ' '{ print $2 }') -MYSQL="$MYSQL_CLIENT $AUTH -h$WSREP_SST_OPT_HOST -P$WSREP_SST_OPT_PORT "\ -"--disable-reconnect --connect_timeout=10" +MYSQL="$MYSQL_CLIENT --defaults-extra-file=$WSREP_SST_OPT_CONF "\ +"$AUTH -h${WSREP_SST_OPT_HOST_UNESCAPED:-$WSREP_SST_OPT_HOST} "\ +"-P$WSREP_SST_OPT_PORT --disable-reconnect --connect_timeout=10" # Check if binary logging is enabled on the joiner node. # Note: SELECT cannot be used at this point. diff --git a/scripts/wsrep_sst_rsync.sh b/scripts/wsrep_sst_rsync.sh index 62f9e234d0e..1c1b09ce68f 100644 --- a/scripts/wsrep_sst_rsync.sh +++ b/scripts/wsrep_sst_rsync.sh @@ -67,6 +67,11 @@ check_pid_and_port() exit 2 # ENOENT fi + if ! which lsof > /dev/null; then + wsrep_log_error "lsof tool not found in PATH! Make sure you have it installed." + exit 2 # ENOENT + fi + local port_info=$(lsof -i :$rsync_port -Pn 2>/dev/null | \ grep "(LISTEN)") local is_rsync=$(echo $port_info | \ @@ -97,10 +102,19 @@ fi WSREP_LOG_DIR=${WSREP_LOG_DIR:-""} # if WSREP_LOG_DIR env. variable is not set, try to get it from my.cnf if [ -z "$WSREP_LOG_DIR" ]; then - WSREP_LOG_DIR=$($MY_PRINT_DEFAULTS --defaults-file \ - "$WSREP_SST_OPT_CONF" mysqld server mysqld-10.0 mariadb mariadb-10.0 \ - | grep -- '--innodb[-_]log[-_]group[-_]home[-_]dir=' \ - | cut -b 29- ) + WSREP_LOG_DIR=$(parse_cnf mariadb-10.0 innodb_log_group_home_dir "") +fi +if [ -z "$WSREP_LOG_DIR" ]; then + WSREP_LOG_DIR=$(parse_cnf mysqld innodb_log_group_home_dir "") +fi +if [ -z "$WSREP_LOG_DIR" ]; then + WSREP_LOG_DIR=$(parse_cnf server innodb_log_group_home_dir "") +fi +if [ -z "$WSREP_LOG_DIR" ]; then + WSREP_LOG_DIR=$(parse_cnf mariadb innodb_log_group_home_dir "") +fi +if [ -z "$WSREP_LOG_DIR" ]; then + WSREP_LOG_DIR=$(parse_cnf mysqld-10.0 innodb_log_group_home_dir "") fi if [ -n "$WSREP_LOG_DIR" ]; then @@ -208,8 +222,8 @@ then [ "$OS" == "Linux" ] && count=$(grep -c processor /proc/cpuinfo) [ "$OS" == "Darwin" -o "$OS" == "FreeBSD" ] && count=$(sysctl -n hw.ncpu) - find . -maxdepth 1 -mindepth 1 -type d -not -name "lost+found" -print0 | \ - xargs -I{} -0 -P $count \ + find . -maxdepth 1 -mindepth 1 -type d -not -name "lost+found" \ + -print0 | xargs -I{} -0 -P $count \ rsync --owner --group --perms --links --specials \ --ignore-times --inplace --recursive --delete --quiet \ $WHOLE_FILE_OPT --exclude '*/ib_logfile*' "$WSREP_SST_OPT_DATA"/{}/ \ @@ -252,25 +266,24 @@ then fi rm -rf "$RSYNC_PID" - ADDR=$WSREP_SST_OPT_ADDR - RSYNC_PORT=$(echo $ADDR | awk -F ':' '{ print $2 }') - if [ -z "$RSYNC_PORT" ] - then - RSYNC_PORT=4444 - ADDR="$(echo $ADDR | awk -F ':' '{ print $1 }'):$RSYNC_PORT" - fi - trap "exit 32" HUP PIPE trap "exit 3" INT TERM ABRT trap cleanup_joiner EXIT RSYNC_CONF="$WSREP_SST_OPT_DATA/$MODULE.conf" + if [ -n "${MYSQL_TMP_DIR:-}" ] ; then + SILENT="log file = $MYSQL_TMP_DIR/rsyncd.log" + else + SILENT="" + fi + cat << EOF > "$RSYNC_CONF" pid file = $RSYNC_PID use chroot = no read only = no timeout = 300 +$SILENT [$MODULE] path = $WSREP_SST_OPT_DATA [$MODULE-log_dir] @@ -280,6 +293,7 @@ EOF # rm -rf "$DATA"/ib_logfile* # we don't want old logs around # listen at all interfaces (for firewalled setups) + readonly RSYNC_PORT=${WSREP_SST_OPT_PORT:-4444} rsync --daemon --no-detach --port $RSYNC_PORT --config "$RSYNC_CONF" & RSYNC_REAL_PID=$! @@ -288,7 +302,7 @@ EOF sleep 0.2 done - echo "ready $ADDR/$MODULE" + echo "ready $WSREP_SST_OPT_HOST:$RSYNC_PORT/$MODULE" # wait for SST to complete by monitoring magic file while [ ! -r "$MAGIC_FILE" ] && check_pid "$RSYNC_PID" && \ diff --git a/scripts/wsrep_sst_xtrabackup-v2.sh b/scripts/wsrep_sst_xtrabackup-v2.sh index 6ce3120be43..a702dc641e0 100644 --- a/scripts/wsrep_sst_xtrabackup-v2.sh +++ b/scripts/wsrep_sst_xtrabackup-v2.sh @@ -34,8 +34,8 @@ ssystag="" XTRABACKUP_PID="" SST_PORT="" REMOTEIP="" +tca="" tcert="" -tpem="" tkey="" sockopt="" progress="" @@ -47,7 +47,6 @@ rlimit="" # Initially stagemsg="${WSREP_SST_OPT_ROLE}" cpat="" -speciald=1 ib_home_dir="" ib_log_dir="" ib_undo_dir="" @@ -71,6 +70,11 @@ xtmpdir="" scomp="" sdecomp="" +ssl_dhparams="" + +ssl_cert="" +ssl_ca="" +ssl_key="" # Required for backup locks # For backup locks it is 1 sent by joiner @@ -150,6 +154,10 @@ get_keys() if [[ -z $ekey ]];then ecmd="xbcrypt --encrypt-algo=$ealgo --encrypt-key-file=$ekeyfile" else + wsrep_log_warning "Using the 'encrypt-key' option causes the encryption key" + wsrep_log_warning "to be set via the command-line and is considered insecure." + wsrep_log_warning "It is recommended to use the 'encrypt-key-file' option instead." + ecmd="xbcrypt --encrypt-algo=$ealgo --encrypt-key=$ekey" fi @@ -160,6 +168,86 @@ get_keys() stagemsg+="-XB-Encrypted" } +# +# If the ssl_dhparams variable is already set, uses that as a source +# of dh parameters for OpenSSL. Otherwise, looks for dhparams.pem in the +# datadir, and creates it there if it can't find the file. +# No input parameters +# +check_for_dhparams() +{ + if [[ -z "$ssl_dhparams" ]]; then + if ! [[ -r "$DATA/dhparams.pem" ]]; then + wsrep_check_programs openssl + wsrep_log_info "Could not find dhparams file, creating $DATA/dhparams.pem" + + if ! openssl dhparam -out "$DATA/dhparams.pem" 2048 >/dev/null 2>&1 + then + wsrep_log_error "******** FATAL ERROR ********************************* " + wsrep_log_error "* Could not create the dhparams.pem file with OpenSSL. " + wsrep_log_error "****************************************************** " + exit 22 + fi + fi + ssl_dhparams="$DATA/dhparams.pem" + fi +} + +# +# verifies that the certificate matches the private key +# doing this will save us having to wait for a timeout that would +# otherwise occur. +# +# 1st param: path to the cert +# 2nd param: path to the private key +# +verify_cert_matches_key() +{ + local cert_path=$1 + local key_path=$2 + + wsrep_check_programs openssl diff + + # generate the public key from the cert and the key + # they should match (otherwise we can't create an SSL connection) + if ! diff <(openssl x509 -in "$cert_path" -pubkey -noout) <(openssl rsa -in "$key_path" -pubout 2>/dev/null) >/dev/null 2>&1 + then + wsrep_log_error "******** FATAL ERROR ************************* " + wsrep_log_error "* The certifcate and private key do not match. " + wsrep_log_error "* Please check your certificate and key files. " + wsrep_log_error "********************************************** " + exit 22 + fi +} + +# Checks to see if the file exists +# If the file does not exist (or cannot be read), issues an error +# and exits +# +# 1st param: file name to be checked (for read access) +# 2nd param: 1st error message (header) +# 3rd param: 2nd error message (footer, optional) +# +verify_file_exists() +{ + local file_path=$1 + local error_message1=$2 + local error_message2=$3 + + if ! [[ -r "$file_path" ]]; then + wsrep_log_error "******** FATAL ERROR ************************* " + wsrep_log_error "* $error_message1 " + wsrep_log_error "* Could not find/access : $file_path " + + if ! [[ -z "$error_message2" ]]; then + wsrep_log_error "* $error_message2 " + fi + + wsrep_log_error "********************************************** " + exit 22 + fi +} + get_transfer() { if [[ -z $SST_PORT ]];then @@ -173,15 +261,25 @@ get_transfer() wsrep_log_error "nc(netcat) not found in path: $PATH" exit 2 fi + + if [[ $encrypt -eq 2 || $encrypt -eq 3 || $encrypt -eq 4 ]]; then + wsrep_log_error "******** FATAL ERROR *********************** " + wsrep_log_error "* Using SSL encryption (encrypt= 2, 3, or 4) " + wsrep_log_error "* is not supported when using nc(netcat). " + wsrep_log_error "******************************************** " + exit 22 + fi + wsrep_log_info "Using netcat as streamer" if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]];then - if nc -h 2>&1 | grep -q ncat;then - tcmd="nc -l ${TSST_PORT}" + if nc -h 2>&1 | grep -q ncat; then + tcmd="nc $sockopt -l ${TSST_PORT}" else - tcmd="nc -dl ${TSST_PORT}" + tcmd="nc $sockopt -dl ${TSST_PORT}" fi else - tcmd="nc ${REMOTEIP} ${TSST_PORT}" + # netcat doesn't understand [] around IPv6 address + tcmd="nc ${REMOTEIP//[\[\]]/} ${TSST_PORT}" fi else tfmt='socat' @@ -191,64 +289,111 @@ get_transfer() exit 2 fi - if [[ $encrypt -eq 2 || $encrypt -eq 3 ]] && ! socat -V | grep -q WITH_OPENSSL;then - wsrep_log_info "NOTE: socat is not openssl enabled, falling back to plain transfer" - encrypt=-1 + donor_extra="" + joiner_extra="" + if [[ $encrypt -eq 2 || $encrypt -eq 3 || $encrypt -eq 4 ]]; then + if ! socat -V | grep -q WITH_OPENSSL; then + wsrep_log_error "******** FATAL ERROR ****************** " + wsrep_log_error "* socat is not openssl enabled. " + wsrep_log_error "* Unable to encrypt SST communications. " + wsrep_log_error "*************************************** " + exit 2 + fi + + # Determine the socat version + SOCAT_VERSION=`socat -V 2>&1 | grep -oe '[0-9]\.[0-9][\.0-9]*' | head -n1` + if [[ -z "$SOCAT_VERSION" ]]; then + wsrep_log_error "******** FATAL ERROR **************** " + wsrep_log_error "* Cannot determine the socat version. " + wsrep_log_error "************************************* " + exit 2 + fi + + # socat versions < 1.7.3 will have 512-bit dhparams (too small) + # so create 2048-bit dhparams and send that as a parameter + # socat version >= 1.7.3, checks to see if the peername matches the hostname + # set commonname="" to disable the peername checks + # + if ! check_for_version "$SOCAT_VERSION" "1.7.3"; then + if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]]; then + # dhparams check (will create ssl_dhparams if needed) + check_for_dhparams + joiner_extra=",dhparam=$ssl_dhparams" + fi + fi + if check_for_version "$SOCAT_VERSION" "1.7.3"; then + donor_extra=',commonname=""' + fi fi - if [[ $encrypt -eq 2 ]];then - wsrep_log_info "Using openssl based encryption with socat: with crt and pem" - if [[ -z $tpem || -z $tcert ]];then - wsrep_log_error "Both PEM and CRT files required" - exit 22 - fi + if [[ $encrypt -eq 2 ]]; then + wsrep_log_warning "**** WARNING **** encrypt=2 is deprecated and will be removed in a future release" + wsrep_log_info "Using openssl based encryption with socat: with crt and ca" + + verify_file_exists "$tcert" "Both certificate and CA files are required." \ + "Please check the 'tcert' option. " + verify_file_exists "$tca" "Both certificate and CA files are required." \ + "Please check the 'tca' option. " + stagemsg+="-OpenSSL-Encrypted-2" if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]];then - wsrep_log_info "Decrypting with PEM $tpem, CA: $tcert" - tcmd="socat -u openssl-listen:${TSST_PORT},reuseaddr,cert=$tpem,cafile=${tcert}${sockopt} stdio" + wsrep_log_info "Decrypting with CERT: $tcert, CA: $tca" + tcmd="socat -u openssl-listen:${TSST_PORT},reuseaddr,cert=${tcert},cafile=${tca}${joiner_extra}${sockopt} stdio" else - wsrep_log_info "Encrypting with PEM $tpem, CA: $tcert" - tcmd="socat -u stdio openssl-connect:${REMOTEIP}:${TSST_PORT},cert=$tpem,cafile=${tcert}${sockopt}" + wsrep_log_info "Encrypting with CERT: $tcert, CA: $tca" + tcmd="socat -u stdio openssl-connect:${REMOTEIP}:${TSST_PORT},cert=${tcert},cafile=${tca}${donor_extra}${sockopt}" fi elif [[ $encrypt -eq 3 ]];then + wsrep_log_warning "**** WARNING **** encrypt=3 is deprecated and will be removed in a future release" wsrep_log_info "Using openssl based encryption with socat: with key and crt" - if [[ -z $tpem || -z $tkey ]];then - wsrep_log_error "Both certificate and key files required" - exit 22 - fi + + verify_file_exists "$tcert" "Both certificate and key files are required." \ + "Please check the 'tcert' option. " + verify_file_exists "$tkey" "Both certificate and key files are required." \ + "Please check the 'tkey' option. " + stagemsg+="-OpenSSL-Encrypted-3" if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]];then - wsrep_log_info "Decrypting with certificate $tpem, key $tkey" - tcmd="socat -u openssl-listen:${TSST_PORT},reuseaddr,cert=$tpem,key=${tkey},verify=0${sockopt} stdio" + wsrep_log_info "Decrypting with CERT: $tcert, KEY: $tkey" + tcmd="socat -u openssl-listen:${TSST_PORT},reuseaddr,cert=${tcert},key=${tkey},verify=0${joiner_extra}${sockopt} stdio" else - wsrep_log_info "Encrypting with certificate $tpem, key $tkey" - tcmd="socat -u stdio openssl-connect:${REMOTEIP}:${TSST_PORT},cert=$tpem,key=${tkey},verify=0${sockopt}" + wsrep_log_info "Encrypting with CERT: $tcert, KEY: $tkey" + tcmd="socat -u stdio openssl-connect:${REMOTEIP}:${TSST_PORT},cert=${tcert},key=${tkey},verify=0${sockopt}" + fi + elif [[ $encrypt -eq 4 ]]; then + wsrep_log_info "Using openssl based encryption with socat: with key, crt, and ca" + + verify_file_exists "$ssl_ca" "CA, certificate, and key files are required." \ + "Please check the 'ssl-ca' option. " + verify_file_exists "$ssl_cert" "CA, certificate, and key files are required." \ + "Please check the 'ssl-cert' option. " + verify_file_exists "$ssl_key" "CA, certificate, and key files are required." \ + "Please check the 'ssl-key' option. " + + # Check to see that the key matches the cert + verify_cert_matches_key $ssl_cert $ssl_key + + stagemsg+="-OpenSSL-Encrypted-4" + if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]]; then + wsrep_log_info "Decrypting with CERT: $ssl_cert, KEY: $ssl_key, CA: $ssl_ca" + tcmd="socat -u openssl-listen:${TSST_PORT},reuseaddr,cert=${ssl_cert},key=${ssl_key},cafile=${ssl_ca},verify=1${joiner_extra}${sockopt} stdio" + else + wsrep_log_info "Encrypting with CERT: $ssl_cert, KEY: $ssl_key, CA: $ssl_ca" + tcmd="socat -u stdio openssl-connect:${REMOTEIP}:${TSST_PORT},cert=${ssl_cert},key=${ssl_key},cafile=${ssl_ca},verify=1${donor_extra}${sockopt}" fi - else - if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]];then + else + if [[ $encrypt -eq 1 ]]; then + wsrep_log_warning "**** WARNING **** encrypt=1 is deprecated and will be removed in a future release" + fi + + if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]]; then tcmd="socat -u TCP-LISTEN:${TSST_PORT},reuseaddr${sockopt} stdio" else tcmd="socat -u stdio TCP:${REMOTEIP}:${TSST_PORT}${sockopt}" fi fi fi - -} - -parse_cnf() -{ - local group=$1 - local var=$2 - # print the default settings for given group using my_print_default. - # normalize the variable names specified in cnf file (user can use _ or - for example log-bin or log_bin) - # then grep for needed variable - # finally get the variable value (if variables has been specified multiple time use the last value only) - reval=$($MY_PRINT_DEFAULTS -c $WSREP_SST_OPT_CONF $group | awk -F= '{if ($1 ~ /_/) { gsub(/_/,"-",$1); print $1"="$2 } else { print $0 }}' | grep -- "--$var=" | cut -d= -f2- | tail -1) - if [[ -z $reval ]];then - [[ -n $3 ]] && reval=$3 - fi - echo $reval } get_footprint() @@ -298,15 +443,15 @@ read_cnf() { sfmt=$(parse_cnf sst streamfmt "xbstream") tfmt=$(parse_cnf sst transferfmt "socat") - tcert=$(parse_cnf sst tca "") - tpem=$(parse_cnf sst tcert "") + tca=$(parse_cnf sst tca "") + tcert=$(parse_cnf sst tcert "") tkey=$(parse_cnf sst tkey "") encrypt=$(parse_cnf sst encrypt 0) sockopt=$(parse_cnf sst sockopt "") 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$\|.*\.sst$\|.*gvwstate\.dat$\|.*grastate\.dat$\|.*\.err$\|.*\.log$\|.*RPM_UPGRADE_MARKER$\|.*RPM_UPGRADE_HISTORY$') + cpat=$(parse_cnf sst cpat '.*\.pem$\|.*init\.ok$\|.*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 "") @@ -320,9 +465,23 @@ read_cnf() ekey=$(parse_cnf sst encrypt-key "") ekeyfile=$(parse_cnf sst encrypt-key-file "") fi + + # Pull the parameters needed for encrypt=4 + ssl_ca=$(parse_cnf sst ssl-ca "") + if [[ -z "$ssl_ca" ]]; then + ssl_ca=$(parse_cnf mysqld ssl-ca "") + fi + ssl_cert=$(parse_cnf sst ssl-cert "") + if [[ -z "$ssl_cert" ]]; then + ssl_cert=$(parse_cnf mysqld ssl-cert "") + fi + ssl_key=$(parse_cnf sst ssl-key "") + if [[ -z "$ssl_key" ]]; then + ssl_key=$(parse_cnf mysqld ssl-key "") + fi + rlimit=$(parse_cnf sst rlimit "") 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 "") @@ -331,13 +490,8 @@ read_cnf() 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 + if $MY_PRINT_DEFAULTS -c $WSREP_SST_OPT_CONF mysqld_safe | tr '_' '-' | grep -q -- "--syslog";then ssyslog=1 fi fi @@ -483,28 +637,30 @@ kill_xtrabackup() setup_ports() { if [[ "$WSREP_SST_OPT_ROLE" == "donor" ]];then - 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 }') + SST_PORT=$WSREP_SST_OPT_PORT + REMOTEIP=$WSREP_SST_OPT_HOST + lsn=$(echo $WSREP_SST_OPT_PATH | awk -F '[/]' '{ print $2 }') + sst_ver=$(echo $WSREP_SST_OPT_PATH | awk -F '[/]' '{ print $3 }') else - SST_PORT=$(echo ${WSREP_SST_OPT_ADDR} | awk -F ':' '{ print $2 }') + SST_PORT=$WSREP_SST_OPT_PORT fi } -# waits ~10 seconds for nc to open the port and then reports ready +# waits ~1 minute for nc/socat to open the port and then reports ready # (regardless of timeout) wait_for_listen() { - local PORT=$1 - local ADDR=$2 + local HOST=$1 + local PORT=$2 local MODULE=$3 - for i in {1..50} + + for i in {1..300} do ss -p state listening "( sport = :$PORT )" | grep -qE 'socat|nc' && break sleep 0.2 done - echo "ready ${ADDR}/${MODULE}//$sst_ver" + + echo "ready ${HOST}:${PORT}/${MODULE}//$sst_ver" } check_extra() @@ -512,7 +668,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. @@ -607,11 +763,64 @@ send_donor() } +# Returns the version string in a standardized format +# Input "1.2.3" => echoes "010203" +# Wrongly formatted values => echoes "000000" +normalize_version() +{ + local major=0 + local minor=0 + local patch=0 + + # Only parses purely numeric version numbers, 1.2.3 + # Everything after the first three values are ignored + if [[ $1 =~ ^([0-9]+)\.([0-9]+)\.?([0-9]*)([\.0-9])*$ ]]; then + major=${BASH_REMATCH[1]} + minor=${BASH_REMATCH[2]} + patch=${BASH_REMATCH[3]} + fi + + printf %02d%02d%02d $major $minor $patch +} + +# Compares two version strings +# The first parameter is the version to be checked +# The second parameter is the minimum version required +# Returns 1 (failure) if $1 >= $2, 0 (success) otherwise +check_for_version() +{ + local local_version_str="$( normalize_version $1 )" + local required_version_str="$( normalize_version $2 )" + + if [[ "$local_version_str" < "$required_version_str" ]]; then + return 1 + else + return 0 + fi +} + + if [[ ! -x `which $INNOBACKUPEX_BIN` ]];then wsrep_log_error "innobackupex not in path: $PATH" exit 2 fi +# check the version, we require XB-2.4 to ensure that we can pass the +# datadir via the command-line option +XB_REQUIRED_VERSION="2.3.5" + +XB_VERSION=`$INNOBACKUPEX_BIN --version 2>&1 | grep -oe '[0-9]\.[0-9][\.0-9]*' | head -n1` +if [[ -z $XB_VERSION ]]; then + wsrep_log_error "FATAL: Cannot determine the $INNOBACKUPEX_BIN version. Needs xtrabackup-$XB_REQUIRED_VERSION or higher to perform SST" + exit 2 +fi + +if ! check_for_version $XB_VERSION $XB_REQUIRED_VERSION; then + wsrep_log_error "FATAL: The $INNOBACKUPEX_BIN version is $XB_VERSION. Needs xtrabackup-$XB_REQUIRED_VERSION or higher to perform SST" + exit 2 +fi + + rm -f "${MAGIC_FILE}" if [[ ! ${WSREP_SST_OPT_ROLE} == 'joiner' && ! ${WSREP_SST_OPT_ROLE} == 'donor' ]];then @@ -655,13 +864,13 @@ if [[ $ssyslog -eq 1 ]];then } 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 " + INNOMOVE="${INNOBACKUPEX_BIN} --defaults-file=${WSREP_SST_OPT_CONF} $disver $impts --datadir=${DATA} --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" + INNOMOVE="${INNOBACKUPEX_BIN} --defaults-file=${WSREP_SST_OPT_CONF} --defaults-group=mysqld${WSREP_SST_OPT_CONF_SUFFIX} $disver $impts --datadir=${DATA} --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 @@ -703,15 +912,6 @@ then fi get_keys - if [[ $encrypt -eq 1 ]];then - if [[ -n $ekey ]];then - INNOEXTRA+=" --encrypt=$ealgo --encrypt-key=$ekey " - else - INNOEXTRA+=" --encrypt=$ealgo --encrypt-key-file=$ekeyfile " - fi - fi - - check_extra wsrep_log_info "Streaming GTID file before SST" @@ -722,17 +922,17 @@ then if [[ $encrypt -eq 1 ]];then if [[ -n $scomp ]];then - tcmd=" $ecmd | $scomp | $tcmd " + tcmd=" \$ecmd | $scomp | $tcmd " else - tcmd=" $ecmd | $tcmd " + tcmd=" \$ecmd | $tcmd " fi elif [[ -n $scomp ]];then tcmd=" $scomp | $tcmd " fi - send_donor $DATA "${stagemsg}-gtid" + # Restore the transport commmand to its original state tcmd="$ttcmd" if [[ -n $progress ]];then get_footprint @@ -747,10 +947,16 @@ then wsrep_log_info "Streaming the backup to joiner at ${REMOTEIP} ${SST_PORT:-4444}" - if [[ -n $scomp ]];then + # Add compression to the head of the stream (if specified) + if [[ -n $scomp ]]; then tcmd="$scomp | $tcmd" fi + # Add encryption to the head of the stream (if specified) + if [[ $encrypt -eq 1 ]]; then + tcmd=" \$ecmd | $tcmd " + fi + set +e timeit "${stagemsg}-SST" "$INNOBACKUP | $tcmd; RC=( "\${PIPESTATUS[@]}" )" set -e @@ -777,9 +983,9 @@ then get_keys if [[ $encrypt -eq 1 ]];then if [[ -n $scomp ]];then - tcmd=" $ecmd | $scomp | $tcmd " + tcmd=" \$ecmd | $scomp | $tcmd " else - tcmd=" $ecmd | $tcmd " + tcmd=" \$ecmd | $tcmd " fi elif [[ -n $scomp ]];then tcmd=" $scomp | $tcmd " @@ -804,7 +1010,6 @@ then stagemsg="Joiner-Recv" - sencrypted=1 nthreads=1 @@ -815,14 +1020,7 @@ then # May need xtrabackup_checkpoints later on rm -f ${DATA}/xtrabackup_binary ${DATA}/xtrabackup_galera_info ${DATA}/xtrabackup_logfile - ADDR=${WSREP_SST_OPT_ADDR} - if [ -z "${SST_PORT}" ] - then - SST_PORT=4444 - ADDR="$(echo ${WSREP_SST_OPT_ADDR} | awk -F ':' '{ print $1 }'):${SST_PORT}" - fi - - wait_for_listen ${SST_PORT} ${ADDR} ${MODULE} & + wait_for_listen ${WSREP_SST_OPT_HOST} ${WSREP_SST_OPT_PORT:-4444} ${MODULE} & trap sig_joiner_cleanup HUP PIPE INT TERM trap cleanup_joiner EXIT @@ -835,9 +1033,9 @@ then get_keys if [[ $encrypt -eq 1 && $sencrypted -eq 1 ]];then if [[ -n $sdecomp ]];then - strmcmd=" $sdecomp | $ecmd | $strmcmd" + strmcmd=" $sdecomp | \$ecmd | $strmcmd" else - strmcmd=" $ecmd | $strmcmd" + strmcmd=" \$ecmd | $strmcmd" fi elif [[ -n $sdecomp ]];then strmcmd=" $sdecomp | $strmcmd" diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index cf8ac25aa6a..ad6b8eedf3e 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -571,27 +571,17 @@ int wsrep_init() size_t const node_addr_len= strlen(node_addr); if (node_addr_len > 0) { - const char* const colon= strrchr(node_addr, ':'); - if (strchr(node_addr, ':') == colon) // 1 or 0 ':' + size_t const ip_len= wsrep_host_len(node_addr, node_addr_len); + if (ip_len + 7 /* :55555\0 */ < inc_addr_max) { - size_t const ip_len= colon ? colon - node_addr : node_addr_len; - if (ip_len + 7 /* :55555\0 */ < inc_addr_max) - { - memcpy (inc_addr, node_addr, ip_len); - snprintf(inc_addr + ip_len, inc_addr_max - ip_len, ":%u", - (int)mysqld_port); - } - else - { - WSREP_WARN("Guessing address for incoming client connections: " - "address too long."); - inc_addr[0]= '\0'; - } + memcpy (inc_addr, node_addr, ip_len); + snprintf(inc_addr + ip_len, inc_addr_max - ip_len, ":%u", + (int)mysqld_port); } else { WSREP_WARN("Guessing address for incoming client connections: " - "too many colons :) ."); + "address too long."); inc_addr[0]= '\0'; } } diff --git a/sql/wsrep_sst.cc b/sql/wsrep_sst.cc index 11698089582..331185e2cf3 100644 --- a/sql/wsrep_sst.cc +++ b/sql/wsrep_sst.cc @@ -634,18 +634,19 @@ ssize_t wsrep_sst_prepare (void** msg) // Figure out SST address. Common for all SST methods if (wsrep_sst_receive_address && - strcmp (wsrep_sst_receive_address, WSREP_SST_ADDRESS_AUTO)) + strcmp (wsrep_sst_receive_address, WSREP_SST_ADDRESS_AUTO)) { addr_in= wsrep_sst_receive_address; } else if (wsrep_node_address && strlen(wsrep_node_address)) { - const char* const colon= strchr (wsrep_node_address, ':'); - if (colon) + size_t const addr_len= strlen(wsrep_node_address); + size_t const host_len= wsrep_host_len(wsrep_node_address, addr_len); + + if (host_len < addr_len) { - ptrdiff_t const len= colon - wsrep_node_address; - strncpy (ip_buf, wsrep_node_address, len); - ip_buf[len]= '\0'; + strncpy (ip_buf, wsrep_node_address, host_len); + ip_buf[host_len]= '\0'; addr_in= ip_buf; } else @@ -772,25 +773,6 @@ static int sst_donate_mysqldump (const char* addr, bool bypass, char** env) // carries auth info { - size_t host_len; - const char* port = strchr (addr, ':'); - - if (port) - { - port += 1; - host_len = port - addr; - } - else - { - port = ""; - host_len = strlen (addr) + 1; - } - - char *host= (char *) alloca(host_len); - - strncpy (host, addr, host_len - 1); - host[host_len - 1] = '\0'; - int const cmd_len= 4096; wsp::string cmd_str(cmd_len); @@ -805,14 +787,13 @@ static int sst_donate_mysqldump (const char* addr, int ret= snprintf (cmd_str(), cmd_len, "wsrep_sst_mysqldump " - WSREP_SST_OPT_HOST" '%s' " - WSREP_SST_OPT_PORT" '%s' " + WSREP_SST_OPT_ADDR" '%s' " WSREP_SST_OPT_LPORT" '%u' " WSREP_SST_OPT_SOCKET" '%s' " WSREP_SST_OPT_CONF" '%s' " WSREP_SST_OPT_GTID" '%s:%lld'" "%s", - host, port, mysqld_port, mysqld_unix_port, + addr, mysqld_port, mysqld_unix_port, wsrep_defaults_file, uuid_str, (long long)seqno, bypass ? " " WSREP_SST_OPT_BYPASS : ""); diff --git a/sql/wsrep_utils.cc b/sql/wsrep_utils.cc index 719e8e6b473..9c5cef6a997 100644 --- a/sql/wsrep_utils.cc +++ b/sql/wsrep_utils.cc @@ -554,3 +554,18 @@ size_t wsrep_guess_ip (char* buf, size_t buf_len) return 0; } + +/* returns the length of the host part of the address string */ +size_t wsrep_host_len(const char* const addr, size_t const addr_len) +{ + // check for IPv6 notation first + const char* const bracket= ('[' == addr[0] ? strchr(addr, ']') : NULL); + + if (bracket) { // IPv6 + return (bracket - addr + 1); + } + else { // host part ends at ':' or end of string + const char* const colon= strchr(addr, ':'); + return (colon ? colon - addr : addr_len); + } +} diff --git a/sql/wsrep_utils.h b/sql/wsrep_utils.h index 7d864603c7f..0ae5c68df21 100644 --- a/sql/wsrep_utils.h +++ b/sql/wsrep_utils.h @@ -21,6 +21,9 @@ unsigned int wsrep_check_ip (const char* addr); size_t wsrep_guess_ip (char* buf, size_t buf_len); +/* returns the length of the host part of the address string */ +size_t wsrep_host_len(const char* addr, size_t addr_len); + namespace wsp { class node_status { From afbaa5c697bfa090de5845f80ec8975402ca3f6f Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Tue, 7 Mar 2017 23:47:22 -0800 Subject: [PATCH 17/54] Galera MTR Tests: Tests for MW-366 - improved support for IPv6 --- .../r/galera_ipv6_mysqldump.result | 26 ++++++++ .../galera_3nodes/r/galera_ipv6_rsync.result | 14 +++++ .../r/galera_ipv6_xtrabackup-v2.result | 18 ++++++ .../galera_3nodes/t/galera_ipv6_mysqldump.cnf | 22 +++++++ .../t/galera_ipv6_mysqldump.test | 56 +++++++++++++++++ .../galera_3nodes/t/galera_ipv6_rsync.cnf | 22 +++++++ .../galera_3nodes/t/galera_ipv6_rsync.test | 32 ++++++++++ .../t/galera_ipv6_xtrabackup-v2.cnf | 26 ++++++++ .../t/galera_ipv6_xtrabackup-v2.test | 62 +++++++++++++++++++ 9 files changed, 278 insertions(+) create mode 100644 mysql-test/suite/galera_3nodes/r/galera_ipv6_mysqldump.result create mode 100644 mysql-test/suite/galera_3nodes/r/galera_ipv6_rsync.result create mode 100644 mysql-test/suite/galera_3nodes/r/galera_ipv6_xtrabackup-v2.result create mode 100644 mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.cnf create mode 100644 mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.test create mode 100644 mysql-test/suite/galera_3nodes/t/galera_ipv6_rsync.cnf create mode 100644 mysql-test/suite/galera_3nodes/t/galera_ipv6_rsync.test create mode 100644 mysql-test/suite/galera_3nodes/t/galera_ipv6_xtrabackup-v2.cnf create mode 100644 mysql-test/suite/galera_3nodes/t/galera_ipv6_xtrabackup-v2.test diff --git a/mysql-test/suite/galera_3nodes/r/galera_ipv6_mysqldump.result b/mysql-test/suite/galera_3nodes/r/galera_ipv6_mysqldump.result new file mode 100644 index 00000000000..f519654952b --- /dev/null +++ b/mysql-test/suite/galera_3nodes/r/galera_ipv6_mysqldump.result @@ -0,0 +1,26 @@ +GRANT ALL PRIVILEGES ON *.* TO 'sst'; +SET GLOBAL wsrep_sst_auth = 'sst:'; +SET GLOBAL wsrep_sst_method = 'mysqldump'; +Unloading wsrep provider ... +SET GLOBAL wsrep_provider = 'none'; +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +Loading wsrep provider ... +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +DROP TABLE t1; +SELECT VARIABLE_VALUE LIKE '%[::1]%' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_incoming_addresses'; +VARIABLE_VALUE LIKE '%[::1]%' +1 +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"); +CALL mtr.add_suppression("Unsupported protocol downgrade: incremental data collection disabled. Expect abort"); diff --git a/mysql-test/suite/galera_3nodes/r/galera_ipv6_rsync.result b/mysql-test/suite/galera_3nodes/r/galera_ipv6_rsync.result new file mode 100644 index 00000000000..a2bf5f4d98c --- /dev/null +++ b/mysql-test/suite/galera_3nodes/r/galera_ipv6_rsync.result @@ -0,0 +1,14 @@ +SELECT VARIABLE_VALUE LIKE '%[::1]%' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_incoming_addresses'; +VARIABLE_VALUE LIKE '%[::1]%' +1 +SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 3 +1 +SET GLOBAL wsrep_provider_options='gmcast.isolate=1'; +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +SET GLOBAL wsrep_provider_options='gmcast.isolate=0'; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera_3nodes/r/galera_ipv6_xtrabackup-v2.result b/mysql-test/suite/galera_3nodes/r/galera_ipv6_xtrabackup-v2.result new file mode 100644 index 00000000000..53e35939a79 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/r/galera_ipv6_xtrabackup-v2.result @@ -0,0 +1,18 @@ +SELECT VARIABLE_VALUE LIKE '%[::1]%' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_incoming_addresses'; +VARIABLE_VALUE LIKE '%[::1]%' +1 +SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 3 +1 +SET GLOBAL wsrep_provider_options='gmcast.isolate=1'; +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +SET GLOBAL wsrep_provider_options='gmcast.isolate=0'; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +DROP TABLE t1; +include/assert_grep.inc [Streaming the backup to joiner at \[::1\]] +include/assert_grep.inc [async IST sender starting to serve tcp://\[::1\]:] +include/assert_grep.inc [IST receiver addr using tcp://\[::1\]] +include/assert_grep.inc [Prepared IST receiver, listening at: tcp://\[::1\]] diff --git a/mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.cnf b/mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.cnf new file mode 100644 index 00000000000..3728e1ce005 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.cnf @@ -0,0 +1,22 @@ +!include ../galera_3nodes.cnf + +[mysqld] +wsrep_sst_method=rsync + +[mysqld.1] +wsrep-cluster-address=gcomm:// +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.1.#galera_port;ist.recv_addr=[::1]:@mysqld.1.#ist_port' +wsrep_sst_receive_address='[::1]:@mysqld.1.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.1.port' + +[mysqld.2] +wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.2.#galera_port;ist.recv_addr=[::1]:@mysqld.2.#ist_port' +wsrep_sst_receive_address='[::1]:@mysqld.2.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.2.port' + +[mysqld.3] +wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' +wsrep_provider_options='base_port=@mysqld.3.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.3.#galera_port;ist.recv_addr=[::1]:@mysqld.3.#ist_port' +wsrep_sst_receive_address='[::1]:@mysqld.3.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.3.port' diff --git a/mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.test b/mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.test new file mode 100644 index 00000000000..5b06e617eef --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.test @@ -0,0 +1,56 @@ +--source include/galera_cluster.inc +--source include/have_ipv6.inc + +--connection node_1 +GRANT ALL PRIVILEGES ON *.* TO 'sst'; + +--let $wsrep_sst_auth_orig = `SELECT @@wsrep_sst_auth` +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` + +--disable_query_log +--eval SET GLOBAL wsrep_sst_receive_address = '[::1]:$NODE_MYPORT_2'; +--enable_query_log +SET GLOBAL wsrep_sst_method = 'mysqldump'; + + +# +# Force mysqldump SST +# + +--connection node_2 +--source suite/galera/include/galera_unload_provider.inc +--remove_file $MYSQLTEST_VARDIR/mysqld.2/data/grastate.dat + +--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 + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + + +--connection node_2 +--source suite/galera/include/galera_load_provider.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +--source include/wait_condition.inc + +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; + +# Confirm that initial handshake happened over ipv6 + +SELECT VARIABLE_VALUE LIKE '%[::1]%' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_incoming_addresses'; + +--source suite/galera/include/galera_sst_restore.inc +--connection node_2 +CALL mtr.add_suppression("Unsupported protocol downgrade: incremental data collection disabled. Expect abort"); diff --git a/mysql-test/suite/galera_3nodes/t/galera_ipv6_rsync.cnf b/mysql-test/suite/galera_3nodes/t/galera_ipv6_rsync.cnf new file mode 100644 index 00000000000..3728e1ce005 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_ipv6_rsync.cnf @@ -0,0 +1,22 @@ +!include ../galera_3nodes.cnf + +[mysqld] +wsrep_sst_method=rsync + +[mysqld.1] +wsrep-cluster-address=gcomm:// +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.1.#galera_port;ist.recv_addr=[::1]:@mysqld.1.#ist_port' +wsrep_sst_receive_address='[::1]:@mysqld.1.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.1.port' + +[mysqld.2] +wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.2.#galera_port;ist.recv_addr=[::1]:@mysqld.2.#ist_port' +wsrep_sst_receive_address='[::1]:@mysqld.2.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.2.port' + +[mysqld.3] +wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' +wsrep_provider_options='base_port=@mysqld.3.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.3.#galera_port;ist.recv_addr=[::1]:@mysqld.3.#ist_port' +wsrep_sst_receive_address='[::1]:@mysqld.3.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.3.port' diff --git a/mysql-test/suite/galera_3nodes/t/galera_ipv6_rsync.test b/mysql-test/suite/galera_3nodes/t/galera_ipv6_rsync.test new file mode 100644 index 00000000000..7ee209d8e72 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_ipv6_rsync.test @@ -0,0 +1,32 @@ +--source include/galera_cluster.inc +--source include/have_ipv6.inc + +# Confirm that initial handshake happened over ipv6 + +SELECT VARIABLE_VALUE LIKE '%[::1]%' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_incoming_addresses'; +SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +# Force IST + +--connection node_2 +SET GLOBAL wsrep_provider_options='gmcast.isolate=1'; + +--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 + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +--connection node_2 +SET GLOBAL wsrep_provider_options='gmcast.isolate=0'; + +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +--source include/wait_condition.inc + +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera_3nodes/t/galera_ipv6_xtrabackup-v2.cnf b/mysql-test/suite/galera_3nodes/t/galera_ipv6_xtrabackup-v2.cnf new file mode 100644 index 00000000000..8a80be0d2a9 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_ipv6_xtrabackup-v2.cnf @@ -0,0 +1,26 @@ +!include ../galera_3nodes.cnf + +[mysqld] +wsrep_sst_method=xtrabackup-v2 +wsrep_sst_auth="root:" + +[mysqld.1] +wsrep-cluster-address=gcomm:// +wsrep_provider_options='base_host=[::1];base_port=@mysqld.1.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.1.#galera_port;ist.recv_addr=[::1]:@mysqld.1.#ist_port' +wsrep_sst_receive_address='[::1]:@mysqld.1.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.1.port' + +[mysqld.2] +wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' +wsrep_provider_options='base_host=[::1];base_port=@mysqld.2.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.2.#galera_port;ist.recv_addr=[::1]:@mysqld.2.#ist_port' +wsrep_sst_receive_address='[::1]:@mysqld.2.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.2.port' + +[mysqld.3] +wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' +wsrep_provider_options='base_host=[::1];base_port=@mysqld.3.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.3.#galera_port;ist.recv_addr=[::1]:@mysqld.3.#ist_port' +wsrep_sst_receive_address='[::1]:@mysqld.3.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.3.port' + +[SST] +sockopt=",pf=ip6" diff --git a/mysql-test/suite/galera_3nodes/t/galera_ipv6_xtrabackup-v2.test b/mysql-test/suite/galera_3nodes/t/galera_ipv6_xtrabackup-v2.test new file mode 100644 index 00000000000..84eee017700 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_ipv6_xtrabackup-v2.test @@ -0,0 +1,62 @@ +--source include/galera_cluster.inc +--source include/have_ipv6.inc + +# Confirm that initial handshake happened over ipv6 + +SELECT VARIABLE_VALUE LIKE '%[::1]%' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_incoming_addresses'; +SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +# Force IST + +--connection node_2 +SET GLOBAL wsrep_provider_options='gmcast.isolate=1'; + +--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 + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +--connection node_2 +SET GLOBAL wsrep_provider_options='gmcast.isolate=0'; + +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +--source include/wait_condition.inc + +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; + +# Confirm that key messages around SST and IST reference IPv6 + +--connection node_1 +--let $assert_file = $MYSQLTEST_VARDIR/log/mysqld.1.err +--let $assert_only_after = CURRENT_TEST + +--let $assert_count = 2 +--let $assert_text = Streaming the backup to joiner at \[::1\] +--let $assert_select = Streaming the backup to joiner at \[::1\] +--source include/assert_grep.inc + +--let $assert_count = 1 +--let $assert_text = async IST sender starting to serve tcp://\[::1\]: +--let $assert_select = async IST sender starting to serve tcp://\[::1\]: +--source include/assert_grep.inc + +--let $assert_file = $MYSQLTEST_VARDIR/log/mysqld.2.err + +--let $assert_text = IST receiver addr using tcp://\[::1\] +--let $assert_select = IST receiver addr using tcp://\[::1\] +--source include/assert_grep.inc + +--let $assert_text = Prepared IST receiver, listening at: tcp://\[::1\] +--let $assert_select = Prepared IST receiver, listening at: tcp://\[::1\] +--source include/assert_grep.inc + + + + From 7a219b6f23077e4d07338ae155ef388520108c1e Mon Sep 17 00:00:00 2001 From: Daniele Sciascia Date: Wed, 8 Mar 2017 13:08:21 +0100 Subject: [PATCH 18/54] MW-86 Add separate wsrep_sync_wait bitmask value for SHOW commands Previously, setting `wsrep_sync_wait = 1` would have an effect on both SELECT and SHOW statements. This patch changes wsrep_sync_wait so that bitmask value 1 is used for SELECT statements, while bitmask value 8 is reserved for SHOW statements. It is still possible to achieve sync wait on both SELECT and SHOW statements by setting `wsrep_sync_wait = 9`. --- sql/sql_parse.cc | 89 ++++++++++++---------------------------------- sql/sql_parse.h | 5 +++ sql/wsrep_mysqld.h | 5 +-- 3 files changed, 30 insertions(+), 69 deletions(-) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index e381f14f627..38d53b6c5c6 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2788,10 +2788,6 @@ mysql_execute_command(THD *thd) /* fall through */ case SQLCOM_SHOW_STATUS_PROC: case SQLCOM_SHOW_STATUS_FUNC: -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && wsrep_sync_wait(thd)) goto error; -#endif /* WITH_WSREP */ - case SQLCOM_SHOW_DATABASES: case SQLCOM_SHOW_TABLES: case SQLCOM_SHOW_TRIGGERS: @@ -2800,27 +2796,21 @@ mysql_execute_command(THD *thd) case SQLCOM_SHOW_PLUGINS: case SQLCOM_SHOW_FIELDS: case SQLCOM_SHOW_KEYS: -#ifndef WITH_WSREP - case SQLCOM_SHOW_VARIABLES: - case SQLCOM_SHOW_CHARSETS: - case SQLCOM_SHOW_COLLATIONS: - case SQLCOM_SHOW_STORAGE_ENGINES: - case SQLCOM_SHOW_PROFILE: -#endif /* WITH_WSREP */ case SQLCOM_SHOW_CLIENT_STATS: case SQLCOM_SHOW_USER_STATS: case SQLCOM_SHOW_TABLE_STATS: case SQLCOM_SHOW_INDEX_STATS: - case SQLCOM_SELECT: -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && wsrep_sync_wait(thd)) goto error; case SQLCOM_SHOW_VARIABLES: case SQLCOM_SHOW_CHARSETS: case SQLCOM_SHOW_COLLATIONS: case SQLCOM_SHOW_STORAGE_ENGINES: case SQLCOM_SHOW_PROFILE: -#endif /* WITH_WSREP */ + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); + case SQLCOM_SELECT: { + if (lex->sql_command == SQLCOM_SELECT) + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_READ); + thd->status_var.last_query_cost= 0.0; /* @@ -3518,9 +3508,7 @@ end_with_restore_list: goto error; #else { -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && wsrep_sync_wait(thd)) goto error; -#endif /* WITH_WSREP */ + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); /* Access check: @@ -3584,9 +3572,7 @@ end_with_restore_list: case SQLCOM_CHECKSUM: { DBUG_ASSERT(first_table == all_tables && first_table != 0); -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && wsrep_sync_wait(thd)) goto error; -#endif /* WITH_WSREP */ + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_READ); if (check_table_access(thd, SELECT_ACL, all_tables, FALSE, UINT_MAX, FALSE)) @@ -3596,11 +3582,8 @@ end_with_restore_list: break; } case SQLCOM_UPDATE: -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && - wsrep_sync_wait(thd, WSREP_SYNC_WAIT_BEFORE_UPDATE_DELETE)) goto error; -#endif /* WITH_WSREP */ { + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_UPDATE_DELETE); ha_rows found= 0, updated= 0; DBUG_ASSERT(first_table == all_tables && first_table != 0); if (update_precheck(thd, all_tables)) @@ -3639,10 +3622,7 @@ end_with_restore_list: /* if we switched from normal update, rights are checked */ if (up_result != 2) { -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && - wsrep_sync_wait(thd, WSREP_SYNC_WAIT_BEFORE_UPDATE_DELETE)) goto error; -#endif /* WITH_WSREP */ + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_UPDATE_DELETE); if ((res= multi_update_precheck(thd, all_tables))) break; } @@ -3712,10 +3692,7 @@ end_with_restore_list: break; } case SQLCOM_REPLACE: -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && - wsrep_sync_wait(thd, WSREP_SYNC_WAIT_BEFORE_INSERT_REPLACE)) goto error; -#endif /* WITH_WSREP */ + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_INSERT_REPLACE); #ifndef DBUG_OFF if (mysql_bin_log.is_open()) { @@ -3752,11 +3729,8 @@ end_with_restore_list: #endif /* fall through */ case SQLCOM_INSERT: -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && - wsrep_sync_wait(thd, WSREP_SYNC_WAIT_BEFORE_INSERT_REPLACE)) goto error; -#endif /* WITH_WSREP */ { + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_INSERT_REPLACE); DBUG_ASSERT(first_table == all_tables && first_table != 0); /* @@ -3809,11 +3783,8 @@ end_with_restore_list: } case SQLCOM_REPLACE_SELECT: case SQLCOM_INSERT_SELECT: -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && - wsrep_sync_wait(thd, WSREP_SYNC_WAIT_BEFORE_INSERT_REPLACE)) goto error; -#endif /* WITH_WSREP */ { + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_INSERT_REPLACE); select_result *sel_result; bool explain= MY_TEST(lex->describe); DBUG_ASSERT(first_table == all_tables && first_table != 0); @@ -3927,11 +3898,8 @@ end_with_restore_list: break; } case SQLCOM_DELETE: -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && - wsrep_sync_wait(thd, WSREP_SYNC_WAIT_BEFORE_UPDATE_DELETE)) goto error; -#endif /* WITH_WSREP */ { + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_UPDATE_DELETE); select_result *sel_result=lex->result; DBUG_ASSERT(first_table == all_tables && first_table != 0); if ((res= delete_precheck(thd, all_tables))) @@ -3951,11 +3919,8 @@ end_with_restore_list: break; } case SQLCOM_DELETE_MULTI: -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && - wsrep_sync_wait(thd, WSREP_SYNC_WAIT_BEFORE_UPDATE_DELETE)) goto error; -#endif /* WITH_WSREP */ { + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_UPDATE_DELETE); DBUG_ASSERT(first_table == all_tables && first_table != 0); TABLE_LIST *aux_tables= thd->lex->auxiliary_table_list.first; bool explain= MY_TEST(lex->describe); @@ -4361,9 +4326,7 @@ end_with_restore_list: db_name.length= lex->name.length; strmov(db_name.str, lex->name.str); -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && wsrep_sync_wait(thd)) goto error; -#endif /* WITH_WSREP */ + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); if (check_db_name(&db_name)) { @@ -4421,9 +4384,7 @@ end_with_restore_list: /* lex->unit.cleanup() is called outside, no need to call it here */ break; case SQLCOM_SHOW_CREATE_EVENT: -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && wsrep_sync_wait(thd)) goto error; -#endif /* WITH_WSREP */ + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); res= Events::show_create_event(thd, lex->spname->m_db, lex->spname->m_name); break; @@ -5382,18 +5343,14 @@ create_sp_error: } case SQLCOM_SHOW_CREATE_PROC: { -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && wsrep_sync_wait(thd)) goto error; -#endif /* WITH_WSREP */ + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); if (sp_show_create_routine(thd, TYPE_ENUM_PROCEDURE, lex->spname)) goto error; break; } case SQLCOM_SHOW_CREATE_FUNC: { -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && wsrep_sync_wait(thd)) goto error; -#endif /* WITH_WSREP */ + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); if (sp_show_create_routine(thd, TYPE_ENUM_FUNCTION, lex->spname)) goto error; break; @@ -5406,9 +5363,7 @@ create_sp_error: stored_procedure_type type= (lex->sql_command == SQLCOM_SHOW_PROC_CODE ? TYPE_ENUM_PROCEDURE : TYPE_ENUM_FUNCTION); -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && wsrep_sync_wait(thd)) goto error; -#endif /* WITH_WSREP */ + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); if (sp_cache_routine(thd, type, lex->spname, FALSE, &sp)) goto error; if (!sp || sp->show_routine_code(thd)) @@ -5430,9 +5385,7 @@ create_sp_error: if (check_ident_length(&lex->spname->m_name)) goto error; -#ifdef WITH_WSREP - if (WSREP_CLIENT(thd) && wsrep_sync_wait(thd)) goto error; -#endif /* WITH_WSREP */ + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); if (show_create_trigger(thd, lex->spname)) goto error; /* Error has been already logged. */ @@ -5850,9 +5803,11 @@ static bool execute_show_status(THD *thd, TABLE_LIST *all_tables) bool res; system_status_var old_status_var= thd->status_var; thd->initial_status_var= &old_status_var; + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); if (!(res= check_table_access(thd, SELECT_ACL, all_tables, FALSE, UINT_MAX, FALSE))) res= execute_sqlcom_select(thd, all_tables); +error: /* Don't log SHOW STATUS commands to slow query log */ thd->server_status&= ~(SERVER_QUERY_NO_INDEX_USED | SERVER_QUERY_NO_GOOD_INDEX_USED); diff --git a/sql/sql_parse.h b/sql/sql_parse.h index cf58ecb19e1..e9c82b9df48 100644 --- a/sql/sql_parse.h +++ b/sql/sql_parse.h @@ -225,11 +225,16 @@ inline bool is_supported_parser_charset(CHARSET_INFO *cs) if (WSREP(thd) && !thd->lex->no_write_to_binlog \ && wsrep_to_isolation_begin(thd, db_, table_, table_list_)) goto error; +#define WSREP_SYNC_WAIT(thd_, before_) \ + if (WSREP_CLIENT(thd_) && \ + wsrep_sync_wait(thd_, before_)) goto error; + #else #define WSREP_TO_ISOLATION_BEGIN(db_, table_, table_list_) #define WSREP_TO_ISOLATION_END #define WSREP_TO_ISOLATION_BEGIN_WRTCHK(db_, table_, table_list_) +#define WSREP_SYNC_WAIT(thd_, before_) #endif /* WITH_WSREP */ diff --git a/sql/wsrep_mysqld.h b/sql/wsrep_mysqld.h index 1cda5d23986..6dabdb66022 100644 --- a/sql/wsrep_mysqld.h +++ b/sql/wsrep_mysqld.h @@ -118,11 +118,12 @@ enum enum_wsrep_OSU_method { enum enum_wsrep_sync_wait { WSREP_SYNC_WAIT_NONE = 0x0, - // show, select, begin + // select, begin WSREP_SYNC_WAIT_BEFORE_READ = 0x1, WSREP_SYNC_WAIT_BEFORE_UPDATE_DELETE = 0x2, WSREP_SYNC_WAIT_BEFORE_INSERT_REPLACE = 0x4, - WSREP_SYNC_WAIT_MAX = 0x7 + WSREP_SYNC_WAIT_BEFORE_SHOW = 0x8, + WSREP_SYNC_WAIT_MAX = 0xF }; // MySQL status variables From f20b21a29a5c7e132d59c2e66f89376647fd3ee9 Mon Sep 17 00:00:00 2001 From: Daniele Sciascia Date: Wed, 8 Mar 2017 13:11:57 +0100 Subject: [PATCH 19/54] MW-86 Adjust MTR tests for changes to wsrep_sync_wait --- mysql-test/suite/galera/galera_2nodes.cnf | 2 +- .../suite/galera/galera_2nodes_as_master.cnf | 4 +- .../galera/galera_2nodes_as_master_slave.cnf | 4 +- ...lera_2nodes_as_master_with_repl_filter.cnf | 4 +- .../suite/galera/galera_2nodes_as_slave.cnf | 4 +- .../suite/galera/galera_3nodes_as_slave.cnf | 6 +- mysql-test/suite/galera/galera_4nodes.cnf | 2 +- mysql-test/suite/galera/r/GAL-401.result | 2 +- .../r/galera_applier_ftwrl_table.result | 2 +- .../r/galera_applier_ftwrl_table_alter.result | 2 +- .../r/galera_bf_abort_flush_for_export.result | 2 +- .../suite/galera/r/galera_defaults.result | 2 +- .../galera/r/galera_insert_ignore.result | 4 +- .../suite/galera/r/galera_many_rows.result | 2 +- .../r/galera_parallel_apply_lock_table.result | 2 +- .../galera/r/galera_parallel_simple.result | 2 +- .../r/galera_query_cache_sync_wait.result | 5 - .../galera/r/galera_sync_wait_show.result | 2 +- .../r/galera_unicode_identifiers.result | 4 +- .../galera/r/galera_var_sync_wait.result | 5 +- .../suite/galera/r/mysql-wsrep#201.result | 1 - mysql-test/suite/galera/t/GAL-401.test | 2 +- .../galera/t/galera_applier_ftwrl_table.test | 2 +- .../t/galera_applier_ftwrl_table_alter.test | 2 +- .../t/galera_bf_abort_flush_for_export.test | 2 +- .../suite/galera/t/galera_insert_ignore.test | 4 +- .../suite/galera/t/galera_many_rows.test | 2 +- mysql-test/suite/galera/t/galera_migrate.cnf | 2 +- .../galera/t/galera_parallel_simple.test | 2 +- .../t/galera_query_cache_sync_wait.test | 5 - .../suite/galera/t/galera_sync_wait_show.test | 3 +- .../galera/t/galera_unicode_identifiers.test | 4 +- .../suite/galera/t/galera_var_sync_wait.test | 5 +- .../suite/galera/t/mysql-wsrep#201.test | 1 - .../suite/galera_3nodes/galera_3nodes.cnf | 2 +- .../r/galera_var_dirty_reads2.result | 48 ++++++++ .../t/galera_var_dirty_reads2.test | 112 ++++++++++++++++++ sql/wsrep_mysqld.cc | 6 +- 38 files changed, 210 insertions(+), 57 deletions(-) create mode 100644 mysql-test/suite/galera_3nodes/r/galera_var_dirty_reads2.result create mode 100644 mysql-test/suite/galera_3nodes/t/galera_var_dirty_reads2.test diff --git a/mysql-test/suite/galera/galera_2nodes.cnf b/mysql-test/suite/galera/galera_2nodes.cnf index 0dc22ee4a81..3d510d74429 100644 --- a/mysql-test/suite/galera/galera_2nodes.cnf +++ b/mysql-test/suite/galera/galera_2nodes.cnf @@ -12,7 +12,7 @@ wsrep_provider_options='repl.causal_read_timeout=PT90S;base_port=@mysqld.1.#gale # enforce read-committed characteristics across the cluster wsrep-causal-reads=ON -wsrep-sync-wait=7 +wsrep-sync-wait=15 [mysqld.1] #galera_port=@OPT.port diff --git a/mysql-test/suite/galera/galera_2nodes_as_master.cnf b/mysql-test/suite/galera/galera_2nodes_as_master.cnf index 08d860e9ba4..78b0ac84273 100644 --- a/mysql-test/suite/galera/galera_2nodes_as_master.cnf +++ b/mysql-test/suite/galera/galera_2nodes_as_master.cnf @@ -28,7 +28,7 @@ wsrep_node_address=127.0.0.1 wsrep_node_incoming_address=127.0.0.1:@mysqld.1.port # enforce read-committed characteristics across the cluster wsrep-causal-reads=ON -wsrep-sync-wait=7 +wsrep-sync-wait=15 [mysqld.2] #galera_port=@OPT.port @@ -47,7 +47,7 @@ wsrep_node_address=127.0.0.1 wsrep_node_incoming_address=127.0.0.1:@mysqld.2.port # enforce read-committed characteristics across the cluster wsrep-causal-reads=ON -wsrep-sync-wait=7 +wsrep-sync-wait=15 [mysqld.3] server-id=3 diff --git a/mysql-test/suite/galera/galera_2nodes_as_master_slave.cnf b/mysql-test/suite/galera/galera_2nodes_as_master_slave.cnf index 716a790fea6..f68fe524904 100644 --- a/mysql-test/suite/galera/galera_2nodes_as_master_slave.cnf +++ b/mysql-test/suite/galera/galera_2nodes_as_master_slave.cnf @@ -29,7 +29,7 @@ wsrep_provider_options='base_port=@mysqld.2.#galera_port;evs.install_timeout = P # enforce read-committed characteristics across the cluster wsrep_causal_reads=ON -wsrep_sync_wait = 7 +wsrep_sync_wait = 15 wsrep_node_address=127.0.0.1 wsrep_sst_receive_address=127.0.0.2:@mysqld.2.#sst_port @@ -49,7 +49,7 @@ wsrep_provider_options='base_port=@mysqld.3.#galera_port;evs.install_timeout = P # enforce read-committed characteristics across the cluster wsrep_causal_reads=ON -wsrep_sync_wait = 7 +wsrep_sync_wait = 15 wsrep_node_address=127.0.0.1 wsrep_sst_receive_address=127.0.0.2:@mysqld.3.#sst_port diff --git a/mysql-test/suite/galera/galera_2nodes_as_master_with_repl_filter.cnf b/mysql-test/suite/galera/galera_2nodes_as_master_with_repl_filter.cnf index 5f0af2e58e5..d5490280ab2 100644 --- a/mysql-test/suite/galera/galera_2nodes_as_master_with_repl_filter.cnf +++ b/mysql-test/suite/galera/galera_2nodes_as_master_with_repl_filter.cnf @@ -23,7 +23,7 @@ wsrep_provider_options='base_port=@mysqld.1.#galera_port' # enforce read-committed characteristics across the cluster wsrep_causal_reads=ON -wsrep_sync_wait = 7 +wsrep_sync_wait = 15 wsrep_node_address=127.0.0.1 wsrep_sst_receive_address=127.0.0.2:@mysqld.1.#sst_port @@ -49,7 +49,7 @@ wsrep_provider_options='base_port=@mysqld.2.#galera_port' # enforce read-committed characteristics across the cluster wsrep_causal_reads=ON -wsrep_sync_wait = 7 +wsrep_sync_wait = 15 wsrep_node_address=127.0.0.1 wsrep_sst_receive_address=127.0.0.2:@mysqld.2.#sst_port diff --git a/mysql-test/suite/galera/galera_2nodes_as_slave.cnf b/mysql-test/suite/galera/galera_2nodes_as_slave.cnf index 2a4b18da5f8..cf1eccb1ba9 100644 --- a/mysql-test/suite/galera/galera_2nodes_as_slave.cnf +++ b/mysql-test/suite/galera/galera_2nodes_as_slave.cnf @@ -31,7 +31,7 @@ wsrep_sst_receive_address='127.0.0.1:@mysqld.2.#sst_port' # enforce read-committed characteristics across the cluster wsrep-causal-reads=ON -wsrep-sync-wait=7 +wsrep-sync-wait=15 server-id=2 [mysqld.3] @@ -53,7 +53,7 @@ wsrep_sst_receive_address='127.0.0.1:@mysqld.3.#sst_port' # enforce read-committed characteristics across the cluster wsrep-causal-reads=ON -wsrep-sync-wait=7 +wsrep-sync-wait=15 server-id=3 [ENV] diff --git a/mysql-test/suite/galera/galera_3nodes_as_slave.cnf b/mysql-test/suite/galera/galera_3nodes_as_slave.cnf index aed33ba365b..ac1ca34e242 100644 --- a/mysql-test/suite/galera/galera_3nodes_as_slave.cnf +++ b/mysql-test/suite/galera/galera_3nodes_as_slave.cnf @@ -30,7 +30,7 @@ wsrep_sst_receive_address='127.0.0.1:@mysqld.2.#sst_port' # enforce read-committed characteristics across the cluster wsrep-causal-reads=ON -wsrep-sync-wait=7 +wsrep-sync-wait=15 server-id=2 [mysqld.3] @@ -51,7 +51,7 @@ wsrep_sst_receive_address='127.0.0.1:@mysqld.3.#sst_port' # enforce read-committed characteristics across the cluster wsrep-causal-reads=ON -wsrep-sync-wait=7 +wsrep-sync-wait=15 server-id=3 [mysqld.4] @@ -72,7 +72,7 @@ wsrep_sst_receive_address='127.0.0.1:@mysqld.4.#sst_port' # enforce read-committed characteristics across the cluster wsrep-causal-reads=ON -wsrep-sync-wait=7 +wsrep-sync-wait=15 server-id=4 [ENV] diff --git a/mysql-test/suite/galera/galera_4nodes.cnf b/mysql-test/suite/galera/galera_4nodes.cnf index e54ff27759e..a0ef1dc092b 100644 --- a/mysql-test/suite/galera/galera_4nodes.cnf +++ b/mysql-test/suite/galera/galera_4nodes.cnf @@ -9,7 +9,7 @@ wsrep-provider=@ENV.WSREP_PROVIDER wsrep_node_address=127.0.0.1 # enforce read-committed characteristics across the cluster wsrep-causal-reads=ON -wsrep-sync-wait=7 +wsrep-sync-wait=15 [mysqld.1] #galera_port=@OPT.port diff --git a/mysql-test/suite/galera/r/GAL-401.result b/mysql-test/suite/galera/r/GAL-401.result index 4de13cf142b..fbdb2d39a28 100644 --- a/mysql-test/suite/galera/r/GAL-401.result +++ b/mysql-test/suite/galera/r/GAL-401.result @@ -9,7 +9,7 @@ SHOW STATUS LIKE 'wsrep_desync_count'; Variable_name Value wsrep_desync_count 0 SET @@global.wsrep_desync = 0; -SET SESSION wsrep_sync_wait=7; +SET SESSION wsrep_sync_wait=15; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( diff --git a/mysql-test/suite/galera/r/galera_applier_ftwrl_table.result b/mysql-test/suite/galera/r/galera_applier_ftwrl_table.result index cecbfc1f3cf..1b2a3b937bb 100644 --- a/mysql-test/suite/galera/r/galera_applier_ftwrl_table.result +++ b/mysql-test/suite/galera/r/galera_applier_ftwrl_table.result @@ -8,7 +8,7 @@ SELECT COUNT(*) = 0 FROM t1; COUNT(*) = 0 1 UNLOCK TABLES; -SET SESSION wsrep_sync_wait = 7; +SET SESSION wsrep_sync_wait = 15; SELECT COUNT(*) = 2 FROM t1; COUNT(*) = 2 1 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 index ee967356c85..c30f78896e5 100644 --- a/mysql-test/suite/galera/r/galera_applier_ftwrl_table_alter.result +++ b/mysql-test/suite/galera/r/galera_applier_ftwrl_table_alter.result @@ -12,7 +12,7 @@ SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system use COUNT(*) = 1 1 UNLOCK TABLES; -SET SESSION wsrep_sync_wait = 7; +SET SESSION wsrep_sync_wait = 15; SHOW CREATE TABLE t1; Table Create Table t1 CREATE 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 index 96ed226c3ab..3c5c07ae396 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,7 +6,7 @@ SET SESSION wsrep_sync_wait = 0; UNLOCK TABLES; COMMIT; SET AUTOCOMMIT=ON; -SET SESSION wsrep_sync_wait = 7; +SET SESSION wsrep_sync_wait = 15; SELECT COUNT(*) = 1 FROM t1; COUNT(*) = 1 1 diff --git a/mysql-test/suite/galera/r/galera_defaults.result b/mysql-test/suite/galera/r/galera_defaults.result index 878fe80ff98..b242a468f72 100644 --- a/mysql-test/suite/galera/r/galera_defaults.result +++ b/mysql-test/suite/galera/r/galera_defaults.result @@ -47,7 +47,7 @@ WSREP_SST_AUTH WSREP_SST_DONOR WSREP_SST_DONOR_REJECTS_QUERIES OFF WSREP_SST_METHOD rsync -WSREP_SYNC_WAIT 7 +WSREP_SYNC_WAIT 15 ; ; ; cert.log_conflicts = no; debug = no; evs.auto_evict = 0; evs.causal_keepalive_period = PT1S; evs.debug_log_mask = 0x1; evs.delay_margin = PT1S; evs.delayed_keep_period = PT30S; evs.inactive_check_period = PT0.5S; evs.inactive_timeout = PT15S; evs.info_log_mask = 0; evs.install_timeout = PT7.5S; evs.join_retrans_period = PT1S; evs.keepalive_period = PT1S; evs.max_install_timeouts = 3; evs.send_window = 4; evs.stats_report_period = PT1M; evs.suspect_timeout = PT10S; evs.use_aggregate = true; evs.user_send_window = 2; evs.version = 0; evs.view_forget_timeout = P1D; ; gcache.keep_pages_size = 0; gcache.mem_size = 0; ; gcache.page_size = 128M; gcache.recover = no; gcache.size = 10M; gcomm.thread_prio = ; gcs.fc_debug = 0; gcs.fc_factor = 1.0; gcs.fc_limit = 16; gcs.fc_master_slave = no; gcs.max_packet_size = 64500; gcs.max_throttle = 0.25; ; gcs.recv_q_soft_limit = 0.25; gcs.sync_donor = no; ; gmcast.mcast_addr = ; gmcast.mcast_ttl = 1; gmcast.peer_timeout = PT3S; gmcast.segment = 0; gmcast.time_wait = PT5S; gmcast.version = 0; ; pc.announce_timeout = PT3S; pc.checksum = false; pc.ignore_quorum = false; pc.ignore_sb = false; pc.linger = PT20S; pc.npvo = false; pc.recovery = true; pc.version = 0; pc.wait_prim = true; pc.wait_prim_timeout = PT30S; pc.weight = 1; protonet.backend = asio; protonet.version = 0; repl.causal_read_timeout = PT90S; repl.commit_order = 3; repl.key_format = FLAT8; repl.max_ws_size = 2147483647; repl.proto_max = 7; socket.checksum = 2; socket.recv_buf_size = 212992; SELECT COUNT(*) FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE 'wsrep_%' diff --git a/mysql-test/suite/galera/r/galera_insert_ignore.result b/mysql-test/suite/galera/r/galera_insert_ignore.result index b53b5795416..b98a308efb5 100644 --- a/mysql-test/suite/galera/r/galera_insert_ignore.result +++ b/mysql-test/suite/galera/r/galera_insert_ignore.result @@ -1,5 +1,5 @@ -SET GLOBAL wsrep_sync_wait = 7; -SET GLOBAL wsrep_sync_wait = 7; +SET GLOBAL wsrep_sync_wait = 15; +SET GLOBAL wsrep_sync_wait = 15; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; INSERT INTO t1 VALUES (1); INSERT IGNORE INTO t1 VALUES (1), (2); diff --git a/mysql-test/suite/galera/r/galera_many_rows.result b/mysql-test/suite/galera/r/galera_many_rows.result index a34367d6e46..e650dd6f5de 100644 --- a/mysql-test/suite/galera/r/galera_many_rows.result +++ b/mysql-test/suite/galera/r/galera_many_rows.result @@ -5,7 +5,7 @@ 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 SESSION wsrep_sync_wait = 15; SET GLOBAL wsrep_provider_options = 'repl.causal_read_timeout=PT1H'; SELECT COUNT(*) = 100000 FROM t1; COUNT(*) = 100000 diff --git a/mysql-test/suite/galera/r/galera_parallel_apply_lock_table.result b/mysql-test/suite/galera/r/galera_parallel_apply_lock_table.result index db4528ac22d..27768dc441a 100644 --- a/mysql-test/suite/galera/r/galera_parallel_apply_lock_table.result +++ b/mysql-test/suite/galera/r/galera_parallel_apply_lock_table.result @@ -18,7 +18,7 @@ SELECT COUNT(*) = 0 FROM t2; COUNT(*) = 0 1 UNLOCK TABLES; -SET SESSION wsrep_sync_wait = 7;; +SET SESSION wsrep_sync_wait = 15;; SELECT COUNT(*) = 1 FROM t1; COUNT(*) = 1 1 diff --git a/mysql-test/suite/galera/r/galera_parallel_simple.result b/mysql-test/suite/galera/r/galera_parallel_simple.result index 6d023c38a57..3b10815c63d 100644 --- a/mysql-test/suite/galera/r/galera_parallel_simple.result +++ b/mysql-test/suite/galera/r/galera_parallel_simple.result @@ -16,7 +16,7 @@ INSERT INTO t1 VALUES (1); INSERT INTO t2 VALUES (1); SET SESSION wsrep_sync_wait = 0; UNLOCK TABLES; -SET SESSION wsrep_sync_wait = 7; +SET SESSION wsrep_sync_wait = 15; SELECT COUNT(*) = 10 FROM t1; COUNT(*) = 10 0 diff --git a/mysql-test/suite/galera/r/galera_query_cache_sync_wait.result b/mysql-test/suite/galera/r/galera_query_cache_sync_wait.result index 856abbb43be..5fe382048fb 100644 --- a/mysql-test/suite/galera/r/galera_query_cache_sync_wait.result +++ b/mysql-test/suite/galera/r/galera_query_cache_sync_wait.result @@ -4,7 +4,6 @@ SET GLOBAL wsrep_provider_options = "repl.causal_read_timeout=PT1S"; SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; Warnings: Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead -SET SESSION wsrep_sync_wait = 7; SELECT MAX(id) FROM t1; MAX(id) 1 @@ -16,7 +15,6 @@ Warnings: Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; FLUSH QUERY CACHE; -SET SESSION wsrep_sync_wait = 7; SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; Warnings: Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead @@ -29,11 +27,9 @@ Warnings: Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; INSERT INTO t1 VALUES (4); -SET SESSION wsrep_sync_wait = 7; SELECT MAX(id) FROM t1; MAX(id) 4 -SET SESSION wsrep_sync_wait = 7; FLUSH STATUS; SELECT MAX(id) FROM t1; MAX(id) @@ -45,7 +41,6 @@ SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; Warnings: Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead INSERT INTO t1 VALUES (5); -SET SESSION wsrep_sync_wait = 7; SELECT MAX(id) FROM t1 ; SET GLOBAL DEBUG = ""; Warnings: diff --git a/mysql-test/suite/galera/r/galera_sync_wait_show.result b/mysql-test/suite/galera/r/galera_sync_wait_show.result index c719aaab5d8..2eac93ad665 100644 --- a/mysql-test/suite/galera/r/galera_sync_wait_show.result +++ b/mysql-test/suite/galera/r/galera_sync_wait_show.result @@ -1,4 +1,4 @@ -SET SESSION wsrep_sync_wait = 1; +SET SESSION wsrep_sync_wait = 8; CREATE DATABASE db1; SHOW CREATE DATABASE db1; Database Create Database diff --git a/mysql-test/suite/galera/r/galera_unicode_identifiers.result b/mysql-test/suite/galera/r/galera_unicode_identifiers.result index 8bea105c77e..9aee4616ec5 100644 --- a/mysql-test/suite/galera/r/galera_unicode_identifiers.result +++ b/mysql-test/suite/galera/r/galera_unicode_identifiers.result @@ -1,5 +1,5 @@ -SET GLOBAL wsrep_sync_wait = 7; -SET GLOBAL wsrep_sync_wait = 7; +SET GLOBAL wsrep_sync_wait = 15; +SET GLOBAL wsrep_sync_wait = 15; CREATE DATABASE `database with space`; USE `database with space`; CREATE TABLE `table with space` ( diff --git a/mysql-test/suite/galera/r/galera_var_sync_wait.result b/mysql-test/suite/galera/r/galera_var_sync_wait.result index f6136a4ddc4..f573c251bdd 100644 --- a/mysql-test/suite/galera/r/galera_var_sync_wait.result +++ b/mysql-test/suite/galera/r/galera_var_sync_wait.result @@ -1,8 +1,5 @@ CREATE TABLE t1 (f1 INT PRIMARY KEY) Engine=InnoDB; SET GLOBAL wsrep_sync_wait = 1; -SHOW TABLES LIKE '%t1'; -Tables_in_test (%t1) -t1 SELECT COUNT(*) = 0 FROM t1; COUNT(*) = 0 1 @@ -15,7 +12,7 @@ SET GLOBAL wsrep_sync_wait = 2; UPDATE t3 SET f1 = 2; affected rows: 1 info: Rows matched: 1 Changed: 1 Warnings: 0 -SET GLOBAL wsrep_sync_wait = 7; +SET GLOBAL wsrep_sync_wait = 15; DROP TABLE t1; DROP TABLE t2; DROP TABLE t3; diff --git a/mysql-test/suite/galera/r/mysql-wsrep#201.result b/mysql-test/suite/galera/r/mysql-wsrep#201.result index 1c0998e35ac..34d184d8ec1 100644 --- a/mysql-test/suite/galera/r/mysql-wsrep#201.result +++ b/mysql-test/suite/galera/r/mysql-wsrep#201.result @@ -1,4 +1,3 @@ CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; INSERT INTO t1 VALUES (DEFAULT); SET GLOBAL query_cache_size=1355776; -SET SESSION wsrep_sync_wait = 7; diff --git a/mysql-test/suite/galera/t/GAL-401.test b/mysql-test/suite/galera/t/GAL-401.test index b419770f804..25ab9502bec 100644 --- a/mysql-test/suite/galera/t/GAL-401.test +++ b/mysql-test/suite/galera/t/GAL-401.test @@ -44,7 +44,7 @@ SET @@global.wsrep_desync = 0; --let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; --source include/wait_condition.inc -SET SESSION wsrep_sync_wait=7; +SET SESSION wsrep_sync_wait=15; SHOW CREATE TABLE t1; DROP TABLE t1; CALL mtr.add_suppression("WSREP: Protocol violation. JOIN message sender (.*) is not in state transfer \\(SYNCED\\). Message ignored."); diff --git a/mysql-test/suite/galera/t/galera_applier_ftwrl_table.test b/mysql-test/suite/galera/t/galera_applier_ftwrl_table.test index 6747977812b..97819384a75 100644 --- a/mysql-test/suite/galera/t/galera_applier_ftwrl_table.test +++ b/mysql-test/suite/galera/t/galera_applier_ftwrl_table.test @@ -28,7 +28,7 @@ SELECT COUNT(*) = 0 FROM t1; --connection node_1 UNLOCK TABLES; -SET SESSION wsrep_sync_wait = 7; +SET SESSION wsrep_sync_wait = 15; SELECT COUNT(*) = 2 FROM t1; DROP TABLE t1; 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 index 99c45c04ba0..67f2108d263 100644 --- a/mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter.test +++ b/mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter.test @@ -29,7 +29,7 @@ SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system use UNLOCK TABLES; -SET SESSION wsrep_sync_wait = 7; +SET SESSION wsrep_sync_wait = 15; SHOW CREATE TABLE t1; SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'Waiting for table metadata lock'; 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 e32089ce21e..fde783e2cef 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 @@ -27,7 +27,7 @@ UNLOCK TABLES; COMMIT; SET AUTOCOMMIT=ON; -SET SESSION wsrep_sync_wait = 7; +SET SESSION wsrep_sync_wait = 15; 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_insert_ignore.test b/mysql-test/suite/galera/t/galera_insert_ignore.test index 4b4b0a6e9fb..027f70e96d9 100644 --- a/mysql-test/suite/galera/t/galera_insert_ignore.test +++ b/mysql-test/suite/galera/t/galera_insert_ignore.test @@ -2,10 +2,10 @@ --source include/have_innodb.inc --let $wsrep_sync_wait_orig = (SELECT @@wsrep_sync_wait) -SET GLOBAL wsrep_sync_wait = 7; +SET GLOBAL wsrep_sync_wait = 15; --connection node_2 -SET GLOBAL wsrep_sync_wait = 7; +SET GLOBAL wsrep_sync_wait = 15; # diff --git a/mysql-test/suite/galera/t/galera_many_rows.test b/mysql-test/suite/galera/t/galera_many_rows.test index 653dc2dd75a..58ba85e1b9e 100644 --- a/mysql-test/suite/galera/t/galera_many_rows.test +++ b/mysql-test/suite/galera/t/galera_many_rows.test @@ -16,7 +16,7 @@ INSERT INTO t1 (f2) SELECT a1.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4 --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 SESSION wsrep_sync_wait = 15; SET GLOBAL wsrep_provider_options = 'repl.causal_read_timeout=PT1H'; diff --git a/mysql-test/suite/galera/t/galera_migrate.cnf b/mysql-test/suite/galera/t/galera_migrate.cnf index 47bdf53afef..ed48f208e52 100644 --- a/mysql-test/suite/galera/t/galera_migrate.cnf +++ b/mysql-test/suite/galera/t/galera_migrate.cnf @@ -13,7 +13,7 @@ log-bin=mysqld-bin wsrep_node_address=127.0.0.1 wsrep_causal_reads=ON -wsrep_sync_wait = 7 +wsrep_sync_wait = 15 [mysqld.1] #galera_port=@OPT.port diff --git a/mysql-test/suite/galera/t/galera_parallel_simple.test b/mysql-test/suite/galera/t/galera_parallel_simple.test index e078a342c16..41cd0c8e6fa 100644 --- a/mysql-test/suite/galera/t/galera_parallel_simple.test +++ b/mysql-test/suite/galera/t/galera_parallel_simple.test @@ -45,7 +45,7 @@ SET SESSION wsrep_sync_wait = 0; UNLOCK TABLES; -SET SESSION wsrep_sync_wait = 7; +SET SESSION wsrep_sync_wait = 15; SELECT COUNT(*) = 10 FROM t1; SELECT COUNT(*) = 10 FROM t2; diff --git a/mysql-test/suite/galera/t/galera_query_cache_sync_wait.test b/mysql-test/suite/galera/t/galera_query_cache_sync_wait.test index 6b14118d5fc..87afc2d7bb2 100644 --- a/mysql-test/suite/galera/t/galera_query_cache_sync_wait.test +++ b/mysql-test/suite/galera/t/galera_query_cache_sync_wait.test @@ -10,7 +10,6 @@ INSERT INTO t1 VALUES (1); --let $wsrep_provider_options_orig = `SELECT @@wsrep_provider_options` SET GLOBAL wsrep_provider_options = "repl.causal_read_timeout=PT1S"; SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; -SET SESSION wsrep_sync_wait = 7; SELECT MAX(id) FROM t1; # first lookup miss # @@ -27,7 +26,6 @@ SET GLOBAL DEBUG = ""; SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; FLUSH QUERY CACHE; -SET SESSION wsrep_sync_wait = 7; SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; SET DEBUG_SYNC = "RESET"; @@ -52,9 +50,7 @@ SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; INSERT INTO t1 VALUES (4); --connection node_2 -SET SESSION wsrep_sync_wait = 7; SELECT MAX(id) FROM t1; -SET SESSION wsrep_sync_wait = 7; # # Query cache hit @@ -73,7 +69,6 @@ SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; INSERT INTO t1 VALUES (5); --connection node_2 -SET SESSION wsrep_sync_wait = 7; --send SELECT MAX(id) FROM t1 --connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 diff --git a/mysql-test/suite/galera/t/galera_sync_wait_show.test b/mysql-test/suite/galera/t/galera_sync_wait_show.test index 250b1f76e98..58de5433030 100644 --- a/mysql-test/suite/galera/t/galera_sync_wait_show.test +++ b/mysql-test/suite/galera/t/galera_sync_wait_show.test @@ -7,7 +7,8 @@ --source include/have_debug.inc --connection node_2 -SET SESSION wsrep_sync_wait = 1; +# MW-86 SHOW commands have now bitmap value 8 +SET SESSION wsrep_sync_wait = 8; --connection node_1 diff --git a/mysql-test/suite/galera/t/galera_unicode_identifiers.test b/mysql-test/suite/galera/t/galera_unicode_identifiers.test index 9adac1aa555..f3df60a6415 100644 --- a/mysql-test/suite/galera/t/galera_unicode_identifiers.test +++ b/mysql-test/suite/galera/t/galera_unicode_identifiers.test @@ -6,10 +6,10 @@ --source include/have_innodb.inc --let $wsrep_sync_wait_orig = (SELECT @@wsrep_sync_wait) -SET GLOBAL wsrep_sync_wait = 7; +SET GLOBAL wsrep_sync_wait = 15; --connection node_2 -SET GLOBAL wsrep_sync_wait = 7; +SET GLOBAL wsrep_sync_wait = 15; --connection node_1 diff --git a/mysql-test/suite/galera/t/galera_var_sync_wait.test b/mysql-test/suite/galera/t/galera_var_sync_wait.test index 935c271a4d6..046724e1635 100644 --- a/mysql-test/suite/galera/t/galera_var_sync_wait.test +++ b/mysql-test/suite/galera/t/galera_var_sync_wait.test @@ -13,7 +13,10 @@ CREATE TABLE t1 (f1 INT PRIMARY KEY) Engine=InnoDB; --connection node_2 SET GLOBAL wsrep_sync_wait = 1; # Those statements should see the table -SHOW TABLES LIKE '%t1'; + +# MW-86 SHOW commands have now their own bitmask +# SHOW TABLES LIKE '%t1'; + SELECT COUNT(*) = 0 FROM t1; --connection node_1 diff --git a/mysql-test/suite/galera/t/mysql-wsrep#201.test b/mysql-test/suite/galera/t/mysql-wsrep#201.test index e9327540195..21cf05db008 100644 --- a/mysql-test/suite/galera/t/mysql-wsrep#201.test +++ b/mysql-test/suite/galera/t/mysql-wsrep#201.test @@ -8,7 +8,6 @@ INSERT INTO t1 VALUES (DEFAULT); --connection node_2 --let $qcache_size_orig = `SELECT @@GLOBAL.query_cache_size` SET GLOBAL query_cache_size=1355776; -SET SESSION wsrep_sync_wait = 7; --disable_query_log diff --git a/mysql-test/suite/galera_3nodes/galera_3nodes.cnf b/mysql-test/suite/galera_3nodes/galera_3nodes.cnf index 3921e3aa362..48c7180cb51 100644 --- a/mysql-test/suite/galera_3nodes/galera_3nodes.cnf +++ b/mysql-test/suite/galera_3nodes/galera_3nodes.cnf @@ -9,7 +9,7 @@ wsrep-provider=@ENV.WSREP_PROVIDER wsrep_node_address=127.0.0.1 # enforce read-committed characteristics across the cluster wsrep-causal-reads=ON -wsrep-sync-wait=7 +wsrep-sync-wait=15 [mysqld.1] wsrep-cluster-address='gcomm://' diff --git a/mysql-test/suite/galera_3nodes/r/galera_var_dirty_reads2.result b/mysql-test/suite/galera_3nodes/r/galera_var_dirty_reads2.result new file mode 100644 index 00000000000..88780a2c87f --- /dev/null +++ b/mysql-test/suite/galera_3nodes/r/galera_var_dirty_reads2.result @@ -0,0 +1,48 @@ +CREATE TABLE t1 (f1 INTEGER); +INSERT INTO t1 VALUES (1); +SET GLOBAL wsrep_provider_options='gmcast.isolate=1'; +SET SESSION wsrep_sync_wait = 0; +SET SESSION wsrep_dirty_reads = 1; +SELECT f1 FROM t1; +f1 +1 +USE test; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +LOCK TABLE t1 WRITE; +UNLOCK TABLES; +FLUSH TABLES WITH READ LOCK; +UNLOCK TABLES; +PREPARE stmt_select FROM 'SELECT f1 FROM t1'; +EXECUTE stmt_select; +f1 +1 +PREPARE stmt_update FROM 'UPDATE t1 SET f1 = f1 + f1'; +SET GLOBAL wsrep_dirty_reads = 1; +SET GLOBAL wsrep_sync_wait = 0; +SET GLOBAL wsrep_dirty_reads = 0; +SET GLOBAL wsrep_sync_wait = 15; +SET SESSION wsrep_dirty_reads = 1; +INSERT INTO t1 SELECT * FROM t1; +ERROR 08S01: WSREP has not yet prepared node for application use +DELETE FROM t1; +ERROR 08S01: WSREP has not yet prepared node for application use +UPDATE t1 SET f1 = f1 + 1; +ERROR 08S01: WSREP has not yet prepared node for application use +DROP TABLE t1; +ERROR 08S01: WSREP has not yet prepared node for application use +EXECUTE stmt_update; +ERROR 08S01: WSREP has not yet prepared node for application use +SET SESSION wsrep_dirty_reads = 0; +SELECT * FROM t1; +ERROR 08S01: WSREP has not yet prepared node for application use +EXECUTE stmt_select; +ERROR 08S01: WSREP has not yet prepared node for application use +SELECT COUNT(*) > 0 FROM INFORMATION_SCHEMA.PROCESSLIST; +COUNT(*) > 0 +1 +SET GLOBAL wsrep_provider_options='gmcast.isolate=0'; +DROP TABLE t1; diff --git a/mysql-test/suite/galera_3nodes/t/galera_var_dirty_reads2.test b/mysql-test/suite/galera_3nodes/t/galera_var_dirty_reads2.test new file mode 100644 index 00000000000..129ba2e1f38 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_var_dirty_reads2.test @@ -0,0 +1,112 @@ +# +# Additional tests for wsrep_dirty_reads +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INTEGER); +INSERT INTO t1 VALUES (1); + +--connection node_2 +SET GLOBAL wsrep_provider_options='gmcast.isolate=1'; + +--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 + +--connection node_2 +SET SESSION wsrep_sync_wait = 0; + +--let $wait_condition = SELECT VARIABLE_VALUE = 'non-Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc + +SET SESSION wsrep_dirty_reads = 1; + +# Those statements should succeed + +--error 0 +SELECT f1 FROM t1; + +--error 0 +USE test; + +--error 0 +SHOW CREATE TABLE t1; + +--error 0 +LOCK TABLE t1 WRITE; + +--error 0 +UNLOCK TABLES; + +--error 0 +FLUSH TABLES WITH READ LOCK; + +--error 0 +UNLOCK TABLES; + +--error 0 +PREPARE stmt_select FROM 'SELECT f1 FROM t1'; + +--error 0 +EXECUTE stmt_select; + +--error 0 +PREPARE stmt_update FROM 'UPDATE t1 SET f1 = f1 + f1'; + +# Mysqldump should succeed + +SET GLOBAL wsrep_dirty_reads = 1; +SET GLOBAL wsrep_sync_wait = 0; +--error 0 +--exec $MYSQL_DUMP -u root -S $NODE_MYSOCK_2 test >/dev/null +SET GLOBAL wsrep_dirty_reads = 0; +SET GLOBAL wsrep_sync_wait = 15; + +# Those statements should fail + +SET SESSION wsrep_dirty_reads = 1; + +--error ER_UNKNOWN_COM_ERROR +INSERT INTO t1 SELECT * FROM t1; + +--error ER_UNKNOWN_COM_ERROR +DELETE FROM t1; + +--error ER_UNKNOWN_COM_ERROR +UPDATE t1 SET f1 = f1 + 1; + +--error ER_UNKNOWN_COM_ERROR +DROP TABLE t1; + +--error ER_UNKNOWN_COM_ERROR +EXECUTE stmt_update; + +# With wsrep_dirty_reads = 0 , even SELECTS are not allowed + +SET SESSION wsrep_dirty_reads = 0; + +--error ER_UNKNOWN_COM_ERROR +SELECT * FROM t1; + +--error ER_UNKNOWN_COM_ERROR +EXECUTE stmt_select; + +# But reads from INFORMATION_SCHEMA are allowed + +--error 0 +SELECT COUNT(*) > 0 FROM INFORMATION_SCHEMA.PROCESSLIST; + +# Restore cluster +SET GLOBAL wsrep_provider_options='gmcast.isolate=0'; + +--connection node_1 +--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 +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc + +DROP TABLE t1; diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index ad6b8eedf3e..dfae06b262d 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -970,9 +970,13 @@ static bool wsrep_prepare_keys_for_isolation(THD* thd, for (const TABLE_LIST* table= table_list; table; table= table->next_global) { wsrep_key_t* tmp; - tmp= (wsrep_key_t*)my_realloc(ka->keys, + if (ka->keys) + tmp= (wsrep_key_t*)my_realloc(ka->keys, (ka->keys_len + 1) * sizeof(wsrep_key_t), MYF(0)); + else + tmp= (wsrep_key_t*)my_malloc((ka->keys_len + 1) * sizeof(wsrep_key_t), MYF(0)); + if (!tmp) { WSREP_ERROR("Can't allocate memory for key_array"); From 3d4708554cde8f76219d1c25fce81e142737745d Mon Sep 17 00:00:00 2001 From: Daniele Sciascia Date: Wed, 8 Mar 2017 15:29:31 +0100 Subject: [PATCH 20/54] MW-86 MTR test: check that SHOW commands no longer obey wsrep_sync_wait = 1 --- mysql-test/suite/galera/r/MW-86.result | 18 ++++++++++ mysql-test/suite/galera/t/MW-86.test | 46 ++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 mysql-test/suite/galera/r/MW-86.result create mode 100644 mysql-test/suite/galera/t/MW-86.test diff --git a/mysql-test/suite/galera/r/MW-86.result b/mysql-test/suite/galera/r/MW-86.result new file mode 100644 index 00000000000..d0799a0a708 --- /dev/null +++ b/mysql-test/suite/galera/r/MW-86.result @@ -0,0 +1,18 @@ +SET SESSION wsrep_sync_wait = 1; +SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; +CREATE DATABASE db1; +SHOW CREATE DATABASE db1; +ERROR 42000: Unknown database 'db1' +SET GLOBAL DEBUG = ""; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; +SET SESSION wsrep_sync_wait = 8; +DROP DATABASE db1; +SET SESSION wsrep_sync_wait = 8; +SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; +SET GLOBAL wsrep_provider_options = "repl.causal_read_timeout=PT0.1S"; +CREATE DATABASE db1; +SHOW CREATE DATABASE db1; +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +SET GLOBAL DEBUG = ""; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; +DROP DATABASE db1; diff --git a/mysql-test/suite/galera/t/MW-86.test b/mysql-test/suite/galera/t/MW-86.test new file mode 100644 index 00000000000..cc92dbbd818 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-86.test @@ -0,0 +1,46 @@ +--source include/galera_cluster.inc + +# +# Test 1: SHOW commands no longer obey wsrep_sync_wait = 1 +# + +--connection node_2 +SET SESSION wsrep_sync_wait = 1; +SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; + +--connection node_1 +CREATE DATABASE db1; + +--connection node_2 +--error ER_BAD_DB_ERROR +SHOW CREATE DATABASE db1; +SET GLOBAL DEBUG = ""; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; + +SET SESSION wsrep_sync_wait = 8; +DROP DATABASE db1; + + +# +# Test 2: SHOW commands now obey wsrep_sync_wait = 8 +# + +--connection node_2 +--let $wsrep_provider_options_orig = `SELECT @@wsrep_provider_options` +SET SESSION wsrep_sync_wait = 8; +SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; +SET GLOBAL wsrep_provider_options = "repl.causal_read_timeout=PT0.1S"; + +--connection node_1 +CREATE DATABASE db1; + +--connection node_2 +--error ER_LOCK_WAIT_TIMEOUT +SHOW CREATE DATABASE db1; + +SET GLOBAL DEBUG = ""; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; +DROP DATABASE db1; + +--disable_query_log +--eval SET GLOBAL wsrep_provider_options = "$wsrep_provider_options_orig" From 795713405b0605caddf77f422a0414f1169487b9 Mon Sep 17 00:00:00 2001 From: sjaakola Date: Fri, 10 Mar 2017 09:25:24 +0200 Subject: [PATCH 21/54] Refs: MW-360 * fix for regression with galera_toi_ddl_nonconflicting test --- sql/wsrep_mysqld.cc | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index dfae06b262d..6e847a33dfb 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -1324,7 +1324,7 @@ static bool wsrep_can_run_in_toi(THD *thd, const char *db, const char *table, 1: TOI replication was skipped -1: TOI replication failed */ -static int wsrep_TOI_begin(THD *thd, const char *query, char *db_, char *table_, +static int wsrep_TOI_begin(THD *thd, char *db_, char *table_, const TABLE_LIST* table_list) { wsrep_status_t ret(WSREP_WARNING); @@ -1366,8 +1366,7 @@ static int wsrep_TOI_begin(THD *thd, const char *query, char *db_, char *table_, } /* fallthrough */ default: - buf_err= wsrep_to_buf_helper(thd, (query) ? query : thd->query(), - (query) ? strlen(query) : thd->query_length(), + buf_err= wsrep_to_buf_helper(thd, thd->query(), thd->query_length(), &buf, &buf_len); break; } @@ -1573,7 +1572,7 @@ int wsrep_to_isolation_begin(THD *thd, char *db_, char *table_, { switch (thd->variables.wsrep_OSU_method) { case WSREP_OSU_TOI: - ret = wsrep_TOI_begin(thd, thd->query(), db_, table_, table_list); + ret = wsrep_TOI_begin(thd, db_, table_, table_list); break; case WSREP_OSU_RSU: ret = wsrep_RSU_begin(thd, db_, table_); From e2ccbe1aeac1f866344b33d564f1983aaea3ea80 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Mon, 13 Mar 2017 02:30:01 -0700 Subject: [PATCH 22/54] Galera MTR Tests: Tests for MW-360 DROP TABLE containing temporary tables results in binlog divergence --- mysql-test/suite/galera/r/MW-360.result | 161 ++++++++++++++++++ .../galera/r/galera_ddl_multiline.result | 80 +++++++++ mysql-test/suite/galera/t/MW-360-master.opt | 2 + mysql-test/suite/galera/t/MW-360.test | 103 +++++++++++ .../suite/galera/t/galera_ddl_multiline.test | 54 ++++++ 5 files changed, 400 insertions(+) create mode 100644 mysql-test/suite/galera/r/MW-360.result create mode 100644 mysql-test/suite/galera/r/galera_ddl_multiline.result create mode 100644 mysql-test/suite/galera/t/MW-360-master.opt create mode 100644 mysql-test/suite/galera/t/MW-360.test create mode 100644 mysql-test/suite/galera/t/galera_ddl_multiline.test diff --git a/mysql-test/suite/galera/r/MW-360.result b/mysql-test/suite/galera/r/MW-360.result new file mode 100644 index 00000000000..4195b8f07bc --- /dev/null +++ b/mysql-test/suite/galera/r/MW-360.result @@ -0,0 +1,161 @@ +SET GLOBAL wsrep_on=OFF; +RESET MASTER; +SET GLOBAL wsrep_on=ON; +SET GLOBAL wsrep_on=OFF; +RESET MASTER; +SET GLOBAL wsrep_on=ON; +CREATE TEMPORARY TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +DROP TABLE t1; +CREATE TEMPORARY TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t2 VALUES (2); +DROP TABLE t1, t2; +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +CREATE TEMPORARY TABLE t2 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t2 VALUES (2); +DROP TABLE t1, t2; +CREATE TEMPORARY TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t2 VALUES (2); +CREATE TEMPORARY TABLE t3 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t3 VALUES (3); +DROP TABLE t1, t2, t3; +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +CREATE TEMPORARY TABLE t2 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t2 VALUES (2); +CREATE TABLE t3 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t3 VALUES (3); +DROP TABLE t1, t2, t3; +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +CREATE TEMPORARY TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (2); +DROP TABLE t1; +DROP TABLE t1; +SHOW BINLOG EVENTS IN 'mysqld-bin.000001' FROM 120; +Log_name Pos Event_type Server_id End_log_pos Info +mysqld-bin.000001 120 Previous_gtids 1 151 +mysqld-bin.000001 151 Gtid 1 199 SET @@SESSION.GTID_NEXT= ':1' +mysqld-bin.000001 199 Query 1 339 use `test`; DROP TEMPORARY TABLE IF EXISTS `t1` /* generated by server */ +mysqld-bin.000001 339 Gtid 1 387 SET @@SESSION.GTID_NEXT= ':1' +mysqld-bin.000001 387 Query 1 503 use `test`; CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB +mysqld-bin.000001 503 Gtid 1 551 SET @@SESSION.GTID_NEXT= ':2' +mysqld-bin.000001 551 Query 1 628 BEGIN +mysqld-bin.000001 628 Table_map 1 673 table_id: # (test.t2) +mysqld-bin.000001 673 Write_rows 1 713 table_id: # flags: STMT_END_F +mysqld-bin.000001 713 Xid 1 744 COMMIT /* xid=# */ +mysqld-bin.000001 744 Gtid 1 792 SET @@SESSION.GTID_NEXT= ':2' +mysqld-bin.000001 792 Query 1 927 use `test`; DROP TEMPORARY TABLE IF EXISTS `t1` /* generated by server */ +mysqld-bin.000001 927 Gtid 1 975 SET @@SESSION.GTID_NEXT= ':3' +mysqld-bin.000001 975 Query 1 1090 use `test`; DROP TABLE `t2` /* generated by server */ +mysqld-bin.000001 1090 Gtid 1 1138 SET @@SESSION.GTID_NEXT= ':4' +mysqld-bin.000001 1138 Query 1 1254 use `test`; CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB +mysqld-bin.000001 1254 Gtid 1 1302 SET @@SESSION.GTID_NEXT= ':5' +mysqld-bin.000001 1302 Query 1 1379 BEGIN +mysqld-bin.000001 1379 Table_map 1 1424 table_id: # (test.t1) +mysqld-bin.000001 1424 Write_rows 1 1464 table_id: # flags: STMT_END_F +mysqld-bin.000001 1464 Xid 1 1495 COMMIT /* xid=# */ +mysqld-bin.000001 1495 Gtid 1 1543 SET @@SESSION.GTID_NEXT= ':3' +mysqld-bin.000001 1543 Query 1 1678 use `test`; DROP TEMPORARY TABLE IF EXISTS `t2` /* generated by server */ +mysqld-bin.000001 1678 Gtid 1 1726 SET @@SESSION.GTID_NEXT= ':6' +mysqld-bin.000001 1726 Query 1 1841 use `test`; DROP TABLE `t1` /* generated by server */ +mysqld-bin.000001 1841 Gtid 1 1889 SET @@SESSION.GTID_NEXT= ':7' +mysqld-bin.000001 1889 Query 1 2005 use `test`; CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB +mysqld-bin.000001 2005 Gtid 1 2053 SET @@SESSION.GTID_NEXT= ':8' +mysqld-bin.000001 2053 Query 1 2130 BEGIN +mysqld-bin.000001 2130 Table_map 1 2175 table_id: # (test.t2) +mysqld-bin.000001 2175 Write_rows 1 2215 table_id: # flags: STMT_END_F +mysqld-bin.000001 2215 Xid 1 2246 COMMIT /* xid=# */ +mysqld-bin.000001 2246 Gtid 1 2294 SET @@SESSION.GTID_NEXT= ':4' +mysqld-bin.000001 2294 Query 1 2434 use `test`; DROP TEMPORARY TABLE IF EXISTS `t1`,`t3` /* generated by server */ +mysqld-bin.000001 2434 Gtid 1 2482 SET @@SESSION.GTID_NEXT= ':9' +mysqld-bin.000001 2482 Query 1 2597 use `test`; DROP TABLE `t2` /* generated by server */ +mysqld-bin.000001 2597 Gtid 1 2645 SET @@SESSION.GTID_NEXT= ':10' +mysqld-bin.000001 2645 Query 1 2761 use `test`; CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB +mysqld-bin.000001 2761 Gtid 1 2809 SET @@SESSION.GTID_NEXT= ':11' +mysqld-bin.000001 2809 Query 1 2886 BEGIN +mysqld-bin.000001 2886 Table_map 1 2931 table_id: # (test.t1) +mysqld-bin.000001 2931 Write_rows 1 2971 table_id: # flags: STMT_END_F +mysqld-bin.000001 2971 Xid 1 3002 COMMIT /* xid=# */ +mysqld-bin.000001 3002 Gtid 1 3050 SET @@SESSION.GTID_NEXT= ':12' +mysqld-bin.000001 3050 Query 1 3166 use `test`; CREATE TABLE t3 (f1 INTEGER) ENGINE=InnoDB +mysqld-bin.000001 3166 Gtid 1 3214 SET @@SESSION.GTID_NEXT= ':13' +mysqld-bin.000001 3214 Query 1 3291 BEGIN +mysqld-bin.000001 3291 Table_map 1 3336 table_id: # (test.t3) +mysqld-bin.000001 3336 Write_rows 1 3376 table_id: # flags: STMT_END_F +mysqld-bin.000001 3376 Xid 1 3407 COMMIT /* xid=# */ +mysqld-bin.000001 3407 Gtid 1 3455 SET @@SESSION.GTID_NEXT= ':5' +mysqld-bin.000001 3455 Query 1 3590 use `test`; DROP TEMPORARY TABLE IF EXISTS `t2` /* generated by server */ +mysqld-bin.000001 3590 Gtid 1 3638 SET @@SESSION.GTID_NEXT= ':14' +mysqld-bin.000001 3638 Query 1 3758 use `test`; DROP TABLE `t1`,`t3` /* generated by server */ +mysqld-bin.000001 3758 Gtid 1 3806 SET @@SESSION.GTID_NEXT= ':15' +mysqld-bin.000001 3806 Query 1 3922 use `test`; CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB +mysqld-bin.000001 3922 Gtid 1 3970 SET @@SESSION.GTID_NEXT= ':16' +mysqld-bin.000001 3970 Query 1 4047 BEGIN +mysqld-bin.000001 4047 Table_map 1 4092 table_id: # (test.t1) +mysqld-bin.000001 4092 Write_rows 1 4132 table_id: # flags: STMT_END_F +mysqld-bin.000001 4132 Xid 1 4163 COMMIT /* xid=# */ +mysqld-bin.000001 4163 Gtid 1 4211 SET @@SESSION.GTID_NEXT= ':6' +mysqld-bin.000001 4211 Query 1 4351 use `test`; DROP TEMPORARY TABLE IF EXISTS `t1` /* generated by server */ +mysqld-bin.000001 4351 Gtid 1 4399 SET @@SESSION.GTID_NEXT= ':17' +mysqld-bin.000001 4399 Query 1 4514 use `test`; DROP TABLE `t1` /* generated by server */ +SHOW BINLOG EVENTS IN 'mysqld-bin.000001' FROM 120; +Log_name Pos Event_type Server_id End_log_pos Info +mysqld-bin.000001 120 Previous_gtids 2 151 +mysqld-bin.000001 151 Gtid 1 199 SET @@SESSION.GTID_NEXT= ':1' +mysqld-bin.000001 199 Query 1 315 use `test`; CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB +mysqld-bin.000001 315 Gtid 1 363 SET @@SESSION.GTID_NEXT= ':2' +mysqld-bin.000001 363 Query 1 431 BEGIN +mysqld-bin.000001 431 Table_map 1 476 table_id: # (test.t2) +mysqld-bin.000001 476 Write_rows 1 516 table_id: # flags: STMT_END_F +mysqld-bin.000001 516 Xid 1 547 COMMIT /* xid=# */ +mysqld-bin.000001 547 Gtid 1 595 SET @@SESSION.GTID_NEXT= ':3' +mysqld-bin.000001 595 Query 1 710 use `test`; DROP TABLE `t2` /* generated by server */ +mysqld-bin.000001 710 Gtid 1 758 SET @@SESSION.GTID_NEXT= ':4' +mysqld-bin.000001 758 Query 1 874 use `test`; CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB +mysqld-bin.000001 874 Gtid 1 922 SET @@SESSION.GTID_NEXT= ':5' +mysqld-bin.000001 922 Query 1 990 BEGIN +mysqld-bin.000001 990 Table_map 1 1035 table_id: # (test.t1) +mysqld-bin.000001 1035 Write_rows 1 1075 table_id: # flags: STMT_END_F +mysqld-bin.000001 1075 Xid 1 1106 COMMIT /* xid=# */ +mysqld-bin.000001 1106 Gtid 1 1154 SET @@SESSION.GTID_NEXT= ':6' +mysqld-bin.000001 1154 Query 1 1269 use `test`; DROP TABLE `t1` /* generated by server */ +mysqld-bin.000001 1269 Gtid 1 1317 SET @@SESSION.GTID_NEXT= ':7' +mysqld-bin.000001 1317 Query 1 1433 use `test`; CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB +mysqld-bin.000001 1433 Gtid 1 1481 SET @@SESSION.GTID_NEXT= ':8' +mysqld-bin.000001 1481 Query 1 1549 BEGIN +mysqld-bin.000001 1549 Table_map 1 1594 table_id: # (test.t2) +mysqld-bin.000001 1594 Write_rows 1 1634 table_id: # flags: STMT_END_F +mysqld-bin.000001 1634 Xid 1 1665 COMMIT /* xid=# */ +mysqld-bin.000001 1665 Gtid 1 1713 SET @@SESSION.GTID_NEXT= ':9' +mysqld-bin.000001 1713 Query 1 1828 use `test`; DROP TABLE `t2` /* generated by server */ +mysqld-bin.000001 1828 Gtid 1 1876 SET @@SESSION.GTID_NEXT= ':10' +mysqld-bin.000001 1876 Query 1 1992 use `test`; CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB +mysqld-bin.000001 1992 Gtid 1 2040 SET @@SESSION.GTID_NEXT= ':11' +mysqld-bin.000001 2040 Query 1 2108 BEGIN +mysqld-bin.000001 2108 Table_map 1 2153 table_id: # (test.t1) +mysqld-bin.000001 2153 Write_rows 1 2193 table_id: # flags: STMT_END_F +mysqld-bin.000001 2193 Xid 1 2224 COMMIT /* xid=# */ +mysqld-bin.000001 2224 Gtid 1 2272 SET @@SESSION.GTID_NEXT= ':12' +mysqld-bin.000001 2272 Query 1 2388 use `test`; CREATE TABLE t3 (f1 INTEGER) ENGINE=InnoDB +mysqld-bin.000001 2388 Gtid 1 2436 SET @@SESSION.GTID_NEXT= ':13' +mysqld-bin.000001 2436 Query 1 2504 BEGIN +mysqld-bin.000001 2504 Table_map 1 2549 table_id: # (test.t3) +mysqld-bin.000001 2549 Write_rows 1 2589 table_id: # flags: STMT_END_F +mysqld-bin.000001 2589 Xid 1 2620 COMMIT /* xid=# */ +mysqld-bin.000001 2620 Gtid 1 2668 SET @@SESSION.GTID_NEXT= ':14' +mysqld-bin.000001 2668 Query 1 2788 use `test`; DROP TABLE `t1`,`t3` /* generated by server */ +mysqld-bin.000001 2788 Gtid 1 2836 SET @@SESSION.GTID_NEXT= ':15' +mysqld-bin.000001 2836 Query 1 2952 use `test`; CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB +mysqld-bin.000001 2952 Gtid 1 3000 SET @@SESSION.GTID_NEXT= ':16' +mysqld-bin.000001 3000 Query 1 3068 BEGIN +mysqld-bin.000001 3068 Table_map 1 3113 table_id: # (test.t1) +mysqld-bin.000001 3113 Write_rows 1 3153 table_id: # flags: STMT_END_F +mysqld-bin.000001 3153 Xid 1 3184 COMMIT /* xid=# */ +mysqld-bin.000001 3184 Gtid 1 3232 SET @@SESSION.GTID_NEXT= ':17' +mysqld-bin.000001 3232 Query 1 3347 use `test`; DROP TABLE `t1` /* generated by server */ diff --git a/mysql-test/suite/galera/r/galera_ddl_multiline.result b/mysql-test/suite/galera/r/galera_ddl_multiline.result new file mode 100644 index 00000000000..602f18326e8 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_ddl_multiline.result @@ -0,0 +1,80 @@ +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +CREATE TABLE t3 (f1 INTEGER) ENGINE=InnoDB; CREATE TABLE t4 (f1 INTEGER) ENGINE=InnoDB;; +SHOW CREATE TABLE t3; +Table Create Table +t3 CREATE TABLE `t3` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE t4; +Table Create Table +t4 CREATE TABLE `t4` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE t3; +Table Create Table +t3 CREATE TABLE `t3` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE t4; +Table Create Table +t4 CREATE TABLE `t4` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +INSERT INTO t1 VALUES (1); +CREATE TABLE t5 (f1 INTEGER) ENGINE=InnoDB; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +SHOW CREATE TABLE t5; +Table Create Table +t5 CREATE TABLE `t5` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +SHOW CREATE TABLE t5; +Table Create Table +t5 CREATE TABLE `t5` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +CREATE TABLE t6 (f1 INTEGER) ENGINE=InnoDB; INSERT INTO t2 VALUES (1);; +SELECT COUNT(*) = 1 FROM t2; +COUNT(*) = 1 +1 +SHOW CREATE TABLE t6; +Table Create Table +t6 CREATE TABLE `t6` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT COUNT(*) = 1 FROM t2; +COUNT(*) = 1 +1 +SHOW CREATE TABLE t6; +Table Create Table +t6 CREATE TABLE `t6` ( + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +include/diff_servers.inc [servers=1 2] +DROP TABLE t1, t2, t3, t4, t5, t6; diff --git a/mysql-test/suite/galera/t/MW-360-master.opt b/mysql-test/suite/galera/t/MW-360-master.opt new file mode 100644 index 00000000000..6cfaed135e4 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-360-master.opt @@ -0,0 +1,2 @@ +--gtid-mode=ON --log-bin --log-slave-updates --enforce-gtid-consistency + diff --git a/mysql-test/suite/galera/t/MW-360.test b/mysql-test/suite/galera/t/MW-360.test new file mode 100644 index 00000000000..7ea743cdb3d --- /dev/null +++ b/mysql-test/suite/galera/t/MW-360.test @@ -0,0 +1,103 @@ +# +# MW-360 DROP TABLE containing temporary tables results in binlog divergence +# + +--source include/galera_cluster.inc +--source include/have_binlog_format_row.inc + +--connection node_1 +SET GLOBAL wsrep_on=OFF; +RESET MASTER; +SET GLOBAL wsrep_on=ON; + +--connection node_2 +SET GLOBAL wsrep_on=OFF; +RESET MASTER; +SET GLOBAL wsrep_on=ON; + +--connection node_1 + +# +# Straightforward temporary table +# + +CREATE TEMPORARY TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +DROP TABLE t1; +--let $local_uuid = `SELECT LEFT(@@global.gtid_executed, 36)` + +# +# A mix of normal and temporary tables +# + +# Temp table first, normal table second + +CREATE TEMPORARY TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t2 VALUES (2); + +DROP TABLE t1, t2; + +# Normal table first, temporary table second + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +CREATE TEMPORARY TABLE t2 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t2 VALUES (2); + +DROP TABLE t1, t2; + +# Temporary table first, normal table second, temp table third + +CREATE TEMPORARY TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t2 VALUES (2); + +CREATE TEMPORARY TABLE t3 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t3 VALUES (3); + +DROP TABLE t1, t2, t3; + +# Normal table first, temporary table second, normal table third + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +CREATE TEMPORARY TABLE t2 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t2 VALUES (2); + +CREATE TABLE t3 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t3 VALUES (3); + +DROP TABLE t1, t2, t3; + +# +# A temporary table masking a normal one +# + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +CREATE TEMPORARY TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (2); + +DROP TABLE t1; +DROP TABLE t1; + +--connection node_2 +--let $cluster_uuid = `SELECT LEFT(@@global.gtid_executed, 36)` + +--connection node_1 +--replace_regex /table_id: [0-9]+/table_id: #/ /xid=[0-9]+/xid=#/ +--replace_result $local_uuid $cluster_uuid +SHOW BINLOG EVENTS IN 'mysqld-bin.000001' FROM 120; + +--connection node_2 +--replace_regex /table_id: [0-9]+/table_id: #/ /xid=[0-9]+/xid=#/ +--replace_result $local_uuid $cluster_uuid +SHOW BINLOG EVENTS IN 'mysqld-bin.000001' FROM 120; diff --git a/mysql-test/suite/galera/t/galera_ddl_multiline.test b/mysql-test/suite/galera/t/galera_ddl_multiline.test new file mode 100644 index 00000000000..c7155d066fa --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ddl_multiline.test @@ -0,0 +1,54 @@ +# +# Test that Galera works correctly with multiline statements, in particular involving DDLs +# + +--source include/galera_cluster.inc + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; + +SHOW CREATE TABLE t1; +SHOW CREATE TABLE t2; + +--connection node_2 +SHOW CREATE TABLE t1; +SHOW CREATE TABLE t2; + +--connection node_1 +--send CREATE TABLE t3 (f1 INTEGER) ENGINE=InnoDB; CREATE TABLE t4 (f1 INTEGER) ENGINE=InnoDB; +--reap + +SHOW CREATE TABLE t3; +SHOW CREATE TABLE t4; + +--connection node_2 +SHOW CREATE TABLE t3; +SHOW CREATE TABLE t4; + +--connection node_1 +INSERT INTO t1 VALUES (1); CREATE TABLE t5 (f1 INTEGER) ENGINE=InnoDB; + +SELECT COUNT(*) = 1 FROM t1; +SHOW CREATE TABLE t5; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; +SHOW CREATE TABLE t5; + +--connection node_1 +--send CREATE TABLE t6 (f1 INTEGER) ENGINE=InnoDB; INSERT INTO t2 VALUES (1); +--reap + +SELECT COUNT(*) = 1 FROM t2; +SHOW CREATE TABLE t6; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t2; +SHOW CREATE TABLE t6; + +--let $diff_servers = 1 2 +--source include/diff_servers.inc + +--connection node_1 +DROP TABLE t1, t2, t3, t4, t5, t6; + From 62cd7553d9d8ffa02485ae050b7a760f461a5017 Mon Sep 17 00:00:00 2001 From: Daniele Sciascia Date: Mon, 13 Mar 2017 15:35:04 +0100 Subject: [PATCH 23/54] MW-86 Additional wsrep_sync_wait coverage The following commands are now subject to wsrep_sync_wait with bitmask value 8: SHOW BINARY LOGS SHOW BINLOG EVENTS SHOW GRANTS --- sql/sql_parse.cc | 12 +++++++++--- sql/sql_parse.h | 4 ++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 38d53b6c5c6..c82ae8f0f5c 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2805,11 +2805,14 @@ mysql_execute_command(THD *thd) case SQLCOM_SHOW_COLLATIONS: case SQLCOM_SHOW_STORAGE_ENGINES: case SQLCOM_SHOW_PROFILE: - WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); case SQLCOM_SELECT: { - if (lex->sql_command == SQLCOM_SELECT) - WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_READ); +#ifdef WITH_WSREP + if (lex->sql_command == SQLCOM_SELECT) + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_READ) + else + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW) +#endif /* WITH_WSREP */ thd->status_var.last_query_cost= 0.0; @@ -2933,6 +2936,7 @@ case SQLCOM_PREPARE: case SQLCOM_SHOW_RELAYLOG_EVENTS: /* fall through */ case SQLCOM_SHOW_BINLOG_EVENTS: { + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); if (check_global_access(thd, REPL_SLAVE_ACL)) goto error; res = mysql_show_binlog_events(thd); @@ -3495,6 +3499,7 @@ end_with_restore_list: { if (check_global_access(thd, SUPER_ACL | REPL_CLIENT_ACL)) goto error; + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); res = show_binlogs(thd); break; } @@ -4778,6 +4783,7 @@ end_with_restore_list: if (!grant_user) goto error; + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); res = mysql_show_grants(thd, grant_user); break; } diff --git a/sql/sql_parse.h b/sql/sql_parse.h index e9c82b9df48..c3844bcc83f 100644 --- a/sql/sql_parse.h +++ b/sql/sql_parse.h @@ -226,8 +226,8 @@ inline bool is_supported_parser_charset(CHARSET_INFO *cs) && wsrep_to_isolation_begin(thd, db_, table_, table_list_)) goto error; #define WSREP_SYNC_WAIT(thd_, before_) \ - if (WSREP_CLIENT(thd_) && \ - wsrep_sync_wait(thd_, before_)) goto error; + { if (WSREP_CLIENT(thd_) && \ + wsrep_sync_wait(thd_, before_)) goto error; } #else From fae7d85600dbf343df55bf197e46a2dcbb874da0 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Mon, 13 Mar 2017 08:45:42 -0700 Subject: [PATCH 24/54] Galera MTR Tests: Extend test for MW-86 with additional SHOW commands --- mysql-test/suite/galera/t/MW-86-master.opt | 1 + 1 file changed, 1 insertion(+) create mode 100644 mysql-test/suite/galera/t/MW-86-master.opt diff --git a/mysql-test/suite/galera/t/MW-86-master.opt b/mysql-test/suite/galera/t/MW-86-master.opt new file mode 100644 index 00000000000..8a755e98b00 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-86-master.opt @@ -0,0 +1 @@ +--log-bin --log-slave-updates From df5b90e18b47fd69563f49c099938b9b1ab32a27 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Mon, 13 Mar 2017 08:52:09 -0700 Subject: [PATCH 25/54] Galera MTR Tests: Extend test for MW-86 with additional SHOW commands (part #2) --- mysql-test/suite/galera/r/MW-86.result | 57 +++++++++- mysql-test/suite/galera/t/MW-86.test | 147 ++++++++++++++++++++++++- 2 files changed, 196 insertions(+), 8 deletions(-) diff --git a/mysql-test/suite/galera/r/MW-86.result b/mysql-test/suite/galera/r/MW-86.result index d0799a0a708..b29175216a8 100644 --- a/mysql-test/suite/galera/r/MW-86.result +++ b/mysql-test/suite/galera/r/MW-86.result @@ -1,18 +1,65 @@ SET SESSION wsrep_sync_wait = 1; SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; CREATE DATABASE db1; +SHOW BINARY LOGS; +SHOW BINLOG EVENTS; +SHOW COLUMNS FROM t1; SHOW CREATE DATABASE db1; -ERROR 42000: Unknown database 'db1' +SHOW CREATE EVENT e1; +SHOW CREATE FUNCTION f1; +SHOW CREATE PROCEDURE p1; +SHOW CREATE TABLE t1; +SHOW CREATE TRIGGER tr1; +SHOW CREATE VIEW v1; +SHOW DATABASES; +SHOW ENGINE InnoDB STATUS; +SHOW FUNCTION CODE f1; +SHOW FUNCTION STATUS; +SHOW GRANTS FOR 'root'@'localhost'; +SHOW INDEX FROM t1; +SHOW OPEN TABLES; +SHOW PROCEDURE CODE p1; +SHOW PROCEDURE STATUS; +SHOW PRIVILEGES; +SHOW STATUS LIKE 'wsrep_cluster_size'; +SHOW TABLE STATUS; +SHOW TABLES; +SHOW TRIGGERS; +SHOW GLOBAL VARIABLES LIKE 'foo_bar'; +SHOW WARNINGS; SET GLOBAL DEBUG = ""; SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; SET SESSION wsrep_sync_wait = 8; DROP DATABASE db1; +SET GLOBAL wsrep_provider_options = "repl.causal_read_timeout=PT0.1S"; SET SESSION wsrep_sync_wait = 8; SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; -SET GLOBAL wsrep_provider_options = "repl.causal_read_timeout=PT0.1S"; -CREATE DATABASE db1; +CREATE TABLE q (f1 INTEGER) ENGINE=InnoDB; +SHOW BINARY LOGS; +SHOW BINLOG EVENTS; +SHOW COLUMNS FROM t1; SHOW CREATE DATABASE db1; -ERROR HY000: Lock wait timeout exceeded; try restarting transaction +SHOW CREATE EVENT e1; +SHOW CREATE FUNCTION f1; +SHOW CREATE PROCEDURE p1; +SHOW CREATE TABLE t1; +SHOW CREATE TRIGGER tr1; +SHOW CREATE VIEW v1; +SHOW DATABASES; +SHOW ENGINE InnoDB STATUS; +SHOW FUNCTION CODE f1; +SHOW FUNCTION STATUS; +SHOW GRANTS FOR 'root'@'localhost'; +SHOW INDEX FROM t1; +SHOW OPEN TABLES; +SHOW PROCEDURE CODE p1; +SHOW PROCEDURE STATUS; +SHOW PRIVILEGES; +SHOW STATUS LIKE 'wsrep_cluster_size'; +SHOW TABLE STATUS; +SHOW TABLES; +SHOW TRIGGERS; +SHOW GLOBAL VARIABLES LIKE 'foo_bar'; +SHOW WARNINGS; SET GLOBAL DEBUG = ""; SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; -DROP DATABASE db1; diff --git a/mysql-test/suite/galera/t/MW-86.test b/mysql-test/suite/galera/t/MW-86.test index cc92dbbd818..c6550ecdaaa 100644 --- a/mysql-test/suite/galera/t/MW-86.test +++ b/mysql-test/suite/galera/t/MW-86.test @@ -1,4 +1,5 @@ --source include/galera_cluster.inc +--source include/have_binlog_format_row.inc # # Test 1: SHOW commands no longer obey wsrep_sync_wait = 1 @@ -7,13 +8,76 @@ --connection node_2 SET SESSION wsrep_sync_wait = 1; SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; +--disable_result_log --connection node_1 CREATE DATABASE db1; --connection node_2 +SHOW BINARY LOGS; + +SHOW BINLOG EVENTS; + +--error ER_NO_SUCH_TABLE +SHOW COLUMNS FROM t1; + --error ER_BAD_DB_ERROR SHOW CREATE DATABASE db1; + +--error ER_EVENT_DOES_NOT_EXIST +SHOW CREATE EVENT e1; + +--error ER_SP_DOES_NOT_EXIST +SHOW CREATE FUNCTION f1; + +--error ER_SP_DOES_NOT_EXIST +SHOW CREATE PROCEDURE p1; + +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t1; + +--error ER_TRG_DOES_NOT_EXIST +SHOW CREATE TRIGGER tr1; + +--error ER_NO_SUCH_TABLE +SHOW CREATE VIEW v1; + +SHOW DATABASES; + +SHOW ENGINE InnoDB STATUS; + +--error ER_SP_DOES_NOT_EXIST +SHOW FUNCTION CODE f1; + +SHOW FUNCTION STATUS; + +SHOW GRANTS FOR 'root'@'localhost'; + +--error ER_NO_SUCH_TABLE +SHOW INDEX FROM t1; + +SHOW OPEN TABLES; + +--error ER_SP_DOES_NOT_EXIST +SHOW PROCEDURE CODE p1; + +SHOW PROCEDURE STATUS; + +SHOW PRIVILEGES; + +SHOW STATUS LIKE 'wsrep_cluster_size'; + +SHOW TABLE STATUS; + +SHOW TABLES; + +SHOW TRIGGERS; + +SHOW GLOBAL VARIABLES LIKE 'foo_bar'; + +--error 0 +SHOW WARNINGS; + SET GLOBAL DEBUG = ""; SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; @@ -27,20 +91,97 @@ DROP DATABASE db1; --connection node_2 --let $wsrep_provider_options_orig = `SELECT @@wsrep_provider_options` +SET GLOBAL wsrep_provider_options = "repl.causal_read_timeout=PT0.1S"; SET SESSION wsrep_sync_wait = 8; SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; -SET GLOBAL wsrep_provider_options = "repl.causal_read_timeout=PT0.1S"; --connection node_1 -CREATE DATABASE db1; +CREATE TABLE q (f1 INTEGER) ENGINE=InnoDB; --connection node_2 +--error ER_LOCK_WAIT_TIMEOUT +SHOW BINARY LOGS; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW BINLOG EVENTS; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW COLUMNS FROM t1; + --error ER_LOCK_WAIT_TIMEOUT SHOW CREATE DATABASE db1; +--error ER_LOCK_WAIT_TIMEOUT +SHOW CREATE EVENT e1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW CREATE FUNCTION f1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW CREATE PROCEDURE p1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW CREATE TABLE t1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW CREATE TRIGGER tr1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW CREATE VIEW v1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW DATABASES; + +--error 0 +SHOW ENGINE InnoDB STATUS; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW FUNCTION CODE f1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW FUNCTION STATUS; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW GRANTS FOR 'root'@'localhost'; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW INDEX FROM t1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW OPEN TABLES; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW PROCEDURE CODE p1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW PROCEDURE STATUS; + +--error 0 +SHOW PRIVILEGES; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW STATUS LIKE 'wsrep_cluster_size'; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW TABLE STATUS; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW TABLES; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW TRIGGERS; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW GLOBAL VARIABLES LIKE 'foo_bar'; + +--error 0 +SHOW WARNINGS; + SET GLOBAL DEBUG = ""; SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; -DROP DATABASE db1; --disable_query_log --eval SET GLOBAL wsrep_provider_options = "$wsrep_provider_options_orig" + +SET SESSION wsrep_sync_wait = 15; +DROP TABLE q; From f81d9ef108b147209403cfe1be54a6f8176aacfe Mon Sep 17 00:00:00 2001 From: Daniele Sciascia Date: Mon, 13 Mar 2017 22:45:42 +0100 Subject: [PATCH 26/54] MW-86 Removed unnecessary wsrep_sync_wait before processing SQLCOM_REPLACE Sync waiting before processing SQLCOM_REPLACE was not necessary given that this case falls through to processing of SQLCOM_INSERT. In case of SQLCOM_REPLACE, wsrep_sync_wait would be called twice. --- sql/sql_parse.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index c82ae8f0f5c..c487835c84e 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -3697,7 +3697,6 @@ end_with_restore_list: break; } case SQLCOM_REPLACE: - WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_INSERT_REPLACE); #ifndef DBUG_OFF if (mysql_bin_log.is_open()) { From a7f010a34362d751bac2b26c28836eeae1fc4f1c Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Tue, 14 Mar 2017 12:41:22 -0700 Subject: [PATCH 27/54] Galera MTR Tests: Test case for GAL-501 Improved URI parsing for IPv6 addresses --- .../suite/galera_3nodes/r/GAL-501.result | 14 +++++++ mysql-test/suite/galera_3nodes/t/GAL-501.cnf | 26 +++++++++++++ mysql-test/suite/galera_3nodes/t/GAL-501.test | 38 +++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 mysql-test/suite/galera_3nodes/r/GAL-501.result create mode 100644 mysql-test/suite/galera_3nodes/t/GAL-501.cnf create mode 100644 mysql-test/suite/galera_3nodes/t/GAL-501.test diff --git a/mysql-test/suite/galera_3nodes/r/GAL-501.result b/mysql-test/suite/galera_3nodes/r/GAL-501.result new file mode 100644 index 00000000000..a2bf5f4d98c --- /dev/null +++ b/mysql-test/suite/galera_3nodes/r/GAL-501.result @@ -0,0 +1,14 @@ +SELECT VARIABLE_VALUE LIKE '%[::1]%' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_incoming_addresses'; +VARIABLE_VALUE LIKE '%[::1]%' +1 +SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 3 +1 +SET GLOBAL wsrep_provider_options='gmcast.isolate=1'; +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +SET GLOBAL wsrep_provider_options='gmcast.isolate=0'; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera_3nodes/t/GAL-501.cnf b/mysql-test/suite/galera_3nodes/t/GAL-501.cnf new file mode 100644 index 00000000000..7002cb5bdfd --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/GAL-501.cnf @@ -0,0 +1,26 @@ +!include ../galera_3nodes.cnf + +[mysqld] +wsrep_sst_method=rsync + + +[mysqld.1] +wsrep-cluster-address=gcomm:// +wsrep_node_address=[::1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.1.#galera_port;ist.recv_addr=[::1]' +wsrep_sst_receive_address='[::1]:@mysqld.1.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.1.port' + +[mysqld.2] +wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' +wsrep_node_address=[::1] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.2.#galera_port;ist.recv_addr=[::1]' +wsrep_sst_receive_address='[::1]:@mysqld.2.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.2.port' + +[mysqld.3] +wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' +wsrep_node_address=[::1] +wsrep_provider_options='base_port=@mysqld.3.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.3.#galera_port;ist.recv_addr=[::1]' +wsrep_sst_receive_address='[::1]:@mysqld.3.#sst_port' +wsrep_node_incoming_address='[::1]:@mysqld.3.port' diff --git a/mysql-test/suite/galera_3nodes/t/GAL-501.test b/mysql-test/suite/galera_3nodes/t/GAL-501.test new file mode 100644 index 00000000000..60ed5989227 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/GAL-501.test @@ -0,0 +1,38 @@ +# +# Test GAL-501 Improved URI parsing for IPv6 addresses +# The .cnf file contains +# wsrep_node_address=[::1] +# ist.recv_addr=[::1] + +--source include/galera_cluster.inc +--source include/have_ipv6.inc + +# Confirm that initial handshake happened over ipv6 + +SELECT VARIABLE_VALUE LIKE '%[::1]%' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_incoming_addresses'; +SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +# Force IST + +--connection node_2 +SET GLOBAL wsrep_provider_options='gmcast.isolate=1'; + +--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 + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +--connection node_2 +SET GLOBAL wsrep_provider_options='gmcast.isolate=0'; + +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +--source include/wait_condition.inc + +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; From ea197c0f7d44a2e5cccb1543212787f33cc16776 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Fri, 24 Mar 2017 02:15:01 -0700 Subject: [PATCH 28/54] Galera MTR Tests: Stability fixes --- mysql-test/suite/galera/disabled.def | 4 ---- mysql-test/suite/galera/r/MW-329.result | 1 + .../suite/galera/r/galera_as_slave_autoinc.result | 4 +--- .../suite/galera/r/galera_ist_restart_joiner.result | 5 ++--- mysql-test/suite/galera/r/mysql-wsrep#198.result | 3 +++ mysql-test/suite/galera/t/MW-329.test | 3 +++ .../suite/galera/t/galera_as_slave_autoinc.test | 2 +- mysql-test/suite/galera/t/galera_gcs_fc_limit.test | 6 +++--- .../suite/galera/t/galera_ist_restart_joiner.test | 11 ++++++----- mysql-test/suite/galera/t/mysql-wsrep#198.test | 3 +++ 10 files changed, 23 insertions(+), 19 deletions(-) diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index d96eb005eed..59f1ec37986 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -36,13 +36,9 @@ GAL-480 : Investigate galera_fk_no_pk :Investigate galera_account_management : Investigate galera.galera_var_retry_autocommit : MDEV-12319 #Sparodic Faliure -galera.galera_gcs_fc_limit : MDEV-12319 #Sparodic Faliure galera.galera_toi_ddl_nonconflicting : MDEV-12319 #Sparodic Faliure -galera.mysql-wsrep#198 : MDEV-12319 #Sparodic Faliure galera.galera_pc_ignore_sb : MDEV-12319 #Sparodic Faliure -galera.MW-329 : MDEV-12319 #Sparodic Faliure galera.galera_ist_recv_bind : MDEV-12319 #Failed to start mysqld -galera.galera_ist_restart_joiner : MDEV-12319 #Failed to start mysqld galera.galera_ssl_compression : MDEV-12319 #Failed to start mysqld galera.galera_wan : MDEV-12319 #Failed to start mysqld galera.rpl_row_annotate : MDEV-12319 #Failed to start mysqld diff --git a/mysql-test/suite/galera/r/MW-329.result b/mysql-test/suite/galera/r/MW-329.result index 655d8e9e291..a79ba598d69 100644 --- a/mysql-test/suite/galera/r/MW-329.result +++ b/mysql-test/suite/galera/r/MW-329.result @@ -18,3 +18,4 @@ VARIABLE_VALUE > 0 1 DROP PROCEDURE proc_insert; DROP TABLE t1; +CALL mtr.add_suppression("conflict state 3 after post commit"); diff --git a/mysql-test/suite/galera/r/galera_as_slave_autoinc.result b/mysql-test/suite/galera/r/galera_as_slave_autoinc.result index b6314b862c2..3c5319a6126 100644 --- a/mysql-test/suite/galera/r/galera_as_slave_autoinc.result +++ b/mysql-test/suite/galera/r/galera_as_slave_autoinc.result @@ -35,11 +35,9 @@ i c show variables like 'binlog_format'; Variable_name Value binlog_format STATEMENT -show variables like '%auto_increment%'; +show variables like 'auto_increment_increment'; Variable_name Value auto_increment_increment 7 -auto_increment_offset 5 -wsrep_auto_increment_control ON select * from t1; i c 1 dummy_text diff --git a/mysql-test/suite/galera/r/galera_ist_restart_joiner.result b/mysql-test/suite/galera/r/galera_ist_restart_joiner.result index f7a1386e7f8..298105213ea 100644 --- a/mysql-test/suite/galera/r/galera_ist_restart_joiner.result +++ b/mysql-test/suite/galera/r/galera_ist_restart_joiner.result @@ -7,9 +7,8 @@ UPDATE t1 SET f2 = 'c' WHERE f1 > 2; SET GLOBAL wsrep_provider_options = 'dbug=d,recv_IST_after_apply_trx'; SET SESSION wsrep_sync_wait = 0; Loading wsrep_provider ... -SHOW STATUS LIKE 'wsrep_debug_sync_waiters'; -Variable_name Value -wsrep_debug_sync_waiters recv_IST_after_apply_trx +SET SESSION wsrep_on=OFF; +SET SESSION wsrep_on=ON; UPDATE t1 SET f2 = 'd' WHERE f1 > 3; CREATE TABLE t2 (f1 INTEGER); UPDATE t1 SET f2 = 'e' WHERE f1 > 4; diff --git a/mysql-test/suite/galera/r/mysql-wsrep#198.result b/mysql-test/suite/galera/r/mysql-wsrep#198.result index 25ba2cb615c..a278c492372 100644 --- a/mysql-test/suite/galera/r/mysql-wsrep#198.result +++ b/mysql-test/suite/galera/r/mysql-wsrep#198.result @@ -1,5 +1,8 @@ CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; CREATE TABLE t2 (id INT PRIMARY KEY) ENGINE=InnoDB; +SELECT 1 FROM DUAL; +1 +1 LOCK TABLE t2 WRITE; OPTIMIZE TABLE t1,t2;; REPAIR TABLE t1,t2;; diff --git a/mysql-test/suite/galera/t/MW-329.test b/mysql-test/suite/galera/t/MW-329.test index acf6763b396..d9f9a787442 100644 --- a/mysql-test/suite/galera/t/MW-329.test +++ b/mysql-test/suite/galera/t/MW-329.test @@ -80,3 +80,6 @@ SELECT VARIABLE_VALUE > 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_N --connection node_1 DROP PROCEDURE proc_insert; DROP TABLE t1; + +# Due to MW-330, Multiple "conflict state 3 after post commit" warnings if table is dropped while SP is running +CALL mtr.add_suppression("conflict state 3 after post commit"); diff --git a/mysql-test/suite/galera/t/galera_as_slave_autoinc.test b/mysql-test/suite/galera/t/galera_as_slave_autoinc.test index 9292badc480..59483d0591c 100644 --- a/mysql-test/suite/galera/t/galera_as_slave_autoinc.test +++ b/mysql-test/suite/galera/t/galera_as_slave_autoinc.test @@ -48,7 +48,7 @@ insert into t1(i) values(null), (null), (null); select * from t1; show variables like 'binlog_format'; -show variables like '%auto_increment%'; +show variables like 'auto_increment_increment'; --connection node_2 --let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; 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 dc65a452d7c..61576a39316 100644 --- a/mysql-test/suite/galera/t/galera_gcs_fc_limit.test +++ b/mysql-test/suite/galera/t/galera_gcs_fc_limit.test @@ -21,11 +21,11 @@ LOCK TABLE t1 WRITE; --connection node_1 --sleep 1 INSERT INTO t1 VALUES (2); ---sleep 1 +--sleep 2 INSERT INTO t1 VALUES (3); ---sleep 1 +--sleep 2 INSERT INTO t1 VALUES (4); ---sleep 1 +--sleep 2 # This query will hang because flow control will kick in --send diff --git a/mysql-test/suite/galera/t/galera_ist_restart_joiner.test b/mysql-test/suite/galera/t/galera_ist_restart_joiner.test index 931daaad30d..f43a347f5bb 100644 --- a/mysql-test/suite/galera/t/galera_ist_restart_joiner.test +++ b/mysql-test/suite/galera/t/galera_ist_restart_joiner.test @@ -48,15 +48,16 @@ SET SESSION wsrep_sync_wait = 0; # ... and restart provider to force IST --echo Loading wsrep_provider ... --disable_query_log +# base_port setting is lost for some reason when unloading provider, so we need to restore it +--eval SET GLOBAL wsrep_provider_options= 'base_port=$NODE_GALERAPORT_2'; --eval SET GLOBAL wsrep_provider = '$wsrep_provider_orig'; --eval SET GLOBAL wsrep_cluster_address = '$wsrep_cluster_address_orig'; --enable_query_log -# We can not use a wait_condition on SELECT * FROM INFORMATION_SCHEMA.GLOBAL_STATUS as such queries are blocked during IST -# so we perform a simple sleep and SHOW instead - ---sleep 5 -SHOW STATUS LIKE 'wsrep_debug_sync_waiters'; +SET SESSION wsrep_on=OFF; +--let $wait_condition = SELECT VARIABLE_VALUE = '' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_debug_sync_waiters'; +--source include/wait_condition.inc +SET SESSION wsrep_on=ON; --connection node_1 # Perform DML and DDL while IST is in progress diff --git a/mysql-test/suite/galera/t/mysql-wsrep#198.test b/mysql-test/suite/galera/t/mysql-wsrep#198.test index 2b05c4ff4d9..a80d030a8b0 100644 --- a/mysql-test/suite/galera/t/mysql-wsrep#198.test +++ b/mysql-test/suite/galera/t/mysql-wsrep#198.test @@ -5,6 +5,9 @@ CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; CREATE TABLE t2 (id INT PRIMARY KEY) ENGINE=InnoDB; --connection node_2 +# Ensure that the tables have been created on node #2 +SELECT 1 FROM DUAL; + LOCK TABLE t2 WRITE; --connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 From 7f66fcc3fc26cb126ca15df1f82cc9c5dc71bf72 Mon Sep 17 00:00:00 2001 From: Philip Stoev Date: Mon, 27 Mar 2017 02:22:18 -0700 Subject: [PATCH 29/54] Galera MTR Tests: Fortify galera_ist_restart_joiner.test - remove DDLs, fix sync point handling --- .../galera/r/galera_ist_restart_joiner.result | 12 +--------- .../galera/t/galera_ist_restart_joiner.test | 23 ++++++------------- 2 files changed, 8 insertions(+), 27 deletions(-) diff --git a/mysql-test/suite/galera/r/galera_ist_restart_joiner.result b/mysql-test/suite/galera/r/galera_ist_restart_joiner.result index 298105213ea..ca6848fb925 100644 --- a/mysql-test/suite/galera/r/galera_ist_restart_joiner.result +++ b/mysql-test/suite/galera/r/galera_ist_restart_joiner.result @@ -4,15 +4,11 @@ Unloading wsrep provider ... SET GLOBAL wsrep_provider = 'none'; UPDATE t1 SET f2 = 'b' WHERE f1 > 1; UPDATE t1 SET f2 = 'c' WHERE f1 > 2; -SET GLOBAL wsrep_provider_options = 'dbug=d,recv_IST_after_apply_trx'; -SET SESSION wsrep_sync_wait = 0; Loading wsrep_provider ... SET SESSION wsrep_on=OFF; SET SESSION wsrep_on=ON; UPDATE t1 SET f2 = 'd' WHERE f1 > 3; -CREATE TABLE t2 (f1 INTEGER); UPDATE t1 SET f2 = 'e' WHERE f1 > 4; -CREATE TABLE t3 (f1 INTEGER); Performing --wsrep-recover ... Starting server ... Using --wsrep-start-position when starting mysqld ... @@ -33,10 +29,4 @@ f1 f2 4 d 5 e 6 f -SELECT COUNT(*) = 0 FROM t2; -COUNT(*) = 0 -1 -SELECT COUNT(*) = 0 FROM t3; -COUNT(*) = 0 -1 -DROP TABLE t1, t2, t3; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_ist_restart_joiner.test b/mysql-test/suite/galera/t/galera_ist_restart_joiner.test index f43a347f5bb..e007e71f1ee 100644 --- a/mysql-test/suite/galera/t/galera_ist_restart_joiner.test +++ b/mysql-test/suite/galera/t/galera_ist_restart_joiner.test @@ -31,13 +31,6 @@ UPDATE t1 SET f2 = 'b' WHERE f1 > 1; UPDATE t1 SET f2 = 'c' WHERE f1 > 2; --connection node_2 -# Make sure IST will block ... ---let $galera_sync_point = recv_IST_after_apply_trx ---source include/galera_set_sync_point.inc - -SET SESSION wsrep_sync_wait = 0; - - # Write file to make mysql-test-run.pl expect the crash, but don't start it --let $_server_id= `SELECT @@server_id` --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.$_server_id.expect @@ -51,19 +44,20 @@ SET SESSION wsrep_sync_wait = 0; # base_port setting is lost for some reason when unloading provider, so we need to restore it --eval SET GLOBAL wsrep_provider_options= 'base_port=$NODE_GALERAPORT_2'; --eval SET GLOBAL wsrep_provider = '$wsrep_provider_orig'; +# Make sure IST will block ... +--let $galera_sync_point = recv_IST_after_apply_trx +--source include/galera_set_sync_point.inc --eval SET GLOBAL wsrep_cluster_address = '$wsrep_cluster_address_orig'; --enable_query_log SET SESSION wsrep_on=OFF; ---let $wait_condition = SELECT VARIABLE_VALUE = '' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_debug_sync_waiters'; +--let $wait_condition = SELECT VARIABLE_VALUE = 'recv_IST_after_apply_trx' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_debug_sync_waiters'; --source include/wait_condition.inc SET SESSION wsrep_on=ON; --connection node_1 -# Perform DML and DDL while IST is in progress ---connection node_1 +# Perform DML while IST is in progress UPDATE t1 SET f2 = 'd' WHERE f1 > 3; -CREATE TABLE t2 (f1 INTEGER); # Kill node #2 while IST is in progress --connection node_2 @@ -86,9 +80,8 @@ EOF --let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' --source include/wait_condition.inc -# Perform DML and DDL while node #2 is down +# Perform DML while node #2 is down UPDATE t1 SET f2 = 'e' WHERE f1 > 4; -CREATE TABLE t3 (f1 INTEGER); --connection node_2 @@ -107,11 +100,9 @@ SELECT * FROM t1; --connection node_2 SELECT * FROM t1; -SELECT COUNT(*) = 0 FROM t2; -SELECT COUNT(*) = 0 FROM t3; --connection node_1 -DROP TABLE t1, t2, t3; +DROP TABLE t1; # Restore original auto_increment_offset values. --source include/auto_increment_offset_restore.inc From 20c21152dbdc1912d592cccd97e95f10fafe5f58 Mon Sep 17 00:00:00 2001 From: sjaakola Date: Wed, 5 Apr 2017 10:51:42 +0300 Subject: [PATCH 30/54] Refs: MW-369 * added MTR test, which causes a crash in slave applying, due to FK constraint violation * mtr test is not deterministic, but can surface the crash, at least in my laptop --- mysql-test/suite/galera/t/MW-369.test | 82 +++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 mysql-test/suite/galera/t/MW-369.test diff --git a/mysql-test/suite/galera/t/MW-369.test b/mysql-test/suite/galera/t/MW-369.test new file mode 100644 index 00000000000..d27df96dadb --- /dev/null +++ b/mysql-test/suite/galera/t/MW-369.test @@ -0,0 +1,82 @@ +# +# This test tests the operation of transaction replay for a transaction which operates on FK parent table. +# If a potentially conflicting remote transaction arrives at just the right time during the commit of a +# local transaction, the local transaction will be aborted and replayed. +# The replaying should be possible and honor the FK constraints. +# + +--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 + +--let $wsrep_local_replays_old = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` + +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; + +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); + +--connection node_1 +SET AUTOCOMMIT=ON; +START TRANSACTION; + +DELETE FROM p WHERE f1 = 1; +SELECT * FROM p WHERE f1 = 2 FOR UPDATE; + +# Block the commit +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--let $galera_sync_point = commit_monitor_enter_sync +--source include/galera_set_sync_point.inc + +# +# insert client row, which will make it impossible to replay the delete on parent +# +--connection node_2 +INSERT INTO c values (1,1); + +--connection node_1 +--send COMMIT; + +# Wait until commit is blocked +--connection node_1a +SET SESSION wsrep_sync_wait = 0; +--source include/galera_wait_sync_point.inc + +# +# send conflicting delete which will make node1 trx to abort and replay +# +--connection node_2 +DELETE FROM p 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 +--source include/galera_clear_sync_point.inc +--source include/galera_signal_sync_point.inc + +# Commit succeeds +--connection node_1 +--reap + +# wsrep_local_replays has increased by 1 +--let $wsrep_local_replays_new = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--disable_query_log +--eval SELECT $wsrep_local_replays_new - $wsrep_local_replays_old = 1 AS wsrep_local_replays; +--enable_query_log + +--connection node_2 +SELECT COUNT(*) = 2 FROM p; +SELECT COUNT(*) = 1 FROM c; + +DROP TABLE c; +DROP TABLE p; From cc3bee92b68b7cd39dd157938e13b8bf495043e0 Mon Sep 17 00:00:00 2001 From: sjaakola Date: Wed, 5 Apr 2017 12:08:06 +0300 Subject: [PATCH 31/54] Refs: MW-369 * changed insert for a FK child table to take exclusive lock on FK parent table --- storage/innobase/row/row0ins.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/innobase/row/row0ins.cc b/storage/innobase/row/row0ins.cc index 07a3b192a14..b8a94af63ac 100644 --- a/storage/innobase/row/row0ins.cc +++ b/storage/innobase/row/row0ins.cc @@ -1640,7 +1640,7 @@ run_again: foreign, rec, check_index, - check_ref, TRUE); + check_ref, FALSE); #endif /* WITH_WSREP */ goto end_scan; } else if (foreign->type != 0) { From 41fac0a54c3250cc7e8da8b2a21d4d03f425c49d Mon Sep 17 00:00:00 2001 From: sjaakola Date: Wed, 5 Apr 2017 12:08:06 +0300 Subject: [PATCH 32/54] Refs: MW-369 * changed insert for a FK child table to take exclusive lock on FK parent table --- storage/xtradb/row/row0ins.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/xtradb/row/row0ins.cc b/storage/xtradb/row/row0ins.cc index 2d6b57221bd..ac59d78596b 100644 --- a/storage/xtradb/row/row0ins.cc +++ b/storage/xtradb/row/row0ins.cc @@ -1652,7 +1652,7 @@ run_again: foreign, rec, check_index, - check_ref, TRUE); + check_ref, FALSE); #endif /* WITH_WSREP */ goto end_scan; } else if (foreign->type != 0) { From 7c07f456a1316854f2e346cbdb5748c18a12dbd0 Mon Sep 17 00:00:00 2001 From: Teemu Ollakka Date: Thu, 6 Apr 2017 09:23:30 +0300 Subject: [PATCH 33/54] MW-369 MTR tests for foreign key conflicts Tests MW-369C, MW-369D haven't been recorded yet since the outcome from the tests is not what is desired. --- mysql-test/suite/galera/r/MW-369A.result | 30 +++++++++++ mysql-test/suite/galera/r/MW-369B.result | 31 +++++++++++ mysql-test/suite/galera/t/MW-369.inc | 67 ++++++++++++++++++++++++ mysql-test/suite/galera/t/MW-369A.test | 50 ++++++++++++++++++ mysql-test/suite/galera/t/MW-369B.test | 48 +++++++++++++++++ mysql-test/suite/galera/t/MW-369C.test | 49 +++++++++++++++++ mysql-test/suite/galera/t/MW-369D.test | 48 +++++++++++++++++ 7 files changed, 323 insertions(+) create mode 100644 mysql-test/suite/galera/r/MW-369A.result create mode 100644 mysql-test/suite/galera/r/MW-369B.result create mode 100644 mysql-test/suite/galera/t/MW-369.inc create mode 100644 mysql-test/suite/galera/t/MW-369A.test create mode 100644 mysql-test/suite/galera/t/MW-369B.test create mode 100644 mysql-test/suite/galera/t/MW-369C.test create mode 100644 mysql-test/suite/galera/t/MW-369D.test diff --git a/mysql-test/suite/galera/r/MW-369A.result b/mysql-test/suite/galera/r/MW-369A.result new file mode 100644 index 00000000000..9e8ed8fc100 --- /dev/null +++ b/mysql-test/suite/galera/r/MW-369A.result @@ -0,0 +1,30 @@ +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, +CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +SET AUTOCOMMIT=ON; +START TRANSACTION; +DELETE FROM p WHERE f1 = 1; +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +INSERT INTO c VALUES (1, 1); +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; +COMMIT; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT * FROM p; +f1 f2 +1 0 +2 0 +SELECT * FROM c; +f1 p_id +1 1 +DROP TABLE c; +DROP TABLE p; diff --git a/mysql-test/suite/galera/r/MW-369B.result b/mysql-test/suite/galera/r/MW-369B.result new file mode 100644 index 00000000000..b8916a5fc4e --- /dev/null +++ b/mysql-test/suite/galera/r/MW-369B.result @@ -0,0 +1,31 @@ +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, +f2 INTEGER, +CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +INSERT INTO c VALUES (1, 1, 0); +SET AUTOCOMMIT=ON; +START TRANSACTION; +UPDATE p SET f2 = 1 WHERE f1 = 1; +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +UPDATE c SET f2 = 1 WHERE f1 = 1; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; +COMMIT; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; +SELECT * FROM p; +f1 f2 +1 1 +2 0 +SELECT * FROM c; +f1 p_id f2 +1 1 1 +DROP TABLE c; +DROP TABLE p; diff --git a/mysql-test/suite/galera/t/MW-369.inc b/mysql-test/suite/galera/t/MW-369.inc new file mode 100644 index 00000000000..ed750de93e4 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-369.inc @@ -0,0 +1,67 @@ +# +# This file should be included from tests for MW-369 to run concurrent +# transaction from node_1 with autocommit query from node_2. +# +# The parameters: +# * $mw_369_parent_query - the parent query to be run inside transaction +# * $mw_369_child_query - the child query +# +# The operations are the following: +# +# node_1: +# START TRANSACTION; +# $mw_369_parent_query +# node_2 +# $mw_369_child_query - will be blocked on node_1 in apply monitor +# node_1: +# COMMIT; - will be blocked on node_1 in local monitor +# +# The $mw_369_child_query is always expected to succeed. The caller is +# responsible for checking if the final COMMIT on connection node_1 +# succeeds. +# + +--connection node_1 +SET AUTOCOMMIT=ON; +START TRANSACTION; + +--eval $mw_369_parent_query + +# +# Block the $mw_369_child_query from node_2 +# +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +SET SESSION wsrep_sync_wait = 0; +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +# +# insert client row, which will make it impossible to replay the +# delete on parent +# +--connection node_2 +--eval $mw_369_child_query + +# +# Wait until $mw_369_child_query from node_2 reaches the sync point and +# block the 'COMMIT' from node_1 before it certifies. +# +--connection node_1a +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc +--let $galera_sync_point = local_monitor_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_1 +--send COMMIT + +# +# Wait until both sync points have been reached +# +--connection node_1a +--let $galera_sync_point = apply_monitor_slave_enter_sync local_monitor_enter_sync +--source include/galera_wait_sync_point.inc +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc +--let $galera_sync_point = local_monitor_enter_sync +--source include/galera_signal_sync_point.inc diff --git a/mysql-test/suite/galera/t/MW-369A.test b/mysql-test/suite/galera/t/MW-369A.test new file mode 100644 index 00000000000..707d3df3b14 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-369A.test @@ -0,0 +1,50 @@ +# +# Test Outline: +# ============ +# +# This test tests the scenario for MW-369 where a new child table +# row referring to parent table row is inserted concurrently from +# another node while the transaction which tries to delete a +# referred row from the parent table is committing. +# +# The p table will originally have rows (1, 0), (2, 0). +# The c table will be empty. +# +# A new row (1, 1) pointing to parent row (1, 0) is inserted from +# connection node_2, the transaction which tries to remove the +# parent row (1, 0) is run from connection node_1. +# +# Expected outcome: +# ================ +# +# The transaction on node_1 will fail. The parent table will contain +# rows (1, 0), (2, 0) and the child table will contain row (1, 1). +# + +--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 + +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; + +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); + +--let $mw_369_parent_query = DELETE FROM p WHERE f1 = 1 +--let $mw_369_child_query = INSERT INTO c VALUES (1, 1) +--source MW-369.inc + +# Commit fails +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; diff --git a/mysql-test/suite/galera/t/MW-369B.test b/mysql-test/suite/galera/t/MW-369B.test new file mode 100644 index 00000000000..98de9aa9c43 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-369B.test @@ -0,0 +1,48 @@ +# +# Test Outline: +# ============ +# +# This test tests the scenario for MW-369 where a existing +# child table row is updated concurrently from another node +# with a transaction which updates the parent table. +# +# The p table will originally have rows (1, 0), (2, 0). +# The c table will originally have rows (1, 1, 0) which points +# to parent table row (1, 0). +# +# Expected outcome: +# ================ +# +# Both updates should succeed since they are done to separate tables and +# rows. The parent table will contain rows (1, 1), (2, 0). The child +# table will contain row (1, 1, 1). +# + +--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 + +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, + f2 INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; + +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +INSERT INTO c VALUES (1, 1, 0); + +--let mw_369_parent_query = UPDATE p SET f2 = 1 WHERE f1 = 1 +--let $mw_369_child_query = UPDATE c SET f2 = 1 WHERE f1 = 1 +--source MW-369.inc + +# Commit succeeds +--connection node_1 +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; diff --git a/mysql-test/suite/galera/t/MW-369C.test b/mysql-test/suite/galera/t/MW-369C.test new file mode 100644 index 00000000000..903eda6bf7d --- /dev/null +++ b/mysql-test/suite/galera/t/MW-369C.test @@ -0,0 +1,49 @@ +# +# Test Outline: +# ============ +# +# This test tests the scenario for MW-369 where a child table row is +# deleted concurrently from the other node while a transaction updates +# the parent table referred by the child table row. +# +# The p table will originally have rows (1, 0), (2, 0) +# The c table will originally have row (1, 1) which points to parent +# table row (1, 0). +# +# A row (1, 1) pointing to parent row (1, 0) is deleted from +# connection node_2, the transaction which tries to update the +# parent row (1, 0) is run from connection node_1. +# +# Expected Outcome: +# ================ +# Both operations on node_1 and node_2 should succeed without conflicts. +# The parent table should contain values (1, 1), (2, 0) and the child +# table should be empty. + +--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 + +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; + +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +INSERT INTO c VALUES (1, 1); + +--let $mw_369_parent_query = UPDATE p SET f2 = 1 WHERE f1 = 1 +--let $mw_369_child_query = DELETE FROM c WHERE f1 = 1 +--source MW-369.inc + +# Commit succeeds +--connection node_1 +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; diff --git a/mysql-test/suite/galera/t/MW-369D.test b/mysql-test/suite/galera/t/MW-369D.test new file mode 100644 index 00000000000..6b86da1da6a --- /dev/null +++ b/mysql-test/suite/galera/t/MW-369D.test @@ -0,0 +1,48 @@ +# +# Test Outline: +# ============ +# +# This test tests the scenario for MW-369 where a child table row is +# inserted concurrently from the other node while a transaction updates +# the parent table referred by the newly inserted child table row. +# +# The p table will originally have rows (1, 0), (2, 0). +# The c table will originally be empty. +# +# A row (1, 1) pointing to parent row (1, 0) is inserted from +# connection node_2, the transaction which tries to update the +# parent row (1, 0) is run from connection node_1. +# +# Expected Outcome: +# ================ +# Both operations on node_1 and node_2 should succeed without conflicts. +# The parent table should contain values (1, 1), (2, 0) and the child +# table should contain a row (1, 1) +# + +--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 + +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; + +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); + +--let $mw_369_parent_query = UPDATE p SET f2 = 1 WHERE f1 = 1 +--let $mw_369_child_query = INSERT INTO c VALUES (1, 1) +--source MW-369.inc + +# Commit succeeds +--connection node_1 +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; From 396770fb6772b8ad7d543ec23a5e414a11bc35ed Mon Sep 17 00:00:00 2001 From: sjaakola Date: Fri, 7 Apr 2017 00:18:30 +0300 Subject: [PATCH 34/54] Refs: MW-369 * changed parent row key type to S(hared), when FK child table is being updated or deleted --- storage/innobase/row/row0ins.cc | 15 ++++++++++----- storage/xtradb/row/row0ins.cc | 15 ++++++++++----- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/storage/innobase/row/row0ins.cc b/storage/innobase/row/row0ins.cc index b8a94af63ac..0c1755e538d 100644 --- a/storage/innobase/row/row0ins.cc +++ b/storage/innobase/row/row0ins.cc @@ -930,7 +930,7 @@ row_ins_invalidate_query_cache( mem_free(buf); } #ifdef WITH_WSREP -dberr_t wsrep_append_foreign_key(trx_t *trx, +dberr_t wsrep_append_foreign_key(trx_t *trx, dict_foreign_t* foreign, const rec_t* clust_rec, dict_index_t* clust_index, @@ -1294,7 +1294,8 @@ row_ins_foreign_check_on_constraint( foreign, clust_rec, clust_index, - FALSE, FALSE); + FALSE, + (node) ? TRUE : FALSE); if (err != DB_SUCCESS) { fprintf(stderr, "WSREP: foreign key append failed: %d\n", err); @@ -1455,6 +1456,9 @@ row_ins_check_foreign_constraint( ulint* offsets = offsets_; rec_offs_init(offsets_); +#ifdef WITH_WSREP + upd_node= NULL; +#endif /* WITH_WSREP */ run_again: #ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&dict_operation_lock, RW_LOCK_SHARED)); @@ -1638,9 +1642,10 @@ run_again: err = wsrep_append_foreign_key( thr_get_trx(thr), foreign, - rec, - check_index, - check_ref, FALSE); + rec, + check_index, + check_ref, + (upd_node) ? TRUE : FALSE); #endif /* WITH_WSREP */ goto end_scan; } else if (foreign->type != 0) { diff --git a/storage/xtradb/row/row0ins.cc b/storage/xtradb/row/row0ins.cc index ac59d78596b..ce7f7d7a94b 100644 --- a/storage/xtradb/row/row0ins.cc +++ b/storage/xtradb/row/row0ins.cc @@ -936,7 +936,7 @@ row_ins_invalidate_query_cache( mem_free(buf); } #ifdef WITH_WSREP -dberr_t wsrep_append_foreign_key(trx_t *trx, +dberr_t wsrep_append_foreign_key(trx_t *trx, dict_foreign_t* foreign, const rec_t* clust_rec, dict_index_t* clust_index, @@ -1300,7 +1300,8 @@ row_ins_foreign_check_on_constraint( foreign, clust_rec, clust_index, - FALSE, FALSE); + FALSE, + (node) ? TRUE : FALSE); if (err != DB_SUCCESS) { fprintf(stderr, "WSREP: foreign key append failed: %d\n", err); @@ -1461,6 +1462,9 @@ row_ins_check_foreign_constraint( ulint* offsets = offsets_; rec_offs_init(offsets_); +#ifdef WITH_WSREP + upd_node= NULL; +#endif /* WITH_WSREP */ run_again: #ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&dict_operation_lock, RW_LOCK_SHARED)); @@ -1650,9 +1654,10 @@ run_again: err = wsrep_append_foreign_key( thr_get_trx(thr), foreign, - rec, - check_index, - check_ref, FALSE); + rec, + check_index, + check_ref, + (upd_node) ? TRUE : FALSE); #endif /* WITH_WSREP */ goto end_scan; } else if (foreign->type != 0) { From 0d5c605b60f8fa6eea77c78ce02d7aec056f95d0 Mon Sep 17 00:00:00 2001 From: Teemu Ollakka Date: Mon, 10 Apr 2017 13:09:20 +0300 Subject: [PATCH 35/54] MW-369 Fixed test MW-369D, recorded MW-369C, MW-369D --- mysql-test/suite/galera/r/MW-369A.result | 1 + mysql-test/suite/galera/r/MW-369B.result | 1 + mysql-test/suite/galera/r/MW-369C.result | 30 +++++++++++++++++++++++ mysql-test/suite/galera/r/MW-369D.result | 31 ++++++++++++++++++++++++ mysql-test/suite/galera/t/MW-369.inc | 1 + mysql-test/suite/galera/t/MW-369C.test | 2 ++ mysql-test/suite/galera/t/MW-369D.test | 8 +++--- 7 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 mysql-test/suite/galera/r/MW-369C.result create mode 100644 mysql-test/suite/galera/r/MW-369D.result diff --git a/mysql-test/suite/galera/r/MW-369A.result b/mysql-test/suite/galera/r/MW-369A.result index 9e8ed8fc100..50215a1f2a8 100644 --- a/mysql-test/suite/galera/r/MW-369A.result +++ b/mysql-test/suite/galera/r/MW-369A.result @@ -16,6 +16,7 @@ SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; COMMIT; SET SESSION wsrep_on = 0; SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction diff --git a/mysql-test/suite/galera/r/MW-369B.result b/mysql-test/suite/galera/r/MW-369B.result index b8916a5fc4e..c368f00ec90 100644 --- a/mysql-test/suite/galera/r/MW-369B.result +++ b/mysql-test/suite/galera/r/MW-369B.result @@ -18,6 +18,7 @@ SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; COMMIT; SET SESSION wsrep_on = 0; SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; SELECT * FROM p; diff --git a/mysql-test/suite/galera/r/MW-369C.result b/mysql-test/suite/galera/r/MW-369C.result new file mode 100644 index 00000000000..56656ad75f0 --- /dev/null +++ b/mysql-test/suite/galera/r/MW-369C.result @@ -0,0 +1,30 @@ +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, +CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +INSERT INTO c VALUES (1, 1); +SET AUTOCOMMIT=ON; +START TRANSACTION; +UPDATE p SET f2 = 1 WHERE f1 = 1; +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +DELETE FROM c WHERE f1 = 1; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; +COMMIT; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; +SELECT * FROM p; +f1 f2 +1 1 +2 0 +SELECT * FROM c; +f1 p_id +DROP TABLE c; +DROP TABLE p; diff --git a/mysql-test/suite/galera/r/MW-369D.result b/mysql-test/suite/galera/r/MW-369D.result new file mode 100644 index 00000000000..2ab5b5ac262 --- /dev/null +++ b/mysql-test/suite/galera/r/MW-369D.result @@ -0,0 +1,31 @@ +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, +CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +SET AUTOCOMMIT=ON; +START TRANSACTION; +UPDATE p SET f2 = 1 WHERE f1 = 1; +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +INSERT INTO c VALUES (1, 1); +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; +COMMIT; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT * FROM p; +f1 f2 +1 0 +2 0 +SELECT * FROM c; +f1 p_id +1 1 +DROP TABLE c; +DROP TABLE p; diff --git a/mysql-test/suite/galera/t/MW-369.inc b/mysql-test/suite/galera/t/MW-369.inc index ed750de93e4..fdc26823cca 100644 --- a/mysql-test/suite/galera/t/MW-369.inc +++ b/mysql-test/suite/galera/t/MW-369.inc @@ -61,6 +61,7 @@ SET SESSION wsrep_sync_wait = 0; --connection node_1a --let $galera_sync_point = apply_monitor_slave_enter_sync local_monitor_enter_sync --source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc --let $galera_sync_point = apply_monitor_slave_enter_sync --source include/galera_signal_sync_point.inc --let $galera_sync_point = local_monitor_enter_sync diff --git a/mysql-test/suite/galera/t/MW-369C.test b/mysql-test/suite/galera/t/MW-369C.test index 903eda6bf7d..d4b1a08df84 100644 --- a/mysql-test/suite/galera/t/MW-369C.test +++ b/mysql-test/suite/galera/t/MW-369C.test @@ -16,9 +16,11 @@ # # Expected Outcome: # ================ +# # Both operations on node_1 and node_2 should succeed without conflicts. # The parent table should contain values (1, 1), (2, 0) and the child # table should be empty. +# --source include/galera_cluster.inc --source include/have_innodb.inc diff --git a/mysql-test/suite/galera/t/MW-369D.test b/mysql-test/suite/galera/t/MW-369D.test index 6b86da1da6a..db2bfcd09c0 100644 --- a/mysql-test/suite/galera/t/MW-369D.test +++ b/mysql-test/suite/galera/t/MW-369D.test @@ -15,9 +15,10 @@ # # Expected Outcome: # ================ -# Both operations on node_1 and node_2 should succeed without conflicts. -# The parent table should contain values (1, 1), (2, 0) and the child -# table should contain a row (1, 1) +# +# The parent operation on connection node_1 will conflict with an insert +# to node_2. The parent table will contain rows (1, 0), (2, 0) and +# the child table will contain row (1, 1). # --source include/galera_cluster.inc @@ -38,6 +39,7 @@ INSERT INTO p VALUES (2, 0); # Commit succeeds --connection node_1 +--error ER_LOCK_DEADLOCK --reap --connection node_2 From 7a1a5e473e5e53de3b45286c2684bdca6dae03fd Mon Sep 17 00:00:00 2001 From: sjaakola Date: Sat, 15 Apr 2017 02:20:36 +0300 Subject: [PATCH 36/54] Refs: MW-369 * fixed sync point usage in MW-369.inc, which made it impossible to run this test with --repeat option * moved all MW-369*.test tests into MW-369.test file, each as one separate test phase * added two more test phases, in MW-369.test file * tests MW-369A, MW-369B and MW-369C are obsolete after this commit --- mysql-test/suite/galera/r/MW-369.result | 155 ++++++++++++++ mysql-test/suite/galera/t/MW-369.inc | 11 +- mysql-test/suite/galera/t/MW-369.test | 262 +++++++++++++++++++----- 3 files changed, 377 insertions(+), 51 deletions(-) create mode 100644 mysql-test/suite/galera/r/MW-369.result diff --git a/mysql-test/suite/galera/r/MW-369.result b/mysql-test/suite/galera/r/MW-369.result new file mode 100644 index 00000000000..516904d1b2a --- /dev/null +++ b/mysql-test/suite/galera/r/MW-369.result @@ -0,0 +1,155 @@ +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, +CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +SET AUTOCOMMIT=ON; +START TRANSACTION; +DELETE FROM p WHERE f1 = 1; +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +INSERT INTO c VALUES (1, 1); +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; +COMMIT; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; +SET GLOBAL wsrep_provider_options = 'dbug='; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT * FROM p; +f1 f2 +1 0 +2 0 +SELECT * FROM c; +f1 p_id +1 1 +DROP TABLE c; +DROP TABLE p; +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, +f2 INTEGER, +CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +INSERT INTO c VALUES (1, 1, 0); +SET AUTOCOMMIT=ON; +START TRANSACTION; +UPDATE p SET f2 = 1 WHERE f1 = 1; +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +UPDATE c SET f2 = 1 WHERE f1 = 1; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; +COMMIT; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; +SET GLOBAL wsrep_provider_options = 'dbug='; +SELECT * FROM p; +f1 f2 +1 1 +2 0 +SELECT * FROM c; +f1 p_id f2 +1 1 1 +DROP TABLE c; +DROP TABLE p; +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, +CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +INSERT INTO c VALUES (1, 1); +SET AUTOCOMMIT=ON; +START TRANSACTION; +UPDATE p SET f2 = 1 WHERE f1 = 1; +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +DELETE FROM c WHERE f1 = 1; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; +COMMIT; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; +SET GLOBAL wsrep_provider_options = 'dbug='; +SELECT * FROM p; +f1 f2 +1 1 +2 0 +SELECT * FROM c; +f1 p_id +DROP TABLE c; +DROP TABLE p; +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER UNIQUE KEY) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, +CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f2)) ; +INSERT INTO p VALUES (1, 0); +SET AUTOCOMMIT=ON; +START TRANSACTION; +UPDATE p SET f2 = 1 WHERE f1 = 1; +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +INSERT INTO c VALUES (1, 0);; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; +COMMIT; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; +SET GLOBAL wsrep_provider_options = 'dbug='; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT * FROM p; +f1 f2 +1 0 +SELECT * FROM c; +f1 p_id +1 0 +DROP TABLE c; +DROP TABLE p; +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, f2 INTEGER, +CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1) +ON DELETE CASCADE) ; +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +INSERT INTO c VALUES (1, 1, 0); +SET AUTOCOMMIT=ON; +START TRANSACTION; +DELETE FROM p WHERE f1 = 1; +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +UPDATE c SET f2 = 1 WHERE f1 = 1; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; +COMMIT; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; +SET GLOBAL wsrep_provider_options = 'dbug='; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT * FROM p; +f1 f2 +1 0 +2 0 +SELECT * FROM c; +f1 p_id f2 +1 1 1 +DROP TABLE c; +DROP TABLE p; diff --git a/mysql-test/suite/galera/t/MW-369.inc b/mysql-test/suite/galera/t/MW-369.inc index fdc26823cca..5fd9ef150ae 100644 --- a/mysql-test/suite/galera/t/MW-369.inc +++ b/mysql-test/suite/galera/t/MW-369.inc @@ -30,7 +30,8 @@ START TRANSACTION; # # Block the $mw_369_child_query from node_2 # ---connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +# --connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a SET SESSION wsrep_sync_wait = 0; --let $galera_sync_point = apply_monitor_slave_enter_sync --source include/galera_set_sync_point.inc @@ -49,6 +50,7 @@ SET SESSION wsrep_sync_wait = 0; --connection node_1a --source include/galera_wait_sync_point.inc --source include/galera_clear_sync_point.inc + --let $galera_sync_point = local_monitor_enter_sync --source include/galera_set_sync_point.inc @@ -61,8 +63,13 @@ SET SESSION wsrep_sync_wait = 0; --connection node_1a --let $galera_sync_point = apply_monitor_slave_enter_sync local_monitor_enter_sync --source include/galera_wait_sync_point.inc ---source include/galera_clear_sync_point.inc + +# +# both threads are now parked in sync points, signal them to continue +# --let $galera_sync_point = apply_monitor_slave_enter_sync --source include/galera_signal_sync_point.inc + --let $galera_sync_point = local_monitor_enter_sync --source include/galera_signal_sync_point.inc +--source include/galera_clear_sync_point.inc diff --git a/mysql-test/suite/galera/t/MW-369.test b/mysql-test/suite/galera/t/MW-369.test index d27df96dadb..720d6daf518 100644 --- a/mysql-test/suite/galera/t/MW-369.test +++ b/mysql-test/suite/galera/t/MW-369.test @@ -1,8 +1,24 @@ # -# This test tests the operation of transaction replay for a transaction which operates on FK parent table. -# If a potentially conflicting remote transaction arrives at just the right time during the commit of a -# local transaction, the local transaction will be aborted and replayed. -# The replaying should be possible and honor the FK constraints. +# Test A Outline: +# =============== +# +# This test tests the scenario for MW-369 where a new child table +# row referring to parent table row is inserted concurrently from +# another node while the transaction which tries to delete a +# referred row from the parent table is committing. +# +# The p table will originally have rows (1, 0), (2, 0). +# The c table will be empty. +# +# A new row (1, 1) pointing to parent row (1, 0) is inserted from +# connection node_2, the transaction which tries to remove the +# parent row (1, 0) is run from connection node_1. +# +# Expected outcome: +# ================ +# +# The transaction on node_1 will fail. The parent table will contain +# rows (1, 0), (2, 0) and the child table will contain row (1, 1). # --source include/galera_cluster.inc @@ -10,8 +26,6 @@ --source include/have_debug_sync.inc --source suite/galera/include/galera_have_debug_sync.inc ---let $wsrep_local_replays_old = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` - CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; @@ -19,64 +33,214 @@ CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, INSERT INTO p VALUES (1, 0); INSERT INTO p VALUES (2, 0); ---connection node_1 -SET AUTOCOMMIT=ON; -START TRANSACTION; +--let $mw_369_parent_query = DELETE FROM p WHERE f1 = 1 +--let $mw_369_child_query = INSERT INTO c VALUES (1, 1) -DELETE FROM p WHERE f1 = 1; -SELECT * FROM p WHERE f1 = 2 FOR UPDATE; - -# Block the commit +# +# we must open connection node_1a here, MW-369.inc will use it later +# --connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 ---let $galera_sync_point = commit_monitor_enter_sync ---source include/galera_set_sync_point.inc +--source MW-369.inc + +# Commit fails +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; # -# insert client row, which will make it impossible to replay the delete on parent +# Test B Outline: +# =============== +# +# This test tests the scenario for MW-369 where a existing +# child table row is updated concurrently from another node +# with a transaction which updates the parent table. +# +# The p table will originally have rows (1, 0), (2, 0). +# The c table will originally have rows (1, 1, 0) which points +# to parent table row (1, 0). +# +# Expected outcome: +# ================ +# +# Both updates should succeed since they are done to separate tables and +# rows. The parent table will contain rows (1, 1), (2, 0). The child +# table will contain row (1, 1, 1). # ---connection node_2 -INSERT INTO c values (1,1); --connection node_1 ---send COMMIT; +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, + f2 INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; -# Wait until commit is blocked ---connection node_1a -SET SESSION wsrep_sync_wait = 0; ---source include/galera_wait_sync_point.inc +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +INSERT INTO c VALUES (1, 1, 0); -# -# send conflicting delete which will make node1 trx to abort and replay -# ---connection node_2 -DELETE FROM p 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 ---source include/galera_clear_sync_point.inc ---source include/galera_signal_sync_point.inc +--let mw_369_parent_query = UPDATE p SET f2 = 1 WHERE f1 = 1 +--let $mw_369_child_query = UPDATE c SET f2 = 1 WHERE f1 = 1 +--source MW-369.inc # Commit succeeds --connection node_1 --reap -# wsrep_local_replays has increased by 1 ---let $wsrep_local_replays_new = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` ---disable_query_log ---eval SELECT $wsrep_local_replays_new - $wsrep_local_replays_old = 1 AS wsrep_local_replays; ---enable_query_log - --connection node_2 -SELECT COUNT(*) = 2 FROM p; -SELECT COUNT(*) = 1 FROM c; +SELECT * FROM p; +SELECT * FROM c; DROP TABLE c; DROP TABLE p; + +# +# Test C Outline: +# =============== +# +# This test tests the scenario for MW-369 where a child table row is +# deleted concurrently from the other node while a transaction updates +# the parent table referred by the child table row. +# +# The p table will originally have rows (1, 0), (2, 0) +# The c table will originally have row (1, 1) which points to parent +# table row (1, 0). +# +# A row (1, 1) pointing to parent row (1, 0) is deleted from +# connection node_2, the transaction which tries to update the +# parent row (1, 0) is run from connection node_1. +# +# Expected Outcome: +# ================ +# Both operations on node_1 and node_2 should succeed without conflicts. +# The parent table should contain values (1, 1), (2, 0) and the child +# table should be empty. + +--connection node_1 +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; + +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +INSERT INTO c VALUES (1, 1); + +--let $mw_369_parent_query = UPDATE p SET f2 = 1 WHERE f1 = 1 +--let $mw_369_child_query = DELETE FROM c WHERE f1 = 1 +--source MW-369.inc + +# Commit succeeds +--connection node_1 +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; + + +# +# Test D Outline: +# =============== +# +# This test is similar to test A, where parent row is deleted while a child row +# is inserted simultaneously on node 2. However, in this test case the FK +# constraint's target column is a unique key, and parent row is not delete, +# but this key value is changed so that insert on node 2 will cause FK +# violation +# +# The p table will originally have rows (1, 0) +# The c table will originally be empty +# +# in node_1, parent row is updated to value (1,1) +# A row (1, 0) pointing to the old version of parent row (1, 0) is inserted +# in connection node_2 +# +# Expected Outcome: +# ================ +# This is a true conflict and one transaciton must abort. In this case it is node_1 +# transaction, which was scheduled later. +# Parent table should have row (1,0) +# child table should have row (1,0) +# + +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER UNIQUE KEY) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f2)) ; + +INSERT INTO p VALUES (1, 0); + +--let $mw_369_parent_query = UPDATE p SET f2 = 1 WHERE f1 = 1 +--let $mw_369_child_query = INSERT INTO c VALUES (1, 0); +--source MW-369.inc + +# Commit fails +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; + +# +# Test E Outline: +# =============== +# +# This test is similar to test B, where parent row is deleted while a child row +# is updated simultaneously on node 2. However, in this test case the FK +# constraint has ON DELETE CASCADE option, and the delete on parent row will +# cascade a delete on child row as well. This will cause true conflict with +# connection node_2, which tries to update unrelated column on child table. +# +# The p table will originally have rows (1, 0), (2,0) +# The c table will originally have row (1,1,0) +# +# in node_1, parent row (1,0) is deleted and cascaded delete will happen on +# child table row (1,1,0). +# in connection node_2 child table row is update to value (1,1,1) +# +# Expected Outcome: +# ================ +# This is a true conflict and one transaciton must abort. In this case it is node_1 +# transaction, which was scheduled later. +# Parent table should have rows (1,0), (2,0) +# child table should have row (1,1,1) +# + + +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, f2 INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1) + ON DELETE CASCADE) ; + +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +INSERT INTO c VALUES (1, 1, 0); + +--let $mw_369_parent_query = DELETE FROM p WHERE f1 = 1 +--let $mw_369_child_query = UPDATE c SET f2 = 1 WHERE f1 = 1 +--source MW-369.inc + +# Commit fails +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; + From d43a12bf2f3d1cda2abbf9e7dff788b266e6eac3 Mon Sep 17 00:00:00 2001 From: Teemu Ollakka Date: Mon, 8 May 2017 16:23:25 +0300 Subject: [PATCH 37/54] MW-369 Removing obsoleted tests --- mysql-test/suite/galera/r/MW-369A.result | 31 -------------- mysql-test/suite/galera/r/MW-369B.result | 32 --------------- mysql-test/suite/galera/r/MW-369C.result | 30 -------------- mysql-test/suite/galera/r/MW-369D.result | 31 -------------- mysql-test/suite/galera/t/MW-369A.test | 50 ----------------------- mysql-test/suite/galera/t/MW-369B.test | 48 ---------------------- mysql-test/suite/galera/t/MW-369C.test | 51 ------------------------ mysql-test/suite/galera/t/MW-369D.test | 50 ----------------------- 8 files changed, 323 deletions(-) delete mode 100644 mysql-test/suite/galera/r/MW-369A.result delete mode 100644 mysql-test/suite/galera/r/MW-369B.result delete mode 100644 mysql-test/suite/galera/r/MW-369C.result delete mode 100644 mysql-test/suite/galera/r/MW-369D.result delete mode 100644 mysql-test/suite/galera/t/MW-369A.test delete mode 100644 mysql-test/suite/galera/t/MW-369B.test delete mode 100644 mysql-test/suite/galera/t/MW-369C.test delete mode 100644 mysql-test/suite/galera/t/MW-369D.test diff --git a/mysql-test/suite/galera/r/MW-369A.result b/mysql-test/suite/galera/r/MW-369A.result deleted file mode 100644 index 50215a1f2a8..00000000000 --- a/mysql-test/suite/galera/r/MW-369A.result +++ /dev/null @@ -1,31 +0,0 @@ -CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; -CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, -CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; -INSERT INTO p VALUES (1, 0); -INSERT INTO p VALUES (2, 0); -SET AUTOCOMMIT=ON; -START TRANSACTION; -DELETE FROM p WHERE f1 = 1; -SET SESSION wsrep_sync_wait = 0; -SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; -INSERT INTO c VALUES (1, 1); -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; -COMMIT; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; -SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; -ERROR 40001: Deadlock found when trying to get lock; try restarting transaction -SELECT * FROM p; -f1 f2 -1 0 -2 0 -SELECT * FROM c; -f1 p_id -1 1 -DROP TABLE c; -DROP TABLE p; diff --git a/mysql-test/suite/galera/r/MW-369B.result b/mysql-test/suite/galera/r/MW-369B.result deleted file mode 100644 index c368f00ec90..00000000000 --- a/mysql-test/suite/galera/r/MW-369B.result +++ /dev/null @@ -1,32 +0,0 @@ -CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; -CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, -f2 INTEGER, -CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; -INSERT INTO p VALUES (1, 0); -INSERT INTO p VALUES (2, 0); -INSERT INTO c VALUES (1, 1, 0); -SET AUTOCOMMIT=ON; -START TRANSACTION; -UPDATE p SET f2 = 1 WHERE f1 = 1; -SET SESSION wsrep_sync_wait = 0; -SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; -UPDATE c SET f2 = 1 WHERE f1 = 1; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; -COMMIT; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; -SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; -SELECT * FROM p; -f1 f2 -1 1 -2 0 -SELECT * FROM c; -f1 p_id f2 -1 1 1 -DROP TABLE c; -DROP TABLE p; diff --git a/mysql-test/suite/galera/r/MW-369C.result b/mysql-test/suite/galera/r/MW-369C.result deleted file mode 100644 index 56656ad75f0..00000000000 --- a/mysql-test/suite/galera/r/MW-369C.result +++ /dev/null @@ -1,30 +0,0 @@ -CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; -CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, -CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; -INSERT INTO p VALUES (1, 0); -INSERT INTO p VALUES (2, 0); -INSERT INTO c VALUES (1, 1); -SET AUTOCOMMIT=ON; -START TRANSACTION; -UPDATE p SET f2 = 1 WHERE f1 = 1; -SET SESSION wsrep_sync_wait = 0; -SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; -DELETE FROM c WHERE f1 = 1; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; -COMMIT; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; -SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; -SELECT * FROM p; -f1 f2 -1 1 -2 0 -SELECT * FROM c; -f1 p_id -DROP TABLE c; -DROP TABLE p; diff --git a/mysql-test/suite/galera/r/MW-369D.result b/mysql-test/suite/galera/r/MW-369D.result deleted file mode 100644 index 2ab5b5ac262..00000000000 --- a/mysql-test/suite/galera/r/MW-369D.result +++ /dev/null @@ -1,31 +0,0 @@ -CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; -CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, -CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; -INSERT INTO p VALUES (1, 0); -INSERT INTO p VALUES (2, 0); -SET AUTOCOMMIT=ON; -START TRANSACTION; -UPDATE p SET f2 = 1 WHERE f1 = 1; -SET SESSION wsrep_sync_wait = 0; -SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; -INSERT INTO c VALUES (1, 1); -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; -COMMIT; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; -SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; -ERROR 40001: Deadlock found when trying to get lock; try restarting transaction -SELECT * FROM p; -f1 f2 -1 0 -2 0 -SELECT * FROM c; -f1 p_id -1 1 -DROP TABLE c; -DROP TABLE p; diff --git a/mysql-test/suite/galera/t/MW-369A.test b/mysql-test/suite/galera/t/MW-369A.test deleted file mode 100644 index 707d3df3b14..00000000000 --- a/mysql-test/suite/galera/t/MW-369A.test +++ /dev/null @@ -1,50 +0,0 @@ -# -# Test Outline: -# ============ -# -# This test tests the scenario for MW-369 where a new child table -# row referring to parent table row is inserted concurrently from -# another node while the transaction which tries to delete a -# referred row from the parent table is committing. -# -# The p table will originally have rows (1, 0), (2, 0). -# The c table will be empty. -# -# A new row (1, 1) pointing to parent row (1, 0) is inserted from -# connection node_2, the transaction which tries to remove the -# parent row (1, 0) is run from connection node_1. -# -# Expected outcome: -# ================ -# -# The transaction on node_1 will fail. The parent table will contain -# rows (1, 0), (2, 0) and the child table will contain row (1, 1). -# - ---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 - -CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; -CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, - CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; - -INSERT INTO p VALUES (1, 0); -INSERT INTO p VALUES (2, 0); - ---let $mw_369_parent_query = DELETE FROM p WHERE f1 = 1 ---let $mw_369_child_query = INSERT INTO c VALUES (1, 1) ---source MW-369.inc - -# Commit fails ---connection node_1 ---error ER_LOCK_DEADLOCK ---reap - ---connection node_2 -SELECT * FROM p; -SELECT * FROM c; - -DROP TABLE c; -DROP TABLE p; diff --git a/mysql-test/suite/galera/t/MW-369B.test b/mysql-test/suite/galera/t/MW-369B.test deleted file mode 100644 index 98de9aa9c43..00000000000 --- a/mysql-test/suite/galera/t/MW-369B.test +++ /dev/null @@ -1,48 +0,0 @@ -# -# Test Outline: -# ============ -# -# This test tests the scenario for MW-369 where a existing -# child table row is updated concurrently from another node -# with a transaction which updates the parent table. -# -# The p table will originally have rows (1, 0), (2, 0). -# The c table will originally have rows (1, 1, 0) which points -# to parent table row (1, 0). -# -# Expected outcome: -# ================ -# -# Both updates should succeed since they are done to separate tables and -# rows. The parent table will contain rows (1, 1), (2, 0). The child -# table will contain row (1, 1, 1). -# - ---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 - -CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; -CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, - f2 INTEGER, - CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; - -INSERT INTO p VALUES (1, 0); -INSERT INTO p VALUES (2, 0); -INSERT INTO c VALUES (1, 1, 0); - ---let mw_369_parent_query = UPDATE p SET f2 = 1 WHERE f1 = 1 ---let $mw_369_child_query = UPDATE c SET f2 = 1 WHERE f1 = 1 ---source MW-369.inc - -# Commit succeeds ---connection node_1 ---reap - ---connection node_2 -SELECT * FROM p; -SELECT * FROM c; - -DROP TABLE c; -DROP TABLE p; diff --git a/mysql-test/suite/galera/t/MW-369C.test b/mysql-test/suite/galera/t/MW-369C.test deleted file mode 100644 index d4b1a08df84..00000000000 --- a/mysql-test/suite/galera/t/MW-369C.test +++ /dev/null @@ -1,51 +0,0 @@ -# -# Test Outline: -# ============ -# -# This test tests the scenario for MW-369 where a child table row is -# deleted concurrently from the other node while a transaction updates -# the parent table referred by the child table row. -# -# The p table will originally have rows (1, 0), (2, 0) -# The c table will originally have row (1, 1) which points to parent -# table row (1, 0). -# -# A row (1, 1) pointing to parent row (1, 0) is deleted from -# connection node_2, the transaction which tries to update the -# parent row (1, 0) is run from connection node_1. -# -# Expected Outcome: -# ================ -# -# Both operations on node_1 and node_2 should succeed without conflicts. -# The parent table should contain values (1, 1), (2, 0) and the child -# table should be empty. -# - ---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 - -CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; -CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, - CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; - -INSERT INTO p VALUES (1, 0); -INSERT INTO p VALUES (2, 0); -INSERT INTO c VALUES (1, 1); - ---let $mw_369_parent_query = UPDATE p SET f2 = 1 WHERE f1 = 1 ---let $mw_369_child_query = DELETE FROM c WHERE f1 = 1 ---source MW-369.inc - -# Commit succeeds ---connection node_1 ---reap - ---connection node_2 -SELECT * FROM p; -SELECT * FROM c; - -DROP TABLE c; -DROP TABLE p; diff --git a/mysql-test/suite/galera/t/MW-369D.test b/mysql-test/suite/galera/t/MW-369D.test deleted file mode 100644 index db2bfcd09c0..00000000000 --- a/mysql-test/suite/galera/t/MW-369D.test +++ /dev/null @@ -1,50 +0,0 @@ -# -# Test Outline: -# ============ -# -# This test tests the scenario for MW-369 where a child table row is -# inserted concurrently from the other node while a transaction updates -# the parent table referred by the newly inserted child table row. -# -# The p table will originally have rows (1, 0), (2, 0). -# The c table will originally be empty. -# -# A row (1, 1) pointing to parent row (1, 0) is inserted from -# connection node_2, the transaction which tries to update the -# parent row (1, 0) is run from connection node_1. -# -# Expected Outcome: -# ================ -# -# The parent operation on connection node_1 will conflict with an insert -# to node_2. The parent table will contain rows (1, 0), (2, 0) and -# the child table will contain row (1, 1). -# - ---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 - -CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; -CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, - CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; - -INSERT INTO p VALUES (1, 0); -INSERT INTO p VALUES (2, 0); - ---let $mw_369_parent_query = UPDATE p SET f2 = 1 WHERE f1 = 1 ---let $mw_369_child_query = INSERT INTO c VALUES (1, 1) ---source MW-369.inc - -# Commit succeeds ---connection node_1 ---error ER_LOCK_DEADLOCK ---reap - ---connection node_2 -SELECT * FROM p; -SELECT * FROM c; - -DROP TABLE c; -DROP TABLE p; From f3c5928cffcde30d87579ad6ecc0c7d9db74ce09 Mon Sep 17 00:00:00 2001 From: sjaakola Date: Mon, 8 May 2017 23:03:01 +0300 Subject: [PATCH 38/54] MW-369 FK fixes Skipping wsrep extra FK checking for applier and replayer threads --- storage/innobase/row/row0upd.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/storage/innobase/row/row0upd.cc b/storage/innobase/row/row0upd.cc index 720a5c049b9..db844597fde 100644 --- a/storage/innobase/row/row0upd.cc +++ b/storage/innobase/row/row0upd.cc @@ -1979,7 +1979,9 @@ row_upd_sec_index_entry( index, offsets, thr, &mtr); } #ifdef WITH_WSREP - if (err == DB_SUCCESS && !referenced && + if (wsrep_on(trx->mysql_thd) && + !wsrep_thd_is_BF(trx->mysql_thd, FALSE) && + err == DB_SUCCESS && !referenced && !(parent && que_node_get_type(parent) == QUE_NODE_UPDATE && ((upd_node_t*)parent)->cascade_node == node) && From 318af3f3b8bb0a0cbf14e4d5cbf760b02dbd8881 Mon Sep 17 00:00:00 2001 From: sjaakola Date: Mon, 8 May 2017 23:03:01 +0300 Subject: [PATCH 39/54] MW-369 FK fixes Skipping wsrep extra FK checking for applier and replayer threads --- storage/innobase/row/row0upd.cc | 7 ++++--- storage/xtradb/row/row0upd.cc | 11 +++++++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/storage/innobase/row/row0upd.cc b/storage/innobase/row/row0upd.cc index db844597fde..7326074a57b 100644 --- a/storage/innobase/row/row0upd.cc +++ b/storage/innobase/row/row0upd.cc @@ -2267,7 +2267,7 @@ err_exit: } } #ifdef WITH_WSREP - if (!referenced && + if (wsrep_on(trx->mysql_thd) && !referenced && !(parent && que_node_get_type(parent) == QUE_NODE_UPDATE && ((upd_node_t*)parent)->cascade_node == node) && foreign @@ -2532,10 +2532,11 @@ row_upd_del_mark_clust_rec( node, pcur, index->table, index, offsets, thr, mtr); } #ifdef WITH_WSREP - if (err == DB_SUCCESS && !referenced && + trx_t* trx = thr_get_trx(thr) ; + + if (err == DB_SUCCESS && !referenced && trx && wsrep_on(trx->mysql_thd) && !(parent && que_node_get_type(parent) == QUE_NODE_UPDATE && ((upd_node_t*)parent)->cascade_node == node) && - thr_get_trx(thr) && foreign ) { err = wsrep_row_upd_check_foreign_constraints( diff --git a/storage/xtradb/row/row0upd.cc b/storage/xtradb/row/row0upd.cc index 3881fe410ec..74a1acfa5c9 100644 --- a/storage/xtradb/row/row0upd.cc +++ b/storage/xtradb/row/row0upd.cc @@ -1984,7 +1984,9 @@ row_upd_sec_index_entry( index, offsets, thr, &mtr); } #ifdef WITH_WSREP - if (err == DB_SUCCESS && !referenced && + if (wsrep_on(trx->mysql_thd) && + !wsrep_thd_is_BF(trx->mysql_thd, FALSE) && + err == DB_SUCCESS && !referenced && !(parent && que_node_get_type(parent) == QUE_NODE_UPDATE && ((upd_node_t*)parent)->cascade_node == node) && @@ -2273,7 +2275,7 @@ err_exit: } } #ifdef WITH_WSREP - if (!referenced && + if (wsrep_on(trx->mysql_thd) && !referenced && !(parent && que_node_get_type(parent) == QUE_NODE_UPDATE && ((upd_node_t*)parent)->cascade_node == node) && foreign @@ -2541,10 +2543,11 @@ row_upd_del_mark_clust_rec( node, pcur, index->table, index, offsets, thr, mtr); } #ifdef WITH_WSREP - if (err == DB_SUCCESS && !referenced && + trx_t* trx = thr_get_trx(thr) ; + + if (err == DB_SUCCESS && !referenced && trx && wsrep_on(trx->mysql_thd) && !(parent && que_node_get_type(parent) == QUE_NODE_UPDATE && ((upd_node_t*)parent)->cascade_node == node) && - thr_get_trx(thr) && foreign ) { err = wsrep_row_upd_check_foreign_constraints( From 7ee47ef456f5b462187e299b7d5af539e107a1e5 Mon Sep 17 00:00:00 2001 From: sjaakola Date: Wed, 10 May 2017 15:59:52 +0300 Subject: [PATCH 40/54] MW-378 enabling build with WITH_WSREP=OFF only one fix here, enables build of mysqld however, building embedded server fails in linking phase --- sql/handler.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sql/handler.cc b/sql/handler.cc index 19f648219ac..6072a828ab6 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -1690,6 +1690,11 @@ int ha_rollback_trans(THD *thd, bool all) { // cannot happen my_error(ER_ERROR_DURING_ROLLBACK, MYF(0), err); error=1; +#ifdef WITH_WSREP + WSREP_WARN("handlerton rollback failed, thd %lu %lld conf %d SQL %s", + thd->thread_id, thd->query_id, thd->wsrep_conflict_state, + thd->query()); +#endif /* WITH_WSREP */ } status_var_increment(thd->status_var.ha_rollback_count); ha_info_next= ha_info->next(); From 224ae5770f82a77274d2046477585ea5a6b8b960 Mon Sep 17 00:00:00 2001 From: sjaakola Date: Wed, 22 Feb 2017 10:57:39 +0200 Subject: [PATCH 41/54] Refs: MW-363 * enabling binlog file copying even for binlog files with basename "0" * mtr suite uses binlog files with names: 0.000001, 0.000002.. and so on --- sql/wsrep_sst.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sql/wsrep_sst.cc b/sql/wsrep_sst.cc index 331185e2cf3..818cb3f28fd 100644 --- a/sql/wsrep_sst.cc +++ b/sql/wsrep_sst.cc @@ -364,8 +364,7 @@ static int generate_binlog_opt_val(char** ret) if (opt_bin_log) { assert(opt_bin_logname); - *ret= strcmp(opt_bin_logname, "0") ? - my_strdup(opt_bin_logname, MYF(0)) : my_strdup("", MYF(0)); + *ret= my_strdup(opt_bin_logname, MYF(0)); } else { From dd72d66c452923fb171ab3fc36322589eae25e46 Mon Sep 17 00:00:00 2001 From: Teemu Ollakka Date: Mon, 24 Apr 2017 18:39:38 +0300 Subject: [PATCH 42/54] MW-373 Wait for wsrep_ready at startup when provider is loaded Conflicts: mysql-test/include/kill_and_restart_mysqld.inc --- mysql-test/include/restart_mysqld.inc | 3 +++ mysql-test/include/start_mysqld.inc | 3 +++ mysql-test/include/wait_wsrep_ready.inc | 15 +++++++++++++++ 3 files changed, 21 insertions(+) create mode 100644 mysql-test/include/wait_wsrep_ready.inc diff --git a/mysql-test/include/restart_mysqld.inc b/mysql-test/include/restart_mysqld.inc index dcaf47c55a2..c817694e57a 100644 --- a/mysql-test/include/restart_mysqld.inc +++ b/mysql-test/include/restart_mysqld.inc @@ -50,6 +50,9 @@ if (!$restart_parameters) # Call script that will poll the server waiting for it to be back online again --source include/wait_until_connected_again.inc +# Wait for wsrep +--source include/wait_wsrep_ready.inc + # Turn off reconnect again --disable_reconnect diff --git a/mysql-test/include/start_mysqld.inc b/mysql-test/include/start_mysqld.inc index e31f26aad8c..04dff714d49 100644 --- a/mysql-test/include/start_mysqld.inc +++ b/mysql-test/include/start_mysqld.inc @@ -16,6 +16,9 @@ if (!$restart_parameters) # Call script that will poll the server waiting for it to be back online again --source include/wait_until_connected_again.inc +# Wait for wsrep +--source include/wait_wsrep_ready.inc + # Turn off reconnect again --disable_reconnect diff --git a/mysql-test/include/wait_wsrep_ready.inc b/mysql-test/include/wait_wsrep_ready.inc new file mode 100644 index 00000000000..0e666afa33d --- /dev/null +++ b/mysql-test/include/wait_wsrep_ready.inc @@ -0,0 +1,15 @@ +# +# If the wsrep plugin is loaded, wait until the wsrep provider becomes +# ready for use. +# + +--disable_query_log +--disable_result_log + +if (`SELECT COUNT(*)=1 FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'wsrep' AND PLUGIN_STATUS='ACTIVE'`) +{ + --source include/galera_wait_ready.inc +} + +--enable_query_log +--enable_result_log From b5323054af2375cf5595c7d18fb2f22849f4e844 Mon Sep 17 00:00:00 2001 From: Teemu Ollakka Date: Wed, 24 May 2017 14:55:13 +0300 Subject: [PATCH 43/54] MW-383 Bumped wsrep patch version --- cmake/wsrep.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/wsrep.cmake b/cmake/wsrep.cmake index a8b1bea3bbb..1bd1ca51b35 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 "19") +SET(WSREP_PATCH_VERSION "20") # MariaDB addition: Revision number of the last revision merged from # codership branch visible in @@visible_comment. From 5017c261d4b6332ffff70919080a99fd5e459ed1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Tue, 15 Aug 2017 13:57:15 +0300 Subject: [PATCH 44/54] Fix test failure on test MW-86 and remove MW-360 test. Merged from mysql-wsrep-bugs following: GCF-1058 MTR test galera.MW-86 fails on repeated runs Wait for the sync point sync.wsrep_apply_cb to be reached before executing the test and clearing the debug flag sync.wsrep_apply_cb. The race scenario: Intended behavior: node2: set sync.wsrep_apply_cb in order to start waiting in the background INSERT node1: INSERT start node2 (background): INSERT start node1: INSERT end node2: send signal to background INSERT: "stop waiting and continue executing" node2: clear sync.wsrep_apply_cb as no longer needed node2 (background): consume the signal node2 (background): INSERT end node2: DROP TABLE node2: check no pending signals are left - ok What happens occasionally (unexpected): node2: set sync.wsrep_apply_cb in order to start waiting in the background INSERT node1: INSERT start node2 (background): INSERT start node1: INSERT end // The background INSERT still has _not_ reached the place where it starts // waiting for the signal: // DBUG_EXECUTE_IF("sync.wsrep_apply_cb", "now wait_for..."); node2: send signal to background INSERT: "stop waiting and continue executing" node2: clear sync.wsrep_apply_cb as no longer needed // The background INSERT reaches DBUG_EXECUTE_IF("sync.wsrep_apply_cb", ...) // but sync.wsrep_apply_cb has already been cleared and the "wait" code is not // executed. The signal remains unconsumed. node2 (background): INSERT end node2: DROP TABLE node2: check no pending signals are left - failure, signal.wsrep_apply_cb is pending (not consumed) Remove MW-360 test case as it is not intended for MariaDB (uses MySQL GTID). --- mysql-test/suite/galera/r/MW-360.result | 161 ------------------ mysql-test/suite/galera/r/MW-86-wait1.result | 48 ++++++ mysql-test/suite/galera/r/MW-86-wait8.result | 50 ++++++ mysql-test/suite/galera/r/MW-86.result | 65 ------- mysql-test/suite/galera/t/MW-360-master.opt | 2 - mysql-test/suite/galera/t/MW-360.test | 103 ----------- ...W-86-master.opt => MW-86-wait1-master.opt} | 0 mysql-test/suite/galera/t/MW-86-wait1.test | 106 ++++++++++++ .../suite/galera/t/MW-86-wait8-master.opt | 1 + .../galera/t/{MW-86.test => MW-86-wait8.test} | 125 ++++---------- sql/sql_class.cc | 6 - sql/sql_parse.cc | 4 +- sql/wsrep_applier.cc | 3 +- sql/wsrep_mysqld.cc | 2 - sql/wsrep_var.cc | 45 ++--- 15 files changed, 267 insertions(+), 454 deletions(-) delete mode 100644 mysql-test/suite/galera/r/MW-360.result create mode 100644 mysql-test/suite/galera/r/MW-86-wait1.result create mode 100644 mysql-test/suite/galera/r/MW-86-wait8.result delete mode 100644 mysql-test/suite/galera/r/MW-86.result delete mode 100644 mysql-test/suite/galera/t/MW-360-master.opt delete mode 100644 mysql-test/suite/galera/t/MW-360.test rename mysql-test/suite/galera/t/{MW-86-master.opt => MW-86-wait1-master.opt} (100%) create mode 100644 mysql-test/suite/galera/t/MW-86-wait1.test create mode 100644 mysql-test/suite/galera/t/MW-86-wait8-master.opt rename mysql-test/suite/galera/t/{MW-86.test => MW-86-wait8.test} (54%) diff --git a/mysql-test/suite/galera/r/MW-360.result b/mysql-test/suite/galera/r/MW-360.result deleted file mode 100644 index 4195b8f07bc..00000000000 --- a/mysql-test/suite/galera/r/MW-360.result +++ /dev/null @@ -1,161 +0,0 @@ -SET GLOBAL wsrep_on=OFF; -RESET MASTER; -SET GLOBAL wsrep_on=ON; -SET GLOBAL wsrep_on=OFF; -RESET MASTER; -SET GLOBAL wsrep_on=ON; -CREATE TEMPORARY TABLE t1 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t1 VALUES (1); -DROP TABLE t1; -CREATE TEMPORARY TABLE t1 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t1 VALUES (1); -CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t2 VALUES (2); -DROP TABLE t1, t2; -CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t1 VALUES (1); -CREATE TEMPORARY TABLE t2 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t2 VALUES (2); -DROP TABLE t1, t2; -CREATE TEMPORARY TABLE t1 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t1 VALUES (1); -CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t2 VALUES (2); -CREATE TEMPORARY TABLE t3 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t3 VALUES (3); -DROP TABLE t1, t2, t3; -CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t1 VALUES (1); -CREATE TEMPORARY TABLE t2 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t2 VALUES (2); -CREATE TABLE t3 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t3 VALUES (3); -DROP TABLE t1, t2, t3; -CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t1 VALUES (1); -CREATE TEMPORARY TABLE t1 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t1 VALUES (2); -DROP TABLE t1; -DROP TABLE t1; -SHOW BINLOG EVENTS IN 'mysqld-bin.000001' FROM 120; -Log_name Pos Event_type Server_id End_log_pos Info -mysqld-bin.000001 120 Previous_gtids 1 151 -mysqld-bin.000001 151 Gtid 1 199 SET @@SESSION.GTID_NEXT= ':1' -mysqld-bin.000001 199 Query 1 339 use `test`; DROP TEMPORARY TABLE IF EXISTS `t1` /* generated by server */ -mysqld-bin.000001 339 Gtid 1 387 SET @@SESSION.GTID_NEXT= ':1' -mysqld-bin.000001 387 Query 1 503 use `test`; CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB -mysqld-bin.000001 503 Gtid 1 551 SET @@SESSION.GTID_NEXT= ':2' -mysqld-bin.000001 551 Query 1 628 BEGIN -mysqld-bin.000001 628 Table_map 1 673 table_id: # (test.t2) -mysqld-bin.000001 673 Write_rows 1 713 table_id: # flags: STMT_END_F -mysqld-bin.000001 713 Xid 1 744 COMMIT /* xid=# */ -mysqld-bin.000001 744 Gtid 1 792 SET @@SESSION.GTID_NEXT= ':2' -mysqld-bin.000001 792 Query 1 927 use `test`; DROP TEMPORARY TABLE IF EXISTS `t1` /* generated by server */ -mysqld-bin.000001 927 Gtid 1 975 SET @@SESSION.GTID_NEXT= ':3' -mysqld-bin.000001 975 Query 1 1090 use `test`; DROP TABLE `t2` /* generated by server */ -mysqld-bin.000001 1090 Gtid 1 1138 SET @@SESSION.GTID_NEXT= ':4' -mysqld-bin.000001 1138 Query 1 1254 use `test`; CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB -mysqld-bin.000001 1254 Gtid 1 1302 SET @@SESSION.GTID_NEXT= ':5' -mysqld-bin.000001 1302 Query 1 1379 BEGIN -mysqld-bin.000001 1379 Table_map 1 1424 table_id: # (test.t1) -mysqld-bin.000001 1424 Write_rows 1 1464 table_id: # flags: STMT_END_F -mysqld-bin.000001 1464 Xid 1 1495 COMMIT /* xid=# */ -mysqld-bin.000001 1495 Gtid 1 1543 SET @@SESSION.GTID_NEXT= ':3' -mysqld-bin.000001 1543 Query 1 1678 use `test`; DROP TEMPORARY TABLE IF EXISTS `t2` /* generated by server */ -mysqld-bin.000001 1678 Gtid 1 1726 SET @@SESSION.GTID_NEXT= ':6' -mysqld-bin.000001 1726 Query 1 1841 use `test`; DROP TABLE `t1` /* generated by server */ -mysqld-bin.000001 1841 Gtid 1 1889 SET @@SESSION.GTID_NEXT= ':7' -mysqld-bin.000001 1889 Query 1 2005 use `test`; CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB -mysqld-bin.000001 2005 Gtid 1 2053 SET @@SESSION.GTID_NEXT= ':8' -mysqld-bin.000001 2053 Query 1 2130 BEGIN -mysqld-bin.000001 2130 Table_map 1 2175 table_id: # (test.t2) -mysqld-bin.000001 2175 Write_rows 1 2215 table_id: # flags: STMT_END_F -mysqld-bin.000001 2215 Xid 1 2246 COMMIT /* xid=# */ -mysqld-bin.000001 2246 Gtid 1 2294 SET @@SESSION.GTID_NEXT= ':4' -mysqld-bin.000001 2294 Query 1 2434 use `test`; DROP TEMPORARY TABLE IF EXISTS `t1`,`t3` /* generated by server */ -mysqld-bin.000001 2434 Gtid 1 2482 SET @@SESSION.GTID_NEXT= ':9' -mysqld-bin.000001 2482 Query 1 2597 use `test`; DROP TABLE `t2` /* generated by server */ -mysqld-bin.000001 2597 Gtid 1 2645 SET @@SESSION.GTID_NEXT= ':10' -mysqld-bin.000001 2645 Query 1 2761 use `test`; CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB -mysqld-bin.000001 2761 Gtid 1 2809 SET @@SESSION.GTID_NEXT= ':11' -mysqld-bin.000001 2809 Query 1 2886 BEGIN -mysqld-bin.000001 2886 Table_map 1 2931 table_id: # (test.t1) -mysqld-bin.000001 2931 Write_rows 1 2971 table_id: # flags: STMT_END_F -mysqld-bin.000001 2971 Xid 1 3002 COMMIT /* xid=# */ -mysqld-bin.000001 3002 Gtid 1 3050 SET @@SESSION.GTID_NEXT= ':12' -mysqld-bin.000001 3050 Query 1 3166 use `test`; CREATE TABLE t3 (f1 INTEGER) ENGINE=InnoDB -mysqld-bin.000001 3166 Gtid 1 3214 SET @@SESSION.GTID_NEXT= ':13' -mysqld-bin.000001 3214 Query 1 3291 BEGIN -mysqld-bin.000001 3291 Table_map 1 3336 table_id: # (test.t3) -mysqld-bin.000001 3336 Write_rows 1 3376 table_id: # flags: STMT_END_F -mysqld-bin.000001 3376 Xid 1 3407 COMMIT /* xid=# */ -mysqld-bin.000001 3407 Gtid 1 3455 SET @@SESSION.GTID_NEXT= ':5' -mysqld-bin.000001 3455 Query 1 3590 use `test`; DROP TEMPORARY TABLE IF EXISTS `t2` /* generated by server */ -mysqld-bin.000001 3590 Gtid 1 3638 SET @@SESSION.GTID_NEXT= ':14' -mysqld-bin.000001 3638 Query 1 3758 use `test`; DROP TABLE `t1`,`t3` /* generated by server */ -mysqld-bin.000001 3758 Gtid 1 3806 SET @@SESSION.GTID_NEXT= ':15' -mysqld-bin.000001 3806 Query 1 3922 use `test`; CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB -mysqld-bin.000001 3922 Gtid 1 3970 SET @@SESSION.GTID_NEXT= ':16' -mysqld-bin.000001 3970 Query 1 4047 BEGIN -mysqld-bin.000001 4047 Table_map 1 4092 table_id: # (test.t1) -mysqld-bin.000001 4092 Write_rows 1 4132 table_id: # flags: STMT_END_F -mysqld-bin.000001 4132 Xid 1 4163 COMMIT /* xid=# */ -mysqld-bin.000001 4163 Gtid 1 4211 SET @@SESSION.GTID_NEXT= ':6' -mysqld-bin.000001 4211 Query 1 4351 use `test`; DROP TEMPORARY TABLE IF EXISTS `t1` /* generated by server */ -mysqld-bin.000001 4351 Gtid 1 4399 SET @@SESSION.GTID_NEXT= ':17' -mysqld-bin.000001 4399 Query 1 4514 use `test`; DROP TABLE `t1` /* generated by server */ -SHOW BINLOG EVENTS IN 'mysqld-bin.000001' FROM 120; -Log_name Pos Event_type Server_id End_log_pos Info -mysqld-bin.000001 120 Previous_gtids 2 151 -mysqld-bin.000001 151 Gtid 1 199 SET @@SESSION.GTID_NEXT= ':1' -mysqld-bin.000001 199 Query 1 315 use `test`; CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB -mysqld-bin.000001 315 Gtid 1 363 SET @@SESSION.GTID_NEXT= ':2' -mysqld-bin.000001 363 Query 1 431 BEGIN -mysqld-bin.000001 431 Table_map 1 476 table_id: # (test.t2) -mysqld-bin.000001 476 Write_rows 1 516 table_id: # flags: STMT_END_F -mysqld-bin.000001 516 Xid 1 547 COMMIT /* xid=# */ -mysqld-bin.000001 547 Gtid 1 595 SET @@SESSION.GTID_NEXT= ':3' -mysqld-bin.000001 595 Query 1 710 use `test`; DROP TABLE `t2` /* generated by server */ -mysqld-bin.000001 710 Gtid 1 758 SET @@SESSION.GTID_NEXT= ':4' -mysqld-bin.000001 758 Query 1 874 use `test`; CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB -mysqld-bin.000001 874 Gtid 1 922 SET @@SESSION.GTID_NEXT= ':5' -mysqld-bin.000001 922 Query 1 990 BEGIN -mysqld-bin.000001 990 Table_map 1 1035 table_id: # (test.t1) -mysqld-bin.000001 1035 Write_rows 1 1075 table_id: # flags: STMT_END_F -mysqld-bin.000001 1075 Xid 1 1106 COMMIT /* xid=# */ -mysqld-bin.000001 1106 Gtid 1 1154 SET @@SESSION.GTID_NEXT= ':6' -mysqld-bin.000001 1154 Query 1 1269 use `test`; DROP TABLE `t1` /* generated by server */ -mysqld-bin.000001 1269 Gtid 1 1317 SET @@SESSION.GTID_NEXT= ':7' -mysqld-bin.000001 1317 Query 1 1433 use `test`; CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB -mysqld-bin.000001 1433 Gtid 1 1481 SET @@SESSION.GTID_NEXT= ':8' -mysqld-bin.000001 1481 Query 1 1549 BEGIN -mysqld-bin.000001 1549 Table_map 1 1594 table_id: # (test.t2) -mysqld-bin.000001 1594 Write_rows 1 1634 table_id: # flags: STMT_END_F -mysqld-bin.000001 1634 Xid 1 1665 COMMIT /* xid=# */ -mysqld-bin.000001 1665 Gtid 1 1713 SET @@SESSION.GTID_NEXT= ':9' -mysqld-bin.000001 1713 Query 1 1828 use `test`; DROP TABLE `t2` /* generated by server */ -mysqld-bin.000001 1828 Gtid 1 1876 SET @@SESSION.GTID_NEXT= ':10' -mysqld-bin.000001 1876 Query 1 1992 use `test`; CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB -mysqld-bin.000001 1992 Gtid 1 2040 SET @@SESSION.GTID_NEXT= ':11' -mysqld-bin.000001 2040 Query 1 2108 BEGIN -mysqld-bin.000001 2108 Table_map 1 2153 table_id: # (test.t1) -mysqld-bin.000001 2153 Write_rows 1 2193 table_id: # flags: STMT_END_F -mysqld-bin.000001 2193 Xid 1 2224 COMMIT /* xid=# */ -mysqld-bin.000001 2224 Gtid 1 2272 SET @@SESSION.GTID_NEXT= ':12' -mysqld-bin.000001 2272 Query 1 2388 use `test`; CREATE TABLE t3 (f1 INTEGER) ENGINE=InnoDB -mysqld-bin.000001 2388 Gtid 1 2436 SET @@SESSION.GTID_NEXT= ':13' -mysqld-bin.000001 2436 Query 1 2504 BEGIN -mysqld-bin.000001 2504 Table_map 1 2549 table_id: # (test.t3) -mysqld-bin.000001 2549 Write_rows 1 2589 table_id: # flags: STMT_END_F -mysqld-bin.000001 2589 Xid 1 2620 COMMIT /* xid=# */ -mysqld-bin.000001 2620 Gtid 1 2668 SET @@SESSION.GTID_NEXT= ':14' -mysqld-bin.000001 2668 Query 1 2788 use `test`; DROP TABLE `t1`,`t3` /* generated by server */ -mysqld-bin.000001 2788 Gtid 1 2836 SET @@SESSION.GTID_NEXT= ':15' -mysqld-bin.000001 2836 Query 1 2952 use `test`; CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB -mysqld-bin.000001 2952 Gtid 1 3000 SET @@SESSION.GTID_NEXT= ':16' -mysqld-bin.000001 3000 Query 1 3068 BEGIN -mysqld-bin.000001 3068 Table_map 1 3113 table_id: # (test.t1) -mysqld-bin.000001 3113 Write_rows 1 3153 table_id: # flags: STMT_END_F -mysqld-bin.000001 3153 Xid 1 3184 COMMIT /* xid=# */ -mysqld-bin.000001 3184 Gtid 1 3232 SET @@SESSION.GTID_NEXT= ':17' -mysqld-bin.000001 3232 Query 1 3347 use `test`; DROP TABLE `t1` /* generated by server */ diff --git a/mysql-test/suite/galera/r/MW-86-wait1.result b/mysql-test/suite/galera/r/MW-86-wait1.result new file mode 100644 index 00000000000..a38255eff8f --- /dev/null +++ b/mysql-test/suite/galera/r/MW-86-wait1.result @@ -0,0 +1,48 @@ +SELECT @@debug_sync; +@@debug_sync +ON - current signal: '' +SET SESSION wsrep_sync_wait = 1; +SET GLOBAL debug = "+d,sync.wsrep_apply_cb"; +Warnings: +Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead +CREATE TABLE t_wait1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t_wait1 VALUES (1); +SET SESSION debug_sync = "now WAIT_FOR sync.wsrep_apply_cb_reached"; +SHOW BINARY LOGS; +SHOW BINLOG EVENTS; +SHOW COLUMNS FROM t1; +SHOW CREATE EVENT e1; +SHOW CREATE FUNCTION f1; +SHOW CREATE PROCEDURE p1; +SHOW CREATE TABLE t1; +SHOW CREATE TRIGGER tr1; +SHOW CREATE VIEW v1; +SHOW DATABASES; +SHOW ENGINE InnoDB STATUS; +SHOW FUNCTION CODE f1; +SHOW FUNCTION STATUS; +SHOW GRANTS FOR 'root'@'localhost'; +SHOW INDEX FROM t1; +SHOW OPEN TABLES; +SHOW PROCEDURE CODE p1; +SHOW PROCEDURE STATUS; +SHOW PRIVILEGES; +SHOW STATUS LIKE 'wsrep_cluster_size'; +SHOW TABLE STATUS; +SHOW TABLES; +SHOW TRIGGERS; +SHOW GLOBAL VARIABLES LIKE 'foo_bar'; +SHOW WARNINGS; +SET GLOBAL debug = "-d,sync.wsrep_apply_cb"; +Warnings: +Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead +SET SESSION debug_sync = "now SIGNAL signal.wsrep_apply_cb"; +SET SESSION wsrep_sync_wait = default; +DROP TABLE t_wait1; +SET GLOBAL debug = NULL; +Warnings: +Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead +SET debug_sync='RESET'; +SELECT @@debug_sync; +@@debug_sync +ON - current signal: '' diff --git a/mysql-test/suite/galera/r/MW-86-wait8.result b/mysql-test/suite/galera/r/MW-86-wait8.result new file mode 100644 index 00000000000..04c93e9a9f2 --- /dev/null +++ b/mysql-test/suite/galera/r/MW-86-wait8.result @@ -0,0 +1,50 @@ +SELECT @@debug_sync; +@@debug_sync +ON - current signal: '' +SET SESSION wsrep_sync_wait = 8; +SET GLOBAL debug = "+d,sync.wsrep_apply_cb"; +Warnings: +Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead +CREATE TABLE t_wait8 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t_wait8 VALUES (1); +SET GLOBAL wsrep_provider_options = "repl.causal_read_timeout=PT0.1S"; +SET SESSION debug_sync = "now WAIT_FOR sync.wsrep_apply_cb_reached"; +SHOW BINARY LOGS; +SHOW BINLOG EVENTS; +SHOW COLUMNS FROM t1; +SHOW CREATE DATABASE db1; +SHOW CREATE EVENT e1; +SHOW CREATE FUNCTION f1; +SHOW CREATE PROCEDURE p1; +SHOW CREATE TABLE t1; +SHOW CREATE TRIGGER tr1; +SHOW CREATE VIEW v1; +SHOW DATABASES; +SHOW ENGINE InnoDB STATUS; +SHOW FUNCTION CODE f1; +SHOW FUNCTION STATUS; +SHOW GRANTS FOR 'root'@'localhost'; +SHOW INDEX FROM t1; +SHOW OPEN TABLES; +SHOW PROCEDURE CODE p1; +SHOW PROCEDURE STATUS; +SHOW PRIVILEGES; +SHOW STATUS LIKE 'wsrep_cluster_size'; +SHOW TABLE STATUS; +SHOW TABLES; +SHOW TRIGGERS; +SHOW GLOBAL VARIABLES LIKE 'foo_bar'; +SHOW WARNINGS; +SET GLOBAL debug = "-d,sync.wsrep_apply_cb"; +Warnings: +Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; +SET SESSION wsrep_sync_wait = default; +DROP TABLE t_wait8; +SET GLOBAL debug = NULL; +Warnings: +Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead +SET debug_sync='RESET'; +SELECT @@debug_sync; +@@debug_sync +ON - current signal: '' diff --git a/mysql-test/suite/galera/r/MW-86.result b/mysql-test/suite/galera/r/MW-86.result deleted file mode 100644 index b29175216a8..00000000000 --- a/mysql-test/suite/galera/r/MW-86.result +++ /dev/null @@ -1,65 +0,0 @@ -SET SESSION wsrep_sync_wait = 1; -SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; -CREATE DATABASE db1; -SHOW BINARY LOGS; -SHOW BINLOG EVENTS; -SHOW COLUMNS FROM t1; -SHOW CREATE DATABASE db1; -SHOW CREATE EVENT e1; -SHOW CREATE FUNCTION f1; -SHOW CREATE PROCEDURE p1; -SHOW CREATE TABLE t1; -SHOW CREATE TRIGGER tr1; -SHOW CREATE VIEW v1; -SHOW DATABASES; -SHOW ENGINE InnoDB STATUS; -SHOW FUNCTION CODE f1; -SHOW FUNCTION STATUS; -SHOW GRANTS FOR 'root'@'localhost'; -SHOW INDEX FROM t1; -SHOW OPEN TABLES; -SHOW PROCEDURE CODE p1; -SHOW PROCEDURE STATUS; -SHOW PRIVILEGES; -SHOW STATUS LIKE 'wsrep_cluster_size'; -SHOW TABLE STATUS; -SHOW TABLES; -SHOW TRIGGERS; -SHOW GLOBAL VARIABLES LIKE 'foo_bar'; -SHOW WARNINGS; -SET GLOBAL DEBUG = ""; -SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; -SET SESSION wsrep_sync_wait = 8; -DROP DATABASE db1; -SET GLOBAL wsrep_provider_options = "repl.causal_read_timeout=PT0.1S"; -SET SESSION wsrep_sync_wait = 8; -SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; -CREATE TABLE q (f1 INTEGER) ENGINE=InnoDB; -SHOW BINARY LOGS; -SHOW BINLOG EVENTS; -SHOW COLUMNS FROM t1; -SHOW CREATE DATABASE db1; -SHOW CREATE EVENT e1; -SHOW CREATE FUNCTION f1; -SHOW CREATE PROCEDURE p1; -SHOW CREATE TABLE t1; -SHOW CREATE TRIGGER tr1; -SHOW CREATE VIEW v1; -SHOW DATABASES; -SHOW ENGINE InnoDB STATUS; -SHOW FUNCTION CODE f1; -SHOW FUNCTION STATUS; -SHOW GRANTS FOR 'root'@'localhost'; -SHOW INDEX FROM t1; -SHOW OPEN TABLES; -SHOW PROCEDURE CODE p1; -SHOW PROCEDURE STATUS; -SHOW PRIVILEGES; -SHOW STATUS LIKE 'wsrep_cluster_size'; -SHOW TABLE STATUS; -SHOW TABLES; -SHOW TRIGGERS; -SHOW GLOBAL VARIABLES LIKE 'foo_bar'; -SHOW WARNINGS; -SET GLOBAL DEBUG = ""; -SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; diff --git a/mysql-test/suite/galera/t/MW-360-master.opt b/mysql-test/suite/galera/t/MW-360-master.opt deleted file mode 100644 index 6cfaed135e4..00000000000 --- a/mysql-test/suite/galera/t/MW-360-master.opt +++ /dev/null @@ -1,2 +0,0 @@ ---gtid-mode=ON --log-bin --log-slave-updates --enforce-gtid-consistency - diff --git a/mysql-test/suite/galera/t/MW-360.test b/mysql-test/suite/galera/t/MW-360.test deleted file mode 100644 index 7ea743cdb3d..00000000000 --- a/mysql-test/suite/galera/t/MW-360.test +++ /dev/null @@ -1,103 +0,0 @@ -# -# MW-360 DROP TABLE containing temporary tables results in binlog divergence -# - ---source include/galera_cluster.inc ---source include/have_binlog_format_row.inc - ---connection node_1 -SET GLOBAL wsrep_on=OFF; -RESET MASTER; -SET GLOBAL wsrep_on=ON; - ---connection node_2 -SET GLOBAL wsrep_on=OFF; -RESET MASTER; -SET GLOBAL wsrep_on=ON; - ---connection node_1 - -# -# Straightforward temporary table -# - -CREATE TEMPORARY TABLE t1 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t1 VALUES (1); -DROP TABLE t1; ---let $local_uuid = `SELECT LEFT(@@global.gtid_executed, 36)` - -# -# A mix of normal and temporary tables -# - -# Temp table first, normal table second - -CREATE TEMPORARY TABLE t1 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t1 VALUES (1); - -CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t2 VALUES (2); - -DROP TABLE t1, t2; - -# Normal table first, temporary table second - -CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t1 VALUES (1); - -CREATE TEMPORARY TABLE t2 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t2 VALUES (2); - -DROP TABLE t1, t2; - -# Temporary table first, normal table second, temp table third - -CREATE TEMPORARY TABLE t1 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t1 VALUES (1); - -CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t2 VALUES (2); - -CREATE TEMPORARY TABLE t3 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t3 VALUES (3); - -DROP TABLE t1, t2, t3; - -# Normal table first, temporary table second, normal table third - -CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t1 VALUES (1); - -CREATE TEMPORARY TABLE t2 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t2 VALUES (2); - -CREATE TABLE t3 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t3 VALUES (3); - -DROP TABLE t1, t2, t3; - -# -# A temporary table masking a normal one -# - -CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t1 VALUES (1); - -CREATE TEMPORARY TABLE t1 (f1 INTEGER) ENGINE=InnoDB; -INSERT INTO t1 VALUES (2); - -DROP TABLE t1; -DROP TABLE t1; - ---connection node_2 ---let $cluster_uuid = `SELECT LEFT(@@global.gtid_executed, 36)` - ---connection node_1 ---replace_regex /table_id: [0-9]+/table_id: #/ /xid=[0-9]+/xid=#/ ---replace_result $local_uuid $cluster_uuid -SHOW BINLOG EVENTS IN 'mysqld-bin.000001' FROM 120; - ---connection node_2 ---replace_regex /table_id: [0-9]+/table_id: #/ /xid=[0-9]+/xid=#/ ---replace_result $local_uuid $cluster_uuid -SHOW BINLOG EVENTS IN 'mysqld-bin.000001' FROM 120; diff --git a/mysql-test/suite/galera/t/MW-86-master.opt b/mysql-test/suite/galera/t/MW-86-wait1-master.opt similarity index 100% rename from mysql-test/suite/galera/t/MW-86-master.opt rename to mysql-test/suite/galera/t/MW-86-wait1-master.opt diff --git a/mysql-test/suite/galera/t/MW-86-wait1.test b/mysql-test/suite/galera/t/MW-86-wait1.test new file mode 100644 index 00000000000..6c0982ad8b3 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-86-wait1.test @@ -0,0 +1,106 @@ +# +# SHOW commands no longer obey wsrep_sync_wait = 1 (WSREP_SYNC_WAIT_BEFORE_READ) +# (they do not wait for the background INSERT in the applier in node_2 to +# complete) +# +--source include/galera_cluster.inc +--source include/have_binlog_format_row.inc +--source include/have_debug_sync.inc + +--connection node_2 +# Make sure no signals have been leftover from previous tests to surprise us. +SELECT @@debug_sync; + +SET SESSION wsrep_sync_wait = 1; +SET GLOBAL debug = "+d,sync.wsrep_apply_cb"; + +--connection node_1 +CREATE TABLE t_wait1 (f1 INTEGER) ENGINE=InnoDB; +# This will complete in node_1 but will start a background apply in node_2 +# which will stop because of sync.wsrep_apply_cb we set above. +INSERT INTO t_wait1 VALUES (1); + +--connection node_2 + +SET SESSION debug_sync = "now WAIT_FOR sync.wsrep_apply_cb_reached"; + +--disable_result_log + +SHOW BINARY LOGS; + +SHOW BINLOG EVENTS; + +--error ER_NO_SUCH_TABLE +SHOW COLUMNS FROM t1; + +--error ER_EVENT_DOES_NOT_EXIST +SHOW CREATE EVENT e1; + +--error ER_SP_DOES_NOT_EXIST +SHOW CREATE FUNCTION f1; + +--error ER_SP_DOES_NOT_EXIST +SHOW CREATE PROCEDURE p1; + +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t1; + +--error ER_TRG_DOES_NOT_EXIST +SHOW CREATE TRIGGER tr1; + +--error ER_NO_SUCH_TABLE +SHOW CREATE VIEW v1; + +SHOW DATABASES; + +SHOW ENGINE InnoDB STATUS; + +--error ER_SP_DOES_NOT_EXIST +SHOW FUNCTION CODE f1; + +SHOW FUNCTION STATUS; + +SHOW GRANTS FOR 'root'@'localhost'; + +--error ER_NO_SUCH_TABLE +SHOW INDEX FROM t1; + +SHOW OPEN TABLES; + +--error ER_SP_DOES_NOT_EXIST +SHOW PROCEDURE CODE p1; + +SHOW PROCEDURE STATUS; + +SHOW PRIVILEGES; + +SHOW STATUS LIKE 'wsrep_cluster_size'; + +SHOW TABLE STATUS; + +SHOW TABLES; + +SHOW TRIGGERS; + +SHOW GLOBAL VARIABLES LIKE 'foo_bar'; + +--error 0 +SHOW WARNINGS; + +--enable_result_log + +# Unblock the background INSERT and remove the sync point. +SET GLOBAL debug = "-d,sync.wsrep_apply_cb"; +SET SESSION debug_sync = "now SIGNAL signal.wsrep_apply_cb"; + +SET SESSION wsrep_sync_wait = default; + +# This will wait for the background INSERT to complete before we quit +# from the test. +DROP TABLE t_wait1; + +SET GLOBAL debug = NULL; +SET debug_sync='RESET'; + +# Make sure no pending signals are leftover to surprise subsequent tests. +SELECT @@debug_sync; diff --git a/mysql-test/suite/galera/t/MW-86-wait8-master.opt b/mysql-test/suite/galera/t/MW-86-wait8-master.opt new file mode 100644 index 00000000000..8a755e98b00 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-86-wait8-master.opt @@ -0,0 +1 @@ +--log-bin --log-slave-updates diff --git a/mysql-test/suite/galera/t/MW-86.test b/mysql-test/suite/galera/t/MW-86-wait8.test similarity index 54% rename from mysql-test/suite/galera/t/MW-86.test rename to mysql-test/suite/galera/t/MW-86-wait8.test index c6550ecdaaa..65e612c5c8e 100644 --- a/mysql-test/suite/galera/t/MW-86.test +++ b/mysql-test/suite/galera/t/MW-86-wait8.test @@ -1,104 +1,32 @@ +# +# SHOW commands now obey wsrep_sync_wait = 8 (WSREP_SYNC_WAIT_BEFORE_SHOW) +# --source include/galera_cluster.inc --source include/have_binlog_format_row.inc - -# -# Test 1: SHOW commands no longer obey wsrep_sync_wait = 1 -# +--source include/have_debug_sync.inc --connection node_2 -SET SESSION wsrep_sync_wait = 1; -SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; ---disable_result_log - ---connection node_1 -CREATE DATABASE db1; - ---connection node_2 -SHOW BINARY LOGS; - -SHOW BINLOG EVENTS; - ---error ER_NO_SUCH_TABLE -SHOW COLUMNS FROM t1; - ---error ER_BAD_DB_ERROR -SHOW CREATE DATABASE db1; - ---error ER_EVENT_DOES_NOT_EXIST -SHOW CREATE EVENT e1; - ---error ER_SP_DOES_NOT_EXIST -SHOW CREATE FUNCTION f1; - ---error ER_SP_DOES_NOT_EXIST -SHOW CREATE PROCEDURE p1; - ---error ER_NO_SUCH_TABLE -SHOW CREATE TABLE t1; - ---error ER_TRG_DOES_NOT_EXIST -SHOW CREATE TRIGGER tr1; - ---error ER_NO_SUCH_TABLE -SHOW CREATE VIEW v1; - -SHOW DATABASES; - -SHOW ENGINE InnoDB STATUS; - ---error ER_SP_DOES_NOT_EXIST -SHOW FUNCTION CODE f1; - -SHOW FUNCTION STATUS; - -SHOW GRANTS FOR 'root'@'localhost'; - ---error ER_NO_SUCH_TABLE -SHOW INDEX FROM t1; - -SHOW OPEN TABLES; - ---error ER_SP_DOES_NOT_EXIST -SHOW PROCEDURE CODE p1; - -SHOW PROCEDURE STATUS; - -SHOW PRIVILEGES; - -SHOW STATUS LIKE 'wsrep_cluster_size'; - -SHOW TABLE STATUS; - -SHOW TABLES; - -SHOW TRIGGERS; - -SHOW GLOBAL VARIABLES LIKE 'foo_bar'; - ---error 0 -SHOW WARNINGS; - -SET GLOBAL DEBUG = ""; -SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; +# Make sure no signals have been leftover from previous tests to surprise us. +SELECT @@debug_sync; SET SESSION wsrep_sync_wait = 8; -DROP DATABASE db1; +SET GLOBAL debug = "+d,sync.wsrep_apply_cb"; - -# -# Test 2: SHOW commands now obey wsrep_sync_wait = 8 -# +--connection node_1 +CREATE TABLE t_wait8 (f1 INTEGER) ENGINE=InnoDB; +# This will complete in node_1 but will start a background apply in node_2 +# which will stop because of sync.wsrep_apply_cb we set above. +INSERT INTO t_wait8 VALUES (1); --connection node_2 + --let $wsrep_provider_options_orig = `SELECT @@wsrep_provider_options` SET GLOBAL wsrep_provider_options = "repl.causal_read_timeout=PT0.1S"; -SET SESSION wsrep_sync_wait = 8; -SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb"; ---connection node_1 -CREATE TABLE q (f1 INTEGER) ENGINE=InnoDB; +SET SESSION debug_sync = "now WAIT_FOR sync.wsrep_apply_cb_reached"; + +--disable_result_log ---connection node_2 --error ER_LOCK_WAIT_TIMEOUT SHOW BINARY LOGS; @@ -177,11 +105,24 @@ SHOW GLOBAL VARIABLES LIKE 'foo_bar'; --error 0 SHOW WARNINGS; -SET GLOBAL DEBUG = ""; -SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; +--enable_result_log --disable_query_log --eval SET GLOBAL wsrep_provider_options = "$wsrep_provider_options_orig" +--enable_query_log -SET SESSION wsrep_sync_wait = 15; -DROP TABLE q; +# Unblock the background INSERT and remove the sync point. +SET GLOBAL debug = "-d,sync.wsrep_apply_cb"; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; + +SET SESSION wsrep_sync_wait = default; + +# This will wait for the background INSERT to complete before we quit +# from the test. +DROP TABLE t_wait8; + +SET GLOBAL debug = NULL; +SET debug_sync='RESET'; + +# Make sure no pending signals are leftover to surprise subsequent tests. +SELECT @@debug_sync; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 5964f4475a4..83cdaadb3b9 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -1635,12 +1635,6 @@ void THD::init(void) wsrep_affected_rows = 0; wsrep_replicate_GTID = false; wsrep_skip_wsrep_GTID = false; - /* - @@wsrep_causal_reads is now being handled via wsrep_sync_wait, update it - appropriately. - */ - if (variables.wsrep_causal_reads) - variables.wsrep_sync_wait|= WSREP_SYNC_WAIT_BEFORE_READ; #endif /* WITH_WSREP */ if (variables.sql_log_bin) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index c487835c84e..e561aa521e2 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2756,6 +2756,7 @@ mysql_execute_command(THD *thd) #endif case SQLCOM_SHOW_STATUS: { + WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); execute_show_status(thd, all_tables); break; } @@ -5808,11 +5809,10 @@ static bool execute_show_status(THD *thd, TABLE_LIST *all_tables) bool res; system_status_var old_status_var= thd->status_var; thd->initial_status_var= &old_status_var; - WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); if (!(res= check_table_access(thd, SELECT_ACL, all_tables, FALSE, UINT_MAX, FALSE))) res= execute_sqlcom_select(thd, all_tables); -error: + /* Don't log SHOW STATUS commands to slow query log */ thd->server_status&= ~(SERVER_QUERY_NO_INDEX_USED | SERVER_QUERY_NO_GOOD_INDEX_USED); diff --git a/sql/wsrep_applier.cc b/sql/wsrep_applier.cc index 49087d09224..db92878dbe5 100644 --- a/sql/wsrep_applier.cc +++ b/sql/wsrep_applier.cc @@ -224,7 +224,8 @@ wsrep_cb_status_t wsrep_apply_cb(void* const ctx, { const char act[]= "now " - "wait_for signal.wsrep_apply_cb"; + "SIGNAL sync.wsrep_apply_cb_reached " + "WAIT_FOR signal.wsrep_apply_cb"; DBUG_ASSERT(!debug_sync_set_action(thd, STRING_WITH_LEN(act))); };); diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index 6e847a33dfb..49988287933 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -809,8 +809,6 @@ bool wsrep_must_sync_wait (THD* thd, uint mask) { return (thd->variables.wsrep_sync_wait & mask) && thd->variables.wsrep_on && - !(thd->variables.wsrep_dirty_reads && - !is_update_query(thd->lex->sql_command)) && !thd->in_active_multi_stmt_transaction() && thd->wsrep_conflict_state != REPLAYING && thd->wsrep_sync_wait_gtid.seqno == WSREP_SEQNO_UNDEFINED; diff --git a/sql/wsrep_var.cc b/sql/wsrep_var.cc index 9a5c7b86068..20091a3893e 100644 --- a/sql/wsrep_var.cc +++ b/sql/wsrep_var.cc @@ -64,19 +64,21 @@ bool wsrep_on_update (sys_var *self, THD* thd, enum_var_type var_type) bool wsrep_causal_reads_update (sys_var *self, THD* thd, enum_var_type var_type) { - // wsrep_sync_wait should also be updated. - if (var_type == OPT_GLOBAL) { - if (global_system_variables.wsrep_causal_reads) { - global_system_variables.wsrep_sync_wait |= WSREP_SYNC_WAIT_BEFORE_READ; - } else { - global_system_variables.wsrep_sync_wait &= ~WSREP_SYNC_WAIT_BEFORE_READ; - } + // global setting should not affect session setting. + // if (var_type == OPT_GLOBAL) { + // thd->variables.wsrep_causal_reads = global_system_variables.wsrep_causal_reads; + // } + if (thd->variables.wsrep_causal_reads) { + thd->variables.wsrep_sync_wait |= WSREP_SYNC_WAIT_BEFORE_READ; } else { - if (thd->variables.wsrep_causal_reads) { - thd->variables.wsrep_sync_wait |= WSREP_SYNC_WAIT_BEFORE_READ; - } else { - thd->variables.wsrep_sync_wait &= ~WSREP_SYNC_WAIT_BEFORE_READ; - } + thd->variables.wsrep_sync_wait &= ~WSREP_SYNC_WAIT_BEFORE_READ; + } + + // update global settings too. + if (global_system_variables.wsrep_causal_reads) { + global_system_variables.wsrep_sync_wait |= WSREP_SYNC_WAIT_BEFORE_READ; + } else { + global_system_variables.wsrep_sync_wait &= ~WSREP_SYNC_WAIT_BEFORE_READ; } return false; @@ -84,14 +86,17 @@ bool wsrep_causal_reads_update (sys_var *self, THD* thd, enum_var_type var_type) bool wsrep_sync_wait_update (sys_var* self, THD* thd, enum_var_type var_type) { - // wsrep_causal_reads should also be updated. - if (var_type == OPT_GLOBAL) { - global_system_variables.wsrep_causal_reads= - global_system_variables.wsrep_sync_wait & WSREP_SYNC_WAIT_BEFORE_READ; - } else { - thd->variables.wsrep_causal_reads= - thd->variables.wsrep_sync_wait & WSREP_SYNC_WAIT_BEFORE_READ; - } + // global setting should not affect session setting. + // if (var_type == OPT_GLOBAL) { + // thd->variables.wsrep_sync_wait = global_system_variables.wsrep_sync_wait; + // } + thd->variables.wsrep_causal_reads = thd->variables.wsrep_sync_wait & + WSREP_SYNC_WAIT_BEFORE_READ; + + // update global settings too + global_system_variables.wsrep_causal_reads = global_system_variables.wsrep_sync_wait & + WSREP_SYNC_WAIT_BEFORE_READ; + return false; } From 81fd8ff6761109546f14cc8f8a5dfb27b0da8a2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Wed, 16 Aug 2017 07:49:19 +0300 Subject: [PATCH 45/54] Fix test failures. --- mysql-test/suite/galera/r/GAL-401.result | 1 + .../galera/r/galera_suspend_slave.result | 3 + .../galera/r/galera_var_dirty_reads.result | 80 ++++-------------- mysql-test/suite/galera/t/GAL-401.test | 1 + .../suite/galera/t/galera_suspend_slave.test | 3 + .../galera/t/galera_var_dirty_reads.test | 82 ++++--------------- .../sys_vars/r/wsrep_sync_wait_basic.result | 4 +- 7 files changed, 39 insertions(+), 135 deletions(-) diff --git a/mysql-test/suite/galera/r/GAL-401.result b/mysql-test/suite/galera/r/GAL-401.result index fbdb2d39a28..03509cb0e29 100644 --- a/mysql-test/suite/galera/r/GAL-401.result +++ b/mysql-test/suite/galera/r/GAL-401.result @@ -1,6 +1,7 @@ SET GLOBAL wsrep_provider_options = 'pc.ignore_sb=true'; SET @@global.wsrep_desync = 1; SET SESSION wsrep_dirty_reads=1; +SET SESSION wsrep_sync_wait=0; SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)); SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0'; diff --git a/mysql-test/suite/galera/r/galera_suspend_slave.result b/mysql-test/suite/galera/r/galera_suspend_slave.result index 02904812dd5..357a0d4f78e 100644 --- a/mysql-test/suite/galera/r/galera_suspend_slave.result +++ b/mysql-test/suite/galera/r/galera_suspend_slave.result @@ -3,8 +3,11 @@ Suspending node_2 ... INSERT INTO t1 VALUES (1); Got one of the listed errors Resuming node_2 ... +SET SESSION wsrep_sync_wait = 1; INSERT INTO t1 VALUES (1); +SET SESSION wsrep_sync_wait = 1; SELECT COUNT(*) = 1 FROM t1; COUNT(*) = 1 1 +SET SESSION wsrep_sync_wait = 15; DROP TABLE t1; diff --git a/mysql-test/suite/galera/r/galera_var_dirty_reads.result b/mysql-test/suite/galera/r/galera_var_dirty_reads.result index 8a3175912c7..405d86b3027 100644 --- a/mysql-test/suite/galera/r/galera_var_dirty_reads.result +++ b/mysql-test/suite/galera/r/galera_var_dirty_reads.result @@ -3,10 +3,6 @@ INSERT INTO t1 VALUES(1); SELECT * FROM t1; i 1 -create user user1; -grant all privileges on *.* to user1; -create user user2; -grant all privileges on *.* to user2; SET @@global.wsrep_cluster_address = ''; SET @@session.wsrep_dirty_reads=OFF; SET SESSION wsrep_sync_wait=0; @@ -18,78 +14,32 @@ Variable_name Value wsrep_cluster_status non-Primary SELECT * FROM t1; ERROR 08S01: WSREP has not yet prepared node for application use +SELECT 1 FROM t1; +ERROR 08S01: WSREP has not yet prepared node for application use SET @@session.wsrep_dirty_reads=ON; SELECT * FROM t1; i 1 -connect con1, localhost, user1,,test,$NODE_MYPORT_2,$NODE_MYSOCK_2; -SET SESSION wsrep_sync_wait=0; -set session wsrep_dirty_reads=1; -prepare stmt_show from 'select 1'; -prepare stmt_select from 'select * from t1'; -prepare stmt_insert from 'insert into t1 values(1)'; -set session wsrep_dirty_reads=0; -execute stmt_show; +SELECT 1 FROM t1; +1 +1 +SELECT i, variable_name, variable_value FROM t1, information_schema.session_variables WHERE variable_name LIKE "wsrep_dirty_reads" AND i = 1; +i variable_name variable_value +1 WSREP_DIRTY_READS ON +SET @@session.wsrep_dirty_reads=OFF; +SELECT i, variable_name, variable_value FROM t1, information_schema.session_variables WHERE variable_name LIKE "wsrep_dirty_reads" AND i = 1; ERROR 08S01: WSREP has not yet prepared node for application use -execute stmt_select; +SELECT 1; ERROR 08S01: WSREP has not yet prepared node for application use -execute stmt_insert; +USE information_schema; ERROR 08S01: WSREP has not yet prepared node for application use -SET wsrep_dirty_reads=ON; -select @@session.wsrep_dirty_reads; -@@session.wsrep_dirty_reads -1 -execute stmt_show; -1 -1 -execute stmt_select; -i -1 -execute stmt_insert; +SELECT * FROM information_schema.session_variables WHERE variable_name LIKE "wsrep_dirty_reads"; ERROR 08S01: WSREP has not yet prepared node for application use -SET @@global.wsrep_dirty_reads=ON; -connect con2, localhost, user2,,test,$NODE_MYPORT_2,$NODE_MYSOCK_2; -select @@session.wsrep_dirty_reads; -@@session.wsrep_dirty_reads -1 -prepare stmt_show from 'select 1'; -prepare stmt_select from 'select * from t1'; -prepare stmt_insert from 'insert into t1 values(1)'; -execute stmt_show; -1 -1 -execute stmt_select; -i -1 -execute stmt_insert; +SELECT COUNT(*) >= 10 FROM performance_schema.events_statements_history; ERROR 08S01: WSREP has not yet prepared node for application use -SET SESSION wsrep_sync_wait=1; -execute stmt_show; -1 -1 -execute stmt_select; -i -1 -execute stmt_insert; -ERROR 08S01: WSREP has not yet prepared node for application use -SET SESSION wsrep_sync_wait=7; -execute stmt_show; -1 -1 -execute stmt_select; -i -1 -execute stmt_insert; -ERROR 08S01: WSREP has not yet prepared node for application use -connection node_2; -SET @@global.wsrep_dirty_reads=OFF; -connection node_1; +USE test; SELECT * FROM t1; i 1 DROP TABLE t1; -drop user user1; -drop user user2; -disconnect node_2; -disconnect node_1; # End of test diff --git a/mysql-test/suite/galera/t/GAL-401.test b/mysql-test/suite/galera/t/GAL-401.test index 25ab9502bec..06ce37dc81f 100644 --- a/mysql-test/suite/galera/t/GAL-401.test +++ b/mysql-test/suite/galera/t/GAL-401.test @@ -10,6 +10,7 @@ SET GLOBAL wsrep_provider_options = 'pc.ignore_sb=true'; --connection node_2 SET @@global.wsrep_desync = 1; SET SESSION wsrep_dirty_reads=1; +SET SESSION wsrep_sync_wait=0; SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; --let $wait_condition = SELECT VARIABLE_VALUE = 'non-Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; --source include/wait_condition.inc diff --git a/mysql-test/suite/galera/t/galera_suspend_slave.test b/mysql-test/suite/galera/t/galera_suspend_slave.test index 5c622085804..fd8bc362d02 100644 --- a/mysql-test/suite/galera/t/galera_suspend_slave.test +++ b/mysql-test/suite/galera/t/galera_suspend_slave.test @@ -41,6 +41,7 @@ INSERT INTO t1 VALUES (1); exit(0); EOF +SET SESSION wsrep_sync_wait = 1; --sleep 10 --source include/wait_until_ready.inc INSERT INTO t1 VALUES (1); @@ -50,9 +51,11 @@ INSERT INTO t1 VALUES (1); --source include/galera_connect.inc --connection node_2a +SET SESSION wsrep_sync_wait = 1; --source include/wait_until_ready.inc SELECT COUNT(*) = 1 FROM t1; +SET SESSION wsrep_sync_wait = 15; DROP TABLE t1; # Restore original auto_increment_offset values. diff --git a/mysql-test/suite/galera/t/galera_var_dirty_reads.test b/mysql-test/suite/galera/t/galera_var_dirty_reads.test index bcdb1574a3d..183c60753ad 100644 --- a/mysql-test/suite/galera/t/galera_var_dirty_reads.test +++ b/mysql-test/suite/galera/t/galera_var_dirty_reads.test @@ -5,11 +5,6 @@ --source include/galera_cluster.inc --source include/have_innodb.inc -# Save original auto_increment_offset values. ---let $node_1=node_1 ---let $node_2=node_2 ---source include/auto_increment_offset_save.inc - --connection node_2 --let $wsrep_cluster_address_saved = `SELECT @@global.wsrep_cluster_address` @@ -17,15 +12,10 @@ CREATE TABLE t1(i INT) ENGINE=INNODB; INSERT INTO t1 VALUES(1); SELECT * FROM t1; -create user user1; -grant all privileges on *.* to user1; -create user user2; -grant all privileges on *.* to user2; - SET @@global.wsrep_cluster_address = ''; SET @@session.wsrep_dirty_reads=OFF; -# Set wsrep_sync_wait to avoid ER_LOCK_WAIT_TIMEOUT (MDEV-6832). +# Set wsrep_sync_wait to avoid ER_LOCK_WAIT_TIMEOUT. SET SESSION wsrep_sync_wait=0; # Must return 'OFF' @@ -37,70 +27,32 @@ SHOW STATUS LIKE 'wsrep_cluster_status'; --error ER_UNKNOWN_COM_ERROR SELECT * FROM t1; +--error ER_UNKNOWN_COM_ERROR +SELECT 1 FROM t1; + SET @@session.wsrep_dirty_reads=ON; SELECT * FROM t1; +SELECT 1 FROM t1; ---enable_connect_log ---connect (con1, localhost, user1,,test,$NODE_MYPORT_2,$NODE_MYSOCK_2) -#Just test the session behavior -SET SESSION wsrep_sync_wait=0; +SELECT i, variable_name, variable_value FROM t1, information_schema.session_variables WHERE variable_name LIKE "wsrep_dirty_reads" AND i = 1; -set session wsrep_dirty_reads=1; -#Prepared statement creation should be allowed MDEV-11479 -prepare stmt_show from 'select 1'; -prepare stmt_select from 'select * from t1'; -prepare stmt_insert from 'insert into t1 values(1)'; -set session wsrep_dirty_reads=0; +SET @@session.wsrep_dirty_reads=OFF; -#No Preapare stmt/proceure will be allowed --error ER_UNKNOWN_COM_ERROR -execute stmt_show; +SELECT i, variable_name, variable_value FROM t1, information_schema.session_variables WHERE variable_name LIKE "wsrep_dirty_reads" AND i = 1; + --error ER_UNKNOWN_COM_ERROR -execute stmt_select; +SELECT 1; + --error ER_UNKNOWN_COM_ERROR -execute stmt_insert; +USE information_schema; -SET wsrep_dirty_reads=ON; -select @@session.wsrep_dirty_reads; -#Only prepare statement which does not change data should be allowed -execute stmt_show; -execute stmt_select; --error ER_UNKNOWN_COM_ERROR -execute stmt_insert; -SET @@global.wsrep_dirty_reads=ON; +SELECT * FROM information_schema.session_variables WHERE variable_name LIKE "wsrep_dirty_reads"; ---connect (con2, localhost, user2,,test,$NODE_MYPORT_2,$NODE_MYSOCK_2) -#Just test the session behavior -select @@session.wsrep_dirty_reads; - -prepare stmt_show from 'select 1'; -prepare stmt_select from 'select * from t1'; -prepare stmt_insert from 'insert into t1 values(1)'; - -#Only prepare statement which does not change data should be allowed -execute stmt_show; -execute stmt_select; --error ER_UNKNOWN_COM_ERROR -execute stmt_insert; - -#wsrep_dirty_read should work when wsrep_sync_wait is 1 or non zero -#because we already are disconnected , So It does not make any sense -#to wait for other nodes -SET SESSION wsrep_sync_wait=1; -execute stmt_show; -execute stmt_select; ---error ER_UNKNOWN_COM_ERROR -execute stmt_insert; - -SET SESSION wsrep_sync_wait=7; -execute stmt_show; -execute stmt_select; ---error ER_UNKNOWN_COM_ERROR -execute stmt_insert; - ---connection node_2 -SET @@global.wsrep_dirty_reads=OFF; +SELECT COUNT(*) >= 10 FROM performance_schema.events_statements_history; --disable_query_log --eval SET @@global.wsrep_cluster_address = '$wsrep_cluster_address_saved' @@ -108,14 +60,10 @@ SET @@global.wsrep_dirty_reads=OFF; --source include/wait_until_connected_again.inc --connection node_1 +USE test; SELECT * FROM t1; # Cleanup DROP TABLE t1; -drop user user1; -drop user user2; - -# Restore original auto_increment_offset values. ---source include/auto_increment_offset_restore.inc --source include/galera_end.inc --echo # End of test diff --git a/mysql-test/suite/sys_vars/r/wsrep_sync_wait_basic.result b/mysql-test/suite/sys_vars/r/wsrep_sync_wait_basic.result index 1e7b9364570..0df3dff8990 100644 --- a/mysql-test/suite/sys_vars/r/wsrep_sync_wait_basic.result +++ b/mysql-test/suite/sys_vars/r/wsrep_sync_wait_basic.result @@ -34,11 +34,9 @@ SELECT @@session.wsrep_sync_wait; @@session.wsrep_sync_wait 7 SET @@session.wsrep_sync_wait=8; -Warnings: -Warning 1292 Truncated incorrect wsrep_sync_wait value: '8' SELECT @@session.wsrep_sync_wait; @@session.wsrep_sync_wait -7 +8 # invalid values SET @@global.wsrep_sync_wait=NULL; From 7ce37d97574963a852e398142eb4b5090740f1f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Wed, 16 Aug 2017 10:14:19 +0300 Subject: [PATCH 46/54] Move galera_ist_progress and galera_ist_restart_joiner tests under big_test. This is because they could cause out of storage if run on /dev/shm. --- mysql-test/suite/galera/t/galera_ist_progress.test | 2 ++ mysql-test/suite/galera/t/galera_ist_restart_joiner.test | 2 ++ 2 files changed, 4 insertions(+) diff --git a/mysql-test/suite/galera/t/galera_ist_progress.test b/mysql-test/suite/galera/t/galera_ist_progress.test index a4d331b37d7..3ba63415c28 100644 --- a/mysql-test/suite/galera/t/galera_ist_progress.test +++ b/mysql-test/suite/galera/t/galera_ist_progress.test @@ -3,6 +3,8 @@ # --source include/galera_cluster.inc +# This could cause out of storage if run /dev/shm +--source include/big_test.inc # Isolate node #2 --connection node_2 diff --git a/mysql-test/suite/galera/t/galera_ist_restart_joiner.test b/mysql-test/suite/galera/t/galera_ist_restart_joiner.test index e007e71f1ee..633318629a6 100644 --- a/mysql-test/suite/galera/t/galera_ist_restart_joiner.test +++ b/mysql-test/suite/galera/t/galera_ist_restart_joiner.test @@ -8,6 +8,8 @@ --source include/have_innodb.inc --source include/have_debug_sync.inc --source suite/galera/include/galera_have_debug_sync.inc +# This could cause out of storage if run /dev/shm +--source include/big_test.inc # Save original auto_increment_offset values. --let $node_1=node_1 From 0a479f786020d3c1431a25523661759748404770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Wed, 16 Aug 2017 13:10:01 +0300 Subject: [PATCH 47/54] More test failure fixes. --- mysql-test/suite/galera/disabled.def | 1 + mysql-test/suite/galera/r/galera_var_node_address.result | 1 + mysql-test/suite/galera/r/pxc-421.result | 3 +++ mysql-test/suite/galera/t/galera_var_node_address.test | 2 ++ mysql-test/suite/galera/t/pxc-421.test | 5 +++++ 5 files changed, 12 insertions(+) diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index 59f1ec37986..84d2b1c54bf 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -44,3 +44,4 @@ galera.galera_wan : MDEV-12319 #Failed to start mysqld galera.rpl_row_annotate : MDEV-12319 #Failed to start mysqld galera.MW-44 : MDEV-12319 galera.galera_var_slave_threads : MDEV-12319 +MW-336: MDEV-13549 Galera test failures diff --git a/mysql-test/suite/galera/r/galera_var_node_address.result b/mysql-test/suite/galera/r/galera_var_node_address.result index b562883176a..cf36e964f93 100644 --- a/mysql-test/suite/galera/r/galera_var_node_address.result +++ b/mysql-test/suite/galera/r/galera_var_node_address.result @@ -1,4 +1,5 @@ call mtr.add_suppression("WSREP: Stray state UUID msg: .* current group state WAIT_STATE_UUID .*"); +call mtr.add_suppression("WSREP: Protocol violation. JOIN message sender .* is not in state transfer (.*). Message ignored."); SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; VARIABLE_VALUE = 4 1 diff --git a/mysql-test/suite/galera/r/pxc-421.result b/mysql-test/suite/galera/r/pxc-421.result index 1822201f338..f5c0fabcd6e 100644 --- a/mysql-test/suite/galera/r/pxc-421.result +++ b/mysql-test/suite/galera/r/pxc-421.result @@ -6,6 +6,7 @@ set GLOBAL wsrep_slave_threads=16; SET GLOBAL wsrep_provider='none'; INSERT INTO t1 VALUES (2); INSERT INTO t1 VALUES (3); +set SESSION wsrep_sync_wait=0; INSERT INTO t1 VALUES (4); set GLOBAL wsrep_slave_threads=5; SELECT COUNT(*) = 5 FROM t1; @@ -25,6 +26,7 @@ SET GLOBAL wsrep_slave_threads = 1; SELECT COUNT(*) FROM t1; COUNT(*) 16 +SET GLOBAL auto_increment_offset = 2; SELECT COUNT(*) FROM t1; COUNT(*) 15 @@ -33,3 +35,4 @@ Variable_name Value wsrep_slave_threads 12 SET GLOBAL wsrep_slave_threads = 1; DROP TABLE t1; +SET GLOBAL auto_increment_offset = 1; diff --git a/mysql-test/suite/galera/t/galera_var_node_address.test b/mysql-test/suite/galera/t/galera_var_node_address.test index c2105823326..3353652d8b9 100644 --- a/mysql-test/suite/galera/t/galera_var_node_address.test +++ b/mysql-test/suite/galera/t/galera_var_node_address.test @@ -7,6 +7,8 @@ --source include/have_innodb.inc call mtr.add_suppression("WSREP: Stray state UUID msg: .* current group state WAIT_STATE_UUID .*"); +call mtr.add_suppression("WSREP: Protocol violation. JOIN message sender .* is not in state transfer (.*). Message ignored."); + SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; --connection node_1 diff --git a/mysql-test/suite/galera/t/pxc-421.test b/mysql-test/suite/galera/t/pxc-421.test index 8a360b12f4c..381f9bb4494 100644 --- a/mysql-test/suite/galera/t/pxc-421.test +++ b/mysql-test/suite/galera/t/pxc-421.test @@ -31,6 +31,7 @@ INSERT INTO t1 VALUES (3); --eval SET GLOBAL wsrep_cluster_address = '$wsrep_cluster_address_orig'; --enable_query_log +set SESSION wsrep_sync_wait=0; --source include/wait_until_connected_again.inc --source include/galera_wait_ready.inc @@ -53,8 +54,12 @@ show global variables like 'wsrep_slave_threads'; --eval SET GLOBAL wsrep_slave_threads = $wsrep_slave_2 SELECT COUNT(*) FROM t1; +SET GLOBAL auto_increment_offset = 2; + --connection node_1 SELECT COUNT(*) FROM t1; show global variables like 'wsrep_slave_threads'; --eval SET GLOBAL wsrep_slave_threads = $wsrep_slave_1 DROP TABLE t1; + +SET GLOBAL auto_increment_offset = 1; From f7e1b99895d2f23164a995c89b4b9e9c9a9c5a52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Wed, 16 Aug 2017 13:29:38 +0300 Subject: [PATCH 48/54] Galera test fixes and add remaining test failures as disabled. --- mysql-test/suite/galera/disabled.def | 90 +++++++++---------- mysql-test/suite/galera/r/galera#414.result | 2 + .../galera/r/galera_var_dirty_reads.result | 2 + .../r/galera_wsrep_provider_unset_set.result | 1 + mysql-test/suite/galera/suite.pm | 6 ++ mysql-test/suite/galera/t/galera#414.test | 6 ++ .../suite/galera/t/galera_ist_mysqldump.cnf | 1 + .../suite/galera/t/galera_ist_recv_bind.test | 1 + .../suite/galera/t/galera_ist_rsync.cnf | 2 + .../suite/galera/t/galera_ist_rsync.test | 5 ++ .../t/galera_restart_on_unknown_option.test | 7 ++ mysql-test/suite/galera/t/galera_ssl.test | 1 + .../galera/t/galera_ssl_compression.test | 1 + .../galera/t/galera_var_dirty_reads.test | 4 + .../t/galera_wsrep_provider_unset_set.test | 9 ++ mysql-test/suite/galera_3nodes/disabled.def | 7 +- mysql-test/suite/wsrep/disabled.def | 2 +- 17 files changed, 93 insertions(+), 54 deletions(-) diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index 84d2b1c54bf..22fb3c4f12d 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -1,47 +1,43 @@ -galera_wsrep_provider_unset_set : lp1379204 'Unsupported protocol downgrade: incremental data collection disabled. Expect abort.' -galera_kill_nochanges : mysql-wsrep#24 Galera server does not restart properly if killed -galera_bf_abort_for_update : mysql-wsrep#26 SELECT FOR UPDATE sometimes allowed to proceed in the face of a concurrent update -galera_toi_ddl_fk_insert : qa#39 galera_toi_ddl_fk_insert fails sporadically -galera_binlog_row_image : MDEV-7471 - Enable binlog_row_image parameter in MariaDB -galera_binlog_rows_query_log_events : Unknown system variable 'binlog_rows_query_log_events' (see annotate_rows_log_event) - -galera_ist_mysqldump : Lost connection to MySQL server during query -galera_ist_xtrabackup-v2 : mysqltest failed but provided no output -galera_ist_innodb_flush_logs : mysqltest failed but provided no output -galera_sst_mysqldump : query 'show status' failed with wrong errno 1927 -galera_as_master_gtid : Needs to be re-worked -galera_as_master_gtid_change_master : Needs to be re-worked -galera_migrate : query 'let $success= `$wait_condition`' failed: 1146 -galera_var_notify_cmd : Result content mismatch -query_cache : Fails intermittently due to content mismatch. Needs to be investigated -basic : Fails intermittently without providing any output. Needs to be investigated -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_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 -galera_gcs_fragment : Incorrect arguments to SET -galera_flush_local : Fails sporadically -galera_binlog_stmt_autoinc : TODO: investigate -galera_concurrent_ctas : Test times out, investigate -galera_sst_xtrabackup-v2-options : TODO: Fix test case -mysql-wsrep#33 : TODO: investigate -GAL-480 : Investigate -galera_fk_no_pk :Investigate -galera_account_management : Investigate -galera.galera_var_retry_autocommit : MDEV-12319 #Sparodic Faliure -galera.galera_toi_ddl_nonconflicting : MDEV-12319 #Sparodic Faliure -galera.galera_pc_ignore_sb : MDEV-12319 #Sparodic Faliure -galera.galera_ist_recv_bind : MDEV-12319 #Failed to start mysqld -galera.galera_ssl_compression : MDEV-12319 #Failed to start mysqld -galera.galera_wan : MDEV-12319 #Failed to start mysqld -galera.rpl_row_annotate : MDEV-12319 #Failed to start mysqld -galera.MW-44 : MDEV-12319 -galera.galera_var_slave_threads : MDEV-12319 -MW-336: MDEV-13549 Galera test failures +############################################################################## +# +# List the test cases that are to be disabled temporarily. +# +# Separate the test case name and the comment with ':'. +# +# : MDEV- +# +# Do not use any TAB characters for whitespace. +# +############################################################################## +MW-336 : MDEV-13549 Galera test failures +galera_gra_log : MDEV-13549 Galera test failures +galera_flush_local : MDEV-13549 Galera test failures +galera_flush : MDEV-13549 Galera test failures +MW-329 : MDEV-13549 Galera test failures +galera_account_management : MariaDB 10.0 does not support ALTER USER +galera_binlog_row_image : MariaDB 10.0 does not support binlog_row_image +galera_binlog_rows_query_log_events: MariaDB does not support binlog_rows_query_log_events +GAL-419 : MDEV-13549 Galera test failures +galera_toi_ddl_fk_insert : MDEV-13549 Galera test failures +galera_var_notify_cmd : MDEV-13549 Galera test failures +galera_var_slave_threads : MDEV-13549 Galera test failures +mysql-wsrep#90 : MDEV-13549 Galera test failures +galera_as_master_gtid : Requires MySQL GTID +galera_as_master_gtid_change_master : Requires MySQL GTID +galera_as_slave_replication_bundle : MDEV-13549 Galera test failures +galera_as_slave_preordered : wsrep-preordered feature not merged to MariaDB +galera_gcs_fragment : MDEV-13549 Galera test failures +galera_gcache_recover : MDEV-13549 Galera test failures +galera_gcache_recover_full_gcache : MDEV-13549 Galera test failures +galera_gcache_recover_manytrx : MDEV-13549 Galera test failures +galera_ist_mysqldump : MDEV-13549 Galera test failures +mysql-wsrep#31 : MDEV-13549 Galera test failures +galera_migrate : MariaDB 10.0 does not support START SLAVE USER +galera_concurrent_ctas : MDEV-13549 Galera test failures +galera_bf_abort_for_update : MDEV-13549 Galera test failures +galera_wsrep_desync_wsrep_on : MDEV-13549 Galera test failures +galera_ssl_upgrade : MDEV-13549 Galera test failures +mysql-wsrep#33 : MDEV-13549 Galera test failures +galera_var_auto_inc_control_on : MDEV-13549 Galera test failures +MW-44 : MDEV-13549 Galera test failures +galera_var_retry_autocommit : MDEV-13549 Galera test failures \ No newline at end of file diff --git a/mysql-test/suite/galera/r/galera#414.result b/mysql-test/suite/galera/r/galera#414.result index 029961f9463..5bb22587241 100644 --- a/mysql-test/suite/galera/r/galera#414.result +++ b/mysql-test/suite/galera/r/galera#414.result @@ -2,4 +2,6 @@ SET SESSION wsrep_sync_wait = 0; SET SESSION wsrep_on = OFF; SET SESSION wsrep_on = ON; CALL mtr.add_suppression("Failed to set packet size"); +set GLOBAL auto_increment_offset = 1; CALL mtr.add_suppression("Failed to set packet size"); +set GLOBAL auto_increment_offset = 2; diff --git a/mysql-test/suite/galera/r/galera_var_dirty_reads.result b/mysql-test/suite/galera/r/galera_var_dirty_reads.result index 405d86b3027..c469e49731d 100644 --- a/mysql-test/suite/galera/r/galera_var_dirty_reads.result +++ b/mysql-test/suite/galera/r/galera_var_dirty_reads.result @@ -42,4 +42,6 @@ SELECT * FROM t1; i 1 DROP TABLE t1; +set GLOBAL auto_increment_offset = 1; +set GLOBAL auto_increment_offset = 2; # End of test diff --git a/mysql-test/suite/galera/r/galera_wsrep_provider_unset_set.result b/mysql-test/suite/galera/r/galera_wsrep_provider_unset_set.result index 681e4606b38..89110b48def 100644 --- a/mysql-test/suite/galera/r/galera_wsrep_provider_unset_set.result +++ b/mysql-test/suite/galera/r/galera_wsrep_provider_unset_set.result @@ -3,6 +3,7 @@ INSERT INTO t1 VALUES (1); SET GLOBAL wsrep_provider='none'; INSERT INTO t1 VALUES (2); INSERT INTO t1 VALUES (3); +SET SESSION wsrep_sync_wait = 0; INSERT INTO t1 VALUES (4); SELECT COUNT(*) = 4 FROM t1; COUNT(*) = 4 diff --git a/mysql-test/suite/galera/suite.pm b/mysql-test/suite/galera/suite.pm index 5b69ff26615..c366ec7c136 100644 --- a/mysql-test/suite/galera/suite.pm +++ b/mysql-test/suite/galera/suite.pm @@ -19,6 +19,9 @@ $ENV{WSREP_PROVIDER} = $provider; my ($spath) = grep { -f "$_/wsrep_sst_rsync"; } "$::bindir/scripts", $::path_client_bindir; return "No SST scripts" unless $spath; +my ($cpath) = grep { -f "$_/mysql"; } "$::bindir/scripts", $::path_client_bindir; +return "No scritps" unless $cpath; + my ($epath) = grep { -f "$_/my_print_defaults"; } "$::bindir/extra", $::path_client_bindir; return "No my_print_defaults" unless $epath; @@ -67,6 +70,8 @@ push @::global_suppressions, qr(WSREP: TO isolation failed for: .*), qr|WSREP: gcs_caused\(\) returned .*|, qr|WSREP: Protocol violation. JOIN message sender .* is not in state transfer \(SYNCED\). Message ignored.|, + qr|WSREP: Protocol violation. JOIN message sender .* is not in state transfer \(JOINED\). Message ignored.|, + qr|WSREP: Unsupported protocol downgrade: incremental data collection disabled. Expect abort.|, qr(WSREP: Action message in non-primary configuration from member [0-9]*), qr(WSREP: discarding established .*), ); @@ -74,6 +79,7 @@ push @::global_suppressions, $ENV{PATH}="$epath:$ENV{PATH}"; $ENV{PATH}="$spath:$ENV{PATH}" unless $epath eq $spath; +$ENV{PATH}="$cpath:$ENV{PATH}" unless $cpath eq $spath; bless { }; diff --git a/mysql-test/suite/galera/t/galera#414.test b/mysql-test/suite/galera/t/galera#414.test index dccb28e4054..de10898df42 100644 --- a/mysql-test/suite/galera/t/galera#414.test +++ b/mysql-test/suite/galera/t/galera#414.test @@ -6,6 +6,11 @@ --source include/have_innodb.inc --source include/galera_cluster.inc +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + # We perform the shutdown/restart sequence in here. If there was a crash during shutdown, MTR will detect it --connection node_2 @@ -35,3 +40,4 @@ CALL mtr.add_suppression("Failed to set packet size"); --source include/wait_condition.inc CALL mtr.add_suppression("Failed to set packet size"); +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_ist_mysqldump.cnf b/mysql-test/suite/galera/t/galera_ist_mysqldump.cnf index db6b7d5e129..357c8678658 100644 --- a/mysql-test/suite/galera/t/galera_ist_mysqldump.cnf +++ b/mysql-test/suite/galera/t/galera_ist_mysqldump.cnf @@ -9,3 +9,4 @@ wsrep_provider_options='base_port=@mysqld.1.#galera_port;pc.ignore_sb=true' [mysqld.2] wsrep_provider_options='base_port=@mysqld.2.#galera_port;pc.ignore_sb=true' + diff --git a/mysql-test/suite/galera/t/galera_ist_recv_bind.test b/mysql-test/suite/galera/t/galera_ist_recv_bind.test index cb7329073ad..a339684c158 100644 --- a/mysql-test/suite/galera/t/galera_ist_recv_bind.test +++ b/mysql-test/suite/galera/t/galera_ist_recv_bind.test @@ -5,6 +5,7 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/big_test.inc --connection node_1 SELECT @@wsrep_provider_options LIKE '%ist.recv_bind = 127.0.0.1%'; diff --git a/mysql-test/suite/galera/t/galera_ist_rsync.cnf b/mysql-test/suite/galera/t/galera_ist_rsync.cnf index bbe0f6047fb..797e3651967 100644 --- a/mysql-test/suite/galera/t/galera_ist_rsync.cnf +++ b/mysql-test/suite/galera/t/galera_ist_rsync.cnf @@ -5,7 +5,9 @@ wsrep_sst_method=rsync [mysqld.1] wsrep_provider_options='base_port=@mysqld.1.#galera_port;pc.ignore_sb=true' +wsrep_sync_wait=1 [mysqld.2] wsrep_provider_options='base_port=@mysqld.2.#galera_port;pc.ignore_sb=true' +wsrep_sync_wait=1 diff --git a/mysql-test/suite/galera/t/galera_ist_rsync.test b/mysql-test/suite/galera/t/galera_ist_rsync.test index 41d1a0c1fc2..1da79cd4214 100644 --- a/mysql-test/suite/galera/t/galera_ist_rsync.test +++ b/mysql-test/suite/galera/t/galera_ist_rsync.test @@ -2,7 +2,12 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc --source suite/galera/include/galera_st_disconnect_slave.inc --source suite/galera/include/galera_st_shutdown_slave.inc --source suite/galera/include/galera_st_kill_slave.inc --source suite/galera/include/galera_st_kill_slave_ddl.inc +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_restart_on_unknown_option.test b/mysql-test/suite/galera/t/galera_restart_on_unknown_option.test index 2f27678b547..a8ea639415d 100644 --- a/mysql-test/suite/galera/t/galera_restart_on_unknown_option.test +++ b/mysql-test/suite/galera/t/galera_restart_on_unknown_option.test @@ -6,6 +6,11 @@ CALL mtr.add_suppression("Aborting"); CALL mtr.add_suppression("unknown option '--galera-unknown-option'"); +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + # # We should count the number of "Assertion failed" warnings # in the log file before and after testing. To do this we need @@ -148,3 +153,5 @@ DROP TABLE t1; } EOF --remove_file $TEST_LOG.copy + +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_ssl.test b/mysql-test/suite/galera/t/galera_ssl.test index 8dc94dc1966..e6346aa2151 100644 --- a/mysql-test/suite/galera/t/galera_ssl.test +++ b/mysql-test/suite/galera/t/galera_ssl.test @@ -8,6 +8,7 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/big_test.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'; diff --git a/mysql-test/suite/galera/t/galera_ssl_compression.test b/mysql-test/suite/galera/t/galera_ssl_compression.test index cdecf4807d4..75f92c5b2f4 100644 --- a/mysql-test/suite/galera/t/galera_ssl_compression.test +++ b/mysql-test/suite/galera/t/galera_ssl_compression.test @@ -7,6 +7,7 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/big_test.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'; diff --git a/mysql-test/suite/galera/t/galera_var_dirty_reads.test b/mysql-test/suite/galera/t/galera_var_dirty_reads.test index 183c60753ad..152c875a946 100644 --- a/mysql-test/suite/galera/t/galera_var_dirty_reads.test +++ b/mysql-test/suite/galera/t/galera_var_dirty_reads.test @@ -64,6 +64,10 @@ USE test; SELECT * FROM t1; # Cleanup DROP TABLE t1; +set GLOBAL auto_increment_offset = 1; + +--connection node_2 +set GLOBAL auto_increment_offset = 2; --source include/galera_end.inc --echo # End of test diff --git a/mysql-test/suite/galera/t/galera_wsrep_provider_unset_set.test b/mysql-test/suite/galera/t/galera_wsrep_provider_unset_set.test index fe4c358bd89..7f91495fcc4 100644 --- a/mysql-test/suite/galera/t/galera_wsrep_provider_unset_set.test +++ b/mysql-test/suite/galera/t/galera_wsrep_provider_unset_set.test @@ -6,6 +6,11 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + --connection node_1 CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; INSERT INTO t1 VALUES (1); @@ -26,6 +31,8 @@ INSERT INTO t1 VALUES (3); --eval SET GLOBAL wsrep_cluster_address = '$wsrep_cluster_address_orig'; --enable_query_log +SET SESSION wsrep_sync_wait = 0; + --source include/wait_until_connected_again.inc --source include/galera_wait_ready.inc @@ -39,3 +46,5 @@ SELECT COUNT(*) = 4 FROM t1; SELECT COUNT(*) = 3 FROM t1; DROP TABLE t1; + +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera_3nodes/disabled.def b/mysql-test/suite/galera_3nodes/disabled.def index 502e7bfba68..a9b9b00b40c 100644 --- a/mysql-test/suite/galera_3nodes/disabled.def +++ b/mysql-test/suite/galera_3nodes/disabled.def @@ -1,8 +1,3 @@ -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 -galera_pc_bootstrap : TODO: Investigate: Timeout in wait_condition.inc -galera_pc_weight : Test times out -galera_safe_to_bootstrap : I Really dont know :( + diff --git a/mysql-test/suite/wsrep/disabled.def b/mysql-test/suite/wsrep/disabled.def index 605f063f967..8b137891791 100644 --- a/mysql-test/suite/wsrep/disabled.def +++ b/mysql-test/suite/wsrep/disabled.def @@ -1 +1 @@ -foreign_key : MDEV-7915 + From 449a996c6ae5a92818e375ff10f8bc7217d5ffb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Sat, 19 Aug 2017 07:52:31 +0300 Subject: [PATCH 49/54] Add more disabled tests and one ignored warning. --- mysql-test/suite/galera/disabled.def | 5 ++++- mysql-test/suite/galera/suite.pm | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index 22fb3c4f12d..9abc06f235e 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -40,4 +40,7 @@ galera_ssl_upgrade : MDEV-13549 Galera test failures mysql-wsrep#33 : MDEV-13549 Galera test failures galera_var_auto_inc_control_on : MDEV-13549 Galera test failures MW-44 : MDEV-13549 Galera test failures -galera_var_retry_autocommit : MDEV-13549 Galera test failures \ No newline at end of file +galera_var_retry_autocommit : MDEV-13549 Galera test failures +pxc-421 : MDEV-13549 Galera test failures +lp1376747-2 : MDEV-13549 Galera test failures +lp1376747 : MDEV-13549 Galera test failures \ No newline at end of file diff --git a/mysql-test/suite/galera/suite.pm b/mysql-test/suite/galera/suite.pm index c366ec7c136..501fe842298 100644 --- a/mysql-test/suite/galera/suite.pm +++ b/mysql-test/suite/galera/suite.pm @@ -74,6 +74,7 @@ push @::global_suppressions, qr|WSREP: Unsupported protocol downgrade: incremental data collection disabled. Expect abort.|, qr(WSREP: Action message in non-primary configuration from member [0-9]*), qr(WSREP: discarding established .*), + qr(WSREP: gcs\/src\/gcs_core.cpp:core_handle_uuid_msg\(\):.*: STATE EXCHANGE: failed for: .*: .* \(Transport endpoint is not connected\)), ); From d20923debb231cf26e0fb6a6dddbf4e02bb1fc86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Sun, 20 Aug 2017 07:49:07 +0300 Subject: [PATCH 50/54] Add more disabled test. --- mysql-test/suite/galera/disabled.def | 4 +++- mysql-test/suite/galera/suite.pm | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index 9abc06f235e..38421dbd2ea 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -43,4 +43,6 @@ MW-44 : MDEV-13549 Galera test failures galera_var_retry_autocommit : MDEV-13549 Galera test failures pxc-421 : MDEV-13549 Galera test failures lp1376747-2 : MDEV-13549 Galera test failures -lp1376747 : MDEV-13549 Galera test failures \ No newline at end of file +lp1376747 : MDEV-13549 Galera test failures +galera_toi_ddl_nonconflicting : MDEV-13549 Galera test failures +galera_parallel_simple : MDEV-13549 Galera test failures diff --git a/mysql-test/suite/galera/suite.pm b/mysql-test/suite/galera/suite.pm index 501fe842298..d5de3628f75 100644 --- a/mysql-test/suite/galera/suite.pm +++ b/mysql-test/suite/galera/suite.pm @@ -74,7 +74,7 @@ push @::global_suppressions, qr|WSREP: Unsupported protocol downgrade: incremental data collection disabled. Expect abort.|, qr(WSREP: Action message in non-primary configuration from member [0-9]*), qr(WSREP: discarding established .*), - qr(WSREP: gcs\/src\/gcs_core.cpp:core_handle_uuid_msg\(\):.*: STATE EXCHANGE: failed for: .*: .* \(Transport endpoint is not connected\)), + qr(WSREP: gcs\/src\/gcs_core.cpp:core_handle_uuid_msg\(\):.*), ); From f1af2114993f884b1a6dc34fb1d972ead08f1966 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Mon, 21 Aug 2017 07:11:04 +0300 Subject: [PATCH 51/54] Add galera_admin to disabled. --- mysql-test/suite/galera/disabled.def | 1 + 1 file changed, 1 insertion(+) diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index 38421dbd2ea..f9909914089 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -46,3 +46,4 @@ lp1376747-2 : MDEV-13549 Galera test failures lp1376747 : MDEV-13549 Galera test failures galera_toi_ddl_nonconflicting : MDEV-13549 Galera test failures galera_parallel_simple : MDEV-13549 Galera test failures +galera_admin : MDEV-13549 Galera test failures From 0aeff8c36add46db1de4287a9461d084b148c31f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Mon, 21 Aug 2017 14:48:30 +0300 Subject: [PATCH 52/54] Fix compiler error. --- sql/sql_parse.cc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 81b71f71760..f5721d2ca2f 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -3663,13 +3663,12 @@ end_with_restore_list: #endif /* EMBEDDED_LIBRARY */ case SQLCOM_SHOW_CREATE: { - DBUG_ASSERT(first_table == all_tables && first_table != 0); + DBUG_ASSERT(first_table == all_tables && first_table != 0); #ifdef DONT_ALLOW_SHOW_COMMANDS my_message(ER_NOT_ALLOWED_COMMAND, ER_THD(thd, ER_NOT_ALLOWED_COMMAND), MYF(0)); /* purecov: inspected */ goto error; #else - { WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); /* @@ -3892,7 +3891,6 @@ end_with_restore_list: DBUG_PRINT("debug", ("Just after generate_incident()")); } #endif - } /* fall through */ case SQLCOM_INSERT: { From 5077cc0b1a0d82c55ce6b6ec643f04099d0e8416 Mon Sep 17 00:00:00 2001 From: Sachin Setiya Date: Wed, 23 Aug 2017 16:49:42 +0530 Subject: [PATCH 53/54] Fix Merge Error --- mysql-test/include/wait_wsrep_ready.inc | 5 ++++- mysql-test/suite/sys_vars/r/sysvars_wsrep.result | 2 +- mysql-test/suite/wsrep/t/mdev_6832.opt | 2 +- mysql-test/suite/wsrep/t/mdev_7798.opt | 2 +- plugin/wsrep_info/mysql-test/wsrep_info/my.cnf | 2 -- sql/sql_parse.cc | 2 +- 6 files changed, 8 insertions(+), 7 deletions(-) diff --git a/mysql-test/include/wait_wsrep_ready.inc b/mysql-test/include/wait_wsrep_ready.inc index 0e666afa33d..2dd1ef7f1ab 100644 --- a/mysql-test/include/wait_wsrep_ready.inc +++ b/mysql-test/include/wait_wsrep_ready.inc @@ -8,7 +8,10 @@ if (`SELECT COUNT(*)=1 FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'wsrep' AND PLUGIN_STATUS='ACTIVE'`) { - --source include/galera_wait_ready.inc + if (`SELECT @@GLOBAL.WSREP_ON`) + { + --source include/galera_wait_ready.inc + } } --enable_query_log diff --git a/mysql-test/suite/sys_vars/r/sysvars_wsrep.result b/mysql-test/suite/sys_vars/r/sysvars_wsrep.result index 69df8c0f19e..0c206975c29 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_wsrep.result +++ b/mysql-test/suite/sys_vars/r/sysvars_wsrep.result @@ -598,7 +598,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE INT UNSIGNED VARIABLE_COMMENT Ensure "synchronous" read view before executing an operation of the type specified by bitmask: 1 - READ(includes SELECT, SHOW and BEGIN/START TRANSACTION); 2 - UPDATE and DELETE; 4 - INSERT and REPLACE NUMERIC_MIN_VALUE 0 -NUMERIC_MAX_VALUE 7 +NUMERIC_MAX_VALUE 15 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO diff --git a/mysql-test/suite/wsrep/t/mdev_6832.opt b/mysql-test/suite/wsrep/t/mdev_6832.opt index 459a9702707..16f8962dba2 100644 --- a/mysql-test/suite/wsrep/t/mdev_6832.opt +++ b/mysql-test/suite/wsrep/t/mdev_6832.opt @@ -1 +1 @@ ---wsrep-provider=$WSREP_PROVIDER --wsrep-cluster-address=gcomm:// --wsrep-on=1 --wsrep_causal_reads=ON +--wsrep-provider=$WSREP_PROVIDER --wsrep-cluster-address=gcomm:// --wsrep-on=1 diff --git a/mysql-test/suite/wsrep/t/mdev_7798.opt b/mysql-test/suite/wsrep/t/mdev_7798.opt index 459a9702707..1007d5c0b78 100644 --- a/mysql-test/suite/wsrep/t/mdev_7798.opt +++ b/mysql-test/suite/wsrep/t/mdev_7798.opt @@ -1 +1 @@ ---wsrep-provider=$WSREP_PROVIDER --wsrep-cluster-address=gcomm:// --wsrep-on=1 --wsrep_causal_reads=ON +--wsrep-provider=$WSREP_PROVIDER --wsrep-cluster-address=gcomm:// --wsrep-on=1 diff --git a/plugin/wsrep_info/mysql-test/wsrep_info/my.cnf b/plugin/wsrep_info/mysql-test/wsrep_info/my.cnf index 4af933f1633..70682178ca1 100644 --- a/plugin/wsrep_info/mysql-test/wsrep_info/my.cnf +++ b/plugin/wsrep_info/mysql-test/wsrep_info/my.cnf @@ -8,8 +8,6 @@ innodb-autoinc-lock-mode=2 innodb-locks-unsafe-for-binlog=1 wsrep-cluster-address=gcomm:// wsrep_provider=@ENV.WSREP_PROVIDER -# enforce read-committed characteristics across the cluster -wsrep_causal_reads=ON [mysqld.1] #galera_port=@OPT.port diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index f5721d2ca2f..6f9e4677c0b 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -4225,7 +4225,7 @@ end_with_restore_list: */ if (thd->slave_thread && !thd->slave_expected_error && slave_ddl_exec_mode_options == SLAVE_EXEC_MODE_IDEMPOTENT) - lex->check_exists= 1; + lex->create_info.set(DDL_options_st::OPT_IF_EXISTS); if (WSREP(thd)) { From bbfd53cd32c1cf8be30f1d18225adb7fc5f6faf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Thu, 24 Aug 2017 11:46:23 +0300 Subject: [PATCH 54/54] Add galera suite to default suites and disable failing test cases. --- mysql-test/mysql-test-run.pl | 1 + mysql-test/suite/galera/disabled.def | 5 +++++ mysql-test/suite/galera/r/galera_defaults.result | 2 +- mysql-test/suite/galera/suite.pm | 3 ++- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index 2cd5d2ae922..0c142dc15b6 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -195,6 +195,7 @@ my @DEFAULT_SUITES= qw( unit- vcol- wsrep- + galera- ); my $opt_suites; diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index 1e628b99644..cd19fccd483 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -49,3 +49,8 @@ galera_parallel_simple : MDEV-13549 Galera test failures galera_admin : MDEV-13549 Galera test failures galera_var_max_ws_rows : MDEV-13549 Galera test failures 10.1 MW-286 : MDEV-13549 Galera test failures 10.1 +galera_as_master: MDEV-13549 Galera test failures 10.1 +galera_pc_ignore_sb : MDEV-13549 Galera test failures 10.1 +galera_lock_table : MDEV-13549 Galera test failures 10.1 +MW-284 : MDEV-13549 Galera test failures 10.1 +galera_as_slave : MDEV-13549 Galera test failures 10.1 diff --git a/mysql-test/suite/galera/r/galera_defaults.result b/mysql-test/suite/galera/r/galera_defaults.result index d8f4698a48d..28c3f4dd104 100644 --- a/mysql-test/suite/galera/r/galera_defaults.result +++ b/mysql-test/suite/galera/r/galera_defaults.result @@ -51,7 +51,7 @@ WSREP_SST_DONOR WSREP_SST_DONOR_REJECTS_QUERIES OFF WSREP_SST_METHOD rsync WSREP_SYNC_WAIT 15 -; ; ; cert.log_conflicts = no; debug = no; evs.auto_evict = 0; evs.causal_keepalive_period = PT1S; evs.debug_log_mask = 0x1; evs.delay_margin = PT1S; evs.delayed_keep_period = PT30S; evs.inactive_check_period = PT0.5S; evs.inactive_timeout = PT15S; evs.info_log_mask = 0; evs.install_timeout = PT7.5S; evs.join_retrans_period = PT1S; evs.keepalive_period = PT1S; evs.max_install_timeouts = 3; evs.send_window = 4; evs.stats_report_period = PT1M; evs.suspect_timeout = PT10S; evs.use_aggregate = true; evs.user_send_window = 2; evs.version = 0; evs.view_forget_timeout = P1D; ; gcache.keep_pages_size = 0; gcache.mem_size = 0; ; gcache.page_size = 128M; gcache.recover = no; gcache.size = 10M; gcomm.thread_prio = ; gcs.fc_debug = 0; gcs.fc_factor = 1.0; gcs.fc_limit = 16; gcs.fc_master_slave = no; gcs.max_packet_size = 64500; gcs.max_throttle = 0.25; ; gcs.recv_q_soft_limit = 0.25; gcs.sync_donor = no; ; gmcast.mcast_addr = ; gmcast.mcast_ttl = 1; gmcast.peer_timeout = PT3S; gmcast.segment = 0; gmcast.time_wait = PT5S; gmcast.version = 0; ; pc.announce_timeout = PT3S; pc.checksum = false; pc.ignore_quorum = false; pc.ignore_sb = false; pc.linger = PT20S; pc.npvo = false; pc.recovery = true; pc.version = 0; pc.wait_prim = true; pc.wait_prim_timeout = PT30S; pc.weight = 1; protonet.backend = asio; protonet.version = 0; repl.causal_read_timeout = PT90S; repl.commit_order = 3; repl.key_format = FLAT8; repl.max_ws_size = 2147483647; repl.proto_max = 7; socket.checksum = 2; socket.recv_buf_size = 212992; +; ; ; cert.log_conflicts = no; debug = no; evs.auto_evict = 0; evs.causal_keepalive_period = PT1S; evs.debug_log_mask = 0x1; evs.delay_margin = PT1S; evs.delayed_keep_period = PT30S; evs.inactive_check_period = PT0.5S; evs.inactive_timeout = PT30S; evs.info_log_mask = 0; evs.install_timeout = PT15S; evs.join_retrans_period = PT1S; evs.keepalive_period = PT1S; evs.max_install_timeouts = 3; evs.send_window = 4; evs.stats_report_period = PT1M; evs.suspect_timeout = PT10S; evs.use_aggregate = true; evs.user_send_window = 2; evs.version = 0; evs.view_forget_timeout = P1D; ; gcache.keep_pages_size = 0; gcache.mem_size = 0; ; gcache.page_size = 128M; gcache.recover = no; gcache.size = 10M; gcomm.thread_prio = ; gcs.fc_debug = 0; gcs.fc_factor = 1.0; gcs.fc_limit = 16; gcs.fc_master_slave = no; gcs.max_packet_size = 64500; gcs.max_throttle = 0.25; ; gcs.recv_q_soft_limit = 0.25; gcs.sync_donor = no; ; gmcast.mcast_addr = ; gmcast.mcast_ttl = 1; gmcast.peer_timeout = PT3S; gmcast.segment = 0; gmcast.time_wait = PT5S; gmcast.version = 0; ; pc.announce_timeout = PT3S; pc.checksum = false; pc.ignore_quorum = false; pc.ignore_sb = false; pc.linger = PT20S; pc.npvo = false; pc.recovery = true; pc.version = 0; pc.wait_prim = true; pc.wait_prim_timeout = PT30S; pc.weight = 1; protonet.backend = asio; protonet.version = 0; repl.causal_read_timeout = PT90S; repl.commit_order = 3; repl.key_format = FLAT8; repl.max_ws_size = 2147483647; repl.proto_max = 7; socket.checksum = 2; socket.recv_buf_size = 212992; SELECT COUNT(*) FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE 'wsrep_%' AND VARIABLE_NAME != 'wsrep_debug_sync_waiters'; diff --git a/mysql-test/suite/galera/suite.pm b/mysql-test/suite/galera/suite.pm index 31593b654ea..361743f1243 100644 --- a/mysql-test/suite/galera/suite.pm +++ b/mysql-test/suite/galera/suite.pm @@ -72,8 +72,9 @@ push @::global_suppressions, qr|WSREP: Unsupported protocol downgrade: incremental data collection disabled. Expect abort.|, qr(WSREP: Action message in non-primary configuration from member [0-9]*), qr(WSREP: discarding established .*), - qr(WSREP: gcs\/src\/gcs_core.cpp:core_handle_uuid_msg\(\):.*), + qr|WSREP: .*core_handle_uuid_msg.*|, qr(WSREP: --wsrep-causal-reads=ON takes precedence over --wsrep-sync-wait=0. WSREP_SYNC_WAIT_BEFORE_READ is on), + qr|WSREP: JOIN message from member .* in non-primary configuration. Ignored.|, );