1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

MDEV-20945: BACKUP UNLOCK + FTWRL assertion failure

MDEV-20945: BACKUP UNLOCK + FTWRL assertion failure | SIGSEGV in I_P_List
from MDL_context::release_lock on INSERT w/ BACKUP LOCK (on optimized
builds) | Assertion `ticket->m_duration == MDL_EXPLICIT' failed

BACKUP LOCK behavior is modified so it won't be used wrong:
- BACKUP LOCK should commit any active transactions.
- BACKUP LOCK should not be allowed in stored procedures.
- When BACKUP LOCK is active, don't allow any DDL's for that connection.
- FTWRL is forbidden on the same connection while BACKUP LOCK is active.

Reviewed-by: monty@mariadb.com
This commit is contained in:
Rinat Ibragimov
2020-10-21 23:34:36 +03:00
committed by Monty
parent ac8d205795
commit 709ba7dcae
10 changed files with 277 additions and 4 deletions

View File

@ -43,6 +43,125 @@ SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.me
--error ER_LOCK_DEADLOCK
select * from t1;
backup unlock;
--echo #
--echo # BACKUP LOCK and BACKUP UNLOCK are not allowed in procedures.
--echo #
delimiter |;
--error ER_SP_BADSTATEMENT
CREATE PROCEDURE p_BACKUP_LOCK()
BEGIN
BACKUP LOCK;
END|
--error ER_SP_BADSTATEMENT
CREATE PROCEDURE p_BACKUP_UNLOCK()
BEGIN
BACKUP UNLOCK;
END|
delimiter ;|
--echo #
--echo # BACKUP STAGE doesn't work when a BACKUP LOCK is active.
--echo #
CREATE TABLE t1 (a INT);
BACKUP LOCK t1;
--error ER_CANT_UPDATE_WITH_READLOCK
BACKUP STAGE START;
BACKUP UNLOCK;
DROP TABLE t1;
--echo #
--echo # FLUSH TABLES WITH READ LOCK is not allowed when BACKUP LOCK is active.
--echo #
CREATE TABLE t1 (a INT);
BACKUP LOCK t1;
--error ER_LOCK_OR_ACTIVE_TRANSACTION
FLUSH TABLES t1 WITH READ LOCK;
BACKUP UNLOCK;
BACKUP LOCK t1;
FLUSH TABLES WITH READ LOCK;
BACKUP UNLOCK;
UNLOCK TABLES;
DROP TABLE t1;
--echo #
--echo # MDEV-20945 BACKUP UNLOCK assertion failures.
--echo #
--echo # Scenario 1.
CREATE TABLE t1 (a INT);
BACKUP LOCK t1;
--error ER_LOCK_OR_ACTIVE_TRANSACTION
FLUSH TABLE t1 WITH READ LOCK;
UNLOCK TABLES;
BACKUP UNLOCK; # Shouldn't trigger an assertion.
DROP TABLE t1;
--echo # Scenario 2.
CREATE TABLE t1 (a INT);
CREATE TABLE t2 (b INT);
LOCK TABLES t2 AS a2 WRITE;
--error ER_LOCK_OR_ACTIVE_TRANSACTION
BACKUP LOCK t1;
UNLOCK TABLES;
INSERT INTO t1 VALUES(0);
--source include/restart_mysqld.inc
DROP TABLE t1;
DROP TABLE t2;
--echo # Scenario 3.
CREATE TEMPORARY TABLE t3 (c INT);
BACKUP LOCK t1; # Table `t1` doesn't exist.
SET @@SESSION.profiling=ON;
--error ER_CANT_UPDATE_WITH_READLOCK
CREATE TABLE t1 (c INT);
--error ER_LOCK_OR_ACTIVE_TRANSACTION
LOCK TABLES t3 AS a1 READ, t1 AS a3 READ, t3 AS a5 READ LOCAL;
UNLOCK TABLE;
--source include/restart_mysqld.inc
--echo # Scenario 4.
CREATE TABLE t (c INT);
BACKUP LOCK not_existing.t;
--error ER_LOCK_OR_ACTIVE_TRANSACTION
LOCK TABLES t WRITE;
UNLOCK TABLES;
--source include/restart_mysqld.inc
DROP TABLE t;
--echo # Scenario 5.
BACKUP LOCK t1;
--error ER_CANT_UPDATE_WITH_READLOCK
CREATE TABLE t2 (c1 TIME, c2 TIME, c3 DATE, KEY(c1, c2));
--error ER_LOCK_OR_ACTIVE_TRANSACTION
LOCK TABLE t2 READ;
--source include/restart_mysqld.inc
--echo # Scenario 6.
BACKUP LOCK t;
--error ER_CANT_UPDATE_WITH_READLOCK
CREATE VIEW v AS SELECT 1;
--error ER_LOCK_OR_ACTIVE_TRANSACTION
LOCK TABLES v READ;
START TRANSACTION READ ONLY;
BACKUP LOCK t;
--source include/restart_mysqld.inc
--echo # Scenario 7.
SET SQL_MODE='';
SET STATEMENT max_statement_time=180 FOR BACKUP LOCK test.u;
--error ER_CANT_UPDATE_WITH_READLOCK
CREATE TABLE t (a INT) ENGINE=Aria;
CREATE TEMPORARY TABLE IF NOT EXISTS s (c INT) ENGINE=Aria;
--error ER_LOCK_OR_ACTIVE_TRANSACTION
LOCK TABLES s AS a READ LOCAL,t AS b WRITE;
--let $q= `SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE`
SET STATEMENT max_statement_time=180 FOR BACKUP LOCK test.u;
--source include/restart_mysqld.inc
--echo #
connection con1;
--reap
connection default;