1377 lines
66 KiB
C++
1377 lines
66 KiB
C++
/**
|
|
* 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 <gmock/gmock.h>
|
|
#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<uint64_t>(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<uint64_t>(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<uint64_t>(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<uint64_t>(ObMacroBlockIdMode::ID_MODE_SHARE));
|
|
file_id.set_storage_object_type(static_cast<uint64_t>(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<uint64_t>(ObMacroBlockIdMode::ID_MODE_SHARE));
|
|
inc_file_id.set_storage_object_type(static_cast<uint64_t>(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<uint64_t>(ObStorageObjectType::PRIVATE_DATA_MACRO); obj_id < static_cast<uint64_t>(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<uint64_t>(ObMacroBlockIdMode::ID_MODE_SHARE));
|
|
file_id.set_storage_object_type(static_cast<uint64_t>(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<uint64_t>(ObStorageObjectType::PRIVATE_DATA_MACRO); obj_id < static_cast<uint64_t>(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<uint64_t>(ObMacroBlockIdMode::ID_MODE_SHARE));
|
|
file_id.set_storage_object_type(static_cast<uint64_t>(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<int64_t> 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<uint64_t>(ObMacroBlockIdMode::ID_MODE_SHARE));
|
|
file_id.set_storage_object_type(static_cast<uint64_t>(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<uint64_t>(ObMacroBlockIdMode::ID_MODE_SHARE));
|
|
file_id.set_storage_object_type(static_cast<uint64_t>(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<int64_t> 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<char *>(ob_malloc_align(alignment, WRITE_IO_SIZE, attr));
|
|
char *read_buf = static_cast<char *>(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<uint64_t>(ObMacroBlockIdMode::ID_MODE_SHARE));
|
|
tmp_file.set_storage_object_type(static_cast<uint64_t>(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<uint64_t>(ObMacroBlockIdMode::ID_MODE_SHARE));
|
|
tmp_file.set_storage_object_type(static_cast<uint64_t>(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<MacroBlockId> 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<uint64_t>(ObMacroBlockIdMode::ID_MODE_SHARE));
|
|
tablet_data_macro.set_storage_object_type(static_cast<uint64_t>(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<MacroBlockId> tablet_data_macros;
|
|
ObArray<int64_t> 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<uint64_t>(ObMacroBlockIdMode::ID_MODE_SHARE));
|
|
tablet_meta_macro.set_storage_object_type(static_cast<uint64_t>(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<MacroBlockId> 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<uint64_t>(ObMacroBlockIdMode::ID_MODE_SHARE));
|
|
ls_meta.set_storage_object_type(static_cast<uint64_t>(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<uint64_t>(ObMacroBlockIdMode::ID_MODE_SHARE));
|
|
tablet_meta_version.set_storage_object_type(static_cast<uint64_t>(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<uint64_t>(ObMacroBlockIdMode::ID_MODE_SHARE));
|
|
shared_tablet_ids.set_storage_object_type(static_cast<uint64_t>(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<uint64_t> 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<uint64_t>(ObMacroBlockIdMode::ID_MODE_SHARE));
|
|
shared_tablet_meta_macro.set_storage_object_type(static_cast<uint64_t>(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<uint64_t>(ObMacroBlockIdMode::ID_MODE_SHARE));
|
|
shared_tablet_meta_version.set_storage_object_type(static_cast<uint64_t>(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<uint64_t>(ObMacroBlockIdMode::ID_MODE_SHARE));
|
|
tmp_file.set_storage_object_type(static_cast<uint64_t>(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<MacroBlockId> 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<uint64_t>(ObMacroBlockIdMode::ID_MODE_SHARE));
|
|
tablet_data_macro.set_storage_object_type(static_cast<uint64_t>(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<uint64_t>(ObMacroBlockIdMode::ID_MODE_SHARE));
|
|
tablet_meta_macro.set_storage_object_type(static_cast<uint64_t>(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<int64_t> 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<uint64_t>(ObMacroBlockIdMode::ID_MODE_SHARE));
|
|
shared_data_macro.set_storage_object_type(static_cast<uint64_t>(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<uint64_t>(ObMacroBlockIdMode::ID_MODE_SHARE));
|
|
tmp_file.set_storage_object_type(static_cast<uint64_t>(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();
|
|
}
|