/** * Copyright (c) 2021 OceanBase * OceanBase CE is licensed under Mulan PubL v2. * You can use this software according to the terms and conditions of the Mulan PubL v2. * You may obtain a copy of Mulan PubL v2 at: * http://license.coscl.org.cn/MulanPubL-2.0 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PubL v2 for more details. */ #define USING_LOG_PREFIX STORAGETEST #include #define protected public #define private public #include "mittest/mtlenv/mock_tenant_module_env.h" #include "storage/shared_storage/ob_ss_format_util.h" #include "mittest/shared_storage/clean_residual_data.h" #include "storage/tmp_file/ob_tmp_file_manager.h" #include "storage/shared_storage/ob_file_helper.h" #undef private #undef protected namespace oceanbase { namespace storage { using namespace oceanbase::blocksstable; using namespace oceanbase::storage; #define PRINT_MACRO_ID_TO_PATH(OBJ_TYPE, IS_LOCAL_CACHE) \ { \ file_id.set_storage_object_type(OBJ_TYPE); \ ret = ctx.set_file_ctx(file_id, ls_epoch_id, IS_LOCAL_CACHE); \ LOG_INFO("file id to path", KR(ret), K(file_id), K(ls_epoch_id), K(IS_LOCAL_CACHE), K(ctx.get_path())); \ } #define PRINT_MACRO_ID_PARENT_DIR_PATH(OBJ_TYPE) \ { \ file_id.set_storage_object_type(OBJ_TYPE); \ ret = ObFileHelper::get_file_parent_dir(dir_path, common::MAX_PATH_SIZE, file_id, ls_epoch_id); \ LOG_INFO("file id's parent dir path", KR(ret), K(file_id), K(ls_epoch_id), K(dir_path)); \ } #define CHECK_MACRO_ID_TO_PATH(OBJ_TYPE, IS_LOCAL_CACHE, EXPECTED_RET, EXPECTED_PATH) \ { \ file_id.set_storage_object_type(static_cast(ObStorageObjectType::OBJ_TYPE)); \ ASSERT_EQ(EXPECTED_RET, ctx.set_file_ctx(file_id, ls_epoch_id, IS_LOCAL_CACHE)); \ if (OB_SUCCESS == EXPECTED_RET) { \ expected_path[0] = '\0'; \ if (IS_LOCAL_CACHE) { \ ASSERT_EQ(OB_SUCCESS, databuff_printf(expected_path, common::MAX_PATH_SIZE, "%s/%s", \ OB_DIR_MGR.get_local_cache_root_dir(), EXPECTED_PATH)); \ } else { \ ASSERT_EQ(OB_SUCCESS, databuff_printf(expected_path, common::MAX_PATH_SIZE, "%s/%s", object_storage_root_dir, EXPECTED_PATH)); \ } \ ASSERT_EQ(0, STRCMP(ctx.get_path(), expected_path)) << ctx.get_path() << "\n" << expected_path; \ } \ } #define CHECK_MACRO_ID_PARENT_DIR(OBJ_TYPE, EXPECTED_RET, EXPECTED_PATH) \ { \ file_id.set_storage_object_type(static_cast(ObStorageObjectType::OBJ_TYPE)); \ dir_path[0] = '\0'; \ ASSERT_EQ(EXPECTED_RET, ObFileHelper::get_file_parent_dir(dir_path, common::MAX_PATH_SIZE, file_id, ls_epoch_id)); \ if (OB_SUCCESS == EXPECTED_RET) { \ expected_dir_path[0] = '\0'; \ ASSERT_EQ(OB_SUCCESS, databuff_printf(expected_dir_path, common::MAX_PATH_SIZE, "%s/%s", \ OB_DIR_MGR.get_local_cache_root_dir(), EXPECTED_PATH)); \ ASSERT_EQ(0, STRCMP(dir_path, expected_dir_path))<< dir_path << "\n" << expected_dir_path; \ } \ } #define CHECK_INC_MACRO_ID_TO_PATH(OBJ_TYPE, IS_LOCAL_CACHE, INNER_TABLET, EXPECTED_PATH) \ { \ inc_file_id.set_storage_object_type(static_cast(ObStorageObjectType::OBJ_TYPE)); \ inc_file_id.set_meta_is_inner_tablet(INNER_TABLET/*is_inner_tablet*/); \ expected_path[0] = '\0'; \ ASSERT_EQ(OB_SUCCESS, ctx.set_file_ctx(inc_file_id, ls_epoch_id, IS_LOCAL_CACHE)); \ if (IS_LOCAL_CACHE) { \ ASSERT_EQ(OB_SUCCESS, databuff_printf(expected_path, common::MAX_PATH_SIZE, "%s/%s", \ OB_DIR_MGR.get_local_cache_root_dir(), EXPECTED_PATH)); \ } else { \ ASSERT_EQ(OB_SUCCESS, databuff_printf(expected_path, common::MAX_PATH_SIZE, "%s/%s", object_storage_root_dir, EXPECTED_PATH)); \ } \ ASSERT_EQ(0, STRCMP(ctx.get_path(), expected_path)) << ctx.get_path() << "\n" << expected_path; \ } class TestFileDelOp : public share::ObScanDirOp { public: TestFileDelOp(const char *dir = nullptr) {} virtual int func(const dirent *entry) override { int ret = OB_SUCCESS; if (OB_ISNULL(entry)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid entry", KR(ret)); } else { char full_path[common::MAX_PATH_SIZE] = { 0 }; int p_ret = snprintf(full_path, sizeof(full_path), "%s/%s", dir_, entry->d_name); if (p_ret <= 0 || p_ret >= sizeof(full_path)) { ret = OB_BUF_NOT_ENOUGH; LOG_WARN("file name too long", KR(ret), K_(dir), K(entry->d_name)); } else if (OB_FAIL(ObIODeviceLocalFileOp::unlink(full_path))) { if (OB_NO_SUCH_FILE_OR_DIRECTORY == ret) { ret = OB_SUCCESS; } else { LOG_WARN("fail to del file", KR(ret), K(full_path)); } } } return ret; } }; class TestDirDelOp : public share::ObScanDirOp { public: TestDirDelOp(const char *dir = nullptr) {} virtual int func(const dirent *entry) override { int ret = OB_SUCCESS; if (OB_ISNULL(entry)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid entry", KR(ret)); } else { char full_path[common::MAX_PATH_SIZE] = { 0 }; int p_ret = snprintf(full_path, sizeof(full_path), "%s/%s", dir_, entry->d_name); if (p_ret <= 0 || p_ret >= sizeof(full_path)) { ret = OB_BUF_NOT_ENOUGH; LOG_WARN("file name too long", KR(ret), K_(dir), K(entry->d_name)); } else if (OB_FAIL(ObIODeviceLocalFileOp::rmdir(full_path))) { if (OB_NO_SUCH_FILE_OR_DIRECTORY == ret) { ret = OB_SUCCESS; } else { LOG_WARN("fail to del dir", KR(ret), K(full_path)); } } } return ret; } }; class TestFileManager : public ::testing::Test { public: TestFileManager() = default; virtual ~TestFileManager() = default; static void SetUpTestCase(); static void TearDownTestCase(); }; void TestFileManager::SetUpTestCase() { GCTX.startup_mode_ = observer::ObServerMode::SHARED_STORAGE_MODE; EXPECT_EQ(OB_SUCCESS, MockTenantModuleEnv::get_instance().init()); MTL(tmp_file::ObTenantTmpFileManager *)->stop(); MTL(tmp_file::ObTenantTmpFileManager *)->wait(); MTL(tmp_file::ObTenantTmpFileManager *)->destroy(); } void TestFileManager::TearDownTestCase() { int ret = OB_SUCCESS; if (OB_FAIL(ResidualDataCleanerHelper::clean_in_mock_env())) { LOG_WARN("failed to clean residual data", KR(ret)); } MockTenantModuleEnv::get_instance().destroy(); } TEST_F(TestFileManager, test_path_convert) { int ret = OB_SUCCESS; ObTenantFileManager* tenant_file_mgr = MTL(ObTenantFileManager*); ASSERT_NE(nullptr, tenant_file_mgr); MacroBlockId file_id; ObPathContext ctx; char expected_path[common::MAX_PATH_SIZE] = {0}; bool is_local_cache = true; int64_t ls_epoch_id = 4; file_id.set_id_mode(static_cast(ObMacroBlockIdMode::ID_MODE_SHARE)); file_id.set_storage_object_type(static_cast(ObStorageObjectType::PRIVATE_DATA_MACRO)); file_id.set_second_id(3); file_id.set_third_id(2); file_id.set_macro_transfer_seq(0); file_id.set_tenant_seq(5); char *object_storage_root_dir = nullptr; ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.get_object_storage_root_dir(object_storage_root_dir)); MacroBlockId inc_file_id; inc_file_id.set_id_mode(static_cast(ObMacroBlockIdMode::ID_MODE_SHARE)); inc_file_id.set_storage_object_type(static_cast(ObStorageObjectType::SHARED_MINOR_DATA_MACRO)); inc_file_id.set_second_id(3); // tablet_id inc_file_id.set_third_id(4294967297); // op_id = 1, macro_seq = 1 // inc_file_id.set_meta_is_inner_tablet(false/*is_inner_tablet*/); // inc_file_id.set_meta_ls_id(1001/*ls_id*/); // each object type and print out the path log for (uint64_t obj_id = static_cast(ObStorageObjectType::PRIVATE_DATA_MACRO); obj_id < static_cast(ObStorageObjectType::MAX); ++obj_id) { PRINT_MACRO_ID_TO_PATH(obj_id, true/*is_in_local*/); PRINT_MACRO_ID_TO_PATH(obj_id, false/*is_in_local*/); } // 0.PRIVATE_DATA_MACRO // tenant_id_epoch_id/tablet_data/tablet_id/transfer_seq/data/macro_server_id_seq_id CHECK_MACRO_ID_TO_PATH(PRIVATE_DATA_MACRO, true/*is_in_local*/, OB_SUCCESS, "1_0/tablet_data/3/0/data/2_5"); // cluster_id/server_id/tenant_id_epoch_id/tablet_data/tablet_id/transfer_seq/data/macro_server_id_seq_id CHECK_MACRO_ID_TO_PATH(PRIVATE_DATA_MACRO, false/*is_in_local*/, OB_SUCCESS, "cluster_1/server_2/1_0/tablet_data/3/0/data/2_5"); // 1.PRIVATE_META_MACRO // tenant_id_epoch_id/tablet_data/tablet_id/transfer_seq/meta/macro_server_id_seq_id CHECK_MACRO_ID_TO_PATH(PRIVATE_META_MACRO, true/*is_in_local*/, OB_SUCCESS, "1_0/tablet_data/3/0/meta/2_5"); // cluster_id/server_id/tenant_id_epoch_id/tablet_data/tablet_id/transfer_seq/meta/macro_server_id_seq_id CHECK_MACRO_ID_TO_PATH(PRIVATE_META_MACRO, false/*is_in_local*/, OB_SUCCESS, "cluster_1/server_2/1_0/tablet_data/3/0/meta/2_5"); // 2. SHARED_MINI_DATA_MACRO // 3. SHARED_MINI_META_MACRO // 4. SHARED_MINOR_DATA_MACRO // 5. SHARED_MINOR_META_MACRO // 6.SHARED_MAJOR_DATA_MACRO // tenant_id_epoch_id/shared_major_macro_cache/tablet_id_cg_id_macro_seq_id_data CHECK_MACRO_ID_TO_PATH(SHARED_MAJOR_DATA_MACRO, true/*is_in_local*/, OB_SUCCESS, "1_0/shared_major_macro_cache/3_0_2_data"); // cluster_id/tenant_id/tablet/tablet_id/major/cg_id/data/macro_seq_id CHECK_MACRO_ID_TO_PATH(SHARED_MAJOR_DATA_MACRO, false/*is_in_local*/, OB_SUCCESS, "cluster_1/tenant_1/tablet/3/major/sstable/cg_0/data/2"); // 7.SHARED_MAJOR_META_MACRO // tenant_id_epoch_id/shared_major_macro_cache/tablet_id_cg_id_macro_seq_id_meta CHECK_MACRO_ID_TO_PATH(SHARED_MAJOR_META_MACRO, true/*is_in_local*/, OB_SUCCESS, "1_0/shared_major_macro_cache/3_0_2_meta"); // cluster_id/tenant_id/tablet/tablet_id/major/cg_id/meta/macro_seq_id CHECK_MACRO_ID_TO_PATH(SHARED_MAJOR_META_MACRO, false/*is_in_local*/, OB_SUCCESS, "cluster_1/tenant_1/tablet/3/major/sstable/cg_0/meta/2"); // 8.TMP_FILE // tenant_id_epoch_id/tmp_data/tmp_file_id/segment_id CHECK_MACRO_ID_TO_PATH(TMP_FILE, true/*is_in_local*/, OB_SUCCESS, "1_0/tmp_data/3/2"); expected_path[0] = '\0'; // tenant_id_epoch_id/tmp_data/tmp_file_id/segment_id.deleted ASSERT_EQ(OB_SUCCESS, ctx.set_logical_delete_ctx(file_id, ls_epoch_id)); ASSERT_EQ(OB_SUCCESS, databuff_printf(expected_path, common::MAX_PATH_SIZE, "%s/1_0/%s/3/2.deleted", OB_DIR_MGR.get_local_cache_root_dir(), TMP_DATA_DIR_STR)); ASSERT_EQ(0, STRCMP(ctx.get_path(), expected_path)); // cluster_id/server_id/tenant_id_epoch_id/tmp_data/tmp_file_id/segment_id CHECK_MACRO_ID_TO_PATH(TMP_FILE, false/*is_in_local*/, OB_SUCCESS, "cluster_1/server_1/1_0/tmp_data/3/2"); // 9.SERVER_META // super_block CHECK_MACRO_ID_TO_PATH(SERVER_META, true/*is_in_local*/, OB_SUCCESS, "SERVER_META"); CHECK_MACRO_ID_TO_PATH(SERVER_META, false/*is_in_local*/, OB_NOT_SUPPORTED, ""); // 10.TENANT_SUPER_BLOCK // tenant_id_epoch_id/tenant_super_block CHECK_MACRO_ID_TO_PATH(TENANT_SUPER_BLOCK, true/*is_in_local*/, OB_SUCCESS, "3_2/TENANT_SUPER_BLOCK"); CHECK_MACRO_ID_TO_PATH(TENANT_SUPER_BLOCK, false/*is_in_local*/, OB_NOT_SUPPORTED, ""); // 11.TENANT_UNIT_META // tenant_id_epoch_id/unit_meta CHECK_MACRO_ID_TO_PATH(TENANT_UNIT_META, true/*is_in_local*/, OB_SUCCESS, "3_2/TENANT_UNIT_META"); CHECK_MACRO_ID_TO_PATH(TENANT_UNIT_META, false/*is_in_local*/, OB_NOT_SUPPORTED, ""); // 12.LS_META // tenant_id_epoch_id/ls/ls_id_epoch_id/ls_meta CHECK_MACRO_ID_TO_PATH(LS_META, true/*is_in_local*/, OB_SUCCESS, "1_0/ls/3_4/LS_META"); CHECK_MACRO_ID_TO_PATH(LS_META, false/*is_in_local*/, OB_NOT_SUPPORTED, ""); // 13.LS_DUP_TABLE_META // tenant_id_epoch_id/ls/ls_id_epoch_id/ls_dup_table_meta CHECK_MACRO_ID_TO_PATH(LS_DUP_TABLE_META, true/*is_in_local*/, OB_SUCCESS, "1_0/ls/3_4/LS_DUP_TABLE_META"); CHECK_MACRO_ID_TO_PATH(LS_DUP_TABLE_META, false/*is_in_local*/, OB_NOT_SUPPORTED, ""); // 14.LS_ACTIVE_TABLET_ARRAY // tenant_id_epoch_id/ls/ls_id_epoch_id/tablet_id_array CHECK_MACRO_ID_TO_PATH(LS_ACTIVE_TABLET_ARRAY, true/*is_in_local*/, OB_SUCCESS, "1_0/ls/3_4/LS_ACTIVE_TABLET_ARRAY"); CHECK_MACRO_ID_TO_PATH(LS_ACTIVE_TABLET_ARRAY, false/*is_in_local*/, OB_NOT_SUPPORTED, ""); // 15.LS_PENDING_FREE_TABLET_ARRAY // tenant_id_epoch_id/ls/ls_id_epoch_id/pending_free_tablet_array CHECK_MACRO_ID_TO_PATH(LS_PENDING_FREE_TABLET_ARRAY, true/*is_in_local*/, OB_SUCCESS, "1_0/ls/3_4/LS_PENDING_FREE_TABLET_ARRAY"); CHECK_MACRO_ID_TO_PATH(LS_PENDING_FREE_TABLET_ARRAY, false/*is_in_local*/, OB_NOT_SUPPORTED, ""); // 16.LS_TRANSFER_TABLET_ID_ARRAY // tenant_id_epoch_id/ls/ls_id_epoch_id/transfer_tablet_id_array CHECK_MACRO_ID_TO_PATH(LS_TRANSFER_TABLET_ID_ARRAY, true/*is_in_local*/, OB_SUCCESS, "1_0/ls/3_4/LS_TRANSFER_TABLET_ID_ARRAY"); CHECK_MACRO_ID_TO_PATH(LS_TRANSFER_TABLET_ID_ARRAY, false/*is_in_local*/, OB_NOT_SUPPORTED, ""); // 17.PRIVATE_TABLET_META // tenant_id_epoch_id/ls/ls_id_epoch_id/tablet_meta/tablet_id/tablet_meta_version_transfer_seq CHECK_MACRO_ID_TO_PATH(PRIVATE_TABLET_META, true/*is_in_local*/, OB_SUCCESS, "1_0/ls/3_4/tablet_meta/2/5_0"); CHECK_MACRO_ID_TO_PATH(PRIVATE_TABLET_META, false/*is_in_local*/, OB_NOT_SUPPORTED, ""); // 18.PRIVATE_TABLET_CURRENT_VERSION // tenant_id_epoch_id/ls/ls_id_epoch_id/tablet_meta/tablet_id/current_version CHECK_MACRO_ID_TO_PATH(PRIVATE_TABLET_CURRENT_VERSION, true/*is_in_local*/, OB_SUCCESS, "1_0/ls/3_4/tablet_meta/2/PRIVATE_TABLET_CURRENT_VERSION"); CHECK_MACRO_ID_TO_PATH(PRIVATE_TABLET_CURRENT_VERSION, false/*is_in_local*/, OB_NOT_SUPPORTED, ""); // 19.SHARED_MAJOR_TABLET_META // cluster_id/tenant_id/tablet/tablet_id/major/meta/tablet_meta_version CHECK_MACRO_ID_TO_PATH(SHARED_MAJOR_TABLET_META, true/*is_in_local*/, OB_NOT_SUPPORTED, ""); CHECK_MACRO_ID_TO_PATH(SHARED_MAJOR_TABLET_META, false/*is_in_local*/, OB_SUCCESS, "cluster_1/tenant_1/tablet/3/major/meta/2"); // 20.COMPACTION_SERVER // cluster_id/tenant_id/compaction/scheduler/ls_id_compaction_server CHECK_MACRO_ID_TO_PATH(COMPACTION_SERVER, true/*is_in_local*/, OB_NOT_SUPPORTED, ""); CHECK_MACRO_ID_TO_PATH(COMPACTION_SERVER, false/*is_in_local*/, OB_SUCCESS, "cluster_1/tenant_1/compaction/scheduler/3_COMPACTION_SERVER"); // 21.LS_SVR_COMPACTION_STATUS // cluster_id/tenant_id/compaction/compactor/ls_id_server_id_ls_svr_compaction_status CHECK_MACRO_ID_TO_PATH(LS_SVR_COMPACTION_STATUS, true/*is_in_local*/, OB_NOT_SUPPORTED, ""); CHECK_MACRO_ID_TO_PATH(LS_SVR_COMPACTION_STATUS, false/*is_in_local*/, OB_SUCCESS, "cluster_1/tenant_1/compaction/compactor/3_2_LS_SVR_COMPACTION_STATUS"); // 22.COMPACTION_REPORT // cluster_id/tenant_id/compaction/compactor/server_id_compaction_report CHECK_MACRO_ID_TO_PATH(COMPACTION_REPORT, true/*is_in_local*/, OB_NOT_SUPPORTED, ""); CHECK_MACRO_ID_TO_PATH(COMPACTION_REPORT, false/*is_in_local*/, OB_SUCCESS, "cluster_1/tenant_1/compaction/compactor/3_COMPACTION_REPORT"); // 23.SHARED_MAJOR_GC_INFO // cluster_id/tenant_id/tablet/tablet_id/major/meta/gc_info CHECK_MACRO_ID_TO_PATH(SHARED_MAJOR_GC_INFO, true/*is_in_local*/, OB_NOT_SUPPORTED, ""); CHECK_MACRO_ID_TO_PATH(SHARED_MAJOR_GC_INFO, false/*is_in_local*/, OB_SUCCESS, "cluster_1/tenant_1/tablet/3/major/meta/SHARED_MAJOR_GC_INFO"); // 24.SHARED_MAJOR_META_LIST // cluster_id/tenant_id/tablet/tablet_id/major/meta/meta_list CHECK_MACRO_ID_TO_PATH(SHARED_MAJOR_META_LIST, true/*is_in_local*/, OB_NOT_SUPPORTED, ""); CHECK_MACRO_ID_TO_PATH(SHARED_MAJOR_META_LIST, false/*is_in_local*/, OB_SUCCESS, "cluster_1/tenant_1/tablet/3/major/meta/SHARED_MAJOR_META_LIST"); // 25.LS_COMPACTION_STATUS // cluster_id/tenant_id/compaction/scheduler/ls_id_ls_compaction_status CHECK_MACRO_ID_TO_PATH(LS_COMPACTION_STATUS, true/*is_in_local*/, OB_NOT_SUPPORTED, ""); CHECK_MACRO_ID_TO_PATH(LS_COMPACTION_STATUS, false/*is_in_local*/, OB_SUCCESS, "cluster_1/tenant_1/compaction/scheduler/3_LS_COMPACTION_STATUS"); // 26.TABLET_COMPACTION_STATUS // cluster_id/tenant_id/tablet/tablet_id/major/scn_id_tablet_compaction_status CHECK_MACRO_ID_TO_PATH(TABLET_COMPACTION_STATUS, true/*is_in_local*/, OB_NOT_SUPPORTED, ""); CHECK_MACRO_ID_TO_PATH(TABLET_COMPACTION_STATUS, false/*is_in_local*/, OB_SUCCESS, "cluster_1/tenant_1/tablet/3/major/2_TABLET_COMPACTION_STATUS"); // 27. MAJOR_PREWARM_DATA // cluster_id/tenant_id/tablet/tablet_id/major/scn_id_compaction_scn_prewarm_data CHECK_MACRO_ID_TO_PATH(MAJOR_PREWARM_DATA, true/*is_in_local*/, OB_NOT_SUPPORTED, ""); CHECK_MACRO_ID_TO_PATH(MAJOR_PREWARM_DATA, false/*is_in_local*/, OB_SUCCESS, "cluster_1/tenant_1/tablet/3/major/2_MAJOR_PREWARM_DATA"); // 28. MAJOR_PREWARM_DATA_INDEX // cluster_id/tenant_id/tablet/tablet_id/major/scn_id_compaction_scn_prewarm_data CHECK_MACRO_ID_TO_PATH(MAJOR_PREWARM_DATA_INDEX, true/*is_in_local*/, OB_NOT_SUPPORTED, ""); CHECK_MACRO_ID_TO_PATH(MAJOR_PREWARM_DATA_INDEX, false/*is_in_local*/, OB_SUCCESS, "cluster_1/tenant_1/tablet/3/major/2_MAJOR_PREWARM_DATA_INDEX"); // 29. MAJOR_PREWARM_META // cluster_id/tenant_id/tablet/tablet_id/major/scn_id_compaction_scn_prewarm_data CHECK_MACRO_ID_TO_PATH(MAJOR_PREWARM_META, true/*is_in_local*/, OB_NOT_SUPPORTED, ""); CHECK_MACRO_ID_TO_PATH(MAJOR_PREWARM_META, false/*is_in_local*/, OB_SUCCESS, "cluster_1/tenant_1/tablet/3/major/2_MAJOR_PREWARM_META"); // 30. MAJOR_PREWARM_META_INDEX // cluster_id/tenant_id/tablet/tablet_id/major/scn_id_compaction_scn_prewarm_data CHECK_MACRO_ID_TO_PATH(MAJOR_PREWARM_META_INDEX, true/*is_in_local*/, OB_NOT_SUPPORTED, ""); CHECK_MACRO_ID_TO_PATH(MAJOR_PREWARM_META_INDEX, false/*is_in_local*/, OB_SUCCESS, "cluster_1/tenant_1/tablet/3/major/2_MAJOR_PREWARM_META_INDEX"); // 31.TENANT_DISK_SPACE_META // tenant_id_epoch_id/tenant_disk_space_meta CHECK_MACRO_ID_TO_PATH(TENANT_DISK_SPACE_META, true/*is_in_local*/, OB_SUCCESS, "3_2/TENANT_DISK_SPACE_META"); CHECK_MACRO_ID_TO_PATH(TENANT_DISK_SPACE_META, false/*is_in_local*/, OB_NOT_SUPPORTED, ""); // 32.SHARED_TABLET_ID // cluster_id/tenant_id/tablet_ids/tablet_id CHECK_MACRO_ID_TO_PATH(SHARED_TABLET_ID, true/*is_in_local*/, OB_NOT_SUPPORTED, ""); CHECK_MACRO_ID_TO_PATH(SHARED_TABLET_ID, false/*is_in_local*/, OB_SUCCESS, "cluster_1/tenant_1/tablet_ids/3"); // 33.LS_COMPACTION_LIST // cluster_id/tenant_id/compaction/scheduler/ls_id_ls_compaction_status CHECK_MACRO_ID_TO_PATH(LS_COMPACTION_LIST, true/*is_in_local*/, OB_NOT_SUPPORTED, ""); CHECK_MACRO_ID_TO_PATH(LS_COMPACTION_LIST, false/*is_in_local*/, OB_SUCCESS, "cluster_1/tenant_1/compaction/scheduler/3_LS_COMPACTION_LIST"); // 34. IS_DELETED // cluster_id/tenant_id/tablet_ids/tablet_id/is_deleted CHECK_MACRO_ID_TO_PATH(IS_SHARED_TABLET_DELETED, true/*is_in_local*/, OB_NOT_SUPPORTED, ""); CHECK_MACRO_ID_TO_PATH(IS_SHARED_TABLET_DELETED, false/*is_in_local*/, OB_SUCCESS, "cluster_1/tenant_1/tablet/3/IS_SHARED_TABLET_DELETED"); // 35. IS_SHARED_TENANT_DELETED // cluster_id/tenant_id/is_shared_tenant_deleted CHECK_MACRO_ID_TO_PATH(IS_SHARED_TENANT_DELETED, true/*is_in_local*/, OB_NOT_SUPPORTED, ""); CHECK_MACRO_ID_TO_PATH(IS_SHARED_TENANT_DELETED, false/*is_in_local*/, OB_SUCCESS, "cluster_1/tenant_3/IS_SHARED_TENANT_DELETED"); // 36. CHECKSUM_ERROR_DUMP_MACRO // cluster_id/tenant_id/tablet/tablet_id/major/sstable/cg_id/checksum_error_macro/svr_id_compaction_scn_block_id file_id.set_fourth_id(5); // different from trans_seq + macro_seq CHECK_MACRO_ID_TO_PATH(CHECKSUM_ERROR_DUMP_MACRO, true/*is_in_local*/, OB_NOT_SUPPORTED, ""); CHECK_MACRO_ID_TO_PATH(CHECKSUM_ERROR_DUMP_MACRO, false/*is_in_local*/, OB_SUCCESS, "cluster_1/tenant_1/tablet/3/major/sstable/cg_0/checksum_error_macro/1_2_5"); // 37. SHARED_MICRO_DATA_MACRO CHECK_MACRO_ID_TO_PATH(SHARED_MICRO_DATA_MACRO, true/*is_in_local*/, OB_INVALID_ARGUMENT, ""); CHECK_MACRO_ID_TO_PATH(SHARED_MICRO_DATA_MACRO, false/*is_in_local*/, OB_INVALID_ARGUMENT, ""); // 38. SHARED_MICRO_META_MACRO CHECK_MACRO_ID_TO_PATH(SHARED_MICRO_META_MACRO, true/*is_in_local*/, OB_INVALID_ARGUMENT, ""); CHECK_MACRO_ID_TO_PATH(SHARED_MICRO_META_MACRO, false/*is_in_local*/, OB_INVALID_ARGUMENT, ""); // 39. UNSEALED_REMOTE_SEG_FILE // cluster_id/server_id/tenant_id_epoch_id/tmp_data/tmp_file_id/segment_id_valid_length CHECK_MACRO_ID_TO_PATH(UNSEALED_REMOTE_SEG_FILE, true/*is_in_local*/, OB_NOT_SUPPORTED, ""); CHECK_MACRO_ID_TO_PATH(UNSEALED_REMOTE_SEG_FILE, false/*is_in_local*/, OB_SUCCESS, "cluster_1/server_1/1_0/tmp_data/3/2_5"); } TEST_F(TestFileManager, test_get_file_parent_dir) { int ret = OB_SUCCESS; ObTenantFileManager* tenant_file_mgr = MTL(ObTenantFileManager*); ASSERT_NE(nullptr, tenant_file_mgr); MacroBlockId file_id; char dir_path[common::MAX_PATH_SIZE] = {0}; char expected_dir_path[common::MAX_PATH_SIZE] = {0}; int64_t ls_epoch_id = 4; file_id.set_id_mode(static_cast(ObMacroBlockIdMode::ID_MODE_SHARE)); file_id.set_storage_object_type(static_cast(ObStorageObjectType::PRIVATE_DATA_MACRO)); file_id.set_second_id(3); file_id.set_third_id(2); file_id.set_macro_transfer_seq(0); file_id.set_tenant_seq(5); // each object type and print out the parent dir path log for (uint64_t obj_id = static_cast(ObStorageObjectType::PRIVATE_DATA_MACRO); obj_id < static_cast(ObStorageObjectType::MAX); ++obj_id) { PRINT_MACRO_ID_PARENT_DIR_PATH(obj_id); } // 1.PRIVATE_DATA_MACRO // tenant_id_epoch_id/tablet_data/tablet_id/transfer_seq/data/ CHECK_MACRO_ID_PARENT_DIR(PRIVATE_DATA_MACRO, OB_SUCCESS, "1_0/tablet_data/3/0/data"); // 2.SHARED_MAJOR_DATA_MACRO CHECK_MACRO_ID_PARENT_DIR(SHARED_MAJOR_DATA_MACRO, OB_NOT_SUPPORTED, ""); // 3.TMP_FILE // tenant_id_epoch_id/tmp_data/tmp_file_id/segment_id CHECK_MACRO_ID_PARENT_DIR(TMP_FILE, OB_SUCCESS, "1_0/tmp_data/3"); // 4.SERVER_META // CHECK_MACRO_ID_PARENT_DIR(SERVER_META, OB_SUCCESS, ""); // 5.TENANT_SUPER_BLOCK CHECK_MACRO_ID_PARENT_DIR(TENANT_SUPER_BLOCK, OB_SUCCESS, "3_2"); // 6.TENANT_UNIT_META CHECK_MACRO_ID_PARENT_DIR(TENANT_UNIT_META, OB_SUCCESS, "3_2"); // 7.LS_META // tenant_id_epoch_id/ls/ls_id_epoch_id/ls_meta CHECK_MACRO_ID_PARENT_DIR(LS_META, OB_SUCCESS, "1_0/ls/3_4"); // 8.LS_DUP_TABLE_META // tenant_id_epoch_id/ls/ls_id_epoch_id/ls_dup_table_meta CHECK_MACRO_ID_PARENT_DIR(LS_DUP_TABLE_META, OB_SUCCESS, "1_0/ls/3_4"); // 9.LS_ACTIVE_TABLET_ARRAY // tenant_id_epoch_id/ls/ls_id_epoch_id/tablet_id_array CHECK_MACRO_ID_PARENT_DIR(LS_ACTIVE_TABLET_ARRAY, OB_SUCCESS, "1_0/ls/3_4"); // 10.LS_PENDING_FREE_TABLET_ARRAY // tenant_id_epoch_id/ls/ls_id_epoch_id/pending_free_tablet_array CHECK_MACRO_ID_PARENT_DIR(LS_PENDING_FREE_TABLET_ARRAY, OB_SUCCESS, "1_0/ls/3_4"); // 11.LS_TRANSFER_TABLET_ID_ARRAY // tenant_id_epoch_id/ls/ls_id_epoch_id/transfer_tablet_id_array CHECK_MACRO_ID_PARENT_DIR(LS_TRANSFER_TABLET_ID_ARRAY, OB_SUCCESS, "1_0/ls/3_4"); // 12.PRIVATE_TABLET_META // tenant_id_epoch_id/ls/ls_id_epoch_id/tablet_meta/tablet_id/tablet_meta_version_transfer_seq CHECK_MACRO_ID_PARENT_DIR(PRIVATE_TABLET_META, OB_SUCCESS, "1_0/ls/3_4/tablet_meta/2"); // 13.PRIVATE_TABLET_CURRENT_VERSION // tenant_id_epoch_id/ls/ls_id_epoch_id/tablet_meta/tablet_id/current_version CHECK_MACRO_ID_PARENT_DIR(PRIVATE_TABLET_CURRENT_VERSION, OB_SUCCESS, "1_0/ls/3_4/tablet_meta/2"); // 14.SHARED_MAJOR_TABLET_META CHECK_MACRO_ID_PARENT_DIR(SHARED_MAJOR_TABLET_META, OB_NOT_SUPPORTED, ""); // 15.COMPACTION_SERVER CHECK_MACRO_ID_PARENT_DIR(COMPACTION_SERVER, OB_NOT_SUPPORTED, ""); // 16.LS_SVR_COMPACTION_STATUS CHECK_MACRO_ID_PARENT_DIR(LS_SVR_COMPACTION_STATUS, OB_NOT_SUPPORTED, ""); // 17.COMPACTION_REPORT CHECK_MACRO_ID_PARENT_DIR(COMPACTION_REPORT, OB_NOT_SUPPORTED, ""); // 18.PRIVATE_META_MACRO CHECK_MACRO_ID_PARENT_DIR(PRIVATE_META_MACRO, OB_SUCCESS, "1_0/tablet_data/3/0/meta"); // 19.SHARED_MAJOR_META_MACRO CHECK_MACRO_ID_PARENT_DIR(SHARED_MAJOR_META_MACRO, OB_NOT_SUPPORTED, ""); // 20.SHARED_MAJOR_GC_INFO CHECK_MACRO_ID_PARENT_DIR(SHARED_MAJOR_GC_INFO, OB_NOT_SUPPORTED, ""); // 21.SHARED_MAJOR_META_LIST CHECK_MACRO_ID_PARENT_DIR(SHARED_MAJOR_META_LIST, OB_NOT_SUPPORTED, ""); // 22.LS_COMPACTION_STATUS CHECK_MACRO_ID_PARENT_DIR(LS_COMPACTION_STATUS, OB_NOT_SUPPORTED, ""); // 23.TABLET_COMPACTION_STATUS CHECK_MACRO_ID_PARENT_DIR(TABLET_COMPACTION_STATUS, OB_NOT_SUPPORTED, ""); // 24.TENANT_DISK_SPACE_META CHECK_MACRO_ID_PARENT_DIR(TENANT_DISK_SPACE_META, OB_SUCCESS, "3_2"); // 25.SHARED_MAJOR_TABLET_META CHECK_MACRO_ID_PARENT_DIR(SHARED_TABLET_ID, OB_NOT_SUPPORTED, ""); // 26.LS_COMPACTION_LIST CHECK_MACRO_ID_PARENT_DIR(LS_COMPACTION_LIST, OB_NOT_SUPPORTED, ""); // 27. IS_DELETED CHECK_MACRO_ID_PARENT_DIR(IS_SHARED_TABLET_DELETED, OB_NOT_SUPPORTED, ""); // 28. IS_SHARED_TENANT_DELETED CHECK_MACRO_ID_PARENT_DIR(IS_SHARED_TENANT_DELETED, OB_NOT_SUPPORTED, ""); } TEST_F(TestFileManager, test_private_macro_file_operator) { int ret = OB_SUCCESS; ObTenantFileManager* tenant_file_mgr = MTL(ObTenantFileManager*); ASSERT_NE(nullptr, tenant_file_mgr); MacroBlockId file_id; file_id.set_id_mode(static_cast(ObMacroBlockIdMode::ID_MODE_SHARE)); file_id.set_storage_object_type(static_cast(ObStorageObjectType::PRIVATE_DATA_MACRO)); file_id.set_second_id(3); //tablet_id file_id.set_third_id(2); //seq_id file_id.set_macro_transfer_seq(0); // transfer_seq file_id.set_tenant_seq(5); //tenant_seq // step 1: create dir int64_t tablet_id = 3; ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.create_tablet_data_tablet_id_transfer_seq_dir(MTL_ID(), MTL_EPOCH_ID(), tablet_id, 0/*transfer_seq*/)); // step 2: test write private_macro_file ObStorageObjectHandle write_object_handle; ASSERT_EQ(OB_SUCCESS, write_object_handle.set_macro_block_id(file_id)); const int64_t write_io_size = 4096; // 4KB char write_buf[write_io_size] = { 0 }; memset(write_buf, 'a', write_io_size); ObStorageObjectWriteInfo write_info; write_info.io_desc_.set_wait_event(1); write_info.buffer_ = write_buf; write_info.offset_ = 0; write_info.size_ = write_io_size; write_info.io_timeout_ms_ = DEFAULT_IO_WAIT_TIME_MS; write_info.mtl_tenant_id_ = MTL_ID(); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->write_file(write_info, write_object_handle)); // step 3: test read private_macro_file ObStorageObjectHandle read_object_handle; ObStorageObjectReadInfo read_info; read_info.macro_block_id_ = file_id; read_info.io_desc_.set_wait_event(1); char read_buf[write_io_size] = { 0 }; read_info.buf_ = read_buf; read_info.offset_ = 0; read_info.size_ = write_io_size; read_info.io_timeout_ms_ = DEFAULT_IO_WAIT_TIME_MS; read_info.mtl_tenant_id_ = MTL_ID(); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->pread_file(read_info, read_object_handle)); ASSERT_NE(nullptr, read_object_handle.get_buffer()); ASSERT_EQ(read_info.size_, read_object_handle.get_data_size()); ASSERT_EQ(0, memcmp(write_buf, read_object_handle.get_buffer(), write_io_size)); // test 4 : test fsync private_macro_file ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->fsync_file(file_id)); // step 5: test is exist file bool is_exist = false; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->is_exist_file(file_id, 0 /*ls_epoch_id*/, is_exist)); ASSERT_TRUE(is_exist); // step 6: test get file length int64_t file_length = 0; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->get_file_length(file_id, 0 /*ls_epoch_id*/, file_length)); ASSERT_EQ(write_io_size, file_length); // step 7: test list tablet_dir ObArray tablet_dirs; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->list_tablet_data_dir(tablet_dirs)); ASSERT_EQ(1, tablet_dirs.count()); ASSERT_EQ(tablet_id, tablet_dirs.at(0)); // test 8: test calc_private_macro_disk_space int64_t total_disk_size = 0; int64_t expected_disk_size = write_io_size; char dir_path[ObBaseFileManager::OB_MAX_FILE_PATH_LENGTH] = {0}; ObIODFileStat statbuf; ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.get_tablet_data_tablet_id_dir(dir_path, sizeof(dir_path), MTL_ID(), MTL_EPOCH_ID(), tablet_id)); ASSERT_EQ(OB_SUCCESS, ObIODeviceLocalFileOp::stat(dir_path, statbuf)); expected_disk_size += statbuf.size_; dir_path[0] ='\0'; ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.get_tablet_data_tablet_id_transfer_seq_dir(dir_path, sizeof(dir_path), MTL_ID(), MTL_EPOCH_ID(), tablet_id, 0/*transfer_seq*/)); ASSERT_EQ(OB_SUCCESS, ObIODeviceLocalFileOp::stat(dir_path, statbuf)); expected_disk_size += statbuf.size_; dir_path[0] ='\0'; ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.get_local_tablet_id_macro_dir(dir_path, sizeof(dir_path), MTL_ID(), MTL_EPOCH_ID(), tablet_id, 0/*transfer_seq*/, ObMacroType::DATA_MACRO)); ASSERT_EQ(OB_SUCCESS, ObIODeviceLocalFileOp::stat(dir_path, statbuf)); expected_disk_size += statbuf.size_; dir_path[0] ='\0'; ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.get_local_tablet_id_macro_dir(dir_path, sizeof(dir_path), MTL_ID(), MTL_EPOCH_ID(), tablet_id, 0/*transfer_seq*/, ObMacroType::META_MACRO)); ASSERT_EQ(OB_SUCCESS, ObIODeviceLocalFileOp::stat(dir_path, statbuf)); expected_disk_size += statbuf.size_; ob_usleep(2000*1000); int64_t start_calc_size_time_s = ObTimeUtility::current_time_s(); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->calc_private_macro_disk_space(start_calc_size_time_s, total_disk_size)); ASSERT_EQ(expected_disk_size, total_disk_size); // step 9: test delete file ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->delete_file(file_id)); // step 10: test delete dir ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.delete_tablet_data_tablet_id_transfer_seq_dir(MTL_ID(), MTL_EPOCH_ID(), tablet_id, 0/*transfer_seq*/)); ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.delete_tablet_data_tablet_id_dir(MTL_ID(), MTL_EPOCH_ID(), tablet_id)); } TEST_F(TestFileManager, test_tmp_file_operator) { int ret = OB_SUCCESS; ObTenantFileManager* tenant_file_mgr = MTL(ObTenantFileManager*); ASSERT_NE(nullptr, tenant_file_mgr); MacroBlockId file_id; file_id.set_id_mode(static_cast(ObMacroBlockIdMode::ID_MODE_SHARE)); file_id.set_storage_object_type(static_cast(ObStorageObjectType::TMP_FILE)); file_id.set_second_id(3); //tmp_file_id file_id.set_third_id(2); //segment_id // step 1: create dir int64_t tmp_file_id = 3; // ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.create_tmp_file_dir(tmp_file_id)); // step 2: test write tmp_file ObStorageObjectHandle write_object_handle; ASSERT_EQ(OB_SUCCESS, write_object_handle.set_macro_block_id(file_id)); const int64_t write_io_size = 8 * 1024; // 8KB char write_buf[write_io_size] = { 0 }; memset(write_buf, 'a', write_io_size); ObStorageObjectWriteInfo write_info; write_info.io_desc_.set_wait_event(1); write_info.io_desc_.set_unsealed(); write_info.buffer_ = write_buf; write_info.offset_ = 0; write_info.size_ = write_io_size; write_info.io_timeout_ms_ = DEFAULT_IO_WAIT_TIME_MS; write_info.mtl_tenant_id_ = MTL_ID(); write_info.tmp_file_valid_length_ = write_io_size; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->append_file(write_info, write_object_handle)); // step 3: test read tmp_file ObStorageObjectHandle read_object_handle; ObStorageObjectReadInfo read_info; read_info.macro_block_id_ = file_id; read_info.io_desc_.set_wait_event(1); char read_buf[write_io_size] = { 0 }; read_info.buf_ = read_buf; read_info.offset_ = 0; read_info.size_ = write_io_size; read_info.io_timeout_ms_ = DEFAULT_IO_WAIT_TIME_MS; read_info.mtl_tenant_id_ = MTL_ID(); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->pread_file(read_info, read_object_handle)); ASSERT_NE(nullptr, read_object_handle.get_buffer()); ASSERT_EQ(read_info.size_, read_object_handle.get_data_size()); ASSERT_EQ(0, memcmp(write_buf, read_object_handle.get_buffer(), write_io_size)); // test 4: test fsync tmp_file ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->fsync_file(file_id)); // test 5: test append tmp_file ObStorageObjectWriteInfo append_info; append_info.io_desc_.set_wait_event(1); append_info.io_desc_.set_unsealed(); append_info.buffer_ = write_buf; append_info.offset_ = write_io_size; append_info.size_ = write_io_size; append_info.io_timeout_ms_ = DEFAULT_IO_WAIT_TIME_MS; append_info.mtl_tenant_id_ = MTL_ID(); append_info.tmp_file_valid_length_ = write_io_size + write_io_size; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->append_file(append_info, write_object_handle)); // step 6: test read tmp_file read_object_handle.reset(); read_info.macro_block_id_ = file_id; read_info.io_desc_.set_wait_event(1); read_buf[0] = '\0'; read_info.buf_ = read_buf; read_info.offset_ = write_io_size; read_info.size_ = write_io_size; read_info.io_timeout_ms_ = DEFAULT_IO_WAIT_TIME_MS; read_info.mtl_tenant_id_ = MTL_ID(); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->pread_file(read_info, read_object_handle)); ASSERT_NE(nullptr, read_object_handle.get_buffer()); ASSERT_EQ(read_info.size_, read_object_handle.get_data_size()); ASSERT_EQ(0, memcmp(write_buf, read_object_handle.get_buffer(), write_io_size)); // step 7: test is exist file bool is_exist = false; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->is_exist_file(file_id, 0, is_exist)); ASSERT_TRUE(is_exist); // step 8: test get file length int64_t file_length = 0; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->get_file_length(file_id, 0, file_length)); ASSERT_EQ(2 * write_io_size, file_length); // test 9: test calc_private_macro_disk_space int64_t total_disk_size = 0; int64_t tmp_file_size = 0; int64_t total_tmp_file_read_cache_alloc_size = 0; char dir_path[ObBaseFileManager::OB_MAX_FILE_PATH_LENGTH] = {0}; int64_t expected_disk_size = 2 * write_io_size; ObIODFileStat statbuf; ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.get_local_tmp_file_dir(dir_path, sizeof(dir_path), MTL_ID(), MTL_EPOCH_ID(), tmp_file_id)); ASSERT_EQ(OB_SUCCESS, ObIODeviceLocalFileOp::stat(dir_path, statbuf)); expected_disk_size += statbuf.size_; ob_usleep(2000*1000); int64_t start_calc_size_time_s = ObTimeUtility::current_time_s(); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->calc_private_macro_disk_space(start_calc_size_time_s, total_disk_size)); ASSERT_EQ(0, total_disk_size); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->calc_tmp_data_disk_space(start_calc_size_time_s, total_tmp_file_read_cache_alloc_size, tmp_file_size)); ASSERT_EQ(expected_disk_size, tmp_file_size); ASSERT_EQ(0, total_tmp_file_read_cache_alloc_size); // step 10: test delete file ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->delete_tmp_file(file_id)); } TEST_F(TestFileManager, test_meta_file_operator) { int ret = OB_SUCCESS; ObTenantFileManager* tenant_file_mgr = MTL(ObTenantFileManager*); ASSERT_NE(nullptr, tenant_file_mgr); MacroBlockId file_id; const int64_t ls_id = 7; const int64_t ls_epoch_id = 0; const int64_t tablet_id = 8; const int64_t meta_version_id = 9; file_id.set_id_mode(static_cast(ObMacroBlockIdMode::ID_MODE_SHARE)); file_id.set_storage_object_type(static_cast(ObStorageObjectType::PRIVATE_TABLET_META)); file_id.set_second_id(ls_id); file_id.set_third_id(tablet_id); file_id.set_meta_transfer_seq(0); file_id.set_meta_version_id(meta_version_id); // step 1: create dir ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.create_ls_id_dir(MTL_ID(), MTL_EPOCH_ID(), ls_id, ls_epoch_id)); ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.create_tablet_meta_tablet_id_dir(MTL_ID(), MTL_EPOCH_ID(), ls_id, ls_epoch_id, tablet_id)); // step 2: test write private_tablet_meta ObStorageObjectHandle write_object_handle; ASSERT_EQ(OB_SUCCESS, write_object_handle.set_macro_block_id(file_id)); const int64_t write_io_size = 4096; // 4KB char write_buf[write_io_size] = { 0 }; memset(write_buf, 'a', write_io_size); ObStorageObjectWriteInfo write_info; write_info.io_desc_.set_wait_event(1); write_info.buffer_ = write_buf; write_info.offset_ = 0; write_info.size_ = write_io_size; write_info.io_timeout_ms_ = DEFAULT_IO_WAIT_TIME_MS; write_info.mtl_tenant_id_ = MTL_ID(); write_info.ls_epoch_id_ = ls_epoch_id; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->write_file(write_info, write_object_handle)); // step 3: test read private_tablet_meta ObStorageObjectHandle read_object_handle; ObStorageObjectReadInfo read_info; read_info.macro_block_id_ = file_id; read_info.io_desc_.set_wait_event(1); char read_buf[write_io_size] = { 0 }; read_info.buf_ = read_buf; read_info.offset_ = 0; read_info.size_ = write_io_size; read_info.io_timeout_ms_ = DEFAULT_IO_WAIT_TIME_MS; read_info.mtl_tenant_id_ = MTL_ID(); read_info.ls_epoch_id_ = ls_epoch_id; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->pread_file(read_info, read_object_handle)); ASSERT_NE(nullptr, read_object_handle.get_buffer()); ASSERT_EQ(read_info.size_, read_object_handle.get_data_size()); ASSERT_EQ(0, memcmp(write_buf, read_object_handle.get_buffer(), write_io_size)); // test 4 : test fsync private_tablet_meta ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->fsync_file(file_id)); // step 5: test is exist file bool is_exist = false; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->is_exist_file(file_id, ls_epoch_id, is_exist)); ASSERT_TRUE(is_exist); // step 6: test get file length int64_t file_length = 0; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->get_file_length(file_id, ls_epoch_id, file_length)); ASSERT_EQ(write_io_size, file_length); // step 7: test list tablet_dir ObArray tablet_dirs; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->list_tablet_meta_dir(ls_id, ls_epoch_id, tablet_dirs)); ASSERT_EQ(1, tablet_dirs.count()); ASSERT_EQ(tablet_id, tablet_dirs.at(0)); // test 8: test calc_meta_file_disk_space int64_t total_disk_size = 0; int64_t expected_disk_size = write_io_size; char dir_path[ObBaseFileManager::OB_MAX_FILE_PATH_LENGTH] = {0}; ObIODFileStat statbuf; ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.get_tablet_meta_tablet_id_dir(dir_path, sizeof(dir_path), MTL_ID(), MTL_EPOCH_ID(), ls_id, ls_epoch_id, tablet_id)); ASSERT_EQ(OB_SUCCESS, ObIODeviceLocalFileOp::stat(dir_path, statbuf)); expected_disk_size += statbuf.size_; dir_path[0] = '\0'; ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.get_tablet_meta_dir(dir_path, sizeof(dir_path), MTL_ID(), MTL_EPOCH_ID(), ls_id, ls_epoch_id)); ASSERT_EQ(OB_SUCCESS, ObIODeviceLocalFileOp::stat(dir_path, statbuf)); expected_disk_size += statbuf.size_; dir_path[0] = '\0'; ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.get_ls_id_dir(dir_path, sizeof(dir_path), MTL_ID(), MTL_EPOCH_ID(), ls_id, ls_epoch_id)); ASSERT_EQ(OB_SUCCESS, ObIODeviceLocalFileOp::stat(dir_path, statbuf)); expected_disk_size += statbuf.size_; ob_usleep(2000*1000); int64_t start_calc_size_time_s = ObTimeUtility::current_time_s(); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->calc_meta_file_disk_space(start_calc_size_time_s, total_disk_size)); // private_tablet_meta + tablet_id_dir ASSERT_EQ(expected_disk_size, total_disk_size); // step 9: test delete file ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->delete_file(file_id)); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->is_exist_file(file_id, ls_epoch_id, is_exist)); ASSERT_FALSE(is_exist); // step 10: test delete dir ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.delete_tablet_meta_tablet_id_dir(MTL_ID(), MTL_EPOCH_ID(), ls_id, ls_epoch_id, tablet_id)); ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.delete_ls_id_dir(MTL_ID(), MTL_EPOCH_ID(), ls_id, ls_epoch_id)); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->calc_meta_file_disk_space(start_calc_size_time_s, total_disk_size)); ASSERT_EQ(0, total_disk_size); } /* Test whether the data written by pwrite_cache_block is 4K aligned when the valid data of buf is smaller than * size. */ TEST_F(TestFileManager, test_micro_cache_pread_and_pwrite) { int ret = OB_SUCCESS; ObTenantFileManager *tenant_file_mgr = MTL(ObTenantFileManager *); ASSERT_NE(nullptr, tenant_file_mgr); const int64_t alignment = 4096; const int64_t WRITE_IO_SIZE = 1 << 14; // 16K const int64_t valid_data_size = 15 * 1024; // 15K ObMemAttr attr(MTL_ID(), "test"); char *write_buf = static_cast(ob_malloc_align(alignment, WRITE_IO_SIZE, attr)); char *read_buf = static_cast(ob_malloc_align(alignment, WRITE_IO_SIZE, attr)); MEMSET(write_buf, '\0', WRITE_IO_SIZE); MEMSET(write_buf, 'a', valid_data_size); // 15K int64_t written_size = 0; int64_t read_size = 0; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->pwrite_cache_block(0, WRITE_IO_SIZE, write_buf, written_size)); ASSERT_EQ(written_size, WRITE_IO_SIZE); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->fsync_cache_file()); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->pread_cache_block(0, WRITE_IO_SIZE, read_buf, read_size)); ASSERT_EQ(read_size, WRITE_IO_SIZE); ASSERT_EQ(0, memcmp(write_buf, read_buf, read_size)); ob_free_align(write_buf); ob_free_align(read_buf); } TEST_F(TestFileManager, test_tenant_disk_space_meta) { int ret = OB_SUCCESS; ObTenantFileManager* tenant_file_mgr = MTL(ObTenantFileManager*); ASSERT_NE(nullptr, tenant_file_mgr); ObTenantDiskSpaceManager* tenant_disk_space_mgr = MTL(ObTenantDiskSpaceManager*); ASSERT_NE(nullptr, tenant_disk_space_mgr); // step 1: write tmp_file MacroBlockId tmp_file; int64_t tmp_file_id = 4; int64_t segment_id = 5; tmp_file.set_id_mode(static_cast(ObMacroBlockIdMode::ID_MODE_SHARE)); tmp_file.set_storage_object_type(static_cast(ObStorageObjectType::TMP_FILE)); tmp_file.set_second_id(tmp_file_id); tmp_file.set_third_id(segment_id); ObStorageObjectHandle write_object_handle; ASSERT_EQ(OB_SUCCESS, write_object_handle.set_macro_block_id(tmp_file)); const int64_t write_io_size = 4096 * 2; // 8KB char write_buf[write_io_size] = { 0 }; memset(write_buf, 'a', write_io_size); ObStorageObjectWriteInfo write_info; write_info.io_desc_.set_wait_event(1); write_info.io_desc_.set_unsealed(); write_info.buffer_ = write_buf; write_info.offset_ = 0; write_info.size_ = write_io_size; write_info.tmp_file_valid_length_ = write_io_size; write_info.io_timeout_ms_ = DEFAULT_IO_WAIT_TIME_MS; write_info.mtl_tenant_id_ = MTL_ID(); ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.create_tmp_file_dir(MTL_ID(), MTL_EPOCH_ID(), tmp_file_id)); int64_t expected_disk_size = write_io_size; char dir_path[ObBaseFileManager::OB_MAX_FILE_PATH_LENGTH] = {0}; ObIODFileStat statbuf; ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.get_local_tmp_file_dir(dir_path, sizeof(dir_path), MTL_ID(), MTL_EPOCH_ID(), tmp_file_id)); ASSERT_EQ(OB_SUCCESS, ObIODeviceLocalFileOp::stat(dir_path, statbuf)); expected_disk_size += statbuf.size_; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->append_file(write_info, write_object_handle)); // step 2: write tenant disk space meta ObTenantDiskSpaceMeta disk_space_meta(MTL_ID()); disk_space_meta.body_.tmp_file_write_cache_alloc_size_ = tenant_disk_space_mgr->get_tmp_file_write_cache_alloc_size(); ASSERT_EQ(OB_SUCCESS, disk_space_meta.header_.construct_header(disk_space_meta.body_)); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->write_tenant_disk_space_meta(disk_space_meta)); // step 3: read tenant disk space meta disk_space_meta.reset(); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->read_tenant_disk_space_meta(disk_space_meta)); ASSERT_EQ(expected_disk_size, disk_space_meta.body_.tmp_file_write_cache_alloc_size_); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->delete_tmp_file(tmp_file)); } TEST_F(TestFileManager, test_ss_format) { int ret = OB_SUCCESS; bool is_exist = false; ObBackupDest storage_dest; ASSERT_EQ(OB_SUCCESS, OB_SERVER_FILE_MGR.get_storage_dest(storage_dest)); // step 1: is exist ss_format ASSERT_EQ(OB_SUCCESS, ObSSFormatUtil::is_exist_ss_format(storage_dest, is_exist)); ASSERT_EQ(false, is_exist); // step 2: write ss_format ObSSFormat ss_format; const uint64_t cur_cluster_version = CLUSTER_CURRENT_VERSION; const int64_t cur_us = ObTimeUtility::fast_current_time(); ss_format.body_.cluster_version_ = cur_cluster_version; ss_format.body_.create_timestamp_ = cur_us; ASSERT_EQ(OB_SUCCESS, ss_format.header_.construct_header(ss_format.body_)); ASSERT_EQ(OB_SUCCESS, ObSSFormatUtil::write_ss_format(storage_dest, ss_format)); // step 3: is exist ss_format ASSERT_EQ(OB_SUCCESS, ObSSFormatUtil::is_exist_ss_format(storage_dest, is_exist)); ASSERT_EQ(true, is_exist); // step 4: read ss_format ss_format.reset(); ASSERT_EQ(OB_SUCCESS, ObSSFormatUtil::read_ss_format(storage_dest, ss_format)); ASSERT_EQ(cur_cluster_version, ss_format.body_.cluster_version_); ASSERT_EQ(cur_us, ss_format.body_.create_timestamp_); } TEST_F(TestFileManager, test_list_and_delete_dir_operator) { int ret = OB_SUCCESS; ObTenantFileManager* tenant_file_mgr = MTL(ObTenantFileManager*); ASSERT_NE(nullptr, tenant_file_mgr); // test1: list tmp file MacroBlockId tmp_file; int64_t tmp_file_id = 3; int64_t segment_file_id = 2; tmp_file.set_id_mode(static_cast(ObMacroBlockIdMode::ID_MODE_SHARE)); tmp_file.set_storage_object_type(static_cast(ObStorageObjectType::TMP_FILE)); tmp_file.set_second_id(tmp_file_id); tmp_file.set_third_id(segment_file_id); ObStorageObjectHandle write_object_handle; ASSERT_EQ(OB_SUCCESS, write_object_handle.set_macro_block_id(tmp_file)); const int64_t write_io_size = 8 * 1024; // 8KB char write_buf[write_io_size] = { 0 }; memset(write_buf, 'a', write_io_size); ObStorageObjectWriteInfo write_info; write_info.io_desc_.set_wait_event(1); write_info.io_desc_.set_unsealed(); write_info.buffer_ = write_buf; write_info.offset_ = 0; write_info.size_ = write_io_size; write_info.io_timeout_ms_ = DEFAULT_IO_WAIT_TIME_MS; write_info.mtl_tenant_id_ = MTL_ID(); write_info.tmp_file_valid_length_ = write_io_size; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->append_file(write_info, write_object_handle)); ObArray tmp_files; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->list_tmp_file(tmp_files)); ASSERT_EQ(1, tmp_files.count()); ASSERT_EQ(tmp_file_id, tmp_files.at(0).second_id()); // test2: list private tablet data macro MacroBlockId tablet_data_macro; int64_t tablet_id = 4; int64_t server_id = 5; int64_t seq_id = 6; tablet_data_macro.set_id_mode(static_cast(ObMacroBlockIdMode::ID_MODE_SHARE)); tablet_data_macro.set_storage_object_type(static_cast(ObStorageObjectType::PRIVATE_DATA_MACRO)); tablet_data_macro.set_second_id(tablet_id); tablet_data_macro.set_third_id(server_id); tablet_data_macro.set_macro_transfer_seq(0); // transfer_seq tablet_data_macro.set_tenant_seq(seq_id); //tenant_seq write_object_handle.reset(); ASSERT_EQ(OB_SUCCESS, write_object_handle.set_macro_block_id(tablet_data_macro)); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->write_file(write_info, write_object_handle)); ObArray tablet_data_macros; ObArray tablet_ids; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->list_tablet_data_dir(tablet_ids)); ASSERT_EQ(1, tablet_ids.count()); ASSERT_EQ(tablet_id, tablet_ids.at(0)); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->list_private_macro_file(tablet_ids.at(0), 0/*transfer_seq*/, tablet_data_macros)); ASSERT_EQ(1, tablet_data_macros.count()); ASSERT_EQ(tablet_data_macro.second_id(), tablet_data_macros.at(0).second_id()); ASSERT_EQ(tablet_data_macro.third_id(), tablet_data_macros.at(0).third_id()); ASSERT_EQ(tablet_data_macro.tenant_seq(), tablet_data_macros.at(0).tenant_seq()); ASSERT_EQ(tablet_data_macro.macro_transfer_seq(), tablet_data_macros.at(0).macro_transfer_seq()); // test3: list private tablet meta macro MacroBlockId tablet_meta_macro; tablet_id = 4; server_id = 5; seq_id = 7; tablet_meta_macro.set_id_mode(static_cast(ObMacroBlockIdMode::ID_MODE_SHARE)); tablet_meta_macro.set_storage_object_type(static_cast(ObStorageObjectType::PRIVATE_META_MACRO)); tablet_meta_macro.set_second_id(tablet_id); tablet_meta_macro.set_third_id(server_id); tablet_meta_macro.set_macro_transfer_seq(0); // transfer_seq tablet_meta_macro.set_tenant_seq(seq_id); //tenant_seq write_object_handle.reset(); ASSERT_EQ(OB_SUCCESS, write_object_handle.set_macro_block_id(tablet_meta_macro)); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->write_file(write_info, write_object_handle)); ObArray tablet_meta_macros; tablet_ids.reset(); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->list_tablet_data_dir(tablet_ids)); ASSERT_EQ(1, tablet_ids.count()); ASSERT_EQ(tablet_id, tablet_ids.at(0)); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->list_private_macro_file(tablet_ids.at(0), 0/*transfer_seq*/, tablet_meta_macros)); ASSERT_EQ(2, tablet_meta_macros.count()); ASSERT_EQ(tablet_meta_macro.second_id(), tablet_meta_macros.at(1).second_id()); ASSERT_EQ(tablet_meta_macro.third_id(), tablet_meta_macros.at(1).third_id()); ASSERT_EQ(tablet_meta_macro.tenant_seq(), tablet_meta_macros.at(1).tenant_seq()); ASSERT_EQ(tablet_meta_macro.macro_transfer_seq(), tablet_meta_macros.at(1).macro_transfer_seq()); ASSERT_EQ(tablet_data_macro.second_id(), tablet_meta_macros.at(0).second_id()); ASSERT_EQ(tablet_data_macro.third_id(), tablet_meta_macros.at(0).third_id()); ASSERT_EQ(tablet_data_macro.tenant_seq(), tablet_meta_macros.at(0).tenant_seq()); ASSERT_EQ(tablet_data_macro.macro_transfer_seq(), tablet_meta_macros.at(0).macro_transfer_seq()); // test4: list private tablet meta version MacroBlockId ls_meta; int64_t ls_id = 8; int64_t ls_epoch_id = 0; int64_t meta_version_id = 10; ls_meta.set_id_mode(static_cast(ObMacroBlockIdMode::ID_MODE_SHARE)); ls_meta.set_storage_object_type(static_cast(ObStorageObjectType::LS_META)); ls_meta.set_second_id(ls_id); write_object_handle.reset(); ASSERT_EQ(OB_SUCCESS, write_object_handle.set_macro_block_id(ls_meta)); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->write_file(write_info, write_object_handle)); MacroBlockId tablet_meta_version; tablet_meta_version.set_id_mode(static_cast(ObMacroBlockIdMode::ID_MODE_SHARE)); tablet_meta_version.set_storage_object_type(static_cast(ObStorageObjectType::PRIVATE_TABLET_META)); tablet_meta_version.set_second_id(ls_id); tablet_meta_version.set_third_id(tablet_id); tablet_data_macro.set_meta_transfer_seq(0); // transfer_seq tablet_data_macro.set_meta_version_id(meta_version_id); //tenant_seq write_object_handle.reset(); ASSERT_EQ(OB_SUCCESS, write_object_handle.set_macro_block_id(tablet_meta_version)); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->write_file(write_info, write_object_handle)); // test5: list shared tablet ids MacroBlockId shared_tablet_ids; int shared_tablet_id = 11; shared_tablet_ids.set_id_mode(static_cast(ObMacroBlockIdMode::ID_MODE_SHARE)); shared_tablet_ids.set_storage_object_type(static_cast(ObStorageObjectType::SHARED_TABLET_ID)); shared_tablet_ids.set_second_id(shared_tablet_id); write_object_handle.reset(); ASSERT_EQ(OB_SUCCESS, write_object_handle.set_macro_block_id(shared_tablet_ids)); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->write_file(write_info, write_object_handle)); tablet_ids.reset(); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->list_shared_tablet_ids(tablet_ids)); ASSERT_EQ(1, tablet_ids.count()); ASSERT_EQ(shared_tablet_id, tablet_ids.at(0)); // test6: list shared tenant dir ObArray tenant_ids; uint64_t tenant_id = 1; ASSERT_EQ(OB_SUCCESS, OB_SERVER_FILE_MGR.list_shared_tenant_ids(MTL_ID(), tenant_ids)); ASSERT_EQ(1, tenant_ids.count()); ASSERT_EQ(tenant_id, tenant_ids.at(0)); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->delete_file(shared_tablet_ids)); bool is_exist = true; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->is_exist_file(shared_tablet_ids, 0, is_exist)); ASSERT_EQ(false, is_exist); tenant_ids.reset(); ASSERT_EQ(OB_SUCCESS, OB_SERVER_FILE_MGR.list_shared_tenant_ids(MTL_ID(), tenant_ids)); ASSERT_EQ(0, tenant_ids.count()); // test7: list shared tablet meta macro MacroBlockId shared_tablet_meta_macro; int64_t tablet_meta_id = 13; seq_id = 14; shared_tablet_meta_macro.set_id_mode(static_cast(ObMacroBlockIdMode::ID_MODE_SHARE)); shared_tablet_meta_macro.set_storage_object_type(static_cast(ObStorageObjectType::SHARED_MAJOR_META_MACRO)); shared_tablet_meta_macro.set_second_id(tablet_meta_id); shared_tablet_meta_macro.set_third_id(seq_id); write_object_handle.reset(); ASSERT_EQ(OB_SUCCESS, write_object_handle.set_macro_block_id(shared_tablet_meta_macro)); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->write_file(write_info, write_object_handle)); // test8: delete shared tablet data dir is_exist = false; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->is_exist_file(shared_tablet_meta_macro, 0, is_exist)); ASSERT_EQ(true, is_exist); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->delete_shared_tablet_data_dir(tablet_meta_id)); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->is_exist_file(shared_tablet_meta_macro, 0, is_exist)); ASSERT_EQ(false, is_exist); // test9: list shared tablet meta version MacroBlockId shared_tablet_meta_version; int64_t tablet_meta_version_id = 15; meta_version_id = 16; shared_tablet_meta_version.set_id_mode(static_cast(ObMacroBlockIdMode::ID_MODE_SHARE)); shared_tablet_meta_version.set_storage_object_type(static_cast(ObStorageObjectType::SHARED_MAJOR_TABLET_META)); shared_tablet_meta_version.set_second_id(tablet_meta_version_id); shared_tablet_meta_version.set_third_id(meta_version_id); write_object_handle.reset(); ASSERT_EQ(OB_SUCCESS, write_object_handle.set_macro_block_id(shared_tablet_meta_version)); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->write_file(write_info, write_object_handle)); // test10: delete shared tablet meta versions ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->delete_file(shared_tablet_meta_version)); // test11: delete tmp file ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->delete_tmp_file(tmp_file)); // test12: delete private macro files ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->delete_files(tablet_meta_macros)); // test13: delete ls dir file ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->delete_ls_dir(ls_id, ls_epoch_id)); } TEST_F(TestFileManager, test_list_local_files_rec) { int ret = OB_SUCCESS; ObTenantFileManager* tenant_file_mgr = MTL(ObTenantFileManager*); ASSERT_NE(nullptr, tenant_file_mgr); // test1: list tmp file MacroBlockId tmp_file; int64_t tmp_file_id = 3; int64_t segment_file_id = 2; tmp_file.set_id_mode(static_cast(ObMacroBlockIdMode::ID_MODE_SHARE)); tmp_file.set_storage_object_type(static_cast(ObStorageObjectType::TMP_FILE)); tmp_file.set_second_id(tmp_file_id); tmp_file.set_third_id(segment_file_id); ObStorageObjectHandle write_object_handle; ASSERT_EQ(OB_SUCCESS, write_object_handle.set_macro_block_id(tmp_file)); const int64_t write_io_size = 8 * 1024; // 8KB char write_buf[write_io_size] = { 0 }; memset(write_buf, 'a', write_io_size); ObStorageObjectWriteInfo write_info; write_info.io_desc_.set_resource_group_id(0); write_info.io_desc_.set_wait_event(1); write_info.io_desc_.set_unsealed(); write_info.buffer_ = write_buf; write_info.offset_ = 0; write_info.size_ = write_io_size; write_info.io_timeout_ms_ = DEFAULT_IO_WAIT_TIME_MS; write_info.mtl_tenant_id_ = MTL_ID(); write_info.tmp_file_valid_length_ = write_io_size; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->append_file(write_info, write_object_handle)); TestDirDelOp dir_del_op; TestFileDelOp file_del_op; char file_path[common::MAX_PATH_SIZE] = {0}; bool is_exist = true; ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.get_local_tmp_data_dir(file_path, sizeof(file_path), MTL_ID(), MTL_EPOCH_ID())); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->list_local_files_rec(file_path, file_del_op, dir_del_op)); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->is_exist_file(tmp_file, 0, is_exist)); ASSERT_EQ(false, is_exist); ObArray tmp_files; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->list_tmp_file(tmp_files)); ASSERT_EQ(0, tmp_files.count()); // test2: list private tablet data macro MacroBlockId tablet_data_macro; int64_t tablet_id = 4; int64_t server_id = 5; int64_t seq_id = 6; tablet_data_macro.set_id_mode(static_cast(ObMacroBlockIdMode::ID_MODE_SHARE)); tablet_data_macro.set_storage_object_type(static_cast(ObStorageObjectType::PRIVATE_DATA_MACRO)); tablet_data_macro.set_second_id(tablet_id); tablet_data_macro.set_third_id(server_id); tablet_data_macro.set_macro_transfer_seq(0); // transfer_seq tablet_data_macro.set_tenant_seq(seq_id); //tenant_seq write_object_handle.reset(); ASSERT_EQ(OB_SUCCESS, write_object_handle.set_macro_block_id(tablet_data_macro)); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->write_file(write_info, write_object_handle)); MacroBlockId tablet_meta_macro; tablet_id = 4; server_id = 5; seq_id = 7; tablet_meta_macro.set_id_mode(static_cast(ObMacroBlockIdMode::ID_MODE_SHARE)); tablet_meta_macro.set_storage_object_type(static_cast(ObStorageObjectType::PRIVATE_META_MACRO)); tablet_meta_macro.set_second_id(tablet_id); tablet_meta_macro.set_third_id(server_id); tablet_meta_macro.set_macro_transfer_seq(0); // transfer_seq tablet_meta_macro.set_tenant_seq(seq_id); //tenant_seq write_object_handle.reset(); ASSERT_EQ(OB_SUCCESS, write_object_handle.set_macro_block_id(tablet_meta_macro)); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->write_file(write_info, write_object_handle)); file_path[0] = '\0'; ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.get_local_tablet_data_dir(file_path, sizeof(file_path), MTL_ID(), MTL_EPOCH_ID())); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->list_local_files_rec(file_path, file_del_op, dir_del_op)); is_exist = true; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->is_exist_file(tablet_data_macro, 0, is_exist)); ASSERT_EQ(false, is_exist); is_exist = true; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->is_exist_file(tablet_meta_macro, 0, is_exist)); ASSERT_EQ(false, is_exist); ObArray tablet_ids; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->list_tablet_data_dir(tablet_ids)); ASSERT_EQ(0, tablet_ids.count()); } TEST_F(TestFileManager, test_delete_tmp_seq_files) { int ret = OB_SUCCESS; ObTenantFileManager* tenant_file_mgr = MTL(ObTenantFileManager*); ASSERT_NE(nullptr, tenant_file_mgr); int64_t seq_id = 100; char disk_space_meta_path[ObBaseFileManager::OB_MAX_FILE_PATH_LENGTH] = {0}; ASSERT_EQ(OB_SUCCESS, databuff_printf(disk_space_meta_path, ObBaseFileManager::OB_MAX_FILE_PATH_LENGTH, "%s/%lu_%ld/%s%s%ld", OB_DIR_MGR.get_local_cache_root_dir(), MTL_ID(), MTL_EPOCH_ID(), get_storage_objet_type_str(ObStorageObjectType::TENANT_DISK_SPACE_META), DEFAULT_TMP_STR, seq_id)); ObIOFd fd; const int64_t write_io_size = 4096; // 4KB char write_buf[write_io_size] = { 0 }; memset(write_buf, 'a', write_io_size); int64_t written_size = 0; ASSERT_EQ(OB_SUCCESS, ObIODeviceLocalFileOp::open(disk_space_meta_path, O_RDWR | O_CREAT | O_TRUNC, S_IWUSR | S_IRUSR, fd)); ASSERT_EQ(OB_SUCCESS, ObIODeviceLocalFileOp::write(fd, write_buf, write_io_size, written_size)); ObIODFileStat statbuf; ASSERT_EQ(OB_SUCCESS, ObIODeviceLocalFileOp::stat(disk_space_meta_path, statbuf)); volatile bool is_stop = false; ObDirCalcSizeOp del_tmp_seq_file_op(is_stop); const int64_t del_security_time_s = 5; // 5s ASSERT_EQ(OB_SUCCESS, del_tmp_seq_file_op.set_tmp_seq_file_del_secy_time_s(del_security_time_s)); ob_usleep(2 * 1000 * 1000L); // sleep 2s ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->calibrate_disk_space_task_.delete_tmp_seq_files(del_tmp_seq_file_op)); ASSERT_EQ(OB_SUCCESS, ObIODeviceLocalFileOp::stat(disk_space_meta_path, statbuf)); ob_usleep(5 * 1000 * 1000L); // sleep 5s ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->calibrate_disk_space_task_.delete_tmp_seq_files(del_tmp_seq_file_op)); ASSERT_EQ(OB_NO_SUCH_FILE_OR_DIRECTORY, ObIODeviceLocalFileOp::stat(disk_space_meta_path, statbuf)); } TEST_F(TestFileManager, test_gc_local_major_data) { int ret = OB_SUCCESS; ObTenantFileManager* tenant_file_mgr = MTL(ObTenantFileManager*); ASSERT_NE(nullptr, tenant_file_mgr); MacroBlockId shared_data_macro; int64_t tablet_id = 100; int64_t seq_id = 101; shared_data_macro.set_id_mode(static_cast(ObMacroBlockIdMode::ID_MODE_SHARE)); shared_data_macro.set_storage_object_type(static_cast(ObStorageObjectType::SHARED_MAJOR_DATA_MACRO)); shared_data_macro.set_second_id(tablet_id); shared_data_macro.set_third_id(seq_id); ObPathContext ctx; ASSERT_EQ(OB_SUCCESS, ctx.set_file_ctx(shared_data_macro, 0/*ls_epoch_id*/, true/*is_local_cache*/)); ObIOFd fd; const int64_t write_io_size = 4096; // 4KB char write_buf[write_io_size] = { 0 }; memset(write_buf, 'a', write_io_size); int64_t written_size = 0; ASSERT_EQ(OB_SUCCESS, ObIODeviceLocalFileOp::open(ctx.get_path(), O_RDWR | O_CREAT | O_TRUNC, S_IWUSR | S_IRUSR, fd)); ASSERT_EQ(OB_SUCCESS, ObIODeviceLocalFileOp::write(fd, write_buf, write_io_size, written_size)); ObIODFileStat statbuf; ASSERT_EQ(OB_SUCCESS, ObIODeviceLocalFileOp::stat(ctx.get_path(), statbuf)); ob_usleep(2 * 1000 * 1000L); // sleep 2s int64_t del_time_s = ObTimeUtility::current_time_s(); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->delete_local_major_data_dir(del_time_s)); ASSERT_EQ(OB_NO_SUCH_FILE_OR_DIRECTORY, ObIODeviceLocalFileOp::stat(ctx.get_path(), statbuf)); } TEST_F(TestFileManager, test_deleted_file_operator) { int ret = OB_SUCCESS; ObTenantFileManager* tenant_file_mgr = MTL(ObTenantFileManager*); ASSERT_NE(nullptr, tenant_file_mgr); ObTenantDiskSpaceManager* tenant_disk_space_mgr = MTL(ObTenantDiskSpaceManager*); ASSERT_NE(nullptr, tenant_disk_space_mgr); MacroBlockId tmp_file; int64_t tmp_file_id = 10; int64_t segment_file_id = 11; tmp_file.set_id_mode(static_cast(ObMacroBlockIdMode::ID_MODE_SHARE)); tmp_file.set_storage_object_type(static_cast(ObStorageObjectType::TMP_FILE)); tmp_file.set_second_id(tmp_file_id); tmp_file.set_third_id(segment_file_id); ObStorageObjectHandle write_object_handle; ASSERT_EQ(OB_SUCCESS, write_object_handle.set_macro_block_id(tmp_file)); const int64_t write_io_size = 8 * 1024; // 8KB char write_buf[write_io_size] = { 0 }; memset(write_buf, 'a', write_io_size); ObStorageObjectWriteInfo write_info; write_info.io_desc_.set_resource_group_id(0); write_info.io_desc_.set_wait_event(1); write_info.io_desc_.set_unsealed(); write_info.buffer_ = write_buf; write_info.offset_ = 0; write_info.size_ = write_io_size; write_info.tmp_file_valid_length_ = write_io_size; write_info.io_timeout_ms_ = DEFAULT_IO_WAIT_TIME_MS; write_info.mtl_tenant_id_ = MTL_ID(); // step 1: write tmp_file ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.create_tmp_file_dir(MTL_ID(), MTL_EPOCH_ID(), tmp_file_id)); int64_t expected_disk_size = write_io_size; char dir_path[ObBaseFileManager::OB_MAX_FILE_PATH_LENGTH] = {0}; ObIODFileStat statbuf; ASSERT_EQ(OB_SUCCESS, OB_DIR_MGR.get_local_tmp_file_dir(dir_path, sizeof(dir_path), MTL_ID(), MTL_EPOCH_ID(), tmp_file_id)); ASSERT_EQ(OB_SUCCESS, ObIODeviceLocalFileOp::stat(dir_path, statbuf)); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->append_file(write_info, write_object_handle)); int64_t tmp_file_write_cache_alloc_size = tenant_disk_space_mgr->get_tmp_file_write_cache_alloc_size(); bool is_exist = false; ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->is_exist_local_file(tmp_file, 0/*ls_epoch_id*/, is_exist)); ASSERT_TRUE(is_exist); // step 2: delete tmp_file when pause_gc tenant_file_mgr->set_tmp_file_cache_pause_gc(); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->delete_local_file(tmp_file)); // old path has been rename, old path is not exist ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->is_exist_local_file(tmp_file, 0/*ls_epoch_id*/, is_exist)); ASSERT_FALSE(is_exist); ObPathContext ctx; ASSERT_EQ(OB_SUCCESS, ctx.set_logical_delete_ctx(tmp_file, 0/*ls_epoch_id*/)); // old path has been rename, new path is exist ASSERT_EQ(OB_SUCCESS, ObIODeviceLocalFileOp::exist(ctx.get_path(), is_exist)); ASSERT_TRUE(is_exist); // delete tmp_file when pause_gc, rename file path, so tmp_file_write_cache_alloc_size does not changed ASSERT_EQ(tmp_file_write_cache_alloc_size, tenant_disk_space_mgr->get_tmp_file_write_cache_alloc_size()); // step 3: delete .deleted file tenant_file_mgr->set_tmp_file_cache_allow_gc(); ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->calibrate_disk_space_task_.rm_logical_deleted_file()); // after calibrate, rm_logical_deleted_file, so renamed file path is not exist ASSERT_EQ(OB_SUCCESS, ObIODeviceLocalFileOp::exist(ctx.get_path(), is_exist)); ASSERT_FALSE(is_exist); // delete .deleted file, so tmp_file_write_cache_alloc_size reduce ASSERT_EQ(tmp_file_write_cache_alloc_size - write_io_size - statbuf.size_, tenant_disk_space_mgr->get_tmp_file_write_cache_alloc_size()); // step 4: test rename not exist file ASSERT_EQ(OB_SUCCESS, tenant_file_mgr->logical_delete_local_file(tmp_file, 0/*ls_epoch_id*/)); } TEST_F(TestFileManager, test_delete_tenant) { // delete local tenant dir file ASSERT_EQ(OB_SUCCESS, OB_SERVER_FILE_MGR.delete_local_tenant_dir(MTL_ID(), MTL_EPOCH_ID())); // delete remote tenant dir file ASSERT_EQ(OB_SUCCESS, OB_SERVER_FILE_MGR.delete_remote_tenant_dir(MTL_ID(), MTL_EPOCH_ID())); } } // namespace storage } // namespace oceanbase int main(int argc, char **argv) { int ret = 0; system("rm -f ./test_file_manager.log*"); OB_LOGGER.set_file_name("test_file_manager.log", true); OB_LOGGER.set_log_level("INFO"); testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }