Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
c76e218d
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看板
未验证
提交
c76e218d
编写于
8月 11, 2022
作者:
dengyihao
提交者:
GitHub
8月 11, 2022
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #15992 from taosdata/fix/rpcDeadlock
fix client deadlock
上级
4da32e80
1c200b41
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
32 addition
and
23 deletion
+32
-23
source/libs/transport/src/transCli.c
source/libs/transport/src/transCli.c
+32
-23
未找到文件。
source/libs/transport/src/transCli.c
浏览文件 @
c76e218d
...
...
@@ -211,27 +211,27 @@ static void cliReleaseUnfinishedMsg(SCliConn* conn) {
#define CONN_PERSIST_TIME(para) ((para) <= 90000 ? 90000 : (para))
#define CONN_GET_HOST_THREAD(conn) (conn ? ((SCliConn*)conn)->hostThrd : NULL)
#define CONN_GET_INST_LABEL(conn) (((STrans*)(((SCliThrd*)(conn)->hostThrd)->pTransInst))->label)
#define CONN_SHOULD_RELEASE(conn, head) \
do { \
if ((head)->release == 1 && (head->msgLen) == sizeof(*head)) { \
uint64_t ahandle = head->ahandle; \
CONN_GET_MSGCTX_BY_AHANDLE(conn, ahandle); \
transClearBuffer(&conn->readBuf); \
transFreeMsg(transContFromHead((char*)head)); \
if (transQueueSize(&conn->cliMsgs) > 0 && ahandle == 0) { \
SCliMsg* cliMsg = transQueueGet(&conn->cliMsgs, 0); \
if (cliMsg->type == Release) return; \
} \
tDebug("%s conn %p receive release request, ref
:%d", CONN_GET_INST_LABEL(conn), conn, T_REF_VAL_GET(conn)
); \
if (T_REF_VAL_GET(conn) > 1) { \
transUnrefCliHandle(conn); \
} \
destroyCmsg(pMsg); \
cliReleaseUnfinishedMsg(conn); \
transQueueClear(&conn->cliMsgs); \
addConnToPool(((SCliThrd*)conn->hostThrd)->pool, conn); \
return; \
} \
#define CONN_SHOULD_RELEASE(conn, head)
\
do {
\
if ((head)->release == 1 && (head->msgLen) == sizeof(*head)) {
\
uint64_t ahandle = head->ahandle;
\
CONN_GET_MSGCTX_BY_AHANDLE(conn, ahandle);
\
transClearBuffer(&conn->readBuf);
\
transFreeMsg(transContFromHead((char*)head));
\
if (transQueueSize(&conn->cliMsgs) > 0 && ahandle == 0) {
\
SCliMsg* cliMsg = transQueueGet(&conn->cliMsgs, 0);
\
if (cliMsg->type == Release) return;
\
}
\
tDebug("%s conn %p receive release request, ref
Id:%" PRId64 "", CONN_GET_INST_LABEL(conn), conn, conn->refId
); \
if (T_REF_VAL_GET(conn) > 1) {
\
transUnrefCliHandle(conn);
\
}
\
destroyCmsg(pMsg);
\
cliReleaseUnfinishedMsg(conn);
\
transQueueClear(&conn->cliMsgs);
\
addConnToPool(((SCliThrd*)conn->hostThrd)->pool, conn);
\
return;
\
}
\
} while (0)
#define CONN_GET_MSGCTX_BY_AHANDLE(conn, ahandle) \
...
...
@@ -890,8 +890,8 @@ SCliConn* cliGetConn(SCliMsg* pMsg, SCliThrd* pThrd, bool* ignore) {
if
(
refId
!=
0
)
{
SExHandle
*
exh
=
transAcquireExHandle
(
transGetRefMgt
(),
refId
);
if
(
exh
==
NULL
)
{
tError
(
"failed to get conn, refId: %"
PRId64
""
,
refId
);
*
ignore
=
true
;
destroyCmsg
(
pMsg
);
return
NULL
;
}
else
{
conn
=
exh
->
handle
;
...
...
@@ -937,7 +937,16 @@ void cliHandleReq(SCliMsg* pMsg, SCliThrd* pThrd) {
bool
ignore
=
false
;
SCliConn
*
conn
=
cliGetConn
(
pMsg
,
pThrd
,
&
ignore
);
if
(
ignore
==
true
)
{
tError
(
"ignore msg"
);
// persist conn already release by server
STransMsg
resp
=
{
0
};
resp
.
code
=
TSDB_CODE_RPC_BROKEN_LINK
;
resp
.
msgType
=
pMsg
->
msg
.
msgType
+
1
;
resp
.
info
.
ahandle
=
pMsg
&&
pMsg
->
ctx
?
pMsg
->
ctx
->
ahandle
:
NULL
;
resp
.
info
.
traceId
=
pMsg
->
msg
.
info
.
traceId
;
pTransInst
->
cfp
(
pTransInst
->
parent
,
&
resp
,
NULL
);
destroyCmsg
(
pMsg
);
return
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录