1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

Merge 10.6 into 10.11

This commit is contained in:
Marko Mäkelä
2024-01-03 15:37:57 +02:00
64 changed files with 1211 additions and 163 deletions

View File

@@ -1618,6 +1618,7 @@ ibx_copy_incremental_over_full()
NULL}; NULL};
const char *sup_files[] = {"xtrabackup_binlog_info", const char *sup_files[] = {"xtrabackup_binlog_info",
"xtrabackup_galera_info", "xtrabackup_galera_info",
"donor_galera_info",
"xtrabackup_slave_info", "xtrabackup_slave_info",
"xtrabackup_info", "xtrabackup_info",
"ib_lru_dump", "ib_lru_dump",

View File

@@ -9,6 +9,7 @@
/* special files */ /* special files */
#define XTRABACKUP_SLAVE_INFO "xtrabackup_slave_info" #define XTRABACKUP_SLAVE_INFO "xtrabackup_slave_info"
#define XTRABACKUP_GALERA_INFO "xtrabackup_galera_info" #define XTRABACKUP_GALERA_INFO "xtrabackup_galera_info"
#define XTRABACKUP_DONOR_GALERA_INFO "donor_galera_info"
#define XTRABACKUP_BINLOG_INFO "xtrabackup_binlog_info" #define XTRABACKUP_BINLOG_INFO "xtrabackup_binlog_info"
#define XTRABACKUP_INFO "xtrabackup_info" #define XTRABACKUP_INFO "xtrabackup_info"

View File

@@ -1360,6 +1360,7 @@ write_galera_info(ds_ctxt *datasink, MYSQL *connection)
{ {
char *state_uuid = NULL, *state_uuid55 = NULL; char *state_uuid = NULL, *state_uuid55 = NULL;
char *last_committed = NULL, *last_committed55 = NULL; char *last_committed = NULL, *last_committed55 = NULL;
char *domain_id = NULL, *domain_id55 = NULL;
bool result; bool result;
mysql_variable status[] = { mysql_variable status[] = {
@@ -1370,6 +1371,12 @@ write_galera_info(ds_ctxt *datasink, MYSQL *connection)
{NULL, NULL} {NULL, NULL}
}; };
mysql_variable value[] = {
{"Wsrep_gtid_domain_id", &domain_id},
{"wsrep_gtid_domain_id", &domain_id55},
{NULL, NULL}
};
/* When backup locks are supported by the server, we should skip /* When backup locks are supported by the server, we should skip
creating xtrabackup_galera_info file on the backup stage, because creating xtrabackup_galera_info file on the backup stage, because
wsrep_local_state_uuid and wsrep_last_committed will be inconsistent wsrep_local_state_uuid and wsrep_last_committed will be inconsistent
@@ -1388,9 +1395,26 @@ write_galera_info(ds_ctxt *datasink, MYSQL *connection)
goto cleanup; goto cleanup;
} }
read_mysql_variables(connection, "SHOW VARIABLES LIKE 'wsrep%'", value, true);
if (domain_id == NULL && domain_id55 == NULL) {
msg("Warning: failed to get master wsrep state from SHOW VARIABLES.");
result = true;
goto cleanup;
}
result = datasink->backup_file_printf(XTRABACKUP_GALERA_INFO, result = datasink->backup_file_printf(XTRABACKUP_GALERA_INFO,
"%s:%s\n", state_uuid ? state_uuid : state_uuid55, "%s:%s %s\n", state_uuid ? state_uuid : state_uuid55,
last_committed ? last_committed : last_committed55); last_committed ? last_committed : last_committed55,
domain_id ? domain_id : domain_id55);
if (result)
{
result= datasink->backup_file_printf(XTRABACKUP_DONOR_GALERA_INFO,
"%s:%s %s\n", state_uuid ? state_uuid : state_uuid55,
last_committed ? last_committed : last_committed55,
domain_id ? domain_id : domain_id55);
}
if (result) if (result)
{ {
write_current_binlog_file(datasink, connection); write_current_binlog_file(datasink, connection);

View File

@@ -53,6 +53,7 @@ permission notice:
/*! Name of file where Galera info is stored on recovery */ /*! Name of file where Galera info is stored on recovery */
#define XB_GALERA_INFO_FILENAME "xtrabackup_galera_info" #define XB_GALERA_INFO_FILENAME "xtrabackup_galera_info"
#define XB_GALERA_DONOR_INFO_FILENAME "donor_galera_info"
/*********************************************************************** /***********************************************************************
Store Galera checkpoint info in the 'xtrabackup_galera_info' file, if that Store Galera checkpoint info in the 'xtrabackup_galera_info' file, if that
@@ -67,7 +68,7 @@ xb_write_galera_info(bool incremental_prepare)
long long seqno; long long seqno;
MY_STAT statinfo; MY_STAT statinfo;
/* Do not overwrite existing an existing file to be compatible with /* Do not overwrite an existing file to be compatible with
servers with older server versions */ servers with older server versions */
if (!incremental_prepare && if (!incremental_prepare &&
my_stat(XB_GALERA_INFO_FILENAME, &statinfo, MYF(0)) != NULL) { my_stat(XB_GALERA_INFO_FILENAME, &statinfo, MYF(0)) != NULL) {
@@ -101,10 +102,11 @@ xb_write_galera_info(bool incremental_prepare)
seqno = wsrep_xid_seqno(&xid); seqno = wsrep_xid_seqno(&xid);
msg("mariabackup: Recovered WSREP position: %s:%lld\n", msg("mariabackup: Recovered WSREP position: %s:%lld domain_id: %lld\n",
uuid_str, (long long) seqno); uuid_str, (long long) seqno, (long long)wsrep_get_domain_id());
if (fprintf(fp, "%s:%lld", uuid_str, (long long) seqno) < 0) { if (fprintf(fp, "%s:%lld %lld", uuid_str, (long long) seqno,
(long long)wsrep_get_domain_id()) < 0) {
die( die(
"could not write to " XB_GALERA_INFO_FILENAME "could not write to " XB_GALERA_INFO_FILENAME

View File

@@ -95,6 +95,7 @@ extern struct wsrep_service_st {
void (*wsrep_thd_kill_LOCK_func)(const MYSQL_THD thd); void (*wsrep_thd_kill_LOCK_func)(const MYSQL_THD thd);
void (*wsrep_thd_kill_UNLOCK_func)(const MYSQL_THD thd); void (*wsrep_thd_kill_UNLOCK_func)(const MYSQL_THD thd);
void (*wsrep_thd_set_wsrep_PA_unsafe_func)(MYSQL_THD thd); void (*wsrep_thd_set_wsrep_PA_unsafe_func)(MYSQL_THD thd);
uint32 (*wsrep_get_domain_id_func)();
} *wsrep_service; } *wsrep_service;
#define MYSQL_SERVICE_WSREP_INCLUDED #define MYSQL_SERVICE_WSREP_INCLUDED
@@ -144,6 +145,7 @@ extern struct wsrep_service_st {
#define wsrep_thd_set_ignored_error(T,V) wsrep_service->wsrep_thd_set_ignored_error_func(T,V) #define wsrep_thd_set_ignored_error(T,V) wsrep_service->wsrep_thd_set_ignored_error_func(T,V)
#define wsrep_report_bf_lock_wait(T,I) wsrep_service->wsrep_report_bf_lock_wait(T,I) #define wsrep_report_bf_lock_wait(T,I) wsrep_service->wsrep_report_bf_lock_wait(T,I)
#define wsrep_thd_set_PA_unsafe(T) wsrep_service->wsrep_thd_set_PA_unsafe_func(T) #define wsrep_thd_set_PA_unsafe(T) wsrep_service->wsrep_thd_set_PA_unsafe_func(T)
#define wsrep_get_domain_id(T) wsrep_service->wsrep_get_domain_id_func(T)
#else #else
#define MYSQL_SERVICE_WSREP_STATIC_INCLUDED #define MYSQL_SERVICE_WSREP_STATIC_INCLUDED
@@ -253,5 +255,6 @@ extern "C" void wsrep_report_bf_lock_wait(const THD *thd,
unsigned long long trx_id); unsigned long long trx_id);
/* declare parallel applying unsafety for the THD */ /* declare parallel applying unsafety for the THD */
extern "C" void wsrep_thd_set_PA_unsafe(MYSQL_THD thd); extern "C" void wsrep_thd_set_PA_unsafe(MYSQL_THD thd);
extern "C" uint32 wsrep_get_domain_id();
#endif #endif
#endif /* MYSQL_SERVICE_WSREP_INCLUDED */ #endif /* MYSQL_SERVICE_WSREP_INCLUDED */

View File

@@ -0,0 +1,5 @@
[rsync]
wsrep-sst-method=rsync
[mariabackup]
wsrep_sst_method=mariabackup

View File

@@ -0,0 +1,4 @@
# The goal of including this file is to enable galera_sst_method combinations
# (see include/galera_sst_method.combinations)
--source include/have_innodb.inc

View File

@@ -11,3 +11,39 @@ Database Create Database
mysql_TEST CREATE DATABASE `mysql_TEST` /*!40100 DEFAULT CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci */ mysql_TEST CREATE DATABASE `mysql_TEST` /*!40100 DEFAULT CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci */
DROP DATABASE mysql_test; DROP DATABASE mysql_test;
DROP DATABASE mysql_TEST; DROP DATABASE mysql_TEST;
#
# Start of 10.4 tests
#
#
# MDEV-33019 The database part is not case sensitive in SP names
#
CREATE DATABASE DB1;
CREATE DATABASE db1;
CREATE PROCEDURE DB1.sp() SELECT 'This is DB1.sp' AS ret;
CREATE PROCEDURE db1.sp() SELECT 'This is db1.sp' AS ret;
CALL DB1.sp();
ret
This is DB1.sp
CALL db1.sp();
ret
This is db1.sp
DROP DATABASE DB1;
CALL DB1.sp();
ERROR 42000: PROCEDURE DB1.sp does not exist
CALL db1.sp();
ret
This is db1.sp
DROP DATABASE db1;
CREATE PROCEDURE SP() SELECT 'This is SP' AS ret;
CREATE PROCEDURE sp() SELECT 'This is sp' AS ret;
ERROR 42000: PROCEDURE sp already exists
CALL SP();
ret
This is SP
CALL sp();
ret
This is SP
DROP PROCEDURE SP;
#
# End of 10.4 tests
#

View File

@@ -18,3 +18,34 @@ DROP DATABASE mysql_test;
DROP DATABASE mysql_TEST; DROP DATABASE mysql_TEST;
# End of 10.0 tests # End of 10.0 tests
--echo #
--echo # Start of 10.4 tests
--echo #
--echo #
--echo # MDEV-33019 The database part is not case sensitive in SP names
--echo #
CREATE DATABASE DB1;
CREATE DATABASE db1;
CREATE PROCEDURE DB1.sp() SELECT 'This is DB1.sp' AS ret;
CREATE PROCEDURE db1.sp() SELECT 'This is db1.sp' AS ret;
CALL DB1.sp();
CALL db1.sp();
DROP DATABASE DB1;
--error ER_SP_DOES_NOT_EXIST
CALL DB1.sp();
CALL db1.sp();
DROP DATABASE db1;
CREATE PROCEDURE SP() SELECT 'This is SP' AS ret;
--error ER_SP_ALREADY_EXISTS
CREATE PROCEDURE sp() SELECT 'This is sp' AS ret;
CALL SP();
CALL sp();
DROP PROCEDURE SP;
--echo #
--echo # End of 10.4 tests
--echo #

View File

@@ -3239,4 +3239,95 @@ FROM x
) )
); );
ERROR 21000: Operand should contain 2 column(s) ERROR 21000: Operand should contain 2 column(s)
#
# MDEV-29362: Constant subquery used as left part of IN subquery
#
CREATE TABLE t1 (a int) ENGINE=MyISAM;
INSERT INTO t1 VALUES (15), (1), (2);
CREATE TABLE t2 (b int) ENGINE=MyISAM;
INSERT INTO t2 VALUES (15), (1);
CREATE TABLE t3 (c int) ENGINE=MyISAM;
INSERT INTO t3 VALUES (15), (1);
SET optimizer_switch='condition_pushdown_from_having=off';
SELECT a FROM t1 GROUP BY a
HAVING a = ( (SELECT b FROM t2 where b=1) IN (SELECT c FROM t3) ) + 1;
a
2
SELECT a FROM t1 GROUP BY a
HAVING a IN ( (SELECT b FROM t2 where b=1) IN (SELECT c FROM t3) );
a
1
SET optimizer_switch='condition_pushdown_from_having=on';
SELECT a FROM t1 GROUP BY a
HAVING a = ( (SELECT b FROM t2 where b=1) IN (SELECT c FROM t3) ) + 1;
a
2
SELECT a FROM t1 GROUP BY a
HAVING a IN ( (SELECT b FROM t2 where b=1) IN (SELECT c FROM t3) );
a
1
EXPLAIN FORMAT=JSON SELECT a FROM t1 GROUP BY a
HAVING a = ( (SELECT b FROM t2 where b=1) IN (SELECT c FROM t3) ) + 1;
EXPLAIN
{
"query_block": {
"select_id": 1,
"nested_loop": [
{
"table": {
"table_name": "t1",
"access_type": "ALL",
"rows": 3,
"filtered": 100,
"attached_condition": "t1.a = <cache>((<in_optimizer>((subquery#2),<exists>(subquery#3))) + 1)"
}
}
],
"subqueries": [
{
"query_block": {
"select_id": 3,
"having_condition": "trigcond(t3.c is null)",
"nested_loop": [
{
"table": {
"table_name": "t3",
"access_type": "ALL",
"rows": 2,
"filtered": 100,
"attached_condition": "trigcond(1 = t3.c or t3.c is null)"
}
}
]
}
},
{
"query_block": {
"select_id": 2,
"nested_loop": [
{
"table": {
"table_name": "t2",
"access_type": "ALL",
"rows": 2,
"filtered": 100,
"attached_condition": "t2.b = 1"
}
}
]
}
}
]
}
}
PREPARE stmt FROM "SELECT a FROM t1 GROUP BY a
HAVING a = ( (SELECT b FROM t2 where b=1) IN (SELECT c FROM t3) ) + 1";
EXECUTE stmt;
a
2
EXECUTE stmt;
a
2
DEALLOCATE PREPARE stmt;
DROP TABLE t1,t2,t3;
# End of 10.4 tests # End of 10.4 tests

View File

@@ -2633,6 +2633,42 @@ SELECT
) )
); );
--echo #
--echo # MDEV-29362: Constant subquery used as left part of IN subquery
--echo #
CREATE TABLE t1 (a int) ENGINE=MyISAM;
INSERT INTO t1 VALUES (15), (1), (2);
CREATE TABLE t2 (b int) ENGINE=MyISAM;
INSERT INTO t2 VALUES (15), (1);
CREATE TABLE t3 (c int) ENGINE=MyISAM;
INSERT INTO t3 VALUES (15), (1);
let $q1=
SELECT a FROM t1 GROUP BY a
HAVING a = ( (SELECT b FROM t2 where b=1) IN (SELECT c FROM t3) ) + 1;
let $q2=
SELECT a FROM t1 GROUP BY a
HAVING a IN ( (SELECT b FROM t2 where b=1) IN (SELECT c FROM t3) );
SET optimizer_switch='condition_pushdown_from_having=off';
eval $q1;
eval $q2;
SET optimizer_switch='condition_pushdown_from_having=on';
eval $q1;
eval $q2;
eval EXPLAIN FORMAT=JSON $q1;
eval PREPARE stmt FROM "$q1";
EXECUTE stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
DROP TABLE t1,t2,t3;
--echo # End of 10.4 tests --echo # End of 10.4 tests

View File

@@ -12,8 +12,6 @@
galera_as_slave_ctas : MDEV-28378 timeout galera_as_slave_ctas : MDEV-28378 timeout
galera_pc_recovery : MDEV-25199 cluster fails to start up galera_pc_recovery : MDEV-25199 cluster fails to start up
galera_sst_encrypted : MDEV-29876 Galera test failure on galera_sst_encrypted
galera_var_node_address : MDEV-20485 Galera test failure
galera_bf_kill_debug : timeout after 900 seconds galera_bf_kill_debug : timeout after 900 seconds
galera_ssl_upgrade : [Warning] Failed to load slave replication state from table mysql.gtid_slave_pos: 130: Incorrect file format 'gtid_slave_pos' galera_ssl_upgrade : [Warning] Failed to load slave replication state from table mysql.gtid_slave_pos: 130: Incorrect file format 'gtid_slave_pos'
galera_parallel_simple : timeout related to wsrep_sync_wait galera_parallel_simple : timeout related to wsrep_sync_wait

View File

@@ -0,0 +1,24 @@
connection node_2;
connection node_1;
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) engine=innodb;
CREATE TABLE t2 (f1 INTEGER PRIMARY KEY) engine=aria;
START TRANSACTION;
INSERT INTO t1 VALUES (1);
SELECT * FROM t2;
f1
SAVEPOINT s1;
ERROR 42000: The storage engine for the table doesn't support SAVEPOINT
INSERT INTO t1 VALUES (2);
COMMIT;
connection node_1;
SELECT * FROM t1;
f1
1
2
connection node_2;
SELECT * FROM t1;
f1
1
2
connection node_1;
DROP TABLE t1,t2;

