diff --git a/src/client/inc/tsclient.h b/src/client/inc/tsclient.h index 85bdfa43fdf164ac2a3a51b5d8bba047821267c0..2b3f928993a3cdd73d5e6fd4aed607c0efe372cc 100644 --- a/src/client/inc/tsclient.h +++ b/src/client/inc/tsclient.h @@ -386,6 +386,7 @@ typedef struct SSqlObj { SSqlRes res; SSubqueryState subState; + pthread_mutex_t mtxSubs; // avoid double access pSubs after failure struct SSqlObj **pSubs; struct SSqlObj *rootObj; diff --git a/src/client/src/tscAsync.c b/src/client/src/tscAsync.c index 911da05b4379ad871a09db6f7b87d26712051e02..5cd81517e42839fe0f31c438832b1b602bf782f9 100644 --- a/src/client/src/tscAsync.c +++ b/src/client/src/tscAsync.c @@ -46,6 +46,8 @@ void doAsyncQuery(STscObj* pObj, SSqlObj* pSql, __async_cb_func_t fp, void* para pSql->fetchFp = fp; pSql->rootObj = pSql; + pthread_mutex_init(&pSql->mtxSubs, NULL); + registerSqlObj(pSql); pSql->sqlstr = calloc(1, sqlLen + 1); diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index c4c7311fe7a2c0725483ac9edc7c476e3c57beff..6c40629213bb89db0173392a741bfd1f07049663 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -3165,7 +3165,9 @@ int tscRenewTableMeta(SSqlObj *pSql) { pSql->rootObj->retryReason = pSql->retryReason; SSqlObj *rootSql = pSql->rootObj; + pthread_mutex_lock(&rootSql->mtxSubs); tscFreeSubobj(rootSql); + pthread_mutex_unlock(&rootSql->mtxSubs); tfree(rootSql->pSubs); tscResetSqlCmd(&rootSql->cmd, true, rootSql->self); diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c index 70634a938109d883573f930224e6364b02dc0c02..7bf51d898dbc40991ffb1a4d356b3e26044c1e76 100644 --- a/src/client/src/tscUtil.c +++ b/src/client/src/tscUtil.c @@ -1738,6 +1738,10 @@ void tscFreeSqlObj(SSqlObj* pSql) { tscFreeSubobj(pSql); + if (pSql && (pSql == pSql->rootObj)) { + pthread_mutex_destroy(&pSql->mtxSubs); + } + pSql->signature = NULL; pSql->fp = NULL; tfree(pSql->sqlstr);