From de1dbb7180b76b6034af01f7cb48db73161f4276 Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Mon, 1 Jun 2020 16:24:15 +0530 Subject: [PATCH] MDEV-21282 Assertion 'mariadb_table' failed in gcol.innodb_virtual_debug_purge - commit ea37b144094a0c2ebfc6774047fd473c1b2a8658 (MDEV-16678) caused a regression. when purge thread tries to open the table for virtual column computation, there is no need to acquire MDL for the table. Because purge thread already hold MDL for the table --- mysql-test/suite/gcol/r/gcol_purge.result | 22 +++++++++++++++++ mysql-test/suite/gcol/t/gcol_purge.test | 30 +++++++++++++++++++++++ sql/sql_class.cc | 3 ++- 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 mysql-test/suite/gcol/r/gcol_purge.result create mode 100644 mysql-test/suite/gcol/t/gcol_purge.test diff --git a/mysql-test/suite/gcol/r/gcol_purge.result b/mysql-test/suite/gcol/r/gcol_purge.result new file mode 100644 index 00000000000..ea8369ad8e5 --- /dev/null +++ b/mysql-test/suite/gcol/r/gcol_purge.result @@ -0,0 +1,22 @@ +CREATE TABLE t1(f1 INT NOT NULL, f2 int not null, +f3 int generated always as (f2 * 2) VIRTUAL, +primary key(f1), INDEX (f3))ENGINE=InnoDB; +connect con1,localhost,root,,,; +START TRANSACTION WITH CONSISTENT SNAPSHOT; +connection default; +INSERT INTO t1(f1, f2) VALUES(1,2); +DELETE from t1 where f1 = 1; +connect con2,localhost,root,,,; +begin; +INSERT INTO t1 (f1, f2) VALUES(1,2); +set global debug_dbug="+d,ib_purge_virtual_index_callback"; +connection con1; +COMMIT; +InnoDB 0 transactions not purged +connection con2; +commit; +disconnect con1; +disconnect con2; +connection default; +set global debug_dbug=default; +DROP TABLE t1; diff --git a/mysql-test/suite/gcol/t/gcol_purge.test b/mysql-test/suite/gcol/t/gcol_purge.test new file mode 100644 index 00000000000..3696b41b3d8 --- /dev/null +++ b/mysql-test/suite/gcol/t/gcol_purge.test @@ -0,0 +1,30 @@ +--source include/have_innodb.inc +--source include/have_debug.inc +CREATE TABLE t1(f1 INT NOT NULL, f2 int not null, + f3 int generated always as (f2 * 2) VIRTUAL, + primary key(f1), INDEX (f3))ENGINE=InnoDB; +connect(con1,localhost,root,,,); +START TRANSACTION WITH CONSISTENT SNAPSHOT; + +connection default; +INSERT INTO t1(f1, f2) VALUES(1,2); +DELETE from t1 where f1 = 1; + +connect(con2,localhost,root,,,); +begin; +INSERT INTO t1 (f1, f2) VALUES(1,2); + +set global debug_dbug="+d,ib_purge_virtual_index_callback"; +connection con1; +COMMIT; + +--source ../innodb/include/wait_all_purged.inc + +connection con2; +commit; + +disconnect con1; +disconnect con2; +connection default; +set global debug_dbug=default; +DROP TABLE t1; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 83ef31dc05b..cee2d644480 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -4716,7 +4716,8 @@ TABLE *open_purge_table(THD *thd, const char *db, size_t dblen, DBUG_ASSERT(thd->open_tables == NULL); DBUG_ASSERT(thd->locked_tables_mode < LTM_PRELOCKED); - Open_table_context ot_ctx(thd, 0); + /* Purge already hold the MDL for the table */ + Open_table_context ot_ctx(thd, MYSQL_OPEN_HAS_MDL_LOCK); TABLE_LIST *tl= (TABLE_LIST*)thd->alloc(sizeof(TABLE_LIST)); LEX_CSTRING db_name= {db, dblen }; LEX_CSTRING table_name= { tb, tblen };