Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
天地威能
oceanbase
提交
e3c058b9
O
oceanbase
项目概览
天地威能
/
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,体验更适合开发者的 AI 搜索 >>
提交
e3c058b9
编写于
11月 28, 2022
作者:
Z
ZenoWang
提交者:
wangzelin.wzl
11月 28, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[FIX] memory leak of tx data
上级
71856466
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
22 addition
and
42 deletion
+22
-42
src/storage/tx_table/ob_tx_data_table.cpp
src/storage/tx_table/ob_tx_data_table.cpp
+18
-41
src/storage/tx_table/ob_tx_data_table.h
src/storage/tx_table/ob_tx_data_table.h
+4
-1
未找到文件。
src/storage/tx_table/ob_tx_data_table.cpp
浏览文件 @
e3c058b9
...
...
@@ -193,7 +193,9 @@ void ObTxDataTable::reset()
int
ObTxDataTable
::
prepare_for_safe_destroy
()
{
return
clean_memtables_cache_
();
int
ret
=
clean_memtables_cache_
();
LOG_INFO
(
"tx data table prepare for safe destroy"
,
KR
(
ret
),
K
(
get_ls_id
()));
return
ret
;
}
int
ObTxDataTable
::
offline
()
...
...
@@ -644,37 +646,32 @@ int ObTxDataTable::get_tx_data_in_memtables_cache_(const ObTransID tx_id,
int
ObTxDataTable
::
check_tx_data_in_sstable_
(
const
ObTransID
tx_id
,
ObITxDataCheckFunctor
&
fn
)
{
int
ret
=
OB_SUCCESS
;
ObTxData
*
tx_data
=
nullptr
;
ObTxData
tx_data
;
tx_data
.
reset
();
if
(
OB_FAIL
(
get_tx_data_in_sstable_
(
tx_id
,
tx_data
)))
{
STORAGE_LOG
(
WARN
,
"get tx data from sstable failed."
,
KR
(
ret
),
K
(
tx_id
));
}
else
if
(
OB_ISNULL
(
tx_data
))
{
ret
=
OB_ERR_UNEXPECTED
;
STORAGE_LOG
(
ERROR
,
"unexpected nullptr of tx data"
,
KR
(
ret
),
K
(
tx_id
));
}
else
if
(
OB_FAIL
(
fn
(
*
tx_data
)))
{
}
else
if
(
OB_FAIL
(
fn
(
tx_data
)))
{
STORAGE_LOG
(
WARN
,
"check tx data in sstable failed."
,
KR
(
ret
),
KP
(
this
),
K
(
tablet_id_
));
}
// free
tx data after using i
t
if
(
OB_NOT_NULL
(
tx_data
))
{
free_
tx_data
(
tx_data
);
// free
undo status list if exis
t
if
(
OB_NOT_NULL
(
tx_data
.
undo_status_list_
.
head_
))
{
free_
undo_status_list_
(
tx_data
.
undo_status_list_
.
head_
);
}
return
ret
;
}
int
ObTxDataTable
::
get_tx_data_in_sstable_
(
const
transaction
::
ObTransID
tx_id
,
ObTxData
*
&
tx_data
)
int
ObTxDataTable
::
get_tx_data_in_sstable_
(
const
transaction
::
ObTransID
tx_id
,
ObTxData
&
tx_data
)
{
int
ret
=
OB_SUCCESS
;
tx_data
=
nullptr
;
ObTableIterParam
iter_param
=
read_schema_
.
iter_param_
;
ObTabletHandle
&
tablet_handle
=
iter_param
.
tablet_handle_
;
if
(
tablet_handle
.
is_valid
())
{
ret
=
OB_ERR_UNEXPECTED
;
STORAGE_LOG
(
ERROR
,
"tablet handle should be empty"
,
KR
(
ret
),
K
(
tablet_handle
));
}
else
if
(
OB_FAIL
(
alloc_tx_data
(
tx_data
)))
{
STORAGE_LOG
(
WARN
,
"allocate tx data from tx data table failed."
);
}
else
if
(
FALSE_IT
(
tx_data
->
tx_id_
=
tx_id
))
{
}
else
if
(
FALSE_IT
(
tx_data
.
tx_id_
=
tx_id
))
{
}
else
if
(
OB_FAIL
(
ls_tablet_svr_
->
get_tablet
(
tablet_id_
,
tablet_handle
)))
{
STORAGE_LOG
(
WARN
,
"get tablet from ls tablet service fail."
,
KR
(
ret
),
KP
(
this
),
K
(
tablet_id_
));
}
else
if
(
OB_UNLIKELY
(
!
tablet_handle
.
is_valid
()))
{
...
...
@@ -684,7 +681,7 @@ int ObTxDataTable::get_tx_data_in_sstable_(const transaction::ObTransID tx_id, O
ObTxDataSingleRowGetter
getter
(
iter_param
,
slice_allocator_
);
if
(
OB_FAIL
(
getter
.
init
(
tx_id
)))
{
STORAGE_LOG
(
WARN
,
"init ObTxDataSingleRowGetter fail."
,
KR
(
ret
),
KP
(
this
),
K
(
tablet_id_
));
}
else
if
(
OB_FAIL
(
getter
.
get_next_row
(
*
tx_data
)))
{
}
else
if
(
OB_FAIL
(
getter
.
get_next_row
(
tx_data
)))
{
if
(
OB_ITER_END
==
ret
)
{
ret
=
OB_TRANS_CTX_NOT_EXIST
;
}
...
...
@@ -694,11 +691,6 @@ int ObTxDataTable::get_tx_data_in_sstable_(const transaction::ObTransID tx_id, O
}
}
// If get tx data in sstable failed, free the tx data and reset it.
if
(
OB_FAIL
(
ret
)
&&
(
nullptr
!=
tx_data
))
{
free_tx_data
(
tx_data
);
tx_data
=
nullptr
;
}
return
ret
;
}
...
...
@@ -1217,7 +1209,8 @@ int ObTxDataTable::calc_upper_trans_scn_(const SCN sstable_end_scn, SCN &upper_t
int
ObTxDataTable
::
supplement_undo_actions_if_exist
(
ObTxData
*&
tx_data
)
{
int
ret
=
OB_SUCCESS
;
ObTxData
*
tx_data_from_sstable
=
nullptr
;
ObTxData
tx_data_from_sstable
;
tx_data_from_sstable
.
reset
();
if
(
IS_NOT_INIT
)
{
ret
=
OB_NOT_INIT
;
...
...
@@ -1232,17 +1225,9 @@ int ObTxDataTable::supplement_undo_actions_if_exist(ObTxData *&tx_data)
}
else
{
STORAGE_LOG
(
WARN
,
"get tx data from sstable failed."
,
KR
(
ret
));
}
}
else
if
(
OB_ISNULL
(
tx_data_from_sstable
))
{
ret
=
OB_ERR_UNEXPECTED
;
STORAGE_LOG
(
WARN
,
"unexpected nullptr of tx data"
,
KR
(
ret
),
KPC
(
tx_data
));
}
else
{
// assign and reset to avoid deep copy
tx_data
->
undo_status_list_
=
tx_data_from_sstable
->
undo_status_list_
;
tx_data_from_sstable
->
undo_status_list_
.
reset
();
}
if
(
OB_NOT_NULL
(
tx_data_from_sstable
))
{
free_tx_data
(
tx_data_from_sstable
);
tx_data
->
undo_status_list_
=
tx_data_from_sstable
.
undo_status_list_
;
}
return
ret
;
}
...
...
@@ -1325,24 +1310,16 @@ int ObTxDataTable::dump_tx_data_in_memtable_2_text_(const ObTransID tx_id, FILE
int
ObTxDataTable
::
dump_tx_data_in_sstable_2_text_
(
const
ObTransID
tx_id
,
FILE
*
fd
)
{
int
ret
=
OB_SUCCESS
;
ObTxData
*
tx_data
=
nullptr
;
ObTxData
tx_data
;
tx_data
.
reset
();
if
(
OB_FAIL
(
get_tx_data_in_sstable_
(
tx_id
,
tx_data
)))
{
STORAGE_LOG
(
WARN
,
"get tx data from sstable failed."
,
KR
(
ret
),
K
(
tx_id
));
}
else
if
(
OB_ISNULL
(
tx_data
))
{
ret
=
OB_ERR_UNEXPECTED
;
STORAGE_LOG
(
ERROR
,
"unexpected nullptr of tx data"
,
KR
(
ret
),
K
(
tx_id
));
}
else
{
fprintf
(
fd
,
"********** Tx Data SSTable ***********
\n\n
"
);
tx_data
->
dump_2_text
(
fd
);
tx_data
.
dump_2_text
(
fd
);
fprintf
(
fd
,
"
\n
********** Tx Data SSTable ***********
\n
"
);
}
// free tx data after using it
if
(
OB_NOT_NULL
(
tx_data
))
{
free_tx_data
(
tx_data
);
}
return
ret
;
}
...
...
src/storage/tx_table/ob_tx_data_table.h
浏览文件 @
e3c058b9
...
...
@@ -74,6 +74,8 @@ public:
memtable_tail_
=
-
1
;
memtable_handles_
.
reset
();
}
TO_STRING_KV
(
K
(
memtable_head_
),
K
(
memtable_tail_
),
K
(
memtable_handles_
));
};
struct
CalcUpperInfo
...
...
@@ -236,6 +238,7 @@ public: // ObTxDataTable
K_
(
is_started
),
K_
(
tablet_id
),
K_
(
calc_upper_info
),
K_
(
memtables_cache
),
KP_
(
ls
),
KP_
(
ls_tablet_svr
),
KP_
(
memtable_mgr
),
...
...
@@ -262,7 +265,7 @@ private:
int
get_tx_data_in_cache_
(
const
transaction
::
ObTransID
tx_id
,
ObTxData
*&
tx_data
);
int
get_tx_data_in_sstable_
(
const
transaction
::
ObTransID
tx_id
,
ObTxData
*
&
tx_data
);
int
get_tx_data_in_sstable_
(
const
transaction
::
ObTransID
tx_id
,
ObTxData
&
tx_data
);
int
insert_
(
ObTxData
*&
tx_data
,
ObTxDataMemtableWriteGuard
&
write_guard
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录