diff --git a/src/storage/ob_tenant_file_mgr.cpp b/src/storage/ob_tenant_file_mgr.cpp index 63a9cb1a5..b79d19e82 100644 --- a/src/storage/ob_tenant_file_mgr.cpp +++ b/src/storage/ob_tenant_file_mgr.cpp @@ -63,7 +63,7 @@ int ObTenantFileMgr::alloc_file(const bool is_sys_table, ObStorageFileHandle& fi LOG_WARN("ObTenantFileMgr has not been inited", K(ret)); } else { ObTenantFileValue* value = nullptr; - if (OB_FAIL(choose_tenant_file(is_sys_table, true /*need create new file*/, tenant_file_map_, value))) { + if (OB_FAIL(choose_tenant_file(true /*need create new file*/, tenant_file_map_, value))) { LOG_WARN("fail to choose tenant file", K(ret)); } @@ -72,8 +72,7 @@ int ObTenantFileMgr::alloc_file(const bool is_sys_table, ObStorageFileHandle& fi const int64_t create_file_cnt = 1L; if (OB_FAIL(create_new_tenant_file(write_slog, is_sys_table, create_file_cnt))) { LOG_WARN("fail to create new files", K(ret)); - } else if (OB_FAIL(choose_tenant_file( - is_sys_table, false /*do not need create new file*/, tenant_file_map_, value))) { + } else if (OB_FAIL(choose_tenant_file(false /*do not need create new file*/, tenant_file_map_, value))) { LOG_WARN("fail to choose tenant file", K(ret)); } else if (nullptr == value) { ret = OB_ERR_UNEXPECTED; @@ -186,24 +185,23 @@ int ObTenantFileMgr::alloc_exist_file(const ObTenantFileInfo& file_info, const b } int ObTenantFileMgr::choose_tenant_file( - const bool is_sys_table, const bool need_create_file, TENANT_FILE_MAP& tenant_file_map, ObTenantFileValue*& value) + const bool need_create_file, TENANT_FILE_MAP& tenant_file_map, ObTenantFileValue*& value) { int ret = OB_SUCCESS; value = nullptr; if (OB_UNLIKELY(!is_inited_)) { ret = OB_NOT_INIT; LOG_WARN("ObTenantFileMgr has not been inited", K(ret)); - } else if (!is_sys_table && tenant_file_map.size() < TENANT_MIN_FILE_CNT && need_create_file) { + } else if (0 == tenant_file_map.size() && need_create_file) { // alloc one more file } else { for (TENANT_FILE_MAP::const_iterator iter = tenant_file_map.begin(); OB_SUCC(ret) && iter != tenant_file_map.end(); ++iter) { ObTenantFileValue* tmp_value = iter->second; - if (tmp_value->file_info_.tenant_file_super_block_.is_sys_table_file_ != is_sys_table) { - // do nothing - } else if ((tmp_value->file_info_.get_pg_cnt() < ObTenantFileValue::MAX_REF_CNT_PER_FILE || is_sys_table) && - TENANT_FILE_NORMAL == tmp_value->file_info_.tenant_file_super_block_.status_ && - tmp_value->storage_file_.file_->get_mark_and_sweep_status()) { + if (OB_UNLIKELY(!tmp_value->is_owner_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("file value is not owner", K(ret), K(*tmp_value)); + } else if (TENANT_FILE_NORMAL == tmp_value->file_info_.tenant_file_super_block_.status_) { if (nullptr == value) { value = iter->second; } else { @@ -215,13 +213,6 @@ int ObTenantFileMgr::choose_tenant_file( return ret; } -int ObTenantFileMgr::generate_unique_file_id(int64_t& file_id) -{ - int ret = OB_SUCCESS; - file_id = ObTimeUtility::current_time(); - return ret; -} - int ObTenantFileMgr::create_new_tenant_file(const bool write_slog, const bool create_sys_table, const int64_t file_cnt) { int ret = OB_SUCCESS; @@ -244,10 +235,8 @@ int ObTenantFileMgr::create_new_tenant_file(const bool write_slog, const bool cr for (int64_t i = 0; OB_SUCC(ret) && i < file_cnt; ++i) { void* buf = nullptr; ObTenantFileValue* value = nullptr; - int64_t file_id = -1; - if (OB_FAIL(generate_unique_file_id(file_id))) { - LOG_WARN("fail to generate unique file id", K(file_id)); - } else if (OB_ISNULL(buf = allocator_->alloc(sizeof(ObTenantFileValue)))) { + const int64_t file_id = ObTimeUtility::current_time(); + if (OB_ISNULL(buf = allocator_->alloc(sizeof(ObTenantFileValue)))) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("fail to allocate memory for tenant file value", K(ret)); } else { diff --git a/src/storage/ob_tenant_file_mgr.h b/src/storage/ob_tenant_file_mgr.h index a824e5512..f8901ec43 100644 --- a/src/storage/ob_tenant_file_mgr.h +++ b/src/storage/ob_tenant_file_mgr.h @@ -21,7 +21,6 @@ namespace oceanbase { namespace storage { - class ObTenantFileMgr final { public: ObTenantFileMgr(); @@ -64,11 +63,9 @@ public: private: static const int64_t TENANT_MAX_FILE_CNT = 1000; - static const int64_t TENANT_MIN_FILE_CNT = 10; typedef common::hash::ObHashMap TENANT_FILE_MAP; int create_new_tenant_file(const bool write_slog, const bool create_sys_table, const int64_t file_cnt); - int choose_tenant_file(const bool is_sys_table, const bool need_create_file, TENANT_FILE_MAP& tenant_file_map, - ObTenantFileValue*& value); + int choose_tenant_file(const bool need_create_file, TENANT_FILE_MAP& tenant_file_map, ObTenantFileValue*& value); int alloc_exist_file(const ObTenantFileInfo& tenant_file_info, const bool write_slog, const bool open_file, const bool is_owner, const bool from_svr_ckpt); int write_update_slog(const ObTenantFileKey& tenant_key, const bool in_slog_trans, @@ -77,7 +74,6 @@ private: int write_update_file_info_slog(const ObTenantFileKey& file_key, const ObTenantFileSuperBlock& super_block); int update_tenant_file_super_block_in_map( const ObTenantFileKey& tenant_key, const ObTenantFileSuperBlock& tenant_file_super_block); - int generate_unique_file_id(int64_t& file_id); int update_tenant_file_meta_blocks_impl( const ObTenantFileKey& file_key, const common::ObIArray& meta_block_list); diff --git a/src/storage/ob_tenant_file_super_block_checkpoint_writer.cpp b/src/storage/ob_tenant_file_super_block_checkpoint_writer.cpp index 436a7bae8..be1c813dc 100644 --- a/src/storage/ob_tenant_file_super_block_checkpoint_writer.cpp +++ b/src/storage/ob_tenant_file_super_block_checkpoint_writer.cpp @@ -13,6 +13,7 @@ #define USING_LOG_PREFIX STORAGE #include "ob_tenant_file_super_block_checkpoint_writer.h" +#include "share/schema/ob_multi_version_schema_service.h" #include "storage/ob_tenant_file_mgr.h" using namespace oceanbase::common; @@ -98,11 +99,21 @@ int ObTenantFileSuperBlockCheckpointWriter::write_checkpoint(blocksstable::ObSto LOG_INFO("get all tenant file infos", K(tenant_file_infos)); ObTenantFileSuperBlockItem item; for (int64_t i = 0; OB_SUCC(ret) && i < tenant_file_infos.count(); ++i) { + bool tenant_has_been_dropped = false; ObTenantFileInfo& file_info = *tenant_file_infos.at(i); ObTenantFileCheckpointEntry file_checkpoint_entry; if (OB_FAIL(file_checkpoint_map.get_refactored(file_info.tenant_key_, file_checkpoint_entry))) { if (OB_HASH_NOT_EXIST == ret) { - ret = OB_SUCCESS; + // in case any deleted tenant file info is leaked, check schema for sure + share::schema::ObSchemaGetterGuard schema_guard; + if (OB_FAIL(share::schema::ObMultiVersionSchemaService::get_instance().get_schema_guard(schema_guard))) { + LOG_ERROR("fail to get schema guard", K(ret)); + } else if (OB_FAIL(schema_guard.check_formal_guard())) { + LOG_WARN("fail to check formal schema guard", K(ret)); + } else if (OB_FAIL(schema_guard.check_if_tenant_has_been_dropped( + file_info.tenant_key_.tenant_id_, tenant_has_been_dropped))) { + LOG_ERROR("fail to check if tenant has been dropped", K(ret), K(file_info)); + } } else { LOG_WARN("fail to get from file checkpoint map", K(ret)); } @@ -112,7 +123,7 @@ int ObTenantFileSuperBlockCheckpointWriter::write_checkpoint(blocksstable::ObSto file_info.tenant_file_super_block_.pg_meta_entry_ = file_checkpoint_entry.super_block_.pg_meta_entry_; } - if (OB_SUCC(ret)) { + if (OB_SUCC(ret) && !tenant_has_been_dropped) { ObTenantFileSuperBlockCheckpointEntry entry(*tenant_file_infos.at(i)); item.set_tenant_file_entry(entry); if (OB_FAIL(writer_.write_item(&item))) { diff --git a/unittest/storage/test_tenant_file_mgr.cpp b/unittest/storage/test_tenant_file_mgr.cpp index e98e62841..f97da316d 100644 --- a/unittest/storage/test_tenant_file_mgr.cpp +++ b/unittest/storage/test_tenant_file_mgr.cpp @@ -81,9 +81,9 @@ TEST_F(TestTenantFileMgr, test_file_op) OB_SERVER_FILE_MGR.add_pg( ObTenantFileKey(handle2.get_storage_file()->get_tenant_id(), handle2.get_storage_file()->get_file_id()), pg_key2)); - ASSERT_NE(handle1.get_storage_file(), handle2.get_storage_file()); + ASSERT_EQ(handle1.get_storage_file(), handle2.get_storage_file()); ASSERT_EQ(OB_SUCCESS, OB_SERVER_FILE_MGR.get_all_tenant_file_infos(allocator, tenant_file_infos)); - ASSERT_EQ(2, tenant_file_infos.count()); + ASSERT_EQ(1, tenant_file_infos.count()); // alloc less than 10000 files for (int64_t i = 0; OB_SUCC(ret) && i < 9998; ++i) { @@ -96,7 +96,7 @@ TEST_F(TestTenantFileMgr, test_file_op) pg_key)); } ASSERT_EQ(OB_SUCCESS, OB_SERVER_FILE_MGR.get_all_tenant_file_infos(allocator, tenant_file_infos)); - ASSERT_EQ(10, tenant_file_infos.count()); + ASSERT_EQ(1, tenant_file_infos.count()); // alloc more than 10000 files for (int64_t i = 0; OB_SUCC(ret) && i < 3; ++i) { @@ -109,7 +109,7 @@ TEST_F(TestTenantFileMgr, test_file_op) pg_key)); } ASSERT_EQ(OB_SUCCESS, OB_SERVER_FILE_MGR.get_all_tenant_file_infos(allocator, tenant_file_infos)); - ASSERT_EQ(11, tenant_file_infos.count()); + ASSERT_EQ(1, tenant_file_infos.count()); } TEST_F(TestTenantFileMgr, test_update_tenant_file_super_block)