Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
大炮V587
oceanbase
提交
b1da9ed2
O
oceanbase
项目概览
大炮V587
/
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,发现更多精彩内容 >>
提交
b1da9ed2
编写于
2月 06, 2023
作者:
O
obdev
提交者:
ob-robot
2月 06, 2023
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix lock contention of get_trans
上级
1207f0bf
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
36 addition
and
36 deletion
+36
-36
src/observer/table_load/ob_table_load_coordinator_ctx.cpp
src/observer/table_load/ob_table_load_coordinator_ctx.cpp
+15
-15
src/observer/table_load/ob_table_load_coordinator_ctx.h
src/observer/table_load/ob_table_load_coordinator_ctx.h
+3
-3
src/observer/table_load/ob_table_load_store_ctx.cpp
src/observer/table_load/ob_table_load_store_ctx.cpp
+15
-15
src/observer/table_load/ob_table_load_store_ctx.h
src/observer/table_load/ob_table_load_store_ctx.h
+3
-3
未找到文件。
src/observer/table_load/ob_table_load_coordinator_ctx.cpp
浏览文件 @
b1da9ed2
...
...
@@ -189,7 +189,7 @@ int ObTableLoadCoordinatorCtx::advance_status(ObTableLoadStatusType status)
ret
=
OB_INVALID_ARGUMENT
;
LOG_WARN
(
"invalid args"
,
KR
(
ret
),
K
(
status
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObWLockGuard
guard
(
rwlock
_
);
if
(
OB_UNLIKELY
(
ObTableLoadStatusType
::
ERROR
==
status_
))
{
ret
=
error_code_
;
LOG_WARN
(
"coordinator has error"
,
KR
(
ret
));
...
...
@@ -220,7 +220,7 @@ int ObTableLoadCoordinatorCtx::set_status_error(int error_code)
ret
=
OB_INVALID_ARGUMENT
;
LOG_WARN
(
"invalid args"
,
KR
(
ret
),
K
(
error_code
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObWLockGuard
guard
(
rwlock
_
);
if
(
OB_UNLIKELY
(
status_
==
ObTableLoadStatusType
::
ABORT
))
{
ret
=
OB_TRANS_KILLED
;
}
else
if
(
status_
!=
ObTableLoadStatusType
::
ERROR
)
{
...
...
@@ -240,7 +240,7 @@ int ObTableLoadCoordinatorCtx::set_status_abort()
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"ObTableLoadCoordinatorCtx not init"
,
KR
(
ret
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObWLockGuard
guard
(
rwlock
_
);
if
(
OB_UNLIKELY
(
status_
!=
ObTableLoadStatusType
::
ABORT
))
{
status_
=
ObTableLoadStatusType
::
ABORT
;
table_load_status_to_string
(
status_
,
ctx_
->
job_stat_
->
coordinator
.
status_
);
...
...
@@ -272,7 +272,7 @@ int ObTableLoadCoordinatorCtx::check_status(ObTableLoadStatusType status) const
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"ObTableLoadCoordinatorCtx not init"
,
KR
(
ret
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObRLockGuard
guard
(
rwlock
_
);
ret
=
check_status_unlock
(
status
);
}
return
ret
;
...
...
@@ -342,7 +342,7 @@ int ObTableLoadCoordinatorCtx::start_trans(const ObTableLoadSegmentID &segment_i
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"ObTableLoadCoordinatorCtx not init"
,
KR
(
ret
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObWLockGuard
guard
(
rwlock
_
);
if
(
OB_FAIL
(
check_status_unlock
(
ObTableLoadStatusType
::
LOADING
)))
{
LOG_WARN
(
"fail to check status"
,
KR
(
ret
),
K_
(
status
));
}
else
{
...
...
@@ -388,7 +388,7 @@ int ObTableLoadCoordinatorCtx::commit_trans(ObTableLoadCoordinatorTrans *trans)
ret
=
OB_INVALID_ARGUMENT
;
LOG_WARN
(
"invalid args"
,
KR
(
ret
),
KP
(
trans
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObWLockGuard
guard
(
rwlock
_
);
const
ObTableLoadSegmentID
&
segment_id
=
trans
->
get_trans_id
().
segment_id_
;
SegmentCtx
*
segment_ctx
=
nullptr
;
if
(
OB_FAIL
(
segment_ctx_map_
.
get
(
segment_id
,
segment_ctx
)))
{
...
...
@@ -424,7 +424,7 @@ int ObTableLoadCoordinatorCtx::abort_trans(ObTableLoadCoordinatorTrans *trans)
ret
=
OB_INVALID_ARGUMENT
;
LOG_WARN
(
"invalid args"
,
KR
(
ret
),
KP
(
trans
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObWLockGuard
guard
(
rwlock
_
);
const
ObTableLoadSegmentID
&
segment_id
=
trans
->
get_trans_id
().
segment_id_
;
SegmentCtx
*
segment_ctx
=
nullptr
;
if
(
OB_FAIL
(
segment_ctx_map_
.
get
(
segment_id
,
segment_ctx
)))
{
...
...
@@ -462,7 +462,7 @@ void ObTableLoadCoordinatorCtx::put_trans(ObTableLoadCoordinatorTrans *trans)
ObTableLoadTransStatusType
trans_status
=
trans_ctx
->
get_trans_status
();
OB_ASSERT
(
ObTableLoadTransStatusType
::
COMMIT
==
trans_status
||
ObTableLoadTransStatusType
::
ABORT
==
trans_status
);
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObWLockGuard
guard
(
rwlock
_
);
if
(
OB_FAIL
(
trans_map_
.
erase_refactored
(
trans
->
get_trans_id
())))
{
LOG_WARN
(
"fail to erase_refactored"
,
KR
(
ret
));
}
else
{
...
...
@@ -485,7 +485,7 @@ int ObTableLoadCoordinatorCtx::get_trans(const ObTableLoadTransId &trans_id,
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"ObTableLoadCoordinatorCtx not init"
,
KR
(
ret
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObRLockGuard
guard
(
rwlock
_
);
if
(
OB_FAIL
(
trans_map_
.
get_refactored
(
trans_id
,
trans
)))
{
if
(
OB_UNLIKELY
(
OB_HASH_NOT_EXIST
!=
ret
))
{
LOG_WARN
(
"fail to get_refactored"
,
KR
(
ret
),
K
(
trans_id
));
...
...
@@ -507,7 +507,7 @@ int ObTableLoadCoordinatorCtx::get_trans_ctx(const ObTableLoadTransId &trans_id,
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"ObTableLoadCoordinatorCtx not init"
,
KR
(
ret
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObRLockGuard
guard
(
rwlock
_
);
if
(
OB_FAIL
(
trans_ctx_map_
.
get_refactored
(
trans_id
,
trans_ctx
)))
{
if
(
OB_UNLIKELY
(
OB_HASH_NOT_EXIST
!=
ret
))
{
LOG_WARN
(
"fail to get trans ctx"
,
KR
(
ret
),
K
(
trans_id
));
...
...
@@ -527,7 +527,7 @@ int ObTableLoadCoordinatorCtx::get_segment_trans_ctx(const ObTableLoadSegmentID
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"ObTableLoadCoordinatorCtx not init"
,
KR
(
ret
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObRLockGuard
guard
(
rwlock
_
);
SegmentCtx
*
segment_ctx
=
nullptr
;
if
(
OB_FAIL
(
segment_ctx_map_
.
get
(
segment_id
,
segment_ctx
)))
{
if
(
OB_UNLIKELY
(
OB_ENTRY_NOT_EXIST
!=
ret
))
{
...
...
@@ -556,7 +556,7 @@ int ObTableLoadCoordinatorCtx::get_active_trans_ids(
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"ObTableLoadCoordinatorCtx not init"
,
KR
(
ret
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObRLockGuard
guard
(
rwlock
_
);
for
(
TransMap
::
const_iterator
trans_iter
=
trans_map_
.
begin
();
OB_SUCC
(
ret
)
&&
trans_iter
!=
trans_map_
.
end
();
++
trans_iter
)
{
if
(
OB_FAIL
(
trans_id_array
.
push_back
(
trans_iter
->
first
)))
{
...
...
@@ -576,7 +576,7 @@ int ObTableLoadCoordinatorCtx::get_committed_trans_ids(
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"ObTableLoadCoordinatorCtx not init"
,
KR
(
ret
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObRLockGuard
guard
(
rwlock
_
);
if
(
OB_FAIL
(
trans_id_array
.
create
(
commited_trans_ctx_array_
.
count
(),
allocator
)))
{
LOG_WARN
(
"fail to create trans id array"
,
KR
(
ret
));
}
else
{
...
...
@@ -596,7 +596,7 @@ int ObTableLoadCoordinatorCtx::check_exist_trans(bool &is_exist) const
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"ObTableLoadCoordinatorCtx not init"
,
KR
(
ret
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObRLockGuard
guard
(
rwlock
_
);
is_exist
=
!
trans_map_
.
empty
();
}
return
ret
;
...
...
@@ -609,7 +609,7 @@ int ObTableLoadCoordinatorCtx::check_exist_committed_trans(bool &is_exist) const
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"ObTableLoadCoordinatorCtx not init"
,
KR
(
ret
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObRLockGuard
guard
(
rwlock
_
);
is_exist
=
!
commited_trans_ctx_array_
.
empty
();
}
return
ret
;
...
...
src/observer/table_load/ob_table_load_coordinator_ctx.h
浏览文件 @
b1da9ed2
...
...
@@ -36,12 +36,12 @@ public:
public:
OB_INLINE
table
::
ObTableLoadStatusType
get_status
()
const
{
lib
::
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObRLockGuard
guard
(
rwlock
_
);
return
status_
;
}
OB_INLINE
int
get_error_code
()
const
{
lib
::
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObRLockGuard
guard
(
rwlock
_
);
return
error_code_
;
}
OB_INLINE
int
set_status_inited
()
...
...
@@ -133,7 +133,7 @@ private:
ObTableLoadObjectAllocator
<
ObTableLoadCoordinatorTrans
>
trans_allocator_
;
// 多线程安全
uint64_t
last_trans_gid_
CACHE_ALIGNED
;
uint64_t
next_session_id_
CACHE_ALIGNED
;
mutable
lib
::
ObMutex
mutex
_
;
mutable
obsys
::
ObRWLock
rwlock
_
;
table
::
ObTableLoadStatusType
status_
;
int
error_code_
;
TransMap
trans_map_
;
...
...
src/observer/table_load/ob_table_load_store_ctx.cpp
浏览文件 @
b1da9ed2
...
...
@@ -300,7 +300,7 @@ int ObTableLoadStoreCtx::advance_status(ObTableLoadStatusType status)
ret
=
OB_INVALID_ARGUMENT
;
LOG_WARN
(
"invalid args"
,
KR
(
ret
),
K
(
status
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObWLockGuard
guard
(
rwlock
_
);
if
(
OB_UNLIKELY
(
ObTableLoadStatusType
::
ERROR
==
status_
))
{
ret
=
error_code_
;
LOG_WARN
(
"store has error"
,
KR
(
ret
));
...
...
@@ -331,7 +331,7 @@ int ObTableLoadStoreCtx::set_status_error(int error_code)
ret
=
OB_INVALID_ARGUMENT
;
LOG_WARN
(
"invalid args"
,
KR
(
ret
),
K
(
error_code
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObWLockGuard
guard
(
rwlock
_
);
if
(
OB_UNLIKELY
(
status_
==
ObTableLoadStatusType
::
ABORT
))
{
ret
=
OB_TRANS_KILLED
;
}
else
if
(
status_
!=
ObTableLoadStatusType
::
ERROR
)
{
...
...
@@ -351,7 +351,7 @@ int ObTableLoadStoreCtx::set_status_abort()
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"ObTableLoadStoreCtx not init"
,
KR
(
ret
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObWLockGuard
guard
(
rwlock
_
);
if
(
OB_UNLIKELY
(
status_
!=
ObTableLoadStatusType
::
ABORT
))
{
status_
=
ObTableLoadStatusType
::
ABORT
;
table_load_status_to_string
(
status_
,
ctx_
->
job_stat_
->
store
.
status_
);
...
...
@@ -383,7 +383,7 @@ int ObTableLoadStoreCtx::check_status(ObTableLoadStatusType status) const
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"ObTableLoadStoreCtx not init"
,
KR
(
ret
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObRLockGuard
guard
(
rwlock
_
);
ret
=
check_status_unlock
(
status
);
}
return
ret
;
...
...
@@ -630,7 +630,7 @@ int ObTableLoadStoreCtx::start_trans(const ObTableLoadTransId &trans_id,
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"ObTableLoadStoreCtx not init"
,
KR
(
ret
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObWLockGuard
guard
(
rwlock
_
);
if
(
OB_FAIL
(
check_status_unlock
(
ObTableLoadStatusType
::
LOADING
)))
{
LOG_WARN
(
"fail to check status"
,
KR
(
ret
),
K_
(
status
));
}
else
{
...
...
@@ -676,7 +676,7 @@ int ObTableLoadStoreCtx::commit_trans(ObTableLoadStoreTrans *trans)
ret
=
OB_INVALID_ARGUMENT
;
LOG_WARN
(
"invalid args"
,
KR
(
ret
),
KP
(
trans
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObWLockGuard
guard
(
rwlock
_
);
const
ObTableLoadSegmentID
&
segment_id
=
trans
->
get_trans_id
().
segment_id_
;
SegmentCtx
*
segment_ctx
=
nullptr
;
ObTableLoadTransStore
*
trans_store
=
nullptr
;
...
...
@@ -721,7 +721,7 @@ int ObTableLoadStoreCtx::abort_trans(ObTableLoadStoreTrans *trans)
ret
=
OB_INVALID_ARGUMENT
;
LOG_WARN
(
"invalid args"
,
KR
(
ret
),
KP
(
trans
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObWLockGuard
guard
(
rwlock
_
);
const
ObTableLoadSegmentID
&
segment_id
=
trans
->
get_trans_id
().
segment_id_
;
SegmentCtx
*
segment_ctx
=
nullptr
;
if
(
OB_FAIL
(
segment_ctx_map_
.
get
(
segment_id
,
segment_ctx
)))
{
...
...
@@ -759,7 +759,7 @@ void ObTableLoadStoreCtx::put_trans(ObTableLoadStoreTrans *trans)
ObTableLoadTransStatusType
trans_status
=
trans_ctx
->
get_trans_status
();
OB_ASSERT
(
ObTableLoadTransStatusType
::
COMMIT
==
trans_status
||
ObTableLoadTransStatusType
::
ABORT
==
trans_status
);
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObWLockGuard
guard
(
rwlock
_
);
if
(
OB_FAIL
(
trans_map_
.
erase_refactored
(
trans
->
get_trans_id
())))
{
LOG_WARN
(
"fail to erase_refactored"
,
KR
(
ret
));
}
else
{
...
...
@@ -782,7 +782,7 @@ int ObTableLoadStoreCtx::get_trans(const ObTableLoadTransId &trans_id,
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"ObTableLoadStoreCtx not init"
,
KR
(
ret
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObRLockGuard
guard
(
rwlock
_
);
if
(
OB_FAIL
(
trans_map_
.
get_refactored
(
trans_id
,
trans
)))
{
if
(
OB_UNLIKELY
(
OB_HASH_NOT_EXIST
!=
ret
))
{
LOG_WARN
(
"fail to get_refactored"
,
KR
(
ret
),
K
(
trans_id
));
...
...
@@ -804,7 +804,7 @@ int ObTableLoadStoreCtx::get_trans_ctx(const ObTableLoadTransId &trans_id,
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"ObTableLoadStoreCtx not init"
,
KR
(
ret
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObRLockGuard
guard
(
rwlock
_
);
if
(
OB_FAIL
(
trans_ctx_map_
.
get_refactored
(
trans_id
,
trans_ctx
)))
{
if
(
OB_UNLIKELY
(
OB_HASH_NOT_EXIST
!=
ret
))
{
LOG_WARN
(
"fail to get trans ctx"
,
KR
(
ret
),
K
(
trans_id
));
...
...
@@ -825,7 +825,7 @@ int ObTableLoadStoreCtx::get_active_trans_ids(
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"ObTableLoadStoreCtx not init"
,
KR
(
ret
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObRLockGuard
guard
(
rwlock
_
);
for
(
TransMap
::
const_iterator
trans_iter
=
trans_map_
.
begin
();
OB_SUCC
(
ret
)
&&
trans_iter
!=
trans_map_
.
end
();
++
trans_iter
)
{
if
(
OB_FAIL
(
trans_id_array
.
push_back
(
trans_iter
->
first
)))
{
...
...
@@ -844,7 +844,7 @@ int ObTableLoadStoreCtx::get_committed_trans_ids(
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"ObTableLoadStoreCtx not init"
,
KR
(
ret
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObRLockGuard
guard
(
rwlock
_
);
if
(
OB_FAIL
(
trans_id_array
.
create
(
committed_trans_store_array_
.
count
(),
allocator
)))
{
LOG_WARN
(
"fail to create trans id array"
,
KR
(
ret
));
}
else
{
...
...
@@ -865,7 +865,7 @@ int ObTableLoadStoreCtx::get_committed_trans_stores(
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"ObTableLoadStoreCtx not init"
,
KR
(
ret
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObRLockGuard
guard
(
rwlock
_
);
if
(
OB_FAIL
(
trans_store_array
.
assign
(
committed_trans_store_array_
)))
{
LOG_WARN
(
"fail to assign trans store array"
,
KR
(
ret
));
}
...
...
@@ -880,7 +880,7 @@ int ObTableLoadStoreCtx::check_exist_trans(bool &exist) const
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"ObTableLoadStoreCtx not init"
,
KR
(
ret
));
}
else
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObRLockGuard
guard
(
rwlock
_
);
exist
=
!
trans_map_
.
empty
();
}
return
ret
;
...
...
@@ -888,7 +888,7 @@ int ObTableLoadStoreCtx::check_exist_trans(bool &exist) const
void
ObTableLoadStoreCtx
::
clear_committed_trans_stores
()
{
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObWLockGuard
guard
(
rwlock
_
);
for
(
int64_t
i
=
0
;
i
<
committed_trans_store_array_
.
count
();
++
i
)
{
ObTableLoadTransStore
*
trans_store
=
committed_trans_store_array_
.
at
(
i
);
ObTableLoadTransCtx
*
trans_ctx
=
trans_store
->
trans_ctx_
;
...
...
src/observer/table_load/ob_table_load_store_ctx.h
浏览文件 @
b1da9ed2
...
...
@@ -49,12 +49,12 @@ public:
public:
OB_INLINE
table
::
ObTableLoadStatusType
get_status
()
const
{
lib
::
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObRLockGuard
guard
(
rwlock
_
);
return
status_
;
}
OB_INLINE
int
get_error_code
()
const
{
lib
::
ObMutexGuard
guard
(
mutex
_
);
obsys
::
ObRLockGuard
guard
(
rwlock
_
);
return
error_code_
;
}
OB_INLINE
int
set_status_inited
()
...
...
@@ -153,7 +153,7 @@ private:
typedef
common
::
ObLinkHashMap
<
table
::
ObTableLoadSegmentID
,
SegmentCtx
>
SegmentCtxMap
;
private:
ObTableLoadObjectAllocator
<
ObTableLoadStoreTrans
>
trans_allocator_
;
// 多线程安全
mutable
lib
::
ObMutex
mutex
_
;
mutable
obsys
::
ObRWLock
rwlock
_
;
common
::
ObArenaAllocator
allocator_
;
table
::
ObTableLoadStatusType
status_
;
int
error_code_
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录