Commit 7f04686a authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-24049 InnoDB: Failing assertion: node->is_open() in fil_space_t::flush_low

As part of MDEV-23855, we eliminated fil_system.LRU
and changed the way how InnoDB data files are opened.
We are also enforcing the innodb_open_files limit when new
data files are created.

The function fil_space_t::flush() would be invoked by
row_quiesce_table_start(). If the table was already in clean state,
it is possible that the data file is not open.

fil_space_t::flush_low(): If the data file is not open,
check with a debug assertion that there are no unflushed changes,
and carry on.

Reviewed by: Eugene Kosov and Thirunarayanan Balathandayuthapani
parent e33d452b
SELECT @@GLOBAL.innodb_open_files;
@@GLOBAL.innodb_open_files
10
CREATE TABLE t0 (a INT) ENGINE=InnoDB;
FLUSH TABLE t0 WITH READ LOCK;
UNLOCK TABLES;
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
CREATE TABLE t2 (a INT) ENGINE=InnoDB;
CREATE TABLE t3 (a INT) ENGINE=InnoDB;
CREATE TABLE t4 (a INT) ENGINE=InnoDB;
CREATE TABLE t5 (a INT) ENGINE=InnoDB;
CREATE TABLE t6 (a INT) ENGINE=InnoDB;
CREATE TABLE t7 (a INT) ENGINE=InnoDB;
FLUSH TABLE t0 WITH READ LOCK;
UNLOCK TABLES;
DROP TABLE t0, t1, t2, t3, t4, t5, t6, t7;
--source include/have_innodb.inc
SELECT @@GLOBAL.innodb_open_files;
CREATE TABLE t0 (a INT) ENGINE=InnoDB;
# Ensure that the created table t0 is clean.
FLUSH TABLE t0 WITH READ LOCK;
UNLOCK TABLES;
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
CREATE TABLE t2 (a INT) ENGINE=InnoDB;
CREATE TABLE t3 (a INT) ENGINE=InnoDB;
CREATE TABLE t4 (a INT) ENGINE=InnoDB;
CREATE TABLE t5 (a INT) ENGINE=InnoDB;
CREATE TABLE t6 (a INT) ENGINE=InnoDB;
CREATE TABLE t7 (a INT) ENGINE=InnoDB;
# Now, the data file for t0 should not be open anymore.
FLUSH TABLE t0 WITH READ LOCK;
UNLOCK TABLES;
DROP TABLE t0, t1, t2, t3, t4, t5, t6, t7;
...@@ -514,7 +514,11 @@ inline void fil_space_t::flush_low() ...@@ -514,7 +514,11 @@ inline void fil_space_t::flush_low()
for (fil_node_t *node= UT_LIST_GET_FIRST(chain); node; for (fil_node_t *node= UT_LIST_GET_FIRST(chain); node;
node= UT_LIST_GET_NEXT(chain, node)) node= UT_LIST_GET_NEXT(chain, node))
{ {
ut_a(node->is_open()); if (!node->is_open())
{
ut_ad(!is_in_unflushed_spaces);
continue;
}
IF_WIN(if (node->is_raw_disk) continue,); IF_WIN(if (node->is_raw_disk) continue,);
os_file_flush(node->handle); os_file_flush(node->handle);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment