Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
天地威能
oceanbase
提交
e737da97
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 搜索 >>
提交
e737da97
编写于
11月 25, 2022
作者:
O
obdev
提交者:
wangzelin.wzl
11月 25, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[CP] [CP] fix ObTenantConfig dead lock
上级
38b30d15
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
19 addition
and
22 deletion
+19
-22
src/observer/omt/ob_tenant_config.cpp
src/observer/omt/ob_tenant_config.cpp
+17
-18
src/observer/omt/ob_tenant_config.h
src/observer/omt/ob_tenant_config.h
+1
-3
src/observer/omt/ob_tenant_config_mgr.cpp
src/observer/omt/ob_tenant_config_mgr.cpp
+1
-1
未找到文件。
src/observer/omt/ob_tenant_config.cpp
浏览文件 @
e737da97
...
...
@@ -37,7 +37,7 @@ ObTenantConfig::ObTenantConfig(uint64_t tenant_id)
:
tenant_id_
(
tenant_id
),
current_version_
(
1
),
mutex_
(),
update_task_
(),
system_config_
(),
config_mgr_
(
nullptr
),
lock_
(
ObLatchIds
::
CONFIG_LOCK
),
is_deleting_
(
false
)
lock_
(),
is_deleting_
(
false
)
{
}
...
...
@@ -55,7 +55,7 @@ int ObTenantConfig::init(ObTenantConfigMgr *config_mgr)
void
ObTenantConfig
::
print
()
const
{
DRWLock
::
RDLockGuard
guard
(
lock_
);
ObLatchRGuard
rd_guard
(
const_cast
<
ObLatch
&>
(
lock_
),
ObLatchIds
::
CONFIG_LOCK
);
OB_LOG
(
INFO
,
"===================== * begin tenant config report * ====================="
,
K
(
tenant_id_
));
ObConfigContainer
::
const_iterator
it
=
container_
.
begin
();
for
(;
it
!=
container_
.
end
();
++
it
)
{
...
...
@@ -71,7 +71,7 @@ void ObTenantConfig::print() const
int
ObTenantConfig
::
check_all
()
const
{
int
ret
=
OB_SUCCESS
;
DRWLock
::
RDLockGuard
guard
(
lock_
);
ObLatchRGuard
rd_guard
(
const_cast
<
ObLatch
&>
(
lock_
),
ObLatchIds
::
CONFIG_LOCK
);
ObConfigContainer
::
const_iterator
it
=
container_
.
begin
();
for
(;
OB_SUCC
(
ret
)
&&
it
!=
container_
.
end
();
++
it
)
{
if
(
OB_ISNULL
(
it
->
second
))
{
...
...
@@ -90,32 +90,31 @@ int ObTenantConfig::check_all() const
int
ObTenantConfig
::
rdlock
()
{
return
lock_
.
rdlock
()
==
OB_SUCCESS
?
OB_SUCCESS
:
OB_EAGAIN
;
return
lock_
.
rdlock
(
ObLatchIds
::
CONFIG_LOCK
)
==
OB_SUCCESS
?
OB_SUCCESS
:
OB_EAGAIN
;
}
int
ObTenantConfig
::
wrlock
()
{
return
lock_
.
wrlock
()
==
OB_SUCCESS
?
OB_SUCCESS
:
OB_EAGAIN
;
return
lock_
.
wrlock
(
ObLatchIds
::
CONFIG_LOCK
)
==
OB_SUCCESS
?
OB_SUCCESS
:
OB_EAGAIN
;
}
int
ObTenantConfig
::
try_rdlock
()
{
return
lock_
.
try_rdlock
()
==
OB_SUCCESS
?
OB_SUCCESS
:
OB_EAGAIN
;
return
lock_
.
try_rdlock
(
ObLatchIds
::
CONFIG_LOCK
)
==
OB_SUCCESS
?
OB_SUCCESS
:
OB_EAGAIN
;
}
int
ObTenantConfig
::
try_wrlock
()
{
return
lock_
.
try_wrlock
()
==
OB_SUCCESS
?
OB_SUCCESS
:
OB_EAGAIN
;
return
lock_
.
try_wrlock
(
ObLatchIds
::
CONFIG_LOCK
)
==
OB_SUCCESS
?
OB_SUCCESS
:
OB_EAGAIN
;
}
int
ObTenantConfig
::
unlock
()
{
return
lock_
.
rdunlock
()
==
OB_SUCCESS
?
OB_SUCCESS
:
OB_EAGAIN
;
}
int
ObTenantConfig
::
wrunlock
()
{
return
lock_
.
wrunlock
()
==
OB_SUCCESS
?
OB_SUCCESS
:
OB_EAGAIN
;
return
lock_
.
unlock
()
==
OB_SUCCESS
?
OB_SUCCESS
:
OB_EAGAIN
;
}
int
ObTenantConfig
::
read_config
()
...
...
@@ -125,7 +124,7 @@ int ObTenantConfig::read_config()
ObAddr
server
;
char
local_ip
[
OB_MAX_SERVER_ADDR_SIZE
]
=
""
;
DRWLock
::
RDLockGuard
lguard
(
ObConfigManager
::
get_serialize_lock
());
DRWLock
::
WRLockGuard
guard
(
lock_
);
ObLatchWGuard
wr_guard
(
lock_
,
ObLatchIds
::
CONFIG_LOCK
);
server
=
GCTX
.
self_addr
();
if
(
OB_UNLIKELY
(
true
!=
server
.
ip_to_string
(
local_ip
,
sizeof
(
local_ip
))))
{
ret
=
OB_CONVERT_ERROR
;
...
...
@@ -366,7 +365,7 @@ int ObTenantConfig::add_extra_config(char *config_str,
char
*
saveptr
=
NULL
;
char
*
token
=
NULL
;
DRWLock
::
RDLockGuard
lguard
(
ObConfigManager
::
get_serialize_lock
());
DRWLock
::
WRLockGuard
guard
(
lock_
);
ObLatchWGuard
wr_guard
(
lock_
,
ObLatchIds
::
CONFIG_LOCK
);
token
=
STRTOK_R
(
config_str
,
",
\n
"
,
&
saveptr
);
while
(
OB_SUCC
(
ret
)
&&
OB_LIKELY
(
NULL
!=
token
))
{
char
*
saveptr_one
=
NULL
;
...
...
@@ -424,7 +423,7 @@ OB_DEF_SERIALIZE(ObTenantConfig)
int
ret
=
OB_SUCCESS
;
int64_t
expect_data_len
=
get_serialize_size_
();
int64_t
saved_pos
=
pos
;
DRWLock
::
RDLockGuard
guard
(
lock_
);
ObLatchRGuard
rd_guard
(
const_cast
<
ObLatch
&>
(
lock_
),
ObLatchIds
::
CONFIG_LOCK
);
if
(
OB_FAIL
(
databuff_printf
(
buf
,
buf_len
,
pos
,
"[%lu]
\n
"
,
tenant_id_
)))
{
}
else
{
ret
=
ObCommonConfig
::
serialize
(
buf
,
buf_len
,
pos
);
...
...
@@ -442,7 +441,7 @@ OB_DEF_SERIALIZE(ObTenantConfig)
OB_DEF_DESERIALIZE
(
ObTenantConfig
)
{
int
ret
=
OB_SUCCESS
;
DRWLock
::
WRLockGuard
guard
(
lock_
);
ObLatchWGuard
wr_guard
(
lock_
,
ObLatchIds
::
CONFIG_LOCK
);
if
(
'['
!=
*
(
buf
+
pos
))
{
ret
=
OB_INVALID_DATA
;
LOG_ERROR
(
"invalid tenant config"
,
K
(
ret
));
...
...
@@ -485,7 +484,7 @@ OB_DEF_SERIALIZE_SIZE(ObTenantConfig)
int64_t
len
=
0
,
tmp_pos
=
0
;
int
ret
=
OB_SUCCESS
;
char
tenant_str
[
100
]
=
{
'\0'
};
DRWLock
::
RDLockGuard
guard
(
lock_
);
ObLatchRGuard
rd_guard
(
const_cast
<
ObLatch
&>
(
lock_
),
ObLatchIds
::
CONFIG_LOCK
);
if
(
OB_FAIL
(
databuff_printf
(
tenant_str
,
100
,
tmp_pos
,
"[%lu]
\n
"
,
tenant_id_
)))
{
LOG_WARN
(
"write data buff failed"
,
K
(
ret
));
}
else
{
...
...
src/observer/omt/ob_tenant_config.h
浏览文件 @
e737da97
...
...
@@ -17,7 +17,6 @@
#include "share/config/ob_system_config.h"
#include "share/config/ob_common_config.h"
#include "share/config/ob_config_helper.h"
#include "lib/lock/ob_drw_lock.h"
namespace
oceanbase
{
...
...
@@ -80,7 +79,6 @@ public:
int
try_rdlock
();
int
try_wrlock
();
int
unlock
();
int
wrunlock
();
int
read_config
();
uint64_t
get_tenant_id
()
const
{
return
tenant_id_
;
}
...
...
@@ -102,7 +100,7 @@ private:
common
::
ObSystemConfig
system_config_
;
ObTenantConfigMgr
*
config_mgr_
;
// protect this object from being deleted in OTC_MGR.del_tenant_config
mutable
common
::
DRWLock
lock_
;
common
::
ObLatch
lock_
;
bool
is_deleting_
;
public:
...
...
src/observer/omt/ob_tenant_config_mgr.cpp
浏览文件 @
e737da97
...
...
@@ -314,7 +314,7 @@ int ObTenantConfigMgr::del_tenant_config(uint64_t tenant_id)
LOG_INFO
(
"tenant config deleted"
,
K
(
tenant_id
),
K
(
ret
));
}
if
(
OB_FAIL
(
ret
))
{
config
->
wr
unlock
();
config
->
unlock
();
}
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录