Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Metz
oceanbase
提交
c6ce3292
O
oceanbase
项目概览
Metz
/
oceanbase
与 Fork 源项目一致
Fork自
oceanbase / oceanbase
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
oceanbase
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c6ce3292
编写于
8月 12, 2022
作者:
J
JiahuaChen
提交者:
wangzelin.wzl
8月 12, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[CP] [CP] Remove multi logical tenant files
上级
331db3f5
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
28 addition
and
32 deletion
+28
-32
src/storage/ob_tenant_file_mgr.cpp
src/storage/ob_tenant_file_mgr.cpp
+10
-21
src/storage/ob_tenant_file_mgr.h
src/storage/ob_tenant_file_mgr.h
+1
-5
src/storage/ob_tenant_file_super_block_checkpoint_writer.cpp
src/storage/ob_tenant_file_super_block_checkpoint_writer.cpp
+13
-2
unittest/storage/test_tenant_file_mgr.cpp
unittest/storage/test_tenant_file_mgr.cpp
+4
-4
未找到文件。
src/storage/ob_tenant_file_mgr.cpp
浏览文件 @
c6ce3292
...
...
@@ -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
{
...
...
src/storage/ob_tenant_file_mgr.h
浏览文件 @
c6ce3292
...
...
@@ -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
);
...
...
src/storage/ob_tenant_file_super_block_checkpoint_writer.cpp
浏览文件 @
c6ce3292
...
...
@@ -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
)))
{
...
...
unittest/storage/test_tenant_file_mgr.cpp
浏览文件 @
c6ce3292
...
...
@@ -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
(
1
0
,
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
(
1
1
,
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录