summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Kosov <eugene.kosov@mariadb.com>2020-06-27 12:30:17 +0300
committerEugene Kosov <eugene.kosov@mariadb.com>2020-06-27 12:52:08 +0300
commite4cff9a85565d0183ab53601c1cef462f5f45fe5 (patch)
tree7c421e25bd3808882b22c2fc255e8ae9630d53ef
parent52c4abbff2ec4b97d6c69f238457bf759591ce15 (diff)
downloadmariadb-git-e4cff9a85565d0183ab53601c1cef462f5f45fe5.tar.gz
MDEV-19298 Assertion `space->id != 0xFFFFFFFEU || space == fil_system.temp_space' failed in Check::validate upon crash upgrade from 10.2.22
This issue is pretty much the same as MDEV-20213. The fix is similar to: 3c238ac51c21dd0b7ba410012cf317298873c0c2 52c4abbff2ec4b97d6c69f238457bf759591ce15 Check::validate(): fix a debug assertion SysTablespace::open_or_create(): protect assigning to a shared variable with a mutex
-rw-r--r--storage/innobase/fil/fil0fil.cc19
-rw-r--r--storage/innobase/fsp/fsp0sysspace.cc6
2 files changed, 19 insertions, 6 deletions
diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc
index 1c3ef644782..fc91d10cab6 100644
--- a/storage/innobase/fil/fil0fil.cc
+++ b/storage/innobase/fil/fil0fil.cc
@@ -4641,11 +4641,20 @@ struct Check {
Check check;
ut_list_validate(space->chain, check);
ut_a(space->size == check.size);
- ut_ad(space->id != TRX_SYS_SPACE
- || space == fil_system.sys_space
- || fil_system.sys_space == NULL);
- ut_ad(space->id != SRV_TMP_SPACE_ID
- || space == fil_system.temp_space);
+
+ switch (space->id) {
+ case TRX_SYS_SPACE:
+ ut_ad(fil_system.sys_space == NULL
+ || fil_system.sys_space == space);
+ break;
+ case SRV_TMP_SPACE_ID:
+ ut_ad(fil_system.temp_space == NULL
+ || fil_system.temp_space == space);
+ break;
+ default:
+ break;
+ }
+
return(check.n_open);
}
};
diff --git a/storage/innobase/fsp/fsp0sysspace.cc b/storage/innobase/fsp/fsp0sysspace.cc
index 6c185cbcf49..451187a35d9 100644
--- a/storage/innobase/fsp/fsp0sysspace.cc
+++ b/storage/innobase/fsp/fsp0sysspace.cc
@@ -904,9 +904,13 @@ SysTablespace::open_or_create(
} else if (is_temp) {
ut_ad(!fil_system.temp_space);
ut_ad(space_id() == SRV_TMP_SPACE_ID);
- space = fil_system.temp_space = fil_space_create(
+ space = fil_space_create(
name(), SRV_TMP_SPACE_ID, flags(),
FIL_TYPE_TEMPORARY, NULL);
+
+ mutex_enter(&fil_system.mutex);
+ fil_system.temp_space = space;
+ mutex_exit(&fil_system.mutex);
if (!space) {
return DB_ERROR;
}