diff --git a/include/common/tcommon.h b/include/common/tcommon.h
index 614e7c9974..3d15e8b087 100644
--- a/include/common/tcommon.h
+++ b/include/common/tcommon.h
@@ -55,7 +55,7 @@ enum {
enum {
STREAM_INPUT__DATA_SUBMIT = 1,
STREAM_INPUT__DATA_BLOCK,
- STREAM_INPUT__TABLE_SCAN,
+ // STREAM_INPUT__TABLE_SCAN,
STREAM_INPUT__TQ_SCAN,
STREAM_INPUT__DATA_RETRIEVE,
STREAM_INPUT__TRIGGER,
diff --git a/include/libs/executor/executor.h b/include/libs/executor/executor.h
index a95293a5b1..783193db49 100644
--- a/include/libs/executor/executor.h
+++ b/include/libs/executor/executor.h
@@ -110,7 +110,7 @@ int32_t qCreateExecTask(SReadHandle* readHandle, int32_t vgId, uint64_t taskId,
* @param tversion
* @return
*/
-int32_t qGetQueriedTableSchemaVersion(qTaskInfo_t tinfo, char* dbName, char* tableName, int32_t* sversion,
+int32_t qGetQueryTableSchemaVersion(qTaskInfo_t tinfo, char* dbName, char* tableName, int32_t* sversion,
int32_t* tversion);
/**
diff --git a/include/libs/wal/wal.h b/include/libs/wal/wal.h
index 9b94864a05..0a8e55bb4f 100644
--- a/include/libs/wal/wal.h
+++ b/include/libs/wal/wal.h
@@ -124,6 +124,7 @@ typedef struct SWal {
typedef struct {
int8_t scanUncommited;
int8_t scanMeta;
+ int8_t enableRef;
} SWalFilterCond;
typedef struct {
diff --git a/packaging/tools/make_install.sh b/packaging/tools/make_install.sh
index 8ad42811d4..680fa6736b 100755
--- a/packaging/tools/make_install.sh
+++ b/packaging/tools/make_install.sh
@@ -305,18 +305,23 @@ function install_lib() {
${install_main_dir}/driver &&
${csudo}chmod 777 ${install_main_dir}/driver/libtaos.so.${verNumber}
- ${csudo}cp ${binary_dir}/build/lib/libtaosws.so \
- ${install_main_dir}/driver &&
- ${csudo}chmod 777 ${install_main_dir}/driver/libtaosws.so
-
${csudo}ln -sf ${install_main_dir}/driver/libtaos.* ${lib_link_dir}/libtaos.so.1
${csudo}ln -sf ${lib_link_dir}/libtaos.so.1 ${lib_link_dir}/libtaos.so
- ${csudo}ln -sf ${install_main_dir}/driver/libtaosws.so ${lib_link_dir}/libtaosws.so || :
-
if [ -d "${lib64_link_dir}" ]; then
- ${csudo}ln -sf ${install_main_dir}/driver/libtaos.* ${lib64_link_dir}/libtaos.so.1
- ${csudo}ln -sf ${lib64_link_dir}/libtaos.so.1 ${lib64_link_dir}/libtaos.so
- ${csudo}ln -sf ${lib64_link_dir}/libtaosws.so ${lib64_link_dir}/libtaosws.so || :
+ ${csudo}ln -sf ${install_main_dir}/driver/libtaos.* ${lib64_link_dir}/libtaos.so.1
+ ${csudo}ln -sf ${lib64_link_dir}/libtaos.so.1 ${lib64_link_dir}/libtaos.so
+ fi
+
+ if [ -f ${binary_dir}/build/lib/libtaosws.so ]; then
+ ${csudo}cp ${binary_dir}/build/lib/libtaosws.so \
+ ${install_main_dir}/driver &&
+ ${csudo}chmod 777 ${install_main_dir}/driver/libtaosws.so ||:
+
+ ${csudo}ln -sf ${install_main_dir}/driver/libtaosws.so ${lib_link_dir}/libtaosws.so || :
+
+ if [ -d "${lib64_link_dir}" ]; then
+ ${csudo}ln -sf ${lib64_link_dir}/libtaosws.so ${lib64_link_dir}/libtaosws.so || :
+ fi
fi
else
${csudo}cp -Rf ${binary_dir}/build/lib/libtaos.${verNumber}.dylib \
@@ -357,26 +362,26 @@ function install_header() {
if [ "$osType" != "Darwin" ]; then
${csudo}rm -f ${inc_link_dir}/taos.h ${inc_link_dir}/taosdef.h ${inc_link_dir}/taoserror.h ${inc_link_dir}/taosudf.h || :
+ ${csudo}rm -f ${inc_link_dir}/taosws.h ||:
${csudo}cp -f ${source_dir}/include/client/taos.h ${source_dir}/include/common/taosdef.h ${source_dir}/include/util/taoserror.h ${source_dir}/include/libs/function/taosudf.h \
- ${csudo}rm -f ${inc_link_dir}/taosws.h || :
-
- ${csudo}cp -f ${source_dir}/src/inc/taos.h ${source_dir}/src/inc/taosdef.h ${source_dir}/src/inc/taoserror.h \
${install_main_dir}/include && ${csudo}chmod 644 ${install_main_dir}/include/*
- ${csudo}cp -f ${binary_dir}/build/include/taosws.h ${install_main_dir}/include && ${csudo}chmod 644 ${install_main_dir}/include/taosws.h
+ if [ -f ${binary_dir}/build/include/taosws.h ]; then
+ ${csudo}cp -f ${binary_dir}/build/include/taosws.h ${install_main_dir}/include && ${csudo}chmod 644 ${install_main_dir}/include/taosws.h ||:
+ ${csudo}ln -s ${install_main_dir}/include/taosws.h ${inc_link_dir}/taosws.h ||:
+ fi
${csudo}ln -s ${install_main_dir}/include/taos.h ${inc_link_dir}/taos.h
${csudo}ln -s ${install_main_dir}/include/taosdef.h ${inc_link_dir}/taosdef.h
${csudo}ln -s ${install_main_dir}/include/taoserror.h ${inc_link_dir}/taoserror.h
${csudo}ln -s ${install_main_dir}/include/taosudf.h ${inc_link_dir}/taosudf.h
- ${csudo}ln -s ${install_main_dir}/include/taosws.h ${inc_link_dir}/taosws.h || :
else
${csudo}cp -f ${source_dir}/include/client/taos.h ${source_dir}/include/common/taosdef.h ${source_dir}/include/util/taoserror.h ${source_dir}/include/libs/function/taosudf.h \
${install_main_dir}/include ||
${csudo}cp -f ${source_dir}/include/client/taos.h ${source_dir}/include/common/taosdef.h ${source_dir}/include/util/taoserror.h ${source_dir}/include/libs/function/taosudf.h \
${install_main_2_dir}/include &&
- ${csudo}chmod 644 ${install_main_dir}/include/* ||
+ ${csudo}chmod 644 ${install_main_dir}/include/* ||:
${csudo}chmod 644 ${install_main_2_dir}/include/*
fi
}
diff --git a/source/client/inc/clientInt.h b/source/client/inc/clientInt.h
index 9380b73d2d..91f21f6e6a 100644
--- a/source/client/inc/clientInt.h
+++ b/source/client/inc/clientInt.h
@@ -222,8 +222,8 @@ typedef struct SRequestObj {
SArray* tableList;
SQueryExecMetric metric;
SRequestSendRecvBody body;
- bool stableQuery;
- bool validateOnly;
+ bool stableQuery; // todo refactor
+ bool validateOnly; // todo refactor
bool killed;
uint32_t prevCode; // previous error code: todo refactor, add update flag for catalog
@@ -247,9 +247,9 @@ void doFreeReqResultInfo(SReqResultInfo* pResInfo);
int32_t transferTableNameList(const char* tbList, int32_t acctId, char* dbName, SArray** pReq);
void syncCatalogFn(SMetaData* pResult, void* param, int32_t code);
-SRequestObj* execQuery(STscObj* pTscObj, const char* sql, int sqlLen, bool validateOnly);
+SRequestObj* execQuery(uint64_t connId, const char* sql, int sqlLen, bool validateOnly);
TAOS_RES* taosQueryImpl(TAOS* taos, const char* sql, bool validateOnly);
-void taosAsyncQueryImpl(TAOS* taos, const char* sql, __taos_async_fn_t fp, void* param, bool validateOnly);
+void taosAsyncQueryImpl(uint64_t connId, const char* sql, __taos_async_fn_t fp, void* param, bool validateOnly);
static FORCE_INLINE SReqResultInfo* tmqGetCurResInfo(TAOS_RES* res) {
SMqRspObj* msg = (SMqRspObj*)res;
@@ -297,7 +297,7 @@ int32_t releaseTscObj(int64_t rid);
uint64_t generateRequestId();
-void* createRequest(STscObj* pObj, int32_t type);
+void* createRequest(uint64_t connId, int32_t type);
void destroyRequest(SRequestObj* pRequest);
SRequestObj* acquireRequest(int64_t rid);
int32_t releaseRequest(int64_t rid);
@@ -318,13 +318,13 @@ void processMsgFromServer(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet);
STscObj* taos_connect_internal(const char* ip, const char* user, const char* pass, const char* auth, const char* db,
uint16_t port, int connType);
-SRequestObj* launchQuery(STscObj* pTscObj, const char* sql, int sqlLen, bool validateOnly);
+SRequestObj* launchQuery(uint64_t connId, const char* sql, int sqlLen, bool validateOnly);
int32_t parseSql(SRequestObj* pRequest, bool topicQuery, SQuery** pQuery, SStmtCallback* pStmtCb);
int32_t getPlan(SRequestObj* pRequest, SQuery* pQuery, SQueryPlan** pPlan, SArray* pNodeList);
-int32_t buildRequest(STscObj* pTscObj, const char* sql, int sqlLen, SRequestObj** pRequest);
+int32_t buildRequest(uint64_t connId, const char* sql, int sqlLen, void* param, bool validateSql, SRequestObj** pRequest);
void taos_close_internal(void* taos);
diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c
index 89ecf16b40..ba92ed238b 100644
--- a/source/client/src/clientEnv.c
+++ b/source/client/src/clientEnv.c
@@ -49,13 +49,8 @@ void cleanupTscQhandle() {
// destroy handle
taosCleanUpScheduler(tscQhandle);
}
-static int32_t registerRequest(SRequestObj *pRequest) {
- STscObj *pTscObj = acquireTscObj(pRequest->pTscObj->id);
- if (NULL == pTscObj) {
- terrno = TSDB_CODE_TSC_DISCONNECTED;
- return terrno;
- }
+static int32_t registerRequest(SRequestObj *pRequest, STscObj* pTscObj) {
// connection has been released already, abort creating request.
pRequest->self = taosAddRef(clientReqRefPool, pRequest);
@@ -246,29 +241,34 @@ STscObj *acquireTscObj(int64_t rid) { return (STscObj *)taosAcquireRef(clientCon
int32_t releaseTscObj(int64_t rid) { return taosReleaseRef(clientConnRefPool, rid); }
-void *createRequest(STscObj *pObj, int32_t type) {
- assert(pObj != NULL);
-
+void *createRequest(uint64_t connId, int32_t type) {
SRequestObj *pRequest = (SRequestObj *)taosMemoryCalloc(1, sizeof(SRequestObj));
if (NULL == pRequest) {
terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
return NULL;
}
+ STscObj* pTscObj = acquireTscObj(connId);
+ if (pTscObj == NULL) {
+ terrno = TSDB_CODE_TSC_DISCONNECTED;
+ return NULL;
+ }
+
pRequest->resType = RES_TYPE__QUERY;
- pRequest->pDb = getDbOfConnection(pObj);
pRequest->requestId = generateRequestId();
pRequest->metric.start = taosGetTimestampUs();
pRequest->body.resInfo.convertUcs4 = true; // convert ucs4 by default
-
pRequest->type = type;
- pRequest->pTscObj = pObj;
+
+ pRequest->pDb = getDbOfConnection(pTscObj);
+ pRequest->pTscObj = pTscObj;
+
pRequest->msgBuf = taosMemoryCalloc(1, ERROR_MSG_BUF_DEFAULT_SIZE);
pRequest->msgBufLen = ERROR_MSG_BUF_DEFAULT_SIZE;
tsem_init(&pRequest->body.rspSem, 0, 0);
- if (registerRequest(pRequest)) {
+ if (registerRequest(pRequest, pTscObj)) {
doDestroyRequest(pRequest);
return NULL;
}
@@ -327,8 +327,8 @@ void doDestroyRequest(void *p) {
if (pRequest->self) {
deregisterRequest(pRequest);
}
- taosMemoryFree(pRequest);
+ taosMemoryFree(pRequest);
tscTrace("end to destroy request %" PRIx64 " p:%p", reqId, pRequest);
}
@@ -338,7 +338,6 @@ void destroyRequest(SRequestObj *pRequest) {
}
taos_stop_query(pRequest);
-
removeRequest(pRequest->self);
}
diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c
index 6fb3d98027..a4a5ec7499 100644
--- a/source/client/src/clientImpl.c
+++ b/source/client/src/clientImpl.c
@@ -148,29 +148,49 @@ STscObj* taos_connect_internal(const char* ip, const char* user, const char* pas
return taosConnectImpl(user, &secretEncrypt[0], localDb, NULL, NULL, *pInst, connType);
}
-int32_t buildRequest(STscObj* pTscObj, const char* sql, int sqlLen, SRequestObj** pRequest) {
- *pRequest = createRequest(pTscObj, TSDB_SQL_SELECT);
+int32_t buildRequest(uint64_t connId, const char* sql, int sqlLen, void* param, bool validateSql, SRequestObj** pRequest) {
+ *pRequest = createRequest(connId, TSDB_SQL_SELECT);
if (*pRequest == NULL) {
- tscError("failed to malloc sqlObj");
+ tscError("failed to malloc sqlObj, %s", sql);
return TSDB_CODE_TSC_OUT_OF_MEMORY;
}
(*pRequest)->sqlstr = taosMemoryMalloc(sqlLen + 1);
if ((*pRequest)->sqlstr == NULL) {
- tscError("0x%" PRIx64 " failed to prepare sql string buffer", (*pRequest)->self);
- (*pRequest)->msgBuf = strdup("failed to prepare sql string buffer");
+ tscError("0x%" PRIx64 " failed to prepare sql string buffer, %s", (*pRequest)->self, sql);
+ destroyRequest(*pRequest);
+ *pRequest = NULL;
return TSDB_CODE_TSC_OUT_OF_MEMORY;
}
strntolower((*pRequest)->sqlstr, sql, (int32_t)sqlLen);
(*pRequest)->sqlstr[sqlLen] = 0;
- (*pRequest)->sqlLen = sqlLen;
+ (*pRequest)->sqlLen = sqlLen;
+ (*pRequest)->validateOnly = validateSql;
+ if (param == NULL) {
+ SSyncQueryParam* pParam = taosMemoryCalloc(1, sizeof(SSyncQueryParam));
+ if (pParam == NULL) {
+ destroyRequest(*pRequest);
+ *pRequest = NULL;
+ return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ }
+
+ tsem_init(&pParam->sem, 0, 0);
+ pParam->pRequest = (*pRequest);
+ param = pParam;
+ }
+
+ (*pRequest)->body.param = param;
+
+ STscObj* pTscObj = (*pRequest)->pTscObj;
if (taosHashPut(pTscObj->pRequests, &(*pRequest)->self, sizeof((*pRequest)->self), &(*pRequest)->self,
sizeof((*pRequest)->self))) {
+ tscError("%d failed to add to request container, reqId:0x%" PRIx64 ", conn:%d, %s", (*pRequest)->self,
+ (*pRequest)->requestId, pTscObj->id, sql);
+
destroyRequest(*pRequest);
*pRequest = NULL;
- tscError("put request to request hash failed");
return TSDB_CODE_TSC_OUT_OF_MEMORY;
}
@@ -882,18 +902,16 @@ SRequestObj* launchQueryImpl(SRequestObj* pRequest, SQuery* pQuery, bool keepQue
return pRequest;
}
-SRequestObj* launchQuery(STscObj* pTscObj, const char* sql, int sqlLen, bool validateOnly) {
+SRequestObj* launchQuery(uint64_t connId, const char* sql, int sqlLen, bool validateOnly) {
SRequestObj* pRequest = NULL;
SQuery* pQuery = NULL;
- int32_t code = buildRequest(pTscObj, sql, sqlLen, &pRequest);
+ int32_t code = buildRequest(connId, sql, sqlLen, NULL, validateOnly, &pRequest);
if (code != TSDB_CODE_SUCCESS) {
terrno = code;
return NULL;
}
- pRequest->validateOnly = validateOnly;
-
code = parseSql(pRequest, false, &pQuery, NULL);
if (code != TSDB_CODE_SUCCESS) {
pRequest->code = code;
@@ -1044,19 +1062,20 @@ int32_t removeMeta(STscObj* pTscObj, SArray* tbList) {
return TSDB_CODE_SUCCESS;
}
-SRequestObj* execQuery(STscObj* pTscObj, const char* sql, int sqlLen, bool validateOnly) {
+// todo remove it soon
+SRequestObj* execQuery(uint64_t connId, const char* sql, int sqlLen, bool validateOnly) {
SRequestObj* pRequest = NULL;
int32_t retryNum = 0;
int32_t code = 0;
do {
destroyRequest(pRequest);
- pRequest = launchQuery(pTscObj, sql, sqlLen, validateOnly);
+ pRequest = launchQuery(connId, sql, sqlLen, validateOnly);
if (pRequest == NULL || TSDB_CODE_SUCCESS == pRequest->code || !NEED_CLIENT_HANDLE_ERROR(pRequest->code)) {
break;
}
- code = refreshMeta(pTscObj, pRequest);
+ code = refreshMeta(pRequest->pTscObj, pRequest);
if (code) {
pRequest->code = code;
break;
@@ -1064,7 +1083,7 @@ SRequestObj* execQuery(STscObj* pTscObj, const char* sql, int sqlLen, bool valid
} while (retryNum++ < REQUEST_TOTAL_EXEC_TIMES);
if (NEED_CLIENT_RM_TBLMETA_REQ(pRequest->type)) {
- removeMeta(pTscObj, pRequest->tableList);
+ removeMeta(pRequest->pTscObj, pRequest->tableList);
}
return pRequest;
@@ -1119,7 +1138,7 @@ STscObj* taosConnectImpl(const char* user, const char* auth, const char* db, __t
return pTscObj;
}
- SRequestObj* pRequest = createRequest(pTscObj, TDMT_MND_CONNECT);
+ SRequestObj* pRequest = createRequest(pTscObj->id, TDMT_MND_CONNECT);
if (pRequest == NULL) {
destroyTscObj(pTscObj);
terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
@@ -1446,15 +1465,10 @@ void* doAsyncFetchRows(SRequestObj* pRequest, bool setupOneRowPtr, bool convertU
return NULL;
}
- SSyncQueryParam* pParam = pRequest->body.param;
- if (NULL == pParam) {
- pParam = taosMemoryCalloc(1, sizeof(SSyncQueryParam));
- tsem_init(&pParam->sem, 0, 0);
- }
-
// convert ucs4 to native multi-bytes string
pResultInfo->convertUcs4 = convertUcs4;
+ SSyncQueryParam* pParam = pRequest->body.param;
taos_fetch_rows_a(pRequest, syncFetchFn, pParam);
tsem_wait(&pParam->sem);
}
@@ -2026,22 +2040,9 @@ void syncQueryFn(void* param, void* res, int32_t code) {
tsem_post(&pParam->sem);
}
-void taosAsyncQueryImpl(TAOS* taos, const char* sql, __taos_async_fn_t fp, void* param, bool validateOnly) {
- if (NULL == taos) {
- terrno = TSDB_CODE_TSC_DISCONNECTED;
- fp(param, NULL, terrno);
- return;
- }
-
- int64_t rid = *(int64_t*)taos;
- STscObj* pTscObj = acquireTscObj(rid);
- if (pTscObj == NULL || sql == NULL || NULL == fp) {
+void taosAsyncQueryImpl(uint64_t connId, const char* sql, __taos_async_fn_t fp, void* param, bool validateOnly) {
+ if (sql == NULL || NULL == fp) {
terrno = TSDB_CODE_INVALID_PARA;
- if (pTscObj) {
- releaseTscObj(rid);
- } else {
- terrno = TSDB_CODE_TSC_DISCONNECTED;
- }
fp(param, NULL, terrno);
return;
}
@@ -2050,26 +2051,20 @@ void taosAsyncQueryImpl(TAOS* taos, const char* sql, __taos_async_fn_t fp, void*
if (sqlLen > (size_t)TSDB_MAX_ALLOWED_SQL_LEN) {
tscError("sql string exceeds max length:%d", TSDB_MAX_ALLOWED_SQL_LEN);
terrno = TSDB_CODE_TSC_EXCEED_SQL_LIMIT;
- releaseTscObj(rid);
-
fp(param, NULL, terrno);
return;
}
SRequestObj* pRequest = NULL;
- int32_t code = buildRequest(pTscObj, sql, sqlLen, &pRequest);
+ int32_t code = buildRequest(connId, sql, sqlLen, param, validateOnly, &pRequest);
if (code != TSDB_CODE_SUCCESS) {
terrno = code;
- releaseTscObj(rid);
fp(param, NULL, terrno);
return;
}
- pRequest->validateOnly = validateOnly;
pRequest->body.queryFp = fp;
- pRequest->body.param = param;
doAsyncQuery(pRequest, false);
- releaseTscObj(rid);
}
TAOS_RES* taosQueryImpl(TAOS* taos, const char* sql, bool validateOnly) {
@@ -2078,36 +2073,22 @@ TAOS_RES* taosQueryImpl(TAOS* taos, const char* sql, bool validateOnly) {
return NULL;
}
- int64_t rid = *(int64_t*)taos;
- STscObj* pTscObj = acquireTscObj(rid);
- if (pTscObj == NULL || sql == NULL) {
- terrno = TSDB_CODE_TSC_DISCONNECTED;
- return NULL;
- }
-
#if SYNC_ON_TOP_OF_ASYNC
SSyncQueryParam* param = taosMemoryCalloc(1, sizeof(SSyncQueryParam));
tsem_init(¶m->sem, 0, 0);
- taosAsyncQueryImpl((TAOS*)&rid, sql, syncQueryFn, param, validateOnly);
+ taosAsyncQueryImpl(*(int64_t*)taos, sql, syncQueryFn, param, validateOnly);
tsem_wait(¶m->sem);
-
- releaseTscObj(rid);
-
return param->pRequest;
#else
size_t sqlLen = strlen(sql);
if (sqlLen > (size_t)TSDB_MAX_ALLOWED_SQL_LEN) {
- releaseTscObj(rid);
tscError("sql string exceeds max length:%d", TSDB_MAX_ALLOWED_SQL_LEN);
terrno = TSDB_CODE_TSC_EXCEED_SQL_LIMIT;
return NULL;
}
- TAOS_RES* pRes = execQuery(pTscObj, sql, sqlLen, validateOnly);
-
- releaseTscObj(rid);
-
+ TAOS_RES* pRes = execQuery(connId, sql, sqlLen, validateOnly);
return pRes;
#endif
}
diff --git a/source/client/src/clientMain.c b/source/client/src/clientMain.c
index e908046b1e..12de522cbc 100644
--- a/source/client/src/clientMain.c
+++ b/source/client/src/clientMain.c
@@ -479,7 +479,6 @@ void taos_stop_query(TAOS_RES *res) {
}
schedulerFreeJob(&pRequest->body.queryJob, TSDB_CODE_TSC_QUERY_KILLED);
-
tscDebug("request %" PRIx64 " killed", pRequest->requestId);
}
@@ -706,7 +705,8 @@ void retrieveMetaCallback(SMetaData *pResultMeta, void *param, int32_t code) {
}
void taos_query_a(TAOS *taos, const char *sql, __taos_async_fn_t fp, void *param) {
- taosAsyncQueryImpl(taos, sql, fp, param, false);
+ int64_t connId = *(int64_t*)taos;
+ taosAsyncQueryImpl(connId, sql, fp, param, false);
}
int32_t createParseContext(const SRequestObj *pRequest, SParseContext **pCxt) {
@@ -915,7 +915,7 @@ int taos_load_table_info(TAOS *taos, const char *tableNameList) {
return terrno;
}
- int64_t rid = *(int64_t *)taos;
+ int64_t connId = *(int64_t *)taos;
const int32_t MAX_TABLE_NAME_LENGTH = 12 * 1024 * 1024; // 12MB list
int32_t code = 0;
SRequestObj * pRequest = NULL;
@@ -933,12 +933,14 @@ int taos_load_table_info(TAOS *taos, const char *tableNameList) {
return TSDB_CODE_TSC_INVALID_OPERATION;
}
- STscObj *pTscObj = acquireTscObj(rid);
- if (pTscObj == NULL) {
- terrno = TSDB_CODE_TSC_DISCONNECTED;
- return terrno;
+ char *sql = "taos_load_table_info";
+ code = buildRequest(connId, sql, strlen(sql), NULL, false, &pRequest);
+ if (code != TSDB_CODE_SUCCESS) {
+ terrno = code;
+ goto _return;
}
+ STscObj* pTscObj = pRequest->pTscObj;
code = transferTableNameList(tableNameList, pTscObj->acctId, pTscObj->db, &catalogReq.pTableMeta);
if (code) {
goto _return;
@@ -950,36 +952,22 @@ int taos_load_table_info(TAOS *taos, const char *tableNameList) {
goto _return;
}
- char *sql = "taos_load_table_info";
- code = buildRequest(pTscObj, sql, strlen(sql), &pRequest);
- if (code != TSDB_CODE_SUCCESS) {
- terrno = code;
- goto _return;
- }
-
- SSyncQueryParam param = {0};
- tsem_init(¶m.sem, 0, 0);
- param.pRequest = pRequest;
-
SRequestConnInfo conn = {
.pTrans = pTscObj->pAppInfo->pTransporter, .requestId = pRequest->requestId, .requestObjRefId = pRequest->self};
conn.mgmtEps = getEpSet_s(&pTscObj->pAppInfo->mgmtEp);
- code = catalogAsyncGetAllMeta(pCtg, &conn, &catalogReq, syncCatalogFn, ¶m, NULL);
+ code = catalogAsyncGetAllMeta(pCtg, &conn, &catalogReq, syncCatalogFn, NULL, NULL);
if (code) {
goto _return;
}
- tsem_wait(¶m.sem);
+ SSyncQueryParam* pParam = pRequest->body.param;
+ tsem_wait(&pParam->sem);
_return:
-
taosArrayDestroy(catalogReq.pTableMeta);
destroyRequest(pRequest);
-
- releaseTscObj(rid);
-
return code;
}
diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c
index b6972e4670..6e689adf95 100644
--- a/source/client/src/clientSml.c
+++ b/source/client/src/clientSml.c
@@ -2442,22 +2442,15 @@ TAOS_RES* taos_schemaless_insert(TAOS* taos, char* lines[], int numLines, int pr
return NULL;
}
- int64_t rid = *(int64_t*)taos;
- STscObj* pTscObj = acquireTscObj(rid);
- if (NULL == pTscObj) {
- terrno = TSDB_CODE_TSC_DISCONNECTED;
- uError("SML:taos_schemaless_insert invalid taos");
- return NULL;
- }
-
- SRequestObj* request = (SRequestObj*)createRequest(pTscObj, TSDB_SQL_INSERT);
+ SRequestObj* request = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT);
if(!request){
- releaseTscObj(rid);
uError("SML:taos_schemaless_insert error request is null");
return NULL;
}
int batchs = 0;
+ STscObj* pTscObj = request->pTscObj;
+
pTscObj->schemalessType = 1;
SSmlMsgBuf msg = {ERROR_MSG_BUF_DEFAULT_SIZE, request->msgBuf};
@@ -2507,7 +2500,7 @@ TAOS_RES* taos_schemaless_insert(TAOS* taos, char* lines[], int numLines, int pr
batchs = ceil(((double)numLines) / LINE_BATCH);
for (int i = 0; i < batchs; ++i) {
- SRequestObj* req = (SRequestObj*)createRequest(pTscObj, TSDB_SQL_INSERT);
+ SRequestObj* req = (SRequestObj*)createRequest(pTscObj->id, TSDB_SQL_INSERT);
if(!req){
request->code = TSDB_CODE_OUT_OF_MEMORY;
uError("SML:taos_schemaless_insert error request is null");
@@ -2549,6 +2542,5 @@ end:
// ((STscObj *)taos)->schemalessType = 0;
pTscObj->schemalessType = 1;
uDebug("resultend:%s", request->msgBuf);
- releaseTscObj(rid);
return (TAOS_RES*)request;
}
diff --git a/source/client/src/clientStmt.c b/source/client/src/clientStmt.c
index 1e0f30695d..d653b8720f 100644
--- a/source/client/src/clientStmt.c
+++ b/source/client/src/clientStmt.c
@@ -5,6 +5,14 @@
#include "clientStmt.h"
+static int32_t stmtCreateRequest(STscStmt* pStmt) {
+ if (pStmt->exec.pRequest == NULL) {
+ return buildRequest(pStmt->taos->id, pStmt->sql.sqlStr, pStmt->sql.sqlLen, NULL, false, &pStmt->exec.pRequest);
+ } else {
+ return TSDB_CODE_SUCCESS;
+ }
+}
+
int32_t stmtSwitchStatus(STscStmt* pStmt, STMT_STATUS newStatus) {
int32_t code = 0;
@@ -217,9 +225,7 @@ int32_t stmtParseSql(STscStmt* pStmt) {
.getExecInfoFn = stmtGetExecInfo,
};
- if (NULL == pStmt->exec.pRequest) {
- STMT_ERR_RET(buildRequest(pStmt->taos, pStmt->sql.sqlStr, pStmt->sql.sqlLen, &pStmt->exec.pRequest));
- }
+ STMT_ERR_RET(stmtCreateRequest(pStmt));
STMT_ERR_RET(parseSql(pStmt->exec.pRequest, false, &pStmt->sql.pQuery, &stmtCb));
@@ -532,9 +538,7 @@ int stmtSetTbName(TAOS_STMT* stmt, const char* tbName) {
STMT_ERR_RET(TSDB_CODE_TSC_STMT_API_ERROR);
}
- if (NULL == pStmt->exec.pRequest) {
- STMT_ERR_RET(buildRequest(pStmt->taos, pStmt->sql.sqlStr, pStmt->sql.sqlLen, &pStmt->exec.pRequest));
- }
+ STMT_ERR_RET(stmtCreateRequest(pStmt));
STMT_ERR_RET(qCreateSName(&pStmt->bInfo.sname, tbName, pStmt->taos->acctId, pStmt->exec.pRequest->pDb,
pStmt->exec.pRequest->msgBuf, pStmt->exec.pRequest->msgBufLen));
@@ -625,9 +629,7 @@ int stmtBindBatch(TAOS_STMT* stmt, TAOS_MULTI_BIND* bind, int32_t colIdx) {
pStmt->exec.pRequest = NULL;
}
- if (NULL == pStmt->exec.pRequest) {
- STMT_ERR_RET(buildRequest(pStmt->taos, pStmt->sql.sqlStr, pStmt->sql.sqlLen, &pStmt->exec.pRequest));
- }
+ STMT_ERR_RET(stmtCreateRequest(pStmt));
if (pStmt->bInfo.needParse) {
STMT_ERR_RET(stmtParseSql(pStmt));
@@ -873,9 +875,7 @@ int stmtGetTagFields(TAOS_STMT* stmt, int* nums, TAOS_FIELD_E** fields) {
pStmt->exec.pRequest = NULL;
}
- if (NULL == pStmt->exec.pRequest) {
- STMT_ERR_RET(buildRequest(pStmt->taos, pStmt->sql.sqlStr, pStmt->sql.sqlLen, &pStmt->exec.pRequest));
- }
+ STMT_ERR_RET(stmtCreateRequest(pStmt));
if (pStmt->bInfo.needParse) {
STMT_ERR_RET(stmtParseSql(pStmt));
@@ -905,9 +905,7 @@ int stmtGetColFields(TAOS_STMT* stmt, int* nums, TAOS_FIELD_E** fields) {
pStmt->exec.pRequest = NULL;
}
- if (NULL == pStmt->exec.pRequest) {
- STMT_ERR_RET(buildRequest(pStmt->taos, pStmt->sql.sqlStr, pStmt->sql.sqlLen, &pStmt->exec.pRequest));
- }
+ STMT_ERR_RET(stmtCreateRequest(pStmt));
if (pStmt->bInfo.needParse) {
STMT_ERR_RET(stmtParseSql(pStmt));
@@ -933,10 +931,7 @@ int stmtGetParamNum(TAOS_STMT* stmt, int* nums) {
pStmt->exec.pRequest = NULL;
}
- if (NULL == pStmt->exec.pRequest) {
- STMT_ERR_RET(buildRequest(pStmt->taos, pStmt->sql.sqlStr, pStmt->sql.sqlLen, &pStmt->exec.pRequest));
- }
-
+ STMT_ERR_RET(stmtCreateRequest(pStmt));
if (pStmt->bInfo.needParse) {
STMT_ERR_RET(stmtParseSql(pStmt));
}
@@ -969,9 +964,7 @@ int stmtGetParam(TAOS_STMT* stmt, int idx, int* type, int* bytes) {
pStmt->exec.pRequest = NULL;
}
- if (NULL == pStmt->exec.pRequest) {
- STMT_ERR_RET(buildRequest(pStmt->taos, pStmt->sql.sqlStr, pStmt->sql.sqlLen, &pStmt->exec.pRequest));
- }
+ STMT_ERR_RET(stmtCreateRequest(pStmt));
if (pStmt->bInfo.needParse) {
STMT_ERR_RET(stmtParseSql(pStmt));
diff --git a/source/client/src/tmq.c b/source/client/src/tmq.c
index 652c1205fc..110b839216 100644
--- a/source/client/src/tmq.c
+++ b/source/client/src/tmq.c
@@ -901,6 +901,8 @@ tmq_t* tmq_consumer_new(tmq_conf_t* conf, char* errstr, int32_t errstrLen) {
tmq_t* pTmq = taosMemoryCalloc(1, sizeof(tmq_t));
if (pTmq == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ tscError("consumer %ld setup failed since %s, consumer group %s", pTmq->consumerId, terrstr(), pTmq->groupId);
return NULL;
}
@@ -917,6 +919,8 @@ tmq_t* tmq_consumer_new(tmq_conf_t* conf, char* errstr, int32_t errstrLen) {
pTmq->delayedTask = taosOpenQueue();
if (pTmq->clientTopics == NULL || pTmq->mqueue == NULL || pTmq->qall == NULL || pTmq->delayedTask == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ tscError("consumer %ld setup failed since %s, consumer group %s", pTmq->consumerId, terrstr(), pTmq->groupId);
goto FAIL;
}
@@ -943,12 +947,14 @@ tmq_t* tmq_consumer_new(tmq_conf_t* conf, char* errstr, int32_t errstrLen) {
// init semaphore
if (tsem_init(&pTmq->rspSem, 0, 0) != 0) {
+ tscError("consumer %ld setup failed since %s, consumer group %s", pTmq->consumerId, terrstr(), pTmq->groupId);
goto FAIL;
}
// init connection
pTmq->pTscObj = taos_connect_internal(conf->ip, user, pass, NULL, NULL, conf->port, CONN_TYPE__TMQ);
if (pTmq->pTscObj == NULL) {
+ tscError("consumer %ld setup failed since %s, consumer group %s", pTmq->consumerId, terrstr(), pTmq->groupId);
tsem_destroy(&pTmq->rspSem);
goto FAIL;
}
@@ -2275,13 +2281,7 @@ static int32_t taosCreateStb(TAOS* taos, void* meta, int32_t metaLen) {
int32_t code = TSDB_CODE_SUCCESS;
SRequestObj* pRequest = NULL;
- STscObj* pTscObj = acquireTscObj(*(int64_t*)taos);
- if (NULL == pTscObj) {
- code = TSDB_CODE_TSC_DISCONNECTED;
- goto end;
- }
-
- code = buildRequest(pTscObj, "", 0, &pRequest);
+ code = buildRequest(*(int64_t*)taos, "", 0, NULL, false, &pRequest);
if (code != TSDB_CODE_SUCCESS) {
goto end;
}
@@ -2321,6 +2321,8 @@ static int32_t taosCreateStb(TAOS* taos, void* meta, int32_t metaLen) {
pReq.suid = req.suid;
pReq.source = 1;
+ STscObj* pTscObj = pRequest->pTscObj;
+
SName tableName;
tNameExtractFullName(toName(pTscObj->acctId, pRequest->pDb, req.name, &tableName), pReq.name);
@@ -2359,13 +2361,7 @@ static int32_t taosDropStb(TAOS* taos, void* meta, int32_t metaLen) {
int32_t code = TSDB_CODE_SUCCESS;
SRequestObj* pRequest = NULL;
- STscObj* pTscObj = acquireTscObj(*(int64_t*)taos);
- if (NULL == pTscObj) {
- code = TSDB_CODE_TSC_DISCONNECTED;
- goto end;
- }
-
- code = buildRequest(pTscObj, "", 0, &pRequest);
+ code = buildRequest(*(int64_t*)taos, "", 0, NULL, false, &pRequest);
if (code != TSDB_CODE_SUCCESS) {
goto end;
}
@@ -2387,6 +2383,9 @@ static int32_t taosDropStb(TAOS* taos, void* meta, int32_t metaLen) {
pReq.igNotExists = true;
pReq.source = 1;
pReq.suid = req.suid;
+
+ STscObj* pTscObj = pRequest->pTscObj;
+
SName tableName;
tNameExtractFullName(toName(pTscObj->acctId, pRequest->pDb, req.name, &tableName), pReq.name);
@@ -2428,21 +2427,15 @@ static void destroyCreateTbReqBatch(void* data) {
taosArrayDestroy(pTbBatch->req.pArray);
}
-static int32_t taosCreateTable(TAOS* taos, void* meta, int32_t metaLen) {
- SVCreateTbBatchReq req = {0};
- SDecoder coder = {0};
- int32_t code = TSDB_CODE_SUCCESS;
- SRequestObj* pRequest = NULL;
- SQuery* pQuery = NULL;
- SHashObj* pVgroupHashmap = NULL;
- STscObj* pTscObj = acquireTscObj(*(int64_t*)taos);
+static int32_t taosCreateTable(TAOS *taos, void *meta, int32_t metaLen){
+ SVCreateTbBatchReq req = {0};
+ SDecoder coder = {0};
+ int32_t code = TSDB_CODE_SUCCESS;
+ SRequestObj *pRequest = NULL;
+ SQuery *pQuery = NULL;
+ SHashObj *pVgroupHashmap = NULL;
- if (NULL == pTscObj) {
- code = TSDB_CODE_TSC_DISCONNECTED;
- goto end;
- }
-
- code = buildRequest(pTscObj, "", 0, &pRequest);
+ code = buildRequest(*(int64_t*) taos, "", 0, NULL, false, &pRequest);
if (code != TSDB_CODE_SUCCESS) {
goto end;
}
@@ -2460,8 +2453,10 @@ static int32_t taosCreateTable(TAOS* taos, void* meta, int32_t metaLen) {
goto end;
}
- SVCreateTbReq* pCreateReq = NULL;
- SCatalog* pCatalog = NULL;
+ STscObj* pTscObj = pRequest->pTscObj;
+
+ SVCreateTbReq *pCreateReq = NULL;
+ SCatalog* pCatalog = NULL;
code = catalogGetHandle(pTscObj->pAppInfo->clusterId, &pCatalog);
if (code != TSDB_CODE_SUCCESS) {
goto end;
@@ -2545,21 +2540,15 @@ static void destroyDropTbReqBatch(void* data) {
taosArrayDestroy(pTbBatch->req.pArray);
}
-static int32_t taosDropTable(TAOS* taos, void* meta, int32_t metaLen) {
- SVDropTbBatchReq req = {0};
- SDecoder coder = {0};
- int32_t code = TSDB_CODE_SUCCESS;
- SRequestObj* pRequest = NULL;
- SQuery* pQuery = NULL;
- SHashObj* pVgroupHashmap = NULL;
- STscObj* pTscObj = acquireTscObj(*(int64_t*)taos);
+static int32_t taosDropTable(TAOS *taos, void *meta, int32_t metaLen){
+ SVDropTbBatchReq req = {0};
+ SDecoder coder = {0};
+ int32_t code = TSDB_CODE_SUCCESS;
+ SRequestObj *pRequest = NULL;
+ SQuery *pQuery = NULL;
+ SHashObj *pVgroupHashmap = NULL;
- if (NULL == pTscObj) {
- code = TSDB_CODE_TSC_DISCONNECTED;
- goto end;
- }
-
- code = buildRequest(pTscObj, "", 0, &pRequest);
+ code = buildRequest(*(int64_t*)taos, "", 0, NULL, false, &pRequest);
if (code != TSDB_CODE_SUCCESS) {
goto end;
}
@@ -2577,8 +2566,10 @@ static int32_t taosDropTable(TAOS* taos, void* meta, int32_t metaLen) {
goto end;
}
- SVDropTbReq* pDropReq = NULL;
- SCatalog* pCatalog = NULL;
+ STscObj* pTscObj = pRequest->pTscObj;
+
+ SVDropTbReq *pDropReq = NULL;
+ SCatalog *pCatalog = NULL;
code = catalogGetHandle(pTscObj->pAppInfo->clusterId, &pCatalog);
if (code != TSDB_CODE_SUCCESS) {
goto end;
@@ -2649,22 +2640,17 @@ end:
return code;
}
-static int32_t taosAlterTable(TAOS* taos, void* meta, int32_t metaLen) {
- SVAlterTbReq req = {0};
- SDecoder coder = {0};
- int32_t code = TSDB_CODE_SUCCESS;
- SRequestObj* pRequest = NULL;
- SQuery* pQuery = NULL;
- SArray* pArray = NULL;
- SVgDataBlocks* pVgData = NULL;
- STscObj* pTscObj = acquireTscObj(*(int64_t*)taos);
+static int32_t taosAlterTable(TAOS *taos, void *meta, int32_t metaLen){
+ SVAlterTbReq req = {0};
+ SDecoder coder = {0};
+ int32_t code = TSDB_CODE_SUCCESS;
+ SRequestObj *pRequest = NULL;
+ SQuery *pQuery = NULL;
+ SArray *pArray = NULL;
+ SVgDataBlocks *pVgData = NULL;
- if (NULL == pTscObj) {
- code = TSDB_CODE_TSC_DISCONNECTED;
- goto end;
- }
- code = buildRequest(pTscObj, "", 0, &pRequest);
+ code = buildRequest(*(int64_t*) taos, "", 0, NULL, false, &pRequest);
if (code != TSDB_CODE_SUCCESS) {
goto end;
}
@@ -2687,6 +2673,7 @@ static int32_t taosAlterTable(TAOS* taos, void* meta, int32_t metaLen) {
goto end;
}
+ STscObj* pTscObj = pRequest->pTscObj;
SCatalog* pCatalog = NULL;
code = catalogGetHandle(pTscObj->pAppInfo->clusterId, &pCatalog);
if (code != TSDB_CODE_SUCCESS) {
diff --git a/source/common/src/tdatablock.c b/source/common/src/tdatablock.c
index 4e17a9aea0..3bb829f77a 100644
--- a/source/common/src/tdatablock.c
+++ b/source/common/src/tdatablock.c
@@ -1746,7 +1746,7 @@ char* dumpBlockData(SSDataBlock* pDataBlock, const char* flag, char** pDataBuf)
for (int32_t k = 0; k < colNum; k++) {
SColumnInfoData* pColInfoData = taosArrayGet(pDataBlock->pDataBlock, k);
void* var = POINTER_SHIFT(pColInfoData->pData, j * pColInfoData->info.bytes);
- if (colDataIsNull(pColInfoData, rows, j, NULL)) {
+ if (colDataIsNull(pColInfoData, rows, j, NULL) || !var) {
len += snprintf(dumpBuf + len, size - len, " %15s |", "NULL");
if (len >= size -1) return dumpBuf;
continue;
diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c
index ab5ce3742a..496c7beb47 100644
--- a/source/common/src/tglobal.c
+++ b/source/common/src/tglobal.c
@@ -55,7 +55,7 @@ int32_t tsNumOfMnodeQueryThreads = 2;
int32_t tsNumOfMnodeFetchThreads = 1;
int32_t tsNumOfMnodeReadThreads = 1;
int32_t tsNumOfVnodeQueryThreads = 2;
-int32_t tsNumOfVnodeFetchThreads = 1;
+int32_t tsNumOfVnodeFetchThreads = 4;
int32_t tsNumOfVnodeWriteThreads = 2;
int32_t tsNumOfVnodeSyncThreads = 2;
int32_t tsNumOfVnodeMergeThreads = 2;
@@ -190,7 +190,6 @@ int32_t tsMqRebalanceInterval = 2;
int32_t tsTtlUnit = 86400;
int32_t tsTtlPushInterval = 60;
-
void taosAddDataDir(int32_t index, char *v1, int32_t level, int32_t primary) {
tstrncpy(tsDiskCfg[index].dir, v1, TSDB_FILENAME_LEN);
tsDiskCfg[index].level = level;
@@ -292,15 +291,14 @@ int32_t taosAddClientLogCfg(SConfig *pCfg) {
if (cfgAddInt32(pCfg, "numOfLogLines", tsNumOfLogLines, 1000, 2000000000, 1) != 0) return -1;
if (cfgAddBool(pCfg, "asyncLog", tsAsyncLog, 1) != 0) return -1;
if (cfgAddInt32(pCfg, "logKeepDays", 0, -365000, 365000, 1) != 0) return -1;
- if (cfgAddInt32(pCfg, "cDebugFlag", cDebugFlag, 0, 255, 1) != 0) return -1;
+ if (cfgAddInt32(pCfg, "debugFlag", 0, 0, 255, 1) != 0) return -1;
+ if (cfgAddInt32(pCfg, "simDebugFlag", 143, 0, 255, 1) != 0) return -1;
+ if (cfgAddInt32(pCfg, "tmrDebugFlag", tmrDebugFlag, 0, 255, 1) != 0) return -1;
if (cfgAddInt32(pCfg, "uDebugFlag", uDebugFlag, 0, 255, 1) != 0) return -1;
if (cfgAddInt32(pCfg, "rpcDebugFlag", rpcDebugFlag, 0, 255, 1) != 0) return -1;
- if (cfgAddInt32(pCfg, "qDebugFlag", qDebugFlag, 0, 255, 1) != 0) return -1;
- if (cfgAddInt32(pCfg, "tmrDebugFlag", tmrDebugFlag, 0, 255, 1) != 0) return -1;
if (cfgAddInt32(pCfg, "jniDebugFlag", jniDebugFlag, 0, 255, 1) != 0) return -1;
- if (cfgAddInt32(pCfg, "simDebugFlag", 143, 0, 255, 1) != 0) return -1;
- if (cfgAddInt32(pCfg, "debugFlag", 0, 0, 255, 1) != 0) return -1;
- if (cfgAddInt32(pCfg, "idxDebugFlag", idxDebugFlag, 0, 255, 1) != 0) return -1;
+ if (cfgAddInt32(pCfg, "qDebugFlag", qDebugFlag, 0, 255, 1) != 0) return -1;
+ if (cfgAddInt32(pCfg, "cDebugFlag", cDebugFlag, 0, 255, 1) != 0) return -1;
return 0;
}
@@ -308,7 +306,6 @@ static int32_t taosAddServerLogCfg(SConfig *pCfg) {
if (cfgAddInt32(pCfg, "dDebugFlag", dDebugFlag, 0, 255, 0) != 0) return -1;
if (cfgAddInt32(pCfg, "vDebugFlag", vDebugFlag, 0, 255, 0) != 0) return -1;
if (cfgAddInt32(pCfg, "mDebugFlag", mDebugFlag, 0, 255, 0) != 0) return -1;
- if (cfgAddInt32(pCfg, "qDebugFlag", qDebugFlag, 0, 255, 0) != 0) return -1;
if (cfgAddInt32(pCfg, "wDebugFlag", wDebugFlag, 0, 255, 0) != 0) return -1;
if (cfgAddInt32(pCfg, "sDebugFlag", sDebugFlag, 0, 255, 0) != 0) return -1;
if (cfgAddInt32(pCfg, "tsdbDebugFlag", tsdbDebugFlag, 0, 255, 0) != 0) return -1;
@@ -470,7 +467,7 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
if (cfgAddInt32(pCfg, "transPullupInterval", tsTransPullupInterval, 1, 10000, 1) != 0) return -1;
if (cfgAddInt32(pCfg, "mqRebalanceInterval", tsMqRebalanceInterval, 1, 10000, 1) != 0) return -1;
- if (cfgAddInt32(pCfg, "ttlUnit", tsTtlUnit, 1, 86400*365, 1) != 0) return -1;
+ if (cfgAddInt32(pCfg, "ttlUnit", tsTtlUnit, 1, 86400 * 365, 1) != 0) return -1;
if (cfgAddInt32(pCfg, "ttlPushInterval", tsTtlPushInterval, 1, 10000, 1) != 0) return -1;
if (cfgAddBool(pCfg, "udf", tsStartUdfd, 0) != 0) return -1;
@@ -485,20 +482,18 @@ static void taosSetClientLogCfg(SConfig *pCfg) {
tsNumOfLogLines = cfgGetItem(pCfg, "numOfLogLines")->i32;
tsAsyncLog = cfgGetItem(pCfg, "asyncLog")->bval;
tsLogKeepDays = cfgGetItem(pCfg, "logKeepDays")->i32;
- cDebugFlag = cfgGetItem(pCfg, "cDebugFlag")->i32;
- uDebugFlag = cfgGetItem(pCfg, "uDebugFlag")->i32;
- qDebugFlag = cfgGetItem(pCfg, "qDebugFlag")->i32;
- rpcDebugFlag = cfgGetItem(pCfg, "rpcDebugFlag")->i32;
tmrDebugFlag = cfgGetItem(pCfg, "tmrDebugFlag")->i32;
+ uDebugFlag = cfgGetItem(pCfg, "uDebugFlag")->i32;
jniDebugFlag = cfgGetItem(pCfg, "jniDebugFlag")->i32;
- idxDebugFlag = cfgGetItem(pCfg, "idxDebugFlag")->i32;
+ rpcDebugFlag = cfgGetItem(pCfg, "rpcDebugFlag")->i32;
+ qDebugFlag = cfgGetItem(pCfg, "qDebugFlag")->i32;
+ cDebugFlag = cfgGetItem(pCfg, "cDebugFlag")->i32;
}
static void taosSetServerLogCfg(SConfig *pCfg) {
dDebugFlag = cfgGetItem(pCfg, "dDebugFlag")->i32;
vDebugFlag = cfgGetItem(pCfg, "vDebugFlag")->i32;
mDebugFlag = cfgGetItem(pCfg, "mDebugFlag")->i32;
- qDebugFlag = cfgGetItem(pCfg, "qDebugFlag")->i32;
wDebugFlag = cfgGetItem(pCfg, "wDebugFlag")->i32;
sDebugFlag = cfgGetItem(pCfg, "sDebugFlag")->i32;
tsdbDebugFlag = cfgGetItem(pCfg, "tsdbDebugFlag")->i32;
@@ -636,7 +631,7 @@ static int32_t taosSetServerCfg(SConfig *pCfg) {
return 0;
}
-int32_t taosSetCfg(SConfig *pCfg, char* name) {
+int32_t taosSetCfg(SConfig *pCfg, char *name) {
int32_t len = strlen(name);
char lowcaseName[CFG_NAME_MAX_LEN + 1] = {0};
strntolower(lowcaseName, name, TMIN(CFG_NAME_MAX_LEN, len));
@@ -666,7 +661,7 @@ int32_t taosSetCfg(SConfig *pCfg, char* name) {
tsCompressColData = cfgGetItem(pCfg, "compressColData")->i32;
} else if (strcasecmp("countAlwaysReturnValue", name) == 0) {
tsCountAlwaysReturnValue = cfgGetItem(pCfg, "countAlwaysReturnValue")->i32;
- } else if (strcasecmp("cDebugFlag", name) == 0) {
+ } else if (strcasecmp("cDebugFlag", name) == 0) {
cDebugFlag = cfgGetItem(pCfg, "cDebugFlag")->i32;
}
break;
@@ -691,10 +686,10 @@ int32_t taosSetCfg(SConfig *pCfg, char* name) {
tstrncpy(tsLocalFqdn, cfgGetItem(pCfg, "fqdn")->str, TSDB_FQDN_LEN);
tsServerPort = (uint16_t)cfgGetItem(pCfg, "serverPort")->i32;
snprintf(tsLocalEp, sizeof(tsLocalEp), "%s:%u", tsLocalFqdn, tsServerPort);
-
+
char defaultFirstEp[TSDB_EP_LEN] = {0};
snprintf(defaultFirstEp, TSDB_EP_LEN, "%s:%u", tsLocalFqdn, tsServerPort);
-
+
SConfigItem *pFirstEpItem = cfgGetItem(pCfg, "firstEp");
SEp firstEp = {0};
taosGetFqdnPortFromEp(strlen(pFirstEpItem->str) == 0 ? defaultFirstEp : pFirstEpItem->str, &firstEp);
@@ -704,10 +699,10 @@ int32_t taosSetCfg(SConfig *pCfg, char* name) {
tstrncpy(tsLocalFqdn, cfgGetItem(pCfg, "fqdn")->str, TSDB_FQDN_LEN);
tsServerPort = (uint16_t)cfgGetItem(pCfg, "serverPort")->i32;
snprintf(tsLocalEp, sizeof(tsLocalEp), "%s:%u", tsLocalFqdn, tsServerPort);
-
+
char defaultFirstEp[TSDB_EP_LEN] = {0};
snprintf(defaultFirstEp, TSDB_EP_LEN, "%s:%u", tsLocalFqdn, tsServerPort);
-
+
SConfigItem *pFirstEpItem = cfgGetItem(pCfg, "firstEp");
SEp firstEp = {0};
taosGetFqdnPortFromEp(strlen(pFirstEpItem->str) == 0 ? defaultFirstEp : pFirstEpItem->str, &firstEp);
@@ -778,7 +773,7 @@ int32_t taosSetCfg(SConfig *pCfg, char* name) {
} else if (strcasecmp("minSlidingTime", name) == 0) {
tsMinSlidingTime = cfgGetItem(pCfg, "minSlidingTime")->i32;
} else if (strcasecmp("minIntervalTime", name) == 0) {
- tsMinIntervalTime = cfgGetItem(pCfg, "minIntervalTime")->i32;
+ tsMinIntervalTime = cfgGetItem(pCfg, "minIntervalTime")->i32;
} else if (strcasecmp("minimalLogDirGB", name) == 0) {
tsLogSpace.reserved = cfgGetItem(pCfg, "minimalLogDirGB")->fval;
}
@@ -924,10 +919,10 @@ int32_t taosSetCfg(SConfig *pCfg, char* name) {
tstrncpy(tsLocalFqdn, cfgGetItem(pCfg, "fqdn")->str, TSDB_FQDN_LEN);
tsServerPort = (uint16_t)cfgGetItem(pCfg, "serverPort")->i32;
snprintf(tsLocalEp, sizeof(tsLocalEp), "%s:%u", tsLocalFqdn, tsServerPort);
-
+
char defaultFirstEp[TSDB_EP_LEN] = {0};
snprintf(defaultFirstEp, TSDB_EP_LEN, "%s:%u", tsLocalFqdn, tsServerPort);
-
+
SConfigItem *pFirstEpItem = cfgGetItem(pCfg, "firstEp");
SEp firstEp = {0};
taosGetFqdnPortFromEp(strlen(pFirstEpItem->str) == 0 ? defaultFirstEp : pFirstEpItem->str, &firstEp);
@@ -999,14 +994,13 @@ int32_t taosSetCfg(SConfig *pCfg, char* name) {
break;
}
default:
- terrno = TSDB_CODE_CFG_NOT_FOUND;
+ terrno = TSDB_CODE_CFG_NOT_FOUND;
return -1;
}
-
+
return 0;
}
-
int32_t taosCreateLog(const char *logname, int32_t logFileNum, const char *cfgDir, const char **envCmd,
const char *envFile, char *apolloUrl, SArray *pArgs, bool tsc) {
if (tsCfg == NULL) osDefaultInit();
diff --git a/source/dnode/mnode/impl/src/mndConsumer.c b/source/dnode/mnode/impl/src/mndConsumer.c
index 5e7c19ce6a..27b785f4d2 100644
--- a/source/dnode/mnode/impl/src/mndConsumer.c
+++ b/source/dnode/mnode/impl/src/mndConsumer.c
@@ -15,11 +15,11 @@
#define _DEFAULT_SOURCE
#include "mndConsumer.h"
-#include "mndPrivilege.h"
#include "mndDb.h"
#include "mndDnode.h"
#include "mndMnode.h"
#include "mndOffset.h"
+#include "mndPrivilege.h"
#include "mndShow.h"
#include "mndStb.h"
#include "mndSubscribe.h"
@@ -435,17 +435,6 @@ static int32_t mndProcessSubscribeReq(SRpcMsg *pMsg) {
goto SUBSCRIBE_OVER;
}
-#if 0
- // ref topic to prevent drop
- // TODO make topic complete
- SMqTopicObj topicObj = {0};
- memcpy(&topicObj, pTopic, sizeof(SMqTopicObj));
- topicObj.refConsumerCnt = pTopic->refConsumerCnt + 1;
- mInfo("subscribe topic %s by consumer:%" PRId64 ",cgroup %s, refcnt %d", pTopic->name, consumerId, cgroup,
- topicObj.refConsumerCnt);
- if (mndSetTopicCommitLogs(pMnode, pTrans, &topicObj) != 0) goto SUBSCRIBE_OVER;
-#endif
-
mndReleaseTopic(pMnode, pTopic);
}
@@ -472,8 +461,8 @@ static int32_t mndProcessSubscribeReq(SRpcMsg *pMsg) {
int32_t status = atomic_load_32(&pConsumerOld->status);
- mInfo("receive subscribe request from old consumer:%" PRId64 ", current status: %s", consumerId,
- mndConsumerStatusName(status));
+ mInfo("receive subscribe request from existing consumer:%" PRId64 ", current status: %s, subscribe topic num: %d",
+ consumerId, mndConsumerStatusName(status), newTopicNum);
if (status != MQ_CONSUMER_STATUS__READY) {
terrno = TSDB_CODE_MND_CONSUMER_NOT_READY;
@@ -849,12 +838,15 @@ static int32_t mndRetrieveConsumer(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *
pShow->pIter = sdbFetch(pSdb, SDB_CONSUMER, pShow->pIter, (void **)&pConsumer);
if (pShow->pIter == NULL) break;
if (taosArrayGetSize(pConsumer->assignedTopics) == 0) {
+ mDebug("showing consumer %ld no assigned topic, skip", pConsumer->consumerId);
sdbRelease(pSdb, pConsumer);
continue;
}
taosRLockLatch(&pConsumer->lock);
+ mDebug("showing consumer %ld", pConsumer->consumerId);
+
int32_t topicSz = taosArrayGetSize(pConsumer->assignedTopics);
bool hasTopic = true;
if (topicSz == 0) {
diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c
index ae0f7f56a2..3873073f03 100644
--- a/source/dnode/vnode/src/tq/tq.c
+++ b/source/dnode/vnode/src/tq/tq.c
@@ -512,9 +512,6 @@ int32_t tqProcessVgChangeReq(STQ* pTq, char* msg, int32_t msgLen) {
pHandle->execHandle.execDb.pFilterOutTbUid =
taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
} else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) {
- for (int32_t i = 0; i < 5; i++) {
- pHandle->execHandle.pExecReader[i] = tqOpenReader(pTq->pVnode);
- }
pHandle->execHandle.execTb.suid = req.suid;
SArray* tbUidList = taosArrayInit(0, sizeof(int64_t));
vnodeGetCtbIdList(pTq->pVnode, req.suid, tbUidList);
@@ -524,6 +521,7 @@ int32_t tqProcessVgChangeReq(STQ* pTq, char* msg, int32_t msgLen) {
tqDebug("vgId:%d, idx %d, uid:%" PRId64, TD_VID(pTq->pVnode), i, tbUid);
}
for (int32_t i = 0; i < 5; i++) {
+ pHandle->execHandle.pExecReader[i] = tqOpenReader(pTq->pVnode);
tqReaderSetTbUidList(pHandle->execHandle.pExecReader[i], tbUidList);
}
taosArrayDestroy(tbUidList);
diff --git a/source/dnode/vnode/src/tq/tqExec.c b/source/dnode/vnode/src/tq/tqExec.c
index 3ee274ced1..54e46e7b9a 100644
--- a/source/dnode/vnode/src/tq/tqExec.c
+++ b/source/dnode/vnode/src/tq/tqExec.c
@@ -174,28 +174,9 @@ int32_t tqScanSnapshot(STQ* pTq, const STqExecHandle* pExec, SMqDataRsp* pRsp, S
#endif
int32_t tqLogScanExec(STQ* pTq, STqExecHandle* pExec, SSubmitReq* pReq, SMqDataRsp* pRsp, int32_t workerId) {
- if (pExec->subType == TOPIC_SUB_TYPE__COLUMN) {
- qTaskInfo_t task = pExec->execCol.task[workerId];
- ASSERT(task);
- qSetStreamInput(task, pReq, STREAM_INPUT__DATA_SUBMIT, false);
- while (1) {
- SSDataBlock* pDataBlock = NULL;
- uint64_t ts = 0;
- if (qExecTask(task, &pDataBlock, &ts) < 0) {
- ASSERT(0);
- }
- if (pDataBlock == NULL) break;
+ ASSERT(pExec->subType != TOPIC_SUB_TYPE__COLUMN);
- ASSERT(pDataBlock->info.rows != 0);
-
- tqAddBlockDataToRsp(pDataBlock, pRsp);
- if (pRsp->withTbName) {
- int64_t uid = pExec->pExecReader[workerId]->msgIter.uid;
- tqAddTbNameToRsp(pTq, uid, pRsp);
- }
- pRsp->blockNum++;
- }
- } else if (pExec->subType == TOPIC_SUB_TYPE__TABLE) {
+ if (pExec->subType == TOPIC_SUB_TYPE__TABLE) {
pRsp->withSchema = 1;
STqReader* pReader = pExec->pExecReader[workerId];
tqReaderSetDataMsg(pReader, pReq, 0);
@@ -232,9 +213,11 @@ int32_t tqLogScanExec(STQ* pTq, STqExecHandle* pExec, SSubmitReq* pReq, SMqDataR
pRsp->blockNum++;
}
}
+
if (pRsp->blockNum == 0) {
pRsp->skipLogNum++;
return -1;
}
+
return 0;
}
diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c
index 52846d8e12..2a3b61605a 100644
--- a/source/dnode/vnode/src/tsdb/tsdbRead.c
+++ b/source/dnode/vnode/src/tsdb/tsdbRead.c
@@ -59,7 +59,6 @@ typedef struct SBlockLoadSuppInfo {
SColumnDataAgg tsColAgg;
SColumnDataAgg** plist;
int16_t* colIds; // column ids for loading file block data
- int32_t* slotIds; // colId to slotId
char** buildBuf; // build string tmp buffer, todo remove it later after all string format being updated.
} SBlockLoadSuppInfo;
@@ -183,7 +182,6 @@ static SHashObj* createDataBlockScanInfo(STsdbReader* pTsdbReader, const STableK
return NULL;
}
- // todo apply the lastkey of table check to avoid to load header file
for (int32_t j = 0; j < numOfTables; ++j) {
STableBlockScanInfo info = {.lastKey = 0, .uid = idList[j].uid};
if (ASCENDING_TRAVERSE(pTsdbReader->order)) {
@@ -218,6 +216,30 @@ static void resetDataBlockScanInfo(SHashObj* pTableMap) {
}
}
+static void destroyBlockScanInfo(SHashObj* pTableMap) {
+ STableBlockScanInfo* p = NULL;
+
+ while ((p = taosHashIterate(pTableMap, p)) != NULL) {
+ p->iterInit = false;
+ p->iiter.hasVal = false;
+
+ if (p->iter.iter != NULL) {
+ tsdbTbDataIterDestroy(p->iter.iter);
+ p->iter.iter = NULL;
+ }
+
+ if (p->iiter.iter != NULL) {
+ tsdbTbDataIterDestroy(p->iiter.iter);
+ p->iiter.iter = NULL;
+ }
+
+ taosArrayDestroy(p->delSkyline);
+ p->delSkyline = NULL;
+ }
+
+ taosHashCleanup(pTableMap);
+}
+
static bool isEmptyQueryTimeWindow(STimeWindow* pWindow) {
ASSERT(pWindow != NULL);
return pWindow->skey > pWindow->ekey;
@@ -265,6 +287,10 @@ static int32_t initFilesetIterator(SFilesetIter* pIter, const STsdbFSState* pFSt
return TSDB_CODE_SUCCESS;
}
+static void cleanupFilesetIterator(SFilesetIter* pIter) {
+ taosArrayDestroy(pIter->pFileList);
+}
+
static bool filesetIteratorNext(SFilesetIter* pIter, STsdbReader* pReader) {
bool asc = ASCENDING_TRAVERSE(pIter->order);
int32_t step = asc ? 1 : -1;
@@ -318,7 +344,15 @@ static void resetDataBlockIterator(SDataBlockIter* pIter, int32_t order) {
pIter->order = order;
pIter->index = -1;
pIter->numOfBlocks = -1;
- pIter->blockList = taosArrayInit(4, sizeof(SFileDataBlockInfo));
+ if (pIter->blockList == NULL) {
+ pIter->blockList = taosArrayInit(4, sizeof(SFileDataBlockInfo));
+ } else {
+ taosArrayClear(pIter->blockList);
+ }
+}
+
+static void cleanupDataBlockIterator(SDataBlockIter* pIter) {
+ taosArrayDestroy(pIter->blockList);
}
static void initReaderStatus(SReaderStatus* pStatus) {
@@ -2520,6 +2554,7 @@ void doMergeMultiRows(TSDBROW* pRow, uint64_t uid, SIterInfo* pIter, SArray* pDe
tRowMergerInit(&merge, pRow, pReader->pSchema);
doMergeRowsInBuf(pIter, k.ts, pDelList, &merge, pReader);
tRowMergerGetRow(&merge, pTSRow);
+ tRowMergerClear(&merge);
}
void doMergeMemIMemRows(TSDBROW* pRow, TSDBROW* piRow, STableBlockScanInfo* pBlockScanInfo, STsdbReader* pReader,
@@ -2656,6 +2691,7 @@ int32_t buildDataBlockFromBufImpl(STableBlockScanInfo* pBlockScanInfo, int64_t e
}
doAppendOneRow(pBlock, pReader, pTSRow);
+ taosMemoryFree(pTSRow);
// no data in buffer, return immediately
if (!(pBlockScanInfo->iter.hasVal || pBlockScanInfo->iiter.hasVal)) {
@@ -2783,11 +2819,24 @@ void tsdbReaderClose(STsdbReader* pReader) {
return;
}
- blockDataDestroy(pReader->pResBlock);
- taosMemoryFreeClear(pReader->suppInfo.plist);
+ SBlockLoadSuppInfo* pSupInfo = &pReader->suppInfo;
+
+ taosMemoryFreeClear(pSupInfo->plist);
+ taosMemoryFree(pSupInfo->colIds);
+
+ taosArrayDestroy(pSupInfo->pColAgg);
+ for(int32_t i = 0; i < blockDataGetNumOfCols(pReader->pResBlock); ++i) {
+ if (pSupInfo->buildBuf[i] != NULL) {
+ taosMemoryFreeClear(pSupInfo->buildBuf[i]);
+ }
+ }
+ taosMemoryFree(pSupInfo->buildBuf);
+
+ cleanupFilesetIterator(&pReader->status.fileIter);
+ cleanupDataBlockIterator(&pReader->status.blockIter);
+ destroyBlockScanInfo(pReader->status.pTableMap);
+ blockDataDestroy(pReader->pResBlock);
- taosArrayDestroy(pReader->suppInfo.pColAgg);
- taosMemoryFree(pReader->suppInfo.slotIds);
#if 0
// if (pReader->status.pTableScanInfo != NULL) {
diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c
index d49c307233..97ce8eaab7 100644
--- a/source/dnode/vnode/src/vnd/vnodeSync.c
+++ b/source/dnode/vnode/src/vnd/vnodeSync.c
@@ -450,42 +450,81 @@ static void vnodeSyncRollBackMsg(SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta
syncUtilState2String(cbMeta.state), pMsg->msgType, TMSG_INFO(pMsg->msgType));
}
+#define USE_TSDB_SNAPSHOT
+
static int32_t vnodeSnapshotStartRead(struct SSyncFSM *pFsm, void *pParam, void **ppReader) {
+#ifdef USE_TSDB_SNAPSHOT
SVnode *pVnode = pFsm->data;
SSnapshotParam *pSnapshotParam = pParam;
int32_t code = vnodeSnapReaderOpen(pVnode, pSnapshotParam->start, pSnapshotParam->end, (SVSnapReader **)ppReader);
return code;
+#else
+ *ppReader = taosMemoryMalloc(32);
+ return 0;
+#endif
}
static int32_t vnodeSnapshotStopRead(struct SSyncFSM *pFsm, void *pReader) {
+#ifdef USE_TSDB_SNAPSHOT
SVnode *pVnode = pFsm->data;
int32_t code = vnodeSnapReaderClose(pReader);
return code;
+#else
+ taosMemoryFree(pReader);
+ return 0;
+#endif
}
static int32_t vnodeSnapshotDoRead(struct SSyncFSM *pFsm, void *pReader, void **ppBuf, int32_t *len) {
+#ifdef USE_TSDB_SNAPSHOT
SVnode *pVnode = pFsm->data;
int32_t code = vnodeSnapRead(pReader, (uint8_t **)ppBuf, len);
return code;
+#else
+ static int32_t times = 0;
+ if (times++ < 5) {
+ *len = 64;
+ *ppBuf = taosMemoryMalloc(*len);
+ snprintf(*ppBuf, *len, "snapshot block %d", times);
+ } else {
+ *len = 0;
+ *ppBuf = NULL;
+ }
+ return 0;
+#endif
}
static int32_t vnodeSnapshotStartWrite(struct SSyncFSM *pFsm, void *pParam, void **ppWriter) {
+#ifdef USE_TSDB_SNAPSHOT
SVnode *pVnode = pFsm->data;
SSnapshotParam *pSnapshotParam = pParam;
int32_t code = vnodeSnapWriterOpen(pVnode, pSnapshotParam->start, pSnapshotParam->end, (SVSnapWriter **)ppWriter);
return code;
+#else
+ *ppWriter = taosMemoryMalloc(32);
+ return 0;
+#endif
}
static int32_t vnodeSnapshotStopWrite(struct SSyncFSM *pFsm, void *pWriter, bool isApply) {
+#ifdef USE_TSDB_SNAPSHOT
SVnode *pVnode = pFsm->data;
int32_t code = vnodeSnapWriterClose(pWriter, !isApply);
return code;
+#else
+ taosMemoryFree(pWriter);
+ return 0;
+#endif
}
static int32_t vnodeSnapshotDoWrite(struct SSyncFSM *pFsm, void *pWriter, void *pBuf, int32_t len) {
+#ifdef USE_TSDB_SNAPSHOT
SVnode *pVnode = pFsm->data;
int32_t code = vnodeSnapWrite(pWriter, pBuf, len);
return code;
+#else
+ return 0;
+#endif
}
static SSyncFSM *vnodeSyncMakeFsm(SVnode *pVnode) {
@@ -509,7 +548,8 @@ static SSyncFSM *vnodeSyncMakeFsm(SVnode *pVnode) {
int32_t vnodeSyncOpen(SVnode *pVnode, char *path) {
SSyncInfo syncInfo = {
- .snapshotStrategy = SYNC_STRATEGY_NO_SNAPSHOT,
+ .snapshotStrategy = SYNC_STRATEGY_WAL_FIRST,
+ //.snapshotStrategy = SYNC_STRATEGY_NO_SNAPSHOT,
.batchSize = 10,
.vgId = pVnode->config.vgId,
.isStandBy = pVnode->config.standby,
diff --git a/source/libs/executor/inc/executil.h b/source/libs/executor/inc/executil.h
index 2c8fbe9206..f9aba30a46 100644
--- a/source/libs/executor/inc/executil.h
+++ b/source/libs/executor/inc/executil.h
@@ -126,4 +126,6 @@ void cleanupQueryTableDataCond(SQueryTableDataCond* pCond);
int32_t convertFillType(int32_t mode);
+int32_t resultrowComparAsc(const void* p1, const void* p2);
+
#endif // TDENGINE_QUERYUTIL_H
diff --git a/source/libs/executor/inc/executorimpl.h b/source/libs/executor/inc/executorimpl.h
index 8511a88e1c..72efaa165d 100644
--- a/source/libs/executor/inc/executorimpl.h
+++ b/source/libs/executor/inc/executorimpl.h
@@ -481,7 +481,7 @@ typedef struct SStreamFinalIntervalOperatorInfo {
// SOptrBasicInfo should be first, SAggSupporter should be second for stream encode
SOptrBasicInfo binfo; // basic info
SAggSupporter aggSup; // aggregate supporter
-
+ SExprSupp scalarSupp; // supporter for perform scalar function
SGroupResInfo groupResInfo; // multiple results build supporter
SInterval interval; // interval info
int32_t primaryTsIndex; // primary time stamp slot id from result of downstream operator.
@@ -630,6 +630,7 @@ typedef struct SStateWindowInfo {
typedef struct SStreamSessionAggOperatorInfo {
SOptrBasicInfo binfo;
SStreamAggSupporter streamAggSup;
+ SExprSupp scalarSupp; // supporter for perform scalar function
SGroupResInfo groupResInfo;
int64_t gap; // session window gap
int32_t primaryTsIndex; // primary timestamp slot id
@@ -680,11 +681,12 @@ typedef struct SStateWindowOperatorInfo {
typedef struct SStreamStateAggOperatorInfo {
SOptrBasicInfo binfo;
SStreamAggSupporter streamAggSup;
+ SExprSupp scalarSupp; // supporter for perform scalar function
SGroupResInfo groupResInfo;
int32_t primaryTsIndex; // primary timestamp slot id
int32_t order; // current SSDataBlock scan order
STimeWindowAggSupp twAggSup;
- SColumn stateCol; // start row index
+ SColumn stateCol;
SqlFunctionCtx* pDummyCtx; // for combine
SSDataBlock* pDelRes;
SHashObj* pSeDeleted;
diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c
index e3579f9dcb..adbfa2c4ba 100644
--- a/source/libs/executor/src/executil.c
+++ b/source/libs/executor/src/executil.c
@@ -77,7 +77,7 @@ void cleanupGroupResInfo(SGroupResInfo* pGroupResInfo) {
pGroupResInfo->index = 0;
}
-static int32_t resultrowComparAsc(const void* p1, const void* p2) {
+int32_t resultrowComparAsc(const void* p1, const void* p2) {
SResKeyPos* pp1 = *(SResKeyPos**)p1;
SResKeyPos* pp2 = *(SResKeyPos**)p2;
diff --git a/source/libs/executor/src/executor.c b/source/libs/executor/src/executor.c
index fc35fba935..9f6b12c13a 100644
--- a/source/libs/executor/src/executor.c
+++ b/source/libs/executor/src/executor.c
@@ -60,9 +60,8 @@ static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, size_t nu
taosArrayAddAll(p->pDataBlock, pDataBlock->pDataBlock);
taosArrayPush(pInfo->pBlockLists, &p);
}
- } else if (type == STREAM_INPUT__TABLE_SCAN) {
- // do nothing
- ASSERT(pInfo->blockType == STREAM_INPUT__TABLE_SCAN);
+ /*} else if (type == STREAM_INPUT__TABLE_SCAN) {*/
+ /*ASSERT(pInfo->blockType == STREAM_INPUT__TABLE_SCAN);*/
} else {
ASSERT(0);
}
@@ -71,6 +70,7 @@ static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, size_t nu
}
}
+#if 0
int32_t qStreamScanSnapshot(qTaskInfo_t tinfo) {
if (tinfo == NULL) {
return TSDB_CODE_QRY_APP_ERROR;
@@ -78,6 +78,7 @@ int32_t qStreamScanSnapshot(qTaskInfo_t tinfo) {
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
return doSetStreamBlock(pTaskInfo->pRoot, NULL, 0, STREAM_INPUT__TABLE_SCAN, 0, NULL);
}
+#endif
int32_t qSetStreamInput(qTaskInfo_t tinfo, const void* input, int32_t type, bool assignUid) {
return qSetMultiStreamInput(tinfo, input, 1, type, assignUid);
@@ -184,7 +185,7 @@ int32_t qUpdateQualifiedTableId(qTaskInfo_t tinfo, const SArray* tableIdList, bo
return code;
}
-int32_t qGetQueriedTableSchemaVersion(qTaskInfo_t tinfo, char* dbName, char* tableName, int32_t* sversion,
+int32_t qGetQueryTableSchemaVersion(qTaskInfo_t tinfo, char* dbName, char* tableName, int32_t* sversion,
int32_t* tversion) {
ASSERT(tinfo != NULL && dbName != NULL && tableName != NULL);
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
diff --git a/source/libs/executor/src/executorMain.c b/source/libs/executor/src/executorMain.c
index 12fcd103e8..b30800680b 100644
--- a/source/libs/executor/src/executorMain.c
+++ b/source/libs/executor/src/executorMain.c
@@ -299,7 +299,7 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, const STqOffsetVal* pOffset) {
}
ASSERT(pInfo->tqReader->pWalReader->curVersion == pOffset->version);
} else if (pOffset->type == TMQ_OFFSET__SNAPSHOT_DATA) {
- pInfo->blockType = STREAM_INPUT__TABLE_SCAN;
+ /*pInfo->blockType = STREAM_INPUT__TABLE_SCAN;*/
int64_t uid = pOffset->uid;
int64_t ts = pOffset->ts;
diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c
index 1e40dfbde3..1de02e3545 100644
--- a/source/libs/executor/src/executorimpl.c
+++ b/source/libs/executor/src/executorimpl.c
@@ -13,6 +13,7 @@
* along with this program. If not, see .
*/
+#include
#include "filter.h"
#include "function.h"
#include "functionMgt.h"
@@ -4062,7 +4063,7 @@ static STsdbReader* doCreateDataReader(STableScanPhysiNode* pTableScanNode, SRea
static SArray* extractColumnInfo(SNodeList* pNodeList);
-int32_t extractTableSchemaVersion(SReadHandle* pHandle, uint64_t uid, SExecTaskInfo* pTaskInfo) {
+int32_t extractTableSchemaInfo(SReadHandle* pHandle, uint64_t uid, SExecTaskInfo* pTaskInfo) {
SMetaReader mr = {0};
metaReaderInit(&mr, pHandle->meta, 0);
int32_t code = metaGetTableEntryByUid(&mr, uid);
@@ -4086,10 +4087,20 @@ int32_t extractTableSchemaVersion(SReadHandle* pHandle, uint64_t uid, SExecTaskI
}
metaReaderClear(&mr);
-
return TSDB_CODE_SUCCESS;
}
+static void cleanupTableSchemaInfo(SExecTaskInfo* pTaskInfo) {
+ taosMemoryFreeClear(pTaskInfo->schemaVer.dbname);
+ if (pTaskInfo->schemaVer.sw == NULL) {
+ return;
+ }
+
+ taosMemoryFree(pTaskInfo->schemaVer.sw->pSchema);
+ taosMemoryFree(pTaskInfo->schemaVer.sw);
+ taosMemoryFree(pTaskInfo->schemaVer.tablename);
+}
+
static int32_t sortTableGroup(STableListInfo* pTableListInfo, int32_t groupNum) {
taosArrayClear(pTableListInfo->pGroupList);
SArray* sortSupport = taosArrayInit(groupNum, sizeof(uint64_t));
@@ -4263,7 +4274,7 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
return NULL;
}
- code = extractTableSchemaVersion(pHandle, pTableScanNode->scan.uid, pTaskInfo);
+ code = extractTableSchemaInfo(pHandle, pTableScanNode->scan.uid, pTaskInfo);
if (code) {
pTaskInfo->code = terrno;
return NULL;
@@ -4281,7 +4292,7 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
pTaskInfo->code = code;
return NULL;
}
- code = extractTableSchemaVersion(pHandle, pTableScanNode->scan.uid, pTaskInfo);
+ code = extractTableSchemaInfo(pHandle, pTableScanNode->scan.uid, pTaskInfo);
if (code) {
pTaskInfo->code = terrno;
return NULL;
@@ -4378,7 +4389,7 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
// return NULL;
// }
- int32_t code = extractTableSchemaVersion(pHandle, pScanNode->uid, pTaskInfo);
+ int32_t code = extractTableSchemaInfo(pHandle, pScanNode->uid, pTaskInfo);
if (code != TSDB_CODE_SUCCESS) {
pTaskInfo->code = code;
return NULL;
@@ -4879,11 +4890,8 @@ void doDestroyTask(SExecTaskInfo* pTaskInfo) {
doDestroyTableList(&pTaskInfo->tableqinfoList);
destroyOperatorInfo(pTaskInfo->pRoot);
- // taosArrayDestroy(pTaskInfo->summary.queryProfEvents);
- // taosHashCleanup(pTaskInfo->summary.operatorProfResults);
+ cleanupTableSchemaInfo(pTaskInfo);
- taosMemoryFree(pTaskInfo->schemaVer.dbname);
- taosMemoryFree(pTaskInfo->schemaVer.tablename);
taosMemoryFreeClear(pTaskInfo->sql);
taosMemoryFreeClear(pTaskInfo->id.str);
taosMemoryFreeClear(pTaskInfo);
diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c
index 7410205d43..407f799496 100644
--- a/source/libs/executor/src/scanoperator.c
+++ b/source/libs/executor/src/scanoperator.c
@@ -1123,6 +1123,7 @@ static void setBlockGroupId(SOperatorInfo* pOperator, SSDataBlock* pBlock, int32
uidCol[i] = getGroupId(pOperator, uidCol[i]);
}
}
+
static int32_t setBlockIntoRes(SStreamScanInfo* pInfo, const SSDataBlock* pBlock) {
SDataBlockInfo* pBlockInfo = &pInfo->pRes->info;
SOperatorInfo* pOperator = pInfo->pStreamScanOp;
@@ -1216,13 +1217,9 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) {
if (setBlockIntoRes(pInfo, &ret.data) < 0) {
ASSERT(0);
}
- /*pTaskInfo->streamInfo.lastStatus = ret.offset;*/
+ // TODO clean data block
if (pInfo->pRes->info.rows > 0) {
return pInfo->pRes;
- } else {
- // data is filtered out, do clean
-
- /*tDeleteSSDataBlock(&ret.data);*/
}
} else if (ret.fetchType == FETCH_TYPE__META) {
ASSERT(0);
@@ -1240,6 +1237,10 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) {
} else if (pTaskInfo->streamInfo.prepareStatus.type == TMQ_OFFSET__SNAPSHOT_DATA) {
SSDataBlock* pResult = doTableScan(pInfo->pTableScanOp);
return pResult && pResult->info.rows > 0 ? pResult : NULL;
+ } else if (pTaskInfo->streamInfo.prepareStatus.type == TMQ_OFFSET__SNAPSHOT_META) {
+ // TODO scan meta
+ ASSERT(0);
+ return NULL;
}
size_t total = taosArrayGetSize(pInfo->pBlockLists);
@@ -1397,6 +1398,11 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) {
}
}
+static SSDataBlock* doRawScan(SOperatorInfo* pInfo) {
+ //
+ return NULL;
+}
+
static SArray* extractTableIdList(const STableListInfo* pTableGroupInfo) {
SArray* tableIdList = taosArrayInit(4, sizeof(uint64_t));
@@ -1409,6 +1415,19 @@ static SArray* extractTableIdList(const STableListInfo* pTableGroupInfo) {
return tableIdList;
}
+// for subscribing db or stb (not including column),
+// if this scan is used, meta data can be return
+// and schemas are decided when scanning
+SOperatorInfo* createRawScanOperatorInfo(SReadHandle* pHandle, STableScanPhysiNode* pTableScanNode,
+ SExecTaskInfo* pTaskInfo, STimeWindowAggSupp* pTwSup) {
+ // create operator
+ // create tb reader
+ // create meta reader
+ // create tq reader
+
+ return NULL;
+}
+
SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhysiNode* pTableScanNode,
SExecTaskInfo* pTaskInfo, STimeWindowAggSupp* pTwSup, uint64_t queryId,
uint64_t taskId) {
@@ -1452,16 +1471,16 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys
if (pHandle) {
SOperatorInfo* pTableScanOp = createTableScanOperatorInfo(pTableScanNode, pHandle, pTaskInfo);
- STableScanInfo* pSTInfo = (STableScanInfo*)pTableScanOp->info;
+ STableScanInfo* pTSInfo = (STableScanInfo*)pTableScanOp->info;
if (pHandle->version > 0) {
- pSTInfo->cond.endVersion = pHandle->version;
+ pTSInfo->cond.endVersion = pHandle->version;
}
SArray* tableList = taosArrayGetP(pTaskInfo->tableqinfoList.pGroupList, 0);
if (pHandle->initTableReader) {
- pSTInfo->scanMode = TABLE_SCAN__TABLE_ORDER;
- pSTInfo->dataReader = NULL;
- if (tsdbReaderOpen(pHandle->vnode, &pSTInfo->cond, tableList, &pSTInfo->dataReader, NULL) < 0) {
+ pTSInfo->scanMode = TABLE_SCAN__TABLE_ORDER;
+ pTSInfo->dataReader = NULL;
+ if (tsdbReaderOpen(pHandle->vnode, &pTSInfo->cond, tableList, &pTSInfo->dataReader, NULL) < 0) {
ASSERT(0);
}
}
@@ -1475,14 +1494,14 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys
pInfo->tqReader = pHandle->tqReader;
}
- if (pSTInfo->interval.interval > 0) {
- pInfo->pUpdateInfo = updateInfoInitP(&pSTInfo->interval, pTwSup->waterMark);
+ if (pTSInfo->interval.interval > 0) {
+ pInfo->pUpdateInfo = updateInfoInitP(&pTSInfo->interval, pTwSup->waterMark);
} else {
pInfo->pUpdateInfo = NULL;
}
pInfo->pTableScanOp = pTableScanOp;
- pInfo->interval = pSTInfo->interval;
+ pInfo->interval = pTSInfo->interval;
pInfo->readHandle = *pHandle;
pInfo->tableUid = pScanPhyNode->uid;
diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c
index 64c27fdb28..78775073a4 100644
--- a/source/libs/executor/src/timewindowoperator.c
+++ b/source/libs/executor/src/timewindowoperator.c
@@ -2401,6 +2401,12 @@ void addPullWindow(SHashObj* pMap, SWinRes* pWinRes, int32_t size) {
static int32_t getChildIndex(SSDataBlock* pBlock) { return pBlock->info.childId; }
+STimeWindow getFinalTimeWindow(int64_t ts, SInterval* pInterval) {
+ STimeWindow w = {.skey = ts, .ekey = INT64_MAX};
+ w.ekey = taosTimeAdd(w.skey, pInterval->interval, pInterval->intervalUnit, pInterval->precision) - 1;
+ return w;
+}
+
static void doHashInterval(SOperatorInfo* pOperatorInfo, SSDataBlock* pSDataBlock, uint64_t tableGroupId,
SArray* pUpdated) {
SStreamFinalIntervalOperatorInfo* pInfo = (SStreamFinalIntervalOperatorInfo*)pOperatorInfo->info;
@@ -2420,8 +2426,12 @@ static void doHashInterval(SOperatorInfo* pOperatorInfo, SSDataBlock* pSDataBloc
int32_t startPos = ascScan ? 0 : (pSDataBlock->info.rows - 1);
TSKEY ts = getStartTsKey(&pSDataBlock->info.window, tsCols);
- STimeWindow nextWin =
- getActiveTimeWindow(pInfo->aggSup.pResultBuf, pResultRowInfo, ts, &pInfo->interval, pInfo->order);
+ STimeWindow nextWin = {0};
+ if (IS_FINAL_OP(pInfo)) {
+ nextWin = getFinalTimeWindow(ts, &pInfo->interval);
+ } else {
+ nextWin = getActiveTimeWindow(pInfo->aggSup.pResultBuf, pResultRowInfo, ts, &pInfo->interval, pInfo->order);
+ }
while (1) {
bool isClosed = isCloseWindow(&nextWin, &pInfo->twAggSup);
if (pInfo->ignoreExpiredData && isClosed) {
@@ -2478,8 +2488,12 @@ static void doHashInterval(SOperatorInfo* pOperatorInfo, SSDataBlock* pSDataBloc
longjmp(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
}
- forwardRows = getNumOfRowsInTimeWindow(&pSDataBlock->info, tsCols, startPos, nextWin.ekey, binarySearchForKey, NULL,
+ if (IS_FINAL_OP(pInfo)) {
+ forwardRows = 1;
+ } else {
+ forwardRows = getNumOfRowsInTimeWindow(&pSDataBlock->info, tsCols, startPos, nextWin.ekey, binarySearchForKey, NULL,
TSDB_ORDER_ASC);
+ }
if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE && pUpdated) {
saveResultRow(pResult, tableGroupId, pUpdated);
}
@@ -2645,7 +2659,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
clearSpecialDataBlock(pInfo->pUpdateRes);
removeDeleteResults(pUpdated, pInfo->pDelWins);
pOperator->status = OP_RES_TO_RETURN;
- qInfo("Stream Final Interval return data");
+ qInfo("%s return data", IS_FINAL_OP(pInfo) ? "interval Final" : "interval Semi");
break;
}
printDataBlock(pBlock, IS_FINAL_OP(pInfo) ? "interval Final recv" : "interval Semi recv");
@@ -2705,6 +2719,10 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
continue;
}
+ if (pInfo->scalarSupp.pExprInfo != NULL) {
+ SExprSupp* pExprSup = &pInfo->scalarSupp;
+ projectApplyFunctions(pExprSup->pExprInfo, pBlock, pBlock, pExprSup->pCtx, pExprSup->numOfExprs, NULL);
+ }
setInputDataBlock(pOperator, pSup->pCtx, pBlock, pInfo->order, MAIN_SCAN, true);
doHashInterval(pOperator, pBlock, pBlock->info.groupId, pUpdated);
if (IS_FINAL_OP(pInfo)) {
@@ -2822,6 +2840,15 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream,
pInfo->primaryTsIndex = ((SColumnNode*)pIntervalPhyNode->window.pTspk)->slotId;
size_t keyBufSize = sizeof(int64_t) + sizeof(int64_t) + POINTER_BYTES;
initResultSizeInfo(pOperator, 4096);
+ if (pIntervalPhyNode->window.pExprs != NULL) {
+ int32_t numOfScalar = 0;
+ SExprInfo* pScalarExprInfo = createExprInfo(pIntervalPhyNode->window.pExprs, NULL, &numOfScalar);
+ int32_t code = initExprSupp(&pInfo->scalarSupp, pScalarExprInfo, numOfScalar);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
+ }
+
int32_t numOfCols = 0;
SExprInfo* pExprInfo = createExprInfo(pIntervalPhyNode->window.pFuncs, NULL, &numOfCols);
SSDataBlock* pResBlock = createResDataBlock(pPhyNode->pOutputDataBlockDesc);
@@ -2988,6 +3015,14 @@ SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPh
}
initResultSizeInfo(pOperator, 4096);
+ if (pSessionNode->window.pExprs != NULL) {
+ int32_t numOfScalar = 0;
+ SExprInfo* pScalarExprInfo = createExprInfo(pSessionNode->window.pExprs, NULL, &numOfScalar);
+ int32_t code = initExprSupp(&pInfo->scalarSupp, pScalarExprInfo, numOfScalar);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
+ }
SExprSupp* pSup = &pOperator->exprSupp;
code = initBasicInfoEx(&pInfo->binfo, pSup, pExprInfo, numOfCols, pResBlock);
@@ -3441,6 +3476,7 @@ static int32_t copyUpdateResult(SHashObj* pStUpdated, SArray* pUpdated) {
*(int64_t*)pos->key = ((SWinRes*)pData)->ts;
taosArrayPush(pUpdated, &pos);
}
+ taosArraySort(pUpdated, resultrowComparAsc);
return TSDB_CODE_SUCCESS;
}
@@ -3655,6 +3691,10 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
continue;
}
+ if (pInfo->scalarSupp.pExprInfo != NULL) {
+ SExprSupp* pExprSup = &pInfo->scalarSupp;
+ projectApplyFunctions(pExprSup->pExprInfo, pBlock, pBlock, pExprSup->pCtx, pExprSup->numOfExprs, NULL);
+ }
// the pDataBlock are always the same one, no need to call this again
setInputDataBlock(pOperator, pSup->pCtx, pBlock, TSDB_ORDER_ASC, MAIN_SCAN, true);
doStreamSessionAggImpl(pOperator, pBlock, pStUpdated, pInfo->pStDeleted, IS_FINAL_OP(pInfo));
@@ -3787,6 +3827,10 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
continue;
}
+ if (pInfo->scalarSupp.pExprInfo != NULL) {
+ SExprSupp* pExprSup = &pInfo->scalarSupp;
+ projectApplyFunctions(pExprSup->pExprInfo, pBlock, pBlock, pExprSup->pCtx, pExprSup->numOfExprs, NULL);
+ }
// the pDataBlock are always the same one, no need to call this again
setInputDataBlock(pOperator, pSup->pCtx, pBlock, TSDB_ORDER_ASC, MAIN_SCAN, true);
doStreamSessionAggImpl(pOperator, pBlock, pStUpdated, pInfo->pStDeleted, false);
@@ -4183,6 +4227,10 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) {
continue;
}
+ if (pInfo->scalarSupp.pExprInfo != NULL) {
+ SExprSupp* pExprSup = &pInfo->scalarSupp;
+ projectApplyFunctions(pExprSup->pExprInfo, pBlock, pBlock, pExprSup->pCtx, pExprSup->numOfExprs, NULL);
+ }
// the pDataBlock are always the same one, no need to call this again
setInputDataBlock(pOperator, pSup->pCtx, pBlock, TSDB_ORDER_ASC, MAIN_SCAN, true);
doStreamStateAggImpl(pOperator, pBlock, pSeUpdated, pInfo->pSeDeleted);
@@ -4236,6 +4284,15 @@ SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhys
pInfo->stateCol = extractColumnFromColumnNode(pColNode);
initResultSizeInfo(pOperator, 4096);
+ if (pStateNode->window.pExprs != NULL) {
+ int32_t numOfScalar = 0;
+ SExprInfo* pScalarExprInfo = createExprInfo(pStateNode->window.pExprs, NULL, &numOfScalar);
+ int32_t code = initExprSupp(&pInfo->scalarSupp, pScalarExprInfo, numOfScalar);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
+ }
+
initResultRowInfo(&pInfo->binfo.resultRowInfo);
pInfo->twAggSup = (STimeWindowAggSupp){
.waterMark = pStateNode->window.watermark,
diff --git a/source/libs/index/inc/indexFstDfa.h b/source/libs/index/inc/indexFstDfa.h
index 9ca10897fd..5a5622e280 100644
--- a/source/libs/index/inc/indexFstDfa.h
+++ b/source/libs/index/inc/indexFstDfa.h
@@ -51,7 +51,7 @@ FstDfa *dfaBuilderBuild(FstDfaBuilder *builder);
bool dfaBuilderRunState(FstDfaBuilder *builder, FstSparseSet *cur, FstSparseSet *next, uint32_t state, uint8_t bytes,
uint32_t *result);
-bool dfaBuilderCachedState(FstDfaBuilder *builder, FstSparseSet *set, uint32_t *result);
+bool dfaBuilderCacheState(FstDfaBuilder *builder, FstSparseSet *set, uint32_t *result);
/*
* dfa related func
diff --git a/source/libs/index/inc/indexFstSparse.h b/source/libs/index/inc/indexFstSparse.h
index 665fb2ba5c..bd704fb427 100644
--- a/source/libs/index/inc/indexFstSparse.h
+++ b/source/libs/index/inc/indexFstSparse.h
@@ -23,17 +23,18 @@ extern "C" {
#endif
typedef struct FstSparseSet {
- uint32_t *dense;
- uint32_t *sparse;
- int32_t size;
+ int32_t *dense;
+ int32_t *sparse;
+ int32_t size;
+ int32_t cap;
} FstSparseSet;
FstSparseSet *sparSetCreate(int32_t sz);
void sparSetDestroy(FstSparseSet *s);
uint32_t sparSetLen(FstSparseSet *ss);
-uint32_t sparSetAdd(FstSparseSet *ss, uint32_t ip);
-uint32_t sparSetGet(FstSparseSet *ss, uint32_t i);
-bool sparSetContains(FstSparseSet *ss, uint32_t ip);
+bool sparSetAdd(FstSparseSet *ss, int32_t ip, int32_t *val);
+bool sparSetGet(FstSparseSet *ss, int32_t i, int32_t *val);
+bool sparSetContains(FstSparseSet *ss, int32_t ip);
void sparSetClear(FstSparseSet *ss);
#ifdef __cplusplus
diff --git a/source/libs/index/src/indexFstDfa.c b/source/libs/index/src/indexFstDfa.c
index b820f16a2a..046ed0f4f4 100644
--- a/source/libs/index/src/indexFstDfa.c
+++ b/source/libs/index/src/indexFstDfa.c
@@ -64,7 +64,7 @@ void dfaBuilderDestroy(FstDfaBuilder *builder) {
taosMemoryFree(builder);
}
-FstDfa *dfaBuilder(FstDfaBuilder *builder) {
+FstDfa *dfaBuilderBuild(FstDfaBuilder *builder) {
uint32_t sz = taosArrayGetSize(builder->dfa->insts);
FstSparseSet *cur = sparSetCreate(sz);
FstSparseSet *nxt = sparSetCreate(sz);
@@ -73,7 +73,7 @@ FstDfa *dfaBuilder(FstDfaBuilder *builder) {
SArray *states = taosArrayInit(0, sizeof(uint32_t));
uint32_t result;
- if (dfaBuilderCachedState(builder, cur, &result)) {
+ if (dfaBuilderCacheState(builder, cur, &result)) {
taosArrayPush(states, &result);
}
SHashObj *seen = taosHashInit(12, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_NO_LOCK);
@@ -98,22 +98,21 @@ FstDfa *dfaBuilder(FstDfaBuilder *builder) {
return builder->dfa;
}
-FstDfa *dfaBuilderBuild(FstDfaBuilder *builer) { return NULL; }
-
bool dfaBuilderRunState(FstDfaBuilder *builder, FstSparseSet *cur, FstSparseSet *next, uint32_t state, uint8_t byte,
uint32_t *result) {
sparSetClear(cur);
DfaState *t = taosArrayGet(builder->dfa->states, state);
for (int i = 0; i < taosArrayGetSize(t->insts); i++) {
- uint32_t ip = *(int32_t *)taosArrayGet(t->insts, i);
- sparSetAdd(cur, ip);
+ int32_t ip = *(int32_t *)taosArrayGet(t->insts, i);
+ bool succ = sparSetAdd(cur, ip, NULL);
+ assert(succ == true);
}
dfaRun(builder->dfa, cur, next, byte);
t = taosArrayGet(builder->dfa->states, state);
uint32_t nxtState;
- if (dfaBuilderCachedState(builder, next, &nxtState)) {
+ if (dfaBuilderCacheState(builder, next, &nxtState)) {
t->next[byte] = nxtState;
*result = nxtState;
return true;
@@ -121,12 +120,13 @@ bool dfaBuilderRunState(FstDfaBuilder *builder, FstSparseSet *cur, FstSparseSet
return false;
}
-bool dfaBuilderCachedState(FstDfaBuilder *builder, FstSparseSet *set, uint32_t *result) {
+bool dfaBuilderCacheState(FstDfaBuilder *builder, FstSparseSet *set, uint32_t *result) {
SArray *tinsts = taosArrayInit(4, sizeof(uint32_t));
bool isMatch = false;
for (int i = 0; i < sparSetLen(set); i++) {
- uint32_t ip = sparSetGet(set, i);
+ int32_t ip;
+ if (false == sparSetGet(set, i, &ip)) continue;
Inst *inst = taosArrayGet(builder->dfa->insts, ip);
if (inst->ty == JUMP || inst->ty == SPLIT) {
@@ -186,7 +186,8 @@ void dfaAdd(FstDfa *dfa, FstSparseSet *set, uint32_t ip) {
if (sparSetContains(set, ip)) {
return;
}
- sparSetAdd(set, ip);
+ bool succ = sparSetAdd(set, ip, NULL);
+ // assert(succ == true);
Inst *inst = taosArrayGet(dfa->insts, ip);
if (inst->ty == MATCH || inst->ty == RANGE) {
// do nothing
@@ -203,7 +204,8 @@ bool dfaRun(FstDfa *dfa, FstSparseSet *from, FstSparseSet *to, uint8_t byte) {
bool isMatch = false;
sparSetClear(to);
for (int i = 0; i < sparSetLen(from); i++) {
- uint32_t ip = sparSetGet(from, i);
+ int32_t ip;
+ if (false == sparSetGet(from, i, &ip)) continue;
Inst *inst = taosArrayGet(dfa->insts, ip);
if (inst->ty == JUMP || inst->ty == SPLIT) {
diff --git a/source/libs/index/src/indexFstRegex.c b/source/libs/index/src/indexFstRegex.c
index 37cb58996f..e148f211f2 100644
--- a/source/libs/index/src/indexFstRegex.c
+++ b/source/libs/index/src/indexFstRegex.c
@@ -22,15 +22,15 @@ FstRegex *regexCreate(const char *str) {
if (regex == NULL) {
return NULL;
}
- int32_t sz = (int32_t)strlen(str);
- char *orig = taosMemoryCalloc(1, sz);
- memcpy(orig, str, sz);
- regex->orig = orig;
+ regex->orig = tstrdup(str);
// construct insts based on str
- SArray *insts = NULL;
-
+ SArray *insts = taosArrayInit(256, sizeof(uint8_t));
+ for (int i = 0; i < strlen(str); i++) {
+ uint8_t v = str[i];
+ taosArrayPush(insts, &v);
+ }
FstDfaBuilder *builder = dfaBuilderCreate(insts);
regex->dfa = dfaBuilderBuild(builder);
return regex;
diff --git a/source/libs/index/src/indexFstSparse.c b/source/libs/index/src/indexFstSparse.c
index 71d8854dcc..60eb7afd90 100644
--- a/source/libs/index/src/indexFstSparse.c
+++ b/source/libs/index/src/indexFstSparse.c
@@ -15,14 +15,24 @@
#include "indexFstSparse.h"
+static void sparSetUtil(int32_t *buf, int32_t cap) {
+ for (int32_t i = 0; i < cap; i++) {
+ buf[i] = -1;
+ }
+}
FstSparseSet *sparSetCreate(int32_t sz) {
FstSparseSet *ss = taosMemoryCalloc(1, sizeof(FstSparseSet));
if (ss == NULL) {
return NULL;
}
- ss->dense = (uint32_t *)taosMemoryCalloc(sz, sizeof(uint32_t));
- ss->sparse = (uint32_t *)taosMemoryCalloc(sz, sizeof(uint32_t));
+ ss->dense = (int32_t *)taosMemoryMalloc(sz * sizeof(int32_t));
+ ss->sparse = (int32_t *)taosMemoryMalloc(sz * sizeof(int32_t));
+ sparSetUtil(ss->dense, sz);
+ sparSetUtil(ss->sparse, sz);
+
+ ss->cap = sz;
+
ss->size = 0;
return ss;
}
@@ -38,23 +48,39 @@ uint32_t sparSetLen(FstSparseSet *ss) {
// Get occupied size
return ss == NULL ? 0 : ss->size;
}
-uint32_t sparSetAdd(FstSparseSet *ss, uint32_t ip) {
+bool sparSetAdd(FstSparseSet *ss, int32_t ip, int32_t *idx) {
if (ss == NULL) {
- return 0;
+ return false;
+ }
+ if (ip >= ss->cap || ip < 0) {
+ return false;
}
uint32_t i = ss->size;
ss->dense[i] = ip;
ss->sparse[ip] = i;
ss->size += 1;
- return i;
+
+ if (idx != NULL) *idx = i;
+
+ return true;
}
-uint32_t sparSetGet(FstSparseSet *ss, uint32_t i) {
- // check later
- return ss->dense[i];
+bool sparSetGet(FstSparseSet *ss, int32_t idx, int32_t *ip) {
+ if (idx >= ss->cap || idx >= ss->size || idx < 0) {
+ return false;
+ }
+ int32_t val = ss->dense[idx];
+ if (ip != NULL) {
+ *ip = val;
+ }
+ return val == -1 ? false : true;
}
-bool sparSetContains(FstSparseSet *ss, uint32_t ip) {
- uint32_t i = ss->sparse[ip];
- if (i < ss->size && ss->dense[i] == ip) {
+bool sparSetContains(FstSparseSet *ss, int32_t ip) {
+ if (ip >= ss->cap || ip < 0) {
+ return false;
+ }
+ int32_t i = ss->sparse[ip];
+
+ if (i >= 0 && i < ss->cap && i < ss->size && ss->dense[i] == ip) {
return true;
} else {
return false;
@@ -64,5 +90,7 @@ void sparSetClear(FstSparseSet *ss) {
if (ss == NULL) {
return;
}
+ sparSetUtil(ss->dense, ss->cap);
+ sparSetUtil(ss->sparse, ss->cap);
ss->size = 0;
}
diff --git a/source/libs/index/test/fstUtilUT.cc b/source/libs/index/test/fstUtilUT.cc
index 2c29758756..593a312c9e 100644
--- a/source/libs/index/test/fstUtilUT.cc
+++ b/source/libs/index/test/fstUtilUT.cc
@@ -51,20 +51,62 @@ class FstSparseSetEnv : public ::testing::Test {
};
// test FstDfaBuilder
-TEST_F(FstUtilEnv, test1) {}
-TEST_F(FstUtilEnv, test2) {}
-TEST_F(FstUtilEnv, test3) {}
-TEST_F(FstUtilEnv, test4) {}
+TEST_F(FstUtilEnv, test1) {
+ // test
+}
+TEST_F(FstUtilEnv, test2) {
+ // test
+}
+TEST_F(FstUtilEnv, test3) {
+ // test
+}
+TEST_F(FstUtilEnv, test4) {
+ // test
+}
// test FstRegex
-TEST_F(FstRegexEnv, test1) {}
+TEST_F(FstRegexEnv, test1) {
+ //
+ EXPECT_EQ(regex != NULL, true);
+}
TEST_F(FstRegexEnv, test2) {}
TEST_F(FstRegexEnv, test3) {}
TEST_F(FstRegexEnv, test4) {}
// test FstSparseSet
-TEST_F(FstSparseSetEnv, test1) {}
-TEST_F(FstSparseSetEnv, test2) {}
-TEST_F(FstSparseSetEnv, test3) {}
-TEST_F(FstSparseSetEnv, test4) {}
+TEST_F(FstSparseSetEnv, test1) {
+ for (int8_t i = 0; i < 20; i++) {
+ int32_t val = -1;
+ bool succ = sparSetAdd(set, 'a' + i, &val);
+ }
+ EXPECT_EQ(sparSetLen(set), 20);
+ for (int8_t i = 0; i < 20; i++) {
+ int val = -1;
+ bool find = sparSetGet(set, i, &val);
+ EXPECT_EQ(find, true);
+ EXPECT_EQ(val, i + 'a');
+ }
+ for (int8_t i = 'a'; i < 'a' + 20; i++) {
+ EXPECT_EQ(sparSetContains(set, i), true);
+ }
+
+ for (int8_t i = 'A'; i < 20; i++) {
+ EXPECT_EQ(sparSetContains(set, 'A'), false);
+ }
+
+ for (int i = 512; i < 1000; i++) {
+ EXPECT_EQ(sparSetAdd(set, i, NULL), false);
+
+ EXPECT_EQ(sparSetGet(set, i, NULL), false);
+ EXPECT_EQ(sparSetContains(set, i), false);
+ }
+ sparSetClear(set);
+
+ for (int i = 'a'; i < 'a' + 20; i++) {
+ EXPECT_EQ(sparSetGet(set, i, NULL), false);
+ }
+ for (int i = 1000; i < 2000; i++) {
+ EXPECT_EQ(sparSetGet(set, i, NULL), false);
+ }
+}
diff --git a/source/libs/qworker/src/qwUtil.c b/source/libs/qworker/src/qwUtil.c
index 5aaf2b8038..9c49cbcb1f 100644
--- a/source/libs/qworker/src/qwUtil.c
+++ b/source/libs/qworker/src/qwUtil.c
@@ -436,7 +436,7 @@ void qwSaveTbVersionInfo(qTaskInfo_t pTaskInfo, SQWTaskCtx *ctx) {
char dbFName[TSDB_DB_FNAME_LEN] = {0};
char tbName[TSDB_TABLE_NAME_LEN] = {0};
- qGetQueriedTableSchemaVersion(pTaskInfo, dbFName, tbName, &ctx->tbInfo.sversion, &ctx->tbInfo.tversion);
+ qGetQueryTableSchemaVersion(pTaskInfo, dbFName, tbName, &ctx->tbInfo.sversion, &ctx->tbInfo.tversion);
if (dbFName[0] && tbName[0]) {
sprintf(ctx->tbInfo.tbFName, "%s.%s", dbFName, tbName);
diff --git a/source/libs/qworker/src/qworker.c b/source/libs/qworker/src/qworker.c
index 757279269a..3e8ced318c 100644
--- a/source/libs/qworker/src/qworker.c
+++ b/source/libs/qworker/src/qworker.c
@@ -1041,7 +1041,7 @@ int32_t qWorkerInit(int8_t nodeType, int32_t nodeId, SQWorkerCfg *cfg, void **qW
*qWorkerMgmt = mgmt;
- qDebug("qworker initialized for node, type:%d, id:%d, handle:%p", mgmt->nodeType, mgmt->nodeId, mgmt);
+ qDebug("qworker initialized, type:%d, id:%d, handle:%p", mgmt->nodeType, mgmt->nodeId, mgmt);
return TSDB_CODE_SUCCESS;
diff --git a/source/libs/sync/src/syncAppendEntriesReply.c b/source/libs/sync/src/syncAppendEntriesReply.c
index 153f18da86..c18c2b4d38 100644
--- a/source/libs/sync/src/syncAppendEntriesReply.c
+++ b/source/libs/sync/src/syncAppendEntriesReply.c
@@ -235,10 +235,10 @@ int32_t syncNodeOnAppendEntriesReplySnapshot2Cb(SSyncNode* ths, SyncAppendEntrie
// do nothing
} else {
- SSyncRaftEntry* pEntry;
- int32_t code = ths->pLogStore->syncLogGetEntry(ths->pLogStore, nextIndex, &pEntry);
- ASSERT(code == 0);
- syncNodeStartSnapshotOnce(ths, SYNC_INDEX_BEGIN, nextIndex, pEntry->term, pMsg);
+ SSnapshot oldSnapshot;
+ ths->pFsm->FpGetSnapshotInfo(ths->pFsm, &oldSnapshot);
+ SyncTerm newSnapshotTerm = oldSnapshot.lastApplyTerm;
+ syncNodeStartSnapshotOnce(ths, SYNC_INDEX_BEGIN, nextIndex, newSnapshotTerm, pMsg);
// get sender
SSyncSnapshotSender* pSender = syncNodeGetSnapshotSender(ths, &(pMsg->srcId));
diff --git a/source/libs/wal/src/walRead.c b/source/libs/wal/src/walRead.c
index 2d910a85b8..eb0c7f56bd 100644
--- a/source/libs/wal/src/walRead.c
+++ b/source/libs/wal/src/walRead.c
@@ -30,19 +30,24 @@ SWalReader *walOpenReader(SWal *pWal, SWalFilterCond *cond) {
pRead->pWal = pWal;
pRead->pIdxFile = NULL;
pRead->pLogFile = NULL;
- pRead->curVersion = -5;
+ pRead->curVersion = -1;
pRead->curFileFirstVer = -1;
pRead->curInvalid = 1;
pRead->capacity = 0;
- if (cond)
+ if (cond) {
pRead->cond = *cond;
- else {
+ } else {
pRead->cond.scanMeta = 0;
pRead->cond.scanUncommited = 0;
+ pRead->cond.enableRef = 0;
}
taosThreadMutexInit(&pRead->mutex, NULL);
+ /*if (pRead->cond.enableRef) {*/
+ /*walOpenRef(pWal);*/
+ /*}*/
+
pRead->pHead = taosMemoryMalloc(sizeof(SWalCkHead));
if (pRead->pHead == NULL) {
terrno = TSDB_CODE_WAL_OUT_OF_MEMORY;
@@ -151,24 +156,8 @@ static int32_t walReadChangeFile(SWalReader *pRead, int64_t fileFirstVer) {
return 0;
}
-int32_t walReadSeekVer(SWalReader *pRead, int64_t ver) {
+int32_t walReadSeekVerImpl(SWalReader *pRead, int64_t ver) {
SWal *pWal = pRead->pWal;
- if (!pRead->curInvalid && ver == pRead->curVersion) {
- wDebug("wal version %ld match, no need to reset", ver);
- return 0;
- }
-
- pRead->curInvalid = 1;
- pRead->curVersion = ver;
-
- if (ver > pWal->vers.lastVer || ver < pWal->vers.firstVer) {
- wDebug("vgId:%d, invalid index:%" PRId64 ", first index:%" PRId64 ", last index:%" PRId64, pRead->pWal->cfg.vgId,
- ver, pWal->vers.firstVer, pWal->vers.lastVer);
- terrno = TSDB_CODE_WAL_LOG_NOT_EXIST;
- return -1;
- }
- if (ver < pWal->vers.snapshotVer) {
- }
SWalFileInfo tmpInfo;
tmpInfo.firstVer = ver;
@@ -190,6 +179,31 @@ int32_t walReadSeekVer(SWalReader *pRead, int64_t ver) {
wDebug("wal version reset from %ld to %ld", pRead->curVersion, ver);
pRead->curVersion = ver;
+ return 0;
+}
+
+int32_t walReadSeekVer(SWalReader *pRead, int64_t ver) {
+ SWal *pWal = pRead->pWal;
+ if (!pRead->curInvalid && ver == pRead->curVersion) {
+ wDebug("wal version %ld match, no need to reset", ver);
+ return 0;
+ }
+
+ pRead->curInvalid = 1;
+ pRead->curVersion = ver;
+
+ if (ver > pWal->vers.lastVer || ver < pWal->vers.firstVer) {
+ wDebug("vgId:%d, invalid index:%" PRId64 ", first index:%" PRId64 ", last index:%" PRId64, pRead->pWal->cfg.vgId,
+ ver, pWal->vers.firstVer, pWal->vers.lastVer);
+ terrno = TSDB_CODE_WAL_LOG_NOT_EXIST;
+ return -1;
+ }
+ if (ver < pWal->vers.snapshotVer) {
+ }
+
+ if (walReadSeekVerImpl(pRead, ver) < 0) {
+ return -1;
+ }
return 0;
}
@@ -198,6 +212,8 @@ void walSetReaderCapacity(SWalReader *pRead, int32_t capacity) { pRead->capacity
static int32_t walFetchHeadNew(SWalReader *pRead, int64_t fetchVer) {
int64_t contLen;
+ bool seeked = false;
+
if (pRead->curInvalid || pRead->curVersion != fetchVer) {
if (walReadSeekVer(pRead, fetchVer) < 0) {
ASSERT(0);
@@ -205,17 +221,26 @@ static int32_t walFetchHeadNew(SWalReader *pRead, int64_t fetchVer) {
pRead->curInvalid = 1;
return -1;
}
+ seeked = true;
}
- contLen = taosReadFile(pRead->pLogFile, pRead->pHead, sizeof(SWalCkHead));
- if (contLen != sizeof(SWalCkHead)) {
- if (contLen < 0) {
- terrno = TAOS_SYSTEM_ERROR(errno);
+ while (1) {
+ contLen = taosReadFile(pRead->pLogFile, pRead->pHead, sizeof(SWalCkHead));
+ if (contLen == sizeof(SWalCkHead)) {
+ break;
+ } else if (contLen == 0 && !seeked) {
+ walReadSeekVerImpl(pRead, fetchVer);
+ seeked = true;
+ continue;
} else {
- terrno = TSDB_CODE_WAL_FILE_CORRUPTED;
+ if (contLen < 0) {
+ terrno = TAOS_SYSTEM_ERROR(errno);
+ } else {
+ terrno = TSDB_CODE_WAL_FILE_CORRUPTED;
+ }
+ ASSERT(0);
+ pRead->curInvalid = 1;
+ return -1;
}
- ASSERT(0);
- pRead->curInvalid = 1;
- return -1;
}
return 0;
}
@@ -379,20 +404,14 @@ int32_t walFetchBody(SWalReader *pRead, SWalCkHead **ppHead) {
}
int32_t walReadVer(SWalReader *pRead, int64_t ver) {
- int64_t code;
+ int64_t contLen;
+ bool seeked = false;
if (pRead->pWal->vers.firstVer == -1) {
terrno = TSDB_CODE_WAL_LOG_NOT_EXIST;
return -1;
}
- if (pRead->curInvalid || pRead->curVersion != ver) {
- if (walReadSeekVer(pRead, ver) < 0) {
- wError("vgId:%d, unexpected wal log index:%" PRId64 ", since %s", pRead->pWal->cfg.vgId, ver, terrstr());
- return -1;
- }
- }
-
if (ver > pRead->pWal->vers.lastVer || ver < pRead->pWal->vers.firstVer) {
wError("vgId:%d, invalid index:%" PRId64 ", first index:%" PRId64 ", last index:%" PRId64, pRead->pWal->cfg.vgId,
ver, pRead->pWal->vers.firstVer, pRead->pWal->vers.lastVer);
@@ -400,21 +419,35 @@ int32_t walReadVer(SWalReader *pRead, int64_t ver) {
return -1;
}
- ASSERT(taosValidFile(pRead->pLogFile) == true);
-
- code = taosReadFile(pRead->pLogFile, pRead->pHead, sizeof(SWalCkHead));
- if (code != sizeof(SWalCkHead)) {
- if (code < 0)
- terrno = TAOS_SYSTEM_ERROR(errno);
- else {
- terrno = TSDB_CODE_WAL_FILE_CORRUPTED;
- ASSERT(0);
+ if (pRead->curInvalid || pRead->curVersion != ver) {
+ if (walReadSeekVer(pRead, ver) < 0) {
+ wError("vgId:%d, unexpected wal log index:%" PRId64 ", since %s", pRead->pWal->cfg.vgId, ver, terrstr());
+ return -1;
}
- return -1;
+ seeked = true;
}
- code = walValidHeadCksum(pRead->pHead);
- if (code != 0) {
+ while (1) {
+ contLen = taosReadFile(pRead->pLogFile, pRead->pHead, sizeof(SWalCkHead));
+ if (contLen == sizeof(SWalCkHead)) {
+ break;
+ } else if (contLen == 0 && !seeked) {
+ walReadSeekVerImpl(pRead, ver);
+ seeked = true;
+ continue;
+ } else {
+ if (contLen < 0) {
+ terrno = TAOS_SYSTEM_ERROR(errno);
+ } else {
+ terrno = TSDB_CODE_WAL_FILE_CORRUPTED;
+ }
+ ASSERT(0);
+ return -1;
+ }
+ }
+
+ contLen = walValidHeadCksum(pRead->pHead);
+ if (contLen != 0) {
wError("vgId:%d, unexpected wal log index:%" PRId64 ", since head checksum not passed", pRead->pWal->cfg.vgId, ver);
terrno = TSDB_CODE_WAL_FILE_CORRUPTED;
return -1;
@@ -430,9 +463,9 @@ int32_t walReadVer(SWalReader *pRead, int64_t ver) {
pRead->capacity = pRead->pHead->head.bodyLen;
}
- if ((code = taosReadFile(pRead->pLogFile, pRead->pHead->head.body, pRead->pHead->head.bodyLen)) !=
+ if ((contLen = taosReadFile(pRead->pLogFile, pRead->pHead->head.body, pRead->pHead->head.bodyLen)) !=
pRead->pHead->head.bodyLen) {
- if (code < 0)
+ if (contLen < 0)
terrno = TAOS_SYSTEM_ERROR(errno);
else {
terrno = TSDB_CODE_WAL_FILE_CORRUPTED;
@@ -449,8 +482,8 @@ int32_t walReadVer(SWalReader *pRead, int64_t ver) {
return -1;
}
- code = walValidBodyCksum(pRead->pHead);
- if (code != 0) {
+ contLen = walValidBodyCksum(pRead->pHead);
+ if (contLen != 0) {
wError("vgId:%d, unexpected wal log index:%" PRId64 ", since body checksum not passed", pRead->pWal->cfg.vgId, ver);
pRead->curInvalid = 1;
terrno = TSDB_CODE_WAL_FILE_CORRUPTED;
diff --git a/source/util/src/tlog.c b/source/util/src/tlog.c
index 9d7656de35..490c6f29bf 100644
--- a/source/util/src/tlog.c
+++ b/source/util/src/tlog.c
@@ -745,14 +745,14 @@ cmp_end:
void taosSetAllDebugFlag(int32_t flag) {
if (flag <= 0) return;
+ uDebugFlag = flag;
+ rpcDebugFlag = flag;
+ jniDebugFlag = flag;
+ qDebugFlag = flag;
+ cDebugFlag = flag;
dDebugFlag = flag;
vDebugFlag = flag;
mDebugFlag = flag;
- cDebugFlag = flag;
- jniDebugFlag = flag;
- uDebugFlag = flag;
- rpcDebugFlag = flag;
- qDebugFlag = flag;
wDebugFlag = flag;
sDebugFlag = flag;
tsdbDebugFlag = flag;
@@ -761,6 +761,5 @@ void taosSetAllDebugFlag(int32_t flag) {
udfDebugFlag = flag;
smaDebugFlag = flag;
idxDebugFlag = flag;
-
uInfo("all debug flag are set to %d", flag);
}
diff --git a/tests/pytest/util/cluster.py b/tests/pytest/util/cluster.py
index efa83323a4..e892e1cc02 100644
--- a/tests/pytest/util/cluster.py
+++ b/tests/pytest/util/cluster.py
@@ -58,9 +58,10 @@ class ConfigureyCluster:
self.dnodes.append(dnode)
return self.dnodes
- def create_dnode(self,conn):
+ def create_dnode(self,conn,dnodeNum):
tdSql.init(conn.cursor())
- for dnode in self.dnodes[1:]:
+ dnodeNum=int(dnodeNum)
+ for dnode in self.dnodes[1:dnodeNum]:
# print(dnode.cfgDict)
dnode_id = dnode.cfgDict["fqdn"] + ":" +dnode.cfgDict["serverPort"]
tdSql.execute(" create dnode '%s';"%dnode_id)
diff --git a/tests/script/jenkins/basic.txt b/tests/script/jenkins/basic.txt
index 906c2b8792..94414edbf2 100644
--- a/tests/script/jenkins/basic.txt
+++ b/tests/script/jenkins/basic.txt
@@ -98,7 +98,7 @@
./test.sh -f tsim/stream/distributeInterval0.sim
# ./test.sh -f tsim/stream/distributeIntervalRetrive0.sim
# ./test.sh -f tsim/stream/distributesession0.sim
-# ./test.sh -f tsim/stream/session0.sim
+./test.sh -f tsim/stream/session0.sim
./test.sh -f tsim/stream/session1.sim
# ./test.sh -f tsim/stream/state0.sim
./test.sh -f tsim/stream/triggerInterval0.sim
diff --git a/tests/script/sh/deploy.sh b/tests/script/sh/deploy.sh
index 4d93878a98..de7b8ecfbf 100755
--- a/tests/script/sh/deploy.sh
+++ b/tests/script/sh/deploy.sh
@@ -122,28 +122,29 @@ echo "secondEp ${HOSTNAME}:7200" >> $TAOS_CFG
echo "fqdn ${HOSTNAME}" >> $TAOS_CFG
echo "serverPort ${NODE}" >> $TAOS_CFG
echo "supportVnodes 1024" >> $TAOS_CFG
+echo "statusInterval 1" >> $TAOS_CFG
echo "dataDir $DATA_DIR" >> $TAOS_CFG
echo "logDir $LOG_DIR" >> $TAOS_CFG
echo "debugFlag 0" >> $TAOS_CFG
-echo "mDebugFlag 143" >> $TAOS_CFG
-echo "dDebugFlag 143" >> $TAOS_CFG
-echo "vDebugFlag 143" >> $TAOS_CFG
-echo "tqDebugFlag 143" >> $TAOS_CFG
-echo "tsdbDebugFlag 143" >> $TAOS_CFG
-echo "cDebugFlag 143" >> $TAOS_CFG
-echo "jniDebugFlag 143" >> $TAOS_CFG
-echo "qDebugFlag 143" >> $TAOS_CFG
-echo "rpcDebugFlag 143" >> $TAOS_CFG
-echo "sDebugFlag 143" >> $TAOS_CFG
-echo "wDebugFlag 143" >> $TAOS_CFG
-echo "idxDebugFlag 143" >> $TAOS_CFG
-echo "fsDebugFlag 143" >> $TAOS_CFG
-echo "udfDebugFlag 143" >> $TAOS_CFG
-echo "smaDebugFlag 143" >> $TAOS_CFG
echo "tmrDebugFlag 131" >> $TAOS_CFG
echo "uDebugFlag 131" >> $TAOS_CFG
+echo "rpcDebugFlag 131" >> $TAOS_CFG
+echo "jniDebugFlag 143" >> $TAOS_CFG
+echo "qDebugFlag 143" >> $TAOS_CFG
+echo "cDebugFlag 143" >> $TAOS_CFG
+echo "dDebugFlag 143" >> $TAOS_CFG
+echo "vDebugFlag 143" >> $TAOS_CFG
+echo "mDebugFlag 143" >> $TAOS_CFG
+echo "wDebugFlag 143" >> $TAOS_CFG
+echo "sDebugFlag 143" >> $TAOS_CFG
+echo "tsdbDebugFlag 143" >> $TAOS_CFG
+echo "tqDebugFlag 143" >> $TAOS_CFG
+echo "fsDebugFlag 143" >> $TAOS_CFG
+echo "idxDebugFlag 143" >> $TAOS_CFG
+echo "udfDebugFlag 143" >> $TAOS_CFG
+echo "smaDebugFlag 143" >> $TAOS_CFG
+echo "idxDebugFlag 143" >> $TAOS_CFG
echo "numOfLogLines 20000000" >> $TAOS_CFG
-echo "statusInterval 1" >> $TAOS_CFG
echo "asyncLog 0" >> $TAOS_CFG
echo "locale en_US.UTF-8" >> $TAOS_CFG
echo "telemetryReporting 0" >> $TAOS_CFG
diff --git a/tests/script/tsim/sync/vnodesnapshot-restart.sim b/tests/script/tsim/sync/vnodesnapshot-restart.sim
index 3ed82fdfe7..b44191071d 100644
--- a/tests/script/tsim/sync/vnodesnapshot-restart.sim
+++ b/tests/script/tsim/sync/vnodesnapshot-restart.sim
@@ -1,6 +1,6 @@
system sh/stop_dnodes.sh
-system sh/cfg.sh -n dnode1 -c supportVnodes -v 0
+#system sh/cfg.sh -n dnode1 -c supportVnodes -v 0
system sh/exec.sh -n dnode1 -s start
system sh/exec.sh -n dnode2 -s start
diff --git a/tests/script/tsim/valgrind/basic2.sim b/tests/script/tsim/valgrind/basic2.sim
index eb61f85444..154617bc18 100644
--- a/tests/script/tsim/valgrind/basic2.sim
+++ b/tests/script/tsim/valgrind/basic2.sim
@@ -48,7 +48,7 @@ sql insert into ct1 values(now+1s, 11, 2.1, 3.1)(now+2s, -12, -2.2, -3.2)(now+3s
print =============== step6: select data
sql select * from ct1
-#sql select * from stb
+sql select * from stb
_OVER:
system sh/exec.sh -n dnode1 -s stop -x SIGINT
diff --git a/tests/script/tsim/valgrind/checkError2.sim b/tests/script/tsim/valgrind/checkError2.sim
index f98cd0df1d..3a2819776d 100644
--- a/tests/script/tsim/valgrind/checkError2.sim
+++ b/tests/script/tsim/valgrind/checkError2.sim
@@ -47,7 +47,7 @@ sql insert into ct1 values(now+0s, 10, 2.0, 3.0)
sql insert into ct1 values(now+1s, 11, 2.1, 3.1)(now+2s, -12, -2.2, -3.2)(now+3s, -13, -2.3, -3.3)
print =============== step6: select data
-#sql select * from ct1
+sql select * from ct1
#sql select * from stb
_OVER:
@@ -58,7 +58,7 @@ print ----> start to check if there are ERRORS in vagrind log file for each dnod
system_content sh/checkValgrind.sh -n dnode1
print cmd return result ----> [ $system_content ]
-if $system_content <= 0 then
+if $system_content <= 2 then
return 0
endi
diff --git a/tests/system-test/1-insert/test_stmt_insert_query_ex.py b/tests/system-test/1-insert/test_stmt_insert_query_ex.py
deleted file mode 100644
index 2a64c09ff4..0000000000
--- a/tests/system-test/1-insert/test_stmt_insert_query_ex.py
+++ /dev/null
@@ -1,262 +0,0 @@
-###################################################################
-# Copyright (c) 2016 by TAOS Technologies, Inc.
-# All rights reserved.
-#
-# This file is proprietary and confidential to TAOS Technologies.
-# No part of this file may be reproduced, stored, transmitted,
-# disclosed or used in any form or by any means other than as
-# expressly provided by the written permission from Jianhui Tao
-#
-###################################################################
-
-# -*- coding: utf-8 -*-
-
-import sys
-import os
-import threading as thd
-import multiprocessing as mp
-from numpy.lib.function_base import insert
-import taos
-from taos import *
-from util.log import *
-from util.cases import *
-from util.sql import *
-import numpy as np
-import datetime as dt
-from datetime import datetime
-from ctypes import *
-import time
-# constant define
-WAITS = 5 # wait seconds
-
-class TDTestCase:
- #
- # --------------- main frame -------------------
- def caseDescription(self):
- '''
- limit and offset keyword function test cases;
- case1: limit offset base function test
- case2: offset return valid
- '''
- return
-
- def getBuildPath(self):
- selfPath = os.path.dirname(os.path.realpath(__file__))
-
- if ("community" in selfPath):
- projPath = selfPath[:selfPath.find("community")]
- else:
- projPath = selfPath[:selfPath.find("tests")]
-
- for root, dirs, files in os.walk(projPath):
- if ("taosd" in files or "taosd.exe" in files):
- rootRealPath = os.path.dirname(os.path.realpath(root))
- if ("packaging" not in rootRealPath):
- buildPath = root[:len(root)-len("/build/bin")]
- break
- return buildPath
-
- # init
- def init(self, conn, logSql):
- tdLog.debug("start to execute %s" % __file__)
- tdSql.init(conn.cursor())
- # tdSql.prepare()
- # self.create_tables();
- self.ts = 1500000000000
-
- # stop
- def stop(self):
- tdSql.close()
- tdLog.success("%s successfully executed" % __file__)
-
-
- # --------------- case -------------------
-
-
- def newcon(self,host,cfg):
- user = "root"
- password = "taosdata"
- port =6030
- con=taos.connect(host=host, user=user, password=password, config=cfg ,port=port)
- print(con)
- return con
-
- def test_stmt_set_tbname_tag(self,conn):
- dbname = "stmt_tag"
-
- try:
- conn.execute("drop database if exists %s" % dbname)
- conn.execute("create database if not exists %s PRECISION 'us' " % dbname)
- conn.select_db(dbname)
- conn.execute("create table if not exists log(ts timestamp, bo bool, nil tinyint, ti tinyint, si smallint, ii int,\
- bi bigint, tu tinyint unsigned, su smallint unsigned, iu int unsigned, bu bigint unsigned, \
- ff float, dd double, bb binary(100), nn nchar(100), tt timestamp , vc varchar(100)) tags (t1 timestamp, t2 bool,\
- t3 tinyint, t4 tinyint, t5 smallint, t6 int, t7 bigint, t8 tinyint unsigned, t9 smallint unsigned, \
- t10 int unsigned, t11 bigint unsigned, t12 float, t13 double, t14 binary(100), t15 nchar(100), t16 timestamp)")
-
- stmt = conn.statement("insert into ? using log tags (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) \
- values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)")
- tags = new_bind_params(16)
- tags[0].timestamp(1626861392589123, PrecisionEnum.Microseconds)
- tags[1].bool(True)
- tags[2].bool(False)
- tags[3].tinyint(2)
- tags[4].smallint(3)
- tags[5].int(4)
- tags[6].bigint(5)
- tags[7].tinyint_unsigned(6)
- tags[8].smallint_unsigned(7)
- tags[9].int_unsigned(8)
- tags[10].bigint_unsigned(9)
- tags[11].float(10.1)
- tags[12].double(10.11)
- tags[13].binary("hello")
- tags[14].nchar("stmt")
- tags[15].timestamp(1626861392589, PrecisionEnum.Milliseconds)
- stmt.set_tbname_tags("tb1", tags)
- params = new_multi_binds(17)
- params[0].timestamp((1626861392589111, 1626861392590111, 1626861392591111))
- params[1].bool((True, None, False))
- params[2].tinyint([-128, -128, None]) # -128 is tinyint null
- params[3].tinyint([0, 127, None])
- params[4].smallint([3, None, 2])
- params[5].int([3, 4, None])
- params[6].bigint([3, 4, None])
- params[7].tinyint_unsigned([3, 4, None])
- params[8].smallint_unsigned([3, 4, None])
- params[9].int_unsigned([3, 4, None])
- params[10].bigint_unsigned([3, 4, 5])
- params[11].float([3, None, 1])
- params[12].double([3, None, 1.2])
- params[13].binary(["abc", "dddafadfadfadfadfa", None])
- params[14].nchar(["涛思数据", None, "a long string with 中文字符"])
- params[15].timestamp([None, None, 1626861392591])
- params[16].binary(["涛思数据16", None, "a long string with 中文-字符"])
-
- stmt.bind_param_batch(params)
- stmt.execute()
-
- assert stmt.affected_rows == 3
-
- #query all
- querystmt1=conn.statement("select * from log where bu < ?")
- queryparam1=new_bind_params(1)
- print(type(queryparam1))
- queryparam1[0].int(10)
- querystmt1.bind_param(queryparam1)
- querystmt1.execute()
- result1=querystmt1.use_result()
- rows1=result1.fetch_all()
- print(rows1[0])
- print(rows1[1])
- print(rows1[2])
- assert str(rows1[0][0]) == "2021-07-21 17:56:32.589111"
- assert rows1[0][10] == 3
- assert rows1[1][10] == 4
-
- #query: Numeric Functions
- querystmt2=conn.statement("select abs(?) from log where bu < ?")
- queryparam2=new_bind_params(2)
- print(type(queryparam2))
- queryparam2[0].int(5)
- queryparam2[1].int(5)
- querystmt2.bind_param(queryparam2)
- querystmt2.execute()
- result2=querystmt2.use_result()
- rows2=result2.fetch_all()
- print("2",rows2)
- assert rows2[0][0] == 5
- assert rows2[1][0] == 5
-
-
- #query: Numeric Functions and escapes
-
- querystmt3=conn.statement("select abs(?) from log where nn= 'a? long string with 中文字符' ")
- queryparam3=new_bind_params(1)
- print(type(queryparam3))
- queryparam3[0].int(5)
- querystmt3.bind_param(queryparam3)
- querystmt3.execute()
- result3=querystmt3.use_result()
- rows3=result3.fetch_all()
- print("3",rows3)
- assert rows3 == []
-
- #query: string Functions
-
- querystmt9=conn.statement("select CHAR_LENGTH(?) from log ")
- queryparam9=new_bind_params(1)
- print(type(queryparam9))
- queryparam9[0].binary('中文字符')
- querystmt9.bind_param(queryparam9)
- querystmt9.execute()
- result9=querystmt9.use_result()
- rows9=result9.fetch_all()
- print("9",rows9)
- assert rows9[0][0] == 12, 'fourth case is failed'
- assert rows9[1][0] == 12, 'fourth case is failed'
-
- #query: conversion Functions
-
- querystmt4=conn.statement("select cast( ? as bigint) from log ")
- queryparam4=new_bind_params(1)
- print(type(queryparam4))
- queryparam4[0].binary('1232a')
- querystmt4.bind_param(queryparam4)
- querystmt4.execute()
- result4=querystmt4.use_result()
- rows4=result4.fetch_all()
- print("5",rows4)
- assert rows4[0][0] == 1232
- assert rows4[1][0] == 1232
-
- querystmt4=conn.statement("select cast( ? as binary(10)) from log ")
- queryparam4=new_bind_params(1)
- print(type(queryparam4))
- queryparam4[0].int(123)
- querystmt4.bind_param(queryparam4)
- querystmt4.execute()
- result4=querystmt4.use_result()
- rows4=result4.fetch_all()
- print("6",rows4)
- assert rows4[0][0] == '123'
- assert rows4[1][0] == '123'
-
- # #query: datatime Functions
-
- # querystmt4=conn.statement(" select timediff('2021-07-21 17:56:32.590111',?,1s) from log ")
- # queryparam4=new_bind_params(1)
- # print(type(queryparam4))
- # queryparam4[0].timestamp(1626861392591111)
- # querystmt4.bind_param(queryparam4)
- # querystmt4.execute()
- # result4=querystmt4.use_result()
- # rows4=result4.fetch_all()
- # print("7",rows4)
- # assert rows4[0][0] == 1, 'seventh case is failed'
- # assert rows4[1][0] == 1, 'seventh case is failed'
-
-
-
- # conn.execute("drop database if exists %s" % dbname)
- conn.close()
-
- except Exception as err:
- # conn.execute("drop database if exists %s" % dbname)
- conn.close()
- raise err
-
- def run(self):
- buildPath = self.getBuildPath()
- config = buildPath+ "../sim/dnode1/cfg/"
- host="localhost"
- connectstmt=self.newcon(host,config)
- self.test_stmt_set_tbname_tag(connectstmt)
-
- return
-
-
-# add case with filename
-#
-tdCases.addWindows(__file__, TDTestCase())
-tdCases.addLinux(__file__, TDTestCase())
diff --git a/tests/system-test/2-query/queryQnode.py b/tests/system-test/2-query/queryQnode.py
index d9976d8f3e..8b893a93d7 100644
--- a/tests/system-test/2-query/queryQnode.py
+++ b/tests/system-test/2-query/queryQnode.py
@@ -278,22 +278,7 @@ class TDTestCase:
tdSql.checkData(0,0,rowsPerSTable)
return
- # test case1 base
- def test_case1(self):
- #stableCount=threadNumbersCtb
- parameterDict = {'vgroups': 1, \
- 'threadNumbersCtb': 5, \
- 'threadNumbersIda': 5, \
- 'stableCount': 5, \
- 'tablesPerStb': 50, \
- 'rowsPerTable': 10, \
- 'dbname': 'db', \
- 'stbname': 'stb', \
- 'host': 'localhost', \
- 'startTs': 1640966400000} # 2022-01-01 00:00:00.000
-
- tdLog.debug("-----create database and muti-thread create tables test------- ")
-
+ # test case : Switch back and forth among the three queryPolicy(1\2\3)
def test_case1(self):
self.taosBenchCreate("127.0.0.1","no","db1", "stb1", 1, 2, 1*10)
tdSql.execute("use db1;")
@@ -407,6 +392,7 @@ class TDTestCase:
tdSql.query("select c0,c1 from stb11_1 where (c0>1000) union all select c0,c1 from stb11_1 where c0>2000;")
assert unionallQnode==tdSql.queryResult
+ # test case : queryPolicy = 2
def test_case2(self):
self.taosBenchCreate("127.0.0.1","no","db1", "stb1", 10, 2, 1*10)
tdSql.query("show qnodes")
@@ -438,8 +424,9 @@ class TDTestCase:
tdSql.query("select max(c1) from stb10_0;")
tdSql.query("select min(c1) from stb11_0;")
- def test_case3(self):
+ # test case : queryPolicy = 3
+ def test_case3(self):
tdSql.execute('alter local "queryPolicy" "3"')
tdLog.debug("create qnode on dnode 1")
tdSql.execute("create qnode on dnode 1")
@@ -472,10 +459,16 @@ class TDTestCase:
# run case
def run(self):
# test qnode
+ tdLog.debug(" test_case1 ............ [start]")
self.test_case1()
+ tdLog.debug(" test_case1 ............ [OK]")
+ tdLog.debug(" test_case2 ............ [start]")
self.test_case2()
-
+ tdLog.debug(" test_case2 ............ [OK]")
+ tdLog.debug(" test_case3 ............ [start]")
self.test_case3()
+ tdLog.debug(" test_case3 ............ [OK]")
+
# tdLog.debug(" LIMIT test_case3 ............ [OK]")
def stop(self):
diff --git a/tests/system-test/2-query/tsbsQuery.py b/tests/system-test/2-query/tsbsQuery.py
new file mode 100644
index 0000000000..d24e5ea283
--- /dev/null
+++ b/tests/system-test/2-query/tsbsQuery.py
@@ -0,0 +1,74 @@
+import taos
+import sys
+import datetime
+import inspect
+
+from util.log import *
+from util.sql import *
+from util.cases import *
+
+class TDTestCase:
+
+ def init(self, conn, logSql):
+ tdLog.debug(f"start to excute {__file__}")
+ tdSql.init(conn.cursor(), True)
+
+ def prepareData(self):
+ database="db_tsbs"
+ ts=1451606400000
+ tdSql.execute(f"create database {database};")
+ tdSql.execute(f"use {database} ")
+ tdSql.execute('''
+ create table readings (ts timestamp,latitude double,longitude double,elevation double,velocity double,heading double,grade double,fuel_consumption double,load_capacity double,fuel_capacity double,nominal_fuel_consumption double) tags (name binary(30),fleet binary(30),driver binary(30),model binary(30),device_version binary(30));
+ ''')
+ tdSql.execute('''
+ create table diagnostics (ts timestamp,fuel_state double,current_load double,status bigint,load_capacity double,fuel_capacity double,nominal_fuel_consumption double) tags (name binary(30),fleet binary(30),driver binary(30),model binary(30),device_version binary(30)) ;
+ ''')
+
+ for i in range(10):
+ tdSql.execute(f"create table rct{i} using readings (name,fleet,driver,model,device_version) tags ('truck_{i}','South{i}','Trish{i}','H-{i}','v2.3')")
+ tdSql.execute(f"create table dct{i} using diagnostics (name,fleet,driver,model,device_version) tags ('truck_{i}','South{i}','Trish{i}','H-{i}','v2.3')")
+ for j in range(10):
+ for i in range(10):
+ tdSql.execute(
+ f"insert into rct{j} values ( {ts+i*10000}, {80+i}, {90+i}, {85+i}, {30+i*10}, {1.2*i}, {221+i*2}, {20+i*0.2}, {1500+i*20}, {150+i*2},{5+i} )"
+ )
+ tdSql.execute(
+ f"insert into dct{j} values ( {ts+i*10000}, {1+i*0.1},{1400+i*15}, {1+i},{1500+i*20}, {150+i*2},{5+i} )"
+ )
+
+ # def check_avg(self ,origin_query , check_query):
+ # avg_result = tdSql.getResult(origin_query)
+ # origin_result = tdSql.getResult(check_query)
+
+ # check_status = True
+ # for row_index , row in enumerate(avg_result):
+ # for col_index , elem in enumerate(row):
+ # if avg_result[row_index][col_index] != origin_result[row_index][col_index]:
+ # check_status = False
+ # if not check_status:
+ # tdLog.notice("avg function value has not as expected , sql is \"%s\" "%origin_query )
+ # sys.exit(1)
+ # else:
+ # tdLog.info("avg value check pass , it work as expected ,sql is \"%s\" "%check_query )
+
+
+ def tsbsIotQuery(self):
+ tdSql.execute("use db_tsbs")
+ tdSql.query(" SELECT avg(velocity) as mean_velocity ,name,driver,fleet FROM readings WHERE ts > 1451606400000 AND ts <= 1451606460000 partition BY name,driver,fleet interval(10m); ")
+ tdSql.checkRows(1)
+
+
+
+ def run(self): # sourcery skip: extract-duplicate-method, remove-redundant-fstring
+ tdLog.printNoPrefix("==========step1:create database and table,insert data ==============")
+ self.tsbsIotQuery()
+ self.tsbsIotQuery()
+
+
+ def stop(self):
+ tdSql.close()
+ tdLog.success(f"{__file__} successfully executed")
+
+tdCases.addLinux(__file__, TDTestCase())
+tdCases.addWindows(__file__, TDTestCase())
diff --git a/tests/system-test/6-cluster/5dnode1mnode.py b/tests/system-test/6-cluster/5dnode1mnode.py
index 5f4ab7357b..4611726c14 100644
--- a/tests/system-test/6-cluster/5dnode1mnode.py
+++ b/tests/system-test/6-cluster/5dnode1mnode.py
@@ -124,9 +124,9 @@ class TDTestCase:
tdSql.query('show databases;')
tdSql.checkData(2,5,'no_strict')
tdSql.error('alter database db strict 0')
- tdSql.execute('alter database db strict 1')
- tdSql.query('show databases;')
- tdSql.checkData(2,5,'strict')
+ # tdSql.execute('alter database db strict 1')
+ # tdSql.query('show databases;')
+ # tdSql.checkData(2,5,'strict')
def getConnection(self, dnode):
host = dnode.cfgDict["fqdn"]
diff --git a/tests/system-test/6-cluster/5dnode3mnodeAdd1Ddnoe.py b/tests/system-test/6-cluster/5dnode3mnodeAdd1Ddnoe.py
new file mode 100644
index 0000000000..d3de31eb04
--- /dev/null
+++ b/tests/system-test/6-cluster/5dnode3mnodeAdd1Ddnoe.py
@@ -0,0 +1,229 @@
+from ssl import ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE
+from numpy import row_stack
+import taos
+import sys
+import time
+import os
+
+from util.log import *
+from util.sql import *
+from util.cases import *
+from util.dnodes import TDDnodes
+from util.dnodes import TDDnode
+from util.cluster import *
+sys.path.append("./6-cluster")
+from clusterCommonCreate import *
+from clusterCommonCheck import clusterComCheck
+
+import time
+import socket
+import subprocess
+from multiprocessing import Process
+import threading
+import time
+import inspect
+import ctypes
+
+class TDTestCase:
+
+ def init(self,conn ,logSql):
+ tdLog.debug(f"start to excute {__file__}")
+ self.TDDnodes = None
+ tdSql.init(conn.cursor())
+ self.host = socket.gethostname()
+
+
+ def getBuildPath(self):
+ selfPath = os.path.dirname(os.path.realpath(__file__))
+
+ if ("community" in selfPath):
+ projPath = selfPath[:selfPath.find("community")]
+ else:
+ projPath = selfPath[:selfPath.find("tests")]
+
+ for root, dirs, files in os.walk(projPath):
+ if ("taosd" in files):
+ rootRealPath = os.path.dirname(os.path.realpath(root))
+ if ("packaging" not in rootRealPath):
+ buildPath = root[:len(root) - len("/build/bin")]
+ break
+ return buildPath
+
+ def _async_raise(self, tid, exctype):
+ """raises the exception, performs cleanup if needed"""
+ if not inspect.isclass(exctype):
+ exctype = type(exctype)
+ res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))
+ if res == 0:
+ raise ValueError("invalid thread id")
+ elif res != 1:
+ # """if it returns a number greater than one, you're in trouble,
+ # and you should call it again with exc=NULL to revert the effect"""
+ ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)
+ raise SystemError("PyThreadState_SetAsyncExc failed")
+
+ def stopThread(self,thread):
+ self._async_raise(thread.ident, SystemExit)
+
+
+ def insertData(self,countstart,countstop):
+ # fisrt add data : db\stable\childtable\general table
+
+ for couti in range(countstart,countstop):
+ tdLog.debug("drop database if exists db%d" %couti)
+ tdSql.execute("drop database if exists db%d" %couti)
+ print("create database if not exists db%d replica 1 duration 300" %couti)
+ tdSql.execute("create database if not exists db%d replica 1 duration 300" %couti)
+ tdSql.execute("use db%d" %couti)
+ tdSql.execute(
+ '''create table stb1
+ (ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
+ tags (t1 int)
+ '''
+ )
+ tdSql.execute(
+ '''
+ create table t1
+ (ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
+ '''
+ )
+ for i in range(4):
+ tdSql.execute(f'create table ct{i+1} using stb1 tags ( {i+1} )')
+
+
+ def fiveDnodeThreeMnode(self,dnodeNumbers,mnodeNums,restartNumbers,stopRole):
+ tdLog.printNoPrefix("======== test case 1: ")
+ paraDict = {'dbName': 'db0_0',
+ 'dropFlag': 1,
+ 'event': '',
+ 'vgroups': 4,
+ 'replica': 1,
+ 'stbName': 'stb',
+ 'stbNumbers': 2,
+ 'colPrefix': 'c',
+ 'tagPrefix': 't',
+ 'colSchema': [{'type': 'INT', 'count':1}, {'type': 'binary', 'len':20, 'count':1}],
+ 'tagSchema': [{'type': 'INT', 'count':1}, {'type': 'binary', 'len':20, 'count':1}],
+ 'ctbPrefix': 'ctb',
+ 'ctbNum': 200,
+ 'startTs': 1640966400000, # 2022-01-01 00:00:00.000
+ "rowsPerTbl": 1000,
+ "batchNum": 5000
+ }
+ hostname = socket.gethostname()
+ dnodeNumbers=int(dnodeNumbers)
+ mnodeNums=int(mnodeNums)
+ vnodeNumbers = int(dnodeNumbers-mnodeNums)
+ allctbNumbers=(paraDict['stbNumbers']*paraDict["ctbNum"])
+ rowsPerStb=paraDict["ctbNum"]*paraDict["rowsPerTbl"]
+ rowsall=rowsPerStb*paraDict['stbNumbers']
+ dbNumbers = 1
+
+ tdLog.info("first check dnode and mnode")
+ tdSql.query("show dnodes;")
+ tdSql.checkData(0,1,'%s:6030'%self.host)
+ tdSql.checkData(4,1,'%s:6430'%self.host)
+ clusterComCheck.checkDnodes(dnodeNumbers)
+ clusterComCheck.checkMnodeStatus(1)
+
+ # fisr add three mnodes;
+ tdLog.info("fisr add three mnodes and check mnode status")
+ tdSql.execute("create mnode on dnode 2")
+ clusterComCheck.checkMnodeStatus(2)
+ tdSql.execute("create mnode on dnode 3")
+ clusterComCheck.checkMnodeStatus(3)
+
+ # add some error operations and
+ tdLog.info("Confirm the status of the dnode again")
+ tdSql.error("create mnode on dnode 2")
+ tdSql.query("show dnodes;")
+ print(tdSql.queryResult)
+ clusterComCheck.checkDnodes(dnodeNumbers)
+
+ # create database and stable
+ clusterComCreate.create_database(tdSql, paraDict["dbName"],paraDict["dropFlag"], paraDict["vgroups"],paraDict['replica'])
+ tdLog.info("Take turns stopping Mnodes ")
+
+ tdDnodes=cluster.dnodes
+ # dnode6=cluster.addDnode(6)
+ # tdDnodes.append(dnode6)
+ # tdDnodes = ClusterDnodes(tdDnodes)
+ stopcount =0
+ threads=[]
+
+ # create stable:stb_0
+ stableName= paraDict['stbName']
+ newTdSql=tdCom.newTdSql()
+ clusterComCreate.create_stables(newTdSql, paraDict["dbName"],stableName,paraDict['stbNumbers'])
+ #create child table:ctb_0
+ for i in range(paraDict['stbNumbers']):
+ stableName= '%s_%d'%(paraDict['stbName'],i)
+ newTdSql=tdCom.newTdSql()
+ clusterComCreate.create_ctable(newTdSql, paraDict["dbName"],stableName,stableName, paraDict['ctbNum'])
+ #insert date
+ for i in range(paraDict['stbNumbers']):
+ stableName= '%s_%d'%(paraDict['stbName'],i)
+ newTdSql=tdCom.newTdSql()
+ threads.append(threading.Thread(target=clusterComCreate.insert_data, args=(newTdSql, paraDict["dbName"],stableName,paraDict["ctbNum"],paraDict["rowsPerTbl"],paraDict["batchNum"],paraDict["startTs"])))
+ for tr in threads:
+ tr.start()
+ dnode6Port=int(6030+5*100)
+ tdSql.execute("create dnode '%s:%d'"%(hostname,dnode6Port))
+ clusterComCheck.checkDnodes(dnodeNumbers)
+
+ while stopcount < restartNumbers:
+ tdLog.info(" restart loop: %d"%stopcount )
+ if stopRole == "mnode":
+ for i in range(mnodeNums):
+ tdDnodes[i].stoptaosd()
+ # sleep(10)
+ tdDnodes[i].starttaosd()
+ # sleep(10)
+ elif stopRole == "vnode":
+ for i in range(vnodeNumbers):
+ tdDnodes[i+mnodeNums].stoptaosd()
+ # sleep(10)
+ tdDnodes[i+mnodeNums].starttaosd()
+ # sleep(10)
+ elif stopRole == "dnode":
+ for i in range(dnodeNumbers):
+ tdDnodes[i].stoptaosd()
+ # sleep(10)
+ tdDnodes[i].starttaosd()
+ # sleep(10)
+
+ # dnodeNumbers don't include database of schema
+ if clusterComCheck.checkDnodes(dnodeNumbers):
+ tdLog.info("123")
+ else:
+ print("456")
+
+ self.stopThread(threads)
+ tdLog.exit("one or more of dnodes failed to start ")
+ # self.check3mnode()
+ stopcount+=1
+ for tr in threads:
+ tr.join()
+
+
+ clusterComCheck.checkDnodes(dnodeNumbers)
+ clusterComCheck.checkDbRows(dbNumbers)
+ # clusterComCheck.checkDb(dbNumbers,1,paraDict["dbName"])
+
+ tdSql.execute("use %s" %(paraDict["dbName"]))
+ tdSql.query("show stables")
+ tdSql.checkRows(paraDict["stbNumbers"])
+ for i in range(paraDict['stbNumbers']):
+ stableName= '%s_%d'%(paraDict['stbName'],i)
+ tdSql.query("select * from %s"%stableName)
+ tdSql.checkRows(rowsPerStb)
+ def run(self):
+ # print(self.master_dnode.cfgDict)
+ self.fiveDnodeThreeMnode(dnodeNumbers=5,mnodeNums=3,restartNumbers=2,stopRole='dnode')
+
+ def stop(self):
+ tdSql.close()
+ tdLog.success(f"{__file__} successfully executed")
+
+tdCases.addLinux(__file__, TDTestCase())
+tdCases.addWindows(__file__, TDTestCase())
\ No newline at end of file
diff --git a/tests/system-test/6-cluster/5dnode3mnodeRestartDnodeInsertData.py b/tests/system-test/6-cluster/5dnode3mnodeRestartDnodeInsertData.py
new file mode 100644
index 0000000000..e5946342d2
--- /dev/null
+++ b/tests/system-test/6-cluster/5dnode3mnodeRestartDnodeInsertData.py
@@ -0,0 +1,223 @@
+from ssl import ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE
+from numpy import row_stack
+import taos
+import sys
+import time
+import os
+
+from util.log import *
+from util.sql import *
+from util.cases import *
+from util.dnodes import TDDnodes
+from util.dnodes import TDDnode
+from util.cluster import *
+sys.path.append("./6-cluster")
+from clusterCommonCreate import *
+from clusterCommonCheck import clusterComCheck
+
+import time
+import socket
+import subprocess
+from multiprocessing import Process
+import threading
+import time
+import inspect
+import ctypes
+
+class TDTestCase:
+
+ def init(self,conn ,logSql):
+ tdLog.debug(f"start to excute {__file__}")
+ self.TDDnodes = None
+ tdSql.init(conn.cursor())
+ self.host = socket.gethostname()
+
+
+ def getBuildPath(self):
+ selfPath = os.path.dirname(os.path.realpath(__file__))
+
+ if ("community" in selfPath):
+ projPath = selfPath[:selfPath.find("community")]
+ else:
+ projPath = selfPath[:selfPath.find("tests")]
+
+ for root, dirs, files in os.walk(projPath):
+ if ("taosd" in files):
+ rootRealPath = os.path.dirname(os.path.realpath(root))
+ if ("packaging" not in rootRealPath):
+ buildPath = root[:len(root) - len("/build/bin")]
+ break
+ return buildPath
+
+ def _async_raise(self, tid, exctype):
+ """raises the exception, performs cleanup if needed"""
+ if not inspect.isclass(exctype):
+ exctype = type(exctype)
+ res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))
+ if res == 0:
+ raise ValueError("invalid thread id")
+ elif res != 1:
+ # """if it returns a number greater than one, you're in trouble,
+ # and you should call it again with exc=NULL to revert the effect"""
+ ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)
+ raise SystemError("PyThreadState_SetAsyncExc failed")
+
+ def stopThread(self,thread):
+ self._async_raise(thread.ident, SystemExit)
+
+
+ def insertData(self,countstart,countstop):
+ # fisrt add data : db\stable\childtable\general table
+
+ for couti in range(countstart,countstop):
+ tdLog.debug("drop database if exists db%d" %couti)
+ tdSql.execute("drop database if exists db%d" %couti)
+ print("create database if not exists db%d replica 1 duration 300" %couti)
+ tdSql.execute("create database if not exists db%d replica 1 duration 300" %couti)
+ tdSql.execute("use db%d" %couti)
+ tdSql.execute(
+ '''create table stb1
+ (ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
+ tags (t1 int)
+ '''
+ )
+ tdSql.execute(
+ '''
+ create table t1
+ (ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
+ '''
+ )
+ for i in range(4):
+ tdSql.execute(f'create table ct{i+1} using stb1 tags ( {i+1} )')
+
+
+ def fiveDnodeThreeMnode(self,dnodeNumbers,mnodeNums,restartNumbers,stopRole):
+ tdLog.printNoPrefix("======== test case 1: ")
+ paraDict = {'dbName': 'db0_0',
+ 'dropFlag': 1,
+ 'event': '',
+ 'vgroups': 4,
+ 'replica': 1,
+ 'stbName': 'stb',
+ 'stbNumbers': 2,
+ 'colPrefix': 'c',
+ 'tagPrefix': 't',
+ 'colSchema': [{'type': 'INT', 'count':1}, {'type': 'binary', 'len':20, 'count':1}],
+ 'tagSchema': [{'type': 'INT', 'count':1}, {'type': 'binary', 'len':20, 'count':1}],
+ 'ctbPrefix': 'ctb',
+ 'ctbNum': 200,
+ 'startTs': 1640966400000, # 2022-01-01 00:00:00.000
+ "rowsPerTbl": 1000,
+ "batchNum": 5000
+ }
+
+ dnodeNumbers=int(dnodeNumbers)
+ mnodeNums=int(mnodeNums)
+ vnodeNumbers = int(dnodeNumbers-mnodeNums)
+ allctbNumbers=(paraDict['stbNumbers']*paraDict["ctbNum"])
+ rowsPerStb=paraDict["ctbNum"]*paraDict["rowsPerTbl"]
+ rowsall=rowsPerStb*paraDict['stbNumbers']
+ dbNumbers = 1
+
+ tdLog.info("first check dnode and mnode")
+ tdSql.query("show dnodes;")
+ tdSql.checkData(0,1,'%s:6030'%self.host)
+ tdSql.checkData(4,1,'%s:6430'%self.host)
+ clusterComCheck.checkDnodes(dnodeNumbers)
+ clusterComCheck.checkMnodeStatus(1)
+
+ # fisr add three mnodes;
+ tdLog.info("fisr add three mnodes and check mnode status")
+ tdSql.execute("create mnode on dnode 2")
+ clusterComCheck.checkMnodeStatus(2)
+ tdSql.execute("create mnode on dnode 3")
+ clusterComCheck.checkMnodeStatus(3)
+
+ # add some error operations and
+ tdLog.info("Confirm the status of the dnode again")
+ tdSql.error("create mnode on dnode 2")
+ tdSql.query("show dnodes;")
+ print(tdSql.queryResult)
+ clusterComCheck.checkDnodes(dnodeNumbers)
+
+ # create database and stable
+ clusterComCreate.create_database(tdSql, paraDict["dbName"],paraDict["dropFlag"], paraDict["vgroups"],paraDict['replica'])
+ tdLog.info("Take turns stopping Mnodes ")
+
+ tdDnodes=cluster.dnodes
+ stopcount =0
+ threads=[]
+
+ # create stable:stb_0
+ stableName= paraDict['stbName']
+ newTdSql=tdCom.newTdSql()
+ clusterComCreate.create_stables(newTdSql, paraDict["dbName"],stableName,paraDict['stbNumbers'])
+ #create child table:ctb_0
+ for i in range(paraDict['stbNumbers']):
+ stableName= '%s_%d'%(paraDict['stbName'],i)
+ newTdSql=tdCom.newTdSql()
+ clusterComCreate.create_ctable(newTdSql, paraDict["dbName"],stableName,stableName, paraDict['ctbNum'])
+ #insert date
+ for i in range(paraDict['stbNumbers']):
+ stableName= '%s_%d'%(paraDict['stbName'],i)
+ newTdSql=tdCom.newTdSql()
+ threads.append(threading.Thread(target=clusterComCreate.insert_data, args=(newTdSql, paraDict["dbName"],stableName,paraDict["ctbNum"],paraDict["rowsPerTbl"],paraDict["batchNum"],paraDict["startTs"])))
+ for tr in threads:
+ tr.start()
+ for tr in threads:
+ tr.join()
+
+ while stopcount < restartNumbers:
+ tdLog.info(" restart loop: %d"%stopcount )
+ if stopRole == "mnode":
+ for i in range(mnodeNums):
+ tdDnodes[i].stoptaosd()
+ # sleep(10)
+ tdDnodes[i].starttaosd()
+ # sleep(10)
+ elif stopRole == "vnode":
+ for i in range(vnodeNumbers):
+ tdDnodes[i+mnodeNums].stoptaosd()
+ # sleep(10)
+ tdDnodes[i+mnodeNums].starttaosd()
+ # sleep(10)
+ elif stopRole == "dnode":
+ for i in range(dnodeNumbers):
+ tdDnodes[i].stoptaosd()
+ # sleep(10)
+ tdDnodes[i].starttaosd()
+ # sleep(10)
+
+ # dnodeNumbers don't include database of schema
+ if clusterComCheck.checkDnodes(dnodeNumbers):
+ tdLog.info("123")
+ else:
+ print("456")
+
+ self.stopThread(threads)
+ tdLog.exit("one or more of dnodes failed to start ")
+ # self.check3mnode()
+ stopcount+=1
+
+
+ clusterComCheck.checkDnodes(dnodeNumbers)
+ clusterComCheck.checkDbRows(dbNumbers)
+ # clusterComCheck.checkDb(dbNumbers,1,paraDict["dbName"])
+
+ tdSql.execute("use %s" %(paraDict["dbName"]))
+ tdSql.query("show stables")
+ tdSql.checkRows(paraDict["stbNumbers"])
+ for i in range(paraDict['stbNumbers']):
+ stableName= '%s_%d'%(paraDict['stbName'],i)
+ tdSql.query("select * from %s"%stableName)
+ tdSql.checkRows(rowsPerStb)
+ def run(self):
+ # print(self.master_dnode.cfgDict)
+ self.fiveDnodeThreeMnode(dnodeNumbers=5,mnodeNums=3,restartNumbers=2,stopRole='dnode')
+
+ def stop(self):
+ tdSql.close()
+ tdLog.success(f"{__file__} successfully executed")
+
+tdCases.addLinux(__file__, TDTestCase())
+tdCases.addWindows(__file__, TDTestCase())
\ No newline at end of file
diff --git a/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateDb.py b/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateDb.py
index 96fad487d1..8971a51ef3 100644
--- a/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateDb.py
+++ b/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateDb.py
@@ -143,42 +143,43 @@ class TDTestCase:
threads=[]
for i in range(restartNumbers):
dbNameIndex = '%s%d'%(paraDict["dbName"],i)
- threads.append(threading.Thread(target=clusterComCreate.create_databases, args=(tdSql, dbNameIndex,paraDict["dbNumbers"],paraDict["dropFlag"], paraDict["vgroups"],paraDict['replica'])))
+ newTdSql=tdCom.newTdSql()
+ threads.append(threading.Thread(target=clusterComCreate.create_databases, args=(newTdSql, dbNameIndex,paraDict["dbNumbers"],paraDict["dropFlag"], paraDict["vgroups"],paraDict['replica'])))
for tr in threads:
tr.start()
tdLog.info("Take turns stopping Mnodes ")
- # while stopcount < restartNumbers:
- # tdLog.info(" restart loop: %d"%stopcount )
- # if stopRole == "mnode":
- # for i in range(mnodeNums):
- # tdDnodes[i].stoptaosd()
- # # sleep(10)
- # tdDnodes[i].starttaosd()
- # # sleep(10)
- # elif stopRole == "vnode":
- # for i in range(vnodeNumbers):
- # tdDnodes[i+mnodeNums].stoptaosd()
- # # sleep(10)
- # tdDnodes[i+mnodeNums].starttaosd()
- # # sleep(10)
- # elif stopRole == "dnode":
- # for i in range(dnodeNumbers):
- # tdDnodes[i].stoptaosd()
- # # sleep(10)
- # tdDnodes[i].starttaosd()
- # # sleep(10)
+ while stopcount < restartNumbers:
+ tdLog.info(" restart loop: %d"%stopcount )
+ if stopRole == "mnode":
+ for i in range(mnodeNums):
+ tdDnodes[i].stoptaosd()
+ # sleep(10)
+ tdDnodes[i].starttaosd()
+ # sleep(10)
+ elif stopRole == "vnode":
+ for i in range(vnodeNumbers):
+ tdDnodes[i+mnodeNums].stoptaosd()
+ # sleep(10)
+ tdDnodes[i+mnodeNums].starttaosd()
+ # sleep(10)
+ elif stopRole == "dnode":
+ for i in range(dnodeNumbers):
+ tdDnodes[i].stoptaosd()
+ # sleep(10)
+ tdDnodes[i].starttaosd()
+ # sleep(10)
- # # dnodeNumbers don't include database of schema
- # if clusterComCheck.checkDnodes(dnodeNumbers):
- # tdLog.info("check dnodes status is ready")
- # else:
- # tdLog.info("check dnodes status is not ready")
- # self.stopThread(threads)
- # tdLog.exit("one or more of dnodes failed to start ")
- # # self.check3mnode()
- # stopcount+=1
+ # dnodeNumbers don't include database of schema
+ if clusterComCheck.checkDnodes(dnodeNumbers):
+ tdLog.info("check dnodes status is ready")
+ else:
+ tdLog.info("check dnodes status is not ready")
+ self.stopThread(threads)
+ tdLog.exit("one or more of dnodes failed to start ")
+ # self.check3mnode()
+ stopcount+=1
for tr in threads:
tr.join()
diff --git a/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateStb.py b/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateStb.py
index 4ab9aa64e1..6db1a9fddd 100644
--- a/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateStb.py
+++ b/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateStb.py
@@ -92,7 +92,7 @@ class TDTestCase:
def fiveDnodeThreeMnode(self,dnodeNumbers,mnodeNums,restartNumbers,stopRole):
tdLog.printNoPrefix("======== test case 1: ")
- paraDict = {'dbName': 'db0_0',
+ paraDict = {'dbName': 'db',
'dropFlag': 1,
'event': '',
'vgroups': 4,
@@ -143,7 +143,8 @@ class TDTestCase:
threads=[]
for i in range(restartNumbers):
stableName= '%s%d'%(paraDict['stbName'],i)
- threads.append(threading.Thread(target=clusterComCreate.create_stables, args=(tdSql, paraDict["dbName"],stableName,paraDict['stbNumbers'])))
+ newTdSql=tdCom.newTdSql()
+ threads.append(threading.Thread(target=clusterComCreate.create_stables, args=(newTdSql, paraDict["dbName"],stableName,paraDict['stbNumbers'])))
for tr in threads:
tr.start()
diff --git a/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeInsertData.py b/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeInsertData.py
new file mode 100644
index 0000000000..8f99ef0b5c
--- /dev/null
+++ b/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopDnodeInsertData.py
@@ -0,0 +1,221 @@
+from ssl import ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE
+from numpy import row_stack
+import taos
+import sys
+import time
+import os
+
+from util.log import *
+from util.sql import *
+from util.cases import *
+from util.dnodes import TDDnodes
+from util.dnodes import TDDnode
+from util.cluster import *
+sys.path.append("./6-cluster")
+from clusterCommonCreate import *
+from clusterCommonCheck import clusterComCheck
+
+import time
+import socket
+import subprocess
+from multiprocessing import Process
+import threading
+import time
+import inspect
+import ctypes
+
+class TDTestCase:
+
+ def init(self,conn ,logSql):
+ tdLog.debug(f"start to excute {__file__}")
+ self.TDDnodes = None
+ tdSql.init(conn.cursor())
+ self.host = socket.gethostname()
+
+
+ def getBuildPath(self):
+ selfPath = os.path.dirname(os.path.realpath(__file__))
+
+ if ("community" in selfPath):
+ projPath = selfPath[:selfPath.find("community")]
+ else:
+ projPath = selfPath[:selfPath.find("tests")]
+
+ for root, dirs, files in os.walk(projPath):
+ if ("taosd" in files):
+ rootRealPath = os.path.dirname(os.path.realpath(root))
+ if ("packaging" not in rootRealPath):
+ buildPath = root[:len(root) - len("/build/bin")]
+ break
+ return buildPath
+
+ def _async_raise(self, tid, exctype):
+ """raises the exception, performs cleanup if needed"""
+ if not inspect.isclass(exctype):
+ exctype = type(exctype)
+ res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))
+ if res == 0:
+ raise ValueError("invalid thread id")
+ elif res != 1:
+ # """if it returns a number greater than one, you're in trouble,
+ # and you should call it again with exc=NULL to revert the effect"""
+ ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)
+ raise SystemError("PyThreadState_SetAsyncExc failed")
+
+ def stopThread(self,thread):
+ self._async_raise(thread.ident, SystemExit)
+
+
+ def insertData(self,countstart,countstop):
+ # fisrt add data : db\stable\childtable\general table
+
+ for couti in range(countstart,countstop):
+ tdLog.debug("drop database if exists db%d" %couti)
+ tdSql.execute("drop database if exists db%d" %couti)
+ print("create database if not exists db%d replica 1 duration 300" %couti)
+ tdSql.execute("create database if not exists db%d replica 1 duration 300" %couti)
+ tdSql.execute("use db%d" %couti)
+ tdSql.execute(
+ '''create table stb1
+ (ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
+ tags (t1 int)
+ '''
+ )
+ tdSql.execute(
+ '''
+ create table t1
+ (ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
+ '''
+ )
+ for i in range(4):
+ tdSql.execute(f'create table ct{i+1} using stb1 tags ( {i+1} )')
+
+
+ def fiveDnodeThreeMnode(self,dnodeNumbers,mnodeNums,restartNumbers,stopRole):
+ tdLog.printNoPrefix("======== test case 1: ")
+ paraDict = {'dbName': 'db0_0',
+ 'dropFlag': 1,
+ 'event': '',
+ 'vgroups': 4,
+ 'replica': 1,
+ 'stbName': 'stb',
+ 'stbNumbers': 2,
+ 'colPrefix': 'c',
+ 'tagPrefix': 't',
+ 'colSchema': [{'type': 'INT', 'count':1}, {'type': 'binary', 'len':20, 'count':1}],
+ 'tagSchema': [{'type': 'INT', 'count':1}, {'type': 'binary', 'len':20, 'count':1}],
+ 'ctbPrefix': 'ctb',
+ 'ctbNum': 200,
+ 'startTs': 1640966400000, # 2022-01-01 00:00:00.000
+ "rowsPerTbl": 10000,
+ "batchNum": 5000
+ }
+
+ dnodeNumbers=int(dnodeNumbers)
+ mnodeNums=int(mnodeNums)
+ vnodeNumbers = int(dnodeNumbers-mnodeNums)
+ allctbNumbers=(paraDict['stbNumbers']*paraDict["ctbNum"])
+ rowsPerStb=paraDict["ctbNum"]*paraDict["rowsPerTbl"]
+ rowsall=rowsPerStb*paraDict['stbNumbers']
+ dbNumbers = 1
+
+ tdLog.info("first check dnode and mnode")
+ tdSql.query("show dnodes;")
+ tdSql.checkData(0,1,'%s:6030'%self.host)
+ tdSql.checkData(4,1,'%s:6430'%self.host)
+ clusterComCheck.checkDnodes(dnodeNumbers)
+ clusterComCheck.checkMnodeStatus(1)
+
+ # fisr add three mnodes;
+ tdLog.info("fisr add three mnodes and check mnode status")
+ tdSql.execute("create mnode on dnode 2")
+ clusterComCheck.checkMnodeStatus(2)
+ tdSql.execute("create mnode on dnode 3")
+ clusterComCheck.checkMnodeStatus(3)
+
+ # add some error operations and
+ tdLog.info("Confirm the status of the dnode again")
+ tdSql.error("create mnode on dnode 2")
+ tdSql.query("show dnodes;")
+ print(tdSql.queryResult)
+ clusterComCheck.checkDnodes(dnodeNumbers)
+
+ # create database and stable
+ clusterComCreate.create_database(tdSql, paraDict["dbName"],paraDict["dropFlag"], paraDict["vgroups"],paraDict['replica'])
+ tdLog.info("Take turns stopping Mnodes ")
+
+ tdDnodes=cluster.dnodes
+ stopcount =0
+ threads=[]
+
+ # create stable:stb_0
+ stableName= paraDict['stbName']
+ newTdSql=tdCom.newTdSql()
+ clusterComCreate.create_stables(newTdSql, paraDict["dbName"],stableName,paraDict['stbNumbers'])
+ #create child table:ctb_0
+ for i in range(paraDict['stbNumbers']):
+ stableName= '%s_%d'%(paraDict['stbName'],i)
+ newTdSql=tdCom.newTdSql()
+ clusterComCreate.create_ctable(newTdSql, paraDict["dbName"],stableName,stableName, paraDict['ctbNum'])
+ #insert date
+ for i in range(paraDict['stbNumbers']):
+ stableName= '%s_%d'%(paraDict['stbName'],i)
+ newTdSql=tdCom.newTdSql()
+ threads.append(threading.Thread(target=clusterComCreate.insert_data, args=(newTdSql, paraDict["dbName"],stableName,paraDict["ctbNum"],paraDict["rowsPerTbl"],paraDict["batchNum"],paraDict["startTs"])))
+ for tr in threads:
+ tr.start()
+ while stopcount < restartNumbers:
+ tdLog.info(" restart loop: %d"%stopcount )
+ if stopRole == "mnode":
+ for i in range(mnodeNums):
+ tdDnodes[i].stoptaosd()
+ # sleep(10)
+ tdDnodes[i].starttaosd()
+ # sleep(10)
+ elif stopRole == "vnode":
+ for i in range(vnodeNumbers):
+ tdDnodes[i+mnodeNums].stoptaosd()
+ # sleep(10)
+ tdDnodes[i+mnodeNums].starttaosd()
+ # sleep(10)
+ elif stopRole == "dnode":
+ for i in range(dnodeNumbers):
+ tdDnodes[i].stoptaosd()
+ # sleep(10)
+ tdDnodes[i].starttaosd()
+ # sleep(10)
+
+ # dnodeNumbers don't include database of schema
+ if clusterComCheck.checkDnodes(dnodeNumbers):
+ tdLog.info("123")
+ else:
+ print("456")
+
+ self.stopThread(threads)
+ tdLog.exit("one or more of dnodes failed to start ")
+ # self.check3mnode()
+ stopcount+=1
+
+ for tr in threads:
+ tr.join()
+ clusterComCheck.checkDnodes(dnodeNumbers)
+ clusterComCheck.checkDbRows(dbNumbers)
+ # clusterComCheck.checkDb(dbNumbers,1,paraDict["dbName"])
+
+ tdSql.execute("use %s" %(paraDict["dbName"]))
+ tdSql.query("show stables")
+ tdSql.checkRows(paraDict["stbNumbers"])
+ for i in range(paraDict['stbNumbers']):
+ stableName= '%s_%d'%(paraDict['stbName'],i)
+ tdSql.query("select * from %s"%stableName)
+ tdSql.checkRows(rowsPerStb)
+ def run(self):
+ # print(self.master_dnode.cfgDict)
+ self.fiveDnodeThreeMnode(dnodeNumbers=5,mnodeNums=3,restartNumbers=2,stopRole='dnode')
+
+ def stop(self):
+ tdSql.close()
+ tdLog.success(f"{__file__} successfully executed")
+
+tdCases.addLinux(__file__, TDTestCase())
+tdCases.addWindows(__file__, TDTestCase())
\ No newline at end of file
diff --git a/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateDb.py b/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateDb.py
index 17c344e341..f820d812ec 100644
--- a/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateDb.py
+++ b/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateDb.py
@@ -116,7 +116,8 @@ class TDTestCase:
threads=[]
for i in range(restartNumbers):
dbNameIndex = '%s%d'%(paraDict["dbName"],i)
- threads.append(threading.Thread(target=clusterComCreate.create_databases, args=(tdSql, dbNameIndex,paraDict["dbNumbers"],paraDict["dropFlag"], paraDict["vgroups"],paraDict['replica'])))
+ newTdSql=tdCom.newTdSql()
+ threads.append(threading.Thread(target=clusterComCreate.create_databases, args=(newTdSql, dbNameIndex,paraDict["dbNumbers"],paraDict["dropFlag"], paraDict["vgroups"],paraDict['replica'])))
for tr in threads:
tr.start()
diff --git a/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopVnodeCreateStb.py b/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopVnodeCreateStb.py
index 2f1c1368d1..128dc10b37 100644
--- a/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopVnodeCreateStb.py
+++ b/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopVnodeCreateStb.py
@@ -30,8 +30,8 @@ class TDTestCase:
self.TDDnodes = None
tdSql.init(conn.cursor())
self.host = socket.gethostname()
-
-
+ print(tdSql)
+
def getBuildPath(self):
selfPath = os.path.dirname(os.path.realpath(__file__))
@@ -113,6 +113,7 @@ class TDTestCase:
allStbNumbers=(paraDict['stbNumbers']*restartNumbers)
dbNumbers = 1
+ print(tdSql)
tdLog.info("first check dnode and mnode")
tdSql.query("show dnodes;")
tdSql.checkData(0,1,'%s:6030'%self.host)
@@ -141,9 +142,11 @@ class TDTestCase:
tdDnodes=cluster.dnodes
stopcount =0
threads=[]
+
for i in range(restartNumbers):
stableName= '%s%d'%(paraDict['stbName'],i)
- threads.append(threading.Thread(target=clusterComCreate.create_stables, args=(tdSql, paraDict["dbName"],stableName,paraDict['stbNumbers'])))
+ newTdSql=tdCom.newTdSql()
+ threads.append(threading.Thread(target=clusterComCreate.create_stables, args=(newTdSql, paraDict["dbName"],stableName,paraDict['stbNumbers'])))
for tr in threads:
tr.start()
diff --git a/tests/system-test/6-cluster/clusterCommonCreate.py b/tests/system-test/6-cluster/clusterCommonCreate.py
index 9d3f74a2e3..851fe3b51c 100644
--- a/tests/system-test/6-cluster/clusterCommonCreate.py
+++ b/tests/system-test/6-cluster/clusterCommonCreate.py
@@ -152,7 +152,7 @@ class ClusterComCreate:
if (i % 2 == 0):
tagValue = 'shanghai'
- sql += " %s%d using %s tags(%d, '%s')"%(ctbPrefix,i,stbName,i+1, tagValue)
+ sql += " %s_%d using %s tags(%d, '%s')"%(ctbPrefix,i,stbName,i+1, tagValue)
if (i > 0) and (i%100 == 0):
tsql.execute(sql)
sql = pre_create
@@ -173,13 +173,13 @@ class ClusterComCreate:
startTs = int(round(t * 1000))
#tdLog.debug("doing insert data into stable:%s rows:%d ..."%(stbName, allRows))
for i in range(ctbNum):
- sql += " %s%d values "%(stbName,i)
+ sql += " %s_%d values "%(stbName,i)
for j in range(rowsPerTbl):
- sql += "(%d, %d, 'tmqrow_%d') "%(startTs + j, j, j)
+ sql += "(%d, %d, %d, 'mnode_%d') "%(startTs + j, j, j,j)
if (j > 0) and ((j%batchNum == 0) or (j == rowsPerTbl - 1)):
tsql.execute(sql)
if j < rowsPerTbl - 1:
- sql = "insert into %s%d values " %(stbName,i)
+ sql = "insert into %s_%d values " %(stbName,i)
else:
sql = "insert into "
#end sql
diff --git a/tests/system-test/fulltest.sh b/tests/system-test/fulltest.sh
index 9ed34daf69..3b0dd76a30 100755
--- a/tests/system-test/fulltest.sh
+++ b/tests/system-test/fulltest.sh
@@ -122,10 +122,10 @@ python3 ./test.py -f 2-query/and_or_for_byte.py
python3 ./test.py -f 2-query/function_null.py
#python3 ./test.py -f 2-query/queryQnode.py
-#python3 ./test.py -f 6-cluster/5dnode1mnode.py
-#python3 ./test.py -f 6-cluster/5dnode2mnode.py -N 5 -M 3
+python3 ./test.py -f 6-cluster/5dnode1mnode.py
+#BUG python3 ./test.py -f 6-cluster/5dnode2mnode.py -N 5 -M 3
#python3 ./test.py -f 6-cluster/5dnode3mnodeStop.py -N 5 -M 3
-#python3 ./test.py -f 6-cluster/5dnode3mnodeStopLoop.py -N 5 -M 3
+python3 ./test.py -f 6-cluster/5dnode3mnodeStopLoop.py -N 5 -M 3
# BUG python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateDb.py -N 5 -M 3
# BUG python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateDb.py -N 5 -M 3
python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopVnodeCreateDb.py -N 5 -M 3
@@ -135,7 +135,8 @@ python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopVnodeCreateDb.py -N 5 -
# BUG python3 ./test.py -f 6-cluster/5dnode3mnodeStopInsert.py
# python3 ./test.py -f 6-cluster/5dnode3mnodeDrop.py -N 5
# python3 test.py -f 6-cluster/5dnode3mnodeStopConnect.py -N 5 -M 3
-
+# BUG Redict python3 ./test.py -f 6-cluster/5dnode3mnodeAdd1Ddnoe.py -N 6 -M 3 -C 5
+# python3 ./test.py -f 6-cluster/5dnode3mnodeRestartDnodeInsertData.py -N 5 -M 3
python3 ./test.py -f 7-tmq/basic5.py
python3 ./test.py -f 7-tmq/subscribeDb.py
diff --git a/tests/system-test/test.py b/tests/system-test/test.py
index 9596efdfc8..0a891759d0 100644
--- a/tests/system-test/test.py
+++ b/tests/system-test/test.py
@@ -64,8 +64,9 @@ if __name__ == "__main__":
updateCfgDict = {}
execCmd = ""
queryPolicy = 1
- opts, args = getopt.gnu_getopt(sys.argv[1:], 'f:p:m:l:scghrd:k:e:N:M:Q:', [
- 'file=', 'path=', 'master', 'logSql', 'stop', 'cluster', 'valgrind', 'help', 'restart', 'updateCfgDict', 'killv', 'execCmd','dnodeNums','mnodeNums','queryPolicy'])
+ createDnodeNums = 1
+ opts, args = getopt.gnu_getopt(sys.argv[1:], 'f:p:m:l:scghrd:k:e:N:M:Q:C:', [
+ 'file=', 'path=', 'master', 'logSql', 'stop', 'cluster', 'valgrind', 'help', 'restart', 'updateCfgDict', 'killv', 'execCmd','dnodeNums','mnodeNums','queryPolicy','createDnodeNums'])
for key, value in opts:
if key in ['-h', '--help']:
tdLog.printNoPrefix(
@@ -81,9 +82,11 @@ if __name__ == "__main__":
tdLog.printNoPrefix('-d update cfg dict, base64 json str')
tdLog.printNoPrefix('-k not kill valgrind processer')
tdLog.printNoPrefix('-e eval str to run')
- tdLog.printNoPrefix('-N create dnodes numbers in clusters')
+ tdLog.printNoPrefix('-N start dnodes numbers in clusters')
tdLog.printNoPrefix('-M create mnode numbers in clusters')
tdLog.printNoPrefix('-Q set queryPolicy in one dnode')
+ tdLog.printNoPrefix('-C create Dnode Numbers in one cluster')
+
sys.exit(0)
@@ -143,6 +146,9 @@ if __name__ == "__main__":
if key in ['-Q', '--queryPolicy']:
queryPolicy = value
+ if key in ['-C', '--createDnodeNums']:
+ createDnodeNums = value
+
if not execCmd == "":
tdDnodes.init(deployPath)
print(execCmd)
@@ -239,7 +245,11 @@ if __name__ == "__main__":
host,
config=tdDnodes.getSimCfgPath())
print(tdDnodes.getSimCfgPath(),host)
- cluster.create_dnode(conn)
+ if createDnodeNums == 1:
+ createDnodeNums=dnodeNums
+ else:
+ createDnodeNums=createDnodeNums
+ cluster.create_dnode(conn,createDnodeNums)
try:
if cluster.check_dnode(conn) :
print("check dnode ready")
@@ -314,7 +324,11 @@ if __name__ == "__main__":
host,
config=tdDnodes.getSimCfgPath())
print(tdDnodes.getSimCfgPath(),host)
- cluster.create_dnode(conn)
+ if createDnodeNums == 1:
+ createDnodeNums=dnodeNums
+ else:
+ createDnodeNums=createDnodeNums
+ cluster.create_dnode(conn,createDnodeNums)
try:
if cluster.check_dnode(conn) :
print("check dnode ready")
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt
index 59908cca8a..5d463e1de9 100644
--- a/tools/CMakeLists.txt
+++ b/tools/CMakeLists.txt
@@ -1,25 +1,46 @@
IF (TD_WEBSOCKET)
- MESSAGE("${Green} use libtaos-ws${ColourReset}")
- IF (TD_LINUX)
- include(ExternalProject)
- ExternalProject_Add(taosws-rs
- PREFIX "taosws-rs"
- SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/taosws-rs
- BUILD_ALWAYS off
- DEPENDS taos
- BUILD_IN_SOURCE 1
- CONFIGURE_COMMAND cmake -E echo "taosws-rs no need cmake to config"
- PATCH_COMMAND
- COMMAND git clean -f -d
- BUILD_COMMAND
- COMMAND cargo build --release -p taos-ws-sys
- COMMAND ./taos-ws-sys/ci/package.sh
- INSTALL_COMMAND
- COMMAND cmake -E copy target/libtaosws/libtaosws.so ${CMAKE_BINARY_DIR}/build/lib
- COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/build/include
- COMMAND cmake -E copy target/libtaosws/taosws.h ${CMAKE_BINARY_DIR}/build/include
- )
- ENDIF()
+ MESSAGE("${Green} use libtaos-ws${ColourReset}")
+ IF (TD_LINUX)
+ IF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/taosws-rs/target/release/libtaosws.so" OR "${CMAKE_CURRENT_SOURCE_DIR}/taosws-rs/target/release/libtaosws.so" IS_NEWER_THAN "${CMAKE_SOURCE_DIR}/.git/modules/tools/taosws-rs/FETCH_HEAD")
+ include(ExternalProject)
+ ExternalProject_Add(taosws-rs
+ PREFIX "taosws-rs"
+ SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/taosws-rs
+ BUILD_ALWAYS off
+ DEPENDS taos
+ BUILD_IN_SOURCE 1
+ CONFIGURE_COMMAND cmake -E echo "taosws-rs no need cmake to config"
+ PATCH_COMMAND
+ COMMAND git clean -f -d
+ BUILD_COMMAND
+ COMMAND cargo build --release -p taos-ws-sys
+ COMMAND ./taos-ws-sys/ci/package.sh
+ INSTALL_COMMAND
+ COMMAND cmake -E copy target/libtaosws/libtaosws.so ${CMAKE_BINARY_DIR}/build/lib
+ COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/build/include
+ COMMAND cmake -E copy target/libtaosws/taosws.h ${CMAKE_BINARY_DIR}/build/include
+ )
+ ELSE()
+ include(ExternalProject)
+ ExternalProject_Add(taosws-rs
+ PREFIX "taosws-rs"
+ SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/taosws-rs
+ BUILD_ALWAYS on
+ DEPENDS taos
+ BUILD_IN_SOURCE 1
+ CONFIGURE_COMMAND cmake -E echo "taosws-rs no need cmake to config"
+ PATCH_COMMAND
+ COMMAND git clean -f -d
+ BUILD_COMMAND
+ COMMAND cargo build --release -p taos-ws-sys
+ COMMAND ./taos-ws-sys/ci/package.sh
+ INSTALL_COMMAND
+ COMMAND cmake -E copy target/libtaosws/libtaosws.so ${CMAKE_BINARY_DIR}/build/lib
+ COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/build/include
+ COMMAND cmake -E copy target/libtaosws/taosws.h ${CMAKE_BINARY_DIR}/build/include
+ )
+ ENDIF ()
+ ENDIF()
ENDIF ()
IF (TD_TAOS_TOOLS)
diff --git a/tools/taos-tools b/tools/taos-tools
index 9cb71e3c4c..3f42d428eb 160000
--- a/tools/taos-tools
+++ b/tools/taos-tools
@@ -1 +1 @@
-Subproject commit 9cb71e3c4c0474553aa961cbe19795541c29b5c7
+Subproject commit 3f42d428eb6b90dea2651f4ccea66e44705c831b
diff --git a/tools/taosws-rs b/tools/taosws-rs
index 430982a0c2..7a94ffab45 160000
--- a/tools/taosws-rs
+++ b/tools/taosws-rs
@@ -1 +1 @@
-Subproject commit 430982a0c2c29a819ffc414d11f49f2d424ca3fe
+Subproject commit 7a94ffab45f08e16f09b3f430fe75d717054adb6