View File

@@ -71,13 +71,17 @@ push @::global_suppressions,
sub which($) { return `sh -c "command -v $_[0]"` } sub which($) { return `sh -c "command -v $_[0]"` }
sub skip_combinations { sub skip_combinations {
my %skip = (); my @combinations;
$skip{'include/have_mariabackup.inc'} = 'Need socket statistics utility' $skip{'include/have_mariabackup.inc'} = 'Need socket statistics utility'
unless which("lsof") || which("sockstat") || which("ss"); unless which("lsof") || which("sockstat") || which("ss");
$skip{'include/have_stunnel.inc'} = "Need 'stunnel' utility" $skip{'include/have_stunnel.inc'} = "Need 'stunnel' utility"
unless which("stunnel"); unless which("stunnel");
$skip{'include/have_qpress.inc'} = "Need 'qpress' utility" $skip{'include/have_qpress.inc'} = "Need 'qpress' utility"
unless which("qpress"); unless which("qpress");
$skip{'../encryption/include/have_file_key_management_plugin.combinations'} = [ 'ctr' ]
unless $::mysqld_variables{'version-ssl-library'} =~ /OpenSSL (\S+)/
and $1 ge "1.0.1";
%skip; %skip;
} }

View File

@@ -1,6 +1,8 @@
--source include/galera_cluster.inc --source include/galera_cluster.inc
--source include/have_innodb.inc --source include/have_innodb.inc
--disable_ps2_protocol
# NEXTVAL # NEXTVAL
--connection node_1 --connection node_1
@@ -54,3 +56,4 @@ SELECT NEXTVAL(seq_transaction) = 4;
DROP SEQUENCE seq_transaction; DROP SEQUENCE seq_transaction;
DROP TABLE t1; DROP TABLE t1;
--enable_ps2_protocol

View File

@@ -0,0 +1,28 @@
#
# MDEV-32549: Cluster is inconsitent after savepoint
# statement is rolled back
#
--source include/galera_cluster.inc
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) engine=innodb;
CREATE TABLE t2 (f1 INTEGER PRIMARY KEY) engine=aria;
START TRANSACTION;
INSERT INTO t1 VALUES (1);
SELECT * FROM t2;
--error ER_CHECK_NOT_IMPLEMENTED
SAVEPOINT s1;
INSERT INTO t1 VALUES (2);
COMMIT;
--connection node_1
SELECT * FROM t1;
# If bug is present: only the second INSERT
# is replicated, causing an inconsistent
# cluster.
--connection node_2
SELECT * FROM t1;
--connection node_1
DROP TABLE t1,t2;

View File

@@ -12,13 +12,17 @@ INSERT INTO t1 VALUES (1);
SELECT COUNT(*) > 0 FROM mysql.general_log; SELECT COUNT(*) > 0 FROM mysql.general_log;
--disable_ps2_protocol
SELECT 1 = 1 FROM t1; SELECT 1 = 1 FROM t1;
SELECT COUNT(*) = 1 FROM mysql.slow_log WHERE sql_text = 'SELECT 1 = 1 FROM t1'; SELECT COUNT(*) = 1 FROM mysql.slow_log WHERE sql_text = 'SELECT 1 = 1 FROM t1';
--enable_ps2_protocol
--connection node_2 --connection node_2
--disable_ps2_protocol
SELECT 2 = 2 FROM t1; SELECT 2 = 2 FROM t1;
SELECT COUNT(*) = 1 FROM mysql.slow_log WHERE sql_text = 'SELECT 2 = 2 FROM t1'; SELECT COUNT(*) = 1 FROM mysql.slow_log WHERE sql_text = 'SELECT 2 = 2 FROM t1';
--enable_ps2_protocol
--connection node_1 --connection node_1
DROP TABLE t1; DROP TABLE t1;

View File

@@ -2,6 +2,8 @@
--source include/galera_cluster.inc --source include/galera_cluster.inc
--source include/have_innodb.inc --source include/have_innodb.inc
--disable_ps2_protocol
# #
# Ensure that the query cache behaves properly with respect to Galera # Ensure that the query cache behaves properly with respect to Galera
# #
@@ -65,3 +67,4 @@ SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_
DROP TABLE t1; DROP TABLE t1;
--enable_ps2_protocol

View File

@@ -4,6 +4,8 @@
--source include/have_query_cache.inc --source include/have_query_cache.inc
--source include/galera_have_debug_sync.inc --source include/galera_have_debug_sync.inc
--disable_ps2_protocol
CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (1);
@@ -88,3 +90,5 @@ DROP TABLE t1;
--connection node_2a --connection node_2a
SET DEBUG_SYNC = "RESET"; SET DEBUG_SYNC = "RESET";
--enable_ps2_protocol

View File

@@ -14,6 +14,7 @@ select @@wsrep_gtid_domain_id,@@wsrep_node_name;
@@wsrep_gtid_domain_id @@wsrep_node_name @@wsrep_gtid_domain_id @@wsrep_node_name
100 node3 100 node3
connection node_3; connection node_3;
connection node_1;
connection node_2; connection node_2;
connection node_1; connection node_1;
connection node_1; connection node_1;

View File

