Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
d50f36ba
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
d50f36ba
编写于
8月 12, 2022
作者:
S
Shengliang Guan
提交者:
GitHub
8月 12, 2022
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #16061 from taosdata/fix/mnode
fix: deadlock of mnode if its state changed
上级
4f15fc19
90a0de85
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
33 addition
and
18 deletion
+33
-18
source/dnode/mnode/impl/src/mndMnode.c
source/dnode/mnode/impl/src/mndMnode.c
+2
-0
source/dnode/mnode/impl/src/mndSync.c
source/dnode/mnode/impl/src/mndSync.c
+23
-18
source/dnode/vnode/src/vnd/vnodeSync.c
source/dnode/vnode/src/vnd/vnodeSync.c
+8
-0
未找到文件。
source/dnode/mnode/impl/src/mndMnode.c
浏览文件 @
d50f36ba
...
@@ -742,7 +742,9 @@ static int32_t mndProcessAlterMnodeReq(SRpcMsg *pReq) {
...
@@ -742,7 +742,9 @@ static int32_t mndProcessAlterMnodeReq(SRpcMsg *pReq) {
return
code
;
return
code
;
}
else
{
}
else
{
pMgmt
->
errCode
=
0
;
pMgmt
->
errCode
=
0
;
taosWLockLatch
(
&
pMgmt
->
lock
);
pMgmt
->
transId
=
-
1
;
pMgmt
->
transId
=
-
1
;
taosWUnLockLatch
(
&
pMgmt
->
lock
);
tsem_wait
(
&
pMgmt
->
syncSem
);
tsem_wait
(
&
pMgmt
->
syncSem
);
mInfo
(
"alter mnode sync result:0x%x %s"
,
pMgmt
->
errCode
,
tstrerror
(
pMgmt
->
errCode
));
mInfo
(
"alter mnode sync result:0x%x %s"
,
pMgmt
->
errCode
,
tstrerror
(
pMgmt
->
errCode
));
terrno
=
pMgmt
->
errCode
;
terrno
=
pMgmt
->
errCode
;
...
...
source/dnode/mnode/impl/src/mndSync.c
浏览文件 @
d50f36ba
...
@@ -60,22 +60,24 @@ void mndSyncCommitMsg(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta cbM
...
@@ -60,22 +60,24 @@ void mndSyncCommitMsg(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta cbM
sdbSetApplyInfo
(
pMnode
->
pSdb
,
cbMeta
.
index
,
cbMeta
.
term
,
cbMeta
.
lastConfigIndex
);
sdbSetApplyInfo
(
pMnode
->
pSdb
,
cbMeta
.
index
,
cbMeta
.
term
,
cbMeta
.
lastConfigIndex
);
}
}
taos
R
LockLatch
(
&
pMgmt
->
lock
);
taos
W
LockLatch
(
&
pMgmt
->
lock
);
if
(
transId
<=
0
)
{
if
(
transId
<=
0
)
{
taos
R
UnLockLatch
(
&
pMgmt
->
lock
);
taos
W
UnLockLatch
(
&
pMgmt
->
lock
);
mError
(
"trans:%d, invalid commit msg"
,
transId
);
mError
(
"trans:%d, invalid commit msg"
,
transId
);
}
else
if
(
transId
==
pMgmt
->
transId
)
{
}
else
if
(
transId
==
pMgmt
->
transId
)
{
taosRUnLockLatch
(
&
pMgmt
->
lock
);
if
(
pMgmt
->
errCode
!=
0
)
{
if
(
pMgmt
->
errCode
!=
0
)
{
mError
(
"trans:%d, failed to propose since %s"
,
transId
,
tstrerror
(
pMgmt
->
errCode
));
mError
(
"trans:%d, failed to propose since %s, post sem"
,
transId
,
tstrerror
(
pMgmt
->
errCode
));
}
else
{
mInfo
(
"trans:%d, is proposed and post sem"
,
transId
,
tstrerror
(
pMgmt
->
errCode
));
}
}
pMgmt
->
transId
=
0
;
pMgmt
->
transId
=
0
;
taosWUnLockLatch
(
&
pMgmt
->
lock
);
tsem_post
(
&
pMgmt
->
syncSem
);
tsem_post
(
&
pMgmt
->
syncSem
);
}
else
{
}
else
{
taos
R
UnLockLatch
(
&
pMgmt
->
lock
);
taos
W
UnLockLatch
(
&
pMgmt
->
lock
);
STrans
*
pTrans
=
mndAcquireTrans
(
pMnode
,
transId
);
STrans
*
pTrans
=
mndAcquireTrans
(
pMnode
,
transId
);
if
(
pTrans
!=
NULL
)
{
if
(
pTrans
!=
NULL
)
{
m
Debug
(
"trans:%d, execute in mnode which not leader"
,
transId
);
m
Info
(
"trans:%d, execute in mnode which not leader"
,
transId
);
mndTransExecute
(
pMnode
,
pTrans
);
mndTransExecute
(
pMnode
,
pTrans
);
mndReleaseTrans
(
pMnode
,
pTrans
);
mndReleaseTrans
(
pMnode
,
pTrans
);
// sdbWriteFile(pMnode->pSdb, SDB_WRITE_DELTA);
// sdbWriteFile(pMnode->pSdb, SDB_WRITE_DELTA);
...
@@ -122,7 +124,10 @@ void mndReConfig(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SReConfigCbMeta cbM
...
@@ -122,7 +124,10 @@ void mndReConfig(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SReConfigCbMeta cbM
taosWLockLatch
(
&
pMgmt
->
lock
);
taosWLockLatch
(
&
pMgmt
->
lock
);
if
(
pMgmt
->
transId
==
-
1
)
{
if
(
pMgmt
->
transId
==
-
1
)
{
if
(
pMgmt
->
errCode
!=
0
)
{
if
(
pMgmt
->
errCode
!=
0
)
{
mError
(
"trans:-1, failed to propose sync reconfig since %s"
,
tstrerror
(
pMgmt
->
errCode
));
mError
(
"trans:-1, failed to propose sync reconfig since %s, post sem"
,
tstrerror
(
pMgmt
->
errCode
));
}
else
{
mInfo
(
"trans:-1, sync reconfig is proposed, saved:%d code:0x%x, index:%"
PRId64
" term:%"
PRId64
" post sem"
,
pMgmt
->
transId
,
cbMeta
.
code
,
cbMeta
.
index
,
cbMeta
.
term
);
}
}
pMgmt
->
transId
=
0
;
pMgmt
->
transId
=
0
;
tsem_post
(
&
pMgmt
->
syncSem
);
tsem_post
(
&
pMgmt
->
syncSem
);
...
@@ -174,7 +179,7 @@ void mndLeaderTransfer(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta cb
...
@@ -174,7 +179,7 @@ void mndLeaderTransfer(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta cb
static
void
mndBecomeFollower
(
struct
SSyncFSM
*
pFsm
)
{
static
void
mndBecomeFollower
(
struct
SSyncFSM
*
pFsm
)
{
SMnode
*
pMnode
=
pFsm
->
data
;
SMnode
*
pMnode
=
pFsm
->
data
;
mDebug
(
"vgId:1, become follower"
);
mDebug
(
"vgId:1, become follower
and post sem
"
);
taosWLockLatch
(
&
pMnode
->
syncMgmt
.
lock
);
taosWLockLatch
(
&
pMnode
->
syncMgmt
.
lock
);
if
(
pMnode
->
syncMgmt
.
transId
!=
0
)
{
if
(
pMnode
->
syncMgmt
.
transId
!=
0
)
{
...
@@ -187,13 +192,6 @@ static void mndBecomeFollower(struct SSyncFSM *pFsm) {
...
@@ -187,13 +192,6 @@ static void mndBecomeFollower(struct SSyncFSM *pFsm) {
static
void
mndBecomeLeader
(
struct
SSyncFSM
*
pFsm
)
{
static
void
mndBecomeLeader
(
struct
SSyncFSM
*
pFsm
)
{
mDebug
(
"vgId:1, become leader"
);
mDebug
(
"vgId:1, become leader"
);
SMnode
*
pMnode
=
pFsm
->
data
;
SMnode
*
pMnode
=
pFsm
->
data
;
taosWLockLatch
(
&
pMnode
->
syncMgmt
.
lock
);
if
(
pMnode
->
syncMgmt
.
transId
!=
0
)
{
pMnode
->
syncMgmt
.
transId
=
0
;
tsem_post
(
&
pMnode
->
syncMgmt
.
syncSem
);
}
taosWUnLockLatch
(
&
pMnode
->
syncMgmt
.
lock
);
}
}
SSyncFSM
*
mndSyncMakeFsm
(
SMnode
*
pMnode
)
{
SSyncFSM
*
mndSyncMakeFsm
(
SMnode
*
pMnode
)
{
...
@@ -279,9 +277,16 @@ int32_t mndSyncPropose(SMnode *pMnode, SSdbRaw *pRaw, int32_t transId) {
...
@@ -279,9 +277,16 @@ int32_t mndSyncPropose(SMnode *pMnode, SSdbRaw *pRaw, int32_t transId) {
pMgmt
->
errCode
=
0
;
pMgmt
->
errCode
=
0
;
taosWLockLatch
(
&
pMgmt
->
lock
);
taosWLockLatch
(
&
pMgmt
->
lock
);
pMgmt
->
transId
=
transId
;
if
(
pMgmt
->
transId
!=
0
)
{
taosWUnLockLatch
(
&
pMgmt
->
lock
);
mError
(
"trans:%d, can't be proposed since trans:%s alrady waiting for confirm"
,
transId
,
pMgmt
->
transId
);
mTrace
(
"trans:%d, will be proposed"
,
pMgmt
->
transId
);
taosWUnLockLatch
(
&
pMgmt
->
lock
);
terrno
=
TSDB_CODE_APP_NOT_READY
;
return
-
1
;
}
else
{
pMgmt
->
transId
=
transId
;
mDebug
(
"trans:%d, will be proposed"
,
pMgmt
->
transId
);
taosWUnLockLatch
(
&
pMgmt
->
lock
);
}
const
bool
isWeak
=
false
;
const
bool
isWeak
=
false
;
int32_t
code
=
syncPropose
(
pMgmt
->
sync
,
&
req
,
isWeak
);
int32_t
code
=
syncPropose
(
pMgmt
->
sync
,
&
req
,
isWeak
);
...
...
source/dnode/vnode/src/vnd/vnodeSync.c
浏览文件 @
d50f36ba
...
@@ -688,6 +688,7 @@ static void vnodeBecomeFollower(struct SSyncFSM *pFsm) {
...
@@ -688,6 +688,7 @@ static void vnodeBecomeFollower(struct SSyncFSM *pFsm) {
taosThreadMutexLock
(
&
pVnode
->
lock
);
taosThreadMutexLock
(
&
pVnode
->
lock
);
if
(
pVnode
->
blocked
)
{
if
(
pVnode
->
blocked
)
{
pVnode
->
blocked
=
false
;
pVnode
->
blocked
=
false
;
vDebug
(
"vgId:%d, become follower and post block"
,
pVnode
->
config
.
vgId
);
tsem_post
(
&
pVnode
->
syncSem
);
tsem_post
(
&
pVnode
->
syncSem
);
}
}
taosThreadMutexUnlock
(
&
pVnode
->
lock
);
taosThreadMutexUnlock
(
&
pVnode
->
lock
);
...
@@ -696,6 +697,13 @@ static void vnodeBecomeFollower(struct SSyncFSM *pFsm) {
...
@@ -696,6 +697,13 @@ static void vnodeBecomeFollower(struct SSyncFSM *pFsm) {
static
void
vnodeBecomeLeader
(
struct
SSyncFSM
*
pFsm
)
{
static
void
vnodeBecomeLeader
(
struct
SSyncFSM
*
pFsm
)
{
SVnode
*
pVnode
=
pFsm
->
data
;
SVnode
*
pVnode
=
pFsm
->
data
;
vDebug
(
"vgId:%d, become leader"
,
pVnode
->
config
.
vgId
);
vDebug
(
"vgId:%d, become leader"
,
pVnode
->
config
.
vgId
);
// taosThreadMutexLock(&pVnode->lock);
// if (pVnode->blocked) {
// pVnode->blocked = false;
// tsem_post(&pVnode->syncSem);
// }
// taosThreadMutexUnlock(&pVnode->lock);
}
}
static
SSyncFSM
*
vnodeSyncMakeFsm
(
SVnode
*
pVnode
)
{
static
SSyncFSM
*
vnodeSyncMakeFsm
(
SVnode
*
pVnode
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录