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