@@ -0,0 +1,219 @@
connection node_2;
connection node_1;
connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2;
set wsrep_sync_wait=0;
connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1;
set wsrep_sync_wait=0;
connection node_1;
CREATE PROCEDURE insert_row (IN node varchar(10), IN repeat_count int)
BEGIN
DECLARE current_num int;
SET current_num = 0;
WHILE current_num < repeat_count do
INSERT INTO t1(node, name) VALUES (node, UUID());
SET current_num = current_num + 1;
END WHILE;
END|
CREATE TABLE t1 (id bigint not null primary key auto_increment, node VARCHAR(10), name VARCHAR(64)) ENGINE=innodb;
# node_1
show variables like '%gtid_binlog_pos%';
Variable_name Value
gtid_binlog_pos 1111-1-2
connection node_2;
# node_2
show variables like '%gtid_binlog_pos%';
Variable_name Value
gtid_binlog_pos 1111-1-2
connection node_3;
# node_3
show variables like '%gtid_binlog_pos%';
Variable_name Value
gtid_binlog_pos 1111-1-2
connection node_1;
CALL insert_row('node1', 500);;
connection node_2;
CALL insert_row('node2', 500);;
connection node_3;
CALL insert_row('node3', 500);;
connection node_2;
# Shutdown node_2, force SST
connection node_2b;
# Wait until node_2 leaves cluster
connection node_1b;
connection node_1;
connection node_3;
connection node_1;
CALL insert_row('node1', 500);
connection node_3;
CALL insert_row('node3', 500);
CREATE TABLE t2(i int primary key) engine=innodb;
connection node_2;
# Restart node_2
# restart
connection node_1b;
# Wait until node_2 is back in cluster
# node2 has joined
# GTID in node1
show variables like 'wsrep_gtid_domain_id';
Variable_name Value
wsrep_gtid_domain_id 1111
show variables like '%gtid_binlog_pos%';
Variable_name Value
gtid_binlog_pos 1111-1-2503
connection node_2;
# GTID in node2
show variables like 'wsrep_gtid_domain_id';
Variable_name Value
wsrep_gtid_domain_id 1111
show variables like '%gtid_binlog_pos%';
Variable_name Value
gtid_binlog_pos 1111-1-2503
connection node_3;
# GTID in node3
show variables like 'wsrep_gtid_domain_id';
Variable_name Value
wsrep_gtid_domain_id 1111
show variables like '%gtid_binlog_pos%';
Variable_name Value
gtid_binlog_pos 1111-1-2503
# Shutdown node_3
connection node_3;
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1';
# Wait until node_3 leaves cluster
connection node_1b;
connection node_1;
CALL insert_row('node1', 50);
CREATE TABLE t3(i int primary key) engine=innodb;
connection node_3;
# Rejoin node_3
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 0';
connection node_1b;
# Wait until node_3 is back in cluster
# node3 has joined
connection node_1;
# GTID in node1
show variables like 'wsrep_gtid_domain_id';
Variable_name Value
wsrep_gtid_domain_id 1111
show variables like '%gtid_binlog_pos%';
Variable_name Value
gtid_binlog_pos 1111-1-2554
connection node_2;
# GTID in node2
show variables like 'wsrep_gtid_domain_id';
Variable_name Value
wsrep_gtid_domain_id 1111
show variables like '%gtid_binlog_pos%';
Variable_name Value
gtid_binlog_pos 1111-1-2554
connection node_3;
# GTID in node3
show variables like 'wsrep_gtid_domain_id';
Variable_name Value
wsrep_gtid_domain_id 1111
show variables like '%gtid_binlog_pos%';
Variable_name Value
gtid_binlog_pos 1111-1-2554
# One by one shutdown all nodes
connection node_3;
# shutdown node_3
connection node_2;
# wait until node_3 is out of cluster
# shutdown node_2
connection node_1;
# wait until node_2 is out of cluster
# shutdown node_1
# Bootstrap from node_1
connection node_1;
# restart: --wsrep_new_cluster
show variables like 'wsrep_gtid_domain_id';
Variable_name Value
wsrep_gtid_domain_id 1111
show variables like '%gtid_binlog_pos%';
Variable_name Value
gtid_binlog_pos 1111-1-2554
ANALYZE TABLE t2;
Table Op Msg_type Msg_text
test.t2 analyze status Engine-independent statistics collected
test.t2 analyze status OK
CALL insert_row('node1', 100);;
# Restart node_2
connection node_2;
# restart
connect node_1c, 127.0.0.1, root, , test, $NODE_MYPORT_1;
set wsrep_sync_wait=0;
connection node_1c;
# wait until node_1 and node_2 are in cluster
connection node_2;
ALTER TABLE t2 ADD COLUMN (k int);
CALL insert_row('node2', 100);;
# Restart node_3
connection node_3;
# restart
connection node_1c;
# wait until all nodes are back in cluster
after cluster restart
connection node_2;
connection node_1;
connection node_1;
node1 GTID
show variables like 'wsrep_gtid_domain_id';
Variable_name Value
wsrep_gtid_domain_id 1111
show variables like '%gtid_binlog_pos%';
Variable_name Value
gtid_binlog_pos 1111-1-2756
connection node_2;
node2 GTID
show variables like 'wsrep_gtid_domain_id';
Variable_name Value
wsrep_gtid_domain_id 1111
show variables like '%gtid_binlog_pos%';
Variable_name Value
gtid_binlog_pos 1111-1-2756
connection node_3;
node3 GTID
show variables like 'wsrep_gtid_domain_id';
Variable_name Value
wsrep_gtid_domain_id 1111
show variables like '%gtid_binlog_pos%';
Variable_name Value
gtid_binlog_pos 1111-1-2756
connection node_1;
table size in node1
SELECT COUNT(*) FROM t1;
COUNT(*)
2750
connection node_2;
table size in node2
SELECT COUNT(*) FROM t1;
COUNT(*)
2750
connection node_3;
table size in node3
SELECT COUNT(*) FROM t1;
COUNT(*)
2750
connection node_2;
call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node");
call mtr.add_suppression("WSREP: Sending JOIN failed:.*");
call mtr.add_suppression("Sending JOIN failed:.*");
call mtr.add_suppression("WSREP: Failed to JOIN the cluster after SST.*");
connection node_3;
call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node");
call mtr.add_suppression("WSREP: Sending JOIN failed:.*");
call mtr.add_suppression("Sending JOIN failed:.*");
call mtr.add_suppression("WSREP: Failed to JOIN the cluster after SST.*");
# cleanup
connection node_1;
DROP PROCEDURE insert_row;
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
connection node_3;
connection node_2;
disconnect node_3;
disconnect node_2b;
disconnect node_1b;
disconnect node_1c;

View File

@@ -1,22 +1,22 @@
connection node_2; connection node_2;
connection node_1; connection node_1;
call mtr.add_suppression("WSREP: Stray state UUID msg: .*"); connection node_1;
call mtr.add_suppression("WSREP: Protocol violation. JOIN message sender .*");
call mtr.add_suppression("WSREP: Sending JOIN failed: .*");
flush tables;
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
VARIABLE_VALUE VARIABLE_VALUE
4 3
connection node_1;
CREATE TABLE t1 (f1 INTEGER) ENGINE=INNODB; CREATE TABLE t1 (f1 INTEGER) ENGINE=INNODB;
connection node_2; connection node_2;
set global wsrep_sync_wait=15;
INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (1);
SELECT COUNT(*) AS EXPECT_1 FROM t1;
EXPECT_1
1
connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3; connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
connection node_3; connection node_3;
set global wsrep_sync_wait=15; SELECT COUNT(*) AS EXPECT_1 FROM t1;
SELECT COUNT(*) FROM t1; EXPECT_1
COUNT(*)
1 1
connection node_1; connection node_1;
SELECT COUNT(*) AS EXPECT_1 FROM t1;
EXPECT_1
1
DROP TABLE t1; DROP TABLE t1;

View File

@@ -4,11 +4,13 @@
# #
--source include/galera_cluster.inc --source include/galera_cluster.inc
--source include/have_innodb.inc --source include/galera_sst_method.inc
--source include/force_restart.inc
# #
# Initially wsrep gtid domain id is 100 # Initially wsrep gtid domain id is 100
# #
--connection node_1 --connection node_1
select @@wsrep_gtid_domain_id,@@wsrep_node_name; select @@wsrep_gtid_domain_id,@@wsrep_node_name;
@@ -26,6 +28,10 @@ select @@wsrep_gtid_domain_id,@@wsrep_node_name;
--connection node_3 --connection node_3
--source include/shutdown_mysqld.inc --source include/shutdown_mysqld.inc
--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 --connection node_2
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; --let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc --source include/wait_condition.inc
@@ -36,6 +42,7 @@ select @@wsrep_gtid_domain_id,@@wsrep_node_name;
--source include/wait_condition.inc --source include/wait_condition.inc
--source include/shutdown_mysqld.inc --source include/shutdown_mysqld.inc
--sleep 5
# #
# Bootstrap from node_1 and change wsrep_gtid_domain_id to 200 # Bootstrap from node_1 and change wsrep_gtid_domain_id to 200
@@ -45,12 +52,11 @@ select @@wsrep_gtid_domain_id,@@wsrep_node_name;
--source include/start_mysqld.inc --source include/start_mysqld.inc
show variables like 'wsrep_gtid_domain_id'; show variables like 'wsrep_gtid_domain_id';
# #
# Restart node_2, expect that wsrep_gtid_domain_id has changed to 200 # Restart node_2, expect that wsrep_gtid_domain_id has changed to 200
# #
--connection node_2 --connection node_2
--let $restart_parameters = --let $restart_parameters =
--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.2.expect --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
--source include/start_mysqld.inc --source include/start_mysqld.inc
show variables like 'wsrep_gtid_domain_id'; show variables like 'wsrep_gtid_domain_id';

View File

@@ -0,0 +1,35 @@
!include ../galera_3nodes.cnf
[mysqld.1]
wsrep-node-name="node1"
wsrep_gtid_domain_id=1111
gtid_domain_id=2
server_id=10999
wsrep_sst_auth="root:"
wsrep_sst_method=mariabackup
log_slave_updates=ON
log_bin=mariadb-bin-log
binlog-format=row
wsrep-gtid-mode=ON
[mysqld.2]
wsrep-node-name="node2"
wsrep_gtid_domain_id=1112
gtid_domain_id=3
wsrep_sst_auth="root:"
wsrep_sst_method=mariabackup
log_slave_updates=ON
log_bin=mariadb-bin-log
binlog-format=row
wsrep-gtid-mode=ON
[mysqld.3]
wsrep-node-name="node3"
wsrep_gtid_domain_id=1113
gtid_domain_id=4
wsrep_sst_auth="root:"
wsrep_sst_method=mariabackup
log_slave_updates=ON
log_bin=mariadb-bin-log
binlog-format=row
wsrep-gtid-mode=ON

View File

@@ -0,0 +1,346 @@
--source include/galera_cluster.inc
--source include/big_test.inc
--source include/force_restart.inc
#
# Testing gtid consistency in 3 node cluster when nodes drop
# and join back to cluster.
# The tests verify that wsrep_gtid_domain_id and gtid_binlog_pos
# remains same across the cluster
# In the configuration, nodes have different wsrep_gtid_domain_id
# but all nodes are supposed to receive effective domain id
# from the bootstrap node (node_1), and use it
#
--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3
--connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2
set wsrep_sync_wait=0;
--connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1
set wsrep_sync_wait=0;
--connection node_1
DELIMITER |;
CREATE PROCEDURE insert_row (IN node varchar(10), IN repeat_count int)
BEGIN
DECLARE current_num int;
SET current_num = 0;
WHILE current_num < repeat_count do
INSERT INTO t1(node, name) VALUES (node, UUID());
SET current_num = current_num + 1;
END WHILE;
END|
DELIMITER ;|
CREATE TABLE t1 (id bigint not null primary key auto_increment, node VARCHAR(10), name VARCHAR(64)) ENGINE=innodb;
#
# report initial gtid positions after table t1 is created
#
--echo # node_1
show variables like '%gtid_binlog_pos%';
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'
--source include/wait_condition.inc
--echo # node_2
show variables like '%gtid_binlog_pos%';
--connection node_3
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'
--source include/wait_condition.inc
--echo # node_3
show variables like '%gtid_binlog_pos%';
###########################################
# scenario: join node 2 by SST
##########################################
#
# start concurrent insert load and stop node2 while the load is on
#
--connection node_1
--send CALL insert_row('node1', 500);
--connection node_2
--send CALL insert_row('node2', 500);
--connection node_3
--send CALL insert_row('node3', 500);
#
# stop load to node 2 and shutdown the node, force SST
#
--connection node_2
--reap
--echo # Shutdown node_2, force SST
--connection node_2b
--source include/shutdown_mysqld.inc
--remove_file $MYSQLTEST_VARDIR/mysqld.2/data/grastate.dat
--echo # Wait until node_2 leaves cluster
--connection node_1b
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
#
# stop the remaining load to node 1 and 3
#
--connection node_1
--reap
--connection node_3
--reap
#
# some more inserts and DDL to nodes 1 and 3
# while node 2 is absent
#
--connection node_1
CALL insert_row('node1', 500);
--connection node_3
CALL insert_row('node3', 500);
CREATE TABLE t2(i int primary key) engine=innodb;
#
# restart node 2, should join by SST
#
--connection node_2
--echo # Restart node_2
--source include/start_mysqld.inc
--connection node_1b
--echo # Wait until node_2 is back in cluster
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
--echo # node2 has joined
#
# check gtid positions in all nodes
#
--echo # GTID in node1
show variables like 'wsrep_gtid_domain_id';
show variables like '%gtid_binlog_pos%';
--connection node_2
--echo # GTID in node2
show variables like 'wsrep_gtid_domain_id';
show variables like '%gtid_binlog_pos%';
--connection node_3
--echo # GTID in node3
show variables like 'wsrep_gtid_domain_id';
show variables like '%gtid_binlog_pos%';
###########################################
# scenario: join node 3 by IST
##########################################
--echo # Shutdown node_3
--connection node_3
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1';
--echo # Wait until node_3 leaves cluster
--connection node_1b
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
#
# do some inserts and DDL to node 1
# while node 3 is absent
#
--connection node_1
CALL insert_row('node1', 50);
CREATE TABLE t3(i int primary key) engine=innodb;
#
# remove isolation in node 3, should join by IST
#
--connection node_3
--echo # Rejoin node_3
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 0';
--connection node_1b
--echo # Wait until node_3 is back in cluster
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
--echo # node3 has joined
#
# check gtid positions in all nodes
#
--connection node_1
--echo # GTID in node1
show variables like 'wsrep_gtid_domain_id';
show variables like '%gtid_binlog_pos%';
--connection node_2
--echo # GTID in node2
show variables like 'wsrep_gtid_domain_id';
show variables like '%gtid_binlog_pos%';
--connection node_3
--echo # GTID in node3
show variables like 'wsrep_gtid_domain_id';
show variables like '%gtid_binlog_pos%';
###########################################
# scenario: restart full custer
##########################################
#
# stop all nodes, one by one
#
--echo # One by one shutdown all nodes
--connection node_3
--echo # shutdown node_3
--source include/shutdown_mysqld.inc
--remove_file $MYSQLTEST_VARDIR/mysqld.3/data/grastate.dat
--connection node_2
--echo # wait until node_3 is out of cluster
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
--echo # shutdown node_2
--source include/shutdown_mysqld.inc
--remove_file $MYSQLTEST_VARDIR/mysqld.2/data/grastate.dat
--connection node_1
--echo # wait until node_2 is out of cluster
--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
--echo # shutdown node_1
--source include/shutdown_mysqld.inc
#
# bootstap cluster in order node1 - node2 - node3
# send some inserts and DDL after each node started
#
--sleep 5
--echo # Bootstrap from node_1
--connection node_1
--let $restart_parameters = --wsrep_new_cluster
--source include/start_mysqld.inc
show variables like 'wsrep_gtid_domain_id';
show variables like '%gtid_binlog_pos%';
ANALYZE TABLE t2;
--send CALL insert_row('node1', 100);
--echo # Restart node_2
--connection node_2
--let $restart_parameters =
--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
--source include/start_mysqld.inc
#
# connection node_1b may not be functional anymore, after node was
# shutdown, open node_1c for controlling node 1 state
#
--connect node_1c, 127.0.0.1, root, , test, $NODE_MYPORT_1
set wsrep_sync_wait=0;
--connection node_1c
--echo # wait until node_1 and node_2 are in cluster
--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
ALTER TABLE t2 ADD COLUMN (k int);
--send CALL insert_row('node2', 100);
--echo # Restart node_3
--connection node_3
--let $restart_parameters =
--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.3.expect
--source include/start_mysqld.inc
--connection node_1c
--echo # wait until all nodes are back in cluster
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
--echo after cluster restart
# stop load for nodes 1 and 2
--connection node_2
--reap
--connection node_1
--reap
#
# check gtid positions in all nodes
#
--connection node_1
--echo node1 GTID
show variables like 'wsrep_gtid_domain_id';
show variables like '%gtid_binlog_pos%';
--connection node_2
--echo node2 GTID
show variables like 'wsrep_gtid_domain_id';
show variables like '%gtid_binlog_pos%';
--connection node_3
--echo node3 GTID
show variables like 'wsrep_gtid_domain_id';
show variables like '%gtid_binlog_pos%';
#
# check table size in all nodes
#
--connection node_1
--echo table size in node1
SELECT COUNT(*) FROM t1;
--connection node_2
--echo table size in node2
SELECT COUNT(*) FROM t1;
--connection node_3
--echo table size in node3
SELECT COUNT(*) FROM t1;
#
# cleanups
#
--connection node_2
call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node");
call mtr.add_suppression("WSREP: Sending JOIN failed:.*");
call mtr.add_suppression("Sending JOIN failed:.*");
call mtr.add_suppression("WSREP: Failed to JOIN the cluster after SST.*");
--connection node_3
call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node");
call mtr.add_suppression("WSREP: Sending JOIN failed:.*");
call mtr.add_suppression("Sending JOIN failed:.*");
call mtr.add_suppression("WSREP: Failed to JOIN the cluster after SST.*");
--echo # cleanup
--connection node_1
DROP PROCEDURE insert_row;
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
--connection node_3
--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'
--source include/wait_condition.inc
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'
--source include/wait_condition.inc
--disconnect node_3
--disconnect node_2b
--disconnect node_1b
--disconnect node_1c

View File

@@ -1,4 +1,4 @@
!include ../galera_4nodes.cnf !include ../galera_3nodes.cnf
[mysqld.2] [mysqld.2]
wsrep_node_address=127.0.0.1 wsrep_node_address=127.0.0.1
@@ -6,5 +6,3 @@ wsrep_node_address=127.0.0.1
[mysqld.3] [mysqld.3]
wsrep_node_address=localhost wsrep_node_address=localhost
[mysqld.4]
wsrep_node_address=lo

View File

@@ -6,27 +6,27 @@
--source include/galera_cluster.inc --source include/galera_cluster.inc
--source include/have_innodb.inc --source include/have_innodb.inc
call mtr.add_suppression("WSREP: Stray state UUID msg: .*"); --connection node_1
call mtr.add_suppression("WSREP: Protocol violation. JOIN message sender .*"); --let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
call mtr.add_suppression("WSREP: Sending JOIN failed: .*");
flush tables;
--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc --source include/wait_condition.inc
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--connection node_1
CREATE TABLE t1 (f1 INTEGER) ENGINE=INNODB; CREATE TABLE t1 (f1 INTEGER) ENGINE=INNODB;
--connection node_2 --connection node_2
set global wsrep_sync_wait=15; --let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
--source include/wait_condition.inc
INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (1);
SELECT COUNT(*) AS EXPECT_1 FROM t1;
--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 --connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3
--connection node_3 --connection node_3
set global wsrep_sync_wait=15; --let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
SELECT COUNT(*) FROM t1; --source include/wait_condition.inc
SELECT COUNT(*) AS EXPECT_1 FROM t1;
--connection node_1 --connection node_1
SELECT COUNT(*) AS EXPECT_1 FROM t1;
DROP TABLE t1; DROP TABLE t1;

View File

@@ -9,5 +9,3 @@
# Do not use any TAB characters for whitespace. # Do not use any TAB characters for whitespace.
# #
############################################################################## ##############################################################################
galera_sr_kill_slave_after_apply_rollback2 : MDEV-29892 Galera test failure on galera_sr_kill_slave_after_apply_rollback2

View File

@@ -1,5 +1,7 @@
--source include/galera_cluster.inc --source include/galera_cluster.inc
--disable_ps2_protocol
--connection node_2 --connection node_2
CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB;
@@ -45,3 +47,6 @@ CALL mtr.add_suppression("WSREP: failed to send SR rollback for ");
--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 --connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3
--connection node_3 --connection node_3
--source include/galera_wait_ready.inc --source include/galera_wait_ready.inc
--enable_ps2_protocol

View File

@@ -1,6 +1,7 @@
--source include/galera_cluster.inc --source include/galera_cluster.inc
--source include/have_innodb.inc --source include/have_innodb.inc
--disable_ps2_protocol
# #
# Test the effect of gmcast.isolate on master during an SR transaction # Test the effect of gmcast.isolate on master during an SR transaction
# #
@@ -133,3 +134,4 @@ CALL mtr.add_suppression("failed to send SR rollback for");
DROP TABLE t1; DROP TABLE t1;
--source ../galera/include/auto_increment_offset_restore.inc --source ../galera/include/auto_increment_offset_restore.inc
--enable_ps2_protocol

View File

@@ -11,6 +11,5 @@
############################################################################## ##############################################################################
GCF-1060 : MDEV-32160 GCF-1060 test failure due to wsrep MDL conflict GCF-1060 : MDEV-32160 GCF-1060 test failure due to wsrep MDL conflict
galera_sr_cc_master : MDEV-29882 Galera test failure on galera_sr_cc_master
# Links to below failures in MDEV-30172 # Links to below failures in MDEV-30172
MDEV-25718 : timeout related to wsrep_sync_wait and DEBUG_SYNC MDEV-25718 : timeout related to wsrep_sync_wait and DEBUG_SYNC

View File

@@ -13,12 +13,12 @@ INSERT INTO t1 VALUES (2);
INSERT INTO t1 VALUES (3); INSERT INTO t1 VALUES (3);
INSERT INTO t1 VALUES (4); INSERT INTO t1 VALUES (4);
INSERT INTO t1 VALUES (5); INSERT INTO t1 VALUES (5);
SELECT COUNT(*) FROM mysql.wsrep_streaming_log; SELECT COUNT(*) AS EXPECT_5 FROM mysql.wsrep_streaming_log;
COUNT(*) EXPECT_5
5 5
connection node_1; connection node_1;
SELECT COUNT(*) FROM mysql.wsrep_streaming_log; SELECT COUNT(*) AS EXPECT_5 FROM mysql.wsrep_streaming_log;
COUNT(*) EXPECT_5
5 5
connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2; connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2;
connection node_2a; connection node_2a;
@@ -29,8 +29,8 @@ connection node_2;
INSERT INTO t1 VALUES (6); INSERT INTO t1 VALUES (6);
ERROR HY000: Lost connection to server during query ERROR HY000: Lost connection to server during query
connection node_1; connection node_1;
SELECT COUNT(*) FROM mysql.wsrep_streaming_log; SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
COUNT(*) EXPECT_0
0 0
connection node_2a; connection node_2a;
connection node_1; connection node_1;
@@ -38,8 +38,8 @@ connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2;
connection node_2b; connection node_2b;
SELECT * FROM mysql.wsrep_streaming_log; SELECT * FROM mysql.wsrep_streaming_log;
node_uuid trx_id seqno flags frag node_uuid trx_id seqno flags frag
SELECT COUNT(*) FROM mysql.wsrep_streaming_log; SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
COUNT(*) EXPECT_0
0 0
SET AUTOCOMMIT=OFF; SET AUTOCOMMIT=OFF;
START TRANSACTION; START TRANSACTION;
@@ -49,18 +49,20 @@ INSERT INTO t1 VALUES (3);
INSERT INTO t1 VALUES (4); INSERT INTO t1 VALUES (4);
INSERT INTO t1 VALUES (5); INSERT INTO t1 VALUES (5);
COMMIT; COMMIT;
SELECT COUNT(*) FROM mysql.wsrep_streaming_log; SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
COUNT(*) EXPECT_0
0 0
connection node_1; connection node_1;
SELECT COUNT(*) FROM t1; SELECT COUNT(*) AS EXPECT_5 FROM t1;
COUNT(*) EXPECT_5
5 5
SELECT COUNT(*) FROM mysql.wsrep_streaming_log; SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
COUNT(*) EXPECT_0
0 0
DROP TABLE t1; DROP TABLE t1;
connection node_2b; connection node_2b;
CALL mtr.add_suppression("WSREP: Failed to replicate rollback fragment for"); CALL mtr.add_suppression("WSREP: Failed to replicate rollback fragment for");
disconnect node_2; disconnect node_2;
connect node_2, 127.0.0.1, root, , test, $NODE_MYPORT_2; connect node_2, 127.0.0.1, root, , test, $NODE_MYPORT_2;
disconnect node_2a;
disconnect node_2b;

View File

@@ -26,6 +26,7 @@ f1 f2
connection node_1c; connection node_1c;
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
INSERT INTO t1 VALUES (3, 'c'); INSERT INTO t1 VALUES (3, 'c');
connection node_1;
connection node_2; connection node_2;
SELECT * FROM t1; SELECT * FROM t1;
f1 f2 f1 f2
@@ -91,6 +92,7 @@ f1 f2
connection node_1c; connection node_1c;
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
INSERT INTO t1 VALUES (3, 'c'); INSERT INTO t1 VALUES (3, 'c');
connection node_1;
connection node_2; connection node_2;
SELECT * FROM t1; SELECT * FROM t1;
f1 f2 f1 f2
@@ -156,6 +158,7 @@ f1 f2
connection node_1c; connection node_1c;
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
INSERT INTO t1 VALUES (3, 'c'); INSERT INTO t1 VALUES (3, 'c');
connection node_1;
connection node_2; connection node_2;
SELECT * FROM t1; SELECT * FROM t1;
f1 f2 f1 f2
@@ -221,6 +224,7 @@ f1 f2
connection node_1c; connection node_1c;
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
INSERT INTO t1 VALUES (3, 'c'); INSERT INTO t1 VALUES (3, 'c');
connection node_1;
connection node_2; connection node_2;
SELECT * FROM t1; SELECT * FROM t1;
f1 f2 f1 f2
@@ -286,6 +290,7 @@ f1 f2
connection node_1c; connection node_1c;
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
INSERT INTO t1 VALUES (3, 'c'); INSERT INTO t1 VALUES (3, 'c');
connection node_1;
connection node_2; connection node_2;
SELECT * FROM t1; SELECT * FROM t1;
f1 f2 f1 f2
@@ -351,6 +356,7 @@ f1 f2
connection node_1c; connection node_1c;
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
INSERT INTO t1 VALUES (3, 'c'); INSERT INTO t1 VALUES (3, 'c');
connection node_1;
connection node_2; connection node_2;
SELECT * FROM t1; SELECT * FROM t1;
f1 f2 f1 f2
@@ -416,6 +422,7 @@ f1 f2
connection node_1c; connection node_1c;
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
INSERT INTO t1 VALUES (3, 'c'); INSERT INTO t1 VALUES (3, 'c');
connection node_1;
connection node_2; connection node_2;
SELECT * FROM t1; SELECT * FROM t1;
f1 f2 f1 f2
@@ -481,6 +488,7 @@ f1 f2
connection node_1c; connection node_1c;
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
INSERT INTO t1 VALUES (3, 'c'); INSERT INTO t1 VALUES (3, 'c');
connection node_1;
connection node_2; connection node_2;
SELECT * FROM t1; SELECT * FROM t1;
f1 f2 f1 f2
@@ -546,6 +554,7 @@ f1 f2
connection node_1c; connection node_1c;
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
INSERT INTO t1 VALUES (3, 'c'); INSERT INTO t1 VALUES (3, 'c');
connection node_1;
connection node_2; connection node_2;
SELECT * FROM t1; SELECT * FROM t1;
f1 f2 f1 f2
@@ -611,6 +620,7 @@ f1 f2
connection node_1c; connection node_1c;
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
INSERT INTO t1 VALUES (3, 'c'); INSERT INTO t1 VALUES (3, 'c');
connection node_1;
connection node_2; connection node_2;
SELECT * FROM t1; SELECT * FROM t1;
f1 f2 f1 f2
@@ -676,6 +686,7 @@ f1 f2
connection node_1c; connection node_1c;
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
INSERT INTO t1 VALUES (3, 'c'); INSERT INTO t1 VALUES (3, 'c');
connection node_1;
connection node_2; connection node_2;
SELECT * FROM t1; SELECT * FROM t1;
f1 f2 f1 f2
@@ -741,6 +752,7 @@ f1 f2
connection node_1c; connection node_1c;
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
INSERT INTO t1 VALUES (3, 'c'); INSERT INTO t1 VALUES (3, 'c');
connection node_1;
connection node_2; connection node_2;
SELECT * FROM t1; SELECT * FROM t1;
f1 f2 f1 f2
@@ -806,6 +818,7 @@ f1 f2
connection node_1c; connection node_1c;
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
INSERT INTO t1 VALUES (3, 'c'); INSERT INTO t1 VALUES (3, 'c');
connection node_1;
connection node_2; connection node_2;
SELECT * FROM t1; SELECT * FROM t1;
f1 f2 f1 f2
@@ -871,6 +884,7 @@ f1 f2
connection node_1c; connection node_1c;
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
INSERT INTO t1 VALUES (3, 'c'); INSERT INTO t1 VALUES (3, 'c');
connection node_1;
connection node_2; connection node_2;
SELECT * FROM t1; SELECT * FROM t1;
f1 f2 f1 f2
@@ -936,6 +950,7 @@ f1 f2
connection node_1c; connection node_1c;
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
INSERT INTO t1 VALUES (3, 'c'); INSERT INTO t1 VALUES (3, 'c');
connection node_1;
connection node_2; connection node_2;
SELECT * FROM t1; SELECT * FROM t1;
f1 f2 f1 f2
@@ -1001,6 +1016,7 @@ f1 f2
connection node_1c; connection node_1c;
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
INSERT INTO t1 VALUES (3, 'c'); INSERT INTO t1 VALUES (3, 'c');
connection node_1;
connection node_2; connection node_2;
SELECT * FROM t1; SELECT * FROM t1;
f1 f2 f1 f2

