Merge 10.5 into 10.6
This commit is contained in:
commit
1e1073b810
@ -1,4 +1,5 @@
|
|||||||
set global aria_encrypt_tables = 1;
|
SET @aria_encrypt= @@aria_encrypt_tables;
|
||||||
|
SET global aria_encrypt_tables=1;
|
||||||
create table t1 (i int, key(i)) engine=aria;
|
create table t1 (i int, key(i)) engine=aria;
|
||||||
insert into t1 values (1);
|
insert into t1 values (1);
|
||||||
drop table t1;
|
drop table t1;
|
||||||
@ -10,4 +11,17 @@ check table t1;
|
|||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t1 check status OK
|
test.t1 check status OK
|
||||||
drop table t1;
|
drop table t1;
|
||||||
set global aria_encrypt_tables = 0;
|
#
|
||||||
|
# MDEV CHECK on encrypted Aria table complains about "Wrong LSN"
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (f DATE PRIMARY KEY) ENGINE=Aria;
|
||||||
|
INSERT INTO t1 (f) VALUES ('1995-01-01'),('2000-01-01');
|
||||||
|
DELETE FROM t1 WHERE f = '2000-01-01';
|
||||||
|
OPTIMIZE TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 optimize status OK
|
||||||
|
CHECK TABLE t1 EXTENDED;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 check status OK
|
||||||
|
DROP TABLE t1;
|
||||||
|
set global aria_encrypt_tables=@aria_encrypt;
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
--source include/have_file_key_management_plugin.inc
|
--source include/have_file_key_management_plugin.inc
|
||||||
--source include/have_sequence.inc
|
--source include/have_sequence.inc
|
||||||
|
|
||||||
|
SET @aria_encrypt= @@aria_encrypt_tables;
|
||||||
|
SET global aria_encrypt_tables=1;
|
||||||
#
|
#
|
||||||
# MDEV-8022 Assertion `rc == 0' failed in ma_encrypt on dropping an encrypted Aria table
|
# MDEV-8022 Assertion `rc == 0' failed in ma_encrypt on dropping an encrypted Aria table
|
||||||
#
|
#
|
||||||
set global aria_encrypt_tables = 1;
|
|
||||||
create table t1 (i int, key(i)) engine=aria;
|
create table t1 (i int, key(i)) engine=aria;
|
||||||
insert into t1 values (1);
|
insert into t1 values (1);
|
||||||
drop table t1;
|
drop table t1;
|
||||||
@ -24,7 +26,18 @@ alter table t1 enable keys;
|
|||||||
check table t1;
|
check table t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV CHECK on encrypted Aria table complains about "Wrong LSN"
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (f DATE PRIMARY KEY) ENGINE=Aria;
|
||||||
|
INSERT INTO t1 (f) VALUES ('1995-01-01'),('2000-01-01');
|
||||||
|
DELETE FROM t1 WHERE f = '2000-01-01';
|
||||||
|
OPTIMIZE TABLE t1;
|
||||||
|
CHECK TABLE t1 EXTENDED;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
#
|
#
|
||||||
# Cleanup
|
# Cleanup
|
||||||
#
|
#
|
||||||
set global aria_encrypt_tables = 0;
|
set global aria_encrypt_tables=@aria_encrypt;
|
||||||
|
16
mysql-test/suite/galera/r/MDEV-22227.result
Normal file
16
mysql-test/suite/galera/r/MDEV-22227.result
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
connection node_2;
|
||||||
|
connection node_1;
|
||||||
|
CREATE TABLE t1 (a INT) ENGINE=MyISAM;
|
||||||
|
LOCK TABLE t1 WRITE CONCURRENT;
|
||||||
|
connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1;
|
||||||
|
connection node_1a;
|
||||||
|
SET lock_wait_timeout= 1;
|
||||||
|
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||||
|
connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1;
|
||||||
|
connection node_1b;
|
||||||
|
SET SESSION wsrep_sync_wait = 0;
|
||||||
|
connection node_1;
|
||||||
|
UNLOCK TABLES;
|
||||||
|
connection node_1a;
|
||||||
|
DROP VIEW v1;
|
||||||
|
DROP TABLE t1;
|
26
mysql-test/suite/galera/t/MDEV-22227.test
Normal file
26
mysql-test/suite/galera/t/MDEV-22227.test
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
--source include/galera_cluster.inc
|
||||||
|
--source include/have_log_bin.inc
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a INT) ENGINE=MyISAM;
|
||||||
|
LOCK TABLE t1 WRITE CONCURRENT;
|
||||||
|
|
||||||
|
--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1
|
||||||
|
--connection node_1a
|
||||||
|
# TOI operations will ignore lock_wait_timeout
|
||||||
|
SET lock_wait_timeout= 1;
|
||||||
|
--send CREATE VIEW v1 AS SELECT * FROM t1
|
||||||
|
|
||||||
|
--connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1
|
||||||
|
--connection node_1b
|
||||||
|
SET SESSION wsrep_sync_wait = 0;
|
||||||
|
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'Waiting for table level lock'
|
||||||
|
--source include/wait_condition.inc
|
||||||
|
|
||||||
|
--connection node_1
|
||||||
|
UNLOCK TABLES;
|
||||||
|
|
||||||
|
--connection node_1a
|
||||||
|
--reap
|
||||||
|
|
||||||
|
DROP VIEW v1;
|
||||||
|
DROP TABLE t1;
|
@ -1,6 +1,5 @@
|
|||||||
GCF-336 :
|
GCF-336 :
|
||||||
GCF-582 :
|
GCF-582 :
|
||||||
GCF-609 :
|
|
||||||
GCF-810A :
|
GCF-810A :
|
||||||
GCF-810B :
|
GCF-810B :
|
||||||
GCF-810C :
|
GCF-810C :
|
||||||
|
@ -1,20 +1,78 @@
|
|||||||
|
connection node_2;
|
||||||
|
connection node_1;
|
||||||
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB;
|
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB;
|
||||||
|
connection node_1;
|
||||||
SET SESSION wsrep_trx_fragment_size=1;
|
SET SESSION wsrep_trx_fragment_size=1;
|
||||||
SET AUTOCOMMIT=OFF;
|
SET AUTOCOMMIT=OFF;
|
||||||
START TRANSACTION;
|
START TRANSACTION;
|
||||||
INSERT INTO t1 VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
|
INSERT INTO t1 VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
|
||||||
|
connection node_2;
|
||||||
SET SESSION wsrep_trx_fragment_size=1;
|
SET SESSION wsrep_trx_fragment_size=1;
|
||||||
SET AUTOCOMMIT=OFF;
|
SET AUTOCOMMIT=OFF;
|
||||||
START TRANSACTION;
|
START TRANSACTION;
|
||||||
INSERT INTO t1 VALUES (11),(12),(13),(14),(15),(16),(17),(18),(19),(20);
|
INSERT INTO t1 VALUES (11),(12),(13),(14),(15),(16),(17),(18),(19),(20);
|
||||||
INSERT INTO t1 VALUES (11),(12),(13),(14),(15),(16),(17),(18),(19),(20);
|
INSERT INTO t1 VALUES (11),(12),(13),(14),(15),(16),(17),(18),(19),(20);
|
||||||
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
|
ERROR 23000: Duplicate entry '11' for key 'PRIMARY'
|
||||||
INSERT INTO t1 VALUES (31),(32),(33);
|
INSERT INTO t1 VALUES (31),(32),(33);
|
||||||
SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log;
|
SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log;
|
||||||
COUNT(*) = 0
|
COUNT(*) = 0
|
||||||
0
|
0
|
||||||
|
connection node_1;
|
||||||
SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log;
|
SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log;
|
||||||
COUNT(*) = 0
|
COUNT(*) = 0
|
||||||
0
|
0
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
connection node_2;
|
||||||
|
COMMIT;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
f1
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
10
|
||||||
|
11
|
||||||
|
12
|
||||||
|
13
|
||||||
|
14
|
||||||
|
15
|
||||||
|
16
|
||||||
|
17
|
||||||
|
18
|
||||||
|
19
|
||||||
|
20
|
||||||
|
31
|
||||||
|
32
|
||||||
|
33
|
||||||
|
connection node_1;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
f1
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
10
|
||||||
|
11
|
||||||
|
12
|
||||||
|
13
|
||||||
|
14
|
||||||
|
15
|
||||||
|
16
|
||||||
|
17
|
||||||
|
18
|
||||||
|
19
|
||||||
|
20
|
||||||
|
31
|
||||||
|
32
|
||||||
|
33
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
@ -17,7 +17,7 @@ SET SESSION wsrep_trx_fragment_size=1;
|
|||||||
SET AUTOCOMMIT=OFF;
|
SET AUTOCOMMIT=OFF;
|
||||||
START TRANSACTION;
|
START TRANSACTION;
|
||||||
INSERT INTO t1 VALUES (11),(12),(13),(14),(15),(16),(17),(18),(19),(20);
|
INSERT INTO t1 VALUES (11),(12),(13),(14),(15),(16),(17),(18),(19),(20);
|
||||||
--error ER_LOCK_DEADLOCK
|
--error ER_DUP_ENTRY
|
||||||
INSERT INTO t1 VALUES (11),(12),(13),(14),(15),(16),(17),(18),(19),(20);
|
INSERT INTO t1 VALUES (11),(12),(13),(14),(15),(16),(17),(18),(19),(20);
|
||||||
INSERT INTO t1 VALUES (31),(32),(33);
|
INSERT INTO t1 VALUES (31),(32),(33);
|
||||||
|
|
||||||
@ -27,4 +27,11 @@ SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log;
|
|||||||
SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log;
|
SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log;
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
|
--connection node_2
|
||||||
|
COMMIT;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
|
||||||
|
--connection node_1
|
||||||
|
SELECT * FROM t1;
|
||||||
|
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
@ -1,18 +1,38 @@
|
|||||||
connection node_2;
|
connection node_2;
|
||||||
connection node_1;
|
connection node_1;
|
||||||
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY AUTO_INCREMENT, f2 CHAR(10)) ENGINE=InnoDB;
|
|
||||||
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_1;
|
connection node_1;
|
||||||
SET SESSION wsrep_trx_fragment_size = 1;
|
SET SESSION wsrep_trx_fragment_size = 1;
|
||||||
|
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY);
|
||||||
|
CREATE TABLE t2 (f1 INTEGER PRIMARY KEY);
|
||||||
|
INSERT INTO t2 VALUES (1),(2),(3);
|
||||||
|
ALTER TABLE t2 DROP PRIMARY KEY;
|
||||||
|
INSERT INTO t2 VALUES (1);
|
||||||
|
SET SESSION wsrep_trx_fragment_size = 1;
|
||||||
|
START TRANSACTION;
|
||||||
|
INSERT INTO t1 SELECT * FROM t2;
|
||||||
|
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
|
||||||
|
SELECT * FROM t1;
|
||||||
|
f1
|
||||||
|
connection node_2;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
f1
|
||||||
|
connection node_1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP TABLE t2;
|
||||||
|
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY AUTO_INCREMENT, f2 CHAR(10)) ENGINE=InnoDB;
|
||||||
|
connection node_1;
|
||||||
|
SET SESSION wsrep_trx_fragment_size = 1;
|
||||||
START TRANSACTION;
|
START TRANSACTION;
|
||||||
INSERT INTO t1 VALUES (1, 'node1');
|
INSERT INTO t1 VALUES (1, 'node1');
|
||||||
connection node_1a;
|
connection node_1a;
|
||||||
INSERT INTO t1 VALUES (5, 'node2');
|
INSERT INTO t1 VALUES (5, 'node2');
|
||||||
connection node_1;
|
connection node_1;
|
||||||
INSERT INTO t1 VALUES (5, 'node1');
|
INSERT INTO t1 VALUES (5, 'node1');
|
||||||
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
|
ERROR 23000: Duplicate entry '5' for key 'PRIMARY'
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
f1 f2
|
f1 f2
|
||||||
|
1 node1
|
||||||
5 node2
|
5 node2
|
||||||
SET SESSION wsrep_trx_fragment_size = 10000;
|
SET SESSION wsrep_trx_fragment_size = 10000;
|
||||||
START TRANSACTION;
|
START TRANSACTION;
|
||||||
@ -24,6 +44,7 @@ INSERT INTO t1 VALUES(15, 'node2');
|
|||||||
connection node_1;
|
connection node_1;
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
f1 f2
|
f1 f2
|
||||||
|
1 node1
|
||||||
5 node2
|
5 node2
|
||||||
10 node1
|
10 node1
|
||||||
INSERT INTO t1 VALUES(15, 'node1');
|
INSERT INTO t1 VALUES(15, 'node1');
|
||||||
@ -31,6 +52,7 @@ ERROR 23000: Duplicate entry '15' for key 'PRIMARY'
|
|||||||
COMMIT;
|
COMMIT;
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
f1 f2
|
f1 f2
|
||||||
|
1 node1
|
||||||
5 node2
|
5 node2
|
||||||
10 node1
|
10 node1
|
||||||
15 node2
|
15 node2
|
||||||
|
@ -13,7 +13,7 @@ INSERT INTO t1 VALUES (REPEAT('e', 512));
|
|||||||
INSERT INTO t1 VALUES (REPEAT('f', 512));
|
INSERT INTO t1 VALUES (REPEAT('f', 512));
|
||||||
connection node_2;
|
connection node_2;
|
||||||
connection node_1;
|
connection node_1;
|
||||||
INSERT INTO t1 VALUES (REPEAT('c', 512));
|
INSERT INTO t1 VALUES (REPEAT('g', 1024)),(REPEAT('c', 512));
|
||||||
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
|
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
|
||||||
connection node_1;
|
connection node_1;
|
||||||
SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log;
|
SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log;
|
||||||
|
15
mysql-test/suite/galera_sr/r/mysql-wsrep-bugs-900.result
Normal file
15
mysql-test/suite/galera_sr/r/mysql-wsrep-bugs-900.result
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
connection node_2;
|
||||||
|
connection node_1;
|
||||||
|
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY);
|
||||||
|
SET SESSION wsrep_trx_fragment_size=1;
|
||||||
|
START TRANSACTION;
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
SET SESSION wsrep_cluster_name = ' ';
|
||||||
|
ERROR HY000: Variable 'wsrep_cluster_name' is a GLOBAL variable and should be set with SET GLOBAL
|
||||||
|
INSERT INTO t1 VALUES (2);
|
||||||
|
COMMIT;
|
||||||
|
SELECT f1 AS expect_1_and_2 FROM t1;
|
||||||
|
expect_1_and_2
|
||||||
|
1
|
||||||
|
2
|
||||||
|
DROP TABLE t1;
|
@ -1,15 +1,43 @@
|
|||||||
--source include/galera_cluster.inc
|
--source include/galera_cluster.inc
|
||||||
--source include/have_innodb.inc
|
--source include/have_innodb.inc
|
||||||
|
|
||||||
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY AUTO_INCREMENT, f2 CHAR(10)) ENGINE=InnoDB;
|
|
||||||
|
|
||||||
--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1
|
--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1
|
||||||
|
|
||||||
#
|
#
|
||||||
# Test 1: statement rollback is not safe
|
# Test 1: statement rollback is not safe.
|
||||||
# (some fragments were already replicated)
|
# Statement has already replicated some fragments
|
||||||
#
|
#
|
||||||
|
--connection node_1
|
||||||
|
SET SESSION wsrep_trx_fragment_size = 1;
|
||||||
|
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY);
|
||||||
|
CREATE TABLE t2 (f1 INTEGER PRIMARY KEY);
|
||||||
|
INSERT INTO t2 VALUES (1),(2),(3);
|
||||||
|
ALTER TABLE t2 DROP PRIMARY KEY;
|
||||||
|
INSERT INTO t2 VALUES (1);
|
||||||
|
|
||||||
|
SET SESSION wsrep_trx_fragment_size = 1;
|
||||||
|
START TRANSACTION;
|
||||||
|
|
||||||
|
# The following INSERT .. SELECT inserts a duplicate key,
|
||||||
|
# ER_LOCK_DEADLOCK is the only possible outcome at this point.
|
||||||
|
# Notice that ER_DUP_ENTRY is NOT an option here because we were
|
||||||
|
# forced to rollback the whole transaction (not just the statement)
|
||||||
|
--error ER_LOCK_DEADLOCK
|
||||||
|
INSERT INTO t1 SELECT * FROM t2;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
|
||||||
|
--connection node_2
|
||||||
|
SELECT * FROM t1;
|
||||||
|
|
||||||
|
--connection node_1
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP TABLE t2;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Test 2: statement rollback is safe.
|
||||||
|
# Fragments were already replicated, not in the same statement
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY AUTO_INCREMENT, f2 CHAR(10)) ENGINE=InnoDB;
|
||||||
--connection node_1
|
--connection node_1
|
||||||
SET SESSION wsrep_trx_fragment_size = 1;
|
SET SESSION wsrep_trx_fragment_size = 1;
|
||||||
START TRANSACTION;
|
START TRANSACTION;
|
||||||
@ -19,20 +47,16 @@ INSERT INTO t1 VALUES (1, 'node1');
|
|||||||
INSERT INTO t1 VALUES (5, 'node2');
|
INSERT INTO t1 VALUES (5, 'node2');
|
||||||
|
|
||||||
--connection node_1
|
--connection node_1
|
||||||
# If we try to INSERT a duplicate key, ER_LOCK_DEADLOCK is the only possible
|
# Only the statement is rolled back, expect ER_DUP_ENTRY
|
||||||
# outcome at this point. Notice that ER_DUP_ENTRY is NOT an option here
|
--error ER_DUP_ENTRY
|
||||||
# because we were forced to rollback the whole transaction (not just the
|
|
||||||
# statement)
|
|
||||||
--error ER_LOCK_DEADLOCK
|
|
||||||
INSERT INTO t1 VALUES (5, 'node1');
|
INSERT INTO t1 VALUES (5, 'node1');
|
||||||
|
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
|
|
||||||
#
|
#
|
||||||
# Test 2: statement rollback is safe
|
# Test 3: statement rollback is safe
|
||||||
# (no fragments have been replicated)
|
# No fragments have been replicated
|
||||||
#
|
#
|
||||||
|
|
||||||
SET SESSION wsrep_trx_fragment_size = 10000;
|
SET SESSION wsrep_trx_fragment_size = 10000;
|
||||||
|
|
||||||
START TRANSACTION;
|
START TRANSACTION;
|
||||||
|
@ -22,12 +22,13 @@ INSERT INTO t1 VALUES (REPEAT('f', 512));
|
|||||||
--let $wait_condition = SELECT COUNT(*) > 0 FROM mysql.wsrep_streaming_log;
|
--let $wait_condition = SELECT COUNT(*) > 0 FROM mysql.wsrep_streaming_log;
|
||||||
|
|
||||||
--connection node_1
|
--connection node_1
|
||||||
# Deadlock error instead of dupkey since the transaction is SR and
|
# Deadlock error instead of dupkey since the transaction is SR,
|
||||||
# statement rollback is not safe.
|
# and the statement has already replicated a fragment (which
|
||||||
|
# makes statement rollback unsafe).
|
||||||
--error ER_LOCK_DEADLOCK
|
--error ER_LOCK_DEADLOCK
|
||||||
INSERT INTO t1 VALUES (REPEAT('c', 512));
|
INSERT INTO t1 VALUES (REPEAT('g', 1024)),(REPEAT('c', 512));
|
||||||
|
|
||||||
# Confirm that the wsrep_streaming_log table is now empty, as it was a full transaction rollback
|
# Confirm that the wsrep_schema table is now empty, as it was a full transaction rollback
|
||||||
|
|
||||||
--connection node_1
|
--connection node_1
|
||||||
SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log;
|
SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log;
|
||||||
|
22
mysql-test/suite/galera_sr/t/mysql-wsrep-bugs-900.test
Normal file
22
mysql-test/suite/galera_sr/t/mysql-wsrep-bugs-900.test
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#
|
||||||
|
# Statement with no side effects causes unnecessary full rollback
|
||||||
|
#
|
||||||
|
|
||||||
|
--source include/galera_cluster.inc
|
||||||
|
|
||||||
|
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY);
|
||||||
|
SET SESSION wsrep_trx_fragment_size=1;
|
||||||
|
START TRANSACTION;
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
# Let's cause some bogus error with a statement that
|
||||||
|
# does not cause any replication event.
|
||||||
|
# The following used to return error ER_LOCK_DEADLOCK
|
||||||
|
# and cause the entire transaction to be rolled back.
|
||||||
|
--error ER_GLOBAL_VARIABLE
|
||||||
|
SET SESSION wsrep_cluster_name = ' ';
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES (2);
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
SELECT f1 AS expect_1_and_2 FROM t1;
|
||||||
|
DROP TABLE t1;
|
@ -2890,3 +2890,30 @@ SELECT COUNT(*) FROM t1;
|
|||||||
COUNT(*)
|
COUNT(*)
|
||||||
16
|
16
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# MDEV-25630 Rollback of instant operation adds wrong
|
||||||
|
# column to secondary index
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (f1 INT, f2 INT, f3 INT, f4 INT,
|
||||||
|
PRIMARY KEY(f1, f4),
|
||||||
|
KEY(f2))ENGINE=InnoDB;
|
||||||
|
CREATE TABLE t2 (f1 INT, f2 INT, PRIMARY KEY(f1),
|
||||||
|
FOREIGN KEY fk (f2) REFERENCES t2(f1)
|
||||||
|
)ENGINE=InnoDB;
|
||||||
|
ALTER TABLE t1 ADD f5 INT;
|
||||||
|
SET FOREIGN_KEY_CHECKS=0;
|
||||||
|
ALTER TABLE t1 DROP COLUMN f3, ADD FOREIGN KEY fk (f1)
|
||||||
|
REFERENCES x(x);
|
||||||
|
ERROR HY000: Failed to add the foreign key constraint 'test/fk' to system tables
|
||||||
|
ALTER TABLE t1 DROP COLUMN f5;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`f1` int(11) NOT NULL,
|
||||||
|
`f2` int(11) DEFAULT NULL,
|
||||||
|
`f3` int(11) DEFAULT NULL,
|
||||||
|
`f4` int(11) NOT NULL,
|
||||||
|
PRIMARY KEY (`f1`,`f4`),
|
||||||
|
KEY `f2` (`f2`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
@ -929,3 +929,23 @@ INSERT INTO t1(a, b) SELECT '', '' FROM seq_1_to_16;
|
|||||||
SELECT COUNT(*) FROM t1;
|
SELECT COUNT(*) FROM t1;
|
||||||
# Cleanup
|
# Cleanup
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-25630 Rollback of instant operation adds wrong
|
||||||
|
--echo # column to secondary index
|
||||||
|
--echo #
|
||||||
|
CREATE TABLE t1 (f1 INT, f2 INT, f3 INT, f4 INT,
|
||||||
|
PRIMARY KEY(f1, f4),
|
||||||
|
KEY(f2))ENGINE=InnoDB;
|
||||||
|
CREATE TABLE t2 (f1 INT, f2 INT, PRIMARY KEY(f1),
|
||||||
|
FOREIGN KEY fk (f2) REFERENCES t2(f1)
|
||||||
|
)ENGINE=InnoDB;
|
||||||
|
|
||||||
|
ALTER TABLE t1 ADD f5 INT;
|
||||||
|
SET FOREIGN_KEY_CHECKS=0;
|
||||||
|
--error ER_FK_FAIL_ADD_SYSTEM
|
||||||
|
ALTER TABLE t1 DROP COLUMN f3, ADD FOREIGN KEY fk (f1)
|
||||||
|
REFERENCES x(x);
|
||||||
|
ALTER TABLE t1 DROP COLUMN f5;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
@ -166,10 +166,10 @@ wsrep_thread_count 2
|
|||||||
# variables
|
# variables
|
||||||
SELECT COUNT(*) AS EXPECT_49 FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME LIKE "wsrep%";
|
SELECT COUNT(*) AS EXPECT_49 FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME LIKE "wsrep%";
|
||||||
EXPECT_49
|
EXPECT_49
|
||||||
49
|
52
|
||||||
SELECT COUNT(*) AS EXPECT_49 FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE "wsrep%";
|
SELECT COUNT(*) AS EXPECT_49 FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE "wsrep%";
|
||||||
EXPECT_49
|
EXPECT_49
|
||||||
49
|
51
|
||||||
SELECT VARIABLE_NAME FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME LIKE "wsrep%" ORDER BY VARIABLE_NAME;
|
SELECT VARIABLE_NAME FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME LIKE "wsrep%" ORDER BY VARIABLE_NAME;
|
||||||
VARIABLE_NAME
|
VARIABLE_NAME
|
||||||
WSREP_AUTO_INCREMENT_CONTROL
|
WSREP_AUTO_INCREMENT_CONTROL
|
||||||
@ -188,11 +188,13 @@ WSREP_DRUPAL_282555_WORKAROUND
|
|||||||
WSREP_FORCED_BINLOG_FORMAT
|
WSREP_FORCED_BINLOG_FORMAT
|
||||||
WSREP_GTID_DOMAIN_ID
|
WSREP_GTID_DOMAIN_ID
|
||||||
WSREP_GTID_MODE
|
WSREP_GTID_MODE
|
||||||
|
WSREP_GTID_SEQ_NO
|
||||||
WSREP_IGNORE_APPLY_ERRORS
|
WSREP_IGNORE_APPLY_ERRORS
|
||||||
WSREP_LOAD_DATA_SPLITTING
|
WSREP_LOAD_DATA_SPLITTING
|
||||||
WSREP_LOG_CONFLICTS
|
WSREP_LOG_CONFLICTS
|
||||||
WSREP_MAX_WS_ROWS
|
WSREP_MAX_WS_ROWS
|
||||||
WSREP_MAX_WS_SIZE
|
WSREP_MAX_WS_SIZE
|
||||||
|
WSREP_MODE
|
||||||
WSREP_MYSQL_REPLICATION_BUNDLE
|
WSREP_MYSQL_REPLICATION_BUNDLE
|
||||||
WSREP_NODE_ADDRESS
|
WSREP_NODE_ADDRESS
|
||||||
WSREP_NODE_INCOMING_ADDRESS
|
WSREP_NODE_INCOMING_ADDRESS
|
||||||
@ -218,6 +220,7 @@ WSREP_SST_DONOR_REJECTS_QUERIES
|
|||||||
WSREP_SST_METHOD
|
WSREP_SST_METHOD
|
||||||
WSREP_SST_RECEIVE_ADDRESS
|
WSREP_SST_RECEIVE_ADDRESS
|
||||||
WSREP_START_POSITION
|
WSREP_START_POSITION
|
||||||
|
WSREP_STRICT_DDL
|
||||||
WSREP_SYNC_WAIT
|
WSREP_SYNC_WAIT
|
||||||
WSREP_TRX_FRAGMENT_SIZE
|
WSREP_TRX_FRAGMENT_SIZE
|
||||||
WSREP_TRX_FRAGMENT_UNIT
|
WSREP_TRX_FRAGMENT_UNIT
|
||||||
@ -244,6 +247,7 @@ WSREP_LOAD_DATA_SPLITTING
|
|||||||
WSREP_LOG_CONFLICTS
|
WSREP_LOG_CONFLICTS
|
||||||
WSREP_MAX_WS_ROWS
|
WSREP_MAX_WS_ROWS
|
||||||
WSREP_MAX_WS_SIZE
|
WSREP_MAX_WS_SIZE
|
||||||
|
WSREP_MODE
|
||||||
WSREP_MYSQL_REPLICATION_BUNDLE
|
WSREP_MYSQL_REPLICATION_BUNDLE
|
||||||
WSREP_NODE_ADDRESS
|
WSREP_NODE_ADDRESS
|
||||||
WSREP_NODE_INCOMING_ADDRESS
|
WSREP_NODE_INCOMING_ADDRESS
|
||||||
@ -269,6 +273,7 @@ WSREP_SST_DONOR_REJECTS_QUERIES
|
|||||||
WSREP_SST_METHOD
|
WSREP_SST_METHOD
|
||||||
WSREP_SST_RECEIVE_ADDRESS
|
WSREP_SST_RECEIVE_ADDRESS
|
||||||
WSREP_START_POSITION
|
WSREP_START_POSITION
|
||||||
|
WSREP_STRICT_DDL
|
||||||
WSREP_SYNC_WAIT
|
WSREP_SYNC_WAIT
|
||||||
WSREP_TRX_FRAGMENT_SIZE
|
WSREP_TRX_FRAGMENT_SIZE
|
||||||
WSREP_TRX_FRAGMENT_UNIT
|
WSREP_TRX_FRAGMENT_UNIT
|
||||||
|
127
mysys/thr_lock.c
127
mysys/thr_lock.c
@ -95,24 +95,6 @@ my_bool thr_lock_inited=0;
|
|||||||
ulong locks_immediate = 0L, locks_waited = 0L;
|
ulong locks_immediate = 0L, locks_waited = 0L;
|
||||||
enum thr_lock_type thr_upgraded_concurrent_insert_lock = TL_WRITE;
|
enum thr_lock_type thr_upgraded_concurrent_insert_lock = TL_WRITE;
|
||||||
|
|
||||||
#ifdef WITH_WSREP
|
|
||||||
static wsrep_thd_is_brute_force_fun wsrep_thd_is_brute_force= NULL;
|
|
||||||
static wsrep_abort_thd_fun wsrep_abort_thd= NULL;
|
|
||||||
static my_bool wsrep_debug;
|
|
||||||
static my_bool wsrep_convert_LOCK_to_trx;
|
|
||||||
static wsrep_on_fun wsrep_on = NULL;
|
|
||||||
|
|
||||||
void wsrep_thr_lock_init(
|
|
||||||
wsrep_thd_is_brute_force_fun bf_fun, wsrep_abort_thd_fun abort_fun,
|
|
||||||
my_bool debug, my_bool convert_LOCK_to_trx, wsrep_on_fun on_fun
|
|
||||||
) {
|
|
||||||
wsrep_thd_is_brute_force = bf_fun;
|
|
||||||
wsrep_abort_thd = abort_fun;
|
|
||||||
wsrep_debug = debug;
|
|
||||||
wsrep_convert_LOCK_to_trx= convert_LOCK_to_trx;
|
|
||||||
wsrep_on = on_fun;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/* The following constants are only for debug output */
|
/* The following constants are only for debug output */
|
||||||
#define MAX_THREADS 1000
|
#define MAX_THREADS 1000
|
||||||
#define MAX_LOCKS 1000
|
#define MAX_LOCKS 1000
|
||||||
@ -653,93 +635,6 @@ wait_for_lock(struct st_lock_list *wait, THR_LOCK_DATA *data,
|
|||||||
DBUG_RETURN(result);
|
DBUG_RETURN(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WITH_WSREP
|
|
||||||
/*
|
|
||||||
* If brute force applier would need to wait for a thr lock,
|
|
||||||
* it needs to make sure that it will get the lock without (too much)
|
|
||||||
* delay.
|
|
||||||
* We identify here the owners of blocking locks and ask them to
|
|
||||||
* abort. We then put our lock request in the first place in the
|
|
||||||
* wait queue. When lock holders abort (one by one) the lock release
|
|
||||||
* algorithm should grant the lock to us. We rely on this and proceed
|
|
||||||
* to wait_for_locks().
|
|
||||||
* wsrep_break_locks() should be called in all the cases, where lock
|
|
||||||
* wait would happen.
|
|
||||||
*
|
|
||||||
* TODO: current implementation might not cover all possible lock wait
|
|
||||||
* situations. This needs an review still.
|
|
||||||
* TODO: lock release, might favor some other lock (instead our bf).
|
|
||||||
* This needs an condition to check for bf locks first.
|
|
||||||
* TODO: we still have a debug fprintf, this should be removed
|
|
||||||
*/
|
|
||||||
static my_bool
|
|
||||||
wsrep_break_lock(
|
|
||||||
THR_LOCK_DATA *data, struct st_lock_list *lock_queue1,
|
|
||||||
struct st_lock_list *wait_queue)
|
|
||||||
{
|
|
||||||
if (wsrep_on && wsrep_on(data->owner->mysql_thd) &&
|
|
||||||
wsrep_thd_is_brute_force &&
|
|
||||||
wsrep_thd_is_brute_force(data->owner->mysql_thd, TRUE))
|
|
||||||
{
|
|
||||||
THR_LOCK_DATA *holder;
|
|
||||||
|
|
||||||
/* if locking session conversion to transaction has been enabled,
|
|
||||||
we know that this conflicting lock must be read lock and furthermore,
|
|
||||||
lock holder is read-only. It is safe to wait for him.
|
|
||||||
*/
|
|
||||||
#ifdef TODO_WHEN_LOCK_TABLES_IS_A_TRANSACTION
|
|
||||||
if (wsrep_convert_LOCK_to_trx &&
|
|
||||||
(THD*)(data->owner->mysql_thd)->in_lock_tables)
|
|
||||||
{
|
|
||||||
if (wsrep_debug)
|
|
||||||
fprintf(stderr,"WSREP wsrep_break_lock read lock untouched\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (wsrep_debug)
|
|
||||||
fprintf(stderr,"WSREP wsrep_break_lock aborting locks\n");
|
|
||||||
|
|
||||||
/* aborting lock holder(s) here */
|
|
||||||
for (holder=(lock_queue1) ? lock_queue1->data : NULL;
|
|
||||||
holder;
|
|
||||||
holder=holder->next)
|
|
||||||
{
|
|
||||||
if (!wsrep_thd_is_brute_force(holder->owner->mysql_thd, TRUE))
|
|
||||||
{
|
|
||||||
wsrep_abort_thd(data->owner->mysql_thd,
|
|
||||||
holder->owner->mysql_thd, FALSE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (wsrep_debug)
|
|
||||||
fprintf(stderr,"WSREP wsrep_break_lock skipping BF lock conflict\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Add our lock to the head of the wait queue */
|
|
||||||
if (*(wait_queue->last)==wait_queue->data)
|
|
||||||
{
|
|
||||||
wait_queue->last=&data->next;
|
|
||||||
assert(wait_queue->data==0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
assert(wait_queue->data!=0);
|
|
||||||
wait_queue->data->prev=&data->next;
|
|
||||||
}
|
|
||||||
data->next=wait_queue->data;
|
|
||||||
data->prev=&wait_queue->data;
|
|
||||||
wait_queue->data=data;
|
|
||||||
data->cond=get_cond();
|
|
||||||
|
|
||||||
statistic_increment(locks_immediate,&THR_LOCK_lock);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static enum enum_thr_lock_result
|
static enum enum_thr_lock_result
|
||||||
thr_lock(THR_LOCK_DATA *data, THR_LOCK_INFO *owner, ulong lock_wait_timeout)
|
thr_lock(THR_LOCK_DATA *data, THR_LOCK_INFO *owner, ulong lock_wait_timeout)
|
||||||
{
|
{
|
||||||
@ -747,9 +642,6 @@ thr_lock(THR_LOCK_DATA *data, THR_LOCK_INFO *owner, ulong lock_wait_timeout)
|
|||||||
enum enum_thr_lock_result result= THR_LOCK_SUCCESS;
|
enum enum_thr_lock_result result= THR_LOCK_SUCCESS;
|
||||||
struct st_lock_list *wait_queue;
|
struct st_lock_list *wait_queue;
|
||||||
enum thr_lock_type lock_type= data->type;
|
enum thr_lock_type lock_type= data->type;
|
||||||
#ifdef WITH_WSREP
|
|
||||||
my_bool wsrep_lock_inserted= FALSE;
|
|
||||||
#endif
|
|
||||||
MYSQL_TABLE_WAIT_VARIABLES(locker, state) /* no ';' */
|
MYSQL_TABLE_WAIT_VARIABLES(locker, state) /* no ';' */
|
||||||
DBUG_ENTER("thr_lock");
|
DBUG_ENTER("thr_lock");
|
||||||
|
|
||||||
@ -846,13 +738,6 @@ thr_lock(THR_LOCK_DATA *data, THR_LOCK_INFO *owner, ulong lock_wait_timeout)
|
|||||||
lock but a high priority write waiting in the write_wait queue.
|
lock but a high priority write waiting in the write_wait queue.
|
||||||
In the latter case we should yield the lock to the writer.
|
In the latter case we should yield the lock to the writer.
|
||||||
*/
|
*/
|
||||||
#ifdef WITH_WSREP
|
|
||||||
if (wsrep_break_lock(data, &lock->write, &lock->read_wait))
|
|
||||||
{
|
|
||||||
wsrep_lock_inserted= TRUE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
wait_queue= &lock->read_wait;
|
wait_queue= &lock->read_wait;
|
||||||
}
|
}
|
||||||
else /* Request for WRITE lock */
|
else /* Request for WRITE lock */
|
||||||
@ -1000,20 +885,8 @@ thr_lock(THR_LOCK_DATA *data, THR_LOCK_INFO *owner, ulong lock_wait_timeout)
|
|||||||
(ulong) lock->read.data->owner->thread_id,
|
(ulong) lock->read.data->owner->thread_id,
|
||||||
data->type));
|
data->type));
|
||||||
}
|
}
|
||||||
#ifdef WITH_WSREP
|
|
||||||
if (wsrep_break_lock(data, &lock->write, &lock->write_wait))
|
|
||||||
{
|
|
||||||
wsrep_lock_inserted= TRUE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
wait_queue= &lock->write_wait;
|
wait_queue= &lock->write_wait;
|
||||||
}
|
}
|
||||||
/* Can't get lock yet; Wait for it */
|
|
||||||
#ifdef WITH_WSREP
|
|
||||||
if (wsrep_lock_inserted && wsrep_on(data->owner->mysql_thd))
|
|
||||||
DBUG_RETURN(wait_for_lock(wait_queue, data, 1, lock_wait_timeout));
|
|
||||||
#endif
|
|
||||||
result= wait_for_lock(wait_queue, data, 0, lock_wait_timeout);
|
result= wait_for_lock(wait_queue, data, 0, lock_wait_timeout);
|
||||||
MYSQL_END_TABLE_LOCK_WAIT(locker);
|
MYSQL_END_TABLE_LOCK_WAIT(locker);
|
||||||
DBUG_RETURN(result);
|
DBUG_RETURN(result);
|
||||||
|
28
sql/log.cc
28
sql/log.cc
@ -11078,34 +11078,6 @@ void wsrep_thd_binlog_stmt_rollback(THD * thd)
|
|||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wsrep_stmt_rollback_is_safe(THD* thd)
|
|
||||||
{
|
|
||||||
bool ret(true);
|
|
||||||
|
|
||||||
DBUG_ENTER("wsrep_binlog_stmt_rollback_is_safe");
|
|
||||||
|
|
||||||
binlog_cache_mngr *cache_mngr=
|
|
||||||
(binlog_cache_mngr*) thd_get_ha_data(thd, binlog_hton);
|
|
||||||
|
|
||||||
if (binlog_hton && cache_mngr)
|
|
||||||
{
|
|
||||||
binlog_cache_data * trx_cache = &cache_mngr->trx_cache;
|
|
||||||
if (thd->wsrep_sr().fragments_certified() > 0 &&
|
|
||||||
(trx_cache->get_prev_position() == MY_OFF_T_UNDEF ||
|
|
||||||
trx_cache->get_prev_position() < thd->wsrep_sr().log_position()))
|
|
||||||
{
|
|
||||||
WSREP_DEBUG("statement rollback is not safe for streaming replication"
|
|
||||||
" pre-stmt_pos: %llu, frag repl pos: %zu\n"
|
|
||||||
"Thread: %llu, SQL: %s",
|
|
||||||
trx_cache->get_prev_position(),
|
|
||||||
thd->wsrep_sr().log_position(),
|
|
||||||
thd->thread_id, thd->query());
|
|
||||||
ret = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DBUG_RETURN(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
void wsrep_register_binlog_handler(THD *thd, bool trx)
|
void wsrep_register_binlog_handler(THD *thd, bool trx)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("register_binlog_handler");
|
DBUG_ENTER("register_binlog_handler");
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2009, 2020, MariaDB Corporation.
|
Copyright (c) 2009, 2021, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -688,6 +688,7 @@ typedef struct system_variables
|
|||||||
are based on the cluster size):
|
are based on the cluster size):
|
||||||
*/
|
*/
|
||||||
ulong saved_auto_increment_increment, saved_auto_increment_offset;
|
ulong saved_auto_increment_increment, saved_auto_increment_offset;
|
||||||
|
ulong saved_lock_wait_timeout;
|
||||||
ulonglong wsrep_gtid_seq_no;
|
ulonglong wsrep_gtid_seq_no;
|
||||||
#endif /* WITH_WSREP */
|
#endif /* WITH_WSREP */
|
||||||
uint eq_range_index_dive_limit;
|
uint eq_range_index_dive_limit;
|
||||||
|
@ -943,9 +943,6 @@ void wsrep_init_startup (bool sst_first)
|
|||||||
{
|
{
|
||||||
if (wsrep_init()) unireg_abort(1);
|
if (wsrep_init()) unireg_abort(1);
|
||||||
|
|
||||||
wsrep_thr_lock_init(wsrep_thd_is_BF, wsrep_thd_bf_abort,
|
|
||||||
wsrep_debug, wsrep_convert_LOCK_to_trx, wsrep_on);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Pre-initialize global_system_variables.table_plugin with a dummy engine
|
Pre-initialize global_system_variables.table_plugin with a dummy engine
|
||||||
(placeholder) required during the initialization of wsrep threads (THDs).
|
(placeholder) required during the initialization of wsrep threads (THDs).
|
||||||
@ -2754,6 +2751,13 @@ int wsrep_to_isolation_begin(THD *thd, const char *db_, const char *table_,
|
|||||||
thd->variables.auto_increment_increment= 1;
|
thd->variables.auto_increment_increment= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
TOI operations will ignore provided lock_wait_timeout and restore it
|
||||||
|
after operation is done.
|
||||||
|
*/
|
||||||
|
thd->variables.saved_lock_wait_timeout= thd->variables.lock_wait_timeout;
|
||||||
|
thd->variables.lock_wait_timeout= LONG_TIMEOUT;
|
||||||
|
|
||||||
if (thd->variables.wsrep_on && wsrep_thd_is_local(thd))
|
if (thd->variables.wsrep_on && wsrep_thd_is_local(thd))
|
||||||
{
|
{
|
||||||
switch (wsrep_OSU_method_get(thd)) {
|
switch (wsrep_OSU_method_get(thd)) {
|
||||||
@ -2789,6 +2793,9 @@ void wsrep_to_isolation_end(THD *thd)
|
|||||||
{
|
{
|
||||||
DBUG_ASSERT(wsrep_thd_is_local_toi(thd) ||
|
DBUG_ASSERT(wsrep_thd_is_local_toi(thd) ||
|
||||||
wsrep_thd_is_in_rsu(thd));
|
wsrep_thd_is_in_rsu(thd));
|
||||||
|
|
||||||
|
thd->variables.lock_wait_timeout= thd->variables.saved_lock_wait_timeout;
|
||||||
|
|
||||||
if (wsrep_thd_is_local_toi(thd))
|
if (wsrep_thd_is_local_toi(thd))
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(wsrep_OSU_method_get(thd) == WSREP_OSU_TOI);
|
DBUG_ASSERT(wsrep_OSU_method_get(thd) == WSREP_OSU_TOI);
|
||||||
|
@ -404,8 +404,6 @@ int wsrep_to_buf_helper(
|
|||||||
int wsrep_create_trigger_query(THD *thd, uchar** buf, size_t* buf_len);
|
int wsrep_create_trigger_query(THD *thd, uchar** buf, size_t* buf_len);
|
||||||
int wsrep_create_event_query(THD *thd, uchar** buf, size_t* buf_len);
|
int wsrep_create_event_query(THD *thd, uchar** buf, size_t* buf_len);
|
||||||
|
|
||||||
bool wsrep_stmt_rollback_is_safe(THD* thd);
|
|
||||||
|
|
||||||
void wsrep_init_sidno(const wsrep_uuid_t&);
|
void wsrep_init_sidno(const wsrep_uuid_t&);
|
||||||
bool wsrep_node_is_donor();
|
bool wsrep_node_is_donor();
|
||||||
bool wsrep_node_is_synced();
|
bool wsrep_node_is_synced();
|
||||||
|
@ -374,11 +374,14 @@ static inline int wsrep_before_rollback(THD* thd, bool all)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (thd->wsrep_trx().is_streaming() &&
|
if (thd->wsrep_trx().is_streaming() &&
|
||||||
!wsrep_stmt_rollback_is_safe(thd))
|
(wsrep_fragments_certified_for_stmt(thd) > 0))
|
||||||
{
|
{
|
||||||
/* Non-safe statement rollback during SR multi statement
|
/* Non-safe statement rollback during SR multi statement
|
||||||
transasction. Self abort the transaction, the actual rollback
|
transaction. A statement rollback is considered unsafe, if
|
||||||
and error handling will be done in after statement phase. */
|
the same statement has already replicated one or more fragments.
|
||||||
|
Self abort the transaction, the actual rollback and error
|
||||||
|
handling will be done in after statement phase. */
|
||||||
|
WSREP_DEBUG("statement rollback is not safe for streaming replication");
|
||||||
wsrep_thd_self_abort(thd);
|
wsrep_thd_self_abort(thd);
|
||||||
ret= 0;
|
ret= 0;
|
||||||
}
|
}
|
||||||
|
@ -733,6 +733,13 @@ inline void dict_table_t::rollback_instant(
|
|||||||
const ulint* col_map)
|
const ulint* col_map)
|
||||||
{
|
{
|
||||||
ut_d(dict_sys.assert_locked());
|
ut_d(dict_sys.assert_locked());
|
||||||
|
|
||||||
|
if (cols == old_cols) {
|
||||||
|
/* Alter fails before instant operation happens.
|
||||||
|
So there is no need to do rollback instant operation */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
dict_index_t* index = indexes.start;
|
dict_index_t* index = indexes.start;
|
||||||
/* index->is_instant() does not necessarily hold here, because
|
/* index->is_instant() does not necessarily hold here, because
|
||||||
the table may have been emptied */
|
the table may have been emptied */
|
||||||
|
@ -179,7 +179,8 @@ int maria_close(register MARIA_HA *info)
|
|||||||
mysql_rwlock_destroy(&share->keyinfo[i].root_lock);
|
mysql_rwlock_destroy(&share->keyinfo[i].root_lock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DBUG_ASSERT(share->now_transactional == share->base.born_transactional);
|
DBUG_ASSERT(share->now_transactional == share->base.born_transactional ||
|
||||||
|
share->internal_table);
|
||||||
/*
|
/*
|
||||||
We assign -1 because checkpoint does not need to flush (in case we
|
We assign -1 because checkpoint does not need to flush (in case we
|
||||||
have concurrent checkpoint if no then we do not need it here also)
|
have concurrent checkpoint if no then we do not need it here also)
|
||||||
|
@ -187,9 +187,9 @@ static MARIA_HA *maria_clone_internal(MARIA_SHARE *share,
|
|||||||
maria_delay_key_write)
|
maria_delay_key_write)
|
||||||
share->delay_key_write=1;
|
share->delay_key_write=1;
|
||||||
|
|
||||||
if (!share->base.born_transactional) /* For transactional ones ... */
|
if (!share->now_transactional) /* If not transctional table */
|
||||||
{
|
{
|
||||||
/* ... force crash if no trn given */
|
/* Pagecache requires access to info->trn->rec_lsn */
|
||||||
_ma_set_tmp_trn_for_table(&info, &dummy_transaction_object);
|
_ma_set_tmp_trn_for_table(&info, &dummy_transaction_object);
|
||||||
info.state= &share->state.state; /* Change global values by default */
|
info.state= &share->state.state; /* Change global values by default */
|
||||||
}
|
}
|
||||||
@ -282,7 +282,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags,
|
|||||||
ulong *nulls_per_key_part;
|
ulong *nulls_per_key_part;
|
||||||
my_off_t key_root[HA_MAX_POSSIBLE_KEY];
|
my_off_t key_root[HA_MAX_POSSIBLE_KEY];
|
||||||
ulonglong max_key_file_length, max_data_file_length;
|
ulonglong max_key_file_length, max_data_file_length;
|
||||||
my_bool versioning= 1;
|
my_bool versioning= 1, born_transactional;
|
||||||
File data_file= -1, kfile= -1;
|
File data_file= -1, kfile= -1;
|
||||||
struct ms3_st *s3_client= 0;
|
struct ms3_st *s3_client= 0;
|
||||||
S3_INFO *share_s3= 0;
|
S3_INFO *share_s3= 0;
|
||||||
@ -526,6 +526,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags,
|
|||||||
file_version= (share->state.header.not_used == 0);
|
file_version= (share->state.header.not_used == 0);
|
||||||
if (file_version == 0)
|
if (file_version == 0)
|
||||||
share->base.language= share->state.header.not_used;
|
share->base.language= share->state.header.not_used;
|
||||||
|
born_transactional= share->base.born_transactional;
|
||||||
|
|
||||||
share->state.state_length=base_pos;
|
share->state.state_length=base_pos;
|
||||||
/* For newly opened tables we reset the error-has-been-printed flag */
|
/* For newly opened tables we reset the error-has-been-printed flag */
|
||||||
@ -560,7 +561,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags,
|
|||||||
We can ignore testing uuid if STATE_NOT_MOVABLE is not set, as in this
|
We can ignore testing uuid if STATE_NOT_MOVABLE is not set, as in this
|
||||||
case the uuid will be set in _ma_mark_file_changed().
|
case the uuid will be set in _ma_mark_file_changed().
|
||||||
*/
|
*/
|
||||||
if (share->base.born_transactional &&
|
if (born_transactional &&
|
||||||
((share->state.create_trid > trnman_get_max_trid() &&
|
((share->state.create_trid > trnman_get_max_trid() &&
|
||||||
!maria_in_recovery) ||
|
!maria_in_recovery) ||
|
||||||
((share->state.changed & STATE_NOT_MOVABLE) &&
|
((share->state.changed & STATE_NOT_MOVABLE) &&
|
||||||
@ -601,7 +602,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Ensure we have space in the key buffer for transaction id's */
|
/* Ensure we have space in the key buffer for transaction id's */
|
||||||
if (share->base.born_transactional)
|
if (born_transactional)
|
||||||
share->base.max_key_length= ALIGN_SIZE(share->base.max_key_length +
|
share->base.max_key_length= ALIGN_SIZE(share->base.max_key_length +
|
||||||
MARIA_MAX_PACK_TRANSID_SIZE);
|
MARIA_MAX_PACK_TRANSID_SIZE);
|
||||||
|
|
||||||
@ -700,7 +701,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags,
|
|||||||
|
|
||||||
share->block_size= share->base.block_size; /* Convenience */
|
share->block_size= share->base.block_size; /* Convenience */
|
||||||
share->max_index_block_size= share->block_size - KEYPAGE_CHECKSUM_SIZE;
|
share->max_index_block_size= share->block_size - KEYPAGE_CHECKSUM_SIZE;
|
||||||
share->keypage_header= ((share->base.born_transactional ?
|
share->keypage_header= ((born_transactional ?
|
||||||
LSN_STORE_SIZE + TRANSID_SIZE :
|
LSN_STORE_SIZE + TRANSID_SIZE :
|
||||||
0) + KEYPAGE_KEYID_SIZE + KEYPAGE_FLAG_SIZE +
|
0) + KEYPAGE_KEYID_SIZE + KEYPAGE_FLAG_SIZE +
|
||||||
KEYPAGE_USED_SIZE);
|
KEYPAGE_USED_SIZE);
|
||||||
@ -723,7 +724,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags,
|
|||||||
/* Calculate length to store a key + nod flag and transaction info */
|
/* Calculate length to store a key + nod flag and transaction info */
|
||||||
keyinfo->max_store_length= (keyinfo->maxlength +
|
keyinfo->max_store_length= (keyinfo->maxlength +
|
||||||
share->base.key_reflength);
|
share->base.key_reflength);
|
||||||
if (share->base.born_transactional)
|
if (born_transactional)
|
||||||
keyinfo->max_store_length+= MARIA_INDEX_OVERHEAD_SIZE;
|
keyinfo->max_store_length+= MARIA_INDEX_OVERHEAD_SIZE;
|
||||||
|
|
||||||
/* See ma_delete.cc::underflow() */
|
/* See ma_delete.cc::underflow() */
|
||||||
@ -862,9 +863,9 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags,
|
|||||||
file for REPAIR. Don't do logging. This base information will not go
|
file for REPAIR. Don't do logging. This base information will not go
|
||||||
to disk.
|
to disk.
|
||||||
*/
|
*/
|
||||||
share->base.born_transactional= FALSE;
|
born_transactional= FALSE;
|
||||||
}
|
}
|
||||||
if (share->base.born_transactional)
|
if (born_transactional)
|
||||||
{
|
{
|
||||||
share->page_type= PAGECACHE_LSN_PAGE;
|
share->page_type= PAGECACHE_LSN_PAGE;
|
||||||
if (share->state.create_rename_lsn == LSN_NEEDS_NEW_STATE_LSNS)
|
if (share->state.create_rename_lsn == LSN_NEEDS_NEW_STATE_LSNS)
|
||||||
@ -915,7 +916,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
share->page_type= PAGECACHE_PLAIN_PAGE;
|
share->page_type= PAGECACHE_PLAIN_PAGE;
|
||||||
share->now_transactional= share->base.born_transactional;
|
share->now_transactional= born_transactional;
|
||||||
|
|
||||||
/* Use pack_reclength as we don't want to modify base.pack_recklength */
|
/* Use pack_reclength as we don't want to modify base.pack_recklength */
|
||||||
if (share->state.header.org_data_file_type == DYNAMIC_RECORD)
|
if (share->state.header.org_data_file_type == DYNAMIC_RECORD)
|
||||||
|
@ -717,6 +717,10 @@ TRUNCATE TABLE ta_l;
|
|||||||
connection master_1;
|
connection master_1;
|
||||||
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
|
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
|
||||||
a b date_format(c, '%Y-%m-%d %H:%i:%s')
|
a b date_format(c, '%Y-%m-%d %H:%i:%s')
|
||||||
|
connection master_1;
|
||||||
|
create table t2345678911234567892123456789312345678941234567895123234234(id int) ENGINE=SPIDER
|
||||||
|
COMMENT='host "192.168.21.1", user "spider", password "password", database "test32738123123123"';
|
||||||
|
drop table t2345678911234567892123456789312345678941234567895123234234;
|
||||||
|
|
||||||
deinit
|
deinit
|
||||||
connection master_1;
|
connection master_1;
|
||||||
|
@ -2677,6 +2677,11 @@ if ($USE_CHILD_GROUP2)
|
|||||||
--connection master_1
|
--connection master_1
|
||||||
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
|
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
|
||||||
|
|
||||||
|
--connection master_1
|
||||||
|
create table t2345678911234567892123456789312345678941234567895123234234(id int) ENGINE=SPIDER
|
||||||
|
COMMENT='host "192.168.21.1", user "spider", password "password", database "test32738123123123"';
|
||||||
|
drop table t2345678911234567892123456789312345678941234567895123234234;
|
||||||
|
|
||||||
--echo
|
--echo
|
||||||
--echo deinit
|
--echo deinit
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
@ -2689,6 +2694,7 @@ if ($USE_CHILD_GROUP2)
|
|||||||
--connection child2_2
|
--connection child2_2
|
||||||
DROP DATABASE IF EXISTS auto_test_remote2;
|
DROP DATABASE IF EXISTS auto_test_remote2;
|
||||||
}
|
}
|
||||||
|
|
||||||
--disable_query_log
|
--disable_query_log
|
||||||
--disable_result_log
|
--disable_result_log
|
||||||
--source test_deinit.inc
|
--source test_deinit.inc
|
||||||
|
Loading…
x
Reference in New Issue
Block a user