diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index a8b7ff9c1e4..4e14e1bb86f 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -4692,11 +4692,15 @@ bool Fil_shard::space_truncate(space_id_t space_id, page_no_t size_in_pages) { bool success = os_file_truncate(file.name, file.handle, 0); if (success) { + /* update size in time to ensure the value in i_s table is correct */ + space->size = file.size = 0; os_offset_t size = size_in_pages * UNIV_PAGE_SIZE; success = os_file_set_size(file.name, file.handle, 0, size, true); + DBUG_EXECUTE_IF("os_file_truncate_error", { success = false; }); if (success) { + space->size = file.size = size_in_pages; space->stop_new_ops = false; } } diff --git a/storage/innobase/srv/srv0tmp.cc b/storage/innobase/srv/srv0tmp.cc index e4b9e9e0697..25aea584739 100644 --- a/storage/innobase/srv/srv0tmp.cc +++ b/storage/innobase/srv/srv0tmp.cc @@ -228,8 +228,10 @@ void Tablespace_pool::free_ts(Tablespace *ts) { fil_space_t *space = fil_space_get(space_id); ut_ad(space != nullptr); - if (space->size != FIL_IBT_FILE_INITIAL_SIZE) { - ts->truncate(); + if (!ts->truncate()) { + /* if truncate failed, keep this tablespace in m_active so that no thread + can use it */ + return; } acquire();