Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
oceanbase
oceanbase
提交
cc86072c
O
oceanbase
项目概览
oceanbase
/
oceanbase
10 个月 前同步成功
通知
261
Star
6084
Fork
1301
代码
文件
提交
分支
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,体验更适合开发者的 AI 搜索 >>
提交
cc86072c
编写于
9月 14, 2023
作者:
H
Handora
提交者:
ob-robot
9月 14, 2023
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[BUG] batch destroy keybtree
上级
4ce5a32a
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
79 addition
and
14 deletion
+79
-14
src/storage/ddl/ob_tablet_ddl_kv.cpp
src/storage/ddl/ob_tablet_ddl_kv.cpp
+1
-1
src/storage/memtable/mvcc/ob_keybtree.cpp
src/storage/memtable/mvcc/ob_keybtree.cpp
+34
-3
src/storage/memtable/mvcc/ob_keybtree.h
src/storage/memtable/mvcc/ob_keybtree.h
+7
-5
src/storage/memtable/mvcc/ob_query_engine.cpp
src/storage/memtable/mvcc/ob_query_engine.cpp
+6
-1
src/storage/memtable/mvcc/ob_query_engine.h
src/storage/memtable/mvcc/ob_query_engine.h
+3
-0
src/storage/memtable/ob_memtable.cpp
src/storage/memtable/ob_memtable.cpp
+5
-0
src/storage/memtable/ob_memtable.h
src/storage/memtable/ob_memtable.h
+1
-0
src/storage/meta_mem/ob_tenant_meta_mem_mgr.cpp
src/storage/meta_mem/ob_tenant_meta_mem_mgr.cpp
+21
-4
src/storage/meta_mem/ob_tenant_meta_mem_mgr.h
src/storage/meta_mem/ob_tenant_meta_mem_mgr.h
+1
-0
未找到文件。
src/storage/ddl/ob_tablet_ddl_kv.cpp
浏览文件 @
cc86072c
...
...
@@ -152,7 +152,7 @@ void ObBlockMetaTree::destroy()
{
is_inited_
=
false
;
macro_blocks_
.
reset
();
block_tree_
.
destroy
();
block_tree_
.
destroy
(
false
/*is_batch_destroy*/
);
data_desc_
.
reset
();
for
(
int64_t
i
=
0
;
i
<
sorted_rowkeys_
.
count
();
++
i
)
{
const
ObDataMacroBlockMeta
*
cur_meta
=
sorted_rowkeys_
.
at
(
i
).
block_meta_
;
...
...
src/storage/memtable/mvcc/ob_keybtree.cpp
浏览文件 @
cc86072c
...
...
@@ -1613,11 +1613,17 @@ void ObKeyBtree<BtreeKey, BtreeVal>::print(FILE *file) const
}
template
<
typename
BtreeKey
,
typename
BtreeVal
>
int
ObKeyBtree
<
BtreeKey
,
BtreeVal
>::
destroy
()
int
ObKeyBtree
<
BtreeKey
,
BtreeVal
>::
pre_batch_
destroy
()
{
ObTimeGuard
tg
(
"keybtree destroy"
,
50L
*
1000L
);
// 50ms
ObTimeGuard
tg
(
"keybtree
pre_batch_
destroy"
,
50L
*
1000L
);
// 50ms
destroy
(
ATOMIC_SET
(
&
root_
,
nullptr
));
tg
.
click
();
return
OB_SUCCESS
;
}
template
<
typename
BtreeKey
,
typename
BtreeVal
>
int
ObKeyBtree
<
BtreeKey
,
BtreeVal
>::
batch_destroy
()
{
ObTimeGuard
tg
(
"keybtree batch_destroy"
,
50L
*
1000L
);
// 50ms
{
HazardList
reclaim_list
;
BtreeNode
*
p
=
nullptr
;
...
...
@@ -1635,6 +1641,31 @@ int ObKeyBtree<BtreeKey, BtreeVal>::destroy()
return
OB_SUCCESS
;
}
template
<
typename
BtreeKey
,
typename
BtreeVal
>
int
ObKeyBtree
<
BtreeKey
,
BtreeVal
>::
destroy
(
const
bool
is_batch_destroy
)
{
if
(
!
is_batch_destroy
)
{
ObTimeGuard
tg
(
"keybtree destroy"
,
50L
*
1000L
);
// 50ms
destroy
(
ATOMIC_SET
(
&
root_
,
nullptr
));
tg
.
click
();
{
HazardList
reclaim_list
;
BtreeNode
*
p
=
nullptr
;
CriticalGuard
(
get_qsync
());
get_retire_station
().
purge
(
reclaim_list
);
tg
.
click
();
while
(
OB_NOT_NULL
(
p
=
reinterpret_cast
<
BtreeNode
*>
(
reclaim_list
.
pop
())))
{
free_node
(
p
);
p
=
nullptr
;
}
tg
.
click
();
}
WaitQuiescent
(
get_qsync
());
tg
.
click
();
}
return
OB_SUCCESS
;
}
template
<
typename
BtreeKey
,
typename
BtreeVal
>
int
ObKeyBtree
<
BtreeKey
,
BtreeVal
>::
del
(
const
BtreeKey
key
,
BtreeVal
&
value
,
int64_t
version
)
{
...
...
src/storage/memtable/mvcc/ob_keybtree.h
浏览文件 @
cc86072c
...
...
@@ -220,7 +220,9 @@ public:
int64_t
size
()
const
{
return
size_
.
value
();
}
void
dump
(
FILE
*
file
)
{
print
(
file
);
}
void
print
(
FILE
*
file
)
const
;
int
destroy
();
int
destroy
(
const
bool
is_batch_destroy
);
int
pre_batch_destroy
();
static
int
batch_destroy
();
int
del
(
const
BtreeKey
key
,
BtreeVal
&
value
,
int64_t
version
);
int
re_insert
(
const
BtreeKey
key
,
BtreeVal
value
);
int
insert
(
const
BtreeKey
key
,
BtreeVal
&
value
);
...
...
@@ -230,12 +232,12 @@ public:
int
set_key_range
(
BtreeRawIterator
&
handle
,
const
BtreeKey
min_key
,
const
bool
start_exclude
,
const
BtreeKey
max_key
,
bool
end_exclude
,
int64_t
version
);
BtreeNode
*
alloc_node
(
const
bool
is_emergency
);
void
free_node
(
BtreeNode
*
p
);
static
void
free_node
(
BtreeNode
*
p
);
void
retire
(
common
::
HazardList
&
retire_list
);
int32_t
update_split_info
(
int32_t
split_pos
);
common
::
RetireStation
&
get_retire_station
();
common
::
QClock
&
get_qclock
();
common
::
ObQSync
&
get_qsync
();
static
common
::
RetireStation
&
get_retire_station
();
static
common
::
QClock
&
get_qclock
();
static
common
::
ObQSync
&
get_qsync
();
private:
void
destroy
(
BtreeNode
*
root
);
private:
...
...
src/storage/memtable/mvcc/ob_query_engine.cpp
浏览文件 @
cc86072c
...
...
@@ -175,13 +175,18 @@ void ObQueryEngine::destroy()
if
(
IS_NOT_INIT
)
{
// do nothing
}
else
{
keybtree_
.
destroy
();
keybtree_
.
destroy
(
true
/*is_batch_destroy*/
);
btree_allocator_
.
reset
();
keyhash_
.
destroy
();
}
is_inited_
=
false
;
}
void
ObQueryEngine
::
pre_batch_destroy_keybtree
()
{
(
void
)
keybtree_
.
pre_batch_destroy
();
}
int
ObQueryEngine
::
set
(
const
ObMemtableKey
*
key
,
ObMvccRow
*
value
)
{
int
ret
=
OB_SUCCESS
;
...
...
src/storage/memtable/mvcc/ob_query_engine.h
浏览文件 @
cc86072c
...
...
@@ -31,6 +31,8 @@ namespace memtable
{
class
ObMvccRow
;
typedef
keybtree
::
ObKeyBtree
<
ObStoreRowkeyWrapper
,
ObMvccRow
*>
ObMemtableKeyBtree
;
class
ObIQueryEngineIterator
{
public:
...
...
@@ -152,6 +154,7 @@ public:
~
ObQueryEngine
()
{
destroy
();
}
int
init
(
const
uint64_t
tenant_id
);
void
destroy
();
void
pre_batch_destroy_keybtree
();
int
set
(
const
ObMemtableKey
*
key
,
ObMvccRow
*
value
);
int
get
(
const
ObMemtableKey
*
parameter_key
,
ObMvccRow
*&
row
,
ObMemtableKey
*
returned_key
);
int
ensure
(
const
ObMemtableKey
*
key
,
ObMvccRow
*
value
);
...
...
src/storage/memtable/ob_memtable.cpp
浏览文件 @
cc86072c
...
...
@@ -208,6 +208,11 @@ int ObMemtable::init(const ObITable::TableKey &table_key,
return
ret
;
}
void
ObMemtable
::
pre_batch_destroy_keybtree
()
{
(
void
)
query_engine_
.
pre_batch_destroy_keybtree
();
}
int
ObMemtable
::
batch_remove_unused_callback_for_uncommited_txn
(
const
ObLSID
ls_id
,
const
memtable
::
ObMemtableSet
*
memtable_set
)
{
...
...
src/storage/memtable/ob_memtable.h
浏览文件 @
cc86072c
...
...
@@ -384,6 +384,7 @@ public:
int64_t
get_memtable_mgr_op_cnt
()
{
return
ATOMIC_LOAD
(
&
memtable_mgr_op_cnt_
);
}
int64_t
inc_memtable_mgr_op_cnt
()
{
return
ATOMIC_AAF
(
&
memtable_mgr_op_cnt_
,
1
);
}
int64_t
dec_memtable_mgr_op_cnt
()
{
return
ATOMIC_SAF
(
&
memtable_mgr_op_cnt_
,
1
);
}
void
pre_batch_destroy_keybtree
();
static
int
batch_remove_unused_callback_for_uncommited_txn
(
const
share
::
ObLSID
ls_id
,
const
memtable
::
ObMemtableSet
*
memtable_set
);
...
...
src/storage/meta_mem/ob_tenant_meta_mem_mgr.cpp
浏览文件 @
cc86072c
...
...
@@ -31,6 +31,7 @@
#include "storage/tx_storage/ob_ls_handle.h"
#include "storage/tx_storage/ob_ls_map.h"
#include "storage/tx_storage/ob_ls_service.h"
#include "storage/memtable/mvcc/ob_query_engine.h"
#include "storage/ddl/ob_tablet_ddl_kv.h"
#include "share/ob_thread_define.h"
#include "storage/slog_ckpt/ob_server_checkpoint_slog_handler.h"
...
...
@@ -527,12 +528,22 @@ int ObTenantMetaMemMgr::gc_tables_in_queue(bool &all_table_cleaned)
return
ret
;
}
void
ObTenantMetaMemMgr
::
batch_destroy_memtable_
(
memtable
::
ObMemtableSet
*
memtable_set
)
{
for
(
common
::
hash
::
ObHashSet
<
uint64_t
>::
iterator
set_iter
=
memtable_set
->
begin
();
set_iter
!=
memtable_set
->
end
();
++
set_iter
)
{
(
void
)(((
memtable
::
ObMemtable
*
)
set_iter
->
first
)
->
pre_batch_destroy_keybtree
());
}
memtable
::
ObMemtableKeyBtree
::
batch_destroy
();
}
void
ObTenantMetaMemMgr
::
batch_gc_memtable_
()
{
int
ret
=
OB_SUCCESS
;
int
tmp_ret
=
OB_SUCCESS
;
for
(
auto
iter
=
gc_memtable_map_
.
begin
();
for
(
common
::
hash
::
ObHashMap
<
share
::
ObLSID
,
memtable
::
ObMemtableSet
*>::
iterator
iter
=
gc_memtable_map_
.
begin
();
iter
!=
gc_memtable_map_
.
end
();
++
iter
)
{
const
ObLSID
&
ls_id
=
iter
->
first
;
memtable
::
ObMemtableSet
*
memtable_set
=
iter
->
second
;
...
...
@@ -545,7 +556,9 @@ void ObTenantMetaMemMgr::batch_gc_memtable_()
}
else
{
LOG_WARN
(
"batch remove memtable set failed"
,
K
(
tmp_ret
),
KPC
(
memtable_set
));
}
for
(
auto
set_iter
=
memtable_set
->
begin
();
set_iter
!=
memtable_set
->
end
();
++
set_iter
)
{
for
(
common
::
hash
::
ObHashSet
<
uint64_t
>::
iterator
set_iter
=
memtable_set
->
begin
();
set_iter
!=
memtable_set
->
end
();
++
set_iter
)
{
if
(
OB_TMP_FAIL
(
push_table_into_gc_queue
((
ObITable
*
)(
set_iter
->
first
),
ObITable
::
TableType
::
DATA_MEMTABLE
)))
{
LOG_ERROR
(
"push table into gc queue failed, maybe there will be leak"
,
...
...
@@ -558,7 +571,11 @@ void ObTenantMetaMemMgr::batch_gc_memtable_()
LOG_ERROR
(
"clear memtable set failed"
,
K
(
tmp_ret
),
KPC
(
memtable_set
));
}
}
else
{
for
(
auto
set_iter
=
memtable_set
->
begin
();
set_iter
!=
memtable_set
->
end
();
++
set_iter
)
{
(
void
)
batch_destroy_memtable_
(
memtable_set
);
for
(
common
::
hash
::
ObHashSet
<
uint64_t
>::
iterator
set_iter
=
memtable_set
->
begin
();
set_iter
!=
memtable_set
->
end
();
++
set_iter
)
{
pool_arr_
[
static_cast
<
int
>
(
ObITable
::
TableType
::
DATA_MEMTABLE
)]
->
free_obj
((
void
*
)(
set_iter
->
first
));
}
...
...
@@ -571,7 +588,7 @@ void ObTenantMetaMemMgr::batch_gc_memtable_()
}
if
(
REACH_TENANT_TIME_INTERVAL
(
1
_hour
))
{
for
(
auto
iter
=
gc_memtable_map_
.
begin
();
for
(
common
::
hash
::
ObHashMap
<
share
::
ObLSID
,
memtable
::
ObMemtableSet
*>::
iterator
iter
=
gc_memtable_map_
.
begin
();
iter
!=
gc_memtable_map_
.
end
();
++
iter
)
{
memtable
::
ObMemtableSet
*
memtable_set
=
iter
->
second
;
if
(
OB_NOT_NULL
(
memtable_set
))
{
...
...
src/storage/meta_mem/ob_tenant_meta_mem_mgr.h
浏览文件 @
cc86072c
...
...
@@ -476,6 +476,7 @@ private:
void
destroy_gc_tablets_queue
();
int
push_memtable_into_gc_map_
(
memtable
::
ObMemtable
*
memtable
);
void
batch_gc_memtable_
();
void
batch_destroy_memtable_
(
memtable
::
ObMemtableSet
*
memtable_set
);
private:
common
::
SpinRWLock
wash_lock_
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录