mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 11:45:32 +00:00
Merge 10.6 into 10.11
This commit is contained in:
@ -1,3 +1,6 @@
|
|||||||
|
connect disable_purging,localhost,root;
|
||||||
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||||
|
connection default;
|
||||||
#
|
#
|
||||||
# MDEV-26642 Weird SELECT view when a record is
|
# MDEV-26642 Weird SELECT view when a record is
|
||||||
# modified to the same value by two transactions
|
# modified to the same value by two transactions
|
||||||
@ -52,15 +55,17 @@ DROP TABLE t;
|
|||||||
# MDEV-26643 Inconsistent behaviors of UPDATE under
|
# MDEV-26643 Inconsistent behaviors of UPDATE under
|
||||||
# READ UNCOMMITTED and READ COMMITTED isolation level
|
# READ UNCOMMITTED and READ COMMITTED isolation level
|
||||||
#
|
#
|
||||||
CREATE TABLE t(a INT, b INT) ENGINE=InnoDB;
|
CREATE TABLE t(a INT, b INT) ENGINE=InnoDB STATS_PERSISTENT=0;
|
||||||
INSERT INTO t VALUES(NULL, 1), (2, 2);
|
INSERT INTO t VALUES(NULL, 1), (2, 2);
|
||||||
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
||||||
BEGIN;
|
BEGIN;
|
||||||
UPDATE t SET a = 10;
|
UPDATE t SET a = 10;
|
||||||
connection consistent;
|
connection consistent;
|
||||||
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
||||||
|
SET DEBUG_SYNC="lock_wait_before_suspend SIGNAL select_blocked";
|
||||||
UPDATE t SET b = 20 WHERE a;
|
UPDATE t SET b = 20 WHERE a;
|
||||||
connection default;
|
connection default;
|
||||||
|
SET DEBUG_SYNC="now WAIT_FOR select_blocked";
|
||||||
COMMIT;
|
COMMIT;
|
||||||
connection consistent;
|
connection consistent;
|
||||||
SELECT * FROM t;
|
SELECT * FROM t;
|
||||||
@ -74,8 +79,10 @@ BEGIN;
|
|||||||
UPDATE t SET a = 10;
|
UPDATE t SET a = 10;
|
||||||
connection consistent;
|
connection consistent;
|
||||||
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||||||
|
SET DEBUG_SYNC="lock_wait_before_suspend SIGNAL select_blocked";
|
||||||
UPDATE t SET b = 20 WHERE a;
|
UPDATE t SET b = 20 WHERE a;
|
||||||
connection default;
|
connection default;
|
||||||
|
SET DEBUG_SYNC="now WAIT_FOR select_blocked";
|
||||||
COMMIT;
|
COMMIT;
|
||||||
connection consistent;
|
connection consistent;
|
||||||
SELECT * FROM t;
|
SELECT * FROM t;
|
||||||
@ -89,8 +96,10 @@ BEGIN;
|
|||||||
UPDATE t SET a = 10;
|
UPDATE t SET a = 10;
|
||||||
connection con_weird;
|
connection con_weird;
|
||||||
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
||||||
|
SET DEBUG_SYNC="lock_wait_before_suspend SIGNAL select_blocked";
|
||||||
UPDATE t SET b = 20 WHERE a;
|
UPDATE t SET b = 20 WHERE a;
|
||||||
connection default;
|
connection default;
|
||||||
|
SET DEBUG_SYNC="now WAIT_FOR select_blocked";
|
||||||
SELECT * FROM t;
|
SELECT * FROM t;
|
||||||
a b
|
a b
|
||||||
10 1
|
10 1
|
||||||
@ -113,8 +122,10 @@ UPDATE t SET b = 3;
|
|||||||
connection consistent;
|
connection consistent;
|
||||||
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||||||
BEGIN;
|
BEGIN;
|
||||||
|
SET DEBUG_SYNC="lock_wait_before_suspend SIGNAL select_blocked";
|
||||||
UPDATE t SET b = 2 WHERE a;
|
UPDATE t SET b = 2 WHERE a;
|
||||||
connection default;
|
connection default;
|
||||||
|
SET DEBUG_SYNC="now WAIT_FOR select_blocked";
|
||||||
UPDATE t SET a = 1;
|
UPDATE t SET a = 1;
|
||||||
COMMIT;
|
COMMIT;
|
||||||
connection consistent;
|
connection consistent;
|
||||||
@ -128,20 +139,25 @@ DROP TABLE t;
|
|||||||
#
|
#
|
||||||
# MDEV-33802 Weird read view after ROLLBACK of other transactions
|
# MDEV-33802 Weird read view after ROLLBACK of other transactions
|
||||||
#
|
#
|
||||||
CREATE TABLE t(a INT PRIMARY KEY, b INT UNIQUE) ENGINE=InnoDB;
|
CREATE TABLE t(a INT PRIMARY KEY, b INT UNIQUE) ENGINE=InnoDB STATS_PERSISTENT=0;
|
||||||
INSERT INTO t SET a=1;
|
|
||||||
BEGIN;
|
|
||||||
INSERT INTO t SET a=2;
|
|
||||||
connection consistent;
|
connection consistent;
|
||||||
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||||
|
connection default;
|
||||||
|
INSERT INTO t SET a=1;
|
||||||
|
connection consistent;
|
||||||
SAVEPOINT sp1;
|
SAVEPOINT sp1;
|
||||||
SELECT * FROM t FORCE INDEX (b) FOR UPDATE;
|
SELECT * FROM t FORCE INDEX (b) FOR UPDATE;
|
||||||
ERROR HY000: Record has changed since last read in table 't'
|
ERROR HY000: Record has changed since last read in table 't'
|
||||||
SAVEPOINT sp1;
|
SAVEPOINT sp1;
|
||||||
|
connection default;
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO t SET a=2;
|
||||||
connection con_weird;
|
connection con_weird;
|
||||||
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||||
|
SET DEBUG_SYNC="lock_wait_before_suspend SIGNAL select_blocked";
|
||||||
SELECT * FROM t FORCE INDEX (b) FOR UPDATE;
|
SELECT * FROM t FORCE INDEX (b) FOR UPDATE;
|
||||||
connection default;
|
connection default;
|
||||||
|
SET DEBUG_SYNC="now WAIT_FOR select_blocked";
|
||||||
ROLLBACK;
|
ROLLBACK;
|
||||||
connection con_weird;
|
connection con_weird;
|
||||||
a b
|
a b
|
||||||
@ -149,12 +165,74 @@ a b
|
|||||||
SELECT * FROM t FORCE INDEX (b) FOR UPDATE;
|
SELECT * FROM t FORCE INDEX (b) FOR UPDATE;
|
||||||
a b
|
a b
|
||||||
1 NULL
|
1 NULL
|
||||||
|
COMMIT;
|
||||||
disconnect con_weird;
|
disconnect con_weird;
|
||||||
connection consistent;
|
connection consistent;
|
||||||
SELECT * FROM t FORCE INDEX (b) FOR UPDATE;
|
SELECT * FROM t FORCE INDEX (b) FOR UPDATE;
|
||||||
a b
|
a b
|
||||||
1 NULL
|
1 NULL
|
||||||
disconnect consistent;
|
COMMIT;
|
||||||
connection default;
|
connection default;
|
||||||
|
TRUNCATE TABLE t;
|
||||||
|
#
|
||||||
|
# MDEV-36639 innodb_snapshot_isolation=1 gives error for not comitted row changes
|
||||||
|
#
|
||||||
|
INSERT INTO t VALUES (1,1),(2,2);
|
||||||
|
connection default;
|
||||||
|
# Case 1: Transaction A modifies a record, transaction B with snapshot
|
||||||
|
# isolation level is blocked by A, then A is committed.
|
||||||
|
# Expected behaviour: B gets ER_CHECKREAD.
|
||||||
|
BEGIN;
|
||||||
|
UPDATE t SET b=3 WHERE a = 1;
|
||||||
|
connection consistent;
|
||||||
|
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
|
||||||
|
BEGIN;
|
||||||
|
SELECT * FROM t;
|
||||||
|
a b
|
||||||
|
1 1
|
||||||
|
2 2
|
||||||
|
SET DEBUG_SYNC="lock_wait_before_suspend SIGNAL select_blocked";
|
||||||
|
SELECT * FROM t WHERE a=1 FOR UPDATE;
|
||||||
|
connection default;
|
||||||
|
SET DEBUG_SYNC="now WAIT_FOR select_blocked";
|
||||||
|
COMMIT;
|
||||||
|
connection consistent;
|
||||||
|
ERROR HY000: Record has changed since last read in table 't'
|
||||||
|
# Case 2: Transaction A modifies a record, transaction B with snapshot
|
||||||
|
# isolation level is blocked by A, then A is rolled back.
|
||||||
|
# Expected behaviour: B continues execution.
|
||||||
|
connection default;
|
||||||
|
BEGIN;
|
||||||
|
UPDATE t SET b=4 WHERE a=1;
|
||||||
|
connection consistent;
|
||||||
|
BEGIN;
|
||||||
|
SELECT * FROM t;
|
||||||
|
a b
|
||||||
|
2 2
|
||||||
|
1 3
|
||||||
|
SET DEBUG_SYNC="lock_wait_before_suspend SIGNAL select_blocked";
|
||||||
|
SELECT * FROM t WHERE a=1 FOR UPDATE;
|
||||||
|
connection default;
|
||||||
|
SET DEBUG_SYNC="now WAIT_FOR select_blocked";
|
||||||
|
ROLLBACK;
|
||||||
|
connection consistent;
|
||||||
|
a b
|
||||||
|
1 3
|
||||||
|
ROLLBACK;
|
||||||
|
# Case 3: Transaction B with snapshot isolation level started with
|
||||||
|
# consistent snapshot. Transaction A modifies a record and is committed.
|
||||||
|
# Both B tries to read modified by A record.
|
||||||
|
# Expected behavior: B gets ER_CHECKREAD.
|
||||||
|
connection consistent;
|
||||||
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||||
|
connection default;
|
||||||
|
UPDATE t SET b=4 WHERE a=1;
|
||||||
|
connection consistent;
|
||||||
|
SELECT * FROM t WHERE a=1 FOR UPDATE;
|
||||||
|
ERROR HY000: Record has changed since last read in table 't'
|
||||||
|
disconnect consistent;
|
||||||
|
disconnect disable_purging;
|
||||||
|
connection default;
|
||||||
|
SET DEBUG_SYNC="RESET";
|
||||||
DROP TABLE t;
|
DROP TABLE t;
|
||||||
# End of 10.6 tests
|
# End of 10.6 tests
|
||||||
|
@ -17,3 +17,13 @@ test.t1 analyze status Engine-independent statistics collected
|
|||||||
test.t1 analyze status OK
|
test.t1 analyze status OK
|
||||||
SET DEBUG_SYNC= 'RESET';
|
SET DEBUG_SYNC= 'RESET';
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# MDEV-36649 dict_acquire_mdl_shared() aborts when table
|
||||||
|
# mode is DICT_TABLE_OP_OPEN_ONLY_IF_CACHED
|
||||||
|
#
|
||||||
|
set @old_defragment_stats_accuracy= @@innodb_defragment_stats_accuracy;
|
||||||
|
SET GLOBAL innodb_defragment_stats_accuracy=1;
|
||||||
|
CREATE TABLE t (a INT ) ENGINE=INNODB;
|
||||||
|
INSERT INTO t SELECT * FROM seq_1_to_1000;
|
||||||
|
DROP TABLE t;
|
||||||
|
set global innodb_defragment_stats_accuracy= @old_defragment_stats_accuracy;
|
||||||
|
@ -1,9 +1,16 @@
|
|||||||
--source include/have_innodb.inc
|
--source include/have_innodb.inc
|
||||||
|
--source include/count_sessions.inc
|
||||||
|
--source include/have_debug.inc
|
||||||
|
--source include/have_debug_sync.inc
|
||||||
|
|
||||||
--disable_query_log
|
--disable_query_log
|
||||||
call mtr.add_suppression("InnoDB: Transaction was aborted due to ");
|
call mtr.add_suppression("InnoDB: Transaction was aborted due to ");
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
|
|
||||||
|
--connect disable_purging,localhost,root
|
||||||
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||||
|
|
||||||
|
--connection default
|
||||||
--echo #
|
--echo #
|
||||||
--echo # MDEV-26642 Weird SELECT view when a record is
|
--echo # MDEV-26642 Weird SELECT view when a record is
|
||||||
--echo # modified to the same value by two transactions
|
--echo # modified to the same value by two transactions
|
||||||
@ -41,22 +48,18 @@ DROP TABLE t;
|
|||||||
--echo # READ UNCOMMITTED and READ COMMITTED isolation level
|
--echo # READ UNCOMMITTED and READ COMMITTED isolation level
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
CREATE TABLE t(a INT, b INT) ENGINE=InnoDB;
|
CREATE TABLE t(a INT, b INT) ENGINE=InnoDB STATS_PERSISTENT=0;
|
||||||
INSERT INTO t VALUES(NULL, 1), (2, 2);
|
INSERT INTO t VALUES(NULL, 1), (2, 2);
|
||||||
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
||||||
BEGIN; UPDATE t SET a = 10;
|
BEGIN; UPDATE t SET a = 10;
|
||||||
|
|
||||||
--connection consistent
|
--connection consistent
|
||||||
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
||||||
|
SET DEBUG_SYNC="lock_wait_before_suspend SIGNAL select_blocked";
|
||||||
--send UPDATE t SET b = 20 WHERE a
|
--send UPDATE t SET b = 20 WHERE a
|
||||||
|
|
||||||
--connection default
|
--connection default
|
||||||
let $wait_condition=
|
SET DEBUG_SYNC="now WAIT_FOR select_blocked";
|
||||||
select count(*) = 1 from information_schema.processlist
|
|
||||||
where state = 'Updating'
|
|
||||||
and info = 'UPDATE t SET b = 20 WHERE a';
|
|
||||||
--source include/wait_condition.inc
|
|
||||||
|
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
--connection consistent
|
--connection consistent
|
||||||
@ -70,14 +73,11 @@ BEGIN; UPDATE t SET a = 10;
|
|||||||
|
|
||||||
--connection consistent
|
--connection consistent
|
||||||
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||||||
|
SET DEBUG_SYNC="lock_wait_before_suspend SIGNAL select_blocked";
|
||||||
--send UPDATE t SET b = 20 WHERE a
|
--send UPDATE t SET b = 20 WHERE a
|
||||||
|
|
||||||
--connection default
|
--connection default
|
||||||
let $wait_condition=
|
SET DEBUG_SYNC="now WAIT_FOR select_blocked";
|
||||||
select count(*) = 1 from information_schema.processlist
|
|
||||||
where info = 'UPDATE t SET b = 20 WHERE a';
|
|
||||||
--source include/wait_condition.inc
|
|
||||||
|
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
--connection consistent
|
--connection consistent
|
||||||
@ -91,15 +91,11 @@ BEGIN; UPDATE t SET a = 10;
|
|||||||
|
|
||||||
--connection con_weird
|
--connection con_weird
|
||||||
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
||||||
|
SET DEBUG_SYNC="lock_wait_before_suspend SIGNAL select_blocked";
|
||||||
send UPDATE t SET b = 20 WHERE a;
|
send UPDATE t SET b = 20 WHERE a;
|
||||||
|
|
||||||
--connection default
|
--connection default
|
||||||
let $wait_condition=
|
SET DEBUG_SYNC="now WAIT_FOR select_blocked";
|
||||||
select count(*) = 1 from information_schema.processlist
|
|
||||||
where state = 'Updating'
|
|
||||||
and info = 'UPDATE t SET b = 20 WHERE a';
|
|
||||||
--source include/wait_condition.inc
|
|
||||||
|
|
||||||
SELECT * FROM t;
|
SELECT * FROM t;
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
@ -123,14 +119,11 @@ SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
|||||||
BEGIN;
|
BEGIN;
|
||||||
# As semi-consistent read is disabled for innodb_snapshot_isolation=ON, the
|
# As semi-consistent read is disabled for innodb_snapshot_isolation=ON, the
|
||||||
# following UPDATE must be blocked on the first record.
|
# following UPDATE must be blocked on the first record.
|
||||||
|
SET DEBUG_SYNC="lock_wait_before_suspend SIGNAL select_blocked";
|
||||||
--send UPDATE t SET b = 2 WHERE a
|
--send UPDATE t SET b = 2 WHERE a
|
||||||
|
|
||||||
--connection default
|
--connection default
|
||||||
let $wait_condition=
|
SET DEBUG_SYNC="now WAIT_FOR select_blocked";
|
||||||
select count(*) = 1 from information_schema.processlist
|
|
||||||
where state = 'Updating' and info = 'UPDATE t SET b = 2 WHERE a';
|
|
||||||
--source include/wait_condition.inc
|
|
||||||
|
|
||||||
UPDATE t SET a = 1;
|
UPDATE t SET a = 1;
|
||||||
COMMIT;
|
COMMIT;
|
||||||
--connection consistent
|
--connection consistent
|
||||||
@ -149,13 +142,15 @@ DROP TABLE t;
|
|||||||
--echo # MDEV-33802 Weird read view after ROLLBACK of other transactions
|
--echo # MDEV-33802 Weird read view after ROLLBACK of other transactions
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
CREATE TABLE t(a INT PRIMARY KEY, b INT UNIQUE) ENGINE=InnoDB;
|
CREATE TABLE t(a INT PRIMARY KEY, b INT UNIQUE) ENGINE=InnoDB STATS_PERSISTENT=0;
|
||||||
INSERT INTO t SET a=1;
|
|
||||||
|
|
||||||
BEGIN; INSERT INTO t SET a=2;
|
|
||||||
|
|
||||||
--connection consistent
|
--connection consistent
|
||||||
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||||
|
|
||||||
|
--connection default
|
||||||
|
INSERT INTO t SET a=1;
|
||||||
|
|
||||||
|
--connection consistent
|
||||||
SAVEPOINT sp1;
|
SAVEPOINT sp1;
|
||||||
--disable_ps2_protocol
|
--disable_ps2_protocol
|
||||||
--error ER_CHECKREAD
|
--error ER_CHECKREAD
|
||||||
@ -163,29 +158,100 @@ SELECT * FROM t FORCE INDEX (b) FOR UPDATE;
|
|||||||
--enable_ps2_protocol
|
--enable_ps2_protocol
|
||||||
SAVEPOINT sp1;
|
SAVEPOINT sp1;
|
||||||
|
|
||||||
|
--connection default
|
||||||
|
BEGIN; INSERT INTO t SET a=2;
|
||||||
|
|
||||||
--connection con_weird
|
--connection con_weird
|
||||||
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||||
send
|
SET DEBUG_SYNC="lock_wait_before_suspend SIGNAL select_blocked";
|
||||||
SELECT * FROM t FORCE INDEX (b) FOR UPDATE;
|
--send SELECT * FROM t FORCE INDEX (b) FOR UPDATE
|
||||||
|
|
||||||
--connection default
|
--connection default
|
||||||
let $wait_condition=
|
SET DEBUG_SYNC="now WAIT_FOR select_blocked";
|
||||||
select count(*) = 1 from information_schema.processlist
|
|
||||||
where state = 'Sending data'
|
|
||||||
and info LIKE 'SELECT * FROM t %';
|
|
||||||
--source include/wait_condition.inc
|
|
||||||
ROLLBACK;
|
ROLLBACK;
|
||||||
|
|
||||||
--connection con_weird
|
--connection con_weird
|
||||||
--reap
|
--reap
|
||||||
SELECT * FROM t FORCE INDEX (b) FOR UPDATE;
|
SELECT * FROM t FORCE INDEX (b) FOR UPDATE;
|
||||||
|
COMMIT;
|
||||||
--disconnect con_weird
|
--disconnect con_weird
|
||||||
|
|
||||||
--connection consistent
|
--connection consistent
|
||||||
SELECT * FROM t FORCE INDEX (b) FOR UPDATE;
|
SELECT * FROM t FORCE INDEX (b) FOR UPDATE;
|
||||||
--disconnect consistent
|
COMMIT;
|
||||||
|
|
||||||
--connection default
|
--connection default
|
||||||
|
TRUNCATE TABLE t;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-36639 innodb_snapshot_isolation=1 gives error for not comitted row changes
|
||||||
|
--echo #
|
||||||
|
INSERT INTO t VALUES (1,1),(2,2);
|
||||||
|
|
||||||
|
--connection default
|
||||||
|
--echo # Case 1: Transaction A modifies a record, transaction B with snapshot
|
||||||
|
--echo # isolation level is blocked by A, then A is committed.
|
||||||
|
--echo # Expected behaviour: B gets ER_CHECKREAD.
|
||||||
|
BEGIN;
|
||||||
|
UPDATE t SET b=3 WHERE a = 1;
|
||||||
|
|
||||||
|
--connection consistent
|
||||||
|
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
|
||||||
|
BEGIN;
|
||||||
|
SELECT * FROM t;
|
||||||
|
SET DEBUG_SYNC="lock_wait_before_suspend SIGNAL select_blocked";
|
||||||
|
--send SELECT * FROM t WHERE a=1 FOR UPDATE
|
||||||
|
|
||||||
|
--connection default
|
||||||
|
SET DEBUG_SYNC="now WAIT_FOR select_blocked";
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
--connection consistent
|
||||||
|
--error ER_CHECKREAD
|
||||||
|
--reap
|
||||||
|
|
||||||
|
--echo # Case 2: Transaction A modifies a record, transaction B with snapshot
|
||||||
|
--echo # isolation level is blocked by A, then A is rolled back.
|
||||||
|
--echo # Expected behaviour: B continues execution.
|
||||||
|
|
||||||
|
--connection default
|
||||||
|
BEGIN;
|
||||||
|
UPDATE t SET b=4 WHERE a=1;
|
||||||
|
|
||||||
|
--connection consistent
|
||||||
|
BEGIN;
|
||||||
|
SELECT * FROM t;
|
||||||
|
SET DEBUG_SYNC="lock_wait_before_suspend SIGNAL select_blocked";
|
||||||
|
--send SELECT * FROM t WHERE a=1 FOR UPDATE
|
||||||
|
|
||||||
|
--connection default
|
||||||
|
SET DEBUG_SYNC="now WAIT_FOR select_blocked";
|
||||||
|
ROLLBACK;
|
||||||
|
|
||||||
|
--connection consistent
|
||||||
|
--reap
|
||||||
|
ROLLBACK;
|
||||||
|
|
||||||
|
--echo # Case 3: Transaction B with snapshot isolation level started with
|
||||||
|
--echo # consistent snapshot. Transaction A modifies a record and is committed.
|
||||||
|
--echo # Both B tries to read modified by A record.
|
||||||
|
--echo # Expected behavior: B gets ER_CHECKREAD.
|
||||||
|
|
||||||
|
--connection consistent
|
||||||
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||||
|
|
||||||
|
--connection default
|
||||||
|
UPDATE t SET b=4 WHERE a=1;
|
||||||
|
|
||||||
|
--connection consistent
|
||||||
|
--error ER_CHECKREAD
|
||||||
|
SELECT * FROM t WHERE a=1 FOR UPDATE;
|
||||||
|
--disconnect consistent
|
||||||
|
--disconnect disable_purging
|
||||||
|
|
||||||
|
--connection default
|
||||||
|
SET DEBUG_SYNC="RESET";
|
||||||
DROP TABLE t;
|
DROP TABLE t;
|
||||||
|
|
||||||
|
--source include/wait_until_count_sessions.inc
|
||||||
--echo # End of 10.6 tests
|
--echo # End of 10.6 tests
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
--source include/have_innodb.inc
|
--source include/have_innodb.inc
|
||||||
|
--source include/have_sequence.inc
|
||||||
--source include/have_debug.inc
|
--source include/have_debug.inc
|
||||||
--source include/have_debug_sync.inc
|
--source include/have_debug_sync.inc
|
||||||
--source include/count_sessions.inc
|
--source include/count_sessions.inc
|
||||||
@ -26,3 +27,14 @@ SET DEBUG_SYNC= 'RESET';
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
--source include/wait_until_count_sessions.inc
|
--source include/wait_until_count_sessions.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-36649 dict_acquire_mdl_shared() aborts when table
|
||||||
|
--echo # mode is DICT_TABLE_OP_OPEN_ONLY_IF_CACHED
|
||||||
|
--echo #
|
||||||
|
set @old_defragment_stats_accuracy= @@innodb_defragment_stats_accuracy;
|
||||||
|
SET GLOBAL innodb_defragment_stats_accuracy=1;
|
||||||
|
CREATE TABLE t (a INT ) ENGINE=INNODB;
|
||||||
|
INSERT INTO t SELECT * FROM seq_1_to_1000;
|
||||||
|
DROP TABLE t;
|
||||||
|
set global innodb_defragment_stats_accuracy= @old_defragment_stats_accuracy;
|
||||||
|
@ -738,6 +738,8 @@ lookup:
|
|||||||
dict_sys.freeze(SRW_LOCK_CALL);
|
dict_sys.freeze(SRW_LOCK_CALL);
|
||||||
goto return_without_mdl;
|
goto return_without_mdl;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
goto return_without_mdl;
|
||||||
|
|
||||||
if (*mdl)
|
if (*mdl)
|
||||||
{
|
{
|
||||||
|
@ -6052,17 +6052,10 @@ lock_clust_rec_modify_check_and_lock(
|
|||||||
for it */
|
for it */
|
||||||
|
|
||||||
trx_t *trx = thr_get_trx(thr);
|
trx_t *trx = thr_get_trx(thr);
|
||||||
if (const trx_t *owner =
|
if (lock_rec_convert_impl_to_expl<true>(trx, *block,
|
||||||
lock_rec_convert_impl_to_expl<true>(trx, *block,
|
rec, index, offsets) == trx) {
|
||||||
rec, index, offsets)) {
|
/* We already hold an exclusive lock. */
|
||||||
if (owner == trx) {
|
return DB_SUCCESS;
|
||||||
/* We already hold an exclusive lock. */
|
|
||||||
return DB_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (trx->snapshot_isolation && trx->read_view.is_open()) {
|
|
||||||
return DB_RECORD_CHANGED;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err = lock_rec_lock(true, LOCK_X | LOCK_REC_NOT_GAP,
|
err = lock_rec_lock(true, LOCK_X | LOCK_REC_NOT_GAP,
|
||||||
@ -6224,19 +6217,11 @@ lock_sec_rec_read_check_and_lock(
|
|||||||
return DB_SUCCESS;
|
return DB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (page_rec_is_supremum(rec)) {
|
if (!page_rec_is_supremum(rec)
|
||||||
} else if (const trx_t *owner =
|
&& lock_rec_convert_impl_to_expl<false>(trx, *block, rec, index,
|
||||||
lock_rec_convert_impl_to_expl<false>(trx, *block,
|
offsets) == trx
|
||||||
rec, index, offsets)) {
|
&& gap_mode == LOCK_REC_NOT_GAP) {
|
||||||
if (owner == trx) {
|
return DB_SUCCESS;
|
||||||
if (gap_mode == LOCK_REC_NOT_GAP) {
|
|
||||||
/* We already hold an exclusive lock. */
|
|
||||||
return DB_SUCCESS;
|
|
||||||
}
|
|
||||||
} else if (trx->snapshot_isolation
|
|
||||||
&& trx->read_view.is_open()) {
|
|
||||||
return DB_RECORD_CHANGED;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
@ -6316,28 +6301,24 @@ lock_clust_rec_read_check_and_lock(
|
|||||||
trx_t *trx = thr_get_trx(thr);
|
trx_t *trx = thr_get_trx(thr);
|
||||||
if (lock_table_has(trx, index->table, LOCK_X)
|
if (lock_table_has(trx, index->table, LOCK_X)
|
||||||
|| heap_no == PAGE_HEAP_NO_SUPREMUM) {
|
|| heap_no == PAGE_HEAP_NO_SUPREMUM) {
|
||||||
} else if (const trx_t *owner =
|
} else if (lock_rec_convert_impl_to_expl<true>(trx, *block, rec, index,
|
||||||
lock_rec_convert_impl_to_expl<true>(trx, *block,
|
offsets) == trx
|
||||||
rec, index, offsets)) {
|
&& gap_mode == LOCK_REC_NOT_GAP) {
|
||||||
if (owner == trx) {
|
/* We already hold an exclusive lock. */
|
||||||
if (gap_mode == LOCK_REC_NOT_GAP) {
|
return DB_SUCCESS;
|
||||||
/* We already hold an exclusive lock. */
|
|
||||||
return DB_SUCCESS;
|
|
||||||
}
|
|
||||||
} else if (trx->snapshot_isolation
|
|
||||||
&& trx->read_view.is_open()) {
|
|
||||||
return DB_RECORD_CHANGED;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (heap_no > PAGE_HEAP_NO_SUPREMUM && gap_mode != LOCK_GAP
|
if (heap_no > PAGE_HEAP_NO_SUPREMUM && gap_mode != LOCK_GAP
|
||||||
&& trx->snapshot_isolation
|
&& trx->snapshot_isolation
|
||||||
&& trx->read_view.is_open()
|
&& trx->read_view.is_open()) {
|
||||||
&& !trx->read_view.changes_visible(
|
trx_id_t trx_id= trx_read_trx_id(rec +
|
||||||
trx_read_trx_id(rec + row_trx_id_offset(rec, index)))
|
row_trx_id_offset(rec, index));
|
||||||
&& IF_WSREP(!(trx->is_wsrep()
|
if (!trx_sys.is_registered(trx, trx_id)
|
||||||
|
&& !trx->read_view.changes_visible(trx_id)
|
||||||
|
&& IF_WSREP(!(trx->is_wsrep()
|
||||||
&& wsrep_thd_skip_locking(trx->mysql_thd)), true)) {
|
&& wsrep_thd_skip_locking(trx->mysql_thd)), true)) {
|
||||||
return DB_RECORD_CHANGED;
|
return DB_RECORD_CHANGED;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dberr_t err = lock_rec_lock(false, gap_mode | mode,
|
dberr_t err = lock_rec_lock(false, gap_mode | mode,
|
||||||
|
@ -1266,6 +1266,13 @@ got_deleted:
|
|||||||
} else if (p.second // the first FILE_MODIFY or FILE_RENAME
|
} else if (p.second // the first FILE_MODIFY or FILE_RENAME
|
||||||
|| f.name != fname.name) {
|
|| f.name != fname.name) {
|
||||||
reload:
|
reload:
|
||||||
|
if (f.name.size() == 0) {
|
||||||
|
/* Augment the recv_spaces.emplace_hint() for the
|
||||||
|
FILE_MODIFY record that had been added by
|
||||||
|
recv_sys_t::parse() */
|
||||||
|
f.name = fname.name;
|
||||||
|
}
|
||||||
|
|
||||||
fil_space_t* space;
|
fil_space_t* space;
|
||||||
|
|
||||||
/* Check if the tablespace file exists and contains
|
/* Check if the tablespace file exists and contains
|
||||||
@ -2715,8 +2722,8 @@ restart:
|
|||||||
if (i != recv_spaces.end() && i->first == space_id);
|
if (i != recv_spaces.end() && i->first == space_id);
|
||||||
else if (lsn < file_checkpoint)
|
else if (lsn < file_checkpoint)
|
||||||
/* We have not seen all records between the checkpoint and
|
/* We have not seen all records between the checkpoint and
|
||||||
FILE_CHECKPOINT. There should be a FILE_DELETE for this
|
FILE_CHECKPOINT. There should be a FILE_DELETE or FILE_MODIFY
|
||||||
tablespace later. */
|
for this tablespace later, to be handled in fil_name_process(). */
|
||||||
recv_spaces.emplace_hint(i, space_id, file_name_t("", false));
|
recv_spaces.emplace_hint(i, space_id, file_name_t("", false));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -4288,7 +4295,7 @@ recv_init_missing_space(dberr_t err, const recv_spaces_t::const_iterator& i)
|
|||||||
break;
|
break;
|
||||||
case SRV_OPERATION_RESTORE:
|
case SRV_OPERATION_RESTORE:
|
||||||
case SRV_OPERATION_RESTORE_EXPORT:
|
case SRV_OPERATION_RESTORE_EXPORT:
|
||||||
if (i->second.name.find("/#sql") != std::string::npos) {
|
if (i->second.name.find("/#sql") == std::string::npos) {
|
||||||
sql_print_warning("InnoDB: Tablespace " UINT32PF
|
sql_print_warning("InnoDB: Tablespace " UINT32PF
|
||||||
" was not found at %.*s when"
|
" was not found at %.*s when"
|
||||||
" restoring a (partial?) backup."
|
" restoring a (partial?) backup."
|
||||||
|
Reference in New Issue
Block a user