From 7c7c452bbc3f4385d97203deac8cec92a3880477 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Mon, 22 Aug 2022 15:58:00 +0800 Subject: [PATCH 01/26] enh: add perf debug info --- source/client/inc/clientInt.h | 7 ++++++- source/client/inc/clientLog.h | 1 + source/client/src/clientEnv.c | 13 ++++++++++++- source/client/src/clientImpl.c | 2 ++ source/client/src/clientMain.c | 10 ++++++++++ 5 files changed, 31 insertions(+), 2 deletions(-) diff --git a/source/client/inc/clientInt.h b/source/client/inc/clientInt.h index f275ae0885..855dfb15ee 100644 --- a/source/client/inc/clientInt.h +++ b/source/client/inc/clientInt.h @@ -96,7 +96,12 @@ typedef struct { typedef struct SQueryExecMetric { int64_t start; // start timestamp, us - int64_t parsed; // start to parse, us + int64_t syntaxStart; // start to parse, us + int64_t syntaxEnd; // end to parse, us + int64_t ctgStart; // start to parse, us + int64_t ctgEnd; // end to parse, us + int64_t semanticEnd; + int64_t execEnd; int64_t send; // start to send to server, us int64_t rsp; // receive response from server, us } SQueryExecMetric; diff --git a/source/client/inc/clientLog.h b/source/client/inc/clientLog.h index d47edcd795..ec0a41a68f 100644 --- a/source/client/inc/clientLog.h +++ b/source/client/inc/clientLog.h @@ -29,6 +29,7 @@ extern "C" { #define tscDebug(...) do { if (cDebugFlag & DEBUG_DEBUG) { taosPrintLog("TSC ", DEBUG_DEBUG, cDebugFlag, __VA_ARGS__); }} while(0) #define tscTrace(...) do { if (cDebugFlag & DEBUG_TRACE) { taosPrintLog("TSC ", DEBUG_TRACE, cDebugFlag, __VA_ARGS__); }} while(0) #define tscDebugL(...) do { if (cDebugFlag & DEBUG_DEBUG) { taosPrintLongString("TSC ", DEBUG_DEBUG, cDebugFlag, __VA_ARGS__); }} while(0) +#define tscPerf(...) do { taosPrintLog("TSC ", 0, cDebugFlag, __VA_ARGS__); } while(0) #ifdef __cplusplus } diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c index ff1b9322c9..fac14be6f8 100644 --- a/source/client/src/clientEnv.c +++ b/source/client/src/clientEnv.c @@ -69,14 +69,25 @@ static void deregisterRequest(SRequestObj *pRequest) { int32_t currentInst = atomic_sub_fetch_64((int64_t *)&pActivity->currentRequests, 1); int32_t num = atomic_sub_fetch_32(&pTscObj->numOfReqs, 1); - int64_t duration = taosGetTimestampUs() - pRequest->metric.start; + int64_t nowUs = taosGetTimestampUs(); + int64_t duration = nowUs - pRequest->metric.start; tscDebug("0x%" PRIx64 " free Request from connObj: 0x%" PRIx64 ", reqId:0x%" PRIx64 " elapsed:%" PRIu64 " ms, current:%d, app current:%d", pRequest->self, pTscObj->id, pRequest->requestId, duration / 1000, num, currentInst); if (QUERY_NODE_VNODE_MODIF_STMT == pRequest->stmtType) { + tscPerf("insert duration %" PRId64 "us: syntax:%" PRId64 "us, ctg:%" PRId64 "us, semantic:%" PRId64 "us, exec:%" PRId64 "us", + duration, pRequest->metric.syntaxEnd - pRequest->metric.syntaxStart, + pRequest->metric.ctgEnd - pRequest->metric.ctgStart, + pRequest->metric.semanticEnd - pRequest->metric.ctgEnd, + pRequest->metric.execEnd - pRequest->metric.semanticEnd); atomic_add_fetch_64((int64_t *)&pActivity->insertElapsedTime, duration); } else if (QUERY_NODE_SELECT_STMT == pRequest->stmtType) { + tscPerf("select duration %" PRId64 "us: syntax:%" PRId64 "us, ctg:%" PRId64 "us, semantic:%" PRId64 "us, exec:%" PRId64 "us", + duration, pRequest->metric.syntaxEnd - pRequest->metric.syntaxStart, + pRequest->metric.ctgEnd - pRequest->metric.ctgStart, + pRequest->metric.semanticEnd - pRequest->metric.ctgEnd, + pRequest->metric.execEnd - pRequest->metric.semanticEnd); atomic_add_fetch_64((int64_t *)&pActivity->queryElapsedTime, duration); } diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index 9c086fc83e..b658340925 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -839,6 +839,8 @@ void schedulerExecCb(SExecResult* pResult, void* param, int32_t code) { } schedulerFreeJob(&pRequest->body.queryJob, 0); + + pRequest->metric.execEnd = taosGetTimestampUs(); } taosMemoryFree(pResult); diff --git a/source/client/src/clientMain.c b/source/client/src/clientMain.c index 0e95cd4d99..340e8e2955 100644 --- a/source/client/src/clientMain.c +++ b/source/client/src/clientMain.c @@ -683,6 +683,8 @@ void retrieveMetaCallback(SMetaData *pResultMeta, void *param, int32_t code) { SQuery *pQuery = pWrapper->pQuery; SRequestObj *pRequest = pWrapper->pRequest; + pRequest->metric.ctgEnd = taosGetTimestampUs(); + if (code == TSDB_CODE_SUCCESS) { code = qAnalyseSqlSemantic(pWrapper->pCtx, &pWrapper->catalogReq, pResultMeta, pQuery); pRequest->stableQuery = pQuery->stableQuery; @@ -691,6 +693,8 @@ void retrieveMetaCallback(SMetaData *pResultMeta, void *param, int32_t code) { } } + pRequest->metric.semanticEnd = taosGetTimestampUs(); + if (code == TSDB_CODE_SUCCESS) { if (pQuery->haveResultSet) { setResSchemaInfo(&pRequest->body.resInfo, pQuery->pResSchema, pQuery->numOfResCols); @@ -782,12 +786,16 @@ void doAsyncQuery(SRequestObj *pRequest, bool updateMetaForce) { SQuery *pQuery = NULL; + pRequest->metric.syntaxStart = taosGetTimestampUs(); + SCatalogReq catalogReq = {.forceUpdate = updateMetaForce, .qNodeRequired = qnodeRequired(pRequest)}; code = qParseSqlSyntax(pCxt, &pQuery, &catalogReq); if (code != TSDB_CODE_SUCCESS) { goto _error; } + pRequest->metric.syntaxEnd = taosGetTimestampUs(); + if (!updateMetaForce) { STscObj *pTscObj = pRequest->pTscObj; SAppClusterSummary *pActivity = &pTscObj->pAppInfo->summary; @@ -814,6 +822,8 @@ void doAsyncQuery(SRequestObj *pRequest, bool updateMetaForce) { .requestObjRefId = pCxt->requestRid, .mgmtEps = pCxt->mgmtEpSet}; + pRequest->metric.ctgStart = taosGetTimestampUs(); + code = catalogAsyncGetAllMeta(pCxt->pCatalog, &conn, &catalogReq, retrieveMetaCallback, pWrapper, &pRequest->body.queryJob); pCxt = NULL; From fda184b2c47d136ce99e0813a2940d305e137c8b Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Mon, 22 Aug 2022 17:42:37 +0800 Subject: [PATCH 02/26] fix: show sql in perf log --- source/client/src/clientEnv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c index fac14be6f8..ae92d2dc7c 100644 --- a/source/client/src/clientEnv.c +++ b/source/client/src/clientEnv.c @@ -341,7 +341,6 @@ void doDestroyRequest(void *p) { schedulerFreeJob(&pRequest->body.queryJob, 0); taosMemoryFreeClear(pRequest->msgBuf); - taosMemoryFreeClear(pRequest->sqlstr); taosMemoryFreeClear(pRequest->pDb); doFreeReqResultInfo(&pRequest->body.resInfo); @@ -360,6 +359,7 @@ void doDestroyRequest(void *p) { taosMemoryFree(pRequest->body.param); } + taosMemoryFreeClear(pRequest->sqlstr); taosMemoryFree(pRequest); tscTrace("end to destroy request %" PRIx64 " p:%p", reqId, pRequest); } From 2889b8d9135b972f00300a3c10b5c1661aaf0cb8 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Tue, 23 Aug 2022 17:28:08 +0800 Subject: [PATCH 03/26] refactor(query): do some internal refactor. --- source/dnode/vnode/src/tsdb/tsdbRead.c | 30 +++++++++++++--------- source/libs/executor/src/executorimpl.c | 1 + source/libs/executor/src/projectoperator.c | 24 +++++++++++------ 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index a4738781f5..bbef249079 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -178,7 +178,7 @@ static int32_t doAppendRowFromFileBlock(SSDataBlock* pResBlock, STsdbReader* pR static void setComposedBlockFlag(STsdbReader* pReader, bool composed); static bool hasBeenDropped(const SArray* pDelList, int32_t* index, TSDBKEY* pKey, int32_t order); -static void doMergeMultiRows(TSDBROW* pRow, uint64_t uid, SIterInfo* pIter, SArray* pDelList, STSRow** pTSRow, +static void doMergeMemTableMultiRows(TSDBROW* pRow, uint64_t uid, SIterInfo* pIter, SArray* pDelList, STSRow** pTSRow, STsdbReader* pReader, bool* freeTSRow); static void doMergeMemIMemRows(TSDBROW* pRow, TSDBROW* piRow, STableBlockScanInfo* pBlockScanInfo, STsdbReader* pReader, STSRow** pTSRow); @@ -1510,6 +1510,7 @@ static int32_t doMergeBufAndFileRows_Rv(STsdbReader* pReader, STableBlockScanInf return TSDB_CODE_SUCCESS; } +#if 0 static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo* pBlockScanInfo, TSDBROW* pRow, SIterInfo* pIter, int64_t key, SLastBlockReader* pLastBlockReader) { SRowMerger merge = {0}; @@ -1536,7 +1537,7 @@ static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo* freeTSRow = true; } } else if (k.ts < key) { // k.ts < key - doMergeMultiRows(pRow, pBlockScanInfo->uid, pIter, pDelList, &pTSRow, pReader, &freeTSRow); + doMergeMemTableMultiRows(pRow, pBlockScanInfo->uid, pIter, pDelList, &pTSRow, pReader, &freeTSRow); } else { // k.ts == key, ascending order: file block ----> imem rows -----> mem rows tRowMergerInit(&merge, &fRow, pReader->pSchema); doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge); @@ -1549,7 +1550,7 @@ static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo* } } else { // descending order scan if (key < k.ts) { - doMergeMultiRows(pRow, pBlockScanInfo->uid, pIter, pDelList, &pTSRow, pReader, &freeTSRow); + doMergeMemTableMultiRows(pRow, pBlockScanInfo->uid, pIter, pDelList, &pTSRow, pReader, &freeTSRow); } else if (k.ts < key) { if (tryCopyDistinctRowFromFileBlock(pReader, pBlockData, key, pDumpInfo)) { return TSDB_CODE_SUCCESS; @@ -1583,6 +1584,8 @@ static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo* return TSDB_CODE_SUCCESS; } +#endif + static int32_t doMergeMultiLevelRowsRv(STsdbReader* pReader, STableBlockScanInfo* pBlockScanInfo, SBlockData* pBlockData, SLastBlockReader* pLastBlockReader) { SRowMerger merge = {0}; STSRow* pTSRow = NULL; @@ -1734,6 +1737,7 @@ static int32_t doMergeMultiLevelRowsRv(STsdbReader* pReader, STableBlockScanInfo return TSDB_CODE_SUCCESS; } +#if 0 static int32_t doMergeThreeLevelRows(STsdbReader* pReader, STableBlockScanInfo* pBlockScanInfo, SBlockData* pBlockData) { SRowMerger merge = {0}; STSRow* pTSRow = NULL; @@ -1779,7 +1783,7 @@ static int32_t doMergeThreeLevelRows(STsdbReader* pReader, STableBlockScanInfo* // [3] ik.ts < key <= k.ts // [4] ik.ts < k.ts <= key if (ik.ts < k.ts) { - doMergeMultiRows(piRow, uid, &pBlockScanInfo->iiter, pDelList, &pTSRow, pReader, &freeTSRow); + doMergeMemTableMultiRows(piRow, uid, &pBlockScanInfo->iiter, pDelList, &pTSRow, pReader, &freeTSRow); doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, uid); if (freeTSRow) { taosMemoryFree(pTSRow); @@ -1790,7 +1794,7 @@ static int32_t doMergeThreeLevelRows(STsdbReader* pReader, STableBlockScanInfo* // [5] k.ts < key <= ik.ts // [6] k.ts < ik.ts <= key if (k.ts < ik.ts) { - doMergeMultiRows(pRow, uid, &pBlockScanInfo->iter, pDelList, &pTSRow, pReader, &freeTSRow); + doMergeMemTableMultiRows(pRow, uid, &pBlockScanInfo->iter, pDelList, &pTSRow, pReader, &freeTSRow); doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, uid); if (freeTSRow) { taosMemoryFree(pTSRow); @@ -1836,7 +1840,7 @@ static int32_t doMergeThreeLevelRows(STsdbReader* pReader, STableBlockScanInfo* // [3] ik.ts > k.ts >= Key // [4] ik.ts > key >= k.ts if (ik.ts > key) { - doMergeMultiRows(piRow, uid, &pBlockScanInfo->iiter, pDelList, &pTSRow, pReader, &freeTSRow); + doMergeMemTableMultiRows(piRow, uid, &pBlockScanInfo->iiter, pDelList, &pTSRow, pReader, &freeTSRow); doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, uid); if (freeTSRow) { taosMemoryFree(pTSRow); @@ -1859,7 +1863,7 @@ static int32_t doMergeThreeLevelRows(STsdbReader* pReader, STableBlockScanInfo* //[7] key = ik.ts > k.ts if (key == ik.ts) { - doMergeMultiRows(piRow, uid, &pBlockScanInfo->iiter, pDelList, &pTSRow, pReader, &freeTSRow); + doMergeMemTableMultiRows(piRow, uid, &pBlockScanInfo->iiter, pDelList, &pTSRow, pReader, &freeTSRow); TSDBROW fRow = tsdbRowFromBlockData(pBlockData, pDumpInfo->rowIndex); tRowMerge(&merge, &fRow); @@ -1876,6 +1880,7 @@ static int32_t doMergeThreeLevelRows(STsdbReader* pReader, STableBlockScanInfo* ASSERT(0); return -1; } +#endif static bool isValidFileBlockRow(SBlockData* pBlockData, SFileBlockDumpInfo* pDumpInfo, STableBlockScanInfo* pBlockScanInfo, STsdbReader* pReader) { @@ -3115,7 +3120,7 @@ int32_t doMergeRowsInLastBlock(SLastBlockReader* pLastBlockReader, STableBlockSc return TSDB_CODE_SUCCESS; } -void doMergeMultiRows(TSDBROW* pRow, uint64_t uid, SIterInfo* pIter, SArray* pDelList, STSRow** pTSRow, +void doMergeMemTableMultiRows(TSDBROW* pRow, uint64_t uid, SIterInfo* pIter, SArray* pDelList, STSRow** pTSRow, STsdbReader* pReader, bool* freeTSRow) { TSDBROW* pNextRow = NULL; TSDBROW current = *pRow; @@ -3197,6 +3202,7 @@ int32_t tsdbGetNextRowInMem(STableBlockScanInfo* pBlockScanInfo, STsdbReader* pR TSDBROW* pRow = getValidRow(&pBlockScanInfo->iter, pBlockScanInfo->delSkyline, pReader); TSDBROW* piRow = getValidRow(&pBlockScanInfo->iiter, pBlockScanInfo->delSkyline, pReader); SArray* pDelList = pBlockScanInfo->delSkyline; + uint64_t uid = pBlockScanInfo->uid; // todo refactor bool asc = ASCENDING_TRAVERSE(pReader->order); @@ -3219,9 +3225,9 @@ int32_t tsdbGetNextRowInMem(STableBlockScanInfo* pBlockScanInfo, STsdbReader* pR TSDBKEY ik = TSDBROW_KEY(piRow); if (ik.ts < k.ts) { // ik.ts < k.ts - doMergeMultiRows(piRow, pBlockScanInfo->uid, &pBlockScanInfo->iiter, pDelList, pTSRow, pReader, freeTSRow); + doMergeMemTableMultiRows(piRow, uid, &pBlockScanInfo->iiter, pDelList, pTSRow, pReader, freeTSRow); } else if (k.ts < ik.ts) { - doMergeMultiRows(pRow, pBlockScanInfo->uid, &pBlockScanInfo->iter, pDelList, pTSRow, pReader, freeTSRow); + doMergeMemTableMultiRows(pRow, uid, &pBlockScanInfo->iter, pDelList, pTSRow, pReader, freeTSRow); } else { // ik.ts == k.ts doMergeMemIMemRows(pRow, piRow, pBlockScanInfo, pReader, pTSRow); *freeTSRow = true; @@ -3231,12 +3237,12 @@ int32_t tsdbGetNextRowInMem(STableBlockScanInfo* pBlockScanInfo, STsdbReader* pR } if (pBlockScanInfo->iter.hasVal && pRow != NULL) { - doMergeMultiRows(pRow, pBlockScanInfo->uid, &pBlockScanInfo->iter, pDelList, pTSRow, pReader, freeTSRow); + doMergeMemTableMultiRows(pRow, pBlockScanInfo->uid, &pBlockScanInfo->iter, pDelList, pTSRow, pReader, freeTSRow); return TSDB_CODE_SUCCESS; } if (pBlockScanInfo->iiter.hasVal && piRow != NULL) { - doMergeMultiRows(piRow, pBlockScanInfo->uid, &pBlockScanInfo->iiter, pDelList, pTSRow, pReader, freeTSRow); + doMergeMemTableMultiRows(piRow, uid, &pBlockScanInfo->iiter, pDelList, pTSRow, pReader, freeTSRow); return TSDB_CODE_SUCCESS; } diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index 82723eebf2..9e56d63673 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -3487,6 +3487,7 @@ int32_t doInitAggInfoSup(SAggSupporter* pAggSup, SqlFunctionCtx* pCtx, int32_t n qError("Init stream agg supporter failed since %s", terrstr(terrno)); return terrno; } + int32_t code = createDiskbasedBuf(&pAggSup->pResultBuf, defaultPgsz, defaultBufsz, pKey, tsTempDir); if (code != TSDB_CODE_SUCCESS) { qError("Create agg result buf failed since %s", tstrerror(code)); diff --git a/source/libs/executor/src/projectoperator.c b/source/libs/executor/src/projectoperator.c index f2b79bf703..94da3e23e1 100644 --- a/source/libs/executor/src/projectoperator.c +++ b/source/libs/executor/src/projectoperator.c @@ -50,9 +50,11 @@ static void destroyIndefinitOperatorInfo(void* param, int32_t numOfOutput) { SOperatorInfo* createProjectOperatorInfo(SOperatorInfo* downstream, SProjectPhysiNode* pProjPhyNode, SExecTaskInfo* pTaskInfo) { + int32_t code = TSDB_CODE_SUCCESS; SProjectOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SProjectOperatorInfo)); SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo)); if (pInfo == NULL || pOperator == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; goto _error; } @@ -67,12 +69,11 @@ SOperatorInfo* createProjectOperatorInfo(SOperatorInfo* downstream, SProjectPhys pInfo->binfo.pRes = pResBlock; pInfo->pFinalRes = createOneDataBlock(pResBlock, false); pInfo->pFilterNode = pProjPhyNode->node.pConditions; - pInfo->mergeDataBlocks = pProjPhyNode->mergeDataBlock; - - // todo remove it soon if (pTaskInfo->execModel == OPTR_EXEC_MODEL_STREAM) { pInfo->mergeDataBlocks = false; + } else { + pInfo->mergeDataBlocks = pProjPhyNode->mergeDataBlock; } int32_t numOfRows = 4096; @@ -83,9 +84,13 @@ SOperatorInfo* createProjectOperatorInfo(SOperatorInfo* downstream, SProjectPhys if (numOfRows * pResBlock->info.rowSize > TWOMB) { numOfRows = TWOMB / pResBlock->info.rowSize; } - initResultSizeInfo(&pOperator->resultInfo, numOfRows); - initAggInfo(&pOperator->exprSupp, &pInfo->aggSup, pExprInfo, numOfCols, keyBufSize, pTaskInfo->id.str); + initResultSizeInfo(&pOperator->resultInfo, numOfRows); + code = initAggInfo(&pOperator->exprSupp, &pInfo->aggSup, pExprInfo, numOfCols, keyBufSize, pTaskInfo->id.str); + if (code != TSDB_CODE_SUCCESS) { + goto _error; + } + initBasicInfo(&pInfo->binfo, pResBlock); setFunctionResultOutput(pOperator, &pInfo->binfo, &pInfo->aggSup, MAIN_SCAN, numOfCols); @@ -99,7 +104,7 @@ SOperatorInfo* createProjectOperatorInfo(SOperatorInfo* downstream, SProjectPhys pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doProjectOperation, NULL, NULL, destroyProjectOperatorInfo, NULL, NULL, NULL); - int32_t code = appendDownstream(pOperator, &downstream, 1); + code = appendDownstream(pOperator, &downstream, 1); if (code != TSDB_CODE_SUCCESS) { goto _error; } @@ -107,7 +112,9 @@ SOperatorInfo* createProjectOperatorInfo(SOperatorInfo* downstream, SProjectPhys return pOperator; _error: - pTaskInfo->code = TSDB_CODE_OUT_OF_MEMORY; + destroyProjectOperatorInfo(pInfo, numOfCols); + taosMemoryFree(pOperator); + pTaskInfo->code = code; return NULL; } @@ -175,7 +182,8 @@ static int32_t doIngroupLimitOffset(SLimitInfo* pLimitInfo, uint64_t groupId, SS int32_t keepRows = (int32_t)(pLimitInfo->limit.limit - pLimitInfo->numOfOutputRows); blockDataKeepFirstNRows(pBlock, keepRows); //TODO: optimize it later when partition by + limit - if ((pLimitInfo->slimit.limit == -1 && pLimitInfo->currentGroupId == 0) || pLimitInfo->slimit.limit > 0 && pLimitInfo->slimit.limit <= pLimitInfo->numOfOutputGroups) { + if ((pLimitInfo->slimit.limit == -1 && pLimitInfo->currentGroupId == 0) || + (pLimitInfo->slimit.limit > 0 && pLimitInfo->slimit.limit <= pLimitInfo->numOfOutputGroups)) { doSetOperatorCompleted(pOperator); } } From b0263a4bea50d77316f241689ad6238646b9af07 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Tue, 23 Aug 2022 17:29:31 +0800 Subject: [PATCH 04/26] enh: increase startup time monitoring --- include/common/tglobal.h | 1 + include/common/tmsgdef.h | 1 + source/common/src/systable.c | 3 +- source/common/src/tglobal.c | 1 + source/dnode/mnode/impl/inc/mndCluster.h | 1 + source/dnode/mnode/impl/inc/mndDef.h | 1 + source/dnode/mnode/impl/src/mndCluster.c | 113 +++++++++++++++++++---- source/dnode/mnode/impl/src/mndMain.c | 20 +++- source/dnode/mnode/impl/src/mndSync.c | 10 +- source/libs/transport/src/thttp.c | 4 +- source/util/src/tcache.c | 2 +- source/util/src/tcompression.c | 4 +- tests/script/tmp/monitor.sim | 4 +- 13 files changed, 133 insertions(+), 32 deletions(-) diff --git a/include/common/tglobal.h b/include/common/tglobal.h index cd74ffd477..f872d1dbc2 100644 --- a/include/common/tglobal.h +++ b/include/common/tglobal.h @@ -130,6 +130,7 @@ extern int32_t tsMqRebalanceInterval; extern int32_t tsTtlUnit; extern int32_t tsTtlPushInterval; extern int32_t tsGrantHBInterval; +extern int32_t tsUptimeInterval; #define NEEDTO_COMPRESSS_MSG(size) (tsCompressMsgSize != -1 && (size) > tsCompressMsgSize) diff --git a/include/common/tmsgdef.h b/include/common/tmsgdef.h index e2bb3e2ae1..006ba7f21b 100644 --- a/include/common/tmsgdef.h +++ b/include/common/tmsgdef.h @@ -170,6 +170,7 @@ enum { TD_DEF_MSG_TYPE(TDMT_MND_SPLIT_VGROUP, "split-vgroup", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_SHOW_VARIABLES, "show-variables", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_SERVER_VERSION, "server-version", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_MND_UPTIME_TIMER, "uptime-timer", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_MAX_MSG, "mnd-max", NULL, NULL) TD_NEW_MSG_SEG(TDMT_VND_MSG) diff --git a/source/common/src/systable.c b/source/common/src/systable.c index 65041e1f12..68a77a9f33 100644 --- a/source/common/src/systable.c +++ b/source/common/src/systable.c @@ -66,8 +66,9 @@ static const SSysDbTableSchema bnodesSchema[] = { }; static const SSysDbTableSchema clusterSchema[] = { - {.name = "id", .bytes = 4, .type = TSDB_DATA_TYPE_INT}, + {.name = "id", .bytes = 8, .type = TSDB_DATA_TYPE_BIGINT}, {.name = "name", .bytes = TSDB_CLUSTER_ID_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, + {.name = "uptime", .bytes = 4, .type = TSDB_DATA_TYPE_INT}, {.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP}, }; diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index adc5af1a17..a628f551f4 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -164,6 +164,7 @@ int32_t tsMqRebalanceInterval = 2; int32_t tsTtlUnit = 86400; int32_t tsTtlPushInterval = 86400; int32_t tsGrantHBInterval = 60; +int32_t tsUptimeInterval = 300; // seconds #ifndef _STORAGE int32_t taosSetTfsCfg(SConfig *pCfg) { diff --git a/source/dnode/mnode/impl/inc/mndCluster.h b/source/dnode/mnode/impl/inc/mndCluster.h index 0de253fb6a..2cb41edd7c 100644 --- a/source/dnode/mnode/impl/inc/mndCluster.h +++ b/source/dnode/mnode/impl/inc/mndCluster.h @@ -27,6 +27,7 @@ void mndCleanupCluster(SMnode *pMnode); int32_t mndGetClusterName(SMnode *pMnode, char *clusterName, int32_t len); int64_t mndGetClusterId(SMnode *pMnode); int64_t mndGetClusterCreateTime(SMnode *pMnode); +float mndGetClusterUpTime(SMnode *pMnode); #ifdef __cplusplus } diff --git a/source/dnode/mnode/impl/inc/mndDef.h b/source/dnode/mnode/impl/inc/mndDef.h index 8cff7fe48e..ea05215fe9 100644 --- a/source/dnode/mnode/impl/inc/mndDef.h +++ b/source/dnode/mnode/impl/inc/mndDef.h @@ -179,6 +179,7 @@ typedef struct { char name[TSDB_CLUSTER_ID_LEN]; int64_t createdTime; int64_t updateTime; + int32_t upTime; } SClusterObj; typedef struct { diff --git a/source/dnode/mnode/impl/src/mndCluster.c b/source/dnode/mnode/impl/src/mndCluster.c index a82bf739f5..7d633f90bd 100644 --- a/source/dnode/mnode/impl/src/mndCluster.c +++ b/source/dnode/mnode/impl/src/mndCluster.c @@ -19,7 +19,7 @@ #include "mndTrans.h" #define CLUSTER_VER_NUMBE 1 -#define CLUSTER_RESERVE_SIZE 64 +#define CLUSTER_RESERVE_SIZE 60 static SSdbRaw *mndClusterActionEncode(SClusterObj *pCluster); static SSdbRow *mndClusterActionDecode(SSdbRaw *pRaw); @@ -29,6 +29,7 @@ static int32_t mndClusterActionUpdate(SSdb *pSdb, SClusterObj *pOldCluster, SCl static int32_t mndCreateDefaultCluster(SMnode *pMnode); static int32_t mndRetrieveClusters(SRpcMsg *pMsg, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows); static void mndCancelGetNextCluster(SMnode *pMnode, void *pIter); +static int32_t mndProcessUptimeTimer(SRpcMsg *pReq); int32_t mndInitCluster(SMnode *pMnode) { SSdbTable table = { @@ -42,8 +43,10 @@ int32_t mndInitCluster(SMnode *pMnode) { .deleteFp = (SdbDeleteFp)mndClusterActionDelete, }; + mndSetMsgHandle(pMnode, TDMT_MND_UPTIME_TIMER, mndProcessUptimeTimer); mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_CLUSTER, mndRetrieveClusters); mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_CLUSTER, mndCancelGetNextCluster); + return sdbSetTable(pMnode->pSdb, table); } @@ -62,40 +65,69 @@ int32_t mndGetClusterName(SMnode *pMnode, char *clusterName, int32_t len) { return 0; } -int64_t mndGetClusterId(SMnode *pMnode) { - SSdb *pSdb = pMnode->pSdb; - void *pIter = NULL; - int64_t clusterId = -1; +static SClusterObj *mndAcquireCluster(SMnode *pMnode) { + SSdb *pSdb = pMnode->pSdb; + void *pIter = NULL; while (1) { SClusterObj *pCluster = NULL; pIter = sdbFetch(pSdb, SDB_CLUSTER, pIter, (void **)&pCluster); if (pIter == NULL) break; + return pCluster; + } + + return NULL; +} + +static void mndReleaseCluster(SMnode *pMnode, SClusterObj *pCluster) { + SSdb *pSdb = pMnode->pSdb; + sdbRelease(pSdb, pCluster); +} + +int64_t mndGetClusterId(SMnode *pMnode) { + int64_t clusterId = 0; + SClusterObj *pCluster = mndAcquireCluster(pMnode); + if (pCluster != NULL) { clusterId = pCluster->id; - sdbRelease(pSdb, pCluster); + mndReleaseCluster(pMnode, pCluster); } return clusterId; } int64_t mndGetClusterCreateTime(SMnode *pMnode) { - SSdb *pSdb = pMnode->pSdb; - void *pIter = NULL; - int64_t createTime = INT64_MAX; - - while (1) { - SClusterObj *pCluster = NULL; - pIter = sdbFetch(pSdb, SDB_CLUSTER, pIter, (void **)&pCluster); - if (pIter == NULL) break; - + int64_t createTime = 0; + SClusterObj *pCluster = mndAcquireCluster(pMnode); + if (pCluster != NULL) { createTime = pCluster->createdTime; - sdbRelease(pSdb, pCluster); + mndReleaseCluster(pMnode, pCluster); } return createTime; } +static int32_t mndGetClusterUpTimeImp(SClusterObj *pCluster) { +#if 0 + int32_t upTime = taosGetTimestampSec() - pCluster->updateTime / 1000; + upTime = upTime + pCluster->upTime; + return upTime; +#else + return pCluster->upTime; +#endif +} + +float mndGetClusterUpTime(SMnode *pMnode) { + int64_t upTime = 0; + SClusterObj *pCluster = mndAcquireCluster(pMnode); + if (pCluster != NULL) { + upTime = mndGetClusterUpTimeImp(pCluster); + mndReleaseCluster(pMnode, pCluster); + } + + return upTime / 86400.0f; +} + static SSdbRaw *mndClusterActionEncode(SClusterObj *pCluster) { terrno = TSDB_CODE_OUT_OF_MEMORY; @@ -107,6 +139,7 @@ static SSdbRaw *mndClusterActionEncode(SClusterObj *pCluster) { SDB_SET_INT64(pRaw, dataPos, pCluster->createdTime, _OVER) SDB_SET_INT64(pRaw, dataPos, pCluster->updateTime, _OVER) SDB_SET_BINARY(pRaw, dataPos, pCluster->name, TSDB_CLUSTER_ID_LEN, _OVER) + SDB_SET_INT32(pRaw, dataPos, pCluster->upTime, _OVER) SDB_SET_RESERVE(pRaw, dataPos, CLUSTER_RESERVE_SIZE, _OVER) terrno = 0; @@ -144,6 +177,7 @@ static SSdbRow *mndClusterActionDecode(SSdbRaw *pRaw) { SDB_GET_INT64(pRaw, dataPos, &pCluster->createdTime, _OVER) SDB_GET_INT64(pRaw, dataPos, &pCluster->updateTime, _OVER) SDB_GET_BINARY(pRaw, dataPos, pCluster->name, TSDB_CLUSTER_ID_LEN, _OVER) + SDB_GET_INT32(pRaw, dataPos, &pCluster->upTime, _OVER) SDB_GET_RESERVE(pRaw, dataPos, CLUSTER_RESERVE_SIZE, _OVER) terrno = 0; @@ -162,6 +196,7 @@ _OVER: static int32_t mndClusterActionInsert(SSdb *pSdb, SClusterObj *pCluster) { mTrace("cluster:%" PRId64 ", perform insert action, row:%p", pCluster->id, pCluster); pSdb->pMnode->clusterId = pCluster->id; + pCluster->updateTime = taosGetTimestampMs(); return 0; } @@ -171,7 +206,10 @@ static int32_t mndClusterActionDelete(SSdb *pSdb, SClusterObj *pCluster) { } static int32_t mndClusterActionUpdate(SSdb *pSdb, SClusterObj *pOld, SClusterObj *pNew) { - mTrace("cluster:%" PRId64 ", perform update action, old row:%p new row:%p", pOld->id, pOld, pNew); + mTrace("cluster:%" PRId64 ", perform update action, old row:%p new row:%p, uptime from %d to %d", pOld->id, pOld, + pNew, pOld->upTime, pNew->upTime); + pOld->upTime = pNew->upTime; + pOld->updateTime = taosGetTimestampMs(); return 0; } @@ -242,6 +280,10 @@ static int32_t mndRetrieveClusters(SRpcMsg *pMsg, SShowObj *pShow, SSDataBlock * pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, numOfRows, buf, false); + int32_t upTime = mndGetClusterUpTimeImp(pCluster); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + colDataAppend(pColInfo, numOfRows, (const char *)&upTime, false); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, numOfRows, (const char *)&pCluster->createdTime, false); @@ -257,3 +299,40 @@ static void mndCancelGetNextCluster(SMnode *pMnode, void *pIter) { SSdb *pSdb = pMnode->pSdb; sdbCancelFetch(pSdb, pIter); } + +static int32_t mndProcessUptimeTimer(SRpcMsg *pReq) { + SMnode *pMnode = pReq->info.node; + SClusterObj clusterObj = {0}; + SClusterObj *pCluster = mndAcquireCluster(pMnode); + if (pCluster != NULL) { + memcpy(&clusterObj, pCluster, sizeof(SClusterObj)); + clusterObj.upTime += tsUptimeInterval; + mndReleaseCluster(pMnode, pCluster); + } + + if (clusterObj.id <= 0) { + mError("can't get cluster info while update uptime"); + return 0; + } + + mTrace("update cluster uptime to %" PRId64, clusterObj.upTime); + STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_NOTHING, pReq); + if (pTrans == NULL) return -1; + + SSdbRaw *pCommitRaw = mndClusterActionEncode(&clusterObj); + if (pCommitRaw == NULL || mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) { + mError("trans:%d, failed to append commit log since %s", pTrans->id, terrstr()); + mndTransDrop(pTrans); + return -1; + } + sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY); + + if (mndTransPrepare(pMnode, pTrans) != 0) { + mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr()); + mndTransDrop(pTrans); + return -1; + } + + mndTransDrop(pTrans); + return 0; +} diff --git a/source/dnode/mnode/impl/src/mndMain.c b/source/dnode/mnode/impl/src/mndMain.c index c3296ac5c1..aa775c5ffa 100644 --- a/source/dnode/mnode/impl/src/mndMain.c +++ b/source/dnode/mnode/impl/src/mndMain.c @@ -100,6 +100,16 @@ static void mndGrantHeartBeat(SMnode *pMnode) { } } +static void mndIncreaseUpTime(SMnode *pMnode) { + int32_t contLen = 0; + void *pReq = mndBuildTimerMsg(&contLen); + if (pReq != NULL) { + SRpcMsg rpcMsg = { + .msgType = TDMT_MND_UPTIME_TIMER, .pCont = pReq, .contLen = contLen, .info.ahandle = (void *)0x9528}; + tmsgPutToQueue(&pMnode->msgCb, WRITE_QUEUE, &rpcMsg); + } +} + static void *mndThreadFp(void *param) { SMnode *pMnode = param; int64_t lastTime = 0; @@ -129,6 +139,10 @@ static void *mndThreadFp(void *param) { if (lastTime % (tsGrantHBInterval * 10) == 0) { mndGrantHeartBeat(pMnode); } + + if ((lastTime % (tsUptimeInterval * 10)) == ((tsUptimeInterval - 1) * 10)) { + mndIncreaseUpTime(pMnode); + } } return NULL; @@ -556,7 +570,8 @@ static int32_t mndCheckMnodeState(SRpcMsg *pMsg) { } if (mndAcquireRpcRef(pMsg->info.node) == 0) return 0; if (pMsg->msgType == TDMT_MND_MQ_TIMER || pMsg->msgType == TDMT_MND_TELEM_TIMER || - pMsg->msgType == TDMT_MND_TRANS_TIMER || pMsg->msgType == TDMT_MND_TTL_TIMER) { + pMsg->msgType == TDMT_MND_TRANS_TIMER || pMsg->msgType == TDMT_MND_TTL_TIMER || + pMsg->msgType == TDMT_MND_UPTIME_TIMER) { return -1; } @@ -705,7 +720,8 @@ int32_t mndGetMonitorInfo(SMnode *pMnode, SMonClusterInfo *pClusterInfo, SMonVgr if (pObj->id == pMnode->selfDnodeId) { pClusterInfo->first_ep_dnode_id = pObj->id; tstrncpy(pClusterInfo->first_ep, pObj->pDnode->ep, sizeof(pClusterInfo->first_ep)); - pClusterInfo->master_uptime = (ms - pObj->stateStartTime) / (86400000.0f); + pClusterInfo->master_uptime = mndGetClusterUpTime(pMnode); + // pClusterInfo->master_uptime = (ms - pObj->stateStartTime) / (86400000.0f); tstrncpy(desc.role, syncStr(TAOS_SYNC_STATE_LEADER), sizeof(desc.role)); } else { tstrncpy(desc.role, syncStr(pObj->state), sizeof(desc.role)); diff --git a/source/dnode/mnode/impl/src/mndSync.c b/source/dnode/mnode/impl/src/mndSync.c index 8e8cff853c..b7129cf56e 100644 --- a/source/dnode/mnode/impl/src/mndSync.c +++ b/source/dnode/mnode/impl/src/mndSync.c @@ -68,7 +68,7 @@ void mndSyncCommitMsg(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta cbM if (pMgmt->errCode != 0) { mError("trans:%d, failed to propose since %s, post sem", transId, tstrerror(pMgmt->errCode)); } else { - mInfo("trans:%d, is proposed and post sem", transId, tstrerror(pMgmt->errCode)); + mDebug("trans:%d, is proposed and post sem", transId, tstrerror(pMgmt->errCode)); } pMgmt->transId = 0; taosWUnLockLatch(&pMgmt->lock); @@ -118,7 +118,7 @@ void mndReConfig(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SReConfigCbMeta cbM SSyncMgmt *pMgmt = &pMnode->syncMgmt; pMgmt->errCode = cbMeta.code; - mInfo("trans:-1, sync reconfig is proposed, saved:%d code:0x%x, index:%" PRId64 " term:%" PRId64, pMgmt->transId, + mDebug("trans:-1, sync reconfig is proposed, saved:%d code:0x%x, index:%" PRId64 " term:%" PRId64, pMgmt->transId, cbMeta.code, cbMeta.index, cbMeta.term); taosWLockLatch(&pMgmt->lock); @@ -126,7 +126,7 @@ void mndReConfig(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SReConfigCbMeta cbM if (pMgmt->errCode != 0) { mError("trans:-1, failed to propose sync reconfig since %s, post sem", tstrerror(pMgmt->errCode)); } else { - mInfo("trans:-1, sync reconfig is proposed, saved:%d code:0x%x, index:%" PRId64 " term:%" PRId64 " post sem", + mDebug("trans:-1, sync reconfig is proposed, saved:%d code:0x%x, index:%" PRId64 " term:%" PRId64 " post sem", pMgmt->transId, cbMeta.code, cbMeta.index, cbMeta.term); } pMgmt->transId = 0; @@ -228,7 +228,7 @@ int32_t mndInitSync(SMnode *pMnode) { syncInfo.isStandBy = pMgmt->standby; syncInfo.snapshotStrategy = SYNC_STRATEGY_STANDARD_SNAPSHOT; - mInfo("start to open mnode sync, standby:%d", pMgmt->standby); + mDebug("start to open mnode sync, standby:%d", pMgmt->standby); if (pMgmt->standby || pMgmt->replica.id > 0) { SSyncCfg *pCfg = &syncInfo.syncCfg; pCfg->replicaNum = 1; @@ -236,7 +236,7 @@ int32_t mndInitSync(SMnode *pMnode) { SNodeInfo *pNode = &pCfg->nodeInfo[0]; tstrncpy(pNode->nodeFqdn, pMgmt->replica.fqdn, sizeof(pNode->nodeFqdn)); pNode->nodePort = pMgmt->replica.port; - mInfo("mnode ep:%s:%u", pNode->nodeFqdn, pNode->nodePort); + mDebug("mnode ep:%s:%u", pNode->nodeFqdn, pNode->nodePort); } tsem_init(&pMgmt->syncSem, 0, 0); diff --git a/source/libs/transport/src/thttp.c b/source/libs/transport/src/thttp.c index 7cfb188ac9..935f536a90 100644 --- a/source/libs/transport/src/thttp.c +++ b/source/libs/transport/src/thttp.c @@ -145,7 +145,7 @@ static void clientRecvCb(uv_stream_t* handle, ssize_t nread, const uv_buf_t *buf if (nread < 0) { uError("http-report read error:%s", uv_err_name(nread)); } else { - uInfo("http-report succ to read %d bytes, just ignore it", nread); + uTrace("http-report succ to read %d bytes, just ignore it", nread); } uv_close((uv_handle_t*)&cli->tcp, clientCloseCb); } @@ -155,7 +155,7 @@ static void clientSentCb(uv_write_t* req, int32_t status) { terrno = TAOS_SYSTEM_ERROR(status); uError("http-report failed to send data %s", uv_strerror(status)); } else { - uInfo("http-report succ to send data"); + uTrace("http-report succ to send data"); } uv_read_start((uv_stream_t *)&cli->tcp, clientAllocBuffCb, clientRecvCb); } diff --git a/source/util/src/tcache.c b/source/util/src/tcache.c index dd61f7d225..f9f42aa103 100644 --- a/source/util/src/tcache.c +++ b/source/util/src/tcache.c @@ -702,7 +702,7 @@ void taosCacheCleanup(SCacheObj *pCacheObj) { taosMsleep(50); } - uInfo("cache:%s will be cleaned up", pCacheObj->name); + uTrace("cache:%s will be cleaned up", pCacheObj->name); doCleanupDataCache(pCacheObj); } diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index e8f1f06ef1..ba877915b1 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -83,8 +83,8 @@ int32_t tsCompressInit() { if (lossyFloat == false && lossyDouble == false) return 0; tdszInit(fPrecision, dPrecision, maxRange, curRange, Compressor); - if (lossyFloat) uInfo("lossy compression float is opened. "); - if (lossyDouble) uInfo("lossy compression double is opened. "); + if (lossyFloat) uTrace("lossy compression float is opened. "); + if (lossyDouble) uTrace("lossy compression double is opened. "); return 1; } // exit call diff --git a/tests/script/tmp/monitor.sim b/tests/script/tmp/monitor.sim index 8eb787e950..c0c1da567c 100644 --- a/tests/script/tmp/monitor.sim +++ b/tests/script/tmp/monitor.sim @@ -21,6 +21,6 @@ sql create table db.stb (ts timestamp, c1 int, c2 binary(4)) tags(t1 int, t2 bin print =============== create drop qnode 1 sql create qnode on dnode 1 -sql create snode on dnode 1 -sql create bnode on dnode 1 +#sql create snode on dnode 1 +#sql create bnode on dnode 1 From d4f19e7c5a68a501c94a9a9d92f6ca73c52ba01e Mon Sep 17 00:00:00 2001 From: tangfangzhi Date: Tue, 23 Aug 2022 18:15:28 +0800 Subject: [PATCH 05/26] ci: git remote prune origin before git pull --- Jenkinsfile2 | 1 + 1 file changed, 1 insertion(+) diff --git a/Jenkinsfile2 b/Jenkinsfile2 index bc309ff66c..d7df07f06a 100644 --- a/Jenkinsfile2 +++ b/Jenkinsfile2 @@ -53,6 +53,7 @@ def check_docs() { } sh ''' cd ${WKC} + git remote prune origin git pull >/dev/null git fetch origin +refs/pull/${CHANGE_ID}/merge git checkout -qf FETCH_HEAD From 9eecca851aa4b4d17e38af78cce22b16237b8dce Mon Sep 17 00:00:00 2001 From: Bo Ding Date: Tue, 23 Aug 2022 19:10:07 +0800 Subject: [PATCH 06/26] docs: refactor release page (#16346) * docs: refactor release page * docs: typo --- docs/zh/05-get-started/03-package.md | 2 +- docs/zh/05-get-started/_pkg_install.mdx | 17 ----------------- .../03-connector/_linux_install.mdx | 2 +- .../03-connector/_windows_install.mdx | 3 ++- docs/zh/28-releases.md | 9 --------- docs/zh/28-releases/01-tdengine.md | 15 +++++++++++++++ docs/zh/28-releases/02-tools.md | 10 ++++++++++ 7 files changed, 29 insertions(+), 29 deletions(-) delete mode 100644 docs/zh/05-get-started/_pkg_install.mdx delete mode 100644 docs/zh/28-releases.md create mode 100644 docs/zh/28-releases/01-tdengine.md create mode 100644 docs/zh/28-releases/02-tools.md diff --git a/docs/zh/05-get-started/03-package.md b/docs/zh/05-get-started/03-package.md index d3247350ff..85005b9551 100644 --- a/docs/zh/05-get-started/03-package.md +++ b/docs/zh/05-get-started/03-package.md @@ -108,7 +108,7 @@ apt-get 方式只适用于 Debian 或 Ubuntu 系统 :::info -下载其他组件、最新 Beta 版及之前版本的安装包,请点击[发布历史页面](../../releases) +下载其他组件、最新 Beta 版及之前版本的安装包,请点击[发布历史页面](../../releases/tdengine) ::: :::note diff --git a/docs/zh/05-get-started/_pkg_install.mdx b/docs/zh/05-get-started/_pkg_install.mdx deleted file mode 100644 index 36730b4429..0000000000 --- a/docs/zh/05-get-started/_pkg_install.mdx +++ /dev/null @@ -1,17 +0,0 @@ -import PkgList from "/components/PkgList"; - -TDengine 的安装非常简单,从下载到安装成功仅仅只要几秒钟。 - -标准的服务端安装包包含了 taos、taosd、taosAdapter、taosdump、taosBenchmark、TDinsight 安装脚本和示例代码;如果您只需要用到服务端程序和客户端连接的 C/C++ 语言支持,也可以仅下载 lite 版本的安装包。 - -在安装包格式上,我们提供 tar.gz, rpm 和 deb 格式,为企业客户提供 tar.gz 格式安装包,以方便在特定操作系统上使用。需要注意的是,rpm 和 deb 包不含 taosdump、taosBenchmark 和 TDinsight 安装脚本,这些工具需要通过安装 taosTool 包获得。 - -发布版本包括稳定版和 Beta 版,Beta 版含有更多新功能。正式上线或测试建议安装稳定版。您可以根据需要选择下载: - - - -具体的安装方法,请参见[安装包的安装和卸载](/operation/pkg-install)。 - -下载其他组件、最新 Beta 版及之前版本的安装包,请点击[这里](https://www.taosdata.com/all-downloads) - -查看 Release Notes, 请点击[这里](https://github.com/taosdata/TDengine/releases) diff --git a/docs/zh/14-reference/03-connector/_linux_install.mdx b/docs/zh/14-reference/03-connector/_linux_install.mdx index c3ddff53cd..0b1f415f54 100644 --- a/docs/zh/14-reference/03-connector/_linux_install.mdx +++ b/docs/zh/14-reference/03-connector/_linux_install.mdx @@ -4,7 +4,7 @@ import PkgListV3 from "/components/PkgListV3"; - [所有下载](../../releases) + [所有下载](../../releases/tdengine) 2. 解压缩软件包 diff --git a/docs/zh/14-reference/03-connector/_windows_install.mdx b/docs/zh/14-reference/03-connector/_windows_install.mdx index 9fdefa04c0..3cd688e615 100644 --- a/docs/zh/14-reference/03-connector/_windows_install.mdx +++ b/docs/zh/14-reference/03-connector/_windows_install.mdx @@ -4,7 +4,8 @@ import PkgListV3 from "/components/PkgListV3"; - [所有下载](../../releases) + [所有下载](../../releases/tdengine) + 2. 执行安装程序,按提示选择默认值,完成安装 3. 安装路径 diff --git a/docs/zh/28-releases.md b/docs/zh/28-releases.md deleted file mode 100644 index 311d69ac1b..0000000000 --- a/docs/zh/28-releases.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -sidebar_label: 发布历史 -title: 发布历史 ---- - -import Release from "/components/ReleaseV3"; - - - diff --git a/docs/zh/28-releases/01-tdengine.md b/docs/zh/28-releases/01-tdengine.md new file mode 100644 index 0000000000..a64798caa0 --- /dev/null +++ b/docs/zh/28-releases/01-tdengine.md @@ -0,0 +1,15 @@ +--- +sidebar_label: TDengine 发布历史 +title: TDengine 发布历史 +--- + +import Release from "/components/ReleaseV3"; + +## 3.0.0.1 + + + +## 3.0.0.0 + + + diff --git a/docs/zh/28-releases/02-tools.md b/docs/zh/28-releases/02-tools.md new file mode 100644 index 0000000000..7513333040 --- /dev/null +++ b/docs/zh/28-releases/02-tools.md @@ -0,0 +1,10 @@ +--- +sidebar_label: taosTools 发布历史 +title: taosTools 发布历史 +--- + +import Release from "/components/ReleaseV3"; + +## 2.1.2 + + \ No newline at end of file From 5b16fe6367c5033f906931bc924fe77e8739af8d Mon Sep 17 00:00:00 2001 From: Bo Ding Date: Tue, 23 Aug 2022 19:40:58 +0800 Subject: [PATCH 07/26] docs: change release page label (#16350) --- docs/zh/28-releases/_category_.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/zh/28-releases/_category_.yml diff --git a/docs/zh/28-releases/_category_.yml b/docs/zh/28-releases/_category_.yml new file mode 100644 index 0000000000..dcd57247d7 --- /dev/null +++ b/docs/zh/28-releases/_category_.yml @@ -0,0 +1 @@ +label: 发布历史 \ No newline at end of file From 20b06a7ec729ed35315ee530d104e7b0b5ebd7af Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Tue, 23 Aug 2022 19:44:59 +0800 Subject: [PATCH 08/26] refactor(query): do some internal refactor. --- source/dnode/vnode/src/tsdb/tsdbRead.c | 270 +++++++----------- source/libs/executor/inc/executil.h | 2 - source/libs/executor/src/executil.c | 14 - source/libs/executor/src/executorimpl.c | 1 - source/libs/executor/src/timewindowoperator.c | 3 - 5 files changed, 100 insertions(+), 190 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index bbef249079..cb288cecfb 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -182,6 +182,8 @@ static void doMergeMemTableMultiRows(TSDBROW* pRow, uint64_t uid, SIterInfo* pIt STsdbReader* pReader, bool* freeTSRow); static void doMergeMemIMemRows(TSDBROW* pRow, TSDBROW* piRow, STableBlockScanInfo* pBlockScanInfo, STsdbReader* pReader, STSRow** pTSRow); +static int32_t mergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pBlockScanInfo, int64_t key, STsdbReader* pReader); + static int32_t initDelSkylineIterator(STableBlockScanInfo* pBlockScanInfo, STsdbReader* pReader, STbData* pMemTbData, STbData* piMemTbData); static STsdb* getTsdbByRetentions(SVnode* pVnode, TSKEY winSKey, SRetention* retentions, const char* idstr, @@ -1510,82 +1512,83 @@ static int32_t doMergeBufAndFileRows_Rv(STsdbReader* pReader, STableBlockScanInf return TSDB_CODE_SUCCESS; } -#if 0 -static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo* pBlockScanInfo, TSDBROW* pRow, - SIterInfo* pIter, int64_t key, SLastBlockReader* pLastBlockReader) { - SRowMerger merge = {0}; - STSRow* pTSRow = NULL; - SBlockData* pBlockData = &pReader->status.fileBlockData; +static int32_t mergeFileBlockAndLastBlock(STsdbReader* pReader, SLastBlockReader* pLastBlockReader, int64_t key, + STableBlockScanInfo* pBlockScanInfo, SBlockData* pBlockData) { SFileBlockDumpInfo* pDumpInfo = &pReader->status.fBlockDumpInfo; - TSDBKEY k = TSDBROW_KEY(pRow); - TSDBROW fRow = tsdbRowFromBlockData(pBlockData, pDumpInfo->rowIndex); - SArray* pDelList = pBlockScanInfo->delSkyline; - bool freeTSRow = false; - uint64_t uid = pBlockScanInfo->uid; + if (pBlockData->nRow > 0) { + // no last block available, only data block exists + if (pLastBlockReader->lastBlockData.nRow == 0 || (!hasDataInLastBlock(pLastBlockReader))) { + return mergeRowsInFileBlocks(pBlockData, pBlockScanInfo, key, pReader); + } + + // row in last file block + TSDBROW fRow = tsdbRowFromBlockData(pBlockData, pDumpInfo->rowIndex); + int64_t ts = getCurrentKeyInLastBlock(pLastBlockReader); + ASSERT(ts >= key); + + if (ASCENDING_TRAVERSE(pReader->order)) { + if (key < ts) { // imem, mem are all empty, file blocks (data blocks and last block) exist + return mergeRowsInFileBlocks(pBlockData, pBlockScanInfo, key, pReader); + } else if (key == ts) { + STSRow* pTSRow = NULL; + SRowMerger merge = {0}; - // ascending order traverse - if (ASCENDING_TRAVERSE(pReader->order)) { - if (key < k.ts) { - // imem & mem are all empty, only file exist - if (tryCopyDistinctRowFromFileBlock(pReader, pBlockData, key, pDumpInfo)) { - return TSDB_CODE_SUCCESS; - } else { tRowMergerInit(&merge, &fRow, pReader->pSchema); doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge); + doMergeRowsInLastBlock(pLastBlockReader, pBlockScanInfo, ts, &merge); + tRowMergerGetRow(&merge, &pTSRow); - freeTSRow = true; - } - } else if (k.ts < key) { // k.ts < key - doMergeMemTableMultiRows(pRow, pBlockScanInfo->uid, pIter, pDelList, &pTSRow, pReader, &freeTSRow); - } else { // k.ts == key, ascending order: file block ----> imem rows -----> mem rows - tRowMergerInit(&merge, &fRow, pReader->pSchema); - doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge); + doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo->uid); - tRowMerge(&merge, pRow); - doMergeRowsInBuf(pIter, pBlockScanInfo->uid, k.ts, pBlockScanInfo->delSkyline, &merge, pReader); - - tRowMergerGetRow(&merge, &pTSRow); - freeTSRow = true; - } - } else { // descending order scan - if (key < k.ts) { - doMergeMemTableMultiRows(pRow, pBlockScanInfo->uid, pIter, pDelList, &pTSRow, pReader, &freeTSRow); - } else if (k.ts < key) { - if (tryCopyDistinctRowFromFileBlock(pReader, pBlockData, key, pDumpInfo)) { + taosMemoryFree(pTSRow); + tRowMergerClear(&merge); return TSDB_CODE_SUCCESS; } else { - tRowMergerInit(&merge, &fRow, pReader->pSchema); - doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge); - tRowMergerGetRow(&merge, &pTSRow); - freeTSRow = true; + ASSERT(0); + return TSDB_CODE_SUCCESS; } - } else { // descending order: mem rows -----> imem rows ------> file block - STSchema* pSchema = doGetSchemaForTSRow(TSDBROW_SVERSION(pRow), pReader, pBlockScanInfo->uid); + } else { // desc order + SBlockData* pLastBlockData = &pLastBlockReader->lastBlockData; + TSDBROW fRow1 = tsdbRowFromBlockData(pLastBlockData, *pLastBlockReader->rowIndex); - tRowMergerInit(&merge, pRow, pSchema); - doMergeRowsInBuf(pIter, pBlockScanInfo->uid, k.ts, pBlockScanInfo->delSkyline, &merge, pReader); + STSRow* pTSRow = NULL; + SRowMerger merge = {0}; + tRowMergerInit(&merge, &fRow1, pReader->pSchema); + doMergeRowsInLastBlock(pLastBlockReader, pBlockScanInfo, ts, &merge); - tRowMerge(&merge, &fRow); - doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge); + if (ts == key) { + doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge); + } tRowMergerGetRow(&merge, &pTSRow); - freeTSRow = true; + doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo->uid); + + taosMemoryFree(pTSRow); + tRowMergerClear(&merge); + return TSDB_CODE_SUCCESS; } - } + } else { // only last block exists + SBlockData* pLastBlockData = &pLastBlockReader->lastBlockData; + int64_t tsLastBlock = getCurrentKeyInLastBlock(pLastBlockReader); - tRowMergerClear(&merge); - doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, uid); + STSRow* pTSRow = NULL; + SRowMerger merge = {0}; + + TSDBROW fRow = tsdbRowFromBlockData(pLastBlockData, *pLastBlockReader->rowIndex); + + tRowMergerInit(&merge, &fRow, pReader->pSchema); + doMergeRowsInLastBlock(pLastBlockReader, pBlockScanInfo, tsLastBlock, &merge); + tRowMergerGetRow(&merge, &pTSRow); + + doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo->uid); - if (freeTSRow) { taosMemoryFree(pTSRow); + tRowMergerClear(&merge); + return TSDB_CODE_SUCCESS; } - - return TSDB_CODE_SUCCESS; } -#endif - static int32_t doMergeMultiLevelRowsRv(STsdbReader* pReader, STableBlockScanInfo* pBlockScanInfo, SBlockData* pBlockData, SLastBlockReader* pLastBlockReader) { SRowMerger merge = {0}; STSRow* pTSRow = NULL; @@ -1987,10 +1990,35 @@ static bool hasDataInLastBlock(SLastBlockReader* pLastBlockReader) { if (*pLastBlockReader->rowIndex == ALL_ROWS_CHECKED_INDEX) { return false; } + + ASSERT(pLastBlockReader->lastBlockData.nRow > 0); return true; } -// todo refactor +int32_t mergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pBlockScanInfo, int64_t key, STsdbReader* pReader) { + SFileBlockDumpInfo* pDumpInfo = &pReader->status.fBlockDumpInfo; + + TSDBROW fRow = tsdbRowFromBlockData(pBlockData, pDumpInfo->rowIndex); + + if (tryCopyDistinctRowFromFileBlock(pReader, pBlockData, key, pDumpInfo)) { + return TSDB_CODE_SUCCESS; + } else { + STSRow* pTSRow = NULL; + SRowMerger merge = {0}; + + tRowMergerInit(&merge, &fRow, pReader->pSchema); + doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge); + tRowMergerGetRow(&merge, &pTSRow); + doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo->uid); + + taosMemoryFree(pTSRow); + tRowMergerClear(&merge); + return TSDB_CODE_SUCCESS; + } + + return TSDB_CODE_SUCCESS; +} + static int32_t buildComposedDataBlockImpl(STsdbReader* pReader, STableBlockScanInfo* pBlockScanInfo, SBlockData* pBlockData, SLastBlockReader* pLastBlockReader) { SFileBlockDumpInfo* pDumpInfo = &pReader->status.fBlockDumpInfo; @@ -2007,112 +2035,13 @@ static int32_t buildComposedDataBlockImpl(STsdbReader* pReader, STableBlockScanI return doMergeBufAndFileRows_Rv(pReader, pBlockScanInfo, piRow, &pBlockScanInfo->iiter, key, pLastBlockReader); } - // mem + file + // mem + file + last block if (pBlockScanInfo->iter.hasVal) { return doMergeBufAndFileRows_Rv(pReader, pBlockScanInfo, pRow, &pBlockScanInfo->iter, key, pLastBlockReader); } - if (pBlockData->nRow > 0) { - TSDBROW fRow = tsdbRowFromBlockData(pBlockData, pDumpInfo->rowIndex); - - // no last block available, only data block exists - if (pLastBlockReader->lastBlockData.nRow == 0 || (!hasDataInLastBlock(pLastBlockReader))) { - if (tryCopyDistinctRowFromFileBlock(pReader, pBlockData, key, pDumpInfo)) { - return TSDB_CODE_SUCCESS; - } else { - STSRow* pTSRow = NULL; - SRowMerger merge = {0}; - - tRowMergerInit(&merge, &fRow, pReader->pSchema); - doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge); - tRowMergerGetRow(&merge, &pTSRow); - doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo->uid); - - taosMemoryFree(pTSRow); - tRowMergerClear(&merge); - return TSDB_CODE_SUCCESS; - } - } - - // row in last file block - int64_t ts = getCurrentKeyInLastBlock(pLastBlockReader); - ASSERT(ts >= key); - - if (ASCENDING_TRAVERSE(pReader->order)) { - if (key < ts) { - // imem & mem are all empty, only file exist - if (tryCopyDistinctRowFromFileBlock(pReader, pBlockData, key, pDumpInfo)) { - return TSDB_CODE_SUCCESS; - } else { - STSRow* pTSRow = NULL; - SRowMerger merge = {0}; - - tRowMergerInit(&merge, &fRow, pReader->pSchema); - doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge); - tRowMergerGetRow(&merge, &pTSRow); - doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo->uid); - - taosMemoryFree(pTSRow); - tRowMergerClear(&merge); - return TSDB_CODE_SUCCESS; - } - } else if (key == ts) { - STSRow* pTSRow = NULL; - SRowMerger merge = {0}; - - tRowMergerInit(&merge, &fRow, pReader->pSchema); - doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge); - doMergeRowsInLastBlock(pLastBlockReader, pBlockScanInfo, ts, &merge); - - tRowMergerGetRow(&merge, &pTSRow); - doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo->uid); - - taosMemoryFree(pTSRow); - tRowMergerClear(&merge); - return TSDB_CODE_SUCCESS; - } else { - ASSERT(0); - return TSDB_CODE_SUCCESS; - } - } else { // desc order - SBlockData* pLastBlockData = &pLastBlockReader->lastBlockData; - TSDBROW fRow1 = tsdbRowFromBlockData(pLastBlockData, *pLastBlockReader->rowIndex); - - STSRow* pTSRow = NULL; - SRowMerger merge = {0}; - tRowMergerInit(&merge, &fRow1, pReader->pSchema); - doMergeRowsInLastBlock(pLastBlockReader, pBlockScanInfo, ts, &merge); - - if (ts == key) { - doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge); - } - - tRowMergerGetRow(&merge, &pTSRow); - doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo->uid); - - taosMemoryFree(pTSRow); - tRowMergerClear(&merge); - return TSDB_CODE_SUCCESS; - } - } else { // only last block exists - SBlockData* pLastBlockData = &pLastBlockReader->lastBlockData; - int64_t tsLastBlock = getCurrentKeyInLastBlock(pLastBlockReader); - - STSRow* pTSRow = NULL; - SRowMerger merge = {0}; - - TSDBROW fRow = tsdbRowFromBlockData(pLastBlockData, *pLastBlockReader->rowIndex); - - tRowMergerInit(&merge, &fRow, pReader->pSchema); - doMergeRowsInLastBlock(pLastBlockReader, pBlockScanInfo, tsLastBlock, &merge); - tRowMergerGetRow(&merge, &pTSRow); - - doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo->uid); - - taosMemoryFree(pTSRow); - tRowMergerClear(&merge); - return TSDB_CODE_SUCCESS; - } + // files data blocks + last block + return mergeFileBlockAndLastBlock(pReader, pLastBlockReader, key, pBlockScanInfo, pBlockData); } } @@ -2137,9 +2066,8 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) { while (1) { // todo check the validate of row in file block + bool hasBlockData = false; { - bool hasBlockData = false; - while (pBlockData->nRow > 0) { // find the first qualified row in data block if (isValidFileBlockRow(pBlockData, pDumpInfo, pBlockScanInfo, pReader)) { hasBlockData = true; @@ -2154,13 +2082,13 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) { break; } } + } + + bool hasBlockLData = hasDataInLastBlock(pLastBlockReader); - bool hasBlockLData = hasDataInLastBlock(pLastBlockReader); - - // no data in last block and block, no need to proceed. - if ((hasBlockData == false) && (hasBlockLData == false)) { - break; - } + // no data in last block and block, no need to proceed. + if ((hasBlockData == false) && (hasBlockLData == false)) { + break; } buildComposedDataBlockImpl(pReader, pBlockScanInfo, pBlockData, pLastBlockReader); @@ -3224,10 +3152,12 @@ int32_t tsdbGetNextRowInMem(STableBlockScanInfo* pBlockScanInfo, STsdbReader* pR TSDBKEY k = TSDBROW_KEY(pRow); TSDBKEY ik = TSDBROW_KEY(piRow); - if (ik.ts < k.ts) { // ik.ts < k.ts - doMergeMemTableMultiRows(piRow, uid, &pBlockScanInfo->iiter, pDelList, pTSRow, pReader, freeTSRow); - } else if (k.ts < ik.ts) { - doMergeMemTableMultiRows(pRow, uid, &pBlockScanInfo->iter, pDelList, pTSRow, pReader, freeTSRow); + if (ik.ts != k.ts) { + if (((ik.ts < k.ts) && asc) || ((ik.ts > k.ts) && (!asc))) { // ik.ts < k.ts + doMergeMemTableMultiRows(piRow, uid, &pBlockScanInfo->iiter, pDelList, pTSRow, pReader, freeTSRow); + } else if (((k.ts < ik.ts) && asc) || ((k.ts > ik.ts) && (!asc))) { + doMergeMemTableMultiRows(pRow, uid, &pBlockScanInfo->iter, pDelList, pTSRow, pReader, freeTSRow); + } } else { // ik.ts == k.ts doMergeMemIMemRows(pRow, piRow, pBlockScanInfo, pReader, pTSRow); *freeTSRow = true; diff --git a/source/libs/executor/inc/executil.h b/source/libs/executor/inc/executil.h index 52c73f85f5..f4c42023c8 100644 --- a/source/libs/executor/inc/executil.h +++ b/source/libs/executor/inc/executil.h @@ -80,11 +80,9 @@ struct SqlFunctionCtx; size_t getResultRowSize(struct SqlFunctionCtx* pCtx, int32_t numOfOutput); void initResultRowInfo(SResultRowInfo* pResultRowInfo); -void cleanupResultRowInfo(SResultRowInfo* pResultRowInfo); void initResultRow(SResultRow* pResultRow); void closeResultRow(SResultRow* pResultRow); -bool isResultRowClosed(SResultRow* pResultRow); struct SResultRowEntryInfo* getResultEntryInfo(const SResultRow* pRow, int32_t index, const int32_t* offset); diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index bf969bf2e4..734b63b94d 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -31,20 +31,6 @@ void initResultRowInfo(SResultRowInfo* pResultRowInfo) { pResultRowInfo->cur.pageId = -1; } -void cleanupResultRowInfo(SResultRowInfo* pResultRowInfo) { - if (pResultRowInfo == NULL) { - return; - } - - for (int32_t i = 0; i < pResultRowInfo->size; ++i) { - // if (pResultRowInfo->pResult[i]) { - // taosMemoryFreeClear(pResultRowInfo->pResult[i]->key); - // } - } -} - -bool isResultRowClosed(SResultRow* pRow) { return (pRow->closed == true); } - void closeResultRow(SResultRow* pResultRow) { pResultRow->closed = true; } // TODO refactor: use macro diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index 9e56d63673..c3f1c8fbf6 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -3635,7 +3635,6 @@ _error: void cleanupBasicInfo(SOptrBasicInfo* pInfo) { assert(pInfo != NULL); - cleanupResultRowInfo(&pInfo->resultRowInfo); pInfo->pRes = blockDataDestroy(pInfo->pRes); } diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c index 9eaab69633..2648e368b2 100644 --- a/source/libs/executor/src/timewindowoperator.c +++ b/source/libs/executor/src/timewindowoperator.c @@ -2965,7 +2965,6 @@ static void doHashInterval(SOperatorInfo* pOperatorInfo, SSDataBlock* pSDataBloc static void clearStreamIntervalOperator(SStreamFinalIntervalOperatorInfo* pInfo) { taosHashClear(pInfo->aggSup.pResultRowHashTable); clearDiskbasedBuf(pInfo->aggSup.pResultBuf); - cleanupResultRowInfo(&pInfo->binfo.resultRowInfo); initResultRowInfo(&pInfo->binfo.resultRowInfo); } @@ -4253,8 +4252,6 @@ static void clearStreamSessionOperator(SStreamSessionAggOperatorInfo* pInfo) { } } clearDiskbasedBuf(pInfo->streamAggSup.pResultBuf); - cleanupResultRowInfo(&pInfo->binfo.resultRowInfo); - initResultRowInfo(&pInfo->binfo.resultRowInfo); } static void removeSessionResults(SHashObj* pHashMap, SArray* pWins) { From d17c0331f9e775d4058854defb0f71f46e474501 Mon Sep 17 00:00:00 2001 From: wenzhouwww Date: Tue, 23 Aug 2022 20:25:17 +0800 Subject: [PATCH 09/26] docs:update test report of English version update test report of English version --- docs/en/02-intro/index.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/en/02-intro/index.md b/docs/en/02-intro/index.md index db28cdd939..83b4322011 100644 --- a/docs/en/02-intro/index.md +++ b/docs/en/02-intro/index.md @@ -103,7 +103,6 @@ As a high-performance, scalable and SQL supported time-series database, TDengine - [Writing Performance Comparison of TDengine and InfluxDB ](https://tdengine.com/2022/02/23/4975.html) - [Query Performance Comparison of TDengine and InfluxDB](https://tdengine.com/2022/02/24/5120.html) -- [TDengine vs InfluxDB、OpenTSDB、Cassandra、MySQL、ClickHouse](https://www.tdengine.com/downloads/TDengine_Testing_Report_en.pdf) - [TDengine vs OpenTSDB](https://tdengine.com/2019/09/12/710.html) - [TDengine vs Cassandra](https://tdengine.com/2019/09/12/708.html) - [TDengine vs InfluxDB](https://tdengine.com/2019/09/12/706.html) From 7b2cea6c80e8ed5c6563d874c787c9113cca3d6b Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Tue, 23 Aug 2022 20:33:05 +0800 Subject: [PATCH 10/26] docs: update telegraf and collectd english version pictures (#16353) --- .../IT-DevOps-Solutions-Collectd-StatsD.webp | Bin 38834 -> 16052 bytes ...T-DevOps-Solutions-telegraf-dashboard.webp | Bin 42080 -> 15652 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/en/25-application/IT-DevOps-Solutions-Collectd-StatsD.webp b/docs/en/25-application/IT-DevOps-Solutions-Collectd-StatsD.webp index 147a65b17bff2aa0e44faa206618bdce5664e1ca..a8b52f3b2d6efe2b83c087d81b98c89fa941f263 100644 GIT binary patch literal 16052 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 literal 38834 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ˤY2X3LTxY=ZvQmK4$QE|6J!)Eeax`*#Zq}z8;`H**pzQB_6115 zDtBeJQA184l}ZcRF!Q{g!xDI9h#xP^^~jshM?h_;o$tiPOgStKK0y}fuS9Xx`gP)1+g6dO;WN)<*`Iz~+LQc{UoVqTYS#F1M zhukl-A5w@?RU8id@JX;axq1Woxz4?=z827F8=ofP&q<0&(lIQ50I=(dMC5v~EeAl@bfisfP zIVX_DygMAP@v%4pDgeWaoz>?=>{^D>MZP&6hs7Ceb&Q~RFtT@w`3s}zY~J}c95psm zis#uB=4hHM5_*rBDcw-xP+ua9Cnj$>fybhp!h4h>U2c zG$y-PZ-Q-HRkKakB-UEP{7JwR6$96T0*Hkst|FfiXu)-r8YYGfoZ(iALcOV6Io`k- ztpxSh>A3A-$E_}5#N5x^X^|spbzu~X@ZT1`=R2Ta!$_gGjPUrGq9kY8g{NpE7eE(Y zev0N%iA-NyAbhX3-BmvPY;Tt?H_Q{{txNpB&B?BzlpLWDO^jJRe3A?(RS=KajDnkd zZVJ!Zbze&aTd}_*1{$jS!t{4lAS`%=AJ#X7c(bC7*?@M_KS!iK_*YarCcT%rW=E3H zkg+^MwXXI8WHegcz`5!heyZ!=NpjG3`W-ok>@IUu%4gAy2^d%I??n|+2Zv+|_G7iu z$pKW*TuoTi$!W-37p+4klzEHEAwp`&!KEExi$XP`4tH)?RINLh3GD&|GQuFUTjBGt zhz>}PNy<6QK!0n?* z6@FD%bsdM^meEp??x(Ywf;&PqNm8E3Qjrt{nA#)q9$@)NRh?3eV zzmX-h6{*u=P0tiUnBw-OCh**eT}F-x(?8T#aG*c-G7rnA7zkC6P$+{X(SO$-mgC|9 zC0H!)nY8g^zY#V?32FdDZl|*6y`65VicBWWsCrKi@6StRvxbGGuIbP-q*ay~LGtm> zE;K_p*k2(W1N1@1wdCnscaQlEb&OGZtrPfs0U|N{zbY%4^+RY7J%i92KHgr<{VPgm zk!x5Ok9S&%yLLPCTa6KlJzQ(dqewn}G!{)NY{@HWX)gVLhw*rKx8B z4)h(V+eV?bpMqMzPZ4UriEW4W4D!&G^bFedsM32B%}8rPzK8@cc9hYnnA~+>xR5y7 zsfbr49{`naU5oBDCG4A=y)fG?IpvUfxh)T&v`MVLhhk7^HHXQXS3jL<9qx&^B%h*J zgt;#@-2~W^qy0kNH^!>n1`#jjp(Eup(WHb#G?63bf)RJYgGrc|6_@C%YnOVCI)VO6sZIU3R|ddsAa zfL#}Cx3@=%J=$9yFtyWF=1(-aUZG=OgSz}Eqd*uhf>N56UES_mxc1RK&z+Ekt^E3l zLB;oVofCYl{@lZ-Q1PmoP3TI4;1Okt5~ylcMOTA+_8zn0BX5VzzM6XQ9wio~fuUMsZANJxZzSN_4PViTLOYtPCiEE7{beJu#I zt|jN@dzMws)wQuhbgzpc)Xfkan9k-VWQ0fDbvJK;^Xp556#gMda7sx|;m>keJZAag zs;V=F&Mno6No-~@3Q*C~AfQ2vHwmF#k;fISnFp+CMt;im=wk4AY? ze3`s-o}>94wBM>@>+HTn4@Z0cP+al;3N_6&>u_z?TLLyvnG zvbZg%<_`UNkhj(%3pUn23!>o`9Qecb>~}7{>y3cPTBJOZA4Elu++rWDyF8KvYUp2?77gyky?j| zIx1clm(AZoI3D9ZSWsWvDN!utwxZoj8E5_Nej*Ov7AGSw`iIwH0~0oZpGQeI&QICx zM;_KAHlcW0uZc1lo}gcZf;-fTE4Vcm1yox2-yS^Lr)PQWj&wvrmUL-DjDx+fnVqW# zaZ5pGkvqE~%IhgsNs#h08sAD#!l=3U6F^lsH6r`2QVt}5pOi9|to0kp zl-v2Cqzj`e{-xY44zuo4yV+CJ1G*+>rYPeiM1lyH@@Nq==bKKj*fRO)Q5}1rB3DHu zcgYrBy1rFE4WB-2dE`wxNv`PmzgUIe;X2f=Gb~e#ZWY3;<#pR-& zFe0zU7Ss3Zi;#;p=k&b^dIG^;@Vgk|m8xtvn^IAcuRxz_nkx2W_&farp`!n(B?3*5 z2!|^Ljz_3-m~!A8Mg;^MGdi2Y?opw1S!^!m)&G+o(Zy25@tPwaawtp3<=yptQ()5% zKXHo`48%ck$JuIEk3U9nwZxT@348UCpofKD7ZNK4pLGqsp1AP4QR&!RM(8Dx6U%#ZwTAxj_w&vRH2B#q~a)u%l z1Vp>X{H&O`w29(rON!RV0@<-e8Qa%)u9hRwtUd@I^rvC5aLmJ{`(r0e9={8`jP&&g zSPn=anPp$I7Fv$ooNxC!WFs6mUQ#2hcZ7vjLMxDJpgm`wPh?~M7*j7dI@(u&(3{`* zataJdV87HDH93bIq_=USsWT{sVk{Xt6K&XEX!hJs1F5|=nY`Uh8KY2opKkh!!ZeZt zxx=McXrvf&0YC~>*b@v$$V63)x)A@8xm0aWf!05v>2A8@VBDgyTt+_^3LJx^h^^NQ+i{e5F}?3uAqA|i zW>wgzP}+PSK$+X%CMn?MKVz&i>WlyxmE&JJys6=-MgEaaLGK%kWDr0V_*0wsZ5Fn5G~(I;Z<&fm&LtrE%A zs_Z^|qu1eBvB}*%6m(bIxS&=Wh1CEKdk9Z+b~6-`p%jnmaxury=nt-nbJja;`_&1) zn`=zjl1-&7z&hY;0B)Q7srmUuF$-+(Hb;yra3`V96k>i_(ckGD=2FjL0}#oI2WBv61k^>n2vYU0Bo#e zk)^gnTSUiGG5l&iR-Sqwt_9%>S67T{$%Uoz+Nv{128a&^1WQWkdHoH~&X8oFIdp6* z?{+>;zZw>KG*YK5UEhAQqNFNi>$m#l)%YuW8Y61wTlO9@DxNIww2D^i036)wDh0lS zDotFTTiG9^HBv!hM^58ClUL_=S+E;69Yu?rjZW(sz)st{9#QR_KFeFib*)~6QM_{D^_ z?B3&6PmT8+SVcq1UF~w8kE^+K_dmM_r%PXf##DH)P!$Xmqp32bDp0j59O@jQ9nO?x zV^95RGaUR`M>zwVy&EFiJbGUbi|g&1iKoZ*BrZ!TT~6b{n}T%%g-+z#Xj5nk)jB~~ z+qJJTAO;hh61jaoI`&JCMN>&qz@;>|e)9%%5kF1xRMv02W#%Q|(nPdDYsaz-s3s%> zn-a?N!7$u~aMuVrq!rgcQ)&+9P?;moB`(W0SUrFZd@}}02&fhsmCz zpwDSHm$-|cue-e@&5RJlB&v*&V*%CMoWM@kzOub9YX`AmjZTF3Yfw8PFr49)c#M;C@$SI!>nd&BkwK0;x zoUyXB!)Lu#<`8RhbhU>qp-F{iP7|$YQfKgS9RLM_>T$idp`TVDe?VNJ>^^W+pdpul zha!N|%B@^kBYxX9*FlZ(xyp7(nVH<#}L*31m_3D2j2yzLYy89 zzUo&JnxBy}I_y+`C-p_>vSsf10QSO~jSOu3#sgu$km{p?@Z(7AF$xj_6ZgIo*fS!_ z#zYBTu0lX^hmQ_1)X@UcgQg`*n6;57s?2`oG%W82HQS&f9#qtwXY7M9@q0ycb``17 zG-ZGiyDt1mkS6$;;1|E(=weT^ITkF;C++vH5{x{ITqKGKWlT(pXrYp7@LpG;I4xGv ztq)(Ptmdxy2OZ%-!Ch2ZOo@AW5L2xFsPm;`1`_G*t7GZh@_mw zsf0lVfd?96TbfX_Q4mwiyuW32xzQc$G};^0oq$Dk=4+Fz;!O2IOJ%!5(q4f^` z3HJeHrBWp(Ka$sZUada{V2)jPQQ|XioWkOd4FGcEa>mXQj-?ON7|dLKI&Uqn%#oO} zY#mNTI-L^3FdDCt>{iEDj%GcZ?T<gR5fQwg}d4HtUwKEh4;cRNi|I` zT9HE52!LV= zo4|yXEAUkhNnO?*(spx)IK1&OBnIb8B+YK!g?B0wCWC-Xk#R2Z+e zj$j{;B$L+SxPR(v>xXTdZyfM>Xq6|%TMM~Z&SbvUb#lxRT*^}d+-L;@LT52XK=7#q zqjOZW?(_f@?vPIw&w{9Fq}*#m^$!v_FI--9e870s4=)riX%^aLa%DkhKN6jU>)U)& zfrJq`<9(GLpGnGxm4>THYS&TU8Jxj-nzJ1=7k-f;Pgd&0JY4l)FdqMp^@ljY%uRUV zBauFrkzLYG=3luR-1EJ5@U8WMrY97e2P*t(_eyHyD}pW>P=z_-#dC*rhQ$cw3_2Qj zQ0F_D6ydbPko*tB7T-7&tpSW-q%>}2+poY%6?M1GiOaaG|FsNw;=f;uQfSO0q!j%5ddemdn{_XaI>-;T-StG zL@)594TskNI>0wah}$q#qcd-rFB4N6M%@**t!~7mBFi2GxC$imQrqKby&Yj7T=W;9 z&dwwKGRW~N;Nz1f$sPSxDB}iv4#&f z;2d!;bN394rP+4zljBx%$$RXLO)hnXsPdPNfH{fo$;p#~C5V9TCQQ@AKo zr{e(_6n7sTJ80*OrwFcgUr=BlX?gRL5=W4^u$a^jo*{?1oNqtPB=*05Kb`ydqR+B$D(4*@x#6d4k`fv zByBa!EH3q&d&FhcQX#J~u6kucw^-_8j8u z)SURrJL?R1+mspzPVkEvVbwGsGFLvcmWe|8u#n8X?8t)+i%p;OEPy(Nvv&4?r--=H zIT<(E?@f}6!H56Rm`;7I=E@qonb$&4s7)qB$hQOaQ*;_3Kw$>Eqa{aD5h5&~bxjAm zB!50kg4n|2{AXik+G_8zc!NF4?L&#%CFY=^75@XF!9owmh<^1n0|#KNESQr-BrQAl z@JN-Nh6GYpb8MS9LwShMc_P-{YJ%b^oG zh5E7tIabcdaCmQ8>)jti=_Q|Cbu6QD22=4;HEs5Hp$s)>1K*2 z@R-PflLXoRSGVn0V0C8h5^^wf{X zrBZI;O_(Zc8oEXfBstK>@VHEdL{|H`1rD~}ln4)-Sb9ro43lP_vJyR^MzSrgDIfhr zhfr4wfZ%!)OF-J#~2=6_=_ z^7}((133|Nx^*RSNTMKNBj$=zLl&q0F2O^nv(UB@jky~s1@A+6a=~eoimv*s>XUX@ z0BOh%t+9Hn8RD9{*e6|!=y}SQZOT(hc%BhQWwAGK*PfM$4l>fg&N2OY$X?dxqR~#k z`hybQ8b-g@1cpKZdssn!3wUtrg$K@2o1S;6#bppu_Bi1MXSDu4WZO$vW_jx8le^t= zdNh>R&p2J9C|2`8A zXLS2~3u-nnNM4uM0zoJ(`D!PCNClhnYvUu0-CS$AEG_{}m!@DY($HJa^zzC5;(bD((oeP)gqFC?>bP8DcJUPtK=ZKT0&^mkcE7ppA{zc;`Oj~^T zh#<;9iMx-*4(lPj=WJ|Y=@AV^SOhy(0sv_(6&d1?D0n3Gbiy{|o-SJZ%M?RF3!20} z*d9!(5fFd)jF>=&y;pZfzA z9Bh#ZLUN*wDQDUGEIzMg{E#R?3Lodge5UirTje`7CDb40JDEL4+Fr7ka1p-4rh?x* zg+_Y{Ctb*rxQaeKBM*GqzdYZRm2`eb$OVMMjZ@htI_!UlB(US+`PeoWUEPnR{OK1I zJVsn6z@W%E>nG~*7ch|q-5KvY#Y^sFU{e9wl+v2BB>+?Rg|EnmsfmF?6!xt~ezpPL zSPS{$HU`xDxJqk!S`<|X;bOidQTM6xdPid|@L2{5oPnvL_E+Kv61$s0?%fN#Yfx^Q zCH&r0p8|7yb7eMl9s|Y4LA^xsh&Uk^g8-)NtH0H<4coXiJ%PgbF4nfVj3=I^M77}I z?SL{C8arEDE(KBf#&}}idjb`&pD}`w{M}T(7NHYw2}~O@CjGdf%);YGv3@hw$E4f+ zr}7@r&Wut#4fK31Mi>uYobVz?K(y^~_?zwwF0}&ODa6&YZq^(rQM`)P924Za_XB+7 z(RD7K%zS6@UNsWpy17g%%Gv<_Oy*Dp#}%?c%Vqq#bD z9e38-=|_er2E*Au`>LZ;+E6y@+r`PR&2AKyqgoX0LqSyPKaL`{GhYi3%}mzz_E!mL zd035DaI#P)Px>DAl~Ms@@b`jUmy27%Ag0%~l=!*|>&XeOv4%uN{gu=sauU4aO~K#8 zYrb^HD7ML{niAN=QOQ>5lUWMdqI4HV4yyB zc3sX0+j_mHBHcn<7um8y`K^j|ReD_uK?H!459 z!L6DR@T}7s`MSziLihCuIJD5~&E6kPglCu8&owP%X_jIdys)* z*9?Ktf-)K2{PYfIny8%Tk?K?HYL8=Gq~{zAIsM+Cmq*#o+AD6)ZZ`S_4S<-2ov#$x+& znn(;!Rz614^O)xeRWC1-vEL<#v9K^hil87sxg6NwvUrA!>;tZDz7rfLlPF}}V*$Q_ z9DTzuSHF!PVI}oqzQ|IHae)u1cI0e62E$HS{ zhd9MXd(g41s~Bd`ZMy1L94ah>iMx0mSkWJpik+boa?pXJjg1ZaqX_htFAAC`GU4** zp*h3ee#$VQm6FxW}S$Q;~a6HEWyF; zgiK?l&JG^HqyIruoU3FvFfT}wC(Q}rFecqfsg-=j7e#8Qc)q@R8hCO*auxpKy1%@7 zyALOId(S0a#`H=VJ`&_mWm5wn6zjZ(p2&TB|IvL+6`h8n;TsF7Ak-lMw}IyLxsNV*U)BlXoy> z?Uu4a`=^Lq0v9rG`t+Rzyt3EM`Ei7Z|H0m!(e6RRlUV$WzB~#+QyGb1O)R5z z6-D2b4*=~Ao{x*MvzAZ!Lq1yGS={_)dPa{TJhxi_X50|OisgGEBjfhd=@PZp%{VUo z&b-sVh?jFra675jV&fDYcV;;@eEa5W%>#3*4_FsDsvd23M!-X}vIG9|uAAsP+%gxp zzGpf5tWf3^(Qf=g*)!T9;+Vp8xU-~SerS-r51yc|OKMQ%HY97+&X+pFPEu5%Va0~! z&CH}kH1F8FZ(<9nU=zdhSI0Vtc@HIeKq@3}}-Gl8`te`YpEcgUJ+KMJMqmEk}QqsLWDSus^Lh9W*9fdP=XCG!r`#6q4D+H+fyhJm-sr?PqHGk)P~Dtutr zw7XLIb5dra+ye~`%ktuSBV4dTCB$Y6CV3dG9TV%)%3Su<3 ztH@)jKoCX(k_b@_;VB|b9EVrz>qo9M-{A%Tpfo@&B_-Yf%|yw8?{fqRb4bd5s4tTF zor$csM@e!S%$H@!Xz*^vCF~ehB^bD2a3E);6*WqcDSo;#v|7N3OK!V@ks|HaoBD|E zMhyARGjyXjC;cIolY0&{&Q<0v%xi}O-@=neXZtDziHruFDe7vQsk(A6IjXkFSgzwO~Ngoq06^tCPiasB5o3f)4AyF)Dbukoi%U1CpqO$Ofw^Wh#ylzlvr#F(x0NK|IyJ{< zdg~$17u9r444?YOtf${Bx_dlf%lFr!eX5HPLaYLS{6@#OQj6sP;XQ$_i>D|KQ@+j7 zEEdy%Cp4J@Nsbn<~75w>0`PUZ2S4$0?K@1F~=W*Fh9%4AeF0;S-EYIH=%xR?cr5FW*%^ zd2js!&SFKqq7hT~`v+^~N&5bdcF%PeQg?POFz}PH_hpcfP1Xc^3891lddGZRdx&~W zJpXJI^^548*{Zh|sF4=iubs>dE3Uv|`xyi3DlR7Q*B{S7E>Gf8Ixc$gr&DbK3gf-f9Gc0v2)p~*O?!}* za-Q}N#3zrO@kP_-feaJ?id^jYAI<&S?W|3V*75a^B$MTHV$byHX~(NbblqCt%u}(rjDA>nz`~Z@e+IfnjOXf+evryMN1salcyJb zmQwl^$maf-bu!mReuG!LpyH*Vo|aen9p|gWwri3K{l*b>Nt;VDcM;i2U!5C5VSzA$ z33f6Y8l#qWFU)aZTe~{xK>}tT<<+?EKQ+Uv)!iMbCXd97@(Y`-q9f9x5ua;)@9O49 z3Erx9Tu>aI^smuj2eUw|$&U%&Dp%}}V28X!jdH;`HfBU{^}q_E6+Ltd4{4o`1dn$M z5E`#4CUOHqeVjOZgr>MC78b~K@C;$UOE708moxYAf_SLc8v_#d^&)TndFTFL-~SJ< C^i~l7 literal 42080 zcmV)zK#{*vNk&FkqyPX{MM6+kP&iCWqyPXfs)WM;&j-8K-nI<^k|5Qq?I)*9kPVXc zGeS-t-FsIrSOb!6?P(k7Co?5w<^^=hxYBN^9nqY*712+BdzV_>4g1)wNo;+Z5MQCb`lrNwJA5)O_@0>z40kvJv|NIcDoz(HY( zgajf{XjYUuRtp_AjK2onMez-u@2%q9G{z}@N=-;Lrcn>6{?in`R#K%kB@ExLio9&0 zjK3Q7ql*6s{s6sElBxS#H+nQ{gwTX(DQZ=Cp$ToFcFMW~F2cSs7 z^T%w0*((CnGj{0Jw>np8e68(G2bD6Kp>JUhL=kb`vfLGpCPZZm

PlfSXK2U9u{9 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 From 354cb06c434181f966b64293eddf2620835ab963 Mon Sep 17 00:00:00 2001 From: wenzhouwww Date: Tue, 23 Aug 2022 20:40:51 +0800 Subject: [PATCH 11/26] update TDengine CLI description . --- docs/en/02-intro/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/02-intro/index.md b/docs/en/02-intro/index.md index 83b4322011..585c7e7d35 100644 --- a/docs/en/02-intro/index.md +++ b/docs/en/02-intro/index.md @@ -96,7 +96,7 @@ As a high-performance, scalable and SQL supported time-series database, TDengine | **System Maintenance Requirements** | **Not Applicable** | **Might Be Applicable** | **Very Applicable** | **Description** | | ------------------------------------------------- | ------------------ | ----------------------- | ------------------- | ------------------------------------------------------------ | | Native high-reliability | | | √ | TDengine has a very robust, reliable and easily configurable system architecture to simplify routine operation. Human errors and accidents are eliminated to the greatest extent, with a streamlined experience for operators. | -| Minimize learning and maintenance costs | | | √ | In addition to being easily configurable, standard SQL support and the Taos shell for ad hoc queries makes maintenance simpler, allows reuse and reduces learning costs.| +| Minimize learning and maintenance costs | | | √ | In addition to being easily configurable, standard SQL support and the TDengine CLI for ad hoc queries makes maintenance simpler, allows reuse and reduces learning costs.| | Abundant talent supply | √ | | | Given the above, and given the extensive training and professional services provided by TDengine, it is easy to migrate from existing solutions or create a new and lasting solution based on TDengine.| ## Comparison with other databases From 127b62ea0e1ea041082e54bb4a0d40305346b012 Mon Sep 17 00:00:00 2001 From: Jeff Tao Date: Tue, 23 Aug 2022 21:05:27 +0800 Subject: [PATCH 12/26] Update 01-index.md --- docs/en/01-index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/01-index.md b/docs/en/01-index.md index 363fa1101c..22e62bc5e0 100644 --- a/docs/en/01-index.md +++ b/docs/en/01-index.md @@ -5,7 +5,7 @@ slug: / --- -TDengine is an open source, cloud native time-series database optimized for Internet of Things (IoT), Connected Cars, and Industrial IoT. It enables efficient, real-time data ingestion, processing, and monitoring of TB and even PB scale data per day, generated by billions of sensors and data collectors. This document is the TDengine user manual. It introduces the basic, as well as novel concepts, in TDengine, and also talks in detail about installation, features, SQL, APIs, operation, maintenance, kernel design and other topics. It’s written mainly for architects, developers and system administrators. +TDengine is an [open source](https://tdengine.com/tdengine/open-source-time-series-database/), [cloud native](https://tdengine.com/tdengine/cloud-native-time-series-database/) time-series database optimized for Internet of Things (IoT), Connected Cars, and Industrial IoT. It enables efficient, real-time data ingestion, processing, and monitoring of TB and even PB scale data per day, generated by billions of sensors and data collectors. This document is the TDengine user manual. It introduces the basic, as well as novel concepts, in TDengine, and also talks in detail about installation, features, SQL, APIs, operation, maintenance, kernel design and other topics. It’s written mainly for architects, developers and system administrators. To get an overview of TDengine, such as a feature list, benchmarks, and competitive advantages, please browse through the [Introduction](./intro) section. From b9e1539cdd9d3082ba0349a8713ca9ea1750fc7b Mon Sep 17 00:00:00 2001 From: Jeff Tao Date: Tue, 23 Aug 2022 21:10:07 +0800 Subject: [PATCH 13/26] Update index.md --- docs/en/02-intro/index.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/en/02-intro/index.md b/docs/en/02-intro/index.md index db28cdd939..15f58cf5c8 100644 --- a/docs/en/02-intro/index.md +++ b/docs/en/02-intro/index.md @@ -3,7 +3,7 @@ title: Introduction toc_max_heading_level: 2 --- -TDengine is an open source, high-performance, cloud native time-series database optimized for Internet of Things (IoT), Connected Cars, and Industrial IoT. Its code, including its cluster feature is open source under GNU AGPL v3.0. Besides the database engine, it provides [caching](../develop/cache), [stream processing](../develop/stream), [data subscription](../develop/tmq) and other functionalities to reduce the system complexity and cost of development and operation. +TDengine is an open source, high-performance, cloud native [time-series database](https://tdengine.com/tsdb/) optimized for Internet of Things (IoT), Connected Cars, and Industrial IoT. Its code, including its cluster feature is open source under GNU AGPL v3.0. Besides the database engine, it provides [caching](../develop/cache), [stream processing](../develop/stream), [data subscription](../develop/tmq) and other functionalities to reduce the system complexity and cost of development and operation. This section introduces the major features, competitive advantages, typical use-cases and benchmarks to help you get a high level overview of TDengine. @@ -33,17 +33,18 @@ For more details on features, please read through the entire documentation. By making full use of [characteristics of time series data](https://tdengine.com/tsdb/characteristics-of-time-series-data/), TDengine differentiates itself from other time series databases, with the following advantages. -- **High-Performance**: TDengine is the only time-series database to solve the high cardinality issue to support billions of data collection points while out performing other time-series databases for data ingestion, querying and data compression. +- **[High-Performance](https://tdengine.com/tdengine/high-performance-time-series-database/)**: TDengine is the only time-series database to solve the high cardinality issue to support billions of data collection points while out performing other time-series databases for data ingestion, querying and data compression. -- **Simplified Solution**: Through built-in caching, stream processing and data subscription features, TDengine provides a simplified solution for time-series data processing. It reduces system design complexity and operation costs significantly. +- **[Simplified Solution](https://tdengine.com/tdengine/simplified-time-series-data-solution/)**: Through built-in caching, stream processing and data subscription features, TDengine provides a simplified solution for time-series data processing. It reduces system design complexity and operation costs significantly. -- **Cloud Native**: Through native distributed design, sharding and partitioning, separation of compute and storage, RAFT, support for kubernetes deployment and full observability, TDengine is a cloud native Time-Series Database and can be deployed on public, private or hybrid clouds. +- **[Cloud Native](https://tdengine.com/tdengine/cloud-native-time-series-database/)**: Through native distributed design, sharding and partitioning, separation of compute and storage, RAFT, support for kubernetes deployment and full observability, TDengine is a cloud native Time-Series Database and can be deployed on public, private or hybrid clouds. -- **Ease of Use**: For administrators, TDengine significantly reduces the effort to deploy and maintain. For developers, it provides a simple interface, simplified solution and seamless integrations for third party tools. For data users, it gives easy data access. +- **[Ease of Use]((https://tdengine.com/tdengine/easy-time-series-data-platform/)**: For administrators, TDengine significantly reduces the effort to[ +](https://tdengine.com/tdengine/easy-time-series-data-platform/) deploy and maintain. For developers, it provides a simple interface, simplified solution and seamless integrations for third party tools. For data users, it gives easy data access. -- **Easy Data Analytics**: Through super tables, storage and compute separation, data partitioning by time interval, pre-computation and other means, TDengine makes it easy to explore, format, and get access to data in a highly efficient way. +- **[Easy Data Analytics](https://tdengine.com/tdengine/time-series-data-analytics-made-easy/)**: Through super tables, storage and compute separation, data partitioning by time interval, pre-computation and other means, TDengine makes it easy to explore, format, and get access to data in a highly efficient way. -- **Open Source**: TDengine’s core modules, including cluster feature, are all available under open source licenses. It has gathered over 19k stars on GitHub. There is an active developer community, and over 140k running instances worldwide. +- **[Open Source](https://tdengine.com/tdengine/open-source-time-series-database/)**: TDengine’s core modules, including cluster feature, are all available under open source licenses. It has gathered over 19k stars on GitHub. There is an active developer community, and over 140k running instances worldwide. With TDengine, the total cost of ownership of your time-series data platform can be greatly reduced. 1: With its superior performance, the computing and storage resources are reduced significantly;2: With SQL support, it can be seamlessly integrated with many third party tools, and learning costs/migration costs are reduced significantly;3: With its simplified solution and nearly zero management, the operation and maintenance costs are reduced significantly. From a62806bdc588a29588ecd845eacabfb67144a18a Mon Sep 17 00:00:00 2001 From: Jeff Tao Date: Tue, 23 Aug 2022 21:10:39 +0800 Subject: [PATCH 14/26] Update index.md --- docs/en/02-intro/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/02-intro/index.md b/docs/en/02-intro/index.md index 15f58cf5c8..9f0876d297 100644 --- a/docs/en/02-intro/index.md +++ b/docs/en/02-intro/index.md @@ -39,7 +39,7 @@ By making full use of [characteristics of time series data](https://tdengine.com - **[Cloud Native](https://tdengine.com/tdengine/cloud-native-time-series-database/)**: Through native distributed design, sharding and partitioning, separation of compute and storage, RAFT, support for kubernetes deployment and full observability, TDengine is a cloud native Time-Series Database and can be deployed on public, private or hybrid clouds. -- **[Ease of Use]((https://tdengine.com/tdengine/easy-time-series-data-platform/)**: For administrators, TDengine significantly reduces the effort to[ +- **[Ease of Use](https://tdengine.com/tdengine/easy-time-series-data-platform/)**: For administrators, TDengine significantly reduces the effort to[ ](https://tdengine.com/tdengine/easy-time-series-data-platform/) deploy and maintain. For developers, it provides a simple interface, simplified solution and seamless integrations for third party tools. For data users, it gives easy data access. - **[Easy Data Analytics](https://tdengine.com/tdengine/time-series-data-analytics-made-easy/)**: Through super tables, storage and compute separation, data partitioning by time interval, pre-computation and other means, TDengine makes it easy to explore, format, and get access to data in a highly efficient way. From de2cecd52fa6ffcc81d0620be88d0f1b86227ce6 Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Tue, 23 Aug 2022 22:58:01 +0800 Subject: [PATCH 15/26] docs: update it devops telegraf for3.0 (#16356) * docs: update telegraf and collectd english version pictures * docs: fix it devops telegraf eng picture --- .../IT-DevOps-Solutions-Telegraf.webp | Bin 31076 -> 15652 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/en/25-application/IT-DevOps-Solutions-Telegraf.webp b/docs/en/25-application/IT-DevOps-Solutions-Telegraf.webp index fd5461ec9b37be66cac4c17fb1f81fec76158330..fac96f4eb63232c405bfb5e09eda7ed00901a7b5 100644 GIT binary patch literal 15652 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ˤ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 C^i~l7 literal 31076 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

gdVfNh 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 Date: Tue, 23 Aug 2022 23:18:12 +0800 Subject: [PATCH 16/26] docs: fix en/20-third-party/emqx/client-num.webp (#16357) --- docs/en/20-third-party/emqx/client-num.webp | Bin 7096 -> 26364 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/en/20-third-party/emqx/client-num.webp b/docs/en/20-third-party/emqx/client-num.webp index a151b184843607d67b649babb3145bfb3e329cda..a8ac6fb4c036b1db697d537472732ca854e583c8 100644 GIT binary patch literal 26364 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

~^2^X`X_`EkPOpK75u zO1hgg-0|oy9}@N;%U79QV+uq@;*#KcmOI`d96h~%Gm<2nIxAKFfJq}yzRCX*d%1^L zvtltY$Go%jFSo=-H1L#zLhZkHu=zN;S#u*!+(Sh>vM3Y(-aKi47a;(eSxf)`01KRi z*CqXB149kSp&ah)W)6+|ZuU%QeNF2Rjz!2E(*T(Fg0tFY>czLq5g;52@i5GAs(11j zEE_7z+DzNwl#|TNfeZYa@eqq;8Ka$65AUiM)nkC>70e~zRM#GxBnMqQ_#X{wGa%rC zt_6W=jv4zGSaRGJ-Ph^X&6sz->@-*7sHEsrhA9E&KRQ|CWe5Df>of;o_c!rtASN-MGW?}`P8f^hQDVd?l7Hm5j zxr4!u9(;n&IB`=@PPe7OEED*!fxPt7Vw+HmAUx3w6Fs(EyO7~{l}9b1Z(IN(Nf5cj z;;7pD2kqADs?ydd3~q~{EKeuG zptJQJwph(XARHQ)*Xht!)B&4Jh(JUi3YqSj7vG!Qn|xGH ztb#qK=kLMPr?@huH#466sYDynVNVH7J+n^N?cr9riwax506d5B3kUk_k)c!K;WZ}A^9BsGPDJrb=(9CdB zoIumwE;38LN;`atj>6p4Bz7r1bRaLQ@@rDNlJb#^?u&GNsM3ekxL82!FIFu{R!8Q1 z0`I>~1n4@j$6ND1stlpR5Jj)$`tb8EkLJqK%x+S*;pv1kz?&<4IgM)->PxGQ7QZ}j z6<4*iF+TL*66ca1ByT_}^h+MF0zn#4K!clVpcSN80J!JRt?|LpG-*{~d&~S&Eh!ss zZ{I>uVtjatLqGrk0{se560a77(jt(YhTz47jEY4U7Szn&_oci1g_#8cKj=Br`@yZu z!Vw_E_*5cnBI5^95NAg5m1;aBoNFp@ahq{%OAFe(@Q@5@Bjb+8H@k` Drjosg literal 7096 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 From 55f106db1120dd28e5e6a577dad40f32d6478bf3 Mon Sep 17 00:00:00 2001 From: gccgdb1234 Date: Wed, 24 Aug 2022 09:18:45 +0800 Subject: [PATCH 17/26] doc: move connector to a separate top chapter --- .../02-rest-api => 08-connector}/02-rest-api.mdx | 0 .../03-connector => 08-connector}/03-connector.mdx | 0 .../03-connector => 08-connector}/_01-error-code.md | 0 .../03-connector => 08-connector}/_category_.yml | 0 .../_linux_install.mdx | 0 .../03-connector => 08-connector}/_preparition.mdx | 0 .../03-connector => 08-connector}/_verify_linux.mdx | 0 .../_verify_windows.mdx | 0 .../_windows_install.mdx | 0 .../03-connector => 08-connector}/connector.webp | Bin .../03-connector => 08-connector}/cpp.mdx | 0 .../03-connector => 08-connector}/csharp.mdx | 0 .../03-connector => 08-connector}/go.mdx | 0 .../03-connector => 08-connector}/java.mdx | 0 .../03-connector => 08-connector}/node.mdx | 0 .../03-connector => 08-connector}/php.mdx | 0 .../03-connector => 08-connector}/python.mdx | 0 .../03-connector => 08-connector}/rust.mdx | 0 .../tdengine-jdbc-connector.webp | Bin docs/zh/14-reference/02-rest-api/_category_.yml | 1 - 20 files changed, 1 deletion(-) rename docs/zh/{14-reference/02-rest-api => 08-connector}/02-rest-api.mdx (100%) rename docs/zh/{14-reference/03-connector => 08-connector}/03-connector.mdx (100%) rename docs/zh/{14-reference/03-connector => 08-connector}/_01-error-code.md (100%) rename docs/zh/{14-reference/03-connector => 08-connector}/_category_.yml (100%) rename docs/zh/{14-reference/03-connector => 08-connector}/_linux_install.mdx (100%) rename docs/zh/{14-reference/03-connector => 08-connector}/_preparition.mdx (100%) rename docs/zh/{14-reference/03-connector => 08-connector}/_verify_linux.mdx (100%) rename docs/zh/{14-reference/03-connector => 08-connector}/_verify_windows.mdx (100%) rename docs/zh/{14-reference/03-connector => 08-connector}/_windows_install.mdx (100%) rename docs/zh/{14-reference/03-connector => 08-connector}/connector.webp (100%) rename docs/zh/{14-reference/03-connector => 08-connector}/cpp.mdx (100%) rename docs/zh/{14-reference/03-connector => 08-connector}/csharp.mdx (100%) rename docs/zh/{14-reference/03-connector => 08-connector}/go.mdx (100%) rename docs/zh/{14-reference/03-connector => 08-connector}/java.mdx (100%) rename docs/zh/{14-reference/03-connector => 08-connector}/node.mdx (100%) rename docs/zh/{14-reference/03-connector => 08-connector}/php.mdx (100%) rename docs/zh/{14-reference/03-connector => 08-connector}/python.mdx (100%) rename docs/zh/{14-reference/03-connector => 08-connector}/rust.mdx (100%) rename docs/zh/{14-reference/03-connector => 08-connector}/tdengine-jdbc-connector.webp (100%) delete mode 100644 docs/zh/14-reference/02-rest-api/_category_.yml diff --git a/docs/zh/14-reference/02-rest-api/02-rest-api.mdx b/docs/zh/08-connector/02-rest-api.mdx similarity index 100% rename from docs/zh/14-reference/02-rest-api/02-rest-api.mdx rename to docs/zh/08-connector/02-rest-api.mdx diff --git a/docs/zh/14-reference/03-connector/03-connector.mdx b/docs/zh/08-connector/03-connector.mdx similarity index 100% rename from docs/zh/14-reference/03-connector/03-connector.mdx rename to docs/zh/08-connector/03-connector.mdx diff --git a/docs/zh/14-reference/03-connector/_01-error-code.md b/docs/zh/08-connector/_01-error-code.md similarity index 100% rename from docs/zh/14-reference/03-connector/_01-error-code.md rename to docs/zh/08-connector/_01-error-code.md diff --git a/docs/zh/14-reference/03-connector/_category_.yml b/docs/zh/08-connector/_category_.yml similarity index 100% rename from docs/zh/14-reference/03-connector/_category_.yml rename to docs/zh/08-connector/_category_.yml diff --git a/docs/zh/14-reference/03-connector/_linux_install.mdx b/docs/zh/08-connector/_linux_install.mdx similarity index 100% rename from docs/zh/14-reference/03-connector/_linux_install.mdx rename to docs/zh/08-connector/_linux_install.mdx diff --git a/docs/zh/14-reference/03-connector/_preparition.mdx b/docs/zh/08-connector/_preparition.mdx similarity index 100% rename from docs/zh/14-reference/03-connector/_preparition.mdx rename to docs/zh/08-connector/_preparition.mdx diff --git a/docs/zh/14-reference/03-connector/_verify_linux.mdx b/docs/zh/08-connector/_verify_linux.mdx similarity index 100% rename from docs/zh/14-reference/03-connector/_verify_linux.mdx rename to docs/zh/08-connector/_verify_linux.mdx diff --git a/docs/zh/14-reference/03-connector/_verify_windows.mdx b/docs/zh/08-connector/_verify_windows.mdx similarity index 100% rename from docs/zh/14-reference/03-connector/_verify_windows.mdx rename to docs/zh/08-connector/_verify_windows.mdx diff --git a/docs/zh/14-reference/03-connector/_windows_install.mdx b/docs/zh/08-connector/_windows_install.mdx similarity index 100% rename from docs/zh/14-reference/03-connector/_windows_install.mdx rename to docs/zh/08-connector/_windows_install.mdx diff --git a/docs/zh/14-reference/03-connector/connector.webp b/docs/zh/08-connector/connector.webp similarity index 100% rename from docs/zh/14-reference/03-connector/connector.webp rename to docs/zh/08-connector/connector.webp diff --git a/docs/zh/14-reference/03-connector/cpp.mdx b/docs/zh/08-connector/cpp.mdx similarity index 100% rename from docs/zh/14-reference/03-connector/cpp.mdx rename to docs/zh/08-connector/cpp.mdx diff --git a/docs/zh/14-reference/03-connector/csharp.mdx b/docs/zh/08-connector/csharp.mdx similarity index 100% rename from docs/zh/14-reference/03-connector/csharp.mdx rename to docs/zh/08-connector/csharp.mdx diff --git a/docs/zh/14-reference/03-connector/go.mdx b/docs/zh/08-connector/go.mdx similarity index 100% rename from docs/zh/14-reference/03-connector/go.mdx rename to docs/zh/08-connector/go.mdx diff --git a/docs/zh/14-reference/03-connector/java.mdx b/docs/zh/08-connector/java.mdx similarity index 100% rename from docs/zh/14-reference/03-connector/java.mdx rename to docs/zh/08-connector/java.mdx diff --git a/docs/zh/14-reference/03-connector/node.mdx b/docs/zh/08-connector/node.mdx similarity index 100% rename from docs/zh/14-reference/03-connector/node.mdx rename to docs/zh/08-connector/node.mdx diff --git a/docs/zh/14-reference/03-connector/php.mdx b/docs/zh/08-connector/php.mdx similarity index 100% rename from docs/zh/14-reference/03-connector/php.mdx rename to docs/zh/08-connector/php.mdx diff --git a/docs/zh/14-reference/03-connector/python.mdx b/docs/zh/08-connector/python.mdx similarity index 100% rename from docs/zh/14-reference/03-connector/python.mdx rename to docs/zh/08-connector/python.mdx diff --git a/docs/zh/14-reference/03-connector/rust.mdx b/docs/zh/08-connector/rust.mdx similarity index 100% rename from docs/zh/14-reference/03-connector/rust.mdx rename to docs/zh/08-connector/rust.mdx diff --git a/docs/zh/14-reference/03-connector/tdengine-jdbc-connector.webp b/docs/zh/08-connector/tdengine-jdbc-connector.webp similarity index 100% rename from docs/zh/14-reference/03-connector/tdengine-jdbc-connector.webp rename to docs/zh/08-connector/tdengine-jdbc-connector.webp diff --git a/docs/zh/14-reference/02-rest-api/_category_.yml b/docs/zh/14-reference/02-rest-api/_category_.yml deleted file mode 100644 index 57a20d8458..0000000000 --- a/docs/zh/14-reference/02-rest-api/_category_.yml +++ /dev/null @@ -1 +0,0 @@ -label: REST API From bafc69462f584e1384e3ce641f29ed7469fcdf57 Mon Sep 17 00:00:00 2001 From: gccgdb1234 Date: Wed, 24 Aug 2022 09:30:46 +0800 Subject: [PATCH 18/26] doc: fix broken links --- docs/zh/08-connector/csharp.mdx | 12 ++++++------ docs/zh/08-connector/go.mdx | 10 +++++----- docs/zh/08-connector/node.mdx | 10 +++++----- docs/zh/08-connector/rust.mdx | 6 +++--- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/zh/08-connector/csharp.mdx b/docs/zh/08-connector/csharp.mdx index 723c12932b..00d6dffa2c 100644 --- a/docs/zh/08-connector/csharp.mdx +++ b/docs/zh/08-connector/csharp.mdx @@ -9,12 +9,12 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import Preparition from "./_preparition.mdx" -import CSInsert from "../../07-develop/03-insert-data/_cs_sql.mdx" -import CSInfluxLine from "../../07-develop/03-insert-data/_cs_line.mdx" -import CSOpenTSDBTelnet from "../../07-develop/03-insert-data/_cs_opts_telnet.mdx" -import CSOpenTSDBJson from "../../07-develop/03-insert-data/_cs_opts_json.mdx" -import CSQuery from "../../07-develop/04-query-data/_cs.mdx" -import CSAsyncQuery from "../../07-develop/04-query-data/_cs_async.mdx" +import CSInsert from "../07-develop/03-insert-data/_cs_sql.mdx" +import CSInfluxLine from "../07-develop/03-insert-data/_cs_line.mdx" +import CSOpenTSDBTelnet from "../07-develop/03-insert-data/_cs_opts_telnet.mdx" +import CSOpenTSDBJson from "../07-develop/03-insert-data/_cs_opts_json.mdx" +import CSQuery from "../07-develop/04-query-data/_cs.mdx" +import CSAsyncQuery from "../07-develop/04-query-data/_cs_async.mdx" `TDengine.Connector` 是 TDengine 提供的 C# 语言连接器。C# 开发人员可以通过它开发存取 TDengine 集群数据的 C# 应用软件。 diff --git a/docs/zh/08-connector/go.mdx b/docs/zh/08-connector/go.mdx index a87c948d4a..fd90f964bd 100644 --- a/docs/zh/08-connector/go.mdx +++ b/docs/zh/08-connector/go.mdx @@ -9,11 +9,11 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import Preparition from "./_preparition.mdx" -import GoInsert from "../../07-develop/03-insert-data/_go_sql.mdx" -import GoInfluxLine from "../../07-develop/03-insert-data/_go_line.mdx" -import GoOpenTSDBTelnet from "../../07-develop/03-insert-data/_go_opts_telnet.mdx" -import GoOpenTSDBJson from "../../07-develop/03-insert-data/_go_opts_json.mdx" -import GoQuery from "../../07-develop/04-query-data/_go.mdx" +import GoInsert from "../07-develop/03-insert-data/_go_sql.mdx" +import GoInfluxLine from "../07-develop/03-insert-data/_go_line.mdx" +import GoOpenTSDBTelnet from "../07-develop/03-insert-data/_go_opts_telnet.mdx" +import GoOpenTSDBJson from "../07-develop/03-insert-data/_go_opts_json.mdx" +import GoQuery from "../07-develop/04-query-data/_go.mdx" `driver-go` 是 TDengine 的官方 Go 语言连接器,实现了 Go 语言[ database/sql ](https://golang.org/pkg/database/sql/) 包的接口。Go 开发人员可以通过它开发存取 TDengine 集群数据的应用软件。 diff --git a/docs/zh/08-connector/node.mdx b/docs/zh/08-connector/node.mdx index b089da99d2..f840c26fd2 100644 --- a/docs/zh/08-connector/node.mdx +++ b/docs/zh/08-connector/node.mdx @@ -9,11 +9,11 @@ import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; import Preparition from "./_preparition.mdx"; -import NodeInsert from "../../07-develop/03-insert-data/_js_sql.mdx"; -import NodeInfluxLine from "../../07-develop/03-insert-data/_js_line.mdx"; -import NodeOpenTSDBTelnet from "../../07-develop/03-insert-data/_js_opts_telnet.mdx"; -import NodeOpenTSDBJson from "../../07-develop/03-insert-data/_js_opts_json.mdx"; -import NodeQuery from "../../07-develop/04-query-data/_js.mdx"; +import NodeInsert from "../07-develop/03-insert-data/_js_sql.mdx"; +import NodeInfluxLine from "../07-develop/03-insert-data/_js_line.mdx"; +import NodeOpenTSDBTelnet from "../07-develop/03-insert-data/_js_opts_telnet.mdx"; +import NodeOpenTSDBJson from "../07-develop/03-insert-data/_js_opts_json.mdx"; +import NodeQuery from "../07-develop/04-query-data/_js.mdx"; `@tdengine/client` 和 `@tdengine/rest` 是 TDengine 的官方 Node.js 语言连接器。 Node.js 开发人员可以通过它开发可以存取 TDengine 集群数据的应用软件。注意:从 TDengine 3.0 开始 Node.js 原生连接器的包名由 `td2.0-connector` 改名为 `@tdengine/client` 而 rest 连接器的包名由 `td2.0-rest-connector` 改为 `@tdengine/rest`。并且不与 TDengine 2.x 兼容。 diff --git a/docs/zh/08-connector/rust.mdx b/docs/zh/08-connector/rust.mdx index ae644e1911..e824b7e73c 100644 --- a/docs/zh/08-connector/rust.mdx +++ b/docs/zh/08-connector/rust.mdx @@ -9,9 +9,9 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import Preparition from "./_preparition.mdx" -import RustInsert from "../../07-develop/03-insert-data/_rust_sql.mdx" -import RustBind from "../../07-develop/03-insert-data/_rust_stmt.mdx" -import RustQuery from "../../07-develop/04-query-data/_rust.mdx" +import RustInsert from "../07-develop/03-insert-data/_rust_sql.mdx" +import RustBind from "../07-develop/03-insert-data/_rust_stmt.mdx" +import RustQuery from "../07-develop/04-query-data/_rust.mdx" [![Crates.io](https://img.shields.io/crates/v/taos)](https://crates.io/crates/taos) ![Crates.io](https://img.shields.io/crates/d/taos) [![docs.rs](https://img.shields.io/docsrs/taos)](https://docs.rs/taos) From 3c5d4ad90e139cd8ea1f7187541e1af25a9c435c Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Wed, 24 Aug 2022 09:32:27 +0800 Subject: [PATCH 19/26] fix: fix invalid memory access cause of job freed --- source/libs/scheduler/inc/schInt.h | 2 +- source/libs/scheduler/src/schTask.c | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/source/libs/scheduler/inc/schInt.h b/source/libs/scheduler/inc/schInt.h index ce841ed83c..957fd46ba5 100644 --- a/source/libs/scheduler/inc/schInt.h +++ b/source/libs/scheduler/inc/schInt.h @@ -283,7 +283,7 @@ typedef struct SSchJob { } SSchJob; typedef struct SSchTaskCtx { - SSchJob *pJob; + int64_t jobRid; SSchTask *pTask; } SSchTaskCtx; diff --git a/source/libs/scheduler/src/schTask.c b/source/libs/scheduler/src/schTask.c index d16d15c119..9cab39c301 100644 --- a/source/libs/scheduler/src/schTask.c +++ b/source/libs/scheduler/src/schTask.c @@ -821,7 +821,13 @@ int32_t schProcessOnTaskStatusRsp(SQueryNodeEpId *pEpId, SArray *pStatusList) { int32_t schLaunchTaskImpl(void *param) { SSchTaskCtx *pCtx = (SSchTaskCtx *)param; - SSchJob *pJob = pCtx->pJob; + SSchJob *pJob = schAcquireJob(pCtx->jobRid); + if (NULL == pJob) { + taosMemoryFree(param); + qDebug("job refId 0x%" PRIx64 " already not exist", pCtx->jobRid); + SCH_RET(TSDB_CODE_SCH_JOB_IS_DROPPING); + } + SSchTask *pTask = pCtx->pTask; int8_t status = 0; int32_t code = 0; @@ -880,6 +886,8 @@ _return: } } + schReleaseJob(pJob->refId); + SCH_RET(code); } @@ -890,7 +898,7 @@ int32_t schAsyncLaunchTaskImpl(SSchJob *pJob, SSchTask *pTask) { SCH_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); } - param->pJob = pJob; + param->jobRid = pJob->refId; param->pTask = pTask; if (pJob->taskNum >= SCH_MIN_AYSNC_EXEC_NUM) { From 1f248ea163290fb96645036f0a3dc32c1961acf9 Mon Sep 17 00:00:00 2001 From: gccgdb1234 Date: Wed, 24 Aug 2022 09:33:19 +0800 Subject: [PATCH 20/26] doc: fix broken links --- docs/zh/07-develop/01-connect/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/zh/07-develop/01-connect/index.md b/docs/zh/07-develop/01-connect/index.md index cc9f2e2a69..c1f7e34cb9 100644 --- a/docs/zh/07-develop/01-connect/index.md +++ b/docs/zh/07-develop/01-connect/index.md @@ -14,10 +14,10 @@ import ConnCSNative from "./_connect_cs.mdx"; import ConnC from "./_connect_c.mdx"; import ConnR from "./_connect_r.mdx"; import ConnPHP from "./_connect_php.mdx"; -import InstallOnWindows from "../../14-reference/03-connector/_linux_install.mdx"; -import InstallOnLinux from "../../14-reference/03-connector/_windows_install.mdx"; -import VerifyLinux from "../../14-reference/03-connector/_verify_linux.mdx"; -import VerifyWindows from "../../14-reference/03-connector/_verify_windows.mdx"; +import InstallOnWindows from "../../08-connector/_linux_install.mdx"; +import InstallOnLinux from "../../08-connector/_windows_install.mdx"; +import VerifyLinux from "../../08-connector/_verify_linux.mdx"; +import VerifyWindows from "../../08-connector/_verify_windows.mdx"; TDengine 提供了丰富的应用程序开发接口,为了便于用户快速开发自己的应用,TDengine 支持了多种编程语言的连接器,其中官方连接器包括支持 C/C++、Java、Python、Go、Node.js、C#、Rust、Lua(社区贡献)和 PHP (社区贡献)的连接器。这些连接器支持使用原生接口(taosc)和 REST 接口(部分语言暂不支持)连接 TDengine 集群。社区开发者也贡献了多个非官方连接器,例如 ADO.NET 连接器、Lua 连接器和 PHP 连接器。 From 576a6bdb29f0c9be1535b94b7007a2da1497277c Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Wed, 24 Aug 2022 09:47:52 +0800 Subject: [PATCH 21/26] feat: update taostools 2af2222 for3.0 (#16358) * feat: update taos-tools for 3.0 [TD-14141] * feat: update taos-tools for 3.0 * feat: update taos-tools for 3.0 * feat: update taos-tools for 3.0 * feat: update taos-tools for 3.0 * feat: update taos-tools for 3.0 * feat: update taos-tools for 3.0 * feat: update taos-tools for 3.0 * feat: update taos-tools for 3.0 * feat: update taos-tools for 3.0 * feat: update taos-tools 8e3b3ee * fix: remove submodules * feat: update taos-tools c529299 * feat: update taos-tools 9dc2fec for 3.0 * fix: optim upx * feat: update taos-tools f4e456a for 3.0 * feat: update taos-tools 2a2def1 for 3.0 * feat: update taos-tools c9cc20f for 3.0 * feat: update taostoosl 8a5e336 for 3.0 * feat: update taostools 3c7dafe for 3.0 * feat: update taos-tools 2d68404 for 3.0 * feat: update taos-tools 57bdfbf for 3.0 * fix: jenkinsfile2 to upgrade pip * feat: update taostoosl 11d23e5 for 3.0 * feat: update taostools 43924b8 for 3.0 * feat: update taostools 53a0103 for 3.0 * feat: update taostoosl d237772 for 3.0 * feat: update taos-tools 6bde102 for 3.0 * feat: upate taos-tools 2af2222 for 3.0 --- 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 fdee0d600c..e593e6d62b 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 6bde102 + GIT_TAG 2af2222 SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools" BINARY_DIR "" #BUILD_IN_SOURCE TRUE From 53e0e168e6067d28198239c08b1a5b0223d2179c Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Wed, 24 Aug 2022 10:36:46 +0800 Subject: [PATCH 22/26] fix:add log --- source/libs/executor/src/executil.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index 4c694026cb..197d94dcf4 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -469,6 +469,7 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, uint64_t suid, SArray SDataType type = {.type = TSDB_DATA_TYPE_BOOL, .bytes = sizeof(bool)}; code = createResultData(&type, rows, &output); if (code != TSDB_CODE_SUCCESS) { + terrno = code; qError("failed to create result, reason:%s", tstrerror(code)); goto end; } @@ -477,6 +478,7 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, uint64_t suid, SArray if(code != TSDB_CODE_SUCCESS){ qError("failed to calculate scalar, reason:%s", tstrerror(code)); terrno = code; + goto end; } // int64_t st2 = taosGetTimestampUs(); // qDebug("calculate tag block rows:%d, cost:%ld us", rows, st2-st1); @@ -763,6 +765,7 @@ int32_t getTableList(void* metaHandle, void* pVnode, SScanPhysiNode* pScanNode, } if (pTagCond) { + terrno = TDB_CODE_SUCCESS; SColumnInfoData* pColInfoData = getColInfoResult(metaHandle, pListInfo->suid, res, pTagCond); if(terrno != TDB_CODE_SUCCESS){ colDataDestroy(pColInfoData); From 370b5136c22b3f3881f23e83dd74463ec34f94e5 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Wed, 24 Aug 2022 10:38:26 +0800 Subject: [PATCH 23/26] fix(query): fix the last block check condition. --- source/dnode/vnode/src/tsdb/tsdbRead.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index cb288cecfb..0b027367da 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -1416,7 +1416,7 @@ static int32_t doMergeBufAndFileRows_Rv(STsdbReader* pReader, STableBlockScanInf int64_t minKey = 0; if (pReader->order == TSDB_ORDER_ASC) { minKey = INT64_MAX; // chosen the minimum value - if (minKey > tsLast && pLastBlockReader->lastBlockData.nRow > 0) { + if (minKey > tsLast && hasDataInLastBlock(pLastBlockReader)) { minKey = tsLast; } @@ -1429,7 +1429,7 @@ static int32_t doMergeBufAndFileRows_Rv(STsdbReader* pReader, STableBlockScanInf } } else { minKey = INT64_MIN; - if (minKey < tsLast && pLastBlockReader->lastBlockData.nRow > 0) { + if (minKey < tsLast && hasDataInLastBlock(pLastBlockReader)) { minKey = tsLast; } From 4a494cc02e01e31e1c5c30c61fe2171e0b84c7ae Mon Sep 17 00:00:00 2001 From: gccgdb1234 Date: Wed, 24 Aug 2022 10:44:09 +0800 Subject: [PATCH 24/26] doc: fix broken links --- docs/zh/07-develop/01-connect/_connect_java.mdx | 2 +- docs/zh/07-develop/01-connect/index.md | 2 +- docs/zh/07-develop/07-tmq.mdx | 2 +- docs/zh/07-develop/index.md | 2 +- docs/zh/08-connector/cpp.mdx | 4 ++-- docs/zh/08-connector/csharp.mdx | 4 ++-- docs/zh/08-connector/go.mdx | 4 ++-- docs/zh/08-connector/java.mdx | 4 ++-- docs/zh/08-connector/node.mdx | 4 ++-- docs/zh/08-connector/php.mdx | 2 +- docs/zh/08-connector/python.mdx | 4 ++-- docs/zh/08-connector/rust.mdx | 4 ++-- docs/zh/14-reference/08-taos-shell.md | 4 ++-- docs/zh/20-third-party/11-kafka.md | 2 +- 14 files changed, 22 insertions(+), 22 deletions(-) diff --git a/docs/zh/07-develop/01-connect/_connect_java.mdx b/docs/zh/07-develop/01-connect/_connect_java.mdx index f5b8ea1cc2..86c70ef7dc 100644 --- a/docs/zh/07-develop/01-connect/_connect_java.mdx +++ b/docs/zh/07-develop/01-connect/_connect_java.mdx @@ -12,4 +12,4 @@ {{#include docs/examples/java/src/main/java/com/taos/example/WSConnectExample.java:main}} ``` -更多连接参数配置,参考[Java 连接器](/reference/connector/java) +更多连接参数配置,参考[Java 连接器](../../connector/java) diff --git a/docs/zh/07-develop/01-connect/index.md b/docs/zh/07-develop/01-connect/index.md index c1f7e34cb9..77f5838c8f 100644 --- a/docs/zh/07-develop/01-connect/index.md +++ b/docs/zh/07-develop/01-connect/index.md @@ -33,7 +33,7 @@ TDengine 提供了丰富的应用程序开发接口,为了便于用户快速 关键不同点在于: 1. 使用 REST 连接,用户无需安装客户端驱动程序 taosc,具有跨平台易用的优势,但性能要下降 30%左右。 -2. 使用原生连接可以体验 TDengine 的全部功能,如[参数绑定接口](/reference/connector/cpp#参数绑定-api)、[订阅](/reference/connector/cpp#订阅和消费-api)等等。 +2. 使用原生连接可以体验 TDengine 的全部功能,如[参数绑定接口](../../connector/cpp#参数绑定-api)、[订阅](../../connector/cpp#订阅和消费-api)等等。 ## 安装客户端驱动 taosc diff --git a/docs/zh/07-develop/07-tmq.mdx b/docs/zh/07-develop/07-tmq.mdx index da8bf5e20e..2f5c13d9b0 100644 --- a/docs/zh/07-develop/07-tmq.mdx +++ b/docs/zh/07-develop/07-tmq.mdx @@ -64,7 +64,7 @@ DLL_EXPORT void tmq_conf_destroy(tmq_conf_t *conf); DLL_EXPORT void tmq_conf_set_auto_commit_cb(tmq_conf_t *conf, tmq_commit_cb *cb, void *param); ``` -这些 API 的文档请见 [C/C++ Connector](/reference/connector/cpp),下面介绍一下它们的具体用法(超级表和子表结构请参考“数据建模”一节),完整的示例代码请见下面 C 语言的示例代码。 +这些 API 的文档请见 [C/C++ Connector](../../connector/cpp),下面介绍一下它们的具体用法(超级表和子表结构请参考“数据建模”一节),完整的示例代码请见下面 C 语言的示例代码。 diff --git a/docs/zh/07-develop/index.md b/docs/zh/07-develop/index.md index 4d0f3c3cea..f46f91df70 100644 --- a/docs/zh/07-develop/index.md +++ b/docs/zh/07-develop/index.md @@ -12,7 +12,7 @@ title: 开发指南 7. 在很多场景下(如车辆管理),应用需要获取每个数据采集点的最新状态,那么建议你采用TDengine的cache功能,而不用单独部署Redis等缓存软件。 8. 如果你发现TDengine的函数无法满足你的要求,那么你可以使用用户自定义函数来解决问题。 -本部分内容就是按照上述的顺序组织的。为便于理解,TDengine为每个功能为每个支持的编程语言都提供了示例代码。如果你希望深入了解SQL的使用,需要查看[SQL手册](/taos-sql/)。如果想更深入地了解各连接器的使用,请阅读[连接器参考指南](/reference/connector/)。如果还希望想将TDengine与第三方系统集成起来,比如Grafana, 请参考[第三方工具](/third-party/)。 +本部分内容就是按照上述的顺序组织的。为便于理解,TDengine为每个功能为每个支持的编程语言都提供了示例代码。如果你希望深入了解SQL的使用,需要查看[SQL手册](/taos-sql/)。如果想更深入地了解各连接器的使用,请阅读[连接器参考指南](../reference/connector/)。如果还希望想将TDengine与第三方系统集成起来,比如Grafana, 请参考[第三方工具](/third-party/)。 如果在开发过程中遇到任何问题,请点击每个页面下方的["反馈问题"](https://github.com/taosdata/TDengine/issues/new/choose), 在GitHub上直接递交issue。 diff --git a/docs/zh/08-connector/cpp.mdx b/docs/zh/08-connector/cpp.mdx index bd5776d035..6e7d6c25b9 100644 --- a/docs/zh/08-connector/cpp.mdx +++ b/docs/zh/08-connector/cpp.mdx @@ -22,7 +22,7 @@ TDengine 客户端驱动的动态库位于: ## 支持的平台 -请参考[支持的平台列表](/reference/connector#支持的平台) +请参考[支持的平台列表](../connector#支持的平台) ## 支持的版本 @@ -30,7 +30,7 @@ TDengine 客户端驱动的版本号与 TDengine 服务端的版本号是一一 ## 安装步骤 -TDengine 客户端驱动的安装请参考 [安装指南](/reference/connector#安装步骤) +TDengine 客户端驱动的安装请参考 [安装指南](../connector#安装步骤) ## 建立连接 diff --git a/docs/zh/08-connector/csharp.mdx b/docs/zh/08-connector/csharp.mdx index 00d6dffa2c..f4aa30c310 100644 --- a/docs/zh/08-connector/csharp.mdx +++ b/docs/zh/08-connector/csharp.mdx @@ -32,7 +32,7 @@ import CSAsyncQuery from "../07-develop/04-query-data/_cs_async.mdx" ## 版本支持 -请参考[版本支持列表](/reference/connector#版本支持) +请参考[版本支持列表](../connector#版本支持) ## 支持的功能特性 @@ -49,7 +49,7 @@ import CSAsyncQuery from "../07-develop/04-query-data/_cs_async.mdx" * 安装 [.NET SDK](https://dotnet.microsoft.com/download) * [Nuget 客户端](https://docs.microsoft.com/en-us/nuget/install-nuget-client-tools) (可选安装) -* 安装 TDengine 客户端驱动,具体步骤请参考[安装客户端驱动](/reference/connector#安装客户端驱动) +* 安装 TDengine 客户端驱动,具体步骤请参考[安装客户端驱动](../connector#安装客户端驱动) ### 使用 dotnet CLI 安装 diff --git a/docs/zh/08-connector/go.mdx b/docs/zh/08-connector/go.mdx index fd90f964bd..e883598c12 100644 --- a/docs/zh/08-connector/go.mdx +++ b/docs/zh/08-connector/go.mdx @@ -30,7 +30,7 @@ REST 连接支持所有能运行 Go 的平台。 ## 版本支持 -请参考[版本支持列表](/reference/connector#版本支持) +请参考[版本支持列表](../connector#版本支持) ## 支持的功能特性 @@ -56,7 +56,7 @@ REST 连接支持所有能运行 Go 的平台。 ### 安装前准备 * 安装 Go 开发环境(Go 1.14 及以上,GCC 4.8.5 及以上) -* 如果使用原生连接器,请安装 TDengine 客户端驱动,具体步骤请参考[安装客户端驱动](/reference/connector#安装客户端驱动) +* 如果使用原生连接器,请安装 TDengine 客户端驱动,具体步骤请参考[安装客户端驱动](../connector#安装客户端驱动) 配置好环境变量,检查命令: diff --git a/docs/zh/08-connector/java.mdx b/docs/zh/08-connector/java.mdx index 183994313e..723b2ad681 100644 --- a/docs/zh/08-connector/java.mdx +++ b/docs/zh/08-connector/java.mdx @@ -35,7 +35,7 @@ REST 连接支持所有能运行 Java 的平台。 ## 版本支持 -请参考[版本支持列表](/reference/connector#版本支持) +请参考[版本支持列表](../connector#版本支持) ## TDengine DataType 和 Java DataType @@ -64,7 +64,7 @@ TDengine 目前支持时间戳、数字、字符、布尔类型,与 Java 对 使用 Java Connector 连接数据库前,需要具备以下条件: - 已安装 Java 1.8 或以上版本运行时环境和 Maven 3.6 或以上版本 -- 已安装 TDengine 客户端驱动(使用原生连接必须安装,使用 REST 连接无需安装),具体步骤请参考[安装客户端驱动](/reference/connector#安装客户端驱动) +- 已安装 TDengine 客户端驱动(使用原生连接必须安装,使用 REST 连接无需安装),具体步骤请参考[安装客户端驱动](../connector#安装客户端驱动) ### 安装连接器 diff --git a/docs/zh/08-connector/node.mdx b/docs/zh/08-connector/node.mdx index f840c26fd2..c4004a5f59 100644 --- a/docs/zh/08-connector/node.mdx +++ b/docs/zh/08-connector/node.mdx @@ -28,7 +28,7 @@ REST 连接器支持所有能运行 Node.js 的平台。 ## 版本支持 -请参考[版本支持列表](/reference/connector#版本支持) +请参考[版本支持列表](../connector#版本支持) ## 支持的功能特性 @@ -52,7 +52,7 @@ REST 连接器支持所有能运行 Node.js 的平台。 ### 安装前准备 - 安装 Node.js 开发环境 -- 如果使用 REST 连接器,跳过此步。但如果使用原生连接器,请安装 TDengine 客户端驱动,具体步骤请参考[安装客户端驱动](/reference/connector#安装客户端驱动)。我们使用 [node-gyp](https://github.com/nodejs/node-gyp) 和 TDengine 实例进行交互,还需要根据具体操作系统来安装下文提到的一些依赖工具。 +- 如果使用 REST 连接器,跳过此步。但如果使用原生连接器,请安装 TDengine 客户端驱动,具体步骤请参考[安装客户端驱动](../connector#安装客户端驱动)。我们使用 [node-gyp](https://github.com/nodejs/node-gyp) 和 TDengine 实例进行交互,还需要根据具体操作系统来安装下文提到的一些依赖工具。 diff --git a/docs/zh/08-connector/php.mdx b/docs/zh/08-connector/php.mdx index 5617dc6f73..5c7525842a 100644 --- a/docs/zh/08-connector/php.mdx +++ b/docs/zh/08-connector/php.mdx @@ -38,7 +38,7 @@ TDengine 客户端驱动的版本号与 TDengine 服务端的版本号是一一 ### 安装 TDengine 客户端驱动 -TDengine 客户端驱动的安装请参考 [安装指南](/reference/connector#安装步骤) +TDengine 客户端驱动的安装请参考 [安装指南](../connector#安装步骤) ### 编译安装 php-tdengine diff --git a/docs/zh/08-connector/python.mdx b/docs/zh/08-connector/python.mdx index 9ce81f9d70..46b2bf89a2 100644 --- a/docs/zh/08-connector/python.mdx +++ b/docs/zh/08-connector/python.mdx @@ -8,7 +8,7 @@ description: "taospy 是 TDengine 的官方 Python 连接器。taospy 提供了 import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; -`taospy` 是 TDengine 的官方 Python 连接器。`taospy` 提供了丰富的 API, 使得 Python 应用可以很方便地使用 TDengine。`taospy` 对 TDengine 的[原生接口](/reference/connector/cpp)和 [REST 接口](/reference/rest-api)都进行了封装, 分别对应 `taospy` 包的 `taos` 模块 和 `taosrest` 模块。 +`taospy` 是 TDengine 的官方 Python 连接器。`taospy` 提供了丰富的 API, 使得 Python 应用可以很方便地使用 TDengine。`taospy` 对 TDengine 的[原生接口](../connector/cpp)和 [REST 接口](/reference/rest-api)都进行了封装, 分别对应 `taospy` 包的 `taos` 模块 和 `taosrest` 模块。 除了对原生接口和 REST 接口的封装,`taospy` 还提供了符合 [Python 数据访问规范(PEP 249)](https://peps.python.org/pep-0249/) 的编程接口。这使得 `taospy` 和很多第三方工具集成变得简单,比如 [SQLAlchemy](https://www.sqlalchemy.org/) 和 [pandas](https://pandas.pydata.org/)。 使用客户端驱动提供的原生接口直接与服务端建立的连接的方式下文中称为“原生连接”;使用 taosAdapter 提供的 REST 接口与服务端建立的连接的方式下文中称为“REST 连接”。 @@ -17,7 +17,7 @@ Python 连接器的源码托管在 [GitHub](https://github.com/taosdata/taos-con ## 支持的平台 -- 原生连接[支持的平台](/reference/connector/#支持的平台)和 TDengine 客户端支持的平台一致。 +- 原生连接[支持的平台](../connector/#支持的平台)和 TDengine 客户端支持的平台一致。 - REST 连接支持所有能运行 Python 的平台。 ## 版本选择 diff --git a/docs/zh/08-connector/rust.mdx b/docs/zh/08-connector/rust.mdx index e824b7e73c..ddb0885f9d 100644 --- a/docs/zh/08-connector/rust.mdx +++ b/docs/zh/08-connector/rust.mdx @@ -28,7 +28,7 @@ Websocket 连接支持所有能运行 Rust 的平台。 ## 版本支持 -请参考[版本支持列表](/reference/connector#版本支持) +请参考[版本支持列表](../connector#版本支持) Rust 连接器仍然在快速开发中,1.0 之前无法保证其向后兼容。建议使用 3.0 版本以上的 TDengine,以避免已知问题。 @@ -37,7 +37,7 @@ Rust 连接器仍然在快速开发中,1.0 之前无法保证其向后兼容 ### 安装前准备 * 安装 Rust 开发工具链 -* 如果使用原生连接,请安装 TDengine 客户端驱动,具体步骤请参考[安装客户端驱动](/reference/connector#安装客户端驱动) +* 如果使用原生连接,请安装 TDengine 客户端驱动,具体步骤请参考[安装客户端驱动](../connector#安装客户端驱动) ### 添加 taos 依赖 diff --git a/docs/zh/14-reference/08-taos-shell.md b/docs/zh/14-reference/08-taos-shell.md index 2f3b551502..5804549878 100644 --- a/docs/zh/14-reference/08-taos-shell.md +++ b/docs/zh/14-reference/08-taos-shell.md @@ -8,7 +8,7 @@ TDengine 命令行程序(以下简称 TDengine CLI)是用户操作 TDengine ## 安装 -如果在 TDengine 服务器端执行,无需任何安装,已经自动安装好 TDengine CLI。如果要在非 TDengine 服务器端运行,需要安装 TDengine 客户端驱动安装包,具体安装,请参考 [连接器](/reference/connector/)。 +如果在 TDengine 服务器端执行,无需任何安装,已经自动安装好 TDengine CLI。如果要在非 TDengine 服务器端运行,需要安装 TDengine 客户端驱动安装包,具体安装,请参考 [连接器](../../connector/)。 ## 执行 @@ -18,7 +18,7 @@ TDengine 命令行程序(以下简称 TDengine CLI)是用户操作 TDengine taos ``` -如果连接服务成功,将会打印出欢迎消息和版本信息。如果失败,则会打印错误消息。(请参考 [FAQ](/train-faq/faq) 来解决终端连接服务端失败的问题)。TDengine CLI 的提示符号如下: +如果连接服务成功,将会打印出欢迎消息和版本信息。如果失败,则会打印错误消息。(请参考 [FAQ](../../train-faq/faq) 来解决终端连接服务端失败的问题)。TDengine CLI 的提示符号如下: ```cmd taos> diff --git a/docs/zh/20-third-party/11-kafka.md b/docs/zh/20-third-party/11-kafka.md index 8369806adc..09bda4664f 100644 --- a/docs/zh/20-third-party/11-kafka.md +++ b/docs/zh/20-third-party/11-kafka.md @@ -184,7 +184,7 @@ echo `cat /tmp/confluent.current`/connect/connect.stdout TDengine Sink Connector 的作用是同步指定 topic 的数据到 TDengine。用户无需提前创建数据库和超级表。可手动指定目标数据库的名字(见配置参数 connection.database), 也可按一定规则生成(见配置参数 connection.database.prefix)。 -TDengine Sink Connector 内部使用 TDengine [无模式写入接口](/reference/connector/cpp#无模式写入-api)写数据到 TDengine,目前支持三种格式的数据:[InfluxDB 行协议格式](/develop/insert-data/influxdb-line)、 [OpenTSDB Telnet 协议格式](/develop/insert-data/opentsdb-telnet) 和 [OpenTSDB JSON 协议格式](/develop/insert-data/opentsdb-json)。 +TDengine Sink Connector 内部使用 TDengine [无模式写入接口](../../connector/cpp#无模式写入-api)写数据到 TDengine,目前支持三种格式的数据:[InfluxDB 行协议格式](/develop/insert-data/influxdb-line)、 [OpenTSDB Telnet 协议格式](/develop/insert-data/opentsdb-telnet) 和 [OpenTSDB JSON 协议格式](/develop/insert-data/opentsdb-json)。 下面的示例将主题 meters 的数据,同步到目标数据库 power。数据格式为 InfluxDB Line 协议格式。 From 2d1e64ce7083917e267037d6d5520d89fccc9aa6 Mon Sep 17 00:00:00 2001 From: gccgdb1234 Date: Wed, 24 Aug 2022 11:10:11 +0800 Subject: [PATCH 25/26] doc: fix broken links --- docs/zh/02-intro.md | 4 ++-- docs/zh/05-get-started/03-package.md | 2 +- docs/zh/05-get-started/index.md | 2 +- docs/zh/07-develop/01-connect/index.md | 2 +- docs/zh/08-connector/csharp.mdx | 6 +++--- docs/zh/08-connector/python.mdx | 4 ++-- docs/zh/14-reference/04-taosadapter.md | 4 ++-- docs/zh/20-third-party/09-emq-broker.md | 2 +- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/zh/02-intro.md b/docs/zh/02-intro.md index a6ef2b94b6..f726b4ea92 100644 --- a/docs/zh/02-intro.md +++ b/docs/zh/02-intro.md @@ -22,8 +22,8 @@ TDengine的主要功能如下: 9. 提供[命令行程序](../reference/taos-shell),便于管理集群,检查系统状态,做即席查询 10. 提供多种数据的[导入](../operation/import)、[导出](../operation/export) 11. 支持对[TDengine 集群本身的监控](../operation/monitor) -12. 提供 [C/C++](../reference/connector/cpp), [Java](../reference/connector/java), [Python](../reference/connector/python), [Go](../reference/connector/go), [Rust](../reference/connector/rust), [Node.js](../reference/connector/node) 等多种编程语言的[连接器](../reference/connector/) -13. 支持 [REST 接口](../reference/rest-api/) +12. 提供各种语言的[连接器](../connector): 如 C/C++, Java, Go, Node.JS, Rust, Python, C# 等 +13. 支持 [REST 接口](../connector/rest-api/) 14. 支持与[ Grafana 无缝集成](../third-party/grafana) 15. 支持与 Google Data Studio 无缝集成 16. 支持 [Kubernetes 部署](../deployment/k8s) diff --git a/docs/zh/05-get-started/03-package.md b/docs/zh/05-get-started/03-package.md index 85005b9551..a1c1802d77 100644 --- a/docs/zh/05-get-started/03-package.md +++ b/docs/zh/05-get-started/03-package.md @@ -9,7 +9,7 @@ import PkgListV3 from "/components/PkgListV3"; 您可以[用 Docker 立即体验](../../get-started/docker/) TDengine。如果您希望对 TDengine 贡献代码或对内部实现感兴趣,请参考我们的 [TDengine GitHub 主页](https://github.com/taosdata/TDengine) 下载源码构建和安装. -TDengine 完整的软件包包括服务端(taosd)、用于与第三方系统对接并提供 RESTful 接口的 taosAdapter、应用驱动(taosc)、命令行程序 (CLI,taos) 和一些工具软件。目前 taosAdapter 仅在 Linux 系统上安装和运行,后续将支持 Windows、macOS 等系统。TDengine 除了提供多种语言的连接器之外,还通过 [taosAdapter](../../reference/taosadapter/) 提供 [RESTful 接口](../../reference/rest-api/)。 +TDengine 完整的软件包包括服务端(taosd)、用于与第三方系统对接并提供 RESTful 接口的 taosAdapter、应用驱动(taosc)、命令行程序 (CLI,taos) 和一些工具软件。目前 taosAdapter 仅在 Linux 系统上安装和运行,后续将支持 Windows、macOS 等系统。TDengine 除了提供多种语言的连接器之外,还通过 [taosAdapter](../../reference/taosadapter/) 提供 [RESTful 接口](../../connector/rest-api/)。 为方便使用,标准的服务端安装包包含了 taosd、taosAdapter、taosc、taos、taosdump、taosBenchmark、TDinsight 安装脚本和示例代码;如果您只需要用到服务端程序和客户端连接的 C/C++ 语言支持,也可以仅下载 lite 版本的安装包。 diff --git a/docs/zh/05-get-started/index.md b/docs/zh/05-get-started/index.md index 794081b4e4..20f8235d87 100644 --- a/docs/zh/05-get-started/index.md +++ b/docs/zh/05-get-started/index.md @@ -3,7 +3,7 @@ title: 立即开始 description: '快速设置 TDengine 环境并体验其高效写入和查询' --- -TDengine 完整的软件包包括服务端(taosd)、用于与第三方系统对接并提供 RESTful 接口的 taosAdapter、应用驱动(taosc)、命令行程序 (CLI,taos) 和一些工具软件。TDengine 除了提供多种语言的连接器之外,还通过 [taosAdapter](/reference/taosadapter) 提供 [RESTful 接口](/reference/rest-api)。 +TDengine 完整的软件包包括服务端(taosd)、用于与第三方系统对接并提供 RESTful 接口的 taosAdapter、应用驱动(taosc)、命令行程序 (CLI,taos) 和一些工具软件。TDengine 除了提供多种语言的连接器之外,还通过 [taosAdapter](../reference/taosadapter) 提供 [RESTful 接口](../connector/rest-api)。 本章主要介绍如何利用 Docker 或者安装包快速设置 TDengine 环境并体验其高效写入和查询。 diff --git a/docs/zh/07-develop/01-connect/index.md b/docs/zh/07-develop/01-connect/index.md index 77f5838c8f..b1502bfd76 100644 --- a/docs/zh/07-develop/01-connect/index.md +++ b/docs/zh/07-develop/01-connect/index.md @@ -33,7 +33,7 @@ TDengine 提供了丰富的应用程序开发接口,为了便于用户快速 关键不同点在于: 1. 使用 REST 连接,用户无需安装客户端驱动程序 taosc,具有跨平台易用的优势,但性能要下降 30%左右。 -2. 使用原生连接可以体验 TDengine 的全部功能,如[参数绑定接口](../../connector/cpp#参数绑定-api)、[订阅](../../connector/cpp#订阅和消费-api)等等。 +2. 使用原生连接可以体验 TDengine 的全部功能,如[参数绑定接口](../connector/cpp/#参数绑定-api)、[订阅](../connector/cpp/#订阅和消费-api)等等。 ## 安装客户端驱动 taosc diff --git a/docs/zh/08-connector/csharp.mdx b/docs/zh/08-connector/csharp.mdx index f4aa30c310..1650aef4bf 100644 --- a/docs/zh/08-connector/csharp.mdx +++ b/docs/zh/08-connector/csharp.mdx @@ -18,7 +18,7 @@ import CSAsyncQuery from "../07-develop/04-query-data/_cs_async.mdx" `TDengine.Connector` 是 TDengine 提供的 C# 语言连接器。C# 开发人员可以通过它开发存取 TDengine 集群数据的 C# 应用软件。 -`TDengine.Connector` 连接器支持通过 TDengine 客户端驱动(taosc)建立与 TDengine 运行实例的连接,提供数据写入、查询、订阅、schemaless 数据写入、参数绑定接口数据写入等功能 `TDengine.Connector` 目前暂未提供 REST 连接方式,用户可以参考 [REST API](/reference/rest-api/) 文档自行编写。 +`TDengine.Connector` 连接器支持通过 TDengine 客户端驱动(taosc)建立与 TDengine 运行实例的连接,提供数据写入、查询、订阅、schemaless 数据写入、参数绑定接口数据写入等功能 `TDengine.Connector` 目前暂未提供 REST 连接方式,用户可以参考 [REST API](../rest-api/) 文档自行编写。 本文介绍如何在 Linux 或 Windows 环境中安装 `TDengine.Connector`,并通过 `TDengine.Connector` 连接 TDengine 集群,进行数据写入、查询等基本操作。 @@ -32,7 +32,7 @@ import CSAsyncQuery from "../07-develop/04-query-data/_cs_async.mdx" ## 版本支持 -请参考[版本支持列表](../connector#版本支持) +请参考[版本支持列表](../connector/#版本支持) ## 支持的功能特性 @@ -49,7 +49,7 @@ import CSAsyncQuery from "../07-develop/04-query-data/_cs_async.mdx" * 安装 [.NET SDK](https://dotnet.microsoft.com/download) * [Nuget 客户端](https://docs.microsoft.com/en-us/nuget/install-nuget-client-tools) (可选安装) -* 安装 TDengine 客户端驱动,具体步骤请参考[安装客户端驱动](../connector#安装客户端驱动) +* 安装 TDengine 客户端驱动,具体步骤请参考[安装客户端驱动](../connector/#安装客户端驱动) ### 使用 dotnet CLI 安装 diff --git a/docs/zh/08-connector/python.mdx b/docs/zh/08-connector/python.mdx index 46b2bf89a2..41cffc9f3b 100644 --- a/docs/zh/08-connector/python.mdx +++ b/docs/zh/08-connector/python.mdx @@ -8,7 +8,7 @@ description: "taospy 是 TDengine 的官方 Python 连接器。taospy 提供了 import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; -`taospy` 是 TDengine 的官方 Python 连接器。`taospy` 提供了丰富的 API, 使得 Python 应用可以很方便地使用 TDengine。`taospy` 对 TDengine 的[原生接口](../connector/cpp)和 [REST 接口](/reference/rest-api)都进行了封装, 分别对应 `taospy` 包的 `taos` 模块 和 `taosrest` 模块。 +`taospy` 是 TDengine 的官方 Python 连接器。`taospy` 提供了丰富的 API, 使得 Python 应用可以很方便地使用 TDengine。`taospy` 对 TDengine 的[原生接口](../connector/cpp)和 [REST 接口](../rest-api)都进行了封装, 分别对应 `taospy` 包的 `taos` 模块 和 `taosrest` 模块。 除了对原生接口和 REST 接口的封装,`taospy` 还提供了符合 [Python 数据访问规范(PEP 249)](https://peps.python.org/pep-0249/) 的编程接口。这使得 `taospy` 和很多第三方工具集成变得简单,比如 [SQLAlchemy](https://www.sqlalchemy.org/) 和 [pandas](https://pandas.pydata.org/)。 使用客户端驱动提供的原生接口直接与服务端建立的连接的方式下文中称为“原生连接”;使用 taosAdapter 提供的 REST 接口与服务端建立的连接的方式下文中称为“REST 连接”。 @@ -275,7 +275,7 @@ TaosCursor 类使用原生连接进行写入、查询操作。在客户端多线 ##### RestClient 类的使用 -`RestClient` 类是对于 [REST API](/reference/rest-api) 的直接封装。它只包含一个 `sql()` 方法用于执行任意 SQL 语句, 并返回执行结果。 +`RestClient` 类是对于 [REST API](../rest-api) 的直接封装。它只包含一个 `sql()` 方法用于执行任意 SQL 语句, 并返回执行结果。 ```python title="RestClient 的使用" {{#include docs/examples/python/rest_client_example.py}} diff --git a/docs/zh/14-reference/04-taosadapter.md b/docs/zh/14-reference/04-taosadapter.md index 6177b52e4c..71bf5f4223 100644 --- a/docs/zh/14-reference/04-taosadapter.md +++ b/docs/zh/14-reference/04-taosadapter.md @@ -156,7 +156,7 @@ AllowWebSockets ## 功能列表 - RESTful 接口 - [https://docs.taosdata.com/reference/rest-api/](https://docs.taosdata.com/reference/rest-api/) + [RESTful API](../../connector/rest-api) - 兼容 InfluxDB v1 写接口 [https://docs.influxdata.com/influxdb/v2.0/reference/api/influxdb-1x/write/](https://docs.influxdata.com/influxdb/v2.0/reference/api/influxdb-1x/write/) - 兼容 OpenTSDB JSON 和 telnet 格式写入 @@ -179,7 +179,7 @@ AllowWebSockets ### TDengine RESTful 接口 -您可以使用任何支持 http 协议的客户端通过访问 RESTful 接口地址 `http://:6041/rest/sql` 来写入数据到 TDengine 或从 TDengine 中查询数据。细节请参考[官方文档](/reference/rest-api/)。 +您可以使用任何支持 http 协议的客户端通过访问 RESTful 接口地址 `http://:6041/rest/sql` 来写入数据到 TDengine 或从 TDengine 中查询数据。细节请参考[官方文档](../../connector/rest-api/)。 ### InfluxDB diff --git a/docs/zh/20-third-party/09-emq-broker.md b/docs/zh/20-third-party/09-emq-broker.md index dd98374558..f252e520a7 100644 --- a/docs/zh/20-third-party/09-emq-broker.md +++ b/docs/zh/20-third-party/09-emq-broker.md @@ -90,7 +90,7 @@ http://127.0.0.1:6041/rest/sql ``` Basic cm9vdDp0YW9zZGF0YQ== ``` -相关文档请参考[ TDengine REST API 文档](/reference/rest-api/)。 +相关文档请参考[ TDengine REST API 文档](../../connector/rest-api/)。 在消息体中输入规则引擎替换模板: From bf8c8cf694bf3a63e6aeda8373f2d2f5a0a37e67 Mon Sep 17 00:00:00 2001 From: Sean Ely <105326513+sean-tdengine@users.noreply.github.com> Date: Tue, 23 Aug 2022 20:29:52 -0700 Subject: [PATCH 26/26] docs: getting started docker Fixed the location tags description from taosBenchmark --- docs/en/05-get-started/01-docker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/05-get-started/01-docker.md b/docs/en/05-get-started/01-docker.md index 32eee6b942..de5b620a77 100644 --- a/docs/en/05-get-started/01-docker.md +++ b/docs/en/05-get-started/01-docker.md @@ -42,7 +42,7 @@ To do so, run the following command: ``` - This command creates the `meters` supertable in the `test` database. In the `meters` supertable, it then creates 10,000 subtables named `d0` to `d9999`. Each table has 10,000 rows and each row has four columns: `ts`, `current`, `voltage`, and `phase`. The timestamps of the data in these columns range from 2017-07-14 10:40:00 000 to 2017-07-14 10:40:09 999. Each table is randomly assigned a `groupId` tag from 1 to ten and a `location` tag of either `California.SanFrancisco` or `California.SanDiego`. +This command creates the `meters` supertable in the `test` database. In the `meters` supertable, it then creates 10,000 subtables named `d0` to `d9999`. Each table has 10,000 rows and each row has four columns: `ts`, `current`, `voltage`, and `phase`. The timestamps of the data in these columns range from 2017-07-14 10:40:00 000 to 2017-07-14 10:40:09 999. Each table is randomly assigned a `groupId` tag from 1 to 10 and a `location` tag of either `Campbell`, `Cupertino`, `Los Angeles`, `Mountain View`, `Palo Alto`, `San Diego`, `San Francisco`, `San Jose`, `Santa Clara` or `Sunnyvale`. The `taosBenchmark` command creates a deployment with 100 million data points that you can use for testing purposes. The time required depends on the hardware specifications of the local system.