Merge pull request #19023 from taosdata/fix/TD-21186
fix: avoid double-free in usedb req while db in creating state
This commit is contained in:
commit
b11e8002cb
|
@ -174,6 +174,7 @@ typedef struct {
|
||||||
void* param;
|
void* param;
|
||||||
char opername[TSDB_TRANS_OPER_LEN];
|
char opername[TSDB_TRANS_OPER_LEN];
|
||||||
SArray* pRpcArray;
|
SArray* pRpcArray;
|
||||||
|
SRWLatch lockRpcArray;
|
||||||
} STrans;
|
} STrans;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -628,6 +628,7 @@ STrans *mndTransCreate(SMnode *pMnode, ETrnPolicy policy, ETrnConflct conflict,
|
||||||
pTrans->undoActions = taosArrayInit(TRANS_ARRAY_SIZE, sizeof(STransAction));
|
pTrans->undoActions = taosArrayInit(TRANS_ARRAY_SIZE, sizeof(STransAction));
|
||||||
pTrans->commitActions = taosArrayInit(TRANS_ARRAY_SIZE, sizeof(STransAction));
|
pTrans->commitActions = taosArrayInit(TRANS_ARRAY_SIZE, sizeof(STransAction));
|
||||||
pTrans->pRpcArray = taosArrayInit(1, sizeof(SRpcHandleInfo));
|
pTrans->pRpcArray = taosArrayInit(1, sizeof(SRpcHandleInfo));
|
||||||
|
taosInitRWLatch(&pTrans->lockRpcArray);
|
||||||
|
|
||||||
if (pTrans->redoActions == NULL || pTrans->undoActions == NULL || pTrans->commitActions == NULL ||
|
if (pTrans->redoActions == NULL || pTrans->undoActions == NULL || pTrans->commitActions == NULL ||
|
||||||
pTrans->pRpcArray == NULL) {
|
pTrans->pRpcArray == NULL) {
|
||||||
|
@ -737,12 +738,14 @@ int32_t mndSetRpcInfoForDbTrans(SMnode *pMnode, SRpcMsg *pMsg, EOperType oper, c
|
||||||
if (pTrans->oper == oper) {
|
if (pTrans->oper == oper) {
|
||||||
if (strcasecmp(dbname, pTrans->dbname) == 0) {
|
if (strcasecmp(dbname, pTrans->dbname) == 0) {
|
||||||
mInfo("trans:%d, db:%s oper:%d matched with input", pTrans->id, dbname, oper);
|
mInfo("trans:%d, db:%s oper:%d matched with input", pTrans->id, dbname, oper);
|
||||||
|
taosWLockLatch(&pTrans->lockRpcArray);
|
||||||
if (pTrans->pRpcArray == NULL) {
|
if (pTrans->pRpcArray == NULL) {
|
||||||
pTrans->pRpcArray = taosArrayInit(1, sizeof(SRpcHandleInfo));
|
pTrans->pRpcArray = taosArrayInit(4, sizeof(SRpcHandleInfo));
|
||||||
}
|
}
|
||||||
if (pTrans->pRpcArray != NULL && taosArrayPush(pTrans->pRpcArray, &pMsg->info) != NULL) {
|
if (pTrans->pRpcArray != NULL && taosArrayPush(pTrans->pRpcArray, &pMsg->info) != NULL) {
|
||||||
code = 0;
|
code = 0;
|
||||||
}
|
}
|
||||||
|
taosWUnLockLatch(&pTrans->lockRpcArray);
|
||||||
|
|
||||||
sdbRelease(pMnode->pSdb, pTrans);
|
sdbRelease(pMnode->pSdb, pTrans);
|
||||||
break;
|
break;
|
||||||
|
@ -944,8 +947,12 @@ static void mndTransSendRpcRsp(SMnode *pMnode, STrans *pTrans) {
|
||||||
pTrans->failedTimes, code);
|
pTrans->failedTimes, code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
taosWLockLatch(&pTrans->lockRpcArray);
|
||||||
int32_t size = taosArrayGetSize(pTrans->pRpcArray);
|
int32_t size = taosArrayGetSize(pTrans->pRpcArray);
|
||||||
if (size <= 0) return;
|
if (size <= 0) {
|
||||||
|
taosWUnLockLatch(&pTrans->lockRpcArray);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < size; ++i) {
|
for (int32_t i = 0; i < size; ++i) {
|
||||||
SRpcHandleInfo *pInfo = taosArrayGet(pTrans->pRpcArray, i);
|
SRpcHandleInfo *pInfo = taosArrayGet(pTrans->pRpcArray, i);
|
||||||
|
@ -997,6 +1004,7 @@ static void mndTransSendRpcRsp(SMnode *pMnode, STrans *pTrans) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
taosArrayClear(pTrans->pRpcArray);
|
taosArrayClear(pTrans->pRpcArray);
|
||||||
|
taosWUnLockLatch(&pTrans->lockRpcArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t mndTransProcessRsp(SRpcMsg *pRsp) {
|
int32_t mndTransProcessRsp(SRpcMsg *pRsp) {
|
||||||
|
|
Loading…
Reference in New Issue