From 931474ff6e220c91fad2065abe2b975fc9d9b28e Mon Sep 17 00:00:00 2001 From: Jeff Tao Date: Sun, 22 Mar 2020 08:45:14 +0800 Subject: [PATCH] fix the deadlock bug for rpcCloseConn --- src/rpc/src/rpcMain.c | 50 +++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/rpc/src/rpcMain.c b/src/rpc/src/rpcMain.c index d62d0651fc..c6f527a7d2 100755 --- a/src/rpc/src/rpcMain.c +++ b/src/rpc/src/rpcMain.c @@ -287,7 +287,7 @@ void rpcClose(void *param) { (*taosCleanUpConn[pRpc->connType])(pRpc->udphandle); for (int i = 0; i < pRpc->sessions; ++i) { - if (pRpc->connList[i].user[0]) { + if (pRpc->connList && pRpc->connList[i].user[0]) { rpcCloseConn((void *)(pRpc->connList + i)); } } @@ -495,35 +495,35 @@ static void rpcCloseConn(void *thandle) { SRpcConn *pConn = (SRpcConn *)thandle; SRpcInfo *pRpc = pConn->pRpc; - rpcLockConn(pConn); + if (pConn->user[0] == 0) return; - if (pConn->user[0]) { - pConn->user[0] = 0; - if (taosCloseConn[pConn->connType]) (*taosCloseConn[pConn->connType])(pConn->chandle); - - taosTmrStopA(&pConn->pTimer); - taosTmrStopA(&pConn->pIdleTimer); - - if ( pRpc->connType == TAOS_CONN_SERVER) { - char hashstr[40] = {0}; - sprintf(hashstr, "%x:%x:%x:%d", pConn->peerIp, pConn->linkUid, pConn->peerId, pConn->connType); - taosDeleteStrHash(pRpc->hash, hashstr); - rpcFreeMsg(pConn->pRspMsg); // it may have a response msg saved, but not request msg - pConn->pRspMsg = NULL; - pConn->inType = 0; - pConn->inTranId = 0; - } else { - pConn->outType = 0; - pConn->outTranId = 0; - pConn->pReqMsg = NULL; - } + rpcLockConn(pConn); - taosFreeId(pRpc->idPool, pConn->sid); - pConn->pContext = NULL; + pConn->user[0] = 0; + if (taosCloseConn[pConn->connType]) (*taosCloseConn[pConn->connType])(pConn->chandle); - tTrace("%s %p, rpc connection is closed", pRpc->label, pConn); + taosTmrStopA(&pConn->pTimer); + taosTmrStopA(&pConn->pIdleTimer); + + if ( pRpc->connType == TAOS_CONN_SERVER) { + char hashstr[40] = {0}; + sprintf(hashstr, "%x:%x:%x:%d", pConn->peerIp, pConn->linkUid, pConn->peerId, pConn->connType); + taosDeleteStrHash(pRpc->hash, hashstr); + rpcFreeMsg(pConn->pRspMsg); // it may have a response msg saved, but not request msg + pConn->pRspMsg = NULL; + pConn->inType = 0; + pConn->inTranId = 0; + } else { + pConn->outType = 0; + pConn->outTranId = 0; + pConn->pReqMsg = NULL; } + taosFreeId(pRpc->idPool, pConn->sid); + pConn->pContext = NULL; + + tTrace("%s %p, rpc connection is closed", pRpc->label, pConn); + rpcUnlockConn(pConn); } -- GitLab