[td-5250]<enhance>: fix memory leak and remove duplicated name in name array list.
This commit is contained in:
parent
0b05f0b06d
commit
289e10823a
|
@ -2073,6 +2073,7 @@ int tscProcessMultiTableMetaRsp(SSqlObj *pSql) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool freeMeta = false;
|
||||||
STableMeta* pTableMeta = tscCreateTableMetaFromMsg(pMetaMsg);
|
STableMeta* pTableMeta = tscCreateTableMetaFromMsg(pMetaMsg);
|
||||||
if (!tIsValidSchema(pTableMeta->schema, pTableMeta->tableInfo.numOfColumns, pTableMeta->tableInfo.numOfTags)) {
|
if (!tIsValidSchema(pTableMeta->schema, pTableMeta->tableInfo.numOfColumns, pTableMeta->tableInfo.numOfTags)) {
|
||||||
tscError("0x%"PRIx64" invalid table meta from mnode, name:%s", pSql->self, pMetaMsg->tableFname);
|
tscError("0x%"PRIx64" invalid table meta from mnode, name:%s", pSql->self, pMetaMsg->tableFname);
|
||||||
|
@ -2092,11 +2093,13 @@ int tscProcessMultiTableMetaRsp(SSqlObj *pSql) {
|
||||||
const char* tableName = tNameGetTableName(&sn);
|
const char* tableName = tNameGetTableName(&sn);
|
||||||
size_t keyLen = strlen(tableName);
|
size_t keyLen = strlen(tableName);
|
||||||
taosHashPut(pParentCmd->pTableMetaMap, tableName, keyLen, &p, sizeof(STableMetaVgroupInfo));
|
taosHashPut(pParentCmd->pTableMetaMap, tableName, keyLen, &p, sizeof(STableMetaVgroupInfo));
|
||||||
|
} else {
|
||||||
|
freeMeta = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// for each super table, only update meta information once
|
// for each super table, only update meta information once
|
||||||
bool updateStableMeta = false;
|
bool updateStableMeta = false;
|
||||||
if (pTableMeta->tableType == TSDB_CHILD_TABLE && taosHashGet(pSet, &pMetaMsg->uid, sizeof(pMetaMsg->uid)) == NULL) {
|
if (pTableMeta->tableType == TSDB_CHILD_TABLE && taosHashGet(pSet, &pMetaMsg->suid, sizeof(pMetaMsg->suid)) == NULL) {
|
||||||
updateStableMeta = true;
|
updateStableMeta = true;
|
||||||
taosHashPut(pSet, &pTableMeta->suid, sizeof(pMetaMsg->suid), "", 0);
|
taosHashPut(pSet, &pTableMeta->suid, sizeof(pMetaMsg->suid), "", 0);
|
||||||
}
|
}
|
||||||
|
@ -2112,6 +2115,9 @@ int tscProcessMultiTableMetaRsp(SSqlObj *pSql) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pMsg += pMetaMsg->contLen;
|
pMsg += pMetaMsg->contLen;
|
||||||
|
if (freeMeta) {
|
||||||
|
tfree(pTableMeta);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int32_t i = 0; i < pMultiMeta->numOfVgroup; ++i) {
|
for(int32_t i = 0; i < pMultiMeta->numOfVgroup; ++i) {
|
||||||
|
|
|
@ -945,21 +945,19 @@ int taos_load_table_info(TAOS *taos, const char *tableNameList) {
|
||||||
return TSDB_CODE_TSC_DISCONNECTED;
|
return TSDB_CODE_TSC_DISCONNECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSqlObj* pSql = calloc(1, sizeof(SSqlObj));
|
|
||||||
pSql->pTscObj = taos;
|
|
||||||
pSql->signature = pSql;
|
|
||||||
|
|
||||||
int32_t length = (int32_t)strlen(tableNameList);
|
int32_t length = (int32_t)strlen(tableNameList);
|
||||||
|
if (length == 0) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
if (length > MAX_TABLE_NAME_LENGTH) {
|
if (length > MAX_TABLE_NAME_LENGTH) {
|
||||||
tscError("0x%"PRIx64" tableNameList too long, length:%d, maximum allowed:%d", pSql->self, length, MAX_TABLE_NAME_LENGTH);
|
tscError("tableNameList too long, length:%d, maximum allowed:%d", length, MAX_TABLE_NAME_LENGTH);
|
||||||
tscFreeSqlObj(pSql);
|
|
||||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *str = calloc(1, length + 1);
|
char *str = calloc(1, length + 1);
|
||||||
if (str == NULL) {
|
if (str == NULL) {
|
||||||
tscError("0x%"PRIx64" failed to allocate sql string buffer", pSql->self);
|
tscError("failed to allocate sql string buffer, size:%d", length);
|
||||||
tscFreeSqlObj(pSql);
|
|
||||||
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -968,10 +966,15 @@ int taos_load_table_info(TAOS *taos, const char *tableNameList) {
|
||||||
SArray* vgroupList = taosArrayInit(4, POINTER_BYTES);
|
SArray* vgroupList = taosArrayInit(4, POINTER_BYTES);
|
||||||
if (plist == NULL || vgroupList == NULL) {
|
if (plist == NULL || vgroupList == NULL) {
|
||||||
tfree(str);
|
tfree(str);
|
||||||
tscFreeSqlObj(pSql);
|
|
||||||
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SSqlObj* pSql = calloc(1, sizeof(SSqlObj));
|
||||||
|
tscAllocPayload(&pSql->cmd, 1024);
|
||||||
|
|
||||||
|
pSql->pTscObj = taos;
|
||||||
|
pSql->signature = pSql;
|
||||||
|
|
||||||
int32_t code = (uint8_t) tscTransferTableNameList(pSql, str, length, plist);
|
int32_t code = (uint8_t) tscTransferTableNameList(pSql, str, length, plist);
|
||||||
free(str);
|
free(str);
|
||||||
|
|
||||||
|
|
|
@ -4497,6 +4497,15 @@ static int32_t doAddTableName(char* nextStr, char** str, SArray* pNameArray, SSq
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t nameComparFn(const void* n1, const void* n2) {
|
||||||
|
int32_t ret = strcmp(*(char**)n1, *(char**)n2);
|
||||||
|
if (ret == 0) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return ret > 0? 1:-1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int tscTransferTableNameList(SSqlObj *pSql, const char *pNameList, int32_t length, SArray* pNameArray) {
|
int tscTransferTableNameList(SSqlObj *pSql, const char *pNameList, int32_t length, SArray* pNameArray) {
|
||||||
SSqlCmd *pCmd = &pSql->cmd;
|
SSqlCmd *pCmd = &pSql->cmd;
|
||||||
|
|
||||||
|
@ -4538,6 +4547,34 @@ int tscTransferTableNameList(SSqlObj *pSql, const char *pNameList, int32_t lengt
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
taosArraySort(pNameArray, nameComparFn);
|
||||||
|
size_t len = taosArrayGetSize(pNameArray);
|
||||||
|
|
||||||
|
int32_t pos = 0;
|
||||||
|
for(int32_t i = 1; i < len; ++i) {
|
||||||
|
char** p1 = taosArrayGet(pNameArray, pos);
|
||||||
|
char** p2 = taosArrayGet(pNameArray, i);
|
||||||
|
|
||||||
|
if (strcmp(*p1, *p2) == 0) {
|
||||||
|
// do nothing
|
||||||
|
} else {
|
||||||
|
if (pos + 1 != i) {
|
||||||
|
char* p = taosArrayGetP(pNameArray, pos + 1);
|
||||||
|
tfree(p);
|
||||||
|
taosArraySet(pNameArray, pos + 1, p2);
|
||||||
|
pos += 1;
|
||||||
|
} else {
|
||||||
|
pos += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int32_t i = pos + 1; i < pNameArray->size; ++i) {
|
||||||
|
char* p = taosArrayGetP(pNameArray, i);
|
||||||
|
tfree(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
pNameArray->size = pos + 1;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue