mirror of
https://github.com/MariaDB/server.git
synced 2025-01-22 14:54:20 +01:00
db1888b53c
This was a deadlock between LOCK TABLES/CREATE DATABASE in one connection and DROP DATABASE in another. It only happened if the table locked by LOCK TABLES was in the database to be dropped. The deadlock is similar to the one in Bug#48940, but with LOCK TABLES instead of an active transaction. The order of events needed to trigger the deadlock was: 1) Connection 1 locks table db1.t1 using LOCK TABLES. It will now have a metadata lock on the table name. 2) Connection 2 issues DROP DATABASE db1. This will wait inside the MDL subsystem for the lock on db1.t1 to go away. While waiting, it will hold the LOCK_mysql_create_db mutex. 3) Connection 1 issues CREATE DATABASE (database name irrelevant). This will hang trying to lock the same mutex. Since this is the connection holding the metadata lock blocking Connection 2, we have a deadlock. This deadlock would also happen for earlier trees without MDL, but there DROP DATABASE would wait for a table to be removed from the table definition cache. This patch fixes the problem by prohibiting CREATE DATABASE in LOCK TABLES mode. In the example above, this prevents Connection 1 from hanging trying to get the LOCK_mysql_create_db mutex. Note that other commands that use LOCK_mysql_create_db (ALTER/DROP DATABASE) are already prohibited in LOCK TABLES mode. Incompatible change: CREATE DATABASE is now disallowed in LOCK TABLES mode. Test case added to schema.test.
49 lines
1.2 KiB
Text
49 lines
1.2 KiB
Text
drop database if exists mysqltest1;
|
|
create schema foo;
|
|
show create schema foo;
|
|
Database Create Database
|
|
foo CREATE DATABASE `foo` /*!40100 DEFAULT CHARACTER SET latin1 */
|
|
show schemas;
|
|
Database
|
|
information_schema
|
|
foo
|
|
mtr
|
|
mysql
|
|
test
|
|
drop schema foo;
|
|
#
|
|
# Bug #48940 MDL deadlocks against mysql_rm_db
|
|
#
|
|
DROP SCHEMA IF EXISTS schema1;
|
|
# Connection default
|
|
CREATE SCHEMA schema1;
|
|
CREATE TABLE schema1.t1 (a INT);
|
|
SET autocommit= FALSE;
|
|
INSERT INTO schema1.t1 VALUES (1);
|
|
# Connection 2
|
|
DROP SCHEMA schema1;
|
|
# Connection default
|
|
ALTER SCHEMA schema1 DEFAULT CHARACTER SET utf8;
|
|
Got one of the listed errors
|
|
SET autocommit= TRUE;
|
|
# Connection 2
|
|
# Connection default
|
|
#
|
|
# Bug #49988 MDL deadlocks with mysql_create_db, reload_acl_and_cache
|
|
#
|
|
DROP SCHEMA IF EXISTS schema1;
|
|
# Connection default
|
|
CREATE SCHEMA schema1;
|
|
CREATE TABLE schema1.t1 (id INT);
|
|
LOCK TABLE schema1.t1 WRITE;
|
|
# Connection con2
|
|
DROP SCHEMA schema1;
|
|
# Connection default
|
|
# CREATE SCHEMA used to give a deadlock.
|
|
# Now we prohibit CREATE SCHEMA in LOCK TABLES mode.
|
|
CREATE SCHEMA IF NOT EXISTS schema1;
|
|
ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction
|
|
# UNLOCK TABLES so DROP SCHEMA can continue.
|
|
UNLOCK TABLES;
|
|
# Connection con2
|
|
# Connection default
|