View File

@@ -32,10 +32,13 @@ INSERT INTO t1 VALUES (3);
INSERT INTO t1 VALUES (4); INSERT INTO t1 VALUES (4);
INSERT INTO t1 VALUES (5); INSERT INTO t1 VALUES (5);
SELECT COUNT(*) FROM mysql.wsrep_streaming_log; SELECT COUNT(*) AS EXPECT_5 FROM mysql.wsrep_streaming_log;
--connection node_1 --connection node_1
SELECT COUNT(*) FROM mysql.wsrep_streaming_log; --let $wait_condition = SELECT COUNT(*) = 5 FROM mysql.wsrep_streaming_log
--source include/wait_condition.inc
SELECT COUNT(*) AS EXPECT_5 FROM mysql.wsrep_streaming_log;
# #
# Trigger CC . The transaction is aborted and we expect the SR tables to be cleaned up # Trigger CC . The transaction is aborted and we expect the SR tables to be cleaned up
@@ -56,7 +59,9 @@ SET SESSION wsrep_sync_wait = DEFAULT;
INSERT INTO t1 VALUES (6); INSERT INTO t1 VALUES (6);
--connection node_1 --connection node_1
SELECT COUNT(*) FROM mysql.wsrep_streaming_log; --let $wait_condition = SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log
--source include/wait_condition.inc
SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
# Restore cluster # Restore cluster
@@ -73,8 +78,10 @@ SELECT COUNT(*) FROM mysql.wsrep_streaming_log;
--connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2 --connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2
--connection node_2b --connection node_2b
--source include/galera_wait_ready.inc --source include/galera_wait_ready.inc
--let $wait_condition = SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log
--source include/wait_condition.inc
SELECT * FROM mysql.wsrep_streaming_log; SELECT * FROM mysql.wsrep_streaming_log;
SELECT COUNT(*) FROM mysql.wsrep_streaming_log; SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
# Repeat transaction to confirm no locks are left from previous transaction # Repeat transaction to confirm no locks are left from previous transaction
@@ -87,11 +94,13 @@ INSERT INTO t1 VALUES (4);
INSERT INTO t1 VALUES (5); INSERT INTO t1 VALUES (5);
COMMIT; COMMIT;
SELECT COUNT(*) FROM mysql.wsrep_streaming_log; SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
--connection node_1 --connection node_1
SELECT COUNT(*) FROM t1; --let $wait_condition = SELECT COUNT(*) = 5 FROM t1
SELECT COUNT(*) FROM mysql.wsrep_streaming_log; --source include/wait_condition.inc
SELECT COUNT(*) AS EXPECT_5 FROM t1;
SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
DROP TABLE t1; DROP TABLE t1;
@@ -102,3 +111,6 @@ CALL mtr.add_suppression("WSREP: Failed to replicate rollback fragment for");
--connect node_2, 127.0.0.1, root, , test, $NODE_MYPORT_2 --connect node_2, 127.0.0.1, root, , test, $NODE_MYPORT_2
# Restore original auto_increment_offset values. # Restore original auto_increment_offset values.
--source ../galera/include/auto_increment_offset_restore.inc --source ../galera/include/auto_increment_offset_restore.inc
--disconnect node_2a
--disconnect node_2b

View File

@@ -6,6 +6,8 @@
--source include/have_innodb.inc --source include/have_innodb.inc
--source include/big_test.inc --source include/big_test.inc
--disable_ps2_protocol
CREATE TABLE ten (f1 INTEGER) ENGINE=InnoDB; CREATE TABLE ten (f1 INTEGER) ENGINE=InnoDB;
INSERT INTO ten VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); INSERT INTO ten VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
@@ -56,3 +58,4 @@ CALL mtr.add_suppression('InnoDB: Resizing redo log from');
CALL mtr.add_suppression('InnoDB: Starting to delete and rewrite log files'); CALL mtr.add_suppression('InnoDB: Starting to delete and rewrite log files');
CALL mtr.add_suppression('InnoDB: New log files created, LSN='); CALL mtr.add_suppression('InnoDB: New log files created, LSN=');
--enable_ps2_protocol

View File

@@ -6,6 +6,8 @@
--source include/have_innodb.inc --source include/have_innodb.inc
--source include/big_test.inc --source include/big_test.inc
--disable_ps2_protocol
CREATE TABLE ten (f1 INTEGER) ENGINE=InnoDB; CREATE TABLE ten (f1 INTEGER) ENGINE=InnoDB;
INSERT INTO ten VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); INSERT INTO ten VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
@@ -51,3 +53,5 @@ SELECT COUNT(*) = 0 FROM t1;
DROP TABLE ten; DROP TABLE ten;
DROP TABLE t1; DROP TABLE t1;
--enable_ps2_protocol

View File

@@ -46,6 +46,10 @@ SELECT * FROM t1;
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
--send INSERT INTO t1 VALUES (3, 'c') --send INSERT INTO t1 VALUES (3, 'c')
--connection node_1
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
--source include/wait_condition.inc
--connection node_2 --connection node_2
SELECT * FROM t1; SELECT * FROM t1;
@@ -54,7 +58,7 @@ SELECT * FROM t1;
--send UPDATE t1 SET f2 = 'a' WHERE f1 = 2 --send UPDATE t1 SET f2 = 'a' WHERE f1 = 2
--connection node_1 --connection node_1
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER != 'system user' AND STATE = 'Updating'; --let $wait_condition = SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
--source include/wait_condition.inc --source include/wait_condition.inc
# Will deadlock # Will deadlock

View File

@@ -1 +0,0 @@
doublewrite_debug : MDEV-33098 occasionally fails to start up InnoDB

View File

@@ -12,7 +12,7 @@ innodb_fil_make_page_dirty_debug 0
show variables like 'innodb_saved_page_number_debug'; show variables like 'innodb_saved_page_number_debug';
Variable_name Value Variable_name Value
innodb_saved_page_number_debug 0 innodb_saved_page_number_debug 0
create table t1 (f1 int primary key, f2 blob) engine=innodb; create table t1 (f1 int primary key, f2 blob) engine=innodb stats_persistent=0;
start transaction; start transaction;
insert into t1 values(1, repeat('#',12)); insert into t1 values(1, repeat('#',12));
insert into t1 values(2, repeat('+',12)); insert into t1 values(2, repeat('+',12));
@@ -23,7 +23,7 @@ commit work;
# Test Begin: Test if recovery works if 1st page and 2nd page # Test Begin: Test if recovery works if 1st page and 2nd page
# of system tablespace is full of zeroes. # of system tablespace is full of zeroes.
SET GLOBAL innodb_fast_shutdown = 0; SET GLOBAL innodb_fast_shutdown = 0;
# restart # restart: --debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0
begin; begin;
insert into t1 values (6, repeat('%', 400)); insert into t1 values (6, repeat('%', 400));
# Make the first page dirty for system tablespace # Make the first page dirty for system tablespace
@@ -33,6 +33,7 @@ set global innodb_fil_make_page_dirty_debug = 0;
set global innodb_saved_page_number_debug = 1; set global innodb_saved_page_number_debug = 1;
set global innodb_fil_make_page_dirty_debug = 0; set global innodb_fil_make_page_dirty_debug = 0;
set global innodb_buf_flush_list_now = 1; set global innodb_buf_flush_list_now = 1;
# Kill the server
# Make the 1st page (page_no=0) and 2nd page (page_no=1) # Make the 1st page (page_no=0) and 2nd page (page_no=1)
# of the system tablespace all zeroes. # of the system tablespace all zeroes.
# restart # restart
@@ -52,7 +53,7 @@ f1 f2
# --------------------------------------------------------------- # ---------------------------------------------------------------
# Test Begin: Test if recovery works if 1st page of # Test Begin: Test if recovery works if 1st page of
# system tablespace is corrupted and 2nd page as corrupted. # system tablespace is corrupted and 2nd page as corrupted.
set global innodb_log_checkpoint_now = 1; # restart: --debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0
begin; begin;
insert into t1 values (6, repeat('%', 400)); insert into t1 values (6, repeat('%', 400));
# Make the first page dirty for system tablespace # Make the first page dirty for system tablespace
@@ -62,6 +63,7 @@ set global innodb_fil_make_page_dirty_debug = 0;
set global innodb_saved_page_number_debug = 1; set global innodb_saved_page_number_debug = 1;
set global innodb_fil_make_page_dirty_debug = 0; set global innodb_fil_make_page_dirty_debug = 0;
set global innodb_buf_flush_list_now = 1; set global innodb_buf_flush_list_now = 1;
# Kill the server
# Corrupt the 1st page (page_no=0) and 2nd page of the system tablespace. # Corrupt the 1st page (page_no=0) and 2nd page of the system tablespace.
# restart # restart
FOUND 2 /InnoDB: Restoring page \[page id: space=0, page number=0\] of datafile/ in mysqld.1.err FOUND 2 /InnoDB: Restoring page \[page id: space=0, page number=0\] of datafile/ in mysqld.1.err
@@ -83,7 +85,7 @@ drop table t1;
# MDEV-12600 crash during install_db with innodb_page_size=32K # MDEV-12600 crash during install_db with innodb_page_size=32K
# and ibdata1=3M # and ibdata1=3M
# #
# restart: --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/doublewrite --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/doublewrite --innodb-data-file-path=ibdata1:1M;ibdata2:1M:autoextend # restart: --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/doublewrite --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/doublewrite --innodb-undo-tablespaces=0 --innodb-data-file-path=ibdata1:1M;ibdata2:1M:autoextend
SELECT * FROM INFORMATION_SCHEMA.ENGINES SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb' WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED'); AND support IN ('YES', 'DEFAULT', 'ENABLED');

View File

@@ -14,6 +14,7 @@ check table t1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 check Warning InnoDB: Index 'b' contains 990 entries, should be 1024. test.t1 check Warning InnoDB: Index 'b' contains 990 entries, should be 1024.
test.t1 check error Corrupt test.t1 check error Corrupt
SET GLOBAL innodb_buf_flush_list_now=ON;
# restart: --innodb-force_recovery=0 # restart: --innodb-force_recovery=0
SET GLOBAL innodb_fast_shutdown=0; SET GLOBAL innodb_fast_shutdown=0;
# restart: --innodb-force_recovery=0 # restart: --innodb-force_recovery=0

View File

