MDEV-21282 Assertion 'mariadb_table' failed in gcol.innodb_virtual_debug_purge

- commit ea37b14409 (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
This commit is contained in:
Thirunarayanan Balathandayuthapani 2020-06-01 16:24:15 +05:30
parent d88870e6cc
commit de1dbb7180
3 changed files with 54 additions and 1 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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 };