From 72437cbc12c9ef601b3d3fa7c6d9993ef2d027d6 Mon Sep 17 00:00:00 2001 From: Monty <monty@mariadb.org> Date: Mon, 28 Feb 2022 20:08:11 +0200 Subject: [PATCH 1/3] Fixed sporadic error in main.backup_locks The follwoing could happen if InnoDB did some background work while test was running: @@ -5,6 +5,8 @@ SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info; LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME MDL_SHARED_HIGH_PRIO Table metadata lock test t1 +MDL_SHARED Table metadata lock mysql innodb_table_stats +MDL_SHARED Table metadata lock mysql innodb_index_stat --- mysql-test/main/backup_locks.result | 8 ++++---- mysql-test/main/backup_locks.test | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/mysql-test/main/backup_locks.result b/mysql-test/main/backup_locks.result index 1e567c1a58d..478cd1ef537 100644 --- a/mysql-test/main/backup_locks.result +++ b/mysql-test/main/backup_locks.result @@ -2,19 +2,19 @@ # Test lock taken # BACKUP LOCK test.t1; -SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%"; LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME MDL_SHARED_HIGH_PRIO Table metadata lock test t1 BACKUP UNLOCK; -SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%"; LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME BACKUP LOCK t1; -SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%"; LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME MDL_SHARED_HIGH_PRIO Table metadata lock test t1 BACKUP UNLOCK; BACKUP LOCK non_existing.t1; -SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%"; LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME MDL_SHARED_HIGH_PRIO Table metadata lock non_existing t1 BACKUP UNLOCK; diff --git a/mysql-test/main/backup_locks.test b/mysql-test/main/backup_locks.test index 1271abfd993..02313186bec 100644 --- a/mysql-test/main/backup_locks.test +++ b/mysql-test/main/backup_locks.test @@ -11,14 +11,14 @@ --echo # BACKUP LOCK test.t1; -SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%"; BACKUP UNLOCK; -SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%"; BACKUP LOCK t1; -SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%"; BACKUP UNLOCK; BACKUP LOCK non_existing.t1; -SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%"; BACKUP UNLOCK; --echo # From 9af4c7c6d7420e71f323b7b582c47bc2e43fc68c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= <marko.makela@mariadb.com> Date: Tue, 1 Mar 2022 09:12:15 +0200 Subject: [PATCH 2/3] MDEV-27964: A better work-around Already the detection part of have_crypt.inc must be skipped in WITH_MSAN builds until the SIGSEGV in the crypt() interceptor has been fixed. --- mysql-test/include/have_crypt.inc | 2 ++ mysql-test/main/func_crypt.test | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/include/have_crypt.inc b/mysql-test/include/have_crypt.inc index 422f8922edc..ae94121980c 100644 --- a/mysql-test/include/have_crypt.inc +++ b/mysql-test/include/have_crypt.inc @@ -1,3 +1,5 @@ +# MDEV-27964 The function ENCRYPT() causes SIGSEGV in WITH_MSAN builds +-- source include/not_msan.inc # encrypt('a') is NULL if crypt(3) is not available # encrypt('a') is "*0" in fips mode if (`select length(encrypt('a')) > 3 IS NOT TRUE`) { diff --git a/mysql-test/main/func_crypt.test b/mysql-test/main/func_crypt.test index 7da3f0c0f98..907376049d8 100644 --- a/mysql-test/main/func_crypt.test +++ b/mysql-test/main/func_crypt.test @@ -1,6 +1,4 @@ -- source include/have_crypt.inc -# MDEV-27964 The function ENCRYPT() causes SIGSEGV in WITH_MSAN builds --- source include/not_msan.inc --disable_warnings drop table if exists t1; From a710016d578dc1165c511db19a5d4a094e736012 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= <marko.makela@mariadb.com> Date: Tue, 1 Mar 2022 09:13:25 +0200 Subject: [PATCH 3/3] MDEV-27967 Assertion !buf_pool.any_io_pending() failed The test innodb.log_file_size would occasionally crash in a debug assertion failure in srv_prepare_to_delete_redo_log_file(). In the core dump, the assertion would hold. buf_pool_t::any_io_pending(): Avoid dirty reads by acquiring buf_pool.mutex. This function is only being invoked in debug builds, so we do not care about any performance impact. --- storage/innobase/include/buf0buf.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/storage/innobase/include/buf0buf.h b/storage/innobase/include/buf0buf.h index 89987b05fdb..fec8dcb4e2a 100644 --- a/storage/innobase/include/buf0buf.h +++ b/storage/innobase/include/buf0buf.h @@ -2042,9 +2042,14 @@ public: buf_tmp_buffer_t *io_buf_reserve() { return io_buf.reserve(); } /** @return whether any I/O is pending */ - bool any_io_pending() const + bool any_io_pending() { - return n_pend_reads || n_flush_LRU() || n_flush_list(); + if (n_pend_reads) + return true; + mysql_mutex_lock(&mutex); + const bool any_pending{n_flush_LRU_ || n_flush_list_}; + mysql_mutex_unlock(&mutex); + return any_pending; } /** @return total amount of pending I/O */ ulint io_pending() const