@@ -28,7 +28,7 @@ show variables like 'innodb_doublewrite';
show variables like 'innodb_fil_make_page_dirty_debug'; show variables like 'innodb_fil_make_page_dirty_debug';
show variables like 'innodb_saved_page_number_debug'; show variables like 'innodb_saved_page_number_debug';
create table t1 (f1 int primary key, f2 blob) engine=innodb; create table t1 (f1 int primary key, f2 blob) engine=innodb stats_persistent=0;
start transaction; start transaction;
insert into t1 values(1, repeat('#',12)); insert into t1 values(1, repeat('#',12));
@@ -44,7 +44,9 @@ commit work;
# Slow shutdown and restart to make sure ibuf merge is finished # Slow shutdown and restart to make sure ibuf merge is finished
SET GLOBAL innodb_fast_shutdown = 0; SET GLOBAL innodb_fast_shutdown = 0;
let $shutdown_timeout=; let $shutdown_timeout=;
let $restart_parameters="--debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0";
--source include/restart_mysqld.inc --source include/restart_mysqld.inc
--source ../include/no_checkpoint_start.inc
begin; begin;
insert into t1 values (6, repeat('%', 400)); insert into t1 values (6, repeat('%', 400));
@@ -57,8 +59,20 @@ set global innodb_saved_page_number_debug = 1;
set global innodb_fil_make_page_dirty_debug = 0; set global innodb_fil_make_page_dirty_debug = 0;
set global innodb_buf_flush_list_now = 1; set global innodb_buf_flush_list_now = 1;
let $shutdown_timeout=0;
--source include/shutdown_mysqld.inc --let CLEANUP_IF_CHECKPOINT=drop table t1, unexpected_checkpoint;
# Occasionally, a checkpoint would occur on the MSAN builder.
# We do not know the reason, because the failure can only be reproduced if there is
# enough load in that environment.
# Therefore, we allow the test to be skipped when run on MSAN.
# In other environments, we want the test to fail if a checkpoint occurs,
# so that we would catch it if it starts to happen regularly.
if (`select count(*) from information_schema.system_variables where variable_name='have_sanitizer' and global_value like "MSAN%"`)
{
--let CLEANUP_IF_CHECKPOINT=drop table t1;
}
--source ../include/no_checkpoint_end.inc
--echo # Make the 1st page (page_no=0) and 2nd page (page_no=1) --echo # Make the 1st page (page_no=0) and 2nd page (page_no=1)
--echo # of the system tablespace all zeroes. --echo # of the system tablespace all zeroes.
@@ -74,6 +88,7 @@ print FILE chr(0) x ($ENV{'INNODB_PAGE_SIZE'});
close FILE; close FILE;
EOF EOF
let $restart_parameters=;
--source include/start_mysqld.inc --source include/start_mysqld.inc
let SEARCH_PATTERN=InnoDB: Restoring page \[page id: space=0, page number=0\] of datafile; let SEARCH_PATTERN=InnoDB: Restoring page \[page id: space=0, page number=0\] of datafile;
@@ -90,7 +105,9 @@ select f1, f2 from t1;
--echo # Test Begin: Test if recovery works if 1st page of --echo # Test Begin: Test if recovery works if 1st page of
--echo # system tablespace is corrupted and 2nd page as corrupted. --echo # system tablespace is corrupted and 2nd page as corrupted.
set global innodb_log_checkpoint_now = 1; let $restart_parameters="--debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0";
--source include/restart_mysqld.inc
--source ../include/no_checkpoint_start.inc
begin; begin;
insert into t1 values (6, repeat('%', 400)); insert into t1 values (6, repeat('%', 400));
@@ -103,8 +120,8 @@ set global innodb_saved_page_number_debug = 1;
set global innodb_fil_make_page_dirty_debug = 0; set global innodb_fil_make_page_dirty_debug = 0;
set global innodb_buf_flush_list_now = 1; set global innodb_buf_flush_list_now = 1;
let $shutdown_timeout=0;
--source include/shutdown_mysqld.inc --source ../include/no_checkpoint_end.inc
--echo # Corrupt the 1st page (page_no=0) and 2nd page of the system tablespace. --echo # Corrupt the 1st page (page_no=0) and 2nd page of the system tablespace.
perl; perl;
@@ -119,6 +136,7 @@ print FILE chr(0) x ($ENV{'INNODB_PAGE_SIZE'}/2);
close FILE; close FILE;
EOF EOF
let $restart_parameters=;
--source include/start_mysqld.inc --source include/start_mysqld.inc
let SEARCH_PATTERN=InnoDB: Restoring page \[page id: space=0, page number=0\] of datafile; let SEARCH_PATTERN=InnoDB: Restoring page \[page id: space=0, page number=0\] of datafile;
@@ -145,7 +163,7 @@ WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED'); AND support IN ('YES', 'DEFAULT', 'ENABLED');
--let $ibp=--innodb-log-group-home-dir=$bugdir --innodb-data-home-dir=$bugdir --let $ibp=--innodb-log-group-home-dir=$bugdir --innodb-data-home-dir=$bugdir
--let $ibd=$ibp --innodb-undo-tablespaces=0 --let $ibp=$ibp --innodb-undo-tablespaces=0
--let $ibp=$ibp --innodb-data-file-path=ibdata1:1M;ibdata2:1M:autoextend --let $ibp=$ibp --innodb-data-file-path=ibdata1:1M;ibdata2:1M:autoextend
--let $restart_parameters= $ibp --let $restart_parameters= $ibp

View File

@@ -74,6 +74,7 @@ EOF
--replace_regex /contains \d+ entries/contains 990 entries/ --replace_regex /contains \d+ entries/contains 990 entries/
check table t1; check table t1;
SET GLOBAL innodb_buf_flush_list_now=ON;
--source include/shutdown_mysqld.inc --source include/shutdown_mysqld.inc

View File

@@ -104,8 +104,10 @@ fi
DATA="$WSREP_SST_OPT_DATA" DATA="$WSREP_SST_OPT_DATA"
INFO_FILE='xtrabackup_galera_info' INFO_FILE='xtrabackup_galera_info'
DONOR_INFO_FILE='donor_galera_info'
IST_FILE='xtrabackup_ist' IST_FILE='xtrabackup_ist'
MAGIC_FILE="$DATA/$INFO_FILE" MAGIC_FILE="$DATA/$INFO_FILE"
DONOR_MAGIC_FILE="$DATA/$DONOR_INFO_FILE"
INNOAPPLYLOG="$DATA/mariabackup.prepare.log" INNOAPPLYLOG="$DATA/mariabackup.prepare.log"
INNOMOVELOG="$DATA/mariabackup.move.log" INNOMOVELOG="$DATA/mariabackup.move.log"
@@ -651,14 +653,14 @@ get_stream()
if [ "$WSREP_SST_OPT_ROLE" = 'joiner' ]; then if [ "$WSREP_SST_OPT_ROLE" = 'joiner' ]; then
strmcmd="'$STREAM_BIN' -x" strmcmd="'$STREAM_BIN' -x"
else else
strmcmd="'$STREAM_BIN' -c '$INFO_FILE'" strmcmd="'$STREAM_BIN' -c '$INFO_FILE' '$DONOR_INFO_FILE'"
fi fi
else else
sfmt='tar' sfmt='tar'
if [ "$WSREP_SST_OPT_ROLE" = 'joiner' ]; then if [ "$WSREP_SST_OPT_ROLE" = 'joiner' ]; then
strmcmd='tar xfi -' strmcmd='tar xfi -'
else else
strmcmd="tar cf - '$INFO_FILE'" strmcmd="tar cf - '$INFO_FILE' '$DONOR_INFO_FILE'"
fi fi
fi fi
wsrep_log_info "Streaming with $sfmt" wsrep_log_info "Streaming with $sfmt"
@@ -680,6 +682,7 @@ cleanup_at_exit()
if [ $estatus -ne 0 ]; then if [ $estatus -ne 0 ]; then
wsrep_log_error "Removing $MAGIC_FILE file due to signal" wsrep_log_error "Removing $MAGIC_FILE file due to signal"
[ -f "$MAGIC_FILE" ] && rm -f "$MAGIC_FILE" || : [ -f "$MAGIC_FILE" ] && rm -f "$MAGIC_FILE" || :
[ -f "$DONOR_MAGIC_FILE" ] && rm -f "$DONOR_MAGIC_FILE" || :
fi fi
if [ "$WSREP_SST_OPT_ROLE" = 'joiner' ]; then if [ "$WSREP_SST_OPT_ROLE" = 'joiner' ]; then
@@ -916,6 +919,7 @@ monitor_process()
} }
[ -f "$MAGIC_FILE" ] && rm -f "$MAGIC_FILE" [ -f "$MAGIC_FILE" ] && rm -f "$MAGIC_FILE"
[ -f "$DONOR_MAGIC_FILE" ] && rm -rf "$DONOR_MAGIC_FILE"
read_cnf read_cnf
setup_ports setup_ports
@@ -1048,7 +1052,7 @@ send_magic()
# Store donor's wsrep GTID (state ID) and wsrep_gtid_domain_id # Store donor's wsrep GTID (state ID) and wsrep_gtid_domain_id
# (separated by a space). # (separated by a space).
echo "$WSREP_SST_OPT_GTID $WSREP_SST_OPT_GTID_DOMAIN_ID" > "$MAGIC_FILE" echo "$WSREP_SST_OPT_GTID $WSREP_SST_OPT_GTID_DOMAIN_ID" > "$MAGIC_FILE"
echo "$WSREP_SST_OPT_GTID $WSREP_SST_OPT_GTID_DOMAIN_ID" > "$DONOR_MAGIC_FILE"
if [ -n "$WSREP_SST_OPT_REMOTE_PSWD" ]; then if [ -n "$WSREP_SST_OPT_REMOTE_PSWD" ]; then
# Let joiner know that we know its secret # Let joiner know that we know its secret
echo "$SECRET_TAG $WSREP_SST_OPT_REMOTE_PSWD" >> "$MAGIC_FILE" echo "$SECRET_TAG $WSREP_SST_OPT_REMOTE_PSWD" >> "$MAGIC_FILE"
@@ -1594,9 +1598,16 @@ else # joiner
exit 2 exit 2
fi fi
# use donor magic file, if present
# if IST was used, donor magic file was not created
# Remove special tags from the magic file, and from the output: # Remove special tags from the magic file, and from the output:
coords=$(head -n1 "$MAGIC_FILE") if [ -r "$DONOR_MAGIC_FILE" ]; then
wsrep_log_info "Galera co-ords from recovery: $coords" coords=$(head -n1 "$DONOR_MAGIC_FILE")
wsrep_log_info "Galera co-ords from donor: $coords"
else
coords=$(head -n1 "$MAGIC_FILE")
wsrep_log_info "Galera co-ords from recovery: $coords"
fi
echo "$coords" # Output : UUID:seqno wsrep_gtid_domain_id echo "$coords" # Output : UUID:seqno wsrep_gtid_domain_id
wsrep_log_info "Total time on joiner: $totime seconds" wsrep_log_info "Total time on joiner: $totime seconds"

View File

@@ -2799,11 +2799,11 @@ Item_sp::func_name_cstring(THD *thd, bool is_package_function) const
quoted `pkg` and `func` separately, so the entire result looks like: quoted `pkg` and `func` separately, so the entire result looks like:
`db`.`pkg`.`func` `db`.`pkg`.`func`
*/ */
Database_qualified_name tmp= Database_qualified_name::split(m_name->m_name); Identifier_chain2 tmp= Identifier_chain2::split(m_name->m_name);
DBUG_ASSERT(tmp.m_db.length); DBUG_ASSERT(tmp[0].length);
append_identifier(thd, &qname, &tmp.m_db); append_identifier(thd, &qname, &tmp[0]);
qname.append('.'); qname.append('.');
append_identifier(thd, &qname, &tmp.m_name); append_identifier(thd, &qname, &tmp[1]);
} }
else else
append_identifier(thd, &qname, &m_name->m_name); append_identifier(thd, &qname, &m_name->m_name);

View File

