From 4d857b01498ca29aefa5c4aeee3c68d32db8069d Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Mon, 25 Nov 2024 15:22:53 +0800 Subject: [PATCH] fix mem leak --- include/common/tmsg.h | 1 - include/libs/nodes/cmdnodes.h | 12 ---------- source/common/src/tmsg.c | 2 +- source/dnode/vnode/src/meta/metaTable.c | 4 ++-- source/dnode/vnode/src/vnd/vnodeSvr.c | 14 +++++++----- source/libs/nodes/src/nodesUtilFuncs.c | 19 ++++++++-------- source/libs/parser/inc/sql.y | 12 +++++----- source/libs/parser/src/parAstCreater.c | 1 + source/libs/parser/src/parAstParser.c | 1 - source/libs/parser/src/parTranslater.c | 29 ++++++++++++++++++------- 10 files changed, 49 insertions(+), 46 deletions(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 27169b0a4e..bcbae641f2 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -352,7 +352,6 @@ typedef enum ENodeType { QUERY_NODE_CREATE_ANODE_STMT, QUERY_NODE_DROP_ANODE_STMT, QUERY_NODE_UPDATE_ANODE_STMT, - QUERY_NODE_ALTER_TABLE_MULTI_STMT, // show statement nodes // see 'sysTableShowAdapter', 'SYSTABLE_SHOW_TYPE_OFFSET' diff --git a/include/libs/nodes/cmdnodes.h b/include/libs/nodes/cmdnodes.h index 6623811712..defacf4cd3 100644 --- a/include/libs/nodes/cmdnodes.h +++ b/include/libs/nodes/cmdnodes.h @@ -267,18 +267,6 @@ typedef struct SAlterTableStmt { SNodeList* pNodeListTagValue; } SAlterTableStmt; - -typedef struct SAlterTableStmt2 { - ENodeType type; - int8_t alterType; - char colName[TSDB_COL_NAME_LEN]; - STableOptions* pOptions; - SDataType dataType; - SValueNode* pVal; - SColumnOptions* pColOptions; - -} SAlterTableStmt2; - typedef struct SAlterTableMultiStmt { ENodeType type; char dbName[TSDB_DB_NAME_LEN]; diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c index 134a5cf8c5..fd3af20ac1 100644 --- a/source/common/src/tmsg.c +++ b/source/common/src/tmsg.c @@ -10521,7 +10521,7 @@ int32_t tEncodeSVAlterTbReq(SEncoder *pEncoder, const SVAlterTbReq *pReq) { TAOS_CHECK_EXIT(tEncodeI8(pEncoder, pTag->isNull)); TAOS_CHECK_EXIT(tEncodeI8(pEncoder, pTag->tagType)); if (!pTag->isNull) { - TAOS_CHECK_EXIT(tEncodeBinary(pEncoder, pTag->pTagVal, pReq->nTagVal)); + TAOS_CHECK_EXIT(tEncodeBinary(pEncoder, pTag->pTagVal, pTag->nTagVal)); } } break; diff --git a/source/dnode/vnode/src/meta/metaTable.c b/source/dnode/vnode/src/meta/metaTable.c index f51b641640..54476d339f 100644 --- a/source/dnode/vnode/src/meta/metaTable.c +++ b/source/dnode/vnode/src/meta/metaTable.c @@ -2109,7 +2109,7 @@ static int metaUpdateTableMultiTagVal(SMeta *pMeta, int64_t version, SVAlterTbRe } int32_t nTagVals = taosArrayGetSize(pAlterTbReq->pMultiTag); - pTagTable = taosHashInit(nTagVals, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK); + pTagTable = taosHashInit(nTagVals, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK); if (pTagTable == NULL) { ret = terrno; goto _err; @@ -2143,7 +2143,7 @@ static int metaUpdateTableMultiTagVal(SMeta *pMeta, int64_t version, SVAlterTbRe } iCol++; } - if (taosArrayGetSize(updateTagColumnIds) == nUpdateTagVal) { + if (taosArrayGetSize(updateTagColumnIds) != nUpdateTagVal) { terrno = TSDB_CODE_VND_COL_NOT_EXISTS; goto _err; } diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index dd13c975cf..546cd6c3ae 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -145,8 +145,12 @@ static int32_t vnodePreProcessAlterTableMsg(SVnode *pVnode, SRpcMsg *pMsg) { SVAlterTbReq vAlterTbReq = {0}; int64_t ctimeMs = taosGetTimestampMs(); if (tDecodeSVAlterTbReqSetCtime(&dc, &vAlterTbReq, ctimeMs) < 0) { + taosArrayDestroy(vAlterTbReq.pMultiTag); + vAlterTbReq.pMultiTag = NULL; goto _exit; } + taosArrayDestroy(vAlterTbReq.pMultiTag); + vAlterTbReq.pMultiTag = NULL; code = 0; @@ -666,10 +670,9 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t ver, SRpcMsg } } break; case TDMT_VND_STREAM_TASK_RESET: { - if (pVnode->restored && vnodeIsLeader(pVnode) && - (code = tqProcessTaskResetReq(pVnode->pTq, pMsg)) < 0) { - goto _err; - } + if (pVnode->restored && vnodeIsLeader(pVnode) && (code = tqProcessTaskResetReq(pVnode->pTq, pMsg)) < 0) { + goto _err; + } } break; case TDMT_VND_ALTER_CONFIRM: @@ -690,7 +693,7 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t ver, SRpcMsg case TDMT_VND_DROP_INDEX: vnodeProcessDropIndexReq(pVnode, ver, pReq, len, pRsp); break; - case TDMT_VND_STREAM_CHECK_POINT_SOURCE: // always return true + case TDMT_VND_STREAM_CHECK_POINT_SOURCE: // always return true tqProcessTaskCheckPointSourceReq(pVnode->pTq, pMsg, pRsp); break; case TDMT_VND_STREAM_TASK_UPDATE: // always return true @@ -1367,6 +1370,7 @@ static int32_t vnodeProcessAlterTbReq(SVnode *pVnode, int64_t ver, void *pReq, i } _exit: + taosArrayDestroy(vAlterTbReq.pMultiTag); tEncodeSize(tEncodeSVAlterTbRsp, &vAlterTbRsp, pRsp->contLen, ret); pRsp->pCont = rpcMallocCont(pRsp->contLen); tEncoderInit(&ec, pRsp->pCont, pRsp->contLen); diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c index 25d1ecd6f9..ac29021e83 100644 --- a/source/libs/nodes/src/nodesUtilFuncs.c +++ b/source/libs/nodes/src/nodesUtilFuncs.c @@ -519,9 +519,6 @@ int32_t nodesMakeNode(ENodeType type, SNode** ppNodeOut) { case QUERY_NODE_ALTER_SUPER_TABLE_STMT: code = makeNode(type, sizeof(SAlterTableStmt), &pNode); break; - case QUERY_NODE_ALTER_TABLE_MULTI_STMT: - code = makeNode(type, sizeof(SAlterTableMultiStmt), &pNode); - break; case QUERY_NODE_CREATE_USER_STMT: code = makeNode(type, sizeof(SCreateUserStmt), &pNode); break; @@ -1360,13 +1357,15 @@ void nodesDestroyNode(SNode* pNode) { SAlterTableStmt* pStmt = (SAlterTableStmt*)pNode; nodesDestroyNode((SNode*)pStmt->pOptions); nodesDestroyNode((SNode*)pStmt->pVal); - break; - } - case QUERY_NODE_ALTER_TABLE_MULTI_STMT: { - SAlterTableMultiStmt* pStmt = (SAlterTableMultiStmt*)pNode; - // nodesDestroyList(pStmt->pTables); - // nodesDestroyNode((SNode*)pStmt->pOptions); - // nodesDestroyNode((SNode*)pStmt->pVal); + if (pStmt->pNodeListTagValue != NULL) { + SNodeList* pNodeList = pStmt->pNodeListTagValue; + SNode* pSubNode = NULL; + FOREACH(pSubNode, pNodeList) { + SAlterTableStmt* pSubAlterTable = (SAlterTableStmt*)pSubNode; + nodesDestroyNode((SNode*)pSubAlterTable->pOptions); + nodesDestroyNode((SNode*)pSubAlterTable->pVal); + } + } break; } case QUERY_NODE_CREATE_USER_STMT: { diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 9c76aa7f7a..b8a5e6f98f 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -390,14 +390,14 @@ alter_table_clause(A) ::= full_table_name(B) RENAME TAG column_name(C) column_name(D). { A = createAlterTableRenameCol(pCxt, B, TSDB_ALTER_TABLE_UPDATE_TAG_NAME, &C, &D); } -%type column_eq_value_list { SNodeList* } -%destructor column_eq_value_list { nodesDestroyList($$); } -column_eq_value(A) ::= column_name(C) NK_EQ tags_literal(D). { A = createAlterSingleTagColumnNode(pCxt, &C, D); } -column_eq_value_list(A) ::= column_eq_value(B). { A = createNodeList(pCxt, B); } -column_eq_value_list(A) ::= column_eq_value_list(B) NK_COMMA column_eq_value(C). { A = addNodeToList(pCxt, B, C);} +%type column_tag_value_list { SNodeList* } +%destructor column_tag_value_list { nodesDestroyList($$); } +column_tag_value(A) ::= column_name(C) NK_EQ tags_literal(D). { A = createAlterSingleTagColumnNode(pCxt, &C, D); } +column_tag_value_list(A) ::= column_tag_value(B). { A = createNodeList(pCxt, B); } +column_tag_value_list(A) ::= column_tag_value_list(B) NK_COMMA column_tag_value(C). { A = addNodeToList(pCxt, B, C);} alter_table_clause(A) ::= - full_table_name(B) SET TAG column_eq_value_list(C). { A = createAlterTableSetMultiTagValue(pCxt, B, C); } + full_table_name(B) SET TAG column_tag_value_list(C). { A = createAlterTableSetMultiTagValue(pCxt, B, C); } %type multi_create_clause { SNodeList* } %destructor multi_create_clause { nodesDestroyList($$); } diff --git a/source/libs/parser/src/parAstCreater.c b/source/libs/parser/src/parAstCreater.c index b41dad0b18..8b0fc19739 100644 --- a/source/libs/parser/src/parAstCreater.c +++ b/source/libs/parser/src/parAstCreater.c @@ -2555,6 +2555,7 @@ SNode* createAlterSingleTagColumnNode(SAstCreateContext* pCtx, SToken* pTagName, pStmt->alterType = TSDB_ALTER_TABLE_UPDATE_TAG_VAL; COPY_STRING_FORM_ID_TOKEN(pStmt->colName, pTagName); pStmt->pVal = (SValueNode*)pVal; + pStmt->pNodeListTagValue = NULL; return (SNode*)pStmt; _err: return NULL; diff --git a/source/libs/parser/src/parAstParser.c b/source/libs/parser/src/parAstParser.c index 39b142881f..657deb43d0 100644 --- a/source/libs/parser/src/parAstParser.c +++ b/source/libs/parser/src/parAstParser.c @@ -970,7 +970,6 @@ static int32_t collectMetaKeyFromQuery(SCollectMetaKeyCxt* pCxt, SNode* pStmt) { case QUERY_NODE_DROP_SUPER_TABLE_STMT: return collectMetaKeyFromDropStable(pCxt, (SDropSuperTableStmt*)pStmt); case QUERY_NODE_ALTER_TABLE_STMT: - case QUERY_NODE_ALTER_TABLE_MULTI_STMT: return collectMetaKeyFromAlterTable(pCxt, (SAlterTableStmt*)pStmt); case QUERY_NODE_ALTER_SUPER_TABLE_STMT: return collectMetaKeyFromAlterStable(pCxt, (SAlterTableStmt*)pStmt); diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 3543ee1a53..ebb6693508 100755 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -15184,11 +15184,7 @@ static int32_t rewriteDropSuperTable(STranslateContext* pCxt, SQuery* pQuery) { static int32_t buildUpdateTagValReqImpl2(STranslateContext* pCxt, SAlterTableStmt* pStmt, STableMeta* pTableMeta, char* colName, SMultiTagUpateVal* pReq) { - int32_t code = TSDB_CODE_SUCCESS; - if (NULL == pReq->tagName) { - return terrno; - } - + int32_t code = TSDB_CODE_SUCCESS; SSchema* pSchema = getTagSchema(pTableMeta, colName); if (NULL == pSchema) { return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_ALTER_TABLE, "Invalid tag name: %s", colName); @@ -15360,7 +15356,7 @@ static int32_t buildUpdateMultiTagValReq(STranslateContext* pCxt, SAlterTableStm return buildUpdateTagValReqImpl(pCxt, head, pTableMeta, head->colName, pReq); } else { pReq->pMultiTag = taosArrayInit(nTagValues, sizeof(SMultiTagUpateVal)); - if (NULL == pReq->pTagArray) { + if (pReq->pMultiTag == NULL) { return terrno; } @@ -15373,7 +15369,9 @@ static int32_t buildUpdateMultiTagValReq(STranslateContext* pCxt, SAlterTableStm if (TSDB_CODE_SUCCESS != code) { return code; } - TAOS_UNUSED(taosArrayPush(pReq->pMultiTag, &val)); + if (taosArrayPush(pReq->pMultiTag, &val) == NULL) { + return terrno; + } } } @@ -15658,6 +15656,18 @@ static int32_t buildModifyVnodeArray(STranslateContext* pCxt, SAlterTableStmt* p return code; } +static void deleTagVal(void* val) { + SMultiTagUpateVal* pTag = val; + taosMemoryFree(pTag->tagName); + for (int i = 0; i < taosArrayGetSize(pTag->pTagArray); ++i) { + STagVal* p = (STagVal*)taosArrayGet(pTag->pTagArray, i); + if (IS_VAR_DATA_TYPE(p->type)) { + taosMemoryFreeClear(p->pData); + } + } + + taosArrayDestroy(pTag->pTagArray); +} static void destoryAlterTbReq(SVAlterTbReq* pReq) { taosMemoryFree(pReq->tbName); taosMemoryFree(pReq->colName); @@ -15670,6 +15680,10 @@ static void destoryAlterTbReq(SVAlterTbReq* pReq) { taosMemoryFreeClear(p->pData); } } + if (pReq->action == TSDB_ALTER_TABLE_UPDATE_MULTI_TAG_VAL) { + taosArrayDestroyEx(pReq->pMultiTag, deleTagVal); + } + taosArrayDestroy(pReq->pTagArray); if (pReq->tagFree) tTagFree((STag*)pReq->pTagVal); } @@ -16374,7 +16388,6 @@ static int32_t rewriteQuery(STranslateContext* pCxt, SQuery* pQuery) { case QUERY_NODE_DROP_SUPER_TABLE_STMT: code = rewriteDropSuperTable(pCxt, pQuery); break; - case QUERY_NODE_ALTER_TABLE_MULTI_STMT: case QUERY_NODE_ALTER_TABLE_STMT: code = rewriteAlterTable(pCxt, pQuery); break;