From 32b23885ad93d29e2d4ba3e26c0a91e126662c85 Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Fri, 6 Sep 2024 14:26:18 +0800 Subject: [PATCH 01/62] tetst:modify error path and correct checking timestamp data with timezone in windows ci --- tests/pytest/util/csv.py | 7 ++- tests/pytest/util/sql.py | 46 ++++++++++++++----- tests/system-test/0-others/backquote_check.py | 2 +- .../test_hot_refresh_configurations.py | 17 +++++-- .../1-insert/composite_primary_key_insert.py | 2 +- tests/system-test/1-insert/drop.py | 2 +- tests/system-test/2-query/fill.py | 2 +- tests/system-test/2-query/normal.py | 13 +++--- 8 files changed, 64 insertions(+), 27 deletions(-) diff --git a/tests/pytest/util/csv.py b/tests/pytest/util/csv.py index 6e1ee1732c..2d2e929c86 100644 --- a/tests/pytest/util/csv.py +++ b/tests/pytest/util/csv.py @@ -1,5 +1,6 @@ import csv import os +import platform class TDCsv: def __init__(self): @@ -25,7 +26,11 @@ class TDCsv: @property def file(self): if self.file_name and self.file_path: - return os.path.join(self.file_path, self.file_name) + print(f"self.file_path {self.file_path}, self.file_name {self.file_name}") + csv_file = os.path.join(self.file_path, self.file_name) + if platform.system().lower() == 'windows': + csv_file = csv_file.replace("\\", "/") + return csv_file return None diff --git a/tests/pytest/util/sql.py b/tests/pytest/util/sql.py index 90d3f2fe6c..3bc784063e 100644 --- a/tests/pytest/util/sql.py +++ b/tests/pytest/util/sql.py @@ -24,26 +24,48 @@ from util.log import * from util.constant import * import ctypes import random -# from datetime import timezone +import datetime import time +from tzlocal import get_localzone def _parse_ns_timestamp(timestr): dt_obj = datetime.datetime.strptime(timestr[:len(timestr)-3], "%Y-%m-%d %H:%M:%S.%f") tz = int(int((dt_obj-datetime.datetime.fromtimestamp(0,dt_obj.tzinfo)).total_seconds())*1e9) + int(dt_obj.microsecond * 1000) + int(timestr[-3:]) return tz - def _parse_datetime(timestr): - try: - return datetime.datetime.strptime(timestr, '%Y-%m-%d %H:%M:%S.%f') - except ValueError: - pass - try: - return datetime.datetime.strptime(timestr, '%Y-%m-%d %H:%M:%S') - except ValueError: - pass + # defined timestr formats + formats = [ + '%Y-%m-%d %H:%M:%S.%f%z', # 包含微秒和时区偏移 + '%Y-%m-%d %H:%M:%S%z', # 不包含微秒但包含时区偏移 + '%Y-%m-%d %H:%M:%S.%f', # 包含微秒 + '%Y-%m-%d %H:%M:%S' # 不包含微秒 + ] + + for fmt in formats: + try: + # try to parse the string with the current format + dt = datetime.datetime.strptime(timestr, fmt) + # 如果字符串包含时区信息,则返回 aware 对象 + # if sting contains timezone info, return aware object + if dt.tzinfo is not None: + return dt + + else: + # if sting does not contain timezone info, assume it is in local timezone + # get local timezone + local_timezone = get_localzone() + # print("Timezone:", local_timezone) + return dt.replace(tzinfo=local_timezone) + except ValueError: + continue # if the current format does not match, try the next format + + # 如果所有格式都不匹配,返回 None + # if none of the formats match, return + raise ValueError(f"input format does not match. correct formats include: '{', '.join(formats)}'") class TDSql: + def __init__(self): self.queryRows = 0 self.queryCols = 0 @@ -408,6 +430,7 @@ class TDSql: if self.queryResult[row][col] != data: if self.cursor.istype(col, "TIMESTAMP"): + # tdLog.debug(f"self.queryResult[row][col]:{self.queryResult[row][col]}, data:{data},len(data):{len(data)}, isinstance(data,str) :{isinstance(data,str)}") # suppose user want to check nanosecond timestamp if a longer data passed`` if isinstance(data,str) : if (len(data) >= 28): @@ -419,8 +442,9 @@ class TDSql: args = (caller.filename, caller.lineno, self.sql, row, col, self.queryResult[row][col], data) tdLog.exit("%s(%d) failed: sql:%s row:%d col:%d data:%s != expect:%s" % args) else: + # tdLog.info(f"datetime.timezone.utc:{datetime.timezone.utc},data:{data},_parse_datetime(data).astimezone(datetime.timezone.utc):{_parse_datetime(data).astimezone(datetime.timezone.utc)}") if self.queryResult[row][col].astimezone(datetime.timezone.utc) == _parse_datetime(data).astimezone(datetime.timezone.utc): - # tdLog.info(f"sql:{self.sql}, row:{row} col:{col} data:{self.queryResult[row][col]} == expect:{data}") + # tdLog.info(f"sql:{self.sql}, row:{row} col:{col} data:{self.queryResult[row][col].astimezone(datetime.timezone.utc)} == expect:{_parse_datetime(data).astimezone(datetime.timezone.utc)}") if(show): tdLog.info("check successfully") else: diff --git a/tests/system-test/0-others/backquote_check.py b/tests/system-test/0-others/backquote_check.py index 8cb268fb3d..aad2e21e6e 100644 --- a/tests/system-test/0-others/backquote_check.py +++ b/tests/system-test/0-others/backquote_check.py @@ -133,7 +133,7 @@ class TDTestCase: def run(self): self.topic_name_check() self.db_name_check() - if platform.system().lower() == 'windows': + if platform.system().lower() != 'windows': self.stream_name_check() self.table_name_check() self.view_name_check() diff --git a/tests/system-test/0-others/test_hot_refresh_configurations.py b/tests/system-test/0-others/test_hot_refresh_configurations.py index 15f291787a..dfb190d4ec 100644 --- a/tests/system-test/0-others/test_hot_refresh_configurations.py +++ b/tests/system-test/0-others/test_hot_refresh_configurations.py @@ -165,18 +165,25 @@ class TDTestCase: if config_name == row[0]: tdLog.debug("Found variable '{}'".format(row[0])) return row[1] - + + def get_server_param_value(self, config_name): + tdSql.query("show dnode 1 variables;") + for row in tdSql.queryResult: + if config_name == row[0]: + tdLog.debug("Found variable '{}'".format(row[0])) + return row[1] + def cli_check(self, name, values, except_values=False): if not except_values: for v in values: - tdLog.debug("Set {} to {}".format(name, v)) + tdLog.debug("Set client {} to {}".format(name, v)) tdSql.execute(f'alter local "{name} {v}";') value = self.get_param_value(name) tdLog.debug("Get {} value: {}".format(name, value)) assert(v == int(value)) else: for v in values: - tdLog.debug("Set {} to {}".format(name, v)) + tdLog.debug("Set client {} to {}".format(name, v)) tdSql.error(f'alter local "{name} {v}";') def svr_check(self, name, alias, values, except_values=False): @@ -190,8 +197,8 @@ class TDTestCase: if not except_values: for v in values: dnode = random.choice(p_list) - tdSql.execute(f'alter {dnode} "{name} {v}";') - value = self.get_param_value(alias) + tdSql.execute(f'alter {dnode} "{name} {v}";',show=True) + value = self.get_server_param_value(name) if value: tdLog.debug(f"value: {value}") assert(value == str(bool(v)).lower() if is_bool else str(v)) diff --git a/tests/system-test/1-insert/composite_primary_key_insert.py b/tests/system-test/1-insert/composite_primary_key_insert.py index c888bacadc..311b9cf5b6 100644 --- a/tests/system-test/1-insert/composite_primary_key_insert.py +++ b/tests/system-test/1-insert/composite_primary_key_insert.py @@ -4,6 +4,7 @@ from util.log import * from util.sql import * from util.cases import * from util.csv import * +import platform import os import taos import json @@ -56,7 +57,6 @@ class TDTestCase: tdSql.init(conn.cursor(), True) self.testcasePath = os.path.split(__file__)[0] - self.testcasePath = self.testcasePath.replace('\\', '//') self.testcaseFilename = os.path.split(__file__)[-1] os.system("rm -rf %s/%s.sql" % (self.testcasePath,self.testcaseFilename)) # tdSql.execute(f"insert into db4096.ctb00 file '{self.testcasePath}//tableColumn4096csvLength64k.csv'") diff --git a/tests/system-test/1-insert/drop.py b/tests/system-test/1-insert/drop.py index bd5e4cab49..2bce60cafb 100644 --- a/tests/system-test/1-insert/drop.py +++ b/tests/system-test/1-insert/drop.py @@ -162,7 +162,7 @@ class TDTestCase: self.drop_ntb_check() self.drop_stb_ctb_check() self.drop_topic_check() - if platform.system().lower() == 'windows': + if platform.system().lower() != 'windows': self.drop_stream_check() pass def stop(self): diff --git a/tests/system-test/2-query/fill.py b/tests/system-test/2-query/fill.py index 31d2d92563..3a868b7877 100644 --- a/tests/system-test/2-query/fill.py +++ b/tests/system-test/2-query/fill.py @@ -1,6 +1,5 @@ import queue import random -from fabric2.runners import threading from pandas._libs import interval import taos import sys @@ -9,6 +8,7 @@ from util.common import TDCom from util.log import * from util.sql import * from util.cases import * +import threading diff --git a/tests/system-test/2-query/normal.py b/tests/system-test/2-query/normal.py index f4b40f408b..161a9e610d 100644 --- a/tests/system-test/2-query/normal.py +++ b/tests/system-test/2-query/normal.py @@ -140,14 +140,14 @@ class TDTestCase: tdsql2 = tdCom.newTdSqlWithTimezone(timezone="UTC") tdsql2.query(f"select * from {dbname}.tzt") tdsql2.checkRows(1) - tdsql2.checkData(0, 0, "2018-09-17 01:00:00") - - + # checkData:The expected date and time is the local time zone of the machine where the test case is executed. + tdsql2.checkData(0, 0, "2018-09-17 09:00:00") + tdsql2.execute(f'insert into {dbname}.tzt values({self.ts + 1000}, 2)') tdsql2.query(f"select * from {dbname}.tzt order by ts") tdsql2.checkRows(2) - tdsql2.checkData(0, 0, "2018-09-17 01:00:00") - tdsql2.checkData(1, 0, "2018-09-17 01:00:01") + tdsql2.checkData(0, 0, "2018-09-17 09:00:00") + tdsql2.checkData(1, 0, "2018-09-17 09:00:01") tdsql2 = tdCom.newTdSqlWithTimezone(timezone="Asia/Shanghai") tdsql2.query(f"select * from {dbname}.tzt order by ts") @@ -160,7 +160,7 @@ class TDTestCase: tdSql.prepare() self.timeZoneTest() - self.inAndNotinTest() + # self.inAndNotinTest() def stop(self): @@ -168,4 +168,5 @@ class TDTestCase: tdLog.success("%s successfully executed" % __file__) tdCases.addWindows(__file__, TDTestCase()) + tdCases.addLinux(__file__, TDTestCase()) From d9e17c2284f7bce36007cae10394d3687e98b135 Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 23 Sep 2024 06:25:25 +0000 Subject: [PATCH 02/62] fix/TD-32264-check-return-value --- source/util/src/tworker.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/util/src/tworker.c b/source/util/src/tworker.c index c2757dcabc..d3a18ddb16 100644 --- a/source/util/src/tworker.c +++ b/source/util/src/tworker.c @@ -414,7 +414,8 @@ STaosQueue *tWWorkerAllocQueue(SWWorkerPool *pool, void *ahandle, FItems fp) { TdThreadAttr thAttr; (void)taosThreadAttrInit(&thAttr); (void)taosThreadAttrSetDetachState(&thAttr, PTHREAD_CREATE_JOINABLE); - if (taosThreadCreate(&worker->thread, &thAttr, (ThreadFp)tWWorkerThreadFp, worker) != 0) goto _OVER; + code = taosThreadCreate(&worker->thread, &thAttr, (ThreadFp)tWWorkerThreadFp, worker); + if ((code)) goto _OVER; uInfo("worker:%s:%d is launched, max:%d", pool->name, worker->id, pool->max); pool->nextId = (pool->nextId + 1) % pool->max; From b33fabb2d764dc3a919c3fbe5be66ec0537f3c3d Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Tue, 24 Sep 2024 09:19:17 +0800 Subject: [PATCH 03/62] fix possible mem leak --- source/libs/transport/src/transCli.c | 27 ++++++++++++++++----------- source/libs/transport/src/transComm.c | 1 + 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index 087e82d0ec..695f523f6e 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -493,6 +493,10 @@ void cliHandleResp(SCliConn* conn) { } if (CONN_NO_PERSIST_BY_APP(conn)) { + if (refId != 0) { + (void)transReleaseExHandle(transGetRefMgt(), refId); + (void)transRemoveExHandle(transGetRefMgt(), refId); + } return addConnToPool(pThrd->pool, conn); } @@ -1402,8 +1406,7 @@ static void cliHandleBatchReq(SCliBatch* pBatch, SCliThrd* pThrd) { tTrace("%s conn %p try to connect to %s", pTransInst->label, conn, pList->dst); int32_t fd = taosCreateSocketWithTimeout(TRANS_CONN_TIMEOUT * 10); if (fd == -1) { - tError("%s conn %p failed to create socket, reason:%s", transLabel(pTransInst), conn, - tstrerror(terrno)); + tError("%s conn %p failed to create socket, reason:%s", transLabel(pTransInst), conn, tstrerror(terrno)); cliHandleFastFail(conn, -1); return; } @@ -1636,7 +1639,7 @@ static void cliHandleFreeById(SCliMsg* pMsg, SCliThrd* pThrd) { int64_t refId = (int64_t)(pMsg->msg.info.handle); SExHandle* exh = transAcquireExHandle(transGetRefMgt(), refId); if (exh == NULL) { - tDebug("id %" PRId64 " already released", refId); + tDebug("refId %" PRId64 " already released", refId); destroyCmsg(pMsg); return; } @@ -1648,7 +1651,7 @@ static void cliHandleFreeById(SCliMsg* pMsg, SCliThrd* pThrd) { if (conn == NULL || conn->refId != refId) { TAOS_CHECK_GOTO(TSDB_CODE_REF_INVALID_ID, NULL, _exception); } - tDebug("do free conn %p by id %" PRId64 "", conn, refId); + tDebug("do free conn %p by refId %" PRId64 "", conn, refId); int32_t size = transQueueSize(&conn->cliMsgs); if (size == 0) { @@ -1882,8 +1885,7 @@ void cliHandleReq(SCliMsg* pMsg, SCliThrd* pThrd) { tGTrace("%s conn %p try to connect to %s", pTransInst->label, conn, conn->dstAddr); int32_t fd = taosCreateSocketWithTimeout(TRANS_CONN_TIMEOUT * 10); if (fd == -1) { - tGError("%s conn %p failed to create socket, reason:%s", transLabel(pTransInst), conn, - tstrerror(terrno)); + tGError("%s conn %p failed to create socket, reason:%s", transLabel(pTransInst), conn, tstrerror(terrno)); cliHandleExcept(conn, -1); terrno = 0; return; @@ -3319,13 +3321,14 @@ int32_t transAllocHandle(int64_t* refId) { QUEUE_INIT(&exh->q); taosInitRWLatch(&exh->latch); - tDebug("pre alloc refId %" PRId64 "", exh->refId); + tDebug("pre alloc refId %" PRId64 ", alloc exhandle %p", exh->refId, exh); *refId = exh->refId; return 0; } int32_t transFreeConnById(void* shandle, int64_t transpointId) { - int32_t code = 0; - STrans* pTransInst = (STrans*)transAcquireExHandle(transGetInstMgt(), (int64_t)shandle); + int32_t code = 0; + SCliMsg* pCli = NULL; + STrans* pTransInst = (STrans*)transAcquireExHandle(transGetInstMgt(), (int64_t)shandle); if (pTransInst == NULL) { return TSDB_CODE_RPC_MODULE_QUIT; } @@ -3339,7 +3342,7 @@ int32_t transFreeConnById(void* shandle, int64_t transpointId) { TAOS_CHECK_GOTO(TSDB_CODE_REF_INVALID_ID, NULL, _exception); } - SCliMsg* pCli = taosMemoryCalloc(1, sizeof(SCliMsg)); + pCli = taosMemoryCalloc(1, sizeof(SCliMsg)); if (pCli == NULL) { TAOS_CHECK_GOTO(terrno, NULL, _exception); } @@ -3352,11 +3355,13 @@ int32_t transFreeConnById(void* shandle, int64_t transpointId) { code = transAsyncSend(pThrd->asyncPool, &pCli->q); if (code != 0) { - taosMemoryFree(pCli); + taosMemoryFreeClear(pCli); TAOS_CHECK_GOTO(code, NULL, _exception); } _exception: transReleaseExHandle(transGetInstMgt(), (int64_t)shandle); + taosMemoryFree(pCli); + return code; } diff --git a/source/libs/transport/src/transComm.c b/source/libs/transport/src/transComm.c index 05244dbce2..a4d21a3a8e 100644 --- a/source/libs/transport/src/transComm.c +++ b/source/libs/transport/src/transComm.c @@ -768,6 +768,7 @@ void transDestroyExHandle(void* handle) { if (!QUEUE_IS_EMPTY(&eh->q)) { tDebug("handle %p mem leak", handle); } + tDebug("free exhandle %p", handle); taosMemoryFree(handle); } From 338f9cd32db36892080a9f1fef1385c8b43fc41c Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Tue, 24 Sep 2024 14:30:28 +0800 Subject: [PATCH 04/62] fix possible mem leak --- source/libs/transport/src/transCli.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index 695f523f6e..60c75360c1 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -493,10 +493,6 @@ void cliHandleResp(SCliConn* conn) { } if (CONN_NO_PERSIST_BY_APP(conn)) { - if (refId != 0) { - (void)transReleaseExHandle(transGetRefMgt(), refId); - (void)transRemoveExHandle(transGetRefMgt(), refId); - } return addConnToPool(pThrd->pool, conn); } @@ -3361,6 +3357,9 @@ int32_t transFreeConnById(void* shandle, int64_t transpointId) { _exception: transReleaseExHandle(transGetInstMgt(), (int64_t)shandle); + + (void)transReleaseExHandle(transGetRefMgt(), transpointId); + (void)transRemoveExHandle(transGetRefMgt(), transpointId); taosMemoryFree(pCli); return code; From 8eff35cd778aa64378812a2b8ae4ef45be79d738 Mon Sep 17 00:00:00 2001 From: 54liuyao <54liuyao@163.com> Date: Tue, 24 Sep 2024 14:33:53 +0800 Subject: [PATCH 05/62] fix(stream):rebuild stream event window --- source/libs/executor/src/scanoperator.c | 4 ++-- source/libs/executor/src/streameventwindowoperator.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index 76e4f8ba56..235dbdb571 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -3482,7 +3482,7 @@ FETCH_NEXT_BLOCK: return code; } qError("%s===stream=== %s failed at line %d since pInfo->pUpdateRes is empty", GET_TASKID(pTaskInfo), __func__, - lino); + __LINE__); blockDataCleanup(pInfo->pUpdateDataRes); pInfo->scanMode = STREAM_SCAN_FROM_READERHANDLE; } break; @@ -3496,7 +3496,7 @@ FETCH_NEXT_BLOCK: return code; } qError("%s===stream=== %s failed at line %d since pInfo->pUpdateRes is empty", GET_TASKID(pTaskInfo), __func__, - lino); + __LINE__); blockDataCleanup(pInfo->pUpdateDataRes); pInfo->scanMode = STREAM_SCAN_FROM_READERHANDLE; } break; diff --git a/source/libs/executor/src/streameventwindowoperator.c b/source/libs/executor/src/streameventwindowoperator.c index a325616bd3..6b094e7264 100644 --- a/source/libs/executor/src/streameventwindowoperator.c +++ b/source/libs/executor/src/streameventwindowoperator.c @@ -176,7 +176,7 @@ _end: pAggSup->stateStore.streamStateSessionDel(pAggSup->pState, &pCurWin->winInfo.sessionWin); } pAggSup->stateStore.streamStateFreeCur(pCur); - qDebug("===stream===set event next win buff. skey:%" PRId64 ", endkey:%" PRId64, pCurWin->winInfo.sessionWin.win.skey, + qDebug("===stream===set event cur win buff. skey:%" PRId64 ", endkey:%" PRId64, pCurWin->winInfo.sessionWin.win.skey, pCurWin->winInfo.sessionWin.win.ekey); _error: @@ -230,7 +230,7 @@ int32_t updateEventWindowInfo(SStreamAggSupporter* pAggSup, SEventWindowInfo* pW pWinInfo->pWinFlag->endFlag = ends[i]; } else if (pWin->ekey == pTsData[i]) { pWinInfo->pWinFlag->endFlag |= ends[i]; - } else { + } else if (ends[i] && !pWinInfo->pWinFlag->endFlag) { *pRebuild = true; pWinInfo->pWinFlag->endFlag |= ends[i]; (*pWinRow) = i + 1 - start; From abaccdc5820bdf2358671823ca223a4c7896e823 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Tue, 24 Sep 2024 14:39:06 +0800 Subject: [PATCH 06/62] fix:[TS-5473] memory leak --- tests/system-test/7-tmq/tmq_ts-5473.py | 39 ++++ utils/test/c/tmq_write_raw_test.c | 281 +++++++++++++++++++++++++ 2 files changed, 320 insertions(+) create mode 100644 tests/system-test/7-tmq/tmq_ts-5473.py create mode 100644 utils/test/c/tmq_write_raw_test.c diff --git a/tests/system-test/7-tmq/tmq_ts-5473.py b/tests/system-test/7-tmq/tmq_ts-5473.py new file mode 100644 index 0000000000..ad08fa559c --- /dev/null +++ b/tests/system-test/7-tmq/tmq_ts-5473.py @@ -0,0 +1,39 @@ + +import taos +import sys +import time +import socket +import os +import threading + +from util.log import * +from util.sql import * +from util.cases import * +from util.dnodes import * +from util.common import * +from taos.tmq import * +sys.path.append("./7-tmq") +from tmqCommon import * + +class TDTestCase: + updatecfgDict = {'debugFlag': 135, 'asynclog': 0} + def init(self, conn, logSql, replicaVar=1): + self.replicaVar = int(replicaVar) + tdLog.debug(f"start to excute {__file__}") + tdSql.init(conn.cursor()) + #tdSql.init(conn.cursor(), logSql) # output sql.txt file + + def run(self): + buildPath = tdCom.getBuildPath() + cmdStr = '%s/build/bin/tmq_write_raw_test'%(buildPath) + tdLog.info(cmdStr) + os.system(cmdStr) + + return + + def stop(self): + tdSql.close() + tdLog.success(f"{__file__} successfully executed") + +tdCases.addLinux(__file__, TDTestCase()) +tdCases.addWindows(__file__, TDTestCase()) diff --git a/utils/test/c/tmq_write_raw_test.c b/utils/test/c/tmq_write_raw_test.c new file mode 100644 index 0000000000..f33fac9a0a --- /dev/null +++ b/utils/test/c/tmq_write_raw_test.c @@ -0,0 +1,281 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include +#include +#include "cJSON.h" +#include "taos.h" +#include "tmsg.h" +#include "types.h" + +static TAOS* use_db() { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + if (pConn == NULL) { + return NULL; + } + + TAOS_RES* pRes = taos_query(pConn, "use db_taosx"); + if (taos_errno(pRes) != 0) { + printf("error in use db_taosx, reason:%s\n", taos_errstr(pRes)); + return NULL; + } + taos_free_result(pRes); + return pConn; +} + +static void msg_process(TAOS_RES* msg) { + printf("-----------topic-------------: %s\n", tmq_get_topic_name(msg)); + printf("db: %s\n", tmq_get_db_name(msg)); + printf("vg: %d\n", tmq_get_vgroup_id(msg)); + TAOS* pConn = use_db(); + if (tmq_get_res_type(msg) == TMQ_RES_TABLE_META || tmq_get_res_type(msg) == TMQ_RES_METADATA) { + char* result = tmq_get_json_meta(msg); + printf("meta result: %s\n", result); + tmq_free_json_meta(result); + } + + tmq_raw_data raw = {0}; + tmq_get_raw(msg, &raw); + printf("write raw data type: %d\n", raw.raw_type); + int32_t ret = tmq_write_raw(pConn, raw); + printf("write raw data: %s\n", tmq_err2str(ret)); + ASSERT(ret == 0); + + tmq_free_raw(raw); + taos_close(pConn); +} + +int buildDatabase(TAOS* pConn, TAOS_RES* pRes) { + pRes = taos_query(pConn, + "create stable if not exists st1 (ts timestamp, c1 int, c2 float, c3 binary(16)) tags(t1 int, t3 " + "nchar(8), t4 bool)"); + if (taos_errno(pRes) != 0) { + printf("failed to create super table st1, reason:%s\n", taos_errstr(pRes)); + return -1; + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "create table if not exists ct0 using st1 tags(1000, \"ttt\", true)"); + if (taos_errno(pRes) != 0) { + printf("failed to create child table tu1, reason:%s\n", taos_errstr(pRes)); + return -1; + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "insert into ct0 using st1 tags(1000, \"ttt\", true) values(1626006833400, 1, 2, 'a')"); + if (taos_errno(pRes) != 0) { + printf("failed to insert into ct0, reason:%s\n", taos_errstr(pRes)); + return -1; + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "create table if not exists ct1 using st1(t1) tags(2000)"); + if (taos_errno(pRes) != 0) { + printf("failed to create child table ct1, reason:%s\n", taos_errstr(pRes)); + return -1; + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "create table if not exists ct2 using st1(t1) tags(NULL)"); + if (taos_errno(pRes) != 0) { + printf("failed to create child table ct2, reason:%s\n", taos_errstr(pRes)); + return -1; + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "insert into ct1 using st1(t1) tags(2000) values(1626006833600, 3, 4, 'b')"); + if (taos_errno(pRes) != 0) { + printf("failed to insert into ct1, reason:%s\n", taos_errstr(pRes)); + return -1; + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "create table if not exists ct3 using st1(t1) tags(3000)"); + if (taos_errno(pRes) != 0) { + printf("failed to create child table ct3, reason:%s\n", taos_errstr(pRes)); + return -1; + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "insert into ct0 using st1 tags(1000, \"ttt\", true) values(1626006833400, 1, 2, 'a')"); + if (taos_errno(pRes) != 0) { + printf("failed to insert into ct0, reason:%s\n", taos_errstr(pRes)); + return -1; + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "insert into ct1 using st1(t1) tags(2000) values(1626006833600, 3, 4, 'b')"); + if (taos_errno(pRes) != 0) { + printf("failed to insert into ct1, reason:%s\n", taos_errstr(pRes)); + return -1; + } + taos_free_result(pRes); + + pRes = taos_query( + pConn, + "insert into ct3 using st1(t1) tags(3000) values(1626006833600, 5, 6, 'c') ct1 using st1(t1) tags(2000) values(1626006833601, 2, 3, 'sds') (1626006833602, 4, 5, " + "'ddd') ct0 using st1 tags(1000, \"ttt\", true) values(1626006833603, 4, 3, 'hwj') ct1 using st1(t1) tags(2000) values(now+5s, 23, 32, 's21ds')"); + if (taos_errno(pRes) != 0) { + printf("failed to insert into ct3, reason:%s\n", taos_errstr(pRes)); + return -1; + } + taos_free_result(pRes); + + return 0; +} + +int32_t init_env() { + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + if (pConn == NULL) { + return -1; + } + + TAOS_RES* pRes = taos_query(pConn, "drop database if exists db_taosx"); + if (taos_errno(pRes) != 0) { + printf("error in drop db_taosx, reason:%s\n", taos_errstr(pRes)); + return -1; + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "create database if not exists db_taosx vgroups 1 wal_retention_period 3600"); + if (taos_errno(pRes) != 0) { + printf("error in create db_taosx, reason:%s\n", taos_errstr(pRes)); + return -1; + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "drop topic if exists topic_db"); + if (taos_errno(pRes) != 0) { + printf("error in drop topic, reason:%s\n", taos_errstr(pRes)); + return -1; + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "drop database if exists abc1"); + if (taos_errno(pRes) != 0) { + printf("error in drop db, reason:%s\n", taos_errstr(pRes)); + return -1; + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "create database if not exists abc1 vgroups 1 wal_retention_period 3600"); + if (taos_errno(pRes) != 0) { + printf("error in create db, reason:%s\n", taos_errstr(pRes)); + return -1; + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "use abc1"); + if (taos_errno(pRes) != 0) { + printf("error in use db, reason:%s\n", taos_errstr(pRes)); + return -1; + } + taos_free_result(pRes); + + buildDatabase(pConn, pRes); + + taos_close(pConn); + return 0; +} + +int32_t create_topic() { + printf("create topic\n"); + TAOS_RES* pRes; + TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0); + if (pConn == NULL) { + return -1; + } + + pRes = taos_query(pConn, "create topic topic_db with meta as database abc1"); + if (taos_errno(pRes) != 0) { + printf("failed to create topic topic_db, reason:%s\n", taos_errstr(pRes)); + return -1; + } + taos_free_result(pRes); + + taos_close(pConn); + return 0; +} + +void tmq_commit_cb_print(tmq_t* tmq, int32_t code, void* param) { + printf("commit %d tmq %p param %p\n", code, tmq, param); +} + +tmq_t* build_consumer() { + tmq_conf_t* conf = tmq_conf_new(); + tmq_conf_set(conf, "group.id", "tg2"); + tmq_conf_set(conf, "client.id", "my app 1"); + tmq_conf_set(conf, "td.connect.user", "root"); + tmq_conf_set(conf, "td.connect.pass", "taosdata"); + tmq_conf_set(conf, "msg.with.table.name", "true"); + tmq_conf_set(conf, "enable.auto.commit", "true"); + tmq_conf_set(conf, "auto.offset.reset", "earliest"); + tmq_conf_set(conf, "msg.consume.excluded", "1"); +// tmq_conf_set(conf, "max.poll.interval.ms", "20000"); + + tmq_conf_set_auto_commit_cb(conf, tmq_commit_cb_print, NULL); + tmq_t* tmq = tmq_consumer_new(conf, NULL, 0); + assert(tmq); + tmq_conf_destroy(conf); + return tmq; +} + +tmq_list_t* build_topic_list() { + tmq_list_t* topic_list = tmq_list_new(); + tmq_list_append(topic_list, "topic_db"); + return topic_list; +} + +void basic_consume_loop(tmq_t* tmq, tmq_list_t* topics) { + int32_t code; + + if ((code = tmq_subscribe(tmq, topics))) { + fprintf(stderr, "%% Failed to start consuming topics: %s\n", tmq_err2str(code)); + printf("subscribe err\n"); + return; + } + int32_t cnt = 0; + while (1) { + TAOS_RES* tmqmessage = tmq_consumer_poll(tmq, 5000); + if (tmqmessage) { + cnt++; + msg_process(tmqmessage); + taos_free_result(tmqmessage); + } else { + break; + } + } + + code = tmq_consumer_close(tmq); + if (code) + fprintf(stderr, "%% Failed to close consumer: %s\n", tmq_err2str(code)); + else + fprintf(stderr, "%% Consumer closed\n"); +} + +int main(int argc, char* argv[]) { + if (init_env() < 0) { + return -1; + } + create_topic(); + + tmq_t* tmq = build_consumer(); + tmq_list_t* topic_list = build_topic_list(); + basic_consume_loop(tmq, topic_list); + tmq_list_destroy(topic_list); +} From 89c08a3a69c451bede259609791a771780f28f83 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Tue, 24 Sep 2024 14:42:53 +0800 Subject: [PATCH 07/62] fix possible mem leak --- source/libs/transport/src/transCli.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index 60c75360c1..d906145a7b 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -3356,7 +3356,7 @@ int32_t transFreeConnById(void* shandle, int64_t transpointId) { } _exception: - transReleaseExHandle(transGetInstMgt(), (int64_t)shandle); + transReleaseExHandle(transGetInstMgt(), (int64_t)shandle); (void)transReleaseExHandle(transGetRefMgt(), transpointId); (void)transRemoveExHandle(transGetRefMgt(), transpointId); From 4c707d4c9f19e7769de0c76fa53c6cc7aba76576 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Tue, 24 Sep 2024 14:51:22 +0800 Subject: [PATCH 08/62] fix:[TS-5473] memory leak --- utils/test/c/CMakeLists.txt | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/utils/test/c/CMakeLists.txt b/utils/test/c/CMakeLists.txt index e5902856e6..4eac64ac85 100644 --- a/utils/test/c/CMakeLists.txt +++ b/utils/test/c/CMakeLists.txt @@ -3,6 +3,7 @@ add_dependencies(tmq_demo taos) add_executable(tmq_sim tmqSim.c) add_executable(create_table createTable.c) add_executable(tmq_taosx_ci tmq_taosx_ci.c) +add_executable(tmq_write_raw_test tmq_write_raw_test.c) add_executable(write_raw_block_test write_raw_block_test.c) add_executable(sml_test sml_test.c) add_executable(get_db_name_test get_db_name_test.c) @@ -69,11 +70,11 @@ target_link_libraries( ) target_link_libraries( - replay_test - PUBLIC taos - PUBLIC util - PUBLIC common - PUBLIC os + replay_test + PUBLIC taos + PUBLIC util + PUBLIC common + PUBLIC os ) target_link_libraries( @@ -84,6 +85,14 @@ target_link_libraries( PUBLIC os ) +target_link_libraries( + tmq_write_raw_test + PUBLIC taos + PUBLIC util + PUBLIC common + PUBLIC os +) + target_link_libraries( sml_test PUBLIC taos From 6221af2fd2c4f2cc265d0e8b0920726ff96e9c57 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Tue, 24 Sep 2024 15:04:12 +0800 Subject: [PATCH 09/62] fix:[TS-5473] memory leak --- source/client/src/clientRawBlockWrite.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/source/client/src/clientRawBlockWrite.c b/source/client/src/clientRawBlockWrite.c index 8a888a2a47..a1022cf12a 100644 --- a/source/client/src/clientRawBlockWrite.c +++ b/source/client/src/clientRawBlockWrite.c @@ -361,7 +361,7 @@ static void processCreateStb(SMqMetaRsp* metaRsp, cJSON** pJson) { buildCreateTableJson(&req.schemaRow, &req.schemaTag, req.name, req.suid, TSDB_SUPER_TABLE, &req.colCmpr, pJson); end: - uDebug("create stable return, sql json:%s", cJSON_PrintUnformatted(*pJson)); + uDebug("create stable return"); tDecoderClear(&coder); } @@ -381,7 +381,7 @@ static void processAlterStb(SMqMetaRsp* metaRsp, cJSON** pJson) { buildAlterSTableJson(req.alterOriData, req.alterOriDataLen, pJson); end: - uDebug("alter stable return, sql json:%s", cJSON_PrintUnformatted(*pJson)); + uDebug("alter stable return"); tDecoderClear(&coder); } @@ -393,7 +393,7 @@ static void buildChildElement(cJSON* json, SVCreateTbReq* pCreateReq) { int64_t id = pCreateReq->uid; uint8_t tagNum = pCreateReq->ctb.tagNum; int32_t code = 0; - + cJSON* tags = NULL; cJSON* tableName = cJSON_CreateString(name); RAW_NULL_CHECK(tableName); RAW_FALSE_CHECK(cJSON_AddItemToObject(json, "tableName", tableName)); @@ -404,7 +404,7 @@ static void buildChildElement(cJSON* json, SVCreateTbReq* pCreateReq) { RAW_NULL_CHECK(tagNumJson); RAW_FALSE_CHECK(cJSON_AddItemToObject(json, "tagNum", tagNumJson)); - cJSON* tags = cJSON_CreateArray(); + tags = cJSON_CreateArray(); RAW_NULL_CHECK(tags); SArray* pTagVals = NULL; RAW_RETURN_CHECK(tTagToValArray(pTag, &pTagVals)); @@ -543,7 +543,7 @@ static void processCreateTable(SMqMetaRsp* metaRsp, cJSON** pJson) { } end: - uDebug("create table return, sql json:%s", cJSON_PrintUnformatted(*pJson)); + uDebug("create table return"); tDeleteSVCreateTbBatchReq(&req); tDecoderClear(&decoder); } @@ -772,7 +772,7 @@ static void processAlterTable(SMqMetaRsp* metaRsp, cJSON** pJson) { } end: - uDebug("alter table return, sql json:%s", cJSON_PrintUnformatted(json)); + uDebug("alter table return"); tDecoderClear(&decoder); *pJson = json; } @@ -807,7 +807,7 @@ static void processDropSTable(SMqMetaRsp* metaRsp, cJSON** pJson) { RAW_FALSE_CHECK(cJSON_AddItemToObject(json, "tableName", tableName)); end: - uDebug("processDropSTable return, sql json:%s", cJSON_PrintUnformatted(json)); + uDebug("processDropSTable return"); tDecoderClear(&decoder); *pJson = json; } @@ -843,7 +843,7 @@ static void processDeleteTable(SMqMetaRsp* metaRsp, cJSON** pJson) { RAW_FALSE_CHECK(cJSON_AddItemToObject(json, "sql", sqlJson)); end: - uDebug("processDeleteTable return, sql json:%s", cJSON_PrintUnformatted(json)); + uDebug("processDeleteTable return"); tDecoderClear(&coder); *pJson = json; } @@ -880,7 +880,7 @@ static void processDropTable(SMqMetaRsp* metaRsp, cJSON** pJson) { RAW_FALSE_CHECK(cJSON_AddItemToObject(json, "tableNameList", tableNameList)); end: - uDebug("processDropTable return, json sql:%s", cJSON_PrintUnformatted(json)); + uDebug("processDropTable return"); tDecoderClear(&decoder); *pJson = json; } @@ -1923,6 +1923,10 @@ static int32_t tmqWriteRawMetaDataImpl(TAOS* taos, void* data, int32_t dataLen) code = rawBlockBindData(pQuery, pTableMeta, rawData, &pCreateReqDst, fields, pSW->nCols, true, err, ERR_MSG_LEN); taosMemoryFree(fields); taosMemoryFreeClear(pTableMeta); + if (pCreateReqDst) { + tdDestroySVCreateTbReq(pCreateReqDst); + taosMemoryFreeClear(pCreateReqDst); + } if (code != TSDB_CODE_SUCCESS) { SET_ERROR_MSG("table:%s, err:%s", tbName, err); goto end; @@ -1944,7 +1948,7 @@ end: taosMemoryFreeClear(pTableMeta); if (pCreateReqDst) { tdDestroySVCreateTbReq(pCreateReqDst); - taosMemoryFree(pCreateReqDst); + taosMemoryFreeClear(pCreateReqDst); } return code; } @@ -2038,6 +2042,7 @@ char* tmq_get_json_meta(TAOS_RES* res) { processSimpleMeta(&pMetaRspObj->metaRsp, &pJson); char* string = cJSON_PrintUnformatted(pJson); cJSON_Delete(pJson); + uDebug("tmq_get_json_meta string:%s", string); return string; } From f20edb4c451a21db9f2338e746f71f9ea994c431 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Tue, 24 Sep 2024 15:10:02 +0800 Subject: [PATCH 10/62] fix:[TS-5473] memory leak --- tests/parallel_test/cases.task | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index 1a00787a6b..40f2fa3ead 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -280,6 +280,7 @@ ,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/dataFromTsdbNWal.py ,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/dataFromTsdbNWal-multiCtb.py ,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq_taosx.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq_ts-5473.py ,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq_ts4563.py ,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq_replay.py ,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqSeekAndCommit.py From 28187a57f95f0f73344112336fdaed097ae9043d Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Tue, 24 Sep 2024 15:23:02 +0800 Subject: [PATCH 11/62] fix(stmt2/query): use snyc ctg to build pVgList --- source/client/src/clientImpl.c | 50 ++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index 5b559451da..9ddf012bf2 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -679,9 +679,15 @@ _return: return TSDB_CODE_SUCCESS; } +void freeVgList(void* list) { + SArray* pList = *(SArray**)list; + taosArrayDestroy(pList); +} + int32_t buildAsyncExecNodeList(SRequestObj* pRequest, SArray** pNodeList, SArray* pMnodeList, SMetaData* pResultMeta) { SArray* pDbVgList = NULL; SArray* pQnodeList = NULL; + FDelete fp = NULL; int32_t code = 0; switch (tsQueryPolicy) { @@ -705,6 +711,43 @@ int32_t buildAsyncExecNodeList(SRequestObj* pRequest, SArray** pNodeList, SArray goto _return; } } + } else { + fp = freeVgList; + + int32_t dbNum = taosArrayGetSize(pRequest->dbList); + if (dbNum > 0) { + SCatalog* pCtg = NULL; + SAppInstInfo* pInst = pRequest->pTscObj->pAppInfo; + code = catalogGetHandle(pInst->clusterId, &pCtg); + if (code != TSDB_CODE_SUCCESS) { + goto _return; + } + + pDbVgList = taosArrayInit(dbNum, POINTER_BYTES); + if (NULL == pDbVgList) { + code = terrno; + goto _return; + } + SArray* pVgList = NULL; + for (int32_t i = 0; i < dbNum; ++i) { + char* dbFName = taosArrayGet(pRequest->dbList, i); + SRequestConnInfo conn = {.pTrans = pInst->pTransporter, + .requestId = pRequest->requestId, + .requestObjRefId = pRequest->self, + .mgmtEps = getEpSet_s(&pInst->mgmtEp)}; + + // catalogGetDBVgList will handle dbFName == null. + code = catalogGetDBVgList(pCtg, &conn, dbFName, &pVgList); + if (code) { + goto _return; + } + + if (NULL == taosArrayPush(pDbVgList, &pVgList)) { + code = terrno; + goto _return; + } + } + } } code = buildVnodePolicyNodeList(pRequest, pNodeList, pMnodeList, pDbVgList); @@ -745,17 +788,12 @@ int32_t buildAsyncExecNodeList(SRequestObj* pRequest, SArray** pNodeList, SArray } _return: - taosArrayDestroy(pDbVgList); + taosArrayDestroyEx(pDbVgList, fp); taosArrayDestroy(pQnodeList); return code; } -void freeVgList(void* list) { - SArray* pList = *(SArray**)list; - taosArrayDestroy(pList); -} - int32_t buildSyncExecNodeList(SRequestObj* pRequest, SArray** pNodeList, SArray* pMnodeList) { SArray* pDbVgList = NULL; SArray* pQnodeList = NULL; From cccd2483d059745219a7b6554e8cdcb33ad57e3e Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 24 Sep 2024 16:08:48 +0800 Subject: [PATCH 12/62] ehn: remove void --- include/common/tdataformat.h | 2 +- source/common/src/tdataformat.c | 4 +-- source/dnode/vnode/src/tsdb/tsdbCommit2.c | 30 ++++++++++----------- source/dnode/vnode/src/tsdb/tsdbFS2.c | 4 +-- source/dnode/vnode/src/tsdb/tsdbFS2.h | 8 +++--- source/dnode/vnode/src/tsdb/tsdbSnapshot.c | 20 +++++++------- source/dnode/vnode/src/tsdb/tsdbSttFileRW.c | 4 +-- source/dnode/vnode/src/tsdb/tsdbUtil2.c | 20 +++++++------- source/dnode/vnode/src/tsdb/tsdbUtil2.h | 2 +- 9 files changed, 47 insertions(+), 47 deletions(-) diff --git a/include/common/tdataformat.h b/include/common/tdataformat.h index d8a88d038d..004a3a8fb8 100644 --- a/include/common/tdataformat.h +++ b/include/common/tdataformat.h @@ -115,7 +115,7 @@ typedef struct { } SValueColumnCompressInfo; int32_t tValueColumnInit(SValueColumn *valCol); -int32_t tValueColumnDestroy(SValueColumn *valCol); +void tValueColumnDestroy(SValueColumn *valCol); void tValueColumnClear(SValueColumn *valCol); int32_t tValueColumnAppend(SValueColumn *valCol, const SValue *value); int32_t tValueColumnUpdate(SValueColumn *valCol, int32_t idx, const SValue *value); diff --git a/source/common/src/tdataformat.c b/source/common/src/tdataformat.c index 4ef9bf481c..6147d50a84 100644 --- a/source/common/src/tdataformat.c +++ b/source/common/src/tdataformat.c @@ -4171,12 +4171,12 @@ int32_t tValueColumnInit(SValueColumn *valCol) { return 0; } -int32_t tValueColumnDestroy(SValueColumn *valCol) { +void tValueColumnDestroy(SValueColumn *valCol) { valCol->type = TSDB_DATA_TYPE_NULL; valCol->numOfValues = 0; tBufferDestroy(&valCol->data); tBufferDestroy(&valCol->offsets); - return 0; + return; } void tValueColumnClear(SValueColumn *valCol) { diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit2.c b/source/dnode/vnode/src/tsdb/tsdbCommit2.c index 32371dc399..0199b578a2 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit2.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit2.c @@ -199,9 +199,9 @@ _exit: return code; } -static int32_t tsdbCommitCloseReader(SCommitter2 *committer) { +static void tsdbCommitCloseReader(SCommitter2 *committer) { TARRAY2_CLEAR(committer->sttReaderArray, tsdbSttFileReaderClose); - return 0; + return; } static int32_t tsdbCommitOpenReader(SCommitter2 *committer) { @@ -243,19 +243,19 @@ static int32_t tsdbCommitOpenReader(SCommitter2 *committer) { _exit: if (code) { - TAOS_UNUSED(tsdbCommitCloseReader(committer)); + tsdbCommitCloseReader(committer); tsdbError("vgId:%d %s failed at %s:%d since %s", TD_VID(committer->tsdb->pVnode), __func__, __FILE__, lino, tstrerror(code)); } return code; } -static int32_t tsdbCommitCloseIter(SCommitter2 *committer) { +static void tsdbCommitCloseIter(SCommitter2 *committer) { tsdbIterMergerClose(&committer->tombIterMerger); tsdbIterMergerClose(&committer->dataIterMerger); TARRAY2_CLEAR(committer->tombIterArray, tsdbIterClose); TARRAY2_CLEAR(committer->dataIterArray, tsdbIterClose); - return 0; + return; } static int32_t tsdbCommitOpenIter(SCommitter2 *committer) { @@ -309,7 +309,7 @@ static int32_t tsdbCommitOpenIter(SCommitter2 *committer) { _exit: if (code) { - TAOS_UNUSED(tsdbCommitCloseIter(committer)); + tsdbCommitCloseIter(committer); tsdbError("vgId:%d %s failed at %s:%d since %s", TD_VID(committer->tsdb->pVnode), __func__, __FILE__, lino, tstrerror(code)); } @@ -322,7 +322,7 @@ static int32_t tsdbCommitFileSetBegin(SCommitter2 *committer) { STsdb *tsdb = committer->tsdb; // check if can commit - TAOS_UNUSED(tsdbFSCheckCommit(tsdb, committer->ctx->info->fid)); + tsdbFSCheckCommit(tsdb, committer->ctx->info->fid); committer->ctx->expLevel = tsdbFidLevel(committer->ctx->info->fid, &tsdb->keepCfg, committer->now); tsdbFidKeyRange(committer->ctx->info->fid, committer->minutes, committer->precision, &committer->ctx->minKey, @@ -355,8 +355,8 @@ static int32_t tsdbCommitFileSetEnd(SCommitter2 *committer) { int32_t lino = 0; TAOS_CHECK_GOTO(tsdbCommitCloseWriter(committer), &lino, _exit); - TAOS_CHECK_GOTO(tsdbCommitCloseIter(committer), &lino, _exit); - TAOS_CHECK_GOTO(tsdbCommitCloseReader(committer), &lino, _exit); + tsdbCommitCloseIter(committer); + tsdbCommitCloseReader(committer); _exit: if (code) { @@ -409,7 +409,7 @@ static uint32_t tFileSetCommitInfoHash(const void *arg) { return MurmurHash3_32((const char *)&info->fid, sizeof(info->fid)); } -static int32_t tsdbCommitInfoDestroy(STsdb *pTsdb) { +static void tsdbCommitInfoDestroy(STsdb *pTsdb) { if (pTsdb->commitInfo) { for (int32_t i = 0; i < taosArrayGetSize(pTsdb->commitInfo->arr); i++) { SFileSetCommitInfo *info = *(SFileSetCommitInfo **)taosArrayGet(pTsdb->commitInfo->arr, i); @@ -423,7 +423,7 @@ static int32_t tsdbCommitInfoDestroy(STsdb *pTsdb) { pTsdb->commitInfo->arr = NULL; taosMemoryFreeClear(pTsdb->commitInfo); } - return 0; + return; } static int32_t tsdbCommitInfoInit(STsdb *pTsdb) { @@ -444,7 +444,7 @@ static int32_t tsdbCommitInfoInit(STsdb *pTsdb) { _exit: if (code) { - TAOS_UNUSED(tsdbCommitInfoDestroy(pTsdb)); + tsdbCommitInfoDestroy(pTsdb); tsdbError("vgId:%d %s failed at %s:%d since %s", TD_VID(pTsdb->pVnode), __func__, __FILE__, lino, tstrerror(code)); } return code; @@ -586,7 +586,7 @@ static int32_t tsdbCommitInfoBuild(STsdb *tsdb) { _exit: if (code) { - TAOS_UNUSED(tsdbCommitInfoDestroy(tsdb)); + tsdbCommitInfoDestroy(tsdb); tsdbError("vgId:%d %s failed at %s:%d since %s", TD_VID(tsdb->pVnode), __func__, __FILE__, lino, tstrerror(code)); } return code; @@ -716,7 +716,7 @@ int32_t tsdbCommitCommit(STsdb *tsdb) { (void)taosThreadMutexUnlock(&tsdb->mutex); - TAOS_UNUSED(tsdbCommitInfoDestroy(tsdb)); + TAOS_UNUSED(); tsdbUnrefMemTable(pMemTable, NULL, true); } @@ -745,7 +745,7 @@ int32_t tsdbCommitAbort(STsdb *pTsdb) { } } (void)taosThreadMutexUnlock(&pTsdb->mutex); - TAOS_UNUSED(tsdbCommitInfoDestroy(pTsdb)); + tsdbCommitInfoDestroy(pTsdb); _exit: if (code) { diff --git a/source/dnode/vnode/src/tsdb/tsdbFS2.c b/source/dnode/vnode/src/tsdb/tsdbFS2.c index bcaa70f9a8..59fd1498d7 100644 --- a/source/dnode/vnode/src/tsdb/tsdbFS2.c +++ b/source/dnode/vnode/src/tsdb/tsdbFS2.c @@ -865,7 +865,7 @@ static void tsdbFSSetBlockCommit(STFileSet *fset, bool block) { } } -int32_t tsdbFSCheckCommit(STsdb *tsdb, int32_t fid) { +void tsdbFSCheckCommit(STsdb *tsdb, int32_t fid) { (void)taosThreadMutexLock(&tsdb->mutex); STFileSet *fset; tsdbFSGetFSet(tsdb->pFS, fid, &fset); @@ -877,7 +877,7 @@ int32_t tsdbFSCheckCommit(STsdb *tsdb, int32_t fid) { } } (void)taosThreadMutexUnlock(&tsdb->mutex); - return 0; + return; } // IMPORTANT: the caller must hold fs->tsdb->mutex diff --git a/source/dnode/vnode/src/tsdb/tsdbFS2.h b/source/dnode/vnode/src/tsdb/tsdbFS2.h index 9993c1e33d..119015636b 100644 --- a/source/dnode/vnode/src/tsdb/tsdbFS2.h +++ b/source/dnode/vnode/src/tsdb/tsdbFS2.h @@ -59,10 +59,10 @@ int32_t tsdbFSEditBegin(STFileSystem *fs, const TFileOpArray *opArray, EFEditT e int32_t tsdbFSEditCommit(STFileSystem *fs); int32_t tsdbFSEditAbort(STFileSystem *fs); // other -void tsdbFSGetFSet(STFileSystem *fs, int32_t fid, STFileSet **fset); -int32_t tsdbFSCheckCommit(STsdb *tsdb, int32_t fid); -void tsdbBeginTaskOnFileSet(STsdb *tsdb, int32_t fid, STFileSet **fset); -void tsdbFinishTaskOnFileSet(STsdb *tsdb, int32_t fid); +void tsdbFSGetFSet(STFileSystem *fs, int32_t fid, STFileSet **fset); +void tsdbFSCheckCommit(STsdb *tsdb, int32_t fid); +void tsdbBeginTaskOnFileSet(STsdb *tsdb, int32_t fid, STFileSet **fset); +void tsdbFinishTaskOnFileSet(STsdb *tsdb, int32_t fid); // utils int32_t save_fs(const TFileSetArray *arr, const char *fname); void current_fname(STsdb *pTsdb, char *fname, EFCurrentT ftype); diff --git a/source/dnode/vnode/src/tsdb/tsdbSnapshot.c b/source/dnode/vnode/src/tsdb/tsdbSnapshot.c index bd22beb52d..94ca8d96a1 100644 --- a/source/dnode/vnode/src/tsdb/tsdbSnapshot.c +++ b/source/dnode/vnode/src/tsdb/tsdbSnapshot.c @@ -57,10 +57,10 @@ struct STsdbSnapReader { STombBlock tombBlock[1]; }; -static int32_t tsdbSnapReadFileSetCloseReader(STsdbSnapReader* reader) { +static void tsdbSnapReadFileSetCloseReader(STsdbSnapReader* reader) { TARRAY2_CLEAR(reader->sttReaderArr, tsdbSttFileReaderClose); tsdbDataFileReaderClose(&reader->dataReader); - return 0; + return; } static int32_t tsdbSnapReadFileSetOpenReader(STsdbSnapReader* reader) { @@ -112,7 +112,7 @@ static int32_t tsdbSnapReadFileSetOpenReader(STsdbSnapReader* reader) { _exit: if (code) { - TAOS_UNUSED(tsdbSnapReadFileSetCloseReader(reader)); + tsdbSnapReadFileSetCloseReader(reader); TSDB_ERROR_LOG(TD_VID(reader->tsdb->pVnode), code, lino); } return code; @@ -190,12 +190,12 @@ _exit: return code; } -static int32_t tsdbSnapReadFileSetCloseIter(STsdbSnapReader* reader) { +static void tsdbSnapReadFileSetCloseIter(STsdbSnapReader* reader) { tsdbIterMergerClose(&reader->dataIterMerger); tsdbIterMergerClose(&reader->tombIterMerger); TARRAY2_CLEAR(reader->dataIterArr, tsdbIterClose); TARRAY2_CLEAR(reader->tombIterArr, tsdbIterClose); - return 0; + return; } static int32_t tsdbSnapReadRangeBegin(STsdbSnapReader* reader) { @@ -222,8 +222,8 @@ _exit: } static int32_t tsdbSnapReadRangeEnd(STsdbSnapReader* reader) { - TAOS_UNUSED(tsdbSnapReadFileSetCloseIter(reader)); - TAOS_UNUSED(tsdbSnapReadFileSetCloseReader(reader)); + tsdbSnapReadFileSetCloseIter(reader); + tsdbSnapReadFileSetCloseReader(reader); reader->ctx->fsr = NULL; return 0; } @@ -373,7 +373,7 @@ static int32_t tsdbSnapReadTombData(STsdbSnapReader* reader, uint8_t** data) { int32_t lino = 0; SMetaInfo info; - TAOS_UNUSED(tTombBlockClear(reader->tombBlock)); + tTombBlockClear(reader->tombBlock); TABLEID tbid[1] = {0}; for (STombRecord* record; (record = tsdbIterMergerGetTombRecord(reader->tombIterMerger)) != NULL;) { @@ -463,7 +463,7 @@ void tsdbSnapReaderClose(STsdbSnapReader** reader) { tDestroyTSchema(reader[0]->skmTb->pTSchema); for (int32_t i = 0; i < ARRAY_SIZE(reader[0]->buffers); ++i) { - TAOS_UNUSED(tBufferDestroy(reader[0]->buffers + i)); + tBufferDestroy(reader[0]->buffers + i); } taosMemoryFree(reader[0]); @@ -1000,7 +1000,7 @@ static int32_t tsdbSnapWriteDecmprTombBlock(SSnapDataHdr* hdr, STombBlock* tombB int32_t code = 0; int32_t lino = 0; - TAOS_UNUSED(tTombBlockClear(tombBlock)); + tTombBlockClear(tombBlock); int64_t size = hdr->size; size = size / TOMB_RECORD_ELEM_NUM; diff --git a/source/dnode/vnode/src/tsdb/tsdbSttFileRW.c b/source/dnode/vnode/src/tsdb/tsdbSttFileRW.c index 1b6639882b..c7f877a51b 100644 --- a/source/dnode/vnode/src/tsdb/tsdbSttFileRW.c +++ b/source/dnode/vnode/src/tsdb/tsdbSttFileRW.c @@ -415,7 +415,7 @@ int32_t tsdbSttFileReadStatisBlock(SSttFileReader *reader, const SStatisBlk *sta &lino, _exit); // decode data - TAOS_UNUSED(tStatisBlockClear(statisBlock)); + tStatisBlockClear(statisBlock); statisBlock->numOfPKs = statisBlk->numOfPKs; statisBlock->numOfRecords = statisBlk->numRec; SBufferReader br = BUFFER_READER_INITIALIZER(0, buffer0); @@ -654,7 +654,7 @@ static int32_t tsdbSttFileDoWriteStatisBlock(SSttFileWriter *writer) { TAOS_CHECK_GOTO(TARRAY2_APPEND_PTR(writer->statisBlkArray, &statisBlk), &lino, _exit); - TAOS_UNUSED(tStatisBlockClear(writer->staticBlock)); + tStatisBlockClear(writer->staticBlock); _exit: if (code) { diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil2.c b/source/dnode/vnode/src/tsdb/tsdbUtil2.c index cc9f8ce3ad..ba4ab9386b 100644 --- a/source/dnode/vnode/src/tsdb/tsdbUtil2.c +++ b/source/dnode/vnode/src/tsdb/tsdbUtil2.c @@ -93,25 +93,25 @@ void tStatisBlockDestroy(STbStatisBlock *statisBlock) { statisBlock->numOfPKs = 0; statisBlock->numOfRecords = 0; for (int32_t i = 0; i < ARRAY_SIZE(statisBlock->buffers); ++i) { - TAOS_UNUSED(tBufferDestroy(&statisBlock->buffers[i])); + tBufferDestroy(&statisBlock->buffers[i]); } for (int32_t i = 0; i < TD_MAX_PK_COLS; ++i) { - TAOS_UNUSED(tValueColumnDestroy(&statisBlock->firstKeyPKs[i])); - TAOS_UNUSED(tValueColumnDestroy(&statisBlock->lastKeyPKs[i])); + tValueColumnDestroy(&statisBlock->firstKeyPKs[i]); + tValueColumnDestroy(&statisBlock->lastKeyPKs[i]); } } -int32_t tStatisBlockClear(STbStatisBlock *statisBlock) { +void tStatisBlockClear(STbStatisBlock *statisBlock) { statisBlock->numOfPKs = 0; statisBlock->numOfRecords = 0; for (int32_t i = 0; i < ARRAY_SIZE(statisBlock->buffers); ++i) { - TAOS_UNUSED(tBufferClear(&statisBlock->buffers[i])); + tBufferClear(&statisBlock->buffers[i]); } for (int32_t i = 0; i < TD_MAX_PK_COLS; ++i) { tValueColumnClear(&statisBlock->firstKeyPKs[i]); tValueColumnClear(&statisBlock->lastKeyPKs[i]); } - return 0; + return; } static int32_t tStatisBlockAppend(STbStatisBlock *block, SRowInfo *row) { @@ -252,11 +252,11 @@ void tBrinBlockDestroy(SBrinBlock *brinBlock) { brinBlock->numOfPKs = 0; brinBlock->numOfRecords = 0; for (int32_t i = 0; i < ARRAY_SIZE(brinBlock->buffers); ++i) { - TAOS_UNUSED(tBufferDestroy(&brinBlock->buffers[i])); + tBufferDestroy(&brinBlock->buffers[i]); } for (int32_t i = 0; i < TD_MAX_PK_COLS; ++i) { - TAOS_UNUSED(tValueColumnDestroy(&brinBlock->firstKeyPKs[i])); - TAOS_UNUSED(tValueColumnDestroy(&brinBlock->lastKeyPKs[i])); + tValueColumnDestroy(&brinBlock->firstKeyPKs[i]); + tValueColumnDestroy(&brinBlock->lastKeyPKs[i]); } } @@ -264,7 +264,7 @@ void tBrinBlockClear(SBrinBlock *brinBlock) { brinBlock->numOfPKs = 0; brinBlock->numOfRecords = 0; for (int32_t i = 0; i < ARRAY_SIZE(brinBlock->buffers); ++i) { - TAOS_UNUSED(tBufferClear(&brinBlock->buffers[i])); + tBufferClear(&brinBlock->buffers[i]); } for (int32_t i = 0; i < TD_MAX_PK_COLS; ++i) { tValueColumnClear(&brinBlock->firstKeyPKs[i]); diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil2.h b/source/dnode/vnode/src/tsdb/tsdbUtil2.h index ccc9009fd3..649f317485 100644 --- a/source/dnode/vnode/src/tsdb/tsdbUtil2.h +++ b/source/dnode/vnode/src/tsdb/tsdbUtil2.h @@ -113,7 +113,7 @@ typedef struct { int32_t tStatisBlockInit(STbStatisBlock *statisBlock); void tStatisBlockDestroy(STbStatisBlock *statisBlock); -int32_t tStatisBlockClear(STbStatisBlock *statisBlock); +void tStatisBlockClear(STbStatisBlock *statisBlock); int32_t tStatisBlockPut(STbStatisBlock *statisBlock, SRowInfo *row, int32_t maxRecords); int32_t tStatisBlockGet(STbStatisBlock *statisBlock, int32_t idx, STbStatisRecord *record); From 6abd0d6749491673b74cb31d13aec7ab30fed27f Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 24 Sep 2024 16:21:51 +0800 Subject: [PATCH 13/62] make it compile --- source/dnode/vnode/src/tsdb/tsdbCommit2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit2.c b/source/dnode/vnode/src/tsdb/tsdbCommit2.c index 0199b578a2..2ffc1d1648 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit2.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit2.c @@ -716,7 +716,7 @@ int32_t tsdbCommitCommit(STsdb *tsdb) { (void)taosThreadMutexUnlock(&tsdb->mutex); - TAOS_UNUSED(); + tsdbCommitInfoDestroy(tsdb); tsdbUnrefMemTable(pMemTable, NULL, true); } From 4b75755af1c48dd3aaa0ab8aba99097715e54d9f Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 24 Sep 2024 16:48:07 +0800 Subject: [PATCH 14/62] more change --- source/dnode/vnode/src/inc/tsdb.h | 9 ++++- source/dnode/vnode/src/tsdb/tsdbFS.c | 12 +++--- source/dnode/vnode/src/tsdb/tsdbFS2.c | 11 ++++-- source/dnode/vnode/src/tsdb/tsdbRetention.c | 41 ++++++++++++++++----- source/dnode/vnode/src/vnd/vnodeAsync.c | 30 +++++++++------ source/dnode/vnode/src/vnd/vnodeCommit.c | 12 ++++-- source/dnode/vnode/src/vnd/vnodeSnapshot.c | 16 ++++++-- source/dnode/vnode/src/vnd/vnodeSync.c | 24 +++++++++--- source/os/src/osSemaphore.c | 2 +- source/util/src/tqueue.c | 29 +++++++++++---- 10 files changed, 133 insertions(+), 53 deletions(-) diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index 38d6f020c7..b728045bf6 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -292,7 +292,7 @@ int32_t tsdbReadDelData(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData int32_t tsdbReadDelIdx(SDelFReader *pReader, SArray *aDelIdx); // tsdbRead.c ============================================================================================== -int32_t tsdbTakeReadSnap2(STsdbReader *pReader, _query_reseek_func_t reseek, STsdbReadSnap **ppSnap, const char* id); +int32_t tsdbTakeReadSnap2(STsdbReader *pReader, _query_reseek_func_t reseek, STsdbReadSnap **ppSnap, const char *id); void tsdbUntakeReadSnap2(STsdbReader *pReader, STsdbReadSnap *pSnap, bool proactive); int32_t tsdbGetTableSchema(SMeta *pMeta, int64_t uid, STSchema **pSchema, int64_t *suid); @@ -1069,6 +1069,13 @@ int32_t tsdbSnapPrepDescription(SVnode *pVnode, SSnapshot *pSnap); void tsdbRemoveFile(const char *path); +#define taosCloseFileWithLog(fd) \ + do { \ + if (taosCloseFile(fd) < 0) { \ + tsdbError("failed to close file, fd:%d, %s", fd, tstrerror(terrno)); \ + } \ + } while (0) + #ifdef __cplusplus } #endif diff --git a/source/dnode/vnode/src/tsdb/tsdbFS.c b/source/dnode/vnode/src/tsdb/tsdbFS.c index 19e1f42726..a949fd69f0 100644 --- a/source/dnode/vnode/src/tsdb/tsdbFS.c +++ b/source/dnode/vnode/src/tsdb/tsdbFS.c @@ -130,7 +130,7 @@ _exit: tsdbError("%s failed at line %d since %s, fname:%s", __func__, lino, tstrerror(code), fname); } taosMemoryFree(pData); - (void)taosCloseFile(&pFD); + taosCloseFileWithLog(&pFD); return code; } @@ -300,26 +300,26 @@ static int32_t load_fs(const char *fname, STsdbFS *pFS) { int64_t size; code = taosFStatFile(pFD, &size, NULL); if (code != 0) { - (void)taosCloseFile(&pFD); + taosCloseFileWithLog(&pFD); TSDB_CHECK_CODE(code, lino, _exit); } pData = taosMemoryMalloc(size); if (pData == NULL) { code = terrno; - (void)taosCloseFile(&pFD); + taosCloseFileWithLog(&pFD); TSDB_CHECK_CODE(code, lino, _exit); } if (taosReadFile(pFD, pData, size) < 0) { code = terrno; - (void)taosCloseFile(&pFD); + taosCloseFileWithLog(&pFD); TSDB_CHECK_CODE(code, lino, _exit); } if (!taosCheckChecksumWhole(pData, size)) { code = TSDB_CODE_FILE_CORRUPTED; - (void)taosCloseFile(&pFD); + taosCloseFileWithLog(&pFD); TSDB_CHECK_CODE(code, lino, _exit); } @@ -331,7 +331,7 @@ _exit: tsdbError("%s failed at line %d since %s, fname:%s", __func__, lino, tstrerror(code), fname); } taosMemoryFree(pData); - (void)taosCloseFile(&pFD); + taosCloseFileWithLog(&pFD); return code; } diff --git a/source/dnode/vnode/src/tsdb/tsdbFS2.c b/source/dnode/vnode/src/tsdb/tsdbFS2.c index 59fd1498d7..7afc61e5dc 100644 --- a/source/dnode/vnode/src/tsdb/tsdbFS2.c +++ b/source/dnode/vnode/src/tsdb/tsdbFS2.c @@ -44,7 +44,12 @@ static int32_t create_fs(STsdb *pTsdb, STFileSystem **fs) { } fs[0]->tsdb = pTsdb; - (void)tsem_init(&fs[0]->canEdit, 0, 1); + int32_t code = tsem_init(&fs[0]->canEdit, 0, 1); + if (code) { + taosMemoryFree(fs[0]); + return code; + } + fs[0]->fsstate = TSDB_FS_STATE_NORMAL; fs[0]->neid = 0; TARRAY2_INIT(fs[0]->fSetArr); @@ -100,7 +105,7 @@ _exit: tsdbError("%s failed at %s:%d since %s", __func__, fname, __LINE__, tstrerror(code)); } taosMemoryFree(data); - (void)taosCloseFile(&fp); + taosCloseFileWithLog(&fp); return code; } @@ -140,7 +145,7 @@ _exit: tsdbError("%s failed at %s:%d since %s", __func__, fname, __LINE__, tstrerror(code)); json[0] = NULL; } - (void)taosCloseFile(&fp); + taosCloseFileWithLog(&fp); taosMemoryFree(data); return code; } diff --git a/source/dnode/vnode/src/tsdb/tsdbRetention.c b/source/dnode/vnode/src/tsdb/tsdbRetention.c index 4b690cf53b..af42a0e592 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRetention.c +++ b/source/dnode/vnode/src/tsdb/tsdbRetention.c @@ -99,8 +99,12 @@ _exit: tsdbError("vgId:%d, %s failed at %s:%d since %s", TD_VID(rtner->tsdb->pVnode), __func__, __FILE__, lino, tstrerror(code)); } - (void)taosCloseFile(&fdFrom); - (void)taosCloseFile(&fdTo); + if (taosCloseFile(&fdFrom) != 0) { + tsdbError("vgId:%d, failed to close file %s", TD_VID(rtner->tsdb->pVnode), fname_from); + } + if (taosCloseFile(&fdTo) != 0) { + tsdbError("vgId:%d, failed to close file %s", TD_VID(rtner->tsdb->pVnode), fname_to); + } return code; } @@ -136,8 +140,12 @@ _exit: tsdbError("vgId:%d, %s failed at %s:%d since %s", TD_VID(rtner->tsdb->pVnode), __func__, __FILE__, lino, tstrerror(code)); } - (void)taosCloseFile(&fdFrom); - (void)taosCloseFile(&fdTo); + if (taosCloseFile(&fdFrom) != 0) { + tsdbTrace("vgId:%d, failed to close file", TD_VID(rtner->tsdb->pVnode)); + } + if (taosCloseFile(&fdTo) != 0) { + tsdbTrace("vgId:%d, failed to close file", TD_VID(rtner->tsdb->pVnode)); + } return code; } @@ -441,7 +449,9 @@ _exit: tsdbError("vgId:%d %s failed at line %s:%d since %s", TD_VID(rtner->tsdb->pVnode), __func__, __FILE__, lino, tstrerror(code)); } - (void)taosCloseFile(&fdFrom); + if (taosCloseFile(&fdFrom) != 0) { + tsdbTrace("vgId:%d, failed to close file", TD_VID(rtner->tsdb->pVnode)); + } return code; } @@ -541,8 +551,13 @@ _exit: tsdbError("vgId:%d %s failed at line %s:%d since %s", TD_VID(rtner->tsdb->pVnode), __func__, __FILE__, lino, tstrerror(code)); } - (void)taosCloseFile(&fdFrom); - (void)taosCloseFile(&fdTo); + if (taosCloseFile(&fdFrom) != 0) { + tsdbTrace("vgId:%d, failed to close file", TD_VID(rtner->tsdb->pVnode)); + } + + if (taosCloseFile(&fdTo) != 0) { + tsdbTrace("vgId:%d, failed to close file", TD_VID(rtner->tsdb->pVnode)); + } return code; } @@ -639,8 +654,12 @@ _exit: tsdbError("vgId:%d %s failed at line %s:%d since %s", TD_VID(rtner->tsdb->pVnode), __func__, __FILE__, lino, tstrerror(code)); } - (void)taosCloseFile(&fdFrom); - (void)taosCloseFile(&fdTo); + if (taosCloseFile(&fdFrom) != 0) { + tsdbTrace("vgId:%d, failed to close file", TD_VID(rtner->tsdb->pVnode)); + } + if (taosCloseFile(&fdTo) != 0) { + tsdbTrace("vgId:%d, failed to close file", TD_VID(rtner->tsdb->pVnode)); + } return code; } @@ -699,7 +718,9 @@ static int32_t tsdbDoS3Migrate(SRTNer *rtner) { if (taosCheckExistFile(fname1)) { int32_t mtime = 0; int64_t size = 0; - (void)taosStatFile(fname1, &size, &mtime, NULL); + if (taosStatFile(fname1, &size, &mtime, NULL) != 0) { + tsdbError("vgId:%d, %s failed at %s:%d ", TD_VID(rtner->tsdb->pVnode), __func__, __FILE__, __LINE__); + } if (size > chunksize && mtime < rtner->now - tsS3UploadDelaySec) { TAOS_CHECK_GOTO(tsdbMigrateDataFileLCS3(rtner, fobj, size, chunksize), &lino, _exit); } diff --git a/source/dnode/vnode/src/vnd/vnodeAsync.c b/source/dnode/vnode/src/vnd/vnodeAsync.c index 27580f2e76..0953c2615d 100644 --- a/source/dnode/vnode/src/vnd/vnodeAsync.c +++ b/source/dnode/vnode/src/vnd/vnodeAsync.c @@ -187,10 +187,12 @@ static void vnodeAsyncCancelAllTasks(SVAsync *async, SArray *cancelArray) { task->prev->next = task->next; task->next->prev = task->prev; if (task->cancel) { - TAOS_UNUSED(taosArrayPush(cancelArray, &(SVATaskCancelInfo){ - .cancel = task->cancel, - .arg = task->arg, - })); + if (taosArrayPush(cancelArray, &(SVATaskCancelInfo){ + .cancel = task->cancel, + .arg = task->arg, + }) == NULL) { + vError("failed to push cancel task into array"); + }; } vnodeAsyncTaskDone(async, task); } @@ -748,10 +750,12 @@ int32_t vnodeAChannelDestroy(SVAChannelID *channelID, bool waitRunning) { task->prev->next = task->next; task->next->prev = task->prev; if (task->cancel) { - TAOS_UNUSED(taosArrayPush(cancelArray, &(SVATaskCancelInfo){ - .cancel = task->cancel, - .arg = task->arg, - })); + if (taosArrayPush(cancelArray, &(SVATaskCancelInfo){ + .cancel = task->cancel, + .arg = task->arg, + }) == NULL) { + vError("failed to push cancel info"); + }; } vnodeAsyncTaskDone(async, task); } @@ -763,10 +767,12 @@ int32_t vnodeAChannelDestroy(SVAChannelID *channelID, bool waitRunning) { channel->scheduled->prev->next = channel->scheduled->next; channel->scheduled->next->prev = channel->scheduled->prev; if (channel->scheduled->cancel) { - TAOS_UNUSED(taosArrayPush(cancelArray, &(SVATaskCancelInfo){ - .cancel = channel->scheduled->cancel, - .arg = channel->scheduled->arg, - })); + if (taosArrayPush(cancelArray, &(SVATaskCancelInfo){ + .cancel = channel->scheduled->cancel, + .arg = channel->scheduled->arg, + }) == NULL) { + vError("failed to push cancel info"); + } } vnodeAsyncTaskDone(async, channel->scheduled); } diff --git a/source/dnode/vnode/src/vnd/vnodeCommit.c b/source/dnode/vnode/src/vnd/vnodeCommit.c index 5aea6c5a63..438083f9b9 100644 --- a/source/dnode/vnode/src/vnd/vnodeCommit.c +++ b/source/dnode/vnode/src/vnd/vnodeCommit.c @@ -201,7 +201,9 @@ _exit: vInfo("vgId:%d, vnode info is saved, fname:%s replica:%d selfIndex:%d changeVersion:%d", pInfo->config.vgId, fname, pInfo->config.syncCfg.replicaNum, pInfo->config.syncCfg.myIndex, pInfo->config.syncCfg.changeVersion); } - (void)taosCloseFile(&pFile); + if (taosCloseFile(&pFile) != 0) { + vError("vgId:%d, failed to close file", pInfo->config.vgId); + } taosMemoryFree(data); return code; } @@ -263,7 +265,9 @@ _exit: } } taosMemoryFree(pData); - (void)taosCloseFile(&pFile); + if (taosCloseFile(&pFile) != 0) { + vError("vgId:%d, failed to close file", pInfo->config.vgId); + } return code; } @@ -496,7 +500,9 @@ void vnodeRollback(SVnode *pVnode) { offset = strlen(tFName); snprintf(tFName + offset, TSDB_FILENAME_LEN - offset - 1, "%s%s", TD_DIRSEP, VND_INFO_FNAME_TMP); - TAOS_UNUSED(taosRemoveFile(tFName)); + if (taosRemoveFile(tFName) != 0) { + vError("vgId:%d, failed to remove file %s since %s", TD_VID(pVnode), tFName, tstrerror(terrno)); + } } static int vnodeEncodeState(const void *pObj, SJson *pJson) { diff --git a/source/dnode/vnode/src/vnd/vnodeSnapshot.c b/source/dnode/vnode/src/vnd/vnodeSnapshot.c index f732596d3b..0c11083367 100644 --- a/source/dnode/vnode/src/vnd/vnodeSnapshot.c +++ b/source/dnode/vnode/src/vnd/vnodeSnapshot.c @@ -274,13 +274,17 @@ int32_t vnodeSnapRead(SVSnapReader *pReader, uint8_t **ppData, uint32_t *nData) int64_t size; code = taosFStatFile(pFile, &size, NULL); if (code != 0) { - (void)taosCloseFile(&pFile); + if (taosCloseFile(&pFile) != 0) { + vError("vgId:%d, failed to close file", vgId); + } TSDB_CHECK_CODE(code, lino, _exit); } *ppData = taosMemoryMalloc(sizeof(SSnapDataHdr) + size + 1); if (*ppData == NULL) { - (void)taosCloseFile(&pFile); + if (taosCloseFile(&pFile) != 0) { + vError("vgId:%d, failed to close file", vgId); + } TSDB_CHECK_CODE(code = terrno, lino, _exit); } ((SSnapDataHdr *)(*ppData))->type = SNAP_DATA_CFG; @@ -289,11 +293,15 @@ int32_t vnodeSnapRead(SVSnapReader *pReader, uint8_t **ppData, uint32_t *nData) if (taosReadFile(pFile, ((SSnapDataHdr *)(*ppData))->data, size) < 0) { taosMemoryFree(*ppData); - (void)taosCloseFile(&pFile); + if (taosCloseFile(&pFile) != 0) { + vError("vgId:%d, failed to close file", vgId); + } TSDB_CHECK_CODE(code = terrno, lino, _exit); } - (void)taosCloseFile(&pFile); + if (taosCloseFile(&pFile) != 0) { + vError("vgId:%d, failed to close file", vgId); + } pReader->cfgDone = 1; goto _exit; diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c index bf317d257d..5f4628eb87 100644 --- a/source/dnode/vnode/src/vnd/vnodeSync.c +++ b/source/dnode/vnode/src/vnd/vnodeSync.c @@ -28,7 +28,9 @@ static inline void vnodeWaitBlockMsg(SVnode *pVnode, const SRpcMsg *pMsg) { const STraceId *trace = &pMsg->info.traceId; vGTrace("vgId:%d, msg:%p wait block, type:%s sec:%d seq:%" PRId64, pVnode->config.vgId, pMsg, TMSG_INFO(pMsg->msgType), pVnode->blockSec, pVnode->blockSeq); - (void)tsem_wait(&pVnode->syncSem); + if (tsem_wait(&pVnode->syncSem) != 0) { + vError("vgId:%d, failed to wait sem", pVnode->config.vgId); + } } static inline void vnodePostBlockMsg(SVnode *pVnode, const SRpcMsg *pMsg) { @@ -41,7 +43,9 @@ static inline void vnodePostBlockMsg(SVnode *pVnode, const SRpcMsg *pMsg) { pVnode->blocked = false; pVnode->blockSec = 0; pVnode->blockSeq = 0; - (void)tsem_post(&pVnode->syncSem); + if (tsem_post(&pVnode->syncSem) != 0) { + vError("vgId:%d, failed to post sem", pVnode->config.vgId); + } } (void)taosThreadMutexUnlock(&pVnode->lock); } @@ -613,7 +617,9 @@ static void vnodeBecomeFollower(const SSyncFSM *pFsm) { if (pVnode->blocked) { pVnode->blocked = false; vDebug("vgId:%d, become follower and post block", pVnode->config.vgId); - (void)tsem_post(&pVnode->syncSem); + if (tsem_post(&pVnode->syncSem) != 0) { + vError("vgId:%d, failed to post sync semaphore", pVnode->config.vgId); + } } (void)taosThreadMutexUnlock(&pVnode->lock); @@ -633,7 +639,9 @@ static void vnodeBecomeLearner(const SSyncFSM *pFsm) { if (pVnode->blocked) { pVnode->blocked = false; vDebug("vgId:%d, become learner and post block", pVnode->config.vgId); - (void)tsem_post(&pVnode->syncSem); + if (tsem_post(&pVnode->syncSem) != 0) { + vError("vgId:%d, failed to post sync semaphore", pVnode->config.vgId); + } } (void)taosThreadMutexUnlock(&pVnode->lock); } @@ -766,7 +774,9 @@ void vnodeSyncPreClose(SVnode *pVnode) { if (pVnode->blocked) { vInfo("vgId:%d, post block after close sync", pVnode->config.vgId); pVnode->blocked = false; - (void)tsem_post(&pVnode->syncSem); + if (tsem_post(&pVnode->syncSem) != 0) { + vError("vgId:%d, failed to post block", pVnode->config.vgId); + } } (void)taosThreadMutexUnlock(&pVnode->lock); } @@ -801,7 +811,9 @@ void vnodeSyncCheckTimeout(SVnode *pVnode) { pVnode->blocked = false; pVnode->blockSec = 0; pVnode->blockSeq = 0; - (void)tsem_post(&pVnode->syncSem); + if (tsem_post(&pVnode->syncSem) != 0) { + vError("vgId:%d, failed to post block", pVnode->config.vgId); + } } } (void)taosThreadMutexUnlock(&pVnode->lock); diff --git a/source/os/src/osSemaphore.c b/source/os/src/osSemaphore.c index f6d339c89e..ea9e824947 100644 --- a/source/os/src/osSemaphore.c +++ b/source/os/src/osSemaphore.c @@ -232,7 +232,7 @@ int32_t tsem_init(tsem_t *psem, int flags, unsigned int count) { if(sem_init(psem, flags, count) == 0) { return 0; } else { - return TAOS_SYSTEM_ERROR(errno); + return terrno = TAOS_SYSTEM_ERROR(errno); } } diff --git a/source/util/src/tqueue.c b/source/util/src/tqueue.c index d067847376..f531d9ad61 100644 --- a/source/util/src/tqueue.c +++ b/source/util/src/tqueue.c @@ -224,7 +224,9 @@ int32_t taosWriteQitem(STaosQueue *queue, void *pItem) { (void)taosThreadMutexUnlock(&queue->mutex); if (queue->qset) { - (void)tsem_post(&queue->qset->sem); + if (tsem_post(&queue->qset->sem) != 0) { + uError("failed to post semaphore for queue set:%p", queue->qset); + } } return code; } @@ -333,7 +335,10 @@ int32_t taosOpenQset(STaosQset **qset) { } (void)taosThreadMutexInit(&(*qset)->mutex, NULL); - (void)tsem_init(&(*qset)->sem, 0, 0); + if (tsem_init(&(*qset)->sem, 0, 0) != 0) { + taosMemoryFree(*qset); + return terrno; + } uDebug("qset:%p is opened", qset); return 0; @@ -354,7 +359,9 @@ void taosCloseQset(STaosQset *qset) { (void)taosThreadMutexUnlock(&qset->mutex); (void)taosThreadMutexDestroy(&qset->mutex); - (void)tsem_destroy(&qset->sem); + if (tsem_destroy(&qset->sem) != 0) { + uError("failed to destroy semaphore for qset:%p", qset); + } taosMemoryFree(qset); uDebug("qset:%p is closed", qset); } @@ -364,7 +371,9 @@ void taosCloseQset(STaosQset *qset) { // thread to exit. void taosQsetThreadResume(STaosQset *qset) { uDebug("qset:%p, it will exit", qset); - (void)tsem_post(&qset->sem); + if (tsem_post(&qset->sem) != 0) { + uError("failed to post semaphore for qset:%p", qset); + } } int32_t taosAddIntoQset(STaosQset *qset, STaosQueue *queue, void *ahandle) { @@ -432,7 +441,9 @@ int32_t taosReadQitemFromQset(STaosQset *qset, void **ppItem, SQueueInfo *qinfo) STaosQnode *pNode = NULL; int32_t code = 0; - (void)tsem_wait(&qset->sem); + if (tsem_wait(&qset->sem) != 0) { + uError("failed to wait semaphore for qset:%p", qset); + } (void)taosThreadMutexLock(&qset->mutex); @@ -476,7 +487,9 @@ int32_t taosReadAllQitemsFromQset(STaosQset *qset, STaosQall *qall, SQueueInfo * STaosQueue *queue; int32_t code = 0; - (void)tsem_wait(&qset->sem); + if (tsem_wait(&qset->sem) != 0) { + uError("failed to wait semaphore for qset:%p", qset); + } (void)taosThreadMutexLock(&qset->mutex); for (int32_t i = 0; i < qset->numOfQueues; ++i) { @@ -510,7 +523,9 @@ int32_t taosReadAllQitemsFromQset(STaosQset *qset, STaosQall *qall, SQueueInfo * (void)atomic_sub_fetch_32(&qset->numOfItems, qall->numOfItems); for (int32_t j = 1; j < qall->numOfItems; ++j) { - (void)tsem_wait(&qset->sem); + if (tsem_wait(&qset->sem) != 0) { + uError("failed to wait semaphore for qset:%p", qset); + } } } From dbfb38680a0ead0d142b111f3e2c9fbbf120f061 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Tue, 24 Sep 2024 17:35:46 +0800 Subject: [PATCH 15/62] fix invalid read --- source/libs/transport/src/transCli.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index d906145a7b..68c5b575ba 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -3356,11 +3356,14 @@ int32_t transFreeConnById(void* shandle, int64_t transpointId) { } _exception: - transReleaseExHandle(transGetInstMgt(), (int64_t)shandle); - - (void)transReleaseExHandle(transGetRefMgt(), transpointId); - (void)transRemoveExHandle(transGetRefMgt(), transpointId); - taosMemoryFree(pCli); + transReleaseExHandle(transGetInstMgt(), (int64_t)shandle); + if (code != 0) { + if (transpointId != 0) { + (void)transReleaseExHandle(transGetRefMgt(), transpointId); + (void)transRemoveExHandle(transGetRefMgt(), transpointId); + } + taosMemoryFree(pCli); + } return code; } From b55aec4b1382d77f725bfa374a1cdaceab019f27 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 24 Sep 2024 17:42:20 +0800 Subject: [PATCH 16/62] more code --- source/dnode/vnode/src/inc/tsdb.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index b728045bf6..20c43bb185 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -1069,11 +1069,11 @@ int32_t tsdbSnapPrepDescription(SVnode *pVnode, SSnapshot *pSnap); void tsdbRemoveFile(const char *path); -#define taosCloseFileWithLog(fd) \ - do { \ - if (taosCloseFile(fd) < 0) { \ - tsdbError("failed to close file, fd:%d, %s", fd, tstrerror(terrno)); \ - } \ +#define taosCloseFileWithLog(fd) \ + do { \ + if (taosCloseFile(fd) < 0) { \ + tsdbTrace("failed to close file"); \ + } \ } while (0) #ifdef __cplusplus From e16af0e45c0afe4eb0d926a09b413f06184569ec Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 24 Sep 2024 18:04:58 +0800 Subject: [PATCH 17/62] more --- source/dnode/vnode/src/meta/metaCache.c | 13 +++++------ source/dnode/vnode/src/meta/metaOpen.c | 4 ++-- source/dnode/vnode/src/meta/metaTable.c | 4 +++- source/dnode/vnode/src/sma/smaRollup.c | 19 +++++++++++----- source/dnode/vnode/src/tsdb/tsdbCommit2.c | 6 ++--- source/dnode/vnode/src/tsdb/tsdbFS2.c | 22 ++++++++++++++----- .../dnode/vnode/src/tsdb/tsdbReaderWriter.c | 4 ++-- source/dnode/vnode/src/tsdb/tsdbUtil.c | 5 ++++- source/dnode/vnode/src/vnd/vnodeAsync.c | 2 +- source/dnode/vnode/src/vnd/vnodeOpen.c | 5 ++++- source/dnode/vnode/src/vnd/vnodeSvr.c | 4 +++- 11 files changed, 57 insertions(+), 31 deletions(-) diff --git a/source/dnode/vnode/src/meta/metaCache.c b/source/dnode/vnode/src/meta/metaCache.c index 16cf9335fe..91aa513aa6 100644 --- a/source/dnode/vnode/src/meta/metaCache.c +++ b/source/dnode/vnode/src/meta/metaCache.c @@ -216,7 +216,7 @@ void metaCacheClose(SMeta* pMeta) { } } -static int32_t metaRehashCache(SMetaCache* pCache, int8_t expand) { +static void metaRehashCache(SMetaCache* pCache, int8_t expand) { int32_t code = 0; int32_t nBucket; @@ -228,8 +228,7 @@ static int32_t metaRehashCache(SMetaCache* pCache, int8_t expand) { SMetaCacheEntry** aBucket = (SMetaCacheEntry**)taosMemoryCalloc(nBucket, sizeof(SMetaCacheEntry*)); if (aBucket == NULL) { - code = terrno; - goto _exit; + return; } // rehash @@ -250,9 +249,7 @@ static int32_t metaRehashCache(SMetaCache* pCache, int8_t expand) { taosMemoryFree(pCache->sEntryCache.aBucket); pCache->sEntryCache.nBucket = nBucket; pCache->sEntryCache.aBucket = aBucket; - -_exit: - return code; + return; } int32_t metaCacheUpsert(SMeta* pMeta, SMetaInfo* pInfo) { @@ -279,7 +276,7 @@ int32_t metaCacheUpsert(SMeta* pMeta, SMetaInfo* pInfo) { } } else { // insert if (pCache->sEntryCache.nEntry >= pCache->sEntryCache.nBucket) { - TAOS_UNUSED(metaRehashCache(pCache, 1)); + metaRehashCache(pCache, 1); iBucket = TABS(pInfo->uid) % pCache->sEntryCache.nBucket; } @@ -317,7 +314,7 @@ int32_t metaCacheDrop(SMeta* pMeta, int64_t uid) { pCache->sEntryCache.nEntry--; if (pCache->sEntryCache.nEntry < pCache->sEntryCache.nBucket / 4 && pCache->sEntryCache.nBucket > META_CACHE_BASE_BUCKET) { - TAOS_UNUSED(metaRehashCache(pCache, 0)); + metaRehashCache(pCache, 0); } } else { code = TSDB_CODE_NOT_FOUND; diff --git a/source/dnode/vnode/src/meta/metaOpen.c b/source/dnode/vnode/src/meta/metaOpen.c index d1ffe82e32..1da6ed584e 100644 --- a/source/dnode/vnode/src/meta/metaOpen.c +++ b/source/dnode/vnode/src/meta/metaOpen.c @@ -60,7 +60,7 @@ int32_t metaOpen(SVnode *pVnode, SMeta **ppMeta, int8_t rollback) { pMeta->path = (char *)&pMeta[1]; strcpy(pMeta->path, path); - (void)taosRealPath(pMeta->path, NULL, strlen(path) + 1); + int32_t ret = taosRealPath(pMeta->path, NULL, strlen(path) + 1); pMeta->pVnode = pVnode; @@ -98,7 +98,7 @@ int32_t metaOpen(SVnode *pVnode, SMeta **ppMeta, int8_t rollback) { TSDB_CHECK_CODE(code, lino, _exit); sprintf(indexFullPath, "%s/%s", pMeta->path, "invert"); - TAOS_UNUSED(taosMkDir(indexFullPath)); + ret = taosMkDir(indexFullPath); SIndexOpts opts = {.cacheSize = 8 * 1024 * 1024}; code = indexOpen(&opts, indexFullPath, (SIndex **)&pMeta->pTagIvtIdx); diff --git a/source/dnode/vnode/src/meta/metaTable.c b/source/dnode/vnode/src/meta/metaTable.c index 1024803083..d489535c02 100644 --- a/source/dnode/vnode/src/meta/metaTable.c +++ b/source/dnode/vnode/src/meta/metaTable.c @@ -285,7 +285,9 @@ static inline void metaTimeSeriesNotifyCheck(SMeta *pMeta) { int64_t deltaTS = nTimeSeries - pMeta->pVnode->config.vndStats.numOfReportedTimeSeries; if (deltaTS > tsTimeSeriesThreshold) { if (0 == atomic_val_compare_exchange_8(&dmNotifyHdl.state, 1, 2)) { - (void)tsem_post(&dmNotifyHdl.sem); + if (tsem_post(&dmNotifyHdl.sem) != 0) { + metaError("vgId:%d, failed to post semaphore, errno:%d", TD_VID(pMeta->pVnode), errno); + } } } #endif diff --git a/source/dnode/vnode/src/sma/smaRollup.c b/source/dnode/vnode/src/sma/smaRollup.c index cf0a9701d9..ee8ee962e9 100644 --- a/source/dnode/vnode/src/sma/smaRollup.c +++ b/source/dnode/vnode/src/sma/smaRollup.c @@ -89,7 +89,7 @@ void *tdFreeRSmaInfo(SSma *pSma, SRSmaInfo *pInfo) { if (pItem->tmrId) { smaDebug("vgId:%d, stop fetch timer %p for table %" PRIi64 " level %d", SMA_VID(pSma), pItem->tmrId, pInfo->suid, i + 1); - if(!taosTmrStopA(&pItem->tmrId)){ + if (!taosTmrStopA(&pItem->tmrId)) { smaError("vgId:%d, failed to stop fetch timer for table %" PRIi64 " level %d", SMA_VID(pSma), pInfo->suid, i + 1); } @@ -404,7 +404,7 @@ int32_t tdRSmaProcessCreateImpl(SSma *pSma, SRSmaParam *param, int64_t suid, con } STSchema *pTSchema; - code = metaGetTbTSchemaNotNull(SMA_META(pSma), suid, -1, 1, &pTSchema); + code = metaGetTbTSchemaNotNull(SMA_META(pSma), suid, -1, 1, &pTSchema); TAOS_CHECK_EXIT(code); pRSmaInfo->pSma = pSma; pRSmaInfo->pTSchema = pTSchema; @@ -820,7 +820,10 @@ static int32_t tdExecuteRSmaImplAsync(SSma *pSma, int64_t version, const void *p int64_t nItems = atomic_fetch_add_64(&pRSmaStat->nBufItems, 1); if (atomic_load_8(&pInfo->assigned) == 0) { - (void)tsem_post(&(pRSmaStat->notEmpty)); + if (tsem_post(&(pRSmaStat->notEmpty)) != 0) { + smaError("vgId:%d, failed to post notEmpty semaphore for rsma %" PRIi64 " since %s", SMA_VID(pSma), suid, + tstrerror(terrno)); + } } // smoothing consume @@ -1385,7 +1388,8 @@ static void tdRSmaFetchTrigger(void *param, void *tmrId) { if (rsmaTriggerStat == TASK_TRIGGER_STAT_PAUSED) { bool ret = taosTmrReset(tdRSmaFetchTrigger, RSMA_FETCH_INTERVAL, pItem, smaMgmt.tmrHandle, &pItem->tmrId); if (!ret) { - smaWarn("vgId:%d, rsma fetch task not reset for level %" PRIi8 " since tmr reset failed, rsetId:%d refId:%" PRIi64, + smaWarn("vgId:%d, rsma fetch task not reset for level %" PRIi8 + " since tmr reset failed, rsetId:%d refId:%" PRIi64, SMA_VID(pSma), pItem->level, smaMgmt.rsetId, pRSmaRef->refId); } } @@ -1407,7 +1411,10 @@ static void tdRSmaFetchTrigger(void *param, void *tmrId) { atomic_store_8(&pItem->fetchLevel, 1); if (atomic_load_8(&pRSmaInfo->assigned) == 0) { - (void)tsem_post(&(pStat->notEmpty)); + if (tsem_post(&(pStat->notEmpty)) != 0) { + smaError("vgId:%d, rsma fetch task not start for level:%" PRIi8 " suid:%" PRIi64 " since sem post failed", + SMA_VID(pSma), pItem->level, pRSmaInfo->suid); + } } } break; case TASK_TRIGGER_STAT_INACTIVE: { @@ -1641,7 +1648,7 @@ int32_t tdRSmaProcessExecImpl(SSma *pSma, ERsmaExecType type) { batchMax = 100 / batchMax; batchMax = TMAX(batchMax, 4); } - while (occupied || (++batchCnt < batchMax)) { // greedy mode + while (occupied || (++batchCnt < batchMax)) { // greedy mode TAOS_UNUSED(taosReadAllQitems(pInfo->queue, pInfo->qall)); // queue has mutex lock int32_t qallItemSize = taosQallItemSize(pInfo->qall); if (qallItemSize > 0) { diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit2.c b/source/dnode/vnode/src/tsdb/tsdbCommit2.c index 2ffc1d1648..57f6aa3592 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit2.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit2.c @@ -413,7 +413,7 @@ static void tsdbCommitInfoDestroy(STsdb *pTsdb) { if (pTsdb->commitInfo) { for (int32_t i = 0; i < taosArrayGetSize(pTsdb->commitInfo->arr); i++) { SFileSetCommitInfo *info = *(SFileSetCommitInfo **)taosArrayGet(pTsdb->commitInfo->arr, i); - TAOS_UNUSED(vHashDrop(pTsdb->commitInfo->ht, info)); + int32_t ret = vHashDrop(pTsdb->commitInfo->ht, info); tsdbTFileSetClear(&info->fset); taosMemoryFree(info); } @@ -514,7 +514,7 @@ static int32_t tsdbCommitInfoBuild(STsdb *tsdb) { SFileSetCommitInfo tinfo = { .fid = fid, }; - TAOS_UNUSED(vHashGet(tsdb->commitInfo->ht, &tinfo, (void **)&info)); + int32_t ret = vHashGet(tsdb->commitInfo->ht, &tinfo, (void **)&info); if (info == NULL) { TAOS_CHECK_GOTO(tsdbCommitInfoAdd(tsdb, fid), &lino, _exit); } @@ -538,7 +538,7 @@ static int32_t tsdbCommitInfoBuild(STsdb *tsdb) { }; // check if the file set already on the commit list - TAOS_UNUSED(vHashGet(tsdb->commitInfo->ht, &tinfo, (void **)&info)); + int32_t ret = vHashGet(tsdb->commitInfo->ht, &tinfo, (void **)&info); if (info != NULL) { continue; } diff --git a/source/dnode/vnode/src/tsdb/tsdbFS2.c b/source/dnode/vnode/src/tsdb/tsdbFS2.c index 7afc61e5dc..d3b783847c 100644 --- a/source/dnode/vnode/src/tsdb/tsdbFS2.c +++ b/source/dnode/vnode/src/tsdb/tsdbFS2.c @@ -63,7 +63,9 @@ static void destroy_fs(STFileSystem **fs) { TARRAY2_DESTROY(fs[0]->fSetArr, NULL); TARRAY2_DESTROY(fs[0]->fSetArrTmp, NULL); - (void)tsem_destroy(&fs[0]->canEdit); + if (tsem_destroy(&fs[0]->canEdit) != 0) { + tsdbError("failed to destroy semaphore"); + } taosMemoryFree(fs[0]); fs[0] = NULL; } @@ -808,7 +810,11 @@ void tsdbEnableBgTask(STsdb *pTsdb) { void tsdbCloseFS(STFileSystem **fs) { if (fs[0] == NULL) return; - TAOS_UNUSED(tsdbDisableAndCancelAllBgTask((*fs)->tsdb)); + int32_t code = tsdbDisableAndCancelAllBgTask((*fs)->tsdb); + if (code) { + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID((*fs)->tsdb->pVnode), __func__, __LINE__, + tstrerror(code)); + } close_file_system(fs[0]); destroy_fs(fs); return; @@ -838,7 +844,9 @@ int32_t tsdbFSEditBegin(STFileSystem *fs, const TFileOpArray *opArray, EFEditT e current_fname(fs->tsdb, current_t, TSDB_FCURRENT_M); } - (void)tsem_wait(&fs->canEdit); + if (tsem_wait(&fs->canEdit) != 0) { + tsdbError("vgId:%d failed to wait semaphore", TD_VID(fs->tsdb->pVnode)); + } fs->etype = etype; // edit @@ -944,13 +952,17 @@ _exit: } else { tsdbInfo("vgId:%d %s done, etype:%d", TD_VID(fs->tsdb->pVnode), __func__, fs->etype); } - (void)tsem_post(&fs->canEdit); + if (tsem_post(&fs->canEdit) != 0) { + tsdbError("vgId:%d failed to post semaphore", TD_VID(fs->tsdb->pVnode)); + } return code; } int32_t tsdbFSEditAbort(STFileSystem *fs) { int32_t code = abort_edit(fs); - (void)tsem_post(&fs->canEdit); + if (tsem_post(&fs->canEdit) != 0) { + tsdbError("vgId:%d failed to post semaphore", TD_VID(fs->tsdb->pVnode)); + } return code; } diff --git a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c index 74b7ebc06b..c0d8f7f17d 100644 --- a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c +++ b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c @@ -436,7 +436,7 @@ static int32_t tsdbReadFileS3(STsdbFD *pFD, int64_t offset, uint8_t *pBuf, int64 code = tsdbCacheGetPageS3(pFD->pTsdb->pgCache, pFD, pgno, &handle); if (code != TSDB_CODE_SUCCESS) { if (handle) { - (void)tsdbCacheRelease(pFD->pTsdb->pgCache, handle); + tsdbCacheRelease(pFD->pTsdb->pgCache, handle); } TSDB_CHECK_CODE(code, lino, _exit); } @@ -447,7 +447,7 @@ static int32_t tsdbReadFileS3(STsdbFD *pFD, int64_t offset, uint8_t *pBuf, int64 uint8_t *pPage = (uint8_t *)taosLRUCacheValue(pFD->pTsdb->pgCache, handle); memcpy(pFD->pBuf, pPage, pFD->szPage); - (void)tsdbCacheRelease(pFD->pTsdb->pgCache, handle); + tsdbCacheRelease(pFD->pTsdb->pgCache, handle); // check if (pgno > 1 && !taosCheckChecksumWhole(pFD->pBuf, pFD->szPage)) { diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil.c b/source/dnode/vnode/src/tsdb/tsdbUtil.c index 34a07333ae..5b8a062361 100644 --- a/source/dnode/vnode/src/tsdb/tsdbUtil.c +++ b/source/dnode/vnode/src/tsdb/tsdbUtil.c @@ -609,7 +609,10 @@ void tsdbRowGetColVal(TSDBROW *pRow, STSchema *pTSchema, int32_t iCol, SColVal * SValue value; if (pRow->type == TSDBROW_ROW_FMT) { - (void)tRowGet(pRow->pTSRow, pTSchema, iCol, pColVal); + int32_t ret = tRowGet(pRow->pTSRow, pTSchema, iCol, pColVal); + if (ret != 0) { + tsdbError("failed to get column value, code:%d", ret); + } } else if (pRow->type == TSDBROW_COL_FMT) { if (iCol == 0) { *pColVal = diff --git a/source/dnode/vnode/src/vnd/vnodeAsync.c b/source/dnode/vnode/src/vnd/vnodeAsync.c index 0953c2615d..9e4fbd84a9 100644 --- a/source/dnode/vnode/src/vnd/vnodeAsync.c +++ b/source/dnode/vnode/src/vnd/vnodeAsync.c @@ -432,7 +432,7 @@ static void vnodeAsyncLaunchWorker(SVAsync *async) { if (async->workers[i].state == EVA_WORKER_STATE_ACTIVE) { continue; } else if (async->workers[i].state == EVA_WORKER_STATE_STOP) { - TAOS_UNUSED(taosThreadJoin(async->workers[i].thread, NULL)); + int32_t ret = taosThreadJoin(async->workers[i].thread, NULL); async->workers[i].state = EVA_WORKER_STATE_UINIT; } diff --git a/source/dnode/vnode/src/vnd/vnodeOpen.c b/source/dnode/vnode/src/vnd/vnodeOpen.c index 9fba8df90d..b857cdeb42 100644 --- a/source/dnode/vnode/src/vnd/vnodeOpen.c +++ b/source/dnode/vnode/src/vnd/vnodeOpen.c @@ -414,7 +414,10 @@ SVnode *vnodeOpen(const char *path, int32_t diskPrimary, STfs *pTfs, SMsgCb msgC pVnode->blocked = false; pVnode->disableWrite = false; - (void)tsem_init(&pVnode->syncSem, 0, 0); + if (tsem_init(&pVnode->syncSem, 0, 0) != 0) { + vError("vgId:%d, failed to init semaphore", TD_VID(pVnode)); + goto _err; + } (void)taosThreadMutexInit(&pVnode->mutex, NULL); (void)taosThreadCondInit(&pVnode->poolNotEmpty, NULL); diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index c5699796c1..9dbf16cb48 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -1833,7 +1833,9 @@ static int32_t vnodeProcessSubmitReq(SVnode *pVnode, int64_t ver, void *pReq, in } if (info.suid) { - (void)metaGetInfo(pVnode->pMeta, info.suid, &info, NULL); + if (metaGetInfo(pVnode->pMeta, info.suid, &info, NULL) != 0) { + vWarn("vgId:%d, table uid:%" PRId64 " not exists", TD_VID(pVnode), info.suid); + } } if (pSubmitTbData->sver != info.skmVer) { From 83f1a590b0cd4f4909e086425fc13bddfcd4576c Mon Sep 17 00:00:00 2001 From: Jinqing Kuang Date: Mon, 23 Sep 2024 19:54:33 +0800 Subject: [PATCH 18/62] fix(query)[TD-32258]. Fix error handling in operator interface functions - Contain errors within individual operators, preventing error propagation to upper-level operators - Use longjmp to jump directly to the outermost error handler for unresolvable issues, avoiding unnecessary error code returns through multiple layers - Simplify error-handling logic for better maintainability --- source/libs/executor/src/cachescanoperator.c | 12 +- .../libs/executor/src/dynqueryctrloperator.c | 2 + source/libs/executor/src/exchangeoperator.c | 18 +-- source/libs/executor/src/groupoperator.c | 6 +- source/libs/executor/src/hashjoinoperator.c | 38 +++---- source/libs/executor/src/mergejoinoperator.c | 1 + source/libs/executor/src/mergeoperator.c | 22 ++-- source/libs/executor/src/operator.c | 15 ++- source/libs/executor/src/projectoperator.c | 58 +++++----- source/libs/executor/src/scanoperator.c | 51 ++++++--- source/libs/executor/src/sortoperator.c | 103 ++++++++++-------- .../executor/src/streamcountwindowoperator.c | 3 +- .../executor/src/streameventwindowoperator.c | 3 +- source/libs/executor/src/streamfilloperator.c | 3 +- .../executor/src/streamtimewindowoperator.c | 19 +++- source/libs/executor/src/sysscanoperator.c | 12 +- 16 files changed, 201 insertions(+), 165 deletions(-) diff --git a/source/libs/executor/src/cachescanoperator.c b/source/libs/executor/src/cachescanoperator.c index 7c1ca294e7..649a7a4524 100644 --- a/source/libs/executor/src/cachescanoperator.c +++ b/source/libs/executor/src/cachescanoperator.c @@ -347,11 +347,7 @@ static int32_t doScanCacheNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { SExprSupp* pSup = &pInfo->pseudoExprSup; code = addTagPseudoColumnData(&pInfo->readHandle, pSup->pExprInfo, pSup->numOfExprs, pRes, pRes->info.rows, pTaskInfo, NULL); - if (code != TSDB_CODE_SUCCESS) { - pTaskInfo->code = code; - (*ppRes) = NULL; - return code; - } + QUERY_CHECK_CODE(code, lino, _end); pRes->info.id.groupId = tableListGetTableGroupId(pTableList, pRes->info.id.uid); pInfo->indexOfBufferedRes += 1; @@ -414,11 +410,7 @@ static int32_t doScanCacheNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { pInfo->pRes->info.id.uid = *(tb_uid_t*)pUid; code = addTagPseudoColumnData(&pInfo->readHandle, pSup->pExprInfo, pSup->numOfExprs, pInfo->pRes, pInfo->pRes->info.rows, pTaskInfo, NULL); - if (code != TSDB_CODE_SUCCESS) { - pTaskInfo->code = code; - (*ppRes) = NULL; - return code; - } + QUERY_CHECK_CODE(code, lino, _end); } } diff --git a/source/libs/executor/src/dynqueryctrloperator.c b/source/libs/executor/src/dynqueryctrloperator.c index 638536349d..eb49057d89 100644 --- a/source/libs/executor/src/dynqueryctrloperator.c +++ b/source/libs/executor/src/dynqueryctrloperator.c @@ -938,7 +938,9 @@ _return: } if (code) { + qError("%s failed since %s", __func__, tstrerror(code)); pOperator->pTaskInfo->code = code; + T_LONG_JMP(pOperator->pTaskInfo->env, code); } else { seqStableJoinComposeRes(pStbJoin, *pRes); } diff --git a/source/libs/executor/src/exchangeoperator.c b/source/libs/executor/src/exchangeoperator.c index fa6f61406c..9af5845a84 100644 --- a/source/libs/executor/src/exchangeoperator.c +++ b/source/libs/executor/src/exchangeoperator.c @@ -1094,6 +1094,7 @@ int32_t addDynamicExchangeSource(SOperatorInfo* pOperator) { int32_t prepareLoadRemoteData(SOperatorInfo* pOperator) { SExchangeInfo* pExchangeInfo = pOperator->info; int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; if ((OPTR_IS_OPENED(pOperator) && !pExchangeInfo->dynamicOp) || (pExchangeInfo->dynamicOp && NULL == pOperator->pOperatorGetParam)) { return TSDB_CODE_SUCCESS; @@ -1101,23 +1102,26 @@ int32_t prepareLoadRemoteData(SOperatorInfo* pOperator) { if (pExchangeInfo->dynamicOp) { code = addDynamicExchangeSource(pOperator); - if (code) { - return code; - } + QUERY_CHECK_CODE(code, lino, _end); } int64_t st = taosGetTimestampUs(); if (!pExchangeInfo->seqLoadData) { - int32_t code = prepareConcurrentlyLoad(pOperator); - if (code != TSDB_CODE_SUCCESS) { - return code; - } + code = prepareConcurrentlyLoad(pOperator); + QUERY_CHECK_CODE(code, lino, _end); pExchangeInfo->openedTs = taosGetTimestampUs(); } OPTR_SET_OPENED(pOperator); pOperator->cost.openCost = (taosGetTimestampUs() - st) / 1000.0; + +_end: + if (code != TSDB_CODE_SUCCESS) { + qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pOperator->pTaskInfo->code = code; + T_LONG_JMP(pOperator->pTaskInfo->env, code); + } return TSDB_CODE_SUCCESS; } diff --git a/source/libs/executor/src/groupoperator.c b/source/libs/executor/src/groupoperator.c index 83a579615c..13b6896272 100644 --- a/source/libs/executor/src/groupoperator.c +++ b/source/libs/executor/src/groupoperator.c @@ -441,7 +441,7 @@ static int32_t hashGroupbyAggregateNext(SOperatorInfo* pOperator, SSDataBlock** QRY_PARAM_CHECK(ppRes); if (pOperator->status == OP_EXEC_DONE) { - return TSDB_CODE_SUCCESS; + return code; } if (pOperator->status == OP_RES_TO_RETURN) { @@ -493,6 +493,7 @@ _end: if (code != TSDB_CODE_SUCCESS) { qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); } else { (*ppRes) = buildGroupResultDataBlockByHash(pOperator); } @@ -1522,8 +1523,9 @@ static int32_t doStreamHashPartitionNext(SOperatorInfo* pOperator, SSDataBlock** _end: if (code != TSDB_CODE_SUCCESS) { - pTaskInfo->code = code; qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); } (*ppRes) = NULL; return code; diff --git a/source/libs/executor/src/hashjoinoperator.c b/source/libs/executor/src/hashjoinoperator.c index 347c48b4d1..1f43a429b3 100644 --- a/source/libs/executor/src/hashjoinoperator.c +++ b/source/libs/executor/src/hashjoinoperator.c @@ -993,6 +993,7 @@ static int32_t hJoinMainProcess(struct SOperatorInfo* pOperator, SSDataBlock** p SHJoinOperatorInfo* pJoin = pOperator->info; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; SSDataBlock* pRes = pJoin->finBlk; int64_t st = 0; @@ -1003,7 +1004,7 @@ static int32_t hJoinMainProcess(struct SOperatorInfo* pOperator, SSDataBlock** p if (pOperator->status == OP_EXEC_DONE) { pRes->info.rows = 0; - goto _return; + goto _end; } if (!pJoin->keyHashBuilt) { @@ -1011,13 +1012,10 @@ static int32_t hJoinMainProcess(struct SOperatorInfo* pOperator, SSDataBlock** p bool queryDone = false; code = hJoinBuildHash(pOperator, &queryDone); - if (code) { - pTaskInfo->code = code; - return code; - } + QUERY_CHECK_CODE(code, lino, _end); if (queryDone) { - goto _return; + goto _end; } } @@ -1025,17 +1023,11 @@ static int32_t hJoinMainProcess(struct SOperatorInfo* pOperator, SSDataBlock** p if (pJoin->ctx.rowRemains) { code = (*pJoin->joinFp)(pOperator); - if (code) { - pTaskInfo->code = code; - return pTaskInfo->code; - } + QUERY_CHECK_CODE(code, lino, _end); if (pRes->info.rows > 0 && pJoin->pFinFilter != NULL) { code = doFilter(pRes, pJoin->pFinFilter, NULL); - if (code) { - pTaskInfo->code = code; - return pTaskInfo->code; - } + QUERY_CHECK_CODE(code, lino, _end); } if (pRes->info.rows > 0) { @@ -1055,10 +1047,7 @@ static int32_t hJoinMainProcess(struct SOperatorInfo* pOperator, SSDataBlock** p pJoin->execInfo.probeBlkRows += pBlock->info.rows; code = hJoinPrepareStart(pOperator, pBlock); - if (code) { - pTaskInfo->code = code; - return pTaskInfo->code; - } + QUERY_CHECK_CODE(code, lino, _end); if (!hJoinBlkReachThreshold(pJoin, pRes->info.rows)) { continue; @@ -1066,10 +1055,7 @@ static int32_t hJoinMainProcess(struct SOperatorInfo* pOperator, SSDataBlock** p if (pRes->info.rows > 0 && pJoin->pFinFilter != NULL) { code = doFilter(pRes, pJoin->pFinFilter, NULL); - if (code) { - pTaskInfo->code = code; - return pTaskInfo->code; - } + QUERY_CHECK_CODE(code, lino, _end); } if (pRes->info.rows > 0) { @@ -1077,11 +1063,15 @@ static int32_t hJoinMainProcess(struct SOperatorInfo* pOperator, SSDataBlock** p } } -_return: +_end: if (pOperator->cost.openCost == 0) { pOperator->cost.openCost = (taosGetTimestampUs() - st) / 1000.0; } - + if (code != TSDB_CODE_SUCCESS) { + qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); + } if (pRes->info.rows > 0) { *pResBlock = pRes; } diff --git a/source/libs/executor/src/mergejoinoperator.c b/source/libs/executor/src/mergejoinoperator.c index af5e4ed235..e007504ffb 100644 --- a/source/libs/executor/src/mergejoinoperator.c +++ b/source/libs/executor/src/mergejoinoperator.c @@ -1731,6 +1731,7 @@ int32_t mJoinMainProcess(struct SOperatorInfo* pOperator, SSDataBlock** pResBloc if (pJoin->pFinFilter != NULL) { code = doFilter(pBlock, pJoin->pFinFilter, NULL); if (code) { + qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); pJoin->errCode = code; T_LONG_JMP(pOperator->pTaskInfo->env, pJoin->errCode); } diff --git a/source/libs/executor/src/mergeoperator.c b/source/libs/executor/src/mergeoperator.c index 49973ac373..45cd755f78 100644 --- a/source/libs/executor/src/mergeoperator.c +++ b/source/libs/executor/src/mergeoperator.c @@ -492,6 +492,8 @@ int32_t openMultiwayMergeOperator(SOperatorInfo* pOperator) { pOperator->status = OP_RES_TO_RETURN; if (code != TSDB_CODE_SUCCESS) { + qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); + pOperator->pTaskInfo->code = code; T_LONG_JMP(pTaskInfo->env, terrno); } @@ -501,6 +503,8 @@ int32_t openMultiwayMergeOperator(SOperatorInfo* pOperator) { int32_t doMultiwayMerge(SOperatorInfo* pOperator, SSDataBlock** pResBlock) { QRY_PARAM_CHECK(pResBlock); + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; if (pOperator->status == OP_EXEC_DONE) { return 0; @@ -509,18 +513,12 @@ int32_t doMultiwayMerge(SOperatorInfo* pOperator, SSDataBlock** pResBlock) { SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; SMultiwayMergeOperatorInfo* pInfo = pOperator->info; - int32_t code = pOperator->fpSet._openFn(pOperator); - if (code != TSDB_CODE_SUCCESS) { - pTaskInfo->code = code; - return code; - } + code = pOperator->fpSet._openFn(pOperator); + QUERY_CHECK_CODE(code, lino, _end); if (NULL != gMultiwayMergeFps[pInfo->type].getNextFn) { code = (*gMultiwayMergeFps[pInfo->type].getNextFn)(pOperator, pResBlock); - if (code) { - pTaskInfo->code = code; - return code; - } + QUERY_CHECK_CODE(code, lino, _end); } if ((*pResBlock) != NULL) { @@ -530,6 +528,12 @@ int32_t doMultiwayMerge(SOperatorInfo* pOperator, SSDataBlock** pResBlock) { setOperatorCompleted(pOperator); } +_end: + if (code != TSDB_CODE_SUCCESS) { + qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); + } return code; } diff --git a/source/libs/executor/src/operator.c b/source/libs/executor/src/operator.c index fe2f3f8dfe..c96c45b634 100644 --- a/source/libs/executor/src/operator.c +++ b/source/libs/executor/src/operator.c @@ -883,14 +883,17 @@ SSDataBlock* getNextBlockFromDownstreamRemain(struct SOperatorInfo* pOperator, i int32_t optrDefaultGetNextExtFn(struct SOperatorInfo* pOperator, SOperatorParam* pParam, SSDataBlock** pRes) { QRY_PARAM_CHECK(pRes); + int32_t lino = 0; int32_t code = setOperatorParams(pOperator, pParam, OP_GET_PARAM); - if (TSDB_CODE_SUCCESS != code) { + QUERY_CHECK_CODE(code, lino, _end); + code = pOperator->fpSet.getNextFn(pOperator, pRes); + QUERY_CHECK_CODE(code, lino, _end); + +_end: + if (code != TSDB_CODE_SUCCESS) { + qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); pOperator->pTaskInfo->code = code; - } else { - code = pOperator->fpSet.getNextFn(pOperator, pRes); - if (code) { - pOperator->pTaskInfo->code = code; - } + T_LONG_JMP(pOperator->pTaskInfo->env, code); } return code; diff --git a/source/libs/executor/src/projectoperator.c b/source/libs/executor/src/projectoperator.c index 790e97b27c..5b9e531679 100644 --- a/source/libs/executor/src/projectoperator.c +++ b/source/libs/executor/src/projectoperator.c @@ -270,6 +270,7 @@ int32_t doProjectOperation(SOperatorInfo* pOperator, SSDataBlock** pResBlock) { SSDataBlock* pRes = pInfo->pRes; SSDataBlock* pFinalRes = pProjectInfo->pFinalRes; int32_t code = 0; + int32_t lino = 0; int64_t st = 0; int32_t order = pInfo->inputTsOrder; int32_t scanFlag = 0; @@ -290,9 +291,7 @@ int32_t doProjectOperation(SOperatorInfo* pOperator, SSDataBlock** pResBlock) { if (downstream == NULL) { code = doGenerateSourceData(pOperator); - if (code != TSDB_CODE_SUCCESS) { - T_LONG_JMP(pTaskInfo->env, code); - } + QUERY_CHECK_CODE(code, lino, _end); if (pProjectInfo->outputIgnoreGroup) { pRes->info.id.groupId = 0; @@ -348,20 +347,14 @@ int32_t doProjectOperation(SOperatorInfo* pOperator, SSDataBlock** pResBlock) { } code = setInputDataBlock(pSup, pBlock, order, scanFlag, false); - if (code) { - T_LONG_JMP(pTaskInfo->env, code); - } + QUERY_CHECK_CODE(code, lino, _end); code = blockDataEnsureCapacity(pInfo->pRes, pInfo->pRes->info.rows + pBlock->info.rows); - if (code != TSDB_CODE_SUCCESS) { - T_LONG_JMP(pTaskInfo->env, code); - } + QUERY_CHECK_CODE(code, lino, _end); code = projectApplyFunctions(pSup->pExprInfo, pInfo->pRes, pBlock, pSup->pCtx, pSup->numOfExprs, pProjectInfo->pPseudoColInfo); - if (code != TSDB_CODE_SUCCESS) { - T_LONG_JMP(pTaskInfo->env, code); - } + QUERY_CHECK_CODE(code, lino, _end); status = doIngroupLimitOffset(pLimitInfo, pBlock->info.id.groupId, pInfo->pRes, pOperator); if (status == PROJECT_RETRIEVE_CONTINUE) { @@ -377,11 +370,8 @@ int32_t doProjectOperation(SOperatorInfo* pOperator, SSDataBlock** pResBlock) { pFinalRes->info.version = pRes->info.version; // continue merge data, ignore the group id - int32_t ret = blockDataMerge(pFinalRes, pRes); - if (ret < 0) { - pTaskInfo->code = code; - return code; - } + code = blockDataMerge(pFinalRes, pRes); + QUERY_CHECK_CODE(code, lino, _end); if (pFinalRes->info.rows + pRes->info.rows <= pOperator->resultInfo.threshold && (pOperator->status != OP_EXEC_DONE)) { continue; @@ -390,10 +380,7 @@ int32_t doProjectOperation(SOperatorInfo* pOperator, SSDataBlock** pResBlock) { // do apply filter code = doFilter(pFinalRes, pOperator->exprSupp.pFilterInfo, NULL); - if (code) { - pTaskInfo->code = code; - return code; - } + QUERY_CHECK_CODE(code, lino, _end); // when apply the limit/offset for each group, pRes->info.rows may be 0, due to limit constraint. if (pFinalRes->info.rows > 0 || (pOperator->status == OP_EXEC_DONE)) { @@ -404,10 +391,7 @@ int32_t doProjectOperation(SOperatorInfo* pOperator, SSDataBlock** pResBlock) { // do apply filter if (pRes->info.rows > 0) { code = doFilter(pRes, pOperator->exprSupp.pFilterInfo, NULL); - if (code) { - pTaskInfo->code = code; - return code; - } + QUERY_CHECK_CODE(code, lino, _end); if (pRes->info.rows == 0) { continue; @@ -436,6 +420,13 @@ int32_t doProjectOperation(SOperatorInfo* pOperator, SSDataBlock** pResBlock) { } *pResBlock = (p->info.rows > 0)? p:NULL; + +_end: + if (code != TSDB_CODE_SUCCESS) { + qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); + } return code; } @@ -578,14 +569,15 @@ int32_t doApplyIndefinitFunction(SOperatorInfo* pOperator, SSDataBlock** pResBlo SOptrBasicInfo* pInfo = &pIndefInfo->binfo; SExprSupp* pSup = &pOperator->exprSupp; int64_t st = 0; - int32_t code = 0; + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; SSDataBlock* pRes = pInfo->pRes; blockDataCleanup(pRes); SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; if (pOperator->status == OP_EXEC_DONE) { - return 0; + return code; } if (pOperator->cost.openCost == 0) { @@ -637,10 +629,7 @@ int32_t doApplyIndefinitFunction(SOperatorInfo* pOperator, SSDataBlock** pResBlo } code = doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL); - if (code) { - pTaskInfo->code = code; - return code; - } + QUERY_CHECK_CODE(code, lino, _end); size_t rows = pInfo->pRes->info.rows; if (rows > 0 || pOperator->status == OP_EXEC_DONE) { @@ -658,6 +647,13 @@ int32_t doApplyIndefinitFunction(SOperatorInfo* pOperator, SSDataBlock** pResBlo } *pResBlock = (rows > 0) ? pInfo->pRes : NULL; + +_end: + if (code != TSDB_CODE_SUCCESS) { + qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); + } return code; } diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index 76e4f8ba56..dcd401bf84 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -951,7 +951,8 @@ static int32_t doTableScanImplNext(SOperatorInfo* pOperator, SSDataBlock** ppRes if (isTaskKilled(pTaskInfo)) { pAPI->tsdReader.tsdReaderReleaseDataBlock(pTableScanInfo->base.dataReader); - return pTaskInfo->code; + code = pTaskInfo->code; + goto _end; } if (pOperator->status == OP_EXEC_DONE) { @@ -996,6 +997,7 @@ _end: if (code != TSDB_CODE_SUCCESS) { qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); } return code; } @@ -1416,6 +1418,7 @@ _end: if (code != TSDB_CODE_SUCCESS) { qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); } return code; @@ -2944,8 +2947,9 @@ static int32_t doQueueScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { if (pResult && pResult->info.rows > 0) { bool hasPrimaryKey = pAPI->tqReaderFn.tqGetTablePrimaryKey(pInfo->tqReader); code = processPrimaryKey(pResult, hasPrimaryKey, &pTaskInfo->streamInfo.currentOffset); + QUERY_CHECK_CODE(code, lino, _end); qDebug("tmqsnap doQueueScan get data utid:%" PRId64 "", pResult->info.id.uid); - if (pResult->info.rows > 0 || code != TSDB_CODE_SUCCESS) { + if (pResult->info.rows > 0) { (*ppRes) = pResult; return code; } @@ -3009,8 +3013,9 @@ static int32_t doQueueScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { _end: if (code != TSDB_CODE_SUCCESS) { - pTaskInfo->code = code; qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); } (*ppRes) = NULL; return code; @@ -3340,9 +3345,7 @@ FETCH_NEXT_BLOCK: if (pBlock->info.parTbName[0]) { code = pAPI->stateStore.streamStatePutParName(pStreamInfo->pState, pBlock->info.id.groupId, pBlock->info.parTbName); - if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); - } + QUERY_CHECK_CODE(code, lino, _end); } // TODO move into scan @@ -3658,8 +3661,9 @@ FETCH_NEXT_BLOCK: _end: if (code != TSDB_CODE_SUCCESS) { - pTaskInfo->code = code; qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); } (*ppRes) = NULL; return code; @@ -3730,6 +3734,7 @@ static int32_t doRawScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { if (pBlock && pBlock->info.rows > 0) { bool hasPrimaryKey = pAPI->snapshotFn.taosXGetTablePrimaryKey(pInfo->sContext); code = processPrimaryKey(pBlock, hasPrimaryKey, &pTaskInfo->streamInfo.currentOffset); + QUERY_CHECK_CODE(code, lino, _end); qDebug("tmqsnap doRawScan get data uid:%" PRId64 "", pBlock->info.id.uid); (*ppRes) = pBlock; return code; @@ -3741,7 +3746,7 @@ static int32_t doRawScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { QUERY_CHECK_CODE(code, lino, _end); if (code != 0) { tDeleteSchemaWrapper(mtInfo.schema); - goto _end; + QUERY_CHECK_CODE(code, lino, _end); } STqOffsetVal offset = {0}; if (mtInfo.uid == 0 || pInfo->sContext->withMeta == ONLY_META) { // read snapshot done, change to get data from wal @@ -3831,6 +3836,7 @@ _end: if (code != TSDB_CODE_SUCCESS) { qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); } (*ppRes) = NULL; @@ -4677,6 +4683,7 @@ _end: if (code != TSDB_CODE_SUCCESS) { qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); } return code; @@ -4684,6 +4691,7 @@ _end: static int32_t doTagScanFromMetaEntryNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; if (pOperator->status == OP_EXEC_DONE) { (*ppRes) = NULL; return code; @@ -4699,10 +4707,7 @@ static int32_t doTagScanFromMetaEntryNext(SOperatorInfo* pOperator, SSDataBlock* int32_t size = 0; code = tableListGetSize(pInfo->pTableListInfo, &size); - if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); - return code; - } + QUERY_CHECK_CODE(code, lino, _end); if (size == 0) { setTaskStatus(pTaskInfo, TASK_COMPLETED); @@ -4716,11 +4721,11 @@ static int32_t doTagScanFromMetaEntryNext(SOperatorInfo* pOperator, SSDataBlock* while (pInfo->curPos < size && count < pOperator->resultInfo.capacity) { code = doTagScanOneTable(pOperator, pRes, count, &mr, &pTaskInfo->storageAPI); - if (code == TSDB_CODE_OUT_OF_MEMORY) { - break; - } else { + if (code != TSDB_CODE_OUT_OF_MEMORY) { // ignore other error + code = TSDB_CODE_SUCCESS; } + QUERY_CHECK_CODE(code, lino, _end); ++count; if (++pInfo->curPos >= size) { @@ -4744,6 +4749,13 @@ static int32_t doTagScanFromMetaEntryNext(SOperatorInfo* pOperator, SSDataBlock* pOperator->resultInfo.totalRows += pRes->info.rows; (*ppRes) = (pRes->info.rows == 0) ? NULL : pInfo->pRes; + +_end: + if (code != TSDB_CODE_SUCCESS) { + qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); + } return code; } @@ -5429,6 +5441,7 @@ _end: if (code != TSDB_CODE_SUCCESS) { qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); } else { (*ppRes) = pBlock; } @@ -5945,6 +5958,7 @@ _end: if (code != TSDB_CODE_SUCCESS) { qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); } else { (*ppRes) = pBlock; } @@ -6460,7 +6474,12 @@ static int32_t doTableCountScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRe } code = buildVnodeDbTableCount(pOperator, pInfo, pSupp, pRes); - if ((pRes->info.rows > 0) && (code == 0)) { + if (code != TSDB_CODE_SUCCESS) { + qError("%s failed since %s", __func__, tstrerror(code)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); + } + if (pRes->info.rows > 0) { *ppRes = pRes; } diff --git a/source/libs/executor/src/sortoperator.c b/source/libs/executor/src/sortoperator.c index d12f6dd94c..11b3fa8c70 100644 --- a/source/libs/executor/src/sortoperator.c +++ b/source/libs/executor/src/sortoperator.c @@ -349,82 +349,84 @@ void applyScalarFunction(SSDataBlock* pBlock, void* param) { int32_t doOpenSortOperator(SOperatorInfo* pOperator) { SSortOperatorInfo* pInfo = pOperator->info; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; + SSortSource* pSource =NULL; if (OPTR_IS_OPENED(pOperator)) { - return TSDB_CODE_SUCCESS; + return code; } pInfo->startTs = taosGetTimestampUs(); // pInfo->binfo.pRes is not equalled to the input datablock. pInfo->pSortHandle = NULL; - int32_t code = + code = tsortCreateSortHandle(pInfo->pSortInfo, SORT_SINGLESOURCE_SORT, -1, -1, NULL, pTaskInfo->id.str, pInfo->maxRows, pInfo->maxTupleLength, tsPQSortMemThreshold * 1024 * 1024, &pInfo->pSortHandle); - if (code) { - return code; - } + QUERY_CHECK_CODE(code, lino, _end); tsortSetFetchRawDataFp(pInfo->pSortHandle, loadNextDataBlock, applyScalarFunction, pOperator); - SSortSource* pSource = taosMemoryCalloc(1, sizeof(SSortSource)); - if (pSource == NULL) { - return terrno; - } + pSource = taosMemoryCalloc(1, sizeof(SSortSource)); + QUERY_CHECK_NULL(pSource, code, lino, _end, terrno); pSource->param = pOperator->pDownstream[0]; pSource->onlyRef = true; code = tsortAddSource(pInfo->pSortHandle, pSource); - if (code) { - taosMemoryFree(pSource); - return code; - } + QUERY_CHECK_CODE(code, lino, _end); + pSource = NULL; code = tsortOpen(pInfo->pSortHandle); - if (code != TSDB_CODE_SUCCESS) { - pTaskInfo->code = code; - } else { - pOperator->cost.openCost = (taosGetTimestampUs() - pInfo->startTs) / 1000.0; - pOperator->status = OP_RES_TO_RETURN; - OPTR_SET_OPENED(pOperator); - } + QUERY_CHECK_CODE(code, lino, _end); + pOperator->cost.openCost = (taosGetTimestampUs() - pInfo->startTs) / 1000.0; + pOperator->status = OP_RES_TO_RETURN; + OPTR_SET_OPENED(pOperator); +_end: + if (pSource) { + taosMemoryFree(pSource); + } + if (code != TSDB_CODE_SUCCESS) { + qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); + } return code; } int32_t doSort(SOperatorInfo* pOperator, SSDataBlock** pResBlock) { QRY_PARAM_CHECK(pResBlock); + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; if (pOperator->status == OP_EXEC_DONE) { - return 0; + return code; } SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; SSortOperatorInfo* pInfo = pOperator->info; - int32_t code = pOperator->fpSet._openFn(pOperator); - if (code != TSDB_CODE_SUCCESS) { - return code; - } + code = pOperator->fpSet._openFn(pOperator); + QUERY_CHECK_CODE(code, lino, _end); // multi-group case not handle here SSDataBlock* pBlock = NULL; while (1) { if (tsortIsClosed(pInfo->pSortHandle)) { code = TSDB_CODE_TSC_QUERY_CANCELLED; - T_LONG_JMP(pTaskInfo->env, code); + QUERY_CHECK_CODE(code, lino, _end); } code = getSortedBlockData(pInfo->pSortHandle, pInfo->binfo.pRes, pOperator->resultInfo.capacity, pInfo->matchInfo.pList, pInfo, &pBlock); - if (pBlock == NULL || code != 0) { + QUERY_CHECK_CODE(code, lino, _end); + if (pBlock == NULL) { setOperatorCompleted(pOperator); return code; } code = doFilter(pBlock, pOperator->exprSupp.pFilterInfo, &pInfo->matchInfo); - if (code) { - break; - } + QUERY_CHECK_CODE(code, lino, _end); if (blockDataGetNumOfRows(pBlock) == 0) { continue; @@ -443,6 +445,12 @@ int32_t doSort(SOperatorInfo* pOperator, SSDataBlock** pResBlock) { } *pResBlock = blockDataGetNumOfRows(pBlock) > 0 ? pBlock : NULL; +_end: + if (code != TSDB_CODE_SUCCESS) { + qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); + } return code; } @@ -692,16 +700,16 @@ int32_t doGroupSort(SOperatorInfo* pOperator, SSDataBlock** pResBlock) { QRY_PARAM_CHECK(pResBlock); SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; SGroupSortOperatorInfo* pInfo = pOperator->info; + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; if (pOperator->status == OP_EXEC_DONE) { - return 0; - } - - int32_t code = pOperator->fpSet._openFn(pOperator); - if (code != TSDB_CODE_SUCCESS) { return code; } + code = pOperator->fpSet._openFn(pOperator); + QUERY_CHECK_CODE(code, lino, _end); + if (!pInfo->hasGroupId) { pInfo->hasGroupId = true; @@ -714,30 +722,25 @@ int32_t doGroupSort(SOperatorInfo* pOperator, SSDataBlock** pResBlock) { pInfo->currGroupId = pInfo->prefetchedSortInput->info.id.groupId; pInfo->childOpStatus = CHILD_OP_NEW_GROUP; code = beginSortGroup(pOperator); - if (code) { - return code; - } + QUERY_CHECK_CODE(code, lino, _end); } SSDataBlock* pBlock = NULL; while (pInfo->pCurrSortHandle != NULL) { if (tsortIsClosed(pInfo->pCurrSortHandle)) { code = TSDB_CODE_TSC_QUERY_CANCELLED; - T_LONG_JMP(pTaskInfo->env, code); + QUERY_CHECK_CODE(code, lino, _end); } // beginSortGroup would fetch all child blocks of pInfo->currGroupId; if (pInfo->childOpStatus == CHILD_OP_SAME_GROUP) { - pTaskInfo->code = code = TSDB_CODE_QRY_EXECUTOR_INTERNAL_ERROR; - qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); - return code; + code = TSDB_CODE_QRY_EXECUTOR_INTERNAL_ERROR; + QUERY_CHECK_CODE(code, lino, _end); } code = getGroupSortedBlockData(pInfo->pCurrSortHandle, pInfo->binfo.pRes, pOperator->resultInfo.capacity, pInfo->matchInfo.pList, pInfo, &pBlock); - if (code != TSDB_CODE_SUCCESS) { - return code; - } + QUERY_CHECK_CODE(code, lino, _end); if (pBlock != NULL) { pBlock->info.id.groupId = pInfo->currGroupId; pOperator->resultInfo.totalRows += pBlock->info.rows; @@ -748,9 +751,7 @@ int32_t doGroupSort(SOperatorInfo* pOperator, SSDataBlock** pResBlock) { (void) finishSortGroup(pOperator); pInfo->currGroupId = pInfo->prefetchedSortInput->info.id.groupId; code = beginSortGroup(pOperator); - if (code) { - return code; - } + QUERY_CHECK_CODE(code, lino, _end); } else if (pInfo->childOpStatus == CHILD_OP_FINISHED) { (void) finishSortGroup(pOperator); setOperatorCompleted(pOperator); @@ -759,6 +760,12 @@ int32_t doGroupSort(SOperatorInfo* pOperator, SSDataBlock** pResBlock) { } } +_end: + if (code != TSDB_CODE_SUCCESS) { + qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); + } return code; } diff --git a/source/libs/executor/src/streamcountwindowoperator.c b/source/libs/executor/src/streamcountwindowoperator.c index adf764a8c5..367d94f614 100644 --- a/source/libs/executor/src/streamcountwindowoperator.c +++ b/source/libs/executor/src/streamcountwindowoperator.c @@ -741,8 +741,9 @@ static int32_t doStreamCountAggNext(SOperatorInfo* pOperator, SSDataBlock** ppRe _end: if (code != TSDB_CODE_SUCCESS) { - pTaskInfo->code = code; qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); } setStreamOperatorCompleted(pOperator); (*ppRes) = NULL; diff --git a/source/libs/executor/src/streameventwindowoperator.c b/source/libs/executor/src/streameventwindowoperator.c index a325616bd3..84be2beeb2 100644 --- a/source/libs/executor/src/streameventwindowoperator.c +++ b/source/libs/executor/src/streameventwindowoperator.c @@ -731,8 +731,9 @@ static int32_t doStreamEventAggNext(SOperatorInfo* pOperator, SSDataBlock** ppRe _end: if (code != TSDB_CODE_SUCCESS) { - pTaskInfo->code = code; qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); } setStreamOperatorCompleted(pOperator); (*ppRes) = NULL; diff --git a/source/libs/executor/src/streamfilloperator.c b/source/libs/executor/src/streamfilloperator.c index 4d5f597ab6..291cc3b67b 100644 --- a/source/libs/executor/src/streamfilloperator.c +++ b/source/libs/executor/src/streamfilloperator.c @@ -1155,8 +1155,9 @@ static int32_t doStreamFillNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { _end: if (code != TSDB_CODE_SUCCESS) { - pTaskInfo->code = code; qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); } setOperatorCompleted(pOperator); resetStreamFillInfo(pInfo); diff --git a/source/libs/executor/src/streamtimewindowoperator.c b/source/libs/executor/src/streamtimewindowoperator.c index 09bf73c1ee..390a9a3660 100644 --- a/source/libs/executor/src/streamtimewindowoperator.c +++ b/source/libs/executor/src/streamtimewindowoperator.c @@ -1798,8 +1798,9 @@ static int32_t doStreamFinalIntervalAggNext(SOperatorInfo* pOperator, SSDataBloc _end: if (code != TSDB_CODE_SUCCESS) { - pTaskInfo->code = code; qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); } setStreamOperatorCompleted(pOperator); (*ppRes) = NULL; @@ -3563,8 +3564,9 @@ static int32_t doStreamSessionAggNext(SOperatorInfo* pOperator, SSDataBlock** pp _end: if (code != TSDB_CODE_SUCCESS) { - pTaskInfo->code = code; qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); } setStreamOperatorCompleted(pOperator); (*ppRes) = NULL; @@ -4067,8 +4069,9 @@ static int32_t doStreamSessionSemiAggNext(SOperatorInfo* pOperator, SSDataBlock* _end: if (code != TSDB_CODE_SUCCESS) { - pTaskInfo->code = code; qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); } clearFunctionContext(&pOperator->exprSupp); @@ -4803,8 +4806,9 @@ static int32_t doStreamStateAggNext(SOperatorInfo* pOperator, SSDataBlock** ppRe _end: if (code != TSDB_CODE_SUCCESS) { - pTaskInfo->code = code; qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); } setStreamOperatorCompleted(pOperator); (*ppRes) = NULL; @@ -5202,6 +5206,7 @@ static int32_t doStreamIntervalAggNext(SOperatorInfo* pOperator, SSDataBlock** p code = TSDB_CODE_SUCCESS; break; } + QUERY_CHECK_CODE(code, lino, _end); pInfo->twAggSup.maxTs = TMAX(pInfo->twAggSup.maxTs, pBlock->info.window.ekey); pInfo->twAggSup.minTs = TMIN(pInfo->twAggSup.minTs, pBlock->info.window.skey); } @@ -5244,8 +5249,9 @@ static int32_t doStreamIntervalAggNext(SOperatorInfo* pOperator, SSDataBlock** p _end: if (code != TSDB_CODE_SUCCESS) { - pTaskInfo->code = code; qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); } setStreamOperatorCompleted(pOperator); (*ppRes) = NULL; @@ -5779,8 +5785,9 @@ static int32_t doStreamMidIntervalAggNext(SOperatorInfo* pOperator, SSDataBlock* _end: if (code != TSDB_CODE_SUCCESS) { - pTaskInfo->code = code; qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); } (*ppRes) = NULL; return code; diff --git a/source/libs/executor/src/sysscanoperator.c b/source/libs/executor/src/sysscanoperator.c index dcebdf59a9..7467d391d8 100644 --- a/source/libs/executor/src/sysscanoperator.c +++ b/source/libs/executor/src/sysscanoperator.c @@ -2049,7 +2049,7 @@ static int32_t doSysTableScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) if (isTaskKilled(pOperator->pTaskInfo)) { setOperatorCompleted(pOperator); (*ppRes) = NULL; - return pTaskInfo->code; + break; } blockDataCleanup(pInfo->pRes); @@ -2092,12 +2092,18 @@ static int32_t doSysTableScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) continue; } (*ppRes) = pBlock; - return pTaskInfo->code; } else { (*ppRes) = NULL; - return pTaskInfo->code; } + break; } + +_end: + if (pTaskInfo->code) { + qError("%s failed since %s", __func__, tstrerror(pTaskInfo->code)); + T_LONG_JMP(pTaskInfo->env, pTaskInfo->code); + } + return pTaskInfo->code; } static void sysTableScanFillTbName(SOperatorInfo* pOperator, const SSysTableScanInfo* pInfo, const char* name, From 78a4cf4e908c4f058fa9e9ac82156639a09dbd28 Mon Sep 17 00:00:00 2001 From: xiao-77 Date: Tue, 24 Sep 2024 18:33:52 +0800 Subject: [PATCH 19/62] fix mem leak when open wal --- source/libs/wal/src/walMgmt.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/libs/wal/src/walMgmt.c b/source/libs/wal/src/walMgmt.c index 81d31f9ecd..2d9ca4cce3 100644 --- a/source/libs/wal/src/walMgmt.c +++ b/source/libs/wal/src/walMgmt.c @@ -189,6 +189,7 @@ SWal *walOpen(const char *path, SWalCfg *pCfg) { _err: taosArrayDestroy(pWal->fileInfoSet); + taosArrayDestroy(pWal->toDeleteFiles); taosHashCleanup(pWal->pRefHash); TAOS_UNUSED(taosThreadRwlockDestroy(&pWal->mutex)); taosMemoryFreeClear(pWal); From 7f3c6c5e9737a53b04bf4b0a1040a23efaa613a9 Mon Sep 17 00:00:00 2001 From: Jinqing Kuang Date: Mon, 23 Sep 2024 14:21:29 +0800 Subject: [PATCH 20/62] fix(query)[TD-32259]. Fix error handling in merge sort - Ensure proper release of allocated datablocks on error - Address potential double free issue --- source/libs/executor/src/tsort.c | 55 ++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/source/libs/executor/src/tsort.c b/source/libs/executor/src/tsort.c index 00daafa59d..6fef9a5e10 100644 --- a/source/libs/executor/src/tsort.c +++ b/source/libs/executor/src/tsort.c @@ -437,41 +437,36 @@ int32_t tsortAddSource(SSortHandle* pSortHandle, void* pSource) { static int32_t doAddNewExternalMemSource(SDiskbasedBuf* pBuf, SArray* pAllSources, SSDataBlock* pBlock, int32_t* sourceId, SArray* pPageIdList) { + int32_t code = 0; + int32_t lino = 0; SSortSource* pSource = taosMemoryCalloc(1, sizeof(SSortSource)); - if (pSource == NULL) { - taosArrayDestroy(pPageIdList); - return terrno; - } + QUERY_CHECK_NULL(pSource, code, lino, _err, terrno); pSource->src.pBlock = pBlock; pSource->pageIdList = pPageIdList; - void* p = taosArrayPush(pAllSources, &pSource); - if (p == NULL) { - taosArrayDestroy(pPageIdList); - return terrno; - } + SSortSource** p = taosArrayPush(pAllSources, &pSource); + QUERY_CHECK_NULL(p, code, lino, _err, terrno); + pSource = NULL; (*sourceId) += 1; - int32_t rowSize = blockDataGetSerialRowSize(pSource->src.pBlock); + int32_t rowSize = blockDataGetSerialRowSize((*p)->src.pBlock); // The value of numOfRows must be greater than 0, which is guaranteed by the previous memory allocation int32_t numOfRows = (getBufPageSize(pBuf) - blockDataGetSerialMetaSize(taosArrayGetSize(pBlock->pDataBlock))) / rowSize; - if (numOfRows <= 0) { - qError("sort failed at: %s:%d", __func__, __LINE__); - taosArrayDestroy(pPageIdList); - return TSDB_CODE_QRY_EXECUTOR_INTERNAL_ERROR; - } + QUERY_CHECK_CONDITION((numOfRows > 0), code, lino, _err, TSDB_CODE_QRY_EXECUTOR_INTERNAL_ERROR); - int32_t code = blockDataEnsureCapacity(pSource->src.pBlock, numOfRows); - if (code != 0) { - qError("sort failed at: %s:%d", __func__, __LINE__); - taosArrayDestroy(pPageIdList); - } + code = blockDataEnsureCapacity((*p)->src.pBlock, numOfRows); + QUERY_CHECK_CODE(code, lino, _err); return code; + +_err: + if (pSource) taosMemoryFree(pSource); + qError("sort failed at %s:%d since %s", __func__, lino, tstrerror(code)); + return code; } static int32_t doAddToBuf(SSDataBlock* pDataBlock, SSortHandle* pHandle) { @@ -554,7 +549,12 @@ static int32_t doAddToBuf(SSDataBlock* pDataBlock, SSortHandle* pHandle) { return code; } - return doAddNewExternalMemSource(pHandle->pBuf, pHandle->pOrderedSource, pBlock, &pHandle->sourceId, pPageIdList); + code = doAddNewExternalMemSource(pHandle->pBuf, pHandle->pOrderedSource, pBlock, &pHandle->sourceId, pPageIdList); + if (code) { + blockDataDestroy(pBlock); + taosArrayDestroy(pPageIdList); + } + return code; } static void setCurrentSourceDone(SSortSource* pSource, SSortHandle* pHandle) { @@ -1023,6 +1023,9 @@ static int32_t doSortForEachGroup(SSortHandle* pHandle, int32_t sortTimes, int32 QUERY_CHECK_CODE(code, lino, _err); code = doAddNewExternalMemSource(pHandle->pBuf, pResList, pBlock, &pHandle->sourceId, pPageIdList); + if (code != TSDB_CODE_SUCCESS) { + blockDataDestroy(pBlock); + } QUERY_CHECK_CODE(code, lino, _err); } @@ -2144,6 +2147,10 @@ static int32_t sortBlocksToExtSource(SSortHandle* pHandle, SArray* aBlk, SArray* if (code) goto _error; code = doAddNewExternalMemSource(pHandle->pBuf, aExtSrc, pMemSrcBlk, &pHandle->sourceId, aPgId); + if (code != TSDB_CODE_SUCCESS) { + blockDataDestroy(pMemSrcBlk); + goto _error; + } cleanupMergeSup(&sup); tMergeTreeDestroy(&pTree); @@ -2306,9 +2313,15 @@ static int32_t createBlocksMergeSortInitialSources(SSortHandle* pHandle) { } code = tSimpleHashPut(mUidBlk, &pBlk->info.id.uid, sizeof(pBlk->info.id.uid), &tBlk, POINTER_BYTES); + if (code != TSDB_CODE_SUCCESS) { + blockDataDestroy(tBlk); + } QUERY_CHECK_CODE(code, lino, _err); void* px = taosArrayPush(aBlkSort, &tBlk); + if (px == NULL) { + blockDataDestroy(tBlk); + } QUERY_CHECK_NULL(px, code, lino, _err, terrno); } } From 0ef3774c7494bd426c7ac4ab18309a59c9eb0ec8 Mon Sep 17 00:00:00 2001 From: sheyanjie-qq <249478495@qq.com> Date: Tue, 24 Sep 2024 20:08:19 +0800 Subject: [PATCH 21/62] update ci --- .../rust/nativeexample/examples/connect.rs | 2 +- .../examples/rust/restexample/examples/tmq.rs | 1 - tests/docs-examples-test/rust.sh | 87 + tests/parallel_test/cases.task | 1550 +---------------- 4 files changed, 89 insertions(+), 1551 deletions(-) create mode 100644 tests/docs-examples-test/rust.sh diff --git a/docs/examples/rust/nativeexample/examples/connect.rs b/docs/examples/rust/nativeexample/examples/connect.rs index ad2533d4c3..f316a70631 100644 --- a/docs/examples/rust/nativeexample/examples/connect.rs +++ b/docs/examples/rust/nativeexample/examples/connect.rs @@ -2,7 +2,7 @@ use taos::*; #[tokio::main] async fn main() -> anyhow::Result<()> { - let dsn = "taos://localhost:6030".to_string(); + let dsn = "taos://localhost:6031".to_string(); match TaosBuilder::from_dsn(&dsn)?.build().await { Ok(_taos) => { diff --git a/docs/examples/rust/restexample/examples/tmq.rs b/docs/examples/rust/restexample/examples/tmq.rs index 61416133e3..8586bbc5c7 100644 --- a/docs/examples/rust/restexample/examples/tmq.rs +++ b/docs/examples/rust/restexample/examples/tmq.rs @@ -83,7 +83,6 @@ async fn main() -> anyhow::Result<()> { eprintln!("Failed to execute insert: {:?}", e); } tokio::time::sleep(Duration::from_millis(10)).await; - println!("Succed to execute insert 1 row"); } }); }); diff --git a/tests/docs-examples-test/rust.sh b/tests/docs-examples-test/rust.sh new file mode 100644 index 0000000000..91489d8bcd --- /dev/null +++ b/tests/docs-examples-test/rust.sh @@ -0,0 +1,87 @@ +#!/bin/bash + +set -e + + +check_transactions() { + for i in {1..30} + do + output=$(taos -s "show transactions;") + if [[ $output == *"Query OK, 0 row(s)"* ]]; then + echo "Success: No transactions are in progress." + return 0 + fi + sleep 1 + done + + echo "Error: Transactions are still in progress after 30 attempts." + return 1 +} + +reset_cache() { + response=$(curl --location -uroot:taosdata 'http://127.0.0.1:6041/rest/sql' --data 'reset query cache') + + if [[ $response == \{\"code\":0* ]]; then + echo "Success: Query cache reset successfully." + else + echo "Error: Failed to reset query cache. Response: $response" + return 1 + fi +} + +taosd >>/dev/null 2>&1 & +taosadapter >>/dev/null 2>&1 & + +sleep 5 + +cd ../../docs/examples/rust/nativeexample + +cargo run --example connect + +cargo run --example createdb + +cargo run --example insert + +cargo run --example query + +taos -s "drop database if exists power" +check_transactions || exit 1 +reset_cache || exit 1 + +cargo run --example schemaless + +taos -s "drop database if exists power" +check_transactions || exit 1 +reset_cache || exit 1 + + +cargo run --example stmt + +cargo run --example tmq + + + +cd ../restexample + +cargo run --example connect + +cargo run --example createdb + +cargo run --example insert + +cargo run --example query + +taos -s "drop database if exists power" +check_transactions || exit 1 +reset_cache || exit 1 +taos -s "create database if not exists power" +cargo run --example schemaless + +taos -s "drop database if exists power" +check_transactions || exit 1 +reset_cache || exit 1 + + +cargo run --example stmt + +cargo run --example tmq diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index 1a00787a6b..30c79fea02 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -2,1559 +2,11 @@ #caseID,rerunTimes,Run with Sanitizer,casePath,caseCommand #NA,NA,y or n,script,./test.sh -f tsim/user/basic.sim -#unit-test - -,,n,unit-test,bash test.sh - - -# -# army-test -# -,,y,army,./pytest.sh python3 ./test.py -f multi-level/mlevel_basic.py -N 3 -L 3 -D 2 -,,y,army,./pytest.sh python3 ./test.py -f db-encrypt/basic.py -,,n,army,python3 ./test.py -f storage/s3/s3Basic.py -N 3 -,,y,army,./pytest.sh python3 ./test.py -f cluster/snapshot.py -N 3 -L 3 -D 2 -,,y,army,./pytest.sh python3 ./test.py -f query/function/test_func_elapsed.py -,,y,army,./pytest.sh python3 ./test.py -f query/function/test_function.py -,,y,army,./pytest.sh python3 ./test.py -f query/function/concat.py -,,y,army,./pytest.sh python3 ./test.py -f query/function/cast.py -,,y,army,./pytest.sh python3 ./test.py -f query/test_join.py -,,y,army,./pytest.sh python3 ./test.py -f query/test_compare.py -,,y,army,./pytest.sh python3 ./test.py -f insert/test_column_tag_boundary.py -,,y,army,./pytest.sh python3 ./test.py -f query/fill/fill_desc.py -N 3 -L 3 -D 2 -,,y,army,./pytest.sh python3 ./test.py -f query/fill/fill_null.py -,,y,army,./pytest.sh python3 ./test.py -f cluster/incSnapshot.py -N 3 -,,y,army,./pytest.sh python3 ./test.py -f cluster/clusterBasic.py -N 5 -,,y,army,./pytest.sh python3 ./test.py -f query/query_basic.py -N 3 -,,y,army,./pytest.sh python3 ./test.py -f query/accuracy/test_query_accuracy.py -,,y,army,./pytest.sh python3 ./test.py -f query/accuracy/test_ts5400.py -,,y,army,./pytest.sh python3 ./test.py -f query/accuracy/test_having.py -,,y,army,./pytest.sh python3 ./test.py -f insert/insert_basic.py -N 3 -,,y,army,./pytest.sh python3 ./test.py -f cluster/splitVgroupByLearner.py -N 3 -,,y,army,./pytest.sh python3 ./test.py -f authorith/authBasic.py -N 3 -,,n,army,python3 ./test.py -f cmdline/fullopt.py -,,y,army,./pytest.sh python3 ./test.py -f query/show.py -N 3 -,,y,army,./pytest.sh python3 ./test.py -f alter/alterConfig.py -N 3 -,,y,army,./pytest.sh python3 ./test.py -f query/subquery/subqueryBugs.py -N 3 -,,y,army,./pytest.sh python3 ./test.py -f storage/oneStageComp.py -N 3 -L 3 -D 1 -,,y,army,./pytest.sh python3 ./test.py -f storage/compressBasic.py -N 3 -,,y,army,./pytest.sh python3 ./test.py -f grant/grantBugs.py -N 3 -,,y,army,./pytest.sh python3 ./test.py -f query/queryBugs.py -N 3 -,,y,army,./pytest.sh python3 ./test.py -f tmq/tmqBugs.py -N 3 -,,y,army,./pytest.sh python3 ./test.py -f query/fill/fill_compare_asc_desc.py -,,y,army,./pytest.sh python3 ./test.py -f query/last/test_last.py -,,y,army,./pytest.sh python3 ./test.py -f query/window/base.py -,,y,army,./pytest.sh python3 ./test.py -f query/sys/tb_perf_queries_exist_test.py -N 3 - -# -# system test -# -,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/stream_multi_agg.py -,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/stream_basic.py -,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/scalar_function.py -,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/at_once_interval.py -,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/at_once_session.py -,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/at_once_state_window.py -,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/window_close_interval.py -,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/window_close_session.py -,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/window_close_state_window.py -,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/max_delay_interval.py -,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/max_delay_session.py -,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/at_once_interval_ext.py -,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/max_delay_interval_ext.py -,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/window_close_session_ext.py -,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/partition_interval.py -,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/pause_resume_test.py -,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/state_window_case.py -#,,n,system-test,python3 ./test.py -f 8-stream/vnode_restart.py -N 4 -#,,n,system-test,python3 ./test.py -f 8-stream/snode_restart.py -N 4 -,,n,system-test,python3 ./test.py -f 8-stream/snode_restart_with_checkpoint.py -N 4 - -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/pk_error.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/pk_func.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/pk_varchar.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/pk_func_group.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_expr.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/project_group.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tbname_vgroup.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count_interval.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/compact-col.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tms_memleak.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stbJoin.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stbJoin.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stbJoin.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stbJoin.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/hint.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/hint.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/hint.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/hint.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/para_tms.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/para_tms2.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_str.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_math.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_time.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_26.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_str.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_math.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_time.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_26.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/columnLenUpdated.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/columnLenUpdated.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/columnLenUpdated.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/columnLenUpdated.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_str.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_math.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_time.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_26.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interval_limit_opt.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interval_unit.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interval_unit.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interval_unit.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interval_unit.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_by_col.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_by_col.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_by_col.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_by_col.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_by_col_agg.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_by_col_agg.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_by_col_agg.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_by_col_agg.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interval_limit_opt_2.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interval_limit_opt_2.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interval_limit_opt_2.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interval_limit_opt_2.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/func_to_char_timestamp.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/func_to_char_timestamp.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/func_to_char_timestamp.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/func_to_char_timestamp.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_cache_scan.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_cache_scan.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_cache_scan.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_cache_scan.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tbname.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tbname.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tbname.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tbname.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsma.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsma.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsma.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsma.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsma.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsma2.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsma2.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsma2.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsma2.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsma2.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery2.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqShow.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqDropStb.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeStb0.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeStb1.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeStb2.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeStb3.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeDb0.py -N 3 -n 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/ins_topics_test.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqMaxTopic.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqParamsTest.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqParamsTest.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqClientConsLog.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqMaxGroupIds.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsumeDiscontinuousData.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqOffset.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq_primary_key.py -,,n,system-test,python3 ./test.py -f 7-tmq/tmqDropConsumer.py - - -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/insert_stb.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/delete_stable.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/stt_blocks_check.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/out_of_order.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/out_of_order.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/agg_null.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/insert_null_none.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/insert_null_none.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/insert_null_none.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/insert_null_none.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/insert_null_none.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/database_pre_suf.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/out_of_order.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/out_of_order.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_str.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_math.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_time.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_26.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/select_null.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/select_null.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/select_null.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/select_null.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/select_null.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ts-4233.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ts-4233.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ts-4233.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ts-4233.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/like.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/like.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/like.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/like.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/match.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/match.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/match.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/match.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/td-28068.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/td-28068.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/td-28068.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/td-28068.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/agg_group_AlwaysReturnValue.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/agg_group_AlwaysReturnValue.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/agg_group_AlwaysReturnValue.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/agg_group_AlwaysReturnValue.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/agg_group_NotReturnValue.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/agg_group_NotReturnValue.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/agg_group_NotReturnValue.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/agg_group_NotReturnValue.py -Q 4 - -,,y,system-test,./pytest.sh python3 ./test.py -f 3-enterprise/restore/restoreDnode.py -N 5 -M 3 -i False -,,y,system-test,./pytest.sh python3 ./test.py -f 3-enterprise/restore/restoreVnode.py -N 5 -M 3 -i False -,,y,system-test,./pytest.sh python3 ./test.py -f 3-enterprise/restore/restoreMnode.py -N 5 -M 3 -i False -,,y,system-test,./pytest.sh python3 ./test.py -f 3-enterprise/restore/restoreQnode.py -N 5 -M 3 -i False - -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/create_wrong_topic.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/dropDbR3ConflictTransaction.py -N 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/basic5.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeDb.py -N 3 -n 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/ts-4674.py -N 3 -n 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeDb1.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeDb2.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeDb3.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeDb4.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeStb.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeStb4.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/db.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqError.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/schema.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/stbFilterWhere.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/stbFilter.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqCheckData.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqCheckData1.py -#,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsumerGroup.py -,,n,system-test,python3 ./test.py -f 7-tmq/tmqConsumerGroup.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqAlterSchema.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb.py -N 3 -n 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb1.py -N 3 -n 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb-mutilVg.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb1-mutilVg.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb-1ctb.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb1-1ctb.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb-1ctb-funcNFilter.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb-mutilVg-mutilCtb-funcNFilter.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb-mutilVg-mutilCtb.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb1-1ctb-funcNFilter.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb1-mutilVg-mutilCtb-funcNFilter.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb1-mutilVg-mutilCtb.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqAutoCreateTbl.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqDnodeRestart.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqDnodeRestart1.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqUpdate-1ctb.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqUpdateWithConsume.py -N 3 -n 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqUpdate-multiCtb-snapshot0.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqUpdate-multiCtb-snapshot1.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqDelete-1ctb.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqDelete-multiCtb.py -N 3 -n 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqDropStbCtb.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqDropNtb-snapshot0.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqDropNtb-snapshot1.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqUdf.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqUdf-multCtb-snapshot0.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqUdf-multCtb-snapshot1.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/stbTagFilter-1ctb.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/dataFromTsdbNWal.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/dataFromTsdbNWal-multiCtb.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq_taosx.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq_ts4563.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq_replay.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqSeekAndCommit.py -,,n,system-test,python3 ./test.py -f 7-tmq/tmq_offset.py -,,n,system-test,python3 ./test.py -f 7-tmq/tmqDataPrecisionUnit.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/raw_block_interface_test.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/stbTagFilter-multiCtb.py -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqSubscribeStb-r3.py -N 5 -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq3mnodeSwitch.py -N 6 -M 3 -i True -,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq3mnodeSwitch.py -N 6 -M 3 -n 3 -i True -,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeTransform-db-removewal.py -N 2 -n 1 -,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeTransform-stb-removewal.py -N 6 -n 3 -,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeTransform-stb.py -N 2 -n 1 -,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeTransform-stb.py -N 6 -n 3 -#,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeTransform-db.py -N 6 -n 3 -,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeSplit-stb-select.py -N 2 -n 1 -,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeSplit-stb-select-duplicatedata.py -N 3 -n 3 -,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeSplit-stb-select-duplicatedata-false.py -N 3 -n 3 -,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeSplit-stb-select.py -N 3 -n 3 -,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeSplit-stb-select-false.py -N 3 -n 3 -,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeSplit-stb.py -N 3 -n 3 -,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeSplit-stb-false.py -N 3 -n 3 -,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeSplit-column.py -N 3 -n 3 -,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeSplit-column-false.py -N 3 -n 3 -,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeSplit-db.py -N 3 -n 3 -,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeSplit-db-false.py -N 3 -n 3 - -,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeReplicate.py -M 3 -N 3 -n 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TD-19201.py -,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TD-21561.py -,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TS-3404.py -,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TS-3581.py -,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TS-3311.py -,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TS-3821.py -,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TS-5130.py - -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/balance_vgroups_r1.py -N 6 -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/taosShell.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/taosShellError.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/taosShellNetChk.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/telemetry.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/backquote_check.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/taosdMonitor.py -,,n,system-test,python3 ./test.py -f 0-others/taosdShell.py -N 5 -M 3 -Q 3 -,,n,system-test,python3 ./test.py -f 0-others/udfTest.py -,,n,system-test,python3 ./test.py -f 0-others/udf_create.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/udf_restart_taosd.py -,,n,system-test,python3 ./test.py -f 0-others/udf_cfg1.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/udf_cfg2.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/cachemodel.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/sysinfo.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/user_control.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/user_manage.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/user_privilege.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/user_privilege_show.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/user_privilege_all.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/fsync.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/multilevel.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/ttl.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/ttlChangeOnWrite.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/compress_tsz1.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/compress_tsz2.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/view/non_marterial_view/test_view.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/test_show_table_distributed.py -,,n,system-test,python3 ./test.py -f 0-others/compatibility.py -,,n,system-test,python3 ./test.py -f 0-others/tag_index_basic.py -,,n,system-test,python3 ./test.py -f 0-others/udfpy_main.py -,,n,system-test,python3 ./test.py -N 3 -f 0-others/walRetention.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/splitVGroup.py -N 3 -n 1 -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/splitVGroupWal.py -N 3 -n 1 -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/splitVGroup.py -N 3 -n 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/splitVGroupWal.py -N 3 -n 3 -,,n,system-test,python3 ./test.py -f 0-others/timeRangeWise.py -N 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/delete_check.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/test_hot_refresh_configurations.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/subscribe_stream_privilege.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/empty_identifier.py - -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/composite_primary_key_create.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/composite_primary_key_insert.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/composite_primary_key_delete.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/insert_double.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/alter_database.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/alter_replica.py -N 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/influxdb_line_taosc_insert.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/opentsdb_telnet_line_taosc_insert.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/opentsdb_json_taosc_insert.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/test_stmt_muti_insert_query.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/test_stmt_set_tbname_tag.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/alter_stable.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/alter_table.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/boundary.py -,,n,system-test,python3 ./test.py -f 1-insert/insertWithMoreVgroup.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/table_comment.py -#,,n,system-test,python3 ./test.py -f 1-insert/time_range_wise.py -#,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/block_wise.py -#,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/create_retentions.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/mutil_stage.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/table_param_ttl.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/table_param_ttl.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/update_data_muti_rows.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/db_tb_name_check.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/InsertFuturets.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/insert_wide_column.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/insert_column_value.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_benchmark.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_1.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_1.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_1.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_1.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_1.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_2.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_2.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_2.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_2.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_2.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_3.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_3.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_3.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_3.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_3.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_4.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_4.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_4.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_4.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_4.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/precisionUS.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/precisionNS.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/test_ts4219.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/ts-4272.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/test_ts4295.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/test_td27388.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/test_ts4479.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/test_td29793.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/insert_timestamp.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/test_td29157.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/show.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/show_tag_index.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/information_schema.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/abs.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/abs.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/and_or_for_byte.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/and_or_for_byte.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/apercentile.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/apercentile.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arccos.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arccos.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arcsin.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arcsin.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arctan.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arctan.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/avg.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/avg.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/between.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/between.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/bottom.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/bottom.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/cast.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/cast.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ceil.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ceil.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/char_length.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/char_length.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/check_tsdb.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/check_tsdb.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat_ws.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat_ws.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat_ws2.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat_ws2.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/cos.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/cos.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/group_partition.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/group_partition.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/group_partition.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/group_partition.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/group_partition.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count_partition.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count_partition.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/countAlwaysReturnValue.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/countAlwaysReturnValue.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/db.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/db.py -N 3 -n 3 -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/diff.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/diff.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distinct.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distinct.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_apercentile.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_apercentile.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_avg.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_avg.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_count.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_count.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_max.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_max.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_min.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_min.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_spread.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_spread.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_stddev.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_stddev.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_sum.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_sum.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/explain.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/explain.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/first.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/first.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/floor.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/floor.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_null.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_null.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_stateduration.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_stateduration.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/histogram.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/histogram.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/hyperloglog.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/hyperloglog.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interp.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interp.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/fill.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/irate.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/irate.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/join.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/join.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_row.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_row.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_and_last_row.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_and_last_row.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_and_last_row.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_and_last_row.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_and_last_row.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last+last_row.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last+last_row.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last+last_row.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last+last_row.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_1.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_1.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_1.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_1.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_1.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_2.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_2.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_2.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_2.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_2.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_3.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_3.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_3.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_3.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_3.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_4.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_4.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_4.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_4.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_4.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_5.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_5.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_5.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_5.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_5.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/leastsquares.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/leastsquares.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/length.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/length.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/limit.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/log.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/log.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/logical_operators.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/logical_operators.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/lower.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/lower.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ltrim.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ltrim.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/mavg.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/mavg.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max_partition.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max_partition.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_limit_interval.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_limit_interval.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max_min_last_interval.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_row_interval.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/min.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/min.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/normal.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/normal.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/mode.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/mode.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Now.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Now.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/orderBy.py -N 5 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/percentile.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/percentile.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/pow.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/pow.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/query_cols_tags_and_or.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/query_cols_tags_and_or.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/round.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/round.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/rtrim.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/rtrim.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sample.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sample.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sin.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sin.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/smaBasic.py -N 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/smaTest.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/smaTest.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/sma_index.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sml_TS-3724.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sml-TD19291.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/varbinary.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sml.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sml.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/spread.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/spread.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sqrt.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sqrt.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/statecount.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/statecount.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stateduration.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stateduration.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/substr.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/substr.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sum.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sum.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tail.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tail.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tan.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tan.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Timediff.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Timediff.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/timetruncate.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/timetruncate.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/timezone.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/timezone.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/To_iso8601.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/To_iso8601.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/To_unixtimestamp.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/To_unixtimestamp.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Today.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Today.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/top.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/top.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsbsQuery.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsbsQuery.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ttl_comment.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ttl_comment.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/twa.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/twa.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/union.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/union.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/unique.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/unique.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/upper.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/upper.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/varchar.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/varchar.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/case_when.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/case_when.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/blockSMA.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/blockSMA.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/projectionDesc.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/projectionDesc.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/update_data.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/tb_100w_data_order.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/delete_childtable.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/delete_normaltable.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/delete_systable.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/keep_expired.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/stmt_error.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/drop.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/drop.py -N 3 -M 3 -i False -n 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/join2.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/union1.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat2.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/json_tag.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQueryInterval.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/systable_func.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/test_ts4382.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/test_ts4403.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/test_td28163.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stablity.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stablity_1.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/elapsed.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/csum.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_diff.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tagFilter.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/projectionDesc.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ts_3405_3398_3423.py -N 3 -n 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ts-4348-td-27939.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/backslash_g.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/test_ts4467.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/geometry.py - -,,n,system-test,python3 ./test.py -f 2-query/queryQnode.py -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode1mnode.py -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode2mnode.py -N 5 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeStop.py -N 5 -M 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeStop.py -N 5 -M 3 -i False -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeStop2Follower.py -N 5 -M 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeStop2Follower.py -N 5 -M 3 -i False -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeStopLoop.py -N 5 -M 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateDb.py -N 6 -M 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateDb.py -N 6 -M 3 -n 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateDb.py -N 6 -M 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateDb.py -N 6 -M 3 -n 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopVnodeCreateDb.py -N 6 -M 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopVnodeCreateDb.py -N 6 -M 3 -n 3 - -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopDnodeModifyMeta.py -N 6 -M 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopMnodeModifyMeta.py -N 6 -M 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateStb.py -N 6 -M 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateStb.py -N 6 -M 3 -n 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateStb.py -N 6 -M 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateStb.py -N 6 -M 3 -n 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopVnodeCreateStb.py -N 6 -M 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopVnodeCreateStb.py -N 6 -M 3 -n 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeRestartDnodeInsertData.py -N 6 -M 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeRestartDnodeInsertData.py -N 6 -M 3 -n 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeRestartDnodeInsertDataAsync.py -N 6 -M 3 -#,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeRestartDnodeInsertDataAsync.py -N 6 -M 3 -n 3 -,,n,system-test,python3 ./test.py -f 6-cluster/manually-test/6dnode3mnodeInsertLessDataAlterRep3to1to3.py -N 6 -M 3 -#,,n,system-test,python3 ./test.py -f 6-cluster/5dnode3mnodeRoll.py -N 3 -C 1 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeAdd1Ddnoe.py -N 7 -M 3 -C 6 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeAdd1Ddnoe.py -N 7 -M 3 -C 6 -n 3 -#,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeDrop.py -N 5 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeRecreateMnode.py -N 6 -M 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeStopFollowerLeader.py -N 5 -M 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeStop2Follower.py -N 5 -M 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_createDb_replica1.py -N 4 -M 1 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas.py -N 4 -M 1 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas_querys.py -N 4 -M 1 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas.py -N 4 -M 1 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys.py -N 4 -M 1 -,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups.py -N 4 -M 1 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/between.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distinct.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/varchar.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ltrim.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/rtrim.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/length.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/char_length.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/upper.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/lower.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/join.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/join2.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/cast.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/substr.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/union.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/union1.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat2.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat_ws.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat_ws2.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/check_tsdb.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/spread.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/hyperloglog.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/explain.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/leastsquares.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/timezone.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Now.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Today.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/min.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/normal.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/mode.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/countAlwaysReturnValue.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/first.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/To_iso8601.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/To_unixtimestamp.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/timetruncate.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/diff.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Timediff.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/json_tag.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/top.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/bottom.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/percentile.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/apercentile.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/abs.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ceil.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/floor.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/round.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/log.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/pow.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sqrt.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sin.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/cos.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tan.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arcsin.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arccos.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arctan.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/query_cols_tags_and_or.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interp.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/fill.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQueryInterval.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stablity.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stablity_1.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/avg.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/elapsed.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/csum.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/mavg.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sample.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_diff.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/unique.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stateduration.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_stateduration.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/statecount.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tail.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ttl_comment.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_count.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_max.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_min.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_sum.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_spread.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_apercentile.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_avg.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_stddev.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/twa.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/irate.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_null.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count_partition.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max_partition.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_limit_interval.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max_min_last_interval.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_row_interval.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_row.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsbsQuery.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sml.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/case_when.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/blockSMA.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/projectionDesc.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TD-21561.py -Q 2 - -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/between.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distinct.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/varchar.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ltrim.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/rtrim.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/length.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/char_length.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/upper.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/lower.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/join.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/join2.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/cast.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/substr.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/union.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/union1.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat2.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat_ws.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat_ws2.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/check_tsdb.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/spread.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/hyperloglog.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/explain.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/leastsquares.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/timezone.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Now.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Today.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/min.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/normal.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/mode.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/countAlwaysReturnValue.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/first.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/To_iso8601.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/To_unixtimestamp.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/timetruncate.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/diff.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Timediff.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/json_tag.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/top.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/bottom.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/percentile.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/apercentile.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/abs.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ceil.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/floor.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/round.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/log.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/pow.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sqrt.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sin.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/cos.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tan.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arcsin.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arccos.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arctan.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/query_cols_tags_and_or.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQueryInterval.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stablity.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stablity_1.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/avg.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/elapsed.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/csum.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/mavg.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sample.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_diff.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/unique.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stateduration.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_stateduration.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/statecount.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tail.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ttl_comment.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_count.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_max.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_min.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_sum.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_spread.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_apercentile.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_avg.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_stddev.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/twa.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/irate.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_null.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count_partition.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max_partition.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_limit_interval.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max_min_last_interval.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_row_interval.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_row.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsbsQuery.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sml.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interp.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/fill.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/case_when.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/blockSMA.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/projectionDesc.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TD-21561.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/between.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distinct.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/varchar.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ltrim.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/rtrim.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/length.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/char_length.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/upper.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/lower.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/join.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/join2.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/substr.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/union.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/union1.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat2.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat_ws.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat_ws2.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/check_tsdb.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/spread.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/hyperloglog.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/explain.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/leastsquares.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/timezone.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Now.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Today.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/min.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/normal.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/mode.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/countAlwaysReturnValue.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/first.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/To_iso8601.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/To_unixtimestamp.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/timetruncate.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/diff.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Timediff.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/json_tag.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/top.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/bottom.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/percentile.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/apercentile.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/abs.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ceil.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/floor.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/round.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/log.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/pow.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sqrt.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sin.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/cos.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tan.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arcsin.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arccos.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arctan.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/query_cols_tags_and_or.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQueryInterval.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stablity.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stablity_1.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/avg.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/elapsed.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/csum.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/mavg.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sample.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/cast.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_diff.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/unique.py -Q 4 -#,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stateduration.py -Q 4 -#,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_stateduration.py -Q 4 -#,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/statecount.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tail.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ttl_comment.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_count.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_max.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_min.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_sum.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_spread.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_apercentile.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_avg.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_stddev.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/twa.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/irate.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_null.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count_partition.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max_partition.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_limit_interval.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max_min_last_interval.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_row_interval.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_row.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsbsQuery.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sml.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interp.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/fill.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/case_when.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/insert_select.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/insert_select.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/insert_select.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/insert_select.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/insert_select.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/out_of_order.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/blockSMA.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/projectionDesc.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/odbc.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/fill_with_group.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/state_window.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TD-21561.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TD-20582.py -,,n,system-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/insertMix.py -N 3 -,,n,system-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/stt.py -N 3 -,,n,system-test,python3 ./test.py -f eco-system/meta/database/keep_time_offset.py - -#tsim test -,,y,script,./test.sh -f tsim/query/timeline.sim -,,y,script,./test.sh -f tsim/join/join.sim -,,y,script,./test.sh -f tsim/tmq/basic2Of2ConsOverlap.sim -,,y,script,./test.sh -f tsim/parser/where.sim -,,y,script,./test.sh -f tsim/parser/join_manyblocks.sim -,,y,script,./test.sh -f tsim/dnode/redistribute_vgroup_replica3_v1_leader.sim -,,y,script,./test.sh -f tsim/dnode/redistribute_vgroup_replica3_v1_follower.sim -,,y,script,./test.sh -f tsim/dnode/redistribute_vgroup_replica3_v2.sim -,,y,script,./test.sh -f tsim/dnode/redistribute_vgroup_replica3_v3.sim -,,y,script,./test.sh -f tsim/parser/limit1.sim -,,y,script,./test.sh -f tsim/parser/union.sim -,,y,script,./test.sh -f tsim/parser/commit.sim -,,y,script,./test.sh -f tsim/parser/nestquery.sim -,,n,script,./test.sh -f tsim/valgrind/checkError7.sim -,,y,script,./test.sh -f tsim/parser/groupby.sim -,,y,script,./test.sh -f tsim/parser/sliding.sim -,,y,script,./test.sh -f tsim/dnode/balance2.sim -,,y,script,./test.sh -f tsim/vnode/replica3_repeat.sim -,,y,script,./test.sh -f tsim/parser/col_arithmetic_operation.sim -#,,y,script,./test.sh -f tsim/trans/create_db.sim -,,y,script,./test.sh -f tsim/dnode/balance3.sim -,,y,script,./test.sh -f tsim/vnode/replica3_many.sim -,,y,script,./test.sh -f tsim/stable/metrics_idx.sim -# ,,y,script,./test.sh -f tsim/db/alter_replica_13.sim -,,y,script,./test.sh -f tsim/sync/3Replica1VgElect.sim -,,y,script,./test.sh -f tsim/sync/3Replica5VgElect.sim -,,n,script,./test.sh -f tsim/valgrind/checkError6.sim - -,,y,script,./test.sh -f tsim/user/basic.sim -,,y,script,./test.sh -f tsim/user/password.sim -,,y,script,./test.sh -f tsim/user/whitelist.sim -,,y,script,./test.sh -f tsim/user/privilege_db.sim -,,y,script,./test.sh -f tsim/user/privilege_sysinfo.sim -,,y,script,./test.sh -f tsim/user/privilege_topic.sim -,,y,script,./test.sh -f tsim/user/privilege_table.sim -,,y,script,./test.sh -f tsim/user/privilege_create_db.sim -,,y,script,./test.sh -f tsim/db/alter_option.sim -# ,,y,script,./test.sh -f tsim/db/alter_replica_31.sim -,,y,script,./test.sh -f tsim/db/basic1.sim -,,y,script,./test.sh -f tsim/db/basic2.sim -,,y,script,./test.sh -f tsim/db/basic3.sim -,,y,script,./test.sh -f tsim/db/basic4.sim -,,y,script,./test.sh -f tsim/db/basic5.sim -,,y,script,./test.sh -f tsim/db/basic6.sim -,,y,script,./test.sh -f tsim/db/commit.sim -,,y,script,./test.sh -f tsim/db/create_all_options.sim -,,y,script,./test.sh -f tsim/db/delete_reuse1.sim -,,y,script,./test.sh -f tsim/db/delete_reuse2.sim -,,y,script,./test.sh -f tsim/db/delete_reusevnode.sim -,,y,script,./test.sh -f tsim/db/delete_reusevnode2.sim -,,y,script,./test.sh -f tsim/db/delete_writing1.sim -,,y,script,./test.sh -f tsim/db/delete_writing2.sim -,,y,script,./test.sh -f tsim/db/error1.sim -,,y,script,./test.sh -f tsim/db/keep.sim -,,y,script,./test.sh -f tsim/db/len.sim -,,y,script,./test.sh -f tsim/db/repeat.sim -,,y,script,./test.sh -f tsim/db/show_create_db.sim -,,y,script,./test.sh -f tsim/db/show_create_table.sim -,,y,script,./test.sh -f tsim/db/tables.sim -,,y,script,./test.sh -f tsim/db/taosdlog.sim -,,y,script,./test.sh -f tsim/db/table_prefix_suffix.sim -,,y,script,./test.sh -f tsim/dnode/balance_replica1.sim -,,y,script,./test.sh -f tsim/dnode/balance_replica3.sim -,,y,script,./test.sh -f tsim/dnode/balance1.sim -,,y,script,./test.sh -f tsim/dnode/balancex.sim -,,y,script,./test.sh -f tsim/dnode/create_dnode.sim -,,y,script,./test.sh -f tsim/dnode/drop_dnode_has_mnode.sim -,,y,script,./test.sh -f tsim/dnode/drop_dnode_has_qnode_snode.sim -,,y,script,./test.sh -f tsim/dnode/drop_dnode_has_vnode_replica1.sim -,,y,script,./test.sh -f tsim/dnode/drop_dnode_has_vnode_replica3.sim -,,y,script,./test.sh -f tsim/dnode/drop_dnode_has_multi_vnode_replica1.sim -,,y,script,./test.sh -f tsim/dnode/drop_dnode_has_multi_vnode_replica3.sim -,,y,script,./test.sh -f tsim/dnode/drop_dnode_force.sim -,,y,script,./test.sh -f tsim/dnode/offline_reason.sim -,,y,script,./test.sh -f tsim/dnode/redistribute_vgroup_replica1.sim -,,y,script,./test.sh -f tsim/dnode/vnode_clean.sim -,,y,script,./test.sh -f tsim/dnode/use_dropped_dnode.sim -,,y,script,./test.sh -f tsim/dnode/split_vgroup_replica1.sim -,,y,script,./test.sh -f tsim/dnode/split_vgroup_replica3.sim -,,y,script,./test.sh -f tsim/import/basic.sim -,,y,script,./test.sh -f tsim/import/commit.sim -,,y,script,./test.sh -f tsim/import/large.sim -,,y,script,./test.sh -f tsim/import/replica1.sim -,,y,script,./test.sh -f tsim/insert/backquote.sim -,,y,script,./test.sh -f tsim/insert/basic.sim -,,y,script,./test.sh -f tsim/insert/basic0.sim -,,y,script,./test.sh -f tsim/insert/basic1.sim -,,y,script,./test.sh -f tsim/insert/basic2.sim -,,y,script,./test.sh -f tsim/insert/commit-merge0.sim -,,y,script,./test.sh -f tsim/insert/insert_drop.sim -,,y,script,./test.sh -f tsim/insert/insert_select.sim -,,y,script,./test.sh -f tsim/insert/null.sim -,,y,script,./test.sh -f tsim/insert/query_block1_file.sim -,,y,script,./test.sh -f tsim/insert/query_block1_memory.sim -,,y,script,./test.sh -f tsim/insert/query_block2_file.sim -,,y,script,./test.sh -f tsim/insert/query_block2_memory.sim -,,y,script,./test.sh -f tsim/insert/query_file_memory.sim -,,y,script,./test.sh -f tsim/insert/query_multi_file.sim -,,y,script,./test.sh -f tsim/insert/tcp.sim -,,y,script,./test.sh -f tsim/insert/update0.sim -,,y,script,./test.sh -f tsim/insert/delete0.sim -,,y,script,./test.sh -f tsim/insert/update1_sort_merge.sim -,,y,script,./test.sh -f tsim/insert/update2.sim -,,y,script,./test.sh -f tsim/insert/insert_stb.sim -,,y,script,./test.sh -f tsim/parser/alter__for_community_version.sim -,,y,script,./test.sh -f tsim/parser/alter_column.sim -,,y,script,./test.sh -f tsim/parser/alter_stable.sim -,,y,script,./test.sh -f tsim/parser/alter.sim -,,y,script,./test.sh -f tsim/parser/alter1.sim -,,y,script,./test.sh -f tsim/parser/auto_create_tb_drop_tb.sim -,,y,script,./test.sh -f tsim/parser/auto_create_tb.sim -,,y,script,./test.sh -f tsim/parser/between_and.sim -,,y,script,./test.sh -f tsim/parser/binary_escapeCharacter.sim -,,y,script,./test.sh -f tsim/parser/columnValue_bigint.sim -,,y,script,./test.sh -f tsim/parser/columnValue_bool.sim -,,y,script,./test.sh -f tsim/parser/columnValue_double.sim -,,y,script,./test.sh -f tsim/parser/columnValue_float.sim -,,y,script,./test.sh -f tsim/parser/columnValue_int.sim -,,y,script,./test.sh -f tsim/parser/columnValue_smallint.sim -,,y,script,./test.sh -f tsim/parser/columnValue_tinyint.sim -,,y,script,./test.sh -f tsim/parser/columnValue_unsign.sim -,,y,script,./test.sh -f tsim/parser/columnValue_uint.sim -,,y,script,./test.sh -f tsim/parser/columnValue_timestamp.sim -,,y,script,./test.sh -f tsim/parser/columnValue_varchar.sim -,,y,script,./test.sh -f tsim/parser/columnValue_nchar.sim -,,y,script,./test.sh -f tsim/parser/columnValue_varbinary.sim -,,y,script,./test.sh -f tsim/parser/columnValue_json.sim -,,y,script,./test.sh -f tsim/parser/columnValue_geometry.sim -,,y,script,./test.sh -f tsim/parser/condition.sim -,,y,script,./test.sh -f tsim/parser/condition_scl.sim -,,y,script,./test.sh -f tsim/parser/constCol.sim -,,y,script,./test.sh -f tsim/parser/create_db.sim -,,y,script,./test.sh -f tsim/parser/create_mt.sim -,,y,script,./test.sh -f tsim/parser/create_tb_with_tag_name.sim -,,y,script,./test.sh -f tsim/parser/create_tb.sim -,,y,script,./test.sh -f tsim/parser/dbtbnameValidate.sim -,,y,script,./test.sh -f tsim/parser/distinct.sim -,,y,script,./test.sh -f tsim/parser/fill_us.sim -,,y,script,./test.sh -f tsim/parser/fill.sim -,,y,script,./test.sh -f tsim/parser/first_last.sim -,,y,script,./test.sh -f tsim/parser/fill_stb.sim -,,y,script,./test.sh -f tsim/parser/interp.sim -,,y,script,./test.sh -f tsim/parser/fourArithmetic-basic.sim -,,y,script,./test.sh -f tsim/parser/function.sim -,,y,script,./test.sh -f tsim/parser/groupby-basic.sim -,,y,script,./test.sh -f tsim/parser/having_child.sim -,,y,script,./test.sh -f tsim/parser/having.sim -,,y,script,./test.sh -f tsim/parser/import_commit1.sim -,,y,script,./test.sh -f tsim/parser/import_commit2.sim -,,y,script,./test.sh -f tsim/parser/import_commit3.sim -,,y,script,./test.sh -f tsim/parser/import_file.sim -,,y,script,./test.sh -f tsim/parser/import.sim -,,y,script,./test.sh -f tsim/parser/insert_multiTbl.sim -,,y,script,./test.sh -f tsim/parser/insert_tb.sim -,,y,script,./test.sh -f tsim/parser/join_multitables.sim -,,y,script,./test.sh -f tsim/parser/join_multivnode.sim -,,y,script,./test.sh -f tsim/parser/join.sim -,,y,script,./test.sh -f tsim/parser/last_cache.sim -,,y,script,./test.sh -f tsim/parser/last_both.sim -,,y,script,./test.sh -f tsim/parser/last_groupby.sim -,,y,script,./test.sh -f tsim/parser/lastrow.sim -,,y,script,./test.sh -f tsim/parser/lastrow2.sim -,,y,script,./test.sh -f tsim/parser/like.sim -,,y,script,./test.sh -f tsim/parser/limit.sim -,,y,script,./test.sh -f tsim/parser/mixed_blocks.sim -,,y,script,./test.sh -f tsim/parser/nchar.sim -,,y,script,./test.sh -f tsim/parser/null_char.sim -,,y,script,./test.sh -f tsim/parser/precision_ns.sim -,,y,script,./test.sh -f tsim/parser/projection_limit_offset.sim -,,y,script,./test.sh -f tsim/parser/regex.sim -,,y,script,./test.sh -f tsim/parser/regressiontest.sim -,,y,script,./test.sh -f tsim/parser/select_across_vnodes.sim -,,y,script,./test.sh -f tsim/parser/select_distinct_tag.sim -,,y,script,./test.sh -f tsim/parser/select_from_cache_disk.sim -,,y,script,./test.sh -f tsim/parser/select_with_tags.sim -,,y,script,./test.sh -f tsim/parser/selectResNum.sim -,,y,script,./test.sh -f tsim/parser/set_tag_vals.sim -,,y,script,./test.sh -f tsim/parser/single_row_in_tb.sim -,,y,script,./test.sh -f tsim/parser/slimit_alter_tags.sim -,,y,script,./test.sh -f tsim/parser/slimit.sim -,,y,script,./test.sh -f tsim/parser/slimit1.sim -,,y,script,./test.sh -f tsim/parser/stableOp.sim -,,y,script,./test.sh -f tsim/parser/tags_dynamically_specifiy.sim -,,y,script,./test.sh -f tsim/parser/tags_filter.sim -,,y,script,./test.sh -f tsim/parser/tbnameIn.sim -,,y,script,./test.sh -f tsim/parser/timestamp.sim -,,y,script,./test.sh -f tsim/parser/top_groupby.sim -,,y,script,./test.sh -f tsim/parser/topbot.sim -,,y,script,./test.sh -f tsim/parser/union_sysinfo.sim -,,y,script,./test.sh -f tsim/parser/slimit_limit.sim -,,y,script,./test.sh -f tsim/parser/table_merge_limit.sim -,,y,script,./test.sh -f tsim/query/tagLikeFilter.sim -,,y,script,./test.sh -f tsim/query/charScalarFunction.sim -,,y,script,./test.sh -f tsim/query/explain.sim -,,y,script,./test.sh -f tsim/query/interval-offset.sim -,,y,script,./test.sh -f tsim/query/interval.sim -,,y,script,./test.sh -f tsim/query/scalarFunction.sim -,,y,script,./test.sh -f tsim/query/scalarNull.sim -,,y,script,./test.sh -f tsim/query/session.sim -,,y,script,./test.sh -f tsim/query/udf.sim -,,n,script,./test.sh -f tsim/query/udfpy.sim -,,y,script,./test.sh -f tsim/query/udf_with_const.sim -,,y,script,./test.sh -f tsim/query/join_interval.sim -,,y,script,./test.sh -f tsim/query/join_pk.sim -,,y,script,./test.sh -f tsim/query/join_order.sim -,,y,script,./test.sh -f tsim/query/count_spread.sim -,,y,script,./test.sh -f tsim/query/unionall_as_table.sim -,,y,script,./test.sh -f tsim/query/multi_order_by.sim -,,y,script,./test.sh -f tsim/query/sys_tbname.sim -,,y,script,./test.sh -f tsim/query/sort-pre-cols.sim -,,y,script,./test.sh -f tsim/query/groupby.sim -,,y,script,./test.sh -f tsim/query/groupby_distinct.sim -,,y,script,./test.sh -f tsim/query/event.sim -,,y,script,./test.sh -f tsim/query/forceFill.sim -,,y,script,./test.sh -f tsim/query/emptyTsRange.sim -,,y,script,./test.sh -f tsim/query/emptyTsRange_scl.sim -,,y,script,./test.sh -f tsim/query/partitionby.sim -,,y,script,./test.sh -f tsim/query/tableCount.sim -,,y,script,./test.sh -f tsim/query/show_db_table_kind.sim -,,y,script,./test.sh -f tsim/query/bi_star_table.sim -,,y,script,./test.sh -f tsim/query/bi_tag_scan.sim -,,y,script,./test.sh -f tsim/query/bi_tbname_col.sim -,,y,script,./test.sh -f tsim/query/tag_scan.sim -,,y,script,./test.sh -f tsim/query/nullColSma.sim -,,y,script,./test.sh -f tsim/query/bug3398.sim -,,y,script,./test.sh -f tsim/query/explain_tsorder.sim -,,y,script,./test.sh -f tsim/query/apercentile.sim -,,y,script,./test.sh -f tsim/query/query_count0.sim -,,y,script,./test.sh -f tsim/query/query_count_sliding0.sim -,,y,script,./test.sh -f tsim/query/union_precision.sim -,,y,script,./test.sh -f tsim/qnode/basic1.sim -,,y,script,./test.sh -f tsim/snode/basic1.sim -,,y,script,./test.sh -f tsim/mnode/basic1.sim -,,y,script,./test.sh -f tsim/mnode/basic2.sim -#,,y,script,./test.sh -f tsim/mnode/basic3.sim -,,y,script,./test.sh -f tsim/mnode/basic4.sim -,,y,script,./test.sh -f tsim/mnode/basic5.sim -,,y,script,./test.sh -f tsim/show/basic.sim -,,y,script,./test.sh -f tsim/table/autocreate.sim -,,y,script,./test.sh -f tsim/table/basic1.sim -,,y,script,./test.sh -f tsim/table/basic2.sim -,,y,script,./test.sh -f tsim/table/basic3.sim -,,y,script,./test.sh -f tsim/table/bigint.sim -,,y,script,./test.sh -f tsim/table/binary.sim -,,y,script,./test.sh -f tsim/table/bool.sim -,,y,script,./test.sh -f tsim/table/column_name.sim -,,y,script,./test.sh -f tsim/table/column_num.sim -,,y,script,./test.sh -f tsim/table/column_value.sim -,,y,script,./test.sh -f tsim/table/column2.sim -,,y,script,./test.sh -f tsim/table/createmulti.sim -,,y,script,./test.sh -f tsim/table/date.sim -,,y,script,./test.sh -f tsim/table/db.table.sim -,,y,script,./test.sh -f tsim/table/delete_reuse1.sim -,,y,script,./test.sh -f tsim/table/delete_reuse2.sim -,,y,script,./test.sh -f tsim/table/delete_writing.sim -,,y,script,./test.sh -f tsim/table/describe.sim -,,y,script,./test.sh -f tsim/table/double.sim -,,y,script,./test.sh -f tsim/table/float.sim -,,y,script,./test.sh -f tsim/table/hash.sim -,,y,script,./test.sh -f tsim/table/int.sim -,,y,script,./test.sh -f tsim/table/limit.sim -,,y,script,./test.sh -f tsim/table/smallint.sim -,,y,script,./test.sh -f tsim/table/table_len.sim -,,y,script,./test.sh -f tsim/table/table.sim -,,y,script,./test.sh -f tsim/table/tinyint.sim -,,y,script,./test.sh -f tsim/table/vgroup.sim -,,n,script,./test.sh -f tsim/stream/basic0.sim -g -,,y,script,./test.sh -f tsim/stream/basic1.sim -,,y,script,./test.sh -f tsim/stream/basic2.sim -,,y,script,./test.sh -f tsim/stream/basic3.sim -,,y,script,./test.sh -f tsim/stream/basic4.sim -,,y,script,./test.sh -f tsim/stream/checkpointInterval0.sim -,,y,script,./test.sh -f tsim/stream/checkStreamSTable1.sim -,,y,script,./test.sh -f tsim/stream/checkStreamSTable.sim -,,y,script,./test.sh -f tsim/stream/count0.sim -,,y,script,./test.sh -f tsim/stream/count1.sim -,,y,script,./test.sh -f tsim/stream/count2.sim -,,y,script,./test.sh -f tsim/stream/count3.sim -,,y,script,./test.sh -f tsim/stream/countSliding0.sim -,,y,script,./test.sh -f tsim/stream/countSliding1.sim -,,y,script,./test.sh -f tsim/stream/countSliding2.sim -,,y,script,./test.sh -f tsim/stream/deleteInterval.sim -,,y,script,./test.sh -f tsim/stream/deleteScalar.sim -,,y,script,./test.sh -f tsim/stream/deleteSession.sim -,,y,script,./test.sh -f tsim/stream/deleteState.sim -,,y,script,./test.sh -f tsim/stream/distributeInterval0.sim -,,y,script,./test.sh -f tsim/stream/distributeIntervalRetrive0.sim -,,y,script,./test.sh -f tsim/stream/distributeMultiLevelInterval0.sim -,,y,script,./test.sh -f tsim/stream/distributeSession0.sim -,,y,script,./test.sh -f tsim/stream/drop_stream.sim -,,y,script,./test.sh -f tsim/stream/event0.sim -,,y,script,./test.sh -f tsim/stream/event1.sim -,,y,script,./test.sh -f tsim/stream/event2.sim -,,y,script,./test.sh -f tsim/stream/fillHistoryBasic1.sim -,,y,script,./test.sh -f tsim/stream/fillHistoryBasic2.sim -,,y,script,./test.sh -f tsim/stream/fillHistoryBasic3.sim -,,y,script,./test.sh -f tsim/stream/fillIntervalDelete0.sim -,,y,script,./test.sh -f tsim/stream/fillIntervalDelete1.sim -,,y,script,./test.sh -f tsim/stream/fillIntervalLinear.sim -,,y,script,./test.sh -f tsim/stream/fillIntervalPartitionBy.sim -,,y,script,./test.sh -f tsim/stream/fillIntervalPrevNext1.sim -,,y,script,./test.sh -f tsim/stream/fillIntervalPrevNext.sim -,,y,script,./test.sh -f tsim/stream/fillIntervalRange.sim -,,y,script,./test.sh -f tsim/stream/fillIntervalValue.sim -,,y,script,./test.sh -f tsim/stream/ignoreCheckUpdate.sim -,,y,script,./test.sh -f tsim/stream/ignoreExpiredData.sim -,,y,script,./test.sh -f tsim/stream/partitionby1.sim -,,y,script,./test.sh -f tsim/stream/partitionbyColumnInterval.sim -,,y,script,./test.sh -f tsim/stream/partitionbyColumnOther.sim -,,y,script,./test.sh -f tsim/stream/partitionbyColumnSession.sim -,,y,script,./test.sh -f tsim/stream/partitionbyColumnState.sim -,,y,script,./test.sh -f tsim/stream/partitionby.sim -,,y,script,./test.sh -f tsim/stream/pauseAndResume.sim -,,y,script,./test.sh -f tsim/stream/schedSnode.sim -,,y,script,./test.sh -f tsim/stream/session0.sim -,,y,script,./test.sh -f tsim/stream/session1.sim -,,y,script,./test.sh -f tsim/stream/sliding.sim -,,y,script,./test.sh -f tsim/stream/state0.sim -,,y,script,./test.sh -f tsim/stream/state1.sim -,,y,script,./test.sh -f tsim/stream/streamPrimaryKey0.sim -,,y,script,./test.sh -f tsim/stream/streamPrimaryKey1.sim -,,y,script,./test.sh -f tsim/stream/streamPrimaryKey2.sim -,,y,script,./test.sh -f tsim/stream/streamPrimaryKey3.sim -,,y,script,./test.sh -f tsim/stream/triggerInterval0.sim -,,y,script,./test.sh -f tsim/stream/triggerSession0.sim -,,y,script,./test.sh -f tsim/stream/udTableAndCol0.sim -,,y,script,./test.sh -f tsim/stream/udTableAndTag0.sim -,,y,script,./test.sh -f tsim/stream/udTableAndTag1.sim -,,y,script,./test.sh -f tsim/stream/udTableAndTag2.sim -,,y,script,./test.sh -f tsim/stream/windowClose.sim -,,y,script,./test.sh -f tsim/trans/lossdata1.sim -,,y,script,./test.sh -f tsim/tmq/basic1.sim -,,y,script,./test.sh -f tsim/tmq/basic2.sim -,,y,script,./test.sh -f tsim/tmq/basic3.sim -,,y,script,./test.sh -f tsim/tmq/basic4.sim -,,y,script,./test.sh -f tsim/tmq/basic1Of2Cons.sim -,,y,script,./test.sh -f tsim/tmq/basic2Of2Cons.sim -,,y,script,./test.sh -f tsim/tmq/basic3Of2Cons.sim -,,y,script,./test.sh -f tsim/tmq/basic4Of2Cons.sim -,,y,script,./test.sh -f tsim/tmq/topic.sim -,,y,script,./test.sh -f tsim/tmq/snapshot.sim -,,y,script,./test.sh -f tsim/tmq/snapshot1.sim -,,y,script,./test.sh -f tsim/stable/alter_comment.sim -,,y,script,./test.sh -f tsim/stable/alter_count.sim -,,y,script,./test.sh -f tsim/stable/alter_import.sim -,,y,script,./test.sh -f tsim/stable/alter_insert1.sim -,,y,script,./test.sh -f tsim/stable/alter_insert2.sim -,,y,script,./test.sh -f tsim/stable/alter_metrics.sim -,,y,script,./test.sh -f tsim/stable/column_add.sim -,,y,script,./test.sh -f tsim/stable/column_drop.sim -,,y,script,./test.sh -f tsim/stable/column_modify.sim -,,y,script,./test.sh -f tsim/stable/disk.sim -,,y,script,./test.sh -f tsim/stable/dnode3.sim -,,y,script,./test.sh -f tsim/stable/metrics.sim -,,y,script,./test.sh -f tsim/stable/refcount.sim -,,y,script,./test.sh -f tsim/stable/tag_add.sim -,,y,script,./test.sh -f tsim/stable/tag_drop.sim -,,y,script,./test.sh -f tsim/stable/tag_filter.sim -,,y,script,./test.sh -f tsim/stable/tag_modify.sim -,,y,script,./test.sh -f tsim/stable/tag_rename.sim -,,y,script,./test.sh -f tsim/stable/values.sim -,,y,script,./test.sh -f tsim/stable/vnode3.sim -,,n,script,./test.sh -f tsim/sma/drop_sma.sim -,,y,script,./test.sh -f tsim/sma/sma_leak.sim -,,y,script,./test.sh -f tsim/sma/tsmaCreateInsertQuery.sim -,,y,script,./test.sh -f tsim/sma/rsmaCreateInsertQuery.sim -,,y,script,./test.sh -f tsim/sma/rsmaCreateInsertQueryDelete.sim - -### refactor stream backend, open case after rsma refactored -#,,y,script,./test.sh -f tsim/sma/rsmaPersistenceRecovery.sim -,,y,script,./test.sh -f tsim/sync/vnodesnapshot-rsma-test.sim -,,n,script,./test.sh -f tsim/valgrind/checkError1.sim -,,n,script,./test.sh -f tsim/valgrind/checkError2.sim -,,n,script,./test.sh -f tsim/valgrind/checkError3.sim -,,n,script,./test.sh -f tsim/valgrind/checkError4.sim -,,n,script,./test.sh -f tsim/valgrind/checkError5.sim -,,n,script,./test.sh -f tsim/valgrind/checkError8.sim -,,n,script,./test.sh -f tsim/valgrind/checkUdf.sim -,,y,script,./test.sh -f tsim/vnode/replica3_basic.sim -,,y,script,./test.sh -f tsim/vnode/replica3_vgroup.sim -,,y,script,./test.sh -f tsim/vnode/replica3_import.sim -,,y,script,./test.sh -f tsim/vnode/stable_balance_replica1.sim -,,y,script,./test.sh -f tsim/vnode/stable_dnode2_stop.sim -,,y,script,./test.sh -f tsim/vnode/stable_dnode2.sim -,,y,script,./test.sh -f tsim/vnode/stable_dnode3.sim -,,y,script,./test.sh -f tsim/vnode/stable_replica3_dnode6.sim -,,y,script,./test.sh -f tsim/vnode/stable_replica3_vnode3.sim -,,y,script,./test.sh -f tsim/sync/oneReplica1VgElect.sim -,,y,script,./test.sh -f tsim/sync/oneReplica5VgElect.sim -,,y,script,./test.sh -f tsim/catalog/alterInCurrent.sim -,,y,script,./test.sh -f tsim/scalar/in.sim -,,y,script,./test.sh -f tsim/scalar/scalar.sim -,,y,script,./test.sh -f tsim/scalar/filter.sim -,,y,script,./test.sh -f tsim/scalar/caseWhen.sim -,,y,script,./test.sh -f tsim/scalar/tsConvert.sim -,,y,script,./test.sh -f tsim/alter/cached_schema_after_alter.sim -,,y,script,./test.sh -f tsim/alter/dnode.sim -,,y,script,./test.sh -f tsim/alter/table.sim -,,y,script,./test.sh -f tsim/cache/new_metrics.sim -,,y,script,./test.sh -f tsim/cache/restart_table.sim -,,y,script,./test.sh -f tsim/cache/restart_metrics.sim -,,y,script,./test.sh -f tsim/column/commit.sim -,,y,script,./test.sh -f tsim/column/metrics.sim -,,y,script,./test.sh -f tsim/column/table.sim -,,y,script,./test.sh -f tsim/compress/commitlog.sim -,,y,script,./test.sh -f tsim/compress/compress2.sim -,,y,script,./test.sh -f tsim/compress/compress.sim -,,y,script,./test.sh -f tsim/compress/compress_col.sim -,,y,script,./test.sh -f tsim/compress/uncompress.sim -,,y,script,./test.sh -f tsim/compute/avg.sim -,,y,script,./test.sh -f tsim/compute/block_dist.sim -,,y,script,./test.sh -f tsim/compute/bottom.sim -,,y,script,./test.sh -f tsim/compute/count.sim -,,y,script,./test.sh -f tsim/compute/diff.sim -,,y,script,./test.sh -f tsim/compute/diff2.sim -,,y,script,./test.sh -f tsim/compute/first.sim -,,y,script,./test.sh -f tsim/compute/interval.sim -,,y,script,./test.sh -f tsim/compute/interval1.sim -,,y,script,./test.sh -f tsim/compute/last_row.sim -,,y,script,./test.sh -f tsim/compute/last.sim -,,y,script,./test.sh -f tsim/compute/leastsquare.sim -,,y,script,./test.sh -f tsim/compute/max.sim -,,y,script,./test.sh -f tsim/compute/min.sim -,,y,script,./test.sh -f tsim/compute/null.sim -,,y,script,./test.sh -f tsim/compute/percentile.sim -,,y,script,./test.sh -f tsim/compute/stddev.sim -,,y,script,./test.sh -f tsim/compute/sum.sim -,,y,script,./test.sh -f tsim/compute/top.sim -,,y,script,./test.sh -f tsim/field/2.sim -,,y,script,./test.sh -f tsim/field/3.sim -,,y,script,./test.sh -f tsim/field/4.sim -,,y,script,./test.sh -f tsim/field/5.sim -,,y,script,./test.sh -f tsim/field/6.sim -,,y,script,./test.sh -f tsim/field/binary.sim -,,y,script,./test.sh -f tsim/field/bigint.sim -,,y,script,./test.sh -f tsim/field/bool.sim -,,y,script,./test.sh -f tsim/field/double.sim -,,y,script,./test.sh -f tsim/field/float.sim -,,y,script,./test.sh -f tsim/field/int.sim -,,y,script,./test.sh -f tsim/field/single.sim -,,y,script,./test.sh -f tsim/field/smallint.sim -,,y,script,./test.sh -f tsim/field/tinyint.sim -,,y,script,./test.sh -f tsim/field/unsigined_bigint.sim -,,y,script,./test.sh -f tsim/vector/metrics_field.sim -,,y,script,./test.sh -f tsim/vector/metrics_mix.sim -,,y,script,./test.sh -f tsim/vector/metrics_query.sim -,,y,script,./test.sh -f tsim/vector/metrics_tag.sim -,,y,script,./test.sh -f tsim/vector/metrics_time.sim -,,y,script,./test.sh -f tsim/vector/multi.sim -,,y,script,./test.sh -f tsim/vector/single.sim -,,y,script,./test.sh -f tsim/vector/table_field.sim -,,y,script,./test.sh -f tsim/vector/table_mix.sim -,,y,script,./test.sh -f tsim/vector/table_query.sim -,,y,script,./test.sh -f tsim/vector/table_time.sim -,,y,script,./test.sh -f tsim/wal/kill.sim -,,y,script,./test.sh -f tsim/tag/3.sim -,,y,script,./test.sh -f tsim/tag/4.sim -,,y,script,./test.sh -f tsim/tag/5.sim -,,y,script,./test.sh -f tsim/tag/6.sim -,,y,script,./test.sh -f tsim/tag/add.sim -,,y,script,./test.sh -f tsim/tag/bigint.sim -,,y,script,./test.sh -f tsim/tag/binary_binary.sim -,,y,script,./test.sh -f tsim/tag/binary.sim -,,y,script,./test.sh -f tsim/tag/bool_binary.sim -,,y,script,./test.sh -f tsim/tag/bool_int.sim -,,y,script,./test.sh -f tsim/tag/bool.sim -,,y,script,./test.sh -f tsim/tag/change.sim -,,y,script,./test.sh -f tsim/tag/column.sim -,,y,script,./test.sh -f tsim/tag/commit.sim -,,y,script,./test.sh -f tsim/tag/create.sim -,,y,script,./test.sh -f tsim/tag/delete.sim -,,y,script,./test.sh -f tsim/tag/double.sim -,,y,script,./test.sh -f tsim/tag/filter.sim -,,y,script,./test.sh -f tsim/tag/float.sim -,,y,script,./test.sh -f tsim/tag/int_binary.sim -,,y,script,./test.sh -f tsim/tag/int_float.sim -,,y,script,./test.sh -f tsim/tag/int.sim -,,y,script,./test.sh -f tsim/tag/set.sim -,,y,script,./test.sh -f tsim/tag/smallint.sim -,,y,script,./test.sh -f tsim/tag/tinyint.sim -,,y,script,./test.sh -f tsim/tag/drop_tag.sim -,,y,script,./test.sh -f tsim/tag/tbNameIn.sim -,,y,script,./test.sh -f tmp/monitor.sim -,,y,script,./test.sh -f tsim/tagindex/add_index.sim -,,n,script,./test.sh -f tsim/tagindex/sma_and_tag_index.sim -,,y,script,./test.sh -f tsim/tagindex/indexOverflow.sim -,,y,script,./test.sh -f tsim/view/view.sim -,,y,script,./test.sh -f tsim/query/cache_last.sim -,,y,script,./test.sh -f tsim/query/const.sim -,,y,script,./test.sh -f tsim/query/nestedJoinView.sim - - - -#develop test -,,n,develop-test,python3 ./test.py -f 2-query/table_count_scan.py -,,n,develop-test,python3 ./test.py -f 2-query/pseudo_column.py -,,n,develop-test,python3 ./test.py -f 2-query/ts-range.py -,,n,develop-test,python3 ./test.py -f 2-query/tag_scan.py -,,n,develop-test,python3 ./test.py -f 2-query/show_create_db.py -,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/auto_create_table_json.py -,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/custom_col_tag.py -,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/default_json.py -,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/demo.py -,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/insert_alltypes_json.py -,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/invalid_commandline.py -,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/json_tag.py -,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/query_json.py -,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/sample_csv_json.py -,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/sml_json_alltypes.py -,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/taosdemoTestQueryWithJson.py -R -,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/telnet_tcp.py -R - #docs-examples test ,,n,docs-examples-test,bash python.sh #,,n,docs-examples-test,bash node.sh ,,n,docs-examples-test,bash csharp.sh ,,n,docs-examples-test,bash jdbc.sh ,,n,docs-examples-test,bash go.sh +,,n,docs-examples-test,bash rust.sh ,,n,docs-examples-test,bash test_R.sh From 4e7a0ba91f97c8f8c90db6181041d1cf234ad40e Mon Sep 17 00:00:00 2001 From: sheyanjie-qq <249478495@qq.com> Date: Tue, 24 Sep 2024 20:28:10 +0800 Subject: [PATCH 22/62] update develp doc --- docs/examples/rust/nativeexample/examples/connect.rs | 2 +- docs/zh/07-develop/index.md | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/examples/rust/nativeexample/examples/connect.rs b/docs/examples/rust/nativeexample/examples/connect.rs index f316a70631..ad2533d4c3 100644 --- a/docs/examples/rust/nativeexample/examples/connect.rs +++ b/docs/examples/rust/nativeexample/examples/connect.rs @@ -2,7 +2,7 @@ use taos::*; #[tokio::main] async fn main() -> anyhow::Result<()> { - let dsn = "taos://localhost:6031".to_string(); + let dsn = "taos://localhost:6030".to_string(); match TaosBuilder::from_dsn(&dsn)?.build().await { Ok(_taos) => { diff --git a/docs/zh/07-develop/index.md b/docs/zh/07-develop/index.md index 9d4adce01c..4759027344 100644 --- a/docs/zh/07-develop/index.md +++ b/docs/zh/07-develop/index.md @@ -14,7 +14,8 @@ description: 让开发者能够快速上手的指南 7. 在很多场景下(如车辆管理),应用需要获取每个数据采集点的最新状态,那么建议你采用 TDengine 的 Cache 功能,而不用单独部署 Redis 等缓存软件。 8. 如果你发现 TDengine 的函数无法满足你的要求,那么你可以使用用户自定义函数(UDF)来解决问题。 -本部分内容就是按照上述顺序组织的。为便于理解,TDengine 为每个功能和每个支持的编程语言都提供了示例代码。如果你希望深入了解 SQL 的使用,需要查看[SQL 手册](../reference/taos-sql/)。如果想更深入地了解各连接器的使用,请阅读[连接器参考指南](../reference/connector/)。如果还希望想将 TDengine 与第三方系统集成起来,比如 Grafana, 请参考[第三方工具](../third-party/)。 +本部分内容就是按照上述顺序组织的。为便于理解,TDengine 为每个功能和每个支持的编程语言都提供了示例代码,位于 [示例代码](https://github.com/taosdata/TDengine/tree/main/docs/examples)。所有示例代码都会有 CI 保证正确性,脚本位于 [示例代码 CI](https://github.com/taosdata/TDengine/tree/main/tests/docs-examples-test)。 +如果你希望深入了解 SQL 的使用,需要查看[SQL 手册](../reference/taos-sql/)。如果想更深入地了解各连接器的使用,请阅读[连接器参考指南](../reference/connector/)。如果还希望想将 TDengine 与第三方系统集成起来,比如 Grafana, 请参考[第三方工具](../third-party/)。 如果在开发过程中遇到任何问题,请点击每个页面下方的["反馈问题"](https://github.com/taosdata/TDengine/issues/new/choose), 在 GitHub 上直接递交 Issue。 From d43ce06dc2d69d17528f14895adc1521499f22b1 Mon Sep 17 00:00:00 2001 From: sheyanjie-qq <249478495@qq.com> Date: Tue, 24 Sep 2024 20:31:09 +0800 Subject: [PATCH 23/62] add rust ci --- tests/parallel_test/cases.task | 1552 +++++++++++++++++++++++++++++++- 1 file changed, 1551 insertions(+), 1 deletion(-) diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index 30c79fea02..602ac9ad66 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -2,11 +2,1561 @@ #caseID,rerunTimes,Run with Sanitizer,casePath,caseCommand #NA,NA,y or n,script,./test.sh -f tsim/user/basic.sim +#unit-test + +,,n,unit-test,bash test.sh + + +# +# army-test +# +,,y,army,./pytest.sh python3 ./test.py -f multi-level/mlevel_basic.py -N 3 -L 3 -D 2 +,,y,army,./pytest.sh python3 ./test.py -f db-encrypt/basic.py +,,n,army,python3 ./test.py -f storage/s3/s3Basic.py -N 3 +,,y,army,./pytest.sh python3 ./test.py -f cluster/snapshot.py -N 3 -L 3 -D 2 +,,y,army,./pytest.sh python3 ./test.py -f query/function/test_func_elapsed.py +,,y,army,./pytest.sh python3 ./test.py -f query/function/test_function.py +,,y,army,./pytest.sh python3 ./test.py -f query/function/concat.py +,,y,army,./pytest.sh python3 ./test.py -f query/function/cast.py +,,y,army,./pytest.sh python3 ./test.py -f query/test_join.py +,,y,army,./pytest.sh python3 ./test.py -f query/test_compare.py +,,y,army,./pytest.sh python3 ./test.py -f insert/test_column_tag_boundary.py +,,y,army,./pytest.sh python3 ./test.py -f query/fill/fill_desc.py -N 3 -L 3 -D 2 +,,y,army,./pytest.sh python3 ./test.py -f query/fill/fill_null.py +,,y,army,./pytest.sh python3 ./test.py -f cluster/incSnapshot.py -N 3 +,,y,army,./pytest.sh python3 ./test.py -f cluster/clusterBasic.py -N 5 +,,y,army,./pytest.sh python3 ./test.py -f query/query_basic.py -N 3 +,,y,army,./pytest.sh python3 ./test.py -f query/accuracy/test_query_accuracy.py +,,y,army,./pytest.sh python3 ./test.py -f query/accuracy/test_ts5400.py +,,y,army,./pytest.sh python3 ./test.py -f query/accuracy/test_having.py +,,y,army,./pytest.sh python3 ./test.py -f insert/insert_basic.py -N 3 +,,y,army,./pytest.sh python3 ./test.py -f cluster/splitVgroupByLearner.py -N 3 +,,y,army,./pytest.sh python3 ./test.py -f authorith/authBasic.py -N 3 +,,n,army,python3 ./test.py -f cmdline/fullopt.py +,,y,army,./pytest.sh python3 ./test.py -f query/show.py -N 3 +,,y,army,./pytest.sh python3 ./test.py -f alter/alterConfig.py -N 3 +,,y,army,./pytest.sh python3 ./test.py -f query/subquery/subqueryBugs.py -N 3 +,,y,army,./pytest.sh python3 ./test.py -f storage/oneStageComp.py -N 3 -L 3 -D 1 +,,y,army,./pytest.sh python3 ./test.py -f storage/compressBasic.py -N 3 +,,y,army,./pytest.sh python3 ./test.py -f grant/grantBugs.py -N 3 +,,y,army,./pytest.sh python3 ./test.py -f query/queryBugs.py -N 3 +,,y,army,./pytest.sh python3 ./test.py -f tmq/tmqBugs.py -N 3 +,,y,army,./pytest.sh python3 ./test.py -f query/fill/fill_compare_asc_desc.py +,,y,army,./pytest.sh python3 ./test.py -f query/last/test_last.py +,,y,army,./pytest.sh python3 ./test.py -f query/window/base.py +,,y,army,./pytest.sh python3 ./test.py -f query/sys/tb_perf_queries_exist_test.py -N 3 + +# +# system test +# +,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/stream_multi_agg.py +,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/stream_basic.py +,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/scalar_function.py +,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/at_once_interval.py +,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/at_once_session.py +,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/at_once_state_window.py +,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/window_close_interval.py +,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/window_close_session.py +,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/window_close_state_window.py +,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/max_delay_interval.py +,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/max_delay_session.py +,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/at_once_interval_ext.py +,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/max_delay_interval_ext.py +,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/window_close_session_ext.py +,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/partition_interval.py +,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/pause_resume_test.py +,,y,system-test,./pytest.sh python3 ./test.py -f 8-stream/state_window_case.py +#,,n,system-test,python3 ./test.py -f 8-stream/vnode_restart.py -N 4 +#,,n,system-test,python3 ./test.py -f 8-stream/snode_restart.py -N 4 +,,n,system-test,python3 ./test.py -f 8-stream/snode_restart_with_checkpoint.py -N 4 + +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/pk_error.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/pk_func.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/pk_varchar.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/pk_func_group.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_expr.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/project_group.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tbname_vgroup.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count_interval.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/compact-col.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tms_memleak.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stbJoin.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stbJoin.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stbJoin.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stbJoin.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/hint.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/hint.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/hint.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/hint.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/para_tms.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/para_tms2.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_str.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_math.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_time.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_26.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_str.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_math.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_time.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_26.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/columnLenUpdated.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/columnLenUpdated.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/columnLenUpdated.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/columnLenUpdated.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_str.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_math.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_time.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_26.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interval_limit_opt.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interval_unit.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interval_unit.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interval_unit.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interval_unit.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_by_col.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_by_col.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_by_col.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_by_col.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_by_col_agg.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_by_col_agg.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_by_col_agg.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_by_col_agg.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interval_limit_opt_2.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interval_limit_opt_2.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interval_limit_opt_2.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interval_limit_opt_2.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/func_to_char_timestamp.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/func_to_char_timestamp.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/func_to_char_timestamp.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/func_to_char_timestamp.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_cache_scan.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_cache_scan.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_cache_scan.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_cache_scan.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tbname.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tbname.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tbname.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tbname.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsma.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsma.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsma.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsma.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsma.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsma2.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsma2.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsma2.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsma2.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsma2.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery2.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqShow.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqDropStb.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeStb0.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeStb1.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeStb2.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeStb3.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeDb0.py -N 3 -n 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/ins_topics_test.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqMaxTopic.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqParamsTest.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqParamsTest.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqClientConsLog.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqMaxGroupIds.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsumeDiscontinuousData.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqOffset.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq_primary_key.py +,,n,system-test,python3 ./test.py -f 7-tmq/tmqDropConsumer.py + + +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/insert_stb.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/delete_stable.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/stt_blocks_check.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/out_of_order.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/out_of_order.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/agg_null.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/insert_null_none.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/insert_null_none.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/insert_null_none.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/insert_null_none.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/insert_null_none.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/database_pre_suf.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/out_of_order.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/out_of_order.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_str.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_math.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_time.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_26.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/select_null.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/select_null.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/select_null.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/select_null.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/select_null.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ts-4233.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ts-4233.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ts-4233.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ts-4233.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/like.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/like.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/like.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/like.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/match.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/match.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/match.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/match.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/td-28068.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/td-28068.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/td-28068.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/td-28068.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/agg_group_AlwaysReturnValue.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/agg_group_AlwaysReturnValue.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/agg_group_AlwaysReturnValue.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/agg_group_AlwaysReturnValue.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/agg_group_NotReturnValue.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/agg_group_NotReturnValue.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/agg_group_NotReturnValue.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/agg_group_NotReturnValue.py -Q 4 + +,,y,system-test,./pytest.sh python3 ./test.py -f 3-enterprise/restore/restoreDnode.py -N 5 -M 3 -i False +,,y,system-test,./pytest.sh python3 ./test.py -f 3-enterprise/restore/restoreVnode.py -N 5 -M 3 -i False +,,y,system-test,./pytest.sh python3 ./test.py -f 3-enterprise/restore/restoreMnode.py -N 5 -M 3 -i False +,,y,system-test,./pytest.sh python3 ./test.py -f 3-enterprise/restore/restoreQnode.py -N 5 -M 3 -i False + +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/create_wrong_topic.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/dropDbR3ConflictTransaction.py -N 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/basic5.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeDb.py -N 3 -n 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/ts-4674.py -N 3 -n 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeDb1.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeDb2.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeDb3.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeDb4.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeStb.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeStb4.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/db.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqError.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/schema.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/stbFilterWhere.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/stbFilter.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqCheckData.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqCheckData1.py +#,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsumerGroup.py +,,n,system-test,python3 ./test.py -f 7-tmq/tmqConsumerGroup.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqAlterSchema.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb.py -N 3 -n 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb1.py -N 3 -n 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb-mutilVg.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb1-mutilVg.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb-1ctb.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb1-1ctb.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb-1ctb-funcNFilter.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb-mutilVg-mutilCtb-funcNFilter.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb-mutilVg-mutilCtb.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb1-1ctb-funcNFilter.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb1-mutilVg-mutilCtb-funcNFilter.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb1-mutilVg-mutilCtb.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqAutoCreateTbl.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqDnodeRestart.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqDnodeRestart1.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqUpdate-1ctb.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqUpdateWithConsume.py -N 3 -n 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqUpdate-multiCtb-snapshot0.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqUpdate-multiCtb-snapshot1.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqDelete-1ctb.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqDelete-multiCtb.py -N 3 -n 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqDropStbCtb.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqDropNtb-snapshot0.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqDropNtb-snapshot1.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqUdf.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqUdf-multCtb-snapshot0.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqUdf-multCtb-snapshot1.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/stbTagFilter-1ctb.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/dataFromTsdbNWal.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/dataFromTsdbNWal-multiCtb.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq_taosx.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq_ts-5473.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq_ts4563.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq_replay.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqSeekAndCommit.py +,,n,system-test,python3 ./test.py -f 7-tmq/tmq_offset.py +,,n,system-test,python3 ./test.py -f 7-tmq/tmqDataPrecisionUnit.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/raw_block_interface_test.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/stbTagFilter-multiCtb.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqSubscribeStb-r3.py -N 5 +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq3mnodeSwitch.py -N 6 -M 3 -i True +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq3mnodeSwitch.py -N 6 -M 3 -n 3 -i True +,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeTransform-db-removewal.py -N 2 -n 1 +,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeTransform-stb-removewal.py -N 6 -n 3 +,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeTransform-stb.py -N 2 -n 1 +,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeTransform-stb.py -N 6 -n 3 +#,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeTransform-db.py -N 6 -n 3 +,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeSplit-stb-select.py -N 2 -n 1 +,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeSplit-stb-select-duplicatedata.py -N 3 -n 3 +,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeSplit-stb-select-duplicatedata-false.py -N 3 -n 3 +,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeSplit-stb-select.py -N 3 -n 3 +,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeSplit-stb-select-false.py -N 3 -n 3 +,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeSplit-stb.py -N 3 -n 3 +,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeSplit-stb-false.py -N 3 -n 3 +,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeSplit-column.py -N 3 -n 3 +,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeSplit-column-false.py -N 3 -n 3 +,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeSplit-db.py -N 3 -n 3 +,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeSplit-db-false.py -N 3 -n 3 + +,,y,system-test,./pytest.sh python3 test.py -f 7-tmq/tmqVnodeReplicate.py -M 3 -N 3 -n 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TD-19201.py +,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TD-21561.py +,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TS-3404.py +,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TS-3581.py +,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TS-3311.py +,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TS-3821.py +,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TS-5130.py + +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/balance_vgroups_r1.py -N 6 +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/taosShell.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/taosShellError.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/taosShellNetChk.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/telemetry.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/backquote_check.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/taosdMonitor.py +,,n,system-test,python3 ./test.py -f 0-others/taosdShell.py -N 5 -M 3 -Q 3 +,,n,system-test,python3 ./test.py -f 0-others/udfTest.py +,,n,system-test,python3 ./test.py -f 0-others/udf_create.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/udf_restart_taosd.py +,,n,system-test,python3 ./test.py -f 0-others/udf_cfg1.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/udf_cfg2.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/cachemodel.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/sysinfo.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/user_control.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/user_manage.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/user_privilege.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/user_privilege_show.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/user_privilege_all.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/fsync.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/multilevel.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/ttl.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/ttlChangeOnWrite.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/compress_tsz1.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/compress_tsz2.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/view/non_marterial_view/test_view.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/test_show_table_distributed.py +,,n,system-test,python3 ./test.py -f 0-others/compatibility.py +,,n,system-test,python3 ./test.py -f 0-others/tag_index_basic.py +,,n,system-test,python3 ./test.py -f 0-others/udfpy_main.py +,,n,system-test,python3 ./test.py -N 3 -f 0-others/walRetention.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/splitVGroup.py -N 3 -n 1 +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/splitVGroupWal.py -N 3 -n 1 +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/splitVGroup.py -N 3 -n 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/splitVGroupWal.py -N 3 -n 3 +,,n,system-test,python3 ./test.py -f 0-others/timeRangeWise.py -N 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/delete_check.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/test_hot_refresh_configurations.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/subscribe_stream_privilege.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/empty_identifier.py + +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/composite_primary_key_create.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/composite_primary_key_insert.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/composite_primary_key_delete.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/insert_double.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/alter_database.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/alter_replica.py -N 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/influxdb_line_taosc_insert.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/opentsdb_telnet_line_taosc_insert.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/opentsdb_json_taosc_insert.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/test_stmt_muti_insert_query.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/test_stmt_set_tbname_tag.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/alter_stable.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/alter_table.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/boundary.py +,,n,system-test,python3 ./test.py -f 1-insert/insertWithMoreVgroup.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/table_comment.py +#,,n,system-test,python3 ./test.py -f 1-insert/time_range_wise.py +#,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/block_wise.py +#,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/create_retentions.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/mutil_stage.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/table_param_ttl.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/table_param_ttl.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/update_data_muti_rows.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/db_tb_name_check.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/InsertFuturets.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/insert_wide_column.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/insert_column_value.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_benchmark.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_1.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_1.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_1.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_1.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_1.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_2.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_2.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_2.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_2.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_2.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_3.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_3.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_3.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_3.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_3.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_4.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_4.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_4.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_4.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_4.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/precisionUS.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/precisionNS.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/test_ts4219.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/ts-4272.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/test_ts4295.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/test_td27388.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/test_ts4479.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/test_td29793.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/insert_timestamp.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/test_td29157.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/show.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/show_tag_index.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/information_schema.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/abs.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/abs.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/and_or_for_byte.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/and_or_for_byte.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/apercentile.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/apercentile.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arccos.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arccos.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arcsin.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arcsin.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arctan.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arctan.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/avg.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/avg.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/between.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/between.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/bottom.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/bottom.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/cast.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/cast.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ceil.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ceil.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/char_length.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/char_length.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/check_tsdb.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/check_tsdb.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat_ws.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat_ws.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat_ws2.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat_ws2.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/cos.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/cos.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/group_partition.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/group_partition.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/group_partition.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/group_partition.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/group_partition.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count_partition.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count_partition.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/countAlwaysReturnValue.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/countAlwaysReturnValue.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/db.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/db.py -N 3 -n 3 -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/diff.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/diff.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distinct.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distinct.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_apercentile.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_apercentile.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_avg.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_avg.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_count.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_count.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_max.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_max.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_min.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_min.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_spread.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_spread.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_stddev.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_stddev.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_sum.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_sum.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/explain.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/explain.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/first.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/first.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/floor.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/floor.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_null.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_null.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_stateduration.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_stateduration.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/histogram.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/histogram.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/hyperloglog.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/hyperloglog.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interp.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interp.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/fill.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/irate.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/irate.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/join.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/join.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_row.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_row.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_and_last_row.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_and_last_row.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_and_last_row.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_and_last_row.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_and_last_row.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last+last_row.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last+last_row.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last+last_row.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last+last_row.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_1.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_1.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_1.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_1.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_1.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_2.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_2.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_2.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_2.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_2.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_3.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_3.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_3.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_3.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_3.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_4.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_4.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_4.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_4.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_4.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_5.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_5.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_5.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_5.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_5.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/leastsquares.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/leastsquares.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/length.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/length.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/limit.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/log.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/log.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/logical_operators.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/logical_operators.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/lower.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/lower.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ltrim.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ltrim.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/mavg.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/mavg.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max_partition.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max_partition.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_limit_interval.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_limit_interval.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max_min_last_interval.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_row_interval.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/min.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/min.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/normal.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/normal.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/mode.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/mode.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Now.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Now.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/orderBy.py -N 5 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/percentile.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/percentile.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/pow.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/pow.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/query_cols_tags_and_or.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/query_cols_tags_and_or.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/round.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/round.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/rtrim.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/rtrim.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sample.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sample.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sin.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sin.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/smaBasic.py -N 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/smaTest.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/smaTest.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/sma_index.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sml_TS-3724.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sml-TD19291.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/varbinary.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sml.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sml.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/spread.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/spread.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sqrt.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sqrt.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/statecount.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/statecount.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stateduration.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stateduration.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/substr.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/substr.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sum.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sum.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tail.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tail.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tan.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tan.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Timediff.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Timediff.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/timetruncate.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/timetruncate.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/timezone.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/timezone.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/To_iso8601.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/To_iso8601.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/To_unixtimestamp.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/To_unixtimestamp.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Today.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Today.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/top.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/top.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsbsQuery.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsbsQuery.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ttl_comment.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ttl_comment.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/twa.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/twa.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/union.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/union.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/unique.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/unique.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/upper.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/upper.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/varchar.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/varchar.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/case_when.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/case_when.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/blockSMA.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/blockSMA.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/projectionDesc.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/projectionDesc.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/update_data.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/tb_100w_data_order.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/delete_childtable.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/delete_normaltable.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/delete_systable.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/keep_expired.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/stmt_error.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/drop.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/drop.py -N 3 -M 3 -i False -n 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/join2.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/union1.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat2.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/json_tag.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQueryInterval.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/systable_func.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/test_ts4382.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/test_ts4403.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/test_td28163.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stablity.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stablity_1.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/elapsed.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/csum.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_diff.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tagFilter.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/projectionDesc.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ts_3405_3398_3423.py -N 3 -n 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ts-4348-td-27939.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/backslash_g.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/test_ts4467.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/geometry.py + +,,n,system-test,python3 ./test.py -f 2-query/queryQnode.py +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode1mnode.py +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode2mnode.py -N 5 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeStop.py -N 5 -M 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeStop.py -N 5 -M 3 -i False +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeStop2Follower.py -N 5 -M 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeStop2Follower.py -N 5 -M 3 -i False +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeStopLoop.py -N 5 -M 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateDb.py -N 6 -M 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateDb.py -N 6 -M 3 -n 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateDb.py -N 6 -M 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateDb.py -N 6 -M 3 -n 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopVnodeCreateDb.py -N 6 -M 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopVnodeCreateDb.py -N 6 -M 3 -n 3 + +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopDnodeModifyMeta.py -N 6 -M 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopMnodeModifyMeta.py -N 6 -M 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateStb.py -N 6 -M 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateStb.py -N 6 -M 3 -n 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateStb.py -N 6 -M 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateStb.py -N 6 -M 3 -n 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopVnodeCreateStb.py -N 6 -M 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopVnodeCreateStb.py -N 6 -M 3 -n 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeRestartDnodeInsertData.py -N 6 -M 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeRestartDnodeInsertData.py -N 6 -M 3 -n 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeRestartDnodeInsertDataAsync.py -N 6 -M 3 +#,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeRestartDnodeInsertDataAsync.py -N 6 -M 3 -n 3 +,,n,system-test,python3 ./test.py -f 6-cluster/manually-test/6dnode3mnodeInsertLessDataAlterRep3to1to3.py -N 6 -M 3 +#,,n,system-test,python3 ./test.py -f 6-cluster/5dnode3mnodeRoll.py -N 3 -C 1 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeAdd1Ddnoe.py -N 7 -M 3 -C 6 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeAdd1Ddnoe.py -N 7 -M 3 -C 6 -n 3 +#,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeDrop.py -N 5 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeRecreateMnode.py -N 6 -M 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeStopFollowerLeader.py -N 5 -M 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/5dnode3mnodeStop2Follower.py -N 5 -M 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_createDb_replica1.py -N 4 -M 1 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas.py -N 4 -M 1 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas_querys.py -N 4 -M 1 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas.py -N 4 -M 1 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys.py -N 4 -M 1 +,,y,system-test,./pytest.sh python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups.py -N 4 -M 1 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/between.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distinct.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/varchar.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ltrim.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/rtrim.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/length.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/char_length.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/upper.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/lower.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/join.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/join2.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/cast.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/substr.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/union.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/union1.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat2.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat_ws.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat_ws2.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/check_tsdb.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/spread.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/hyperloglog.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/explain.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/leastsquares.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/timezone.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Now.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Today.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/min.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/normal.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/mode.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/countAlwaysReturnValue.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/first.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/To_iso8601.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/To_unixtimestamp.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/timetruncate.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/diff.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Timediff.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/json_tag.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/top.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/bottom.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/percentile.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/apercentile.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/abs.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ceil.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/floor.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/round.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/log.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/pow.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sqrt.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sin.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/cos.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tan.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arcsin.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arccos.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arctan.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/query_cols_tags_and_or.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interp.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/fill.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQueryInterval.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stablity.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stablity_1.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/avg.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/elapsed.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/csum.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/mavg.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sample.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_diff.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/unique.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stateduration.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_stateduration.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/statecount.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tail.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ttl_comment.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_count.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_max.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_min.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_sum.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_spread.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_apercentile.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_avg.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_stddev.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/twa.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/irate.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_null.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count_partition.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max_partition.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_limit_interval.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max_min_last_interval.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_row_interval.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_row.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsbsQuery.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sml.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/case_when.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/blockSMA.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/projectionDesc.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TD-21561.py -Q 2 + +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/between.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distinct.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/varchar.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ltrim.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/rtrim.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/length.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/char_length.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/upper.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/lower.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/join.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/join2.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/cast.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/substr.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/union.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/union1.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat2.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat_ws.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat_ws2.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/check_tsdb.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/spread.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/hyperloglog.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/explain.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/leastsquares.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/timezone.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Now.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Today.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/min.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/normal.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/mode.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/countAlwaysReturnValue.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/first.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/To_iso8601.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/To_unixtimestamp.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/timetruncate.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/diff.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Timediff.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/json_tag.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/top.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/bottom.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/percentile.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/apercentile.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/abs.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ceil.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/floor.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/round.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/log.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/pow.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sqrt.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sin.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/cos.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tan.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arcsin.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arccos.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arctan.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/query_cols_tags_and_or.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQueryInterval.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stablity.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stablity_1.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/avg.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/elapsed.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/csum.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/mavg.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sample.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_diff.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/unique.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stateduration.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_stateduration.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/statecount.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tail.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ttl_comment.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_count.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_max.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_min.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_sum.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_spread.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_apercentile.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_avg.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_stddev.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/twa.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/irate.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_null.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count_partition.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max_partition.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_limit_interval.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max_min_last_interval.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_row_interval.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_row.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsbsQuery.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sml.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interp.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/fill.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/case_when.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/blockSMA.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/projectionDesc.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TD-21561.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/between.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distinct.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/varchar.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ltrim.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/rtrim.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/length.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/char_length.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/upper.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/lower.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/join.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/join2.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/substr.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/union.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/union1.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat2.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat_ws.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat_ws2.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/check_tsdb.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/spread.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/hyperloglog.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/explain.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/leastsquares.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/timezone.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Now.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Today.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/min.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/normal.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/mode.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/countAlwaysReturnValue.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/first.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/To_iso8601.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/To_unixtimestamp.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/timetruncate.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/diff.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/Timediff.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/json_tag.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/top.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/bottom.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/percentile.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/apercentile.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/abs.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ceil.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/floor.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/round.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/log.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/pow.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sqrt.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sin.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/cos.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tan.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arcsin.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arccos.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/arctan.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/query_cols_tags_and_or.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQueryInterval.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stablity.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stablity_1.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/avg.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/elapsed.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/csum.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/mavg.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sample.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/cast.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_diff.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/unique.py -Q 4 +#,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/stateduration.py -Q 4 +#,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_stateduration.py -Q 4 +#,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/statecount.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tail.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/ttl_comment.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_count.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_max.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_min.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_sum.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_spread.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_apercentile.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_avg.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/distribute_agg_stddev.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/twa.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/irate.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/function_null.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count_partition.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max_partition.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/partition_limit_interval.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/max_min_last_interval.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_row_interval.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_row.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/tsbsQuery.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/sml.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/interp.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/fill.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/case_when.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/insert_select.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/insert_select.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/insert_select.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/insert_select.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/insert_select.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/out_of_order.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/blockSMA.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/projectionDesc.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/odbc.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/fill_with_group.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/state_window.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TD-21561.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TD-20582.py +,,n,system-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/insertMix.py -N 3 +,,n,system-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/stt.py -N 3 +,,n,system-test,python3 ./test.py -f eco-system/meta/database/keep_time_offset.py + +#tsim test +,,y,script,./test.sh -f tsim/query/timeline.sim +,,y,script,./test.sh -f tsim/join/join.sim +,,y,script,./test.sh -f tsim/tmq/basic2Of2ConsOverlap.sim +,,y,script,./test.sh -f tsim/parser/where.sim +,,y,script,./test.sh -f tsim/parser/join_manyblocks.sim +,,y,script,./test.sh -f tsim/dnode/redistribute_vgroup_replica3_v1_leader.sim +,,y,script,./test.sh -f tsim/dnode/redistribute_vgroup_replica3_v1_follower.sim +,,y,script,./test.sh -f tsim/dnode/redistribute_vgroup_replica3_v2.sim +,,y,script,./test.sh -f tsim/dnode/redistribute_vgroup_replica3_v3.sim +,,y,script,./test.sh -f tsim/parser/limit1.sim +,,y,script,./test.sh -f tsim/parser/union.sim +,,y,script,./test.sh -f tsim/parser/commit.sim +,,y,script,./test.sh -f tsim/parser/nestquery.sim +,,n,script,./test.sh -f tsim/valgrind/checkError7.sim +,,y,script,./test.sh -f tsim/parser/groupby.sim +,,y,script,./test.sh -f tsim/parser/sliding.sim +,,y,script,./test.sh -f tsim/dnode/balance2.sim +,,y,script,./test.sh -f tsim/vnode/replica3_repeat.sim +,,y,script,./test.sh -f tsim/parser/col_arithmetic_operation.sim +#,,y,script,./test.sh -f tsim/trans/create_db.sim +,,y,script,./test.sh -f tsim/dnode/balance3.sim +,,y,script,./test.sh -f tsim/vnode/replica3_many.sim +,,y,script,./test.sh -f tsim/stable/metrics_idx.sim +# ,,y,script,./test.sh -f tsim/db/alter_replica_13.sim +,,y,script,./test.sh -f tsim/sync/3Replica1VgElect.sim +,,y,script,./test.sh -f tsim/sync/3Replica5VgElect.sim +,,n,script,./test.sh -f tsim/valgrind/checkError6.sim + +,,y,script,./test.sh -f tsim/user/basic.sim +,,y,script,./test.sh -f tsim/user/password.sim +,,y,script,./test.sh -f tsim/user/whitelist.sim +,,y,script,./test.sh -f tsim/user/privilege_db.sim +,,y,script,./test.sh -f tsim/user/privilege_sysinfo.sim +,,y,script,./test.sh -f tsim/user/privilege_topic.sim +,,y,script,./test.sh -f tsim/user/privilege_table.sim +,,y,script,./test.sh -f tsim/user/privilege_create_db.sim +,,y,script,./test.sh -f tsim/db/alter_option.sim +# ,,y,script,./test.sh -f tsim/db/alter_replica_31.sim +,,y,script,./test.sh -f tsim/db/basic1.sim +,,y,script,./test.sh -f tsim/db/basic2.sim +,,y,script,./test.sh -f tsim/db/basic3.sim +,,y,script,./test.sh -f tsim/db/basic4.sim +,,y,script,./test.sh -f tsim/db/basic5.sim +,,y,script,./test.sh -f tsim/db/basic6.sim +,,y,script,./test.sh -f tsim/db/commit.sim +,,y,script,./test.sh -f tsim/db/create_all_options.sim +,,y,script,./test.sh -f tsim/db/delete_reuse1.sim +,,y,script,./test.sh -f tsim/db/delete_reuse2.sim +,,y,script,./test.sh -f tsim/db/delete_reusevnode.sim +,,y,script,./test.sh -f tsim/db/delete_reusevnode2.sim +,,y,script,./test.sh -f tsim/db/delete_writing1.sim +,,y,script,./test.sh -f tsim/db/delete_writing2.sim +,,y,script,./test.sh -f tsim/db/error1.sim +,,y,script,./test.sh -f tsim/db/keep.sim +,,y,script,./test.sh -f tsim/db/len.sim +,,y,script,./test.sh -f tsim/db/repeat.sim +,,y,script,./test.sh -f tsim/db/show_create_db.sim +,,y,script,./test.sh -f tsim/db/show_create_table.sim +,,y,script,./test.sh -f tsim/db/tables.sim +,,y,script,./test.sh -f tsim/db/taosdlog.sim +,,y,script,./test.sh -f tsim/db/table_prefix_suffix.sim +,,y,script,./test.sh -f tsim/dnode/balance_replica1.sim +,,y,script,./test.sh -f tsim/dnode/balance_replica3.sim +,,y,script,./test.sh -f tsim/dnode/balance1.sim +,,y,script,./test.sh -f tsim/dnode/balancex.sim +,,y,script,./test.sh -f tsim/dnode/create_dnode.sim +,,y,script,./test.sh -f tsim/dnode/drop_dnode_has_mnode.sim +,,y,script,./test.sh -f tsim/dnode/drop_dnode_has_qnode_snode.sim +,,y,script,./test.sh -f tsim/dnode/drop_dnode_has_vnode_replica1.sim +,,y,script,./test.sh -f tsim/dnode/drop_dnode_has_vnode_replica3.sim +,,y,script,./test.sh -f tsim/dnode/drop_dnode_has_multi_vnode_replica1.sim +,,y,script,./test.sh -f tsim/dnode/drop_dnode_has_multi_vnode_replica3.sim +,,y,script,./test.sh -f tsim/dnode/drop_dnode_force.sim +,,y,script,./test.sh -f tsim/dnode/offline_reason.sim +,,y,script,./test.sh -f tsim/dnode/redistribute_vgroup_replica1.sim +,,y,script,./test.sh -f tsim/dnode/vnode_clean.sim +,,y,script,./test.sh -f tsim/dnode/use_dropped_dnode.sim +,,y,script,./test.sh -f tsim/dnode/split_vgroup_replica1.sim +,,y,script,./test.sh -f tsim/dnode/split_vgroup_replica3.sim +,,y,script,./test.sh -f tsim/import/basic.sim +,,y,script,./test.sh -f tsim/import/commit.sim +,,y,script,./test.sh -f tsim/import/large.sim +,,y,script,./test.sh -f tsim/import/replica1.sim +,,y,script,./test.sh -f tsim/insert/backquote.sim +,,y,script,./test.sh -f tsim/insert/basic.sim +,,y,script,./test.sh -f tsim/insert/basic0.sim +,,y,script,./test.sh -f tsim/insert/basic1.sim +,,y,script,./test.sh -f tsim/insert/basic2.sim +,,y,script,./test.sh -f tsim/insert/commit-merge0.sim +,,y,script,./test.sh -f tsim/insert/insert_drop.sim +,,y,script,./test.sh -f tsim/insert/insert_select.sim +,,y,script,./test.sh -f tsim/insert/null.sim +,,y,script,./test.sh -f tsim/insert/query_block1_file.sim +,,y,script,./test.sh -f tsim/insert/query_block1_memory.sim +,,y,script,./test.sh -f tsim/insert/query_block2_file.sim +,,y,script,./test.sh -f tsim/insert/query_block2_memory.sim +,,y,script,./test.sh -f tsim/insert/query_file_memory.sim +,,y,script,./test.sh -f tsim/insert/query_multi_file.sim +,,y,script,./test.sh -f tsim/insert/tcp.sim +,,y,script,./test.sh -f tsim/insert/update0.sim +,,y,script,./test.sh -f tsim/insert/delete0.sim +,,y,script,./test.sh -f tsim/insert/update1_sort_merge.sim +,,y,script,./test.sh -f tsim/insert/update2.sim +,,y,script,./test.sh -f tsim/insert/insert_stb.sim +,,y,script,./test.sh -f tsim/parser/alter__for_community_version.sim +,,y,script,./test.sh -f tsim/parser/alter_column.sim +,,y,script,./test.sh -f tsim/parser/alter_stable.sim +,,y,script,./test.sh -f tsim/parser/alter.sim +,,y,script,./test.sh -f tsim/parser/alter1.sim +,,y,script,./test.sh -f tsim/parser/auto_create_tb_drop_tb.sim +,,y,script,./test.sh -f tsim/parser/auto_create_tb.sim +,,y,script,./test.sh -f tsim/parser/between_and.sim +,,y,script,./test.sh -f tsim/parser/binary_escapeCharacter.sim +,,y,script,./test.sh -f tsim/parser/columnValue_bigint.sim +,,y,script,./test.sh -f tsim/parser/columnValue_bool.sim +,,y,script,./test.sh -f tsim/parser/columnValue_double.sim +,,y,script,./test.sh -f tsim/parser/columnValue_float.sim +,,y,script,./test.sh -f tsim/parser/columnValue_int.sim +,,y,script,./test.sh -f tsim/parser/columnValue_smallint.sim +,,y,script,./test.sh -f tsim/parser/columnValue_tinyint.sim +,,y,script,./test.sh -f tsim/parser/columnValue_unsign.sim +,,y,script,./test.sh -f tsim/parser/columnValue_uint.sim +,,y,script,./test.sh -f tsim/parser/columnValue_timestamp.sim +,,y,script,./test.sh -f tsim/parser/columnValue_varchar.sim +,,y,script,./test.sh -f tsim/parser/columnValue_nchar.sim +,,y,script,./test.sh -f tsim/parser/columnValue_varbinary.sim +,,y,script,./test.sh -f tsim/parser/columnValue_json.sim +,,y,script,./test.sh -f tsim/parser/columnValue_geometry.sim +,,y,script,./test.sh -f tsim/parser/condition.sim +,,y,script,./test.sh -f tsim/parser/condition_scl.sim +,,y,script,./test.sh -f tsim/parser/constCol.sim +,,y,script,./test.sh -f tsim/parser/create_db.sim +,,y,script,./test.sh -f tsim/parser/create_mt.sim +,,y,script,./test.sh -f tsim/parser/create_tb_with_tag_name.sim +,,y,script,./test.sh -f tsim/parser/create_tb.sim +,,y,script,./test.sh -f tsim/parser/dbtbnameValidate.sim +,,y,script,./test.sh -f tsim/parser/distinct.sim +,,y,script,./test.sh -f tsim/parser/fill_us.sim +,,y,script,./test.sh -f tsim/parser/fill.sim +,,y,script,./test.sh -f tsim/parser/first_last.sim +,,y,script,./test.sh -f tsim/parser/fill_stb.sim +,,y,script,./test.sh -f tsim/parser/interp.sim +,,y,script,./test.sh -f tsim/parser/fourArithmetic-basic.sim +,,y,script,./test.sh -f tsim/parser/function.sim +,,y,script,./test.sh -f tsim/parser/groupby-basic.sim +,,y,script,./test.sh -f tsim/parser/having_child.sim +,,y,script,./test.sh -f tsim/parser/having.sim +,,y,script,./test.sh -f tsim/parser/import_commit1.sim +,,y,script,./test.sh -f tsim/parser/import_commit2.sim +,,y,script,./test.sh -f tsim/parser/import_commit3.sim +,,y,script,./test.sh -f tsim/parser/import_file.sim +,,y,script,./test.sh -f tsim/parser/import.sim +,,y,script,./test.sh -f tsim/parser/insert_multiTbl.sim +,,y,script,./test.sh -f tsim/parser/insert_tb.sim +,,y,script,./test.sh -f tsim/parser/join_multitables.sim +,,y,script,./test.sh -f tsim/parser/join_multivnode.sim +,,y,script,./test.sh -f tsim/parser/join.sim +,,y,script,./test.sh -f tsim/parser/last_cache.sim +,,y,script,./test.sh -f tsim/parser/last_both.sim +,,y,script,./test.sh -f tsim/parser/last_groupby.sim +,,y,script,./test.sh -f tsim/parser/lastrow.sim +,,y,script,./test.sh -f tsim/parser/lastrow2.sim +,,y,script,./test.sh -f tsim/parser/like.sim +,,y,script,./test.sh -f tsim/parser/limit.sim +,,y,script,./test.sh -f tsim/parser/mixed_blocks.sim +,,y,script,./test.sh -f tsim/parser/nchar.sim +,,y,script,./test.sh -f tsim/parser/null_char.sim +,,y,script,./test.sh -f tsim/parser/precision_ns.sim +,,y,script,./test.sh -f tsim/parser/projection_limit_offset.sim +,,y,script,./test.sh -f tsim/parser/regex.sim +,,y,script,./test.sh -f tsim/parser/regressiontest.sim +,,y,script,./test.sh -f tsim/parser/select_across_vnodes.sim +,,y,script,./test.sh -f tsim/parser/select_distinct_tag.sim +,,y,script,./test.sh -f tsim/parser/select_from_cache_disk.sim +,,y,script,./test.sh -f tsim/parser/select_with_tags.sim +,,y,script,./test.sh -f tsim/parser/selectResNum.sim +,,y,script,./test.sh -f tsim/parser/set_tag_vals.sim +,,y,script,./test.sh -f tsim/parser/single_row_in_tb.sim +,,y,script,./test.sh -f tsim/parser/slimit_alter_tags.sim +,,y,script,./test.sh -f tsim/parser/slimit.sim +,,y,script,./test.sh -f tsim/parser/slimit1.sim +,,y,script,./test.sh -f tsim/parser/stableOp.sim +,,y,script,./test.sh -f tsim/parser/tags_dynamically_specifiy.sim +,,y,script,./test.sh -f tsim/parser/tags_filter.sim +,,y,script,./test.sh -f tsim/parser/tbnameIn.sim +,,y,script,./test.sh -f tsim/parser/timestamp.sim +,,y,script,./test.sh -f tsim/parser/top_groupby.sim +,,y,script,./test.sh -f tsim/parser/topbot.sim +,,y,script,./test.sh -f tsim/parser/union_sysinfo.sim +,,y,script,./test.sh -f tsim/parser/slimit_limit.sim +,,y,script,./test.sh -f tsim/parser/table_merge_limit.sim +,,y,script,./test.sh -f tsim/query/tagLikeFilter.sim +,,y,script,./test.sh -f tsim/query/charScalarFunction.sim +,,y,script,./test.sh -f tsim/query/explain.sim +,,y,script,./test.sh -f tsim/query/interval-offset.sim +,,y,script,./test.sh -f tsim/query/interval.sim +,,y,script,./test.sh -f tsim/query/scalarFunction.sim +,,y,script,./test.sh -f tsim/query/scalarNull.sim +,,y,script,./test.sh -f tsim/query/session.sim +,,y,script,./test.sh -f tsim/query/udf.sim +,,n,script,./test.sh -f tsim/query/udfpy.sim +,,y,script,./test.sh -f tsim/query/udf_with_const.sim +,,y,script,./test.sh -f tsim/query/join_interval.sim +,,y,script,./test.sh -f tsim/query/join_pk.sim +,,y,script,./test.sh -f tsim/query/join_order.sim +,,y,script,./test.sh -f tsim/query/count_spread.sim +,,y,script,./test.sh -f tsim/query/unionall_as_table.sim +,,y,script,./test.sh -f tsim/query/multi_order_by.sim +,,y,script,./test.sh -f tsim/query/sys_tbname.sim +,,y,script,./test.sh -f tsim/query/sort-pre-cols.sim +,,y,script,./test.sh -f tsim/query/groupby.sim +,,y,script,./test.sh -f tsim/query/groupby_distinct.sim +,,y,script,./test.sh -f tsim/query/event.sim +,,y,script,./test.sh -f tsim/query/forceFill.sim +,,y,script,./test.sh -f tsim/query/emptyTsRange.sim +,,y,script,./test.sh -f tsim/query/emptyTsRange_scl.sim +,,y,script,./test.sh -f tsim/query/partitionby.sim +,,y,script,./test.sh -f tsim/query/tableCount.sim +,,y,script,./test.sh -f tsim/query/show_db_table_kind.sim +,,y,script,./test.sh -f tsim/query/bi_star_table.sim +,,y,script,./test.sh -f tsim/query/bi_tag_scan.sim +,,y,script,./test.sh -f tsim/query/bi_tbname_col.sim +,,y,script,./test.sh -f tsim/query/tag_scan.sim +,,y,script,./test.sh -f tsim/query/nullColSma.sim +,,y,script,./test.sh -f tsim/query/bug3398.sim +,,y,script,./test.sh -f tsim/query/explain_tsorder.sim +,,y,script,./test.sh -f tsim/query/apercentile.sim +,,y,script,./test.sh -f tsim/query/query_count0.sim +,,y,script,./test.sh -f tsim/query/query_count_sliding0.sim +,,y,script,./test.sh -f tsim/query/union_precision.sim +,,y,script,./test.sh -f tsim/qnode/basic1.sim +,,y,script,./test.sh -f tsim/snode/basic1.sim +,,y,script,./test.sh -f tsim/mnode/basic1.sim +,,y,script,./test.sh -f tsim/mnode/basic2.sim +#,,y,script,./test.sh -f tsim/mnode/basic3.sim +,,y,script,./test.sh -f tsim/mnode/basic4.sim +,,y,script,./test.sh -f tsim/mnode/basic5.sim +,,y,script,./test.sh -f tsim/show/basic.sim +,,y,script,./test.sh -f tsim/table/autocreate.sim +,,y,script,./test.sh -f tsim/table/basic1.sim +,,y,script,./test.sh -f tsim/table/basic2.sim +,,y,script,./test.sh -f tsim/table/basic3.sim +,,y,script,./test.sh -f tsim/table/bigint.sim +,,y,script,./test.sh -f tsim/table/binary.sim +,,y,script,./test.sh -f tsim/table/bool.sim +,,y,script,./test.sh -f tsim/table/column_name.sim +,,y,script,./test.sh -f tsim/table/column_num.sim +,,y,script,./test.sh -f tsim/table/column_value.sim +,,y,script,./test.sh -f tsim/table/column2.sim +,,y,script,./test.sh -f tsim/table/createmulti.sim +,,y,script,./test.sh -f tsim/table/date.sim +,,y,script,./test.sh -f tsim/table/db.table.sim +,,y,script,./test.sh -f tsim/table/delete_reuse1.sim +,,y,script,./test.sh -f tsim/table/delete_reuse2.sim +,,y,script,./test.sh -f tsim/table/delete_writing.sim +,,y,script,./test.sh -f tsim/table/describe.sim +,,y,script,./test.sh -f tsim/table/double.sim +,,y,script,./test.sh -f tsim/table/float.sim +,,y,script,./test.sh -f tsim/table/hash.sim +,,y,script,./test.sh -f tsim/table/int.sim +,,y,script,./test.sh -f tsim/table/limit.sim +,,y,script,./test.sh -f tsim/table/smallint.sim +,,y,script,./test.sh -f tsim/table/table_len.sim +,,y,script,./test.sh -f tsim/table/table.sim +,,y,script,./test.sh -f tsim/table/tinyint.sim +,,y,script,./test.sh -f tsim/table/vgroup.sim +,,n,script,./test.sh -f tsim/stream/basic0.sim -g +,,y,script,./test.sh -f tsim/stream/basic1.sim +,,y,script,./test.sh -f tsim/stream/basic2.sim +,,y,script,./test.sh -f tsim/stream/basic3.sim +,,y,script,./test.sh -f tsim/stream/basic4.sim +,,y,script,./test.sh -f tsim/stream/checkpointInterval0.sim +,,y,script,./test.sh -f tsim/stream/checkStreamSTable1.sim +,,y,script,./test.sh -f tsim/stream/checkStreamSTable.sim +,,y,script,./test.sh -f tsim/stream/count0.sim +,,y,script,./test.sh -f tsim/stream/count1.sim +,,y,script,./test.sh -f tsim/stream/count2.sim +,,y,script,./test.sh -f tsim/stream/count3.sim +,,y,script,./test.sh -f tsim/stream/countSliding0.sim +,,y,script,./test.sh -f tsim/stream/countSliding1.sim +,,y,script,./test.sh -f tsim/stream/countSliding2.sim +,,y,script,./test.sh -f tsim/stream/deleteInterval.sim +,,y,script,./test.sh -f tsim/stream/deleteScalar.sim +,,y,script,./test.sh -f tsim/stream/deleteSession.sim +,,y,script,./test.sh -f tsim/stream/deleteState.sim +,,y,script,./test.sh -f tsim/stream/distributeInterval0.sim +,,y,script,./test.sh -f tsim/stream/distributeIntervalRetrive0.sim +,,y,script,./test.sh -f tsim/stream/distributeMultiLevelInterval0.sim +,,y,script,./test.sh -f tsim/stream/distributeSession0.sim +,,y,script,./test.sh -f tsim/stream/drop_stream.sim +,,y,script,./test.sh -f tsim/stream/event0.sim +,,y,script,./test.sh -f tsim/stream/event1.sim +,,y,script,./test.sh -f tsim/stream/event2.sim +,,y,script,./test.sh -f tsim/stream/fillHistoryBasic1.sim +,,y,script,./test.sh -f tsim/stream/fillHistoryBasic2.sim +,,y,script,./test.sh -f tsim/stream/fillHistoryBasic3.sim +,,y,script,./test.sh -f tsim/stream/fillIntervalDelete0.sim +,,y,script,./test.sh -f tsim/stream/fillIntervalDelete1.sim +,,y,script,./test.sh -f tsim/stream/fillIntervalLinear.sim +,,y,script,./test.sh -f tsim/stream/fillIntervalPartitionBy.sim +,,y,script,./test.sh -f tsim/stream/fillIntervalPrevNext1.sim +,,y,script,./test.sh -f tsim/stream/fillIntervalPrevNext.sim +,,y,script,./test.sh -f tsim/stream/fillIntervalRange.sim +,,y,script,./test.sh -f tsim/stream/fillIntervalValue.sim +,,y,script,./test.sh -f tsim/stream/ignoreCheckUpdate.sim +,,y,script,./test.sh -f tsim/stream/ignoreExpiredData.sim +,,y,script,./test.sh -f tsim/stream/partitionby1.sim +,,y,script,./test.sh -f tsim/stream/partitionbyColumnInterval.sim +,,y,script,./test.sh -f tsim/stream/partitionbyColumnOther.sim +,,y,script,./test.sh -f tsim/stream/partitionbyColumnSession.sim +,,y,script,./test.sh -f tsim/stream/partitionbyColumnState.sim +,,y,script,./test.sh -f tsim/stream/partitionby.sim +,,y,script,./test.sh -f tsim/stream/pauseAndResume.sim +,,y,script,./test.sh -f tsim/stream/schedSnode.sim +,,y,script,./test.sh -f tsim/stream/session0.sim +,,y,script,./test.sh -f tsim/stream/session1.sim +,,y,script,./test.sh -f tsim/stream/sliding.sim +,,y,script,./test.sh -f tsim/stream/state0.sim +,,y,script,./test.sh -f tsim/stream/state1.sim +,,y,script,./test.sh -f tsim/stream/streamPrimaryKey0.sim +,,y,script,./test.sh -f tsim/stream/streamPrimaryKey1.sim +,,y,script,./test.sh -f tsim/stream/streamPrimaryKey2.sim +,,y,script,./test.sh -f tsim/stream/streamPrimaryKey3.sim +,,y,script,./test.sh -f tsim/stream/triggerInterval0.sim +,,y,script,./test.sh -f tsim/stream/triggerSession0.sim +,,y,script,./test.sh -f tsim/stream/udTableAndCol0.sim +,,y,script,./test.sh -f tsim/stream/udTableAndTag0.sim +,,y,script,./test.sh -f tsim/stream/udTableAndTag1.sim +,,y,script,./test.sh -f tsim/stream/udTableAndTag2.sim +,,y,script,./test.sh -f tsim/stream/windowClose.sim +,,y,script,./test.sh -f tsim/trans/lossdata1.sim +,,y,script,./test.sh -f tsim/tmq/basic1.sim +,,y,script,./test.sh -f tsim/tmq/basic2.sim +,,y,script,./test.sh -f tsim/tmq/basic3.sim +,,y,script,./test.sh -f tsim/tmq/basic4.sim +,,y,script,./test.sh -f tsim/tmq/basic1Of2Cons.sim +,,y,script,./test.sh -f tsim/tmq/basic2Of2Cons.sim +,,y,script,./test.sh -f tsim/tmq/basic3Of2Cons.sim +,,y,script,./test.sh -f tsim/tmq/basic4Of2Cons.sim +,,y,script,./test.sh -f tsim/tmq/topic.sim +,,y,script,./test.sh -f tsim/tmq/snapshot.sim +,,y,script,./test.sh -f tsim/tmq/snapshot1.sim +,,y,script,./test.sh -f tsim/stable/alter_comment.sim +,,y,script,./test.sh -f tsim/stable/alter_count.sim +,,y,script,./test.sh -f tsim/stable/alter_import.sim +,,y,script,./test.sh -f tsim/stable/alter_insert1.sim +,,y,script,./test.sh -f tsim/stable/alter_insert2.sim +,,y,script,./test.sh -f tsim/stable/alter_metrics.sim +,,y,script,./test.sh -f tsim/stable/column_add.sim +,,y,script,./test.sh -f tsim/stable/column_drop.sim +,,y,script,./test.sh -f tsim/stable/column_modify.sim +,,y,script,./test.sh -f tsim/stable/disk.sim +,,y,script,./test.sh -f tsim/stable/dnode3.sim +,,y,script,./test.sh -f tsim/stable/metrics.sim +,,y,script,./test.sh -f tsim/stable/refcount.sim +,,y,script,./test.sh -f tsim/stable/tag_add.sim +,,y,script,./test.sh -f tsim/stable/tag_drop.sim +,,y,script,./test.sh -f tsim/stable/tag_filter.sim +,,y,script,./test.sh -f tsim/stable/tag_modify.sim +,,y,script,./test.sh -f tsim/stable/tag_rename.sim +,,y,script,./test.sh -f tsim/stable/values.sim +,,y,script,./test.sh -f tsim/stable/vnode3.sim +,,n,script,./test.sh -f tsim/sma/drop_sma.sim +,,y,script,./test.sh -f tsim/sma/sma_leak.sim +,,y,script,./test.sh -f tsim/sma/tsmaCreateInsertQuery.sim +,,y,script,./test.sh -f tsim/sma/rsmaCreateInsertQuery.sim +,,y,script,./test.sh -f tsim/sma/rsmaCreateInsertQueryDelete.sim + +### refactor stream backend, open case after rsma refactored +#,,y,script,./test.sh -f tsim/sma/rsmaPersistenceRecovery.sim +,,y,script,./test.sh -f tsim/sync/vnodesnapshot-rsma-test.sim +,,n,script,./test.sh -f tsim/valgrind/checkError1.sim +,,n,script,./test.sh -f tsim/valgrind/checkError2.sim +,,n,script,./test.sh -f tsim/valgrind/checkError3.sim +,,n,script,./test.sh -f tsim/valgrind/checkError4.sim +,,n,script,./test.sh -f tsim/valgrind/checkError5.sim +,,n,script,./test.sh -f tsim/valgrind/checkError8.sim +,,n,script,./test.sh -f tsim/valgrind/checkUdf.sim +,,y,script,./test.sh -f tsim/vnode/replica3_basic.sim +,,y,script,./test.sh -f tsim/vnode/replica3_vgroup.sim +,,y,script,./test.sh -f tsim/vnode/replica3_import.sim +,,y,script,./test.sh -f tsim/vnode/stable_balance_replica1.sim +,,y,script,./test.sh -f tsim/vnode/stable_dnode2_stop.sim +,,y,script,./test.sh -f tsim/vnode/stable_dnode2.sim +,,y,script,./test.sh -f tsim/vnode/stable_dnode3.sim +,,y,script,./test.sh -f tsim/vnode/stable_replica3_dnode6.sim +,,y,script,./test.sh -f tsim/vnode/stable_replica3_vnode3.sim +,,y,script,./test.sh -f tsim/sync/oneReplica1VgElect.sim +,,y,script,./test.sh -f tsim/sync/oneReplica5VgElect.sim +,,y,script,./test.sh -f tsim/catalog/alterInCurrent.sim +,,y,script,./test.sh -f tsim/scalar/in.sim +,,y,script,./test.sh -f tsim/scalar/scalar.sim +,,y,script,./test.sh -f tsim/scalar/filter.sim +,,y,script,./test.sh -f tsim/scalar/caseWhen.sim +,,y,script,./test.sh -f tsim/scalar/tsConvert.sim +,,y,script,./test.sh -f tsim/alter/cached_schema_after_alter.sim +,,y,script,./test.sh -f tsim/alter/dnode.sim +,,y,script,./test.sh -f tsim/alter/table.sim +,,y,script,./test.sh -f tsim/cache/new_metrics.sim +,,y,script,./test.sh -f tsim/cache/restart_table.sim +,,y,script,./test.sh -f tsim/cache/restart_metrics.sim +,,y,script,./test.sh -f tsim/column/commit.sim +,,y,script,./test.sh -f tsim/column/metrics.sim +,,y,script,./test.sh -f tsim/column/table.sim +,,y,script,./test.sh -f tsim/compress/commitlog.sim +,,y,script,./test.sh -f tsim/compress/compress2.sim +,,y,script,./test.sh -f tsim/compress/compress.sim +,,y,script,./test.sh -f tsim/compress/compress_col.sim +,,y,script,./test.sh -f tsim/compress/uncompress.sim +,,y,script,./test.sh -f tsim/compute/avg.sim +,,y,script,./test.sh -f tsim/compute/block_dist.sim +,,y,script,./test.sh -f tsim/compute/bottom.sim +,,y,script,./test.sh -f tsim/compute/count.sim +,,y,script,./test.sh -f tsim/compute/diff.sim +,,y,script,./test.sh -f tsim/compute/diff2.sim +,,y,script,./test.sh -f tsim/compute/first.sim +,,y,script,./test.sh -f tsim/compute/interval.sim +,,y,script,./test.sh -f tsim/compute/interval1.sim +,,y,script,./test.sh -f tsim/compute/last_row.sim +,,y,script,./test.sh -f tsim/compute/last.sim +,,y,script,./test.sh -f tsim/compute/leastsquare.sim +,,y,script,./test.sh -f tsim/compute/max.sim +,,y,script,./test.sh -f tsim/compute/min.sim +,,y,script,./test.sh -f tsim/compute/null.sim +,,y,script,./test.sh -f tsim/compute/percentile.sim +,,y,script,./test.sh -f tsim/compute/stddev.sim +,,y,script,./test.sh -f tsim/compute/sum.sim +,,y,script,./test.sh -f tsim/compute/top.sim +,,y,script,./test.sh -f tsim/field/2.sim +,,y,script,./test.sh -f tsim/field/3.sim +,,y,script,./test.sh -f tsim/field/4.sim +,,y,script,./test.sh -f tsim/field/5.sim +,,y,script,./test.sh -f tsim/field/6.sim +,,y,script,./test.sh -f tsim/field/binary.sim +,,y,script,./test.sh -f tsim/field/bigint.sim +,,y,script,./test.sh -f tsim/field/bool.sim +,,y,script,./test.sh -f tsim/field/double.sim +,,y,script,./test.sh -f tsim/field/float.sim +,,y,script,./test.sh -f tsim/field/int.sim +,,y,script,./test.sh -f tsim/field/single.sim +,,y,script,./test.sh -f tsim/field/smallint.sim +,,y,script,./test.sh -f tsim/field/tinyint.sim +,,y,script,./test.sh -f tsim/field/unsigined_bigint.sim +,,y,script,./test.sh -f tsim/vector/metrics_field.sim +,,y,script,./test.sh -f tsim/vector/metrics_mix.sim +,,y,script,./test.sh -f tsim/vector/metrics_query.sim +,,y,script,./test.sh -f tsim/vector/metrics_tag.sim +,,y,script,./test.sh -f tsim/vector/metrics_time.sim +,,y,script,./test.sh -f tsim/vector/multi.sim +,,y,script,./test.sh -f tsim/vector/single.sim +,,y,script,./test.sh -f tsim/vector/table_field.sim +,,y,script,./test.sh -f tsim/vector/table_mix.sim +,,y,script,./test.sh -f tsim/vector/table_query.sim +,,y,script,./test.sh -f tsim/vector/table_time.sim +,,y,script,./test.sh -f tsim/wal/kill.sim +,,y,script,./test.sh -f tsim/tag/3.sim +,,y,script,./test.sh -f tsim/tag/4.sim +,,y,script,./test.sh -f tsim/tag/5.sim +,,y,script,./test.sh -f tsim/tag/6.sim +,,y,script,./test.sh -f tsim/tag/add.sim +,,y,script,./test.sh -f tsim/tag/bigint.sim +,,y,script,./test.sh -f tsim/tag/binary_binary.sim +,,y,script,./test.sh -f tsim/tag/binary.sim +,,y,script,./test.sh -f tsim/tag/bool_binary.sim +,,y,script,./test.sh -f tsim/tag/bool_int.sim +,,y,script,./test.sh -f tsim/tag/bool.sim +,,y,script,./test.sh -f tsim/tag/change.sim +,,y,script,./test.sh -f tsim/tag/column.sim +,,y,script,./test.sh -f tsim/tag/commit.sim +,,y,script,./test.sh -f tsim/tag/create.sim +,,y,script,./test.sh -f tsim/tag/delete.sim +,,y,script,./test.sh -f tsim/tag/double.sim +,,y,script,./test.sh -f tsim/tag/filter.sim +,,y,script,./test.sh -f tsim/tag/float.sim +,,y,script,./test.sh -f tsim/tag/int_binary.sim +,,y,script,./test.sh -f tsim/tag/int_float.sim +,,y,script,./test.sh -f tsim/tag/int.sim +,,y,script,./test.sh -f tsim/tag/set.sim +,,y,script,./test.sh -f tsim/tag/smallint.sim +,,y,script,./test.sh -f tsim/tag/tinyint.sim +,,y,script,./test.sh -f tsim/tag/drop_tag.sim +,,y,script,./test.sh -f tsim/tag/tbNameIn.sim +,,y,script,./test.sh -f tmp/monitor.sim +,,y,script,./test.sh -f tsim/tagindex/add_index.sim +,,n,script,./test.sh -f tsim/tagindex/sma_and_tag_index.sim +,,y,script,./test.sh -f tsim/tagindex/indexOverflow.sim +,,y,script,./test.sh -f tsim/view/view.sim +,,y,script,./test.sh -f tsim/query/cache_last.sim +,,y,script,./test.sh -f tsim/query/const.sim +,,y,script,./test.sh -f tsim/query/nestedJoinView.sim + + + +#develop test +,,n,develop-test,python3 ./test.py -f 2-query/table_count_scan.py +,,n,develop-test,python3 ./test.py -f 2-query/pseudo_column.py +,,n,develop-test,python3 ./test.py -f 2-query/ts-range.py +,,n,develop-test,python3 ./test.py -f 2-query/tag_scan.py +,,n,develop-test,python3 ./test.py -f 2-query/show_create_db.py +,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/auto_create_table_json.py +,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/custom_col_tag.py +,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/default_json.py +,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/demo.py +,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/insert_alltypes_json.py +,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/invalid_commandline.py +,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/json_tag.py +,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/query_json.py +,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/sample_csv_json.py +,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/sml_json_alltypes.py +,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/taosdemoTestQueryWithJson.py -R +,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/telnet_tcp.py -R + #docs-examples test ,,n,docs-examples-test,bash python.sh #,,n,docs-examples-test,bash node.sh ,,n,docs-examples-test,bash csharp.sh ,,n,docs-examples-test,bash jdbc.sh -,,n,docs-examples-test,bash go.sh ,,n,docs-examples-test,bash rust.sh +,,n,docs-examples-test,bash go.sh ,,n,docs-examples-test,bash test_R.sh From e0559749c038e1efe89cadd3edab58e9e97bbf59 Mon Sep 17 00:00:00 2001 From: yingzhao Date: Tue, 24 Sep 2024 23:46:09 +0800 Subject: [PATCH 24/62] docs(data-in): add new page for parser plugin --- .../05-data-in/99-parser-plugin.md | 30 ++++++++++++++++++ docs/zh/06-advanced/05-data-in/plugin-01.png | Bin 0 -> 27789 bytes 2 files changed, 30 insertions(+) create mode 100644 docs/zh/06-advanced/05-data-in/99-parser-plugin.md create mode 100644 docs/zh/06-advanced/05-data-in/plugin-01.png diff --git a/docs/zh/06-advanced/05-data-in/99-parser-plugin.md b/docs/zh/06-advanced/05-data-in/99-parser-plugin.md new file mode 100644 index 0000000000..7138fc28be --- /dev/null +++ b/docs/zh/06-advanced/05-data-in/99-parser-plugin.md @@ -0,0 +1,30 @@ +--- +title: "数据解析插件" +sidebar_label: "数据解析插件" +--- + +接入消息中间时,如果使用 json/regex 等模式解析器无法满足解析需求,同时 UDT 也无法满足性能需求的情况,可以自定义数据解析插件。 + +## 插件概述 + +taosX Parser 插件是一个要求用 C/Rust 语言开发的 C ABI 兼容动态库,该动态库要实现约定的 API 并编译为在 taosX 所在运行环境中能够正确运行的动态库,然后复制到约定位置由 taosX 在运行时加载,并在处理数据的 Parsing 阶段调用。 + +## 插件部署 + +编译插件,需要在和目标环境兼容的环境中编译。 + +编译好插件后可将插件的动态库复制到插件目录下,taosX 启动时后,系统首次使用插件时初始化加载插件。可以在 explorer 的 kafka 或者 mqtt 数据接入配置页面中,检查是否加载成功。如下图,如果加载成功,则在解析器选择列表中展示出来。 + +插件目录在 `taosx.toml` 配置文件中复用 plugins 配置,追加`/parsers`作为插件安装路径,默认值在 UNIX 环境下为 `/usr/local/taos/plugins/parsers`,在 Windows 下为 `C:\TDengine\plugins\parsers`。 + +![](./plugin-01.png) + +## 插件接口规范 + +| 函数签名 | 描述 | 参数说明 | 返回值 | +| -------- | -------- | -------- | ----------- | +| const char* parser_name() | 插件名,用于前端显示。 | 无 | 字符串 | +| const char* parser_version() | 版本,方便定位问题。 | 无 | 字符串 | +| struct parser_resp_t {
char* e; // Error if null.
void* p; // Success if contains.
}
parser_resp_t parser_new(char* ctx, uint32_t len); | 使用用户自定义配置生成解析器对象或返回错误信息。| char* ctx: 用户自定义配置字符串。
uint32_t len: 该字符串的二进制长度(不含 `\0`)。 | 返回值为结构体。
struct parser_resp_t {
char* e; // Error if null.
void* p; // Success if contains.
}
当创建对象失败时,第一个指针 e 不为 NULL。
当创建成功时,e 为 NULL,p 为解析器对象。 | +| const char* parser_mutate(
void* parser,
const uint8_t* in_ptr, uint32_t in_len,
const void* uint8_t* out_ptr, uint32_t* out_len
) | 使用解析器对象对输入 payload 进行解析,返回结果为 JSON 格式 [u8] 。
返回的 JSON 将使用默认的 JSON 解析器进行完全解码(展开根数组和所有的对象)。 | void* parser: parser_new 生成的对象指针。
const uint8_t* in_ptr, uint32_t in_len:输入 Payload 的指针和 bytes 长度(不含 `\0`)。
const void* uint8_t* out_ptr, uint32_t * out_len:输出 JSON 字符串的指针和长度(不含 `\0`)。当 out_ptr 指向为空时,表示输出为空。当 out_ptr 不为空时,应用(taosx)在使用完毕后应当释放该内存空间。| 字符串指针。
当调用成功时,返回值为 NULL。
当调用失败时,返回错误信息字符串。 | +| void parser_free(void* parser); | 释放解析器对象内存。 | void* parser: parser_new 生成的对象指针。 | 无。 | \ No newline at end of file diff --git a/docs/zh/06-advanced/05-data-in/plugin-01.png b/docs/zh/06-advanced/05-data-in/plugin-01.png new file mode 100644 index 0000000000000000000000000000000000000000..18bc2ca242e9a3d3b0a67e196994a8e2d3c56d5e GIT binary patch literal 27789 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�g5+@AHo1r69k~Vz;?gLx7 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 UeEexAs49T6ygIyC*8I)?06?E9b^rhX literal 0 HcmV?d00001 From 20d9befb9bd1f4abaec9861de78b269d0287b67f Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 25 Sep 2024 08:45:21 +0800 Subject: [PATCH 25/62] enh: handle memory leak when error occurs --- source/dnode/vnode/src/meta/metaQuery.c | 12 ++++++++++-- source/dnode/vnode/src/meta/metaSnapshot.c | 1 + source/dnode/vnode/src/meta/metaTable.c | 4 ++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/source/dnode/vnode/src/meta/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c index 3f6d17a5a7..14207e7fb3 100644 --- a/source/dnode/vnode/src/meta/metaQuery.c +++ b/source/dnode/vnode/src/meta/metaQuery.c @@ -62,7 +62,10 @@ int metaGetTableEntryByVersion(SMetaReader *pReader, int64_t version, tb_uid_t u tDecoderInit(&pReader->coder, pReader->pBuf, pReader->szBuf); code = metaDecodeEntry(&pReader->coder, &pReader->me); - if (code) return code; + if (code) { + tDecoderClear(&pReader->coder); + return code; + } // taosMemoryFreeClear(pReader->me.colCmpr.pColCmpr); return 0; @@ -393,6 +396,7 @@ _query: tDecoderInit(&dc, pData, nData); int32_t code = metaDecodeEntry(&dc, &me); if (code) { + tDecoderClear(&dc); goto _err; } if (me.type == TSDB_SUPER_TABLE) { @@ -1277,7 +1281,11 @@ int32_t metaFilterTableIds(void *pVnode, SMetaFltParam *arg, SArray *pUids) { tDecoderInit(&dc, pData, nData); - TAOS_CHECK_GOTO(metaDecodeEntry(&dc, &oStbEntry), NULL, END); + code = metaDecodeEntry(&dc, &oStbEntry); + if (code) { + tDecoderClear(&dc); + goto END; + } if (oStbEntry.stbEntry.schemaTag.pSchema == NULL || oStbEntry.stbEntry.schemaTag.pSchema == NULL) { TAOS_CHECK_GOTO(TSDB_CODE_INVALID_PARA, NULL, END); diff --git a/source/dnode/vnode/src/meta/metaSnapshot.c b/source/dnode/vnode/src/meta/metaSnapshot.c index ecd5feeb10..0936d8f092 100644 --- a/source/dnode/vnode/src/meta/metaSnapshot.c +++ b/source/dnode/vnode/src/meta/metaSnapshot.c @@ -605,6 +605,7 @@ int32_t getTableInfoFromSnapshot(SSnapContext* ctx, void** pBuf, int32_t* contLe tDecoderInit(&dc, pVal, vLen); ret = metaDecodeEntry(&dc, &me); if (ret < 0) { + tDecoderClear(&dc); ret = TAOS_GET_TERRNO(ret); goto END; } diff --git a/source/dnode/vnode/src/meta/metaTable.c b/source/dnode/vnode/src/meta/metaTable.c index d489535c02..8814e87140 100644 --- a/source/dnode/vnode/src/meta/metaTable.c +++ b/source/dnode/vnode/src/meta/metaTable.c @@ -565,6 +565,7 @@ int metaAlterSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) { if (ret < 0) { metaError("vgId:%d, failed to decode stb:%s uid:%" PRId64 " since %s", TD_VID(pMeta->pVnode), pReq->name, pReq->suid, tstrerror(ret)); + tDecoderClear(&dc); tdbTbcClose(pTbDbc); tdbTbcClose(pUidIdxc); return terrno; @@ -1504,6 +1505,7 @@ static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type, tb_uid_t *p tDecoderInit(&tdc, tData, tLen); int32_t ret = metaDecodeEntry(&tdc, &stbEntry); if (ret < 0) { + tDecoderClear(&tdc); metaError("vgId:%d, failed to decode child table:%s uid:%" PRId64 " since %s", TD_VID(pMeta->pVnode), e.name, e.ctbEntry.suid, tstrerror(ret)); return ret; @@ -2399,6 +2401,7 @@ static int metaAddTagIndex(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterTb tDecoderInit(&dc, pVal, nVal); ret = metaDecodeEntry(&dc, &stbEntry); if (ret < 0) { + tDecoderClear(&dc); goto _err; } @@ -2540,6 +2543,7 @@ static int metaDropTagIndex(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterT tDecoderInit(&dc, pVal, nVal); ret = metaDecodeEntry(&dc, &stbEntry); if (ret < 0) { + tDecoderClear(&dc); goto _err; } From c54a89b47a2d22f075fa59d3e90635c4c824d28a Mon Sep 17 00:00:00 2001 From: wade zhang <95411902+gccgdb1234@users.noreply.github.com> Date: Wed, 25 Sep 2024 09:01:38 +0800 Subject: [PATCH 26/62] Update 99-parser-plugin.md --- docs/zh/06-advanced/05-data-in/99-parser-plugin.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/zh/06-advanced/05-data-in/99-parser-plugin.md b/docs/zh/06-advanced/05-data-in/99-parser-plugin.md index 7138fc28be..976a5e2c04 100644 --- a/docs/zh/06-advanced/05-data-in/99-parser-plugin.md +++ b/docs/zh/06-advanced/05-data-in/99-parser-plugin.md @@ -3,7 +3,7 @@ title: "数据解析插件" sidebar_label: "数据解析插件" --- -接入消息中间时,如果使用 json/regex 等模式解析器无法满足解析需求,同时 UDT 也无法满足性能需求的情况,可以自定义数据解析插件。 +接入消息中间件时,如果使用 json/regex 等模式解析器无法满足解析需求,同时使用 UDT(自定义解析器) 也无法满足性能需求的情况,可以自定义数据解析插件。 ## 插件概述 @@ -27,4 +27,4 @@ taosX Parser 插件是一个要求用 C/Rust 语言开发的 C ABI 兼容动态 | const char* parser_version() | 版本,方便定位问题。 | 无 | 字符串 | | struct parser_resp_t {
char* e; // Error if null.
void* p; // Success if contains.
}
parser_resp_t parser_new(char* ctx, uint32_t len); | 使用用户自定义配置生成解析器对象或返回错误信息。| char* ctx: 用户自定义配置字符串。
uint32_t len: 该字符串的二进制长度(不含 `\0`)。 | 返回值为结构体。
struct parser_resp_t {
char* e; // Error if null.
void* p; // Success if contains.
}
当创建对象失败时,第一个指针 e 不为 NULL。
当创建成功时,e 为 NULL,p 为解析器对象。 | | const char* parser_mutate(
void* parser,
const uint8_t* in_ptr, uint32_t in_len,
const void* uint8_t* out_ptr, uint32_t* out_len
) | 使用解析器对象对输入 payload 进行解析,返回结果为 JSON 格式 [u8] 。
返回的 JSON 将使用默认的 JSON 解析器进行完全解码(展开根数组和所有的对象)。 | void* parser: parser_new 生成的对象指针。
const uint8_t* in_ptr, uint32_t in_len:输入 Payload 的指针和 bytes 长度(不含 `\0`)。
const void* uint8_t* out_ptr, uint32_t * out_len:输出 JSON 字符串的指针和长度(不含 `\0`)。当 out_ptr 指向为空时,表示输出为空。当 out_ptr 不为空时,应用(taosx)在使用完毕后应当释放该内存空间。| 字符串指针。
当调用成功时,返回值为 NULL。
当调用失败时,返回错误信息字符串。 | -| void parser_free(void* parser); | 释放解析器对象内存。 | void* parser: parser_new 生成的对象指针。 | 无。 | \ No newline at end of file +| void parser_free(void* parser); | 释放解析器对象内存。 | void* parser: parser_new 生成的对象指针。 | 无。 | From 82962c5811f1a5e0648a168854105870a05fecab Mon Sep 17 00:00:00 2001 From: dmchen Date: Tue, 24 Sep 2024 09:20:06 +0000 Subject: [PATCH 27/62] fix/TD-31891-remove-void-monitor3 --- source/libs/monitor/src/monFramework.c | 60 +++++-- source/libs/monitor/src/monMain.c | 209 ++++++++++++++----------- 2 files changed, 159 insertions(+), 110 deletions(-) diff --git a/source/libs/monitor/src/monFramework.c b/source/libs/monitor/src/monFramework.c index 76473ccbb1..1e358ac8d4 100644 --- a/source/libs/monitor/src/monFramework.c +++ b/source/libs/monitor/src/monFramework.c @@ -100,7 +100,9 @@ extern char* tsMonFwUri; #define VNODE_ROLE "taosd_vnodes_info:role" void monInitMonitorFW(){ - (void)taos_collector_registry_default_init(); + if (taos_collector_registry_default_init() != 0) { + uError("failed to init default collector registry"); + } tsMonitor.metrics = taosHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK); taos_gauge_t *gauge = NULL; @@ -115,7 +117,9 @@ void monInitMonitorFW(){ for(int32_t i = 0; i < 25; i++){ gauge= taos_gauge_new(dnodes_gauges[i], "", dnodes_label_count, dnodes_sample_labels); if(taos_collector_registry_register_metric(gauge) == 1){ - (void)taos_counter_destroy(gauge); + if (taos_counter_destroy(gauge) != 0) { + uError("failed to delete metric %s", dnodes_gauges[i]); + } } if (taosHashPut(tsMonitor.metrics, dnodes_gauges[i], strlen(dnodes_gauges[i]), &gauge, sizeof(taos_gauge_t *)) != 0) { @@ -129,7 +133,9 @@ void monInitMonitorFW(){ for(int32_t i = 0; i < 3; i++){ gauge= taos_gauge_new(dnodes_data_gauges[i], "", dnodes_data_label_count, dnodes_data_sample_labels); if(taos_collector_registry_register_metric(gauge) == 1){ - (void)taos_counter_destroy(gauge); + if (taos_counter_destroy(gauge) != 0) { + uError("failed to delete metric %s", dnodes_data_gauges[i]); + } } if (taosHashPut(tsMonitor.metrics, dnodes_data_gauges[i], strlen(dnodes_data_gauges[i]), &gauge, sizeof(taos_gauge_t *)) != 0) { @@ -143,7 +149,9 @@ void monInitMonitorFW(){ for(int32_t i = 0; i < 3; i++){ gauge= taos_gauge_new(dnodes_log_gauges[i], "", dnodes_log_label_count, dnodes_log_sample_labels); if(taos_collector_registry_register_metric(gauge) == 1){ - (void)taos_counter_destroy(gauge); + if (taos_counter_destroy(gauge) != 0) { + uError("failed to delete metric %s", dnodes_log_gauges[i]); + } } if (taosHashPut(tsMonitor.metrics, dnodes_log_gauges[i], strlen(dnodes_log_gauges[i]), &gauge, sizeof(taos_gauge_t *)) != 0) { @@ -154,7 +162,9 @@ void monInitMonitorFW(){ void monCleanupMonitorFW(){ taosHashCleanup(tsMonitor.metrics); - (void)taos_collector_registry_destroy(TAOS_COLLECTOR_REGISTRY_DEFAULT); + if (taos_collector_registry_destroy(TAOS_COLLECTOR_REGISTRY_DEFAULT) != 0) { + uError("failed to destroy default collector registry"); + } TAOS_COLLECTOR_REGISTRY_DEFAULT = NULL; } @@ -174,7 +184,9 @@ void monGenClusterInfoTable(SMonInfo *pMonitor){ uError("failed to delete metric %s", metric_names[i]); } - (void)taosHashRemove(tsMonitor.metrics, metric_names[i], strlen(metric_names[i])); + if (taosHashRemove(tsMonitor.metrics, metric_names[i], strlen(metric_names[i])) != 0) { + uError("failed to remove metric %s", metric_names[i]); + } } if(pBasicInfo->cluster_id == 0) { @@ -191,7 +203,9 @@ void monGenClusterInfoTable(SMonInfo *pMonitor){ for(int32_t i = 0; i < 18; i++){ gauge= taos_gauge_new(metric_names[i], "", label_count, sample_labels1); if(taos_collector_registry_register_metric(gauge) == 1){ - (void)taos_counter_destroy(gauge); + if (taos_counter_destroy(gauge) != 0) { + uError("failed to delete metric %s", metric_names[i]); + } } if (taosHashPut(tsMonitor.metrics, metric_names[i], strlen(metric_names[i]), &gauge, sizeof(taos_gauge_t *)) != 0) { uError("failed to add cluster gauge at%d:%s", i, metric_names[i]); @@ -317,11 +331,15 @@ void monGenVgroupInfoTable(SMonInfo *pMonitor){ const char *vgroup_sample_labels[] = {"cluster_id", "vgroup_id", "database_name"}; taos_gauge_t *tableNumGauge = taos_gauge_new(TABLES_NUM, "", vgroup_label_count, vgroup_sample_labels); if(taos_collector_registry_register_metric(tableNumGauge) == 1){ - (void)taos_counter_destroy(tableNumGauge); + if (taos_counter_destroy(tableNumGauge) != 0) { + uError("failed to delete metric " TABLES_NUM); + } } taos_gauge_t *statusGauge = taos_gauge_new(STATUS, "", vgroup_label_count, vgroup_sample_labels); if(taos_collector_registry_register_metric(statusGauge) == 1){ - (void)taos_counter_destroy(statusGauge); + if (taos_counter_destroy(statusGauge) != 0) { + uError("failed to delete metric " STATUS); + } } char cluster_id[TSDB_CLUSTER_ID_LEN] = {0}; @@ -530,7 +548,9 @@ void monGenDnodeStatusInfoTable(SMonInfo *pMonitor){ gauge= taos_gauge_new(DNODE_STATUS, "", dnodes_label_count, dnodes_sample_labels); if(taos_collector_registry_register_metric(gauge) == 1){ - (void)taos_counter_destroy(gauge); + if (taos_counter_destroy(gauge) != 0) { + uError("failed to delete metric " DNODE_STATUS); + } } char cluster_id[TSDB_CLUSTER_ID_LEN]; @@ -633,7 +653,9 @@ void monGenMnodeRoleTable(SMonInfo *pMonitor){ uError("failed to delete metric %s", mnodes_role_gauges[i]); } - (void)taosHashRemove(tsMonitor.metrics, mnodes_role_gauges[i], strlen(mnodes_role_gauges[i])); + if (taosHashRemove(tsMonitor.metrics, mnodes_role_gauges[i], strlen(mnodes_role_gauges[i])) != 0) { + uError("failed to remove metric %s", mnodes_role_gauges[i]); + } } SMonClusterInfo *pInfo = &pMonitor->mmInfo.cluster; @@ -647,7 +669,9 @@ void monGenMnodeRoleTable(SMonInfo *pMonitor){ for(int32_t i = 0; i < 1; i++){ gauge= taos_gauge_new(mnodes_role_gauges[i], "", mnodes_role_label_count, mnodes_role_sample_labels); if(taos_collector_registry_register_metric(gauge) == 1){ - (void)taos_counter_destroy(gauge); + if (taos_counter_destroy(gauge) != 0) { + uError("failed to destroy gauge"); + } } if (taosHashPut(tsMonitor.metrics, mnodes_role_gauges[i], strlen(mnodes_role_gauges[i]), &gauge, sizeof(taos_gauge_t *)) != 0) { @@ -702,7 +726,9 @@ void monGenVnodeRoleTable(SMonInfo *pMonitor){ uError("failed to delete metric %s", vnodes_role_gauges[i]); } - (void)taosHashRemove(tsMonitor.metrics, vnodes_role_gauges[i], strlen(vnodes_role_gauges[i])); + if (taosHashRemove(tsMonitor.metrics, vnodes_role_gauges[i], strlen(vnodes_role_gauges[i])) != 0) { + uError("failed to remove metric %s", vnodes_role_gauges[i]); + } } SMonVgroupInfo *pInfo = &pMonitor->mmInfo.vgroup; @@ -716,7 +742,9 @@ void monGenVnodeRoleTable(SMonInfo *pMonitor){ for(int32_t i = 0; i < 1; i++){ gauge= taos_gauge_new(vnodes_role_gauges[i], "", vnodes_role_label_count, vnodes_role_sample_labels); if(taos_collector_registry_register_metric(gauge) == 1){ - (void)taos_counter_destroy(gauge); + if (taos_counter_destroy(gauge) != 0) { + uError("failed to destroy gauge"); + } } if (taosHashPut(tsMonitor.metrics, vnodes_role_gauges[i], strlen(vnodes_role_gauges[i]), &gauge, sizeof(taos_gauge_t *)) != 0) { @@ -774,7 +802,9 @@ void monSendPromReport() { tmp) != 0) { uError("failed to send monitor msg"); } else { - (void)taos_collector_registry_clear_batch(TAOS_COLLECTOR_REGISTRY_DEFAULT); + if (taos_collector_registry_clear_batch(TAOS_COLLECTOR_REGISTRY_DEFAULT) != 0) { + uError("failed to clear batch"); + } } taosMemoryFreeClear(pCont); } diff --git a/source/libs/monitor/src/monMain.c b/source/libs/monitor/src/monMain.c index f581d8c83d..ba075e996a 100644 --- a/source/libs/monitor/src/monMain.c +++ b/source/libs/monitor/src/monMain.c @@ -145,7 +145,9 @@ void monInitVnode() { counter = taos_counter_new(VNODE_METRIC_SQL_COUNT, "counter for insert sql", label_count, sample_labels); uDebug("new metric:%p", counter); if (taos_collector_registry_register_metric(counter) == 1) { - (void)taos_counter_destroy(counter); + if (taos_counter_destroy(counter) != 0) { + uError("failed to destroy metric:%p", counter); + } uError("failed to register metric:%p", counter); } else { tsInsertCounter = counter; @@ -226,14 +228,17 @@ static void monGenBasicJson(SMonInfo *pMonitor) { SJson *pJson = pMonitor->pJson; char buf[40] = {0}; - (void)taosFormatUtcTime(buf, sizeof(buf), pMonitor->curTime, TSDB_TIME_PRECISION_MILLI); + if (taosFormatUtcTime(buf, sizeof(buf), pMonitor->curTime, TSDB_TIME_PRECISION_MILLI) == 0) { + uError("failed to format time"); + return; + } - (void)tjsonAddStringToObject(pJson, "ts", buf); - (void)tjsonAddDoubleToObject(pJson, "dnode_id", pInfo->dnode_id); - (void)tjsonAddStringToObject(pJson, "dnode_ep", pInfo->dnode_ep); + if (tjsonAddStringToObject(pJson, "ts", buf) != 0) uError("failed to add ts"); + if (tjsonAddDoubleToObject(pJson, "dnode_id", pInfo->dnode_id) != 0) uError("failed to add dnode_id"); + if (tjsonAddStringToObject(pJson, "dnode_ep", pInfo->dnode_ep) != 0) uError("failed to add dnode_ep"); snprintf(buf, sizeof(buf), "%" PRId64, pInfo->cluster_id); - (void)tjsonAddStringToObject(pJson, "cluster_id", buf); - (void)tjsonAddDoubleToObject(pJson, "protocol", pInfo->protocol); + if (tjsonAddStringToObject(pJson, "cluster_id", buf) != 0) uError("failed to add cluster_id"); + if (tjsonAddDoubleToObject(pJson, "protocol", pInfo->protocol) != 0) uError("failed to add protocol"); } static void monGenBasicJsonBasic(SMonInfo *pMonitor) { @@ -244,12 +249,12 @@ static void monGenBasicJsonBasic(SMonInfo *pMonitor) { char buf[40] = {0}; sprintf(buf, "%" PRId64, taosGetTimestamp(TSDB_TIME_PRECISION_MILLI)); - (void)tjsonAddStringToObject(pJson, "ts", buf); - (void)tjsonAddDoubleToObject(pJson, "dnode_id", pInfo->dnode_id); - (void)tjsonAddStringToObject(pJson, "dnode_ep", pInfo->dnode_ep); + if (tjsonAddStringToObject(pJson, "ts", buf) != 0) uError("failed to add ts"); + if (tjsonAddDoubleToObject(pJson, "dnode_id", pInfo->dnode_id) != 0) uError("failed to add dnode_id"); + if (tjsonAddStringToObject(pJson, "dnode_ep", pInfo->dnode_ep) != 0) uError("failed to add dnode_ep"); snprintf(buf, sizeof(buf), "%" PRId64, pInfo->cluster_id); - (void)tjsonAddStringToObject(pJson, "cluster_id", buf); - (void)tjsonAddDoubleToObject(pJson, "protocol", pInfo->protocol); + if (tjsonAddStringToObject(pJson, "cluster_id", buf) != 0) uError("failed to add cluster_id"); + if (tjsonAddDoubleToObject(pJson, "protocol", pInfo->protocol) != 0) uError("failed to add protocol"); } static void monGenClusterJson(SMonInfo *pMonitor) { @@ -263,21 +268,24 @@ static void monGenClusterJson(SMonInfo *pMonitor) { return; } - (void)tjsonAddStringToObject(pJson, "first_ep", pInfo->first_ep); - (void)tjsonAddDoubleToObject(pJson, "first_ep_dnode_id", pInfo->first_ep_dnode_id); - (void)tjsonAddStringToObject(pJson, "version", pInfo->version); - (void)tjsonAddDoubleToObject(pJson, "master_uptime", pInfo->master_uptime); - (void)tjsonAddDoubleToObject(pJson, "monitor_interval", pInfo->monitor_interval); - (void)tjsonAddDoubleToObject(pJson, "dbs_total", pInfo->dbs_total); - (void)tjsonAddDoubleToObject(pJson, "tbs_total", pInfo->tbs_total); - (void)tjsonAddDoubleToObject(pJson, "stbs_total", pInfo->stbs_total); - (void)tjsonAddDoubleToObject(pJson, "vgroups_total", pInfo->vgroups_total); - (void)tjsonAddDoubleToObject(pJson, "vgroups_alive", pInfo->vgroups_alive); - (void)tjsonAddDoubleToObject(pJson, "vnodes_total", pInfo->vnodes_total); - (void)tjsonAddDoubleToObject(pJson, "vnodes_alive", pInfo->vnodes_alive); - (void)tjsonAddDoubleToObject(pJson, "connections_total", pInfo->connections_total); - (void)tjsonAddDoubleToObject(pJson, "topics_total", pInfo->topics_toal); - (void)tjsonAddDoubleToObject(pJson, "streams_total", pInfo->streams_total); + if (tjsonAddStringToObject(pJson, "first_ep", pInfo->first_ep) != 0) uError("failed to add first_ep"); + if (tjsonAddDoubleToObject(pJson, "first_ep_dnode_id", pInfo->first_ep_dnode_id) != 0) + uError("failed to add first_ep_dnode_id"); + if (tjsonAddStringToObject(pJson, "version", pInfo->version) != 0) uError("failed to add version"); + if (tjsonAddDoubleToObject(pJson, "master_uptime", pInfo->master_uptime) != 0) uError("failed to add master_uptime"); + if (tjsonAddDoubleToObject(pJson, "monitor_interval", pInfo->monitor_interval) != 0) + uError("failed to add monitor_interval"); + if (tjsonAddDoubleToObject(pJson, "dbs_total", pInfo->dbs_total) != 0) uError("failed to add dbs_total"); + if (tjsonAddDoubleToObject(pJson, "tbs_total", pInfo->tbs_total) != 0) uError("failed to add tbs_total"); + if (tjsonAddDoubleToObject(pJson, "stbs_total", pInfo->stbs_total) != 0) uError("failed to add stbs_total"); + if (tjsonAddDoubleToObject(pJson, "vgroups_total", pInfo->vgroups_total) != 0) uError("failed to add vgroups_total"); + if (tjsonAddDoubleToObject(pJson, "vgroups_alive", pInfo->vgroups_alive) != 0) uError("failed to add vgroups_alive"); + if (tjsonAddDoubleToObject(pJson, "vnodes_total", pInfo->vnodes_total) != 0) uError("failed to add vnodes_total"); + if (tjsonAddDoubleToObject(pJson, "vnodes_alive", pInfo->vnodes_alive) != 0) uError("failed to add vnodes_alive"); + if (tjsonAddDoubleToObject(pJson, "connections_total", pInfo->connections_total) != 0) + uError("failed to add connections_total"); + if (tjsonAddDoubleToObject(pJson, "topics_total", pInfo->topics_toal) != 0) uError("failed to add topics_total"); + if (tjsonAddDoubleToObject(pJson, "streams_total", pInfo->streams_total) != 0) uError("failed to add streams_total"); SJson *pDnodesJson = tjsonAddArrayToObject(pJson, "dnodes"); if (pDnodesJson == NULL) return; @@ -287,9 +295,9 @@ static void monGenClusterJson(SMonInfo *pMonitor) { if (pDnodeJson == NULL) continue; SMonDnodeDesc *pDnodeDesc = taosArrayGet(pInfo->dnodes, i); - (void)tjsonAddDoubleToObject(pDnodeJson, "dnode_id", pDnodeDesc->dnode_id); - (void)tjsonAddStringToObject(pDnodeJson, "dnode_ep", pDnodeDesc->dnode_ep); - (void)tjsonAddStringToObject(pDnodeJson, "status", pDnodeDesc->status); + if (tjsonAddDoubleToObject(pDnodeJson, "dnode_id", pDnodeDesc->dnode_id) != 0) uError("failed to add dnode_id"); + if (tjsonAddStringToObject(pDnodeJson, "dnode_ep", pDnodeDesc->dnode_ep) != 0) uError("failed to add dnode_ep"); + if (tjsonAddStringToObject(pDnodeJson, "status", pDnodeDesc->status) != 0) uError("failed to add status"); if (tjsonAddItemToArray(pDnodesJson, pDnodeJson) != 0) tjsonDelete(pDnodeJson); } @@ -302,9 +310,9 @@ static void monGenClusterJson(SMonInfo *pMonitor) { if (pMnodeJson == NULL) continue; SMonMnodeDesc *pMnodeDesc = taosArrayGet(pInfo->mnodes, i); - (void)tjsonAddDoubleToObject(pMnodeJson, "mnode_id", pMnodeDesc->mnode_id); - (void)tjsonAddStringToObject(pMnodeJson, "mnode_ep", pMnodeDesc->mnode_ep); - (void)tjsonAddStringToObject(pMnodeJson, "role", pMnodeDesc->role); + if (tjsonAddDoubleToObject(pMnodeJson, "mnode_id", pMnodeDesc->mnode_id) != 0) uError("failed to add mnode_id"); + if (tjsonAddStringToObject(pMnodeJson, "mnode_ep", pMnodeDesc->mnode_ep) != 0) uError("failed to add mnode_ep"); + if (tjsonAddStringToObject(pMnodeJson, "role", pMnodeDesc->role) != 0) uError("failed to add role"); if (tjsonAddItemToArray(pMnodesJson, pMnodeJson) != 0) tjsonDelete(pMnodeJson); } @@ -314,11 +322,11 @@ static void monGenClusterJsonBasic(SMonInfo *pMonitor) { SMonClusterInfo *pInfo = &pMonitor->mmInfo.cluster; if (pMonitor->mmInfo.cluster.first_ep_dnode_id == 0) return; - // (void)tjsonAddStringToObject(pMonitor->pJson, "first_ep", pInfo->first_ep); - (void)tjsonAddStringToObject(pMonitor->pJson, "first_ep", tsFirst); - (void)tjsonAddDoubleToObject(pMonitor->pJson, "first_ep_dnode_id", pInfo->first_ep_dnode_id); - (void)tjsonAddStringToObject(pMonitor->pJson, "cluster_version", pInfo->version); - // (void)tjsonAddDoubleToObject(pMonitor->pJson, "monitor_interval", pInfo->monitor_interval); + if (tjsonAddStringToObject(pMonitor->pJson, "first_ep", tsFirst) != 0) uError("failed to add first_ep"); + if (tjsonAddDoubleToObject(pMonitor->pJson, "first_ep_dnode_id", pInfo->first_ep_dnode_id) != 0) + uError("failed to add first_ep_dnode_id"); + if (tjsonAddStringToObject(pMonitor->pJson, "cluster_version", pInfo->version) != 0) + uError("failed to add cluster_version"); } static void monGenVgroupJson(SMonInfo *pMonitor) { @@ -337,10 +345,13 @@ static void monGenVgroupJson(SMonInfo *pMonitor) { } SMonVgroupDesc *pVgroupDesc = taosArrayGet(pInfo->vgroups, i); - (void)tjsonAddDoubleToObject(pVgroupJson, "vgroup_id", pVgroupDesc->vgroup_id); - (void)tjsonAddStringToObject(pVgroupJson, "database_name", pVgroupDesc->database_name); - (void)tjsonAddDoubleToObject(pVgroupJson, "tables_num", pVgroupDesc->tables_num); - (void)tjsonAddStringToObject(pVgroupJson, "status", pVgroupDesc->status); + if (tjsonAddDoubleToObject(pVgroupJson, "vgroup_id", pVgroupDesc->vgroup_id) != 0) + uError("failed to add vgroup_id"); + if (tjsonAddStringToObject(pVgroupJson, "database_name", pVgroupDesc->database_name) != 0) + uError("failed to add database_name"); + if (tjsonAddDoubleToObject(pVgroupJson, "tables_num", pVgroupDesc->tables_num) != 0) + uError("failed to add tables_num"); + if (tjsonAddStringToObject(pVgroupJson, "status", pVgroupDesc->status) != 0) uError("failed to add status"); SJson *pVnodesJson = tjsonAddArrayToObject(pVgroupJson, "vnodes"); if (pVnodesJson == NULL) continue; @@ -352,8 +363,9 @@ static void monGenVgroupJson(SMonInfo *pMonitor) { SJson *pVnodeJson = tjsonCreateObject(); if (pVnodeJson == NULL) continue; - (void)tjsonAddDoubleToObject(pVnodeJson, "dnode_id", pVnodeDesc->dnode_id); - (void)tjsonAddStringToObject(pVnodeJson, "vnode_role", pVnodeDesc->vnode_role); + if (tjsonAddDoubleToObject(pVnodeJson, "dnode_id", pVnodeDesc->dnode_id) != 0) uError("failed to add dnode_id"); + if (tjsonAddStringToObject(pVnodeJson, "vnode_role", pVnodeDesc->vnode_role) != 0) + uError("failed to add vnode_role"); if (tjsonAddItemToArray(pVnodesJson, pVnodeJson) != 0) tjsonDelete(pVnodeJson); } @@ -376,8 +388,9 @@ static void monGenStbJson(SMonInfo *pMonitor) { } SMonStbDesc *pStbDesc = taosArrayGet(pInfo->stbs, i); - (void)tjsonAddStringToObject(pStbJson, "stb_name", pStbDesc->stb_name); - (void)tjsonAddStringToObject(pStbJson, "database_name", pStbDesc->database_name); + if (tjsonAddStringToObject(pStbJson, "stb_name", pStbDesc->stb_name) != 0) uError("failed to add stb_name"); + if (tjsonAddStringToObject(pStbJson, "database_name", pStbDesc->database_name) != 0) + uError("failed to add database_name"); } } @@ -392,9 +405,11 @@ static void monGenGrantJson(SMonInfo *pMonitor) { return; } - (void)tjsonAddDoubleToObject(pJson, "expire_time", pInfo->expire_time); - (void)tjsonAddDoubleToObject(pJson, "timeseries_used", pInfo->timeseries_used); - (void)tjsonAddDoubleToObject(pJson, "timeseries_total", pInfo->timeseries_total); + if (tjsonAddDoubleToObject(pJson, "expire_time", pInfo->expire_time) != 0) uError("failed to add expire_time"); + if (tjsonAddDoubleToObject(pJson, "timeseries_used", pInfo->timeseries_used) != 0) + uError("failed to add timeseries_used"); + if (tjsonAddDoubleToObject(pJson, "timeseries_total", pInfo->timeseries_total) != 0) + uError("failed to add timeseries_total"); } static void monGenDnodeJson(SMonInfo *pMonitor) { @@ -451,36 +466,40 @@ static void monGenDnodeJson(SMonInfo *pMonitor) { double io_read_disk_rate = io_read_disk / interval; double io_write_disk_rate = io_write_disk / interval; - (void)tjsonAddDoubleToObject(pJson, "uptime", pInfo->uptime); - (void)tjsonAddDoubleToObject(pJson, "cpu_engine", cpu_engine); - (void)tjsonAddDoubleToObject(pJson, "cpu_system", pSys->cpu_system); - (void)tjsonAddDoubleToObject(pJson, "cpu_cores", pSys->cpu_cores); - (void)tjsonAddDoubleToObject(pJson, "mem_engine", mem_engine); - (void)tjsonAddDoubleToObject(pJson, "mem_system", pSys->mem_system); - (void)tjsonAddDoubleToObject(pJson, "mem_total", pSys->mem_total); - (void)tjsonAddDoubleToObject(pJson, "disk_engine", pSys->disk_engine); - (void)tjsonAddDoubleToObject(pJson, "disk_used", pSys->disk_used); - (void)tjsonAddDoubleToObject(pJson, "disk_total", pSys->disk_total); - (void)tjsonAddDoubleToObject(pJson, "net_in", net_in_rate); - (void)tjsonAddDoubleToObject(pJson, "net_out", net_out_rate); - (void)tjsonAddDoubleToObject(pJson, "io_read", io_read_rate); - (void)tjsonAddDoubleToObject(pJson, "io_write", io_write_rate); - (void)tjsonAddDoubleToObject(pJson, "io_read_disk", io_read_disk_rate); - (void)tjsonAddDoubleToObject(pJson, "io_write_disk", io_write_disk_rate); - (void)tjsonAddDoubleToObject(pJson, "req_select", pStat->numOfSelectReqs); - (void)tjsonAddDoubleToObject(pJson, "req_select_rate", req_select_rate); - (void)tjsonAddDoubleToObject(pJson, "req_insert", pStat->numOfInsertReqs); - (void)tjsonAddDoubleToObject(pJson, "req_insert_success", pStat->numOfInsertSuccessReqs); - (void)tjsonAddDoubleToObject(pJson, "req_insert_rate", req_insert_rate); - (void)tjsonAddDoubleToObject(pJson, "req_insert_batch", pStat->numOfBatchInsertReqs); - (void)tjsonAddDoubleToObject(pJson, "req_insert_batch_success", pStat->numOfBatchInsertSuccessReqs); - (void)tjsonAddDoubleToObject(pJson, "req_insert_batch_rate", req_insert_batch_rate); - (void)tjsonAddDoubleToObject(pJson, "errors", pStat->errors); - (void)tjsonAddDoubleToObject(pJson, "vnodes_num", pStat->totalVnodes); - (void)tjsonAddDoubleToObject(pJson, "masters", pStat->masterNum); - (void)tjsonAddDoubleToObject(pJson, "has_mnode", pInfo->has_mnode); - (void)tjsonAddDoubleToObject(pJson, "has_qnode", pInfo->has_qnode); - (void)tjsonAddDoubleToObject(pJson, "has_snode", pInfo->has_snode); + if (tjsonAddDoubleToObject(pJson, "uptime", pInfo->uptime) != 0) uError("failed to add uptime"); + if (tjsonAddDoubleToObject(pJson, "cpu_engine", cpu_engine) != 0) uError("failed to add cpu_engine"); + if (tjsonAddDoubleToObject(pJson, "cpu_system", pSys->cpu_system) != 0) uError("failed to add cpu_system"); + if (tjsonAddDoubleToObject(pJson, "cpu_cores", pSys->cpu_cores) != 0) uError("failed to add cpu_cores"); + if (tjsonAddDoubleToObject(pJson, "mem_engine", mem_engine) != 0) uError("failed to add mem_engine"); + if (tjsonAddDoubleToObject(pJson, "mem_system", pSys->mem_system) != 0) uError("failed to add mem_system"); + if (tjsonAddDoubleToObject(pJson, "mem_total", pSys->mem_total) != 0) uError("failed to add mem_total"); + if (tjsonAddDoubleToObject(pJson, "disk_engine", pSys->disk_engine) != 0) uError("failed to add disk_engine"); + if (tjsonAddDoubleToObject(pJson, "disk_used", pSys->disk_used) != 0) uError("failed to add disk_used"); + if (tjsonAddDoubleToObject(pJson, "disk_total", pSys->disk_total) != 0) uError("failed to add disk_total"); + if (tjsonAddDoubleToObject(pJson, "net_in", net_in_rate) != 0) uError("failed to add net_in"); + if (tjsonAddDoubleToObject(pJson, "net_out", net_out_rate) != 0) uError("failed to add net_out"); + if (tjsonAddDoubleToObject(pJson, "io_read", io_read_rate) != 0) uError("failed to add io_read"); + if (tjsonAddDoubleToObject(pJson, "io_write", io_write_rate) != 0) uError("failed to add io_write"); + if (tjsonAddDoubleToObject(pJson, "io_read_disk", io_read_disk_rate) != 0) uError("failed to add io_read_disk"); + if (tjsonAddDoubleToObject(pJson, "io_write_disk", io_write_disk_rate) != 0) uError("failed to add io_write_disk"); + if (tjsonAddDoubleToObject(pJson, "req_select", pStat->numOfSelectReqs) != 0) uError("failed to add req_select"); + if (tjsonAddDoubleToObject(pJson, "req_select_rate", req_select_rate) != 0) uError("failed to add req_select_rate"); + if (tjsonAddDoubleToObject(pJson, "req_insert", pStat->numOfInsertReqs) != 0) uError("failed to add req_insert"); + if (tjsonAddDoubleToObject(pJson, "req_insert_success", pStat->numOfInsertSuccessReqs) != 0) + uError("failed to add req_insert_success"); + if (tjsonAddDoubleToObject(pJson, "req_insert_rate", req_insert_rate) != 0) uError("failed to add req_insert_rate"); + if (tjsonAddDoubleToObject(pJson, "req_insert_batch", pStat->numOfBatchInsertReqs) != 0) + uError("failed to add req_insert_batch"); + if (tjsonAddDoubleToObject(pJson, "req_insert_batch_success", pStat->numOfBatchInsertSuccessReqs) != 0) + uError("failed to add req_insert_batch_success"); + if (tjsonAddDoubleToObject(pJson, "req_insert_batch_rate", req_insert_batch_rate) != 0) + uError("failed to add req_insert_batch_rate"); + if (tjsonAddDoubleToObject(pJson, "errors", pStat->errors) != 0) uError("failed to add errors"); + if (tjsonAddDoubleToObject(pJson, "vnodes_num", pStat->totalVnodes) != 0) uError("failed to add vnodes_num"); + if (tjsonAddDoubleToObject(pJson, "masters", pStat->masterNum) != 0) uError("failed to add masters"); + if (tjsonAddDoubleToObject(pJson, "has_mnode", pInfo->has_mnode) != 0) uError("failed to add has_mnode"); + if (tjsonAddDoubleToObject(pJson, "has_qnode", pInfo->has_qnode) != 0) uError("failed to add has_qnode"); + if (tjsonAddDoubleToObject(pJson, "has_snode", pInfo->has_snode) != 0) uError("failed to add has_snode"); } static void monGenDiskJson(SMonInfo *pMonitor) { @@ -515,18 +534,18 @@ static void monGenDiskJson(SMonInfo *pMonitor) { SJson *pLogdirJson = tjsonCreateObject(); if (pLogdirJson == NULL) return; if (tjsonAddItemToObject(pJson, "logdir", pLogdirJson) != 0) return; - (void)tjsonAddStringToObject(pLogdirJson, "name", pLogDesc->name); - (void)tjsonAddDoubleToObject(pLogdirJson, "avail", pLogDesc->size.avail); - (void)tjsonAddDoubleToObject(pLogdirJson, "used", pLogDesc->size.used); - (void)tjsonAddDoubleToObject(pLogdirJson, "total", pLogDesc->size.total); + if (tjsonAddStringToObject(pLogdirJson, "name", pLogDesc->name) != 0) uError("failed to add string to json"); + if (tjsonAddDoubleToObject(pLogdirJson, "avail", pLogDesc->size.avail) != 0) uError("failed to add double to json"); + if (tjsonAddDoubleToObject(pLogdirJson, "used", pLogDesc->size.used) != 0) uError("failed to add double to json"); + if (tjsonAddDoubleToObject(pLogdirJson, "total", pLogDesc->size.total) != 0) uError("failed to add double to json"); SJson *pTempdirJson = tjsonCreateObject(); if (pTempdirJson == NULL) return; if (tjsonAddItemToObject(pJson, "tempdir", pTempdirJson) != 0) return; - (void)tjsonAddStringToObject(pTempdirJson, "name", pTempDesc->name); - (void)tjsonAddDoubleToObject(pTempdirJson, "avail", pTempDesc->size.avail); - (void)tjsonAddDoubleToObject(pTempdirJson, "used", pTempDesc->size.used); - (void)tjsonAddDoubleToObject(pTempdirJson, "total", pTempDesc->size.total); + if (tjsonAddStringToObject(pTempdirJson, "name", pTempDesc->name) != 0) uError("failed to add string to json"); + if (tjsonAddDoubleToObject(pTempdirJson, "avail", pTempDesc->size.avail) != 0) uError("failed to add double to json"); + if (tjsonAddDoubleToObject(pTempdirJson, "used", pTempDesc->size.used) != 0) uError("failed to add double to json"); + if (tjsonAddDoubleToObject(pTempdirJson, "total", pTempDesc->size.total) != 0) uError("failed to add double to json"); } static const char *monLogLevelStr(ELogLevel level) { @@ -571,26 +590,26 @@ static void monGenLogJson(SMonInfo *pMonitor) { SJson *pLogError = tjsonCreateObject(); if (pLogError == NULL) return; - (void)tjsonAddStringToObject(pLogError, "level", "error"); - (void)tjsonAddDoubleToObject(pLogError, "total", numOfErrorLogs); + if (tjsonAddStringToObject(pLogError, "level", "error") != 0) uError("failed to add string to json"); + if (tjsonAddDoubleToObject(pLogError, "total", numOfErrorLogs) != 0) uError("failed to add double to json"); if (tjsonAddItemToArray(pSummaryJson, pLogError) != 0) tjsonDelete(pLogError); SJson *pLogInfo = tjsonCreateObject(); if (pLogInfo == NULL) return; - (void)tjsonAddStringToObject(pLogInfo, "level", "info"); - (void)tjsonAddDoubleToObject(pLogInfo, "total", numOfInfoLogs); + if (tjsonAddStringToObject(pLogInfo, "level", "info") != 0) uError("failed to add string to json"); + if (tjsonAddDoubleToObject(pLogInfo, "total", numOfInfoLogs) != 0) uError("failed to add double to json"); if (tjsonAddItemToArray(pSummaryJson, pLogInfo) != 0) tjsonDelete(pLogInfo); SJson *pLogDebug = tjsonCreateObject(); if (pLogDebug == NULL) return; - (void)tjsonAddStringToObject(pLogDebug, "level", "debug"); - (void)tjsonAddDoubleToObject(pLogDebug, "total", numOfDebugLogs); + if (tjsonAddStringToObject(pLogDebug, "level", "debug") != 0) uError("failed to add string to json"); + if (tjsonAddDoubleToObject(pLogDebug, "total", numOfDebugLogs) != 0) uError("failed to add double to json"); if (tjsonAddItemToArray(pSummaryJson, pLogDebug) != 0) tjsonDelete(pLogDebug); SJson *pLogTrace = tjsonCreateObject(); if (pLogTrace == NULL) return; - (void)tjsonAddStringToObject(pLogTrace, "level", "trace"); - (void)tjsonAddDoubleToObject(pLogTrace, "total", numOfTraceLogs); + if (tjsonAddStringToObject(pLogTrace, "level", "trace") != 0) uError("failed to add string to json"); + if (tjsonAddDoubleToObject(pLogTrace, "total", numOfTraceLogs) != 0) uError("failed to add double to json"); if (tjsonAddItemToArray(pSummaryJson, pLogTrace) != 0) tjsonDelete(pLogTrace); } From 9f3990b8ed5cbff1ea62b1170e9ef309f2d27015 Mon Sep 17 00:00:00 2001 From: dmchen Date: Wed, 25 Sep 2024 01:10:24 +0000 Subject: [PATCH 28/62] fix/TD-31891-remove-void-monitor3-fix-case --- source/libs/monitor/src/monMain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/monitor/src/monMain.c b/source/libs/monitor/src/monMain.c index ba075e996a..744177b7a1 100644 --- a/source/libs/monitor/src/monMain.c +++ b/source/libs/monitor/src/monMain.c @@ -228,7 +228,7 @@ static void monGenBasicJson(SMonInfo *pMonitor) { SJson *pJson = pMonitor->pJson; char buf[40] = {0}; - if (taosFormatUtcTime(buf, sizeof(buf), pMonitor->curTime, TSDB_TIME_PRECISION_MILLI) == 0) { + if (taosFormatUtcTime(buf, sizeof(buf), pMonitor->curTime, TSDB_TIME_PRECISION_MILLI) != 0) { uError("failed to format time"); return; } From 92146c510adf2fb4f149b62dc1d1396b2bf71fd3 Mon Sep 17 00:00:00 2001 From: kailixu Date: Wed, 25 Sep 2024 09:22:56 +0800 Subject: [PATCH 29/62] fix: unify the error code when drop stable --- source/libs/parser/src/parTranslater.c | 9 +++++--- tests/system-test/1-insert/drop.py | 29 +++++++++++++++++++------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 798793bf55..3781479f36 100755 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -14705,7 +14705,7 @@ static int32_t rewriteDropSuperTablewithOpt(STranslateContext* pCxt, SQuery* pQu break; } if (!isdigit(pStmt->tableName[i])) { - return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_TABLE_NOT_EXIST, "Table does not exist: `%s`.`%s`", + return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_TABLE_NOT_EXIST, "STable not exist: `%s`.`%s`", pStmt->dbName, pStmt->tableName); } } @@ -14715,8 +14715,11 @@ static int32_t rewriteDropSuperTablewithOpt(STranslateContext* pCxt, SQuery* pQu toName(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, &name); code = getTargetName(pCxt, &name, pTableName); if (TSDB_CODE_SUCCESS != code) { - return generateSyntaxErrMsgExt(&pCxt->msgBuf, code, "%s: db:`%s`, tbuid:`%s`", tstrerror(code), pStmt->dbName, - pStmt->tableName); + return generateSyntaxErrMsgExt(&pCxt->msgBuf, code, "%s: db:`%s`, tbuid:`%s`", + (code == TSDB_CODE_PAR_TABLE_NOT_EXIST || code == TSDB_CODE_TDB_TABLE_NOT_EXIST) + ? "STable not exist" + : tstrerror(code), + pStmt->dbName, pStmt->tableName); } tstrncpy(pStmt->tableName, pTableName, TSDB_TABLE_NAME_LEN); // rewrite table uid to table name diff --git a/tests/system-test/1-insert/drop.py b/tests/system-test/1-insert/drop.py index 7e41aad4a8..e28b24b5ca 100644 --- a/tests/system-test/1-insert/drop.py +++ b/tests/system-test/1-insert/drop.py @@ -147,13 +147,28 @@ class TDTestCase: if i == 0: dropTable = f'drop table with `{stb_result[1]}`.`{stb_result[10]}`,' dropStable = f'drop stable with `{stb_result[1]}`.`{stb_result[10]}`,' + dropTableWithSpace = f'drop table with `{stb_result[1]}`.`{stb_result[10]} `,' + dropStableWithSpace = f'drop stable with `{stb_result[1]}`.` {stb_result[10]}`,' + dropStableNotExist = f'drop stable with `{stb_result[1]}`.`{stb_result[10]}_notexist`,' + tdLog.info(dropTableWithSpace[:-1]) + tdSql.error(dropTableWithSpace[:-1], expectErrInfo="Table does not exist", fullMatched=False) + tdLog.info(dropStableWithSpace[:-1]) + tdSql.error(dropStableWithSpace[:-1], expectErrInfo="STable not exist", fullMatched=False) + tdLog.info(dropStableNotExist[:-1]) + tdSql.error(dropStableWithSpace[:-1], expectErrInfo="STable not exist", fullMatched=False) else: dropTable += f'`{stb_result[1]}`.`{stb_result[10]}`,' dropStable += f'`{stb_result[1]}`.`{stb_result[10]}`,' tdLog.info(dropTable[:-1]) tdLog.info(dropStable[:-1]) - tdSql.error(dropTable[:-1]) - tdSql.error(dropStable[:-1]) + tdSql.error(dropTable[:-1], expectErrInfo="Cannot drop super table in batch") + tdSql.error(dropStable[:-1], expectErrInfo="syntax error", fullMatched=False) + dropTableWithSpace += f'`{stb_result[1]}`.` {stb_result[10]}`,' + dropStableWithSpace += f'`{stb_result[1]}`.`{stb_result[10]} `,' + tdLog.info(dropTableWithSpace[:-1]) + tdLog.info(dropStableWithSpace[:-1]) + tdSql.error(dropTableWithSpace[:-1], expectErrInfo="Table does not exist", fullMatched=False) + tdSql.error(dropStableWithSpace[:-1], expectErrInfo="syntax error", fullMatched=False) i += 1 i = 0 for stb_result in result: @@ -172,9 +187,9 @@ class TDTestCase: tdSql.checkRows(0) tdSql.query(f'select * from information_schema.ins_tables where db_name like "dbtest_%"') tdSql.checkRows(8) - tdSql.error(f'drop stable with information_schema.`ins_tables`;') - tdSql.error(f'drop stable with performance_schema.`perf_connections`;') - self.drop_table_check_end() + tdSql.error(f'drop stable with information_schema.`ins_tables`;', expectErrInfo="Cannot drop table of system database", fullMatched=False) + tdSql.error(f'drop stable with performance_schema.`perf_connections`;', expectErrInfo="Cannot drop table of system database", fullMatched=False) + self.drop_table_check_end() def drop_table_with_check(self): self.drop_table_check_init() tdSql.query(f'select * from information_schema.ins_tables where db_name like "dbtest_%"') @@ -196,8 +211,8 @@ class TDTestCase: tdSql.checkRows(0) tdSql.query(f'select * from information_schema.ins_stables where db_name like "dbtest_%"') tdSql.checkRows(2) - tdSql.error(f'drop table with information_schema.`ins_tables`;') - tdSql.error(f'drop table with performance_schema.`perf_connections`;') + tdSql.error(f'drop table with information_schema.`ins_tables`;', expectErrInfo="Cannot drop table of system database", fullMatched=False) + tdSql.error(f'drop table with performance_schema.`perf_connections`;', expectErrInfo="Cannot drop table of system database", fullMatched=False) self.drop_table_check_end() def drop_table_with_check_tsma(self): tdSql.execute(f'create database if not exists {self.dbname} {self.vgroups_opt}') From 790d1a42508d1430f68aa1684d1578cf33f9b6d2 Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Wed, 25 Sep 2024 09:35:52 +0800 Subject: [PATCH 30/62] stmt2/get tbname: ignore stmt error --- source/client/src/clientStmt2.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/source/client/src/clientStmt2.c b/source/client/src/clientStmt2.c index a9738e4e9c..a8949732f3 100644 --- a/source/client/src/clientStmt2.c +++ b/source/client/src/clientStmt2.c @@ -1873,6 +1873,8 @@ int stmtGetParamNum2(TAOS_STMT2* stmt, int* nums) { int stmtGetParamTbName(TAOS_STMT2* stmt, int* nums) { STscStmt2* pStmt = (STscStmt2*)stmt; + int32_t code = 0; + int32_t preCode = pStmt->errCode; STMT_DLOG_E("start to get param num"); @@ -1895,17 +1897,19 @@ int stmtGetParamTbName(TAOS_STMT2* stmt, int* nums) { STMT_ERR_RET(stmtCreateRequest(pStmt)); if (pStmt->bInfo.needParse) { - STMT_ERR_RET(stmtParseSql(pStmt)); + STMT_ERRI_JRET(stmtParseSql(pStmt)); } - if (TSDB_CODE_TSC_STMT_TBNAME_ERROR == pStmt->errCode) { + *nums = STMT_TYPE_MULTI_INSERT == pStmt->sql.type ? 1 : 0; + +_return: + if (TSDB_CODE_TSC_STMT_TBNAME_ERROR == code) { *nums = 1; - pStmt->errCode = TSDB_CODE_SUCCESS; - } else { - *nums = STMT_TYPE_MULTI_INSERT == pStmt->sql.type ? 1 : 0; + code = TSDB_CODE_SUCCESS; } - return TSDB_CODE_SUCCESS; + pStmt->errCode = preCode; + return code; } /* int stmtGetParam(TAOS_STMT* stmt, int idx, int* type, int* bytes) { From c2c3be3aa6c6c65a3dca202592bb972ab14f3542 Mon Sep 17 00:00:00 2001 From: kailixu Date: Wed, 25 Sep 2024 09:40:26 +0800 Subject: [PATCH 31/62] enh: test case optimization --- tests/system-test/1-insert/drop.py | 47 ++++++++++++++++++------------ 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/tests/system-test/1-insert/drop.py b/tests/system-test/1-insert/drop.py index 6d674c5ad5..7ff48e8d40 100644 --- a/tests/system-test/1-insert/drop.py +++ b/tests/system-test/1-insert/drop.py @@ -54,6 +54,7 @@ class TDTestCase: self.ctb_names = [ f'ctb0', 'ctb1', f'aa\u00bf\u200bctb0', f'aa\u00bf\u200bctb1'] self.ntb_names = [ f'ntb0', f'aa\u00bf\u200bntb0', f'ntb1', f'aa\u00bf\u200bntb1'] self.vgroups_opt = f'vgroups 4' + self.err_dup_cnt = 5 def insert_data(self,column_dict,tbname,row_num): insert_sql = self.setsql.set_insertsql(column_dict,tbname,self.binary_str,self.nchar_str) for i in range(row_num): @@ -150,25 +151,31 @@ class TDTestCase: dropTableWithSpace = f'drop table with `{stb_result[1]}`.`{stb_result[10]} `,' dropStableWithSpace = f'drop stable with `{stb_result[1]}`.` {stb_result[10]}`,' dropStableNotExist = f'drop stable with `{stb_result[1]}`.`{stb_result[10]}_notexist`,' - tdLog.info(dropTableWithSpace[:-1]) - tdSql.error(dropTableWithSpace[:-1], expectErrInfo="Table does not exist", fullMatched=False) - tdLog.info(dropStableWithSpace[:-1]) - tdSql.error(dropStableWithSpace[:-1], expectErrInfo="STable not exist", fullMatched=False) - tdLog.info(dropStableNotExist[:-1]) - tdSql.error(dropStableWithSpace[:-1], expectErrInfo="STable not exist", fullMatched=False) + k = 0 + for k in range(self.err_dup_cnt): + tdLog.info(dropTableWithSpace[:-1]) + tdSql.error(dropTableWithSpace[:-1], expectErrInfo="Table does not exist", fullMatched=False) + tdLog.info(dropStableWithSpace[:-1]) + tdSql.error(dropStableWithSpace[:-1], expectErrInfo="STable not exist", fullMatched=False) + tdLog.info(dropStableNotExist[:-1]) + tdSql.error(dropStableWithSpace[:-1], expectErrInfo="STable not exist", fullMatched=False) else: dropTable += f'`{stb_result[1]}`.`{stb_result[10]}`,' dropStable += f'`{stb_result[1]}`.`{stb_result[10]}`,' - tdLog.info(dropTable[:-1]) - tdLog.info(dropStable[:-1]) - tdSql.error(dropTable[:-1], expectErrInfo="Cannot drop super table in batch") - tdSql.error(dropStable[:-1], expectErrInfo="syntax error", fullMatched=False) + k = 0 + for k in range(self.err_dup_cnt): + tdLog.info(dropTable[:-1]) + tdLog.info(dropStable[:-1]) + tdSql.error(dropTable[:-1], expectErrInfo="Cannot drop super table in batch") + tdSql.error(dropStable[:-1], expectErrInfo="syntax error", fullMatched=False) dropTableWithSpace += f'`{stb_result[1]}`.` {stb_result[10]}`,' dropStableWithSpace += f'`{stb_result[1]}`.`{stb_result[10]} `,' - tdLog.info(dropTableWithSpace[:-1]) - tdLog.info(dropStableWithSpace[:-1]) - tdSql.error(dropTableWithSpace[:-1], expectErrInfo="Table does not exist", fullMatched=False) - tdSql.error(dropStableWithSpace[:-1], expectErrInfo="syntax error", fullMatched=False) + k = 0 + for k in range(self.err_dup_cnt): + tdLog.info(dropTableWithSpace[:-1]) + tdLog.info(dropStableWithSpace[:-1]) + tdSql.error(dropTableWithSpace[:-1], expectErrInfo="Table does not exist", fullMatched=False) + tdSql.error(dropStableWithSpace[:-1], expectErrInfo="syntax error", fullMatched=False) i += 1 i = 0 for stb_result in result: @@ -187,8 +194,10 @@ class TDTestCase: tdSql.checkRows(0) tdSql.query(f'select * from information_schema.ins_tables where db_name like "dbtest_%"') tdSql.checkRows(8) - tdSql.error(f'drop stable with information_schema.`ins_tables`;', expectErrInfo="Cannot drop table of system database", fullMatched=False) - tdSql.error(f'drop stable with performance_schema.`perf_connections`;', expectErrInfo="Cannot drop table of system database", fullMatched=False) + k = 0 + for k in range(self.err_dup_cnt): + tdSql.error(f'drop stable with information_schema.`ins_tables`;', expectErrInfo="Cannot drop table of system database", fullMatched=False) + tdSql.error(f'drop stable with performance_schema.`perf_connections`;', expectErrInfo="Cannot drop table of system database", fullMatched=False) self.drop_table_check_end() def drop_table_with_check(self): self.drop_table_check_init() @@ -211,8 +220,10 @@ class TDTestCase: tdSql.checkRows(0) tdSql.query(f'select * from information_schema.ins_stables where db_name like "dbtest_%"') tdSql.checkRows(2) - tdSql.error(f'drop table with information_schema.`ins_tables`;', expectErrInfo="Cannot drop table of system database", fullMatched=False) - tdSql.error(f'drop table with performance_schema.`perf_connections`;', expectErrInfo="Cannot drop table of system database", fullMatched=False) + k = 0 + for k in range(self.err_dup_cnt): + tdSql.error(f'drop table with information_schema.`ins_tables`;', expectErrInfo="Cannot drop table of system database", fullMatched=False) + tdSql.error(f'drop table with performance_schema.`perf_connections`;', expectErrInfo="Cannot drop table of system database", fullMatched=False) self.drop_table_check_end() def drop_table_with_check_tsma(self): tdSql.execute(f'create database if not exists {self.dbname} {self.vgroups_opt}') From 234b95fcd6259fa9d0ee4efefcf7ff5db913baaf Mon Sep 17 00:00:00 2001 From: kailixu Date: Wed, 25 Sep 2024 09:51:27 +0800 Subject: [PATCH 32/62] enh: test case optimization --- tests/system-test/1-insert/drop.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/tests/system-test/1-insert/drop.py b/tests/system-test/1-insert/drop.py index 7ff48e8d40..ad9f6c9be6 100644 --- a/tests/system-test/1-insert/drop.py +++ b/tests/system-test/1-insert/drop.py @@ -151,8 +151,7 @@ class TDTestCase: dropTableWithSpace = f'drop table with `{stb_result[1]}`.`{stb_result[10]} `,' dropStableWithSpace = f'drop stable with `{stb_result[1]}`.` {stb_result[10]}`,' dropStableNotExist = f'drop stable with `{stb_result[1]}`.`{stb_result[10]}_notexist`,' - k = 0 - for k in range(self.err_dup_cnt): + for _ in range(self.err_dup_cnt): tdLog.info(dropTableWithSpace[:-1]) tdSql.error(dropTableWithSpace[:-1], expectErrInfo="Table does not exist", fullMatched=False) tdLog.info(dropStableWithSpace[:-1]) @@ -162,16 +161,14 @@ class TDTestCase: else: dropTable += f'`{stb_result[1]}`.`{stb_result[10]}`,' dropStable += f'`{stb_result[1]}`.`{stb_result[10]}`,' - k = 0 - for k in range(self.err_dup_cnt): + for _ in range(self.err_dup_cnt): tdLog.info(dropTable[:-1]) tdLog.info(dropStable[:-1]) tdSql.error(dropTable[:-1], expectErrInfo="Cannot drop super table in batch") tdSql.error(dropStable[:-1], expectErrInfo="syntax error", fullMatched=False) dropTableWithSpace += f'`{stb_result[1]}`.` {stb_result[10]}`,' dropStableWithSpace += f'`{stb_result[1]}`.`{stb_result[10]} `,' - k = 0 - for k in range(self.err_dup_cnt): + for _ in range(self.err_dup_cnt): tdLog.info(dropTableWithSpace[:-1]) tdLog.info(dropStableWithSpace[:-1]) tdSql.error(dropTableWithSpace[:-1], expectErrInfo="Table does not exist", fullMatched=False) @@ -194,8 +191,7 @@ class TDTestCase: tdSql.checkRows(0) tdSql.query(f'select * from information_schema.ins_tables where db_name like "dbtest_%"') tdSql.checkRows(8) - k = 0 - for k in range(self.err_dup_cnt): + for _ in range(self.err_dup_cnt): tdSql.error(f'drop stable with information_schema.`ins_tables`;', expectErrInfo="Cannot drop table of system database", fullMatched=False) tdSql.error(f'drop stable with performance_schema.`perf_connections`;', expectErrInfo="Cannot drop table of system database", fullMatched=False) self.drop_table_check_end() @@ -220,8 +216,7 @@ class TDTestCase: tdSql.checkRows(0) tdSql.query(f'select * from information_schema.ins_stables where db_name like "dbtest_%"') tdSql.checkRows(2) - k = 0 - for k in range(self.err_dup_cnt): + for _ in range(self.err_dup_cnt): tdSql.error(f'drop table with information_schema.`ins_tables`;', expectErrInfo="Cannot drop table of system database", fullMatched=False) tdSql.error(f'drop table with performance_schema.`perf_connections`;', expectErrInfo="Cannot drop table of system database", fullMatched=False) self.drop_table_check_end() From eec5f59ae828a81d3ad6db30099c89a45ec95d93 Mon Sep 17 00:00:00 2001 From: wangjiaming0909 <604227650@qq.com> Date: Tue, 24 Sep 2024 11:40:36 +0800 Subject: [PATCH 33/62] fix ctg read tsma cache crash --- source/libs/catalog/inc/catalogInt.h | 1 + source/libs/catalog/src/ctgCache.c | 18 ++++++++++++++---- tests/system-test/2-query/tsma.py | 1 + 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/source/libs/catalog/inc/catalogInt.h b/source/libs/catalog/inc/catalogInt.h index 0882db52a6..e757163ba8 100644 --- a/source/libs/catalog/inc/catalogInt.h +++ b/source/libs/catalog/inc/catalogInt.h @@ -334,6 +334,7 @@ typedef struct SCtgViewCache { typedef struct SCtgTSMACache { SRWLatch tsmaLock; SArray* pTsmas; // SArray + bool retryFetch; } SCtgTSMACache; typedef struct SCtgDBCache { diff --git a/source/libs/catalog/src/ctgCache.c b/source/libs/catalog/src/ctgCache.c index 80650a6095..eafd85a504 100644 --- a/source/libs/catalog/src/ctgCache.c +++ b/source/libs/catalog/src/ctgCache.c @@ -2997,6 +2997,7 @@ int32_t ctgOpDropTbTSMA(SCtgCacheOperation *operation) { taosArrayDestroyP(pCtgCache->pTsmas, tFreeAndClearTableTSMAInfo); pCtgCache->pTsmas = NULL; + pCtgCache->retryFetch = true; ctgDebug("all tsmas for table dropped: %s.%s", msg->dbFName, msg->tbName); code = taosHashRemove(dbCache->tsmaCache, msg->tbName, TSDB_TABLE_NAME_LEN); @@ -3975,17 +3976,25 @@ int32_t ctgGetTbTSMAFromCache(SCatalog* pCtg, SCtgTbTSMACtx* pCtx, int32_t dbIdx // get tsma cache pCache = taosHashAcquire(dbCache->tsmaCache, tsmaSourceTbName.tname, strlen(tsmaSourceTbName.tname)); - if (!pCache || !pCache->pTsmas || pCache->pTsmas->size == 0) { + if (!pCache) { if (NULL == taosArrayPush(pCtx->pResList, &(SMetaRes){0})) { ctgReleaseTSMAToCache(pCtg, dbCache, pCache); CTG_ERR_RET(terrno); } - + continue; + } + CTG_LOCK(CTG_READ, &pCache->tsmaLock); + if ((!pCache->pTsmas || pCache->pTsmas->size == 0) && !pCache->retryFetch) { + if (NULL == taosArrayPush(pCtx->pResList, &(SMetaRes){0})) { + ctgReleaseTSMAToCache(pCtg, dbCache, pCache); + CTG_ERR_RET(terrno); + } + CTG_UNLOCK(CTG_READ, &pCache->tsmaLock); + taosHashRelease(dbCache->tsmaCache, pCache); continue; } - CTG_LOCK(CTG_READ, &pCache->tsmaLock); - if (hasOutOfDateTSMACache(pCache->pTsmas)) { + if (pCache->retryFetch || hasOutOfDateTSMACache(pCache->pTsmas)) { CTG_UNLOCK(CTG_READ, &pCache->tsmaLock); taosHashRelease(dbCache->tsmaCache, pCache); @@ -3997,6 +4006,7 @@ int32_t ctgGetTbTSMAFromCache(SCatalog* pCtg, SCtgTbTSMACtx* pCtx, int32_t dbIdx } CTG_CACHE_NHIT_INC(CTG_CI_TBL_TSMA, 1); + pCache->retryFetch = false; continue; } diff --git a/tests/system-test/2-query/tsma.py b/tests/system-test/2-query/tsma.py index 1b52302503..f05398600b 100644 --- a/tests/system-test/2-query/tsma.py +++ b/tests/system-test/2-query/tsma.py @@ -871,6 +871,7 @@ class TDTestCase: .should_query_with_table('meters', '2018-09-17 09:00:00.200', '2018-09-17 09:29:59:999') .should_query_with_tsma('tsma2', '2018-09-17 09:30:00', '2018-09-17 09:59:59.999') .should_query_with_table('meters', '2018-09-17 10:00:00.000', '2018-09-17 10:23:19.800').get_qc()) + tdSql.query('show create table test.meters') self.check(ctxs) if not ignore_some_tests: tdSql.execute('create database db2') From 856cc32f3920eaa7b8b43b38ac6f00d32573fdec Mon Sep 17 00:00:00 2001 From: wangjiaming0909 <604227650@qq.com> Date: Wed, 25 Sep 2024 11:03:47 +0800 Subject: [PATCH 34/62] add tsma creation/dropping trx conflict check --- source/dnode/mnode/impl/inc/mndDef.h | 1 + source/dnode/mnode/impl/src/mndSma.c | 4 ++-- source/dnode/mnode/impl/src/mndTrans.c | 8 ++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/source/dnode/mnode/impl/inc/mndDef.h b/source/dnode/mnode/impl/inc/mndDef.h index 99e59662ac..60b732f817 100644 --- a/source/dnode/mnode/impl/inc/mndDef.h +++ b/source/dnode/mnode/impl/inc/mndDef.h @@ -106,6 +106,7 @@ typedef enum { // TRN_CONFLICT_TOPIC = 4, // TRN_CONFLICT_TOPIC_INSIDE = 5, TRN_CONFLICT_ARBGROUP = 6, + TRN_CONFLICT_TSMA = 7, } ETrnConflct; typedef enum { diff --git a/source/dnode/mnode/impl/src/mndSma.c b/source/dnode/mnode/impl/src/mndSma.c index 1a76ab2a8b..a258155223 100644 --- a/source/dnode/mnode/impl/src/mndSma.c +++ b/source/dnode/mnode/impl/src/mndSma.c @@ -1692,7 +1692,7 @@ static int32_t mndCreateTSMATxnPrepare(SCreateTSMACxt* pCxt) { STransAction dropStbUndoAction = {0}; SMDropStbReq dropStbReq = {0}; STrans *pTrans = - mndTransCreate(pCxt->pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_NOTHING, pCxt->pRpcReq, "create-tsma"); + mndTransCreate(pCxt->pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_TSMA, pCxt->pRpcReq, "create-tsma"); if (!pTrans) { code = terrno; goto _OVER; @@ -1974,7 +1974,7 @@ _OVER: static int32_t mndDropTSMA(SCreateTSMACxt* pCxt) { int32_t code = -1; STransAction dropStreamRedoAction = {0}; - STrans *pTrans = mndTransCreate(pCxt->pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_NOTHING, pCxt->pRpcReq, "drop-tsma"); + STrans *pTrans = mndTransCreate(pCxt->pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_TSMA, pCxt->pRpcReq, "drop-tsma"); if (!pTrans) { code = terrno; goto _OVER; diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 347f38193f..623400869e 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -902,6 +902,14 @@ static bool mndCheckTransConflict(SMnode *pMnode, STrans *pNew) { } } + if (pNew->conflict == TRN_CONFLICT_TSMA) { + if (pTrans->conflict == TRN_CONFLICT_GLOBAL || pTrans->conflict == TRN_CONFLICT_TSMA) { + mndTransLogConflict(pNew, pTrans, true, &conflict); + } else { + mndTransLogConflict(pNew, pTrans, false, &conflict); + } + } + sdbRelease(pMnode->pSdb, pTrans); } From 8d02e3e310b142d3678c16f58f0726ac19bd5ce6 Mon Sep 17 00:00:00 2001 From: Jing Sima Date: Wed, 25 Sep 2024 11:15:48 +0800 Subject: [PATCH 35/62] fix:[TD-32310] Avoid access null pointer when error occurs.. --- source/libs/executor/src/aggregateoperator.c | 11 +++++--- .../libs/executor/src/eventwindowoperator.c | 2 +- source/libs/executor/src/groupoperator.c | 12 +++++---- .../executor/src/streamcountwindowoperator.c | 11 +++++--- .../executor/src/streameventwindowoperator.c | 8 +++--- .../executor/src/streamtimewindowoperator.c | 24 ++++++++++------- source/libs/executor/src/timewindowoperator.c | 27 ++++++++++++------- 7 files changed, 62 insertions(+), 33 deletions(-) diff --git a/source/libs/executor/src/aggregateoperator.c b/source/libs/executor/src/aggregateoperator.c index 863ce01256..9e5ad132f7 100644 --- a/source/libs/executor/src/aggregateoperator.c +++ b/source/libs/executor/src/aggregateoperator.c @@ -152,12 +152,17 @@ _error: } void destroyAggOperatorInfo(void* param) { + if (param == NULL) { + return; + } SAggOperatorInfo* pInfo = (SAggOperatorInfo*)param; cleanupBasicInfo(&pInfo->binfo); - cleanupResultInfo(pInfo->pOperator->pTaskInfo, &pInfo->pOperator->exprSupp, pInfo->aggSup.pResultBuf, - &pInfo->groupResInfo, pInfo->aggSup.pResultRowHashTable); - pInfo->pOperator = NULL; + if (pInfo->pOperator) { + cleanupResultInfo(pInfo->pOperator->pTaskInfo, &pInfo->pOperator->exprSupp, pInfo->aggSup.pResultBuf, + &pInfo->groupResInfo, pInfo->aggSup.pResultRowHashTable); + pInfo->pOperator = NULL; + } cleanupAggSup(&pInfo->aggSup); cleanupExprSupp(&pInfo->scalarExprSup); cleanupGroupResInfo(&pInfo->groupResInfo); diff --git a/source/libs/executor/src/eventwindowoperator.c b/source/libs/executor/src/eventwindowoperator.c index 79e7494518..f473626953 100644 --- a/source/libs/executor/src/eventwindowoperator.c +++ b/source/libs/executor/src/eventwindowoperator.c @@ -155,7 +155,7 @@ _error: } void cleanupResultInfoInEventWindow(SOperatorInfo* pOperator, SEventWindowOperatorInfo* pInfo) { - if (pInfo == NULL || pInfo->pRow == NULL) { + if (pInfo == NULL || pInfo->pRow == NULL || pOperator == NULL) { return; } SExprSupp* pSup = &pOperator->exprSupp; diff --git a/source/libs/executor/src/groupoperator.c b/source/libs/executor/src/groupoperator.c index 3ce20dbbd9..ff238df68b 100644 --- a/source/libs/executor/src/groupoperator.c +++ b/source/libs/executor/src/groupoperator.c @@ -76,21 +76,23 @@ static void freeGroupKey(void* param) { } static void destroyGroupOperatorInfo(void* param) { - SGroupbyOperatorInfo* pInfo = (SGroupbyOperatorInfo*)param; - if (pInfo == NULL) { + if (param == NULL) { return; } + SGroupbyOperatorInfo* pInfo = (SGroupbyOperatorInfo*)param; cleanupBasicInfo(&pInfo->binfo); taosMemoryFreeClear(pInfo->keyBuf); taosArrayDestroy(pInfo->pGroupCols); taosArrayDestroyEx(pInfo->pGroupColVals, freeGroupKey); cleanupExprSupp(&pInfo->scalarSup); - cleanupResultInfo(pInfo->pOperator->pTaskInfo, &pInfo->pOperator->exprSupp, pInfo->aggSup.pResultBuf, - &pInfo->groupResInfo, pInfo->aggSup.pResultRowHashTable); + if (pInfo->pOperator) { + cleanupResultInfo(pInfo->pOperator->pTaskInfo, &pInfo->pOperator->exprSupp, pInfo->aggSup.pResultBuf, + &pInfo->groupResInfo, pInfo->aggSup.pResultRowHashTable); + pInfo->pOperator = NULL; + } cleanupGroupResInfo(&pInfo->groupResInfo); cleanupAggSup(&pInfo->aggSup); - pInfo->pOperator = NULL; taosMemoryFreeClear(param); } diff --git a/source/libs/executor/src/streamcountwindowoperator.c b/source/libs/executor/src/streamcountwindowoperator.c index 577af29bf7..6803c0ff60 100644 --- a/source/libs/executor/src/streamcountwindowoperator.c +++ b/source/libs/executor/src/streamcountwindowoperator.c @@ -46,11 +46,16 @@ typedef struct SBuffInfo { } SBuffInfo; void destroyStreamCountAggOperatorInfo(void* param) { + if (param == NULL) { + return; + } SStreamCountAggOperatorInfo* pInfo = (SStreamCountAggOperatorInfo*)param; cleanupBasicInfo(&pInfo->binfo); - cleanupResultInfoInStream(pInfo->pOperator->pTaskInfo, pInfo->streamAggSup.pState, &pInfo->pOperator->exprSupp, - &pInfo->groupResInfo); - pInfo->pOperator = NULL; + if (pInfo->pOperator) { + cleanupResultInfoInStream(pInfo->pOperator->pTaskInfo, pInfo->streamAggSup.pState, &pInfo->pOperator->exprSupp, + &pInfo->groupResInfo); + pInfo->pOperator = NULL; + } destroyStreamAggSupporter(&pInfo->streamAggSup); cleanupExprSupp(&pInfo->scalarSupp); clearGroupResInfo(&pInfo->groupResInfo); diff --git a/source/libs/executor/src/streameventwindowoperator.c b/source/libs/executor/src/streameventwindowoperator.c index a46bbdace3..3f16272af1 100644 --- a/source/libs/executor/src/streameventwindowoperator.c +++ b/source/libs/executor/src/streameventwindowoperator.c @@ -48,9 +48,11 @@ void destroyStreamEventOperatorInfo(void* param) { } SStreamEventAggOperatorInfo* pInfo = (SStreamEventAggOperatorInfo*)param; cleanupBasicInfo(&pInfo->binfo); - cleanupResultInfoInStream(pInfo->pOperator->pTaskInfo, pInfo->streamAggSup.pState, &pInfo->pOperator->exprSupp, - &pInfo->groupResInfo); - pInfo->pOperator = NULL; + if (pInfo->pOperator) { + cleanupResultInfoInStream(pInfo->pOperator->pTaskInfo, pInfo->streamAggSup.pState, &pInfo->pOperator->exprSupp, + &pInfo->groupResInfo); + pInfo->pOperator = NULL; + } destroyStreamAggSupporter(&pInfo->streamAggSup); clearGroupResInfo(&pInfo->groupResInfo); taosArrayDestroyP(pInfo->pUpdated, destroyFlusedPos); diff --git a/source/libs/executor/src/streamtimewindowoperator.c b/source/libs/executor/src/streamtimewindowoperator.c index 22e462abab..58ab56efb7 100644 --- a/source/libs/executor/src/streamtimewindowoperator.c +++ b/source/libs/executor/src/streamtimewindowoperator.c @@ -473,9 +473,11 @@ void destroyStreamFinalIntervalOperatorInfo(void* param) { } SStreamIntervalOperatorInfo* pInfo = (SStreamIntervalOperatorInfo*)param; cleanupBasicInfo(&pInfo->binfo); - cleanupResultInfo(pInfo->pOperator->pTaskInfo, &pInfo->pOperator->exprSupp, pInfo->aggSup.pResultBuf, - &pInfo->groupResInfo, pInfo->aggSup.pResultRowHashTable); - pInfo->pOperator = NULL; + if (pInfo->pOperator) { + cleanupResultInfo(pInfo->pOperator->pTaskInfo, &pInfo->pOperator->exprSupp, pInfo->aggSup.pResultBuf, + &pInfo->groupResInfo, pInfo->aggSup.pResultRowHashTable); + pInfo->pOperator = NULL; + } cleanupAggSup(&pInfo->aggSup); clearGroupResInfo(&pInfo->groupResInfo); taosArrayDestroyP(pInfo->pUpdated, destroyFlusedPos); @@ -2092,9 +2094,11 @@ void destroyStreamSessionAggOperatorInfo(void* param) { } SStreamSessionAggOperatorInfo* pInfo = (SStreamSessionAggOperatorInfo*)param; cleanupBasicInfo(&pInfo->binfo); - cleanupResultInfoInStream(pInfo->pOperator->pTaskInfo, pInfo->streamAggSup.pState, &pInfo->pOperator->exprSupp, - &pInfo->groupResInfo); - pInfo->pOperator = NULL; + if (pInfo->pOperator) { + cleanupResultInfoInStream(pInfo->pOperator->pTaskInfo, pInfo->streamAggSup.pState, &pInfo->pOperator->exprSupp, + &pInfo->groupResInfo); + pInfo->pOperator = NULL; + } destroyStreamAggSupporter(&pInfo->streamAggSup); cleanupExprSupp(&pInfo->scalarSupp); clearGroupResInfo(&pInfo->groupResInfo); @@ -4182,9 +4186,11 @@ void destroyStreamStateOperatorInfo(void* param) { } SStreamStateAggOperatorInfo* pInfo = (SStreamStateAggOperatorInfo*)param; cleanupBasicInfo(&pInfo->binfo); - cleanupResultInfoInStream(pInfo->pOperator->pTaskInfo, pInfo->streamAggSup.pState, &pInfo->pOperator->exprSupp, - &pInfo->groupResInfo); - pInfo->pOperator = NULL; + if (pInfo->pOperator) { + cleanupResultInfoInStream(pInfo->pOperator->pTaskInfo, pInfo->streamAggSup.pState, &pInfo->pOperator->exprSupp, + &pInfo->groupResInfo); + pInfo->pOperator = NULL; + } destroyStreamAggSupporter(&pInfo->streamAggSup); clearGroupResInfo(&pInfo->groupResInfo); taosArrayDestroyP(pInfo->pUpdated, destroyFlusedPos); diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c index 6ac24ad313..cacc4f4cee 100644 --- a/source/libs/executor/src/timewindowoperator.c +++ b/source/libs/executor/src/timewindowoperator.c @@ -1223,12 +1223,17 @@ _end: } static void destroyStateWindowOperatorInfo(void* param) { + if (param == NULL) { + return; + } SStateWindowOperatorInfo* pInfo = (SStateWindowOperatorInfo*)param; cleanupBasicInfo(&pInfo->binfo); taosMemoryFreeClear(pInfo->stateKey.pData); - cleanupResultInfo(pInfo->pOperator->pTaskInfo, &pInfo->pOperator->exprSupp, pInfo->aggSup.pResultBuf, - &pInfo->groupResInfo, pInfo->aggSup.pResultRowHashTable); - pInfo->pOperator = NULL; + if (pInfo->pOperator) { + cleanupResultInfo(pInfo->pOperator->pTaskInfo, &pInfo->pOperator->exprSupp, pInfo->aggSup.pResultBuf, + &pInfo->groupResInfo, pInfo->aggSup.pResultRowHashTable); + pInfo->pOperator = NULL; + } cleanupExprSupp(&pInfo->scalarSup); colDataDestroy(&pInfo->twAggSup.timeWindowData); cleanupAggSup(&pInfo->aggSup); @@ -1248,9 +1253,11 @@ void destroyIntervalOperatorInfo(void* param) { } SIntervalAggOperatorInfo* pInfo = (SIntervalAggOperatorInfo*)param; cleanupBasicInfo(&pInfo->binfo); - cleanupResultInfo(pInfo->pOperator->pTaskInfo, &pInfo->pOperator->exprSupp, pInfo->aggSup.pResultBuf, - &pInfo->groupResInfo, pInfo->aggSup.pResultRowHashTable); - pInfo->pOperator = NULL; + if (pInfo->pOperator) { + cleanupResultInfo(pInfo->pOperator->pTaskInfo, &pInfo->pOperator->exprSupp, pInfo->aggSup.pResultBuf, + &pInfo->groupResInfo, pInfo->aggSup.pResultRowHashTable); + pInfo->pOperator = NULL; + } cleanupAggSup(&pInfo->aggSup); cleanupExprSupp(&pInfo->scalarSupp); @@ -1747,9 +1754,11 @@ void destroySWindowOperatorInfo(void* param) { cleanupBasicInfo(&pInfo->binfo); colDataDestroy(&pInfo->twAggSup.timeWindowData); - cleanupResultInfo(pInfo->pOperator->pTaskInfo, &pInfo->pOperator->exprSupp, pInfo->aggSup.pResultBuf, - &pInfo->groupResInfo, pInfo->aggSup.pResultRowHashTable); - pInfo->pOperator = NULL; + if (pInfo->pOperator) { + cleanupResultInfo(pInfo->pOperator->pTaskInfo, &pInfo->pOperator->exprSupp, pInfo->aggSup.pResultBuf, + &pInfo->groupResInfo, pInfo->aggSup.pResultRowHashTable); + pInfo->pOperator = NULL; + } cleanupAggSup(&pInfo->aggSup); cleanupExprSupp(&pInfo->scalarSupp); From 2dbdc0bbc863c992638271497a1da1f6513aad18 Mon Sep 17 00:00:00 2001 From: kailixu Date: Wed, 25 Sep 2024 11:17:40 +0800 Subject: [PATCH 36/62] enh: return value process --- source/util/src/tlog.c | 136 +++++++++++++++++++++++++++-------------- 1 file changed, 89 insertions(+), 47 deletions(-) diff --git a/source/util/src/tlog.c b/source/util/src/tlog.c index aea6647e4c..b8433d3b5d 100644 --- a/source/util/src/tlog.c +++ b/source/util/src/tlog.c @@ -153,14 +153,16 @@ static void getDay(char* buf){ time_t t = taosTime(NULL); struct tm tmInfo; if (taosLocalTime(&t, &tmInfo, buf) != NULL) { - (void)strftime(buf, LOG_FILE_DAY_LEN, "%Y-%m-%d", &tmInfo); + TAOS_UNUSED(strftime(buf, LOG_FILE_DAY_LEN, "%Y-%m-%d", &tmInfo)); } } static int64_t getTimestampToday() { time_t t = taosTime(NULL); struct tm tm; - (void) taosLocalTime(&t, &tm, NULL); + if (taosLocalTime(&t, &tm, NULL) == NULL) { + return 0; + } tm.tm_hour = 0; tm.tm_min = 0; tm.tm_sec = 0; @@ -203,7 +205,7 @@ int32_t taosInitSlowLog() { tsLogObj.slowHandle = taosLogBuffNew(LOG_SLOW_BUF_SIZE); if (tsLogObj.slowHandle == NULL) return terrno; - (void)taosUmaskFile(0); + TAOS_UNUSED(taosUmaskFile(0)); tsLogObj.slowHandle->pFile = taosOpenFile(name, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_APPEND); if (tsLogObj.slowHandle->pFile == NULL) { (void)printf("\nfailed to open slow log file:%s, reason:%s\n", name, strerror(errno)); @@ -281,7 +283,10 @@ static void taosUnLockLogFile(TdFilePtr pFile) { if (pFile == NULL) return; if (tsLogObj.fileNum > 1) { - (void)taosUnLockFile(pFile); + int32_t code = taosUnLockFile(pFile); + if (code != 0) { + printf("failed to unlock log file:%p, reason:%s\n", pFile, tstrerror(code)); + } } } @@ -310,7 +315,10 @@ static void taosKeepOldLog(char *oldName) { char compressFileName[PATH_MAX + 20]; snprintf(compressFileName, PATH_MAX + 20, "%s.gz", oldName); if (taosCompressFile(oldName, compressFileName) == 0) { - (void)taosRemoveFile(oldName); + int32_t code = taosRemoveFile(oldName); + if (code != 0) { + printf("failed to remove file:%s, reason:%s\n", oldName, tstrerror(code)); + } } } @@ -331,7 +339,7 @@ static OldFileKeeper *taosOpenNewFile() { char name[PATH_MAX + 20]; sprintf(name, "%s.%d", tsLogObj.logName, tsLogObj.flag); - (void)taosUmaskFile(0); + TAOS_UNUSED(taosUmaskFile(0)); TdFilePtr pFile = taosOpenFile(name, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_TRUNC); if (pFile == NULL) { @@ -341,8 +349,8 @@ static OldFileKeeper *taosOpenNewFile() { return NULL; } - (void)taosLockLogFile(pFile); - (void)taosLSeekFile(pFile, 0, SEEK_SET); + TAOS_UNUSED(taosLockLogFile(pFile)); + TAOS_UNUSED(taosLSeekFile(pFile, 0, SEEK_SET)); TdFilePtr pOldFile = tsLogObj.logHandle->pFile; tsLogObj.logHandle->pFile = pFile; @@ -384,7 +392,14 @@ static int32_t taosOpenNewLogFile() { (void)taosThreadAttrSetDetachState(&attr, PTHREAD_CREATE_DETACHED); OldFileKeeper *oldFileKeeper = taosOpenNewFile(); - (void)taosThreadCreate(&thread, &attr, taosThreadToCloseOldFile, oldFileKeeper); + if (!oldFileKeeper) { + (void)taosThreadMutexUnlock(&tsLogObj.logMutex); + return terrno; + } + if (taosThreadCreate(&thread, &attr, taosThreadToCloseOldFile, oldFileKeeper) != 0) { + uError("failed to create thread to close old log file"); + taosMemoryFreeClear(oldFileKeeper); + } (void)taosThreadAttrDestroy(&attr); } @@ -404,7 +419,7 @@ static void taosOpenNewSlowLogFile() { for (int32_t i = 1; atomic_val_compare_exchange_32(&tsLogObj.slowHandle->lock, 0, 1) == 1; ++i) { if (i % 1000 == 0) { - (void)sched_yield(); + TAOS_UNUSED(sched_yield()); } } tsLogObj.slowHandle->lastDuration = LOG_MAX_WAIT_MSEC; // force write @@ -435,7 +450,10 @@ void taosResetLog() { tsLogObj.lines = tsNumOfLogLines + 10; if (tsLogObj.logHandle) { - (void)taosOpenNewLogFile(); + int32_t code = taosOpenNewLogFile(); + if(code != 0){ + uError("failed to open new log file, reason:%s", tstrerror(code)); + } uInfo("=================================="); uInfo(" reset log file "); } @@ -521,6 +539,7 @@ static void processLogFileName(const char* logName , int32_t maxFileNum){ } static int32_t taosInitNormalLog(const char *logName, int32_t maxFileNum) { + int32_t code = 0; #ifdef WINDOWS_STASH /* * always set maxFileNum to 1 @@ -528,14 +547,13 @@ static int32_t taosInitNormalLog(const char *logName, int32_t maxFileNum) { */ maxFileNum = 1; #endif - processLogFileName(logName, maxFileNum); char name[PATH_MAX + 50] = "\0"; (void)sprintf(name, "%s.%d", tsLogObj.logName, tsLogObj.flag); (void)taosThreadMutexInit(&tsLogObj.logMutex, NULL); - (void)taosUmaskFile(0); + TAOS_UNUSED(taosUmaskFile(0)); tsLogObj.logHandle = taosLogBuffNew(LOG_DEFAULT_BUF_SIZE); if (tsLogObj.logHandle == NULL) return terrno; @@ -544,7 +562,7 @@ static int32_t taosInitNormalLog(const char *logName, int32_t maxFileNum) { (void)printf("\nfailed to open log file:%s, reason:%s\n", name, strerror(errno)); return terrno; } - (void)taosLockLogFile(tsLogObj.logHandle->pFile); + TAOS_UNUSED(taosLockLogFile(tsLogObj.logHandle->pFile)); // only an estimate for number of lines int64_t filesize = 0; @@ -554,14 +572,26 @@ static int32_t taosInitNormalLog(const char *logName, int32_t maxFileNum) { } tsLogObj.lines = (int32_t)(filesize / 60); - (void)taosLSeekFile(tsLogObj.logHandle->pFile, 0, SEEK_END); + if ((code = taosLSeekFile(tsLogObj.logHandle->pFile, 0, SEEK_END)) < 0) { + TAOS_UNUSED(printf("failed to seek to the end of log file:%s, reason:%s\n", name, tstrerror(code))); + return code; + } (void)sprintf(name, "==================================================\n"); - (void)taosWriteFile(tsLogObj.logHandle->pFile, name, (uint32_t)strlen(name)); + if (taosWriteFile(tsLogObj.logHandle->pFile, name, (uint32_t)strlen(name)) <= 0) { + TAOS_UNUSED(printf("failed to write to log file:%s, reason:%s\n", name, tstrerror(terrno))); + return terrno; + } (void)sprintf(name, " new log file \n"); - (void)taosWriteFile(tsLogObj.logHandle->pFile, name, (uint32_t)strlen(name)); + if (taosWriteFile(tsLogObj.logHandle->pFile, name, (uint32_t)strlen(name)) <= 0) { + TAOS_UNUSED(printf("failed to write to log file:%s, reason:%s\n", name, tstrerror(terrno))); + return terrno; + } (void)sprintf(name, "==================================================\n"); - (void)taosWriteFile(tsLogObj.logHandle->pFile, name, (uint32_t)strlen(name)); + if (taosWriteFile(tsLogObj.logHandle->pFile, name, (uint32_t)strlen(name)) <= 0) { + TAOS_UNUSED(printf("failed to write to log file:%s, reason:%s\n", name, tstrerror(terrno))); + return terrno; + } return 0; } @@ -569,17 +599,17 @@ static int32_t taosInitNormalLog(const char *logName, int32_t maxFileNum) { static void taosUpdateLogNums(ELogLevel level) { switch (level) { case DEBUG_ERROR: - (void)atomic_add_fetch_64(&tsNumOfErrorLogs, 1); + TAOS_UNUSED(atomic_add_fetch_64(&tsNumOfErrorLogs, 1)); break; case DEBUG_INFO: - (void)atomic_add_fetch_64(&tsNumOfInfoLogs, 1); + TAOS_UNUSED(atomic_add_fetch_64(&tsNumOfInfoLogs, 1)); break; case DEBUG_DEBUG: - (void)atomic_add_fetch_64(&tsNumOfDebugLogs, 1); + TAOS_UNUSED(atomic_add_fetch_64(&tsNumOfDebugLogs, 1)); break; case DEBUG_DUMP: case DEBUG_TRACE: - (void)atomic_add_fetch_64(&tsNumOfTraceLogs, 1); + TAOS_UNUSED(atomic_add_fetch_64(&tsNumOfTraceLogs, 1)); break; default: break; @@ -590,7 +620,7 @@ static inline int32_t taosBuildLogHead(char *buffer, const char *flags) { struct tm Tm, *ptm; struct timeval timeSecs; - (void)taosGetTimeOfDay(&timeSecs); + TAOS_UNUSED(taosGetTimeOfDay(&timeSecs)); time_t curTime = timeSecs.tv_sec; ptm = taosLocalTime(&curTime, &Tm, NULL); @@ -603,15 +633,20 @@ static inline void taosPrintLogImp(ELogLevel level, int32_t dflag, const char *b if ((dflag & DEBUG_FILE) && tsLogObj.logHandle && tsLogObj.logHandle->pFile != NULL && osLogSpaceSufficient()) { taosUpdateLogNums(level); if (tsAsyncLog) { - (void)taosPushLogBuffer(tsLogObj.logHandle, buffer, len); + TAOS_UNUSED(taosPushLogBuffer(tsLogObj.logHandle, buffer, len)); } else { - (void)taosWriteFile(tsLogObj.logHandle->pFile, buffer, len); + if (taosWriteFile(tsLogObj.logHandle->pFile, buffer, len) <= 0) { + printf("failed to write log to file, reason:%s\n", tstrerror(terrno)); + } } if (tsNumOfLogLines > 0) { - (void)atomic_add_fetch_32(&tsLogObj.lines, 1); + TAOS_UNUSED(atomic_add_fetch_32(&tsLogObj.lines, 1)); if ((tsLogObj.lines > tsNumOfLogLines) && (tsLogObj.openInProgress == 0)) { - (void)taosOpenNewLogFile(); + int32_t code = taosOpenNewLogFile(); + if (code != 0) { + uError("failed to open new log file, reason:%s", tstrerror(code)); + } } } } @@ -619,7 +654,9 @@ static inline void taosPrintLogImp(ELogLevel level, int32_t dflag, const char *b if (dflag & DEBUG_SCREEN) { #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-result" - (void)write(1, buffer, (uint32_t)len); + if (write(1, buffer, (uint32_t)len) < 0) { + printf("failed to write log to screen, reason:%s\n", strerror(errno)); + } #pragma GCC diagnostic pop } } @@ -690,12 +727,14 @@ void taosPrintSlowLog(const char *format, ...) { buffer[len++] = '\n'; buffer[len] = 0; - (void)atomic_add_fetch_64(&tsNumOfSlowLogs, 1); + TAOS_UNUSED(atomic_add_fetch_64(&tsNumOfSlowLogs, 1)); if (tsAsyncLog) { - (void)taosPushLogBuffer(tsLogObj.slowHandle, buffer, len); + TAOS_UNUSED(taosPushLogBuffer(tsLogObj.slowHandle, buffer, len)); } else { - (void)taosWriteFile(tsLogObj.slowHandle->pFile, buffer, len); + if (taosWriteFile(tsLogObj.slowHandle->pFile, buffer, len) <= 0) { + printf("failed to write slow log to file, reason:%s\n", tstrerror(terrno)); + } } taosMemoryFree(buffer); @@ -714,7 +753,7 @@ void taosDumpData(unsigned char *msg, int32_t len) { pos += 3; if (c >= 16) { temp[pos++] = '\n'; - (void)taosWriteFile(tsLogObj.logHandle->pFile, temp, (uint32_t)pos); + TAOS_UNUSED((taosWriteFile(tsLogObj.logHandle->pFile, temp, (uint32_t)pos) <= 0)); c = 0; pos = 0; } @@ -722,7 +761,7 @@ void taosDumpData(unsigned char *msg, int32_t len) { temp[pos++] = '\n'; - (void)taosWriteFile(tsLogObj.logHandle->pFile, temp, (uint32_t)pos); + TAOS_UNUSED(taosWriteFile(tsLogObj.logHandle->pFile, temp, (uint32_t)pos)); } static void taosCloseLogByFd(TdFilePtr pFile) { @@ -855,12 +894,12 @@ static void taosWriteLog(SLogBuff *pLogBuf) { pLogBuf->lastDuration = 0; if (start < end) { - (void)taosWriteFile(pLogBuf->pFile, LOG_BUF_BUFFER(pLogBuf) + start, pollSize); + TAOS_UNUSED(taosWriteFile(pLogBuf->pFile, LOG_BUF_BUFFER(pLogBuf) + start, pollSize)); } else { int32_t tsize = LOG_BUF_SIZE(pLogBuf) - start; - (void)taosWriteFile(pLogBuf->pFile, LOG_BUF_BUFFER(pLogBuf) + start, tsize); + TAOS_UNUSED(taosWriteFile(pLogBuf->pFile, LOG_BUF_BUFFER(pLogBuf) + start, tsize)); - (void)taosWriteFile(pLogBuf->pFile, LOG_BUF_BUFFER(pLogBuf), end); + TAOS_UNUSED(taosWriteFile(pLogBuf->pFile, LOG_BUF_BUFFER(pLogBuf), end)); } dbgWN++; @@ -981,11 +1020,14 @@ void taosLogCrashInfo(char *nodeType, char *pMsg, int64_t msgLen, int signum, vo goto _return; } - (void)taosLockFile(pFile); + if (taosLockFile(pFile) < 0) { + taosPrintLog(flags, level, dflag, "failed to lock file:%s since %s", filepath, terrstr()); + goto _return; + } int64_t writeSize = taosWriteFile(pFile, &msgLen, sizeof(msgLen)); if (sizeof(msgLen) != writeSize) { - (void)taosUnLockFile(pFile); + TAOS_UNUSED(taosUnLockFile(pFile)); taosPrintLog(flags, level, dflag, "failed to write len to file:%s,%p wlen:%" PRId64 " tlen:%lu since %s", filepath, pFile, writeSize, sizeof(msgLen), terrstr()); goto _return; @@ -993,13 +1035,13 @@ void taosLogCrashInfo(char *nodeType, char *pMsg, int64_t msgLen, int signum, vo writeSize = taosWriteFile(pFile, pMsg, msgLen); if (msgLen != writeSize) { - (void)taosUnLockFile(pFile); + TAOS_UNUSED(taosUnLockFile(pFile)); taosPrintLog(flags, level, dflag, "failed to write file:%s,%p wlen:%" PRId64 " tlen:%" PRId64 " since %s", filepath, pFile, writeSize, msgLen, terrstr()); goto _return; } - (void)taosUnLockFile(pFile); + TAOS_UNUSED(taosUnLockFile(pFile)); } _return: @@ -1054,7 +1096,7 @@ void taosReadCrashInfo(char *filepath, char **pMsg, int64_t *pMsgLen, TdFilePtr return; } - (void)taosLockFile(pFile); + TAOS_UNUSED(taosLockFile(pFile)); } else { pFile = *pFd; } @@ -1093,10 +1135,10 @@ void taosReadCrashInfo(char *filepath, char **pMsg, int64_t *pMsgLen, TdFilePtr _return: if (truncateFile) { - (void)taosFtruncateFile(pFile, 0); + TAOS_UNUSED(taosFtruncateFile(pFile, 0)); } - (void)taosUnLockFile(pFile); - (void)taosCloseFile(&pFile); + TAOS_UNUSED(taosUnLockFile(pFile)); + TAOS_UNUSED(taosCloseFile(&pFile)); taosMemoryFree(buf); *pMsg = NULL; @@ -1106,11 +1148,11 @@ _return: void taosReleaseCrashLogFile(TdFilePtr pFile, bool truncateFile) { if (truncateFile) { - (void)taosFtruncateFile(pFile, 0); + TAOS_UNUSED(taosFtruncateFile(pFile, 0)); } - (void)taosUnLockFile(pFile); - (void)taosCloseFile(&pFile); + TAOS_UNUSED(taosUnLockFile(pFile)); + TAOS_UNUSED(taosCloseFile(&pFile)); } #ifdef NDEBUG From caa44873b899643e15bb021b934b61715798b8d7 Mon Sep 17 00:00:00 2001 From: kailixu Date: Wed, 25 Sep 2024 11:24:44 +0800 Subject: [PATCH 37/62] enh: return value process --- source/util/src/tlog.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/util/src/tlog.c b/source/util/src/tlog.c index b8433d3b5d..bae19a91bd 100644 --- a/source/util/src/tlog.c +++ b/source/util/src/tlog.c @@ -285,7 +285,7 @@ static void taosUnLockLogFile(TdFilePtr pFile) { if (tsLogObj.fileNum > 1) { int32_t code = taosUnLockFile(pFile); if (code != 0) { - printf("failed to unlock log file:%p, reason:%s\n", pFile, tstrerror(code)); + TAOS_UNUSED(printf("failed to unlock log file:%p, reason:%s\n", pFile, tstrerror(code))); } } } @@ -317,7 +317,7 @@ static void taosKeepOldLog(char *oldName) { if (taosCompressFile(oldName, compressFileName) == 0) { int32_t code = taosRemoveFile(oldName); if (code != 0) { - printf("failed to remove file:%s, reason:%s\n", oldName, tstrerror(code)); + TAOS_UNUSED(printf("failed to remove file:%s, reason:%s\n", oldName, tstrerror(code))); } } } @@ -393,7 +393,7 @@ static int32_t taosOpenNewLogFile() { OldFileKeeper *oldFileKeeper = taosOpenNewFile(); if (!oldFileKeeper) { - (void)taosThreadMutexUnlock(&tsLogObj.logMutex); + TAOS_UNUSED(taosThreadMutexUnlock(&tsLogObj.logMutex)); return terrno; } if (taosThreadCreate(&thread, &attr, taosThreadToCloseOldFile, oldFileKeeper) != 0) { @@ -636,7 +636,7 @@ static inline void taosPrintLogImp(ELogLevel level, int32_t dflag, const char *b TAOS_UNUSED(taosPushLogBuffer(tsLogObj.logHandle, buffer, len)); } else { if (taosWriteFile(tsLogObj.logHandle->pFile, buffer, len) <= 0) { - printf("failed to write log to file, reason:%s\n", tstrerror(terrno)); + TAOS_UNUSED(printf("failed to write log to file, reason:%s\n", tstrerror(terrno))); } } @@ -655,7 +655,7 @@ static inline void taosPrintLogImp(ELogLevel level, int32_t dflag, const char *b #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-result" if (write(1, buffer, (uint32_t)len) < 0) { - printf("failed to write log to screen, reason:%s\n", strerror(errno)); + TAOS_UNUSED(printf("failed to write log to screen, reason:%s\n", strerror(errno))); } #pragma GCC diagnostic pop } @@ -733,7 +733,7 @@ void taosPrintSlowLog(const char *format, ...) { TAOS_UNUSED(taosPushLogBuffer(tsLogObj.slowHandle, buffer, len)); } else { if (taosWriteFile(tsLogObj.slowHandle->pFile, buffer, len) <= 0) { - printf("failed to write slow log to file, reason:%s\n", tstrerror(terrno)); + TAOS_UNUSED(printf("failed to write slow log to file, reason:%s\n", tstrerror(terrno))); } } From ecf5f35cd0bbad7dfce10e8b94ead013fa29a6ea Mon Sep 17 00:00:00 2001 From: xsren <285808407@qq.com> Date: Wed, 25 Sep 2024 14:08:32 +0800 Subject: [PATCH 38/62] fix: windows crash --- source/client/src/clientEnv.c | 7 ++++++- source/client/src/clientMonitor.c | 5 ++--- source/os/src/osFile.c | 7 +++++-- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c index 53be1fccf4..3b755c2921 100644 --- a/source/client/src/clientEnv.c +++ b/source/client/src/clientEnv.c @@ -197,7 +197,12 @@ static int32_t generateWriteSlowLog(STscObj *pTscObj, SRequestObj *pRequest, int ENV_JSON_FALSE_CHECK(cJSON_AddItemToObject(json, "db", cJSON_CreateString(""))); } - char *value = cJSON_PrintUnformatted(json); + char *value = cJSON_PrintUnformatted(json); + if (value == NULL) { + tscError("failed to print json"); + code = TSDB_CODE_FAILED; + goto _end; + } MonitorSlowLogData data = {0}; data.clusterId = pTscObj->pAppInfo->clusterId; data.type = SLOW_LOG_WRITE; diff --git a/source/client/src/clientMonitor.c b/source/client/src/clientMonitor.c index f424e4d1a2..6667c4c741 100644 --- a/source/client/src/clientMonitor.c +++ b/source/client/src/clientMonitor.c @@ -447,20 +447,19 @@ static char* readFile(TdFilePtr pFile, int64_t* offset, int64_t size) { char* pCont = NULL; int64_t totalSize = 0; if (size - *offset >= SLOW_LOG_SEND_SIZE_MAX) { - pCont = taosMemoryCalloc(1, 4 + SLOW_LOG_SEND_SIZE_MAX); // 4 reserved for [] totalSize = 4 + SLOW_LOG_SEND_SIZE_MAX; } else { - pCont = taosMemoryCalloc(1, 4 + (size - *offset)); totalSize = 4 + (size - *offset); } + pCont = taosMemoryCalloc(1, totalSize); // 4 reserved for [] if (pCont == NULL) { tscError("failed to allocate memory for slow log, size:%" PRId64, totalSize); return NULL; } char* buf = pCont; (void)strcat(buf++, "["); - int64_t readSize = taosReadFile(pFile, buf, SLOW_LOG_SEND_SIZE_MAX); + int64_t readSize = taosReadFile(pFile, buf, totalSize - 4); // 4 reserved for [] if (readSize <= 0) { if (readSize < 0) { tscError("failed to read len from file:%p since %s", pFile, terrstr()); diff --git a/source/os/src/osFile.c b/source/os/src/osFile.c index 40f48af266..ef8c1eb860 100644 --- a/source/os/src/osFile.c +++ b/source/os/src/osFile.c @@ -426,16 +426,19 @@ int64_t taosReadFile(TdFilePtr pFile, void *buf, int64_t count) { return terrno; } + int64_t res = 0; DWORD bytesRead; if (!ReadFile(pFile->hFile, buf, count, &bytesRead, NULL)) { DWORD errCode = GetLastError(); terrno = TAOS_SYSTEM_WINAPI_ERROR(errCode); - bytesRead = -1; + res = -1; + } else { + res = bytesRead; } #if FILE_WITH_LOCK (void)taosThreadRwlockUnlock(&(pFile->rwlock)); #endif - return bytesRead; + return res; } int64_t taosWriteFile(TdFilePtr pFile, const void *buf, int64_t count) { From 6e6df9fa08ae3c468e9898189e1411c0d10583a1 Mon Sep 17 00:00:00 2001 From: kailixu Date: Wed, 25 Sep 2024 14:18:47 +0800 Subject: [PATCH 39/62] enh: return value process --- source/util/src/tlog.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/source/util/src/tlog.c b/source/util/src/tlog.c index bae19a91bd..2a5de3dfe0 100644 --- a/source/util/src/tlog.c +++ b/source/util/src/tlog.c @@ -350,7 +350,9 @@ static OldFileKeeper *taosOpenNewFile() { } TAOS_UNUSED(taosLockLogFile(pFile)); - TAOS_UNUSED(taosLSeekFile(pFile, 0, SEEK_SET)); + if (taosLSeekFile(pFile, 0, SEEK_SET) < 0) { + uWarn("failed to seek file:%s, reason:%s", name, tstrerror(terrno)); + } TdFilePtr pOldFile = tsLogObj.logHandle->pFile; tsLogObj.logHandle->pFile = pFile; @@ -568,28 +570,33 @@ static int32_t taosInitNormalLog(const char *logName, int32_t maxFileNum) { int64_t filesize = 0; if (taosFStatFile(tsLogObj.logHandle->pFile, &filesize, NULL) != 0) { (void)printf("\nfailed to fstat log file:%s, reason:%s\n", name, strerror(errno)); + taosUnLockLogFile(tsLogObj.logHandle->pFile); return terrno; } tsLogObj.lines = (int32_t)(filesize / 60); if ((code = taosLSeekFile(tsLogObj.logHandle->pFile, 0, SEEK_END)) < 0) { TAOS_UNUSED(printf("failed to seek to the end of log file:%s, reason:%s\n", name, tstrerror(code))); + taosUnLockLogFile(tsLogObj.logHandle->pFile); return code; } (void)sprintf(name, "==================================================\n"); if (taosWriteFile(tsLogObj.logHandle->pFile, name, (uint32_t)strlen(name)) <= 0) { TAOS_UNUSED(printf("failed to write to log file:%s, reason:%s\n", name, tstrerror(terrno))); + taosUnLockLogFile(tsLogObj.logHandle->pFile); return terrno; } (void)sprintf(name, " new log file \n"); if (taosWriteFile(tsLogObj.logHandle->pFile, name, (uint32_t)strlen(name)) <= 0) { TAOS_UNUSED(printf("failed to write to log file:%s, reason:%s\n", name, tstrerror(terrno))); + taosUnLockLogFile(tsLogObj.logHandle->pFile); return terrno; } (void)sprintf(name, "==================================================\n"); if (taosWriteFile(tsLogObj.logHandle->pFile, name, (uint32_t)strlen(name)) <= 0) { TAOS_UNUSED(printf("failed to write to log file:%s, reason:%s\n", name, tstrerror(terrno))); + taosUnLockLogFile(tsLogObj.logHandle->pFile); return terrno; } @@ -635,9 +642,7 @@ static inline void taosPrintLogImp(ELogLevel level, int32_t dflag, const char *b if (tsAsyncLog) { TAOS_UNUSED(taosPushLogBuffer(tsLogObj.logHandle, buffer, len)); } else { - if (taosWriteFile(tsLogObj.logHandle->pFile, buffer, len) <= 0) { - TAOS_UNUSED(printf("failed to write log to file, reason:%s\n", tstrerror(terrno))); - } + TAOS_UNUSED(taosWriteFile(tsLogObj.logHandle->pFile, buffer, len)); } if (tsNumOfLogLines > 0) { @@ -732,9 +737,7 @@ void taosPrintSlowLog(const char *format, ...) { if (tsAsyncLog) { TAOS_UNUSED(taosPushLogBuffer(tsLogObj.slowHandle, buffer, len)); } else { - if (taosWriteFile(tsLogObj.slowHandle->pFile, buffer, len) <= 0) { - TAOS_UNUSED(printf("failed to write slow log to file, reason:%s\n", tstrerror(terrno))); - } + TAOS_UNUSED(taosWriteFile(tsLogObj.slowHandle->pFile, buffer, len)); } taosMemoryFree(buffer); From 9fae6c25e39a716f3798a36b558a1dcfc064ec0c Mon Sep 17 00:00:00 2001 From: kailixu Date: Wed, 25 Sep 2024 14:22:51 +0800 Subject: [PATCH 40/62] enh: return value process --- source/util/src/tlog.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/util/src/tlog.c b/source/util/src/tlog.c index 2a5de3dfe0..274edeaa90 100644 --- a/source/util/src/tlog.c +++ b/source/util/src/tlog.c @@ -549,6 +549,7 @@ static int32_t taosInitNormalLog(const char *logName, int32_t maxFileNum) { */ maxFileNum = 1; #endif + processLogFileName(logName, maxFileNum); char name[PATH_MAX + 50] = "\0"; From 7aa0c5a9cac78c6da7bb52d60982cd09419fde5c Mon Sep 17 00:00:00 2001 From: zhiyong Date: Wed, 25 Sep 2024 15:40:09 +0800 Subject: [PATCH 41/62] fix microsecond typo --- docs/zh/05-basic/03-query.md | 2 +- docs/zh/14-reference/03-taos-sql/02-database.md | 1 - docs/zh/14-reference/03-taos-sql/10-function.md | 2 +- docs/zh/14-reference/03-taos-sql/28-index.md | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/zh/05-basic/03-query.md b/docs/zh/05-basic/03-query.md index 1b4c3731e6..6afdba0997 100644 --- a/docs/zh/05-basic/03-query.md +++ b/docs/zh/05-basic/03-query.md @@ -181,7 +181,7 @@ INTERVAL(interval_val [, interval_offset]) - FILL:用于指定窗口区间数据缺失的情况下,数据的填充模式。 对于时间窗口,interval_val 和 sliding_val 都表示时间段, 语法上支持三种方式。例如: -1. INTERVAL(1s, 500a) SLIDING(1s),带时间单位的形式,其中的时间单位是单字符表示, 分别为: a (毫秒), b (纳秒), d (天), h (小时), m (分钟), n (月), s (秒), u (微妙), w (周), y (年); +1. INTERVAL(1s, 500a) SLIDING(1s),带时间单位的形式,其中的时间单位是单字符表示, 分别为: a (毫秒), b (纳秒), d (天), h (小时), m (分钟), n (月), s (秒), u (微秒), w (周), y (年); 2. INTERVAL(1000, 500) SLIDING(1000),不带时间单位的形式,将使用查询库的时间精度作为默认时间单位,当存在多个库时默认采用精度更高的库; 3. INTERVAL('1s', '500a') SLIDING('1s'),带时间单位的字符串形式,字符串内部不能有任何空格等其它字符。 diff --git a/docs/zh/14-reference/03-taos-sql/02-database.md b/docs/zh/14-reference/03-taos-sql/02-database.md index d2e9ba0646..7d040a2c44 100644 --- a/docs/zh/14-reference/03-taos-sql/02-database.md +++ b/docs/zh/14-reference/03-taos-sql/02-database.md @@ -80,7 +80,6 @@ database_option: { ```sql create database if not exists db vgroups 10 buffer 10 - ``` 以上示例创建了一个有 10 个 vgroup 名为 db 的数据库, 其中每个 vnode 分配 10MB 的写入缓存 diff --git a/docs/zh/14-reference/03-taos-sql/10-function.md b/docs/zh/14-reference/03-taos-sql/10-function.md index 007e1dd64a..ac69f64f08 100644 --- a/docs/zh/14-reference/03-taos-sql/10-function.md +++ b/docs/zh/14-reference/03-taos-sql/10-function.md @@ -1214,7 +1214,7 @@ TO_TIMESTAMP(ts_str_literal, format_str_literal) - 如果没有指定完整的时间,那么默认时间值为指定或默认时区的 `1970-01-01 00:00:00`, 未指定部分使用该默认值中的对应部分. 暂不支持只指定年日而不指定月日的格式, 如'yyyy-mm-DDD', 支持'yyyy-mm-DD'. - 如果格式串中有`AM`, `PM`等, 那么小时必须是12小时制, 范围必须是01-12. - `to_timestamp`转换具有一定的容错机制, 在格式串和时间戳串不完全对应时, 有时也可转换, 如: `to_timestamp('200101/2', 'yyyyMM1/dd')`, 格式串中多出来的1会被丢弃. 格式串与时间戳串中多余的空格字符(空格, tab等)也会被 自动忽略. 如`to_timestamp(' 23 年 - 1 月 - 01 日 ', 'yy 年-MM月-dd日')` 可以被成功转换. 虽然`MM`等字段需要两个数字对应(只有一位时前面补0), 在`to_timestamp`时, 一个数字也可以成功转换. -- 输出时间戳的精度与查询表的精度相同, 若查询未指定表, 则输出精度为毫秒. 如`select to_timestamp('2023-08-1 10:10:10.123456789', 'yyyy-mm-dd hh:mi:ss.ns')`的输出将会把微妙和纳秒进行截断. 如果指定一张纳秒表, 那么就不会发生截断, 如`select to_timestamp('2023-08-1 10:10:10.123456789', 'yyyy-mm-dd hh:mi:ss.ns') from db_ns.table_ns limit 1`. +- 输出时间戳的精度与查询表的精度相同, 若查询未指定表, 则输出精度为毫秒. 如`select to_timestamp('2023-08-1 10:10:10.123456789', 'yyyy-mm-dd hh:mi:ss.ns')`的输出将会把微秒和纳秒进行截断. 如果指定一张纳秒表, 那么就不会发生截断, 如`select to_timestamp('2023-08-1 10:10:10.123456789', 'yyyy-mm-dd hh:mi:ss.ns') from db_ns.table_ns limit 1`. ### 时间和日期函数 diff --git a/docs/zh/14-reference/03-taos-sql/28-index.md b/docs/zh/14-reference/03-taos-sql/28-index.md index 14c45b6585..ef625de1e7 100644 --- a/docs/zh/14-reference/03-taos-sql/28-index.md +++ b/docs/zh/14-reference/03-taos-sql/28-index.md @@ -28,7 +28,7 @@ TSMA只能基于超级表和普通表创建, 不能基于子表创建. 由于TSMA输出为一张超级表, 因此输出表的行长度受最大行长度限制, 不同函数的`中间结果`大小各异, 一般都大于原始数据大小, 若输出表的行长度大于最大行长度限制, 将会报`Row length exceeds max length`错误. 此时需要减少函数个数或者将常用的函数进行分组拆分到多个TSMA中. -窗口大小的限制为[1m ~ 1y/12n]. INTERVAL 的单位与查询中INTERVAL子句相同, 如 a (毫秒), b (纳秒), h (小时), m (分钟), s (秒), u (微妙), d (天), w(周), n(月), y(年). +窗口大小的限制为[1m ~ 1y/12n]. INTERVAL 的单位与查询中INTERVAL子句相同, 如 a (毫秒), b (纳秒), h (小时), m (分钟), s (秒), u (微秒), d (天), w(周), n(月), y(年). TSMA为库内对象, 但名字全局唯一. 集群内一共可创建TSMA个数受参数`maxTsmaNum`限制, 参数默认值为3, 范围: [0-3]. 注意, 由于TSMA后台计算使用流计算, 因此每创建一条TSMA, 将会创建一条流, 因此能够创建的TSMA条数也受当前已经存在的流条数和最大可创建流条数限制. From e19514e2c4bcdff78e2eaa469e447b03b4c968e5 Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Wed, 25 Sep 2024 16:52:17 +0800 Subject: [PATCH 42/62] void cleanups --- source/common/src/cos.c | 2 -- source/common/src/cos_cp.c | 2 +- source/dnode/vnode/src/inc/tsdb.h | 4 ++-- source/dnode/vnode/src/tsdb/tsdbCache.c | 7 ++----- source/dnode/vnode/src/tsdb/tsdbReaderWriter.c | 2 +- 5 files changed, 6 insertions(+), 11 deletions(-) diff --git a/source/common/src/cos.c b/source/common/src/cos.c index 88f97a498d..b5032bbecd 100644 --- a/source/common/src/cos.c +++ b/source/common/src/cos.c @@ -897,8 +897,6 @@ upload: if (partData.put_object_data.status != S3StatusOK) { s3PrintError(__FILE__, __LINE__, __func__, partData.put_object_data.status, partData.put_object_data.err_msg); TAOS_CHECK_GOTO(TAOS_SYSTEM_ERROR(EIO), &lino, _exit); - - //(void)cos_cp_dump(&cp); } if (!manager.etags[seq - 1]) { diff --git a/source/common/src/cos_cp.c b/source/common/src/cos_cp.c index adf4160abe..6aa84c0c3c 100644 --- a/source/common/src/cos_cp.c +++ b/source/common/src/cos_cp.c @@ -309,7 +309,7 @@ int32_t cos_cp_dump(SCheckpoint* cp) { if (!item) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _exit); } - (void)cJSON_AddItemToArray(ajson, item); + cJSON_AddItemToArray(ajson, item); if (NULL == cJSON_AddNumberToObject(item, "index", cp->parts[i].index)) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _exit); diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index 20c43bb185..30efee42e5 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -375,7 +375,7 @@ struct STsdb { struct { SVHashTable *ht; SArray *arr; - } *commitInfo; + } * commitInfo; }; struct TSDBKEY { @@ -949,7 +949,7 @@ int32_t tsdbBICacheRelease(SLRUCache *pCache, LRUHandle *h); int32_t tsdbCacheGetBlockS3(SLRUCache *pCache, STsdbFD *pFD, LRUHandle **handle); int32_t tsdbCacheGetPageS3(SLRUCache *pCache, STsdbFD *pFD, int64_t pgno, LRUHandle **handle); -int32_t tsdbCacheSetPageS3(SLRUCache *pCache, STsdbFD *pFD, int64_t pgno, uint8_t *pPage); +void tsdbCacheSetPageS3(SLRUCache *pCache, STsdbFD *pFD, int64_t pgno, uint8_t *pPage); int32_t tsdbCacheDeleteLastrow(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey); int32_t tsdbCacheDeleteLast(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey); diff --git a/source/dnode/vnode/src/tsdb/tsdbCache.c b/source/dnode/vnode/src/tsdb/tsdbCache.c index 2c70fc1816..6da705423a 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCache.c +++ b/source/dnode/vnode/src/tsdb/tsdbCache.c @@ -3682,8 +3682,7 @@ int32_t tsdbCacheGetPageS3(SLRUCache *pCache, STsdbFD *pFD, int64_t pgno, LRUHan return code; } -int32_t tsdbCacheSetPageS3(SLRUCache *pCache, STsdbFD *pFD, int64_t pgno, uint8_t *pPage) { - int32_t code = 0; +void tsdbCacheSetPageS3(SLRUCache *pCache, STsdbFD *pFD, int64_t pgno, uint8_t *pPage) { char key[128] = {0}; int keyLen = 0; LRUHandle *handle = NULL; @@ -3696,7 +3695,7 @@ int32_t tsdbCacheSetPageS3(SLRUCache *pCache, STsdbFD *pFD, int64_t pgno, uint8_ _taos_lru_deleter_t deleter = deleteBCache; uint8_t *pPg = taosMemoryMalloc(charge); if (!pPg) { - TAOS_RETURN(terrno); + return; // ignore error with s3 cache and leave error untouched } memcpy(pPg, pPage, charge); @@ -3710,6 +3709,4 @@ int32_t tsdbCacheSetPageS3(SLRUCache *pCache, STsdbFD *pFD, int64_t pgno, uint8_ (void)taosThreadMutexUnlock(&pFD->pTsdb->pgMutex); tsdbCacheRelease(pFD->pTsdb->pgCache, handle); - - TAOS_RETURN(code); } diff --git a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c index c0d8f7f17d..d867318e1c 100644 --- a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c +++ b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c @@ -483,7 +483,7 @@ static int32_t tsdbReadFileS3(STsdbFD *pFD, int64_t offset, uint8_t *pBuf, int64 int nPage = pgnoEnd - pgno + 1; for (int i = 0; i < nPage; ++i) { if (pFD->szFile != pgno) { // DONOT cache last volatile page - (void)tsdbCacheSetPageS3(pFD->pTsdb->pgCache, pFD, pgno, pBlock + i * pFD->szPage); + tsdbCacheSetPageS3(pFD->pTsdb->pgCache, pFD, pgno, pBlock + i * pFD->szPage); } if (szHint > 0 && n >= size) { From 3c2420fa9ba8cef9f1a57641ec9301ecd0331660 Mon Sep 17 00:00:00 2001 From: gccgdb1234 Date: Wed, 25 Sep 2024 16:58:59 +0800 Subject: [PATCH 43/62] doc: add NOT IN operator --- docs/zh/14-reference/03-taos-sql/16-operators.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/zh/14-reference/03-taos-sql/16-operators.md b/docs/zh/14-reference/03-taos-sql/16-operators.md index 76af4037c8..50586c3a89 100644 --- a/docs/zh/14-reference/03-taos-sql/16-operators.md +++ b/docs/zh/14-reference/03-taos-sql/16-operators.md @@ -41,9 +41,10 @@ TDengine 支持 `UNION ALL` 和 `UNION` 操作符。UNION ALL 将查询返回的 | 5 | IS [NOT] NULL | 所有类型 | 是否为空值 | | 6 | [NOT] BETWEEN AND | 除 BOOL、BLOB、MEDIUMBLOB、JSON 和 GEOMETRY 外的所有类型 | 闭区间比较 | | 7 | IN | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型,且不可以为表的时间戳主键列 | 与列表内的任意值相等 | -| 8 | LIKE | BINARY、NCHAR 和 VARCHAR | 通配符匹配 | -| 9 | MATCH, NMATCH | BINARY、NCHAR 和 VARCHAR | 正则表达式匹配 | -| 10 | CONTAINS | JSON | JSON 中是否存在某键 | +| 8 | NOT IN | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型,且不可以为表的时间戳主键列 | 与列表内的任意值都不相等 | +| 9 | LIKE | BINARY、NCHAR 和 VARCHAR | 通配符匹配 | +| 10 | MATCH, NMATCH | BINARY、NCHAR 和 VARCHAR | 正则表达式匹配 | +| 11 | CONTAINS | JSON | JSON 中是否存在某键 | LIKE 条件使用通配符字符串进行匹配检查,规则如下: From 10204b8d78b0ba6a25c9ea17cf469b8b029d44a3 Mon Sep 17 00:00:00 2001 From: gccgdb1234 Date: Wed, 25 Sep 2024 17:09:46 +0800 Subject: [PATCH 44/62] docs: add NOT LIKE operator --- docs/zh/14-reference/03-taos-sql/16-operators.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/zh/14-reference/03-taos-sql/16-operators.md b/docs/zh/14-reference/03-taos-sql/16-operators.md index 50586c3a89..96a35e9ebf 100644 --- a/docs/zh/14-reference/03-taos-sql/16-operators.md +++ b/docs/zh/14-reference/03-taos-sql/16-operators.md @@ -42,9 +42,10 @@ TDengine 支持 `UNION ALL` 和 `UNION` 操作符。UNION ALL 将查询返回的 | 6 | [NOT] BETWEEN AND | 除 BOOL、BLOB、MEDIUMBLOB、JSON 和 GEOMETRY 外的所有类型 | 闭区间比较 | | 7 | IN | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型,且不可以为表的时间戳主键列 | 与列表内的任意值相等 | | 8 | NOT IN | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型,且不可以为表的时间戳主键列 | 与列表内的任意值都不相等 | -| 9 | LIKE | BINARY、NCHAR 和 VARCHAR | 通配符匹配 | -| 10 | MATCH, NMATCH | BINARY、NCHAR 和 VARCHAR | 正则表达式匹配 | -| 11 | CONTAINS | JSON | JSON 中是否存在某键 | +| 9 | LIKE | BINARY、NCHAR 和 VARCHAR | 通配符匹配所指定的模式串 | +| 10 | NOT LIKE | BINARY、NCHAR 和 VARCHAR | 通配符不匹配所指定的模式串 | +| 11 | MATCH, NMATCH | BINARY、NCHAR 和 VARCHAR | 正则表达式匹配 | +| 12 | CONTAINS | JSON | JSON 中是否存在某键 | LIKE 条件使用通配符字符串进行匹配检查,规则如下: From ea5a2a694649a88d5b7428aa2bdcf875e5291cd4 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 25 Sep 2024 17:45:10 +0800 Subject: [PATCH 45/62] ehn: remove void --- source/common/src/cos.c | 5 +- source/common/src/tglobal.c | 51 ++++++++++--------- source/common/src/trow.c | 6 ++- source/common/src/ttime.c | 28 +++++----- source/libs/index/inc/indexUtil.h | 34 ++++++------- source/libs/stream/src/streamBackendRocksdb.c | 16 ++++-- source/libs/transport/src/thttp.c | 12 +++-- source/libs/transport/src/tmsgcb.c | 4 +- source/libs/transport/src/trans.c | 11 ++-- source/libs/transport/src/transCli.c | 28 +++++++--- source/libs/transport/src/transComm.c | 11 +++- source/libs/transport/src/transSvr.c | 19 +++++-- source/libs/wal/src/walMgmt.c | 4 +- source/libs/wal/src/walRead.c | 17 +++++-- source/libs/wal/src/walWrite.c | 16 ++++-- 15 files changed, 171 insertions(+), 91 deletions(-) diff --git a/source/common/src/cos.c b/source/common/src/cos.c index 88f97a498d..9d472a5284 100644 --- a/source/common/src/cos.c +++ b/source/common/src/cos.c @@ -1292,7 +1292,10 @@ int32_t s3DeleteObjects(const char *object_name[], int nobject) { void s3DeleteObjectsByPrefix(const char *prefix) { SArray *objectArray = getListByPrefix(prefix); if (objectArray == NULL) return; - (void)s3DeleteObjects(TARRAY_DATA(objectArray), TARRAY_SIZE(objectArray)); + int32_t code = s3DeleteObjects(TARRAY_DATA(objectArray), TARRAY_SIZE(objectArray)); + if (code) { + uError("failed to delete objects with prefix %s", prefix); + } taosArrayDestroyEx(objectArray, s3FreeObjectKey); } diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index a3220706c7..2aef97ed1b 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -2299,11 +2299,14 @@ static int taosLogVarComp(void const *lp, void const *rp) { return strcasecmp(lpVar->name, rpVar->name); } -static int32_t taosCheckAndSetDebugFlag(int32_t *pFlagPtr, char *name, int32_t flag, SArray *noNeedToSetVars) { +static void taosCheckAndSetDebugFlag(int32_t *pFlagPtr, char *name, int32_t flag, SArray *noNeedToSetVars) { if (noNeedToSetVars != NULL && taosArraySearch(noNeedToSetVars, name, taosLogVarComp, TD_EQ) != NULL) { - TAOS_RETURN(TSDB_CODE_SUCCESS); + return; } - return taosSetDebugFlag(pFlagPtr, name, flag); + if (taosSetDebugFlag(pFlagPtr, name, flag) != 0) { + uError("failed to set flag %s to %d", name, flag); + } + return; } int32_t taosSetGlobalDebugFlag(int32_t flag) { return taosSetAllDebugFlag(tsCfg, flag); } @@ -2320,29 +2323,29 @@ static int32_t taosSetAllDebugFlag(SConfig *pCfg, int32_t flag) { pItem->i32 = flag; noNeedToSetVars = pItem->array; - (void)taosCheckAndSetDebugFlag(&simDebugFlag, "simDebugFlag", flag, noNeedToSetVars); - (void)taosCheckAndSetDebugFlag(&uDebugFlag, "uDebugFlag", flag, noNeedToSetVars); - (void)taosCheckAndSetDebugFlag(&rpcDebugFlag, "rpcDebugFlag", flag, noNeedToSetVars); - (void)taosCheckAndSetDebugFlag(&qDebugFlag, "qDebugFlag", flag, noNeedToSetVars); + taosCheckAndSetDebugFlag(&simDebugFlag, "simDebugFlag", flag, noNeedToSetVars); + taosCheckAndSetDebugFlag(&uDebugFlag, "uDebugFlag", flag, noNeedToSetVars); + taosCheckAndSetDebugFlag(&rpcDebugFlag, "rpcDebugFlag", flag, noNeedToSetVars); + taosCheckAndSetDebugFlag(&qDebugFlag, "qDebugFlag", flag, noNeedToSetVars); - (void)taosCheckAndSetDebugFlag(&jniDebugFlag, "jniDebugFlag", flag, noNeedToSetVars); - (void)taosCheckAndSetDebugFlag(&cDebugFlag, "cDebugFlag", flag, noNeedToSetVars); + taosCheckAndSetDebugFlag(&jniDebugFlag, "jniDebugFlag", flag, noNeedToSetVars); + taosCheckAndSetDebugFlag(&cDebugFlag, "cDebugFlag", flag, noNeedToSetVars); - (void)taosCheckAndSetDebugFlag(&dDebugFlag, "dDebugFlag", flag, noNeedToSetVars); - (void)taosCheckAndSetDebugFlag(&vDebugFlag, "vDebugFlag", flag, noNeedToSetVars); - (void)taosCheckAndSetDebugFlag(&mDebugFlag, "mDebugFlag", flag, noNeedToSetVars); - (void)taosCheckAndSetDebugFlag(&wDebugFlag, "wDebugFlag", flag, noNeedToSetVars); - (void)taosCheckAndSetDebugFlag(&sDebugFlag, "sDebugFlag", flag, noNeedToSetVars); - (void)taosCheckAndSetDebugFlag(&tsdbDebugFlag, "tsdbDebugFlag", flag, noNeedToSetVars); - (void)taosCheckAndSetDebugFlag(&tqDebugFlag, "tqDebugFlag", flag, noNeedToSetVars); - (void)taosCheckAndSetDebugFlag(&fsDebugFlag, "fsDebugFlag", flag, noNeedToSetVars); - (void)taosCheckAndSetDebugFlag(&udfDebugFlag, "udfDebugFlag", flag, noNeedToSetVars); - (void)taosCheckAndSetDebugFlag(&smaDebugFlag, "smaDebugFlag", flag, noNeedToSetVars); - (void)taosCheckAndSetDebugFlag(&idxDebugFlag, "idxDebugFlag", flag, noNeedToSetVars); - (void)taosCheckAndSetDebugFlag(&tdbDebugFlag, "tdbDebugFlag", flag, noNeedToSetVars); - (void)taosCheckAndSetDebugFlag(&metaDebugFlag, "metaDebugFlag", flag, noNeedToSetVars); - (void)taosCheckAndSetDebugFlag(&stDebugFlag, "stDebugFlag", flag, noNeedToSetVars); - (void)taosCheckAndSetDebugFlag(&sndDebugFlag, "sndDebugFlag", flag, noNeedToSetVars); + taosCheckAndSetDebugFlag(&dDebugFlag, "dDebugFlag", flag, noNeedToSetVars); + taosCheckAndSetDebugFlag(&vDebugFlag, "vDebugFlag", flag, noNeedToSetVars); + taosCheckAndSetDebugFlag(&mDebugFlag, "mDebugFlag", flag, noNeedToSetVars); + taosCheckAndSetDebugFlag(&wDebugFlag, "wDebugFlag", flag, noNeedToSetVars); + taosCheckAndSetDebugFlag(&sDebugFlag, "sDebugFlag", flag, noNeedToSetVars); + taosCheckAndSetDebugFlag(&tsdbDebugFlag, "tsdbDebugFlag", flag, noNeedToSetVars); + taosCheckAndSetDebugFlag(&tqDebugFlag, "tqDebugFlag", flag, noNeedToSetVars); + taosCheckAndSetDebugFlag(&fsDebugFlag, "fsDebugFlag", flag, noNeedToSetVars); + taosCheckAndSetDebugFlag(&udfDebugFlag, "udfDebugFlag", flag, noNeedToSetVars); + taosCheckAndSetDebugFlag(&smaDebugFlag, "smaDebugFlag", flag, noNeedToSetVars); + taosCheckAndSetDebugFlag(&idxDebugFlag, "idxDebugFlag", flag, noNeedToSetVars); + taosCheckAndSetDebugFlag(&tdbDebugFlag, "tdbDebugFlag", flag, noNeedToSetVars); + taosCheckAndSetDebugFlag(&metaDebugFlag, "metaDebugFlag", flag, noNeedToSetVars); + taosCheckAndSetDebugFlag(&stDebugFlag, "stDebugFlag", flag, noNeedToSetVars); + taosCheckAndSetDebugFlag(&sndDebugFlag, "sndDebugFlag", flag, noNeedToSetVars); taosArrayClear(noNeedToSetVars); // reset array diff --git a/source/common/src/trow.c b/source/common/src/trow.c index 626d1141e0..2b95e96130 100644 --- a/source/common/src/trow.c +++ b/source/common/src/trow.c @@ -354,8 +354,10 @@ bool tdSKvRowGetVal(STSRow *pRow, col_id_t colId, col_id_t colIdx, SCellVal *pVa } void *pBitmap = tdGetBitmapAddrKv(pRow, tdRowGetNCols(pRow)); - (void)tdGetKvRowValOfCol(pVal, pRow, pBitmap, pColIdx->offset, - POINTER_DISTANCE(pColIdx, TD_ROW_COL_IDX(pRow)) / sizeof(SKvRowIdx)); + if (tdGetKvRowValOfCol(pVal, pRow, pBitmap, pColIdx->offset, + POINTER_DISTANCE(pColIdx, TD_ROW_COL_IDX(pRow)) / sizeof(SKvRowIdx)) != TSDB_CODE_SUCCESS) { + return false; + } return true; } diff --git a/source/common/src/ttime.c b/source/common/src/ttime.c index 7e8749ef8b..98e46ab672 100644 --- a/source/common/src/ttime.c +++ b/source/common/src/ttime.c @@ -30,7 +30,9 @@ static int64_t m_deltaUtc = 0; void deltaToUtcInitOnce() { struct tm tm = {0}; - (void)taosStrpTime("1970-01-01 00:00:00", (const char*)("%Y-%m-%d %H:%M:%S"), &tm); + if (taosStrpTime("1970-01-01 00:00:00", (const char*)("%Y-%m-%d %H:%M:%S"), &tm) != 0) { + uError("failed to parse time string"); + } m_deltaUtc = (int64_t)taosMktime(&tm); // printf("====delta:%lld\n\n", seconds); } @@ -689,10 +691,10 @@ int64_t taosTimeAdd(int64_t t, int64_t duration, char unit, int32_t precision) { int64_t numOfMonth = (unit == 'y') ? duration * 12 : duration; int64_t fraction = t % TSDB_TICK_PER_SECOND(precision); - struct tm tm; - time_t tt = (time_t)(t / TSDB_TICK_PER_SECOND(precision)); - (void)taosLocalTime(&tt, &tm, NULL); - int32_t mon = tm.tm_year * 12 + tm.tm_mon + (int32_t)numOfMonth; + struct tm tm; + time_t tt = (time_t)(t / TSDB_TICK_PER_SECOND(precision)); + struct tm* ptm = taosLocalTime(&tt, &tm, NULL); + int32_t mon = tm.tm_year * 12 + tm.tm_mon + (int32_t)numOfMonth; tm.tm_year = mon / 12; tm.tm_mon = mon % 12; int daysOfMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; @@ -750,13 +752,13 @@ int32_t taosTimeCountIntervalForFill(int64_t skey, int64_t ekey, int64_t interva skey /= (int64_t)(TSDB_TICK_PER_SECOND(precision)); ekey /= (int64_t)(TSDB_TICK_PER_SECOND(precision)); - struct tm tm; - time_t t = (time_t)skey; - (void)taosLocalTime(&t, &tm, NULL); - int32_t smon = tm.tm_year * 12 + tm.tm_mon; + struct tm tm; + time_t t = (time_t)skey; + struct tm* ptm = taosLocalTime(&t, &tm, NULL); + int32_t smon = tm.tm_year * 12 + tm.tm_mon; t = (time_t)ekey; - (void)taosLocalTime(&t, &tm, NULL); + ptm = taosLocalTime(&t, &tm, NULL); int32_t emon = tm.tm_year * 12 + tm.tm_mon; if (unit == 'y') { @@ -778,9 +780,9 @@ int64_t taosTimeTruncate(int64_t ts, const SInterval* pInterval) { if (IS_CALENDAR_TIME_DURATION(pInterval->slidingUnit)) { start /= (int64_t)(TSDB_TICK_PER_SECOND(precision)); - struct tm tm; - time_t tt = (time_t)start; - (void)taosLocalTime(&tt, &tm, NULL); + struct tm tm; + time_t tt = (time_t)start; + struct tm* ptm = taosLocalTime(&tt, &tm, NULL); tm.tm_sec = 0; tm.tm_min = 0; tm.tm_hour = 0; diff --git a/source/libs/index/inc/indexUtil.h b/source/libs/index/inc/indexUtil.h index 61c16e1217..9eb8001d17 100644 --- a/source/libs/index/inc/indexUtil.h +++ b/source/libs/index/inc/indexUtil.h @@ -21,29 +21,29 @@ extern "C" { #endif -#define SERIALIZE_MEM_TO_BUF(buf, key, mem) \ - do { \ - TAOS_UNUSED(memcpy((void *)buf, (void *)(&key->mem), sizeof(key->mem))); \ - buf += sizeof(key->mem); \ +#define SERIALIZE_MEM_TO_BUF(buf, key, mem) \ + do { \ + (void)memcpy((void *)buf, (void *)(&key->mem), sizeof(key->mem)); \ + buf += sizeof(key->mem); \ } while (0) -#define SERIALIZE_STR_MEM_TO_BUF(buf, key, mem, len) \ - do { \ - TAOS_UNUSED(memcpy((void *)buf, (void *)key->mem, len)); \ - buf += len; \ +#define SERIALIZE_STR_MEM_TO_BUF(buf, key, mem, len) \ + do { \ + (void)memcpy((void *)buf, (void *)key->mem, len); \ + buf += len; \ } while (0) -#define SERIALIZE_VAR_TO_BUF(buf, var, type) \ - do { \ - type c = var; \ - TAOS_UNUSED(memcpy((void *)buf, (void *)&c, sizeof(c))); \ - buf += sizeof(c); \ +#define SERIALIZE_VAR_TO_BUF(buf, var, type) \ + do { \ + type c = var; \ + (void)memcpy((void *)buf, (void *)&c, sizeof(c)); \ + buf += sizeof(c); \ } while (0) -#define SERIALIZE_STR_VAR_TO_BUF(buf, var, len) \ - do { \ - TAOS_UNUSED(memcpy((void *)buf, (void *)var, len)); \ - buf += len; \ +#define SERIALIZE_STR_VAR_TO_BUF(buf, var, len) \ + do { \ + (void)memcpy((void *)buf, (void *)var, len); \ + buf += len; \ } while (0) #define INDEX_MERGE_ADD_DEL(src, dst, tgt) \ diff --git a/source/libs/stream/src/streamBackendRocksdb.c b/source/libs/stream/src/streamBackendRocksdb.c index 9c3a94e7dc..d55bf19c87 100644 --- a/source/libs/stream/src/streamBackendRocksdb.c +++ b/source/libs/stream/src/streamBackendRocksdb.c @@ -427,7 +427,9 @@ void cleanDir(const char* pPath, const char* id) { if (taosIsDir(pPath)) { taosRemoveDir(pPath); - TAOS_UNUSED(taosMkDir(pPath)); + if (taosMkDir(pPath) != 0) { + stError("%s failed to create dir:%s", id, pPath); + } stInfo("%s clear dir:%s, succ", id, pPath); } } @@ -833,8 +835,12 @@ int32_t streamBackendInit(const char* streamPath, int64_t chkpId, int32_t vgId, pHandle->list = tdListNew(sizeof(SCfComparator)); TSDB_CHECK_NULL(pHandle->list, code, lino, _EXIT, terrno); - TAOS_UNUSED(taosThreadMutexInit(&pHandle->mutex, NULL)); - TAOS_UNUSED(taosThreadMutexInit(&pHandle->cfMutex, NULL)); + code = taosThreadMutexInit(&pHandle->mutex, NULL); + TSDB_CHECK_CODE(code, lino, _EXIT); + + code = taosThreadMutexInit(&pHandle->cfMutex, NULL); + TSDB_CHECK_CODE(code, lino, _EXIT); + pHandle->cfInst = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK); TSDB_CHECK_NULL(pHandle->cfInst, code, lino, _EXIT, terrno); @@ -2583,7 +2589,9 @@ STaskDbWrapper* taskDbOpenImpl(const char* key, char* statePath, char* dbPath) { pTaskDb->idstr = key ? taosStrdup(key) : NULL; pTaskDb->path = statePath ? taosStrdup(statePath) : NULL; - TAOS_UNUSED(taosThreadMutexInit(&pTaskDb->mutex, NULL)); + code = taosThreadMutexInit(&pTaskDb->mutex, NULL); + TSDB_CHECK_CODE(code, lino, _EXIT); + taskDbInitChkpOpt(pTaskDb); taskDbInitOpt(pTaskDb); diff --git a/source/libs/transport/src/thttp.c b/source/libs/transport/src/thttp.c index 4ac49e929c..3a90fae1ab 100644 --- a/source/libs/transport/src/thttp.c +++ b/source/libs/transport/src/thttp.c @@ -352,7 +352,9 @@ static void httpAsyncCb(uv_async_t* handle) { static int32_t BATCH_SIZE = 20; int32_t count = 0; - TAOS_UNUSED(taosThreadMutexLock(&item->mtx)); + if ((taosThreadMutexLock(&item->mtx)) != 0) { + tError("http-report failed to lock mutex"); + } httpMayDiscardMsg(http, item); while (!QUEUE_IS_EMPTY(&item->qmsg) && count++ < BATCH_SIZE) { @@ -360,7 +362,9 @@ static void httpAsyncCb(uv_async_t* handle) { QUEUE_REMOVE(h); QUEUE_PUSH(&wq, h); } - TAOS_UNUSED(taosThreadMutexUnlock(&item->mtx)); + if (taosThreadMutexUnlock(&item->mtx) != 0) { + tError("http-report failed to unlock mutex"); + } httpTrace(&wq); @@ -848,7 +852,9 @@ void taosDestroyHttpChan(int64_t chanId) { return; } - TAOS_UNUSED(taosThreadJoin(load->thread, NULL)); + if (taosThreadJoin(load->thread, NULL) != 0) { + tTrace("http-report failed to join thread, chanId %" PRId64 "", chanId); + } httpModuleDestroy(load); diff --git a/source/libs/transport/src/tmsgcb.c b/source/libs/transport/src/tmsgcb.c index 5685ac55ae..4c969003a9 100644 --- a/source/libs/transport/src/tmsgcb.c +++ b/source/libs/transport/src/tmsgcb.c @@ -59,7 +59,9 @@ int32_t tmsgSendSyncReq(const SEpSet* epSet, SRpcMsg* pMsg) { void tmsgSendRsp(SRpcMsg* pMsg) { #if 1 - (void)rpcSendResponse(pMsg); + if (rpcSendResponse(pMsg) != 0) { + tError("failed to send response"); + } #else return (*defaultMsgCb.sendRspFp)(pMsg); #endif diff --git a/source/libs/transport/src/trans.c b/source/libs/transport/src/trans.c index 9ba1c3d677..394083a3bd 100644 --- a/source/libs/transport/src/trans.c +++ b/source/libs/transport/src/trans.c @@ -113,7 +113,7 @@ void* rpcOpen(const SRpcInit* pInit) { } int64_t refId = transAddExHandle(transGetInstMgt(), pRpc); - (void)transAcquireExHandle(transGetInstMgt(), refId); + void* tmp = transAcquireExHandle(transGetInstMgt(), refId); pRpc->refId = refId; return (void*)refId; _end: @@ -127,8 +127,13 @@ void rpcClose(void* arg) { if (arg == NULL) { return; } - (void)transRemoveExHandle(transGetInstMgt(), (int64_t)arg); - (void)transReleaseExHandle(transGetInstMgt(), (int64_t)arg); + if (transRemoveExHandle(transGetInstMgt(), (int64_t)arg) != 0) { + tError("failed to remove rpc handle"); + } + + if (transReleaseExHandle(transGetInstMgt(), (int64_t)arg) != 0) { + tError("failed to release rpc handle"); + } tInfo("end to close rpc"); return; } diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index 30582594ba..ea77dbf432 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -2107,9 +2107,15 @@ static void cliAsyncCb(uv_async_t* handle) { // batch process to avoid to lock/unlock frequently queue wq; - TAOS_UNUSED(taosThreadMutexLock(&item->mtx)); + if (taosThreadMutexLock(&item->mtx) != 0) { + tError("failed to lock mutex, reason:%s", tstrerror(terrno)); + } + QUEUE_MOVE(&item->qmsg, &wq); - TAOS_UNUSED(taosThreadMutexUnlock(&item->mtx)); + + if (taosThreadMutexUnlock(&item->mtx) != 0) { + tError("failed to unlock mutex, reason:%s", tstrerror(terrno)); + } int8_t supportBatch = pTransInst->supportBatch; if (supportBatch == 0) { @@ -2299,7 +2305,9 @@ static int32_t createThrdObj(void* trans, SCliThrd** ppThrd) { } QUEUE_INIT(&pThrd->msg); - TAOS_UNUSED(taosThreadMutexInit(&pThrd->msgMtx, NULL)); + if (taosThreadMutexInit(&pThrd->msgMtx, NULL) != 0) { + TAOS_CHECK_GOTO(terrno, NULL, _end); + } pThrd->loop = (uv_loop_t*)taosMemoryMalloc(sizeof(uv_loop_t)); if (pThrd->loop == NULL) { @@ -2406,7 +2414,10 @@ static void destroyThrdObj(SCliThrd* pThrd) { return; } - TAOS_UNUSED(taosThreadJoin(pThrd->thread, NULL)); + if (taosThreadJoin(pThrd->thread, NULL) != 0) { + tTrace("failed to join thread, reason:%s", tstrerror(terrno)); + } + CLI_RELEASE_UV(pThrd->loop); TAOS_UNUSED(taosThreadMutexDestroy(&pThrd->msgMtx)); TRANS_DESTROY_ASYNC_POOL_MSG(pThrd->asyncPool, SCliMsg, destroyCmsgWrapper, (void*)pThrd); @@ -3358,8 +3369,13 @@ _exception: transReleaseExHandle(transGetInstMgt(), (int64_t)shandle); if (code != 0) { if (transpointId != 0) { - (void)transReleaseExHandle(transGetRefMgt(), transpointId); - (void)transRemoveExHandle(transGetRefMgt(), transpointId); + if (transReleaseExHandle(transGetRefMgt(), transpointId) != 0) { + tError("failed to release refId %" PRId64 "", transpointId); + } + + if (transRemoveExHandle(transGetRefMgt(), transpointId) != 0) { + tError("failed to remove refId %" PRId64 "", transpointId); + } } taosMemoryFree(pCli); } diff --git a/source/libs/transport/src/transComm.c b/source/libs/transport/src/transComm.c index e1371fbffa..77f7765627 100644 --- a/source/libs/transport/src/transComm.c +++ b/source/libs/transport/src/transComm.c @@ -272,7 +272,11 @@ int32_t transAsyncPoolCreate(uv_loop_t* loop, int sz, void* arg, AsyncCB cb, SAs } item->pThrd = arg; QUEUE_INIT(&item->qmsg); - TAOS_UNUSED(taosThreadMutexInit(&item->mtx, NULL)); + code = taosThreadMutexInit(&item->mtx, NULL); + if (code) { + taosMemoryFree(item); + break; + } async->data = item; err = uv_async_init(loop, async, cb); @@ -328,7 +332,10 @@ int transAsyncSend(SAsyncPool* pool, queue* q) { uv_async_t* async = &(pool->asyncs[idx]); SAsyncItem* item = async->data; - TAOS_UNUSED(taosThreadMutexLock(&item->mtx)); + if (taosThreadMutexLock(&item->mtx) != 0) { + tError("failed to lock mutex"); + } + QUEUE_PUSH(&item->qmsg, q); TAOS_UNUSED(taosThreadMutexUnlock(&item->mtx)); int ret = uv_async_send(async); diff --git a/source/libs/transport/src/transSvr.c b/source/libs/transport/src/transSvr.c index f8f8878f86..1f1cc7bb35 100644 --- a/source/libs/transport/src/transSvr.c +++ b/source/libs/transport/src/transSvr.c @@ -759,9 +759,15 @@ void uvWorkerAsyncCb(uv_async_t* handle) { queue wq; // batch process to avoid to lock/unlock frequently - TAOS_UNUSED(taosThreadMutexLock(&item->mtx)); + if (taosThreadMutexLock(&item->mtx) != 0) { + tError("failed to lock mutex"); + } + QUEUE_MOVE(&item->qmsg, &wq); - TAOS_UNUSED(taosThreadMutexUnlock(&item->mtx)); + + if (taosThreadMutexUnlock(&item->mtx) != 0) { + tError("failed to unlock mutex"); + } while (!QUEUE_IS_EMPTY(&wq)) { queue* head = QUEUE_HEAD(&wq); @@ -1637,7 +1643,10 @@ void destroyWorkThrd(SWorkThrd* pThrd) { } if (pThrd->inited) { sendQuitToWorkThrd(pThrd); - TAOS_UNUSED(taosThreadJoin(pThrd->thread, NULL)); + if ((taosThreadJoin(pThrd->thread, NULL)) != 0) { + tError("failed to join work-thread"); + } + SRV_RELEASE_UV(pThrd->loop); TRANS_DESTROY_ASYNC_POOL_MSG(pThrd->asyncPool, SSvrMsg, destroySmsgWrapper, NULL); } @@ -1657,7 +1666,9 @@ void transCloseServer(void* arg) { if (srv->inited) { tDebug("send quit msg to accept thread"); TAOS_UNUSED(uv_async_send(srv->pAcceptAsync)); - TAOS_UNUSED(taosThreadJoin(srv->thread, NULL)); + if (taosThreadJoin(srv->thread, NULL) != 0) { + tError("failed to join accept-thread"); + } SRV_RELEASE_UV(srv->loop); for (int i = 0; i < srv->numOfThreads; i++) { diff --git a/source/libs/wal/src/walMgmt.c b/source/libs/wal/src/walMgmt.c index 2d9ca4cce3..3b23a2db80 100644 --- a/source/libs/wal/src/walMgmt.c +++ b/source/libs/wal/src/walMgmt.c @@ -104,7 +104,7 @@ SWal *walOpen(const char *path, SWalCfg *pCfg) { } // set config - TAOS_UNUSED(memcpy(&pWal->cfg, pCfg, sizeof(SWalCfg))); + (void)memcpy(&pWal->cfg, pCfg, sizeof(SWalCfg)); pWal->fsyncSeq = pCfg->fsyncPeriod / 1000; if (pWal->cfg.retentionSize > 0) { @@ -155,7 +155,7 @@ SWal *walOpen(const char *path, SWalCfg *pCfg) { pWal->lastRollSeq = -1; // init write buffer - TAOS_UNUSED(memset(&pWal->writeHead, 0, sizeof(SWalCkHead))); + (void)memset(&pWal->writeHead, 0, sizeof(SWalCkHead)); pWal->writeHead.head.protoVer = WAL_PROTO_VER; pWal->writeHead.magic = WAL_MAGIC; diff --git a/source/libs/wal/src/walRead.c b/source/libs/wal/src/walRead.c index 9cf5bcbf09..d3df76f687 100644 --- a/source/libs/wal/src/walRead.c +++ b/source/libs/wal/src/walRead.c @@ -41,7 +41,11 @@ SWalReader *walOpenReader(SWal *pWal, SWalFilterCond *cond, int64_t id) { pReader->cond.enableRef = 0; } - TAOS_UNUSED(taosThreadMutexInit(&pReader->mutex, NULL)); + terrno = taosThreadMutexInit(&pReader->mutex, NULL); + if (terrno) { + taosMemoryFree(pReader); + return NULL; + } pReader->pHead = taosMemoryMalloc(sizeof(SWalCkHead)); if (pReader->pHead == NULL) { @@ -401,7 +405,9 @@ int32_t walReadVer(SWalReader *pReader, int64_t ver) { TAOS_RETURN(TSDB_CODE_WAL_LOG_NOT_EXIST); } - TAOS_UNUSED(taosThreadMutexLock(&pReader->mutex)); + if (taosThreadMutexLock(&pReader->mutex) != 0) { + wError("vgId:%d, failed to lock mutex", pReader->pWal->cfg.vgId); + } if (pReader->curVersion != ver) { code = walReaderSeekVer(pReader, ver); @@ -537,7 +543,7 @@ int32_t decryptBody(SWalCfg *cfg, SWalCkHead *pHead, int32_t plainBodyLen, const // wDebug("CBC_Decrypt cryptedBodyLen:%d, plainBodyLen:%d, %s", count, plainBodyLen, func); - TAOS_UNUSED(memcpy(pHead->head.body, newBody, plainBodyLen)); + (void)memcpy(pHead->head.body, newBody, plainBodyLen); taosMemoryFree(newBody); } @@ -546,7 +552,10 @@ int32_t decryptBody(SWalCfg *cfg, SWalCkHead *pHead, int32_t plainBodyLen, const } void walReadReset(SWalReader *pReader) { - TAOS_UNUSED(taosThreadMutexLock(&pReader->mutex)); + if ((taosThreadMutexLock(&pReader->mutex)) != 0) { + wError("vgId:%d, failed to lock mutex", pReader->pWal->cfg.vgId); + } + TAOS_UNUSED(taosCloseFile(&pReader->pIdxFile)); TAOS_UNUSED(taosCloseFile(&pReader->pLogFile)); pReader->curFileFirstVer = -1; diff --git a/source/libs/wal/src/walWrite.c b/source/libs/wal/src/walWrite.c index bb6dbbeeb6..b89c233465 100644 --- a/source/libs/wal/src/walWrite.c +++ b/source/libs/wal/src/walWrite.c @@ -185,10 +185,14 @@ int32_t walRollback(SWal *pWal, int64_t ver) { walBuildLogName(pWal, pInfo->firstVer, fnameStr); wDebug("vgId:%d, wal remove file %s for rollback", pWal->cfg.vgId, fnameStr); - TAOS_UNUSED(taosRemoveFile(fnameStr)); + if (taosRemoveFile(fnameStr) != 0) { + wWarn("vgId:%d, failed to remove file %s for rollback since %s", pWal->cfg.vgId, fnameStr, terrstr()); + } walBuildIdxName(pWal, pInfo->firstVer, fnameStr); wDebug("vgId:%d, wal remove file %s for rollback", pWal->cfg.vgId, fnameStr); - TAOS_UNUSED(taosRemoveFile(fnameStr)); + if (taosRemoveFile(fnameStr) != 0) { + wWarn("vgId:%d, failed to remove file %s for rollback since %s", pWal->cfg.vgId, fnameStr, terrstr()); + } } } @@ -460,7 +464,9 @@ int32_t walEndSnapshot(SWal *pWal) { } for (SWalFileInfo *iter = pWal->fileInfoSet->pData; iter <= pUntil; iter++) { deleteCnt++; - TAOS_UNUSED(taosArrayPush(pWal->toDeleteFiles, iter)); + if (taosArrayPush(pWal->toDeleteFiles, iter) == NULL) { + wError("vgId:%d, failed to push file info to delete list", pWal->cfg.vgId); + } } // make new array, remove files @@ -603,8 +609,8 @@ static FORCE_INLINE int32_t walWriteImpl(SWal *pWal, int64_t index, tmsg_t msgTy TAOS_CHECK_GOTO(terrno, &lino, _exit); } - TAOS_UNUSED(memset(newBody, 0, cyptedBodyLen)); - TAOS_UNUSED(memcpy(newBody, body, plainBodyLen)); + (void)memset(newBody, 0, cyptedBodyLen); + (void)memcpy(newBody, body, plainBodyLen); newBodyEncrypted = taosMemoryMalloc(cyptedBodyLen); if (newBodyEncrypted == NULL) { From d183a7b77203fc4f646e2f1556622992c7fc6273 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 25 Sep 2024 18:21:27 +0800 Subject: [PATCH 46/62] ehn: remove void --- include/util/tcompression.h | 4 +- source/dnode/mgmt/exe/dmMain.c | 77 ++++++++++++------- source/dnode/mgmt/mgmt_dnode/src/dmHandle.c | 16 +++- source/dnode/mgmt/mgmt_dnode/src/dmWorker.c | 9 ++- source/dnode/mgmt/mgmt_mnode/src/mmHandle.c | 4 +- source/dnode/mgmt/mgmt_qnode/src/qmWorker.c | 2 +- source/dnode/mgmt/mgmt_snode/src/smWorker.c | 6 +- source/dnode/mgmt/mgmt_vnode/src/vmHandle.c | 16 +++- source/dnode/mgmt/mgmt_vnode/src/vmInt.c | 16 +++- source/dnode/mgmt/mgmt_vnode/src/vmWorker.c | 30 ++++++-- source/dnode/mgmt/node_mgmt/src/dmEnv.c | 14 +++- source/dnode/mgmt/node_mgmt/src/dmMgmt.c | 23 ++++-- source/dnode/mgmt/node_mgmt/src/dmTransport.c | 39 ++++++++-- source/dnode/mgmt/node_util/src/dmEps.c | 22 ++++-- source/libs/index/src/index.c | 36 +++++++-- source/libs/index/src/indexCache.c | 61 +++++++++++---- source/libs/index/src/indexFst.c | 4 +- source/libs/index/src/indexTfile.c | 25 ++++-- source/util/src/tcompression.c | 6 +- 19 files changed, 305 insertions(+), 105 deletions(-) diff --git a/include/util/tcompression.h b/include/util/tcompression.h index 182465548b..c8821234b6 100644 --- a/include/util/tcompression.h +++ b/include/util/tcompression.h @@ -72,8 +72,8 @@ extern "C" { #ifdef TD_TSZ extern bool lossyFloat; extern bool lossyDouble; -int32_t tsCompressInit(char *lossyColumns, float fPrecision, double dPrecision, uint32_t maxIntervals, - uint32_t intervals, int32_t ifAdtFse, const char *compressor); +void tsCompressInit(char *lossyColumns, float fPrecision, double dPrecision, uint32_t maxIntervals, uint32_t intervals, + int32_t ifAdtFse, const char *compressor); void tsCompressExit(); diff --git a/source/dnode/mgmt/exe/dmMain.c b/source/dnode/mgmt/exe/dmMain.c index 377e4752f8..89569d69d6 100644 --- a/source/dnode/mgmt/exe/dmMain.c +++ b/source/dnode/mgmt/exe/dmMain.c @@ -81,11 +81,21 @@ static void dmSetAssert(int32_t signum, void *sigInfo, void *context) { tsAssert static void dmStopDnode(int signum, void *sigInfo, void *context) { // taosIgnSignal(SIGUSR1); // taosIgnSignal(SIGUSR2); - (void)taosIgnSignal(SIGTERM); - (void)taosIgnSignal(SIGHUP); - (void)taosIgnSignal(SIGINT); - (void)taosIgnSignal(SIGABRT); - (void)taosIgnSignal(SIGBREAK); + if (taosIgnSignal(SIGTERM) != 0) { + dWarn("failed to ignore signal SIGTERM"); + } + if (taosIgnSignal(SIGHUP) != 0) { + dWarn("failed to ignore signal SIGHUP"); + } + if (taosIgnSignal(SIGINT) != 0) { + dWarn("failed to ignore signal SIGINT"); + } + if (taosIgnSignal(SIGABRT) != 0) { + dWarn("failed to ignore signal SIGABRT"); + } + if (taosIgnSignal(SIGBREAK) != 0) { + dWarn("failed to ignore signal SIGBREAK"); + } dInfo("shut down signal is %d", signum); #ifndef WINDOWS @@ -103,11 +113,19 @@ void dmLogCrash(int signum, void *sigInfo, void *context) { // taosIgnSignal(SIGBREAK); #ifndef WINDOWS - (void)taosIgnSignal(SIGBUS); + if (taosIgnSignal(SIGBUS) != 0) { + dWarn("failed to ignore signal SIGBUS"); + } #endif - (void)taosIgnSignal(SIGABRT); - (void)taosIgnSignal(SIGFPE); - (void)taosIgnSignal(SIGSEGV); + if (taosIgnSignal(SIGABRT) != 0) { + dWarn("failed to ignore signal SIGABRT"); + } + if (taosIgnSignal(SIGFPE) != 0) { + dWarn("failed to ignore signal SIGABRT"); + } + if (taosIgnSignal(SIGSEGV) != 0) { + dWarn("failed to ignore signal SIGABRT"); + } char *pMsg = NULL; const char *flags = "UTL FATAL "; @@ -136,24 +154,31 @@ _return: } static void dmSetSignalHandle() { - (void)taosSetSignal(SIGUSR1, dmSetDebugFlag); - (void)taosSetSignal(SIGUSR2, dmSetAssert); - (void)taosSetSignal(SIGTERM, dmStopDnode); - (void)taosSetSignal(SIGHUP, dmStopDnode); - (void)taosSetSignal(SIGINT, dmStopDnode); - (void)taosSetSignal(SIGBREAK, dmStopDnode); + if (taosSetSignal(SIGUSR1, dmSetDebugFlag) != 0) { + dWarn("failed to set signal SIGUSR1"); + } + if (taosSetSignal(SIGUSR2, dmSetAssert) != 0) { + dWarn("failed to set signal SIGUSR1"); + } + if (taosSetSignal(SIGTERM, dmStopDnode) != 0) { + dWarn("failed to set signal SIGUSR1"); + } + if (taosSetSignal(SIGHUP, dmStopDnode) != 0) { + dWarn("failed to set signal SIGUSR1"); + } + if (taosSetSignal(SIGINT, dmStopDnode) != 0) { + dWarn("failed to set signal SIGUSR1"); + } + if (taosSetSignal(SIGBREAK, dmStopDnode) != 0) { + dWarn("failed to set signal SIGUSR1"); + } #ifndef WINDOWS - (void)taosSetSignal(SIGTSTP, dmStopDnode); - (void)taosSetSignal(SIGQUIT, dmStopDnode); -#endif - -#if 0 -#ifndef WINDOWS - (void)taosSetSignal(SIGBUS, dmLogCrash); -#endif - (void)taosSetSignal(SIGABRT, dmLogCrash); - (void)taosSetSignal(SIGFPE, dmLogCrash); - (void)taosSetSignal(SIGSEGV, dmLogCrash); + if (taosSetSignal(SIGTSTP, dmStopDnode) != 0) { + dWarn("failed to set signal SIGUSR1"); + } + if (taosSetSignal(SIGQUIT, dmStopDnode) != 0) { + dWarn("failed to set signal SIGUSR1"); + } #endif } diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c index 020a8077b2..419c669103 100644 --- a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c +++ b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c @@ -45,7 +45,9 @@ static void dmMayShouldUpdateIpWhiteList(SDnodeMgmt *pMgmt, int64_t ver) { if (pMgmt->pData->ipWhiteVer == ver) { if (ver == 0) { dDebug("disable ip-white-list on dnode ver: %" PRId64 ", status ver: %" PRId64 "", pMgmt->pData->ipWhiteVer, ver); - (void)rpcSetIpWhite(pMgmt->msgCb.serverRpc, NULL); + if (rpcSetIpWhite(pMgmt->msgCb.serverRpc, NULL) != 0) { + dError("failed to disable ip white list on dnode"); + } } return; } @@ -91,7 +93,9 @@ static void dmProcessStatusRsp(SDnodeMgmt *pMgmt, SRpcMsg *pRsp) { dGInfo("dnode:%d, set to dropped since not exist in mnode, statusSeq:%d", pMgmt->pData->dnodeId, pMgmt->statusSeq); pMgmt->pData->dropped = 1; - (void)dmWriteEps(pMgmt->pData); + if (dmWriteEps(pMgmt->pData) != 0) { + dError("failed to write dnode file"); + } dInfo("dnode will exit since it is in the dropped state"); (void)raise(SIGINT); } @@ -147,7 +151,9 @@ void dmSendStatusReq(SDnodeMgmt *pMgmt) { req.clusterCfg.monitorParas.tsSlowLogThresholdTest = tsSlowLogThresholdTest; tstrncpy(req.clusterCfg.monitorParas.tsSlowLogExceptDb, tsSlowLogExceptDb, TSDB_DB_NAME_LEN); char timestr[32] = "1970-01-01 00:00:00.00"; - (void)taosParseTime(timestr, &req.clusterCfg.checkTime, (int32_t)strlen(timestr), TSDB_TIME_PRECISION_MILLI, 0); + if (taosParseTime(timestr, &req.clusterCfg.checkTime, (int32_t)strlen(timestr), TSDB_TIME_PRECISION_MILLI, 0) != 0) { + dError("failed to parse time since %s", tstrerror(code)); + } memcpy(req.clusterCfg.timezone, tsTimezoneStr, TD_TIMEZONE_LEN); memcpy(req.clusterCfg.locale, tsLocale, TD_LOCALE_LEN); memcpy(req.clusterCfg.charset, tsCharset, TD_LOCALE_LEN); @@ -243,7 +249,9 @@ void dmSendNotifyReq(SDnodeMgmt *pMgmt, SNotifyReq *pReq) { SEpSet epSet = {0}; dmGetMnodeEpSet(pMgmt->pData, &epSet); - (void)rpcSendRequest(pMgmt->msgCb.clientRpc, &epSet, &rpcMsg, NULL); + if (rpcSendRequest(pMgmt->msgCb.clientRpc, &epSet, &rpcMsg, NULL) != 0) { + dError("failed to send notify req"); + } } int32_t dmProcessAuthRsp(SDnodeMgmt *pMgmt, SRpcMsg *pMsg) { diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c b/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c index 1ed7c9ecd9..58b86b20b1 100644 --- a/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c +++ b/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c @@ -305,11 +305,16 @@ int32_t dmStartNotifyThread(SDnodeMgmt *pMgmt) { void dmStopNotifyThread(SDnodeMgmt *pMgmt) { if (taosCheckPthreadValid(pMgmt->notifyThread)) { - (void)tsem_post(&dmNotifyHdl.sem); + if (tsem_post(&dmNotifyHdl.sem) != 0) { + dError("failed to post notify sem"); + } + (void)taosThreadJoin(pMgmt->notifyThread, NULL); taosThreadClear(&pMgmt->notifyThread); } - (void)tsem_destroy(&dmNotifyHdl.sem); + if (tsem_destroy(&dmNotifyHdl.sem) != 0) { + dError("failed to destroy notify sem"); + } } int32_t dmStartMonitorThread(SDnodeMgmt *pMgmt) { diff --git a/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c b/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c index 43c40c65c3..7204cde8f7 100644 --- a/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c +++ b/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c @@ -17,7 +17,9 @@ #include "mmInt.h" void mmGetMonitorInfo(SMnodeMgmt *pMgmt, SMonMmInfo *pInfo) { - (void)mndGetMonitorInfo(pMgmt->pMnode, &pInfo->cluster, &pInfo->vgroup, &pInfo->stb, &pInfo->grant); + if (mndGetMonitorInfo(pMgmt->pMnode, &pInfo->cluster, &pInfo->vgroup, &pInfo->stb, &pInfo->grant) != 0) { + dError("failed to get monitor info"); + } } void mmGetMnodeLoads(SMnodeMgmt *pMgmt, SMonMloadInfo *pInfo) { diff --git a/source/dnode/mgmt/mgmt_qnode/src/qmWorker.c b/source/dnode/mgmt/mgmt_qnode/src/qmWorker.c index 9ae16f7581..65c2bb9bf3 100644 --- a/source/dnode/mgmt/mgmt_qnode/src/qmWorker.c +++ b/source/dnode/mgmt/mgmt_qnode/src/qmWorker.c @@ -23,7 +23,7 @@ static inline void qmSendRsp(SRpcMsg *pMsg, int32_t code) { .contLen = pMsg->info.rspLen, .info = pMsg->info, }; - (void)tmsgSendRsp(&rsp); + tmsgSendRsp(&rsp); } static void qmProcessQueue(SQueueInfo *pInfo, SRpcMsg *pMsg) { diff --git a/source/dnode/mgmt/mgmt_snode/src/smWorker.c b/source/dnode/mgmt/mgmt_snode/src/smWorker.c index e8594130d6..8c33c5bb4b 100644 --- a/source/dnode/mgmt/mgmt_snode/src/smWorker.c +++ b/source/dnode/mgmt/mgmt_snode/src/smWorker.c @@ -23,15 +23,15 @@ static inline void smSendRsp(SRpcMsg *pMsg, int32_t code) { .contLen = pMsg->info.rspLen, .info = pMsg->info, }; - (void)tmsgSendRsp(&rsp); + tmsgSendRsp(&rsp); } static void smProcessWriteQueue(SQueueInfo *pInfo, STaosQall *qall, int32_t numOfMsgs) { SSnodeMgmt *pMgmt = pInfo->ahandle; for (int32_t i = 0; i < numOfMsgs; i++) { - SRpcMsg *pMsg = NULL; - (void)taosGetQitem(qall, (void **)&pMsg); + SRpcMsg *pMsg = NULL; + int32_t num = taosGetQitem(qall, (void **)&pMsg); const STraceId *trace = &pMsg->info.traceId; dTrace("msg:%p, get from snode-write queue", pMsg); diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c index 3d6ff48dd1..70c873e0f5 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c @@ -35,10 +35,14 @@ void vmGetVnodeLoads(SVnodeMgmt *pMgmt, SMonVloadInfo *pInfo, bool isReset) { SVnodeObj *pVnode = *ppVnode; SVnodeLoad vload = {.vgId = pVnode->vgId}; if (!pVnode->failed) { - (void)vnodeGetLoad(pVnode->pImpl, &vload); + if (vnodeGetLoad(pVnode->pImpl, &vload) != 0) { + dError("failed to get vnode load"); + } if (isReset) vnodeResetLoad(pVnode->pImpl, &vload); } - (void)taosArrayPush(pInfo->pVloads, &vload); + if (taosArrayPush(pInfo->pVloads, &vload) == NULL) { + dError("failed to push vnode load"); + } pIter = taosHashIterate(pMgmt->hash, pIter); } @@ -116,7 +120,9 @@ void vmGetMonitorInfo(SVnodeMgmt *pMgmt, SMonVmInfo *pInfo) { pMgmt->state.numOfBatchInsertReqs = numOfBatchInsertReqs; pMgmt->state.numOfBatchInsertSuccessReqs = numOfBatchInsertSuccessReqs; - (void)tfsGetMonitorInfo(pMgmt->pTfs, &pInfo->tfs); + if (tfsGetMonitorInfo(pMgmt->pTfs, &pInfo->tfs) != 0) { + dError("failed to get tfs monitor info"); + } taosArrayDestroy(pVloads); } @@ -845,7 +851,9 @@ int32_t vmProcessDropVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) { } vmCloseVnode(pMgmt, pVnode, false); - (void)vmWriteVnodeListToFile(pMgmt); + if (vmWriteVnodeListToFile(pMgmt) != 0) { + dError("vgId:%d, failed to write vnode list since %s", vgId, terrstr()); + } dInfo("vgId:%d, is dropped", vgId); return 0; diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmInt.c b/source/dnode/mgmt/mgmt_vnode/src/vmInt.c index dd921c615b..bb73f43ebb 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmInt.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmInt.c @@ -233,8 +233,12 @@ void vmCloseVnode(SVnodeMgmt *pMgmt, SVnodeObj *pVnode, bool commitAndRemoveWal) if (commitAndRemoveWal) { dInfo("vgId:%d, commit data for vnode split", pVnode->vgId); - (void)vnodeSyncCommit(pVnode->pImpl); - (void)vnodeBegin(pVnode->pImpl); + if (vnodeSyncCommit(pVnode->pImpl) != 0) { + dError("vgId:%d, failed to commit data", pVnode->vgId); + } + if (vnodeBegin(pVnode->pImpl) != 0) { + dError("vgId:%d, failed to begin", pVnode->vgId); + } dInfo("vgId:%d, commit data finished", pVnode->vgId); } @@ -248,8 +252,12 @@ _closed: if (commitAndRemoveWal) { snprintf(path, TSDB_FILENAME_LEN, "vnode%svnode%d%swal", TD_DIRSEP, pVnode->vgId, TD_DIRSEP); dInfo("vgId:%d, remove all wals, path:%s", pVnode->vgId, path); - (void)tfsRmdir(pMgmt->pTfs, path); - (void)tfsMkdir(pMgmt->pTfs, path); + if (tfsRmdir(pMgmt->pTfs, path) != 0) { + dTrace("vgId:%d, failed to remove wals, path:%s", pVnode->vgId, path); + } + if (tfsMkdir(pMgmt->pTfs, path) != 0) { + dTrace("vgId:%d, failed to create wals, path:%s", pVnode->vgId, path); + } } if (pVnode->dropped) { diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c b/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c index 9829d5ab3a..9c436a3dfa 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c @@ -187,7 +187,9 @@ static void vmProcessSyncQueue(SQueueInfo *pInfo, STaosQall *qall, int32_t numOf static void vmSendResponse(SRpcMsg *pMsg) { if (pMsg->info.handle) { SRpcMsg rsp = {.info = pMsg->info, .code = terrno}; - (void)rpcSendResponse(&rsp); + if (rpcSendResponse(&rsp) != 0) { + dError("failed to send response since %s", terrstr()); + } } } @@ -389,10 +391,28 @@ int32_t vmAllocQueue(SVnodeMgmt *pMgmt, SVnodeObj *pVnode) { SMultiWorkerCfg scfg = {.max = 1, .name = "vnode-sync", .fp = (FItems)vmProcessSyncQueue, .param = pVnode}; SMultiWorkerCfg sccfg = {.max = 1, .name = "vnode-sync-rd", .fp = (FItems)vmProcessSyncQueue, .param = pVnode}; SMultiWorkerCfg acfg = {.max = 1, .name = "vnode-apply", .fp = (FItems)vnodeApplyWriteMsg, .param = pVnode->pImpl}; - (void)tMultiWorkerInit(&pVnode->pWriteW, &wcfg); - (void)tMultiWorkerInit(&pVnode->pSyncW, &scfg); - (void)tMultiWorkerInit(&pVnode->pSyncRdW, &sccfg); - (void)tMultiWorkerInit(&pVnode->pApplyW, &acfg); + code = tMultiWorkerInit(&pVnode->pWriteW, &wcfg); + if (code) { + return code; + } + code = tMultiWorkerInit(&pVnode->pSyncW, &scfg); + if (code) { + tMultiWorkerCleanup(&pVnode->pWriteW); + return code; + } + code = tMultiWorkerInit(&pVnode->pSyncRdW, &sccfg); + if (code) { + tMultiWorkerCleanup(&pVnode->pWriteW); + tMultiWorkerCleanup(&pVnode->pSyncW); + return code; + } + code = tMultiWorkerInit(&pVnode->pApplyW, &acfg); + if (code) { + tMultiWorkerCleanup(&pVnode->pWriteW); + tMultiWorkerCleanup(&pVnode->pSyncW); + tMultiWorkerCleanup(&pVnode->pSyncRdW); + return code; + } pVnode->pQueryQ = tQueryAutoQWorkerAllocQueue(&pMgmt->queryPool, pVnode, (FItem)vmProcessQueryQueue); pVnode->pStreamQ = tAutoQWorkerAllocQueue(&pMgmt->streamPool, pVnode, (FItem)vmProcessStreamQueue); diff --git a/source/dnode/mgmt/node_mgmt/src/dmEnv.c b/source/dnode/mgmt/node_mgmt/src/dmEnv.c index f48ca35330..2d0ad70adf 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmEnv.c +++ b/source/dnode/mgmt/node_mgmt/src/dmEnv.c @@ -47,8 +47,14 @@ static int32_t dmCheckRepeatInit(SDnode *pDnode) { } static int32_t dmInitSystem() { - (void)taosIgnSIGPIPE(); - (void)taosBlockSIGPIPE(); + if (taosIgnSIGPIPE() != 0) { + dError("failed to ignore SIGPIPE"); + } + + if (taosBlockSIGPIPE() != 0) { + dError("failed to block SIGPIPE"); + } + taosResolveCRC(); return 0; } @@ -204,7 +210,9 @@ void dmCleanup() { auditCleanup(); syncCleanUp(); walCleanUp(); - (void)udfcClose(); + if (udfcClose() != 0) { + dError("failed to close udfc"); + } udfStopUdfd(); taosStopCacheRefreshWorker(); (void)dmDiskClose(); diff --git a/source/dnode/mgmt/node_mgmt/src/dmMgmt.c b/source/dnode/mgmt/node_mgmt/src/dmMgmt.c index ba0a40e048..f77571c665 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmMgmt.c +++ b/source/dnode/mgmt/node_mgmt/src/dmMgmt.c @@ -47,8 +47,7 @@ int32_t dmInitDnode(SDnode *pDnode) { } // compress module init - (void)tsCompressInit(tsLossyColumns, tsFPrecision, tsDPrecision, tsMaxRange, tsCurRange, (int)tsIfAdtFse, - tsCompressor); + tsCompressInit(tsLossyColumns, tsFPrecision, tsDPrecision, tsMaxRange, tsCurRange, (int)tsIfAdtFse, tsCompressor); pDnode->wrappers[DNODE].func = dmGetMgmtFunc(); pDnode->wrappers[MNODE].func = mmGetMgmtFunc(); @@ -226,7 +225,10 @@ void dmClearVars(SDnode *pDnode) { (void)taosThreadRwlockDestroy(&pWrapper->lock); } if (pDnode->lockfile != NULL) { - (void)taosUnLockFile(pDnode->lockfile); + if (taosUnLockFile(pDnode->lockfile) != 0) { + dError("failed to unlock file"); + } + (void)taosCloseFile(&pDnode->lockfile); pDnode->lockfile = NULL; } @@ -343,7 +345,9 @@ void dmProcessNetTestReq(SDnode *pDnode, SRpcMsg *pMsg) { rsp.contLen = pMsg->contLen; } - (void)rpcSendResponse(&rsp); + if (rpcSendResponse(&rsp) != 0) { + dError("failed to send response, msg:%p", &rsp); + } rpcFreeCont(pMsg->pCont); } @@ -360,11 +364,16 @@ void dmProcessServerStartupStatus(SDnode *pDnode, SRpcMsg *pMsg) { } else { rsp.pCont = rpcMallocCont(contLen); if (rsp.pCont != NULL) { - (void)tSerializeSServerStatusRsp(rsp.pCont, contLen, &statusRsp); - rsp.contLen = contLen; + if (tSerializeSServerStatusRsp(rsp.pCont, contLen, &statusRsp) < 0) { + rsp.code = TSDB_CODE_APP_ERROR; + } else { + rsp.contLen = contLen; + } } } - (void)rpcSendResponse(&rsp); + if (rpcSendResponse(&rsp) != 0) { + dError("failed to send response, msg:%p", &rsp); + } rpcFreeCont(pMsg->pCont); } diff --git a/source/dnode/mgmt/node_mgmt/src/dmTransport.c b/source/dnode/mgmt/node_mgmt/src/dmTransport.c index e204b5d4aa..b9f4ab54f4 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmTransport.c +++ b/source/dnode/mgmt/node_mgmt/src/dmTransport.c @@ -18,7 +18,11 @@ #include "qworker.h" #include "tversion.h" -static inline void dmSendRsp(SRpcMsg *pMsg) { (void)rpcSendResponse(pMsg); } +static inline void dmSendRsp(SRpcMsg *pMsg) { + if (rpcSendResponse(pMsg) != 0) { + dError("failed to send response, msg:%p", pMsg); + } +} static inline void dmBuildMnodeRedirectRsp(SDnode *pDnode, SRpcMsg *pMsg) { SEpSet epSet = {0}; @@ -113,7 +117,11 @@ static void dmProcessRpcMsg(SDnode *pDnode, SRpcMsg *pRpc, SEpSet *pEpSet) { pRpc->info.handle, pRpc->contLen, pRpc->code, pRpc->info.ahandle, pRpc->info.refId); int32_t svrVer = 0; - (void)taosVersionStrToInt(version, &svrVer); + code = taosVersionStrToInt(version, &svrVer); + if (code != 0) { + dError("failed to convert version string:%s to int, code:%d", version, code); + goto _OVER; + } if ((code = taosCheckVersionCompatible(pRpc->info.cliVer, svrVer, 3)) != 0) { dError("Version not compatible, cli ver: %d, svr ver: %d, ip:0x%x", pRpc->info.cliVer, svrVer, pRpc->info.conn.clientIp); @@ -253,7 +261,9 @@ _OVER: if (pWrapper != NULL) { dmSendRsp(&rsp); } else { - (void)rpcSendResponse(&rsp); + if (rpcSendResponse(&rsp) != 0) { + dError("failed to send response, msg:%p", &rsp); + } } } @@ -310,7 +320,9 @@ static inline int32_t dmSendReq(const SEpSet *pEpSet, SRpcMsg *pMsg) { return code; } else { pMsg->info.handle = 0; - (void)rpcSendRequest(pDnode->trans.clientRpc, pEpSet, pMsg, NULL); + if (rpcSendRequest(pDnode->trans.clientRpc, pEpSet, pMsg, NULL) != 0) { + dError("failed to send rpc msg"); + } return 0; } } @@ -396,7 +408,9 @@ int32_t dmInitClient(SDnode *pDnode) { rpcInit.timeToGetConn = tsTimeToGetAvailableConn; rpcInit.notWaitAvaliableConn = 0; - (void)taosVersionStrToInt(version, &(rpcInit.compatibilityVer)); + if (taosVersionStrToInt(version, &(rpcInit.compatibilityVer)) != 0) { + dError("failed to convert version string:%s to int", version); + } pTrans->clientRpc = rpcOpen(&rpcInit); if (pTrans->clientRpc == NULL) { @@ -440,7 +454,10 @@ int32_t dmInitStatusClient(SDnode *pDnode) { rpcInit.supportBatch = 1; rpcInit.batchSize = 8 * 1024; rpcInit.timeToGetConn = tsTimeToGetAvailableConn; - (void)taosVersionStrToInt(version, &(rpcInit.compatibilityVer)); + + if (taosVersionStrToInt(version, &(rpcInit.compatibilityVer)) != 0) { + dError("failed to convert version string:%s to int", version); + } pTrans->statusRpc = rpcOpen(&rpcInit); if (pTrans->statusRpc == NULL) { @@ -485,7 +502,9 @@ int32_t dmInitSyncClient(SDnode *pDnode) { rpcInit.supportBatch = 1; rpcInit.batchSize = 8 * 1024; rpcInit.timeToGetConn = tsTimeToGetAvailableConn; - (void)taosVersionStrToInt(version, &(rpcInit.compatibilityVer)); + if (taosVersionStrToInt(version, &(rpcInit.compatibilityVer)) != 0) { + dError("failed to convert version string:%s to int", version); + } pTrans->syncRpc = rpcOpen(&rpcInit); if (pTrans->syncRpc == NULL) { @@ -536,7 +555,11 @@ int32_t dmInitServer(SDnode *pDnode) { rpcInit.idleTime = tsShellActivityTimer * 1000; rpcInit.parent = pDnode; rpcInit.compressSize = tsCompressMsgSize; - (void)taosVersionStrToInt(version, &(rpcInit.compatibilityVer)); + + if (taosVersionStrToInt(version, &(rpcInit.compatibilityVer)) != 0) { + dError("failed to convert version string:%s to int", version); + } + pTrans->serverRpc = rpcOpen(&rpcInit); if (pTrans->serverRpc == NULL) { dError("failed to init dnode rpc server since:%s", tstrerror(terrno)); diff --git a/source/dnode/mgmt/node_util/src/dmEps.c b/source/dnode/mgmt/node_util/src/dmEps.c index 0ae184ffd3..db401375c7 100644 --- a/source/dnode/mgmt/node_util/src/dmEps.c +++ b/source/dnode/mgmt/node_util/src/dmEps.c @@ -259,7 +259,9 @@ _OVER: if (taosArrayGetSize(pData->dnodeEps) == 0) { SDnodeEp dnodeEp = {0}; dnodeEp.isMnode = 1; - (void)taosGetFqdnPortFromEp(tsFirst, &dnodeEp.ep); + if (taosGetFqdnPortFromEp(tsFirst, &dnodeEp.ep) != 0) { + dError("failed to get fqdn and port from ep:%s", tsFirst); + } if (taosArrayPush(pData->dnodeEps, &dnodeEp) == NULL) { return terrno; } @@ -370,11 +372,19 @@ int32_t dmGetDnodeSize(SDnodeData *pData) { } void dmUpdateEps(SDnodeData *pData, SArray *eps) { - (void)taosThreadRwlockWrlock(&pData->lock); + if (taosThreadRwlockWrlock(&pData->lock) != 0) { + dError("failed to lock dnode lock"); + } + dDebug("new dnode list get from mnode, dnodeVer:%" PRId64, pData->dnodeVer); dmResetEps(pData, eps); - (void)dmWriteEps(pData); - (void)taosThreadRwlockUnlock(&pData->lock); + if (dmWriteEps(pData) != 0) { + dError("failed to write dnode file"); + } + + if (taosThreadRwlockUnlock(&pData->lock) != 0) { + dError("failed to unlock dnode lock"); + } } static void dmResetEps(SDnodeData *pData, SArray *dnodeEps) { @@ -590,7 +600,9 @@ void dmRemoveDnodePairs(SDnodeData *pData) { snprintf(file, sizeof(file), "%s%sdnode%sep.json", tsDataDir, TD_DIRSEP, TD_DIRSEP); snprintf(bak, sizeof(bak), "%s%sdnode%sep.json.bak", tsDataDir, TD_DIRSEP, TD_DIRSEP); dInfo("dnode file:%s is rename to bak file", file); - (void)taosRenameFile(file, bak); + if (taosRenameFile(file, bak) != 0) { + dError("failed to rename dnode file:%s to bak file:%s since %s", file, bak, tstrerror(terrno)); + } } static int32_t dmReadDnodePairs(SDnodeData *pData) { diff --git a/source/libs/index/src/index.c b/source/libs/index/src/index.c index 38d4efd1ed..7d26b30276 100644 --- a/source/libs/index/src/index.c +++ b/source/libs/index/src/index.c @@ -137,8 +137,12 @@ int32_t indexOpen(SIndexOpts* opts, const char* path, SIndex** index) { TAOS_CHECK_GOTO(terrno, NULL, END); } - TAOS_UNUSED(taosThreadMutexInit(&idx->mtx, NULL)); - TAOS_UNUSED(tsem_init(&idx->sem, 0, 0)); + if (taosThreadMutexInit(&idx->mtx, NULL) != 0) { + TAOS_CHECK_GOTO(terrno, NULL, END); + } + if (tsem_init(&idx->sem, 0, 0) != 0) { + TAOS_CHECK_GOTO(terrno, NULL, END); + } idx->refId = idxAddRef(idx); idx->opts = *opts; @@ -213,7 +217,10 @@ void idxReleaseRef(int64_t ref) { int32_t indexPut(SIndex* index, SIndexMultiTerm* fVals, uint64_t uid) { // TODO(yihao): reduce the lock range int32_t code = 0; - TAOS_UNUSED(taosThreadMutexLock(&index->mtx)); + if (taosThreadMutexLock(&index->mtx) != 0) { + indexError("failed to lock index mutex"); + } + for (int i = 0; i < taosArrayGetSize(fVals); i++) { SIndexTerm* p = taosArrayGetP(fVals, i); @@ -231,7 +238,9 @@ int32_t indexPut(SIndex* index, SIndexMultiTerm* fVals, uint64_t uid) { } } } - TAOS_UNUSED(taosThreadMutexUnlock(&index->mtx)); + if (taosThreadMutexUnlock(&index->mtx) != 0) { + indexError("failed to unlock index mutex"); + } if (code != 0) { return code; @@ -463,7 +472,10 @@ static int32_t idxTermSearch(SIndex* sIdx, SIndexTermQuery* query, SArray** resu int32_t sz = idxSerialCacheKey(&key, buf); - TAOS_UNUSED(taosThreadMutexLock(&sIdx->mtx)); + if (taosThreadMutexLock(&sIdx->mtx) != 0) { + indexError("failed to lock index mutex"); + } + IndexCache** pCache = taosHashGet(sIdx->colObj, buf, sz); cache = (pCache == NULL) ? NULL : *pCache; TAOS_UNUSED(taosThreadMutexUnlock(&sIdx->mtx)); @@ -757,7 +769,9 @@ static int64_t idxGetAvailableVer(SIndex* sIdx, IndexCache* cache) { IndexTFile* tf = (IndexTFile*)(sIdx->tindex); - TAOS_UNUSED(taosThreadMutexLock(&tf->mtx)); + if (taosThreadMutexLock(&tf->mtx) != 0) { + indexError("failed to lock tfile mutex"); + } TFileReader* rd = tfileCacheGet(tf->cache, &key); TAOS_UNUSED(taosThreadMutexUnlock(&tf->mtx)); @@ -801,9 +815,15 @@ static int32_t idxGenTFile(SIndex* sIdx, IndexCache* cache, SArray* batch) { TFileHeader* header = &reader->header; ICacheKey key = {.suid = cache->suid, .colName = header->colName, .nColName = strlen(header->colName)}; - TAOS_UNUSED(taosThreadMutexLock(&tf->mtx)); + if (taosThreadMutexLock(&tf->mtx) != 0) { + indexError("failed to lock tfile mutex"); + } + code = tfileCachePut(tf->cache, &key, reader); - TAOS_UNUSED(taosThreadMutexUnlock(&tf->mtx)); + + if (taosThreadMutexUnlock(&tf->mtx) != 0) { + indexError("failed to unlock tfile mutex"); + } return code; diff --git a/source/libs/index/src/indexCache.c b/source/libs/index/src/indexCache.c index 4a03edaef4..eff2922119 100644 --- a/source/libs/index/src/indexCache.c +++ b/source/libs/index/src/indexCache.c @@ -398,8 +398,17 @@ IndexCache* idxCacheCreate(SIndex* idx, uint64_t suid, const char* colName, int8 cache->suid = suid; cache->occupiedMem = 0; - TAOS_UNUSED(taosThreadMutexInit(&cache->mtx, NULL)); - TAOS_UNUSED(taosThreadCondInit(&cache->finished, NULL)); + if (taosThreadMutexInit(&cache->mtx, NULL) != 0) { + indexError("failed to create mutex for index cache"); + taosMemoryFree(cache); + return NULL; + } + + if (taosThreadCondInit(&cache->finished, NULL) != 0) { + indexError("failed to create cond for index cache"); + taosMemoryFree(cache); + return NULL; + } idxCacheRef(cache); if (idx != NULL) { @@ -410,10 +419,16 @@ IndexCache* idxCacheCreate(SIndex* idx, uint64_t suid, const char* colName, int8 void idxCacheDebug(IndexCache* cache) { MemTable* tbl = NULL; - TAOS_UNUSED(taosThreadMutexLock(&cache->mtx)); + if ((taosThreadMutexLock(&cache->mtx)) != 0) { + indexError("failed to lock cache mutex"); + } + tbl = cache->mem; idxMemRef(tbl); - TAOS_UNUSED(taosThreadMutexUnlock(&cache->mtx)); + + if (taosThreadMutexUnlock(&cache->mtx) != 0) { + indexError("failed to unlock cache mutex"); + } { SSkipList* slt = tbl->mem; @@ -432,7 +447,9 @@ void idxCacheDebug(IndexCache* cache) { } { - TAOS_UNUSED(taosThreadMutexLock(&cache->mtx)); + if (taosThreadMutexLock(&cache->mtx) != 0) { + indexError("failed to lock cache mutex"); + } tbl = cache->imm; idxMemRef(tbl); TAOS_UNUSED(taosThreadMutexUnlock(&cache->mtx)); @@ -480,7 +497,9 @@ void idxCacheDestroyImm(IndexCache* cache) { return; } MemTable* tbl = NULL; - TAOS_UNUSED(taosThreadMutexLock(&cache->mtx)); + if (taosThreadMutexLock(&cache->mtx) != 0) { + indexError("failed to lock cache mutex"); + } tbl = cache->imm; cache->imm = NULL; // or throw int bg thread @@ -517,7 +536,11 @@ Iterate* idxCacheIteratorCreate(IndexCache* cache) { if (iter == NULL) { return NULL; } - TAOS_UNUSED(taosThreadMutexLock(&cache->mtx)); + if (taosThreadMutexLock(&cache->mtx) != 0) { + indexError("failed to lock cache mutex"); + taosMemoryFree(iter); + return NULL; + } idxMemRef(cache->imm); @@ -615,7 +638,9 @@ int idxCachePut(void* cache, SIndexTerm* term, uint64_t uid) { // ugly code, refactor later int64_t estimate = sizeof(ct) + strlen(ct->colVal); - TAOS_UNUSED(taosThreadMutexLock(&pCache->mtx)); + if (taosThreadMutexLock(&pCache->mtx) != 0) { + indexError("failed to lock cache mutex"); + } pCache->occupiedMem += estimate; idxCacheMakeRoomForWrite(pCache); MemTable* tbl = pCache->mem; @@ -623,7 +648,9 @@ int idxCachePut(void* cache, SIndexTerm* term, uint64_t uid) { TAOS_UNUSED(tSkipListPut(tbl->mem, (char*)ct)); idxMemUnRef(tbl); - TAOS_UNUSED(taosThreadMutexUnlock(&pCache->mtx)); + if (taosThreadMutexUnlock(&pCache->mtx) != 0) { + indexError("failed to unlock cache mutex"); + } idxCacheUnRef(pCache); return 0; } @@ -631,13 +658,17 @@ void idxCacheForceToMerge(void* cache) { IndexCache* pCache = cache; idxCacheRef(pCache); - TAOS_UNUSED(taosThreadMutexLock(&pCache->mtx)); + if (taosThreadMutexLock(&pCache->mtx) != 0) { + indexError("failed to lock cache mutex"); + } indexInfo("%p is forced to merge into tfile", pCache); pCache->occupiedMem += MEM_SIGNAL_QUIT; idxCacheMakeRoomForWrite(pCache); - TAOS_UNUSED(taosThreadMutexUnlock(&pCache->mtx)); + if (taosThreadMutexUnlock(&pCache->mtx) != 0) { + indexError("failed to unlock cache mutex"); + } idxCacheUnRef(pCache); return; } @@ -668,12 +699,16 @@ int idxCacheSearch(void* cache, SIndexTermQuery* query, SIdxTRslt* result, STerm IndexCache* pCache = cache; MemTable *mem = NULL, *imm = NULL; - TAOS_UNUSED(taosThreadMutexLock(&pCache->mtx)); + if (taosThreadMutexLock(&pCache->mtx) != 0) { + indexError("failed to lock cache mutex"); + } mem = pCache->mem; imm = pCache->imm; idxMemRef(mem); idxMemRef(imm); - TAOS_UNUSED(taosThreadMutexUnlock(&pCache->mtx)); + if (taosThreadMutexUnlock(&pCache->mtx) != 0) { + indexError("failed to unlock cache mutex"); + } int64_t st = taosGetTimestampUs(); diff --git a/source/libs/index/src/indexFst.c b/source/libs/index/src/indexFst.c index 6f07df50fb..4f1cc61719 100644 --- a/source/libs/index/src/indexFst.c +++ b/source/libs/index/src/indexFst.c @@ -994,7 +994,9 @@ Fst* fstCreate(FstSlice* slice) { *s = fstSliceCopy(slice, 0, FST_SLICE_LEN(slice) - 1); fst->data = s; - TAOS_UNUSED(taosThreadMutexInit(&fst->mtx, NULL)); + if (taosThreadMutexInit(&fst->mtx, NULL) != 0) { + goto FST_CREAT_FAILED; + } return fst; FST_CREAT_FAILED: diff --git a/source/libs/index/src/indexTfile.c b/source/libs/index/src/indexTfile.c index d92fec104b..1130243e27 100644 --- a/source/libs/index/src/indexTfile.c +++ b/source/libs/index/src/indexTfile.c @@ -739,7 +739,11 @@ IndexTFile* idxTFileCreate(SIndex* idx, const char* path) { tfileCacheDestroy(cache); return NULL; } - TAOS_UNUSED(taosThreadMutexInit(&tfile->mtx, NULL)); + if (taosThreadMutexInit(&tfile->mtx, NULL) != 0) { + taosMemoryFree(tfile); + tfileCacheDestroy(cache); + return NULL; + } tfile->cache = cache; return tfile; } @@ -764,9 +768,16 @@ int idxTFileSearch(void* tfile, SIndexTermQuery* query, SIdxTRslt* result) { SIndexTerm* term = query->term; ICacheKey key = {.suid = term->suid, .colType = term->colType, .colName = term->colName, .nColName = term->nColName}; - TAOS_UNUSED(taosThreadMutexLock(&pTfile->mtx)); + if (taosThreadMutexLock(&pTfile->mtx) != 0) { + indexError("failed to lock tfile mutex"); + } + TFileReader* reader = tfileCacheGet(pTfile->cache, &key); - TAOS_UNUSED(taosThreadMutexUnlock(&pTfile->mtx)); + + if (taosThreadMutexUnlock(&pTfile->mtx) != 0) { + indexError("failed to unlock tfile mutex"); + } + if (reader == NULL) { return 0; } @@ -883,9 +894,13 @@ TFileReader* tfileGetReaderByCol(IndexTFile* tf, uint64_t suid, char* colName) { TFileReader* rd = NULL; ICacheKey key = {.suid = suid, .colType = TSDB_DATA_TYPE_BINARY, .colName = colName, .nColName = strlen(colName)}; - TAOS_UNUSED(taosThreadMutexLock(&tf->mtx)); + if (taosThreadMutexLock(&tf->mtx) != 0) { + indexError("failed to lock tfile mutex"); + } rd = tfileCacheGet(tf->cache, &key); - TAOS_UNUSED(taosThreadMutexUnlock(&tf->mtx)); + if (taosThreadMutexUnlock(&tf->mtx) != 0) { + indexError("failed to unlock tfile mutex"); + } return rd; } diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index eec89617c9..2ced73a3f0 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -324,8 +324,8 @@ bool lossyFloat = false; bool lossyDouble = false; // init call -int32_t tsCompressInit(char *lossyColumns, float fPrecision, double dPrecision, uint32_t maxIntervals, - uint32_t intervals, int32_t ifAdtFse, const char *compressor) { +void tsCompressInit(char *lossyColumns, float fPrecision, double dPrecision, uint32_t maxIntervals, uint32_t intervals, + int32_t ifAdtFse, const char *compressor) { // config lossyFloat = strstr(lossyColumns, "float") != NULL; lossyDouble = strstr(lossyColumns, "double") != NULL; @@ -333,7 +333,7 @@ int32_t tsCompressInit(char *lossyColumns, float fPrecision, double dPrecision, tdszInit(fPrecision, dPrecision, maxIntervals, intervals, ifAdtFse, compressor); if (lossyFloat) uTrace("lossy compression float is opened. "); if (lossyDouble) uTrace("lossy compression double is opened. "); - return 0; + return; } // exit call void tsCompressExit() { tdszExit(); } From 49a6bf4c23e00c03e16ccf87e8562714b28e1fb8 Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Wed, 25 Sep 2024 18:25:40 +0800 Subject: [PATCH 47/62] void sync query return val --- include/common/cos.h | 1 - source/client/inc/clientInt.h | 81 ++++---- source/client/src/clientImpl.c | 8 +- source/client/src/clientRawBlockWrite.c | 24 +-- source/client/src/clientSml.c | 214 +++++++++++---------- source/client/src/clientStmt.c | 23 ++- source/client/src/clientStmt2.c | 2 +- source/common/src/cos.c | 25 ++- source/common/src/cos_cp.c | 2 +- source/libs/stream/test/checkpointTest.cpp | 1 - 10 files changed, 194 insertions(+), 187 deletions(-) diff --git a/include/common/cos.h b/include/common/cos.h index 17c48d594b..b336a1e5ee 100644 --- a/include/common/cos.h +++ b/include/common/cos.h @@ -32,7 +32,6 @@ extern int32_t tsS3PageCacheSize; extern int32_t tsS3UploadDelaySec; int32_t s3Init(); -void s3CleanUp(); int32_t s3CheckCfg(); int32_t s3PutObjectFromFile(const char *file, const char *object); int32_t s3PutObjectFromFile2(const char *file, const char *object, int8_t withcp); diff --git a/source/client/inc/clientInt.h b/source/client/inc/clientInt.h index 9811003254..a70c3b8e64 100644 --- a/source/client/inc/clientInt.h +++ b/source/client/inc/clientInt.h @@ -26,10 +26,10 @@ extern "C" { #include "query.h" #include "taos.h" #include "tcommon.h" -#include "tmisce.h" #include "tdef.h" #include "thash.h" #include "tlist.h" +#include "tmisce.h" #include "tmsg.h" #include "tmsgtype.h" #include "trpc.h" @@ -86,7 +86,7 @@ typedef struct { int8_t threadStop; int8_t quitByKill; TdThread thread; - TdThreadMutex lock; // used when app init and cleanup + TdThreadMutex lock; // used when app init and cleanup SHashObj* appSummary; SHashObj* appHbHash; // key: clusterId SArray* appHbMgrs; // SArray one for each cluster @@ -95,11 +95,11 @@ typedef struct { } SClientHbMgr; typedef struct SQueryExecMetric { - int64_t start; // start timestamp, us - int64_t ctgStart; // start to parse, us - int64_t execStart; // start to parse, us + int64_t start; // start timestamp, us + int64_t ctgStart; // start to parse, us + int64_t execStart; // start to parse, us - int64_t parseCostUs; + int64_t parseCostUs; int64_t ctgCostUs; int64_t analyseCostUs; int64_t planCostUs; @@ -193,7 +193,7 @@ typedef struct SReqResultInfo { char** convertBuf; TAOS_ROW row; SResultColumn* pCol; - uint64_t numOfRows; // from int32_t change to int64_t + uint64_t numOfRows; // from int32_t change to int64_t uint64_t totalRows; uint64_t current; bool localResultFetched; @@ -319,12 +319,14 @@ void syncCatalogFn(SMetaData* pResult, void* param, int32_t code); TAOS_RES* taosQueryImpl(TAOS* taos, const char* sql, bool validateOnly, int8_t source); TAOS_RES* taosQueryImplWithReqid(TAOS* taos, const char* sql, bool validateOnly, int64_t reqid); -void taosAsyncQueryImpl(uint64_t connId, const char* sql, __taos_async_fn_t fp, void* param, bool validateOnly, int8_t source); +void taosAsyncQueryImpl(uint64_t connId, const char* sql, __taos_async_fn_t fp, void* param, bool validateOnly, + int8_t source); void taosAsyncQueryImplWithReqid(uint64_t connId, const char* sql, __taos_async_fn_t fp, void* param, bool validateOnly, int64_t reqid); -void taosAsyncFetchImpl(SRequestObj *pRequest, __taos_async_fn_t fp, void *param); -int32_t clientParseSql(void* param, const char* dbName, const char* sql, bool parseOnly, const char* effectiveUser, SParseSqlRes* pRes); -void syncQueryFn(void* param, void* res, int32_t code); +void taosAsyncFetchImpl(SRequestObj* pRequest, __taos_async_fn_t fp, void* param); +int32_t clientParseSql(void* param, const char* dbName, const char* sql, bool parseOnly, const char* effectiveUser, + SParseSqlRes* pRes); +void syncQueryFn(void* param, void* res, int32_t code); int32_t getVersion1BlockMetaSize(const char* p, int32_t numOfCols); @@ -333,7 +335,7 @@ static FORCE_INLINE SReqResultInfo* tmqGetCurResInfo(TAOS_RES* res) { return (SReqResultInfo*)&msg->common.resInfo; } -int32_t tmqGetNextResInfo(TAOS_RES* res, bool convertUcs4, SReqResultInfo** pResInfo); +int32_t tmqGetNextResInfo(TAOS_RES* res, bool convertUcs4, SReqResultInfo** pResInfo); static FORCE_INLINE SReqResultInfo* tscGetCurResInfo(TAOS_RES* res) { if (TD_RES_QUERY(res)) return &(((SRequestObj*)res)->body.resInfo); return tmqGetCurResInfo(res); @@ -349,8 +351,8 @@ __async_send_cb_fn_t getMsgRspHandle(int32_t msgType); SMsgSendInfo* buildMsgInfoImpl(SRequestObj* pReqObj); -int32_t createTscObj(const char *user, const char *auth, const char *db, int32_t connType, SAppInstInfo *pAppInfo, - STscObj **p); +int32_t createTscObj(const char* user, const char* auth, const char* db, int32_t connType, SAppInstInfo* pAppInfo, + STscObj** p); void destroyTscObj(void* pObj); STscObj* acquireTscObj(int64_t rid); void releaseTscObj(int64_t rid); @@ -358,7 +360,7 @@ void destroyAppInst(void* pAppInfo); uint64_t generateRequestId(); -int32_t createRequest(uint64_t connId, int32_t type, int64_t reqid, SRequestObj **pRequest); +int32_t createRequest(uint64_t connId, int32_t type, int64_t reqid, SRequestObj** pRequest); void destroyRequest(SRequestObj* pRequest); SRequestObj* acquireRequest(int64_t rid); int32_t releaseRequest(int64_t rid); @@ -372,9 +374,9 @@ void resetConnectDB(STscObj* pTscObj); int taos_options_imp(TSDB_OPTION option, const char* str); -int32_t openTransporter(const char* user, const char* auth, int32_t numOfThreads, void **pDnodeConn); -void tscStopCrashReport(); -void cleanupAppInfo(); +int32_t openTransporter(const char* user, const char* auth, int32_t numOfThreads, void** pDnodeConn); +void tscStopCrashReport(); +void cleanupAppInfo(); typedef struct AsyncArg { SRpcMsg msg; @@ -402,17 +404,17 @@ int32_t hbMgrInit(); void hbMgrCleanUp(); // cluster level -int32_t appHbMgrInit(SAppInstInfo *pAppInstInfo, char *key, SAppHbMgr **pAppHbMgr); -void appHbMgrCleanup(void); -void hbRemoveAppHbMrg(SAppHbMgr** pAppHbMgr); -void destroyAllRequests(SHashObj* pRequests); -void stopAllRequests(SHashObj* pRequests); +int32_t appHbMgrInit(SAppInstInfo* pAppInstInfo, char* key, SAppHbMgr** pAppHbMgr); +void appHbMgrCleanup(void); +void hbRemoveAppHbMrg(SAppHbMgr** pAppHbMgr); +void destroyAllRequests(SHashObj* pRequests); +void stopAllRequests(SHashObj* pRequests); -//SAppInstInfo* getAppInstInfo(const char* clusterKey); +// SAppInstInfo* getAppInstInfo(const char* clusterKey); // conn level int32_t hbRegisterConn(SAppHbMgr* pAppHbMgr, int64_t tscRefId, int64_t clusterId, int8_t connType); -void hbDeregisterConn(STscObj* pTscObj, SClientHbKey connKey); +void hbDeregisterConn(STscObj* pTscObj, SClientHbKey connKey); typedef struct SSqlCallbackWrapper { SParseContext* pParseCtx; @@ -421,9 +423,9 @@ typedef struct SSqlCallbackWrapper { void* pPlanInfo; } SSqlCallbackWrapper; -void setQueryRequest(int64_t rId); -SRequestObj* launchQueryImpl(SRequestObj* pRequest, SQuery* pQuery, bool keepQuery, void** res); -int32_t scheduleQuery(SRequestObj* pRequest, SQueryPlan* pDag, SArray* pNodeList); +void setQueryRequest(int64_t rId); +void launchQueryImpl(SRequestObj* pRequest, SQuery* pQuery, bool keepQuery, void** res); +int32_t scheduleQuery(SRequestObj* pRequest, SQueryPlan* pDag, SArray* pNodeList); void launchAsyncQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaData* pResultMeta, SSqlCallbackWrapper* pWrapper); int32_t refreshMeta(STscObj* pTscObj, SRequestObj* pRequest); int32_t updateQnodeList(SAppInstInfo* pInfo, SArray* pNodeList); @@ -431,20 +433,21 @@ void doAsyncQuery(SRequestObj* pRequest, bool forceUpdateMeta); int32_t removeMeta(STscObj* pTscObj, SArray* tbList, bool isView); int32_t handleAlterTbExecRes(void* res, struct SCatalog* pCatalog); int32_t handleCreateTbExecRes(void* res, SCatalog* pCatalog); -int32_t qnodeRequired(SRequestObj* pRequest, bool *required); +int32_t qnodeRequired(SRequestObj* pRequest, bool* required); void continueInsertFromCsv(SSqlCallbackWrapper* pWrapper, SRequestObj* pRequest); void destorySqlCallbackWrapper(SSqlCallbackWrapper* pWrapper); -void handleQueryAnslyseRes(SSqlCallbackWrapper *pWrapper, SMetaData *pResultMeta, int32_t code); -void restartAsyncQuery(SRequestObj *pRequest, int32_t code); -int32_t buildPreviousRequest(SRequestObj *pRequest, const char* sql, SRequestObj** pNewRequest); -int32_t prepareAndParseSqlSyntax(SSqlCallbackWrapper **ppWrapper, SRequestObj *pRequest, bool updateMetaForce); +void handleQueryAnslyseRes(SSqlCallbackWrapper* pWrapper, SMetaData* pResultMeta, int32_t code); +void restartAsyncQuery(SRequestObj* pRequest, int32_t code); +int32_t buildPreviousRequest(SRequestObj* pRequest, const char* sql, SRequestObj** pNewRequest); +int32_t prepareAndParseSqlSyntax(SSqlCallbackWrapper** ppWrapper, SRequestObj* pRequest, bool updateMetaForce); void returnToUser(SRequestObj* pRequest); -void stopAllQueries(SRequestObj *pRequest); +void stopAllQueries(SRequestObj* pRequest); void doRequestCallback(SRequestObj* pRequest, int32_t code); void freeQueryParam(SSyncQueryParam* param); #ifdef TD_ENTERPRISE -int32_t clientParseSqlImpl(void* param, const char* dbName, const char* sql, bool parseOnly, const char* effeciveUser, SParseSqlRes* pRes); +int32_t clientParseSqlImpl(void* param, const char* dbName, const char* sql, bool parseOnly, const char* effeciveUser, + SParseSqlRes* pRes); #endif #define TSC_ERR_RET(c) \ @@ -474,13 +477,9 @@ int32_t clientParseSqlImpl(void* param, const char* dbName, const char* sql, boo void slowQueryLog(int64_t rid, bool killed, int32_t code, int32_t cost); -enum { - MONITORSQLTYPESELECT = 0, - MONITORSQLTYPEINSERT = 1, - MONITORSQLTYPEDELETE = 2 -}; +enum { MONITORSQLTYPESELECT = 0, MONITORSQLTYPEINSERT = 1, MONITORSQLTYPEDELETE = 2 }; -void sqlReqLog(int64_t rid, bool killed, int32_t code, int8_t type); +void sqlReqLog(int64_t rid, bool killed, int32_t code, int8_t type); void tmqMgmtClose(void); diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index 9ddf012bf2..a8555926f1 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -1249,7 +1249,7 @@ void schedulerExecCb(SExecResult* pResult, void* param, int32_t code) { } } -SRequestObj* launchQueryImpl(SRequestObj* pRequest, SQuery* pQuery, bool keepQuery, void** res) { +void launchQueryImpl(SRequestObj* pRequest, SQuery* pQuery, bool keepQuery, void** res) { int32_t code = 0; if (pQuery->pRoot) { @@ -1335,8 +1335,6 @@ SRequestObj* launchQueryImpl(SRequestObj* pRequest, SQuery* pQuery, bool keepQue *res = pRequest->body.resInfo.execRes.res; pRequest->body.resInfo.execRes.res = NULL; } - - return pRequest; } static int32_t asyncExecSchQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaData* pResultMeta, @@ -2934,8 +2932,8 @@ TAOS_RES* taosQueryImpl(TAOS* taos, const char* sql, bool validateOnly, int8_t s return NULL; } code = tsem_destroy(¶m->sem); - if(TSDB_CODE_SUCCESS != code) { - tscError("failed to destroy semaphore since %s", tstrerror(code)); + if (TSDB_CODE_SUCCESS != code) { + tscError("failed to destroy semaphore since %s", tstrerror(code)); } SRequestObj* pRequest = NULL; diff --git a/source/client/src/clientRawBlockWrite.c b/source/client/src/clientRawBlockWrite.c index a1022cf12a..48049f0baf 100644 --- a/source/client/src/clientRawBlockWrite.c +++ b/source/client/src/clientRawBlockWrite.c @@ -394,7 +394,7 @@ static void buildChildElement(cJSON* json, SVCreateTbReq* pCreateReq) { uint8_t tagNum = pCreateReq->ctb.tagNum; int32_t code = 0; cJSON* tags = NULL; - cJSON* tableName = cJSON_CreateString(name); + cJSON* tableName = cJSON_CreateString(name); RAW_NULL_CHECK(tableName); RAW_FALSE_CHECK(cJSON_AddItemToObject(json, "tableName", tableName)); cJSON* using = cJSON_CreateString(sname); @@ -417,7 +417,7 @@ static void buildChildElement(cJSON* json, SVCreateTbReq* pCreateReq) { } char* pJson = NULL; parseTagDatatoJson(pTag, &pJson); - if(pJson == NULL) { + if (pJson == NULL) { uError("parseTagDatatoJson failed, pJson == NULL"); goto end; } @@ -731,7 +731,7 @@ static void processAlterTable(SMqMetaRsp* metaRsp, cJSON** pJson) { goto end; } parseTagDatatoJson(vAlterTbReq.pTagVal, &buf); - if(buf == NULL) { + if (buf == NULL) { uError("parseTagDatatoJson failed, buf == NULL"); goto end; } @@ -978,7 +978,7 @@ static int32_t taosCreateStb(TAOS* taos, void* meta, int32_t metaLen) { pQuery.msgType = pQuery.pCmdMsg->msgType; pQuery.stableQuery = true; - (void)launchQueryImpl(pRequest, &pQuery, true, NULL); // ignore, because return value is pRequest + launchQueryImpl(pRequest, &pQuery, true, NULL); // ignore, because return value is pRequest taosMemoryFree(pCmdMsg.pMsg); @@ -1082,7 +1082,7 @@ static int32_t taosDropStb(TAOS* taos, void* meta, int32_t metaLen) { pQuery.msgType = pQuery.pCmdMsg->msgType; pQuery.stableQuery = true; - (void)launchQueryImpl(pRequest, &pQuery, true, NULL); // ignore, because return value is pRequest + launchQueryImpl(pRequest, &pQuery, true, NULL); // ignore, because return value is pRequest taosMemoryFree(pCmdMsg.pMsg); if (pRequest->code == TSDB_CODE_SUCCESS) { // ignore the error code @@ -1236,7 +1236,7 @@ static int32_t taosCreateTable(TAOS* taos, void* meta, int32_t metaLen) { RAW_RETURN_CHECK(rewriteToVnodeModifyOpStmt(pQuery, pBufArray)); - (void)launchQueryImpl(pRequest, pQuery, true, NULL); + launchQueryImpl(pRequest, pQuery, true, NULL); if (pRequest->code == TSDB_CODE_SUCCESS) { RAW_RETURN_CHECK(removeMeta(pTscObj, pRequest->tableList, false)); } @@ -1365,7 +1365,7 @@ static int32_t taosDropTable(TAOS* taos, void* meta, int32_t metaLen) { if (TSDB_CODE_SUCCESS != code) goto end; RAW_RETURN_CHECK(rewriteToVnodeModifyOpStmt(pQuery, pBufArray)); - (void)launchQueryImpl(pRequest, pQuery, true, NULL); + launchQueryImpl(pRequest, pQuery, true, NULL); if (pRequest->code == TSDB_CODE_SUCCESS) { RAW_RETURN_CHECK(removeMeta(pTscObj, pRequest->tableList, false)); } @@ -1510,7 +1510,7 @@ static int32_t taosAlterTable(TAOS* taos, void* meta, int32_t metaLen) { if (TSDB_CODE_SUCCESS != code) goto end; RAW_RETURN_CHECK(rewriteToVnodeModifyOpStmt(pQuery, pArray)); - (void)launchQueryImpl(pRequest, pQuery, true, NULL); + launchQueryImpl(pRequest, pQuery, true, NULL); pVgData = NULL; pArray = NULL; @@ -1587,7 +1587,7 @@ int taos_write_raw_block_with_fields_with_reqid(TAOS* taos, int rows, char* pDat RAW_RETURN_CHECK(rawBlockBindData(pQuery, pTableMeta, pData, NULL, fields, numFields, false, NULL, 0)); RAW_RETURN_CHECK(smlBuildOutput(pQuery, pVgHash)); - (void)launchQueryImpl(pRequest, pQuery, true, NULL); + launchQueryImpl(pRequest, pQuery, true, NULL); code = pRequest->code; end: @@ -1647,7 +1647,7 @@ int taos_write_raw_block_with_reqid(TAOS* taos, int rows, char* pData, const cha RAW_RETURN_CHECK(rawBlockBindData(pQuery, pTableMeta, pData, NULL, NULL, 0, false, NULL, 0)); RAW_RETURN_CHECK(smlBuildOutput(pQuery, pVgHash)); - (void)launchQueryImpl(pRequest, pQuery, true, NULL); + launchQueryImpl(pRequest, pQuery, true, NULL); code = pRequest->code; end: @@ -1766,7 +1766,7 @@ static int32_t tmqWriteRawDataImpl(TAOS* taos, void* data, int32_t dataLen) { RAW_RETURN_CHECK(smlBuildOutput(pQuery, pVgHash)); - (void)launchQueryImpl(pRequest, pQuery, true, NULL); + launchQueryImpl(pRequest, pQuery, true, NULL); code = pRequest->code; end: @@ -1935,7 +1935,7 @@ static int32_t tmqWriteRawMetaDataImpl(TAOS* taos, void* data, int32_t dataLen) RAW_RETURN_CHECK(smlBuildOutput(pQuery, pVgHash)); - (void)launchQueryImpl(pRequest, pQuery, true, NULL); + launchQueryImpl(pRequest, pQuery, true, NULL); code = pRequest->code; end: diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c index 6a19f61383..f3a22bff75 100644 --- a/source/client/src/clientSml.c +++ b/source/client/src/clientSml.c @@ -112,7 +112,7 @@ static int32_t smlCheckAuth(SSmlHandle *info, SRequestConnInfo *conn, const char SUserAuthInfo pAuth = {0}; (void)snprintf(pAuth.user, sizeof(pAuth.user), "%s", info->taos->user); if (NULL == pTabName) { - if (tNameSetDbName(&pAuth.tbName, info->taos->acctId, info->pRequest->pDb, strlen(info->pRequest->pDb)) != 0){ + if (tNameSetDbName(&pAuth.tbName, info->taos->acctId, info->pRequest->pDb, strlen(info->pRequest->pDb)) != 0) { return TSDB_CODE_SML_INVALID_DATA; } } else { @@ -165,7 +165,7 @@ int64_t smlGetTimeValue(const char *value, int32_t len, uint8_t fromPrecision, u return convertTimePrecision(tsInt64, fromPrecision, toPrecision); } -int32_t smlBuildTableInfo(int numRows, const char *measure, int32_t measureLen, SSmlTableInfo** tInfo) { +int32_t smlBuildTableInfo(int numRows, const char *measure, int32_t measureLen, SSmlTableInfo **tInfo) { SSmlTableInfo *tag = (SSmlTableInfo *)taosMemoryCalloc(sizeof(SSmlTableInfo), 1); if (!tag) { return terrno; @@ -203,13 +203,13 @@ static void smlDestroySTableMeta(void *para) { taosMemoryFree(meta); } -int32_t smlBuildSuperTableInfo(SSmlHandle *info, SSmlLineInfo *currElement, SSmlSTableMeta** sMeta) { - int32_t code = TSDB_CODE_SUCCESS; - char *measure = currElement->measure; - int measureLen = currElement->measureLen; +int32_t smlBuildSuperTableInfo(SSmlHandle *info, SSmlLineInfo *currElement, SSmlSTableMeta **sMeta) { + int32_t code = TSDB_CODE_SUCCESS; + char *measure = currElement->measure; + int measureLen = currElement->measureLen; if (currElement->measureEscaped) { measure = (char *)taosMemoryMalloc(measureLen); - if (measure == NULL){ + if (measure == NULL) { return terrno; } (void)memcpy(measure, currElement->measure, measureLen); @@ -233,7 +233,7 @@ int32_t smlBuildSuperTableInfo(SSmlHandle *info, SSmlLineInfo *currElement, SSml } (*sMeta)->tableMeta = pTableMeta; code = taosHashPut(info->superTables, currElement->measure, currElement->measureLen, sMeta, POINTER_BYTES); - if (code != TSDB_CODE_SUCCESS){ + if (code != TSDB_CODE_SUCCESS) { smlDestroySTableMeta(*sMeta); return code; } @@ -250,11 +250,11 @@ int32_t smlBuildSuperTableInfo(SSmlHandle *info, SSmlLineInfo *currElement, SSml } if (i < pTableMeta->tableInfo.numOfColumns) { - if(taosArrayPush((*sMeta)->cols, &kv) == NULL){ + if (taosArrayPush((*sMeta)->cols, &kv) == NULL) { return terrno; } } else { - if(taosArrayPush((*sMeta)->tags, &kv) == NULL){ + if (taosArrayPush((*sMeta)->tags, &kv) == NULL) { return terrno; } } @@ -277,7 +277,7 @@ bool isSmlColAligned(SSmlHandle *info, int cnt, SSmlKv *kv) { goto END; } SSmlKv *maxKV = (SSmlKv *)taosArrayGet(info->maxColKVs, cnt); - if (maxKV == NULL){ + if (maxKV == NULL) { goto END; } if (unlikely(!IS_SAME_KEY)) { @@ -336,9 +336,9 @@ int32_t smlJoinMeasureTag(SSmlLineInfo *elements) { return TSDB_CODE_SUCCESS; } -static bool smlIsPKTable(STableMeta *pTableMeta){ - for(int i = 0; i < pTableMeta->tableInfo.numOfColumns; i++){ - if(pTableMeta->schema[i].flags & COL_IS_KEY){ +static bool smlIsPKTable(STableMeta *pTableMeta) { + for (int i = 0; i < pTableMeta->tableInfo.numOfColumns; i++) { + if (pTableMeta->schema[i].flags & COL_IS_KEY) { return true; } } @@ -368,14 +368,14 @@ int32_t smlProcessSuperTable(SSmlHandle *info, SSmlLineInfo *elements) { info->maxTagKVs = sMeta->tags; info->maxColKVs = sMeta->cols; - if(smlIsPKTable(sMeta->tableMeta)){ + if (smlIsPKTable(sMeta->tableMeta)) { return TSDB_CODE_SML_NOT_SUPPORT_PK; } return 0; } int32_t smlProcessChildTable(SSmlHandle *info, SSmlLineInfo *elements) { - int32_t code = TSDB_CODE_SUCCESS; + int32_t code = TSDB_CODE_SUCCESS; SSmlTableInfo **oneTable = (SSmlTableInfo **)taosHashGet(info->childTables, elements->measureTag, elements->measureTagsLen); SSmlTableInfo *tinfo = NULL; @@ -385,19 +385,19 @@ int32_t smlProcessChildTable(SSmlHandle *info, SSmlLineInfo *elements) { return code; } code = taosHashPut(info->childTables, elements->measureTag, elements->measureTagsLen, &tinfo, POINTER_BYTES); - if(code != 0){ + if (code != 0) { smlDestroyTableInfo(&tinfo); return code; } tinfo->tags = taosArrayDup(info->preLineTagKV, NULL); - if(tinfo->tags == NULL){ + if (tinfo->tags == NULL) { smlDestroyTableInfo(&tinfo); return TSDB_CODE_OUT_OF_MEMORY; } for (size_t i = 0; i < taosArrayGetSize(info->preLineTagKV); i++) { SSmlKv *kv = (SSmlKv *)taosArrayGet(info->preLineTagKV, i); - if(kv == NULL){ + if (kv == NULL) { smlDestroyTableInfo(&tinfo); return TSDB_CODE_SML_INVALID_DATA; } @@ -406,12 +406,12 @@ int32_t smlProcessChildTable(SSmlHandle *info, SSmlLineInfo *elements) { } code = smlSetCTableName(tinfo, info->tbnameKey); - if (code != TSDB_CODE_SUCCESS){ + if (code != TSDB_CODE_SUCCESS) { smlDestroyTableInfo(&tinfo); return code; } code = getTableUid(info, elements, tinfo); - if (code != TSDB_CODE_SUCCESS){ + if (code != TSDB_CODE_SUCCESS) { smlDestroyTableInfo(&tinfo); return code; } @@ -458,10 +458,10 @@ int32_t smlParseEndTelnetJson(SSmlHandle *info, SSmlLineInfo *elements, SSmlKv * return terrno; } } - if (taosArrayPush(elements->colArray, kvTs) == NULL){ + if (taosArrayPush(elements->colArray, kvTs) == NULL) { return terrno; } - if (taosArrayPush(elements->colArray, kv) == NULL){ + if (taosArrayPush(elements->colArray, kv) == NULL) { return terrno; } } @@ -495,11 +495,11 @@ int32_t smlParseEndLine(SSmlHandle *info, SSmlLineInfo *elements, SSmlKv *kvTs) static int32_t smlParseTableName(SArray *tags, char *childTableName, char *tbnameKey) { bool autoChildName = false; size_t delimiter = strlen(tsSmlAutoChildTableNameDelimiter); - if(delimiter > 0 && tbnameKey == NULL){ + if (delimiter > 0 && tbnameKey == NULL) { size_t totalNameLen = delimiter * (taosArrayGetSize(tags) - 1); for (int i = 0; i < taosArrayGetSize(tags); i++) { SSmlKv *tag = (SSmlKv *)taosArrayGet(tags, i); - if(tag == NULL){ + if (tag == NULL) { return TSDB_CODE_SML_INVALID_DATA; } totalNameLen += tag->length; @@ -512,7 +512,7 @@ static int32_t smlParseTableName(SArray *tags, char *childTableName, char *tbnam (void)memset(childTableName, 0, TSDB_TABLE_NAME_LEN); for (int i = 0; i < taosArrayGetSize(tags); i++) { SSmlKv *tag = (SSmlKv *)taosArrayGet(tags, i); - if(tag == NULL){ + if (tag == NULL) { return TSDB_CODE_SML_INVALID_DATA; } (void)strncat(childTableName, tag->value, tag->length); @@ -523,8 +523,8 @@ static int32_t smlParseTableName(SArray *tags, char *childTableName, char *tbnam if (tsSmlDot2Underline) { smlStrReplace(childTableName, strlen(childTableName)); } - }else{ - if (tbnameKey == NULL){ + } else { + if (tbnameKey == NULL) { tbnameKey = tsSmlChildTableName; } size_t childTableNameLen = strlen(tbnameKey); @@ -532,13 +532,14 @@ static int32_t smlParseTableName(SArray *tags, char *childTableName, char *tbnam for (int i = 0; i < taosArrayGetSize(tags); i++) { SSmlKv *tag = (SSmlKv *)taosArrayGet(tags, i); - if(tag == NULL){ + if (tag == NULL) { return TSDB_CODE_SML_INVALID_DATA; } // handle child table name if (childTableNameLen == tag->keyLen && strncmp(tag->key, tbnameKey, tag->keyLen) == 0) { (void)memset(childTableName, 0, TSDB_TABLE_NAME_LEN); - (void)strncpy(childTableName, tag->value, (tag->length < TSDB_TABLE_NAME_LEN ? tag->length : TSDB_TABLE_NAME_LEN)); + (void)strncpy(childTableName, tag->value, + (tag->length < TSDB_TABLE_NAME_LEN ? tag->length : TSDB_TABLE_NAME_LEN)); if (tsSmlDot2Underline) { smlStrReplace(childTableName, strlen(childTableName)); } @@ -553,7 +554,7 @@ static int32_t smlParseTableName(SArray *tags, char *childTableName, char *tbnam int32_t smlSetCTableName(SSmlTableInfo *oneTable, char *tbnameKey) { int32_t code = smlParseTableName(oneTable->tags, oneTable->childTableName, tbnameKey); - if(code != TSDB_CODE_SUCCESS){ + if (code != TSDB_CODE_SUCCESS) { return code; } @@ -562,7 +563,7 @@ int32_t smlSetCTableName(SSmlTableInfo *oneTable, char *tbnameKey) { if (dst == NULL) { return TSDB_CODE_OUT_OF_MEMORY; } - if(oneTable->sTableNameLen >= TSDB_TABLE_NAME_LEN){ + if (oneTable->sTableNameLen >= TSDB_TABLE_NAME_LEN) { uError("SML:smlSetCTableName super table name is too long"); taosArrayDestroy(dst); return TSDB_CODE_SML_INTERNAL_ERROR; @@ -578,7 +579,7 @@ int32_t smlSetCTableName(SSmlTableInfo *oneTable, char *tbnameKey) { } code = buildChildTableName(&rName); - if (code != TSDB_CODE_SUCCESS){ + if (code != TSDB_CODE_SUCCESS) { return code; } taosArrayDestroy(dst); @@ -906,13 +907,13 @@ static int32_t smlFindNearestPowerOf2(int32_t length, uint8_t type) { return result; } -static int32_t smlProcessSchemaAction(SSmlHandle *info, SSchema *schemaField, SHashObj *schemaHash, SArray *cols, SArray *checkDumplicateCols, - ESchemaAction *action, bool isTag) { +static int32_t smlProcessSchemaAction(SSmlHandle *info, SSchema *schemaField, SHashObj *schemaHash, SArray *cols, + SArray *checkDumplicateCols, ESchemaAction *action, bool isTag) { int32_t code = TSDB_CODE_SUCCESS; for (int j = 0; j < taosArrayGetSize(cols); ++j) { if (j == 0 && !isTag) continue; SSmlKv *kv = (SSmlKv *)taosArrayGet(cols, j); - if (kv == NULL){ + if (kv == NULL) { return TSDB_CODE_SML_INVALID_DATA; } code = smlGenerateSchemaAction(schemaField, schemaHash, kv, isTag, action, info); @@ -923,10 +924,10 @@ static int32_t smlProcessSchemaAction(SSmlHandle *info, SSchema *schemaField, SH for (int j = 0; j < taosArrayGetSize(checkDumplicateCols); ++j) { SSmlKv *kv = (SSmlKv *)taosArrayGet(checkDumplicateCols, j); - if (kv == NULL){ + if (kv == NULL) { return TSDB_CODE_SML_INVALID_DATA; } - if(taosHashGet(schemaHash, kv->key, kv->keyLen) != NULL){ + if (taosHashGet(schemaHash, kv->key, kv->keyLen) != NULL) { return TSDB_CODE_PAR_DUPLICATED_COLUMN; } } @@ -934,16 +935,16 @@ static int32_t smlProcessSchemaAction(SSmlHandle *info, SSchema *schemaField, SH } static int32_t smlCheckMeta(SSchema *schema, int32_t length, SArray *cols, bool isTag) { - int32_t code = TSDB_CODE_SUCCESS; + int32_t code = TSDB_CODE_SUCCESS; SHashObj *hashTmp = taosHashInit(length, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK); if (hashTmp == NULL) { code = terrno; goto END; } - int32_t i = 0; + int32_t i = 0; for (; i < length; i++) { code = taosHashPut(hashTmp, schema[i].name, strlen(schema[i].name), &i, SHORT_BYTES); - if (code != 0){ + if (code != 0) { goto END; } } @@ -955,7 +956,7 @@ static int32_t smlCheckMeta(SSchema *schema, int32_t length, SArray *cols, bool } for (; i < taosArrayGetSize(cols); i++) { SSmlKv *kv = (SSmlKv *)taosArrayGet(cols, i); - if (kv == NULL){ + if (kv == NULL) { code = TSDB_CODE_SML_INVALID_DATA; goto END; } @@ -982,8 +983,8 @@ static int32_t getBytes(uint8_t type, int32_t length) { static int32_t smlBuildFieldsList(SSmlHandle *info, SSchema *schemaField, SHashObj *schemaHash, SArray *cols, SArray *results, int32_t numOfCols, bool isTag) { for (int j = 0; j < taosArrayGetSize(cols); ++j) { - SSmlKv *kv = (SSmlKv *)taosArrayGet(cols, j); - if (kv == NULL){ + SSmlKv *kv = (SSmlKv *)taosArrayGet(cols, j); + if (kv == NULL) { return TSDB_CODE_SML_INVALID_DATA; } ESchemaAction action = SCHEMA_ACTION_NULL; @@ -996,7 +997,7 @@ static int32_t smlBuildFieldsList(SSmlHandle *info, SSchema *schemaField, SHashO field.type = kv->type; field.bytes = getBytes(kv->type, kv->length); (void)memcpy(field.name, kv->key, kv->keyLen); - if (taosArrayPush(results, &field) == NULL){ + if (taosArrayPush(results, &field) == NULL) { return terrno; } } else if (action == SCHEMA_ACTION_CHANGE_COLUMN_SIZE || action == SCHEMA_ACTION_CHANGE_TAG_SIZE) { @@ -1008,7 +1009,7 @@ static int32_t smlBuildFieldsList(SSmlHandle *info, SSchema *schemaField, SHashO uint16_t newIndex = *index; if (isTag) newIndex -= numOfCols; SField *field = (SField *)taosArrayGet(results, newIndex); - if (field == NULL){ + if (field == NULL) { return TSDB_CODE_SML_INVALID_DATA; } field->bytes = getBytes(kv->type, kv->length); @@ -1019,7 +1020,7 @@ static int32_t smlBuildFieldsList(SSmlHandle *info, SSchema *schemaField, SHashO int32_t len = 0; for (int j = 0; j < taosArrayGetSize(results); ++j) { SField *field = taosArrayGet(results, j); - if (field == NULL){ + if (field == NULL) { return TSDB_CODE_SML_INVALID_DATA; } len += field->bytes; @@ -1051,14 +1052,14 @@ static int32_t smlSendMetaMsg(SSmlHandle *info, SName *pName, SArray *pColumns, } for (int32_t i = 0; i < pReq.numOfColumns; ++i) { SField *pField = taosArrayGet(pColumns, i); - if (pField == NULL){ + if (pField == NULL) { code = TSDB_CODE_SML_INVALID_DATA; goto end; } SFieldWithOptions fieldWithOption = {0}; setFieldWithOptions(&fieldWithOption, pField); setDefaultOptionsForField(&fieldWithOption); - if (taosArrayPush(pReq.pColumns, &fieldWithOption) == NULL){ + if (taosArrayPush(pReq.pColumns, &fieldWithOption) == NULL) { code = terrno; goto end; } @@ -1105,7 +1106,7 @@ static int32_t smlSendMetaMsg(SSmlHandle *info, SName *pName, SArray *pColumns, field.type = TSDB_DATA_TYPE_NCHAR; field.bytes = TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE; tstrncpy(field.name, tsSmlTagName, sizeof(field.name)); - if (taosArrayPush(pReq.pTags, &field) == NULL){ + if (taosArrayPush(pReq.pTags, &field) == NULL) { code = terrno; goto end; } @@ -1121,7 +1122,7 @@ static int32_t smlSendMetaMsg(SSmlHandle *info, SName *pName, SArray *pColumns, pCmdMsg.epSet = getEpSet_s(&info->taos->pAppInfo->mgmtEp); pCmdMsg.msgType = TDMT_MND_CREATE_STB; pCmdMsg.msgLen = tSerializeSMCreateStbReq(NULL, 0, &pReq); - if (pCmdMsg.msgLen < 0){ + if (pCmdMsg.msgLen < 0) { code = TSDB_CODE_OUT_OF_MEMORY; goto end; } @@ -1131,7 +1132,7 @@ static int32_t smlSendMetaMsg(SSmlHandle *info, SName *pName, SArray *pColumns, goto end; } - if (tSerializeSMCreateStbReq(pCmdMsg.pMsg, pCmdMsg.msgLen, &pReq) < 0){ + if (tSerializeSMCreateStbReq(pCmdMsg.pMsg, pCmdMsg.msgLen, &pReq) < 0) { code = TSDB_CODE_OUT_OF_MEMORY; taosMemoryFree(pCmdMsg.pMsg); goto end; @@ -1144,11 +1145,11 @@ static int32_t smlSendMetaMsg(SSmlHandle *info, SName *pName, SArray *pColumns, pQuery.msgType = pQuery.pCmdMsg->msgType; pQuery.stableQuery = true; - (void)launchQueryImpl(pRequest, &pQuery, true, NULL); // no need to check return value + launchQueryImpl(pRequest, &pQuery, true, NULL); // no need to check return value if (pRequest->code == TSDB_CODE_SUCCESS) { code = catalogRemoveTableMeta(info->pCatalog, pName); - if (code != TSDB_CODE_SUCCESS){ + if (code != TSDB_CODE_SUCCESS) { goto end; } } @@ -1187,7 +1188,7 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { size_t superTableLen = 0; void *superTable = taosHashGetKey(tmp, &superTableLen); char *measure = taosMemoryMalloc(superTableLen); - if (measure == NULL){ + if (measure == NULL) { code = terrno; goto end; } @@ -1246,28 +1247,28 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { goto end; } } else if (code == TSDB_CODE_SUCCESS) { - - if(smlIsPKTable(pTableMeta)){ + if (smlIsPKTable(pTableMeta)) { code = TSDB_CODE_SML_NOT_SUPPORT_PK; goto end; } hashTmp = taosHashInit(pTableMeta->tableInfo.numOfTags, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK); - if (hashTmp == NULL){ + if (hashTmp == NULL) { code = terrno; goto end; } for (uint16_t i = pTableMeta->tableInfo.numOfColumns; i < pTableMeta->tableInfo.numOfColumns + pTableMeta->tableInfo.numOfTags; i++) { code = taosHashPut(hashTmp, pTableMeta->schema[i].name, strlen(pTableMeta->schema[i].name), &i, SHORT_BYTES); - if (code != 0){ + if (code != 0) { goto end; } } ESchemaAction action = SCHEMA_ACTION_NULL; - code = smlProcessSchemaAction(info, pTableMeta->schema, hashTmp, sTableData->tags, sTableData->cols, &action, true); + code = + smlProcessSchemaAction(info, pTableMeta->schema, hashTmp, sTableData->tags, sTableData->cols, &action, true); if (code != TSDB_CODE_SUCCESS) { goto end; } @@ -1280,13 +1281,13 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { action); SArray *pColumns = taosArrayInit(taosArrayGetSize(sTableData->cols) + pTableMeta->tableInfo.numOfColumns, sizeof(SField)); - if (pColumns == NULL){ + if (pColumns == NULL) { code = terrno; goto end; } SArray *pTags = taosArrayInit(taosArrayGetSize(sTableData->tags) + pTableMeta->tableInfo.numOfTags, sizeof(SField)); - if (pTags == NULL){ + if (pTags == NULL) { taosArrayDestroy(pColumns); code = terrno; goto end; @@ -1297,14 +1298,14 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { field.bytes = pTableMeta->schema[i].bytes; tstrncpy(field.name, pTableMeta->schema[i].name, sizeof(field.name)); if (i < pTableMeta->tableInfo.numOfColumns) { - if (taosArrayPush(pColumns, &field) == NULL){ + if (taosArrayPush(pColumns, &field) == NULL) { taosArrayDestroy(pColumns); taosArrayDestroy(pTags); code = terrno; goto end; } } else { - if (taosArrayPush(pTags, &field) == NULL){ + if (taosArrayPush(pTags, &field) == NULL) { taosArrayDestroy(pColumns); taosArrayDestroy(pTags); code = terrno; @@ -1363,7 +1364,8 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { } } action = SCHEMA_ACTION_NULL; - code = smlProcessSchemaAction(info, pTableMeta->schema, hashTmp, sTableData->cols, sTableData->tags, &action, false); + code = + smlProcessSchemaAction(info, pTableMeta->schema, hashTmp, sTableData->cols, sTableData->tags, &action, false); if (code != TSDB_CODE_SUCCESS) { goto end; } @@ -1376,13 +1378,13 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { action); SArray *pColumns = taosArrayInit(taosArrayGetSize(sTableData->cols) + pTableMeta->tableInfo.numOfColumns, sizeof(SField)); - if (pColumns == NULL){ + if (pColumns == NULL) { code = terrno; goto end; } SArray *pTags = taosArrayInit(taosArrayGetSize(sTableData->tags) + pTableMeta->tableInfo.numOfTags, sizeof(SField)); - if (pTags == NULL){ + if (pTags == NULL) { taosArrayDestroy(pColumns); code = terrno; goto end; @@ -1393,14 +1395,14 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { field.bytes = pTableMeta->schema[i].bytes; tstrncpy(field.name, pTableMeta->schema[i].name, sizeof(field.name)); if (i < pTableMeta->tableInfo.numOfColumns) { - if (taosArrayPush(pColumns, &field) == NULL){ + if (taosArrayPush(pColumns, &field) == NULL) { taosArrayDestroy(pColumns); taosArrayDestroy(pTags); code = terrno; goto end; } } else { - if (taosArrayPush(pTags, &field) == NULL){ + if (taosArrayPush(pTags, &field) == NULL) { taosArrayDestroy(pColumns); taosArrayDestroy(pTags); code = terrno; @@ -1483,7 +1485,7 @@ end: taosHashCancelIterate(info->superTables, tmp); taosHashCleanup(hashTmp); taosMemoryFreeClear(pTableMeta); - (void)catalogRefreshTableMeta(info->pCatalog, &conn, &pName, 1); // ignore refresh meta code if there is an error + (void)catalogRefreshTableMeta(info->pCatalog, &conn, &pName, 1); // ignore refresh meta code if there is an error uError("SML:0x%" PRIx64 " smlModifyDBSchemas end failed:%d:%s, format:%d, needModifySchema:%d", info->id, code, tstrerror(code), info->dataFormat, info->needModifySchema); @@ -1494,34 +1496,35 @@ static int32_t smlInsertMeta(SHashObj *metaHash, SArray *metaArray, SArray *cols terrno = 0; for (int16_t i = 0; i < taosArrayGetSize(cols); ++i) { SSmlKv *kv = (SSmlKv *)taosArrayGet(cols, i); - if (kv == NULL){ + if (kv == NULL) { return TSDB_CODE_SML_INVALID_DATA; } - int ret = taosHashPut(metaHash, kv->key, kv->keyLen, &i, SHORT_BYTES); + int ret = taosHashPut(metaHash, kv->key, kv->keyLen, &i, SHORT_BYTES); if (ret == 0) { - if (taosArrayPush(metaArray, kv) == NULL){ + if (taosArrayPush(metaArray, kv) == NULL) { return terrno; } - if(taosHashGet(checkDuplicate, kv->key, kv->keyLen) != NULL) { + if (taosHashGet(checkDuplicate, kv->key, kv->keyLen) != NULL) { return TSDB_CODE_PAR_DUPLICATED_COLUMN; } - }else if(terrno == TSDB_CODE_DUP_KEY){ + } else if (terrno == TSDB_CODE_DUP_KEY) { return TSDB_CODE_PAR_DUPLICATED_COLUMN; } } return TSDB_CODE_SUCCESS; } -static int32_t smlUpdateMeta(SHashObj *metaHash, SArray *metaArray, SArray *cols, bool isTag, SSmlMsgBuf *msg, SHashObj* checkDuplicate) { +static int32_t smlUpdateMeta(SHashObj *metaHash, SArray *metaArray, SArray *cols, bool isTag, SSmlMsgBuf *msg, + SHashObj *checkDuplicate) { for (int i = 0; i < taosArrayGetSize(cols); ++i) { SSmlKv *kv = (SSmlKv *)taosArrayGet(cols, i); - if (kv == NULL){ + if (kv == NULL) { return TSDB_CODE_SML_INVALID_DATA; } int16_t *index = (int16_t *)taosHashGet(metaHash, kv->key, kv->keyLen); if (index) { SSmlKv *value = (SSmlKv *)taosArrayGet(metaArray, *index); - if (value == NULL){ + if (value == NULL) { return TSDB_CODE_SML_INVALID_DATA; } @@ -1549,13 +1552,13 @@ static int32_t smlUpdateMeta(SHashObj *metaHash, SArray *metaArray, SArray *cols int16_t size = tmp; int ret = taosHashPut(metaHash, kv->key, kv->keyLen, &size, SHORT_BYTES); if (ret == 0) { - if(taosArrayPush(metaArray, kv) == NULL){ + if (taosArrayPush(metaArray, kv) == NULL) { return terrno; } - if(taosHashGet(checkDuplicate, kv->key, kv->keyLen) != NULL) { + if (taosHashGet(checkDuplicate, kv->key, kv->keyLen) != NULL) { return TSDB_CODE_PAR_DUPLICATED_COLUMN; } - }else{ + } else { return ret; } } @@ -1586,7 +1589,7 @@ void freeSSmlKv(void *data) { void smlDestroyInfo(SSmlHandle *info) { if (!info) return; -// qDestroyQuery(info->pQuery); + // qDestroyQuery(info->pQuery); taosHashCleanup(info->pVgHash); taosHashCleanup(info->childTables); @@ -1657,7 +1660,7 @@ int32_t smlBuildSmlInfo(TAOS *taos, SSmlHandle **handle) { info->id = smlGenId(); code = smlInitHandle(&info->pQuery); - if (code != TSDB_CODE_SUCCESS){ + if (code != TSDB_CODE_SUCCESS) { goto FAILED; } info->dataFormat = true; @@ -1688,7 +1691,7 @@ static int32_t smlPushCols(SArray *colsArray, SArray *cols) { } for (size_t i = 0; i < taosArrayGetSize(cols); i++) { SSmlKv *kv = (SSmlKv *)taosArrayGet(cols, i); - if (kv == NULL){ + if (kv == NULL) { taosHashCleanup(kvHash); return TSDB_CODE_SML_INVALID_DATA; } @@ -1698,7 +1701,7 @@ static int32_t smlPushCols(SArray *colsArray, SArray *cols) { taosHashCleanup(kvHash); return TSDB_CODE_PAR_DUPLICATED_COLUMN; } - if (code != TSDB_CODE_SUCCESS){ + if (code != TSDB_CODE_SUCCESS) { taosHashCleanup(kvHash); return code; } @@ -1759,9 +1762,11 @@ static int32_t smlParseLineBottom(SSmlHandle *info) { if (tableMeta) { // update meta uDebug("SML:0x%" PRIx64 " smlParseLineBottom update meta, format:%d, linenum:%d", info->id, info->dataFormat, info->lineNum); - ret = smlUpdateMeta((*tableMeta)->colHash, (*tableMeta)->cols, elements->colArray, false, &info->msgBuf, (*tableMeta)->tagHash); + ret = smlUpdateMeta((*tableMeta)->colHash, (*tableMeta)->cols, elements->colArray, false, &info->msgBuf, + (*tableMeta)->tagHash); if (ret == TSDB_CODE_SUCCESS) { - ret = smlUpdateMeta((*tableMeta)->tagHash, (*tableMeta)->tags, tinfo->tags, true, &info->msgBuf, (*tableMeta)->colHash); + ret = smlUpdateMeta((*tableMeta)->tagHash, (*tableMeta)->tags, tinfo->tags, true, &info->msgBuf, + (*tableMeta)->colHash); } if (ret != TSDB_CODE_SUCCESS) { uError("SML:0x%" PRIx64 " smlUpdateMeta failed, ret:%d", info->id, ret); @@ -1801,17 +1806,17 @@ static int32_t smlInsertData(SSmlHandle *info) { if (info->pRequest->dbList == NULL) { info->pRequest->dbList = taosArrayInit(1, TSDB_DB_FNAME_LEN); - if (info->pRequest->dbList == NULL){ + if (info->pRequest->dbList == NULL) { return terrno; } } char *data = (char *)taosArrayReserve(info->pRequest->dbList, 1); - if (data == NULL){ + if (data == NULL) { return terrno; } SName pName = {TSDB_TABLE_NAME_T, info->taos->acctId, {0}, {0}}; tstrncpy(pName.dbname, info->pRequest->pDb, sizeof(pName.dbname)); - (void)tNameGetFullDbName(&pName, data); //ignore + (void)tNameGetFullDbName(&pName, data); // ignore SSmlTableInfo **oneTable = (SSmlTableInfo **)taosHashIterate(info->childTables, NULL); while (oneTable) { @@ -1819,7 +1824,7 @@ static int32_t smlInsertData(SSmlHandle *info) { int measureLen = tableData->sTableNameLen; char *measure = (char *)taosMemoryMalloc(tableData->sTableNameLen); - if (measure == NULL){ + if (measure == NULL) { return terrno; } (void)memcpy(measure, tableData->sTableName, tableData->sTableNameLen); @@ -1830,11 +1835,11 @@ static int32_t smlInsertData(SSmlHandle *info) { if (info->pRequest->tableList == NULL) { info->pRequest->tableList = taosArrayInit(1, sizeof(SName)); - if (info->pRequest->tableList == NULL){ + if (info->pRequest->tableList == NULL) { return terrno; } } - if (taosArrayPush(info->pRequest->tableList, &pName) == NULL){ + if (taosArrayPush(info->pRequest->tableList, &pName) == NULL) { return terrno; } @@ -1862,7 +1867,7 @@ static int32_t smlInsertData(SSmlHandle *info) { return code; } code = taosHashPut(info->pVgHash, (const char *)&vg.vgId, sizeof(vg.vgId), (char *)&vg, sizeof(vg)); - if (code != TSDB_CODE_SUCCESS){ + if (code != TSDB_CODE_SUCCESS) { uError("SML:0x%" PRIx64 " taosHashPut failed. table name: %s", info->id, tableData->childTableName); taosMemoryFree(measure); taosHashCancelIterate(info->childTables, oneTable); @@ -1904,9 +1909,9 @@ static int32_t smlInsertData(SSmlHandle *info) { info->cost.insertRpcTime = taosGetTimestampUs(); SAppClusterSummary *pActivity = &info->taos->pAppInfo->summary; - (void)atomic_add_fetch_64((int64_t *)&pActivity->numOfInsertsReq, 1); // no need to check return code + (void)atomic_add_fetch_64((int64_t *)&pActivity->numOfInsertsReq, 1); // no need to check return code - (void)launchQueryImpl(info->pRequest, info->pQuery, true, NULL); // no need to check return code + launchQueryImpl(info->pRequest, info->pQuery, true, NULL); // no need to check return code uDebug("SML:0x%" PRIx64 " smlInsertData end, format:%d, code:%d,%s", info->id, info->dataFormat, info->pRequest->code, tstrerror(info->pRequest->code)); @@ -1975,12 +1980,12 @@ static bool getLine(SSmlHandle *info, char *lines[], char **rawLine, char *rawLi if (*rawLine != NULL && (uDebugFlag & DEBUG_DEBUG)) { char *print = taosMemoryCalloc(*len + 1, 1); - if (print != NULL){ + if (print != NULL) { (void)memcpy(print, *tmp, *len); uDebug("SML:0x%" PRIx64 " smlParseLine is raw, numLines:%d, protocol:%d, len:%d, data:%s", info->id, numLines, info->protocol, *len, print); taosMemoryFree(print); - } else{ + } else { uError("SML:0x%" PRIx64 " smlParseLine taosMemoryCalloc failed", info->id); } } else { @@ -2228,7 +2233,7 @@ TAOS_RES *taos_schemaless_insert_inner(TAOS *taos, char *lines[], char *rawLine, uInfo("SML:%" PRIx64 " retry:%d/10,ver is old retry or object is creating code:%d, msg:%s", info->id, cnt, code, tstrerror(code)); code = refreshMeta(request->pTscObj, request); - if (code != 0){ + if (code != 0) { uInfo("SML:%" PRIx64 " refresh meta error code:%d, msg:%s", info->id, code, tstrerror(code)); } smlDestroyInfo(info); @@ -2266,7 +2271,7 @@ end: */ TAOS_RES *taos_schemaless_insert_ttl_with_reqid_tbname_key(TAOS *taos, char *lines[], int numLines, int protocol, - int precision, int32_t ttl, int64_t reqid, char *tbnameKey){ + int precision, int32_t ttl, int64_t reqid, char *tbnameKey) { return taos_schemaless_insert_inner(taos, lines, NULL, NULL, numLines, protocol, precision, ttl, reqid, tbnameKey); } @@ -2306,14 +2311,17 @@ static void getRawLineLen(char *lines, int len, int32_t *totalRows, int protocol } TAOS_RES *taos_schemaless_insert_raw_ttl_with_reqid_tbname_key(TAOS *taos, char *lines, int len, int32_t *totalRows, - int protocol, int precision, int32_t ttl, int64_t reqid, char *tbnameKey){ + int protocol, int precision, int32_t ttl, int64_t reqid, + char *tbnameKey) { getRawLineLen(lines, len, totalRows, protocol); - return taos_schemaless_insert_inner(taos, NULL, lines, lines + len, *totalRows, protocol, precision, ttl, reqid, tbnameKey); + return taos_schemaless_insert_inner(taos, NULL, lines, lines + len, *totalRows, protocol, precision, ttl, reqid, + tbnameKey); } TAOS_RES *taos_schemaless_insert_raw_ttl_with_reqid(TAOS *taos, char *lines, int len, int32_t *totalRows, int protocol, int precision, int32_t ttl, int64_t reqid) { - return taos_schemaless_insert_raw_ttl_with_reqid_tbname_key(taos, lines, len, totalRows, protocol, precision, ttl, reqid, NULL); + return taos_schemaless_insert_raw_ttl_with_reqid_tbname_key(taos, lines, len, totalRows, protocol, precision, ttl, + reqid, NULL); } TAOS_RES *taos_schemaless_insert_raw_with_reqid(TAOS *taos, char *lines, int len, int32_t *totalRows, int protocol, diff --git a/source/client/src/clientStmt.c b/source/client/src/clientStmt.c index ee6e2d71a0..63bc27c624 100644 --- a/source/client/src/clientStmt.c +++ b/source/client/src/clientStmt.c @@ -25,7 +25,7 @@ static FORCE_INLINE int32_t stmtAllocQNodeFromBuf(STableBufInfo* pTblBuf, void** return terrno; } - if(taosArrayPush(pTblBuf->pBufList, &buff) == NULL){ + if (taosArrayPush(pTblBuf->pBufList, &buff) == NULL) { return terrno; } @@ -224,8 +224,8 @@ int32_t stmtUpdateBindInfo(TAOS_STMT* stmt, STableMeta* pTableMeta, void* tags, bool autoCreateTbl) { STscStmt* pStmt = (STscStmt*)stmt; char tbFName[TSDB_TABLE_FNAME_LEN]; - int32_t code = tNameExtractFullName(tbName, tbFName); - if (code != 0){ + int32_t code = tNameExtractFullName(tbName, tbFName); + if (code != 0) { return code; } @@ -772,7 +772,7 @@ void* stmtBindThreadFunc(void* param) { } int ret = stmtAsyncOutput(pStmt, asyncParam); - if (ret != 0){ + if (ret != 0) { qError("stmtAsyncOutput failed, reason:%s", tstrerror(ret)); } } @@ -821,7 +821,7 @@ int32_t stmtInitTableBuf(STableBufInfo* pTblBuf) { return terrno; } - if (taosArrayPush(pTblBuf->pBufList, &buff) == NULL){ + if (taosArrayPush(pTblBuf->pBufList, &buff) == NULL) { return terrno; } @@ -967,7 +967,7 @@ int32_t stmtInitStbInterlaceTableInfo(STscStmt* pStmt) { } int stmtSetDbName(TAOS_STMT* stmt, const char* dbName) { - STscStmt *pStmt = (STscStmt *) stmt; + STscStmt* pStmt = (STscStmt*)stmt; STMT_DLOG("start to set dbName: %s", dbName); @@ -1045,7 +1045,7 @@ int stmtSetTbTags(TAOS_STMT* stmt, TAOS_MULTI_BIND* tags) { STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_SETTAGS)); - SBoundColInfo *tags_info = (SBoundColInfo*)pStmt->bInfo.boundTags; + SBoundColInfo* tags_info = (SBoundColInfo*)pStmt->bInfo.boundTags; if (tags_info->numOfBound <= 0 || tags_info->numOfCols <= 0) { tscWarn("no tags bound in sql, will not bound tags"); return TSDB_CODE_SUCCESS; @@ -1192,7 +1192,7 @@ static FORCE_INLINE int32_t stmtGetTableColsFromCache(STscStmt* pStmt, SArray** return terrno; } - if (taosArrayPush(pStmt->sql.siInfo.pTableCols, &pTblCols) == NULL){ + if (taosArrayPush(pStmt->sql.siInfo.pTableCols, &pTblCols) == NULL) { return terrno; } } @@ -1216,7 +1216,6 @@ int stmtBindBatch(TAOS_STMT* stmt, TAOS_MULTI_BIND* bind, int32_t colIdx) { STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_BIND)); - if (pStmt->bInfo.needParse && pStmt->sql.runTimes && pStmt->sql.type > 0 && STMT_TYPE_MULTI_INSERT != pStmt->sql.type) { pStmt->bInfo.needParse = false; @@ -1256,7 +1255,7 @@ int stmtBindBatch(TAOS_STMT* stmt, TAOS_MULTI_BIND* bind, int32_t colIdx) { if (pStmt->sql.pQuery->haveResultSet) { STMT_ERR_RET(setResSchemaInfo(&pStmt->exec.pRequest->body.resInfo, pStmt->sql.pQuery->pResSchema, - pStmt->sql.pQuery->numOfResCols)); + pStmt->sql.pQuery->numOfResCols)); taosMemoryFreeClear(pStmt->sql.pQuery->pResSchema); setResPrecision(&pStmt->exec.pRequest->body.resInfo, pStmt->sql.pQuery->precision); } @@ -1549,7 +1548,7 @@ int stmtExec(TAOS_STMT* stmt) { STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_EXECUTE)); if (STMT_TYPE_QUERY == pStmt->sql.type) { - (void)launchQueryImpl(pStmt->exec.pRequest, pStmt->sql.pQuery, true, NULL); + launchQueryImpl(pStmt->exec.pRequest, pStmt->sql.pQuery, true, NULL); } else { if (pStmt->sql.stbInterlaceMode) { int64_t startTs = taosGetTimestampUs(); @@ -1571,7 +1570,7 @@ int stmtExec(TAOS_STMT* stmt) { STMT_ERR_RET(qBuildStmtOutput(pStmt->sql.pQuery, pStmt->sql.pVgHash, pStmt->exec.pBlockHash)); } - (void)launchQueryImpl(pStmt->exec.pRequest, pStmt->sql.pQuery, true, NULL); + launchQueryImpl(pStmt->exec.pRequest, pStmt->sql.pQuery, true, NULL); } if (pStmt->exec.pRequest->code && NEED_CLIENT_HANDLE_ERROR(pStmt->exec.pRequest->code)) { diff --git a/source/client/src/clientStmt2.c b/source/client/src/clientStmt2.c index a8949732f3..56337e5469 100644 --- a/source/client/src/clientStmt2.c +++ b/source/client/src/clientStmt2.c @@ -1645,7 +1645,7 @@ int stmtExec2(TAOS_STMT2* stmt, int* affected_rows) { __taos_async_fn_t fp = pStmt->options.asyncExecFn; if (!fp) { - (void)launchQueryImpl(pStmt->exec.pRequest, pStmt->sql.pQuery, true, NULL); + launchQueryImpl(pStmt->exec.pRequest, pStmt->sql.pQuery, true, NULL); if (pStmt->exec.pRequest->code && NEED_CLIENT_HANDLE_ERROR(pStmt->exec.pRequest->code)) { code = refreshMeta(pStmt->exec.pRequest->pTscObj, pStmt->exec.pRequest); diff --git a/source/common/src/cos.c b/source/common/src/cos.c index b5032bbecd..ee4fbb0d82 100644 --- a/source/common/src/cos.c +++ b/source/common/src/cos.c @@ -63,13 +63,10 @@ int32_t s3Begin() { TAOS_RETURN(TSDB_CODE_SUCCESS); } -void s3End() { (void)S3_deinitialize(); } +void s3End() { S3_deinitialize(); } int32_t s3Init() { TAOS_RETURN(TSDB_CODE_SUCCESS); /*s3Begin();*/ } -void s3CleanUp() { /*s3End();*/ -} - static int32_t s3ListBucket(char const *bucketname); static void s3DumpCfgByEp(int8_t epIndex) { @@ -506,7 +503,9 @@ S3Status initial_multipart_callback(const char *upload_id, void *callbackData) { } S3Status MultipartResponseProperiesCallback(const S3ResponseProperties *properties, void *callbackData) { - (void)responsePropertiesCallbackNull(properties, callbackData); + if (S3StatusOK != responsePropertiesCallbackNull(properties, callbackData)) { + uError("%s failed at line %d to process null callback.", __func__, __LINE__); + } MultipartPartData *data = (MultipartPartData *)callbackData; int seq = data->seq; @@ -517,7 +516,9 @@ S3Status MultipartResponseProperiesCallback(const S3ResponseProperties *properti } S3Status MultipartResponseProperiesCallbackWithCp(const S3ResponseProperties *properties, void *callbackData) { - (void)responsePropertiesCallbackNull(properties, callbackData); + if (S3StatusOK != responsePropertiesCallbackNull(properties, callbackData)) { + uError("%s failed at line %d to process null callback.", __func__, __LINE__); + } MultipartPartData *data = (MultipartPartData *)callbackData; int seq = data->seq; @@ -950,7 +951,9 @@ _exit: } if (cp.thefile) { - (void)cos_cp_close(cp.thefile); + if (cos_cp_close(cp.thefile)) { + uError("%s failed at line %d to close cp file.", __func__, lino); + } } if (cp.parts) { taosMemoryFree(cp.parts); @@ -1290,7 +1293,10 @@ int32_t s3DeleteObjects(const char *object_name[], int nobject) { void s3DeleteObjectsByPrefix(const char *prefix) { SArray *objectArray = getListByPrefix(prefix); if (objectArray == NULL) return; - (void)s3DeleteObjects(TARRAY_DATA(objectArray), TARRAY_SIZE(objectArray)); + int32_t code = s3DeleteObjects(TARRAY_DATA(objectArray), TARRAY_SIZE(objectArray)); + if (!code) { + uError("%s failed at line %d since %s.", __func__, __LINE__, tstrerror(code)); + } taosArrayDestroyEx(objectArray, s3FreeObjectKey); } @@ -1537,7 +1543,7 @@ int32_t s3Init() { TAOS_RETURN(TSDB_CODE_SUCCESS); } -void s3CleanUp() { cos_http_io_deinitialize(); } +// void s3CleanUp() { cos_http_io_deinitialize(); } static void log_status(cos_status_t *s) { cos_warn_log("status->code: %d", s->code); @@ -1961,7 +1967,6 @@ long s3Size(const char *object_name) { #else int32_t s3Init() { return 0; } -void s3CleanUp() {} int32_t s3PutObjectFromFile(const char *file, const char *object) { return 0; } int32_t s3PutObjectFromFile2(const char *file, const char *object, int8_t withcp) { return 0; } int32_t s3PutObjectFromFileOffset(const char *file, const char *object_name, int64_t offset, int64_t size) { return 0; } diff --git a/source/common/src/cos_cp.c b/source/common/src/cos_cp.c index 6aa84c0c3c..078b14c9e8 100644 --- a/source/common/src/cos_cp.c +++ b/source/common/src/cos_cp.c @@ -309,7 +309,7 @@ int32_t cos_cp_dump(SCheckpoint* cp) { if (!item) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _exit); } - cJSON_AddItemToArray(ajson, item); + if (!cJSON_AddItemToArray(ajson, item)) goto _exit; if (NULL == cJSON_AddNumberToObject(item, "index", cp->parts[i].index)) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _exit); diff --git a/source/libs/stream/test/checkpointTest.cpp b/source/libs/stream/test/checkpointTest.cpp index 34e80fc08b..c14343c92b 100644 --- a/source/libs/stream/test/checkpointTest.cpp +++ b/source/libs/stream/test/checkpointTest.cpp @@ -43,7 +43,6 @@ // } // strcpy(tsSnodeAddress, "127.0.0.1"); // int ret = RUN_ALL_TESTS(); -// s3CleanUp(); // return ret; // } From aaf44cdf4784b37a2a4d6f9b9dc0e734b8fc098f Mon Sep 17 00:00:00 2001 From: dmchen Date: Wed, 25 Sep 2024 12:04:32 +0000 Subject: [PATCH 48/62] fix/TD-31891-remove-void-sync2-fix-case --- source/libs/sync/src/syncPipeline.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index de83c51211..016ee5cf20 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -1139,10 +1139,15 @@ int32_t syncLogReplProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncApp pMgr->peerStartTime = pMsg->startTime; } + int32_t code = 0; if (pMgr->restored) { - TAOS_CHECK_RETURN(syncLogReplContinue(pMgr, pNode, pMsg)); + if ((code = syncLogReplContinue(pMgr, pNode, pMsg)) != 0) { + sError("vgId:%d, failed to continue sync log repl since %s", pNode->vgId, tstrerror(code)); + } } else { - TAOS_CHECK_RETURN(syncLogReplRecover(pMgr, pNode, pMsg)); + if ((code = syncLogReplRecover(pMgr, pNode, pMsg)) != 0) { + sError("vgId:%d, failed to recover sync log repl since %s", pNode->vgId, tstrerror(code)); + } } (void)taosThreadMutexUnlock(&pBuf->mutex); return 0; @@ -1439,7 +1444,10 @@ int32_t syncLogBufferReset(SSyncLogBuffer* pBuf, SSyncNode* pNode) { if (lastVer != pBuf->matchIndex) return TSDB_CODE_SYN_INTERNAL_ERROR; SyncIndex index = pBuf->endIndex - 1; - TAOS_CHECK_RETURN(syncLogBufferRollback(pBuf, pNode, pBuf->matchIndex + 1)); + int32_t code = 0; + if ((code = syncLogBufferRollback(pBuf, pNode, pBuf->matchIndex + 1)) != 0) { + sError("vgId:%d, failed to rollback sync log buffer since %s", pNode->vgId, tstrerror(code)); + } sInfo("vgId:%d, reset sync log buffer. buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); From 69a5b9e6567b0b4beeef19d3ce8007e9002854ee Mon Sep 17 00:00:00 2001 From: yingzhao Date: Wed, 25 Sep 2024 21:20:39 +0800 Subject: [PATCH 49/62] docs(datain): parser plugin content append in component taosx --- .../zh/14-reference/01-components/04-taosx.md | 91 +++++++++++++++++- .../14-reference/01-components/plugin-01.png | Bin 0 -> 27789 bytes 2 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 docs/zh/14-reference/01-components/plugin-01.png diff --git a/docs/zh/14-reference/01-components/04-taosx.md b/docs/zh/14-reference/01-components/04-taosx.md index e378c18800..86d9cf8ad6 100644 --- a/docs/zh/14-reference/01-components/04-taosx.md +++ b/docs/zh/14-reference/01-components/04-taosx.md @@ -421,7 +421,6 @@ taosX 会将监控指标上报给 taosKeeper,这些监控指标会被 taosKeep | write_raw_fails | 本次运行写入 raw meta 失败的次数 | | success_blocks | 本次写入成功的数据块数 | - ### taosX 其他数据源 任务 这些数据源包括: InfluxDB,OpenTSDB,OPC UA,OPC DA,PI,CSV,MQTT,AVEVA Historian 和 Kafka。 @@ -452,3 +451,93 @@ taosX 会将监控指标上报给 taosKeeper,这些监控指标会被 taosKeep | written_blocks | 本次运行此任务写人成功的 raw block 数 | | failed_blocks | 本次运行此任务写入失败的 raw block 数 | +## taosX 数据解析插件 + +接入 kafka / mqtt 消息时,需要对原始数据进行解析,如果使用 json/regex 等模式解析器无法满足解析需求,同时 UDT 也无法满足性能要求时,可以自定义数据解析插件。 + +### 插件概述 + +taosX Parser 插件是一个要求用 C/Rust 语言开发的 C ABI 兼容动态库,该动态库要实现约定的 API 并编译为在 taosX 所在运行环境中能够正确运行的动态库,然后复制到约定位置由 taosX 在运行时加载,并在处理数据的 Parsing 阶段调用。 + +### 插件部署 + +完成插件开发后,编译环境需要和目标运行环境兼容,将编译好的插件动态库复制到插件目录下,taosX 启动后,系统首次使用插件时初始化加载插件。可以在 explorer 的 kafka 或者 mqtt 数据接入配置页面中,检查是否加载成功。如下图,如果加载成功,则在解析器选择列表中展示出来。 + +![插件示例](./plugin-01.png) + +插件目录在 `taosx.toml` 配置文件中复用 plugins 配置,追加`/parsers`作为插件安装路径,默认值在 UNIX 环境下为 `/usr/local/taos/plugins/parsers`,在 Windows 下为 `C:\TDengine\plugins\parsers`。 + +### 插件 api 说明 + +#### 1. 获取插件名称 + +获取插件名,用于前端显示。 + +**函数签名**:const char* parser_name() + +**返回值**:字符串。 + +#### 2. 获取插件版本 + +插件版本,方便问题定位。 + +**函数签名**:const char* parser_version() + +**返回值**:字符串。 + +#### 3. 配置解析器 + +将一个字符串参数解析为一个配置对象,仅插件内部使用。 + +**函数签名**:parser_resp_t parser_new(char* ctx, uint32_t len); + +char* ctx: 用户自定义配置字符串。 + +uint32_t len: 该字符串的二进制长度(不含 `\0`)。 + +**返回值**: + +``` c +struct parser_resp_t { + int e; // 0 if success. + void* p; // Success if contains. +} +``` + +当创建对象失败时,e 不为 0。 + +当创建成功时,e = 0,p 为解析器对象。 + +#### 4. 解析数据 + +**函数签名**: + +对输入 payload 进行解析,返回结果为 JSON 格式 [u8] 。返回的 JSON 将使用默认的 JSON 解析器进行完全解码(展开根数组和所有的对象)。 + +``` c +const char* parser_mutate( + void* parser, + const uint8_t* in_ptr, uint32_t in_len, + const void* uint8_t* out_ptr, uint32_t* out_len +); +``` + +`void* parser`: parser_new 生成的对象指针; + +`const uint8_t* in_ptr`:输入 Payload 的指针; + +`uint32_t in_len`: 输入 Payload 的 bytes 长度(不含 `\0`); + +`const void* uint8_t* out_ptr`:输出 JSON 字符串的指针(不含 \0)。当 out_ptr 指向为空时,表示输出为空。 + +`uint32_t * out_len`:输出 JSON 字符串长度。 + +**返回值**: 当调用成功时,返回值为 NULL。 + +#### 5. 释放解析器 + +释放解析器对象内存。 + +**函数签名**: void parser_free(void* parser); + +void* parser: parser_new 生成的对象指针。 diff --git a/docs/zh/14-reference/01-components/plugin-01.png b/docs/zh/14-reference/01-components/plugin-01.png new file mode 100644 index 0000000000000000000000000000000000000000..18bc2ca242e9a3d3b0a67e196994a8e2d3c56d5e GIT binary patch literal 27789 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
;P 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�g5+@AHo1r69k~Vz;?gLx7 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 UeEexAs49T6ygIyC*8I)?06?E9b^rhX literal 0 HcmV?d00001 From 49cb23b05f011bdfba22e1de4665fab20b06d6c6 Mon Sep 17 00:00:00 2001 From: yingzhao Date: Wed, 25 Sep 2024 21:39:08 +0800 Subject: [PATCH 50/62] docs(datain): remove 99-parser-plugin, append the content to compoment taosx --- .../05-data-in/99-parser-plugin.md | 30 ------------------ docs/zh/06-advanced/05-data-in/plugin-01.png | Bin 27789 -> 0 bytes .../zh/14-reference/01-components/04-taosx.md | 2 +- 3 files changed, 1 insertion(+), 31 deletions(-) delete mode 100644 docs/zh/06-advanced/05-data-in/99-parser-plugin.md delete mode 100644 docs/zh/06-advanced/05-data-in/plugin-01.png diff --git a/docs/zh/06-advanced/05-data-in/99-parser-plugin.md b/docs/zh/06-advanced/05-data-in/99-parser-plugin.md deleted file mode 100644 index 976a5e2c04..0000000000 --- a/docs/zh/06-advanced/05-data-in/99-parser-plugin.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: "数据解析插件" -sidebar_label: "数据解析插件" ---- - -接入消息中间件时,如果使用 json/regex 等模式解析器无法满足解析需求,同时使用 UDT(自定义解析器) 也无法满足性能需求的情况,可以自定义数据解析插件。 - -## 插件概述 - -taosX Parser 插件是一个要求用 C/Rust 语言开发的 C ABI 兼容动态库,该动态库要实现约定的 API 并编译为在 taosX 所在运行环境中能够正确运行的动态库,然后复制到约定位置由 taosX 在运行时加载,并在处理数据的 Parsing 阶段调用。 - -## 插件部署 - -编译插件,需要在和目标环境兼容的环境中编译。 - -编译好插件后可将插件的动态库复制到插件目录下,taosX 启动时后,系统首次使用插件时初始化加载插件。可以在 explorer 的 kafka 或者 mqtt 数据接入配置页面中,检查是否加载成功。如下图,如果加载成功,则在解析器选择列表中展示出来。 - -插件目录在 `taosx.toml` 配置文件中复用 plugins 配置,追加`/parsers`作为插件安装路径,默认值在 UNIX 环境下为 `/usr/local/taos/plugins/parsers`,在 Windows 下为 `C:\TDengine\plugins\parsers`。 - -![](./plugin-01.png) - -## 插件接口规范 - -| 函数签名 | 描述 | 参数说明 | 返回值 | -| -------- | -------- | -------- | ----------- | -| const char* parser_name() | 插件名,用于前端显示。 | 无 | 字符串 | -| const char* parser_version() | 版本,方便定位问题。 | 无 | 字符串 | -| struct parser_resp_t {
char* e; // Error if null.
void* p; // Success if contains.
}
parser_resp_t parser_new(char* ctx, uint32_t len); | 使用用户自定义配置生成解析器对象或返回错误信息。| char* ctx: 用户自定义配置字符串。
uint32_t len: 该字符串的二进制长度(不含 `\0`)。 | 返回值为结构体。
struct parser_resp_t {
char* e; // Error if null.
void* p; // Success if contains.
}
当创建对象失败时,第一个指针 e 不为 NULL。
当创建成功时,e 为 NULL,p 为解析器对象。 | -| const char* parser_mutate(
void* parser,
const uint8_t* in_ptr, uint32_t in_len,
const void* uint8_t* out_ptr, uint32_t* out_len
) | 使用解析器对象对输入 payload 进行解析,返回结果为 JSON 格式 [u8] 。
返回的 JSON 将使用默认的 JSON 解析器进行完全解码(展开根数组和所有的对象)。 | void* parser: parser_new 生成的对象指针。
const uint8_t* in_ptr, uint32_t in_len:输入 Payload 的指针和 bytes 长度(不含 `\0`)。
const void* uint8_t* out_ptr, uint32_t * out_len:输出 JSON 字符串的指针和长度(不含 `\0`)。当 out_ptr 指向为空时,表示输出为空。当 out_ptr 不为空时,应用(taosx)在使用完毕后应当释放该内存空间。| 字符串指针。
当调用成功时,返回值为 NULL。
当调用失败时,返回错误信息字符串。 | -| void parser_free(void* parser); | 释放解析器对象内存。 | void* parser: parser_new 生成的对象指针。 | 无。 | diff --git a/docs/zh/06-advanced/05-data-in/plugin-01.png b/docs/zh/06-advanced/05-data-in/plugin-01.png deleted file mode 100644 index 18bc2ca242e9a3d3b0a67e196994a8e2d3c56d5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27789 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
;P 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�g5+@AHo1r69k~Vz;?gLx7 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 UeEexAs49T6ygIyC*8I)?06?E9b^rhX diff --git a/docs/zh/14-reference/01-components/04-taosx.md b/docs/zh/14-reference/01-components/04-taosx.md index 86d9cf8ad6..ce372a8007 100644 --- a/docs/zh/14-reference/01-components/04-taosx.md +++ b/docs/zh/14-reference/01-components/04-taosx.md @@ -453,7 +453,7 @@ taosX 会将监控指标上报给 taosKeeper,这些监控指标会被 taosKeep ## taosX 数据解析插件 -接入 kafka / mqtt 消息时,需要对原始数据进行解析,如果使用 json/regex 等模式解析器无法满足解析需求,同时 UDT 也无法满足性能要求时,可以自定义数据解析插件。 +接入 kafka / mqtt 消息中间件时,需要对原始数据进行解析,如果使用 json/regex 等模式解析器无法满足解析需求,同时 UDT(自定义解析脚本) 也无法满足性能要求时,可以自定义数据解析插件。 ### 插件概述 From cb218d674a62d41ba12b9a1493dfb1ea63d1b497 Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 26 Sep 2024 01:13:01 +0000 Subject: [PATCH 51/62] fix/TD-32321-add-log --- source/libs/qworker/src/qworker.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/libs/qworker/src/qworker.c b/source/libs/qworker/src/qworker.c index e08868d7c1..ee7c51560b 100644 --- a/source/libs/qworker/src/qworker.c +++ b/source/libs/qworker/src/qworker.c @@ -1428,6 +1428,7 @@ void qWorkerDestroy(void **qWorkerMgmt) { return; } + qInfo("wait for destroyed, refId:%" PRIx64, mgmt->refId); while (0 == destroyed) { taosMsleep(2); } From 53caf9f018b9f99df91cf94811a63a81b6b490b3 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 26 Sep 2024 10:43:16 +0800 Subject: [PATCH 52/62] ehn: remove void --- source/client/src/clientMain.c | 10 ++++---- source/client/src/clientStmt2.c | 22 ++++++++++++++---- source/dnode/mgmt/mgmt_vnode/src/vmInt.c | 8 +++---- source/dnode/mnode/impl/src/mndVgroup.c | 6 +++-- source/dnode/snode/src/snode.c | 12 +++++++--- source/dnode/vnode/src/sma/smaEnv.c | 16 +++++++++---- source/dnode/vnode/src/sma/smaRollup.c | 4 +++- source/dnode/vnode/src/tsdb/tsdbCache.c | 3 +++ source/dnode/vnode/src/tsdb/tsdbCommit2.c | 4 +++- source/dnode/vnode/src/tsdb/tsdbDataFileRW.c | 4 ++-- source/dnode/vnode/src/tsdb/tsdbIter.c | 2 +- source/dnode/vnode/src/tsdb/tsdbMemTable.c | 11 +++++++-- source/dnode/vnode/src/tsdb/tsdbMergeTree.c | 3 ++- source/dnode/vnode/src/tsdb/tsdbRetention.c | 2 +- source/dnode/vnode/src/tsdb/tsdbSnapshot.c | 4 +++- source/dnode/vnode/src/tsdb/tsdbUtil.c | 2 +- source/dnode/vnode/src/vnd/vnodeOpen.c | 4 +++- source/dnode/vnode/src/vnd/vnodeSvr.c | 24 +++++++++++++++----- source/libs/nodes/src/nodesTraverseFuncs.c | 14 ++++++++---- source/util/src/tarray.c | 2 +- source/util/src/tconfig.c | 19 ++++++++++++---- source/util/src/tdigest.c | 4 +++- source/util/src/thash.c | 4 ++-- source/util/src/tsched.c | 16 +++++++++---- source/util/src/ttimer.c | 8 +++++-- 25 files changed, 148 insertions(+), 60 deletions(-) diff --git a/source/client/src/clientMain.c b/source/client/src/clientMain.c index 6957874642..1b5f95ce16 100644 --- a/source/client/src/clientMain.c +++ b/source/client/src/clientMain.c @@ -1316,9 +1316,9 @@ void doAsyncQuery(SRequestObj *pRequest, bool updateMetaForce) { tscDebug("0x%" PRIx64 " client retry to handle the error, code:%d - %s, tryCount:%d,QID:0x%" PRIx64, pRequest->self, code, tstrerror(code), pRequest->retry, pRequest->requestId); code = refreshMeta(pRequest->pTscObj, pRequest); - if (code != 0){ - tscWarn("0x%" PRIx64 " refresh meta failed, code:%d - %s,QID:0x%" PRIx64, pRequest->self, code, - tstrerror(code), pRequest->requestId); + if (code != 0) { + tscWarn("0x%" PRIx64 " refresh meta failed, code:%d - %s,QID:0x%" PRIx64, pRequest->self, code, tstrerror(code), + pRequest->requestId); } pRequest->prevCode = code; doAsyncQuery(pRequest, true); @@ -1985,7 +1985,9 @@ int taos_stmt2_bind_param(TAOS_STMT2 *stmt, TAOS_STMT2_BINDV *bindv, int32_t col STscStmt2 *pStmt = (STscStmt2 *)stmt; if (pStmt->options.asyncExecFn && !pStmt->semWaited) { - (void)tsem_wait(&pStmt->asyncQuerySem); + if (tsem_wait(&pStmt->asyncQuerySem) != 0) { + tscError("wait async query sem failed"); + } pStmt->semWaited = true; } diff --git a/source/client/src/clientStmt2.c b/source/client/src/clientStmt2.c index 56337e5469..85d633f674 100644 --- a/source/client/src/clientStmt2.c +++ b/source/client/src/clientStmt2.c @@ -698,7 +698,9 @@ static void* stmtBindThreadFunc(void* param) { continue; } - (void)stmtAsyncOutput(pStmt, asyncParam); + if (stmtAsyncOutput(pStmt, asyncParam) != 0) { + qError("stmt async output failed"); + } } qInfo("stmt bind thread stopped"); @@ -822,7 +824,11 @@ TAOS_STMT2* stmtInit2(STscObj* taos, TAOS_STMT2_OPTION* pOptions) { pStmt->sql.siInfo.tableColsReady = true; if (pStmt->options.asyncExecFn) { - (void)tsem_init(&pStmt->asyncQuerySem, 0, 1); + if (tsem_init(&pStmt->asyncQuerySem, 0, 1) != 0) { + terrno = TAOS_SYSTEM_ERROR(errno); + (void)stmtClose(pStmt); + return NULL; + } } pStmt->semWaited = false; @@ -1603,7 +1609,9 @@ static void asyncQueryCb(void* userdata, TAOS_RES* res, int code) { (void)stmtCleanExecInfo(pStmt, (code ? false : true), false); ++pStmt->sql.runTimes; - (void)tsem_post(&pStmt->asyncQuerySem); + if (tsem_post(&pStmt->asyncQuerySem) != 0) { + tscError("failed to post asyncQuerySem"); + } } int stmtExec2(TAOS_STMT2* stmt, int* affected_rows) { @@ -1710,7 +1718,9 @@ int stmtClose2(TAOS_STMT2* stmt) { } if (pStmt->options.asyncExecFn && !pStmt->semWaited) { - (void)tsem_wait(&pStmt->asyncQuerySem); + if (tsem_wait(&pStmt->asyncQuerySem) != 0) { + tscError("failed to wait asyncQuerySem"); + } } STMT_DLOG("stmt %p closed, stbInterlaceMode: %d, statInfo: ctgGetTbMetaNum=>%" PRId64 ", getCacheTbInfo=>%" PRId64 @@ -1727,7 +1737,9 @@ int stmtClose2(TAOS_STMT2* stmt) { STMT_ERR_RET(stmtCleanSQLInfo(pStmt)); if (pStmt->options.asyncExecFn) { - (void)tsem_destroy(&pStmt->asyncQuerySem); + if (tsem_destroy(&pStmt->asyncQuerySem) != 0) { + tscError("failed to destroy asyncQuerySem"); + } } taosMemoryFree(stmt); diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmInt.c b/source/dnode/mgmt/mgmt_vnode/src/vmInt.c index bb73f43ebb..b5aff49232 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmInt.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmInt.c @@ -24,7 +24,7 @@ int32_t vmGetPrimaryDisk(SVnodeMgmt *pMgmt, int32_t vgId) { SVnodeObj *pVnode = NULL; (void)taosThreadRwlockRdlock(&pMgmt->lock); - (void)taosHashGetDup(pMgmt->hash, &vgId, sizeof(int32_t), (void *)&pVnode); + int32_t r = taosHashGetDup(pMgmt->hash, &vgId, sizeof(int32_t), (void *)&pVnode); if (pVnode != NULL) { diskId = pVnode->diskPrimary; } @@ -97,7 +97,7 @@ SVnodeObj *vmAcquireVnodeImpl(SVnodeMgmt *pMgmt, int32_t vgId, bool strict) { SVnodeObj *pVnode = NULL; (void)taosThreadRwlockRdlock(&pMgmt->lock); - (void)taosHashGetDup(pMgmt->hash, &vgId, sizeof(int32_t), (void *)&pVnode); + int32_t r = taosHashGetDup(pMgmt->hash, &vgId, sizeof(int32_t), (void *)&pVnode); if (pVnode == NULL || strict && (pVnode->dropped || pVnode->failed)) { terrno = TSDB_CODE_VND_INVALID_VGROUP_ID; pVnode = NULL; @@ -165,7 +165,7 @@ int32_t vmOpenVnode(SVnodeMgmt *pMgmt, SWrapperCfg *pCfg, SVnode *pImpl) { (void)taosThreadRwlockWrlock(&pMgmt->lock); SVnodeObj *pOld = NULL; - (void)taosHashGetDup(pMgmt->hash, &pVnode->vgId, sizeof(int32_t), (void *)&pOld); + int32_t r = taosHashGetDup(pMgmt->hash, &pVnode->vgId, sizeof(int32_t), (void *)&pOld); if (pOld) { vmFreeVnodeObj(&pOld); } @@ -184,7 +184,7 @@ void vmCloseVnode(SVnodeMgmt *pMgmt, SVnodeObj *pVnode, bool commitAndRemoveWal) } (void)taosThreadRwlockWrlock(&pMgmt->lock); - (void)taosHashRemove(pMgmt->hash, &pVnode->vgId, sizeof(int32_t)); + int32_t r = taosHashRemove(pMgmt->hash, &pVnode->vgId, sizeof(int32_t)); (void)taosThreadRwlockUnlock(&pMgmt->lock); vmReleaseVnode(pMgmt, pVnode); diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c index 2fe1ef4cfb..5a79ac6bc8 100644 --- a/source/dnode/mnode/impl/src/mndVgroup.c +++ b/source/dnode/mnode/impl/src/mndVgroup.c @@ -14,6 +14,7 @@ */ #define _DEFAULT_SOURCE +#include "mndVgroup.h" #include "audit.h" #include "mndArbGroup.h" #include "mndDb.h" @@ -26,7 +27,6 @@ #include "mndTopic.h" #include "mndTrans.h" #include "mndUser.h" -#include "mndVgroup.h" #include "tmisce.h" #define VGROUP_VER_NUMBER 1 @@ -1670,7 +1670,9 @@ int32_t mndAddNewVgPrepareAction(SMnode *pMnode, STrans *pTrans, SVgObj *pVg) { } TAOS_CHECK_GOTO(mndTransAppendPrepareLog(pTrans, pRaw), NULL, _err); - (void)sdbSetRawStatus(pRaw, SDB_STATUS_CREATING); + if (sdbSetRawStatus(pRaw, SDB_STATUS_CREATING) != 0) { + mError("vgId:%d, failed to set raw status at line:%d", pVg->vgId, __LINE__); + } if (code != 0) { mError("vgId:%d, failed to set raw status since %s at line:%d", pVg->vgId, tstrerror(code), __LINE__); TAOS_RETURN(code); diff --git a/source/dnode/snode/src/snode.c b/source/dnode/snode/src/snode.c index 7fc079677b..0a5c89a257 100644 --- a/source/dnode/snode/src/snode.c +++ b/source/dnode/snode/src/snode.c @@ -38,7 +38,9 @@ int32_t sndBuildStreamTask(SSnode *pSnode, SStreamTask *pTask, int64_t nextProce streamTaskOpenAllUpstreamInput(pTask); streamTaskResetUpstreamStageInfo(pTask); - (void)streamSetupScheduleTrigger(pTask); + if (streamSetupScheduleTrigger(pTask) != 0) { + sndError("failed to setup schedule trigger for task:%s", pTask->id.idStr); + } SCheckpointInfo *pChkInfo = &pTask->chkInfo; tqSetRestoreVersionInfo(pTask); @@ -93,14 +95,18 @@ FAIL: } int32_t sndInit(SSnode *pSnode) { - (void)streamTaskSchedTask(&pSnode->msgCb, pSnode->pMeta->vgId, 0, 0, STREAM_EXEC_T_START_ALL_TASKS); + if (streamTaskSchedTask(&pSnode->msgCb, pSnode->pMeta->vgId, 0, 0, STREAM_EXEC_T_START_ALL_TASKS) != 0) { + sndError("failed to start all tasks"); + } return 0; } void sndClose(SSnode *pSnode) { stopRsync(); streamMetaNotifyClose(pSnode->pMeta); - (void)streamMetaCommit(pSnode->pMeta); + if (streamMetaCommit(pSnode->pMeta) != 0) { + sndError("failed to commit stream meta"); + } streamMetaClose(pSnode->pMeta); taosMemoryFree(pSnode); } diff --git a/source/dnode/vnode/src/sma/smaEnv.c b/source/dnode/vnode/src/sma/smaEnv.c index efa248755b..45912b5ae1 100644 --- a/source/dnode/vnode/src/sma/smaEnv.c +++ b/source/dnode/vnode/src/sma/smaEnv.c @@ -211,7 +211,10 @@ static int32_t tdInitSmaStat(SSmaStat **pSmaStat, int8_t smaType, const SSma *pS SRSmaStat *pRSmaStat = (SRSmaStat *)(*pSmaStat); pRSmaStat->pSma = (SSma *)pSma; atomic_store_8(RSMA_TRIGGER_STAT(pRSmaStat), TASK_TRIGGER_STAT_INIT); - (void)tsem_init(&pRSmaStat->notEmpty, 0, 0); + if (tsem_init(&pRSmaStat->notEmpty, 0, 0) != 0) { + code = terrno; + TAOS_CHECK_GOTO(code, &lino, _exit); + } if (!(pRSmaStat->blocks = taosArrayInit(1, sizeof(SSDataBlock)))) { code = terrno; TAOS_CHECK_GOTO(code, &lino, _exit); @@ -295,7 +298,10 @@ static void tdDestroyRSmaStat(void *pRSmaStat) { taosHashCleanup(RSMA_INFO_HASH(pStat)); // step 5: free pStat - (void)tsem_destroy(&(pStat->notEmpty)); + if (tsem_destroy(&(pStat->notEmpty)) != 0) { + smaError("vgId:%d, failed to destroy notEmpty semaphore for rsma stat:%p since %s", SMA_VID(pSma), pRSmaStat, + tstrerror(terrno)); + } taosArrayDestroy(pStat->blocks); taosMemoryFreeClear(pStat); } @@ -399,7 +405,7 @@ int32_t tdCheckAndInitSmaEnv(SSma *pSma, int8_t smaType) { void *tdRSmaExecutorFunc(void *param) { setThreadName("vnode-rsma"); - if(tdRSmaProcessExecImpl((SSma *)param, RSMA_EXEC_OVERFLOW) < 0){ + if (tdRSmaProcessExecImpl((SSma *)param, RSMA_EXEC_OVERFLOW) < 0) { smaError("vgId:%d, failed to process rsma exec", SMA_VID((SSma *)param)); } return NULL; @@ -444,7 +450,9 @@ static int32_t tdRsmaStopExecutor(const SSma *pSma) { pthread = (TdThread *)&pStat->data; for (int32_t i = 0; i < tsNumOfVnodeRsmaThreads; ++i) { - (void)tsem_post(&(pRSmaStat->notEmpty)); + if (tsem_post(&(pRSmaStat->notEmpty)) != 0) { + smaError("vgId:%d, failed to post notEmpty semaphore for rsma since %s", SMA_VID(pSma), tstrerror(terrno)); + } } for (int32_t i = 0; i < tsNumOfVnodeRsmaThreads; ++i) { diff --git a/source/dnode/vnode/src/sma/smaRollup.c b/source/dnode/vnode/src/sma/smaRollup.c index ee8ee962e9..4fdf299e50 100644 --- a/source/dnode/vnode/src/sma/smaRollup.c +++ b/source/dnode/vnode/src/sma/smaRollup.c @@ -1707,7 +1707,9 @@ int32_t tdRSmaProcessExecImpl(SSma *pSma, ERsmaExecType type) { break; } - (void)tsem_wait(&pRSmaStat->notEmpty); + if (tsem_wait(&pRSmaStat->notEmpty) != 0) { + smaError("vgId:%d, failed to wait for not empty since %s", TD_VID(pVnode), tstrerror(terrno)); + } if ((pEnv->flag & SMA_ENV_FLG_CLOSE) && (atomic_load_64(&pRSmaStat->nBufItems) <= 0)) { smaDebug("vgId:%d, exec task end, flag:%" PRIi8 ", nBufItems:%" PRIi64, SMA_VID(pSma), pEnv->flag, diff --git a/source/dnode/vnode/src/tsdb/tsdbCache.c b/source/dnode/vnode/src/tsdb/tsdbCache.c index 6da705423a..e3382cde32 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCache.c +++ b/source/dnode/vnode/src/tsdb/tsdbCache.c @@ -1474,6 +1474,9 @@ int32_t tsdbCacheColFormatUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, SBlo TAOS_CHECK_RETURN(metaGetTbTSchemaEx(pTsdb->pVnode->pMeta, suid, uid, sver, &pTSchema)); ctxArray = taosArrayInit(pBlockData->nColData, sizeof(SLastUpdateCtx)); + if (ctxArray == NULL) { + TAOS_CHECK_GOTO(terrno, &lino, _exit); + } // 1. prepare last STsdbRowKey tsdbRowKey = {0}; diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit2.c b/source/dnode/vnode/src/tsdb/tsdbCommit2.c index 57f6aa3592..95c5daf842 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit2.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit2.c @@ -331,7 +331,9 @@ static int32_t tsdbCommitFileSetBegin(SCommitter2 *committer) { TAOS_CHECK_GOTO(tfsAllocDisk(committer->tsdb->pVnode->pTfs, committer->ctx->expLevel, &committer->ctx->did), &lino, _exit); - TAOS_UNUSED(tfsMkdirRecurAt(committer->tsdb->pVnode->pTfs, committer->tsdb->path, committer->ctx->did)); + if (tfsMkdirRecurAt(committer->tsdb->pVnode->pTfs, committer->tsdb->path, committer->ctx->did) != 0) { + tsdbError("vgId:%d failed to create directory %s", TD_VID(committer->tsdb->pVnode), committer->tsdb->path); + } committer->ctx->tbid->suid = 0; committer->ctx->tbid->uid = 0; diff --git a/source/dnode/vnode/src/tsdb/tsdbDataFileRW.c b/source/dnode/vnode/src/tsdb/tsdbDataFileRW.c index 5a2f9628fb..720ba68414 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDataFileRW.c +++ b/source/dnode/vnode/src/tsdb/tsdbDataFileRW.c @@ -1362,7 +1362,7 @@ int32_t tsdbFileWriteTombBlock(STsdbFD *fd, STombBlock *tombBlock, int8_t cmprAl }; for (int i = 0; i < TOMB_BLOCK_SIZE(tombBlock); i++) { STombRecord record; - TAOS_UNUSED(tTombBlockGet(tombBlock, i, &record)); + TAOS_CHECK_RETURN(tTombBlockGet(tombBlock, i, &record)); if (i == 0) { tombBlk.minTbid.suid = record.suid; @@ -1519,7 +1519,7 @@ static int32_t tsdbDataFileDoWriteTombRecord(SDataFileWriter *writer, const STom while (writer->ctx->hasOldTomb) { for (; writer->ctx->tombBlockIdx < TOMB_BLOCK_SIZE(writer->ctx->tombBlock); writer->ctx->tombBlockIdx++) { STombRecord record1[1]; - TAOS_UNUSED(tTombBlockGet(writer->ctx->tombBlock, writer->ctx->tombBlockIdx, record1)); + TAOS_CHECK_GOTO(tTombBlockGet(writer->ctx->tombBlock, writer->ctx->tombBlockIdx, record1), &lino, _exit); int32_t c = tTombRecordCompare(record, record1); if (c < 0) { diff --git a/source/dnode/vnode/src/tsdb/tsdbIter.c b/source/dnode/vnode/src/tsdb/tsdbIter.c index 4c5a803f22..3ed3f72333 100644 --- a/source/dnode/vnode/src/tsdb/tsdbIter.c +++ b/source/dnode/vnode/src/tsdb/tsdbIter.c @@ -225,7 +225,7 @@ static int32_t tsdbMemTableIterNext(STsdbIter *iter, const TABLEID *tbid) { iter->row->row = row[0]; - TAOS_UNUSED(tsdbTbDataIterNext(iter->memtData->tbIter)); + bool r = tsdbTbDataIterNext(iter->memtData->tbIter); goto _exit; } diff --git a/source/dnode/vnode/src/tsdb/tsdbMemTable.c b/source/dnode/vnode/src/tsdb/tsdbMemTable.c index 8b4cdf9367..eb22335311 100644 --- a/source/dnode/vnode/src/tsdb/tsdbMemTable.c +++ b/source/dnode/vnode/src/tsdb/tsdbMemTable.c @@ -193,7 +193,11 @@ int32_t tsdbDeleteTableData(STsdb *pTsdb, int64_t version, tb_uid_t suid, tb_uid pMemTable->minVer = TMIN(pMemTable->minVer, version); pMemTable->maxVer = TMAX(pMemTable->maxVer, version); - TAOS_UNUSED(tsdbCacheDel(pTsdb, suid, uid, sKey, eKey)); + if (tsdbCacheDel(pTsdb, suid, uid, sKey, eKey) != 0) { + tsdbError("vgId:%d, failed to delete cache data from table suid:%" PRId64 " uid:%" PRId64 " skey:%" PRId64 + " eKey:%" PRId64 " at version %" PRId64, + TD_VID(pTsdb->pVnode), suid, uid, sKey, eKey, version); + } tsdbTrace("vgId:%d, delete data from table suid:%" PRId64 " uid:%" PRId64 " skey:%" PRId64 " eKey:%" PRId64 " at version %" PRId64, @@ -652,7 +656,10 @@ static int32_t tsdbInsertColDataToTable(SMemTable *pMemTable, STbData *pTbData, } if (!TSDB_CACHE_NO(pMemTable->pTsdb->pVnode->config)) { - TAOS_UNUSED(tsdbCacheColFormatUpdate(pMemTable->pTsdb, pTbData->suid, pTbData->uid, pBlockData)); + if (tsdbCacheColFormatUpdate(pMemTable->pTsdb, pTbData->suid, pTbData->uid, pBlockData) != 0) { + tsdbError("vgId:%d, failed to update cache data from table suid:%" PRId64 " uid:%" PRId64 " at version %" PRId64, + TD_VID(pMemTable->pTsdb->pVnode), pTbData->suid, pTbData->uid, version); + } } // SMemTable diff --git a/source/dnode/vnode/src/tsdb/tsdbMergeTree.c b/source/dnode/vnode/src/tsdb/tsdbMergeTree.c index 85ed223c6c..3e4208fc54 100644 --- a/source/dnode/vnode/src/tsdb/tsdbMergeTree.c +++ b/source/dnode/vnode/src/tsdb/tsdbMergeTree.c @@ -403,7 +403,8 @@ static int32_t loadSttStatisticsBlockData(SSttFileReader *pSttFileReader, SSttBl pBlockLoadInfo->cost.loadStatisBlocks += num; STbStatisBlock block; - TAOS_UNUSED(tStatisBlockInit(&block)); + code = tStatisBlockInit(&block); + QUERY_CHECK_CODE(code, lino, _end); int64_t st = taosGetTimestampUs(); diff --git a/source/dnode/vnode/src/tsdb/tsdbRetention.c b/source/dnode/vnode/src/tsdb/tsdbRetention.c index af42a0e592..cbe2ab4b8e 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRetention.c +++ b/source/dnode/vnode/src/tsdb/tsdbRetention.c @@ -691,7 +691,7 @@ static int32_t tsdbDoS3Migrate(SRTNer *rtner) { if (/*lcn < 1 && */ taosCheckExistFile(fobj->fname)) { int32_t mtime = 0; int64_t size = 0; - (void)taosStatFile(fobj->fname, &size, &mtime, NULL); + int32_t r = taosStatFile(fobj->fname, &size, &mtime, NULL); if (size > chunksize && mtime < rtner->now - tsS3UploadDelaySec) { if (pCfg->s3Compact && lcn < 0) { extern int32_t tsdbAsyncCompact(STsdb * tsdb, const STimeWindow *tw, bool sync); diff --git a/source/dnode/vnode/src/tsdb/tsdbSnapshot.c b/source/dnode/vnode/src/tsdb/tsdbSnapshot.c index 94ca8d96a1..d0ea58c28a 100644 --- a/source/dnode/vnode/src/tsdb/tsdbSnapshot.c +++ b/source/dnode/vnode/src/tsdb/tsdbSnapshot.c @@ -821,7 +821,9 @@ static int32_t tsdbSnapWriteFileSetBegin(STsdbSnapWriter* writer, int32_t fid) { code = TSDB_CODE_NO_AVAIL_DISK; TSDB_CHECK_CODE(code, lino, _exit); } - TAOS_UNUSED(tfsMkdirRecurAt(writer->tsdb->pVnode->pTfs, writer->tsdb->path, writer->ctx->did)); + if (tfsMkdirRecurAt(writer->tsdb->pVnode->pTfs, writer->tsdb->path, writer->ctx->did) != 0) { + tsdbError("vgId:%d failed to create directory %s", TD_VID(writer->tsdb->pVnode), writer->tsdb->path); + } writer->ctx->hasData = true; writer->ctx->hasTomb = true; diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil.c b/source/dnode/vnode/src/tsdb/tsdbUtil.c index 5b8a062361..00806885ef 100644 --- a/source/dnode/vnode/src/tsdb/tsdbUtil.c +++ b/source/dnode/vnode/src/tsdb/tsdbUtil.c @@ -106,7 +106,7 @@ _exit: #endif void tMapDataGetItemByIdx(SMapData *pMapData, int32_t idx, void *pItem, int32_t (*tGetItemFn)(uint8_t *, void *)) { - TAOS_UNUSED(tGetItemFn(pMapData->pData + pMapData->aOffset[idx], pItem)); + int32_t r = tGetItemFn(pMapData->pData + pMapData->aOffset[idx], pItem); } #ifdef BUILD_NO_CALL diff --git a/source/dnode/vnode/src/vnd/vnodeOpen.c b/source/dnode/vnode/src/vnd/vnodeOpen.c index b857cdeb42..027477d10b 100644 --- a/source/dnode/vnode/src/vnd/vnodeOpen.c +++ b/source/dnode/vnode/src/vnd/vnodeOpen.c @@ -544,7 +544,9 @@ void vnodeClose(SVnode *pVnode) { vnodeCloseBufPool(pVnode); // destroy handle - (void)tsem_destroy(&pVnode->syncSem); + if (tsem_destroy(&pVnode->syncSem) != 0) { + vError("vgId:%d, failed to destroy semaphore", TD_VID(pVnode)); + } (void)taosThreadCondDestroy(&pVnode->poolNotEmpty); (void)taosThreadMutexDestroy(&pVnode->mutex); (void)taosThreadMutexDestroy(&pVnode->lock); diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index 9dbf16cb48..270cc7548b 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -210,7 +210,9 @@ static int32_t vnodePreProcessDropTtlMsg(SVnode *pVnode, SRpcMsg *pMsg) { TSDB_CHECK_CODE(code, lino, _exit); } - (void)tSerializeSVDropTtlTableReq((char *)pContNew + sizeof(SMsgHead), reqLenNew, &ttlReq); + if (tSerializeSVDropTtlTableReq((char *)pContNew + sizeof(SMsgHead), reqLenNew, &ttlReq) != 0) { + vError("vgId:%d %s:%d failed to serialize drop ttl request", TD_VID(pVnode), __func__, lino); + } pContNew->contLen = htonl(reqLenNew); pContNew->vgId = pContOld->vgId; @@ -420,7 +422,9 @@ static int32_t vnodePreProcessDeleteMsg(SVnode *pVnode, SRpcMsg *pMsg) { ((SMsgHead *)pCont)->vgId = TD_VID(pVnode); tEncoderInit(pCoder, pCont + sizeof(SMsgHead), size); - (void)tEncodeDeleteRes(pCoder, &res); + if (tEncodeDeleteRes(pCoder, &res) != 0) { + vError("vgId:%d %s failed to encode delete response", TD_VID(pVnode), __func__); + } tEncoderClear(pCoder); rpcFreeCont(pMsg->pCont); @@ -647,7 +651,9 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t ver, SRpcMsg } break; case TDMT_STREAM_CONSEN_CHKPT: { if (pVnode->restored) { - (void)tqProcessTaskConsenChkptIdReq(pVnode->pTq, pMsg); + if (tqProcessTaskConsenChkptIdReq(pVnode->pTq, pMsg) < 0) { + goto _err; + } } } break; case TDMT_STREAM_TASK_PAUSE: { @@ -664,7 +670,9 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t ver, SRpcMsg } break; case TDMT_VND_STREAM_TASK_RESET: { if (pVnode->restored && vnodeIsLeader(pVnode)) { - (void)tqProcessTaskResetReq(pVnode->pTq, pMsg); + if (tqProcessTaskResetReq(pVnode->pTq, pMsg) < 0) { + goto _err; + } } } break; case TDMT_VND_ALTER_CONFIRM: @@ -1215,7 +1223,9 @@ static int32_t vnodeProcessCreateTbReq(SVnode *pVnode, int64_t ver, void *pReq, int64_t clusterId = pVnode->config.syncCfg.nodeInfo[0].clusterId; SName name = {0}; - (void)tNameFromString(&name, pVnode->config.dbname, T_NAME_ACCT | T_NAME_DB); + if (tNameFromString(&name, pVnode->config.dbname, T_NAME_ACCT | T_NAME_DB) < 0) { + vError("vgId:%d, failed to get name from string", TD_VID(pVnode)); + } SStringBuilder sb = {0}; for (int32_t i = 0; i < tbNames->size; i++) { @@ -1942,7 +1952,9 @@ _exit: tEncodeSize(tEncodeSSubmitRsp2, pSubmitRsp, pRsp->contLen, ret); pRsp->pCont = rpcMallocCont(pRsp->contLen); tEncoderInit(&ec, pRsp->pCont, pRsp->contLen); - (void)tEncodeSSubmitRsp2(&ec, pSubmitRsp); + if (tEncodeSSubmitRsp2(&ec, pSubmitRsp) < 0) { + vError("vgId:%d, failed to encode submit response", TD_VID(pVnode)); + } tEncoderClear(&ec); // update statistics diff --git a/source/libs/nodes/src/nodesTraverseFuncs.c b/source/libs/nodes/src/nodesTraverseFuncs.c index 927bc6b661..4f30cb12b7 100644 --- a/source/libs/nodes/src/nodesTraverseFuncs.c +++ b/source/libs/nodes/src/nodesTraverseFuncs.c @@ -204,19 +204,23 @@ static EDealRes walkExprs(SNodeList* pNodeList, ETraversalOrder order, FNodeWalk } void nodesWalkExpr(SNode* pNode, FNodeWalker walker, void* pContext) { - (void)walkExpr(pNode, TRAVERSAL_PREORDER, walker, pContext); + EDealRes res; + res = walkExpr(pNode, TRAVERSAL_PREORDER, walker, pContext); } void nodesWalkExprs(SNodeList* pNodeList, FNodeWalker walker, void* pContext) { - (void)walkExprs(pNodeList, TRAVERSAL_PREORDER, walker, pContext); + EDealRes res; + res = walkExprs(pNodeList, TRAVERSAL_PREORDER, walker, pContext); } void nodesWalkExprPostOrder(SNode* pNode, FNodeWalker walker, void* pContext) { - (void)walkExpr(pNode, TRAVERSAL_POSTORDER, walker, pContext); + EDealRes res; + res = walkExpr(pNode, TRAVERSAL_POSTORDER, walker, pContext); } void nodesWalkExprsPostOrder(SNodeList* pList, FNodeWalker walker, void* pContext) { - (void)walkExprs(pList, TRAVERSAL_POSTORDER, walker, pContext); + EDealRes res; + res = walkExprs(pList, TRAVERSAL_POSTORDER, walker, pContext); } static void checkParamIsFunc(SFunctionNode* pFunc) { @@ -382,7 +386,7 @@ static EDealRes rewriteExpr(SNode** pRawNode, ETraversalOrder order, FNodeRewrit res = rewriteExpr(&pWin->pEndOffset, order, rewriter, pContext); } break; - } + } case QUERY_NODE_COUNT_WINDOW: { SCountWindowNode* pEvent = (SCountWindowNode*)pNode; res = rewriteExpr(&pEvent->pCol, order, rewriter, pContext); diff --git a/source/util/src/tarray.c b/source/util/src/tarray.c index 59505dc0c1..7989a2468b 100644 --- a/source/util/src/tarray.c +++ b/source/util/src/tarray.c @@ -297,7 +297,7 @@ void taosArrayRemove(SArray* pArray, size_t index) { } if (index == pArray->size - 1) { - (void)taosArrayPop(pArray); + void* t = taosArrayPop(pArray); return; } diff --git a/source/util/src/tconfig.c b/source/util/src/tconfig.c index ee55243415..6fc601e517 100644 --- a/source/util/src/tconfig.c +++ b/source/util/src/tconfig.c @@ -911,7 +911,9 @@ int32_t cfgLoadFromEnvVar(SConfig *pConfig) { strncpy(line, *pEnv, sizeof(line) - 1); pEnv++; - (void)taosEnvToCfg(line, line); + if (taosEnvToCfg(line, line) < 0) { + uError("failed to convert env to cfg:%s", line); + } (void)paGetToken(line, &name, &olen); if (olen == 0) continue; @@ -954,7 +956,9 @@ int32_t cfgLoadFromEnvCmd(SConfig *pConfig, const char **envCmd) { while (envCmd[index] != NULL) { strncpy(buf, envCmd[index], sizeof(buf) - 1); buf[sizeof(buf) - 1] = 0; - (void)taosEnvToCfg(buf, buf); + if (taosEnvToCfg(buf, buf) < 0) { + uError("failed to convert env to cfg:%s", buf); + } index++; name = value = value2 = value3 = value4 = NULL; @@ -1026,7 +1030,9 @@ int32_t cfgLoadFromEnvFile(SConfig *pConfig, const char *envFile) { break; } if (line[_bytes - 1] == '\n') line[_bytes - 1] = 0; - (void)taosEnvToCfg(line, line); + if (taosEnvToCfg(line, line) < 0) { + uError("failed to convert env to cfg:%s", line); + } (void)paGetToken(line, &name, &olen); if (olen == 0) continue; @@ -1273,7 +1279,12 @@ int32_t cfgLoadFromApollUrl(SConfig *pConfig, const char *url) { } buf[fileSize] = 0; - (void)taosLSeekFile(pFile, 0, SEEK_SET); + if (taosLSeekFile(pFile, 0, SEEK_SET) < 0) { + (void)taosCloseFile(&pFile); + (void)printf("load json file error: %s\n", filepath); + taosMemoryFreeClear(buf); + TAOS_RETURN(terrno); + } if (taosReadFile(pFile, buf, fileSize) <= 0) { (void)taosCloseFile(&pFile); (void)printf("load json file error: %s\n", filepath); diff --git a/source/util/src/tdigest.c b/source/util/src/tdigest.c index 636c97dbaa..7ec5531b96 100644 --- a/source/util/src/tdigest.c +++ b/source/util/src/tdigest.c @@ -252,7 +252,9 @@ double tdigestQuantile(TDigest *t, double q) { int64_t weight_so_far; SCentroid *a, *b, tmp; - (void)tdigestCompress(t); + if (tdigestCompress(t) != 0) { + uError("failed to compress t-digest"); + } if (t->num_centroids == 0) return NAN; if (t->num_centroids == 1) return t->centroids[0].mean; if (FLOAT_EQ(q, 0.0)) return t->min; diff --git a/source/util/src/thash.c b/source/util/src/thash.c index ab88bef1a0..88fe6618b9 100644 --- a/source/util/src/thash.c +++ b/source/util/src/thash.c @@ -837,8 +837,8 @@ void taosHashCancelIterate(SHashObj *pHashObj, void *p) { // only add the read lock to disable the resize process taosHashRLock(pHashObj); - int slot; - (void)taosHashReleaseNode(pHashObj, p, &slot); + int slot; + void *tp = taosHashReleaseNode(pHashObj, p, &slot); SHashEntry *pe = pHashObj->hashList[slot]; diff --git a/source/util/src/tsched.c b/source/util/src/tsched.c index 1686b41038..8c708ac6b5 100644 --- a/source/util/src/tsched.c +++ b/source/util/src/tsched.c @@ -178,7 +178,6 @@ void *taosProcessSchedQueue(void *scheduler) { (*(msg.tfp))(msg.ahandle, msg.thandle); } - return NULL; } @@ -230,7 +229,9 @@ void taosCleanUpScheduler(void *param) { for (int32_t i = 0; i < pSched->numOfThreads; ++i) { if (taosCheckPthreadValid(pSched->qthread[i])) { - (void)tsem_post(&pSched->fullSem); + if (tsem_post(&pSched->fullSem) != 0) { + uError("post %s fullSem failed(%s)", pSched->label, strerror(terrno)); + } } } for (int32_t i = 0; i < pSched->numOfThreads; ++i) { @@ -240,12 +241,17 @@ void taosCleanUpScheduler(void *param) { } } - (void)tsem_destroy(&pSched->emptySem); - (void)tsem_destroy(&pSched->fullSem); + if (tsem_destroy(&pSched->emptySem) != 0) { + uError("failed to destroy %s emptySem", pSched->label); + } + if (tsem_destroy(&pSched->fullSem) != 0) { + uError("failed to destroy %s fullSem", pSched->label); + } (void)taosThreadMutexDestroy(&pSched->queueMutex); if (pSched->pTimer) { - (void)taosTmrStop(pSched->pTimer); + bool r = taosTmrStop(pSched->pTimer); + uTrace("stop timer:%p, result:%d", pSched->pTimer, r); pSched->pTimer = NULL; } diff --git a/source/util/src/ttimer.c b/source/util/src/ttimer.c index d5310b2e7e..0d683e4ee4 100644 --- a/source/util/src/ttimer.c +++ b/source/util/src/ttimer.c @@ -314,7 +314,9 @@ static void addToExpired(tmr_obj_t* head) { schedMsg.msg = NULL; schedMsg.ahandle = head; schedMsg.thandle = NULL; - (void)taosScheduleTask(tmrQhandle, &schedMsg); + if (taosScheduleTask(tmrQhandle, &schedMsg) != 0) { + tmrError("%s failed to add expired timer[id=%" PRIuPTR "] to queue.", head->ctrl->label, id); + } tmrDebug("timer[id=%" PRIuPTR "] has been added to queue.", id); head = next; @@ -560,7 +562,9 @@ static int32_t taosTmrModuleInit(void) { } tmrQhandle = taosInitScheduler(10000, taosTmrThreads, "tmr", NULL); - (void)taosInitTimer(taosTimerLoopFunc, MSECONDS_PER_TICK); + if (taosInitTimer(taosTimerLoopFunc, MSECONDS_PER_TICK) != 0) { + tmrError("failed to initialize timer"); + } tmrDebug("timer module is initialized, number of threads: %d", taosTmrThreads); From 0e1ef424fa299a7a1994ece4419979d90aa42205 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 26 Sep 2024 11:27:01 +0800 Subject: [PATCH 53/62] remove more void --- include/util/tcompression.h | 9 ++++----- source/dnode/snode/src/snode.c | 4 +--- source/dnode/vnode/src/vnd/vnodeOpen.c | 6 ++++-- source/dnode/vnode/src/vnd/vnodeSvr.c | 5 ++++- source/util/src/tcache.c | 2 +- source/util/src/tcompression.c | 8 ++++---- source/util/src/tdecompress.c | 19 +++++++++---------- 7 files changed, 27 insertions(+), 26 deletions(-) diff --git a/include/util/tcompression.h b/include/util/tcompression.h index c8821234b6..fef6c0713c 100644 --- a/include/util/tcompression.h +++ b/include/util/tcompression.h @@ -153,11 +153,10 @@ int32_t tsDecompressBigint(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int int32_t getWordLength(char type); int32_t tsDecompressIntImpl_Hw(const char *const input, const int32_t nelements, char *const output, const char type); -int32_t tsDecompressFloatImplAvx512(const char *const input, const int32_t nelements, char *const output); -int32_t tsDecompressFloatImplAvx2(const char *const input, const int32_t nelements, char *const output); -int32_t tsDecompressTimestampAvx512(const char *const input, const int32_t nelements, char *const output, - bool bigEndian); -int32_t tsDecompressTimestampAvx2(const char *const input, const int32_t nelements, char *const output, bool bigEndian); +void tsDecompressFloatImplAvx512(const char *const input, const int32_t nelements, char *const output); +void tsDecompressFloatImplAvx2(const char *const input, const int32_t nelements, char *const output); +void tsDecompressTimestampAvx512(const char *const input, const int32_t nelements, char *const output, bool bigEndian); +void tsDecompressTimestampAvx2(const char *const input, const int32_t nelements, char *const output, bool bigEndian); /************************************************************************* * REGULAR COMPRESSION 2 diff --git a/source/dnode/snode/src/snode.c b/source/dnode/snode/src/snode.c index 0a5c89a257..d61f3d80d3 100644 --- a/source/dnode/snode/src/snode.c +++ b/source/dnode/snode/src/snode.c @@ -38,9 +38,7 @@ int32_t sndBuildStreamTask(SSnode *pSnode, SStreamTask *pTask, int64_t nextProce streamTaskOpenAllUpstreamInput(pTask); streamTaskResetUpstreamStageInfo(pTask); - if (streamSetupScheduleTrigger(pTask) != 0) { - sndError("failed to setup schedule trigger for task:%s", pTask->id.idStr); - } + streamSetupScheduleTrigger(pTask); SCheckpointInfo *pChkInfo = &pTask->chkInfo; tqSetRestoreVersionInfo(pTask); diff --git a/source/dnode/vnode/src/vnd/vnodeOpen.c b/source/dnode/vnode/src/vnd/vnodeOpen.c index 027477d10b..0d04486925 100644 --- a/source/dnode/vnode/src/vnd/vnodeOpen.c +++ b/source/dnode/vnode/src/vnd/vnodeOpen.c @@ -452,7 +452,8 @@ SVnode *vnodeOpen(const char *path, int32_t diskPrimary, STfs *pTfs, SMsgCb msgC // open wal sprintf(tdir, "%s%s%s", dir, TD_DIRSEP, VNODE_WAL_DIR); - (void)taosRealPath(tdir, NULL, sizeof(tdir)); + ret = taosRealPath(tdir, NULL, sizeof(tdir)); + TAOS_UNUSED(ret); pVnode->pWal = walOpen(tdir, &(pVnode->config.walCfg)); if (pVnode->pWal == NULL) { @@ -462,7 +463,8 @@ SVnode *vnodeOpen(const char *path, int32_t diskPrimary, STfs *pTfs, SMsgCb msgC // open tq sprintf(tdir, "%s%s%s", dir, TD_DIRSEP, VNODE_TQ_DIR); - (void)taosRealPath(tdir, NULL, sizeof(tdir)); + ret = taosRealPath(tdir, NULL, sizeof(tdir)); + TAOS_UNUSED(ret); // open query if (vnodeQueryOpen(pVnode)) { diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index 270cc7548b..371eaa0774 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -2235,7 +2235,10 @@ static int32_t vnodeProcessBatchDeleteReq(SVnode *pVnode, int64_t ver, void *pRe SBatchDeleteReq deleteReq; SDecoder decoder; tDecoderInit(&decoder, pReq, len); - (void)tDecodeSBatchDeleteReq(&decoder, &deleteReq); + if (tDecodeSBatchDeleteReq(&decoder, &deleteReq) < 0) { + tDecoderClear(&decoder); + return terrno = TSDB_CODE_INVALID_MSG; + } SMetaReader mr = {0}; metaReaderDoInit(&mr, pVnode->pMeta, META_READER_NOLOCK); diff --git a/source/util/src/tcache.c b/source/util/src/tcache.c index 81e50f6a6b..e4fefe6e3e 100644 --- a/source/util/src/tcache.c +++ b/source/util/src/tcache.c @@ -404,7 +404,7 @@ SCacheObj *taosCacheInit(int32_t keyType, int64_t refreshTimeInMs, bool extendLi return NULL; } - (void)doRegisterCacheObj(pCacheObj); + TdThread refreshWorker = doRegisterCacheObj(pCacheObj); return pCacheObj; } diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index 2ced73a3f0..288d440d86 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -825,9 +825,9 @@ int32_t tsDecompressTimestampImp(const char *const input, const int32_t nelement return nelements * longBytes; } else if (input[0] == 1) { // Decompress if (tsSIMDEnable && tsAVX512Supported && tsAVX512Enable) { - (void)tsDecompressTimestampAvx512(input, nelements, output, false); + tsDecompressTimestampAvx512(input, nelements, output, false); } else if (tsSIMDEnable && tsAVX2Supported) { - (void)tsDecompressTimestampAvx2(input, nelements, output, false); + tsDecompressTimestampAvx2(input, nelements, output, false); } else { int64_t *ostream = (int64_t *)output; @@ -1201,9 +1201,9 @@ int32_t tsDecompressFloatImp(const char *const input, const int32_t nelements, c } if (tsSIMDEnable && tsAVX2Supported) { - (void)tsDecompressFloatImplAvx2(input, nelements, output); + tsDecompressFloatImplAvx2(input, nelements, output); } else if (tsSIMDEnable && tsAVX512Supported && tsAVX512Enable) { - (void)tsDecompressFloatImplAvx512(input, nelements, output); + tsDecompressFloatImplAvx512(input, nelements, output); } else { // alternative implementation without SIMD instructions. tsDecompressFloatHelper(input, nelements, (float *)output); } diff --git a/source/util/src/tdecompress.c b/source/util/src/tdecompress.c index a27d2efbcc..598aca730f 100644 --- a/source/util/src/tdecompress.c +++ b/source/util/src/tdecompress.c @@ -313,23 +313,22 @@ int32_t tsDecompressIntImpl_Hw(const char *const input, const int32_t nelements, return nelements * word_length; } -int32_t tsDecompressFloatImplAvx512(const char *const input, const int32_t nelements, char *const output) { +void tsDecompressFloatImplAvx512(const char *const input, const int32_t nelements, char *const output) { #if __AVX512F__ // todo add it #endif - return 0; + return; } // todo add later -int32_t tsDecompressFloatImplAvx2(const char *const input, const int32_t nelements, char *const output) { +void tsDecompressFloatImplAvx2(const char *const input, const int32_t nelements, char *const output) { #if __AVX2__ #endif - return 0; + return; } // decode two timestamps in one loop. -int32_t tsDecompressTimestampAvx2(const char *const input, const int32_t nelements, char *const output, - bool bigEndian) { +void tsDecompressTimestampAvx2(const char *const input, const int32_t nelements, char *const output, bool bigEndian) { int64_t *ostream = (int64_t *)output; int32_t ipos = 1, opos = 0; @@ -466,11 +465,11 @@ int32_t tsDecompressTimestampAvx2(const char *const input, const int32_t nelemen } } #endif - return 0; + return; } -int32_t tsDecompressTimestampAvx512(const char *const input, const int32_t nelements, char *const output, - bool UNUSED_PARAM(bigEndian)) { +void tsDecompressTimestampAvx512(const char *const input, const int32_t nelements, char *const output, + bool UNUSED_PARAM(bigEndian)) { int64_t *ostream = (int64_t *)output; int32_t ipos = 1, opos = 0; @@ -581,5 +580,5 @@ int32_t tsDecompressTimestampAvx512(const char *const input, const int32_t nelem } #endif - return 0; + return; } From d47765ad23e82e11290a6389afbe0e3771ef5688 Mon Sep 17 00:00:00 2001 From: sheyanjie-qq <249478495@qq.com> Date: Thu, 26 Sep 2024 11:41:42 +0800 Subject: [PATCH 54/62] fix libtaosws build --- tools/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 3ba6f8521e..a16a03d30a 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -18,7 +18,7 @@ IF (TD_WEBSOCKET) COMMAND git clean -f -d BUILD_COMMAND COMMAND cargo update - COMMAND export CFLAGS=-fno-builtin && RUSTFLAGS=-Ctarget-feature=-crt-static cargo build --release -p taos-ws-sys --features rustls + COMMAND RUSTFLAGS=-Ctarget-feature=-crt-static cargo build --release -p taos-ws-sys --features rustls INSTALL_COMMAND COMMAND cp target/release/${websocket_lib_file} ${CMAKE_BINARY_DIR}/build/lib COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/build/include @@ -37,7 +37,7 @@ IF (TD_WEBSOCKET) COMMAND git clean -f -d BUILD_COMMAND COMMAND cargo update - COMMAND export CFLAGS=-fno-builtin && cargo build --release -p taos-ws-sys --features rustls + COMMAND cargo build --release -p taos-ws-sys --features rustls INSTALL_COMMAND COMMAND cp target/release/taosws.dll ${CMAKE_BINARY_DIR}/build/lib COMMAND cp target/release/taosws.dll.lib ${CMAKE_BINARY_DIR}/build/lib/taosws.lib @@ -57,7 +57,7 @@ IF (TD_WEBSOCKET) COMMAND git clean -f -d BUILD_COMMAND COMMAND cargo update - COMMAND export CFLAGS=-fno-builtin && cargo build --release -p taos-ws-sys --features rustls + COMMAND cargo build --release -p taos-ws-sys --features rustls INSTALL_COMMAND COMMAND cp target/release/${websocket_lib_file} ${CMAKE_BINARY_DIR}/build/lib COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/build/include From 2c244979a18f85e3603a4dc7c83d353c00ce18d8 Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 26 Sep 2024 03:52:07 +0000 Subject: [PATCH 55/62] fix/TD-32321-add-log-fix-case --- source/libs/qworker/src/qworker.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/qworker/src/qworker.c b/source/libs/qworker/src/qworker.c index ee7c51560b..7180c58404 100644 --- a/source/libs/qworker/src/qworker.c +++ b/source/libs/qworker/src/qworker.c @@ -1428,7 +1428,7 @@ void qWorkerDestroy(void **qWorkerMgmt) { return; } - qInfo("wait for destroyed, refId:%" PRIx64, mgmt->refId); + qInfo("wait for destroyed"); while (0 == destroyed) { taosMsleep(2); } From 2259dbebf7e38d8a2cbb59f747cea837a7df75ae Mon Sep 17 00:00:00 2001 From: Jinqing Kuang Date: Thu, 26 Sep 2024 13:27:24 +0800 Subject: [PATCH 56/62] fix(query)[TS-5487]. Fix slow cleanup of metacahe on exit - Change the storage structure of the suid-related tagFilter list in the metacache to a hash set - During cleanup on exit, first clear the suid tagFilter list before cleaning the LRU cache to avoid excessive overhead. These modifications ensure that the metacache cleanup process is efficient and maintains good LRU invalidation performance. --- source/dnode/vnode/src/meta/metaCache.c | 188 ++++++++---------------- 1 file changed, 63 insertions(+), 125 deletions(-) diff --git a/source/dnode/vnode/src/meta/metaCache.c b/source/dnode/vnode/src/meta/metaCache.c index 91aa513aa6..36068d1447 100644 --- a/source/dnode/vnode/src/meta/metaCache.c +++ b/source/dnode/vnode/src/meta/metaCache.c @@ -40,7 +40,7 @@ typedef struct SMetaStbStatsEntry { } SMetaStbStatsEntry; typedef struct STagFilterResEntry { - SList list; // the linked list of md5 digest, extracted from the serialized tag query condition + SHashObj *set; // the set of md5 digest, extracted from the serialized tag query condition uint32_t hitTimes; // queried times for current super table } STagFilterResEntry; @@ -112,7 +112,7 @@ static void statsCacheClose(SMeta* pMeta) { static void freeCacheEntryFp(void* param) { STagFilterResEntry** p = param; - tdListEmpty(&(*p)->list); + taosHashCleanup((*p)->set); taosMemoryFreeClear(*p); } @@ -200,10 +200,12 @@ void metaCacheClose(SMeta* pMeta) { entryCacheClose(pMeta); statsCacheClose(pMeta); + taosHashClear(pMeta->pCache->sTagFilterResCache.pTableEntry); taosLRUCacheCleanup(pMeta->pCache->sTagFilterResCache.pUidResCache); (void)taosThreadMutexDestroy(&pMeta->pCache->sTagFilterResCache.lock); taosHashCleanup(pMeta->pCache->sTagFilterResCache.pTableEntry); + taosHashClear(pMeta->pCache->STbGroupResCache.pTableEntry); taosLRUCacheCleanup(pMeta->pCache->STbGroupResCache.pResCache); (void)taosThreadMutexDestroy(&pMeta->pCache->STbGroupResCache.lock); taosHashCleanup(pMeta->pCache->STbGroupResCache.pTableEntry); @@ -471,34 +473,6 @@ int32_t metaStatsCacheGet(SMeta* pMeta, int64_t uid, SMetaStbStats* pInfo) { return code; } -static int checkAllEntriesInCache(const STagFilterResEntry* pEntry, SArray* pInvalidRes, int32_t keyLen, - SLRUCache* pCache, uint64_t suid) { - SListIter iter = {0}; - tdListInitIter((SList*)&(pEntry->list), &iter, TD_LIST_FORWARD); - - SListNode* pNode = NULL; - uint64_t buf[3]; - buf[0] = suid; - - int32_t len = sizeof(uint64_t) * tListLen(buf); - - while ((pNode = tdListNext(&iter)) != NULL) { - memcpy(&buf[1], pNode->data, keyLen); - - // check whether it is existed in LRU cache, and remove it from linked list if not. - LRUHandle* pRes = taosLRUCacheLookup(pCache, buf, len); - if (pRes == NULL) { // remove the item in the linked list - if (taosArrayPush(pInvalidRes, &pNode) == NULL) { - return terrno; - } - } else { - bool ret = taosLRUCacheRelease(pCache, pRes, false); - } - } - - return 0; -} - static FORCE_INLINE void setMD5DigestInKey(uint64_t* pBuf, const char* key, int32_t keyLen) { memcpy(&pBuf[2], key, keyLen); } @@ -584,22 +558,11 @@ static void freeUidCachePayload(const void* key, size_t keyLen, void* value, voi if (pEntry != NULL && (*pEntry) != NULL) { int64_t st = taosGetTimestampUs(); - - SListIter iter = {0}; - tdListInitIter((SList*)&((*pEntry)->list), &iter, TD_LIST_FORWARD); - - SListNode* pNode = NULL; - while ((pNode = tdListNext(&iter)) != NULL) { - uint64_t* digest = (uint64_t*)pNode->data; - if (digest[0] == p[2] && digest[1] == p[3]) { - void* tmp = tdListPopNode(&((*pEntry)->list), pNode); - taosMemoryFree(tmp); - - double el = (taosGetTimestampUs() - st) / 1000.0; - metaInfo("clear items in meta-cache, remain cached item:%d, elapsed time:%.2fms", listNEles(&((*pEntry)->list)), - el); - break; - } + int32_t code = taosHashRemove((*pEntry)->set, &p[2], sizeof(uint64_t) * 2); + if (code == TSDB_CODE_SUCCESS) { + double el = (taosGetTimestampUs() - st) / 1000.0; + metaInfo("clear items in meta-cache, remain cached item:%d, elapsed time:%.2fms", taosHashGetSize((*pEntry)->set), + el); } } @@ -607,16 +570,30 @@ static void freeUidCachePayload(const void* key, size_t keyLen, void* value, voi } static int32_t addNewEntry(SHashObj* pTableEntry, const void* pKey, int32_t keyLen, uint64_t suid) { + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; STagFilterResEntry* p = taosMemoryMalloc(sizeof(STagFilterResEntry)); - if (p == NULL) { - return terrno; - } + TSDB_CHECK_NULL(p, code, lino, _end, terrno); p->hitTimes = 0; - tdListInit(&p->list, keyLen); - TAOS_CHECK_RETURN(taosHashPut(pTableEntry, &suid, sizeof(uint64_t), &p, POINTER_BYTES)); - TAOS_CHECK_RETURN(tdListAppend(&p->list, pKey)); - return 0; + p->set = taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK); + TSDB_CHECK_NULL(p->set, code, lino, _end, terrno); + code = taosHashPut(p->set, pKey, keyLen, NULL, 0); + TSDB_CHECK_CODE(code, lino, _end); + code = taosHashPut(pTableEntry, &suid, sizeof(uint64_t), &p, POINTER_BYTES); + TSDB_CHECK_CODE(code, lino, _end); + +_end: + if (code != TSDB_CODE_SUCCESS) { + metaError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + if (p != NULL) { + if (p->set != NULL) { + taosHashCleanup(p->set); + } + taosMemoryFree(p); + } + } + return code; } // check both the payload size and selectivity ratio @@ -657,25 +634,14 @@ int32_t metaUidFilterCachePut(void* pVnode, uint64_t suid, const void* pKey, int goto _end; } } else { // check if it exists or not - size_t size = listNEles(&(*pEntry)->list); - if (size == 0) { - code = tdListAppend(&(*pEntry)->list, pKey); - if (code) { - goto _end; - } - } else { - SListNode* pNode = listHead(&(*pEntry)->list); - uint64_t* p = (uint64_t*)pNode->data; - if (p[1] == ((uint64_t*)pKey)[1] && p[0] == ((uint64_t*)pKey)[0]) { - // we have already found the existed items, no need to added to cache anymore. - (void)taosThreadMutexUnlock(pLock); - return TSDB_CODE_SUCCESS; - } else { // not equal, append it - code = tdListAppend(&(*pEntry)->list, pKey); - if (code) { - goto _end; - } - } + code = taosHashPut((*pEntry)->set, pKey, keyLen, NULL, 0); + if (code == TSDB_CODE_DUP_KEY) { + // we have already found the existed items, no need to added to cache anymore. + (void)taosThreadMutexUnlock(pLock); + return TSDB_CODE_SUCCESS; + } + if (code != TSDB_CODE_SUCCESS) { + goto _end; } } @@ -703,23 +669,20 @@ int32_t metaUidCacheClear(SMeta* pMeta, uint64_t suid) { (void)taosThreadMutexLock(pLock); STagFilterResEntry** pEntry = taosHashGet(pEntryHashMap, &suid, sizeof(uint64_t)); - if (pEntry == NULL || listNEles(&(*pEntry)->list) == 0) { + if (pEntry == NULL || taosHashGetSize((*pEntry)->set) == 0) { (void)taosThreadMutexUnlock(pLock); return TSDB_CODE_SUCCESS; } (*pEntry)->hitTimes = 0; - SListIter iter = {0}; - tdListInitIter(&(*pEntry)->list, &iter, TD_LIST_FORWARD); - - SListNode* pNode = NULL; - while ((pNode = tdListNext(&iter)) != NULL) { - setMD5DigestInKey(p, pNode->data, 2 * sizeof(uint64_t)); + char *iter = taosHashIterate((*pEntry)->set, NULL); + while (iter != NULL) { + setMD5DigestInKey(p, iter, 2 * sizeof(uint64_t)); taosLRUCacheErase(pMeta->pCache->sTagFilterResCache.pUidResCache, p, TAG_FILTER_RES_KEY_LEN); + iter = taosHashIterate((*pEntry)->set, iter); } - - tdListEmpty(&(*pEntry)->list); + taosHashClear((*pEntry)->set); (void)taosThreadMutexUnlock(pLock); metaDebug("vgId:%d suid:%" PRId64 " cached related tag filter uid list cleared", vgId, suid); @@ -789,22 +752,11 @@ static void freeTbGroupCachePayload(const void* key, size_t keyLen, void* value, if (pEntry != NULL && (*pEntry) != NULL) { int64_t st = taosGetTimestampUs(); - - SListIter iter = {0}; - tdListInitIter((SList*)&((*pEntry)->list), &iter, TD_LIST_FORWARD); - - SListNode* pNode = NULL; - while ((pNode = tdListNext(&iter)) != NULL) { - uint64_t* digest = (uint64_t*)pNode->data; - if (digest[0] == p[2] && digest[1] == p[3]) { - void* tmp = tdListPopNode(&((*pEntry)->list), pNode); - taosMemoryFree(tmp); - - double el = (taosGetTimestampUs() - st) / 1000.0; - metaDebug("clear one item in tb group cache, remain cached item:%d, elapsed time:%.2fms", - listNEles(&((*pEntry)->list)), el); - break; - } + int32_t code = taosHashRemove((*pEntry)->set, &p[2], sizeof(uint64_t) * 2); + if (code == TSDB_CODE_SUCCESS) { + double el = (taosGetTimestampUs() - st) / 1000.0; + metaDebug("clear one item in tb group cache, remain cached item:%d, elapsed time:%.2fms", + taosHashGetSize((*pEntry)->set), el); } } @@ -840,25 +792,14 @@ int32_t metaPutTbGroupToCache(void* pVnode, uint64_t suid, const void* pKey, int goto _end; } } else { // check if it exists or not - size_t size = listNEles(&(*pEntry)->list); - if (size == 0) { - code = tdListAppend(&(*pEntry)->list, pKey); - if (code) { - goto _end; - } - } else { - SListNode* pNode = listHead(&(*pEntry)->list); - uint64_t* p = (uint64_t*)pNode->data; - if (p[1] == ((uint64_t*)pKey)[1] && p[0] == ((uint64_t*)pKey)[0]) { - // we have already found the existed items, no need to added to cache anymore. - (void)taosThreadMutexUnlock(pLock); - return TSDB_CODE_SUCCESS; - } else { // not equal, append it - code = tdListAppend(&(*pEntry)->list, pKey); - if (code) { - goto _end; - } - } + code = taosHashPut((*pEntry)->set, pKey, keyLen, NULL, 0); + if (code == TSDB_CODE_DUP_KEY) { + // we have already found the existed items, no need to added to cache anymore. + (void)taosThreadMutexUnlock(pLock); + return TSDB_CODE_SUCCESS; + } + if (code != TSDB_CODE_SUCCESS) { + goto _end; } } @@ -886,23 +827,20 @@ int32_t metaTbGroupCacheClear(SMeta* pMeta, uint64_t suid) { (void)taosThreadMutexLock(pLock); STagFilterResEntry** pEntry = taosHashGet(pEntryHashMap, &suid, sizeof(uint64_t)); - if (pEntry == NULL || listNEles(&(*pEntry)->list) == 0) { + if (pEntry == NULL || taosHashGetSize((*pEntry)->set) == 0) { (void)taosThreadMutexUnlock(pLock); return TSDB_CODE_SUCCESS; } (*pEntry)->hitTimes = 0; - SListIter iter = {0}; - tdListInitIter(&(*pEntry)->list, &iter, TD_LIST_FORWARD); - - SListNode* pNode = NULL; - while ((pNode = tdListNext(&iter)) != NULL) { - setMD5DigestInKey(p, pNode->data, 2 * sizeof(uint64_t)); + char *iter = taosHashIterate((*pEntry)->set, NULL); + while (iter != NULL) { + setMD5DigestInKey(p, iter, 2 * sizeof(uint64_t)); taosLRUCacheErase(pMeta->pCache->STbGroupResCache.pResCache, p, TAG_FILTER_RES_KEY_LEN); + iter = taosHashIterate((*pEntry)->set, iter); } - - tdListEmpty(&(*pEntry)->list); + taosHashClear((*pEntry)->set); (void)taosThreadMutexUnlock(pLock); metaDebug("vgId:%d suid:%" PRId64 " cached related tb group cleared", vgId, suid); From af5558b4b2222d89b400aa10954c43bfc40532e2 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 26 Sep 2024 13:30:09 +0800 Subject: [PATCH 57/62] remove unused code --- source/os/src/osSocket.c | 762 ++------------------------------------- 1 file changed, 21 insertions(+), 741 deletions(-) diff --git a/source/os/src/osSocket.c b/source/os/src/osSocket.c index 2065ba68fe..09a5579e13 100644 --- a/source/os/src/osSocket.c +++ b/source/os/src/osSocket.c @@ -55,7 +55,7 @@ typedef struct TdSocket { #endif int refId; SocketFd fd; -} *TdSocketPtr, TdSocket; +} * TdSocketPtr, TdSocket; typedef struct TdSocketServer { #if SOCKET_WITH_LOCK @@ -63,7 +63,7 @@ typedef struct TdSocketServer { #endif int refId; SocketFd fd; -} *TdSocketServerPtr, TdSocketServer; +} * TdSocketServerPtr, TdSocketServer; typedef struct TdEpoll { #if SOCKET_WITH_LOCK @@ -71,52 +71,7 @@ typedef struct TdEpoll { #endif int refId; EpollFd fd; -} *TdEpollPtr, TdEpoll; - -#if 0 -int32_t taosSendto(TdSocketPtr pSocket, void *buf, int len, unsigned int flags, const struct sockaddr *dest_addr, - int addrlen) { - if (pSocket == NULL || pSocket->fd < 0) { - return -1; - } -#ifdef WINDOWS - return sendto(pSocket->fd, buf, len, flags, dest_addr, addrlen); -#else - return sendto(pSocket->fd, buf, len, flags, dest_addr, addrlen); -#endif -} - -int32_t taosWriteSocket(TdSocketPtr pSocket, void *buf, int len) { - if (pSocket == NULL || pSocket->fd < 0) { - return -1; - } -#ifdef WINDOWS - return send(pSocket->fd, buf, len, 0); - ; -#else - return write(pSocket->fd, buf, len); -#endif -} -int32_t taosReadSocket(TdSocketPtr pSocket, void *buf, int len) { - if (pSocket == NULL || pSocket->fd < 0) { - return -1; - } -#ifdef WINDOWS - return recv(pSocket->fd, buf, len, 0); - ; -#else - return read(pSocket->fd, buf, len); -#endif -} - -int32_t taosReadFromSocket(TdSocketPtr pSocket, void *buf, int32_t len, int32_t flags, struct sockaddr *destAddr, - int *addrLen) { - if (pSocket == NULL || pSocket->fd < 0) { - return -1; - } - return recvfrom(pSocket->fd, buf, len, flags, destAddr, addrLen); -} -#endif // endif 0 +} * TdEpollPtr, TdEpoll; int32_t taosCloseSocketNoCheck1(SocketFd fd) { #ifdef WINDOWS @@ -145,136 +100,16 @@ int32_t taosCloseSocket(TdSocketPtr *ppSocket) { code = taosCloseSocketNoCheck1((*ppSocket)->fd); (*ppSocket)->fd = -1; taosMemoryFree(*ppSocket); - + return code; } -#if 0 -int32_t taosCloseSocketServer(TdSocketServerPtr *ppSocketServer) { - int32_t code; - if (ppSocketServer == NULL || *ppSocketServer == NULL || (*ppSocketServer)->fd < 0) { - return -1; - } - code = taosCloseSocketNoCheck1((*ppSocketServer)->fd); - (*ppSocketServer)->fd = -1; - taosMemoryFree(*ppSocketServer); - return code; -} - -int32_t taosShutDownSocketRD(TdSocketPtr pSocket) { - if (pSocket == NULL || pSocket->fd < 0) { - return -1; - } -#ifdef WINDOWS - return closesocket(pSocket->fd); -#elif __APPLE__ - return close(pSocket->fd); -#else - return shutdown(pSocket->fd, SHUT_RD); -#endif -} -int32_t taosShutDownSocketServerRD(TdSocketServerPtr pSocketServer) { - if (pSocketServer == NULL || pSocketServer->fd < 0) { - return -1; - } -#ifdef WINDOWS - return closesocket(pSocketServer->fd); -#elif __APPLE__ - return close(pSocketServer->fd); -#else - return shutdown(pSocketServer->fd, SHUT_RD); -#endif -} - -int32_t taosShutDownSocketWR(TdSocketPtr pSocket) { - if (pSocket == NULL || pSocket->fd < 0) { - return -1; - } -#ifdef WINDOWS - return closesocket(pSocket->fd); -#elif __APPLE__ - return close(pSocket->fd); -#else - return shutdown(pSocket->fd, SHUT_WR); -#endif -} -int32_t taosShutDownSocketServerWR(TdSocketServerPtr pSocketServer) { - if (pSocketServer == NULL || pSocketServer->fd < 0) { - return -1; - } -#ifdef WINDOWS - return closesocket(pSocketServer->fd); -#elif __APPLE__ - return close(pSocketServer->fd); -#else - return shutdown(pSocketServer->fd, SHUT_WR); -#endif -} -int32_t taosShutDownSocketRDWR(TdSocketPtr pSocket) { - if (pSocket == NULL || pSocket->fd < 0) { - return -1; - } -#ifdef WINDOWS - return closesocket(pSocket->fd); -#elif __APPLE__ - return close(pSocket->fd); -#else - return shutdown(pSocket->fd, SHUT_RDWR); -#endif -} -int32_t taosShutDownSocketServerRDWR(TdSocketServerPtr pSocketServer) { - if (pSocketServer == NULL || pSocketServer->fd < 0) { - return -1; - } -#ifdef WINDOWS - return closesocket(pSocketServer->fd); -#elif __APPLE__ - return close(pSocketServer->fd); -#else - return shutdown(pSocketServer->fd, SHUT_RDWR); -#endif -} - -int32_t taosSetNonblocking(TdSocketPtr pSocket, int32_t on) { - if (pSocket == NULL || pSocket->fd < 0) { - return -1; - } -#ifdef WINDOWS - u_long mode; - if (on) { - mode = 1; - ioctlsocket(pSocket->fd, FIONBIO, &mode); - } else { - mode = 0; - ioctlsocket(pSocket->fd, FIONBIO, &mode); - } -#else - int32_t flags = 0; - if ((flags = fcntl(pSocket->fd, F_GETFL, 0)) < 0) { - // printf("fcntl(F_GETFL) error: %d (%s)\n", errno, strerror(errno)); - return 1; - } - - if (on) - flags |= O_NONBLOCK; - else - flags &= ~O_NONBLOCK; - - if ((flags = fcntl(pSocket->fd, F_SETFL, flags)) < 0) { - // printf("fcntl(F_SETFL) error: %d (%s)\n", errno, strerror(errno)); - return 1; - } -#endif - return 0; -} -#endif // endif 0 - int32_t taosSetSockOpt(TdSocketPtr pSocket, int32_t level, int32_t optname, void *optval, int32_t optlen) { if (pSocket == NULL || pSocket->fd < 0) { terrno = TSDB_CODE_INVALID_PARA; return terrno; } - + #ifdef WINDOWS #ifdef TCP_KEEPCNT if (level == SOL_SOCKET && optname == TCP_KEEPCNT) { @@ -300,11 +135,11 @@ int32_t taosSetSockOpt(TdSocketPtr pSocket, int32_t level, int32_t optname, void } #endif -int ret = setsockopt(pSocket->fd, level, optname, optval, optlen); -if (ret == SOCKET_ERROR) { - int errorCode = WSAGetLastError(); - return terrno = TAOS_SYSTEM_WINSOCKET_ERROR(errorCode); -} + int ret = setsockopt(pSocket->fd, level, optname, optval, optlen); + if (ret == SOCKET_ERROR) { + int errorCode = WSAGetLastError(); + return terrno = TAOS_SYSTEM_WINSOCKET_ERROR(errorCode); + } #else int32_t code = setsockopt(pSocket->fd, level, optname, optval, (int)optlen); if (-1 == code) { @@ -315,22 +150,8 @@ if (ret == SOCKET_ERROR) { #endif } -#if 0 -int32_t taosGetSockOpt(TdSocketPtr pSocket, int32_t level, int32_t optname, void *optval, int32_t *optlen) { - if (pSocket == NULL || pSocket->fd < 0) { - return -1; - } -#ifdef WINDOWS - return -1; -#else - return getsockopt(pSocket->fd, level, optname, optval, (int *)optlen); -#endif -} - -#endif - const char *taosInetNtoa(struct in_addr ipInt, char *dstStr, int32_t len) { - const char* r = inet_ntop(AF_INET, &ipInt, dstStr, len); + const char *r = inet_ntop(AF_INET, &ipInt, dstStr, len); if (NULL == r) { terrno = TAOS_SYSTEM_ERROR(errno); } @@ -344,403 +165,6 @@ const char *taosInetNtoa(struct in_addr ipInt, char *dstStr, int32_t len) { #define TCP_CONN_TIMEOUT 3000 // conn timeout -#if 0 -int32_t taosWriteMsg(TdSocketPtr pSocket, void *buf, int32_t nbytes) { - if (pSocket == NULL || pSocket->fd < 0) { - return -1; - } - int32_t nleft, nwritten; - char *ptr = (char *)buf; - - nleft = nbytes; - - while (nleft > 0) { - nwritten = taosWriteSocket(pSocket, (char *)ptr, (size_t)nleft); - if (nwritten <= 0) { - if (errno == EINTR /* || errno == EAGAIN || errno == EWOULDBLOCK */) - continue; - else - return -1; - } else { - nleft -= nwritten; - ptr += nwritten; - } - - if (errno == SIGPIPE || errno == EPIPE) { - return -1; - } - } - - return (nbytes - nleft); -} - -int32_t taosReadMsg(TdSocketPtr pSocket, void *buf, int32_t nbytes) { - if (pSocket == NULL || pSocket->fd < 0) { - return -1; - } - int32_t nleft, nread; - char *ptr = (char *)buf; - - nleft = nbytes; - - while (nleft > 0) { - nread = taosReadSocket(pSocket, ptr, (size_t)nleft); - if (nread == 0) { - break; - } else if (nread < 0) { - if (errno == EINTR /* || errno == EAGAIN || errno == EWOULDBLOCK*/) { - continue; - } else { - return -1; - } - } else { - nleft -= nread; - ptr += nread; - } - - if (errno == SIGPIPE || errno == EPIPE) { - return -1; - } - } - - return (nbytes - nleft); -} - -int32_t taosNonblockwrite(TdSocketPtr pSocket, char *ptr, int32_t nbytes) { - if (pSocket == NULL || pSocket->fd < 0) { - return -1; - } - taosSetNonblocking(pSocket, 1); - - int32_t nleft, nwritten, nready; - fd_set fset; - struct timeval tv; - - nleft = nbytes; - while (nleft > 0) { - tv.tv_sec = 30; - tv.tv_usec = 0; - FD_ZERO(&fset); - FD_SET(pSocket->fd, &fset); - if ((nready = select((SocketFd)(pSocket->fd + 1), NULL, &fset, NULL, &tv)) == 0) { - errno = ETIMEDOUT; - // printf("fd %d timeout, no enough space to write", fd); - break; - - } else if (nready < 0) { - if (errno == EINTR) continue; - - // printf("select error, %d (%s)", errno, strerror(errno)); - return -1; - } - - nwritten = (int32_t)send(pSocket->fd, ptr, (size_t)nleft, MSG_NOSIGNAL); - if (nwritten <= 0) { - if (errno == EAGAIN || errno == EINTR) continue; - - // printf("write error, %d (%s)", errno, strerror(errno)); - return -1; - } - - nleft -= nwritten; - ptr += nwritten; - } - - taosSetNonblocking(pSocket, 0); - - return (nbytes - nleft); -} - -TdSocketPtr taosOpenUdpSocket(uint32_t ip, uint16_t port) { - struct sockaddr_in localAddr; - SocketFd fd; - int32_t bufSize = 1024000; - - // printf("open udp socket:0x%x:%hu", ip, port); - - memset((char *)&localAddr, 0, sizeof(localAddr)); - localAddr.sin_family = AF_INET; - localAddr.sin_addr.s_addr = ip; - localAddr.sin_port = (uint16_t)htons(port); - - if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) <= 2) { - // printf("failed to open udp socket: %d (%s)", errno, strerror(errno)); - taosCloseSocketNoCheck1(fd); - return NULL; - } - - TdSocketPtr pSocket = (TdSocketPtr)taosMemoryMalloc(sizeof(TdSocket)); - if (pSocket == NULL) { - taosCloseSocketNoCheck1(fd); - return NULL; - } - pSocket->fd = fd; - pSocket->refId = 0; - - if (taosSetSockOpt(pSocket, SOL_SOCKET, SO_SNDBUF, (void *)&bufSize, sizeof(bufSize)) != 0) { - // printf("failed to set the send buffer size for UDP socket\n"); - taosCloseSocket(&pSocket); - return NULL; - } - - if (taosSetSockOpt(pSocket, SOL_SOCKET, SO_RCVBUF, (void *)&bufSize, sizeof(bufSize)) != 0) { - // printf("failed to set the receive buffer size for UDP socket\n"); - taosCloseSocket(&pSocket); - return NULL; - } - - /* bind socket to local address */ - if (bind(pSocket->fd, (struct sockaddr *)&localAddr, sizeof(localAddr)) < 0) { - // printf("failed to bind udp socket: %d (%s), 0x%x:%hu", errno, strerror(errno), ip, port); - taosCloseSocket(&pSocket); - return NULL; - } - - return pSocket; -} - -TdSocketPtr taosOpenTcpClientSocket(uint32_t destIp, uint16_t destPort, uint32_t clientIp) { - SocketFd fd = -1; - int32_t ret; - struct sockaddr_in serverAddr, clientAddr; - int32_t bufSize = 1024 * 1024; - - fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); - - if (fd <= 2) { - // printf("failed to open the socket: %d (%s)", errno, strerror(errno)); - if (fd >= 0) taosCloseSocketNoCheck1(fd); - return NULL; - } - - TdSocketPtr pSocket = (TdSocketPtr)taosMemoryMalloc(sizeof(TdSocket)); - if (pSocket == NULL) { - taosCloseSocketNoCheck1(fd); - return NULL; - } - pSocket->fd = fd; - pSocket->refId = 0; - - /* set REUSEADDR option, so the portnumber can be re-used */ - int32_t reuse = 1; - if (taosSetSockOpt(pSocket, SOL_SOCKET, SO_REUSEADDR, (void *)&reuse, sizeof(reuse)) < 0) { - // printf("setsockopt SO_REUSEADDR failed: %d (%s)", errno, strerror(errno)); - taosCloseSocket(&pSocket); - return NULL; - } - - if (taosSetSockOpt(pSocket, SOL_SOCKET, SO_SNDBUF, (void *)&bufSize, sizeof(bufSize)) != 0) { - // printf("failed to set the send buffer size for TCP socket\n"); - taosCloseSocket(&pSocket); - return NULL; - } - - if (taosSetSockOpt(pSocket, SOL_SOCKET, SO_RCVBUF, (void *)&bufSize, sizeof(bufSize)) != 0) { - // printf("failed to set the receive buffer size for TCP socket\n"); - taosCloseSocket(&pSocket); - return NULL; - } - - if (clientIp != 0) { - memset((char *)&clientAddr, 0, sizeof(clientAddr)); - clientAddr.sin_family = AF_INET; - clientAddr.sin_addr.s_addr = clientIp; - clientAddr.sin_port = 0; - - /* bind socket to client address */ - if (bind(pSocket->fd, (struct sockaddr *)&clientAddr, sizeof(clientAddr)) < 0) { - // printf("bind tcp client socket failed, client(0x%x:0), dest(0x%x:%d), reason:(%s)", clientIp, destIp, destPort, - // strerror(errno)); - taosCloseSocket(&pSocket); - return NULL; - } - } - - memset((char *)&serverAddr, 0, sizeof(serverAddr)); - serverAddr.sin_family = AF_INET; - serverAddr.sin_addr.s_addr = destIp; - serverAddr.sin_port = (uint16_t)htons((uint16_t)destPort); - -#ifdef _TD_LINUX - taosSetNonblocking(pSocket, 1); - ret = connect(pSocket->fd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)); - if (ret == -1) { - if (errno == EHOSTUNREACH) { - // printf("failed to connect socket, ip:0x%x, port:%hu(%s)", destIp, destPort, strerror(errno)); - taosCloseSocket(&pSocket); - return -1; - } else if (errno == EINPROGRESS || errno == EAGAIN || errno == EWOULDBLOCK) { - struct pollfd wfd[1]; - - wfd[0].fd = pSocket->fd; - wfd[0].events = POLLOUT; - - int res = poll(wfd, 1, TCP_CONN_TIMEOUT); - if (res == -1 || res == 0) { - // printf("failed to connect socket, ip:0x%x, port:%hu(poll error/conn timeout)", destIp, destPort); - taosCloseSocket(&pSocket); // - return -1; - } - int optVal = -1, optLen = sizeof(int); - if ((0 != taosGetSockOpt(pSocket, SOL_SOCKET, SO_ERROR, &optVal, &optLen)) || (optVal != 0)) { - // printf("failed to connect socket, ip:0x%x, port:%hu(connect host error)", destIp, destPort); - taosCloseSocket(&pSocket); // - return -1; - } - ret = 0; - } else { // Other error - // printf("failed to connect socket, ip:0x%x, port:%hu(target host cannot be reached)", destIp, destPort); - taosCloseSocket(&pSocket); // - return -1; - } - } - taosSetNonblocking(pSocket, 0); - -#else - ret = connect(pSocket->fd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)); -#endif - - if (ret != 0) { - // printf("failed to connect socket, ip:0x%x, port:%hu(%s)", destIp, destPort, strerror(errno)); - taosCloseSocket(&pSocket); - return NULL; - } else { - if (taosKeepTcpAlive(pSocket) == -1) { - return NULL; - } - } - - return pSocket; -} - -int32_t taosKeepTcpAlive(TdSocketPtr pSocket) { - if (pSocket == NULL || pSocket->fd < 0) { - return -1; - } - int32_t alive = 1; - if (taosSetSockOpt(pSocket, SOL_SOCKET, SO_KEEPALIVE, (void *)&alive, sizeof(alive)) < 0) { - // printf("fd:%d setsockopt SO_KEEPALIVE failed: %d (%s)", sockFd, errno, strerror(errno)); - taosCloseSocket(&pSocket); - return -1; - } - -#ifndef __APPLE__ - // all fails on macosx -#ifdef TCP_KEEPCNT - int32_t probes = 3; - if (taosSetSockOpt(pSocket, SOL_TCP, TCP_KEEPCNT, (void *)&probes, sizeof(probes)) < 0) { - // printf("fd:%d setsockopt SO_KEEPCNT failed: %d (%s)", sockFd, errno, strerror(errno)); - taosCloseSocket(&pSocket); - return -1; - } -#endif - -#ifdef TCP_KEEPIDLE - int32_t alivetime = 10; - if (taosSetSockOpt(pSocket, SOL_TCP, TCP_KEEPIDLE, (void *)&alivetime, sizeof(alivetime)) < 0) { - // printf("fd:%d setsockopt SO_KEEPIDLE failed: %d (%s)", sockFd, errno, strerror(errno)); - taosCloseSocket(&pSocket); - return -1; - } -#endif - -#ifdef TCP_KEEPINTVL - int32_t interval = 3; - if (taosSetSockOpt(pSocket, SOL_TCP, TCP_KEEPINTVL, (void *)&interval, sizeof(interval)) < 0) { - // printf("fd:%d setsockopt SO_KEEPINTVL failed: %d (%s)", sockFd, errno, strerror(errno)); - taosCloseSocket(&pSocket); - return -1; - } -#endif -#endif // __APPLE__ - - int32_t nodelay = 1; - if (taosSetSockOpt(pSocket, IPPROTO_TCP, TCP_NODELAY, (void *)&nodelay, sizeof(nodelay)) < 0) { - // printf("fd:%d setsockopt TCP_NODELAY failed %d (%s)", sockFd, errno, strerror(errno)); - taosCloseSocket(&pSocket); - return -1; - } - - struct linger linger = {0}; - linger.l_onoff = 1; - linger.l_linger = 3; - if (taosSetSockOpt(pSocket, SOL_SOCKET, SO_LINGER, (void *)&linger, sizeof(linger)) < 0) { - // printf("setsockopt SO_LINGER failed: %d (%s)", errno, strerror(errno)); - taosCloseSocket(&pSocket); - return -1; - } - - return 0; -} - -int taosGetLocalIp(const char *eth, char *ip) { -#if defined(WINDOWS) - // DO NOTHAING - return -1; -#else - int fd; - struct ifreq ifr; - struct sockaddr_in sin; - - fd = socket(AF_INET, SOCK_DGRAM, 0); - if (-1 == fd) { - return -1; - } - strncpy(ifr.ifr_name, eth, IFNAMSIZ); - ifr.ifr_name[IFNAMSIZ - 1] = 0; - - if (ioctl(fd, SIOCGIFADDR, &ifr) < 0) { - taosCloseSocketNoCheck1(fd); - return -1; - } - memcpy(&sin, &ifr.ifr_addr, sizeof(sin)); - taosInetNtoa(sin.sin_addr, ip, 64); - taosCloseSocketNoCheck1(fd); -#endif - return 0; -} -int taosValidIp(uint32_t ip) { -#if defined(WINDOWS) - // DO NOTHAING - return -1; -#else - int ret = -1; - int fd; - - struct ifconf ifconf; - - char buf[512] = {0}; - ifconf.ifc_len = 512; - ifconf.ifc_buf = buf; - - if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - return -1; - } - - ioctl(fd, SIOCGIFCONF, &ifconf); - struct ifreq *ifreq = (struct ifreq *)ifconf.ifc_buf; - for (int i = (ifconf.ifc_len / sizeof(struct ifreq)); i > 0; i--) { - char ip_str[64] = {0}; - if (ifreq->ifr_flags == AF_INET) { - ret = taosGetLocalIp(ifreq->ifr_name, ip_str); - if (ret != 0) { - break; - } - ret = -1; - if (ip == (uint32_t)taosInetAddr(ip_str)) { - ret = 0; - break; - } - ifreq++; - } - } - taosCloseSocketNoCheck1(fd); - return ret; -#endif - return 0; -} -#endif // endif 0 - bool taosValidIpAndPort(uint32_t ip, uint16_t port) { struct sockaddr_in serverAdd; SocketFd fd; @@ -778,138 +202,19 @@ bool taosValidIpAndPort(uint32_t ip, uint16_t port) { TAOS_SKIP_ERROR(taosCloseSocket(&pSocket)); return false; } - + /* bind socket to server address */ if (-1 == bind(pSocket->fd, (struct sockaddr *)&serverAdd, sizeof(serverAdd))) { terrno = TAOS_SYSTEM_ERROR(errno); TAOS_SKIP_ERROR(taosCloseSocket(&pSocket)); return false; } - + TAOS_SKIP_ERROR(taosCloseSocket(&pSocket)); - + return true; } -#if 0 -TdSocketServerPtr taosOpenTcpServerSocket(uint32_t ip, uint16_t port) { - struct sockaddr_in serverAdd; - SocketFd fd; - int32_t reuse; - - // printf("open tcp server socket:0x%x:%hu", ip, port); - - bzero((char *)&serverAdd, sizeof(serverAdd)); - serverAdd.sin_family = AF_INET; - serverAdd.sin_addr.s_addr = ip; - serverAdd.sin_port = (uint16_t)htons(port); - - if ((fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) <= 2) { - // printf("failed to open TCP socket: %d (%s)", errno, strerror(errno)); - taosCloseSocketNoCheck1(fd); - return NULL; - } - - TdSocketPtr pSocket = (TdSocketPtr)taosMemoryMalloc(sizeof(TdSocket)); - if (pSocket == NULL) { - taosCloseSocketNoCheck1(fd); - return NULL; - } - pSocket->refId = 0; - pSocket->fd = fd; - - /* set REUSEADDR option, so the portnumber can be re-used */ - reuse = 1; - if (taosSetSockOpt(pSocket, SOL_SOCKET, SO_REUSEADDR, (void *)&reuse, sizeof(reuse)) < 0) { - // printf("setsockopt SO_REUSEADDR failed: %d (%s)", errno, strerror(errno)); - taosCloseSocket(&pSocket); - return NULL; - } - - /* bind socket to server address */ - if (bind(pSocket->fd, (struct sockaddr *)&serverAdd, sizeof(serverAdd)) < 0) { - // printf("bind tcp server socket failed, 0x%x:%hu(%s)", ip, port, strerror(errno)); - taosCloseSocket(&pSocket); - return NULL; - } - - if (taosKeepTcpAlive(pSocket) < 0) { - // printf("failed to set tcp server keep-alive option, 0x%x:%hu(%s)", ip, port, strerror(errno)); - return NULL; - } - - if (listen(pSocket->fd, 1024) < 0) { - // printf("listen tcp server socket failed, 0x%x:%hu(%s)", ip, port, strerror(errno)); - taosCloseSocket(&pSocket); - return NULL; - } - - return (TdSocketServerPtr)pSocket; -} - -TdSocketPtr taosAcceptTcpConnectSocket(TdSocketServerPtr pServerSocket, struct sockaddr *destAddr, int *addrLen) { - if (pServerSocket == NULL || pServerSocket->fd < 0) { - return NULL; - } - SocketFd fd = accept(pServerSocket->fd, destAddr, addrLen); - if (fd == -1) { - // tError("TCP accept failure(%s)", strerror(errno)); - return NULL; - } - - TdSocketPtr pSocket = (TdSocketPtr)taosMemoryMalloc(sizeof(TdSocket)); - if (pSocket == NULL) { - taosCloseSocketNoCheck1(fd); - return NULL; - } - pSocket->fd = fd; - pSocket->refId = 0; - return pSocket; -} -#define COPY_SIZE 32768 -// sendfile shall be used - -int64_t taosCopyFds(TdSocketPtr pSrcSocket, TdSocketPtr pDestSocket, int64_t len) { - if (pSrcSocket == NULL || pSrcSocket->fd < 0 || pDestSocket == NULL || pDestSocket->fd < 0) { - return -1; - } - int64_t leftLen; - int64_t readLen, writeLen; - char temp[COPY_SIZE]; - - leftLen = len; - - while (leftLen > 0) { - if (leftLen < COPY_SIZE) - readLen = leftLen; - else - readLen = COPY_SIZE; // 4K - - int64_t retLen = taosReadMsg(pSrcSocket, temp, (int32_t)readLen); - if (readLen != retLen) { - // printf("read error, readLen:%" PRId64 " retLen:%" PRId64 " len:%" PRId64 " leftLen:%" PRId64 ", reason:%s", - // readLen, retLen, len, leftLen, strerror(errno)); - return -1; - } - - writeLen = taosWriteMsg(pDestSocket, temp, (int32_t)readLen); - - if (readLen != writeLen) { - // printf("copy error, readLen:%" PRId64 " writeLen:%" PRId64 " len:%" PRId64 " leftLen:%" PRId64 ", reason:%s", - // readLen, writeLen, len, leftLen, strerror(errno)); - return -1; - } - - leftLen -= readLen; - } - - return len; -} - -// Function converting an IP address string to an uint32_t. - -#endif // endif 0 - int32_t taosBlockSIGPIPE() { #ifdef WINDOWS return 0; @@ -1029,7 +334,7 @@ int32_t taosGetFqdn(char *fqdn) { // hints.ai_family = AF_INET; strcpy(fqdn, hostname); strcpy(fqdn + strlen(hostname), ".local"); -#else // linux +#else // linux #endif // linux @@ -1048,7 +353,7 @@ int32_t taosGetFqdn(char *fqdn) { terrno = TAOS_SYSTEM_ERROR(errno); return terrno; } - + terrno = TAOS_SYSTEM_ERROR(ret); return terrno; } @@ -1067,7 +372,7 @@ int32_t taosGetFqdn(char *fqdn) { int32_t ret = getaddrinfo(hostname, NULL, &hints, &result); if (!result) { - //fprintf(stderr, "failed to get fqdn, code:%d, hostname:%s, reason:%s\n", ret, hostname, gai_strerror(ret)); + // fprintf(stderr, "failed to get fqdn, code:%d, hostname:%s, reason:%s\n", ret, hostname, gai_strerror(ret)); return TAOS_SYSTEM_WINSOCKET_ERROR(WSAGetLastError()); } strcpy(fqdn, result->ai_canonname); @@ -1082,41 +387,16 @@ void tinet_ntoa(char *ipstr, uint32_t ip) { (void)sprintf(ipstr, "%d.%d.%d.%d", ip & 0xFF, (ip >> 8) & 0xFF, (ip >> 16) & 0xFF, ip >> 24); } -int32_t taosIgnSIGPIPE() { - sighandler_t h = signal(SIGPIPE, SIG_IGN); +int32_t taosIgnSIGPIPE() { + sighandler_t h = signal(SIGPIPE, SIG_IGN); if (SIG_ERR == h) { terrno = TAOS_SYSTEM_ERROR(errno); return terrno; } - return 0; + return 0; } -#if 0 - -int32_t taosSetMaskSIGPIPE() { -#ifdef WINDOWS - return -1; -#else - sigset_t signal_mask; - (void)sigemptyset(&signal_mask); - (void)sigaddset(&signal_mask, SIGPIPE); - - int32_t rc = pthread_sigmask(SIG_SETMASK, &signal_mask, NULL); - if (rc != 0) { - // printf("failed to setmask SIGPIPE"); - } -#endif -} - -int32_t taosGetSocketName(TdSocketPtr pSocket, struct sockaddr *destAddr, int *addrLen) { - if (pSocket == NULL || pSocket->fd < 0) { - return -1; - } - return getsockname(pSocket->fd, destAddr, addrLen); -} -#endif // endif 0 - /* * Set TCP connection timeout per-socket level. * ref [https://github.com/libuv/help/issues/54] @@ -1132,7 +412,7 @@ int32_t taosCreateSocketWithTimeout(uint32_t timeout) { terrno = TAOS_SYSTEM_ERROR(errno); return terrno; } - + #if defined(WINDOWS) if (0 != setsockopt(fd, IPPROTO_TCP, TCP_MAXRT, (char *)&timeout, sizeof(timeout))) { taosCloseSocketNoCheck1(fd); From 9f0686f35a58e9a795b8dec0a500073e95fdfa51 Mon Sep 17 00:00:00 2001 From: charles Date: Thu, 26 Sep 2024 13:34:11 +0800 Subject: [PATCH 58/62] add CI test case for ts-5111 by charles --- tests/army/cluster/test_drop_table_by_uid.py | 368 +++++++++++++++++++ tests/parallel_test/cases.task | 1 + 2 files changed, 369 insertions(+) create mode 100644 tests/army/cluster/test_drop_table_by_uid.py diff --git a/tests/army/cluster/test_drop_table_by_uid.py b/tests/army/cluster/test_drop_table_by_uid.py new file mode 100644 index 0000000000..f09006b37b --- /dev/null +++ b/tests/army/cluster/test_drop_table_by_uid.py @@ -0,0 +1,368 @@ +import time +import random +import taos +from enum import Enum + +from frame.log import * +from frame.cases import * +from frame.sql import * +from frame.caseBase import * +from frame import * +from frame.srvCtl import * + + +class TDTestCase(TBase): + """ + Description: This class is used to verify the feature of 'drop table by uid' for task TS-5111 + FS: https://taosdata.feishu.cn/wiki/JgeDwZkH3iTNv2ksVkWcHenKnTf + TS: https://taosdata.feishu.cn/wiki/DX3FwopwGiXCeRkBNXFcj0MBnnb + create: + 2024-09-23 created by Charles + update: + None + """ + + class TableType(Enum): + STABLE = 0 + CHILD_TABLE = 1 + REGULAR_TABLE = 2 + + def init(self, conn, logSql, replicaVar=1): + """Initialize the TDengine cluster environment + """ + super(TDTestCase, self).init(conn, logSql, replicaVar, db="db") + tdSql.init(conn.cursor(), logSql) + + def get_uid_by_db_table_name(self, db_name, table_name, table_type=TableType.STABLE): + """Get table uid with db name and table name from system table + :param db_name: database name + :param table_name: table name + :param table_type: table type, default is stable + :return: table uid + """ + if table_type == self.TableType.STABLE: + tdSql.query(f"select * from information_schema.ins_stables where db_name='{db_name}' and stable_name like '%{table_name}%';") + elif table_type == self.TableType.CHILD_TABLE: + tdSql.query(f"select * from information_schema.ins_tables where db_name='{db_name}' and table_name like '%{table_name}%' and stable_name is not null;") + else: + tdSql.query(f"select * from information_schema.ins_tables where db_name='{db_name}' and table_name like '%{table_name}%' and stable_name is null;") + # check whether the table uid is empty + if len(tdSql.res) == 0: + tdLog.debug(f"Can't get table uid with db name: {db_name} and table name: {table_name}") + return None + # get table uid list + if table_type == self.TableType.STABLE: + return [item[10] for item in tdSql.res] + else: + return [item[5] for item in tdSql.res] + + def get_uid_by_db_name(self, db_name, table_type=TableType.STABLE): + """Get table uid with db name and table type from system table + :param db_name: database name + :param table_type: table type, default is stable + :return: table uid list + """ + if table_type == self.TableType.STABLE: + tdSql.query(f"select * from information_schema.ins_stables where db_name='{db_name}';") + elif table_type == self.TableType.CHILD_TABLE: + tdSql.query(f"select * from information_schema.ins_tables where db_name='{db_name}' and stable_name is not null;") + else: + tdSql.query(f"select * from information_schema.ins_tables where db_name='{db_name}' and stable_name is null;") + # check whether the table uid is empty + if len(tdSql.res) == 0: + tdLog.debug(f"Can't get table uid with db name: {db_name}") + return None + # get table uid list + if table_type == self.TableType.STABLE: + return [item[10] for item in tdSql.res] + else: + return [item[5] for item in tdSql.res] + + def drop_table_by_uid(self, uid_list, table_type=TableType.STABLE, exist_ops=False): + """Drop the specified tables by uid list + :db_name: database name + :param uid_list: table uid list to be dropped + :param exist_ops: whether to use exist option, default is False + :return: None + """ + # check whether the uid list is empty + if len(uid_list) == 0: + return + # drop table by uid + if exist_ops and table_type == self.TableType.STABLE: + for uid in uid_list: + tdSql.execute(f"drop stable with if exists `{uid}`;") + else: + uids = ','.join(["`" + str(item) + "`" for item in uid_list]) + tdSql.execute(f"drop table with {uids};") + + def test_drop_single_table_by_uid(self): + """Verify the feature of dropping a single stable/child table/regular table by uid with root user + """ + db_name = "test_drop_single_table_by_uid" + tdLog.info("Start test case: test_drop_single_table_by_uid") + # data for case test_drop_single_table_by_uid + tdLog.info("Prepare data for test case test_drop_single_table_by_uid") + tdSql.execute(f"create database {db_name};") + tdSql.execute(f"use {db_name};") + # table with normal characters + tdSql.execute("create stable st1 (ts timestamp, c1 int) tags (t1 int);") + tdSql.execute("create table ct1_1 using st1 tags(1);") + tdSql.execute("create table t1 (ts timestamp, c1 int, c2 float);") + tdLog.info("Finish preparing data for test case test_drop_single_table_by_uid of normal characters") + # get table uid + uid_st1 = self.get_uid_by_db_table_name(db_name, "st1") + tdLog.debug(f"uid_st1: {uid_st1}") + uid_ct1_1 = self.get_uid_by_db_table_name(db_name, "ct1_1", self.TableType.CHILD_TABLE) + tdLog.debug(f"uid_ct1_1: {uid_ct1_1}") + uid_t1 = self.get_uid_by_db_table_name(db_name, "t1", self.TableType.REGULAR_TABLE) + tdLog.debug(f"uid_t1: {uid_t1}") + # drop table by uid + self.drop_table_by_uid(uid_t1, self.TableType.REGULAR_TABLE) + self.drop_table_by_uid(uid_ct1_1, self.TableType.CHILD_TABLE) + self.drop_table_by_uid(uid_st1, self.TableType.STABLE, True) + + # table with special characters + tdSql.execute("create stable `st2\u00bf\u200bfnn1` (ts timestamp, c1 int) tags (t1 int);") + tdSql.execute("create table `ct2_1\u00cf\u00ff` using `st2\u00bf\u200bfnn1` tags(1);") + tdSql.execute("create table `t2\u00ef\u00fa` (ts timestamp, c1 int, c2 float);") + tdLog.info("Finish preparing data for test case test_drop_single_table_by_uid of special characters") + # get table uid + uid_st2 = self.get_uid_by_db_table_name(db_name, "st2") + tdLog.debug(f"uid_st2: {uid_st2}") + uid_ct2_1 = self.get_uid_by_db_table_name(db_name, "ct2_1", self.TableType.CHILD_TABLE) + tdLog.debug(f"uid_ct2_1: {uid_ct2_1}") + uid_t2 = self.get_uid_by_db_table_name(db_name, "t2", self.TableType.REGULAR_TABLE) + tdLog.debug(f"uid_t2: {uid_t2}") + # drop table by uid + self.drop_table_by_uid(uid_t2, self.TableType.REGULAR_TABLE) + self.drop_table_by_uid(uid_ct2_1, self.TableType.CHILD_TABLE) + self.drop_table_by_uid(uid_st2, self.TableType.STABLE, True) + tdSql.execute(f"drop database {db_name};") + tdLog.info("Finish test case: test_drop_single_table_by_uid") + + def test_drop_multiple_tables_by_uid(self): + """Verify the feature of dropping multiple tables by uid with root user + """ + db_name = "test_drop_multiple_tables_by_uid" + table_number = 100 + tdLog.info("Start test case: test_drop_multiple_tables_by_uid") + # data for case test_drop_multiple_tables_by_uid + tdLog.info("Prepare data for test case test_drop_multiple_tables_by_uid") + tdSql.execute(f"create database {db_name};") + tdSql.execute(f"use {db_name};") + # table with normal characters + for i in range(table_number): + tdSql.execute(f"create stable st{i} (ts timestamp, c1 int) tags (t1 int);") + tdSql.execute(f"create table ct{i}_{i} using st{i} tags({i+1});") + tdSql.execute(f"create table t{i} (ts timestamp, c1 int, c2 float);") + tdLog.info("Finish preparing data for test case test_drop_multiple_tables_by_uid of normal characters") + # get table uid + uid_st = self.get_uid_by_db_table_name(db_name, "st") + # tdLog.debug(f"Get multiple stable uid list: {uid_st}") + uid_ct = self.get_uid_by_db_table_name(db_name, "ct", self.TableType.CHILD_TABLE) + # tdLog.debug(f"Get multiple child table uid list: {uid_ct}") + uid_t = self.get_uid_by_db_table_name(db_name, "t", self.TableType.REGULAR_TABLE) + # tdLog.debug(f"Get multiple regular table uid list: {uid_t}") + # drop table by uid + self.drop_table_by_uid(uid_t, self.TableType.REGULAR_TABLE) + self.drop_table_by_uid(uid_ct, self.TableType.CHILD_TABLE) + self.drop_table_by_uid(uid_st, self.TableType.STABLE, True) + + # table with special characters + for i in range(table_number): + tdSql.execute(f"create stable `st{i}\u00bf\u200bfnn1` (ts timestamp, c1 int) tags (t1 int);") + tdSql.execute(f"create table `ct{i}_{i}\u00cf\u00ff` using `st{i}\u00bf\u200bfnn1` tags(1);") + tdSql.execute(f"create table `t{i}\u00ef\u00fa` (ts timestamp, c1 int, c2 float);") + # get table uid + uid_st = self.get_uid_by_db_table_name(db_name, "st") + # tdLog.debug(f"Get multiple stable uid list: {uid_st}") + uid_ct = self.get_uid_by_db_table_name(db_name, "ct", self.TableType.CHILD_TABLE) + # tdLog.debug(f"Get multiple child table uid list: {uid_ct}") + uid_t = self.get_uid_by_db_table_name(db_name, "t", self.TableType.REGULAR_TABLE) + # tdLog.debug(f"Get multiple regular table uid list: {uid_t}") + # drop table by uid + self.drop_table_by_uid(uid_t, self.TableType.REGULAR_TABLE) + self.drop_table_by_uid(uid_ct, self.TableType.CHILD_TABLE) + self.drop_table_by_uid(uid_st, self.TableType.STABLE, True) + tdSql.execute(f"drop database {db_name};") + tdLog.info("Finish test case: test_drop_multiple_tables_by_uid") + + def test_uid_as_table_name(self): + """Verify using uid as table name, drop table with uid doesn't affect other tables + """ + db_name = "test_uid_as_table_name" + tdLog.info("Start test case: test_uid_as_table_name") + # data for case test_uid_as_table_name + tdLog.info("Prepare data for test case test_uid_as_table_name") + tdSql.execute(f"create database {db_name};") + tdSql.execute(f"use {db_name};") + # super table + tdSql.execute(f"create stable `st1\u00bf\u200bfnn1` (ts timestamp, c1 int) tags (t1 int);") + uid_st = self.get_uid_by_db_table_name(db_name, "st") + tdSql.execute(f"create stable `{uid_st[0]}` (ts timestamp, c1 int) tags (t1 int);") + self.drop_table_by_uid(uid_st, self.TableType.STABLE, True) + uid_st = self.get_uid_by_db_table_name(db_name, str(uid_st[0])) + assert uid_st is not None + tdLog.info(f"Drop stable with special characters with uid {uid_st[0]}, stable named as {uid_st[0]} doesn't be affected") + # child table + tdSql.execute(f"create stable `st2\u00bf\u200bfnn1` (ts timestamp, c1 int) tags (t1 int);") + tdSql.execute(f"create table `ct2_1\u00cf\u00ff` using `st2\u00bf\u200bfnn1` tags(1);") + uid_ct = self.get_uid_by_db_table_name(db_name, "ct", self.TableType.CHILD_TABLE) + tdSql.execute(f"create table `{uid_ct[0]}` using `st2\u00bf\u200bfnn1` tags(2);") + self.drop_table_by_uid(uid_ct, self.TableType.CHILD_TABLE) + uid_ct = self.get_uid_by_db_table_name(db_name, str(uid_ct[0]), self.TableType.CHILD_TABLE) + assert uid_ct is not None + tdLog.info(f"Drop child table with special characters with uid {uid_ct[0]}, child table named as {uid_ct[0]} doesn't be affected") + # regular table + tdSql.execute(f"create table `t2\u00bf\u200bfnn1` (ts timestamp, c1 int);") + uid_t = self.get_uid_by_db_table_name(db_name, "t2", self.TableType.REGULAR_TABLE) + tdSql.execute(f"create table `{uid_t[0]}` (ts timestamp, c1 int);") + self.drop_table_by_uid(uid_t, self.TableType.REGULAR_TABLE) + uid_t = self.get_uid_by_db_table_name(db_name, str(uid_t[0]), self.TableType.REGULAR_TABLE) + assert uid_t is not None + tdLog.info(f"Drop regular table with special characters with uid {uid_t[0]}, regular table named as {uid_t[0]} doesn't be affected") + tdSql.execute(f"drop database {db_name};") + tdLog.info("Finish test case: test_uid_as_table_name") + + def test_abnormal_non_exist_uid(self): + """Verify dropping table with non-exist uid + """ + db_name = "test_abnormal_non_exist_uid" + tdLog.info("Start test case: test_abnormal_non_exist_uid") + # data for case test_abnormal_non_exist_uid + tdLog.info("Prepare data for test case test_abnormal_non_exist_uid") + tdSql.execute(f"create database {db_name};") + tdSql.execute(f"use {db_name};") + # drop table with non-exist uid + tdSql.error(f"drop stable with if exists `1234567890`;", expectErrInfo="STable not exist:") + tdSql.error(f"drop table with `1234567890`;", expectErrInfo="Table does not exist:") + tdSql.execute(f"drop database {db_name};") + tdLog.info("Finish test case: test_abnormal_non_exist_uid") + + def test_abnormal_incorrect_table_type(self): + """Verify dropping table with incorrect sql, like drop stable sql with table or child table uid + """ + try: + db_name = "test_abnormal_incorrect_table_type" + tdLog.info("Start test case: test_abnormal_incorrect_table_type") + # data for case test_abnormal_incorrect_table_type + tdLog.info("Prepare data for test case test_abnormal_incorrect_table_type") + tdSql.execute(f"create database {db_name};") + tdSql.execute(f"use {db_name};") + tdSql.execute("create stable `st3\u00bf\u200bfnn1` (ts timestamp, c1 int) tags (t1 int);") + tdSql.execute("create table `ct3_1\u00cf\u00ff` using `st3\u00bf\u200bfnn1` tags(1);") + tdSql.execute("create table `t3\u00ef\u00fa` (ts timestamp, c1 int, c2 float);") + tdLog.info("Finish preparing data for test case test_abnormal_incorrect_table_type of special characters") + # get table uid + uid_st = self.get_uid_by_db_table_name(db_name, "st") + uid_ct = self.get_uid_by_db_table_name(db_name, "ct", self.TableType.CHILD_TABLE) + uid_t = self.get_uid_by_db_table_name(db_name, "t", self.TableType.REGULAR_TABLE) + # drop table with incorrect sql + tdSql.error(f"drop stable with `{uid_ct[0]}`;", expectErrInfo="STable not exist") + tdSql.error(f"drop stable with `{uid_t[0]}`;", expectErrInfo="STable not exist") + tdLog.info("Finish test case: test_abnormal_incorrect_table_type") + except Exception as e: + tdLog.exit("Failed to run test case test_abnormal_incorrect_table_type with msg: %s" % str(e)) + finally: + tdSql.execute(f"drop database {db_name};") + + def test_abnormal_mixed_uid(self): + """Verify dropping table with mixed uid + """ + db_name = "test_abnormal_mixed_uid" + tdLog.info("Start test case: test_abnormal_mixed_uid") + # data for case test_abnormal_mixed_uidF + tdLog.info("Prepare data for test case test_abnormal_mixed_uid") + tdSql.execute(f"create database {db_name};") + tdSql.execute(f"use {db_name};") + tdSql.execute("create stable `st3\u00bf\u200bfnn1` (ts timestamp, c1 int) tags (t1 int);") + tdSql.execute("create table `ct3_1\u00cf\u00ff` using `st3\u00bf\u200bfnn1` tags(1);") + tdSql.execute("create table `t3\u00ef\u00fa` (ts timestamp, c1 int, c2 float);") + tdLog.info("Finish preparing data for test case test_abnormal_mixed_uid of special characters") + # get table uid + uid_st = self.get_uid_by_db_table_name(db_name, "st") + uid_ct = self.get_uid_by_db_table_name(db_name, "ct", self.TableType.CHILD_TABLE) + uid_t = self.get_uid_by_db_table_name(db_name, "t", self.TableType.REGULAR_TABLE) + # drop table with incorrect sql + tdSql.error(f"drop stable with `{uid_st[0]}`,`{uid_ct[0]}`;", expectErrInfo="syntax error") + tdSql.error(f"drop table with `{uid_st[0]}`,`{uid_ct[0]}`,`{uid_t[0]}`;", expectErrInfo="Cannot drop super table in batch") + tdSql.execute(f"drop database {db_name};") + tdLog.info("Finish test case: test_abnormal_mixed_uid") + + def test_abnormal_system_tables(self): + """Verify dropping system tables + """ + try: + uid_list = self.get_uid_by_db_name("information_schema", self.TableType.REGULAR_TABLE) + uid = random.choice(uid_list) + assert uid is None + except Exception as e: + tdLog.exit("Failed to run test case test_abnormal_system_tables with msg: %s" % str(e)) + + def test_abnormal_drop_table_with_non_root_user(self): + """Verify dropping table with non-root user + """ + try: + # create new user and grant create database priviledge + tdSql.execute("create user test pass 'test';") + tdSql.execute("alter user test createdb 1;") + conn = taos.connect(user="test", password="test") + cursor = conn.cursor() + # create database and tables with new user + tdLog.info("Prepare data for test case test_abnormal_drop_table_with_non_root_user") + db_name = "test_abnormal_drop_table_with_non_root_user" + cursor.execute(f"create database {db_name};") + cursor.execute(f"use {db_name};") + time.sleep(3) + cursor.execute("create stable `st4\u00bf\u200bfnn1` (ts timestamp, c1 int) tags (t1 int);") + cursor.execute("create table `ct4_1\u00cf\u00ff` using `st4\u00bf\u200bfnn1` tags(1);") + cursor.execute("create table `t4\u00ef\u00fa` (ts timestamp, c1 int, c2 float);") + tdLog.info("Finish preparing data for test case test_abnormal_drop_table_with_non_root_user of special characters") + # get table uid + uid_st = self.get_uid_by_db_table_name(db_name, "st") + uid_ct = self.get_uid_by_db_table_name(db_name, "ct", self.TableType.CHILD_TABLE) + uid_t = self.get_uid_by_db_table_name(db_name, "t", self.TableType.REGULAR_TABLE) + # drop stable with sql by non-root user + try: + cursor.execute(f"drop stable with `{uid_st[0]}`;") + except Exception as e: + assert "Permission denied or target object not exist" in str(e) + tdLog.info("Drop stable with non-root user failed as expected") + # drop child table with sql by non-root user + try: + cursor.execute(f"drop table with `{uid_ct[0]}`;") + except Exception as e: + assert "Permission denied or target object not exist" in str(e) + tdLog.info("Drop child table with non-root user failed as expected") + # drop regular table with sql by non-root user + try: + cursor.execute(f"drop table with `{uid_t[0]}`;") + except Exception as e: + assert "Permission denied or target object not exist" in str(e) + tdLog.info("Drop regular table with non-root user failed as expected") + tdLog.info("Finish test case: test_abnormal_drop_table_with_non_root_user") + except Exception as e: + tdLog.exit("Failed to run test case test_abnormal_drop_table_with_non_root_user with msg: %s" % str(e)) + finally: + tdSql.execute(f"drop database {db_name};") + tdSql.execute("drop user test;") + + def run(self): + # normal cases + self.test_drop_single_table_by_uid() + self.test_drop_multiple_tables_by_uid() + self.test_uid_as_table_name() + # abnormal cases + self.test_abnormal_non_exist_uid() + self.test_abnormal_incorrect_table_type() + self.test_abnormal_mixed_uid() + self.test_abnormal_system_tables() + self.test_abnormal_drop_table_with_non_root_user() + + def stop(self): + tdSql.close() + tdLog.success(f"{__file__} successfully executed") + +tdCases.addLinux(__file__, TDTestCase()) +tdCases.addWindows(__file__, TDTestCase()) diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index 602ac9ad66..9921588a77 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -23,6 +23,7 @@ ,,y,army,./pytest.sh python3 ./test.py -f insert/test_column_tag_boundary.py ,,y,army,./pytest.sh python3 ./test.py -f query/fill/fill_desc.py -N 3 -L 3 -D 2 ,,y,army,./pytest.sh python3 ./test.py -f query/fill/fill_null.py +,,y,army,./pytest.sh python3 ./test.py -f cluster/test_drop_table_by_uid.py -N 3 ,,y,army,./pytest.sh python3 ./test.py -f cluster/incSnapshot.py -N 3 ,,y,army,./pytest.sh python3 ./test.py -f cluster/clusterBasic.py -N 5 ,,y,army,./pytest.sh python3 ./test.py -f query/query_basic.py -N 3 From 7d8857d2575d711961abdb2df44712a23b804ce5 Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 26 Sep 2024 06:12:54 +0000 Subject: [PATCH 59/62] fix/check-memalloc-result --- source/dnode/mnode/impl/src/mndDb.c | 4 ++++ source/dnode/mnode/impl/src/mndFunc.c | 20 ++++++++++++++++++++ source/dnode/mnode/impl/src/mndMnode.c | 16 ++++++++++++++++ source/dnode/mnode/impl/src/mndStb.c | 10 ++++++++++ 4 files changed, 50 insertions(+) diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index 374dff8d0c..0403029f74 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -2281,6 +2281,10 @@ static void mndDumpDbInfoData(SMnode *pMnode, SSDataBlock *pBlock, SDbObj *pDb, int32_t cols = 0; int32_t bytes = pShow->pMeta->pSchemas[cols].bytes; char *buf = taosMemoryMalloc(bytes); + if (buf == NULL) { + mError("db:%s, failed to malloc buffer", pDb->name); + return; + } int32_t code = 0; int32_t lino = 0; diff --git a/source/dnode/mnode/impl/src/mndFunc.c b/source/dnode/mnode/impl/src/mndFunc.c index 4c5a695402..db4d842662 100644 --- a/source/dnode/mnode/impl/src/mndFunc.c +++ b/source/dnode/mnode/impl/src/mndFunc.c @@ -184,6 +184,7 @@ static int32_t mndFuncActionDelete(SSdb *pSdb, SFuncObj *pFunc) { } static int32_t mndFuncActionUpdate(SSdb *pSdb, SFuncObj *pOld, SFuncObj *pNew) { + int32_t code = 0; mTrace("func:%s, perform update action, old row:%p new row:%p", pOld->name, pOld, pNew); taosWLockLatch(&pOld->lock); @@ -205,6 +206,11 @@ static int32_t mndFuncActionUpdate(SSdb *pSdb, SFuncObj *pOld, SFuncObj *pNew) { if (pNew->commentSize > 0 && pNew->pComment != NULL) { pOld->commentSize = pNew->commentSize; pOld->pComment = taosMemoryMalloc(pOld->commentSize); + if (pOld->pComment == NULL) { + code = terrno; + taosWUnLockLatch(&pOld->lock); + return code; + } (void)memcpy(pOld->pComment, pNew->pComment, pOld->commentSize); } @@ -215,6 +221,11 @@ static int32_t mndFuncActionUpdate(SSdb *pSdb, SFuncObj *pOld, SFuncObj *pNew) { if (pNew->codeSize > 0 && pNew->pCode != NULL) { pOld->codeSize = pNew->codeSize; pOld->pCode = taosMemoryMalloc(pOld->codeSize); + if (pOld->pCode == NULL) { + code = terrno; + taosWUnLockLatch(&pOld->lock); + return code; + } (void)memcpy(pOld->pCode, pNew->pCode, pOld->codeSize); } @@ -261,6 +272,10 @@ static int32_t mndCreateFunc(SMnode *pMnode, SRpcMsg *pReq, SCreateFuncReq *pCre if (NULL != pCreate->pComment) { func.commentSize = strlen(pCreate->pComment) + 1; func.pComment = taosMemoryMalloc(func.commentSize); + if (func.pComment == NULL) { + code = terrno; + goto _OVER; + } } func.codeSize = pCreate->codeLen; func.pCode = taosMemoryMalloc(func.codeSize); @@ -716,6 +731,11 @@ static int32_t mndRetrieveFuncs(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl ? TSDB_MAX_BINARY_LEN : pFunc->codeSize + VARSTR_HEADER_SIZE; char *b4 = taosMemoryMalloc(varCodeLen); + if (b4 == NULL) { + code = terrno; + sdbRelease(pSdb, pFunc); + TAOS_RETURN(code); + } (void)memcpy(varDataVal(b4), pFunc->pCode, varCodeLen - VARSTR_HEADER_SIZE); varDataSetLen(b4, varCodeLen - VARSTR_HEADER_SIZE); code = colDataSetVal(pColInfo, numOfRows, (const char *)b4, false); diff --git a/source/dnode/mnode/impl/src/mndMnode.c b/source/dnode/mnode/impl/src/mndMnode.c index c00c88c4f9..6b1c97b399 100644 --- a/source/dnode/mnode/impl/src/mndMnode.c +++ b/source/dnode/mnode/impl/src/mndMnode.c @@ -343,6 +343,10 @@ static int32_t mndBuildCreateMnodeRedoAction(STrans *pTrans, SDCreateMnodeReq *p int32_t code = 0; int32_t contLen = tSerializeSDCreateMnodeReq(NULL, 0, pCreateReq); void *pReq = taosMemoryMalloc(contLen); + if (pReq == NULL) { + code = terrno; + return code; + } code = tSerializeSDCreateMnodeReq(pReq, contLen, pCreateReq); if (code < 0) { taosMemoryFree(pReq); @@ -369,6 +373,10 @@ static int32_t mndBuildAlterMnodeTypeRedoAction(STrans *pTrans, SDAlterMnodeType int32_t code = 0; int32_t contLen = tSerializeSDCreateMnodeReq(NULL, 0, pAlterMnodeTypeReq); void *pReq = taosMemoryMalloc(contLen); + if (pReq == NULL) { + code = terrno; + return code; + } code = tSerializeSDCreateMnodeReq(pReq, contLen, pAlterMnodeTypeReq); if (code < 0) { taosMemoryFree(pReq); @@ -395,6 +403,10 @@ static int32_t mndBuildAlterMnodeRedoAction(STrans *pTrans, SDCreateMnodeReq *pA int32_t code = 0; int32_t contLen = tSerializeSDCreateMnodeReq(NULL, 0, pAlterReq); void *pReq = taosMemoryMalloc(contLen); + if (pReq == NULL) { + code = terrno; + return code; + } code = tSerializeSDCreateMnodeReq(pReq, contLen, pAlterReq); if (code < 0) { taosMemoryFree(pReq); @@ -420,6 +432,10 @@ static int32_t mndBuildDropMnodeRedoAction(STrans *pTrans, SDDropMnodeReq *pDrop int32_t code = 0; int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, pDropReq); void *pReq = taosMemoryMalloc(contLen); + if (pReq == NULL) { + code = terrno; + return code; + } code = tSerializeSCreateDropMQSNodeReq(pReq, contLen, pDropReq); if (code < 0) { taosMemoryFree(pReq); diff --git a/source/dnode/mnode/impl/src/mndStb.c b/source/dnode/mnode/impl/src/mndStb.c index fa9e4fa8fa..56461e9cfd 100644 --- a/source/dnode/mnode/impl/src/mndStb.c +++ b/source/dnode/mnode/impl/src/mndStb.c @@ -2352,6 +2352,11 @@ static int32_t mndBuildSMAlterStbRsp(SDbObj *pDb, SStbObj *pObj, void **pCont, i } void *cont = taosMemoryMalloc(contLen); + if (NULL == cont) { + code = terrno; + tFreeSMAlterStbRsp(&alterRsp); + TAOS_RETURN(code); + } tEncoderInit(&ec, cont, contLen); code = tEncodeSMAlterStbRsp(&ec, &alterRsp); tEncoderClear(&ec); @@ -2407,6 +2412,11 @@ int32_t mndBuildSMCreateStbRsp(SMnode *pMnode, char *dbFName, char *stbFName, vo } void *cont = taosMemoryMalloc(contLen); + if (NULL == cont) { + code = terrno; + tFreeSMCreateStbRsp(&stbRsp); + goto _OVER; + } tEncoderInit(&ec, cont, contLen); TAOS_CHECK_GOTO(tEncodeSMCreateStbRsp(&ec, &stbRsp), NULL, _OVER); tEncoderClear(&ec); From dfd4fcbf6623ef493e656fe1acedb479b4d7fdc9 Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 26 Sep 2024 06:19:20 +0000 Subject: [PATCH 60/62] fix/check-memalloc-result --- source/dnode/mnode/impl/src/mndTrans.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 623400869e..3e77a208ba 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -367,6 +367,7 @@ SSdbRow *mndTransDecode(SSdbRaw *pRaw) { SDB_GET_INT32(pRaw, dataPos, &pTrans->paramLen, _OVER) if (pTrans->paramLen != 0) { pTrans->param = taosMemoryMalloc(pTrans->paramLen); + if (pTrans->param == NULL) goto _OVER; SDB_GET_BINARY(pRaw, dataPos, pTrans->param, pTrans->paramLen, _OVER); } From 9f28140fc5842d3c4530e991d8990dfb0018b3bd Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 26 Sep 2024 06:59:41 +0000 Subject: [PATCH 61/62] fix/check-memalloc-result --- .../libs/monitorfw/src/taos_metric_formatter_custom.c | 11 +++++++++++ source/libs/monitorfw/src/taos_monitor_util.c | 1 + 2 files changed, 12 insertions(+) diff --git a/source/libs/monitorfw/src/taos_metric_formatter_custom.c b/source/libs/monitorfw/src/taos_metric_formatter_custom.c index 6e7ded62bb..5c384c0421 100644 --- a/source/libs/monitorfw/src/taos_metric_formatter_custom.c +++ b/source/libs/monitorfw/src/taos_metric_formatter_custom.c @@ -40,16 +40,26 @@ int taos_metric_formatter_load_sample_new(taos_metric_formatter_t *self, taos_me int32_t len = end -start; char* keyvalues = taosMemoryMalloc(len); + if (keyvalues == NULL) return 1; memset(keyvalues, 0, len); memcpy(keyvalues, start + 1, len - 1); int32_t count = taos_monitor_count_occurrences(keyvalues, ","); char** keyvalue = taosMemoryMalloc(sizeof(char*) * (count + 1)); + if (keyvalue == NULL) { + taosMemoryFreeClear(keyvalues); + return 1; + } memset(keyvalue, 0, sizeof(char*) * (count + 1)); taos_monitor_split_str(keyvalue, keyvalues, ","); char** arr = taosMemoryMalloc(sizeof(char*) * (count + 1) * 2); + if (arr == NULL) { + taosMemoryFreeClear(keyvalue); + taosMemoryFreeClear(keyvalues); + return 1; + } memset(arr, 0, sizeof(char*) * (count + 1) * 2); bool isfound = true; @@ -165,6 +175,7 @@ int taos_metric_formatter_load_metric_new(taos_metric_formatter_t *self, taos_me int32_t size = strlen(metric->name); char* name = taosMemoryMalloc(size + 1); + if (name == NULL) return 1; memset(name, 0, size + 1); memcpy(name, metric->name, size); char* arr[2] = {0}; //arr[0] is table name, arr[1] is metric name diff --git a/source/libs/monitorfw/src/taos_monitor_util.c b/source/libs/monitorfw/src/taos_monitor_util.c index 06ae4993c5..b0eff27507 100644 --- a/source/libs/monitorfw/src/taos_monitor_util.c +++ b/source/libs/monitorfw/src/taos_monitor_util.c @@ -37,6 +37,7 @@ void taos_monitor_split_str(char** arr, char* str, const char* del) { void taos_monitor_split_str_metric(char** arr, taos_metric_t* metric, const char* del, char** buf) { int32_t size = strlen(metric->name); char* name = taosMemoryMalloc(size + 1); + if (name == NULL) return; memset(name, 0, size + 1); memcpy(name, metric->name, size); From 4bf368fe4a767b4bf2168c670b3e3ab9d55dc129 Mon Sep 17 00:00:00 2001 From: Linhe Huo Date: Thu, 26 Sep 2024 15:00:26 +0800 Subject: [PATCH 62/62] docs(datain:kafka): improve documents for kafka sasl auth Close [TD-32325](https://jira.taosdata.com:18080/browse/TD-32325) --- docs/zh/06-advanced/05-data-in/08-kafka.md | 44 +++++++++++++++++- .../05-data-in/kafka-04-sasl-gssapi.png | Bin 0 -> 44365 bytes .../05-data-in/kafka-04-sasl-plain.png | Bin 0 -> 20354 bytes 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 docs/zh/06-advanced/05-data-in/kafka-04-sasl-gssapi.png create mode 100644 docs/zh/06-advanced/05-data-in/kafka-04-sasl-plain.png diff --git a/docs/zh/06-advanced/05-data-in/08-kafka.md b/docs/zh/06-advanced/05-data-in/08-kafka.md index e05c205f6e..837aa8d8fb 100644 --- a/docs/zh/06-advanced/05-data-in/08-kafka.md +++ b/docs/zh/06-advanced/05-data-in/08-kafka.md @@ -44,8 +44,50 @@ TDengine 可以高效地从 Kafka 读取数据并将其写入 TDengine,以实 如果服务端开启了 SASL 认证机制,此处需要启用 SASL 并配置相关内容,目前支持 PLAIN/SCRAM-SHA-256/GSSAPI 三种认证机制,请按实际情况进行选择。 +#### 4.1. PLAIN 认证 + +选择 `PLAIN` 认证机制,输入用户名和密码: + +![kafka-04-sasl-plain.png](./kafka-04-sasl-plain.png) + +#### 4.1. SCRAM(SCRAM-SHA-256) 认证 + +选择 `SCRAM-SHA-256` 认证机制,输入用户名和密码: + ![kafka-04.png](./kafka-04.png) +#### 4.3. GSSAPI 认证 + +选择 `GSSAPI` ,将通过 [RDkafka 客户端](https://github.com/confluentinc/librdkafka) 调用 GSSAPI 应用 Kerberos 认证机制: + +![kafka-04-sasl-gssapi.png](./kafka-04-sasl-gssapi.png) + +需要输入的信息有: + +- Kerberos 服务名,一般是 `kafka`; +- Kerberos 认证主体,即认证用户名,例如 `kafkaclient`; +- Kerberos 初始化命令(可选,一般不用填写); +- Kerberos 密钥表,需提供文件并上传; + +以上信息均需由 Kafka 服务管理者提供。 + +除此之外,在服务器上需要配置 [Kerberos](https://web.mit.edu/kerberos/) 认证服务。在 Ubuntu 下使用 `apt install krb5-user` ;在 CentOS 下,使用 `yum install krb5-workstation`;即可。 + +配置完成后,可以使用 [kcat](https://github.com/edenhill/kcat) 工具进行 Kafka 主题消费验证: + +```bash +kcat \ + -b \ + -G kcat \ + -X security.protocol=SASL_PLAINTEXT \ + -X sasl.mechanism=GSSAPI \ + -X sasl.kerberos.keytab= \ + -X sasl.kerberos.principal= \ + -X sasl.kerberos.service.name=kafka +``` + +如果出现错误:“Server xxxx not found in kerberos database”,则需要配置 Kafka 节点对应的域名并在 Kerberos 客户端配置文件 `/etc/krb5.conf` 中配置反向域名解析 `rdns = true`。 + ### 5. 配置 SSL 证书 如果服务端开启了 SSL 加密认证,此处需要启用 SSL 并配置相关内容。 @@ -160,4 +202,4 @@ json 数据支持 JSONObject 或者 JSONArray,使用 json 解析器可以解 ### 9. 创建完成 -点击 **提交** 按钮,完成创建 Kafka 到 TDengine 的数据同步任务,回到**数据源列表**页面可查看任务执行情况。 \ No newline at end of file +点击 **提交** 按钮,完成创建 Kafka 到 TDengine 的数据同步任务,回到**数据源列表**页面可查看任务执行情况。 diff --git a/docs/zh/06-advanced/05-data-in/kafka-04-sasl-gssapi.png b/docs/zh/06-advanced/05-data-in/kafka-04-sasl-gssapi.png new file mode 100644 index 0000000000000000000000000000000000000000..051efda8abfcd1750e388a3e9d02c6a1e7b57c10 GIT binary patch literal 44365 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 UF!zfD@N7K>Pgg&ebxsLQ0DkcaJOBUy literal 0 HcmV?d00001