提交 c6ce3292 编写于 作者: J JiahuaChen 提交者: wangzelin.wzl

[CP] [CP] Remove multi logical tenant files

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