@@ -1483,6 +1483,23 @@ bool Item_in_optimizer::invisible_mode()
} }
bool Item_in_optimizer::walk(Item_processor processor,
bool walk_subquery,
void *arg)
{
bool res= FALSE;
if (args[1]->type() == Item::SUBSELECT_ITEM &&
((Item_subselect *)args[1])->substype() != Item_subselect::EXISTS_SUBS &&
!(((Item_subselect *)args[1])->substype() == Item_subselect::IN_SUBS &&
((Item_in_subselect *)args[1])->test_strategy(SUBS_IN_TO_EXISTS)))
res= args[0]->walk(processor, walk_subquery, arg);
if (!res)
res= args[1]->walk(processor, walk_subquery, arg);
return res || (this->*processor)(arg);
}
/** /**
Add an expression cache for this subquery if it is needed Add an expression cache for this subquery if it is needed

View File

@@ -428,6 +428,7 @@ public:
void fix_after_pullout(st_select_lex *new_parent, Item **ref, void fix_after_pullout(st_select_lex *new_parent, Item **ref,
bool merge) override; bool merge) override;
bool invisible_mode(); bool invisible_mode();
bool walk(Item_processor processor, bool walk_subquery, void *arg) override;
void reset_cache() { cache= NULL; } void reset_cache() { cache= NULL; }
void print(String *str, enum_query_type query_type) override; void print(String *str, enum_query_type query_type) override;
void restore_first_argument(); void restore_first_argument();

View File

@@ -12198,12 +12198,9 @@ void wsrep_register_binlog_handler(THD *thd, bool trx)
/* /*
Set an implicit savepoint in order to be able to truncate a trx-cache. Set an implicit savepoint in order to be able to truncate a trx-cache.
*/ */
if (cache_mngr->trx_cache.get_prev_position() == MY_OFF_T_UNDEF) my_off_t pos= 0;
{ binlog_trans_log_savepos(thd, &pos);
my_off_t pos= 0; cache_mngr->trx_cache.set_prev_position(pos);
binlog_trans_log_savepos(thd, &pos);
cache_mngr->trx_cache.set_prev_position(pos);
}
/* /*
Set callbacks in order to be able to call commmit or rollback. Set callbacks in order to be able to call commmit or rollback.

View File

@@ -395,9 +395,13 @@ extern "C" void wsrep_thd_set_PA_unsafe(THD *thd)
} }
} }
extern "C" uint32 wsrep_get_domain_id()
{
return wsrep_gtid_domain_id;
}
extern "C" my_bool wsrep_thd_is_local_transaction(const THD *thd) extern "C" my_bool wsrep_thd_is_local_transaction(const THD *thd)
{ {
return (wsrep_thd_is_local(thd) && return (wsrep_thd_is_local(thd) &&
thd->wsrep_cs().transaction().active()); thd->wsrep_cs().transaction().active());
} }

View File

@@ -195,7 +195,7 @@ sp_head *sp_cache_lookup(sp_cache **cp, const Database_qualified_name *name)
sp_cache *c= *cp; sp_cache *c= *cp;
if (! c) if (! c)
return NULL; return NULL;
return c->lookup(buf, name->make_qname(buf, sizeof(buf))); return c->lookup(buf, name->make_qname(buf, sizeof(buf), true));
} }
@@ -302,7 +302,7 @@ sp_cache::~sp_cache()
void void
sp_cache::init() sp_cache::init()
{ {
my_hash_init(key_memory_sp_cache, &m_hashtable, system_charset_info, 0, 0, 0, my_hash_init(key_memory_sp_cache, &m_hashtable, &my_charset_bin, 0, 0, 0,
hash_get_key_for_sp_head, hash_free_sp_head, 0); hash_get_key_for_sp_head, hash_free_sp_head, 0);
} }

View File

@@ -7837,6 +7837,66 @@ public:
}; };
class Identifier_chain2
{
LEX_CSTRING m_name[2];
public:
Identifier_chain2()
:m_name{Lex_cstring(), Lex_cstring()}
{ }
Identifier_chain2(const LEX_CSTRING &a, const LEX_CSTRING &b)
:m_name{a, b}
{ }
const LEX_CSTRING& operator [] (size_t i) const
{
return m_name[i];
}
static Identifier_chain2 split(const LEX_CSTRING &txt)
{
DBUG_ASSERT(txt.str[txt.length] == '\0'); // Expect 0-terminated input
const char *dot= strchr(txt.str, '.');
if (!dot)
return Identifier_chain2(Lex_cstring(), txt);
size_t length0= dot - txt.str;
Lex_cstring name0(txt.str, length0);
Lex_cstring name1(txt.str + length0 + 1, txt.length - length0 - 1);
return Identifier_chain2(name0, name1);
}
// Export as a qualified name string: 'db.name'
size_t make_qname(char *dst, size_t dstlen, bool casedn_part1) const
{
size_t res= my_snprintf(dst, dstlen, "%.*s.%.*s",
(int) m_name[0].length, m_name[0].str,
(int) m_name[1].length, m_name[1].str);
if (casedn_part1 && dstlen > m_name[0].length)
my_casedn_str(system_charset_info, dst + m_name[0].length + 1);
return res;
}
// Export as a qualified name string, allocate on mem_root.
LEX_CSTRING make_qname(MEM_ROOT *mem_root, bool casedn_part1) const
{
LEX_STRING dst;
/* format: [pkg + dot] + name + '\0' */
size_t dst_size= m_name[0].length + 1 /*dot*/ + m_name[1].length + 1/*\0*/;
if (unlikely(!(dst.str= (char*) alloc_root(mem_root, dst_size))))
return {NULL, 0};
if (!m_name[0].length)
{
DBUG_ASSERT(!casedn_part1); // Should not be called this way
dst.length= my_snprintf(dst.str, dst_size, "%.*s",
(int) m_name[1].length, m_name[1].str);
return {dst.str, dst.length};
}
dst.length= make_qname(dst.str, dst_size, casedn_part1);
return {dst.str, dst.length};
}
};
/** /**
This class resembles the SQL Standard schema qualified object name: This class resembles the SQL Standard schema qualified object name:
<schema qualified name> ::= [ <schema name> <period> ] <qualified identifier> <schema qualified name> ::= [ <schema name> <period> ] <qualified identifier>
@@ -7877,41 +7937,16 @@ public:
void copy(MEM_ROOT *mem_root, const LEX_CSTRING &db, void copy(MEM_ROOT *mem_root, const LEX_CSTRING &db,
const LEX_CSTRING &name); const LEX_CSTRING &name);
static Database_qualified_name split(const LEX_CSTRING &txt)
{
DBUG_ASSERT(txt.str[txt.length] == '\0'); // Expect 0-terminated input
const char *dot= strchr(txt.str, '.');
if (!dot)
return Database_qualified_name(NULL, 0, txt.str, txt.length);
size_t dblen= dot - txt.str;
Lex_cstring db(txt.str, dblen);
Lex_cstring name(txt.str + dblen + 1, txt.length - dblen - 1);
return Database_qualified_name(db, name);
}
// Export db and name as a qualified name string: 'db.name' // Export db and name as a qualified name string: 'db.name'
size_t make_qname(char *dst, size_t dstlen) const size_t make_qname(char *dst, size_t dstlen, bool casedn_name) const
{ {
return my_snprintf(dst, dstlen, "%.*s.%.*s", return Identifier_chain2(m_db, m_name).make_qname(dst, dstlen, casedn_name);
(int) m_db.length, m_db.str,
(int) m_name.length, m_name.str);
} }
// Export db and name as a qualified name string, allocate on mem_root. // Export db and name as a qualified name string, allocate on mem_root.
bool make_qname(MEM_ROOT *mem_root, LEX_CSTRING *dst) const LEX_CSTRING make_qname(MEM_ROOT *mem_root, bool casedn_name) const
{ {
const uint dot= !!m_db.length;
char *tmp;
/* format: [database + dot] + name + '\0' */
dst->length= m_db.length + dot + m_name.length;
if (unlikely(!(dst->str= tmp= (char*) alloc_root(mem_root,
dst->length + 1))))
return true;
snprintf(tmp, dst->length + 1, "%.*s%.*s%.*s",
(int) m_db.length, (m_db.length ? m_db.str : ""),
dot, ".",
(int) m_name.length, m_name.str);
DBUG_SLOW_ASSERT(ok_for_lower_case_names(m_db.str)); DBUG_SLOW_ASSERT(ok_for_lower_case_names(m_db.str));
return false; return Identifier_chain2(m_db, m_name).make_qname(mem_root, casedn_name);
} }
bool make_package_routine_name(MEM_ROOT *mem_root, bool make_package_routine_name(MEM_ROOT *mem_root,
@@ -7922,9 +7957,8 @@ public:
size_t length= package.length + 1 + routine.length + 1; size_t length= package.length + 1 + routine.length + 1;
if (unlikely(!(tmp= (char *) alloc_root(mem_root, length)))) if (unlikely(!(tmp= (char *) alloc_root(mem_root, length))))
return true; return true;
m_name.length= my_snprintf(tmp, length, "%.*s.%.*s", m_name.length= Identifier_chain2(package, routine).make_qname(tmp, length,
(int) package.length, package.str, false);
(int) routine.length, routine.str);
m_name.str= tmp; m_name.str= tmp;
return false; return false;
} }
@@ -7953,7 +7987,7 @@ public:
{ } { }
LEX_CSTRING lex_cstring() const override LEX_CSTRING lex_cstring() const override
{ {
size_t length= m_name->make_qname(err_buffer, sizeof(err_buffer)); size_t length= m_name->make_qname(err_buffer, sizeof(err_buffer), false);
return {err_buffer, length}; return {err_buffer, length};
} }
}; };

View File

@@ -7455,7 +7455,8 @@ sp_head *LEX::make_sp_head(THD *thd, const sp_name *name,
name->m_name); name->m_name);
else else
sp->init_sp_name(name); sp->init_sp_name(name);
sp->make_qname(sp->get_main_mem_root(), &sp->m_qname); if (!(sp->m_qname= sp->make_qname(sp->get_main_mem_root(), true)).str)
return NULL;
} }
sphead= sp; sphead= sp;
} }
@@ -9342,7 +9343,7 @@ bool LEX::call_statement_start(THD *thd,
const Lex_ident_sys_st *proc) const Lex_ident_sys_st *proc)
{ {
Database_qualified_name q_db_pkg(db, pkg); Database_qualified_name q_db_pkg(db, pkg);
Database_qualified_name q_pkg_proc(pkg, proc); Identifier_chain2 q_pkg_proc(*pkg, *proc);
sp_name *spname; sp_name *spname;
sql_command= SQLCOM_CALL; sql_command= SQLCOM_CALL;
@@ -9360,7 +9361,7 @@ bool LEX::call_statement_start(THD *thd,
// Concat `pkg` and `name` to `pkg.name` // Concat `pkg` and `name` to `pkg.name`
LEX_CSTRING pkg_dot_proc; LEX_CSTRING pkg_dot_proc;
if (q_pkg_proc.make_qname(thd->mem_root, &pkg_dot_proc) || if (!(pkg_dot_proc= q_pkg_proc.make_qname(thd->mem_root, false)).str ||
check_ident_length(&pkg_dot_proc) || check_ident_length(&pkg_dot_proc) ||
!(spname= new (thd->mem_root) sp_name(db, &pkg_dot_proc, true))) !(spname= new (thd->mem_root) sp_name(db, &pkg_dot_proc, true)))
return true; return true;
@@ -9426,7 +9427,8 @@ sp_package *LEX::create_package_start(THD *thd,
return NULL; return NULL;
pkg->reset_thd_mem_root(thd); pkg->reset_thd_mem_root(thd);
pkg->init(this); pkg->init(this);
pkg->make_qname(pkg->get_main_mem_root(), &pkg->m_qname); if (!(pkg->m_qname= pkg->make_qname(pkg->get_main_mem_root(), true)).str)
return NULL;
sphead= pkg; sphead= pkg;
return pkg; return pkg;
} }
@@ -9760,7 +9762,7 @@ Item *LEX::make_item_func_call_generic(THD *thd,
static Lex_cstring dot(".", 1); static Lex_cstring dot(".", 1);
Lex_ident_sys db(thd, cdb), pkg(thd, cpkg), func(thd, cfunc); Lex_ident_sys db(thd, cdb), pkg(thd, cpkg), func(thd, cfunc);
Database_qualified_name q_db_pkg(db, pkg); Database_qualified_name q_db_pkg(db, pkg);
Database_qualified_name q_pkg_func(pkg, func); Identifier_chain2 q_pkg_func(pkg, func);
sp_name *qname; sp_name *qname;
if (db.is_null() || pkg.is_null() || func.is_null()) if (db.is_null() || pkg.is_null() || func.is_null())
@@ -9777,7 +9779,7 @@ Item *LEX::make_item_func_call_generic(THD *thd,
// Concat `pkg` and `name` to `pkg.name` // Concat `pkg` and `name` to `pkg.name`
LEX_CSTRING pkg_dot_func; LEX_CSTRING pkg_dot_func;
if (q_pkg_func.make_qname(thd->mem_root, &pkg_dot_func) || if (!(pkg_dot_func= q_pkg_func.make_qname(thd->mem_root, false)).str ||
check_ident_length(&pkg_dot_func) || check_ident_length(&pkg_dot_func) ||
!(qname= new (thd->mem_root) sp_name(&db, &pkg_dot_func, true))) !(qname= new (thd->mem_root) sp_name(&db, &pkg_dot_func, true)))
return NULL; return NULL;

View File

@@ -183,7 +183,8 @@ static struct wsrep_service_st wsrep_handler = {
wsrep_report_bf_lock_wait, wsrep_report_bf_lock_wait,
wsrep_thd_kill_LOCK, wsrep_thd_kill_LOCK,
wsrep_thd_kill_UNLOCK, wsrep_thd_kill_UNLOCK,
wsrep_thd_set_PA_unsafe wsrep_thd_set_PA_unsafe,
wsrep_get_domain_id
}; };
static struct thd_specifics_service_st thd_specifics_handler= static struct thd_specifics_service_st thd_specifics_handler=

View File

@@ -167,3 +167,5 @@ void wsrep_report_bf_lock_wait(const THD*,
void wsrep_thd_set_PA_unsafe(THD*) void wsrep_thd_set_PA_unsafe(THD*)
{} {}
uint32 wsrep_get_domain_id()
{ return 0;}

View File

@@ -584,7 +584,8 @@ my_bool wsrep_ready_get (void)
return ret; return ret;
} }
int wsrep_show_ready(THD *thd, SHOW_VAR *var, char *buff) int wsrep_show_ready(THD *thd, SHOW_VAR *var, void *buff,
system_status_var *, enum_var_type)
{ {
var->type= SHOW_MY_BOOL; var->type= SHOW_MY_BOOL;
var->value= buff; var->value= buff;

View File

@@ -162,7 +162,8 @@ extern char* wsrep_cluster_capabilities;
int wsrep_show_status(THD *thd, SHOW_VAR *var, void *buff, int wsrep_show_status(THD *thd, SHOW_VAR *var, void *buff,
system_status_var *status_var, enum_var_type scope); system_status_var *status_var, enum_var_type scope);
int wsrep_show_ready(THD *thd, SHOW_VAR *var, char *buff); int wsrep_show_ready(THD *thd, SHOW_VAR *var, void *buff,
system_status_var *, enum_var_type);
void wsrep_free_status(THD *thd); void wsrep_free_status(THD *thd);
void wsrep_update_cluster_state_uuid(const char* str); void wsrep_update_cluster_state_uuid(const char* str);

View File

@@ -18,18 +18,6 @@
#include <mysql/plugin.h> #include <mysql/plugin.h>
static int wsrep_plugin_init(void *p)
{
WSREP_DEBUG("wsrep_plugin_init()");
return 0;
}
static int wsrep_plugin_deinit(void *p)
{
WSREP_DEBUG("wsrep_plugin_deinit()");
return 0;
}
struct Mysql_replication wsrep_plugin= { struct Mysql_replication wsrep_plugin= {
MYSQL_REPLICATION_INTERFACE_VERSION MYSQL_REPLICATION_INTERFACE_VERSION
}; };
@@ -42,8 +30,8 @@ maria_declare_plugin(wsrep)
"Codership Oy", "Codership Oy",
"Wsrep replication plugin", "Wsrep replication plugin",
PLUGIN_LICENSE_GPL, PLUGIN_LICENSE_GPL,
wsrep_plugin_init, NULL,
wsrep_plugin_deinit, NULL,
0x0100, 0x0100,
NULL, /* Status variables */ NULL, /* Status variables */
NULL, /* System variables */ NULL, /* System variables */

View File

@@ -732,7 +732,9 @@ static void* sst_joiner_thread (void* a)
{ {
proc.wait(); proc.wait();
// Read state ID (UUID:SEQNO) followed by wsrep_gtid_domain_id (if any). // Read state ID (UUID:SEQNO) followed by wsrep_gtid_domain_id (if any).
unsigned long int domain_id= wsrep_gtid_domain_id;
const char *pos= strchr(out, ' '); const char *pos= strchr(out, ' ');
WSREP_DEBUG("SST state ID tmp=%s out=%s pos=%p", tmp, out, pos);
if (!pos) { if (!pos) {
@@ -742,6 +744,13 @@ static void* sst_joiner_thread (void* a)
WSREP_WARN("Did not find domain ID from SST script output '%s'. " WSREP_WARN("Did not find domain ID from SST script output '%s'. "
"Domain ID must be set manually to keep binlog consistent", "Domain ID must be set manually to keep binlog consistent",
out); out);
if (wsrep_gtid_domain_id)
{
WSREP_INFO("This node is configured to use wsrep_gtid_domain_id=%lu by user.",
domain_id);
wsrep_gtid_server.domain_id= (uint32)domain_id;
wsrep_gtid_domain_id= (uint32)domain_id;
}
} }
err= sst_scan_uuid_seqno (out, &ret_uuid, &ret_seqno); err= sst_scan_uuid_seqno (out, &ret_uuid, &ret_seqno);
@@ -1769,6 +1778,8 @@ static int sst_flush_tables(THD* thd)
char content[100]; char content[100];
snprintf(content, sizeof(content), "%s:%lld %d\n", wsrep_cluster_state_uuid, snprintf(content, sizeof(content), "%s:%lld %d\n", wsrep_cluster_state_uuid,
(long long)wsrep_locked_seqno, wsrep_gtid_server.domain_id); (long long)wsrep_locked_seqno, wsrep_gtid_server.domain_id);
WSREP_DEBUG("sst_flush_tables : %s:%lld %d", wsrep_cluster_state_uuid,
(long long)wsrep_locked_seqno, wsrep_gtid_server.domain_id);
err= sst_create_file(flush_success, content); err= sst_create_file(flush_success, content);
if (err) if (err)

View File

@@ -36,7 +36,7 @@ static Wsrep_thd_queue* wsrep_rollback_queue= 0;
static Atomic_counter<uint64_t> wsrep_bf_aborts_counter; static Atomic_counter<uint64_t> wsrep_bf_aborts_counter;
int wsrep_show_bf_aborts (THD *thd, SHOW_VAR *var, char *buff, int wsrep_show_bf_aborts (THD *thd, SHOW_VAR *var, void *, system_status_var *,
enum enum_var_type scope) enum enum_var_type scope)
{ {
wsrep_local_bf_aborts= wsrep_bf_aborts_counter; wsrep_local_bf_aborts= wsrep_bf_aborts_counter;

View File

@@ -82,7 +82,7 @@ private:
mysql_cond_t COND_wsrep_thd_queue; mysql_cond_t COND_wsrep_thd_queue;
}; };
int wsrep_show_bf_aborts (THD *thd, SHOW_VAR *var, char *buff, int wsrep_show_bf_aborts (THD *thd, SHOW_VAR *var, void *, system_status_var *,
enum enum_var_type scope); enum enum_var_type scope);
bool wsrep_create_appliers(long threads, bool mutex_protected=false); bool wsrep_create_appliers(long threads, bool mutex_protected=false);
void wsrep_create_rollbacker(); void wsrep_create_rollbacker();

View File

@@ -69,6 +69,8 @@ static recalc_pool_t recalc_pool;
/** Whether the global data structures have been initialized */ /** Whether the global data structures have been initialized */
static bool stats_initialised; static bool stats_initialised;
static THD *dict_stats_thd;
/*****************************************************************//** /*****************************************************************//**
Free the resources occupied by the recalc pool, called once during Free the resources occupied by the recalc pool, called once during
thread de-initialization. */ thread de-initialization. */
@@ -90,6 +92,9 @@ static void dict_stats_recalc_pool_deinit()
defrag_pool_t defrag_empty_pool; defrag_pool_t defrag_empty_pool;
recalc_pool.swap(recalc_empty_pool); recalc_pool.swap(recalc_empty_pool);
defrag_pool.swap(defrag_empty_pool); defrag_pool.swap(defrag_empty_pool);
if (dict_stats_thd)
destroy_background_thd(dict_stats_thd);
} }
/*****************************************************************//** /*****************************************************************//**
@@ -379,7 +384,6 @@ static bool is_recalc_pool_empty()
} }
static tpool::timer* dict_stats_timer; static tpool::timer* dict_stats_timer;
static THD *dict_stats_thd;
static void dict_stats_func(void*) static void dict_stats_func(void*)
{ {
if (!dict_stats_thd) if (!dict_stats_thd)
@@ -419,10 +423,4 @@ void dict_stats_shutdown()
{ {
delete dict_stats_timer; delete dict_stats_timer;
dict_stats_timer= 0; dict_stats_timer= 0;
if (dict_stats_thd)
{
destroy_background_thd(dict_stats_thd);
dict_stats_thd= 0;
}
} }

View File

@@ -4033,11 +4033,6 @@ static int innodb_init_params()
} }
#endif #endif
if (srv_read_only_mode) {
ib::info() << "Started in read only mode";
srv_use_doublewrite_buf = FALSE;
}
#if !defined LINUX_NATIVE_AIO && !defined HAVE_URING && !defined _WIN32 #if !defined LINUX_NATIVE_AIO && !defined HAVE_URING && !defined _WIN32
/* Currently native AIO is supported only on windows and linux /* Currently native AIO is supported only on windows and linux
and that also when the support is compiled in. In all other and that also when the support is compiled in. In all other

View File

@@ -1122,10 +1122,14 @@ dberr_t srv_start(bool create_new_db)
if (srv_force_recovery) { if (srv_force_recovery) {
ib::info() << "!!! innodb_force_recovery is set to " ib::info() << "!!! innodb_force_recovery is set to "
<< srv_force_recovery << " !!!"; << srv_force_recovery << " !!!";
if (srv_force_recovery == SRV_FORCE_NO_LOG_REDO) {
srv_read_only_mode = true;
}
} }
if (srv_force_recovery == SRV_FORCE_NO_LOG_REDO) { if (srv_read_only_mode) {
srv_read_only_mode = true; sql_print_information("InnoDB: Started in read only mode");
srv_use_doublewrite_buf = false;
} }
high_level_read_only = srv_read_only_mode high_level_read_only = srv_read_only_mode

View File

@@ -1,4 +1,4 @@
SET(HEIDISQL_BASE_NAME "HeidiSQL_12.3_32_Portable") SET(HEIDISQL_BASE_NAME "HeidiSQL_12.6_32_Portable")
SET(HEIDISQL_ZIP "${HEIDISQL_BASE_NAME}.zip") SET(HEIDISQL_ZIP "${HEIDISQL_BASE_NAME}.zip")
SET(HEIDISQL_URL "http://www.heidisql.com/downloads/releases/${HEIDISQL_ZIP}") SET(HEIDISQL_URL "http://www.heidisql.com/downloads/releases/${HEIDISQL_ZIP}")
SET(HEIDISQL_DOWNLOAD_DIR ${THIRD_PARTY_DOWNLOAD_LOCATION}/${HEIDISQL_BASE_NAME}) SET(HEIDISQL_DOWNLOAD_DIR ${THIRD_PARTY_DOWNLOAD_LOCATION}/${HEIDISQL_BASE_NAME})

View File

@@ -68,6 +68,12 @@
<Component Id="component.HeidiSQL_gds32_14.1.dll" Guid="*" Win64="no"> <Component Id="component.HeidiSQL_gds32_14.1.dll" Guid="*" Win64="no">
<File Id="gds32_14.1.dll" Name="gds32-14.1.dll" Source="${HEIDISQL_DOWNLOAD_DIR}\gds32-14.1.dll" /> <File Id="gds32_14.1.dll" Name="gds32-14.1.dll" Source="${HEIDISQL_DOWNLOAD_DIR}\gds32-14.1.dll" />
</Component> </Component>
<Component Id="component.HeidiSQL_libeay32.dll" Guid="*" Win64="no">
<File Id="libeay32.dll" Name="libeay32.dll" Source="${HEIDISQL_DOWNLOAD_DIR}\libeay32.dll" />
</Component>
<Component Id="component.HeidiSQL_ssleay32.dll" Guid="*" Win64="no">
<File Id="ssleay32.dll" Name="ssleay32.dll" Source="${HEIDISQL_DOWNLOAD_DIR}\ssleay32.dll" />
</Component>
<Component Id="component.HeidiSQL_plink.exe" Guid="*" Win64="no"> <Component Id="component.HeidiSQL_plink.exe" Guid="*" Win64="no">
<File Id="plink.exe" Name="plink.exe" Source="${HEIDISQL_DOWNLOAD_DIR}\plink.exe" /> <File Id="plink.exe" Name="plink.exe" Source="${HEIDISQL_DOWNLOAD_DIR}\plink.exe" />
</Component> </Component>
@@ -115,6 +121,8 @@
<ComponentRef Id="component.HeidiSQL_libmysql_6.1.dll" /> <ComponentRef Id="component.HeidiSQL_libmysql_6.1.dll" />
<ComponentRef Id="component.HeidiSQL_fbclient_4.0.dll" /> <ComponentRef Id="component.HeidiSQL_fbclient_4.0.dll" />
<ComponentRef Id="component.HeidiSQL_gds32_14.1.dll" /> <ComponentRef Id="component.HeidiSQL_gds32_14.1.dll" />
<ComponentRef Id="component.HeidiSQL_libeay32.dll" />
<ComponentRef Id="component.HeidiSQL_ssleay32.dll" />
<ComponentRef Id="component.HeidiSQL_plink.exe" /> <ComponentRef Id="component.HeidiSQL_plink.exe" />
<ComponentRef Id="component.HeidiSQL_LICENSE_openssl" /> <ComponentRef Id="component.HeidiSQL_LICENSE_openssl" />
<?foreach db in $(var.functions_dblist) ?> <?foreach db in $(var.functions_dblist) ?>