From a8dc0a9cb2f03eb3dd602fbe999557de74d1b693 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Thu, 27 Oct 2022 10:01:15 +0800 Subject: [PATCH 01/18] fix:add test case for schemaless --- utils/test/c/sml_test.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/utils/test/c/sml_test.c b/utils/test/c/sml_test.c index 83dfa1fc57..40d5bb12d2 100644 --- a/utils/test/c/sml_test.c +++ b/utils/test/c/sml_test.c @@ -1097,18 +1097,12 @@ int sml_time_Test() { pRes = taos_query(taos, "use sml_db"); taos_free_result(pRes); - char* tmp = (char*)taosMemoryCalloc(1024, 1); - memcpy(tmp, sql[0], strlen(sql[0])); - *(char*)(tmp+44) = 0; - int32_t totalRows = 0; - pRes = taos_schemaless_insert_raw(taos, tmp, strlen(sql[0]), &totalRows, TSDB_SML_LINE_PROTOCOL, TSDB_SML_TIMESTAMP_NANO_SECONDS); + pRes = taos_schemaless_insert(taos, (char **)sql, sizeof(sql) / sizeof(sql[0]), TSDB_SML_LINE_PROTOCOL, TSDB_SML_TIMESTAMP_NANO_SECONDS); - ASSERT(totalRows == 3); printf("%s result:%s\n", __FUNCTION__, taos_errstr(pRes)); int code = taos_errno(pRes); taos_free_result(pRes); taos_close(taos); - taosMemoryFree(tmp); return code; } From 9bf3b79420ddfd3536e34af8bef0217bca705762 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Thu, 10 Nov 2022 09:49:34 +0800 Subject: [PATCH 02/18] fix: disable sql log in schemaless if sql is too long --- source/client/src/clientSml.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c index d1aeaac587..4cd1b5416c 100644 --- a/source/client/src/clientSml.c +++ b/source/client/src/clientSml.c @@ -2082,7 +2082,7 @@ static int32_t smlParseJSONString(SSmlHandle *info, cJSON *root, SSmlTableInfo * static int32_t smlParseInfluxLine(SSmlHandle *info, const char *sql, const int len) { SSmlLineInfo elements = {0}; - uDebug("SML:0x%" PRIx64 " smlParseInfluxLine sql:%s, hello", info->id, sql); + uDebug("SML:0x%" PRIx64 " smlParseInfluxLine sql", info->id); int ret = smlParseInfluxString(sql, sql + len, &elements, &info->msgBuf); if (ret != TSDB_CODE_SUCCESS) { From 8a051c001de04a279b326b603632796f71f160c0 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 10 Nov 2022 17:05:13 +0800 Subject: [PATCH 03/18] refact: adjust sync debug codes --- source/libs/sync/inc/syncRequestVote.h | 1 - source/libs/sync/inc/syncRequestVoteReply.h | 1 - source/libs/sync/src/syncRaftStore.c | 1 + source/libs/sync/src/syncReplication.c | 5 +---- source/libs/sync/src/syncRequestVote.c | 2 +- source/libs/sync/src/syncRequestVoteReply.c | 4 +--- 6 files changed, 4 insertions(+), 10 deletions(-) diff --git a/source/libs/sync/inc/syncRequestVote.h b/source/libs/sync/inc/syncRequestVote.h index c51ea4eea6..ae8e3ff1cf 100644 --- a/source/libs/sync/inc/syncRequestVote.h +++ b/source/libs/sync/inc/syncRequestVote.h @@ -21,7 +21,6 @@ extern "C" { #endif #include "syncInt.h" -#include "syncMessage.h" // TLA+ Spec // HandleRequestVoteRequest(i, j, m) == diff --git a/source/libs/sync/inc/syncRequestVoteReply.h b/source/libs/sync/inc/syncRequestVoteReply.h index 1adab30aaa..ea43f0301d 100644 --- a/source/libs/sync/inc/syncRequestVoteReply.h +++ b/source/libs/sync/inc/syncRequestVoteReply.h @@ -21,7 +21,6 @@ extern "C" { #endif #include "syncInt.h" -#include "syncMessage.h" // TLA+ Spec // HandleRequestVoteResponse(i, j, m) == diff --git a/source/libs/sync/src/syncRaftStore.c b/source/libs/sync/src/syncRaftStore.c index dcc4e1f133..1c96e70858 100644 --- a/source/libs/sync/src/syncRaftStore.c +++ b/source/libs/sync/src/syncRaftStore.c @@ -13,6 +13,7 @@ * along with this program. If not, see . */ +#define _DEFAULT_SOURCE #include "syncRaftStore.h" #include "cJSON.h" #include "syncEnv.h" diff --git a/source/libs/sync/src/syncReplication.c b/source/libs/sync/src/syncReplication.c index 3f22a1f2cd..2a3705e139 100644 --- a/source/libs/sync/src/syncReplication.c +++ b/source/libs/sync/src/syncReplication.c @@ -13,14 +13,11 @@ * along with this program. If not, see . */ +#define _DEFAULT_SOURCE #include "syncReplication.h" #include "syncIndexMgr.h" -#include "syncMessage.h" -#include "syncRaftCfg.h" #include "syncRaftEntry.h" -#include "syncRaftLog.h" #include "syncRaftStore.h" -#include "syncSnapshot.h" #include "syncUtil.h" // TLA+ Spec diff --git a/source/libs/sync/src/syncRequestVote.c b/source/libs/sync/src/syncRequestVote.c index 7e2587372b..f2b75def6b 100644 --- a/source/libs/sync/src/syncRequestVote.c +++ b/source/libs/sync/src/syncRequestVote.c @@ -13,8 +13,8 @@ * along with this program. If not, see . */ +#define _DEFAULT_SOURCE #include "syncRequestVote.h" -#include "syncInt.h" #include "syncRaftCfg.h" #include "syncRaftStore.h" #include "syncUtil.h" diff --git a/source/libs/sync/src/syncRequestVoteReply.c b/source/libs/sync/src/syncRequestVoteReply.c index 44efaa068a..02b9bb40ac 100644 --- a/source/libs/sync/src/syncRequestVoteReply.c +++ b/source/libs/sync/src/syncRequestVoteReply.c @@ -13,11 +13,9 @@ * along with this program. If not, see . */ +#define _DEFAULT_SOURCE #include "syncRequestVoteReply.h" -#include "syncInt.h" -#include "syncRaftCfg.h" #include "syncRaftStore.h" -#include "syncUtil.h" #include "syncVoteMgr.h" // TLA+ Spec From 4d09254e93b1b4587c2a20b4952545905b1e1393 Mon Sep 17 00:00:00 2001 From: xiaolei li <85657333+xleili@users.noreply.github.com> Date: Thu, 10 Nov 2022 21:06:20 +0800 Subject: [PATCH 04/18] test(driver):C# CI failed for longarch64 pr-17982 (#18030) * Add loongarch64 architecture port. Signed-off-by: Jingyun Hua * test(driver):C# CI failed for longarch64 pr-17982 Signed-off-by: Jingyun Hua Co-authored-by: Jingyun Hua --- cmake/cmake.platform | 12 ++++++++++++ docs/en/14-reference/09-support-platform/index.md | 2 +- docs/zh/14-reference/09-support-platform/index.md | 2 +- packaging/docker/dockerbuild.sh | 6 +++--- packaging/docker/dockerbuildi.sh | 4 ++-- packaging/release.sh | 8 ++++---- source/os/src/osSysinfo.c | 6 +++++- source/util/src/tcrc32c.c | 10 +++++----- tests/docs-examples-test/csharp.sh | 8 ++++---- 9 files changed, 37 insertions(+), 21 deletions(-) diff --git a/cmake/cmake.platform b/cmake/cmake.platform index 3e239d2e0c..eb8b63b4c2 100644 --- a/cmake/cmake.platform +++ b/cmake/cmake.platform @@ -102,6 +102,12 @@ IF ("${CPUTYPE}" STREQUAL "") SET(TD_ARM_64 TRUE) ADD_DEFINITIONS("-D_TD_ARM_") ADD_DEFINITIONS("-D_TD_ARM_64") + ELSEIF (CMAKE_SYSTEM_PROCESSOR MATCHES "loongarch64") + MESSAGE(STATUS "The current platform is loongarch64") + SET(PLATFORM_ARCH_STR "loongarch64") + SET(TD_LOONGARCH_64 TRUE) + ADD_DEFINITIONS("-D_TD_LOONGARCH_") + ADD_DEFINITIONS("-D_TD_LOONGARCH_64") ENDIF () ELSE () # if generate ARM version: @@ -118,6 +124,12 @@ ELSE () ADD_DEFINITIONS("-D_TD_ARM_") ADD_DEFINITIONS("-D_TD_ARM_64") SET(TD_ARM_64 TRUE) + ELSEIF (${CPUTYPE} MATCHES "loongarch64") + SET(PLATFORM_ARCH_STR "loongarch64") + MESSAGE(STATUS "input cpuType: loongarch64") + SET(TD_LOONGARCH_64 TRUE) + ADD_DEFINITIONS("-D_TD_LOONGARCH_") + ADD_DEFINITIONS("-D_TD_LOONGARCH_64") ELSEIF (${CPUTYPE} MATCHES "mips64") SET(PLATFORM_ARCH_STR "mips") MESSAGE(STATUS "input cpuType: mips64") diff --git a/docs/en/14-reference/09-support-platform/index.md b/docs/en/14-reference/09-support-platform/index.md index fe26860765..061294f016 100644 --- a/docs/en/14-reference/09-support-platform/index.md +++ b/docs/en/14-reference/09-support-platform/index.md @@ -14,7 +14,7 @@ Note: ● means officially tested and verified, ○ means unofficially tested an ## List of supported platforms for TDengine clients and connectors -TDengine's connector can support a wide range of platforms, including X64/X86/ARM64/ARM32/MIPS/Alpha hardware platforms and Linux/Win64/Win32/macOS development environments. +TDengine's connector can support a wide range of platforms, including X64/X86/ARM64/ARM32/MIPS/Alpha/LoongArch64 hardware platforms and Linux/Win64/Win32/macOS development environments. The comparison matrix is as follows. diff --git a/docs/zh/14-reference/09-support-platform/index.md b/docs/zh/14-reference/09-support-platform/index.md index 7292ca4814..500eeeb14c 100644 --- a/docs/zh/14-reference/09-support-platform/index.md +++ b/docs/zh/14-reference/09-support-platform/index.md @@ -16,7 +16,7 @@ description: "TDengine 服务端、客户端和连接器支持的平台列表" ## TDengine 客户端和连接器支持的平台列表 -目前 TDengine 的连接器可支持的平台广泛,目前包括:X64/X86/ARM64/ARM32/MIPS/Alpha 等硬件平台,以及 Linux/Win64/Win32/macOS 等开发环境。 +目前 TDengine 的连接器可支持的平台广泛,目前包括:X64/X86/ARM64/ARM32/MIPS/LoongArch64 等硬件平台,以及 Linux/Win64/Win32/macOS 等开发环境。 对照矩阵如下: diff --git a/packaging/docker/dockerbuild.sh b/packaging/docker/dockerbuild.sh index 4c8f1413aa..b02387a3d1 100755 --- a/packaging/docker/dockerbuild.sh +++ b/packaging/docker/dockerbuild.sh @@ -5,7 +5,7 @@ set -e #set -x # dockerbuild.sh -# -c [aarch32 | aarch64 | amd64 | x86 | mips64 ...] +# -c [aarch32 | aarch64 | amd64 | x86 | mips64 | loongarch64...] # -n [version number] # -p [password for docker hub] # -V [stable | beta] @@ -57,7 +57,7 @@ do dockerLatest=$(echo $OPTARG) ;; h) - echo "Usage: `basename $0` -c [aarch32 | aarch64 | amd64 | x86 | mips64 ...] " + echo "Usage: `basename $0` -c [aarch32 | aarch64 | amd64 | x86 | mips64 | loongarch64...] " echo " -n [version number] " echo " -p [password for docker hub] " echo " -V [stable | beta] " @@ -136,4 +136,4 @@ if [ "$cloudBuild" != "y" ] && [ ${dockerLatest} == 'y' ] ;then docker push tdengine/tdengine-${dockername}:latest fi -rm -f ${pkgFile} \ No newline at end of file +rm -f ${pkgFile} diff --git a/packaging/docker/dockerbuildi.sh b/packaging/docker/dockerbuildi.sh index a0a954e30f..9b7497dc4a 100755 --- a/packaging/docker/dockerbuildi.sh +++ b/packaging/docker/dockerbuildi.sh @@ -5,7 +5,7 @@ set -e #set -x # dockerbuild.sh -# -c [aarch32 | aarch64 | amd64 | x86 | mips64 ...] +# -c [aarch32 | aarch64 | amd64 | x86 | mips64 | loongarch64...] # -n [version number] # -p [password for docker hub] @@ -30,7 +30,7 @@ do passWord=$(echo $OPTARG) ;; h) - echo "Usage: `basename $0` -c [aarch32 | aarch64 | amd64 | x86 | mips64 ...] " + echo "Usage: `basename $0` -c [aarch32 | aarch64 | amd64 | x86 | mips64 | loongarch64...] " echo " -n [version number] " echo " -p [password for docker hub] " exit 0 diff --git a/packaging/release.sh b/packaging/release.sh index f250e667fa..c07331a0df 100755 --- a/packaging/release.sh +++ b/packaging/release.sh @@ -6,7 +6,7 @@ set -e #set -x # release.sh -v [cluster | edge] -# -c [aarch32 | aarch64 | x64 | x86 | mips64 ...] +# -c [aarch32 | aarch64 | x64 | x86 | mips64 | loongarch64...] # -o [Linux | Kylin | Alpine | Raspberrypi | Darwin | Windows | Ningsi60 | Ningsi80 |...] # -V [stable | beta] # -l [full | lite] @@ -19,7 +19,7 @@ set -e # set parameters by default value verMode=edge # [cluster, edge, cloud] verType=stable # [stable, beta] -cpuType=x64 # [aarch32 | aarch64 | x64 | x86 | mips64 ...] +cpuType=x64 # [aarch32 | aarch64 | x64 | x86 | mips64 loongarch64...] osType=Linux # [Linux | Kylin | Alpine | Raspberrypi | Darwin | Windows | Ningsi60 | Ningsi80 |...] pagMode=full # [full | lite] soMode=dynamic # [static | dynamic] @@ -77,7 +77,7 @@ while getopts "hv:V:c:o:l:s:d:a:n:m:H:" arg; do ;; h) echo "Usage: $(basename $0) -v [cluster | edge] " - echo " -c [aarch32 | aarch64 | x64 | x86 | mips64 ...] " + echo " -c [aarch32 | aarch64 | x64 | x86 | mips64 | loongarch64 ...] " echo " -o [Linux | Kylin | Alpine | Raspberrypi | Darwin | Windows | Ningsi60 | Ningsi80 |...] " echo " -V [stable | beta] " echo " -l [full | lite] " @@ -216,7 +216,7 @@ else fi # check support cpu type -if [[ "$cpuType" == "x64" ]] || [[ "$cpuType" == "aarch64" ]] || [[ "$cpuType" == "aarch32" ]] || [[ "$cpuType" == "arm64" ]] || [[ "$cpuType" == "arm32" ]] || [[ "$cpuType" == "mips64" ]]; then +if [[ "$cpuType" == "x64" ]] || [[ "$cpuType" == "aarch64" ]] || [[ "$cpuType" == "aarch32" ]] || [[ "$cpuType" == "arm64" ]] || [[ "$cpuType" == "arm32" ]] || [[ "$cpuType" == "mips64" ]] || [[ "$cpuType" == "loongarch64" ]] ; then if [ "$verMode" == "edge" ]; then # community-version compile cmake ../ -DCPUTYPE=${cpuType} -DWEBSOCKET=true -DOSTYPE=${osType} -DSOMODE=${soMode} -DDBNAME=${dbName} -DVERTYPE=${verType} -DVERDATE="${build_time}" -DGITINFO=${gitinfo} -DGITINFOI=${gitinfoOfInternal} -DVERNUMBER=${verNumber} -DVERCOMPATIBLE=${verNumberComp} -DPAGMODE=${pagMode} -DBUILD_HTTP=${BUILD_HTTP} -DBUILD_TOOLS=${BUILD_TOOLS} ${allocator_macro} diff --git a/source/os/src/osSysinfo.c b/source/os/src/osSysinfo.c index e5ca9faacb..5e5d6656b4 100644 --- a/source/os/src/osSysinfo.c +++ b/source/os/src/osSysinfo.c @@ -902,9 +902,11 @@ void taosSetCoreDump(bool enable) { old_len = sizeof(old_usespid); +#ifndef __loongarch64 if (syscall(SYS__sysctl, &args) == -1) { // printf("_sysctl(kern_core_uses_pid) set fail: %s", strerror(errno)); } +#endif // printf("The old core_uses_pid[%" PRIu64 "]: %d", old_len, old_usespid); @@ -918,9 +920,11 @@ void taosSetCoreDump(bool enable) { old_len = sizeof(old_usespid); +#ifndef __loongarch64 if (syscall(SYS__sysctl, &args) == -1) { // printf("_sysctl(kern_core_uses_pid) get fail: %s", strerror(errno)); } +#endif // printf("The new core_uses_pid[%" PRIu64 "]: %d", old_len, old_usespid); #endif @@ -989,4 +993,4 @@ bool taosCheckCurrentInDll() { #else return false; #endif -} \ No newline at end of file +} diff --git a/source/util/src/tcrc32c.c b/source/util/src/tcrc32c.c index bd662fa02c..fc9db5a3ff 100644 --- a/source/util/src/tcrc32c.c +++ b/source/util/src/tcrc32c.c @@ -19,7 +19,7 @@ */ #define _DEFAULT_SOURCE -#if !defined(_TD_ARM_) && !defined(_TD_MIPS_) +#if !defined(_TD_ARM_) && !defined(_TD_MIPS_) && !defined(_TD_LOONGARCH_) #include #endif @@ -512,7 +512,7 @@ static uint32_t table[16][256] = { 0x9c221d09, 0x6e2e10f7, 0x7dd67004, 0x8fda7dfa} }; -#if !defined(_TD_ARM_) && !defined(_TD_MIPS_) +#if !defined(_TD_ARM_) && !defined(_TD_MIPS_) && !defined(_TD_LOONGARCH_) static uint32_t long_shifts[4][256] = { {0x00000000, 0xe040e0ac, 0xc56db7a9, 0x252d5705, 0x8f3719a3, 0x6f77f90f, 0x4a5aae0a, 0xaa1a4ea6, 0x1b8245b7, 0xfbc2a51b, 0xdeeff21e, 0x3eaf12b2, 0x94b55c14, 0x74f5bcb8, 0x51d8ebbd, 0xb1980b11, 0x37048b6e, 0xd7446bc2, @@ -846,7 +846,7 @@ uint32_t crc32c_sf(uint32_t crci, crc_stream input, size_t length) { } return (uint32_t)crc ^ 0xffffffff; } -#if !defined(_TD_ARM_) && !defined(_TD_MIPS_) +#if !defined(_TD_ARM_) && !defined(_TD_MIPS_) && !defined(_TD_LOONGARCH_) /* Apply the zeros operator table to crc. */ static uint32_t shift_crc(uint32_t shift_table[][256], uint32_t crc) { return shift_table[0][crc & 0xff] ^ shift_table[1][(crc >> 8) & 0xff] ^ shift_table[2][(crc >> 16) & 0xff] ^ @@ -857,7 +857,7 @@ static uint32_t shift_crc(uint32_t shift_table[][256], uint32_t crc) { version. Otherwise, use the software version. */ uint32_t (*crc32c)(uint32_t crci, crc_stream bytes, size_t len) = crc32c_sf; -#if !defined(_TD_ARM_) && !defined(_TD_MIPS_) +#if !defined(_TD_ARM_) && !defined(_TD_MIPS_) && !defined(_TD_LOONGARCH_) /* Compute CRC-32C using the Intel hardware instruction. */ uint32_t crc32c_hw(uint32_t crc, crc_stream buf, size_t len) { crc_stream next = buf; @@ -1012,7 +1012,7 @@ uint32_t crc32c_hw(uint32_t crc, crc_stream buf, size_t len) { #endif // #ifndef _TD_ARM_ void taosResolveCRC() { -#if defined _TD_ARM_ || defined _TD_MIPS_ || defined WINDOWS +#if defined _TD_ARM_ || defined _TD_MIPS_ || defined WINDOWS || defined _TD_LOONGARCH_ crc32c = crc32c_sf; #else int32_t sse42; diff --git a/tests/docs-examples-test/csharp.sh b/tests/docs-examples-test/csharp.sh index 8d1031ab8f..b193a3da41 100644 --- a/tests/docs-examples-test/csharp.sh +++ b/tests/docs-examples-test/csharp.sh @@ -28,10 +28,10 @@ taos -s "drop database if exists test" dotnet run --project optsJSON/optsJSON.csproj taos -s "create database if exists test" -dotnet run --project wsConnect/wsConnect.csproj -dotnet run --project wsInsert/wsInsert.csproj -dotnet run --project wsStmt/wsStmt.csproj -dotnet run --project wsQuery/wsQuery.csproj +# dotnet run --project wsConnect/wsConnect.csproj +# dotnet run --project wsInsert/wsInsert.csproj +# dotnet run --project wsStmt/wsStmt.csproj +# dotnet run --project wsQuery/wsQuery.csproj taos -s "drop database if exists test" taos -s "drop database if exists power" \ No newline at end of file From 010ac000b4b02e64de32a441e00b33b521915c74 Mon Sep 17 00:00:00 2001 From: huajingyun Date: Thu, 10 Nov 2022 22:44:58 +0800 Subject: [PATCH 05/18] Add loongarch64 architecture port. (#17982) Signed-off-by: Jingyun Hua Signed-off-by: Jingyun Hua From df4fd528c012a7e36aff39d69d20333509fd8f7c Mon Sep 17 00:00:00 2001 From: Liu Jicong Date: Fri, 11 Nov 2022 09:12:57 +0800 Subject: [PATCH 06/18] fix(stream): tbname max len to 192 --- source/dnode/vnode/src/tq/tqSink.c | 7 +++-- source/libs/executor/src/groupoperator.c | 15 ++++++----- source/libs/executor/src/scanoperator.c | 33 +++++++++++++++--------- 3 files changed, 34 insertions(+), 21 deletions(-) diff --git a/source/dnode/vnode/src/tq/tqSink.c b/source/dnode/vnode/src/tq/tqSink.c index 913fa67bd6..f782411084 100644 --- a/source/dnode/vnode/src/tq/tqSink.c +++ b/source/dnode/vnode/src/tq/tqSink.c @@ -244,7 +244,7 @@ SSubmitReq* tqBlockToSubmit(SVnode* pVnode, const SArray* pBlocks, const STSchem int32_t rows = pDataBlock->info.rows; - tqDebug("tq sink, convert block %d, rows: %d", i, rows); + tqDebug("tq sink, convert block1 %d, rows: %d", i, rows); int32_t dataLen = 0; int32_t schemaLen = 0; @@ -486,7 +486,7 @@ void tqSinkToTablePipeline(SStreamTask* pTask, void* vnode, int64_t ver, void* d blkHead->uid = 0; blkHead->schemaLen = 0; - tqDebug("tq sink, convert block %d, rows: %d", i, rows); + tqDebug("tq sink, convert block2 %d, rows: %d", i, rows); int32_t dataLen = 0; void* blkSchema = POINTER_SHIFT(blkHead, sizeof(SSubmitBlk)); @@ -514,6 +514,9 @@ void tqSinkToTablePipeline(SStreamTask* pTask, void* vnode, int64_t ver, void* d tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NULL, NULL, false, pColumn->offset, k); } else { void* colData = colDataGetData(pColData, j); + if (k == 0) { + tqDebug("tq sink, row %d ts %" PRId64, j, *(int64_t*)colData); + } tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NORM, colData, true, pColumn->offset, k); } } diff --git a/source/libs/executor/src/groupoperator.c b/source/libs/executor/src/groupoperator.c index 47ee663abe..26a5f6838d 100644 --- a/source/libs/executor/src/groupoperator.c +++ b/source/libs/executor/src/groupoperator.c @@ -816,12 +816,12 @@ SOperatorInfo* createPartitionOperatorInfo(SOperatorInfo* downstream, SPartition goto _error; } - setOperatorInfo(pOperator, "PartitionOperator", QUERY_NODE_PHYSICAL_PLAN_PARTITION, false, OP_NOT_OPENED, pInfo, pTaskInfo); + setOperatorInfo(pOperator, "PartitionOperator", QUERY_NODE_PHYSICAL_PLAN_PARTITION, false, OP_NOT_OPENED, pInfo, + pTaskInfo); pOperator->exprSupp.numOfExprs = numOfCols; pOperator->exprSupp.pExprInfo = pExprInfo; - pOperator->fpSet = - createOperatorFpSet(operatorDummyOpenFn, hashPartition, NULL, destroyPartitionOperatorInfo, NULL); + pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, hashPartition, NULL, destroyPartitionOperatorInfo, NULL); code = appendDownstream(pOperator, &downstream, 1); return pOperator; @@ -900,7 +900,7 @@ static SSDataBlock* buildStreamPartitionResult(SOperatorInfo* pOperator) { // TODO check tbname validity if (pData != (void*)-1) { memset(pDest->info.parTbName, 0, TSDB_TABLE_NAME_LEN); - int32_t len = TMIN(varDataLen(pData), TSDB_TABLE_NAME_LEN); + int32_t len = TMIN(varDataLen(pData), TSDB_TABLE_NAME_LEN - 1); memcpy(pDest->info.parTbName, varDataVal(pData), len); /*pDest->info.parTbName[len + 1] = 0;*/ } else { @@ -1099,11 +1099,12 @@ SOperatorInfo* createStreamPartitionOperatorInfo(SOperatorInfo* downstream, SStr int32_t numOfCols = 0; SExprInfo* pExprInfo = createExprInfo(pPartNode->part.pTargets, NULL, &numOfCols); - setOperatorInfo(pOperator, "StreamPartitionOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_PARTITION, false, OP_NOT_OPENED, pInfo, pTaskInfo); + setOperatorInfo(pOperator, "StreamPartitionOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_PARTITION, false, OP_NOT_OPENED, + pInfo, pTaskInfo); pOperator->exprSupp.numOfExprs = numOfCols; pOperator->exprSupp.pExprInfo = pExprInfo; - pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doStreamHashPartition, NULL, - destroyStreamPartitionOperatorInfo, NULL); + pOperator->fpSet = + createOperatorFpSet(operatorDummyOpenFn, doStreamHashPartition, NULL, destroyStreamPartitionOperatorInfo, NULL); initParDownStream(downstream, &pInfo->partitionSup, &pInfo->scalarSup); code = appendDownstream(pOperator, &downstream, 1); diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index b83fac9fa6..945753cc53 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -946,7 +946,8 @@ SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode, pInfo->currentGroupId = -1; pInfo->assignBlockUid = pTableScanNode->assignBlockUid; - setOperatorInfo(pOperator, "TableScanOperator", QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN, false, OP_NOT_OPENED, pInfo, pTaskInfo); + setOperatorInfo(pOperator, "TableScanOperator", QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN, false, OP_NOT_OPENED, pInfo, + pTaskInfo); pOperator->exprSupp.numOfExprs = numOfCols; pInfo->metaCache.pTableMetaEntryCache = taosLRUCacheInit(1024 * 128, -1, .5); @@ -980,7 +981,8 @@ SOperatorInfo* createTableSeqScanOperatorInfo(void* pReadHandle, SExecTaskInfo* pInfo->dataReader = pReadHandle; // pInfo->prevGroupId = -1; - setOperatorInfo(pOperator, "TableSeqScanOperator", QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN, false, OP_NOT_OPENED, pInfo, pTaskInfo); + setOperatorInfo(pOperator, "TableSeqScanOperator", QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN, false, OP_NOT_OPENED, + pInfo, pTaskInfo); pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doTableScanImpl, NULL, NULL, NULL); return pOperator; } @@ -1136,8 +1138,10 @@ SOperatorInfo* createDataBlockInfoScanOperator(SReadHandle* readHandle, SBlockDi goto _error; } - setOperatorInfo(pOperator, "DataBlockDistScanOperator", QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN, false, OP_NOT_OPENED, pInfo, pTaskInfo); - pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doBlockInfoScan, NULL, destroyBlockDistScanOperatorInfo, NULL); + setOperatorInfo(pOperator, "DataBlockDistScanOperator", QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN, false, + OP_NOT_OPENED, pInfo, pTaskInfo); + pOperator->fpSet = + createOperatorFpSet(operatorDummyOpenFn, doBlockInfoScan, NULL, destroyBlockDistScanOperatorInfo, NULL); return pOperator; _error: @@ -1581,7 +1585,7 @@ static void calBlockTbName(SExprSupp* pTbNameCalSup, SSDataBlock* pBlock) { // TODO check tbname validation if (pData != (void*)-1 && pData != NULL) { memset(pBlock->info.parTbName, 0, TSDB_TABLE_NAME_LEN); - int32_t len = TMIN(varDataLen(pData), TSDB_TABLE_NAME_LEN); + int32_t len = TMIN(varDataLen(pData), TSDB_TABLE_NAME_LEN - 1); memcpy(pBlock->info.parTbName, varDataVal(pData), len); /*pBlock->info.parTbName[len + 1] = 0;*/ } else { @@ -2351,7 +2355,8 @@ SOperatorInfo* createRawScanOperatorInfo(SReadHandle* pHandle, SExecTaskInfo* pT pInfo->vnode = pHandle->vnode; pInfo->sContext = pHandle->sContext; - setOperatorInfo(pOperator, "RawScanOperator", QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN, false, OP_NOT_OPENED, pInfo, pTaskInfo); + setOperatorInfo(pOperator, "RawScanOperator", QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN, false, OP_NOT_OPENED, pInfo, + pTaskInfo); pOperator->fpSet = createOperatorFpSet(NULL, doRawScan, NULL, destroyRawScanOperatorInfo, NULL); return pOperator; @@ -2537,7 +2542,8 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys pInfo->assignBlockUid = pTableScanNode->assignBlockUid; pInfo->partitionSup.needCalc = false; - setOperatorInfo(pOperator, "StreamScanOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN, false, OP_NOT_OPENED, pInfo, pTaskInfo); + setOperatorInfo(pOperator, "StreamScanOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN, false, OP_NOT_OPENED, pInfo, + pTaskInfo); pOperator->exprSupp.numOfExprs = taosArrayGetSize(pInfo->pRes->pDataBlock); __optr_fn_t nextFn = pTaskInfo->execModel == OPTR_EXEC_MODEL_STREAM ? doStreamScan : doQueueScan; @@ -4175,7 +4181,8 @@ SOperatorInfo* createSysTableScanOperatorInfo(void* readHandle, SSystemTableScan pInfo->readHandle = *(SReadHandle*)readHandle; } - setOperatorInfo(pOperator, "SysTableScanOperator", QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN, false, OP_NOT_OPENED, pInfo, pTaskInfo); + setOperatorInfo(pOperator, "SysTableScanOperator", QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN, false, OP_NOT_OPENED, + pInfo, pTaskInfo); pOperator->exprSupp.numOfExprs = taosArrayGetSize(pInfo->pRes->pDataBlock); pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doSysTableScan, NULL, destroySysScanOperator, NULL); return pOperator; @@ -4305,7 +4312,8 @@ SOperatorInfo* createTagScanOperatorInfo(SReadHandle* pReadHandle, STagScanPhysi pInfo->readHandle = *pReadHandle; pInfo->curPos = 0; - setOperatorInfo(pOperator, "TagScanOperator", QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN, false, OP_NOT_OPENED, pInfo, pTaskInfo); + setOperatorInfo(pOperator, "TagScanOperator", QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN, false, OP_NOT_OPENED, pInfo, + pTaskInfo); initResultSizeInfo(&pOperator->resultInfo, 4096); blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity); @@ -4815,11 +4823,12 @@ SOperatorInfo* createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanN int32_t rowSize = pInfo->pResBlock->info.rowSize; pInfo->bufPageSize = getProperSortPageSize(rowSize); - setOperatorInfo(pOperator, "TableMergeScanOperator", QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN, false, OP_NOT_OPENED, pInfo, pTaskInfo); + setOperatorInfo(pOperator, "TableMergeScanOperator", QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN, false, OP_NOT_OPENED, + pInfo, pTaskInfo); pOperator->exprSupp.numOfExprs = numOfCols; - pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doTableMergeScan, NULL, - destroyTableMergeScanOperatorInfo, getTableMergeScanExplainExecInfo); + pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doTableMergeScan, NULL, destroyTableMergeScanOperatorInfo, + getTableMergeScanExplainExecInfo); pOperator->cost.openCost = 0; return pOperator; From 13680e2ee6ac6594e496695176c452edd0391e16 Mon Sep 17 00:00:00 2001 From: Cary Xu Date: Fri, 11 Nov 2022 10:25:16 +0800 Subject: [PATCH 07/18] chore: set stream fill history on for tsma --- source/dnode/mnode/impl/src/mndSma.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/dnode/mnode/impl/src/mndSma.c b/source/dnode/mnode/impl/src/mndSma.c index 56e725fac7..698c07d9bc 100644 --- a/source/dnode/mnode/impl/src/mndSma.c +++ b/source/dnode/mnode/impl/src/mndSma.c @@ -532,6 +532,7 @@ static int32_t mndCreateSma(SMnode *pMnode, SRpcMsg *pReq, SMCreateSmaReq *pCrea streamObj.sql = strdup(pCreate->sql); streamObj.smaId = smaObj.uid; streamObj.watermark = pCreate->watermark; + streamObj.fillHistory = STREAM_FILL_HISTORY_ON; streamObj.trigger = STREAM_TRIGGER_WINDOW_CLOSE; streamObj.triggerParam = pCreate->maxDelay; streamObj.ast = strdup(smaObj.ast); From 4a8196b5205a5805cea4576476a74adc42e3feec Mon Sep 17 00:00:00 2001 From: stephenkgu Date: Fri, 11 Nov 2022 10:27:54 +0800 Subject: [PATCH 08/18] fix: update stb stats cache when creating/dropping child tables --- source/dnode/vnode/src/inc/meta.h | 1 + source/dnode/vnode/src/meta/metaQuery.c | 10 ++++++++++ source/dnode/vnode/src/meta/metaTable.c | 8 +++++++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/inc/meta.h b/source/dnode/vnode/src/inc/meta.h index 9e2fe4aaf0..2ceae91f7c 100644 --- a/source/dnode/vnode/src/inc/meta.h +++ b/source/dnode/vnode/src/inc/meta.h @@ -70,6 +70,7 @@ int32_t metaCacheDrop(SMeta* pMeta, int64_t uid); int32_t metaStatsCacheUpsert(SMeta* pMeta, SMetaStbStats* pInfo); int32_t metaStatsCacheDrop(SMeta* pMeta, int64_t uid); int32_t metaStatsCacheGet(SMeta* pMeta, int64_t uid, SMetaStbStats* pInfo); +void metaUpdateStbStats(SMeta *pMeta, int64_t uid, int64_t delta); struct SMeta { TdThreadRwlock lock; diff --git a/source/dnode/vnode/src/meta/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c index 4aabd39800..620022c06d 100644 --- a/source/dnode/vnode/src/meta/metaQuery.c +++ b/source/dnode/vnode/src/meta/metaQuery.c @@ -1445,3 +1445,13 @@ int32_t metaGetStbStats(SMeta *pMeta, int64_t uid, SMetaStbStats *pInfo) { _exit: return code; } + +void metaUpdateStbStats(SMeta *pMeta, int64_t uid, int64_t delta) { + SMetaStbStats stats = {0}; + + if (metaStatsCacheGet(pMeta, uid, &stats) == TSDB_CODE_SUCCESS) { + stats.ctbNum += delta; + + metaStatsCacheUpsert(pMeta, &stats); + } +} diff --git a/source/dnode/vnode/src/meta/metaTable.c b/source/dnode/vnode/src/meta/metaTable.c index 6dadce80ca..5921adfbfa 100644 --- a/source/dnode/vnode/src/meta/metaTable.c +++ b/source/dnode/vnode/src/meta/metaTable.c @@ -371,7 +371,7 @@ int metaAlterSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) { // update uid index metaUpdateUidIdx(pMeta, &nStbEntry); - metaStatsCacheDrop(pMeta, nStbEntry.uid); + // metaStatsCacheDrop(pMeta, nStbEntry.uid); metaULock(pMeta); @@ -450,6 +450,10 @@ int metaCreateTable(SMeta *pMeta, int64_t version, SVCreateTbReq *pReq, STableMe #endif ++pMeta->pVnode->config.vndStats.numOfCTables; + + metaWLock(pMeta); + metaUpdateStbStats(pMeta, me.ctbEntry.suid, 1); + metaULock(pMeta); } else { me.ntbEntry.ctime = pReq->ctime; me.ntbEntry.ttlDays = pReq->ttl; @@ -670,6 +674,8 @@ static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) { tdbTbDelete(pMeta->pCtbIdx, &(SCtbIdxKey){.suid = e.ctbEntry.suid, .uid = uid}, sizeof(SCtbIdxKey), &pMeta->txn); --pMeta->pVnode->config.vndStats.numOfCTables; + + metaUpdateStbStats(pMeta, e.ctbEntry.suid, -1); } else if (e.type == TSDB_NORMAL_TABLE) { // drop schema.db (todo) From 5651bde6fe6bbe7f474634d6267e40d551d4e972 Mon Sep 17 00:00:00 2001 From: Cary Xu Date: Fri, 11 Nov 2022 10:54:46 +0800 Subject: [PATCH 09/18] enh: use lock in buf pool only for rsma vnode --- source/dnode/vnode/src/inc/vnd.h | 1 + source/dnode/vnode/src/vnd/vnodeBufPool.c | 30 +++++++++++++++++------ 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/source/dnode/vnode/src/inc/vnd.h b/source/dnode/vnode/src/inc/vnd.h index 8f8691cfc2..ecb34cd9b4 100644 --- a/source/dnode/vnode/src/inc/vnd.h +++ b/source/dnode/vnode/src/inc/vnd.h @@ -65,6 +65,7 @@ struct SVBufPool { SVnode* pVnode; volatile int32_t nRef; TdThreadSpinlock lock; + bool isLock; int64_t size; uint8_t* ptr; SVBufPoolNode* pTail; diff --git a/source/dnode/vnode/src/vnd/vnodeBufPool.c b/source/dnode/vnode/src/vnd/vnodeBufPool.c index 6ac2ce1c16..86cd8af4d6 100644 --- a/source/dnode/vnode/src/vnd/vnodeBufPool.c +++ b/source/dnode/vnode/src/vnd/vnodeBufPool.c @@ -27,10 +27,15 @@ static int vnodeBufPoolCreate(SVnode *pVnode, int64_t size, SVBufPool **ppPool) return -1; } - if (taosThreadSpinInit(&pPool->lock, 0) != 0) { - taosMemoryFree(pPool); - terrno = TAOS_SYSTEM_ERROR(errno); - return -1; + if (VND_IS_RSMA(pVnode)) { + if (taosThreadSpinInit(&pPool->lock, 0) != 0) { + taosMemoryFree(pPool); + terrno = TAOS_SYSTEM_ERROR(errno); + return -1; + } + pPool->isLock = true; + } else { + pPool->isLock = false; } pPool->next = NULL; @@ -49,7 +54,9 @@ static int vnodeBufPoolCreate(SVnode *pVnode, int64_t size, SVBufPool **ppPool) static int vnodeBufPoolDestroy(SVBufPool *pPool) { vnodeBufPoolReset(pPool); - taosThreadSpinDestroy(&pPool->lock); + if (pPool->isLock) { + taosThreadSpinDestroy(&pPool->lock); + } taosMemoryFree(pPool); return 0; } @@ -114,7 +121,10 @@ void *vnodeBufPoolMalloc(SVBufPool *pPool, int size) { void *p = NULL; ASSERT(pPool != NULL); - taosThreadSpinLock(&pPool->lock); + if (pPool->isLock) { + taosThreadSpinLock(&pPool->lock); + } + if (pPool->node.size >= pPool->ptr - pPool->node.data + size) { // allocate from the anchor node p = pPool->ptr; @@ -125,7 +135,9 @@ void *vnodeBufPoolMalloc(SVBufPool *pPool, int size) { pNode = taosMemoryMalloc(sizeof(*pNode) + size); if (pNode == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; - taosThreadSpinUnlock(&pPool->lock); + if (pPool->isLock) { + taosThreadSpinUnlock(&pPool->lock); + } return NULL; } @@ -138,7 +150,9 @@ void *vnodeBufPoolMalloc(SVBufPool *pPool, int size) { pPool->size = pPool->size + sizeof(*pNode) + size; } - taosThreadSpinUnlock(&pPool->lock); + if (pPool->isLock) { + taosThreadSpinUnlock(&pPool->lock); + } return p; } From 936daff09bd38716b0c9f87a0ad5966b2bbe47e9 Mon Sep 17 00:00:00 2001 From: Cary Xu Date: Fri, 11 Nov 2022 10:57:48 +0800 Subject: [PATCH 10/18] chore: revert the code change --- source/dnode/vnode/src/inc/vnd.h | 1 - source/dnode/vnode/src/vnd/vnodeBufPool.c | 30 +++++++---------------- 2 files changed, 9 insertions(+), 22 deletions(-) diff --git a/source/dnode/vnode/src/inc/vnd.h b/source/dnode/vnode/src/inc/vnd.h index ecb34cd9b4..8f8691cfc2 100644 --- a/source/dnode/vnode/src/inc/vnd.h +++ b/source/dnode/vnode/src/inc/vnd.h @@ -65,7 +65,6 @@ struct SVBufPool { SVnode* pVnode; volatile int32_t nRef; TdThreadSpinlock lock; - bool isLock; int64_t size; uint8_t* ptr; SVBufPoolNode* pTail; diff --git a/source/dnode/vnode/src/vnd/vnodeBufPool.c b/source/dnode/vnode/src/vnd/vnodeBufPool.c index 86cd8af4d6..3069e5224e 100644 --- a/source/dnode/vnode/src/vnd/vnodeBufPool.c +++ b/source/dnode/vnode/src/vnd/vnodeBufPool.c @@ -27,15 +27,10 @@ static int vnodeBufPoolCreate(SVnode *pVnode, int64_t size, SVBufPool **ppPool) return -1; } - if (VND_IS_RSMA(pVnode)) { - if (taosThreadSpinInit(&pPool->lock, 0) != 0) { - taosMemoryFree(pPool); - terrno = TAOS_SYSTEM_ERROR(errno); - return -1; - } - pPool->isLock = true; - } else { - pPool->isLock = false; + if (taosThreadSpinInit(&pPool->lock, 0) != 0) { + taosMemoryFree(pPool); + terrno = TAOS_SYSTEM_ERROR(errno); + return -1; } pPool->next = NULL; @@ -54,9 +49,7 @@ static int vnodeBufPoolCreate(SVnode *pVnode, int64_t size, SVBufPool **ppPool) static int vnodeBufPoolDestroy(SVBufPool *pPool) { vnodeBufPoolReset(pPool); - if (pPool->isLock) { - taosThreadSpinDestroy(&pPool->lock); - } + taosThreadSpinDestroy(&pPool->lock); taosMemoryFree(pPool); return 0; } @@ -121,9 +114,7 @@ void *vnodeBufPoolMalloc(SVBufPool *pPool, int size) { void *p = NULL; ASSERT(pPool != NULL); - if (pPool->isLock) { - taosThreadSpinLock(&pPool->lock); - } + taosThreadSpinLock(&pPool->lock); if (pPool->node.size >= pPool->ptr - pPool->node.data + size) { // allocate from the anchor node @@ -135,9 +126,7 @@ void *vnodeBufPoolMalloc(SVBufPool *pPool, int size) { pNode = taosMemoryMalloc(sizeof(*pNode) + size); if (pNode == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; - if (pPool->isLock) { - taosThreadSpinUnlock(&pPool->lock); - } + taosThreadSpinUnlock(&pPool->lock); return NULL; } @@ -150,9 +139,8 @@ void *vnodeBufPoolMalloc(SVBufPool *pPool, int size) { pPool->size = pPool->size + sizeof(*pNode) + size; } - if (pPool->isLock) { - taosThreadSpinUnlock(&pPool->lock); - } + + taosThreadSpinUnlock(&pPool->lock); return p; } From 37b7e34fe26e26e97de3a0487065ebe4f103fbd3 Mon Sep 17 00:00:00 2001 From: Cary Xu Date: Fri, 11 Nov 2022 10:58:25 +0800 Subject: [PATCH 11/18] chore: revert the code change --- source/dnode/vnode/src/vnd/vnodeBufPool.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/dnode/vnode/src/vnd/vnodeBufPool.c b/source/dnode/vnode/src/vnd/vnodeBufPool.c index 3069e5224e..6ac2ce1c16 100644 --- a/source/dnode/vnode/src/vnd/vnodeBufPool.c +++ b/source/dnode/vnode/src/vnd/vnodeBufPool.c @@ -115,7 +115,6 @@ void *vnodeBufPoolMalloc(SVBufPool *pPool, int size) { ASSERT(pPool != NULL); taosThreadSpinLock(&pPool->lock); - if (pPool->node.size >= pPool->ptr - pPool->node.data + size) { // allocate from the anchor node p = pPool->ptr; @@ -139,7 +138,6 @@ void *vnodeBufPoolMalloc(SVBufPool *pPool, int size) { pPool->size = pPool->size + sizeof(*pNode) + size; } - taosThreadSpinUnlock(&pPool->lock); return p; } From 4d0c5c9d573edb2cf0cef39c42b9dd9f1c176c04 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Fri, 11 Nov 2022 11:03:01 +0800 Subject: [PATCH 12/18] refact: adjust head file and sync log --- source/libs/sync/inc/syncEnv.h | 2 - source/libs/sync/inc/syncRaftLog.h | 1 - source/libs/sync/inc/syncRaftStore.h | 21 ++--- source/libs/sync/src/syncRaftLog.c | 17 ++-- source/libs/sync/src/syncRaftStore.c | 81 +----------------- .../sync/test/sync_test_lib/inc/syncTest.h | 10 +++ .../sync_test_lib/src/syncRaftStoreDebug.c | 84 +++++++++++++++++++ 7 files changed, 113 insertions(+), 103 deletions(-) create mode 100644 source/libs/sync/test/sync_test_lib/src/syncRaftStoreDebug.c diff --git a/source/libs/sync/inc/syncEnv.h b/source/libs/sync/inc/syncEnv.h index cf4e3309f1..628e8874b4 100644 --- a/source/libs/sync/inc/syncEnv.h +++ b/source/libs/sync/inc/syncEnv.h @@ -30,8 +30,6 @@ extern "C" { #define ELECT_TIMER_MS_RANGE (ELECT_TIMER_MS_MAX - ELECT_TIMER_MS_MIN) #define HEARTBEAT_TIMER_MS 1000 -#define EMPTY_RAFT_ID ((SRaftId){.addr = 0, .vgId = 0}) - typedef struct SSyncEnv { uint8_t isStart; diff --git a/source/libs/sync/inc/syncRaftLog.h b/source/libs/sync/inc/syncRaftLog.h index 17ea36c640..de8bd81b30 100644 --- a/source/libs/sync/inc/syncRaftLog.h +++ b/source/libs/sync/inc/syncRaftLog.h @@ -38,7 +38,6 @@ SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode); void logStoreDestory(SSyncLogStore* pLogStore); SyncIndex logStoreFirstIndex(SSyncLogStore* pLogStore); - SyncIndex logStoreWalCommitVer(SSyncLogStore* pLogStore); SyncIndex raftLogWriteIndex(struct SSyncLogStore* pLogStore); diff --git a/source/libs/sync/inc/syncRaftStore.h b/source/libs/sync/inc/syncRaftStore.h index 077e6a7658..bb6405f6b2 100644 --- a/source/libs/sync/inc/syncRaftStore.h +++ b/source/libs/sync/inc/syncRaftStore.h @@ -25,6 +25,8 @@ extern "C" { #define RAFT_STORE_BLOCK_SIZE 512 #define RAFT_STORE_PATH_LEN (TSDB_FILENAME_LEN * 2) +#define EMPTY_RAFT_ID ((SRaftId){.addr = 0, .vgId = 0}) + typedef struct SRaftStore { SyncTerm currentTerm; SRaftId voteFor; @@ -38,20 +40,11 @@ int32_t raftStorePersist(SRaftStore *pRaftStore); int32_t raftStoreSerialize(SRaftStore *pRaftStore, char *buf, size_t len); int32_t raftStoreDeserialize(SRaftStore *pRaftStore, char *buf, size_t len); -bool raftStoreHasVoted(SRaftStore *pRaftStore); -void raftStoreVote(SRaftStore *pRaftStore, SRaftId *pRaftId); -void raftStoreClearVote(SRaftStore *pRaftStore); -void raftStoreNextTerm(SRaftStore *pRaftStore); -void raftStoreSetTerm(SRaftStore *pRaftStore, SyncTerm term); -int32_t raftStoreFromJson(SRaftStore *pRaftStore, cJSON *pJson); -cJSON *raftStore2Json(SRaftStore *pRaftStore); -char *raftStore2Str(SRaftStore *pRaftStore); - -// for debug ------------------- -void raftStorePrint(SRaftStore *pObj); -void raftStorePrint2(char *s, SRaftStore *pObj); -void raftStoreLog(SRaftStore *pObj); -void raftStoreLog2(char *s, SRaftStore *pObj); +bool raftStoreHasVoted(SRaftStore *pRaftStore); +void raftStoreVote(SRaftStore *pRaftStore, SRaftId *pRaftId); +void raftStoreClearVote(SRaftStore *pRaftStore); +void raftStoreNextTerm(SRaftStore *pRaftStore); +void raftStoreSetTerm(SRaftStore *pRaftStore, SyncTerm term); #ifdef __cplusplus } diff --git a/source/libs/sync/src/syncRaftLog.c b/source/libs/sync/src/syncRaftLog.c index d4a1d35c74..2cdb18a109 100644 --- a/source/libs/sync/src/syncRaftLog.c +++ b/source/libs/sync/src/syncRaftLog.c @@ -13,33 +13,33 @@ * along with this program. If not, see . */ +#define _DEFAULT_SOURCE #include "syncRaftLog.h" #include "syncRaftCfg.h" #include "syncRaftStore.h" -//------------------------------- // log[m .. n] // public function static int32_t raftLogRestoreFromSnapshot(struct SSyncLogStore* pLogStore, SyncIndex snapshotIndex); - static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry); static int32_t raftLogTruncate(struct SSyncLogStore* pLogStore, SyncIndex fromIndex); static bool raftLogExist(struct SSyncLogStore* pLogStore, SyncIndex index); static int32_t raftLogUpdateCommitIndex(SSyncLogStore* pLogStore, SyncIndex index); static SyncIndex raftlogCommitIndex(SSyncLogStore* pLogStore); +static int32_t raftLogGetLastEntry(SSyncLogStore* pLogStore, SSyncRaftEntry** ppLastEntry); -static int32_t raftLogGetLastEntry(SSyncLogStore* pLogStore, SSyncRaftEntry** ppLastEntry); - -//------------------------------- SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode) { - SSyncLogStore* pLogStore = taosMemoryMalloc(sizeof(SSyncLogStore)); - ASSERT(pLogStore != NULL); + SSyncLogStore* pLogStore = taosMemoryCalloc(1, sizeof(SSyncLogStore)); + if (pLogStore == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return NULL; + } pLogStore->pCache = taosLRUCacheInit(10 * 1024 * 1024, 1, .5); if (pLogStore->pCache == NULL) { - terrno = TSDB_CODE_WAL_OUT_OF_MEMORY; taosMemoryFree(pLogStore); + terrno = TSDB_CODE_WAL_OUT_OF_MEMORY; return NULL; } @@ -96,7 +96,6 @@ void logStoreDestory(SSyncLogStore* pLogStore) { } } -//------------------------------- // log[m .. n] static int32_t raftLogRestoreFromSnapshot(struct SSyncLogStore* pLogStore, SyncIndex snapshotIndex) { ASSERT(snapshotIndex >= 0); diff --git a/source/libs/sync/src/syncRaftStore.c b/source/libs/sync/src/syncRaftStore.c index 1c96e70858..e328ed3d31 100644 --- a/source/libs/sync/src/syncRaftStore.c +++ b/source/libs/sync/src/syncRaftStore.c @@ -15,8 +15,6 @@ #define _DEFAULT_SOURCE #include "syncRaftStore.h" -#include "cJSON.h" -#include "syncEnv.h" #include "syncUtil.h" // private function @@ -27,22 +25,19 @@ static bool raftStoreFileExist(char *path); SRaftStore *raftStoreOpen(const char *path) { int32_t ret; - SRaftStore *pRaftStore = taosMemoryMalloc(sizeof(SRaftStore)); + SRaftStore *pRaftStore = taosMemoryCalloc(1, sizeof(SRaftStore)); if (pRaftStore == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; return NULL; } - memset(pRaftStore, 0, sizeof(*pRaftStore)); + snprintf(pRaftStore->path, sizeof(pRaftStore->path), "%s", path); - - char storeBuf[RAFT_STORE_BLOCK_SIZE] = {0}; - memset(storeBuf, 0, sizeof(storeBuf)); - if (!raftStoreFileExist(pRaftStore->path)) { ret = raftStoreInit(pRaftStore); ASSERT(ret == 0); } + char storeBuf[RAFT_STORE_BLOCK_SIZE] = {0}; pRaftStore->pFile = taosOpenFile(path, TD_FILE_READ | TD_FILE_WRITE); ASSERT(pRaftStore->pFile != NULL); @@ -73,9 +68,7 @@ static int32_t raftStoreInit(SRaftStore *pRaftStore) { } int32_t raftStoreClose(SRaftStore *pRaftStore) { - if (pRaftStore == NULL) { - return 0; - } + if (pRaftStore == NULL) return 0; taosCloseFile(&pRaftStore->pFile); taosMemoryFree(pRaftStore); @@ -183,69 +176,3 @@ void raftStoreSetTerm(SRaftStore *pRaftStore, SyncTerm term) { pRaftStore->currentTerm = term; raftStorePersist(pRaftStore); } - -int32_t raftStoreFromJson(SRaftStore *pRaftStore, cJSON *pJson) { return 0; } - -cJSON *raftStore2Json(SRaftStore *pRaftStore) { - char u64buf[128] = {0}; - cJSON *pRoot = cJSON_CreateObject(); - - if (pRaftStore != NULL) { - snprintf(u64buf, sizeof(u64buf), "%" PRIu64 "", pRaftStore->currentTerm); - cJSON_AddStringToObject(pRoot, "currentTerm", u64buf); - - cJSON *pVoteFor = cJSON_CreateObject(); - snprintf(u64buf, sizeof(u64buf), "%" PRIu64 "", pRaftStore->voteFor.addr); - cJSON_AddStringToObject(pVoteFor, "addr", u64buf); - { - uint64_t u64 = pRaftStore->voteFor.addr; - char host[128] = {0}; - uint16_t port; - syncUtilU642Addr(u64, host, sizeof(host), &port); - cJSON_AddStringToObject(pVoteFor, "addr_host", host); - cJSON_AddNumberToObject(pVoteFor, "addr_port", port); - } - cJSON_AddNumberToObject(pVoteFor, "vgId", pRaftStore->voteFor.vgId); - cJSON_AddItemToObject(pRoot, "voteFor", pVoteFor); - - int hasVoted = raftStoreHasVoted(pRaftStore); - cJSON_AddNumberToObject(pRoot, "hasVoted", hasVoted); - } - - cJSON *pJson = cJSON_CreateObject(); - cJSON_AddItemToObject(pJson, "SRaftStore", pRoot); - return pJson; -} - -char *raftStore2Str(SRaftStore *pRaftStore) { - cJSON *pJson = raftStore2Json(pRaftStore); - char *serialized = cJSON_Print(pJson); - cJSON_Delete(pJson); - return serialized; -} - -// for debug ------------------- -void raftStorePrint(SRaftStore *pObj) { - char *serialized = raftStore2Str(pObj); - printf("raftStorePrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized); - fflush(NULL); - taosMemoryFree(serialized); -} - -void raftStorePrint2(char *s, SRaftStore *pObj) { - char *serialized = raftStore2Str(pObj); - printf("raftStorePrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized); - fflush(NULL); - taosMemoryFree(serialized); -} -void raftStoreLog(SRaftStore *pObj) { - char *serialized = raftStore2Str(pObj); - sTrace("raftStoreLog | len:%d | %s", (int32_t)strlen(serialized), serialized); - taosMemoryFree(serialized); -} - -void raftStoreLog2(char *s, SRaftStore *pObj) { - char *serialized = raftStore2Str(pObj); - sTrace("raftStoreLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized); - taosMemoryFree(serialized); -} diff --git a/source/libs/sync/test/sync_test_lib/inc/syncTest.h b/source/libs/sync/test/sync_test_lib/inc/syncTest.h index a1881bf1b3..34ce8c3175 100644 --- a/source/libs/sync/test/sync_test_lib/inc/syncTest.h +++ b/source/libs/sync/test/sync_test_lib/inc/syncTest.h @@ -63,6 +63,14 @@ void raftEntryCachePrint2(char* s, SRaftEntryCache* pObj); void raftEntryCacheLog(SRaftEntryCache* pObj); void raftEntryCacheLog2(char* s, SRaftEntryCache* pObj); +int32_t raftStoreFromJson(SRaftStore* pRaftStore, cJSON* pJson); +cJSON* raftStore2Json(SRaftStore* pRaftStore); +char* raftStore2Str(SRaftStore* pRaftStore); +void raftStorePrint(SRaftStore* pObj); +void raftStorePrint2(char* s, SRaftStore* pObj); +void raftStoreLog(SRaftStore* pObj); +void raftStoreLog2(char* s, SRaftStore* pObj); + cJSON* syncAppendEntriesBatch2Json(const SyncAppendEntriesBatch* pMsg); char* syncAppendEntriesBatch2Str(const SyncAppendEntriesBatch* pMsg); void syncAppendEntriesBatchPrint(const SyncAppendEntriesBatch* pMsg); @@ -99,6 +107,8 @@ char* snapshotSender2Str(SSyncSnapshotSender* pSender); cJSON* snapshotReceiver2Json(SSyncSnapshotReceiver* pReceiver); char* snapshotReceiver2Str(SSyncSnapshotReceiver* pReceiver); + + #ifdef __cplusplus } #endif diff --git a/source/libs/sync/test/sync_test_lib/src/syncRaftStoreDebug.c b/source/libs/sync/test/sync_test_lib/src/syncRaftStoreDebug.c new file mode 100644 index 0000000000..0c4dd95e48 --- /dev/null +++ b/source/libs/sync/test/sync_test_lib/src/syncRaftStoreDebug.c @@ -0,0 +1,84 @@ +/* + * 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 . + */ + +#define _DEFAULT_SOURCE +#include "syncTest.h" +#include "cJSON.h" + +int32_t raftStoreFromJson(SRaftStore *pRaftStore, cJSON *pJson) { return 0; } + +cJSON *raftStore2Json(SRaftStore *pRaftStore) { + char u64buf[128] = {0}; + cJSON *pRoot = cJSON_CreateObject(); + + if (pRaftStore != NULL) { + snprintf(u64buf, sizeof(u64buf), "%" PRIu64 "", pRaftStore->currentTerm); + cJSON_AddStringToObject(pRoot, "currentTerm", u64buf); + + cJSON *pVoteFor = cJSON_CreateObject(); + snprintf(u64buf, sizeof(u64buf), "%" PRIu64 "", pRaftStore->voteFor.addr); + cJSON_AddStringToObject(pVoteFor, "addr", u64buf); + { + uint64_t u64 = pRaftStore->voteFor.addr; + char host[128] = {0}; + uint16_t port; + syncUtilU642Addr(u64, host, sizeof(host), &port); + cJSON_AddStringToObject(pVoteFor, "addr_host", host); + cJSON_AddNumberToObject(pVoteFor, "addr_port", port); + } + cJSON_AddNumberToObject(pVoteFor, "vgId", pRaftStore->voteFor.vgId); + cJSON_AddItemToObject(pRoot, "voteFor", pVoteFor); + + int hasVoted = raftStoreHasVoted(pRaftStore); + cJSON_AddNumberToObject(pRoot, "hasVoted", hasVoted); + } + + cJSON *pJson = cJSON_CreateObject(); + cJSON_AddItemToObject(pJson, "SRaftStore", pRoot); + return pJson; +} + +char *raftStore2Str(SRaftStore *pRaftStore) { + cJSON *pJson = raftStore2Json(pRaftStore); + char *serialized = cJSON_Print(pJson); + cJSON_Delete(pJson); + return serialized; +} + +// for debug ------------------- +void raftStorePrint(SRaftStore *pObj) { + char *serialized = raftStore2Str(pObj); + printf("raftStorePrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized); + fflush(NULL); + taosMemoryFree(serialized); +} + +void raftStorePrint2(char *s, SRaftStore *pObj) { + char *serialized = raftStore2Str(pObj); + printf("raftStorePrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized); + fflush(NULL); + taosMemoryFree(serialized); +} +void raftStoreLog(SRaftStore *pObj) { + char *serialized = raftStore2Str(pObj); + sTrace("raftStoreLog | len:%d | %s", (int32_t)strlen(serialized), serialized); + taosMemoryFree(serialized); +} + +void raftStoreLog2(char *s, SRaftStore *pObj) { + char *serialized = raftStore2Str(pObj); + sTrace("raftStoreLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized); + taosMemoryFree(serialized); +} \ No newline at end of file From 35b79e7e6989a02e6dcc7e52a39798dd1ec62088 Mon Sep 17 00:00:00 2001 From: Xiaoyu Wang Date: Fri, 11 Nov 2022 11:24:24 +0800 Subject: [PATCH 13/18] fix: the problem of null in case when expression --- source/libs/parser/src/parTranslater.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 7897623ab1..0e5cb14208 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -1878,6 +1878,7 @@ static int32_t rewriteIsTrue(SNode* pSrc, SNode** pIsTrue) { static EDealRes translateCaseWhen(STranslateContext* pCxt, SCaseWhenNode* pCaseWhen) { bool first = true; + bool allNullThen = true; SNode* pNode = NULL; FOREACH(pNode, pCaseWhen->pWhenThenList) { SWhenThenNode* pWhenThen = (SWhenThenNode*)pNode; @@ -1889,12 +1890,28 @@ static EDealRes translateCaseWhen(STranslateContext* pCxt, SCaseWhenNode* pCaseW } pWhenThen->pWhen = pIsTrue; } - if (first || dataTypeComp(&pCaseWhen->node.resType, &((SExprNode*)pNode)->resType) < 0) { - pCaseWhen->node.resType = ((SExprNode*)pNode)->resType; + + SExprNode* pThenExpr = (SExprNode*)pNode; + if (TSDB_DATA_TYPE_NULL == pThenExpr->resType.type) { + continue; + } + allNullThen = false; + if (first || dataTypeComp(&pCaseWhen->node.resType, &pThenExpr->resType) < 0) { + pCaseWhen->node.resType = pThenExpr->resType; } first = false; } + if (allNullThen) { + if (NULL != pCaseWhen->pElse) { + pCaseWhen->node.resType = ((SExprNode*)pCaseWhen->pElse)->resType; + } else { + pCaseWhen->node.resType.type = TSDB_DATA_TYPE_NULL; + pCaseWhen->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_NULL].bytes; + return DEAL_RES_CONTINUE; + } + } + FOREACH(pNode, pCaseWhen->pWhenThenList) { SWhenThenNode* pWhenThen = (SWhenThenNode*)pNode; if (!dataTypeEqual(&pCaseWhen->node.resType, &((SExprNode*)pNode)->resType)) { From 07ed17806540e8bc1c51006419f3f708e3cb581e Mon Sep 17 00:00:00 2001 From: tangfangzhi Date: Fri, 11 Nov 2022 11:54:52 +0800 Subject: [PATCH 14/18] test: add case for tmq in replica3 --- tests/parallel_test/cases.task | 1 + tests/system-test/7-tmq/tmqSubscribeStb-r3.py | 30 ++++++++++--------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index 6775760ee4..8955a65dfa 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -714,6 +714,7 @@ ,,,system-test,python3 ./test.py -f 7-tmq/tmq_taosx.py ,,,system-test,python3 ./test.py -f 7-tmq/stbTagFilter-multiCtb.py ,,,system-test,python3 ./test.py -f 99-TDcase/TD-19201.py +,,,system-test,python3 ./test.py -f 7-tmq/tmqSubscribeStb-r3.py -N 5 ,,,system-test,python3 ./test.py -f 2-query/between.py -Q 2 ,,,system-test,python3 ./test.py -f 2-query/distinct.py -Q 2 ,,,system-test,python3 ./test.py -f 2-query/varchar.py -Q 2 diff --git a/tests/system-test/7-tmq/tmqSubscribeStb-r3.py b/tests/system-test/7-tmq/tmqSubscribeStb-r3.py index 01f1ca5b15..85222a941b 100644 --- a/tests/system-test/7-tmq/tmqSubscribeStb-r3.py +++ b/tests/system-test/7-tmq/tmqSubscribeStb-r3.py @@ -1,26 +1,27 @@ -from distutils.log import error -import taos -import sys -import time -import socket import os -import threading -import subprocess import platform +import socket +import subprocess +import sys +import threading +import time +from distutils.log import error -from util.log import * -from util.sql import * +import taos from util.cases import * -from util.dnodes import * -from util.dnodes import TDDnodes -from util.dnodes import TDDnode from util.cluster import * from util.common import * +from util.dnodes import * +from util.dnodes import TDDnode, TDDnodes +from util.log import * +from util.sql import * + sys.path.append("./6-cluster") sys.path.append("./7-tmq") -from tmqCommon import * -from clusterCommonCreate import * from clusterCommonCheck import clusterComCheck +from clusterCommonCreate import * +from tmqCommon import * + class TDTestCase: def __init__(self): @@ -265,6 +266,7 @@ class TDTestCase: tdLog.info("start consume processor") tmqCom.startTmqSimProcess(pollDelay=paraDict['pollDelay'],dbName=paraDict["dbName"],showMsg=paraDict['showMsg'], showRow=paraDict['showRow'],snapshot=paraDict['snapshot']) + tmqCom.getStartConsumeNotifyFromTmqsim() tdLog.info("================= restart dnode 2===========================") cluster.dnodes[1].stoptaosd() cluster.dnodes[1].starttaosd() From 5de865992a475ad76a31699e51b3f8758ec466e5 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Fri, 11 Nov 2022 12:09:31 +0800 Subject: [PATCH 15/18] refact: adjust head file and sync log --- source/libs/sync/inc/syncRaftCfg.h | 11 ++-------- source/libs/sync/src/syncRaftCfg.c | 22 +------------------ source/libs/sync/src/syncRaftEntry.c | 3 --- .../test/syncConfigChangeSnapshotTest.cpp | 3 ++- .../libs/sync/test/syncConfigChangeTest.cpp | 3 ++- source/libs/sync/test/syncTestTool.cpp | 4 ++-- .../sync/test/sync_test_lib/inc/syncTest.h | 3 +++ .../test/sync_test_lib/src/syncRaftCfgDebug.c | 16 ++++++++++++++ 8 files changed, 28 insertions(+), 37 deletions(-) diff --git a/source/libs/sync/inc/syncRaftCfg.h b/source/libs/sync/inc/syncRaftCfg.h index 6b6ca21399..823983e732 100644 --- a/source/libs/sync/inc/syncRaftCfg.h +++ b/source/libs/sync/inc/syncRaftCfg.h @@ -22,11 +22,9 @@ extern "C" { #include "syncInt.h" -#define CONFIG_FILE_LEN 2048 - +#define CONFIG_FILE_LEN 2048 #define MAX_CONFIG_INDEX_COUNT 256 -// SRaftCfgIndex ------------------------------------------ typedef struct SRaftCfgIndex { TdFilePtr pFile; char path[TSDB_FILENAME_LEN * 2]; @@ -44,11 +42,8 @@ cJSON *raftCfgIndex2Json(SRaftCfgIndex *pRaftCfgIndex); char *raftCfgIndex2Str(SRaftCfgIndex *pRaftCfgIndex); int32_t raftCfgIndexFromJson(const cJSON *pRoot, SRaftCfgIndex *pRaftCfgIndex); int32_t raftCfgIndexFromStr(const char *s, SRaftCfgIndex *pRaftCfgIndex); - int32_t raftCfgIndexCreateFile(const char *path); -// --------------------------------------------------------- - typedef struct SRaftCfg { SSyncCfg cfg; TdFilePtr pFile; @@ -68,11 +63,9 @@ int32_t raftCfgClose(SRaftCfg *pRaftCfg); int32_t raftCfgPersist(SRaftCfg *pRaftCfg); int32_t raftCfgAddConfigIndex(SRaftCfg *pRaftCfg, SyncIndex configIndex); -cJSON *syncCfg2Json(SSyncCfg *pSyncCfg); -char *syncCfg2Str(SSyncCfg *pSyncCfg); void syncCfg2SimpleStr(const SSyncCfg *pCfg, char *str, int32_t bufLen); +cJSON *syncCfg2Json(SSyncCfg *pSyncCfg); int32_t syncCfgFromJson(const cJSON *pRoot, SSyncCfg *pSyncCfg); -int32_t syncCfgFromStr(const char *s, SSyncCfg *pSyncCfg); cJSON *raftCfg2Json(SRaftCfg *pRaftCfg); char *raftCfg2Str(SRaftCfg *pRaftCfg); diff --git a/source/libs/sync/src/syncRaftCfg.c b/source/libs/sync/src/syncRaftCfg.c index 66c399d15a..b6b2616973 100644 --- a/source/libs/sync/src/syncRaftCfg.c +++ b/source/libs/sync/src/syncRaftCfg.c @@ -13,10 +13,8 @@ * along with this program. If not, see . */ +#define _DEFAULT_SOURCE #include "syncRaftCfg.h" -#include "cJSON.h" -#include "syncEnv.h" -#include "syncUtil.h" // file must already exist! SRaftCfgIndex *raftCfgIndexOpen(const char *path) { @@ -242,13 +240,6 @@ cJSON *syncCfg2Json(SSyncCfg *pSyncCfg) { return pRoot; } -char *syncCfg2Str(SSyncCfg *pSyncCfg) { - cJSON *pJson = syncCfg2Json(pSyncCfg); - char *serialized = cJSON_Print(pJson); - cJSON_Delete(pJson); - return serialized; -} - int32_t syncCfgFromJson(const cJSON *pRoot, SSyncCfg *pSyncCfg) { memset(pSyncCfg, 0, sizeof(SSyncCfg)); // cJSON *pJson = cJSON_GetObjectItem(pRoot, "SSyncCfg"); @@ -283,17 +274,6 @@ int32_t syncCfgFromJson(const cJSON *pRoot, SSyncCfg *pSyncCfg) { return 0; } -int32_t syncCfgFromStr(const char *s, SSyncCfg *pSyncCfg) { - cJSON *pRoot = cJSON_Parse(s); - ASSERT(pRoot != NULL); - - int32_t ret = syncCfgFromJson(pRoot, pSyncCfg); - ASSERT(ret == 0); - - cJSON_Delete(pRoot); - return 0; -} - cJSON *raftCfg2Json(SRaftCfg *pRaftCfg) { cJSON *pRoot = cJSON_CreateObject(); cJSON_AddItemToObject(pRoot, "SSyncCfg", syncCfg2Json(&(pRaftCfg->cfg))); diff --git a/source/libs/sync/src/syncRaftEntry.c b/source/libs/sync/src/syncRaftEntry.c index 262a7b0879..540054e473 100644 --- a/source/libs/sync/src/syncRaftEntry.c +++ b/source/libs/sync/src/syncRaftEntry.c @@ -102,7 +102,6 @@ void syncEntry2OriginalRpc(const SSyncRaftEntry* pEntry, SRpcMsg* pRpcMsg) { memcpy(pRpcMsg->pCont, pEntry->data, pRpcMsg->contLen); } -//----------------------------------- SRaftEntryHashCache* raftCacheCreate(SSyncNode* pSyncNode, int32_t maxCount) { SRaftEntryHashCache* pCache = taosMemoryMalloc(sizeof(SRaftEntryHashCache)); if (pCache == NULL) { @@ -256,8 +255,6 @@ int32_t raftCacheClear(struct SRaftEntryHashCache* pCache) { return 0; } - -//----------------------------------- static char* keyFn(const void* pData) { SSyncRaftEntry* pEntry = (SSyncRaftEntry*)pData; return (char*)(&(pEntry->index)); diff --git a/source/libs/sync/test/syncConfigChangeSnapshotTest.cpp b/source/libs/sync/test/syncConfigChangeSnapshotTest.cpp index a6d33aa674..fb227dfad3 100644 --- a/source/libs/sync/test/syncConfigChangeSnapshotTest.cpp +++ b/source/libs/sync/test/syncConfigChangeSnapshotTest.cpp @@ -143,7 +143,8 @@ int32_t SnapshotDoWrite(struct SSyncFSM* pFsm, void* pWriter, void* pBuf, int32_ void RestoreFinishCb(struct SSyncFSM* pFsm) { sTrace("==callback== ==RestoreFinishCb=="); } void ReConfigCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SReConfigCbMeta* cbMeta) { - sTrace("==callback== ==ReConfigCb== flag:0x%lX, index:%" PRId64 ", code:%d, currentTerm:%" PRIu64 ", term:%" PRIu64, + sTrace("==callback== ==ReConfigCb== flag:0x%" PRIx64 ", index:%" PRId64 ", code:%d, currentTerm:%" PRIu64 + ", term:%" PRIu64, cbMeta->flag, cbMeta->index, cbMeta->code, cbMeta->currentTerm, cbMeta->term); } diff --git a/source/libs/sync/test/syncConfigChangeTest.cpp b/source/libs/sync/test/syncConfigChangeTest.cpp index cf498933e1..23acadc0cc 100644 --- a/source/libs/sync/test/syncConfigChangeTest.cpp +++ b/source/libs/sync/test/syncConfigChangeTest.cpp @@ -73,7 +73,8 @@ int32_t GetSnapshotCb(const struct SSyncFSM* pFsm, SSnapshot* pSnapshot) { void RestoreFinishCb(struct SSyncFSM* pFsm) { sTrace("==callback== ==RestoreFinishCb=="); } void ReConfigCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SReConfigCbMeta* cbMeta) { - sTrace("==callback== ==ReConfigCb== flag:0x%lX, index:%" PRId64 ", code:%d, currentTerm:%" PRIu64 ", term:%" PRIu64, + sTrace("==callback== ==ReConfigCb== flag:%" PRIx64 ", index:%" PRId64 ", code:%d, currentTerm:%" PRIu64 + ", term:%" PRIu64, cbMeta->flag, cbMeta->index, cbMeta->code, cbMeta->currentTerm, cbMeta->term); } diff --git a/source/libs/sync/test/syncTestTool.cpp b/source/libs/sync/test/syncTestTool.cpp index b0fe612b7f..e8d40d5054 100644 --- a/source/libs/sync/test/syncTestTool.cpp +++ b/source/libs/sync/test/syncTestTool.cpp @@ -148,8 +148,8 @@ void RestoreFinishCb(struct SSyncFSM* pFsm) { sTrace("==callback== ==RestoreFini void ReConfigCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SReConfigCbMeta* cbMeta) { char* s = syncCfg2Str(&(cbMeta->newCfg)); - sTrace("==callback== ==ReConfigCb== flag:0x%lX, index:%" PRId64 ", code:%d, currentTerm:%" PRIu64 ", term:%" PRIu64 - ", newCfg:%s", + sTrace("==callback== ==ReConfigCb== flag:%" PRIx64 ", index:%" PRId64 ", code:%d, currentTerm:%" PRIu64 + ", term:%" PRIu64 ", newCfg:%s", cbMeta->flag, cbMeta->index, cbMeta->code, cbMeta->currentTerm, cbMeta->term, s); taosMemoryFree(s); } diff --git a/source/libs/sync/test/sync_test_lib/inc/syncTest.h b/source/libs/sync/test/sync_test_lib/inc/syncTest.h index 34ce8c3175..50d9d12eee 100644 --- a/source/libs/sync/test/sync_test_lib/inc/syncTest.h +++ b/source/libs/sync/test/sync_test_lib/inc/syncTest.h @@ -49,6 +49,9 @@ void syncEntryPrint2(char* s, const SSyncRaftEntry* pObj); void syncEntryLog(const SSyncRaftEntry* pObj); void syncEntryLog2(char* s, const SSyncRaftEntry* pObj); +char* syncCfg2Str(SSyncCfg* pSyncCfg); +int32_t syncCfgFromStr(const char* s, SSyncCfg* pSyncCfg); + cJSON* raftCache2Json(SRaftEntryHashCache* pObj); char* raftCache2Str(SRaftEntryHashCache* pObj); void raftCachePrint(SRaftEntryHashCache* pObj); diff --git a/source/libs/sync/test/sync_test_lib/src/syncRaftCfgDebug.c b/source/libs/sync/test/sync_test_lib/src/syncRaftCfgDebug.c index 88b697fbf1..50ecc5d478 100644 --- a/source/libs/sync/test/sync_test_lib/src/syncRaftCfgDebug.c +++ b/source/libs/sync/test/sync_test_lib/src/syncRaftCfgDebug.c @@ -16,4 +16,20 @@ #define _DEFAULT_SOURCE #include "syncTest.h" +char *syncCfg2Str(SSyncCfg *pSyncCfg) { + cJSON *pJson = syncCfg2Json(pSyncCfg); + char *serialized = cJSON_Print(pJson); + cJSON_Delete(pJson); + return serialized; +} +int32_t syncCfgFromStr(const char *s, SSyncCfg *pSyncCfg) { + cJSON *pRoot = cJSON_Parse(s); + ASSERT(pRoot != NULL); + + int32_t ret = syncCfgFromJson(pRoot, pSyncCfg); + ASSERT(ret == 0); + + cJSON_Delete(pRoot); + return 0; +} From 11d7fc6042b39dbe530494479fdaa3809f9e9ec0 Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Fri, 11 Nov 2022 13:29:35 +0800 Subject: [PATCH 16/18] fix: taosbenchmark ver on windows (#18039) * feat: taosbenchmark support query fails then continue * fix: taosbenchmark version for windows --- cmake/taostools_CMakeLists.txt.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/taostools_CMakeLists.txt.in b/cmake/taostools_CMakeLists.txt.in index d18d85171d..82a7052125 100644 --- a/cmake/taostools_CMakeLists.txt.in +++ b/cmake/taostools_CMakeLists.txt.in @@ -2,7 +2,7 @@ # taos-tools ExternalProject_Add(taos-tools GIT_REPOSITORY https://github.com/taosdata/taos-tools.git - GIT_TAG a921bd4 + GIT_TAG 23e2b73 SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools" BINARY_DIR "" #BUILD_IN_SOURCE TRUE From 504a9fec3150c8b66f93ca9a37b962d1ec1dfe84 Mon Sep 17 00:00:00 2001 From: Pan YANG Date: Fri, 11 Nov 2022 15:00:43 +0800 Subject: [PATCH 17/18] docs: add WeChat QR code of xiao-t --- docs/zh/05-get-started/index.md | 8 +++++++- docs/zh/05-get-started/tdengine.webp | Bin 0 -> 24678 bytes 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 docs/zh/05-get-started/tdengine.webp diff --git a/docs/zh/05-get-started/index.md b/docs/zh/05-get-started/index.md index 20f8235d87..cbdc332477 100644 --- a/docs/zh/05-get-started/index.md +++ b/docs/zh/05-get-started/index.md @@ -12,4 +12,10 @@ import DocCardList from '@theme/DocCardList'; import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; -``` \ No newline at end of file +``` + +### 开发者技术交流群 + +微信扫描下面二维码,加“小 T”为好友,即可加入“物联网大数据技术前沿群”,与大家共同交流物联网大数据技术应用、TDengine 使用问题和技巧等话题。 + + diff --git a/docs/zh/05-get-started/tdengine.webp b/docs/zh/05-get-started/tdengine.webp new file mode 100644 index 0000000000000000000000000000000000000000..e1bc0a75acd9f552ee2f5ceb3877670bfb49703b GIT binary patch literal 24678 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 A6#xJL literal 0 HcmV?d00001 From 3b68771a42635719bf42243508eb87bcc1e929b0 Mon Sep 17 00:00:00 2001 From: Pan YANG Date: Fri, 11 Nov 2022 15:44:55 +0800 Subject: [PATCH 18/18] fix: add html close tag for compile --- docs/zh/05-get-started/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/05-get-started/index.md b/docs/zh/05-get-started/index.md index cbdc332477..33661580ee 100644 --- a/docs/zh/05-get-started/index.md +++ b/docs/zh/05-get-started/index.md @@ -18,4 +18,4 @@ import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; 微信扫描下面二维码,加“小 T”为好友,即可加入“物联网大数据技术前沿群”,与大家共同交流物联网大数据技术应用、TDengine 使用问题和技巧等话题。 - +