From 623017b16dbf67eeac00fc1b37241c63b92fd758 Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 7 Nov 2024 02:32:44 +0000 Subject: [PATCH 01/84] dmchen/trans-improve-show --- include/common/systable.h | 1 + include/common/tmsg.h | 4 +- include/libs/nodes/cmdnodes.h | 5 + include/util/taoserror.h | 1 + include/util/tdef.h | 2 +- source/common/src/systable.c | 12 ++ source/common/src/tmsg.c | 6 +- source/dnode/mgmt/mgmt_dnode/src/dmHandle.c | 1 + source/dnode/mnode/impl/inc/mndDef.h | 8 + source/dnode/mnode/impl/inc/mndTrans.h | 4 + .../dnode/mnode/impl/src/mndCompactDetail.c | 2 + source/dnode/mnode/impl/src/mndDb.c | 5 +- source/dnode/mnode/impl/src/mndShow.c | 4 +- source/dnode/mnode/impl/src/mndTrans.c | 194 ++++++++++++++++-- source/dnode/mnode/impl/src/mndVgroup.c | 18 +- source/libs/executor/src/sysscanoperator.c | 3 +- source/libs/nodes/src/nodesCodeFuncs.c | 2 + source/libs/nodes/src/nodesUtilFuncs.c | 7 + source/libs/parser/inc/parAst.h | 1 + source/libs/parser/inc/sql.y | 1 + source/libs/parser/src/parAstCreater.c | 12 ++ source/libs/parser/src/parAstParser.c | 8 + source/libs/parser/src/parTranslater.c | 27 +++ source/util/src/terror.c | 1 + 24 files changed, 303 insertions(+), 26 deletions(-) diff --git a/include/common/systable.h b/include/common/systable.h index 0acafbfc30..5261705969 100644 --- a/include/common/systable.h +++ b/include/common/systable.h @@ -61,6 +61,7 @@ extern "C" { #define TSDB_INS_TABLE_MACHINES "ins_machines" #define TSDB_INS_TABLE_ENCRYPTIONS "ins_encryptions" #define TSDB_INS_TABLE_TSMAS "ins_tsmas" +#define TSDB_INS_TABLE_TRANSACTION_DETAILS "ins_transaction_details" #define TSDB_PERFORMANCE_SCHEMA_DB "performance_schema" #define TSDB_PERFS_TABLE_SMAS "perf_smas" diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 7ff70b243a..4a02c762b5 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -161,6 +161,7 @@ typedef enum _mgmt_table { TSDB_MGMT_TABLE_USER_FULL, TSDB_MGMT_TABLE_ANODE, TSDB_MGMT_TABLE_ANODE_FULL, + TSDB_MGMT_TABLE_TRANSACTION_DETAIL, TSDB_MGMT_TABLE_MAX, } EShowType; @@ -387,6 +388,7 @@ typedef enum ENodeType { QUERY_NODE_SHOW_VIEWS_STMT, QUERY_NODE_SHOW_COMPACTS_STMT, QUERY_NODE_SHOW_COMPACT_DETAILS_STMT, + QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT, QUERY_NODE_SHOW_GRANTS_FULL_STMT, QUERY_NODE_SHOW_GRANTS_LOGS_STMT, QUERY_NODE_SHOW_CLUSTER_MACHINES_STMT, @@ -2231,7 +2233,7 @@ typedef struct { char user[TSDB_USER_LEN]; char filterTb[TSDB_TABLE_NAME_LEN]; // for ins_columns int64_t showId; - int64_t compactId; // for compact + int64_t compactId1; // for compact bool withFull; // for show users full } SRetrieveTableReq; diff --git a/include/libs/nodes/cmdnodes.h b/include/libs/nodes/cmdnodes.h index 514eddbc24..f7896117a7 100644 --- a/include/libs/nodes/cmdnodes.h +++ b/include/libs/nodes/cmdnodes.h @@ -404,6 +404,11 @@ typedef struct SShowCompactDetailsStmt { SNode* pCompactId; } SShowCompactDetailsStmt; +typedef struct SShowTransactionDetailsStmt { + ENodeType type; + SNode* pTransactionId; +} SShowTransactionDetailsStmt; + typedef enum EIndexType { INDEX_TYPE_SMA = 1, INDEX_TYPE_FULLTEXT, INDEX_TYPE_NORMAL } EIndexType; typedef struct SIndexOptions { diff --git a/include/util/taoserror.h b/include/util/taoserror.h index 9a8b39b84c..1459fa282e 100644 --- a/include/util/taoserror.h +++ b/include/util/taoserror.h @@ -407,6 +407,7 @@ int32_t taosGetErrSize(); #define TSDB_CODE_MND_TRANS_CTX_SWITCH TAOS_DEF_ERROR_CODE(0, 0x03D8) #define TSDB_CODE_MND_TRANS_CONFLICT_COMPACT TAOS_DEF_ERROR_CODE(0, 0x03D9) #define TSDB_CODE_MND_TRANS_UNKNOW_ERROR TAOS_DEF_ERROR_CODE(0, 0x03DF) +#define TSDB_CODE_MND_TRANS_NOT_ABLE_TO_kILLED TAOS_DEF_ERROR_CODE(0, 0x03D2) // mnode-mq #define TSDB_CODE_MND_TOPIC_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x03E0) diff --git a/include/util/tdef.h b/include/util/tdef.h index ba30e78c59..401accdd99 100644 --- a/include/util/tdef.h +++ b/include/util/tdef.h @@ -349,7 +349,7 @@ typedef enum ELogicConditionType { #define TSDB_TRANS_STAGE_LEN 12 #define TSDB_TRANS_TYPE_LEN 16 -#define TSDB_TRANS_ERROR_LEN 512 +#define TSDB_TRANS_ERROR_LEN 512000 #define TSDB_STEP_NAME_LEN 32 #define TSDB_STEP_DESC_LEN 128 diff --git a/source/common/src/systable.c b/source/common/src/systable.c index dbf91aac69..9e0480a81f 100644 --- a/source/common/src/systable.c +++ b/source/common/src/systable.c @@ -314,6 +314,8 @@ static const SSysDbTableSchema transSchema[] = { {.name = "oper", .bytes = TSDB_TRANS_OPER_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, {.name = "db", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, {.name = "stable", .bytes = SYSTABLE_SCH_TABLE_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, + {.name = "killable", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, + {.name = "kill_mnode", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, {.name = "failed_times", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, {.name = "last_exec_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = false}, {.name = "last_action_info", .bytes = (TSDB_TRANS_ERROR_LEN - 1) + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, @@ -399,6 +401,15 @@ static const SSysDbTableSchema userCompactsDetailSchema[] = { {.name = "start_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = false}, }; +static const SSysDbTableSchema userTransactionDetailSchema[] = { + {.name = "transaction_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, + {.name = "vgroup_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, + {.name = "dnode_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, + {.name = "number_fileset", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, + {.name = "finished", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, + {.name = "start_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = false}, +}; + static const SSysDbTableSchema anodesSchema[] = { {.name = "id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, {.name = "url", .bytes = TSDB_ANAL_ANODE_URL_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, @@ -489,6 +500,7 @@ static const SSysTableMeta infosMeta[] = { {TSDB_INS_TABLE_TSMAS, tsmaSchema, tListLen(tsmaSchema), false}, {TSDB_INS_TABLE_ANODES, anodesSchema, tListLen(anodesSchema), true}, {TSDB_INS_TABLE_ANODES_FULL, anodesFullSchema, tListLen(anodesFullSchema), true}, + {TSDB_INS_TABLE_TRANSACTION_DETAILS, userTransactionDetailSchema, tListLen(userTransactionDetailSchema), false}, }; static const SSysDbTableSchema connectionsSchema[] = { diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c index 458badc764..19b34b66ff 100644 --- a/source/common/src/tmsg.c +++ b/source/common/src/tmsg.c @@ -5732,7 +5732,7 @@ int32_t tSerializeSRetrieveTableReq(void *buf, int32_t bufLen, SRetrieveTableReq TAOS_CHECK_EXIT(tEncodeCStr(&encoder, pReq->tb)); TAOS_CHECK_EXIT(tEncodeCStr(&encoder, pReq->filterTb)); TAOS_CHECK_EXIT(tEncodeCStr(&encoder, pReq->user)); - TAOS_CHECK_EXIT(tEncodeI64(&encoder, pReq->compactId)); + TAOS_CHECK_EXIT(tEncodeI64(&encoder, pReq->compactId1)); TAOS_CHECK_EXIT(tEncodeI8(&encoder, pReq->withFull)); tEndEncode(&encoder); @@ -5760,9 +5760,9 @@ int32_t tDeserializeSRetrieveTableReq(void *buf, int32_t bufLen, SRetrieveTableR TAOS_CHECK_EXIT(tDecodeCStrTo(&decoder, pReq->filterTb)); TAOS_CHECK_EXIT(tDecodeCStrTo(&decoder, pReq->user)); if (!tDecodeIsEnd(&decoder)) { - TAOS_CHECK_EXIT(tDecodeI64(&decoder, &pReq->compactId)); + TAOS_CHECK_EXIT(tDecodeI64(&decoder, &pReq->compactId1)); } else { - pReq->compactId = -1; + pReq->compactId1 = -1; } if (!tDecodeIsEnd(&decoder)) { TAOS_CHECK_EXIT(tDecodeI8(&decoder, (int8_t *)&pReq->withFull)); diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c index d6b792ca74..41dd117807 100644 --- a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c +++ b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c @@ -526,6 +526,7 @@ int32_t dmProcessRetrieve(SDnodeMgmt *pMgmt, SRpcMsg *pMsg) { if (tDeserializeSRetrieveTableReq(pMsg->pCont, pMsg->contLen, &retrieveReq) != 0) { return TSDB_CODE_INVALID_MSG; } + dInfo("retrieve table:%s, user:%s, compactId:%" PRId64, retrieveReq.tb, retrieveReq.user, retrieveReq.compactId1); #if 0 if (strcmp(retrieveReq.user, TSDB_DEFAULT_USER) != 0) { code = TSDB_CODE_MND_NO_RIGHTS; diff --git a/source/dnode/mnode/impl/inc/mndDef.h b/source/dnode/mnode/impl/inc/mndDef.h index d2d9b2e8eb..cb78a6c51d 100644 --- a/source/dnode/mnode/impl/inc/mndDef.h +++ b/source/dnode/mnode/impl/inc/mndDef.h @@ -133,6 +133,12 @@ typedef enum { TRN_EXEC_SERIAL = 1, } ETrnExec; +typedef enum { + TRN_KILL_MODE_SKIP = 0, + TRN_KILL_MODE_INTERUPT = 1, + //TRN_KILL_MODE_ROLLBACK = 2, +} ETrnKillMode; + typedef enum { DND_REASON_ONLINE = 0, DND_REASON_STATUS_MSG_TIMEOUT, @@ -201,6 +207,8 @@ typedef struct { SRWLatch lockRpcArray; int64_t mTraceId; TdThreadMutex mutex; + bool ableToBeKilled; + ETrnKillMode killMode; } STrans; typedef struct { diff --git a/source/dnode/mnode/impl/inc/mndTrans.h b/source/dnode/mnode/impl/inc/mndTrans.h index 7f039bc21f..05280d0d68 100644 --- a/source/dnode/mnode/impl/inc/mndTrans.h +++ b/source/dnode/mnode/impl/inc/mndTrans.h @@ -54,6 +54,8 @@ typedef struct { SSdbRaw *pRaw; int64_t mTraceId; + int64_t startTime; + int64_t endTime; } STransAction; typedef void (*TransCbFp)(SMnode *pMnode, void *param, int32_t paramLen); @@ -80,6 +82,8 @@ void mndTransSetCb(STrans *pTrans, ETrnFunc startFunc, ETrnFunc stopFunc, voi void mndTransSetDbName(STrans *pTrans, const char *dbname, const char *stbname); void mndTransAddArbGroupId(STrans *pTrans, int32_t groupId); void mndTransSetSerial(STrans *pTrans); +void mndTransSetBeKilled(STrans *pTrans, bool ableToBeKilled); +void mndTransSetKillMode(STrans *pTrans, ETrnKillMode killMode); void mndTransSetParallel(STrans *pTrans); void mndTransSetChangeless(STrans *pTrans); void mndTransSetOper(STrans *pTrans, EOperType oper); diff --git a/source/dnode/mnode/impl/src/mndCompactDetail.c b/source/dnode/mnode/impl/src/mndCompactDetail.c index cbd0df7e68..f0c9c465a4 100644 --- a/source/dnode/mnode/impl/src/mndCompactDetail.c +++ b/source/dnode/mnode/impl/src/mndCompactDetail.c @@ -45,6 +45,8 @@ int32_t mndRetrieveCompactDetail(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pB char *sep = NULL; SDbObj *pDb = NULL; + mInfo("retrieve compact detail"); + if (strlen(pShow->db) > 0) { sep = strchr(pShow->db, '.'); if (sep && diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index 0d17ccd0b0..2cb565af47 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -995,7 +995,7 @@ static int32_t mndProcessCreateDbReq(SRpcMsg *pReq) { TAOS_CHECK_GOTO(mndAcquireUser(pMnode, pReq->info.conn.user, &pUser), &lino, _OVER); TAOS_CHECK_GOTO(mndCreateDb(pMnode, pReq, &createReq, pUser, dnodeList), &lino, _OVER); - if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS; + //if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS; SName name = {0}; if (tNameFromString(&name, createReq.db, T_NAME_ACCT | T_NAME_DB) < 0) @@ -1236,6 +1236,7 @@ static int32_t mndAlterDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pOld, SDbObj *p TAOS_RETURN(code); } mInfo("trans:%d, used to alter db:%s", pTrans->id, pOld->name); + mInfo("trans:%d, used to alter db, ableToBeKilled:%d, killMode:%d", pTrans->id, pTrans->ableToBeKilled, pTrans->killMode); mndTransSetDbName(pTrans, pOld->name, NULL); TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER); @@ -1243,6 +1244,8 @@ static int32_t mndAlterDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pOld, SDbObj *p TAOS_CHECK_GOTO(mndSetAlterDbPrepareLogs(pMnode, pTrans, pOld, pNew), NULL, _OVER); TAOS_CHECK_GOTO(mndSetAlterDbCommitLogs(pMnode, pTrans, pOld, pNew), NULL, _OVER); TAOS_CHECK_GOTO(mndSetAlterDbRedoActions(pMnode, pTrans, pOld, pNew), NULL, _OVER); + + mInfo("trans:%d, used to alter db, ableToBeKilled:%d, killMode:%d", pTrans->id, pTrans->ableToBeKilled, pTrans->killMode); TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER); code = 0; diff --git a/source/dnode/mnode/impl/src/mndShow.c b/source/dnode/mnode/impl/src/mndShow.c index 29f6c32dbe..082ea5fc24 100644 --- a/source/dnode/mnode/impl/src/mndShow.c +++ b/source/dnode/mnode/impl/src/mndShow.c @@ -132,6 +132,8 @@ static int32_t convertToRetrieveType(char *name, int32_t len) { type = TSDB_MGMT_TABLE_COMPACT; } else if (strncasecmp(name, TSDB_INS_TABLE_COMPACT_DETAILS, len) == 0) { type = TSDB_MGMT_TABLE_COMPACT_DETAIL; + } else if (strncasecmp(name, TSDB_INS_TABLE_TRANSACTION_DETAILS, len) == 0) { + type = TSDB_MGMT_TABLE_TRANSACTION_DETAIL; } else if (strncasecmp(name, TSDB_INS_TABLE_GRANTS_FULL, len) == 0) { type = TSDB_MGMT_TABLE_GRANTS_FULL; } else if (strncasecmp(name, TSDB_INS_TABLE_GRANTS_LOGS, len) == 0) { @@ -232,7 +234,7 @@ static int32_t mndProcessRetrieveSysTableReq(SRpcMsg *pReq) { SRetrieveTableReq retrieveReq = {0}; TAOS_CHECK_RETURN(tDeserializeSRetrieveTableReq(pReq->pCont, pReq->contLen, &retrieveReq)); - mDebug("process to retrieve systable req db:%s, tb:%s", retrieveReq.db, retrieveReq.tb); + mDebug("process to retrieve systable req db:%s, tb:%s, compactId:%" PRId64, retrieveReq.db, retrieveReq.tb, retrieveReq.compactId1); if (retrieveReq.showId == 0) { STableMetaRsp *pMeta = taosHashGet(pMnode->infosMeta, retrieveReq.tb, strlen(retrieveReq.tb)); diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 4268d73746..67ac6851b1 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -25,6 +25,7 @@ #define TRANS_VER1_NUMBER 1 #define TRANS_VER2_NUMBER 2 +#define TRANS_VER3_NUMBER 3 #define TRANS_ARRAY_SIZE 8 #define TRANS_RESERVE_SIZE 44 @@ -63,7 +64,7 @@ static int32_t mndProcessKillTransReq(SRpcMsg *pReq); static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows); static void mndCancelGetNextTrans(SMnode *pMnode, void *pIter); - +static int32_t mndRetrieveTransDetail(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows); static int32_t tsMaxTransId = 0; int32_t mndInitTrans(SMnode *pMnode) { @@ -82,6 +83,7 @@ int32_t mndInitTrans(SMnode *pMnode) { mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_TRANS, mndRetrieveTrans); mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_TRANS, mndCancelGetNextTrans); + mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_TRANSACTION_DETAIL, mndRetrieveTransDetail); return sdbSetTable(pMnode->pSdb, table); } @@ -149,7 +151,7 @@ SSdbRaw *mndTransEncode(STrans *pTrans) { int32_t code = 0; int32_t lino = 0; terrno = TSDB_CODE_INVALID_MSG; - int8_t sver = taosArrayGetSize(pTrans->prepareActions) ? TRANS_VER2_NUMBER : TRANS_VER1_NUMBER; + int8_t sver = TRANS_VER3_NUMBER; int32_t rawDataLen = sizeof(STrans) + TRANS_RESERVE_SIZE + pTrans->paramLen; rawDataLen += mndTransGetActionsSize(pTrans->prepareActions); @@ -213,6 +215,11 @@ SSdbRaw *mndTransEncode(STrans *pTrans) { pIter = taosHashIterate(pTrans->arbGroupIds, pIter); } + if (sver > TRANS_VER1_NUMBER) { + SDB_SET_INT8(pRaw, dataPos, pTrans->ableToBeKilled, _OVER) + SDB_SET_INT32(pRaw, dataPos, pTrans->killMode, _OVER) + } + SDB_SET_RESERVE(pRaw, dataPos, TRANS_RESERVE_SIZE, _OVER) SDB_SET_DATALEN(pRaw, dataPos, _OVER) @@ -303,7 +310,7 @@ SSdbRow *mndTransDecode(SSdbRaw *pRaw) { if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER; - if (sver != TRANS_VER1_NUMBER && sver != TRANS_VER2_NUMBER) { + if (sver > TRANS_VER3_NUMBER) { terrno = TSDB_CODE_SDB_INVALID_DATA_VER; goto _OVER; } @@ -382,6 +389,15 @@ SSdbRow *mndTransDecode(SSdbRaw *pRaw) { if ((terrno = taosHashPut(pTrans->arbGroupIds, &arbGroupId, sizeof(int32_t), NULL, 0)) != 0) goto _OVER; } + if (sver > TRANS_VER2_NUMBER) { + int8_t ableKill = 0; + int8_t killMode = 0; + SDB_GET_INT8(pRaw, dataPos, &ableKill, _OVER) + SDB_GET_INT8(pRaw, dataPos, &killMode, _OVER) + pTrans->ableToBeKilled = ableKill; + pTrans->killMode = killMode; + } + SDB_GET_RESERVE(pRaw, dataPos, TRANS_RESERVE_SIZE, _OVER) terrno = 0; @@ -629,6 +645,7 @@ STrans *mndTransCreate(SMnode *pMnode, ETrnPolicy policy, ETrnConflct conflict, pTrans->policy = policy; pTrans->conflict = conflict; pTrans->exec = TRN_EXEC_PARALLEL; + pTrans->ableToBeKilled = false; pTrans->createdTime = taosGetTimestampMs(); pTrans->prepareActions = taosArrayInit(TRANS_ARRAY_SIZE, sizeof(STransAction)); pTrans->redoActions = taosArrayInit(TRANS_ARRAY_SIZE, sizeof(STransAction)); @@ -797,6 +814,13 @@ void mndTransAddArbGroupId(STrans *pTrans, int32_t groupId) { void mndTransSetSerial(STrans *pTrans) { pTrans->exec = TRN_EXEC_SERIAL; } +void mndTransSetBeKilled(STrans *pTrans, bool ableToBeKilled) { pTrans->ableToBeKilled = ableToBeKilled; } + +void mndTransSetKillMode(STrans *pTrans, ETrnKillMode killMode) { + pTrans->ableToBeKilled = true; + pTrans->killMode = killMode; +} + void mndTransSetParallel(STrans *pTrans) { pTrans->exec = TRN_EXEC_PARALLEL; } void mndTransSetChangeless(STrans *pTrans) { pTrans->changeless = true; } @@ -1048,6 +1072,39 @@ int32_t mndTransPrepare(SMnode *pMnode, STrans *pTrans) { return TSDB_CODE_INVALID_PARA; } + mInfo("trans:%d, action list:", pTrans->id); + int32_t index = 0; + for (int32_t i = 0; i < taosArrayGetSize(pTrans->prepareActions); ++i, ++index) { + STransAction *pAction = taosArrayGet(pTrans->prepareActions, i); + mInfo("trans:%d, action:%d, %s:%d sdbType:%s, sdbStatus:%s", pTrans->id, index, + mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status)); + } + + for (int32_t i = 0; i < taosArrayGetSize(pTrans->redoActions); ++i, ++index) { + STransAction *pAction = taosArrayGet(pTrans->redoActions, i); + mInfo("trans:%d, action:%d, %s:%d msgType:%s", pTrans->id, index, + mndTransStr(pAction->stage), pAction->id, TMSG_INFO(pAction->msgType));; + } + + for (int32_t i = 0; i < taosArrayGetSize(pTrans->commitActions); ++i, ++index) { + STransAction *pAction = taosArrayGet(pTrans->commitActions, i); + mInfo("trans:%d, action:%d, %s:%d sdbType:%s, sdbStatus:%s", pTrans->id, index, + mndTransStr(pAction->stage), i, sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status)); + } + + for (int32_t i = 0; i < taosArrayGetSize(pTrans->undoActions); ++i, ++index) { + STransAction *pAction = taosArrayGet(pTrans->undoActions, i); + if(pAction->actionType == TRANS_ACTION_MSG){ + mInfo("trans:%d, action:%d, %s:%d msgType:%s", pTrans->id, index, + mndTransStr(pAction->stage), pAction->id, TMSG_INFO(pAction->msgType));; + } + else{ + mInfo("trans:%d, action:%d, %s:%d sdbType:%s, sdbStatus:%s", pTrans->id, index, + mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status)); + } + } + + TAOS_CHECK_RETURN(mndTransCheckConflict(pMnode, pTrans)); TAOS_CHECK_RETURN(mndTransCheckParallelActions(pMnode, pTrans)); @@ -1265,6 +1322,7 @@ int32_t mndTransProcessRsp(SRpcMsg *pRsp) { if (pAction != NULL) { pAction->msgReceived = 1; pAction->errCode = pRsp->code; + pAction->endTime = taosGetTimestampMs(); pTrans->lastErrorNo = pRsp->code; mInfo("trans:%d, %s:%d response is received, received code:0x%x(%s), accept:0x%x(%s) retry:0x%x(%s)", transId, @@ -1371,6 +1429,9 @@ static int32_t mndTransSendSingleMsg(SMnode *pMnode, STrans *pTrans, STransActio pAction->msgSent = 1; // pAction->msgReceived = 0; pAction->errCode = TSDB_CODE_ACTION_IN_PROGRESS; + if(pAction->startTime == 0){ + pAction->startTime = taosGetTimestampMs(); + } mInfo("trans:%d, %s:%d is sent, %s", pTrans->id, mndTransStr(pAction->stage), pAction->id, detail); mndSetTransLastAction(pTrans, pAction); @@ -1919,13 +1980,25 @@ int32_t mndKillTrans(SMnode *pMnode, STrans *pTrans) { TAOS_RETURN(TSDB_CODE_MND_TRANS_INVALID_STAGE); } - for (int32_t i = 0; i < taosArrayGetSize(pArray); ++i) { - STransAction *pAction = taosArrayGet(pArray, i); - mInfo("trans:%d, %s:%d set processed for kill msg received, errCode from %s to success", pTrans->id, - mndTransStr(pAction->stage), i, tstrerror(pAction->errCode)); - pAction->msgSent = 1; - pAction->msgReceived = 1; - pAction->errCode = 0; + if(pTrans->ableToBeKilled == false){ + return TSDB_CODE_MND_TRANS_NOT_ABLE_TO_kILLED; + } + + if(pTrans->killMode == TRN_KILL_MODE_SKIP){ + for (int32_t i = 0; i < taosArrayGetSize(pArray); ++i) { + STransAction *pAction = taosArrayGet(pArray, i); + mInfo("trans:%d, %s:%d set processed for kill msg received, errCode from %s to success", pTrans->id, + mndTransStr(pAction->stage), i, tstrerror(pAction->errCode)); + pAction->msgSent = 1; + pAction->msgReceived = 1; + pAction->errCode = 0; + } + } + else if(pTrans->killMode == TRN_KILL_MODE_INTERUPT){ + pTrans->stage = TRN_STAGE_PRE_FINISH; + } + else{ + return TSDB_CODE_MND_TRANS_NOT_ABLE_TO_kILLED; } mndTransExecute(pMnode, pTrans); @@ -2039,6 +2112,18 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stbname, false), pTrans, &lino, _OVER); + const char *killableStr = pTrans->ableToBeKilled ? "yes" : "no"; + char killableVstr[10 + VARSTR_HEADER_SIZE] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(killableVstr, killableStr, 24); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + colDataSetVal(pColInfo, numOfRows, (const char *)killableVstr, false); + + const char *killModeStr = pTrans->killMode == TRN_KILL_MODE_SKIP ? "skip" : "interrupt"; + char killModeVstr[10 + VARSTR_HEADER_SIZE] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(killModeVstr, killModeStr, 24); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + colDataSetVal(pColInfo, numOfRows, (const char *)killModeVstr, false); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pTrans->failedTimes, false), pTrans, &lino, _OVER); @@ -2047,7 +2132,6 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pTrans->lastExecTime, false), pTrans, &lino, _OVER); - char lastInfo[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; char detail[TSDB_TRANS_ERROR_LEN + 1] = {0}; int32_t len = tsnprintf(detail, sizeof(detail), "action:%d code:0x%x(%s) ", pTrans->lastAction, pTrans->lastErrorNo & 0xFFFF, tstrerror(pTrans->lastErrorNo)); @@ -2056,9 +2140,73 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl len += tsnprintf(detail + len, sizeof(detail) - len, "msgType:%s numOfEps:%d inUse:%d ", TMSG_INFO(pTrans->lastMsgType), epset.numOfEps, epset.inUse); for (int32_t i = 0; i < pTrans->lastEpset.numOfEps; ++i) { - len += tsnprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u ", i, epset.eps[i].fqdn, epset.eps[i].port); + len += snprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u \n", i, epset.eps[i].fqdn, epset.eps[i].port); } } + + int32_t index = 0; + if(pTrans->stage == TRN_STAGE_PREPARE){ + for (int32_t i = 0; i < taosArrayGetSize(pTrans->prepareActions); ++i, ++index) { + STransAction *pAction = taosArrayGet(pTrans->prepareActions, i); + len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s\n", index, + mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status)); + } + } + + if(pTrans->stage == TRN_STAGE_REDO_ACTION){ + for (int32_t i = 0; i < taosArrayGetSize(pTrans->redoActions); ++i, ++index) { + STransAction *pAction = taosArrayGet(pTrans->redoActions, i); + if(pAction->actionType == TRANS_ACTION_MSG){ + char bufStart[40] = {0}; + taosFormatUtcTime(bufStart, sizeof(bufStart), pAction->startTime, TSDB_TIME_PRECISION_MILLI); + + char endStart[40] = {0}; + taosFormatUtcTime(endStart, sizeof(endStart), pAction->endTime, TSDB_TIME_PRECISION_MILLI); + len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d msgType:%s," + "sent:%d, received:%d, startTime:%s, endTime:%s, ", index, + mndTransStr(pAction->stage), pAction->id, TMSG_INFO(pAction->msgType), + pAction->msgSent, pAction->msgReceived, bufStart, endStart); + + SEpSet epset = pAction->epSet; + if (epset.numOfEps > 0) { + len += snprintf(detail + len, sizeof(detail) - len, "numOfEps:%d inUse:%d ", + epset.numOfEps, epset.inUse); + for (int32_t i = 0; i < epset.numOfEps; ++i) { + len += snprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u ", i, epset.eps[i].fqdn, epset.eps[i].port); + } + } + + len += snprintf(detail + len, sizeof(detail) - len, ", errCode:0x%x(%s)\n", pAction->errCode & 0xFFFF, tstrerror(pAction->errCode)); + } + else{ + len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s, written:%d\n", index, + mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status), + pAction->rawWritten); + } + } + } + + if(pTrans->stage == TRN_STAGE_COMMIT_ACTION){ + for (int32_t i = 0; i < taosArrayGetSize(pTrans->commitActions); ++i, ++index) { + STransAction *pAction = taosArrayGet(pTrans->commitActions, i); + len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s\n", index, + mndTransStr(pAction->stage), i, sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status)); + } + + for (int32_t i = 0; i < taosArrayGetSize(pTrans->undoActions); ++i, ++index) { + STransAction *pAction = taosArrayGet(pTrans->undoActions, i); + if(pAction->actionType == TRANS_ACTION_MSG){ + len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d msgType:%s\n", index, + mndTransStr(pAction->stage), pAction->id, TMSG_INFO(pAction->msgType));; + } + else{ + len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s\n", index, + mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status)); + } + } + } + + char lastInfo[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(lastInfo, detail, pShow->pMeta->pSchemas[cols].bytes); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)lastInfo, false), pTrans, &lino, _OVER); @@ -2073,6 +2221,28 @@ _OVER: return numOfRows; } + +static int32_t mndRetrieveTransDetail(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) { + SMnode *pMnode = pReq->info.node; + SSdb *pSdb = pMnode->pSdb; + int32_t numOfRows = 0; + STrans *pTrans = NULL; + int32_t cols = 0; + int32_t code = 0; + int32_t lino = 0; + + mInfo("start to mndRetrieveTransDetail"); + + while (numOfRows < rows) { + pShow->pIter = sdbFetch(pSdb, SDB_TRANS, pShow->pIter, (void **)&pTrans); + if (pShow->pIter == NULL) break; + + + + } + return numOfRows; +} + static void mndCancelGetNextTrans(SMnode *pMnode, void *pIter) { SSdb *pSdb = pMnode->pSdb; sdbCancelFetchByType(pSdb, pIter, SDB_TRANS); diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c index 913e6e3295..c237655182 100644 --- a/source/dnode/mnode/impl/src/mndVgroup.c +++ b/source/dnode/mnode/impl/src/mndVgroup.c @@ -2752,12 +2752,15 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb mndTransSetSerial(pTrans); - if (pNewVgroup->replica == 1 && pNewDb->cfg.replications == 3) { + if (pNewDb->cfg.replications == 3) { + mndTransSetKillMode(pTrans, TRN_KILL_MODE_INTERUPT); mInfo("db:%s, vgId:%d, will add 2 vnodes, vn:0 dnode:%d", pVgroup->dbName, pVgroup->vgId, pVgroup->vnodeGid[0].dnodeId); // add second - TAOS_CHECK_RETURN(mndAddVnodeToVgroup(pMnode, pTrans, pNewVgroup, pArray)); + if (pNewVgroup->replica == 1){ + TAOS_CHECK_RETURN(mndAddVnodeToVgroup(pMnode, pTrans, pNewVgroup, pArray)); + } // learner stage pNewVgroup->vnodeGid[0].nodeRole = TAOS_SYNC_ROLE_VOTER; @@ -2776,7 +2779,9 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb TAOS_CHECK_RETURN(mndAddAlterVnodeConfirmAction(pMnode, pTrans, pNewDb, pNewVgroup)); // add third - TAOS_CHECK_RETURN(mndAddVnodeToVgroup(pMnode, pTrans, pNewVgroup, pArray)); + if (pNewVgroup->replica == 2){ + TAOS_CHECK_RETURN (mndAddVnodeToVgroup(pMnode, pTrans, pNewVgroup, pArray)); + } pNewVgroup->vnodeGid[0].nodeRole = TAOS_SYNC_ROLE_VOTER; pNewVgroup->vnodeGid[1].nodeRole = TAOS_SYNC_ROLE_VOTER; @@ -2788,7 +2793,8 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb TAOS_CHECK_RETURN(mndAddCreateVnodeAction(pMnode, pTrans, pNewDb, pNewVgroup, &pNewVgroup->vnodeGid[2])); TAOS_CHECK_RETURN(mndAddAlterVnodeConfirmAction(pMnode, pTrans, pNewDb, pNewVgroup)); - } else if (pNewVgroup->replica == 3 && pNewDb->cfg.replications == 1) { + } else if (pNewDb->cfg.replications == 1) { + mndTransSetKillMode(pTrans, TRN_KILL_MODE_INTERUPT); mInfo("db:%s, vgId:%d, will remove 2 vnodes, vn:0 dnode:%d vn:1 dnode:%d vn:2 dnode:%d", pVgroup->dbName, pVgroup->vgId, pVgroup->vnodeGid[0].dnodeId, pVgroup->vnodeGid[1].dnodeId, pVgroup->vnodeGid[2].dnodeId); @@ -2805,9 +2811,9 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb TAOS_CHECK_RETURN(mndRemoveVnodeFromVgroup(pMnode, pTrans, pNewVgroup, pArray, &del2)); TAOS_CHECK_RETURN(mndAddDropVnodeAction(pMnode, pTrans, pNewDb, pNewVgroup, &del2, true)); TAOS_CHECK_RETURN( - mndAddAlterVnodeReplicaAction(pMnode, pTrans, pNewDb, pNewVgroup, pNewVgroup->vnodeGid[0].dnodeId)); + mndAddAlterVnodeReplicaAction(pMnode, pTrans, pNewDb, pNewVgroup, pNewVgroup->vnodeGid[0].dnodeId)); TAOS_CHECK_RETURN(mndAddAlterVnodeConfirmAction(pMnode, pTrans, pNewDb, pNewVgroup)); - } else if (pNewVgroup->replica == 1 && pNewDb->cfg.replications == 2) { + } else if (pNewDb->cfg.replications == 2) { mInfo("db:%s, vgId:%d, will add 1 vnode, vn:0 dnode:%d", pVgroup->dbName, pVgroup->vgId, pVgroup->vnodeGid[0].dnodeId); diff --git a/source/libs/executor/src/sysscanoperator.c b/source/libs/executor/src/sysscanoperator.c index 8aad415f70..32a8198b6c 100644 --- a/source/libs/executor/src/sysscanoperator.c +++ b/source/libs/executor/src/sysscanoperator.c @@ -2067,7 +2067,8 @@ static int32_t doSysTableScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) if (pInfo->showRewrite) { getDBNameFromCondition(pInfo->pCondition, dbName); if (strncasecmp(name, TSDB_INS_TABLE_COMPACTS, TSDB_TABLE_FNAME_LEN) != 0 && - strncasecmp(name, TSDB_INS_TABLE_COMPACT_DETAILS, TSDB_TABLE_FNAME_LEN) != 0) { + strncasecmp(name, TSDB_INS_TABLE_COMPACT_DETAILS, TSDB_TABLE_FNAME_LEN) != 0 && + strncasecmp(name, TSDB_INS_TABLE_TRANSACTION_DETAILS, TSDB_TABLE_FNAME_LEN) != 0) { TAOS_UNUSED(tsnprintf(pInfo->req.db, sizeof(pInfo->req.db), "%d.%s", pInfo->accountId, dbName)); } } else if (strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0) { diff --git a/source/libs/nodes/src/nodesCodeFuncs.c b/source/libs/nodes/src/nodesCodeFuncs.c index 3275cfd838..5e645fb2d5 100644 --- a/source/libs/nodes/src/nodesCodeFuncs.c +++ b/source/libs/nodes/src/nodesCodeFuncs.c @@ -290,6 +290,8 @@ const char* nodesNodeName(ENodeType type) { return "ShowCompactsStmt"; case QUERY_NODE_SHOW_COMPACT_DETAILS_STMT: return "ShowCompactDetailsStmt"; + case QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT: + return "ShowTransactionDetailsStmt"; case QUERY_NODE_SHOW_GRANTS_FULL_STMT: return "ShowGrantsFullStmt"; case QUERY_NODE_SHOW_GRANTS_LOGS_STMT: diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c index a9d0aa2924..9d5215c7da 100644 --- a/source/libs/nodes/src/nodesUtilFuncs.c +++ b/source/libs/nodes/src/nodesUtilFuncs.c @@ -604,6 +604,8 @@ int32_t nodesMakeNode(ENodeType type, SNode** ppNodeOut) { code = makeNode(type, sizeof(SShowCompactsStmt), &pNode); break; case QUERY_NODE_SHOW_COMPACT_DETAILS_STMT: code = makeNode(type, sizeof(SShowCompactDetailsStmt), &pNode); break; + case QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT: + code = makeNode(type, sizeof(SShowTransactionDetailsStmt), &pNode); break; case QUERY_NODE_KILL_QUERY_STMT: code = makeNode(type, sizeof(SKillQueryStmt), &pNode); break; case QUERY_NODE_KILL_TRANSACTION_STMT: @@ -1338,6 +1340,11 @@ void nodesDestroyNode(SNode* pNode) { nodesDestroyNode(pStmt->pCompactId); break; } + case QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT: { + SShowTransactionDetailsStmt* pStmt = (SShowTransactionDetailsStmt*)pNode; + nodesDestroyNode(pStmt->pTransactionId); + break; + } case QUERY_NODE_SHOW_CREATE_DATABASE_STMT: taosMemoryFreeClear(((SShowCreateDatabaseStmt*)pNode)->pCfg); break; diff --git a/source/libs/parser/inc/parAst.h b/source/libs/parser/inc/parAst.h index 3caa8da80f..9b0711ec2c 100644 --- a/source/libs/parser/inc/parAst.h +++ b/source/libs/parser/inc/parAst.h @@ -312,6 +312,7 @@ SNode* createCreateViewStmt(SAstCreateContext* pCxt, bool orReplace, SNode* pVie SNode* createDropViewStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SNode* pView); SNode* createShowCompactDetailsStmt(SAstCreateContext* pCxt, SNode* pCompactIdNode); SNode* createShowCompactsStmt(SAstCreateContext* pCxt, ENodeType type); +SNode* createShowTransactionDetailsStmt(SAstCreateContext* pCxt, SNode* pTransactionIdNode); SNode* createCreateTSMAStmt(SAstCreateContext* pCxt, bool ignoreExists, SToken* tsmaName, SNode* pOptions, SNode* pRealTable, SNode* pInterval); diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index e1c3456e3f..3880081ebf 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -562,6 +562,7 @@ cmd ::= SHOW BNODES. cmd ::= SHOW SNODES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SNODES_STMT); } cmd ::= SHOW CLUSTER. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CLUSTER_STMT); } cmd ::= SHOW TRANSACTIONS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TRANSACTIONS_STMT); } +cmd ::= SHOW TRANSACTION NK_INTEGER(A). { pCxt->pRootNode = createShowTransactionDetailsStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &A)); } cmd ::= SHOW TABLE DISTRIBUTED full_table_name(A). { pCxt->pRootNode = createShowTableDistributedStmt(pCxt, A); } cmd ::= SHOW CONSUMERS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONSUMERS_STMT); } cmd ::= SHOW SUBSCRIPTIONS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT); } diff --git a/source/libs/parser/src/parAstCreater.c b/source/libs/parser/src/parAstCreater.c index 245346273f..6bb69208cf 100644 --- a/source/libs/parser/src/parAstCreater.c +++ b/source/libs/parser/src/parAstCreater.c @@ -2812,6 +2812,18 @@ _err: return NULL; } +SNode* createShowTransactionDetailsStmt(SAstCreateContext* pCxt, SNode* pTransactionIdNode) { + CHECK_PARSER_STATUS(pCxt); + SShowTransactionDetailsStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); + pStmt->pTransactionId = pTransactionIdNode; + return (SNode*)pStmt; +_err: + nodesDestroyNode(pTransactionIdNode); + return NULL; +} + static int32_t getIpV4RangeFromWhitelistItem(char* ipRange, SIpV4Range* pIpRange) { int32_t code = TSDB_CODE_SUCCESS; char* ipCopy = taosStrdup(ipRange); diff --git a/source/libs/parser/src/parAstParser.c b/source/libs/parser/src/parAstParser.c index eecc04658b..26b40ac7e3 100644 --- a/source/libs/parser/src/parAstParser.c +++ b/source/libs/parser/src/parAstParser.c @@ -754,6 +754,12 @@ static int32_t collectMetaKeyFromShowCompactDetails(SCollectMetaKeyCxt* pCxt, SS return code; } +static int32_t collectMetaKeyFromShowTransactionDetails(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) { + int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, + TSDB_INS_TABLE_TRANSACTION_DETAILS, pCxt->pMetaCache); + return code; +} + static int32_t collectMetaKeyFromShowGrantsFull(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) { return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_GRANTS_FULL, pCxt->pMetaCache); @@ -1055,6 +1061,8 @@ static int32_t collectMetaKeyFromQuery(SCollectMetaKeyCxt* pCxt, SNode* pStmt) { return collectMetaKeyFromShowCompacts(pCxt, (SShowStmt*)pStmt); case QUERY_NODE_SHOW_COMPACT_DETAILS_STMT: return collectMetaKeyFromShowCompactDetails(pCxt, (SShowStmt*)pStmt); + case QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT: + return collectMetaKeyFromShowTransactionDetails(pCxt, (SShowStmt*)pStmt); case QUERY_NODE_SHOW_GRANTS_FULL_STMT: return collectMetaKeyFromShowGrantsFull(pCxt, (SShowStmt*)pStmt); case QUERY_NODE_SHOW_GRANTS_LOGS_STMT: diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 02295b34da..e025520422 100755 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -319,6 +319,12 @@ static const SSysTableShowAdapter sysTableShowAdapter[] = { .numOfShowCols = 1, .pShowCols = {"*"} }, + { .showType = QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT, + .pDbName = TSDB_INFORMATION_SCHEMA_DB, + .pTableName = TSDB_INS_TABLE_TRANSACTION_DETAILS, + .numOfShowCols = 1, + .pShowCols = {"*"} + }, { .showType = QUERY_NODE_SHOW_GRANTS_FULL_STMT, .pDbName = TSDB_INFORMATION_SCHEMA_DB, .pTableName = TSDB_INS_TABLE_GRANTS_FULL, @@ -15690,6 +15696,24 @@ static int32_t rewriteShowCompactDetailsStmt(STranslateContext* pCxt, SQuery* pQ return code; } +static int32_t rewriteShowTransactionDetailsStmt(STranslateContext* pCxt, SQuery* pQuery) { + SShowTransactionDetailsStmt* pShow = (SShowTransactionDetailsStmt*)(pQuery->pRoot); + SSelectStmt* pStmt = NULL; + int32_t code = createSelectStmtForShow(QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT, &pStmt); + if (TSDB_CODE_SUCCESS == code) { + if (NULL != pShow->pTransactionId) { + code = createOperatorNode(OP_TYPE_EQUAL, "transaction_id", pShow->pTransactionId, &pStmt->pWhere); + } + } + if (TSDB_CODE_SUCCESS == code) { + pCxt->showRewrite = true; + pQuery->showRewrite = true; + nodesDestroyNode(pQuery->pRoot); + pQuery->pRoot = (SNode*)pStmt; + } + return code; +} + static int32_t createParWhenThenNode(SNode* pWhen, SNode* pThen, SNode** ppResWhenThen) { SWhenThenNode* pWThen = NULL; int32_t code = nodesMakeNode(QUERY_NODE_WHEN_THEN, (SNode**)&pWThen); @@ -16262,6 +16286,9 @@ static int32_t rewriteQuery(STranslateContext* pCxt, SQuery* pQuery) { case QUERY_NODE_SHOW_COMPACT_DETAILS_STMT: code = rewriteShowCompactDetailsStmt(pCxt, pQuery); break; + case QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT: + code = rewriteShowTransactionDetailsStmt(pCxt, pQuery); + break; case QUERY_NODE_SHOW_DB_ALIVE_STMT: case QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT: code = rewriteShowAliveStmt(pCxt, pQuery); diff --git a/source/util/src/terror.c b/source/util/src/terror.c index d660edd0b8..353f65c767 100644 --- a/source/util/src/terror.c +++ b/source/util/src/terror.c @@ -322,6 +322,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_MND_TRANS_SYNC_TIMEOUT, "Sync timeout While ex TAOS_DEFINE_ERROR(TSDB_CODE_MND_TRANS_CTX_SWITCH, "Wrong transaction execution context") TAOS_DEFINE_ERROR(TSDB_CODE_MND_TRANS_CONFLICT_COMPACT, "Transaction not completed due to conflict with compact") TAOS_DEFINE_ERROR(TSDB_CODE_MND_TRANS_UNKNOW_ERROR, "Unknown transaction error") +TAOS_DEFINE_ERROR(TSDB_CODE_MND_TRANS_NOT_ABLE_TO_kILLED, "The transaction is not able to be killed") // mnode-mq TAOS_DEFINE_ERROR(TSDB_CODE_MND_TOPIC_ALREADY_EXIST, "Topic already exists") From d0d26c07c6f35745736ccd5fc99f5581a9aeb3ff Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 7 Nov 2024 18:54:35 +0800 Subject: [PATCH 02/84] dmchen/add-detail-show --- source/common/src/systable.c | 26 ++--- source/dnode/mnode/impl/src/mndTrans.c | 150 +++++++++++++++++++++++-- 2 files changed, 151 insertions(+), 25 deletions(-) diff --git a/source/common/src/systable.c b/source/common/src/systable.c index 9e0480a81f..1e8e09fe0d 100644 --- a/source/common/src/systable.c +++ b/source/common/src/systable.c @@ -309,16 +309,12 @@ static const SSysDbTableSchema smaSchema[] = { static const SSysDbTableSchema transSchema[] = { {.name = "id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, - {.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = false}, - {.name = "stage", .bytes = TSDB_TRANS_STAGE_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "oper", .bytes = TSDB_TRANS_OPER_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "db", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "stable", .bytes = SYSTABLE_SCH_TABLE_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "killable", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "kill_mnode", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "failed_times", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, - {.name = "last_exec_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = false}, - {.name = "last_action_info", .bytes = (TSDB_TRANS_ERROR_LEN - 1) + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, + {.name = "action_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, + {.name = "action_type", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, + {.name = "stage", .bytes = 2048 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen + {.name = "obj_type", .bytes = 2048 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen + {.name = "result", .bytes = 2048 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen + {.name = "detail", .bytes = (TSDB_TRANS_ERROR_LEN - 1) + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen }; static const SSysDbTableSchema configSchema[] = { @@ -403,11 +399,11 @@ static const SSysDbTableSchema userCompactsDetailSchema[] = { static const SSysDbTableSchema userTransactionDetailSchema[] = { {.name = "transaction_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, - {.name = "vgroup_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, - {.name = "dnode_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, - {.name = "number_fileset", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, - {.name = "finished", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, - {.name = "start_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = false}, + {.name = "action_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, + //{.name = "dnode_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, + //{.name = "number_fileset", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, + //{.name = "finished", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, + //{.name = "start_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = false}, }; static const SSysDbTableSchema anodesSchema[] = { diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 67ac6851b1..9526b659ec 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -2070,6 +2070,7 @@ void mndTransPullup(SMnode *pMnode) { taosArrayDestroy(pArray); } +/* static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) { SMnode *pMnode = pReq->info.node; SSdb *pSdb = pMnode->pSdb; @@ -2149,7 +2150,8 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl for (int32_t i = 0; i < taosArrayGetSize(pTrans->prepareActions); ++i, ++index) { STransAction *pAction = taosArrayGet(pTrans->prepareActions, i); len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s\n", index, - mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status)); + mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), +sdbStatusName(pAction->pRaw->status)); } } @@ -2166,22 +2168,24 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl "sent:%d, received:%d, startTime:%s, endTime:%s, ", index, mndTransStr(pAction->stage), pAction->id, TMSG_INFO(pAction->msgType), pAction->msgSent, pAction->msgReceived, bufStart, endStart); - + SEpSet epset = pAction->epSet; if (epset.numOfEps > 0) { len += snprintf(detail + len, sizeof(detail) - len, "numOfEps:%d inUse:%d ", epset.numOfEps, epset.inUse); for (int32_t i = 0; i < epset.numOfEps; ++i) { - len += snprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u ", i, epset.eps[i].fqdn, epset.eps[i].port); + len += snprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u ", i, epset.eps[i].fqdn, +epset.eps[i].port); } } - len += snprintf(detail + len, sizeof(detail) - len, ", errCode:0x%x(%s)\n", pAction->errCode & 0xFFFF, tstrerror(pAction->errCode)); + len += snprintf(detail + len, sizeof(detail) - len, ", errCode:0x%x(%s)\n", pAction->errCode & 0xFFFF, +tstrerror(pAction->errCode)); } else{ - len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s, written:%d\n", index, - mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status), - pAction->rawWritten); + len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s, written:%d\n", +index, mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), +sdbStatusName(pAction->pRaw->status), pAction->rawWritten); } } } @@ -2201,7 +2205,8 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl } else{ len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s\n", index, - mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status)); + mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), +sdbStatusName(pAction->pRaw->status)); } } } @@ -2220,9 +2225,34 @@ _OVER: pShow->numOfRows += numOfRows; return numOfRows; } +*/ +static int32_t mndShowTransCommonColumns(SShowObj *pShow, SSDataBlock *pBlock, STransAction *pAction, STrans *pTrans, + int32_t numOfRows, int32_t *cols) { + int32_t code = 0; + int32_t lino = 0; -static int32_t mndRetrieveTransDetail(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) { + SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, (*cols)++); + TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pTrans->id, false), &lino, _OVER); + + pColInfo = taosArrayGet(pBlock->pDataBlock, (*cols)++); + TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pAction->id, false), &lino, _OVER); + + pColInfo = taosArrayGet(pBlock->pDataBlock, (*cols)++); + TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pAction->actionType, false), &lino, _OVER); + + char stage[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen + strcpy(stage, mndTransStr(pAction->stage)); + char stageVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(stageVStr, stage, pShow->pMeta->pSchemas[*cols].bytes); + pColInfo = taosArrayGet(pBlock->pDataBlock, (*cols)++); + TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stageVStr, false), &lino, _OVER); +_OVER: + if (code != 0) mError("failed to retrieve at line:%d, since %s", lino, tstrerror(code)); + return code; +} + +static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) { SMnode *pMnode = pReq->info.node; SSdb *pSdb = pMnode->pSdb; int32_t numOfRows = 0; @@ -2237,12 +2267,112 @@ static int32_t mndRetrieveTransDetail(SRpcMsg *pReq, SShowObj *pShow, SSDataBloc pShow->pIter = sdbFetch(pSdb, SDB_TRANS, pShow->pIter, (void **)&pTrans); if (pShow->pIter == NULL) break; + if (pTrans->stage == TRN_STAGE_REDO_ACTION) { + mInfo("redoActions num:%" PRId64, taosArrayGetSize(pTrans->redoActions)); - + for (int32_t i = 0; i < taosArrayGetSize(pTrans->redoActions); ++i) { + STransAction *pAction = taosArrayGet(pTrans->redoActions, i); + + cols = 0; + + mndShowTransCommonColumns(pShow, pBlock, pAction, pTrans, numOfRows, &cols); + if (pAction->actionType == TRANS_ACTION_MSG) { + char objType[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen + strcpy(objType, TMSG_INFO(pAction->msgType)); + char objTypeVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(objTypeVStr, objType, pShow->pMeta->pSchemas[cols].bytes); + SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)objTypeVStr, false), pTrans, &lino, + _OVER); + + char result[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen + int32_t len = 0; + len += snprintf(result + len, sizeof(result) - len, "sent:%d, received:%d", pAction->msgSent, + pAction->msgReceived); + char resultVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(resultVStr, result, pShow->pMeta->pSchemas[cols].bytes); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)resultVStr, false), pTrans, &lino, + _OVER); + + char detail[TSDB_TRANS_ERROR_LEN] = {0}; // TODO dmchen + len = 0; + + char bufStart[40] = {0}; + taosFormatUtcTime(bufStart, sizeof(bufStart), pAction->startTime, TSDB_TIME_PRECISION_MILLI); + + char endStart[40] = {0}; + taosFormatUtcTime(endStart, sizeof(endStart), pAction->endTime, TSDB_TIME_PRECISION_MILLI); + + len += snprintf(detail + len, sizeof(detail) - len, "startTime:%s, endTime:%s, ", bufStart, endStart); + + SEpSet epset = pAction->epSet; + if (epset.numOfEps > 0) { + len += snprintf(detail + len, sizeof(detail) - len, "numOfEps:%d inUse:%d ", epset.numOfEps, epset.inUse); + for (int32_t i = 0; i < epset.numOfEps; ++i) { + len += + snprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u ", i, epset.eps[i].fqdn, epset.eps[i].port); + } + } + + len += snprintf(detail + len, sizeof(detail) - len, ", errCode:0x%x(%s)\n", pAction->errCode & 0xFFFF, + tstrerror(pAction->errCode)); + + char detailVStr[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(detailVStr, detail, pShow->pMeta->pSchemas[cols].bytes); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)detailVStr, false), pTrans, &lino, + _OVER); + + } else { + char objType[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen + strcpy(objType, sdbTableName(pAction->pRaw->type)); + char objTypeVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(objTypeVStr, objType, pShow->pMeta->pSchemas[cols].bytes); + SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)objTypeVStr, false), pTrans, &lino, + _OVER); + + char result[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen + int32_t len = 0; + len += snprintf(result + len, sizeof(result) - len, "rawWritten:%d", pAction->rawWritten); + char resultVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(resultVStr, result, pShow->pMeta->pSchemas[cols].bytes); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)resultVStr, false), pTrans, &lino, + _OVER); + + char detail[TSDB_TRANS_ERROR_LEN] = {0}; // TODO dmchen + len = 0; + len += snprintf(detail + len, sizeof(detail) - len, "sdbStatus:%s", sdbStatusName(pAction->pRaw->status)); + char detailVStr[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(detailVStr, detail, pShow->pMeta->pSchemas[cols].bytes); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)detailVStr, false), pTrans, &lino, + _OVER); + } + + numOfRows++; + if (numOfRows >= rows - 1) break; + } + + sdbRelease(pSdb, pTrans); + } } + +_OVER: + if (code != 0) { + mError("failed to retrieve at line:%d, since %s", lino, tstrerror(code)); + } else { + mInfo("retrieve %d", numOfRows) + } + + pShow->numOfRows += numOfRows; return numOfRows; } +static int32_t mndRetrieveTransDetail(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) { return 0; } + static void mndCancelGetNextTrans(SMnode *pMnode, void *pIter) { SSdb *pSdb = pMnode->pSdb; sdbCancelFetchByType(pSdb, pIter, SDB_TRANS); From d6d5be570d79e17940ba70639d9c2c8d8da3fc58 Mon Sep 17 00:00:00 2001 From: dmchen Date: Fri, 8 Nov 2024 09:56:39 +0800 Subject: [PATCH 03/84] dmchen/trans-improve-show -vgid --- source/common/src/systable.c | 3 +- source/dnode/mnode/impl/src/mndTrans.c | 64 ++++++++++++++++---------- 2 files changed, 41 insertions(+), 26 deletions(-) diff --git a/source/common/src/systable.c b/source/common/src/systable.c index 1e8e09fe0d..13eda32bfe 100644 --- a/source/common/src/systable.c +++ b/source/common/src/systable.c @@ -309,9 +309,8 @@ static const SSysDbTableSchema smaSchema[] = { static const SSysDbTableSchema transSchema[] = { {.name = "id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, - {.name = "action_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, + {.name = "action", .bytes = 2048 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen {.name = "action_type", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, - {.name = "stage", .bytes = 2048 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen {.name = "obj_type", .bytes = 2048 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen {.name = "result", .bytes = 2048 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen {.name = "detail", .bytes = (TSDB_TRANS_ERROR_LEN - 1) + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 9526b659ec..b002a91134 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -22,6 +22,7 @@ #include "mndSubscribe.h" #include "mndSync.h" #include "mndUser.h" +#include "mndVgroup.h" #define TRANS_VER1_NUMBER 1 #define TRANS_VER2_NUMBER 2 @@ -2231,22 +2232,24 @@ static int32_t mndShowTransCommonColumns(SShowObj *pShow, SSDataBlock *pBlock, S int32_t numOfRows, int32_t *cols) { int32_t code = 0; int32_t lino = 0; + int32_t len = 0; SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, (*cols)++); TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pTrans->id, false), &lino, _OVER); + char action[2048 + 1] = {0}; // TODO dmchen + if (pTrans->lastAction == pAction->id) { + len += snprintf(action + len, sizeof(action) - len, "%s:%d(cur)", mndTransStr(pAction->stage), pAction->id); + } else { + len += snprintf(action + len, sizeof(action) - len, "%s:%d", mndTransStr(pAction->stage), pAction->id); + } + char actionVStr[2048 + VARSTR_HEADER_SIZE] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(actionVStr, action, pShow->pMeta->pSchemas[*cols].bytes); pColInfo = taosArrayGet(pBlock->pDataBlock, (*cols)++); - TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pAction->id, false), &lino, _OVER); + TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)actionVStr, false), &lino, _OVER); pColInfo = taosArrayGet(pBlock->pDataBlock, (*cols)++); TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pAction->actionType, false), &lino, _OVER); - - char stage[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen - strcpy(stage, mndTransStr(pAction->stage)); - char stageVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_WITH_MAXSIZE_TO_VARSTR(stageVStr, stage, pShow->pMeta->pSchemas[*cols].bytes); - pColInfo = taosArrayGet(pBlock->pDataBlock, (*cols)++); - TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stageVStr, false), &lino, _OVER); _OVER: if (code != 0) mError("failed to retrieve at line:%d, since %s", lino, tstrerror(code)); return code; @@ -2261,10 +2264,12 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl int32_t code = 0; int32_t lino = 0; - mInfo("start to mndRetrieveTransDetail"); + mInfo("start to mndRetrieveTransDetail, rows:%d, pShow->numOfRows:%d, pShow->pIter:%p", rows, pShow->numOfRows, + pShow->pIter); while (numOfRows < rows) { pShow->pIter = sdbFetch(pSdb, SDB_TRANS, pShow->pIter, (void **)&pTrans); + mInfo("pShow->pIter:%p, pTrans:%p", pShow->pIter, pTrans); if (pShow->pIter == NULL) break; if (pTrans->stage == TRN_STAGE_REDO_ACTION) { @@ -2276,6 +2281,7 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl cols = 0; mndShowTransCommonColumns(pShow, pBlock, pAction, pTrans, numOfRows, &cols); + if (pAction->actionType == TRANS_ACTION_MSG) { char objType[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen strcpy(objType, TMSG_INFO(pAction->msgType)); @@ -2287,8 +2293,9 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl char result[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen int32_t len = 0; - len += snprintf(result + len, sizeof(result) - len, "sent:%d, received:%d", pAction->msgSent, - pAction->msgReceived); + len += snprintf(result + len, sizeof(result) - len, "snt:%d, rec:%d", pAction->msgSent, pAction->msgReceived); + len += snprintf(result + len, sizeof(result) - len, ", errCode:0x%x(%s)", pAction->errCode & 0xFFFF, + tstrerror(pAction->errCode)); char resultVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(resultVStr, result, pShow->pMeta->pSchemas[cols].bytes); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); @@ -2298,14 +2305,6 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl char detail[TSDB_TRANS_ERROR_LEN] = {0}; // TODO dmchen len = 0; - char bufStart[40] = {0}; - taosFormatUtcTime(bufStart, sizeof(bufStart), pAction->startTime, TSDB_TIME_PRECISION_MILLI); - - char endStart[40] = {0}; - taosFormatUtcTime(endStart, sizeof(endStart), pAction->endTime, TSDB_TIME_PRECISION_MILLI); - - len += snprintf(detail + len, sizeof(detail) - len, "startTime:%s, endTime:%s, ", bufStart, endStart); - SEpSet epset = pAction->epSet; if (epset.numOfEps > 0) { len += snprintf(detail + len, sizeof(detail) - len, "numOfEps:%d inUse:%d ", epset.numOfEps, epset.inUse); @@ -2315,8 +2314,13 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl } } - len += snprintf(detail + len, sizeof(detail) - len, ", errCode:0x%x(%s)\n", pAction->errCode & 0xFFFF, - tstrerror(pAction->errCode)); + char bufStart[40] = {0}; + taosFormatUtcTime(bufStart, sizeof(bufStart), pAction->startTime, TSDB_TIME_PRECISION_MILLI); + + char bufEnd[40] = {0}; + taosFormatUtcTime(bufEnd, sizeof(bufEnd), pAction->endTime, TSDB_TIME_PRECISION_MILLI); + + len += snprintf(detail + len, sizeof(detail) - len, "startTime:%s, endTime:%s, ", bufStart, bufEnd); char detailVStr[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(detailVStr, detail, pShow->pMeta->pSchemas[cols].bytes); @@ -2325,8 +2329,20 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl _OVER); } else { + int32_t len = 0; + char objType[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen - strcpy(objType, sdbTableName(pAction->pRaw->type)); + + if (pAction->pRaw->type == SDB_VGROUP) { + SSdbRow *pRow = mndVgroupActionDecode(pAction->pRaw); + SVgObj *pVgroup = sdbGetRowObj(pRow); + len += snprintf(objType + len, sizeof(objType) - len, "%s(%d)", sdbTableName(pAction->pRaw->type), + pVgroup->vgId); + taosMemoryFreeClear(pRow); + } else { + strcpy(objType, sdbTableName(pAction->pRaw->type)); + } + char objTypeVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(objTypeVStr, objType, pShow->pMeta->pSchemas[cols].bytes); SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); @@ -2334,7 +2350,7 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl _OVER); char result[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen - int32_t len = 0; + len = 0; len += snprintf(result + len, sizeof(result) - len, "rawWritten:%d", pAction->rawWritten); char resultVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(resultVStr, result, pShow->pMeta->pSchemas[cols].bytes); @@ -2353,7 +2369,7 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl } numOfRows++; - if (numOfRows >= rows - 1) break; + if (numOfRows >= rows) break; } sdbRelease(pSdb, pTrans); From 50affc90f8f78559cca89475d86cdd0ab4c002ab Mon Sep 17 00:00:00 2001 From: dmchen Date: Fri, 8 Nov 2024 15:15:06 +0800 Subject: [PATCH 04/84] dmchen/trans-improve-show-all --- source/common/src/systable.c | 25 ++- source/dnode/mnode/impl/src/mndTrans.c | 285 +++++++++++++++---------- 2 files changed, 192 insertions(+), 118 deletions(-) diff --git a/source/common/src/systable.c b/source/common/src/systable.c index 13eda32bfe..846dc987a5 100644 --- a/source/common/src/systable.c +++ b/source/common/src/systable.c @@ -309,11 +309,16 @@ static const SSysDbTableSchema smaSchema[] = { static const SSysDbTableSchema transSchema[] = { {.name = "id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, - {.name = "action", .bytes = 2048 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen - {.name = "action_type", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, - {.name = "obj_type", .bytes = 2048 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen - {.name = "result", .bytes = 2048 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen - {.name = "detail", .bytes = (TSDB_TRANS_ERROR_LEN - 1) + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen + {.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = false}, + {.name = "stage", .bytes = TSDB_TRANS_STAGE_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, + {.name = "oper", .bytes = TSDB_TRANS_OPER_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, + {.name = "db", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, + {.name = "stable", .bytes = SYSTABLE_SCH_TABLE_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, + {.name = "killable", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, + {.name = "kill_mnode", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, + {.name = "failed_times", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, + {.name = "last_exec_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = false}, + {.name = "last_action_info", .bytes = (TSDB_TRANS_ERROR_LEN - 1) + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, }; static const SSysDbTableSchema configSchema[] = { @@ -398,11 +403,11 @@ static const SSysDbTableSchema userCompactsDetailSchema[] = { static const SSysDbTableSchema userTransactionDetailSchema[] = { {.name = "transaction_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, - {.name = "action_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, - //{.name = "dnode_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, - //{.name = "number_fileset", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, - //{.name = "finished", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, - //{.name = "start_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = false}, + {.name = "action", .bytes = 2048 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen + {.name = "action_type", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, + {.name = "obj_type", .bytes = 2048 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen + {.name = "result", .bytes = 2048 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen + {.name = "detail", .bytes = (TSDB_TRANS_ERROR_LEN - 1) + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen }; static const SSysDbTableSchema anodesSchema[] = { diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index b002a91134..af9ffd4d98 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -2071,7 +2071,6 @@ void mndTransPullup(SMnode *pMnode) { taosArrayDestroy(pArray); } -/* static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) { SMnode *pMnode = pReq->info.node; SSdb *pSdb = pMnode->pSdb; @@ -2226,19 +2225,18 @@ _OVER: pShow->numOfRows += numOfRows; return numOfRows; } -*/ -static int32_t mndShowTransCommonColumns(SShowObj *pShow, SSDataBlock *pBlock, STransAction *pAction, STrans *pTrans, - int32_t numOfRows, int32_t *cols) { +static int32_t mndShowTransCommonColumns(SShowObj *pShow, SSDataBlock *pBlock, STransAction *pAction, + int32_t transactionId, int32_t curActionId, int32_t numOfRows, int32_t *cols) { int32_t code = 0; int32_t lino = 0; int32_t len = 0; SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, (*cols)++); - TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pTrans->id, false), &lino, _OVER); + TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&transactionId, false), &lino, _OVER); char action[2048 + 1] = {0}; // TODO dmchen - if (pTrans->lastAction == pAction->id) { + if (curActionId == pAction->id) { len += snprintf(action + len, sizeof(action) - len, "%s:%d(cur)", mndTransStr(pAction->stage), pAction->id); } else { len += snprintf(action + len, sizeof(action) - len, "%s:%d", mndTransStr(pAction->stage), pAction->id); @@ -2255,124 +2253,197 @@ _OVER: return code; } -static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) { +static int32_t mndShowTransAction(SShowObj *pShow, SSDataBlock *pBlock, STransAction *pAction, int32_t transactionId, + int32_t curActionId, int32_t rows, int32_t numOfRows) { + int32_t code = 0; + int32_t lino = 0; + int32_t len = 0; + int32_t cols = 0; + + cols = 0; + + mndShowTransCommonColumns(pShow, pBlock, pAction, transactionId, curActionId, numOfRows, &cols); + + if (pAction->actionType == TRANS_ACTION_MSG) { + char objType[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen + strcpy(objType, TMSG_INFO(pAction->msgType)); + char objTypeVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(objTypeVStr, objType, pShow->pMeta->pSchemas[cols].bytes); + SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)objTypeVStr, false), &lino, _OVER); + + char result[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen + int32_t len = 0; + len += snprintf(result + len, sizeof(result) - len, "snt:%d, rec:%d", pAction->msgSent, pAction->msgReceived); + len += snprintf(result + len, sizeof(result) - len, ", errCode:0x%x(%s)", pAction->errCode & 0xFFFF, + tstrerror(pAction->errCode)); + char resultVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(resultVStr, result, pShow->pMeta->pSchemas[cols].bytes); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)resultVStr, false), &lino, _OVER); + + char detail[TSDB_TRANS_ERROR_LEN] = {0}; // TODO dmchen + len = 0; + + SEpSet epset = pAction->epSet; + if (epset.numOfEps > 0) { + len += snprintf(detail + len, sizeof(detail) - len, "numOfEps:%d inUse:%d ", epset.numOfEps, epset.inUse); + for (int32_t i = 0; i < epset.numOfEps; ++i) { + len += snprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u ", i, epset.eps[i].fqdn, epset.eps[i].port); + } + } + + char bufStart[40] = {0}; + taosFormatUtcTime(bufStart, sizeof(bufStart), pAction->startTime, TSDB_TIME_PRECISION_MILLI); + + char bufEnd[40] = {0}; + taosFormatUtcTime(bufEnd, sizeof(bufEnd), pAction->endTime, TSDB_TIME_PRECISION_MILLI); + + len += snprintf(detail + len, sizeof(detail) - len, "startTime:%s, endTime:%s, ", bufStart, bufEnd); + + char detailVStr[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(detailVStr, detail, pShow->pMeta->pSchemas[cols].bytes); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)detailVStr, false), &lino, _OVER); + + } else { + int32_t len = 0; + + char objType[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen + + if (pAction->pRaw->type == SDB_VGROUP) { + SSdbRow *pRow = mndVgroupActionDecode(pAction->pRaw); + SVgObj *pVgroup = sdbGetRowObj(pRow); + len += snprintf(objType + len, sizeof(objType) - len, "%s(%d)", sdbTableName(pAction->pRaw->type), pVgroup->vgId); + taosMemoryFreeClear(pRow); + } else { + strcpy(objType, sdbTableName(pAction->pRaw->type)); + } + + char objTypeVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(objTypeVStr, objType, pShow->pMeta->pSchemas[cols].bytes); + SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)objTypeVStr, false), &lino, _OVER); + + char result[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen + len = 0; + len += snprintf(result + len, sizeof(result) - len, "rawWritten:%d", pAction->rawWritten); + char resultVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(resultVStr, result, pShow->pMeta->pSchemas[cols].bytes); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)resultVStr, false), &lino, _OVER); + + char detail[TSDB_TRANS_ERROR_LEN] = {0}; // TODO dmchen + len = 0; + len += snprintf(detail + len, sizeof(detail) - len, "sdbStatus:%s", sdbStatusName(pAction->pRaw->status)); + char detailVStr[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(detailVStr, detail, pShow->pMeta->pSchemas[cols].bytes); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)detailVStr, false), &lino, _OVER); + } + +_OVER: + if (code != 0) mError("failed to retrieve at line:%d, since %s", lino, tstrerror(code)); + return code; +} + +static SArray *mndTransGetAction(STrans *pTrans, ETrnStage stage) { + if (stage == TRN_STAGE_PREPARE) { + return pTrans->prepareActions; + } + if (stage == TRN_STAGE_REDO_ACTION) { + return pTrans->redoActions; + } + if (stage == TRN_STAGE_COMMIT_ACTION) { + return pTrans->commitActions; + } + if (stage == TRN_STAGE_UNDO_ACTION) { + return pTrans->undoActions; + } + return NULL; +} + +typedef struct STransDetailIter { + void *pIter; + STrans *pTrans; + ETrnStage stage; + int32_t num; +} STransDetailIter; + +static int32_t mndRetrieveTransDetail(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) { SMnode *pMnode = pReq->info.node; SSdb *pSdb = pMnode->pSdb; int32_t numOfRows = 0; - STrans *pTrans = NULL; - int32_t cols = 0; + int32_t code = 0; int32_t lino = 0; mInfo("start to mndRetrieveTransDetail, rows:%d, pShow->numOfRows:%d, pShow->pIter:%p", rows, pShow->numOfRows, pShow->pIter); + if (pShow->pIter == NULL) { + pShow->pIter = taosMemoryMalloc(sizeof(STransDetailIter)); + if (pShow->pIter == NULL) { + mError("failed to malloc for pShow->pIter"); + return 0; + } + memset(pShow->pIter, 0, sizeof(STransDetailIter)); + } + + STransDetailIter *pShowIter = (STransDetailIter *)pShow->pIter; + while (numOfRows < rows) { - pShow->pIter = sdbFetch(pSdb, SDB_TRANS, pShow->pIter, (void **)&pTrans); - mInfo("pShow->pIter:%p, pTrans:%p", pShow->pIter, pTrans); - if (pShow->pIter == NULL) break; + if (pShowIter->pTrans == NULL) { + pShowIter->pIter = sdbFetch(pSdb, SDB_TRANS, pShowIter->pIter, (void **)&(pShowIter->pTrans)); + mInfo("pShow->pIter:%p, pTrans:%p", pShowIter->pIter, pShowIter->pTrans); + if (pShowIter->pIter == NULL) break; - if (pTrans->stage == TRN_STAGE_REDO_ACTION) { - mInfo("redoActions num:%" PRId64, taosArrayGetSize(pTrans->redoActions)); + int32_t actionNum = 0; + STrans *pTrans = pShowIter->pTrans; - for (int32_t i = 0; i < taosArrayGetSize(pTrans->redoActions); ++i) { - STransAction *pAction = taosArrayGet(pTrans->redoActions, i); - - cols = 0; - - mndShowTransCommonColumns(pShow, pBlock, pAction, pTrans, numOfRows, &cols); - - if (pAction->actionType == TRANS_ACTION_MSG) { - char objType[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen - strcpy(objType, TMSG_INFO(pAction->msgType)); - char objTypeVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_WITH_MAXSIZE_TO_VARSTR(objTypeVStr, objType, pShow->pMeta->pSchemas[cols].bytes); - SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)objTypeVStr, false), pTrans, &lino, - _OVER); - - char result[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen - int32_t len = 0; - len += snprintf(result + len, sizeof(result) - len, "snt:%d, rec:%d", pAction->msgSent, pAction->msgReceived); - len += snprintf(result + len, sizeof(result) - len, ", errCode:0x%x(%s)", pAction->errCode & 0xFFFF, - tstrerror(pAction->errCode)); - char resultVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_WITH_MAXSIZE_TO_VARSTR(resultVStr, result, pShow->pMeta->pSchemas[cols].bytes); - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)resultVStr, false), pTrans, &lino, - _OVER); - - char detail[TSDB_TRANS_ERROR_LEN] = {0}; // TODO dmchen - len = 0; - - SEpSet epset = pAction->epSet; - if (epset.numOfEps > 0) { - len += snprintf(detail + len, sizeof(detail) - len, "numOfEps:%d inUse:%d ", epset.numOfEps, epset.inUse); - for (int32_t i = 0; i < epset.numOfEps; ++i) { - len += - snprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u ", i, epset.eps[i].fqdn, epset.eps[i].port); - } - } - - char bufStart[40] = {0}; - taosFormatUtcTime(bufStart, sizeof(bufStart), pAction->startTime, TSDB_TIME_PRECISION_MILLI); - - char bufEnd[40] = {0}; - taosFormatUtcTime(bufEnd, sizeof(bufEnd), pAction->endTime, TSDB_TIME_PRECISION_MILLI); - - len += snprintf(detail + len, sizeof(detail) - len, "startTime:%s, endTime:%s, ", bufStart, bufEnd); - - char detailVStr[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_WITH_MAXSIZE_TO_VARSTR(detailVStr, detail, pShow->pMeta->pSchemas[cols].bytes); - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)detailVStr, false), pTrans, &lino, - _OVER); - - } else { - int32_t len = 0; - - char objType[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen - - if (pAction->pRaw->type == SDB_VGROUP) { - SSdbRow *pRow = mndVgroupActionDecode(pAction->pRaw); - SVgObj *pVgroup = sdbGetRowObj(pRow); - len += snprintf(objType + len, sizeof(objType) - len, "%s(%d)", sdbTableName(pAction->pRaw->type), - pVgroup->vgId); - taosMemoryFreeClear(pRow); - } else { - strcpy(objType, sdbTableName(pAction->pRaw->type)); - } - - char objTypeVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_WITH_MAXSIZE_TO_VARSTR(objTypeVStr, objType, pShow->pMeta->pSchemas[cols].bytes); - SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)objTypeVStr, false), pTrans, &lino, - _OVER); - - char result[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen - len = 0; - len += snprintf(result + len, sizeof(result) - len, "rawWritten:%d", pAction->rawWritten); - char resultVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_WITH_MAXSIZE_TO_VARSTR(resultVStr, result, pShow->pMeta->pSchemas[cols].bytes); - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)resultVStr, false), pTrans, &lino, - _OVER); - - char detail[TSDB_TRANS_ERROR_LEN] = {0}; // TODO dmchen - len = 0; - len += snprintf(detail + len, sizeof(detail) - len, "sdbStatus:%s", sdbStatusName(pAction->pRaw->status)); - char detailVStr[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_WITH_MAXSIZE_TO_VARSTR(detailVStr, detail, pShow->pMeta->pSchemas[cols].bytes); - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)detailVStr, false), pTrans, &lino, - _OVER); + if (pTrans->stage == TRN_STAGE_REDO_ACTION) { + SArray *pActions = mndTransGetAction(pTrans, pTrans->stage); + actionNum = taosArrayGetSize(pActions); + mInfo("stage:%s, Actions num:%d", mndTransStr(pTrans->stage), actionNum); + for (int32_t i = 0; i < actionNum; ++i) { + STransAction *pAction = taosArrayGet(pTrans->redoActions, i); + mndShowTransAction(pShow, pBlock, pAction, pTrans->id, pTrans->lastAction, rows, numOfRows); + numOfRows++; + if (numOfRows >= rows) break; } + } + if (numOfRows == actionNum) { + sdbRelease(pSdb, pTrans); + pShowIter->pTrans = NULL; + } else { + pShowIter->pTrans = pTrans; + pShowIter->stage = pTrans->stage; + pShowIter->num = numOfRows; + } + } else { + int32_t actionNum = 0; + STrans *pTrans = pShowIter->pTrans; + SArray *pActions = mndTransGetAction(pTrans, pShowIter->stage); + actionNum = taosArrayGetSize(pActions); + mInfo("stage:%s, Actions num:%d", mndTransStr(pShowIter->stage), actionNum); + + for (int32_t i = pShowIter->num; i < actionNum; ++i) { + STransAction *pAction = taosArrayGet(pShowIter->pTrans->redoActions, i); + mndShowTransAction(pShow, pBlock, pAction, pTrans->id, pTrans->lastAction, rows, numOfRows); numOfRows++; if (numOfRows >= rows) break; } - sdbRelease(pSdb, pTrans); + if (pShow->numOfRows + numOfRows == actionNum) { + sdbRelease(pSdb, pTrans); + pShowIter->pTrans = NULL; + } else { + pShowIter->pTrans = pTrans; + pShowIter->stage = pTrans->stage; + pShowIter->num = numOfRows; + } + break; } } @@ -2387,8 +2458,6 @@ _OVER: return numOfRows; } -static int32_t mndRetrieveTransDetail(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) { return 0; } - static void mndCancelGetNextTrans(SMnode *pMnode, void *pIter) { SSdb *pSdb = pMnode->pSdb; sdbCancelFetchByType(pSdb, pIter, SDB_TRANS); From 43e7fc36d0697fbedccbf436ac5ac512776dde01 Mon Sep 17 00:00:00 2001 From: dmchen Date: Fri, 8 Nov 2024 15:44:43 +0800 Subject: [PATCH 05/84] dmchen/trans-improve-show-all-trans --- source/dnode/mnode/impl/src/mndTrans.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index af9ffd4d98..f1c4103155 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -2435,13 +2435,13 @@ static int32_t mndRetrieveTransDetail(SRpcMsg *pReq, SShowObj *pShow, SSDataBloc if (numOfRows >= rows) break; } - if (pShow->numOfRows + numOfRows == actionNum) { + if (numOfRows == actionNum - pShowIter->num) { sdbRelease(pSdb, pTrans); pShowIter->pTrans = NULL; } else { pShowIter->pTrans = pTrans; pShowIter->stage = pTrans->stage; - pShowIter->num = numOfRows; + pShowIter->num += numOfRows; } break; } From 6bda1a9b6bcc0c3e58b8d8281b294cfef9d52067 Mon Sep 17 00:00:00 2001 From: dmchen Date: Fri, 8 Nov 2024 16:50:18 +0800 Subject: [PATCH 06/84] dmchen/trans-improve-format --- source/common/src/systable.c | 2 +- source/dnode/mnode/impl/src/mndTrans.c | 43 ++++++++++++++++---------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/source/common/src/systable.c b/source/common/src/systable.c index 846dc987a5..780c783b05 100644 --- a/source/common/src/systable.c +++ b/source/common/src/systable.c @@ -404,9 +404,9 @@ static const SSysDbTableSchema userCompactsDetailSchema[] = { static const SSysDbTableSchema userTransactionDetailSchema[] = { {.name = "transaction_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, {.name = "action", .bytes = 2048 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen - {.name = "action_type", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, {.name = "obj_type", .bytes = 2048 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen {.name = "result", .bytes = 2048 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen + {.name = "target", .bytes = (TSDB_TRANS_ERROR_LEN - 1) + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen {.name = "detail", .bytes = (TSDB_TRANS_ERROR_LEN - 1) + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen }; diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index f1c4103155..d8db103882 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -2237,17 +2237,16 @@ static int32_t mndShowTransCommonColumns(SShowObj *pShow, SSDataBlock *pBlock, S char action[2048 + 1] = {0}; // TODO dmchen if (curActionId == pAction->id) { - len += snprintf(action + len, sizeof(action) - len, "%s:%d(cur)", mndTransStr(pAction->stage), pAction->id); + len += snprintf(action + len, sizeof(action) - len, "%s:%d(%d)<-cur", mndTransStr(pAction->stage), pAction->id, + pAction->actionType); } else { - len += snprintf(action + len, sizeof(action) - len, "%s:%d", mndTransStr(pAction->stage), pAction->id); + len += snprintf(action + len, sizeof(action) - len, "%s:%d(%d)", mndTransStr(pAction->stage), pAction->id, + pAction->actionType); } char actionVStr[2048 + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(actionVStr, action, pShow->pMeta->pSchemas[*cols].bytes); pColInfo = taosArrayGet(pBlock->pDataBlock, (*cols)++); TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)actionVStr, false), &lino, _OVER); - - pColInfo = taosArrayGet(pBlock->pDataBlock, (*cols)++); - TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pAction->actionType, false), &lino, _OVER); _OVER: if (code != 0) mError("failed to retrieve at line:%d, since %s", lino, tstrerror(code)); return code; @@ -2265,42 +2264,46 @@ static int32_t mndShowTransAction(SShowObj *pShow, SSDataBlock *pBlock, STransAc mndShowTransCommonColumns(pShow, pBlock, pAction, transactionId, curActionId, numOfRows, &cols); if (pAction->actionType == TRANS_ACTION_MSG) { + int32_t len = 0; + char objType[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen - strcpy(objType, TMSG_INFO(pAction->msgType)); + len += snprintf(objType + len, sizeof(objType) - len, "%s(s:%d,r:%d)", TMSG_INFO(pAction->msgType), + pAction->msgSent, pAction->msgReceived); char objTypeVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(objTypeVStr, objType, pShow->pMeta->pSchemas[cols].bytes); SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)objTypeVStr, false), &lino, _OVER); - char result[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen - int32_t len = 0; - len += snprintf(result + len, sizeof(result) - len, "snt:%d, rec:%d", pAction->msgSent, pAction->msgReceived); - len += snprintf(result + len, sizeof(result) - len, ", errCode:0x%x(%s)", pAction->errCode & 0xFFFF, + char result[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen + len = 0; + len += snprintf(result + len, sizeof(result) - len, "errCode:0x%x(%s)", pAction->errCode & 0xFFFF, tstrerror(pAction->errCode)); char resultVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(resultVStr, result, pShow->pMeta->pSchemas[cols].bytes); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)resultVStr, false), &lino, _OVER); - char detail[TSDB_TRANS_ERROR_LEN] = {0}; // TODO dmchen + char target[TSDB_TRANS_ERROR_LEN] = {0}; // TODO dmchen len = 0; - SEpSet epset = pAction->epSet; if (epset.numOfEps > 0) { - len += snprintf(detail + len, sizeof(detail) - len, "numOfEps:%d inUse:%d ", epset.numOfEps, epset.inUse); for (int32_t i = 0; i < epset.numOfEps; ++i) { - len += snprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u ", i, epset.eps[i].fqdn, epset.eps[i].port); + len += snprintf(target + len, sizeof(target) - len, "ep:%d-%s:%u,", i, epset.eps[i].fqdn, epset.eps[i].port); } + len += snprintf(target + len, sizeof(target) - len, "(%d:%d) ", epset.numOfEps, epset.inUse); } + char targetVStr[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(targetVStr, target, pShow->pMeta->pSchemas[cols].bytes); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)targetVStr, false), &lino, _OVER); + char detail[TSDB_TRANS_ERROR_LEN] = {0}; // TODO dmchen + len = 0; char bufStart[40] = {0}; taosFormatUtcTime(bufStart, sizeof(bufStart), pAction->startTime, TSDB_TIME_PRECISION_MILLI); - char bufEnd[40] = {0}; taosFormatUtcTime(bufEnd, sizeof(bufEnd), pAction->endTime, TSDB_TIME_PRECISION_MILLI); - len += snprintf(detail + len, sizeof(detail) - len, "startTime:%s, endTime:%s, ", bufStart, bufEnd); - char detailVStr[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(detailVStr, detail, pShow->pMeta->pSchemas[cols].bytes); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); @@ -2333,6 +2336,12 @@ static int32_t mndShowTransAction(SShowObj *pShow, SSDataBlock *pBlock, STransAc pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)resultVStr, false), &lino, _OVER); + char target[TSDB_TRANS_ERROR_LEN] = ""; // TODO dmchen + char targetVStr[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(targetVStr, target, pShow->pMeta->pSchemas[cols].bytes); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)targetVStr, false), &lino, _OVER); + char detail[TSDB_TRANS_ERROR_LEN] = {0}; // TODO dmchen len = 0; len += snprintf(detail + len, sizeof(detail) - len, "sdbStatus:%s", sdbStatusName(pAction->pRaw->status)); From 81c066eccd88c2a8163bc171e724d56616fed521 Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 11 Nov 2024 09:09:33 +0800 Subject: [PATCH 07/84] fix/trans-improve-rename-field-name --- include/common/tmsg.h | 2 +- source/common/src/tmsg.c | 6 +++--- source/dnode/mgmt/mgmt_dnode/src/dmHandle.c | 2 +- source/dnode/mnode/impl/src/mndShow.c | 3 ++- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 4a02c762b5..bcf47bdd06 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -2233,7 +2233,7 @@ typedef struct { char user[TSDB_USER_LEN]; char filterTb[TSDB_TABLE_NAME_LEN]; // for ins_columns int64_t showId; - int64_t compactId1; // for compact + int64_t compactId; // for compact bool withFull; // for show users full } SRetrieveTableReq; diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c index 19b34b66ff..458badc764 100644 --- a/source/common/src/tmsg.c +++ b/source/common/src/tmsg.c @@ -5732,7 +5732,7 @@ int32_t tSerializeSRetrieveTableReq(void *buf, int32_t bufLen, SRetrieveTableReq TAOS_CHECK_EXIT(tEncodeCStr(&encoder, pReq->tb)); TAOS_CHECK_EXIT(tEncodeCStr(&encoder, pReq->filterTb)); TAOS_CHECK_EXIT(tEncodeCStr(&encoder, pReq->user)); - TAOS_CHECK_EXIT(tEncodeI64(&encoder, pReq->compactId1)); + TAOS_CHECK_EXIT(tEncodeI64(&encoder, pReq->compactId)); TAOS_CHECK_EXIT(tEncodeI8(&encoder, pReq->withFull)); tEndEncode(&encoder); @@ -5760,9 +5760,9 @@ int32_t tDeserializeSRetrieveTableReq(void *buf, int32_t bufLen, SRetrieveTableR TAOS_CHECK_EXIT(tDecodeCStrTo(&decoder, pReq->filterTb)); TAOS_CHECK_EXIT(tDecodeCStrTo(&decoder, pReq->user)); if (!tDecodeIsEnd(&decoder)) { - TAOS_CHECK_EXIT(tDecodeI64(&decoder, &pReq->compactId1)); + TAOS_CHECK_EXIT(tDecodeI64(&decoder, &pReq->compactId)); } else { - pReq->compactId1 = -1; + pReq->compactId = -1; } if (!tDecodeIsEnd(&decoder)) { TAOS_CHECK_EXIT(tDecodeI8(&decoder, (int8_t *)&pReq->withFull)); diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c index 41dd117807..0837686d49 100644 --- a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c +++ b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c @@ -526,7 +526,7 @@ int32_t dmProcessRetrieve(SDnodeMgmt *pMgmt, SRpcMsg *pMsg) { if (tDeserializeSRetrieveTableReq(pMsg->pCont, pMsg->contLen, &retrieveReq) != 0) { return TSDB_CODE_INVALID_MSG; } - dInfo("retrieve table:%s, user:%s, compactId:%" PRId64, retrieveReq.tb, retrieveReq.user, retrieveReq.compactId1); + dInfo("retrieve table:%s, user:%s, compactId:%" PRId64, retrieveReq.tb, retrieveReq.user, retrieveReq.compactId); #if 0 if (strcmp(retrieveReq.user, TSDB_DEFAULT_USER) != 0) { code = TSDB_CODE_MND_NO_RIGHTS; diff --git a/source/dnode/mnode/impl/src/mndShow.c b/source/dnode/mnode/impl/src/mndShow.c index 082ea5fc24..0c2d6f0596 100644 --- a/source/dnode/mnode/impl/src/mndShow.c +++ b/source/dnode/mnode/impl/src/mndShow.c @@ -234,7 +234,8 @@ static int32_t mndProcessRetrieveSysTableReq(SRpcMsg *pReq) { SRetrieveTableReq retrieveReq = {0}; TAOS_CHECK_RETURN(tDeserializeSRetrieveTableReq(pReq->pCont, pReq->contLen, &retrieveReq)); - mDebug("process to retrieve systable req db:%s, tb:%s, compactId:%" PRId64, retrieveReq.db, retrieveReq.tb, retrieveReq.compactId1); + mDebug("process to retrieve systable req db:%s, tb:%s, compactId:%" PRId64, retrieveReq.db, retrieveReq.tb, + retrieveReq.compactId); if (retrieveReq.showId == 0) { STableMetaRsp *pMeta = taosHashGet(pMnode->infosMeta, retrieveReq.tb, strlen(retrieveReq.tb)); From 03ba1bd23c9a1fd5601ae30c4a96d525d2a5fe87 Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 11 Nov 2024 18:05:44 +0800 Subject: [PATCH 08/84] fix/trans-improve-refactor --- source/dnode/mnode/impl/src/mndTrans.c | 84 ++++++++++++-------------- 1 file changed, 37 insertions(+), 47 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index d8db103882..395ce45eb9 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -2379,6 +2379,29 @@ typedef struct STransDetailIter { int32_t num; } STransDetailIter; +static void mndTransShowActions(SSdb *pSdb, STransDetailIter *pShowIter, SShowObj *pShow, SSDataBlock *pBlock, + int32_t rows, int32_t *numOfRows, SArray *pActions, int32_t end, int32_t start) { + int32_t actionNum = taosArrayGetSize(pActions); + mInfo("stage:%s, Actions num:%d", mndTransStr(pShowIter->stage), actionNum); + + for (int32_t i = start; i < actionNum; ++i) { + STransAction *pAction = taosArrayGet(pShowIter->pTrans->redoActions, i); + mndShowTransAction(pShow, pBlock, pAction, pShowIter->pTrans->id, pShowIter->pTrans->lastAction, rows, *numOfRows); + (*numOfRows)++; + if (*numOfRows >= rows) break; + } + + if (*numOfRows == end) { + sdbRelease(pSdb, pShowIter->pTrans); + pShowIter->pTrans = NULL; + pShowIter->num = 0; + } else { + pShowIter->pTrans = pShowIter->pTrans; + pShowIter->stage = pShowIter->pTrans->stage; + pShowIter->num += (*numOfRows); + } +} + static int32_t mndRetrieveTransDetail(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) { SMnode *pMnode = pReq->info.node; SSdb *pSdb = pMnode->pSdb; @@ -2391,7 +2414,7 @@ static int32_t mndRetrieveTransDetail(SRpcMsg *pReq, SShowObj *pShow, SSDataBloc pShow->pIter); if (pShow->pIter == NULL) { - pShow->pIter = taosMemoryMalloc(sizeof(STransDetailIter)); + pShow->pIter = taosMemoryMalloc(sizeof(STransDetailIter)); // TODO dmchen if (pShow->pIter == NULL) { mError("failed to malloc for pShow->pIter"); return 0; @@ -2404,66 +2427,33 @@ static int32_t mndRetrieveTransDetail(SRpcMsg *pReq, SShowObj *pShow, SSDataBloc while (numOfRows < rows) { if (pShowIter->pTrans == NULL) { pShowIter->pIter = sdbFetch(pSdb, SDB_TRANS, pShowIter->pIter, (void **)&(pShowIter->pTrans)); - mInfo("pShow->pIter:%p, pTrans:%p", pShowIter->pIter, pShowIter->pTrans); + mDebug("retrieve trans detail from fetch, pShow->pIter:%p, pTrans:%p", pShowIter->pIter, pShowIter->pTrans); if (pShowIter->pIter == NULL) break; + mInfo("retrieve trans detail from fetch, id:%d, trans stage:%d, IterNum:%d", pShowIter->pTrans->id, + pShowIter->pTrans->stage, pShowIter->num); - int32_t actionNum = 0; - STrans *pTrans = pShowIter->pTrans; + SArray *pActions = mndTransGetAction(pShowIter->pTrans, pShowIter->pTrans->stage); - if (pTrans->stage == TRN_STAGE_REDO_ACTION) { - SArray *pActions = mndTransGetAction(pTrans, pTrans->stage); - actionNum = taosArrayGetSize(pActions); - mInfo("stage:%s, Actions num:%d", mndTransStr(pTrans->stage), actionNum); - for (int32_t i = 0; i < actionNum; ++i) { - STransAction *pAction = taosArrayGet(pTrans->redoActions, i); - mndShowTransAction(pShow, pBlock, pAction, pTrans->id, pTrans->lastAction, rows, numOfRows); - numOfRows++; - if (numOfRows >= rows) break; - } - } - if (numOfRows == actionNum) { - sdbRelease(pSdb, pTrans); - pShowIter->pTrans = NULL; - } else { - pShowIter->pTrans = pTrans; - pShowIter->stage = pTrans->stage; - pShowIter->num = numOfRows; - } + mndTransShowActions(pSdb, pShowIter, pShow, pBlock, rows, &numOfRows, pActions, taosArrayGetSize(pActions), 0); } else { - int32_t actionNum = 0; - STrans *pTrans = pShowIter->pTrans; + mInfo("retrieve trans detail from iter, id:%d, iterStage:%d, IterNum:%d", pShowIter->pTrans->id, pShowIter->stage, + pShowIter->num); + SArray *pActions = mndTransGetAction(pShowIter->pTrans, pShowIter->stage); - SArray *pActions = mndTransGetAction(pTrans, pShowIter->stage); - actionNum = taosArrayGetSize(pActions); - mInfo("stage:%s, Actions num:%d", mndTransStr(pShowIter->stage), actionNum); - - for (int32_t i = pShowIter->num; i < actionNum; ++i) { - STransAction *pAction = taosArrayGet(pShowIter->pTrans->redoActions, i); - mndShowTransAction(pShow, pBlock, pAction, pTrans->id, pTrans->lastAction, rows, numOfRows); - numOfRows++; - if (numOfRows >= rows) break; - } - - if (numOfRows == actionNum - pShowIter->num) { - sdbRelease(pSdb, pTrans); - pShowIter->pTrans = NULL; - } else { - pShowIter->pTrans = pTrans; - pShowIter->stage = pTrans->stage; - pShowIter->num += numOfRows; - } + mndTransShowActions(pSdb, pShowIter, pShow, pBlock, rows, &numOfRows, pActions, + taosArrayGetSize(pActions) - pShowIter->num, pShowIter->num); break; } } _OVER: + pShow->numOfRows += numOfRows; + if (code != 0) { mError("failed to retrieve at line:%d, since %s", lino, tstrerror(code)); } else { - mInfo("retrieve %d", numOfRows) + mInfo("retrieve trans detail, numOfRows:%d, pShow->numOfRows:%d", numOfRows, pShow->numOfRows) } - - pShow->numOfRows += numOfRows; return numOfRows; } From cb87990d95195ed1f89c9d9b8b5e154ab3635c18 Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 11 Nov 2024 18:51:41 +0800 Subject: [PATCH 09/84] fix/trans-improve-field-len --- include/util/tdef.h | 6 ++- source/common/src/systable.c | 10 ++--- source/dnode/mnode/impl/src/mndTrans.c | 61 +++++++++++++++----------- 3 files changed, 45 insertions(+), 32 deletions(-) diff --git a/include/util/tdef.h b/include/util/tdef.h index 401accdd99..9b91c4f0a5 100644 --- a/include/util/tdef.h +++ b/include/util/tdef.h @@ -349,7 +349,11 @@ typedef enum ELogicConditionType { #define TSDB_TRANS_STAGE_LEN 12 #define TSDB_TRANS_TYPE_LEN 16 -#define TSDB_TRANS_ERROR_LEN 512000 +#define TSDB_TRANS_ERROR_LEN 512000 // TODO dmchen +#define TSDB_TRANS_OBJTYPE_LEN 40 +#define TSDB_TRANS_RESULT_LEN 100 +#define TSDB_TRANS_TARGET_LEN 300 +#define TSDB_TRANS_DETAIL_LEN 100 #define TSDB_STEP_NAME_LEN 32 #define TSDB_STEP_DESC_LEN 128 diff --git a/source/common/src/systable.c b/source/common/src/systable.c index 780c783b05..bbde9e827c 100644 --- a/source/common/src/systable.c +++ b/source/common/src/systable.c @@ -403,11 +403,11 @@ static const SSysDbTableSchema userCompactsDetailSchema[] = { static const SSysDbTableSchema userTransactionDetailSchema[] = { {.name = "transaction_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, - {.name = "action", .bytes = 2048 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen - {.name = "obj_type", .bytes = 2048 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen - {.name = "result", .bytes = 2048 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen - {.name = "target", .bytes = (TSDB_TRANS_ERROR_LEN - 1) + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen - {.name = "detail", .bytes = (TSDB_TRANS_ERROR_LEN - 1) + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},//TODO dmchen + {.name = "action", .bytes = 30 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, + {.name = "obj_type", .bytes = TSDB_TRANS_OBJTYPE_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, + {.name = "result", .bytes = TSDB_TRANS_RESULT_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, + {.name = "target", .bytes = TSDB_TRANS_TARGET_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, + {.name = "detail", .bytes = TSDB_TRANS_DETAIL_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, }; static const SSysDbTableSchema anodesSchema[] = { diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 395ce45eb9..cdf4dd0cb0 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -440,6 +440,17 @@ static const char *mndTransStr(ETrnStage stage) { } } +static const char *mndTransTypeStr(ETrnAct actionType) { + switch (actionType) { + case TRANS_ACTION_MSG: + return "msg"; + case TRANS_ACTION_RAW: + return "sdb"; + default: + return "invalid"; + } +} + static void mndSetTransLastAction(STrans *pTrans, STransAction *pAction) { if (pAction != NULL) { pTrans->lastAction = pAction->id; @@ -2150,8 +2161,8 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl for (int32_t i = 0; i < taosArrayGetSize(pTrans->prepareActions); ++i, ++index) { STransAction *pAction = taosArrayGet(pTrans->prepareActions, i); len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s\n", index, - mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), -sdbStatusName(pAction->pRaw->status)); + mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), + sdbStatusName(pAction->pRaw->status)); // TODO dmchen remove and format } } @@ -2235,15 +2246,15 @@ static int32_t mndShowTransCommonColumns(SShowObj *pShow, SSDataBlock *pBlock, S SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, (*cols)++); TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&transactionId, false), &lino, _OVER); - char action[2048 + 1] = {0}; // TODO dmchen + char action[30 + 1] = {0}; if (curActionId == pAction->id) { - len += snprintf(action + len, sizeof(action) - len, "%s:%d(%d)<-cur", mndTransStr(pAction->stage), pAction->id, - pAction->actionType); + len += snprintf(action + len, sizeof(action) - len, "%s:%d(%s)<-last", mndTransStr(pAction->stage), pAction->id, + mndTransTypeStr(pAction->actionType)); } else { - len += snprintf(action + len, sizeof(action) - len, "%s:%d(%d)", mndTransStr(pAction->stage), pAction->id, - pAction->actionType); + len += snprintf(action + len, sizeof(action) - len, "%s:%d(%s)", mndTransStr(pAction->stage), pAction->id, + mndTransTypeStr(pAction->actionType)); } - char actionVStr[2048 + VARSTR_HEADER_SIZE] = {0}; + char actionVStr[30 + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(actionVStr, action, pShow->pMeta->pSchemas[*cols].bytes); pColInfo = taosArrayGet(pBlock->pDataBlock, (*cols)++); TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)actionVStr, false), &lino, _OVER); @@ -2266,24 +2277,24 @@ static int32_t mndShowTransAction(SShowObj *pShow, SSDataBlock *pBlock, STransAc if (pAction->actionType == TRANS_ACTION_MSG) { int32_t len = 0; - char objType[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen + char objType[TSDB_TRANS_OBJTYPE_LEN + 1] = {0}; len += snprintf(objType + len, sizeof(objType) - len, "%s(s:%d,r:%d)", TMSG_INFO(pAction->msgType), pAction->msgSent, pAction->msgReceived); - char objTypeVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; + char objTypeVStr[TSDB_TRANS_OBJTYPE_LEN + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(objTypeVStr, objType, pShow->pMeta->pSchemas[cols].bytes); SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)objTypeVStr, false), &lino, _OVER); - char result[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen + char result[TSDB_TRANS_RESULT_LEN + 1] = {0}; len = 0; len += snprintf(result + len, sizeof(result) - len, "errCode:0x%x(%s)", pAction->errCode & 0xFFFF, tstrerror(pAction->errCode)); - char resultVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; + char resultVStr[TSDB_TRANS_RESULT_LEN + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(resultVStr, result, pShow->pMeta->pSchemas[cols].bytes); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)resultVStr, false), &lino, _OVER); - char target[TSDB_TRANS_ERROR_LEN] = {0}; // TODO dmchen + char target[TSDB_TRANS_TARGET_LEN] = {0}; len = 0; SEpSet epset = pAction->epSet; if (epset.numOfEps > 0) { @@ -2292,19 +2303,19 @@ static int32_t mndShowTransAction(SShowObj *pShow, SSDataBlock *pBlock, STransAc } len += snprintf(target + len, sizeof(target) - len, "(%d:%d) ", epset.numOfEps, epset.inUse); } - char targetVStr[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; + char targetVStr[TSDB_TRANS_TARGET_LEN + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(targetVStr, target, pShow->pMeta->pSchemas[cols].bytes); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)targetVStr, false), &lino, _OVER); - char detail[TSDB_TRANS_ERROR_LEN] = {0}; // TODO dmchen + char detail[TSDB_TRANS_DETAIL_LEN] = {0}; len = 0; char bufStart[40] = {0}; taosFormatUtcTime(bufStart, sizeof(bufStart), pAction->startTime, TSDB_TIME_PRECISION_MILLI); char bufEnd[40] = {0}; taosFormatUtcTime(bufEnd, sizeof(bufEnd), pAction->endTime, TSDB_TIME_PRECISION_MILLI); len += snprintf(detail + len, sizeof(detail) - len, "startTime:%s, endTime:%s, ", bufStart, bufEnd); - char detailVStr[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; + char detailVStr[TSDB_TRANS_DETAIL_LEN + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(detailVStr, detail, pShow->pMeta->pSchemas[cols].bytes); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)detailVStr, false), &lino, _OVER); @@ -2312,8 +2323,7 @@ static int32_t mndShowTransAction(SShowObj *pShow, SSDataBlock *pBlock, STransAc } else { int32_t len = 0; - char objType[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen - + char objType[TSDB_TRANS_OBJTYPE_LEN + 1] = {0}; if (pAction->pRaw->type == SDB_VGROUP) { SSdbRow *pRow = mndVgroupActionDecode(pAction->pRaw); SVgObj *pVgroup = sdbGetRowObj(pRow); @@ -2322,30 +2332,29 @@ static int32_t mndShowTransAction(SShowObj *pShow, SSDataBlock *pBlock, STransAc } else { strcpy(objType, sdbTableName(pAction->pRaw->type)); } - - char objTypeVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; + char objTypeVStr[TSDB_TRANS_OBJTYPE_LEN + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(objTypeVStr, objType, pShow->pMeta->pSchemas[cols].bytes); SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)objTypeVStr, false), &lino, _OVER); - char result[TSDB_TRANS_ERROR_LEN + 1] = {0}; // TODO dmchen + char result[TSDB_TRANS_RESULT_LEN + 1] = {0}; len = 0; len += snprintf(result + len, sizeof(result) - len, "rawWritten:%d", pAction->rawWritten); - char resultVStr[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; + char resultVStr[TSDB_TRANS_RESULT_LEN + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(resultVStr, result, pShow->pMeta->pSchemas[cols].bytes); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)resultVStr, false), &lino, _OVER); - char target[TSDB_TRANS_ERROR_LEN] = ""; // TODO dmchen - char targetVStr[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; + char target[TSDB_TRANS_TARGET_LEN] = ""; + char targetVStr[TSDB_TRANS_TARGET_LEN + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(targetVStr, target, pShow->pMeta->pSchemas[cols].bytes); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)targetVStr, false), &lino, _OVER); - char detail[TSDB_TRANS_ERROR_LEN] = {0}; // TODO dmchen + char detail[TSDB_TRANS_DETAIL_LEN] = {0}; len = 0; len += snprintf(detail + len, sizeof(detail) - len, "sdbStatus:%s", sdbStatusName(pAction->pRaw->status)); - char detailVStr[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; + char detailVStr[TSDB_TRANS_DETAIL_LEN + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(detailVStr, detail, pShow->pMeta->pSchemas[cols].bytes); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)detailVStr, false), &lino, _OVER); From 46877cab5e10edf3ab30b6903b034597a546deea Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 11 Nov 2024 19:44:27 +0800 Subject: [PATCH 10/84] fix/trans-improve-remove-todo --- include/util/tdef.h | 2 +- source/dnode/mnode/impl/src/mndTrans.c | 153 ++++++++++++++----------- 2 files changed, 85 insertions(+), 70 deletions(-) diff --git a/include/util/tdef.h b/include/util/tdef.h index 9b91c4f0a5..ce2bfc17c3 100644 --- a/include/util/tdef.h +++ b/include/util/tdef.h @@ -349,7 +349,7 @@ typedef enum ELogicConditionType { #define TSDB_TRANS_STAGE_LEN 12 #define TSDB_TRANS_TYPE_LEN 16 -#define TSDB_TRANS_ERROR_LEN 512000 // TODO dmchen +#define TSDB_TRANS_ERROR_LEN 512 #define TSDB_TRANS_OBJTYPE_LEN 40 #define TSDB_TRANS_RESULT_LEN 100 #define TSDB_TRANS_TARGET_LEN 300 diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index cdf4dd0cb0..9d1a995a32 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -2082,6 +2082,85 @@ void mndTransPullup(SMnode *pMnode) { taosArrayDestroy(pArray); } +static void mndTransLogAction(STrans *pTrans) { + char detail[512] = {0}; + int32_t len = 0; + int32_t index = 0; + + if (pTrans->stage == TRN_STAGE_PREPARE) { + for (int32_t i = 0; i < taosArrayGetSize(pTrans->prepareActions); ++i, ++index) { + len = 0; + STransAction *pAction = taosArrayGet(pTrans->prepareActions, i); + len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s\n", index, + mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), + sdbStatusName(pAction->pRaw->status)); + mDebug("trans:%d, show tran action, detail:%s", pTrans->id, detail); + } + } + + if (pTrans->stage == TRN_STAGE_REDO_ACTION) { + for (int32_t i = 0; i < taosArrayGetSize(pTrans->redoActions); ++i, ++index) { + len = 0; + STransAction *pAction = taosArrayGet(pTrans->redoActions, i); + if (pAction->actionType == TRANS_ACTION_MSG) { + char bufStart[40] = {0}; + taosFormatUtcTime(bufStart, sizeof(bufStart), pAction->startTime, TSDB_TIME_PRECISION_MILLI); + + char endStart[40] = {0}; + taosFormatUtcTime(endStart, sizeof(endStart), pAction->endTime, TSDB_TIME_PRECISION_MILLI); + len += snprintf(detail + len, sizeof(detail) - len, + "action:%d, %s:%d msgType:%s," + "sent:%d, received:%d, startTime:%s, endTime:%s, ", + index, mndTransStr(pAction->stage), pAction->id, TMSG_INFO(pAction->msgType), pAction->msgSent, + pAction->msgReceived, bufStart, endStart); + + SEpSet epset = pAction->epSet; + if (epset.numOfEps > 0) { + len += snprintf(detail + len, sizeof(detail) - len, "numOfEps:%d inUse:%d ", epset.numOfEps, epset.inUse); + for (int32_t i = 0; i < epset.numOfEps; ++i) { + len += + snprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u ", i, epset.eps[i].fqdn, epset.eps[i].port); + } + } + + len += snprintf(detail + len, sizeof(detail) - len, ", errCode:0x%x(%s)\n", pAction->errCode & 0xFFFF, + tstrerror(pAction->errCode)); + } else { + len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s, written:%d\n", + index, mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), + sdbStatusName(pAction->pRaw->status), pAction->rawWritten); + } + mDebug("trans:%d, show tran action, detail:%s", pTrans->id, detail); + } + } + + if (pTrans->stage == TRN_STAGE_COMMIT_ACTION) { + for (int32_t i = 0; i < taosArrayGetSize(pTrans->commitActions); ++i, ++index) { + len = 0; + STransAction *pAction = taosArrayGet(pTrans->commitActions, i); + len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s\n", index, + mndTransStr(pAction->stage), i, sdbTableName(pAction->pRaw->type), + sdbStatusName(pAction->pRaw->status)); + mDebug("trans:%d, show tran action, detail:%s", pTrans->id, detail); + } + + for (int32_t i = 0; i < taosArrayGetSize(pTrans->undoActions); ++i, ++index) { + len = 0; + STransAction *pAction = taosArrayGet(pTrans->undoActions, i); + if (pAction->actionType == TRANS_ACTION_MSG) { + len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d msgType:%s\n", index, + mndTransStr(pAction->stage), pAction->id, TMSG_INFO(pAction->msgType)); + ; + } else { + len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s\n", index, + mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), + sdbStatusName(pAction->pRaw->status)); + } + mDebug("trans:%d, show tran action, detail:%s", pTrans->id, detail); + } + } +} + static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) { SMnode *pMnode = pReq->info.node; SSdb *pSdb = pMnode->pSdb; @@ -2146,87 +2225,23 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl char detail[TSDB_TRANS_ERROR_LEN + 1] = {0}; int32_t len = tsnprintf(detail, sizeof(detail), "action:%d code:0x%x(%s) ", pTrans->lastAction, - pTrans->lastErrorNo & 0xFFFF, tstrerror(pTrans->lastErrorNo)); + pTrans->lastErrorNo & 0xFFFF, tstrerror(pTrans->lastErrorNo)); SEpSet epset = pTrans->lastEpset; if (epset.numOfEps > 0) { len += tsnprintf(detail + len, sizeof(detail) - len, "msgType:%s numOfEps:%d inUse:%d ", - TMSG_INFO(pTrans->lastMsgType), epset.numOfEps, epset.inUse); + TMSG_INFO(pTrans->lastMsgType), epset.numOfEps, epset.inUse); for (int32_t i = 0; i < pTrans->lastEpset.numOfEps; ++i) { len += snprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u \n", i, epset.eps[i].fqdn, epset.eps[i].port); } } - int32_t index = 0; - if(pTrans->stage == TRN_STAGE_PREPARE){ - for (int32_t i = 0; i < taosArrayGetSize(pTrans->prepareActions); ++i, ++index) { - STransAction *pAction = taosArrayGet(pTrans->prepareActions, i); - len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s\n", index, - mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), - sdbStatusName(pAction->pRaw->status)); // TODO dmchen remove and format - } - } - - if(pTrans->stage == TRN_STAGE_REDO_ACTION){ - for (int32_t i = 0; i < taosArrayGetSize(pTrans->redoActions); ++i, ++index) { - STransAction *pAction = taosArrayGet(pTrans->redoActions, i); - if(pAction->actionType == TRANS_ACTION_MSG){ - char bufStart[40] = {0}; - taosFormatUtcTime(bufStart, sizeof(bufStart), pAction->startTime, TSDB_TIME_PRECISION_MILLI); - - char endStart[40] = {0}; - taosFormatUtcTime(endStart, sizeof(endStart), pAction->endTime, TSDB_TIME_PRECISION_MILLI); - len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d msgType:%s," - "sent:%d, received:%d, startTime:%s, endTime:%s, ", index, - mndTransStr(pAction->stage), pAction->id, TMSG_INFO(pAction->msgType), - pAction->msgSent, pAction->msgReceived, bufStart, endStart); - - SEpSet epset = pAction->epSet; - if (epset.numOfEps > 0) { - len += snprintf(detail + len, sizeof(detail) - len, "numOfEps:%d inUse:%d ", - epset.numOfEps, epset.inUse); - for (int32_t i = 0; i < epset.numOfEps; ++i) { - len += snprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u ", i, epset.eps[i].fqdn, -epset.eps[i].port); - } - } - - len += snprintf(detail + len, sizeof(detail) - len, ", errCode:0x%x(%s)\n", pAction->errCode & 0xFFFF, -tstrerror(pAction->errCode)); - } - else{ - len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s, written:%d\n", -index, mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), -sdbStatusName(pAction->pRaw->status), pAction->rawWritten); - } - } - } - - if(pTrans->stage == TRN_STAGE_COMMIT_ACTION){ - for (int32_t i = 0; i < taosArrayGetSize(pTrans->commitActions); ++i, ++index) { - STransAction *pAction = taosArrayGet(pTrans->commitActions, i); - len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s\n", index, - mndTransStr(pAction->stage), i, sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status)); - } - - for (int32_t i = 0; i < taosArrayGetSize(pTrans->undoActions); ++i, ++index) { - STransAction *pAction = taosArrayGet(pTrans->undoActions, i); - if(pAction->actionType == TRANS_ACTION_MSG){ - len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d msgType:%s\n", index, - mndTransStr(pAction->stage), pAction->id, TMSG_INFO(pAction->msgType));; - } - else{ - len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s\n", index, - mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), -sdbStatusName(pAction->pRaw->status)); - } - } - } - - char lastInfo[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; + char lastInfo[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(lastInfo, detail, pShow->pMeta->pSchemas[cols].bytes); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)lastInfo, false), pTrans, &lino, _OVER); + mndTransLogAction(pTrans); + numOfRows++; sdbRelease(pSdb, pTrans); } From c8252ad5f3b500ca9b74172be0b87ec06f06c662 Mon Sep 17 00:00:00 2001 From: dmchen Date: Tue, 12 Nov 2024 15:07:32 +0800 Subject: [PATCH 11/84] fix/release iter --- source/dnode/mnode/impl/src/mndTrans.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 9d1a995a32..247ee1ec79 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -2326,9 +2326,10 @@ static int32_t mndShowTransAction(SShowObj *pShow, SSDataBlock *pBlock, STransAc char detail[TSDB_TRANS_DETAIL_LEN] = {0}; len = 0; char bufStart[40] = {0}; - taosFormatUtcTime(bufStart, sizeof(bufStart), pAction->startTime, TSDB_TIME_PRECISION_MILLI); + if (pAction->startTime > 0) + taosFormatUtcTime(bufStart, sizeof(bufStart), pAction->startTime, TSDB_TIME_PRECISION_MILLI); char bufEnd[40] = {0}; - taosFormatUtcTime(bufEnd, sizeof(bufEnd), pAction->endTime, TSDB_TIME_PRECISION_MILLI); + if (pAction->endTime > 0) taosFormatUtcTime(bufEnd, sizeof(bufEnd), pAction->endTime, TSDB_TIME_PRECISION_MILLI); len += snprintf(detail + len, sizeof(detail) - len, "startTime:%s, endTime:%s, ", bufStart, bufEnd); char detailVStr[TSDB_TRANS_DETAIL_LEN + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(detailVStr, detail, pShow->pMeta->pSchemas[cols].bytes); @@ -2438,7 +2439,7 @@ static int32_t mndRetrieveTransDetail(SRpcMsg *pReq, SShowObj *pShow, SSDataBloc pShow->pIter); if (pShow->pIter == NULL) { - pShow->pIter = taosMemoryMalloc(sizeof(STransDetailIter)); // TODO dmchen + pShow->pIter = taosMemoryMalloc(sizeof(STransDetailIter)); if (pShow->pIter == NULL) { mError("failed to malloc for pShow->pIter"); return 0; @@ -2478,6 +2479,10 @@ _OVER: } else { mInfo("retrieve trans detail, numOfRows:%d, pShow->numOfRows:%d", numOfRows, pShow->numOfRows) } + if (numOfRows == 0) { + taosMemoryFree(pShow->pIter); + pShow->pIter = NULL; + } return numOfRows; } From 930a193e2f4589b7a2bb3e9d245cc547ffb5f6e8 Mon Sep 17 00:00:00 2001 From: dmchen Date: Tue, 12 Nov 2024 18:05:29 +0800 Subject: [PATCH 12/84] fix/set lastaction --- source/dnode/mnode/impl/src/mndTrans.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 247ee1ec79..02ec698686 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -453,10 +453,12 @@ static const char *mndTransTypeStr(ETrnAct actionType) { static void mndSetTransLastAction(STrans *pTrans, STransAction *pAction) { if (pAction != NULL) { - pTrans->lastAction = pAction->id; - pTrans->lastMsgType = pAction->msgType; - pTrans->lastEpset = pAction->epSet; - pTrans->lastErrorNo = pAction->errCode; + if (pAction->errCode != TSDB_CODE_ACTION_IN_PROGRESS) { + pTrans->lastAction = pAction->id; + pTrans->lastMsgType = pAction->msgType; + pTrans->lastEpset = pAction->epSet; + pTrans->lastErrorNo = pAction->errCode; + } } else { pTrans->lastAction = 0; pTrans->lastMsgType = 0; @@ -1335,7 +1337,8 @@ int32_t mndTransProcessRsp(SRpcMsg *pRsp) { pAction->msgReceived = 1; pAction->errCode = pRsp->code; pAction->endTime = taosGetTimestampMs(); - pTrans->lastErrorNo = pRsp->code; + // pTrans->lastErrorNo = pRsp->code; + mndSetTransLastAction(pTrans, pAction); mInfo("trans:%d, %s:%d response is received, received code:0x%x(%s), accept:0x%x(%s) retry:0x%x(%s)", transId, mndTransStr(pAction->stage), action, pRsp->code, tstrerror(pRsp->code), pAction->acceptableCode, @@ -1441,9 +1444,8 @@ static int32_t mndTransSendSingleMsg(SMnode *pMnode, STrans *pTrans, STransActio pAction->msgSent = 1; // pAction->msgReceived = 0; pAction->errCode = TSDB_CODE_ACTION_IN_PROGRESS; - if(pAction->startTime == 0){ - pAction->startTime = taosGetTimestampMs(); - } + pAction->startTime = taosGetTimestampMs(); + pAction->endTime = 0; mInfo("trans:%d, %s:%d is sent, %s", pTrans->id, mndTransStr(pAction->stage), pAction->id, detail); mndSetTransLastAction(pTrans, pAction); From 11be1b1803d1990d3b11d924630c5363b97d4074 Mon Sep 17 00:00:00 2001 From: dmchen Date: Wed, 13 Nov 2024 16:43:56 +0800 Subject: [PATCH 13/84] fix/add-balance-leader-case --- .../0-others/kill_balance_leader.py | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 tests/system-test/0-others/kill_balance_leader.py diff --git a/tests/system-test/0-others/kill_balance_leader.py b/tests/system-test/0-others/kill_balance_leader.py new file mode 100644 index 0000000000..be86336661 --- /dev/null +++ b/tests/system-test/0-others/kill_balance_leader.py @@ -0,0 +1,64 @@ +################################################################### +# Copyright (c) 2016 by TAOS Technologies, Inc. +# All rights reserved. +# +# This file is proprietary and confidential to TAOS Technologies. +# No part of this file may be reproduced, stored, transmitted, +# disclosed or used in any form or by any means other than as +# expressly provided by the written permission from Jianhui Tao +# +################################################################### + +# -*- coding: utf-8 -*- +from util.log import * +from util.cases import * +from util.dnodes import * +from util.sql import * + + + +class TDTestCase: + def init(self, conn, logSql, replicaVar=1): + tdLog.debug(f"start to init {__file__}") + self.replicaVar = int(replicaVar) + tdSql.init(conn.cursor(), logSql) + + def stop(self): + tdSql.close() + tdLog.success(f"{__file__} successfully executed") + + def run(self): + tdLog.debug(f"start to excute {__file__}") + + tdSql.execute('CREATE DATABASE db vgroups 160 replica 3;') + + tdSql.execute('balance vgroup leader') + + sql ="show transactions;" + rows = tdSql.query(sql) + + if rows > 0: + tranId = tdSql.getData(0, 0) + tdLog.info('kill transaction %d'%tranId) + tdSql.execute('kill transaction %d'%tranId, queryTimes=1 ) + + if self.waitTransactionZero() is False: + tdLog.exit(f"{sql} transaction not finished") + return False + + def waitTransactionZero(self, seconds = 300, interval = 1): + # wait end + for i in range(seconds): + sql ="show transactions;" + rows = tdSql.query(sql) + if rows == 0: + tdLog.info("transaction count became zero.") + return True + #tdLog.info(f"i={i} wait ...") + time.sleep(interval) + + return False + + +tdCases.addLinux(__file__, TDTestCase()) +tdCases.addWindows(__file__, TDTestCase()) \ No newline at end of file From 2e3f9c0922ca098dbdf608614a05c40f53131d8a Mon Sep 17 00:00:00 2001 From: dmchen Date: Wed, 13 Nov 2024 19:31:56 +0800 Subject: [PATCH 14/84] fix/add-kill-restore-case --- source/dnode/mnode/impl/src/mndTrans.c | 6 +- .../restore/kill_restore_dnode.py | 83 +++++++++++++++++++ .../3-enterprise/restore/restoreBasic.py | 28 +++++++ 3 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 tests/system-test/3-enterprise/restore/kill_restore_dnode.py diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 02ec698686..aff0c0353a 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -1599,8 +1599,9 @@ static int32_t mndTransExecuteActionsSerial(SMnode *pMnode, STrans *pTrans, SArr for (int32_t action = pTrans->actionPos; action < numOfActions; ++action) { STransAction *pAction = taosArrayGet(pActions, action); - mInfo("trans:%d, current action:%d, stage:%s, actionType(0:log,1:msg):%d", pTrans->id, pTrans->actionPos, - mndTransStr(pAction->stage), pAction->actionType); + mInfo("trans:%d, current action:%d, stage:%s, actionType:%s, msgSent:%d, msgReceived:%d", pTrans->id, + pTrans->actionPos, mndTransStr(pAction->stage), mndTransTypeStr(pAction->actionType), pAction->msgSent, + pAction->msgReceived); code = mndTransExecSingleAction(pMnode, pTrans, pAction, topHalf); if (code == 0) { @@ -2462,6 +2463,7 @@ static int32_t mndRetrieveTransDetail(SRpcMsg *pReq, SShowObj *pShow, SSDataBloc SArray *pActions = mndTransGetAction(pShowIter->pTrans, pShowIter->pTrans->stage); mndTransShowActions(pSdb, pShowIter, pShow, pBlock, rows, &numOfRows, pActions, taosArrayGetSize(pActions), 0); + break; } else { mInfo("retrieve trans detail from iter, id:%d, iterStage:%d, IterNum:%d", pShowIter->pTrans->id, pShowIter->stage, pShowIter->num); diff --git a/tests/system-test/3-enterprise/restore/kill_restore_dnode.py b/tests/system-test/3-enterprise/restore/kill_restore_dnode.py new file mode 100644 index 0000000000..69a7b7c216 --- /dev/null +++ b/tests/system-test/3-enterprise/restore/kill_restore_dnode.py @@ -0,0 +1,83 @@ +################################################################### +# Copyright (c) 2016 by TAOS Technologies, Inc. +# All rights reserved. +# +# This file is proprietary and confidential to TAOS Technologies. +# No part of this file may be reproduced, stored, transmitted, +# disclosed or used in any form or by any means other than as +# expressly provided by the written permission from Jianhui Tao +# +################################################################### + +# -*- coding: utf-8 -*- + +import sys + +from util.log import * +from util.cases import * +from util.sql import * +from util.common import * +sys.path.append("./3-enterprise/restore") +from restoreBasic import * +from util.common import tdCom +import threading + + +class TDTestCase: + # init + def init(self, conn, logSql, replicaVar=1): + tdLog.debug("start to execute %s" % __file__) + self.basic = RestoreBasic() + self.basic.init(conn, logSql, replicaVar) + + # run + def run(self): + self.basic.restore_dnode_prepare(2) + + self.execute() + + def execute(self): + newTdSql=tdCom.newTdSql() + t0 = threading.Thread(target=self.restoreDnodeThread, args=('', newTdSql)) + t0.start() + + time.sleep(2) + sql ="show transactions;" + tdLog.info(sql) + rows = tdSql.query(sql) + + if rows > 0: + self.basic.stop_dnode(2) + + tranId = tdSql.getData(0, 0) + tdLog.info('kill transaction %d'%tranId) + tdSql.execute('kill transaction %d'%tranId, queryTimes=1 ) + + time.sleep(3) + sql ="show transactions;" + tdLog.info(sql) + rows = tdSql.query(sql) + if rows > 0: + tdLog.info(f"{sql} transaction not finished") + return False + + self.basic.restore_dnode_exec(2) + else: + tdLog.exit(f"{sql} no transaction exist") + return False + + def restoreDnodeThread(self, p, newTdSql): + sleep(1) + + sql = f"restore dnode 2" + tdLog.info(sql) + newTdSql.error(sql, expectErrInfo="Wrong transaction execution context") + tdLog.info(f"{sql} finished") + + # stop + def stop(self): + self.basic.stop() + tdLog.success("%s successfully executed" % __file__) + +tdCases.addWindows(__file__, TDTestCase()) +tdCases.addLinux(__file__, TDTestCase()) \ No newline at end of file diff --git a/tests/system-test/3-enterprise/restore/restoreBasic.py b/tests/system-test/3-enterprise/restore/restoreBasic.py index 77fa606b9c..74cf572018 100644 --- a/tests/system-test/3-enterprise/restore/restoreBasic.py +++ b/tests/system-test/3-enterprise/restore/restoreBasic.py @@ -143,6 +143,34 @@ class RestoreBasic: tdSql.execute(sql) self.check_corrent() + def restore_dnode_prepare(self, index): + tdLog.info(f"start restore dnode {index}") + dnode = self.dnodes[index - 1] + + # stop dnode + tdLog.info(f"stop dnode {index}") + dnode.stoptaosd() + + # remove dnode folder + try: + shutil.rmtree(dnode.dataDir) + tdLog.info(f"delete dir {dnode.dataDir} successful") + except OSError as x: + tdLog.exit(f"remove path {dnode.dataDir} error : {x.strerror}") + + dnode.starttaosd() + + def restore_dnode_exec(self, index): + # exec restore + sql = f"restore dnode {index}" + tdLog.info(sql) + tdSql.execute(sql) + self.check_corrent() + + def stop_dnode(self, index): + dnode = self.dnodes[index - 1] + + dnode.starttaosd() # restore vnode def restore_vnode(self, index): tdLog.info(f"start restore vnode on dnode {index}") From ca8c1ea37799af7b7c7d70780a76d6475ff466a5 Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 14 Nov 2024 08:56:42 +0800 Subject: [PATCH 15/84] fix/showtransaction detial case --- .../system-test/3-enterprise/restore/kill_restore_dnode.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/system-test/3-enterprise/restore/kill_restore_dnode.py b/tests/system-test/3-enterprise/restore/kill_restore_dnode.py index 69a7b7c216..ed1c6c21fc 100644 --- a/tests/system-test/3-enterprise/restore/kill_restore_dnode.py +++ b/tests/system-test/3-enterprise/restore/kill_restore_dnode.py @@ -50,6 +50,13 @@ class TDTestCase: self.basic.stop_dnode(2) tranId = tdSql.getData(0, 0) + + tdLog.info('show transaction %d'%tranId) + rows=tdSql.query('show transaction %d'%tranId, queryTimes=1) + if rows != 13: + tdLog.exit(f"restore transaction detial error, rows={rows}") + return False + tdLog.info('kill transaction %d'%tranId) tdSql.execute('kill transaction %d'%tranId, queryTimes=1 ) From 8c14e3b12a172770b83ef01a625c918320158a9a Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 14 Nov 2024 12:10:16 +0800 Subject: [PATCH 16/84] fix/add-show-transaction-detail-case --- tests/parallel_test/cases.task | 1 + .../0-others/show_transaction_detail.py | 105 ++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 tests/system-test/0-others/show_transaction_detail.py diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index 151358aec3..885d74d3a8 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -369,6 +369,7 @@ ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/test_hot_refresh_configurations.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/subscribe_stream_privilege.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/empty_identifier.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/show_transaction_detail.py -N 3 ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/composite_primary_key_create.py ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/composite_primary_key_insert.py diff --git a/tests/system-test/0-others/show_transaction_detail.py b/tests/system-test/0-others/show_transaction_detail.py new file mode 100644 index 0000000000..7b61b29ce7 --- /dev/null +++ b/tests/system-test/0-others/show_transaction_detail.py @@ -0,0 +1,105 @@ +################################################################### +# Copyright (c) 2016 by TAOS Technologies, Inc. +# All rights reserved. +# +# This file is proprietary and confidential to TAOS Technologies. +# No part of this file may be reproduced, stored, transmitted, +# disclosed or used in any form or by any means other than as +# expressly provided by the written permission from Jianhui Tao +# +################################################################### + +# -*- coding: utf-8 -*- +from util.log import * +from util.cases import * +from util.dnodes import * +from util.sql import * +from util.cluster import * +import threading + +class TDTestCase: + def init(self, conn, logSql, replicaVar=1): + tdLog.debug(f"start to init {__file__}") + self.replicaVar = int(replicaVar) + tdSql.init(conn.cursor(), logSql) + self.dnodes = cluster.dnodes + + def stop(self): + tdSql.close() + tdLog.success(f"{__file__} successfully executed") + + def run(self): + tdLog.debug(f"start to excute {__file__}") + + tdLog.info("CREATE DATABASE db1 vgroups 16 replica 1;") + tdSql.execute('CREATE DATABASE db1 vgroups 16 replica 1;') + + if self.waitTransactionZero() is False: + tdLog.exit(f"{sql} transaction not finished") + return False + + newTdSql1=tdCom.newTdSql() + t1 = threading.Thread(target=self.alterDbThread, args=('', newTdSql1)) + + newTdSql2=tdCom.newTdSql() + t2 = threading.Thread(target=self.createDbThread, args=('', newTdSql2)) + + t1.start() + t2.start() + + dnode = self.dnodes[1] + + # stop dnode + tdLog.info(f"stop dnode 1") + dnode.stoptaosd() + + rows = tdSql.query("show transactions;") + if rows > 0: + tranId = tdSql.getData(0, 0) + tdLog.info(f"show transaction {tranId}") + rows = tdSql.query(f"show transaction {tranId}", queryTimes=1) + + if rows != 160: + tdLog.exit(f"restore transaction detial error, rows={rows}") + return False + + rows = tdSql.query("show transactions;") + if rows > 0: + tranId = tdSql.getData(1, 0) + tdLog.info(f"show transaction {tranId}") + rows = tdSql.query(f"show transaction {tranId}", queryTimes=1) + + if rows != 176: + tdLog.exit(f"restore transaction detial error, rows={rows}") + return False + + tdLog.info(f"select * from ins_transaction_details") + rows = tdSql.query(f"select * from information_schema.ins_transaction_details", queryTimes=1) + + if rows != 336: + tdLog.exit(f"restore transaction detial error, rows={rows}") + return False + + def createDbThread(self, sql, newTdSql): + tdLog.info("CREATE DATABASE db2 vgroups 160 replica 1;") + newTdSql.execute('CREATE DATABASE db2 vgroups 160 replica 1;') + + def alterDbThread(self, sql, newTdSql): + tdLog.info("alter DATABASE db1 replica 3;") + newTdSql.execute('alter DATABASE db1 replica 3;') + + def waitTransactionZero(self, seconds = 300, interval = 1): + # wait end + for i in range(seconds): + sql ="show transactions;" + rows = tdSql.query(sql) + if rows == 0: + tdLog.info("transaction count became zero.") + return True + #tdLog.info(f"i={i} wait ...") + time.sleep(interval) + + return False + +tdCases.addLinux(__file__, TDTestCase()) +tdCases.addWindows(__file__, TDTestCase()) \ No newline at end of file From 641816e973aa458e597ce22065e000890ff343ab Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 14 Nov 2024 16:03:20 +0800 Subject: [PATCH 17/84] fix/remove-alter-db-kill-mode --- source/dnode/mnode/impl/src/mndVgroup.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c index c237655182..7cc5922eb5 100644 --- a/source/dnode/mnode/impl/src/mndVgroup.c +++ b/source/dnode/mnode/impl/src/mndVgroup.c @@ -2753,7 +2753,6 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb mndTransSetSerial(pTrans); if (pNewDb->cfg.replications == 3) { - mndTransSetKillMode(pTrans, TRN_KILL_MODE_INTERUPT); mInfo("db:%s, vgId:%d, will add 2 vnodes, vn:0 dnode:%d", pVgroup->dbName, pVgroup->vgId, pVgroup->vnodeGid[0].dnodeId); @@ -2794,7 +2793,6 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb TAOS_CHECK_RETURN(mndAddAlterVnodeConfirmAction(pMnode, pTrans, pNewDb, pNewVgroup)); } else if (pNewDb->cfg.replications == 1) { - mndTransSetKillMode(pTrans, TRN_KILL_MODE_INTERUPT); mInfo("db:%s, vgId:%d, will remove 2 vnodes, vn:0 dnode:%d vn:1 dnode:%d vn:2 dnode:%d", pVgroup->dbName, pVgroup->vgId, pVgroup->vnodeGid[0].dnodeId, pVgroup->vnodeGid[1].dnodeId, pVgroup->vnodeGid[2].dnodeId); From ce86b1d6875ba04db94ca1630716f09d98f42169 Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 16 Dec 2024 16:30:09 +0800 Subject: [PATCH 18/84] change show transtion detial timestamp --- source/dnode/mnode/impl/src/mndTrans.c | 52 ++++++++++++++----- tests/parallel_test/cases.task | 2 + .../0-others/show_transaction_detail.py | 4 +- 3 files changed, 44 insertions(+), 14 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index bbdb510344..621493c0d3 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -14,15 +14,16 @@ */ #define _DEFAULT_SOURCE +#include "mndTrans.h" #include "mndDb.h" #include "mndPrivilege.h" #include "mndShow.h" #include "mndStb.h" #include "mndSubscribe.h" #include "mndSync.h" -#include "mndTrans.h" #include "mndUser.h" #include "mndVgroup.h" +#include "osTime.h" #define TRANS_VER1_NUMBER 1 #define TRANS_VER2_NUMBER 2 @@ -2090,6 +2091,35 @@ void mndTransPullup(SMnode *pMnode) { taosArrayDestroy(pArray); } +static char *formatTimestamp(char *buf, int64_t val, int precision) { + time_t tt; + if (precision == TSDB_TIME_PRECISION_MICRO) { + tt = (time_t)(val / 1000000); + } + if (precision == TSDB_TIME_PRECISION_NANO) { + tt = (time_t)(val / 1000000000); + } else { + tt = (time_t)(val / 1000); + } + + struct tm tm; + if (taosLocalTime(&tt, &tm, NULL, 0, NULL) == NULL) { + mError("failed to get local time"); + return NULL; + } + size_t pos = taosStrfTime(buf, 32, "%Y-%m-%d %H:%M:%S", &tm); + + if (precision == TSDB_TIME_PRECISION_MICRO) { + sprintf(buf + pos, ".%06d", (int)(val % 1000000)); + } else if (precision == TSDB_TIME_PRECISION_NANO) { + sprintf(buf + pos, ".%09d", (int)(val % 1000000000)); + } else { + sprintf(buf + pos, ".%03d", (int)(val % 1000)); + } + + return buf; +} + static void mndTransLogAction(STrans *pTrans) { char detail[512] = {0}; int32_t len = 0; @@ -2112,10 +2142,10 @@ static void mndTransLogAction(STrans *pTrans) { STransAction *pAction = taosArrayGet(pTrans->redoActions, i); if (pAction->actionType == TRANS_ACTION_MSG) { char bufStart[40] = {0}; - taosFormatUtcTime(bufStart, sizeof(bufStart), pAction->startTime, TSDB_TIME_PRECISION_MILLI); + (void)formatTimestamp(bufStart, pAction->startTime, TSDB_TIME_PRECISION_MILLI); char endStart[40] = {0}; - taosFormatUtcTime(endStart, sizeof(endStart), pAction->endTime, TSDB_TIME_PRECISION_MILLI); + (void)formatTimestamp(endStart, pAction->endTime, TSDB_TIME_PRECISION_MILLI); len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d msgType:%s," "sent:%d, received:%d, startTime:%s, endTime:%s, ", @@ -2215,13 +2245,13 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl char killableVstr[10 + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(killableVstr, killableStr, 24); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - colDataSetVal(pColInfo, numOfRows, (const char *)killableVstr, false); + RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)killableVstr, false), pTrans, &lino, _OVER); const char *killModeStr = pTrans->killMode == TRN_KILL_MODE_SKIP ? "skip" : "interrupt"; char killModeVstr[10 + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(killModeVstr, killModeStr, 24); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - colDataSetVal(pColInfo, numOfRows, (const char *)killModeVstr, false); + RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)killModeVstr, false), pTrans, &lino, _OVER); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pTrans->failedTimes, false), pTrans, &lino, @@ -2286,8 +2316,8 @@ _OVER: return code; } -static int32_t mndShowTransAction(SShowObj *pShow, SSDataBlock *pBlock, STransAction *pAction, int32_t transactionId, - int32_t curActionId, int32_t rows, int32_t numOfRows) { +static void mndShowTransAction(SShowObj *pShow, SSDataBlock *pBlock, STransAction *pAction, int32_t transactionId, + int32_t curActionId, int32_t rows, int32_t numOfRows) { int32_t code = 0; int32_t lino = 0; int32_t len = 0; @@ -2295,7 +2325,7 @@ static int32_t mndShowTransAction(SShowObj *pShow, SSDataBlock *pBlock, STransAc cols = 0; - mndShowTransCommonColumns(pShow, pBlock, pAction, transactionId, curActionId, numOfRows, &cols); + if (mndShowTransCommonColumns(pShow, pBlock, pAction, transactionId, curActionId, numOfRows, &cols) != 0) return; if (pAction->actionType == TRANS_ACTION_MSG) { int32_t len = 0; @@ -2334,10 +2364,9 @@ static int32_t mndShowTransAction(SShowObj *pShow, SSDataBlock *pBlock, STransAc char detail[TSDB_TRANS_DETAIL_LEN] = {0}; len = 0; char bufStart[40] = {0}; - if (pAction->startTime > 0) - taosFormatUtcTime(bufStart, sizeof(bufStart), pAction->startTime, TSDB_TIME_PRECISION_MILLI); + if (pAction->startTime > 0) (void)formatTimestamp(bufStart, pAction->startTime, TSDB_TIME_PRECISION_MILLI); char bufEnd[40] = {0}; - if (pAction->endTime > 0) taosFormatUtcTime(bufEnd, sizeof(bufEnd), pAction->endTime, TSDB_TIME_PRECISION_MILLI); + if (pAction->endTime > 0) (void)formatTimestamp(bufEnd, pAction->endTime, TSDB_TIME_PRECISION_MILLI); len += snprintf(detail + len, sizeof(detail) - len, "startTime:%s, endTime:%s, ", bufStart, bufEnd); char detailVStr[TSDB_TRANS_DETAIL_LEN + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(detailVStr, detail, pShow->pMeta->pSchemas[cols].bytes); @@ -2386,7 +2415,6 @@ static int32_t mndShowTransAction(SShowObj *pShow, SSDataBlock *pBlock, STransAc _OVER: if (code != 0) mError("failed to retrieve at line:%d, since %s", lino, tstrerror(code)); - return code; } static SArray *mndTransGetAction(STrans *pTrans, ETrnStage stage) { diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index 01d7db54ae..f07e2d55fd 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -399,6 +399,8 @@ ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/subscribe_stream_privilege.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/empty_identifier.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/show_transaction_detail.py -N 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/kill_balance_leader.py -N 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/kill_restore_dnode.py -N 3 ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/persisit_config.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/qmemCtrl.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/compact_vgroups.py diff --git a/tests/system-test/0-others/show_transaction_detail.py b/tests/system-test/0-others/show_transaction_detail.py index 7b61b29ce7..fda1eaacb9 100644 --- a/tests/system-test/0-others/show_transaction_detail.py +++ b/tests/system-test/0-others/show_transaction_detail.py @@ -59,7 +59,7 @@ class TDTestCase: tdLog.info(f"show transaction {tranId}") rows = tdSql.query(f"show transaction {tranId}", queryTimes=1) - if rows != 160: + if rows != 160 and rows != 176: tdLog.exit(f"restore transaction detial error, rows={rows}") return False @@ -69,7 +69,7 @@ class TDTestCase: tdLog.info(f"show transaction {tranId}") rows = tdSql.query(f"show transaction {tranId}", queryTimes=1) - if rows != 176: + if rows != 176 and rows != 160: tdLog.exit(f"restore transaction detial error, rows={rows}") return False From 4b6eec21f42f93a4bcc619b0157024af809022a1 Mon Sep 17 00:00:00 2001 From: dmchen Date: Tue, 17 Dec 2024 09:54:54 +0800 Subject: [PATCH 19/84] enh/TD-29974-improve-trans-fix-case --- source/dnode/mnode/impl/src/mndDb.c | 2 +- source/dnode/mnode/impl/src/mndTrans.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index 1d2b2c262b..17659f9d92 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -1017,7 +1017,7 @@ static int32_t mndProcessCreateDbReq(SRpcMsg *pReq) { TAOS_CHECK_GOTO(mndAcquireUser(pMnode, pReq->info.conn.user, &pUser), &lino, _OVER); TAOS_CHECK_GOTO(mndCreateDb(pMnode, pReq, &createReq, pUser, dnodeList), &lino, _OVER); - //if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS; + if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS; SName name = {0}; if (tNameFromString(&name, createReq.db, T_NAME_ACCT | T_NAME_DB) < 0) diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 621493c0d3..6992a0708e 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -1333,6 +1333,7 @@ int32_t mndTransProcessRsp(SRpcMsg *pRsp) { pAction->msgReceived = 1; pAction->errCode = pRsp->code; pAction->endTime = taosGetTimestampMs(); + // pTrans->lastErrorNo = pRsp->code; mndSetTransLastAction(pTrans, pAction); From 26507e6faa956fa23ee2eb539c6a517ea9928b21 Mon Sep 17 00:00:00 2001 From: dmchen Date: Tue, 17 Dec 2024 11:32:38 +0800 Subject: [PATCH 20/84] enh/TD-29974-improve-trans-fix-case --- docs/en/08-operation/04-maintenance.md | 2 +- docs/en/14-reference/03-taos-sql/24-show.md | 3 ++- docs/zh/08-operation/04-maintenance.md | 2 +- docs/zh/14-reference/03-taos-sql/24-show.md | 3 ++- source/common/src/systable.c | 2 +- source/dnode/mnode/impl/src/mndTrans.c | 21 ++++++++----------- .../develop-test/2-query/table_count_scan.py | 16 +++++++------- tests/script/tsim/query/sys_tbname.sim | 2 +- tests/script/tsim/query/tableCount.sim | 6 +++--- .../0-others/information_schema.py | 6 +++--- tests/system-test/2-query/union.py | 2 +- 11 files changed, 32 insertions(+), 33 deletions(-) diff --git a/docs/en/08-operation/04-maintenance.md b/docs/en/08-operation/04-maintenance.md index 970ee40d18..2f6afbf9df 100644 --- a/docs/en/08-operation/04-maintenance.md +++ b/docs/en/08-operation/04-maintenance.md @@ -17,7 +17,7 @@ TDengine is designed for various writing scenarios, and many of these scenarios ```sql COMPACT DATABASE db_name [start with 'XXXX'] [end with 'YYYY']; -SHOW COMPACTS [compact_id]; +SHOW COMPACT [compact_id]; KILL COMPACT compact_id; ``` diff --git a/docs/en/14-reference/03-taos-sql/24-show.md b/docs/en/14-reference/03-taos-sql/24-show.md index 36c20df0b4..b46fb41fa0 100644 --- a/docs/en/14-reference/03-taos-sql/24-show.md +++ b/docs/en/14-reference/03-taos-sql/24-show.md @@ -304,9 +304,10 @@ Displays information about all topics in the current database. ```sql SHOW TRANSACTIONS; +SHOW TRANSACTION [tranaction_id]; ``` -Displays information about transactions currently being executed in the system (these transactions are only for metadata level, not for regular tables). +Displays information about one of or all transaction(s) currently being executed in the system (these transactions are only for metadata level, not for regular tables). ## SHOW USERS diff --git a/docs/zh/08-operation/04-maintenance.md b/docs/zh/08-operation/04-maintenance.md index 9ef165179d..429542485d 100644 --- a/docs/zh/08-operation/04-maintenance.md +++ b/docs/zh/08-operation/04-maintenance.md @@ -19,7 +19,7 @@ TDengine 面向多种写入场景,而很多写入场景下,TDengine 的存 ```SQL COMPACT DATABASE db_name [start with 'XXXX'] [end with 'YYYY']; COMPACT [db_name.]VGROUPS IN (vgroup_id1, vgroup_id2, ...) [start with 'XXXX'] [end with 'YYYY']; -SHOW COMPACTS [compact_id]; +SHOW COMPACT [compact_id]; KILL COMPACT compact_id; ``` diff --git a/docs/zh/14-reference/03-taos-sql/24-show.md b/docs/zh/14-reference/03-taos-sql/24-show.md index 110c9cee6e..81f891531f 100644 --- a/docs/zh/14-reference/03-taos-sql/24-show.md +++ b/docs/zh/14-reference/03-taos-sql/24-show.md @@ -306,9 +306,10 @@ SHOW TOPICS; ```sql SHOW TRANSACTIONS; +SHOW TRANSACTION [tranaction_id]; ``` -显示当前系统中正在执行的事务的信息(该事务仅针对除普通表以外的元数据级别) +显示当前系统中正在执行的所有或者某一个事务的信息(该事务仅针对除普通表以外的元数据级别) ## SHOW USERS diff --git a/source/common/src/systable.c b/source/common/src/systable.c index aabf204cd7..38dce105bb 100644 --- a/source/common/src/systable.c +++ b/source/common/src/systable.c @@ -315,7 +315,7 @@ static const SSysDbTableSchema transSchema[] = { {.name = "db", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, {.name = "stable", .bytes = SYSTABLE_SCH_TABLE_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, {.name = "killable", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "kill_mnode", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, + //{.name = "kill_mnode", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, {.name = "failed_times", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, {.name = "last_exec_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = false}, {.name = "last_action_info", .bytes = (TSDB_TRANS_ERROR_LEN - 1) + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 6992a0708e..bc13fafc33 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -27,9 +27,8 @@ #define TRANS_VER1_NUMBER 1 #define TRANS_VER2_NUMBER 2 -#define TRANS_VER3_NUMBER 3 #define TRANS_ARRAY_SIZE 8 -#define TRANS_RESERVE_SIZE 44 +#define TRANS_RESERVE_SIZE 42 static int32_t mndTransActionInsert(SSdb *pSdb, STrans *pTrans); static int32_t mndTransActionUpdate(SSdb *pSdb, STrans *OldTrans, STrans *pOld); @@ -160,7 +159,7 @@ SSdbRaw *mndTransEncode(STrans *pTrans) { int32_t code = 0; int32_t lino = 0; terrno = TSDB_CODE_INVALID_MSG; - int8_t sver = TRANS_VER3_NUMBER; + int8_t sver = TRANS_VER2_NUMBER; int32_t rawDataLen = sizeof(STrans) + TRANS_RESERVE_SIZE + pTrans->paramLen; rawDataLen += mndTransGetActionsSize(pTrans->prepareActions); @@ -319,7 +318,7 @@ SSdbRow *mndTransDecode(SSdbRaw *pRaw) { if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER; - if (sver > TRANS_VER3_NUMBER) { + if (sver > TRANS_VER2_NUMBER) { terrno = TSDB_CODE_SDB_INVALID_DATA_VER; goto _OVER; } @@ -398,14 +397,12 @@ SSdbRow *mndTransDecode(SSdbRaw *pRaw) { if ((terrno = taosHashPut(pTrans->arbGroupIds, &arbGroupId, sizeof(int32_t), NULL, 0)) != 0) goto _OVER; } - if (sver > TRANS_VER2_NUMBER) { - int8_t ableKill = 0; - int8_t killMode = 0; - SDB_GET_INT8(pRaw, dataPos, &ableKill, _OVER) - SDB_GET_INT8(pRaw, dataPos, &killMode, _OVER) - pTrans->ableToBeKilled = ableKill; - pTrans->killMode = killMode; - } + int8_t ableKill = 0; + int8_t killMode = 0; + SDB_GET_INT8(pRaw, dataPos, &ableKill, _OVER) + SDB_GET_INT8(pRaw, dataPos, &killMode, _OVER) + pTrans->ableToBeKilled = ableKill; + pTrans->killMode = killMode; SDB_GET_RESERVE(pRaw, dataPos, TRANS_RESERVE_SIZE, _OVER) diff --git a/tests/develop-test/2-query/table_count_scan.py b/tests/develop-test/2-query/table_count_scan.py index 9725c36bee..b5c6140481 100644 --- a/tests/develop-test/2-query/table_count_scan.py +++ b/tests/develop-test/2-query/table_count_scan.py @@ -68,7 +68,7 @@ class TDTestCase: for i in range(0, 3): db_name = tdSql.getData(i, 1) if db_name == 'information_schema': - tdSql.checkData(i, 0, 36) + tdSql.checkData(i, 0, 37) tdSql.checkData(i, 2, None) elif db_name == 'performance_schema': tdSql.checkData(i, 0, 5) @@ -81,7 +81,7 @@ class TDTestCase: tdSql.query('select count(1) v,db_name, stable_name from information_schema.ins_tables group by db_name, stable_name order by v desc;') tdSql.checkRows(3) - tdSql.checkData(0, 0, 36) + tdSql.checkData(0, 0, 37) tdSql.checkData(0, 1, 'information_schema') tdSql.checkData(0, 2, None) tdSql.checkData(1, 0, 5) @@ -97,7 +97,7 @@ class TDTestCase: tdSql.checkData(1, 1, 'performance_schema') tdSql.checkData(0, 0, 3) tdSql.checkData(0, 1, 'tbl_count') - tdSql.checkData(2, 0, 36) + tdSql.checkData(2, 0, 37) tdSql.checkData(2, 1, 'information_schema') tdSql.query("select count(*) from information_schema.ins_tables where db_name='tbl_count'") @@ -110,7 +110,7 @@ class TDTestCase: tdSql.query('select count(*) from information_schema.ins_tables') tdSql.checkRows(1) - tdSql.checkData(0, 0, 44) + tdSql.checkData(0, 0, 45) tdSql.execute('create table stba (ts timestamp, c1 bool, c2 tinyint, c3 smallint, c4 int, c5 bigint, c6 float, c7 double, c8 binary(10), c9 nchar(10), c10 tinyint unsigned, c11 smallint unsigned, c12 int unsigned, c13 bigint unsigned) TAGS(t1 int, t2 binary(10), t3 double);') @@ -193,7 +193,7 @@ class TDTestCase: tdSql.checkData(2, 0, 5) tdSql.checkData(2, 1, 'performance_schema') tdSql.checkData(2, 2, None) - tdSql.checkData(3, 0, 36) + tdSql.checkData(3, 0, 37) tdSql.checkData(3, 1, 'information_schema') tdSql.checkData(3, 2, None) @@ -208,7 +208,7 @@ class TDTestCase: tdSql.checkData(2, 0, 5) tdSql.checkData(2, 1, 'performance_schema') tdSql.checkData(2, 2, None) - tdSql.checkData(3, 0, 36) + tdSql.checkData(3, 0, 37) tdSql.checkData(3, 1, 'information_schema') tdSql.checkData(3, 2, None) @@ -219,7 +219,7 @@ class TDTestCase: tdSql.checkData(0, 1, 'tbl_count') tdSql.checkData(1, 0, 5) tdSql.checkData(1, 1, 'performance_schema') - tdSql.checkData(2, 0, 36) + tdSql.checkData(2, 0, 37) tdSql.checkData(2, 1, 'information_schema') tdSql.query("select count(*) from information_schema.ins_tables where db_name='tbl_count'") @@ -232,7 +232,7 @@ class TDTestCase: tdSql.query('select count(*) from information_schema.ins_tables') tdSql.checkRows(1) - tdSql.checkData(0, 0, 45) + tdSql.checkData(0, 0, 46) tdSql.execute('drop database tbl_count') diff --git a/tests/script/tsim/query/sys_tbname.sim b/tests/script/tsim/query/sys_tbname.sim index f8c1d6a986..c6c979e97c 100644 --- a/tests/script/tsim/query/sys_tbname.sim +++ b/tests/script/tsim/query/sys_tbname.sim @@ -58,7 +58,7 @@ endi sql select tbname from information_schema.ins_tables; print $rows $data00 -if $rows != 45 then +if $rows != 46 then return -1 endi if $data00 != @ins_tables@ then diff --git a/tests/script/tsim/query/tableCount.sim b/tests/script/tsim/query/tableCount.sim index 49e9126361..19568b42b6 100644 --- a/tests/script/tsim/query/tableCount.sim +++ b/tests/script/tsim/query/tableCount.sim @@ -53,7 +53,7 @@ sql select stable_name,count(table_name) from information_schema.ins_tables grou if $rows != 3 then return -1 endi -if $data01 != 42 then +if $data01 != 43 then return -1 endi if $data11 != 10 then @@ -72,7 +72,7 @@ endi if $data11 != 5 then return -1 endi -if $data21 != 36 then +if $data21 != 37 then return -1 endi if $data31 != 5 then @@ -97,7 +97,7 @@ endi if $data42 != 3 then return -1 endi -if $data52 != 36 then +if $data52 != 37 then return -1 endi if $data62 != 5 then diff --git a/tests/system-test/0-others/information_schema.py b/tests/system-test/0-others/information_schema.py index af0dd6d949..8c25b70b76 100644 --- a/tests/system-test/0-others/information_schema.py +++ b/tests/system-test/0-others/information_schema.py @@ -61,7 +61,7 @@ class TDTestCase: self.ins_list = ['ins_dnodes','ins_mnodes','ins_qnodes','ins_snodes','ins_cluster','ins_databases','ins_functions',\ 'ins_indexes','ins_stables','ins_tables','ins_tags','ins_columns','ins_users','ins_grants','ins_vgroups','ins_configs','ins_dnode_variables',\ 'ins_topics','ins_subscriptions','ins_streams','ins_stream_tasks','ins_vnodes','ins_user_privileges','ins_views', - 'ins_compacts', 'ins_compact_details', 'ins_grants_full','ins_grants_logs', 'ins_machines', 'ins_arbgroups', 'ins_tsmas', "ins_encryptions", "ins_anodes", "ins_anodes_full", "ins_disk_usagea", "ins_filesets"] + 'ins_compacts', 'ins_compact_details', 'ins_grants_full','ins_grants_logs', 'ins_machines', 'ins_arbgroups', 'ins_tsmas', "ins_encryptions", "ins_anodes", "ins_anodes_full", "ins_disk_usagea", "ins_filesets", "ins_transaction_details"] self.perf_list = ['perf_connections','perf_queries','perf_consumers','perf_trans','perf_apps'] def insert_data(self,column_dict,tbname,row_num): insert_sql = self.setsql.set_insertsql(column_dict,tbname,self.binary_str,self.nchar_str) @@ -222,10 +222,10 @@ class TDTestCase: tdSql.query("select * from information_schema.ins_columns where db_name ='information_schema'") tdLog.info(len(tdSql.queryResult)) - tdSql.checkEqual(True, len(tdSql.queryResult) in range(303, 304)) + tdSql.checkEqual(True, len(tdSql.queryResult) in range(309, 310)) tdSql.query("select * from information_schema.ins_columns where db_name ='performance_schema'") - tdSql.checkEqual(60, len(tdSql.queryResult)) + tdSql.checkEqual(61, len(tdSql.queryResult)) def ins_dnodes_check(self): tdSql.execute('drop database if exists db2') diff --git a/tests/system-test/2-query/union.py b/tests/system-test/2-query/union.py index a6cccb8aaa..98106e9a17 100644 --- a/tests/system-test/2-query/union.py +++ b/tests/system-test/2-query/union.py @@ -434,7 +434,7 @@ class TDTestCase: tdSql.checkRows(2) sql = "select db_name `TABLE_CAT`, '' `TABLE_SCHEM`, stable_name `TABLE_NAME`, 'TABLE' `TABLE_TYPE`, table_comment `REMARKS` from information_schema.ins_stables union all select db_name `TABLE_CAT`, '' `TABLE_SCHEM`, table_name `TABLE_NAME`, case when `type`='SYSTEM_TABLE' then 'TABLE' when `type`='NORMAL_TABLE' then 'TABLE' when `type`='CHILD_TABLE' then 'TABLE' else 'UNKNOWN' end `TABLE_TYPE`, table_comment `REMARKS` from information_schema.ins_tables union all select db_name `TABLE_CAT`, '' `TABLE_SCHEM`, view_name `TABLE_NAME`, 'VIEW' `TABLE_TYPE`, NULL `REMARKS` from information_schema.ins_views" tdSql.query(sql, queryTimes=1) - tdSql.checkRows(49) + tdSql.checkRows(50) def stop(self): tdSql.close() From fead1a98eaa0ff56ed7aabb2d5d2e93862b4c95f Mon Sep 17 00:00:00 2001 From: dmchen Date: Tue, 17 Dec 2024 11:37:13 +0800 Subject: [PATCH 21/84] enh/TD-29974-improve-trans-fix-case --- tests/parallel_test/cases.task | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index f07e2d55fd..b43cf5b9ae 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -400,7 +400,7 @@ ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/empty_identifier.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/show_transaction_detail.py -N 3 ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/kill_balance_leader.py -N 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/kill_restore_dnode.py -N 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 3-enterprise/restore/kill_restore_dnode.py -N 3 ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/persisit_config.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/qmemCtrl.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/compact_vgroups.py From 134d593458e84bb3babb6d3e885c46ee69450224 Mon Sep 17 00:00:00 2001 From: dmchen Date: Tue, 17 Dec 2024 14:23:44 +0800 Subject: [PATCH 22/84] enh/TD-29974-improve-trans-fix-case --- source/dnode/mnode/impl/src/mndTrans.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index bc13fafc33..21a9c28830 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -2245,11 +2245,13 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)killableVstr, false), pTrans, &lino, _OVER); + /* const char *killModeStr = pTrans->killMode == TRN_KILL_MODE_SKIP ? "skip" : "interrupt"; char killModeVstr[10 + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(killModeVstr, killModeStr, 24); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)killModeVstr, false), pTrans, &lino, _OVER); + */ pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pTrans->failedTimes, false), pTrans, &lino, @@ -2259,6 +2261,7 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pTrans->lastExecTime, false), pTrans, &lino, _OVER); + char lastInfo[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; char detail[TSDB_TRANS_ERROR_LEN + 1] = {0}; int32_t len = tsnprintf(detail, sizeof(detail), "action:%d code:0x%x(%s) ", pTrans->lastAction, pTrans->lastErrorNo & 0xFFFF, tstrerror(pTrans->lastErrorNo)); @@ -2267,11 +2270,9 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl len += tsnprintf(detail + len, sizeof(detail) - len, "msgType:%s numOfEps:%d inUse:%d ", TMSG_INFO(pTrans->lastMsgType), epset.numOfEps, epset.inUse); for (int32_t i = 0; i < pTrans->lastEpset.numOfEps; ++i) { - len += snprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u \n", i, epset.eps[i].fqdn, epset.eps[i].port); + len += snprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u ", i, epset.eps[i].fqdn, epset.eps[i].port); } } - - char lastInfo[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; STR_WITH_MAXSIZE_TO_VARSTR(lastInfo, detail, pShow->pMeta->pSchemas[cols].bytes); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)lastInfo, false), pTrans, &lino, _OVER); From a82be9b9f99b9bf2df47203f7ba72f99e18aa3d7 Mon Sep 17 00:00:00 2001 From: kailixu Date: Tue, 17 Dec 2024 07:08:46 +0000 Subject: [PATCH 23/84] enh: memory safe function --- include/libs/crypt/crypt.h | 2 +- source/dnode/mgmt/mgmt_vnode/src/vmHandle.c | 2 +- source/dnode/vnode/inc/vnode.h | 2 +- source/dnode/vnode/src/vnd/vnodeCfg.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/libs/crypt/crypt.h b/include/libs/crypt/crypt.h index 5f981b7ac8..78753874bd 100644 --- a/include/libs/crypt/crypt.h +++ b/include/libs/crypt/crypt.h @@ -26,7 +26,7 @@ typedef struct SCryptOpts { char* source; char* result; int32_t unitLen; - char key[17]; + char key[ENCRYPT_KEY_LEN + 1]; } SCryptOpts; int32_t CBC_Decrypt(SCryptOpts* opts); diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c index 83043b4393..0f0dbfb3f1 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c @@ -211,7 +211,7 @@ static void vmGenerateVnodeCfg(SCreateVnodeReq *pCreate, SVnodeCfg *pCfg) { #if defined(TD_ENTERPRISE) pCfg->tdbEncryptAlgorithm = pCreate->encryptAlgorithm; if (pCfg->tdbEncryptAlgorithm == DND_CA_SM4) { - tstrncpy(pCfg->tdbEncryptKey, tsEncryptKey, ENCRYPT_KEY_LEN); + tstrncpy(pCfg->tdbEncryptKey, tsEncryptKey, ENCRYPT_KEY_LEN + 1); } #else pCfg->tdbEncryptAlgorithm = 0; diff --git a/source/dnode/vnode/inc/vnode.h b/source/dnode/vnode/inc/vnode.h index 5d4ffc604a..f4a678e629 100644 --- a/source/dnode/vnode/inc/vnode.h +++ b/source/dnode/vnode/inc/vnode.h @@ -327,7 +327,7 @@ struct SVnodeCfg { int16_t hashSuffix; int32_t tsdbPageSize; int32_t tdbEncryptAlgorithm; - char tdbEncryptKey[ENCRYPT_KEY_LEN]; + char tdbEncryptKey[ENCRYPT_KEY_LEN + 1]; int32_t s3ChunkSize; int32_t s3KeepLocal; int8_t s3Compact; diff --git a/source/dnode/vnode/src/vnd/vnodeCfg.c b/source/dnode/vnode/src/vnd/vnodeCfg.c index 9c153bc8a1..653f525e09 100644 --- a/source/dnode/vnode/src/vnd/vnodeCfg.c +++ b/source/dnode/vnode/src/vnd/vnodeCfg.c @@ -303,7 +303,7 @@ int vnodeDecodeConfig(const SJson *pJson, void *pObj) { if (tsEncryptKey[0] == 0) { return terrno = TSDB_CODE_DNODE_INVALID_ENCRYPTKEY; } else { - tstrncpy(pCfg->tdbEncryptKey, tsEncryptKey, ENCRYPT_KEY_LEN); + tstrncpy(pCfg->tdbEncryptKey, tsEncryptKey, ENCRYPT_KEY_LEN + 1); } } #endif From 2d29f5ac7d8fcc50c4ce2d2b9f8906943b87e30d Mon Sep 17 00:00:00 2001 From: dmchen Date: Tue, 17 Dec 2024 17:48:33 +0800 Subject: [PATCH 24/84] enh/TD-29974-improve-trans-fix-case --- .../0-others/show_transaction_detail.py | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/tests/system-test/0-others/show_transaction_detail.py b/tests/system-test/0-others/show_transaction_detail.py index fda1eaacb9..13ef8f6316 100644 --- a/tests/system-test/0-others/show_transaction_detail.py +++ b/tests/system-test/0-others/show_transaction_detail.py @@ -47,28 +47,32 @@ class TDTestCase: t1.start() t2.start() - dnode = self.dnodes[1] + #time.sleep(1) + + dnode = self.dnodes[2] # stop dnode - tdLog.info(f"stop dnode 1") + tdLog.info(f"stop dnode 2") dnode.stoptaosd() - rows = tdSql.query("show transactions;") + tdLog.info(f"show transactions;") + rows = tdSql.query("show transactions;", queryTimes=1) + tdLog.info(f"rows={rows}") if rows > 0: - tranId = tdSql.getData(0, 0) - tdLog.info(f"show transaction {tranId}") - rows = tdSql.query(f"show transaction {tranId}", queryTimes=1) + tranId1 = tdSql.getData(0, 0) + oper1 = tdSql.getData(0, 3) + tdLog.info(f"show transaction {tranId1}, {oper1}") + tranId2 = tdSql.getData(1, 0) + oper2 = tdSql.getData(1, 3) + tdLog.info(f"show transaction {tranId2}, {oper2}") + + rows = tdSql.query(f"show transaction {tranId1}", queryTimes=1) if rows != 160 and rows != 176: tdLog.exit(f"restore transaction detial error, rows={rows}") return False - rows = tdSql.query("show transactions;") - if rows > 0: - tranId = tdSql.getData(1, 0) - tdLog.info(f"show transaction {tranId}") - rows = tdSql.query(f"show transaction {tranId}", queryTimes=1) - + rows = tdSql.query(f"show transaction {tranId2}", queryTimes=1) if rows != 176 and rows != 160: tdLog.exit(f"restore transaction detial error, rows={rows}") return False @@ -81,12 +85,12 @@ class TDTestCase: return False def createDbThread(self, sql, newTdSql): - tdLog.info("CREATE DATABASE db2 vgroups 160 replica 1;") - newTdSql.execute('CREATE DATABASE db2 vgroups 160 replica 1;') + tdLog.info("CREATE DATABASE db2 vgroups 160 replica 3;") + newTdSql.execute('CREATE DATABASE db2 vgroups 160 replica 3;', queryTimes=1) def alterDbThread(self, sql, newTdSql): tdLog.info("alter DATABASE db1 replica 3;") - newTdSql.execute('alter DATABASE db1 replica 3;') + newTdSql.execute('alter DATABASE db1 replica 3;', queryTimes=1) def waitTransactionZero(self, seconds = 300, interval = 1): # wait end From 344c51fcc7506110f14c94cb782a337131a6f127 Mon Sep 17 00:00:00 2001 From: dmchen Date: Tue, 17 Dec 2024 10:00:33 +0000 Subject: [PATCH 25/84] enh/TD-29974-improve-trans-fix-case --- .../0-others/show_transaction_detail.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/system-test/0-others/show_transaction_detail.py b/tests/system-test/0-others/show_transaction_detail.py index 13ef8f6316..ec8ebcaef2 100644 --- a/tests/system-test/0-others/show_transaction_detail.py +++ b/tests/system-test/0-others/show_transaction_detail.py @@ -68,25 +68,25 @@ class TDTestCase: tdLog.info(f"show transaction {tranId2}, {oper2}") rows = tdSql.query(f"show transaction {tranId1}", queryTimes=1) - if rows != 160 and rows != 176: - tdLog.exit(f"restore transaction detial error, rows={rows}") + if rows != 120 and rows != 176: + tdLog.exit(f"show transaction detial error, rows={rows}") return False rows = tdSql.query(f"show transaction {tranId2}", queryTimes=1) - if rows != 176 and rows != 160: - tdLog.exit(f"restore transaction detial error, rows={rows}") + if rows != 176 and rows != 120: + tdLog.exit(f"show transaction detial error, rows={rows}") return False tdLog.info(f"select * from ins_transaction_details") rows = tdSql.query(f"select * from information_schema.ins_transaction_details", queryTimes=1) - if rows != 336: + if rows != 296: tdLog.exit(f"restore transaction detial error, rows={rows}") return False def createDbThread(self, sql, newTdSql): - tdLog.info("CREATE DATABASE db2 vgroups 160 replica 3;") - newTdSql.execute('CREATE DATABASE db2 vgroups 160 replica 3;', queryTimes=1) + tdLog.info("CREATE DATABASE db2 vgroups 40 replica 3;") + newTdSql.execute('CREATE DATABASE db2 vgroups 40 replica 3;', queryTimes=1) def alterDbThread(self, sql, newTdSql): tdLog.info("alter DATABASE db1 replica 3;") From 6f124e7b23d7f4bf2cc33aa30dfc4988e6997303 Mon Sep 17 00:00:00 2001 From: dmchen Date: Tue, 17 Dec 2024 10:36:12 +0000 Subject: [PATCH 26/84] enh/TD-29974-improve-trans-fix-case --- source/dnode/mnode/impl/src/mndTrans.c | 2 +- tests/system-test/0-others/show_transaction_detail.py | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 21a9c28830..83fad45919 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -2241,7 +2241,7 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl const char *killableStr = pTrans->ableToBeKilled ? "yes" : "no"; char killableVstr[10 + VARSTR_HEADER_SIZE] = {0}; - STR_WITH_MAXSIZE_TO_VARSTR(killableVstr, killableStr, 24); + STR_WITH_MAXSIZE_TO_VARSTR(killableVstr, killableStr, 10 + VARSTR_HEADER_SIZE); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)killableVstr, false), pTrans, &lino, _OVER); diff --git a/tests/system-test/0-others/show_transaction_detail.py b/tests/system-test/0-others/show_transaction_detail.py index ec8ebcaef2..8a272eb76d 100644 --- a/tests/system-test/0-others/show_transaction_detail.py +++ b/tests/system-test/0-others/show_transaction_detail.py @@ -81,8 +81,13 @@ class TDTestCase: rows = tdSql.query(f"select * from information_schema.ins_transaction_details", queryTimes=1) if rows != 296: - tdLog.exit(f"restore transaction detial error, rows={rows}") + tdLog.exit(f"show transaction detial error, rows={rows}") return False + + dnode.starttaosd() + + t1.join() + t2.join() def createDbThread(self, sql, newTdSql): tdLog.info("CREATE DATABASE db2 vgroups 40 replica 3;") From 79b32676d3a3243bdcdb927a60c385b2f5206875 Mon Sep 17 00:00:00 2001 From: dmchen Date: Wed, 18 Dec 2024 08:41:22 +0800 Subject: [PATCH 27/84] enh/TD-29974-improve-trans-fix-case --- tests/parallel_test/cases.task | 2 +- tests/system-test/3-enterprise/restore/kill_restore_dnode.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index b43cf5b9ae..a0046f9834 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -400,7 +400,7 @@ ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/empty_identifier.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/show_transaction_detail.py -N 3 ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/kill_balance_leader.py -N 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 3-enterprise/restore/kill_restore_dnode.py -N 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 3-enterprise/restore/kill_restore_dnode.py -N 5 ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/persisit_config.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/qmemCtrl.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/compact_vgroups.py diff --git a/tests/system-test/3-enterprise/restore/kill_restore_dnode.py b/tests/system-test/3-enterprise/restore/kill_restore_dnode.py index ed1c6c21fc..d29a11f159 100644 --- a/tests/system-test/3-enterprise/restore/kill_restore_dnode.py +++ b/tests/system-test/3-enterprise/restore/kill_restore_dnode.py @@ -53,7 +53,7 @@ class TDTestCase: tdLog.info('show transaction %d'%tranId) rows=tdSql.query('show transaction %d'%tranId, queryTimes=1) - if rows != 13: + if rows != 11: tdLog.exit(f"restore transaction detial error, rows={rows}") return False From 5976d4e1f93ba03e872a084471e8140f1f63dbfa Mon Sep 17 00:00:00 2001 From: dmchen Date: Wed, 18 Dec 2024 01:46:09 +0000 Subject: [PATCH 28/84] enh/TD-29974-improve-trans-fix-case --- .../0-others/show_transaction_detail.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/tests/system-test/0-others/show_transaction_detail.py b/tests/system-test/0-others/show_transaction_detail.py index 8a272eb76d..ba588f8f01 100644 --- a/tests/system-test/0-others/show_transaction_detail.py +++ b/tests/system-test/0-others/show_transaction_detail.py @@ -63,24 +63,25 @@ class TDTestCase: oper1 = tdSql.getData(0, 3) tdLog.info(f"show transaction {tranId1}, {oper1}") - tranId2 = tdSql.getData(1, 0) - oper2 = tdSql.getData(1, 3) - tdLog.info(f"show transaction {tranId2}, {oper2}") + #tranId2 = tdSql.getData(1, 0) + #oper2 = tdSql.getData(1, 3) + #tdLog.info(f"show transaction {tranId2}, {oper2}") rows = tdSql.query(f"show transaction {tranId1}", queryTimes=1) if rows != 120 and rows != 176: tdLog.exit(f"show transaction detial error, rows={rows}") return False - rows = tdSql.query(f"show transaction {tranId2}", queryTimes=1) - if rows != 176 and rows != 120: - tdLog.exit(f"show transaction detial error, rows={rows}") - return False + #rows = tdSql.query(f"show transaction {tranId2}", queryTimes=1) + #if rows != 176 and rows != 120: + # tdLog.exit(f"show transaction detial error, rows={rows}") + # return False tdLog.info(f"select * from ins_transaction_details") rows = tdSql.query(f"select * from information_schema.ins_transaction_details", queryTimes=1) - if rows != 296: + #if rows != 296: + if rows != 176: tdLog.exit(f"show transaction detial error, rows={rows}") return False From bf1e90bb5173d9eb0062ad02d863ea6a0febd8ee Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Fri, 20 Dec 2024 10:30:24 +0800 Subject: [PATCH 29/84] fix(coverage/tdb): move tdb close dir from header to c file --- source/libs/tdb/src/db/tdbUtil.c | 7 +++++++ source/libs/tdb/src/inc/tdbOs.h | 7 +------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/source/libs/tdb/src/db/tdbUtil.c b/source/libs/tdb/src/db/tdbUtil.c index 2249123ef5..14845ed8ee 100644 --- a/source/libs/tdb/src/db/tdbUtil.c +++ b/source/libs/tdb/src/db/tdbUtil.c @@ -66,3 +66,10 @@ int tdbGetFileSize(tdb_fd_t fd, int szPage, SPgno *size) { *size = szBytes / szPage; return 0; } + +void tdbCloseDir(TdDirPtr *ppDir) { + int32_t ret = taosCloseDir(ppDir); + if (ret) { + tdbError("failed to close directory, reason:%s", tstrerror(ret)); + } +} diff --git a/source/libs/tdb/src/inc/tdbOs.h b/source/libs/tdb/src/inc/tdbOs.h index 993c3ffab8..cd2d4ce57a 100644 --- a/source/libs/tdb/src/inc/tdbOs.h +++ b/source/libs/tdb/src/inc/tdbOs.h @@ -71,12 +71,7 @@ typedef TdFilePtr tdb_fd_t; #define tdbGetDirEntryName taosGetDirEntryName #define tdbDirEntryBaseName taosDirEntryBaseName -static FORCE_INLINE void tdbCloseDir(TdDirPtr *ppDir) { - int32_t ret = taosCloseDir(ppDir); - if (ret) { - tdbError("failed to close directory, reason:%s", tstrerror(ret)); - } -} +void tdbCloseDir(TdDirPtr *ppDir); #define tdbOsRemove remove #define tdbOsFileSize(FD, PSIZE) taosFStatFile(FD, PSIZE, NULL) From d4a809678a404289bb3cf237d9003c3f26d30a96 Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Fri, 20 Dec 2024 13:27:14 +0800 Subject: [PATCH 30/84] new UT for cos cp module --- source/common/test/CMakeLists.txt | 20 +++++++++++++++- source/common/test/cosCpTest.cpp | 40 +++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 source/common/test/cosCpTest.cpp diff --git a/source/common/test/CMakeLists.txt b/source/common/test/CMakeLists.txt index bb12612273..401f4ccf46 100644 --- a/source/common/test/CMakeLists.txt +++ b/source/common/test/CMakeLists.txt @@ -40,6 +40,24 @@ add_test( COMMAND dataformatTest ) +# cosCpTest.cpp +add_executable(cosCpTest "") +target_sources( + cosCpTest + PRIVATE + "cosCpTest.cpp" +) +target_link_libraries(cosCpTest gtest gtest_main util common) +target_include_directories( + cosCpTest + PUBLIC "${TD_SOURCE_DIR}/include/common" + PUBLIC "${TD_SOURCE_DIR}/include/util" +) +add_test( + NAME cosCpTest + COMMAND cosCpTest +) + if (${TD_LINUX}) # tmsg test add_executable(tmsgTest "") @@ -60,4 +78,4 @@ if (${TD_LINUX}) add_custom_command(TARGET tmsgTest POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${MSG_TBL_FILE} $ ) -endif () \ No newline at end of file +endif () diff --git a/source/common/test/cosCpTest.cpp b/source/common/test/cosCpTest.cpp new file mode 100644 index 0000000000..f2b8a356e0 --- /dev/null +++ b/source/common/test/cosCpTest.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include + +#include +#include +#include +#include + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wwrite-strings" +#pragma GCC diagnostic ignored "-Wunused-function" +#pragma GCC diagnostic ignored "-Wunused-variable" +#pragma GCC diagnostic ignored "-Wsign-compare" + +#define NONE_CSTR "no" +#define NULL_CSTR "nu" +#define NONE_LEN 2 +#define NULL_LEN 2 +const static int16_t MAX_COLS = 14; + +int main(int argc, char **argv) { + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} + +TEST(testCase, StreamWithLongStbName) {} From 5ac4813d0e70f6839d90d94b63e5603b8c4e3e03 Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Fri, 20 Dec 2024 16:23:09 +0800 Subject: [PATCH 31/84] new case for open close remove update dump & load --- source/common/test/cosCpTest.cpp | 279 ++++++++++++++++++++++++++++++- 1 file changed, 272 insertions(+), 7 deletions(-) diff --git a/source/common/test/cosCpTest.cpp b/source/common/test/cosCpTest.cpp index f2b8a356e0..fc16daa8cc 100644 --- a/source/common/test/cosCpTest.cpp +++ b/source/common/test/cosCpTest.cpp @@ -26,15 +26,280 @@ #pragma GCC diagnostic ignored "-Wunused-variable" #pragma GCC diagnostic ignored "-Wsign-compare" -#define NONE_CSTR "no" -#define NULL_CSTR "nu" -#define NONE_LEN 2 -#define NULL_LEN 2 -const static int16_t MAX_COLS = 14; - int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); } -TEST(testCase, StreamWithLongStbName) {} +TEST(testCase, cpOpenCloseRemove) { + int32_t code = 0, lino = 0; + + int64_t contentLength = 1024; + const int64_t MULTIPART_CHUNK_SIZE = 64 << 20; // multipart is 768M + uint64_t chunk_size = MULTIPART_CHUNK_SIZE >> 3; + int totalSeq = (contentLength + chunk_size - 1) / chunk_size; + const int max_part_num = 10000; + if (totalSeq > max_part_num) { + chunk_size = (contentLength + max_part_num - contentLength % max_part_num) / max_part_num; + totalSeq = (contentLength + chunk_size - 1) / chunk_size; + } + SCheckpoint cp; + char const *file = "./afile"; + char file_cp_path[TSDB_FILENAME_LEN]; + + (void)snprintf(file_cp_path, TSDB_FILENAME_LEN, "%s.cp", file); + + cp.parts = (SCheckpointPart *)taosMemoryCalloc(max_part_num, sizeof(SCheckpointPart)); + if (!cp.parts) { + TAOS_CHECK_EXIT(terrno); + } + + EXPECT_EQ(cos_cp_open(file_cp_path, &cp), TSDB_CODE_SUCCESS); + + if (cp.thefile) { + EXPECT_EQ(cos_cp_close(cp.thefile), TSDB_CODE_SUCCESS); + } + if (cp.parts) { + taosMemoryFree(cp.parts); + } + + EXPECT_EQ(cos_cp_remove(file_cp_path), TSDB_CODE_SUCCESS); + + return; + +_exit: + std::cout << "code: " << code << std::endl; +} + +TEST(testCase, cpBuild) { + int32_t code = 0, lino = 0; + + int64_t contentLength = 1024; + const int64_t MULTIPART_CHUNK_SIZE = 64 << 20; // multipart is 768M + uint64_t chunk_size = MULTIPART_CHUNK_SIZE >> 3; + int totalSeq = (contentLength + chunk_size - 1) / chunk_size; + const int max_part_num = 10000; + if (totalSeq > max_part_num) { + chunk_size = (contentLength + max_part_num - contentLength % max_part_num) / max_part_num; + totalSeq = (contentLength + chunk_size - 1) / chunk_size; + } + SCheckpoint cp; + char const *file = "./afile"; + char file_cp_path[TSDB_FILENAME_LEN]; + int64_t lmtime = 20241220141705; + char const *upload_id = "upload-id-xxx"; + + (void)snprintf(file_cp_path, TSDB_FILENAME_LEN, "%s.cp", file); + (void)memset(&cp, 0, sizeof(cp)); + + cp.parts = (SCheckpointPart *)taosMemoryCalloc(max_part_num, sizeof(SCheckpointPart)); + if (!cp.parts) { + TAOS_CHECK_EXIT(terrno); + } + + EXPECT_EQ(cos_cp_open(file_cp_path, &cp), TSDB_CODE_SUCCESS); + + cos_cp_build_upload(&cp, file, contentLength, lmtime, upload_id, chunk_size); + + EXPECT_EQ(cos_cp_dump(&cp), TSDB_CODE_SUCCESS); + + if (cp.thefile) { + EXPECT_EQ(cos_cp_close(cp.thefile), TSDB_CODE_SUCCESS); + } + if (cp.parts) { + taosMemoryFree(cp.parts); + } + + return; + +_exit: + std::cout << "code: " << code << std::endl; +} + +TEST(testCase, cpLoad) { + int32_t code = 0, lino = 0; + + int64_t contentLength = 1024; + const int64_t MULTIPART_CHUNK_SIZE = 64 << 20; // multipart is 768M + uint64_t chunk_size = MULTIPART_CHUNK_SIZE >> 3; + int totalSeq = (contentLength + chunk_size - 1) / chunk_size; + const int max_part_num = 10000; + if (totalSeq > max_part_num) { + chunk_size = (contentLength + max_part_num - contentLength % max_part_num) / max_part_num; + totalSeq = (contentLength + chunk_size - 1) / chunk_size; + } + SCheckpoint cp; + char const *file = "./afile"; + char file_cp_path[TSDB_FILENAME_LEN]; + int64_t lmtime = 20241220141705; + char const *upload_id = "upload-id-xxx"; + + (void)snprintf(file_cp_path, TSDB_FILENAME_LEN, "%s.cp", file); + (void)memset(&cp, 0, sizeof(cp)); + + cp.parts = (SCheckpointPart *)taosMemoryCalloc(max_part_num, sizeof(SCheckpointPart)); + if (!cp.parts) { + TAOS_CHECK_EXIT(terrno); + } + + if (taosCheckExistFile(file_cp_path)) { + EXPECT_EQ(cos_cp_load(file_cp_path, &cp), TSDB_CODE_SUCCESS); + + EXPECT_EQ(cos_cp_is_valid_upload(&cp, contentLength, lmtime), true); + + EXPECT_EQ(cp.cp_type, COS_CP_TYPE_UPLOAD); + EXPECT_EQ(cp.md5, std::string("")); + EXPECT_EQ(cp.thefile, nullptr); + EXPECT_EQ(std::string(cp.file_path), "./afile"); + EXPECT_EQ(cp.file_size, 1024); + EXPECT_EQ(cp.file_last_modified, 20241220141705); + EXPECT_EQ(cp.file_md5, std::string("")); + EXPECT_EQ(cp.object_name, std::string("")); + EXPECT_EQ(cp.object_size, 0); + EXPECT_EQ(cp.object_last_modified, std::string("")); + EXPECT_EQ(cp.object_etag, std::string("")); + EXPECT_EQ(cp.upload_id, std::string("upload-id-xxx")); + + EXPECT_EQ(cp.part_num, 1); + EXPECT_EQ(cp.part_size, 8388608); + EXPECT_EQ(cp.parts[0].index, 0); + EXPECT_EQ(cp.parts[0].offset, 0); + EXPECT_EQ(cp.parts[0].size, 1024); + EXPECT_EQ(cp.parts[0].completed, 0); + EXPECT_EQ(cp.parts[0].etag, std::string("")); + EXPECT_EQ(cp.parts[0].crc64, 0); + } + + if (cp.thefile) { + EXPECT_EQ(cos_cp_close(cp.thefile), TSDB_CODE_SUCCESS); + } + if (cp.parts) { + taosMemoryFree(cp.parts); + } + + EXPECT_EQ(cos_cp_remove(file_cp_path), TSDB_CODE_SUCCESS); + + return; + +_exit: + std::cout << "code: " << code << std::endl; +} + +TEST(testCase, cpBuildUpdate) { + int32_t code = 0, lino = 0; + + int64_t contentLength = 1024; + const int64_t MULTIPART_CHUNK_SIZE = 64 << 20; // multipart is 768M + uint64_t chunk_size = MULTIPART_CHUNK_SIZE >> 3; + int totalSeq = (contentLength + chunk_size - 1) / chunk_size; + const int max_part_num = 10000; + if (totalSeq > max_part_num) { + chunk_size = (contentLength + max_part_num - contentLength % max_part_num) / max_part_num; + totalSeq = (contentLength + chunk_size - 1) / chunk_size; + } + SCheckpoint cp; + char const *file = "./afile"; + char file_cp_path[TSDB_FILENAME_LEN]; + int64_t lmtime = 20241220141705; + char const *upload_id = "upload-id-xxx"; + int seq = 1; + char *etags[1] = {"etags-1-xxx"}; + + (void)snprintf(file_cp_path, TSDB_FILENAME_LEN, "%s.cp", file); + (void)memset(&cp, 0, sizeof(cp)); + + cp.parts = (SCheckpointPart *)taosMemoryCalloc(max_part_num, sizeof(SCheckpointPart)); + if (!cp.parts) { + TAOS_CHECK_EXIT(terrno); + } + + EXPECT_EQ(cos_cp_open(file_cp_path, &cp), TSDB_CODE_SUCCESS); + + cos_cp_build_upload(&cp, file, contentLength, lmtime, upload_id, chunk_size); + + cos_cp_update(&cp, cp.parts[seq - 1].index, etags[seq - 1], 0); + + EXPECT_EQ(cos_cp_dump(&cp), TSDB_CODE_SUCCESS); + + if (cp.thefile) { + EXPECT_EQ(cos_cp_close(cp.thefile), TSDB_CODE_SUCCESS); + } + if (cp.parts) { + taosMemoryFree(cp.parts); + } + + return; + +_exit: + std::cout << "code: " << code << std::endl; +} + +TEST(testCase, cpLoadUpdate) { + int32_t code = 0, lino = 0; + + int64_t contentLength = 1024; + const int64_t MULTIPART_CHUNK_SIZE = 64 << 20; // multipart is 768M + uint64_t chunk_size = MULTIPART_CHUNK_SIZE >> 3; + int totalSeq = (contentLength + chunk_size - 1) / chunk_size; + const int max_part_num = 10000; + if (totalSeq > max_part_num) { + chunk_size = (contentLength + max_part_num - contentLength % max_part_num) / max_part_num; + totalSeq = (contentLength + chunk_size - 1) / chunk_size; + } + SCheckpoint cp; + char const *file = "./afile"; + char file_cp_path[TSDB_FILENAME_LEN]; + int64_t lmtime = 20241220141705; + char const *upload_id = "upload-id-xxx"; + + (void)snprintf(file_cp_path, TSDB_FILENAME_LEN, "%s.cp", file); + (void)memset(&cp, 0, sizeof(cp)); + + cp.parts = (SCheckpointPart *)taosMemoryCalloc(max_part_num, sizeof(SCheckpointPart)); + if (!cp.parts) { + TAOS_CHECK_EXIT(terrno); + } + + if (taosCheckExistFile(file_cp_path)) { + EXPECT_EQ(cos_cp_load(file_cp_path, &cp), TSDB_CODE_SUCCESS); + + EXPECT_EQ(cos_cp_is_valid_upload(&cp, contentLength, lmtime), true); + + EXPECT_EQ(cp.cp_type, COS_CP_TYPE_UPLOAD); + EXPECT_EQ(cp.md5, std::string("")); + EXPECT_EQ(cp.thefile, nullptr); + EXPECT_EQ(std::string(cp.file_path), "./afile"); + EXPECT_EQ(cp.file_size, 1024); + EXPECT_EQ(cp.file_last_modified, 20241220141705); + EXPECT_EQ(cp.file_md5, std::string("")); + EXPECT_EQ(cp.object_name, std::string("")); + EXPECT_EQ(cp.object_size, 0); + EXPECT_EQ(cp.object_last_modified, std::string("")); + EXPECT_EQ(cp.object_etag, std::string("")); + EXPECT_EQ(cp.upload_id, std::string("upload-id-xxx")); + + EXPECT_EQ(cp.part_num, 1); + EXPECT_EQ(cp.part_size, 8388608); + EXPECT_EQ(cp.parts[0].index, 0); + EXPECT_EQ(cp.parts[0].offset, 0); + EXPECT_EQ(cp.parts[0].size, 1024); + EXPECT_EQ(cp.parts[0].completed, 1); + EXPECT_EQ(cp.parts[0].etag, std::string("etags-1-xxx")); + EXPECT_EQ(cp.parts[0].crc64, 0); + } + + if (cp.thefile) { + EXPECT_EQ(cos_cp_close(cp.thefile), TSDB_CODE_SUCCESS); + } + if (cp.parts) { + taosMemoryFree(cp.parts); + } + + EXPECT_EQ(cos_cp_remove(file_cp_path), TSDB_CODE_SUCCESS); + + return; + +_exit: + std::cout << "code: " << code << std::endl; +} From 1bf7644e98a5451757b3389d5c3a21598ab36f87 Mon Sep 17 00:00:00 2001 From: dmchen Date: Fri, 20 Dec 2024 09:36:51 +0000 Subject: [PATCH 32/84] enh/TD-29974-improve-trans-fix-comment --- include/common/tmsg.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index b50291c2e7..9488e54615 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -394,7 +394,6 @@ typedef enum ENodeType { QUERY_NODE_SHOW_VIEWS_STMT, QUERY_NODE_SHOW_COMPACTS_STMT, QUERY_NODE_SHOW_COMPACT_DETAILS_STMT, - QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT, QUERY_NODE_SHOW_GRANTS_FULL_STMT, QUERY_NODE_SHOW_GRANTS_LOGS_STMT, QUERY_NODE_SHOW_CLUSTER_MACHINES_STMT, @@ -407,6 +406,7 @@ typedef enum ENodeType { QUERY_NODE_SHOW_CREATE_TSMA_STMT, QUERY_NODE_DROP_TSMA_STMT, QUERY_NODE_SHOW_FILESETS_STMT, + QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT, // logic plan node QUERY_NODE_LOGIC_PLAN_SCAN = 1000, From a6076b82fc97e86f9b6aedb4d80c65ee37316df9 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Mon, 23 Dec 2024 11:47:20 +0800 Subject: [PATCH 33/84] fix double free --- source/libs/index/src/indexTfile.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/source/libs/index/src/indexTfile.c b/source/libs/index/src/indexTfile.c index e2693ff4a4..c6c091c630 100644 --- a/source/libs/index/src/indexTfile.c +++ b/source/libs/index/src/indexTfile.c @@ -44,10 +44,10 @@ static int tfileWriteData(TFileWriter* write, TFileValue* tval); static int tfileWriteFooter(TFileWriter* write); // handle file corrupt later -static int tfileReaderLoadHeader(TFileReader* reader); +static int tfileReaderLoadHeader(TFileReader* reader); static int32_t tfileReaderLoadFst(TFileReader* reader); -static int tfileReaderVerify(TFileReader* reader); -static int tfileReaderLoadTableIds(TFileReader* reader, int32_t offset, SArray* result); +static int tfileReaderVerify(TFileReader* reader); +static int tfileReaderLoadTableIds(TFileReader* reader, int32_t offset, SArray* result); static int32_t tfileGetFileList(const char* path, SArray** pResult); static int tfileRmExpireFile(SArray* result); @@ -106,6 +106,11 @@ TFileCache* tfileCacheCreate(SIndex* idx, const char* path) { SArray* files = NULL; int32_t code = tfileGetFileList(path, &files); + if (code != 0) { + indexError("failed to get file list since %s", tstrerror(code)); + goto End; + } + for (size_t i = 0; i < taosArrayGetSize(files); i++) { char* file = taosArrayGetP(files, i); @@ -1182,7 +1187,6 @@ _exception: TAOS_UNUSED(taosCloseDir(&pDir)); if (files != NULL) { taosArrayDestroyEx(files, tfileDestroyFileName); - taosArrayDestroy(files); } return code; } From f175cce76bf207fbaabddd7c168daa21fb84b379 Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 23 Dec 2024 14:49:08 +0800 Subject: [PATCH 34/84] enh/TD-29974-improve-trans-fix-case --- source/libs/parser/src/parTranslater.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 15b8bf2e89..1136b1007d 100755 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -320,12 +320,6 @@ static const SSysTableShowAdapter sysTableShowAdapter[] = { .numOfShowCols = 1, .pShowCols = {"*"} }, - { .showType = QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT, - .pDbName = TSDB_INFORMATION_SCHEMA_DB, - .pTableName = TSDB_INS_TABLE_TRANSACTION_DETAILS, - .numOfShowCols = 1, - .pShowCols = {"*"} - }, { .showType = QUERY_NODE_SHOW_GRANTS_FULL_STMT, .pDbName = TSDB_INFORMATION_SCHEMA_DB, .pTableName = TSDB_INS_TABLE_GRANTS_FULL, @@ -383,6 +377,12 @@ static const SSysTableShowAdapter sysTableShowAdapter[] = { .numOfShowCols = 1, .pShowCols = {"*"} }, + { .showType = QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT, + .pDbName = TSDB_INFORMATION_SCHEMA_DB, + .pTableName = TSDB_INS_TABLE_TRANSACTION_DETAILS, + .numOfShowCols = 1, + .pShowCols = {"*"} + }, }; // clang-format on From 0321121a859a2657d2a3071b67d89bd3114e1b49 Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 23 Dec 2024 15:59:33 +0800 Subject: [PATCH 35/84] fix case --- include/common/tmsg.h | 2 +- source/libs/parser/src/parTranslater.c | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 9488e54615..da26edcb52 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -402,11 +402,11 @@ typedef enum ENodeType { QUERY_NODE_SHOW_ANODES_STMT, QUERY_NODE_SHOW_ANODES_FULL_STMT, QUERY_NODE_SHOW_USAGE_STMT, + QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT, QUERY_NODE_CREATE_TSMA_STMT, QUERY_NODE_SHOW_CREATE_TSMA_STMT, QUERY_NODE_DROP_TSMA_STMT, QUERY_NODE_SHOW_FILESETS_STMT, - QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT, // logic plan node QUERY_NODE_LOGIC_PLAN_SCAN = 1000, diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 1136b1007d..6e5fd4f26a 100755 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -370,19 +370,20 @@ static const SSysTableShowAdapter sysTableShowAdapter[] = { .numOfShowCols = 1, .pShowCols = {"*"} }, - { - .showType = QUERY_NODE_SHOW_FILESETS_STMT, - .pDbName = TSDB_INFORMATION_SCHEMA_DB, - .pTableName = TSDB_INS_TABLE_FILESETS, - .numOfShowCols = 1, - .pShowCols = {"*"} - }, - { .showType = QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT, + { + .showType = QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT, .pDbName = TSDB_INFORMATION_SCHEMA_DB, .pTableName = TSDB_INS_TABLE_TRANSACTION_DETAILS, .numOfShowCols = 1, .pShowCols = {"*"} }, + { + .showType = QUERY_NODE_SHOW_FILESETS_STMT, + .pDbName = TSDB_INFORMATION_SCHEMA_DB, + .pTableName = TSDB_INS_TABLE_FILESETS, + .numOfShowCols = 1, + .pShowCols = {"*"} + }, }; // clang-format on From 295510fc087225bdec27755ee48907c87e4745ce Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 23 Dec 2024 16:11:21 +0800 Subject: [PATCH 36/84] fix case --- include/common/tmsg.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index da26edcb52..aa0615a2d7 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -162,8 +162,8 @@ typedef enum _mgmt_table { TSDB_MGMT_TABLE_ANODE, TSDB_MGMT_TABLE_ANODE_FULL, TSDB_MGMT_TABLE_USAGE, - TSDB_MGMT_TABLE_FILESETS, TSDB_MGMT_TABLE_TRANSACTION_DETAIL, + TSDB_MGMT_TABLE_FILESETS, TSDB_MGMT_TABLE_MAX, } EShowType; From 1a5e900378cb8b455e3a92f425b8689e14f05e84 Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 23 Dec 2024 16:15:35 +0800 Subject: [PATCH 37/84] fix case --- include/common/tmsg.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index aa0615a2d7..da26edcb52 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -162,8 +162,8 @@ typedef enum _mgmt_table { TSDB_MGMT_TABLE_ANODE, TSDB_MGMT_TABLE_ANODE_FULL, TSDB_MGMT_TABLE_USAGE, - TSDB_MGMT_TABLE_TRANSACTION_DETAIL, TSDB_MGMT_TABLE_FILESETS, + TSDB_MGMT_TABLE_TRANSACTION_DETAIL, TSDB_MGMT_TABLE_MAX, } EShowType; From 0b703a72bcc81d4dbe3915dd4e83893c2e892bfb Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 23 Dec 2024 16:29:16 +0800 Subject: [PATCH 38/84] fix case --- include/common/tmsg.h | 2 +- source/libs/parser/src/parTranslater.c | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index da26edcb52..9488e54615 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -402,11 +402,11 @@ typedef enum ENodeType { QUERY_NODE_SHOW_ANODES_STMT, QUERY_NODE_SHOW_ANODES_FULL_STMT, QUERY_NODE_SHOW_USAGE_STMT, - QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT, QUERY_NODE_CREATE_TSMA_STMT, QUERY_NODE_SHOW_CREATE_TSMA_STMT, QUERY_NODE_DROP_TSMA_STMT, QUERY_NODE_SHOW_FILESETS_STMT, + QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT, // logic plan node QUERY_NODE_LOGIC_PLAN_SCAN = 1000, diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 6e5fd4f26a..49ff1dd229 100755 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -370,20 +370,23 @@ static const SSysTableShowAdapter sysTableShowAdapter[] = { .numOfShowCols = 1, .pShowCols = {"*"} }, - { - .showType = QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT, - .pDbName = TSDB_INFORMATION_SCHEMA_DB, - .pTableName = TSDB_INS_TABLE_TRANSACTION_DETAILS, - .numOfShowCols = 1, - .pShowCols = {"*"} - }, + {}, + {}, + {}, { .showType = QUERY_NODE_SHOW_FILESETS_STMT, .pDbName = TSDB_INFORMATION_SCHEMA_DB, .pTableName = TSDB_INS_TABLE_FILESETS, .numOfShowCols = 1, .pShowCols = {"*"} - }, + }, + { + .showType = QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT, + .pDbName = TSDB_INFORMATION_SCHEMA_DB, + .pTableName = TSDB_INS_TABLE_TRANSACTION_DETAILS, + .numOfShowCols = 1, + .pShowCols = {"*"} + }, }; // clang-format on From 02a81c845e5e97249c68f9e5f7bd2ddb7367b9c3 Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Mon, 23 Dec 2024 17:05:56 +0800 Subject: [PATCH 39/84] test/cos: UT for cos non-covered funcs --- source/common/src/cos.c | 8 +- source/common/test/CMakeLists.txt | 18 +++++ source/common/test/cosTest.cpp | 128 ++++++++++++++++++++++++++++++ 3 files changed, 150 insertions(+), 4 deletions(-) create mode 100644 source/common/test/cosTest.cpp diff --git a/source/common/src/cos.c b/source/common/src/cos.c index 35ab328815..68d75f9897 100644 --- a/source/common/src/cos.c +++ b/source/common/src/cos.c @@ -66,9 +66,9 @@ int32_t s3Begin() { void s3End() { S3_deinitialize(); } int32_t s3Init() { TAOS_RETURN(TSDB_CODE_SUCCESS); /*s3Begin();*/ } - +#if 0 static int32_t s3ListBucket(char const *bucketname); - +#endif static void s3DumpCfgByEp(int8_t epIndex) { // clang-format off (void)fprintf(stdout, @@ -291,7 +291,7 @@ static int32_t s3ListBucketByEp(char const *bucketname, int8_t epIndex) { TAOS_RETURN(code); } - +#if 0 static int32_t s3ListBucket(char const *bucketname) { int32_t code = 0; @@ -312,7 +312,7 @@ static int32_t s3ListBucket(char const *bucketname) { TAOS_RETURN(code); } - +#endif typedef struct growbuffer { // The total number of bytes, and the start byte int size; diff --git a/source/common/test/CMakeLists.txt b/source/common/test/CMakeLists.txt index 401f4ccf46..dfd92d476c 100644 --- a/source/common/test/CMakeLists.txt +++ b/source/common/test/CMakeLists.txt @@ -58,6 +58,24 @@ add_test( COMMAND cosCpTest ) +# cosTest.cpp +add_executable(cosTest "") +target_sources( + cosTest + PRIVATE + "cosTest.cpp" +) +target_link_libraries(cosTest gtest gtest_main util common) +target_include_directories( + cosTest + PUBLIC "${TD_SOURCE_DIR}/include/common" + PUBLIC "${TD_SOURCE_DIR}/include/util" +) +add_test( + NAME cosTest + COMMAND cosTest +) + if (${TD_LINUX}) # tmsg test add_executable(tmsgTest "") diff --git a/source/common/test/cosTest.cpp b/source/common/test/cosTest.cpp new file mode 100644 index 0000000000..f550a5e4ca --- /dev/null +++ b/source/common/test/cosTest.cpp @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include + +#include +#include +#include +#include + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wwrite-strings" +#pragma GCC diagnostic ignored "-Wunused-function" +#pragma GCC diagnostic ignored "-Wunused-variable" +#pragma GCC diagnostic ignored "-Wsign-compare" + +int main(int argc, char **argv) { + testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} + +int32_t cosInitEnv() { + int32_t code = 0; + bool isBlob = false; + + extern int8_t tsS3Ablob; + extern char tsS3Hostname[][TSDB_FQDN_LEN]; + extern char tsS3AccessKeyId[][TSDB_FQDN_LEN]; + extern char tsS3AccessKeySecret[][TSDB_FQDN_LEN]; + extern char tsS3BucketName[TSDB_FQDN_LEN]; + + tsS3Ablob = isBlob; + /* + const char *hostname = "endpoint/.blob.core.windows.net"; + const char *accessKeyId = ""; + const char *accessKeySecret = ""; + const char *bucketName = ""; + */ + + // const char *hostname = "http://192.168.1.52:9000"; + // const char *accessKeyId = "zOgllR6bSnw2Ah3mCNel"; + // const char *accessKeySecret = "cdO7oXAu3Cqdb1rUdevFgJMi0LtRwCXdWKQx4bhX"; + // const char *bucketName = "test-bucket"; + const char *hostname = "192.168.1.52:9000"; + const char *accessKeyId = "fGPPyYjzytw05nw44ViA"; + const char *accessKeySecret = "vK1VcwxgSOykicx6hk8fL1x15uEtyDSFU3w4hTaZ"; + + const char *bucketName = "ci-bucket19"; + + tstrncpy(&tsS3Hostname[0][0], hostname, TSDB_FQDN_LEN); + tstrncpy(&tsS3AccessKeyId[0][0], accessKeyId, TSDB_FQDN_LEN); + tstrncpy(&tsS3AccessKeySecret[0][0], accessKeySecret, TSDB_FQDN_LEN); + tstrncpy(tsS3BucketName, bucketName, TSDB_FQDN_LEN); + + // setup s3 env + extern int8_t tsS3EpNum; + extern int8_t tsS3Https[TSDB_MAX_EP_NUM]; + + tsS3EpNum = 1; + tsS3Https[0] = false; + + tstrncpy(tsTempDir, "/tmp/", PATH_MAX); + + tsS3Enabled = true; + + return code; +} + +TEST(testCase, cosCpPutError) { + int32_t code = 0, lino = 0; + + long objectSize = 128 * 1024 * 1024; + char const *objectName = "testObject"; + + EXPECT_EQ(cosInitEnv(), TSDB_CODE_SUCCESS); + EXPECT_EQ(s3Size(objectName), -1); + s3EvictCache("", 0); + + return; + +_exit: + std::cout << "code: " << code << std::endl; +} + +TEST(testCase, cosCpPut) { + int32_t code = 0, lino = 0; + + long objectSize = 128 * 1024 * 1024; + char const *objectName = "testObject"; + + EXPECT_EQ(cosInitEnv(), TSDB_CODE_SUCCESS); + EXPECT_EQ(s3Size(objectName), -1); + s3EvictCache("", 0); + + return; + +_exit: + std::cout << "code: " << code << std::endl; +} + +TEST(testCase, cosCpPutSize) { + int32_t code = 0, lino = 0; + + long objectSize = 128 * 1024 * 1024; + char const *objectName = "testObject"; + + EXPECT_EQ(cosInitEnv(), TSDB_CODE_SUCCESS); + EXPECT_EQ(s3Size(objectName), -1); + s3EvictCache("", 0); + + return; + +_exit: + std::cout << "code: " << code << std::endl; +} From 2b1c0b5d50df9cd30686d47d09c0cd70bc5091a6 Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Mon, 23 Dec 2024 18:04:38 +0800 Subject: [PATCH 40/84] test/cos: put s3 object with cp --- source/common/test/cosTest.cpp | 91 +++++++++++++++++++++++++--------- 1 file changed, 68 insertions(+), 23 deletions(-) diff --git a/source/common/test/cosTest.cpp b/source/common/test/cosTest.cpp index f550a5e4ca..7a8ffd69de 100644 --- a/source/common/test/cosTest.cpp +++ b/source/common/test/cosTest.cpp @@ -55,9 +55,8 @@ int32_t cosInitEnv() { // const char *accessKeySecret = "cdO7oXAu3Cqdb1rUdevFgJMi0LtRwCXdWKQx4bhX"; // const char *bucketName = "test-bucket"; const char *hostname = "192.168.1.52:9000"; - const char *accessKeyId = "fGPPyYjzytw05nw44ViA"; - const char *accessKeySecret = "vK1VcwxgSOykicx6hk8fL1x15uEtyDSFU3w4hTaZ"; - + const char *accessKeyId = "zOgllR6bSnw2Ah3mCNel"; + const char *accessKeySecret = "cdO7oXAu3Cqdb1rUdevFgJMi0LtRwCXdWKQx4bhX"; const char *bucketName = "ci-bucket19"; tstrncpy(&tsS3Hostname[0][0], hostname, TSDB_FQDN_LEN); @@ -98,31 +97,77 @@ _exit: TEST(testCase, cosCpPut) { int32_t code = 0, lino = 0; - long objectSize = 128 * 1024 * 1024; - char const *objectName = "testObject"; + int8_t with_cp = 0; + char *data = nullptr; + + const long objectSize = 65 * 1024 * 1024; + char const *objectName = "cosut.bin"; + const char object_name[] = "cosut.bin"; + + EXPECT_EQ(std::string(object_name), objectName); EXPECT_EQ(cosInitEnv(), TSDB_CODE_SUCCESS); - EXPECT_EQ(s3Size(objectName), -1); - s3EvictCache("", 0); - - return; - -_exit: - std::cout << "code: " << code << std::endl; -} - -TEST(testCase, cosCpPutSize) { - int32_t code = 0, lino = 0; - - long objectSize = 128 * 1024 * 1024; - char const *objectName = "testObject"; - - EXPECT_EQ(cosInitEnv(), TSDB_CODE_SUCCESS); - EXPECT_EQ(s3Size(objectName), -1); - s3EvictCache("", 0); + EXPECT_EQ(s3Begin(), TSDB_CODE_SUCCESS); + + { + data = (char *)taosMemoryCalloc(1, objectSize); + if (!data) { + TAOS_CHECK_EXIT(terrno); + } + + for (int i = 0; i < objectSize / 2; ++i) { + data[i * 2 + 1] = 1; + } + + char path[PATH_MAX] = {0}; + char path_download[PATH_MAX] = {0}; + int ds_len = strlen(TD_DIRSEP); + int tmp_len = strlen(tsTempDir); + + (void)snprintf(path, PATH_MAX, "%s", tsTempDir); + if (strncmp(tsTempDir + tmp_len - ds_len, TD_DIRSEP, ds_len) != 0) { + (void)snprintf(path + tmp_len, PATH_MAX - tmp_len, "%s", TD_DIRSEP); + (void)snprintf(path + tmp_len + ds_len, PATH_MAX - tmp_len - ds_len, "%s", object_name); + } else { + (void)snprintf(path + tmp_len, PATH_MAX - tmp_len, "%s", object_name); + } + + tstrncpy(path_download, path, strlen(path) + 1); + tstrncpy(path_download + strlen(path), ".download", strlen(".download") + 1); + + TdFilePtr fp = taosOpenFile(path, TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_WRITE_THROUGH); + GTEST_ASSERT_NE(fp, nullptr); + + int n = taosWriteFile(fp, data, objectSize); + GTEST_ASSERT_EQ(n, objectSize); + + code = taosCloseFile(&fp); + GTEST_ASSERT_EQ(code, 0); + + code = s3PutObjectFromFile2(path, objectName, with_cp); + GTEST_ASSERT_EQ(code, 0); + + with_cp = 1; + code = s3PutObjectFromFile2(path, objectName, with_cp); + GTEST_ASSERT_EQ(code, 0); + + EXPECT_EQ(s3Size(objectName), objectSize); + + s3End(); + s3EvictCache("", 0); + + taosMemoryFree(data); + + EXPECT_EQ(taosRemoveFile(path), TSDB_CODE_SUCCESS); + } return; _exit: + if (data) { + taosMemoryFree(data); + s3End(); + } + std::cout << "code: " << code << std::endl; } From 45bc4def982a6ac4b0853b4a729cb9f2acadd8de Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 23 Dec 2024 10:10:46 +0000 Subject: [PATCH 41/84] fix case --- source/libs/parser/src/parTranslater.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 49ff1dd229..485c5c14fa 100755 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -370,9 +370,27 @@ static const SSysTableShowAdapter sysTableShowAdapter[] = { .numOfShowCols = 1, .pShowCols = {"*"} }, - {}, - {}, - {}, + { + .showType = QUERY_NODE_CREATE_TSMA_STMT, + .pDbName = "", + .pTableName = "", + .numOfShowCols = 1, + .pShowCols = {"*"} + }, + { + .showType = QUERY_NODE_SHOW_CREATE_TSMA_STMT, + .pDbName = "", + .pTableName = "", + .numOfShowCols = 1, + .pShowCols = {"*"} + }, + { + .showType = QUERY_NODE_DROP_TSMA_STMT, + .pDbName = "", + .pTableName = "", + .numOfShowCols = 1, + .pShowCols = {"*"} + }, { .showType = QUERY_NODE_SHOW_FILESETS_STMT, .pDbName = TSDB_INFORMATION_SCHEMA_DB, From 84d48082912e02a206936f3095c4be52a845e449 Mon Sep 17 00:00:00 2001 From: kailixu Date: Mon, 23 Dec 2024 11:27:32 +0000 Subject: [PATCH 42/84] enh: test coverage of tfs --- source/libs/tfs/inc/tfsInt.h | 4 +++ source/libs/tfs/src/tfsTier.c | 2 +- source/libs/tfs/test/CMakeLists.txt | 13 ++++++--- source/libs/tfs/test/tfsTest.cpp | 41 +++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 5 deletions(-) diff --git a/source/libs/tfs/inc/tfsInt.h b/source/libs/tfs/inc/tfsInt.h index 3c2b67da01..ccc6e213ea 100644 --- a/source/libs/tfs/inc/tfsInt.h +++ b/source/libs/tfs/inc/tfsInt.h @@ -16,6 +16,10 @@ #ifndef _TD_TFS_INT_H_ #define _TD_TFS_INT_H_ +#ifdef __cplusplus +extern "C" { +#endif + #include "os.h" #include "taosdef.h" diff --git a/source/libs/tfs/src/tfsTier.c b/source/libs/tfs/src/tfsTier.c index 2cfcdc6d0a..acc8168538 100644 --- a/source/libs/tfs/src/tfsTier.c +++ b/source/libs/tfs/src/tfsTier.c @@ -41,13 +41,13 @@ void tfsDestroyTier(STfsTier *pTier) { int32_t tfsMountDiskToTier(STfsTier *pTier, SDiskCfg *pCfg, STfsDisk **ppDisk) { int32_t code = 0; int32_t lino = 0; + int32_t id = 0; STfsDisk *pDisk = NULL; if (pTier->ndisk >= TFS_MAX_DISKS_PER_TIER) { TAOS_CHECK_GOTO(TSDB_CODE_FS_TOO_MANY_MOUNT, &lino, _exit); } - int32_t id = 0; if (pTier->level == 0) { if (pTier->disks[0] != NULL) { id = pTier->ndisk; diff --git a/source/libs/tfs/test/CMakeLists.txt b/source/libs/tfs/test/CMakeLists.txt index 2fd0836a1d..050811f0f5 100644 --- a/source/libs/tfs/test/CMakeLists.txt +++ b/source/libs/tfs/test/CMakeLists.txt @@ -7,8 +7,13 @@ target_link_libraries( PUBLIC tfs PUBLIC gtest_main ) +target_include_directories( + tfs_test + PUBLIC "${TD_SOURCE_DIR}/include/libs/tfs" + PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../inc" +) -# add_test( -# NAME tfs_test -# COMMAND tfs_test -# ) +add_test( + NAME tfs_test + COMMAND tfs_test +) diff --git a/source/libs/tfs/test/tfsTest.cpp b/source/libs/tfs/test/tfsTest.cpp index bb89fbe69f..0732b71f78 100644 --- a/source/libs/tfs/test/tfsTest.cpp +++ b/source/libs/tfs/test/tfsTest.cpp @@ -13,6 +13,7 @@ #include "os.h" #include "tfs.h" +#include "tfsInt.h" class TfsTest : public ::testing::Test { protected: @@ -744,3 +745,43 @@ TEST_F(TfsTest, 05_MultiDisk) { tfsClose(pTfs); } + +TEST_F(TfsTest, 06_Exception) { + // tfsDisk.c + STfsDisk *pDisk = NULL; + EXPECT_EQ(tfsNewDisk(0, 0, 0, NULL, &pDisk), TSDB_CODE_INVALID_PARA); + + STfsDisk disk = {0}; + EXPECT_EQ(tfsUpdateDiskSize(&disk), TSDB_CODE_INVALID_PARA); + + // tfsTier.c + STfsTier tfsTier = {0}; + EXPECT_EQ(taosThreadSpinInit(&tfsTier.lock, 0), 0); + EXPECT_EQ(tfsAllocDiskOnTier(&tfsTier), TSDB_CODE_FS_NO_VALID_DISK); + + tfsTier.ndisk = 3; + tfsTier.nAvailDisks = 1; + + tfsTier.disks[1] = &disk; + disk.disable = 1; + EXPECT_EQ(tfsAllocDiskOnTier(&tfsTier), TSDB_CODE_FS_NO_VALID_DISK); + disk.disable = 0; + disk.size.avail = 0; + EXPECT_EQ(tfsAllocDiskOnTier(&tfsTier), TSDB_CODE_FS_NO_VALID_DISK); + + tfsTier.ndisk = TFS_MAX_DISKS_PER_TIER; + SDiskCfg diskCfg = {0}; + tstrncpy(diskCfg.dir, "testDataDir", TSDB_FILENAME_LEN); + EXPECT_EQ(tfsMountDiskToTier(&tfsTier, &diskCfg, 0), TSDB_CODE_FS_TOO_MANY_MOUNT); + EXPECT_EQ(taosThreadSpinDestroy(&tfsTier.lock), 0); + + // tfs.c + STfs *pTfs = NULL; + EXPECT_EQ(tfsOpen(0, -1, &pTfs), TSDB_CODE_INVALID_PARA); + EXPECT_EQ(tfsOpen(0, 0, &pTfs), TSDB_CODE_INVALID_PARA); + EXPECT_EQ(tfsOpen(0, TFS_MAX_DISKS + 1, &pTfs), TSDB_CODE_INVALID_PARA); + taosMemoryFreeClear(pTfs); + + STfs tfs = {0}; + EXPECT_EQ(tfsDiskSpaceAvailable(&tfs, -1), 0); +} From 67af6846f653facc77da518066b04e9ef7811ba5 Mon Sep 17 00:00:00 2001 From: kailixu Date: Mon, 23 Dec 2024 12:47:55 +0000 Subject: [PATCH 43/84] enh: test coverage of tfs --- include/libs/tfs/tfs.h | 8 +++--- source/libs/tfs/src/tfs.c | 8 +++--- source/libs/tfs/test/tfsTest.cpp | 49 +++++++++++++++++++++++++++++++- 3 files changed, 56 insertions(+), 9 deletions(-) diff --git a/include/libs/tfs/tfs.h b/include/libs/tfs/tfs.h index a6a3c63a50..709d053414 100644 --- a/include/libs/tfs/tfs.h +++ b/include/libs/tfs/tfs.h @@ -148,7 +148,7 @@ int32_t tfsMkdirRecur(STfs *pTfs, const char *rname); * @return int32_t 0 for success, -1 for failure. */ int32_t tfsMkdirRecurAt(STfs *pTfs, const char *rname, SDiskID diskId); - +#if 0 /** * @brief check directories exist in tfs. * @@ -158,7 +158,7 @@ int32_t tfsMkdirRecurAt(STfs *pTfs, const char *rname, SDiskID diskId); * @return true for exist, false for not exist. */ bool tfsDirExistAt(STfs *pTfs, const char *rname, SDiskID diskId); - +#endif /** * @brief Remove directory at all levels in tfs. * @@ -241,7 +241,7 @@ void tfsBasename(const STfsFile *pFile, char *dest); * @param dest The buffer where dirname will be saved. */ void tfsDirname(const STfsFile *pFile, char *dest); - +#if 0 /** * @brief Get the absolute file name of rname. * @@ -251,7 +251,7 @@ void tfsDirname(const STfsFile *pFile, char *dest); * @param aname absolute file name */ void tfsAbsoluteName(STfs *pTfs, SDiskID diskId, const char *rname, char *aname); - +#endif /** * @brief Remove file in tfs. * diff --git a/source/libs/tfs/src/tfs.c b/source/libs/tfs/src/tfs.c index ecc55517b3..d3767c5d7a 100644 --- a/source/libs/tfs/src/tfs.c +++ b/source/libs/tfs/src/tfs.c @@ -245,13 +245,13 @@ void tfsDirname(const STfsFile *pFile, char *dest) { tstrncpy(tname, pFile->aname, TSDB_FILENAME_LEN); tstrncpy(dest, taosDirName(tname), TSDB_FILENAME_LEN); } - +#if 0 void tfsAbsoluteName(STfs *pTfs, SDiskID diskId, const char *rname, char *aname) { STfsDisk *pDisk = TFS_DISK_AT(pTfs, diskId); (void)snprintf(aname, TSDB_FILENAME_LEN, "%s%s%s", pDisk->path, TD_DIRSEP, rname); } - +#endif int32_t tfsRemoveFile(const STfsFile *pFile) { return taosRemoveFile(pFile->aname); } int32_t tfsCopyFile(const STfsFile *pFile1, const STfsFile *pFile2) { @@ -340,7 +340,7 @@ int32_t tfsMkdir(STfs *pTfs, const char *rname) { TAOS_RETURN(0); } - +#if 0 bool tfsDirExistAt(STfs *pTfs, const char *rname, SDiskID diskId) { STfsDisk *pDisk = TFS_DISK_AT(pTfs, diskId); char aname[TMPNAME_LEN]; @@ -348,7 +348,7 @@ bool tfsDirExistAt(STfs *pTfs, const char *rname, SDiskID diskId) { (void)snprintf(aname, TMPNAME_LEN, "%s%s%s", pDisk->path, TD_DIRSEP, rname); return taosDirExist(aname); } - +#endif int32_t tfsRmdir(STfs *pTfs, const char *rname) { if (rname[0] == 0) { TAOS_RETURN(0); diff --git a/source/libs/tfs/test/tfsTest.cpp b/source/libs/tfs/test/tfsTest.cpp index 0732b71f78..1da1b63d9f 100644 --- a/source/libs/tfs/test/tfsTest.cpp +++ b/source/libs/tfs/test/tfsTest.cpp @@ -281,6 +281,9 @@ TEST_F(TfsTest, 04_File) { const STfsFile *pf2 = tfsReaddir(pDir); EXPECT_EQ(pf2, nullptr); + pDir->pDir = taosOpenDir(fulldir); + EXPECT_NE(pDir->pDir, nullptr); + tfsClosedir(pDir); } @@ -783,5 +786,49 @@ TEST_F(TfsTest, 06_Exception) { taosMemoryFreeClear(pTfs); STfs tfs = {0}; - EXPECT_EQ(tfsDiskSpaceAvailable(&tfs, -1), 0); + STfsTier *pTier = &tfs.tiers[0]; + EXPECT_EQ(tfsDiskSpaceAvailable(&tfs, -1), false); + tfs.nlevel = 2; + pTier->ndisk = 3; + pTier->nAvailDisks = 1; + EXPECT_EQ(tfsDiskSpaceAvailable(&tfs, 0), false); + pTier->disks[0] = &disk; + EXPECT_EQ(tfsDiskSpaceAvailable(&tfs, 0), false); + + EXPECT_EQ(tfsDiskSpaceSufficient(&tfs, -1, 0), false); + EXPECT_EQ(tfsDiskSpaceSufficient(&tfs, tfs.nlevel + 1, 0), false); + EXPECT_EQ(tfsDiskSpaceSufficient(&tfs, 0, -1), false); + EXPECT_EQ(tfsDiskSpaceSufficient(&tfs, 0, pTier->ndisk), false); + + EXPECT_EQ(tfsGetDisksAtLevel(&tfs, -1), 0); + EXPECT_EQ(tfsGetDisksAtLevel(&tfs, tfs.nlevel), 0); + + EXPECT_EQ(tfsGetLevel(&tfs), tfs.nlevel); + + for (int32_t l = 0; l < tfs.nlevel; ++l) { + EXPECT_EQ(taosThreadSpinInit(&tfs.tiers[l].lock, 0), 0); + } + + SDiskID diskID = {0}; + disk.size.avail = TFS_MIN_DISK_FREE_SIZE; + EXPECT_EQ(tfsAllocDisk(&tfs, tfs.nlevel, &diskID), 0); + tfs.nlevel = 0; + diskID.level = 0; + EXPECT_EQ(tfsAllocDisk(&tfs, 0, &diskID), 0); + tfs.nlevel = 2; + + diskID.id = 10; + EXPECT_EQ(tfsMkdirAt(&tfs, NULL, diskID), TSDB_CODE_FS_INVLD_CFG); + + EXPECT_NE(tfsMkdirRecurAt(&tfs, NULL, diskID), 0); + + const char *rname = ""; + EXPECT_EQ(tfsRmdir(&tfs, rname), 0); + + EXPECT_EQ(tfsSearch(&tfs, -1, NULL), -1); + EXPECT_EQ(tfsSearch(&tfs, tfs.nlevel, NULL), -1); + + for (int32_t l = 0; l < tfs.nlevel; ++l) { + EXPECT_EQ(taosThreadSpinDestroy(&tfs.tiers[l].lock), 0); + } } From eed6dfcdc3e0a9280b7bf044eb57bc3e75bf909f Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Tue, 24 Dec 2024 08:35:41 +0800 Subject: [PATCH 44/84] test/cos: destruct cos object --- source/common/test/cosTest.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/common/test/cosTest.cpp b/source/common/test/cosTest.cpp index 7a8ffd69de..5e186e4dfa 100644 --- a/source/common/test/cosTest.cpp +++ b/source/common/test/cosTest.cpp @@ -85,9 +85,13 @@ TEST(testCase, cosCpPutError) { char const *objectName = "testObject"; EXPECT_EQ(cosInitEnv(), TSDB_CODE_SUCCESS); + EXPECT_EQ(s3Begin(), TSDB_CODE_SUCCESS); EXPECT_EQ(s3Size(objectName), -1); + s3EvictCache("", 0); + s3End(); + return; _exit: From 0885ab73dcab8fffedb98969df57fb2669b47ee1 Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Tue, 24 Dec 2024 10:58:31 +0800 Subject: [PATCH 45/84] fix mac s3Size return value --- source/common/test/cosTest.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/source/common/test/cosTest.cpp b/source/common/test/cosTest.cpp index 5e186e4dfa..5a6aee52d9 100644 --- a/source/common/test/cosTest.cpp +++ b/source/common/test/cosTest.cpp @@ -81,12 +81,16 @@ int32_t cosInitEnv() { TEST(testCase, cosCpPutError) { int32_t code = 0, lino = 0; - long objectSize = 128 * 1024 * 1024; char const *objectName = "testObject"; EXPECT_EQ(cosInitEnv(), TSDB_CODE_SUCCESS); EXPECT_EQ(s3Begin(), TSDB_CODE_SUCCESS); + +#if defined(USE_S3) EXPECT_EQ(s3Size(objectName), -1); +#else + EXPECT_EQ(s3Size(objectName), 0); +#endif s3EvictCache("", 0); @@ -155,7 +159,11 @@ TEST(testCase, cosCpPut) { code = s3PutObjectFromFile2(path, objectName, with_cp); GTEST_ASSERT_EQ(code, 0); +#if defined(USE_S3) EXPECT_EQ(s3Size(objectName), objectSize); +#else + EXPECT_EQ(s3Size(objectName), 0); +#endif s3End(); s3EvictCache("", 0); From b354bd66f51dfb7547f7407be3ce5c2f6d20c915 Mon Sep 17 00:00:00 2001 From: kailixu Date: Tue, 24 Dec 2024 11:50:59 +0800 Subject: [PATCH 46/84] enh: test coverage of tfs --- source/libs/tfs/inc/tfsInt.h | 1 + source/libs/tfs/src/tfs.c | 31 +++++++++++++++---------------- source/libs/tfs/test/tfsTest.cpp | 30 +++++++++++++++++++++++++++++- 3 files changed, 45 insertions(+), 17 deletions(-) diff --git a/source/libs/tfs/inc/tfsInt.h b/source/libs/tfs/inc/tfsInt.h index ccc6e213ea..5dd9ce568f 100644 --- a/source/libs/tfs/inc/tfsInt.h +++ b/source/libs/tfs/inc/tfsInt.h @@ -78,6 +78,7 @@ typedef struct STfs { SHashObj *hash; // name to did map } STfs; +int32_t tfsCheckAndFormatCfg(STfs *pTfs, SDiskCfg *pCfg); int32_t tfsNewDisk(int32_t level, int32_t id, int8_t disable, const char *dir, STfsDisk **ppDisk); STfsDisk *tfsFreeDisk(STfsDisk *pDisk); int32_t tfsUpdateDiskSize(STfsDisk *pDisk); diff --git a/source/libs/tfs/src/tfs.c b/source/libs/tfs/src/tfs.c index d3767c5d7a..5021a6ae39 100644 --- a/source/libs/tfs/src/tfs.c +++ b/source/libs/tfs/src/tfs.c @@ -19,7 +19,6 @@ static int32_t tfsMount(STfs *pTfs, SDiskCfg *pCfg); static int32_t tfsCheck(STfs *pTfs); -static int32_t tfsCheckAndFormatCfg(STfs *pTfs, SDiskCfg *pCfg); static int32_t tfsFormatDir(char *idir, char *odir); static int32_t tfsGetDiskByName(STfs *pTfs, const char *dir, STfsDisk **ppDisk); static int32_t tfsOpendirImpl(STfs *pTfs, STfsDir *pDir); @@ -515,7 +514,7 @@ _exit: TAOS_RETURN(code); } -static int32_t tfsCheckAndFormatCfg(STfs *pTfs, SDiskCfg *pCfg) { +int32_t tfsCheckAndFormatCfg(STfs *pTfs, SDiskCfg *pCfg) { int32_t code = 0; char dirName[TSDB_FILENAME_LEN] = "\0"; @@ -577,32 +576,32 @@ static int32_t tfsCheckAndFormatCfg(STfs *pTfs, SDiskCfg *pCfg) { } static int32_t tfsFormatDir(char *idir, char *odir) { + int32_t code = 0, lino = 0; wordexp_t wep = {0}; + int32_t dirLen = 0; + char tmp[PATH_MAX] = {0}; - int32_t code = wordexp(idir, &wep, 0); + code = wordexp(idir, &wep, 0); if (code != 0) { - TAOS_RETURN(TAOS_SYSTEM_ERROR(code)); + TAOS_CHECK_EXIT(TAOS_SYSTEM_ERROR(code)); } - char tmp[PATH_MAX] = {0}; - if (taosRealPath(wep.we_wordv[0], tmp, PATH_MAX) != 0) { - code = TAOS_SYSTEM_ERROR(errno); - wordfree(&wep); - TAOS_RETURN(code); - } + TAOS_CHECK_EXIT(taosRealPath(wep.we_wordv[0], tmp, PATH_MAX)); - int32_t dirLen = strlen(tmp); + dirLen = strlen(tmp); if (dirLen < 0 || dirLen >= TSDB_FILENAME_LEN) { - wordfree(&wep); - code = TSDB_CODE_OUT_OF_RANGE; - fError("failed to mount %s to FS since %s, real path:%s, len:%d", idir, tstrerror(code), tmp, dirLen); - TAOS_RETURN(code); + TAOS_CHECK_EXIT(TSDB_CODE_OUT_OF_RANGE); } tstrncpy(odir, tmp, TSDB_FILENAME_LEN); +_exit: wordfree(&wep); - TAOS_RETURN(0); + if (code != 0) { + fError("failed to mount %s to FS at line %d since %s, real path:%s, len:%d", idir, lino, tstrerror(code), tmp, + dirLen); + } + TAOS_RETURN(code); } static int32_t tfsCheck(STfs *pTfs) { diff --git a/source/libs/tfs/test/tfsTest.cpp b/source/libs/tfs/test/tfsTest.cpp index 1da1b63d9f..00892a7b9e 100644 --- a/source/libs/tfs/test/tfsTest.cpp +++ b/source/libs/tfs/test/tfsTest.cpp @@ -749,10 +749,11 @@ TEST_F(TfsTest, 05_MultiDisk) { tfsClose(pTfs); } -TEST_F(TfsTest, 06_Exception) { +TEST_F(TfsTest, 06_Misc) { // tfsDisk.c STfsDisk *pDisk = NULL; EXPECT_EQ(tfsNewDisk(0, 0, 0, NULL, &pDisk), TSDB_CODE_INVALID_PARA); + EXPECT_NE(tfsNewDisk(0, 0, 0, "", &pDisk), 0); STfsDisk disk = {0}; EXPECT_EQ(tfsUpdateDiskSize(&disk), TSDB_CODE_INVALID_PARA); @@ -828,6 +829,33 @@ TEST_F(TfsTest, 06_Exception) { EXPECT_EQ(tfsSearch(&tfs, -1, NULL), -1); EXPECT_EQ(tfsSearch(&tfs, tfs.nlevel, NULL), -1); + diskCfg.level = -1; + EXPECT_EQ(tfsCheckAndFormatCfg(&tfs, &diskCfg), TSDB_CODE_FS_INVLD_CFG); + diskCfg.level = TFS_MAX_TIERS; + EXPECT_EQ(tfsCheckAndFormatCfg(&tfs, &diskCfg), TSDB_CODE_FS_INVLD_CFG); + diskCfg.level = 0; + diskCfg.primary = -1; + EXPECT_EQ(tfsCheckAndFormatCfg(&tfs, &diskCfg), TSDB_CODE_FS_INVLD_CFG); + diskCfg.primary = 2; + EXPECT_EQ(tfsCheckAndFormatCfg(&tfs, &diskCfg), TSDB_CODE_FS_INVLD_CFG); + diskCfg.primary = 1; + diskCfg.disable = -1; + EXPECT_EQ(tfsCheckAndFormatCfg(&tfs, &diskCfg), TSDB_CODE_FS_INVLD_CFG); + diskCfg.disable = 2; + EXPECT_EQ(tfsCheckAndFormatCfg(&tfs, &diskCfg), TSDB_CODE_FS_INVLD_CFG); + diskCfg.disable = 0; + diskCfg.level = 1; + EXPECT_EQ(tfsCheckAndFormatCfg(&tfs, &diskCfg), TSDB_CODE_FS_INVLD_CFG); + diskCfg.level = 0; + diskCfg.primary = 0; + tstrncpy(diskCfg.dir, "testDataDir1", TSDB_FILENAME_LEN); + EXPECT_NE(tfsCheckAndFormatCfg(&tfs, &diskCfg), 0); + + TdFilePtr pFile = taosCreateFile("testDataDir1", TD_FILE_CREATE); + EXPECT_NE(pFile, nullptr); + EXPECT_EQ(tfsCheckAndFormatCfg(&tfs, &diskCfg), TSDB_CODE_FS_INVLD_CFG); + EXPECT_EQ(taosRemoveFile("testDataDir1"), 0); + for (int32_t l = 0; l < tfs.nlevel; ++l) { EXPECT_EQ(taosThreadSpinDestroy(&tfs.tiers[l].lock), 0); } From aff95d5439eef9e65887801ea589f795a094dc8b Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Tue, 24 Dec 2024 12:40:11 +0800 Subject: [PATCH 47/84] test/cos: not run cos test on windows --- source/common/test/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/common/test/CMakeLists.txt b/source/common/test/CMakeLists.txt index dfd92d476c..31afb7377e 100644 --- a/source/common/test/CMakeLists.txt +++ b/source/common/test/CMakeLists.txt @@ -58,6 +58,8 @@ add_test( COMMAND cosCpTest ) +if(TD_LINUX) + # cosTest.cpp add_executable(cosTest "") target_sources( @@ -76,6 +78,8 @@ add_test( COMMAND cosTest ) +endif() + if (${TD_LINUX}) # tmsg test add_executable(tmsgTest "") From 1f3062477d95e9f5cbcdf0fea1fb4af6eea2f31c Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Tue, 24 Dec 2024 17:07:19 +0800 Subject: [PATCH 48/84] test/az: new big block & exception test --- source/libs/azure/test/azExceptionTest.cpp | 210 +++++++++++++++++++++ source/libs/azure/test/azTest.cpp | 129 +++++++++++++ 2 files changed, 339 insertions(+) create mode 100644 source/libs/azure/test/azExceptionTest.cpp diff --git a/source/libs/azure/test/azExceptionTest.cpp b/source/libs/azure/test/azExceptionTest.cpp new file mode 100644 index 0000000000..a83bb4d8f2 --- /dev/null +++ b/source/libs/azure/test/azExceptionTest.cpp @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include + +// clang-format off +#include "td_block_blob_client.hpp" +#include "az.h" +// clang-format on + +using namespace Azure::Storage; +using namespace Azure::Storage::Blobs; + +extern int8_t tsS3Enabled; +extern char tsS3BucketName[TSDB_FQDN_LEN]; + +static int32_t azInitEnv() { + int32_t code = 0; + + extern int8_t tsS3EpNum; + + extern char tsS3Hostname[][TSDB_FQDN_LEN]; + extern char tsS3AccessKeyId[][TSDB_FQDN_LEN]; + extern char tsS3AccessKeySecret[][TSDB_FQDN_LEN]; + + /* TCS parameter format + tsS3Hostname[0] = "/.blob.core.windows.net"; + tsS3AccessKeyId[0] = ""; + tsS3AccessKeySecret[0] = ""; + tsS3BucketName = ""; + */ + + const char *hostname = "/.blob.core.windows.net"; + const char *accessKeyId = ""; + const char *accessKeySecret = ""; + const char *bucketName = ""; + + if (hostname[0] != '<') { + tstrncpy(&tsS3Hostname[0][0], hostname, TSDB_FQDN_LEN); + tstrncpy(&tsS3AccessKeyId[0][0], accessKeyId, TSDB_FQDN_LEN); + tstrncpy(&tsS3AccessKeySecret[0][0], accessKeySecret, TSDB_FQDN_LEN); + tstrncpy(tsS3BucketName, bucketName, TSDB_FQDN_LEN); + } else { + const char *accountId = getenv("ablob_account_id"); + if (!accountId) { + return -1; + } + + const char *accountSecret = getenv("ablob_account_secret"); + if (!accountSecret) { + return -1; + } + + const char *containerName = getenv("ablob_container"); + if (!containerName) { + return -1; + } + + TAOS_STRCPY(&tsS3Hostname[0][0], accountId); + TAOS_STRCAT(&tsS3Hostname[0][0], ".blob.core.windows.net"); + TAOS_STRCPY(&tsS3AccessKeyId[0][0], accountId); + TAOS_STRCPY(&tsS3AccessKeySecret[0][0], accountSecret); + TAOS_STRCPY(tsS3BucketName, containerName); + } + + tstrncpy(tsTempDir, "/tmp/", PATH_MAX); + + tsS3Enabled = true; + + return code; +} + +// TEST(AzTest, DISABLED_InterfaceTest) { +TEST(AzETest, InterfaceTest) { + int code = 0; + bool check = false; + bool withcp = false; + + code = azInitEnv(); + if (code) { + std::cout << "ablob env init failed with: " << code << std::endl; + return; + } + + GTEST_ASSERT_EQ(code, 0); + GTEST_ASSERT_EQ(tsS3Enabled, 1); + + code = azBegin(); + GTEST_ASSERT_EQ(code, 0); + + code = azCheckCfg(); + GTEST_ASSERT_EQ(code, 0); + const int size = 4096; + char data[size] = {0}; + for (int i = 0; i < size / 2; ++i) { + data[i * 2 + 1] = 1; + } + + const char object_name[] = "azut.bin"; + char path[PATH_MAX] = {0}; + char path_download[PATH_MAX] = {0}; + int ds_len = strlen(TD_DIRSEP); + int tmp_len = strlen(tsTempDir); + + (void)snprintf(path, PATH_MAX, "%s", tsTempDir); + if (strncmp(tsTempDir + tmp_len - ds_len, TD_DIRSEP, ds_len) != 0) { + (void)snprintf(path + tmp_len, PATH_MAX - tmp_len, "%s", TD_DIRSEP); + (void)snprintf(path + tmp_len + ds_len, PATH_MAX - tmp_len - ds_len, "%s", object_name); + } else { + (void)snprintf(path + tmp_len, PATH_MAX - tmp_len, "%s", object_name); + } + + tstrncpy(path_download, path, strlen(path) + 1); + tstrncpy(path_download + strlen(path), ".download", strlen(".download") + 1); + + TdFilePtr fp = taosOpenFile(path, TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_WRITE_THROUGH); + GTEST_ASSERT_NE(fp, nullptr); + + int n = taosWriteFile(fp, data, size); + GTEST_ASSERT_EQ(n, size); + + code = taosCloseFile(&fp); + GTEST_ASSERT_EQ(code, 0); + + code = azPutObjectFromFileOffset(path, object_name, 0, size); + GTEST_ASSERT_EQ(code, 0); + + uint8_t *pBlock = NULL; + code = azGetObjectBlock(object_name, 0, size, check, &pBlock); + GTEST_ASSERT_EQ(code, 0); + + for (int i = 0; i < size / 2; ++i) { + GTEST_ASSERT_EQ(pBlock[i * 2], 0); + GTEST_ASSERT_EQ(pBlock[i * 2 + 1], 1); + } + + taosMemoryFree(pBlock); + + code = azGetObjectToFile(object_name, path_download); + GTEST_ASSERT_EQ(code, 0); + + { + TdFilePtr fp = taosOpenFile(path, TD_FILE_READ); + GTEST_ASSERT_NE(fp, nullptr); + + (void)memset(data, 0, size); + + int64_t n = taosReadFile(fp, data, size); + GTEST_ASSERT_EQ(n, size); + + code = taosCloseFile(&fp); + GTEST_ASSERT_EQ(code, 0); + + for (int i = 0; i < size / 2; ++i) { + GTEST_ASSERT_EQ(data[i * 2], 0); + GTEST_ASSERT_EQ(data[i * 2 + 1], 1); + } + } + + azDeleteObjectsByPrefix(object_name); + // list object to check + + code = azPutObjectFromFile2(path, object_name, withcp); + GTEST_ASSERT_EQ(code, 0); + + code = azGetObjectsByPrefix(object_name, tsTempDir); + GTEST_ASSERT_EQ(code, 0); + + { + TdFilePtr fp = taosOpenFile(path, TD_FILE_READ); + GTEST_ASSERT_NE(fp, nullptr); + + (void)memset(data, 0, size); + + int64_t n = taosReadFile(fp, data, size); + GTEST_ASSERT_EQ(n, size); + + code = taosCloseFile(&fp); + GTEST_ASSERT_EQ(code, 0); + + for (int i = 0; i < size / 2; ++i) { + GTEST_ASSERT_EQ(data[i * 2], 0); + GTEST_ASSERT_EQ(data[i * 2 + 1], 1); + } + } + + TDBlockBlobClient blobClient = + TDBlockBlobClient::CreateFromConnectionString(std::getenv("ablob_cs"), std::string(tsS3BucketName), object_name); + + const char *object_name_arr[] = {object_name}; + code = azDeleteObjects(object_name_arr, 1); + GTEST_ASSERT_EQ(code, 0); + + azEnd(); +} diff --git a/source/libs/azure/test/azTest.cpp b/source/libs/azure/test/azTest.cpp index 0459cb5f6a..b57b7ca884 100644 --- a/source/libs/azure/test/azTest.cpp +++ b/source/libs/azure/test/azTest.cpp @@ -199,3 +199,132 @@ TEST(AzTest, InterfaceTest) { azEnd(); } + +// TEST(AzTest, DISABLED_InterfaceTestBig) { +TEST(AzTest, InterfaceTestBig) { + int code = 0; + bool check = false; + bool withcp = false; + + code = azInitEnv(); + if (code) { + std::cout << "ablob env init failed with: " << code << std::endl; + return; + } + + GTEST_ASSERT_EQ(code, 0); + GTEST_ASSERT_EQ(tsS3Enabled, 1); + + code = azBegin(); + GTEST_ASSERT_EQ(code, 0); + + code = azCheckCfg(); + GTEST_ASSERT_EQ(code, 0); + const int size = 256 * 1024 * 1024 + 1; + char *data = (char *)taosMemoryCalloc(1, size); + if (!data) { + std::cout << "code: " << code << "terrno: " << terrno << std::endl; + + return; + } + + for (int i = 0; i < size / 2; ++i) { + data[i * 2 + 1] = 1; + } + + const char object_name[] = "azut.bin"; + char path[PATH_MAX] = {0}; + char path_download[PATH_MAX] = {0}; + int ds_len = strlen(TD_DIRSEP); + int tmp_len = strlen(tsTempDir); + + (void)snprintf(path, PATH_MAX, "%s", tsTempDir); + if (strncmp(tsTempDir + tmp_len - ds_len, TD_DIRSEP, ds_len) != 0) { + (void)snprintf(path + tmp_len, PATH_MAX - tmp_len, "%s", TD_DIRSEP); + (void)snprintf(path + tmp_len + ds_len, PATH_MAX - tmp_len - ds_len, "%s", object_name); + } else { + (void)snprintf(path + tmp_len, PATH_MAX - tmp_len, "%s", object_name); + } + + tstrncpy(path_download, path, strlen(path) + 1); + tstrncpy(path_download + strlen(path), ".download", strlen(".download") + 1); + + TdFilePtr fp = taosOpenFile(path, TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_WRITE_THROUGH); + GTEST_ASSERT_NE(fp, nullptr); + + int n = taosWriteFile(fp, data, size); + GTEST_ASSERT_EQ(n, size); + + code = taosCloseFile(&fp); + GTEST_ASSERT_EQ(code, 0); + + code = azPutObjectFromFileOffset(path, object_name, 0, size); + GTEST_ASSERT_EQ(code, 0); + + uint8_t *pBlock = NULL; + code = azGetObjectBlock(object_name, 0, size, check, &pBlock); + GTEST_ASSERT_EQ(code, 0); + + for (int i = 0; i < size / 2; ++i) { + GTEST_ASSERT_EQ(pBlock[i * 2], 0); + GTEST_ASSERT_EQ(pBlock[i * 2 + 1], 1); + } + + taosMemoryFree(pBlock); + + code = azGetObjectToFile(object_name, path_download); + GTEST_ASSERT_EQ(code, 0); + + { + TdFilePtr fp = taosOpenFile(path, TD_FILE_READ); + GTEST_ASSERT_NE(fp, nullptr); + + (void)memset(data, 0, size); + + int64_t n = taosReadFile(fp, data, size); + GTEST_ASSERT_EQ(n, size); + + code = taosCloseFile(&fp); + GTEST_ASSERT_EQ(code, 0); + + for (int i = 0; i < size / 2; ++i) { + GTEST_ASSERT_EQ(data[i * 2], 0); + GTEST_ASSERT_EQ(data[i * 2 + 1], 1); + } + } + + azDeleteObjectsByPrefix(object_name); + // list object to check + + code = azPutObjectFromFile2(path, object_name, withcp); + GTEST_ASSERT_EQ(code, 0); + + code = azGetObjectsByPrefix(object_name, tsTempDir); + GTEST_ASSERT_EQ(code, 0); + + { + TdFilePtr fp = taosOpenFile(path, TD_FILE_READ); + GTEST_ASSERT_NE(fp, nullptr); + + (void)memset(data, 0, size); + + int64_t n = taosReadFile(fp, data, size); + GTEST_ASSERT_EQ(n, size); + + code = taosCloseFile(&fp); + GTEST_ASSERT_EQ(code, 0); + + for (int i = 0; i < size / 2; ++i) { + GTEST_ASSERT_EQ(data[i * 2], 0); + GTEST_ASSERT_EQ(data[i * 2 + 1], 1); + } + } + + const char *object_name_arr[] = {object_name}; + code = azDeleteObjects(object_name_arr, 1); + GTEST_ASSERT_EQ(code, 0); + + taosMemoryFree(data); + + azEnd(); +} From 9d15245dc626645960fd89052afcebea64d1d4da Mon Sep 17 00:00:00 2001 From: kailixu Date: Tue, 24 Dec 2024 17:56:54 +0800 Subject: [PATCH 49/84] enh: test coverage of tlog --- source/util/inc/tlogInt.h | 32 ++++++++++++ source/util/src/tlog.c | 46 ++++++++--------- source/util/test/CMakeLists.txt | 4 ++ source/util/test/log.cpp | 91 +++++++++++++++++++++++++++++++++ 4 files changed, 147 insertions(+), 26 deletions(-) create mode 100644 source/util/inc/tlogInt.h diff --git a/source/util/inc/tlogInt.h b/source/util/inc/tlogInt.h new file mode 100644 index 0000000000..0d51862f86 --- /dev/null +++ b/source/util/inc/tlogInt.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef _TD_UTIL_LOG_INT_H_ +#define _TD_UTIL_LOG_INT_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "tlog.h" + +void taosOpenNewSlowLogFile(); +void taosLogObjSetTimeStamp(int64_t ts); + +#ifdef __cplusplus +} +#endif + +#endif /*_TD_UTIL_LOG_INT_H_*/ diff --git a/source/util/src/tlog.c b/source/util/src/tlog.c index a9eef1bfc9..1794917d76 100644 --- a/source/util/src/tlog.c +++ b/source/util/src/tlog.c @@ -101,8 +101,10 @@ bool tsLogEmbedded = 0; bool tsAsyncLog = true; #ifdef ASSERT_NOT_CORE bool tsAssert = false; +#define LOG_BUFFER_WAIT_SEC 20 #else bool tsAssert = true; +#define LOG_BUFFER_WAIT_SEC 2 #endif int32_t tsNumOfLogLines = 10000000; int32_t tsLogKeepDays = 0; @@ -442,7 +444,7 @@ static OldFileKeeper *taosOpenNewFile() { static void *taosThreadToCloseOldFile(void *param) { if (!param) return NULL; OldFileKeeper *oldFileKeeper = (OldFileKeeper *)param; - taosSsleep(20); + taosSsleep(LOG_BUFFER_WAIT_SEC); taosWLockLatch(&tsLogRotateLatch); taosCloseLogByFd(oldFileKeeper->pOldFile); taosKeepOldLog(oldFileKeeper->keepName); @@ -483,7 +485,7 @@ static int32_t taosOpenNewLogFile() { return 0; } -static void taosOpenNewSlowLogFile() { +void taosOpenNewSlowLogFile() { (void)taosThreadMutexLock(&tsLogObj.logMutex); int64_t delta = taosGetTimestampSec() - tsLogObj.timestampToday; if (delta >= 0 && delta < 86400) { @@ -539,6 +541,8 @@ void taosResetLog() { } } +void taosLogObjSetTimeStamp(int64_t ts) { tsLogObj.timestampToday = ts; } + static bool taosCheckFileIsOpen(char *logFileName) { TdFilePtr pFile = taosOpenFile(logFileName, TD_FILE_WRITE); if (pFile == NULL) { @@ -619,6 +623,7 @@ static void processLogFileName(const char *logName, int32_t maxFileNum) { } static int32_t taosInitNormalLog(const char *logName, int32_t maxFileNum) { + int32_t code = 0, lino = 0; #ifdef WINDOWS_STASH /* * always set maxFileNum to 1 @@ -653,38 +658,27 @@ static int32_t taosInitNormalLog(const char *logName, int32_t maxFileNum) { // only an estimate for number of lines int64_t filesize = 0; - if (taosFStatFile(tsLogObj.logHandle->pFile, &filesize, NULL) != 0) { - (void)printf("\nfailed to fstat log file:%s, reason:%s\n", name, strerror(errno)); - taosUnLockLogFile(tsLogObj.logHandle->pFile); - return terrno; - } + TAOS_CHECK_EXIT(taosFStatFile(tsLogObj.logHandle->pFile, &filesize, NULL)); + tsLogObj.lines = (int32_t)(filesize / 60); if (taosLSeekFile(tsLogObj.logHandle->pFile, 0, SEEK_END) < 0) { - TAOS_UNUSED(printf("failed to seek to the end of log file:%s, reason:%s\n", name, tstrerror(terrno))); - taosUnLockLogFile(tsLogObj.logHandle->pFile); - return terrno; + TAOS_CHECK_EXIT(code = terrno ? terrno : -1); } - (void)snprintf(name, sizeof(name), "==================================================\n"); + (void)snprintf(name, sizeof(name), + "==================================================\n" + " new log file\n" + "==================================================\n"); if (taosWriteFile(tsLogObj.logHandle->pFile, name, (uint32_t)strlen(name)) <= 0) { - TAOS_UNUSED(printf("failed to write to log file:%s, reason:%s\n", name, tstrerror(terrno))); - taosUnLockLogFile(tsLogObj.logHandle->pFile); - return terrno; - } - (void)snprintf(name, sizeof(name), " new log file \n"); - if (taosWriteFile(tsLogObj.logHandle->pFile, name, (uint32_t)strlen(name)) <= 0) { - TAOS_UNUSED(printf("failed to write to log file:%s, reason:%s\n", name, tstrerror(terrno))); - taosUnLockLogFile(tsLogObj.logHandle->pFile); - return terrno; - } - (void)snprintf(name, sizeof(name), "==================================================\n"); - if (taosWriteFile(tsLogObj.logHandle->pFile, name, (uint32_t)strlen(name)) <= 0) { - TAOS_UNUSED(printf("failed to write to log file:%s, reason:%s\n", name, tstrerror(terrno))); - taosUnLockLogFile(tsLogObj.logHandle->pFile); - return terrno; + TAOS_CHECK_EXIT(code = terrno ? terrno : -1); } +_exit: + taosUnLockLogFile(tsLogObj.logHandle->pFile); + if (code != 0) { + TAOS_UNUSED(printf("failed to init normal log file:%s at line %d, reason:%s\n", name, lino, tstrerror(code))); + } return 0; } diff --git a/source/util/test/CMakeLists.txt b/source/util/test/CMakeLists.txt index cde1392216..ec05a4e415 100644 --- a/source/util/test/CMakeLists.txt +++ b/source/util/test/CMakeLists.txt @@ -137,6 +137,10 @@ add_test( NAME logTest COMMAND logTest ) +target_include_directories( + logTest + PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../inc" +) IF(COMPILER_SUPPORT_AVX2) MESSAGE(STATUS "AVX2 instructions is ACTIVATED") diff --git a/source/util/test/log.cpp b/source/util/test/log.cpp index ba32d2d639..c45b6b97ae 100644 --- a/source/util/test/log.cpp +++ b/source/util/test/log.cpp @@ -2,7 +2,9 @@ #include #include #include +#include #include +#include #include using namespace std; @@ -44,3 +46,92 @@ TEST(log, check_log_refactor) { } taosCloseLog(); } + +extern char *tsLogOutput; +TEST(log, misc) { + // taosInitLog + const char *path = TD_TMP_DIR_PATH "td"; + taosRemoveDir(path); + taosMkDir(path); + tstrncpy(tsLogDir, path, PATH_MAX); + EXPECT_EQ(taosInitLog("taoslog", 1, true), 0); + + taosOpenNewSlowLogFile(); + taosLogObjSetTimeStamp(INT64_MIN); + taosPrintSlowLog("slow log test"); + + // test taosInitLogOutput + const char *pLogName = NULL; + tsLogOutput = (char *)taosMemCalloc(1, TSDB_FILENAME_LEN); + EXPECT_EQ(taosInitLogOutput(&pLogName), TSDB_CODE_INVALID_CFG); + tstrncpy(tsLogOutput, "stdout", TSDB_FILENAME_LEN); + EXPECT_EQ(taosInitLogOutput(&pLogName), 0); + tstrncpy(tsLogOutput, "stderr", TSDB_FILENAME_LEN); + EXPECT_EQ(taosInitLogOutput(&pLogName), 0); + tstrncpy(tsLogOutput, "/dev/null", TSDB_FILENAME_LEN); + EXPECT_EQ(taosInitLogOutput(&pLogName), 0); + tsLogOutput[0] = '#'; + EXPECT_EQ(taosInitLogOutput(&pLogName), TSDB_CODE_INVALID_CFG); + tstrncpy(tsLogOutput, "/", TSDB_FILENAME_LEN); + EXPECT_EQ(taosInitLogOutput(&pLogName), 0); + tstrncpy(tsLogOutput, "\\", TSDB_FILENAME_LEN); + EXPECT_EQ(taosInitLogOutput(&pLogName), 0); + tstrncpy(tsLogOutput, "testLogOutput", TSDB_FILENAME_LEN); + EXPECT_EQ(taosInitLogOutput(&pLogName), 0); + tstrncpy(tsLogOutput, "testLogOutputDir/testLogOutput", TSDB_FILENAME_LEN); + EXPECT_EQ(taosInitLogOutput(&pLogName), 0); + tstrncpy(tsLogOutput, ".", TSDB_FILENAME_LEN); + EXPECT_EQ(taosInitLogOutput(&pLogName), TSDB_CODE_INVALID_CFG); + tstrncpy(tsLogOutput, "/..", TSDB_FILENAME_LEN); + EXPECT_EQ(taosInitLogOutput(&pLogName), TSDB_CODE_INVALID_CFG); + tsLogOutput[0] = 0; + + // test taosAssertDebug + tsAssert = false; + taosAssertDebug(true, __FILE__, __LINE__, 0, "test_assert_true_without_core"); + taosAssertDebug(false, __FILE__, __LINE__, 0, "test_assert_false_with_core"); + tsAssert = true; + + // test taosLogCrashInfo, taosReadCrashInfo and taosReleaseCrashLogFile + char nodeType[16] = "nodeType"; + char *pCrashMsg = (char *)taosMemoryCalloc(1, 16); + EXPECT_NE(pCrashMsg, nullptr); + tstrncpy(pCrashMsg, "crashMsg", 16); + + pid_t pid = taosGetPId(); + EXPECT_EQ(pid > 0, true); + siginfo_t sigInfo = {0}; + sigInfo.si_pid = pid; + taosLogCrashInfo(nodeType, pCrashMsg, strlen(pCrashMsg), 0, &sigInfo); + + char crashInfo[PATH_MAX] = {0}; + snprintf(crashInfo, sizeof(crashInfo), "%s%s.%sCrashLog", tsLogDir, TD_DIRSEP, nodeType); + + char *pReadMsg = NULL; + int64_t readMsgLen = 0; + TdFilePtr pFile = NULL; + taosReadCrashInfo(crashInfo, &pReadMsg, &readMsgLen, &pFile); + EXPECT_NE(pReadMsg, nullptr); + EXPECT_NE(pFile, nullptr); + EXPECT_EQ(strncasecmp(pReadMsg, "crashMsg", strlen("crashMsg")), 0); + EXPECT_EQ(taosCloseFile(&pFile), 0); + taosMemoryFreeClear(pReadMsg); + + pFile = taosOpenFile(crashInfo, TD_FILE_WRITE); + EXPECT_NE(pFile, nullptr); + EXPECT_EQ(taosWriteFile(pFile, "00000", 1), 1); + EXPECT_EQ(taosCloseFile(&pFile), 0); + + taosReadCrashInfo(crashInfo, &pReadMsg, &readMsgLen, &pFile); + EXPECT_EQ(pReadMsg, nullptr); + EXPECT_EQ(pFile, nullptr); + + pFile = taosOpenFile(crashInfo, TD_FILE_WRITE); + EXPECT_NE(pFile, nullptr); + taosReleaseCrashLogFile(pFile, true); + + // clean up + taosRemoveDir(path); + + taosCloseLog(); +} From db56c38b5f883a3681f37bd4e29ae564a0cd1119 Mon Sep 17 00:00:00 2001 From: kailixu Date: Tue, 24 Dec 2024 18:08:00 +0800 Subject: [PATCH 50/84] enh: test coverage of tlog --- source/util/inc/tlogInt.h | 2 +- source/util/src/tlog.c | 2 +- source/util/test/log.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/source/util/inc/tlogInt.h b/source/util/inc/tlogInt.h index 0d51862f86..1d7f3a063d 100644 --- a/source/util/inc/tlogInt.h +++ b/source/util/inc/tlogInt.h @@ -23,7 +23,7 @@ extern "C" { #include "tlog.h" void taosOpenNewSlowLogFile(); -void taosLogObjSetTimeStamp(int64_t ts); +void taosLogObjSetToday(int64_t ts); #ifdef __cplusplus } diff --git a/source/util/src/tlog.c b/source/util/src/tlog.c index 1794917d76..2f0c14ab9f 100644 --- a/source/util/src/tlog.c +++ b/source/util/src/tlog.c @@ -541,7 +541,7 @@ void taosResetLog() { } } -void taosLogObjSetTimeStamp(int64_t ts) { tsLogObj.timestampToday = ts; } +void taosLogObjSetToday(int64_t ts) { tsLogObj.timestampToday = ts; } static bool taosCheckFileIsOpen(char *logFileName) { TdFilePtr pFile = taosOpenFile(logFileName, TD_FILE_WRITE); diff --git a/source/util/test/log.cpp b/source/util/test/log.cpp index c45b6b97ae..5b7c7b9ef6 100644 --- a/source/util/test/log.cpp +++ b/source/util/test/log.cpp @@ -57,7 +57,7 @@ TEST(log, misc) { EXPECT_EQ(taosInitLog("taoslog", 1, true), 0); taosOpenNewSlowLogFile(); - taosLogObjSetTimeStamp(INT64_MIN); + taosLogObjSetToday(INT64_MIN); taosPrintSlowLog("slow log test"); // test taosInitLogOutput From 1d91252188ebf3e8da2531d66cbec7151f3bb68b Mon Sep 17 00:00:00 2001 From: kailixu Date: Tue, 24 Dec 2024 18:10:29 +0800 Subject: [PATCH 51/84] enh: test coverage of tlog --- source/util/src/tlog.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/source/util/src/tlog.c b/source/util/src/tlog.c index 2f0c14ab9f..053ade2d5e 100644 --- a/source/util/src/tlog.c +++ b/source/util/src/tlog.c @@ -101,10 +101,8 @@ bool tsLogEmbedded = 0; bool tsAsyncLog = true; #ifdef ASSERT_NOT_CORE bool tsAssert = false; -#define LOG_BUFFER_WAIT_SEC 20 #else bool tsAssert = true; -#define LOG_BUFFER_WAIT_SEC 2 #endif int32_t tsNumOfLogLines = 10000000; int32_t tsLogKeepDays = 0; @@ -444,7 +442,7 @@ static OldFileKeeper *taosOpenNewFile() { static void *taosThreadToCloseOldFile(void *param) { if (!param) return NULL; OldFileKeeper *oldFileKeeper = (OldFileKeeper *)param; - taosSsleep(LOG_BUFFER_WAIT_SEC); + taosSsleep(20); taosWLockLatch(&tsLogRotateLatch); taosCloseLogByFd(oldFileKeeper->pOldFile); taosKeepOldLog(oldFileKeeper->keepName); From 782848a6e7b4812c1fe17ca5c02980b1989a5733 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Wed, 25 Dec 2024 08:19:40 +0800 Subject: [PATCH 52/84] add tes case --- source/libs/transport/test/transUT2.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/source/libs/transport/test/transUT2.cpp b/source/libs/transport/test/transUT2.cpp index 6dfb5e503a..fabe9e9c4f 100644 --- a/source/libs/transport/test/transUT2.cpp +++ b/source/libs/transport/test/transUT2.cpp @@ -615,6 +615,21 @@ TEST_F(TransEnv, http) { #endif } +#if 1 + STelemAddrMgmt mgt; + taosTelemetryMgtInit(&mgt, "telemetry.taosdata.com"); + int32_t code = taosSendTelemReport(&mgt,tsTelemUri, tsTelemPort, "test", strlen("test"),HTTP_FLAT); + printf("old addr:%s new addr:%s\n",mgt.defaultAddr, mgt.cachedAddr); + + taosMsleep(2000); + code = taosSendTelemReport(&mgt,tsTelemUri, tsTelemPort, pCont, len,HTTP_FLAT); + for (int32_t i = 0; i < 1; i++) { + code = taosSendTelemReport(&mgt,tsTelemUri, tsTelemPort, pCont, len,HTTP_FLAT); + printf("old addr:%s new addr:%s\n",mgt.defaultAddr, mgt.cachedAddr); + taosMsleep(2000); + } + taosTelemetryDestroy(&mgt); +#endif { STelemAddrMgmt mgt; taosTelemetryMgtInit(&mgt, "error"); From b545bcebdf4923a7cf30ee5ccf5290b8956b5f15 Mon Sep 17 00:00:00 2001 From: dmchen Date: Wed, 25 Dec 2024 08:28:09 +0800 Subject: [PATCH 53/84] remove case --- tests/parallel_test/cases.task | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index 49cb97e214..99d3d86267 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -405,14 +405,13 @@ ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/subscribe_stream_privilege.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/empty_identifier.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/show_transaction_detail.py -N 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/kill_balance_leader.py -N 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 3-enterprise/restore/kill_restore_dnode.py -N 5 +# ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/kill_balance_leader.py -N 3 +# ,,y,system-test,./pytest.sh python3 ./test.py -f 3-enterprise/restore/kill_restore_dnode.py -N 5 ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/persisit_config.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/qmemCtrl.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/compact_vgroups.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/compact.py -N 3 - ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/composite_primary_key_create.py ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/composite_primary_key_insert.py ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/composite_primary_key_delete.py From f783dc765dca02949206adf06f28b026d0b7c0b2 Mon Sep 17 00:00:00 2001 From: Kaili Xu Date: Wed, 25 Dec 2024 09:08:32 +0800 Subject: [PATCH 54/84] enh: code optimization of tlog.c --- source/util/src/tlog.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/util/src/tlog.c b/source/util/src/tlog.c index 053ade2d5e..88eccfaffd 100644 --- a/source/util/src/tlog.c +++ b/source/util/src/tlog.c @@ -661,7 +661,7 @@ static int32_t taosInitNormalLog(const char *logName, int32_t maxFileNum) { tsLogObj.lines = (int32_t)(filesize / 60); if (taosLSeekFile(tsLogObj.logHandle->pFile, 0, SEEK_END) < 0) { - TAOS_CHECK_EXIT(code = terrno ? terrno : -1); + TAOS_CHECK_EXIT(terrno); } (void)snprintf(name, sizeof(name), @@ -669,7 +669,7 @@ static int32_t taosInitNormalLog(const char *logName, int32_t maxFileNum) { " new log file\n" "==================================================\n"); if (taosWriteFile(tsLogObj.logHandle->pFile, name, (uint32_t)strlen(name)) <= 0) { - TAOS_CHECK_EXIT(code = terrno ? terrno : -1); + TAOS_CHECK_EXIT(terrno); } _exit: From 80e5716d206e264824484b53e2770662a414fbd1 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Wed, 25 Dec 2024 10:13:23 +0800 Subject: [PATCH 55/84] add test case --- source/libs/index/test/utilUT.cc | 38 ++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/source/libs/index/test/utilUT.cc b/source/libs/index/test/utilUT.cc index 299b62b6fb..50828eb3d8 100644 --- a/source/libs/index/test/utilUT.cc +++ b/source/libs/index/test/utilUT.cc @@ -41,6 +41,29 @@ class UtilEnv : public ::testing::Test { SArray *rslt; }; +class UtilComm : public ::testing::Test { + protected: + virtual void SetUp() { + // src = (SArray *)taosArrayInit(2, sizeof(void *)); + // for (int i = 0; i < 3; i++) { + // SArray *m = taosArrayInit(10, sizeof(uint64_t)); + // taosArrayPush(src, &m); + // } + + // rslt = (SArray *)taosArrayInit(10, sizeof(uint64_t)); + } + virtual void TearDown() { + // for (int i = 0; i < taosArrayGetSize(src); i++) { + // SArray *m = (SArray *)taosArrayGetP(src, i); + // taosArrayDestroy(m); + // } + // taosArrayDestroy(src); + } + // SArray *src; + // SArray *rslt; + +}; + static void clearSourceArray(SArray *p) { for (int i = 0; i < taosArrayGetSize(p); i++) { SArray *m = (SArray *)taosArrayGetP(p, i); @@ -369,3 +392,18 @@ TEST_F(UtilEnv, testDictComm) { EXPECT_EQ(COMMON_INPUTS[v], i); } } + +TEST_F(UtilComm, testCompress) { + for (int32_t i = 0; i < 6; i++) { + _cache_range_compare cmpFunc = idxGetCompare((RangeType)(i)); + //char[32]a = 0, b = 1; + char a[32] = {0}; + char b[32] = {1}; + for (int32_t j = 0; j < TSDB_DATA_TYPE_MAX; j++) { + cmpFunc(a, b, j); + } + } +} + + + From aeb806759541fe3deca2108ae56467ed58717528 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Wed, 25 Dec 2024 11:11:09 +0800 Subject: [PATCH 56/84] add test case --- source/libs/index/inc/indexFstRegex.h | 2 +- source/libs/index/src/indexFstDfa.c | 18 +++++++++--------- source/libs/index/test/utilUT.cc | 18 ++++++++++++++++++ 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/source/libs/index/inc/indexFstRegex.h b/source/libs/index/inc/indexFstRegex.h index 2814b5dc16..a6954afab6 100644 --- a/source/libs/index/inc/indexFstRegex.h +++ b/source/libs/index/inc/indexFstRegex.h @@ -28,7 +28,7 @@ extern "C" { #endif -typedef enum { MATCH, JUMP, SPLIT, RANGE } InstType; +typedef enum { INS_MATCH, INS_JUMP, INS_SPLIT, INS_RANGE } InstType; typedef struct MatchValue { #ifdef WINDOWS diff --git a/source/libs/index/src/indexFstDfa.c b/source/libs/index/src/indexFstDfa.c index 3b0014f16a..fa7dbb5f1f 100644 --- a/source/libs/index/src/indexFstDfa.c +++ b/source/libs/index/src/indexFstDfa.c @@ -159,14 +159,14 @@ bool dfaBuilderCacheState(FstDfaBuilder *builder, FstSparseSet *set, uint32_t *r if (false == sparSetGet(set, i, &ip)) continue; Inst *inst = taosArrayGet(builder->dfa->insts, ip); - if (inst->ty == JUMP || inst->ty == SPLIT) { + if (inst->ty == INS_JUMP || inst->ty == INS_SPLIT) { continue; - } else if (inst->ty == RANGE) { + } else if (inst->ty == INS_RANGE) { if (taosArrayPush(tinsts, &ip) == NULL) { code = terrno; goto _exception; } - } else if (inst->ty == MATCH) { + } else if (inst->ty == INS_MATCH) { isMatch = true; if (taosArrayPush(tinsts, &ip) == NULL) { code = terrno; @@ -234,11 +234,11 @@ void dfaAdd(FstDfa *dfa, FstSparseSet *set, uint32_t ip) { } bool succ = sparSetAdd(set, ip, NULL); Inst *inst = taosArrayGet(dfa->insts, ip); - if (inst->ty == MATCH || inst->ty == RANGE) { + if (inst->ty == INS_MATCH || inst->ty == INS_RANGE) { // do nothing - } else if (inst->ty == JUMP) { + } else if (inst->ty == INS_JUMP) { dfaAdd(dfa, set, inst->jv.step); - } else if (inst->ty == SPLIT) { + } else if (inst->ty == INS_SPLIT) { dfaAdd(dfa, set, inst->sv.len1); dfaAdd(dfa, set, inst->sv.len2); } @@ -253,11 +253,11 @@ bool dfaRun(FstDfa *dfa, FstSparseSet *from, FstSparseSet *to, uint8_t byte) { if (false == sparSetGet(from, i, &ip)) continue; Inst *inst = taosArrayGet(dfa->insts, ip); - if (inst->ty == JUMP || inst->ty == SPLIT) { + if (inst->ty == INS_JUMP || inst->ty == INS_SPLIT) { continue; - } else if (inst->ty == MATCH) { + } else if (inst->ty == INS_MATCH) { isMatch = true; - } else if (inst->ty == RANGE) { + } else if (inst->ty == INS_RANGE) { if (inst->rv.start <= byte && byte <= inst->rv.end) { dfaAdd(dfa, to, ip + 1); } diff --git a/source/libs/index/test/utilUT.cc b/source/libs/index/test/utilUT.cc index 50828eb3d8..5b22b51172 100644 --- a/source/libs/index/test/utilUT.cc +++ b/source/libs/index/test/utilUT.cc @@ -17,6 +17,7 @@ #include "tglobal.h" #include "tskiplist.h" #include "tutil.h" +#include "indexFstDfa.h" class UtilEnv : public ::testing::Test { protected: @@ -404,6 +405,23 @@ TEST_F(UtilComm, testCompress) { } } } +TEST_F(UtilComm, testfstDfa) { + { + FstDfaBuilder *builder = dfaBuilderCreate(NULL); + ASSERT_TRUE(builder != NULL); + dfaBuilderDestroy(builder); + } + { + SArray *pInst = taosArrayInit(32, sizeof(uint8_t)); + for (int32_t i = 0; i < 26; i++) { + uint8_t v = 'a' + i; + taosArrayPush(pInst, &v); + } + FstDfaBuilder *builder = dfaBuilderCreate(pInst); + FstDfa *dfa = dfaBuilderBuild(builder); + dfaBuilderDestroy(builder); + } +} From 6872cd38c1b20b568e431c20e10002e129ecfdc8 Mon Sep 17 00:00:00 2001 From: kailixu Date: Wed, 25 Dec 2024 11:21:55 +0800 Subject: [PATCH 57/84] enh: coverage of tlog.c --- Jenkinsfile2 | 2 +- source/util/test/log.cpp | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile2 b/Jenkinsfile2 index 1b2f28908c..eed2d709f5 100644 --- a/Jenkinsfile2 +++ b/Jenkinsfile2 @@ -508,7 +508,7 @@ pipeline { } } stage('linux test') { - agent{label "slave1_47 || slave1_48 || slave1_49 || slave1_50 || slave1_52 || slave1_59 || slave1_63 || worker03 || slave215 || slave217 || slave219 "} + agent{label "slave1_47 || slave1_48 || slave1_49 || slave1_50 || slave1_52 || slave1_59 || slave1_63"} options { skipDefaultCheckout() } when { changeRequest() diff --git a/source/util/test/log.cpp b/source/util/test/log.cpp index 5b7c7b9ef6..1899aac2c4 100644 --- a/source/util/test/log.cpp +++ b/source/util/test/log.cpp @@ -98,11 +98,15 @@ TEST(log, misc) { EXPECT_NE(pCrashMsg, nullptr); tstrncpy(pCrashMsg, "crashMsg", 16); +#if !defined(_TD_DARWIN_64) && !defined(WINDOWS) pid_t pid = taosGetPId(); EXPECT_EQ(pid > 0, true); siginfo_t sigInfo = {0}; sigInfo.si_pid = pid; taosLogCrashInfo(nodeType, pCrashMsg, strlen(pCrashMsg), 0, &sigInfo); +#else + taosLogCrashInfo(nodeType, pCrashMsg, strlen(pCrashMsg), 0, nullptr); +#endif char crashInfo[PATH_MAX] = {0}; snprintf(crashInfo, sizeof(crashInfo), "%s%s.%sCrashLog", tsLogDir, TD_DIRSEP, nodeType); From ae6c8c9fcf790e3f7327975f41c54e763e0a22cf Mon Sep 17 00:00:00 2001 From: kailixu Date: Wed, 25 Dec 2024 12:44:02 +0800 Subject: [PATCH 58/84] enh: coverage of tfs --- source/libs/tfs/test/tfsTest.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/source/libs/tfs/test/tfsTest.cpp b/source/libs/tfs/test/tfsTest.cpp index 00892a7b9e..1570cf173f 100644 --- a/source/libs/tfs/test/tfsTest.cpp +++ b/source/libs/tfs/test/tfsTest.cpp @@ -854,6 +854,7 @@ TEST_F(TfsTest, 06_Misc) { TdFilePtr pFile = taosCreateFile("testDataDir1", TD_FILE_CREATE); EXPECT_NE(pFile, nullptr); EXPECT_EQ(tfsCheckAndFormatCfg(&tfs, &diskCfg), TSDB_CODE_FS_INVLD_CFG); + EXPECT_EQ(taosCloseFile(&pFile), 0); EXPECT_EQ(taosRemoveFile("testDataDir1"), 0); for (int32_t l = 0; l < tfs.nlevel; ++l) { From a46ba61a1df7917ecddd3452082fcadea38d0f8b Mon Sep 17 00:00:00 2001 From: Kaili Xu Date: Wed, 25 Dec 2024 14:27:22 +0800 Subject: [PATCH 59/84] chore: restore Jenkinsfile2 --- Jenkinsfile2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile2 b/Jenkinsfile2 index eed2d709f5..1b2f28908c 100644 --- a/Jenkinsfile2 +++ b/Jenkinsfile2 @@ -508,7 +508,7 @@ pipeline { } } stage('linux test') { - agent{label "slave1_47 || slave1_48 || slave1_49 || slave1_50 || slave1_52 || slave1_59 || slave1_63"} + agent{label "slave1_47 || slave1_48 || slave1_49 || slave1_50 || slave1_52 || slave1_59 || slave1_63 || worker03 || slave215 || slave217 || slave219 "} options { skipDefaultCheckout() } when { changeRequest() From 7a18acc7f760432288e73f6d69995bb0068cb2bd Mon Sep 17 00:00:00 2001 From: wangjiaming0909 Date: Wed, 25 Dec 2024 14:42:08 +0800 Subject: [PATCH 60/84] fix wrong rows returned with sma filtering --- source/libs/scalar/src/filter.c | 4 ++-- tests/pytest/util/sql.py | 2 +- tests/system-test/2-query/smaTest.py | 35 ++++++++++++++++++++++++---- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/source/libs/scalar/src/filter.c b/source/libs/scalar/src/filter.c index b329bbbd44..6689e12edd 100644 --- a/source/libs/scalar/src/filter.c +++ b/source/libs/scalar/src/filter.c @@ -5128,8 +5128,8 @@ static int32_t fltSclCollectOperatorFromNode(SNode *pNode, SArray *sclOpList) { SOperatorNode *pOper = (SOperatorNode *)pNode; - SValueNode *valNode = (SValueNode *)pOper->pRight; - if (IS_NUMERIC_TYPE(valNode->node.resType.type) || valNode->node.resType.type == TSDB_DATA_TYPE_TIMESTAMP) { + SExprNode* pLeft = (SExprNode*)pOper->pLeft; + if (IS_NUMERIC_TYPE(pLeft->resType.type) || pLeft->resType.type == TSDB_DATA_TYPE_TIMESTAMP) { SNode* pLeft = NULL, *pRight = NULL; int32_t code = nodesCloneNode(pOper->pLeft, &pLeft); if (TSDB_CODE_SUCCESS != code) { diff --git a/tests/pytest/util/sql.py b/tests/pytest/util/sql.py index bb7b8411f9..cdfe3ce8a0 100644 --- a/tests/pytest/util/sql.py +++ b/tests/pytest/util/sql.py @@ -100,7 +100,7 @@ class TDSql: if drop: s = f'drop database if exists {dbname}' self.cursor.execute(s) - s = f'create database {dbname}' + s = f'create database {dbname} stt_trigger 1' for k, v in kwargs.items(): s += f" {k} {v}" if "duration" not in kwargs: diff --git a/tests/system-test/2-query/smaTest.py b/tests/system-test/2-query/smaTest.py index 04fb893e75..355ac04707 100644 --- a/tests/system-test/2-query/smaTest.py +++ b/tests/system-test/2-query/smaTest.py @@ -39,6 +39,27 @@ class TDTestCase: self.create_tables(); self.ts = 1500000000000 + def test_TD_33336(self): + sql = "flush database db" + tdSql.execute(sql) + time.sleep(5) + sql = f'select last(ts) + 1d, last(ts) - 1d from db.t1' + tdSql.query(sql, queryTimes=1) + lastTs_add1d = tdSql.queryResult[0][0] + lastTs_sub1d = tdSql.queryResult[0][1] + + sql = f'select count(*) from db.t1 where ts < "{lastTs_add1d}" and vc1 = 1' + tdSql.query(sql, queryTimes=1) + all_row_count = tdSql.queryResult[0][0] + tdLog.debug(f"all rows: {all_row_count}") + + sql = f'select count(*) from db.t1 where ts < "{lastTs_sub1d}" and vc1 = 1' + tdSql.query(sql, queryTimes=1) + row_count_sub1d = tdSql.queryResult[0][0] + tdLog.debug(f"row_count_sub1d: {row_count_sub1d}") + + if row_count_sub1d > all_row_count: + tdLog.exit(f' err rows returned for sql: {sql} row_count_sub1d: {row_count_sub1d} > all_row_count: {all_row_count}') # run case def run(self): @@ -53,6 +74,8 @@ class TDTestCase: # self.test_case2() tdLog.debug(" LIMIT test_case2 ............ [OK]") + self.test_TD_33336() + # stop def stop(self): tdSql.close() @@ -65,11 +88,11 @@ class TDTestCase: # create table def create_tables(self, dbname="db"): # super table - tdSql.execute(f"create table {dbname}.st(ts timestamp, i1 int,i2 int) tags(area int)") + tdSql.execute(f"create table {dbname}.st(ts timestamp, i1 int,i2 int, vc1 varchar(255)) tags(area int)") # child table tdSql.execute(f"create table {dbname}.t1 using {dbname}.st tags(1)") - tdSql.execute(f"create table {dbname}.st1(ts timestamp, i1 int ,i2 int) tags(area int) sma(i2) ") + tdSql.execute(f"create table {dbname}.st1(ts timestamp, i1 int ,i2 int, vc1 varchar(255)) tags(area int) sma(i2) ") tdSql.execute(f"create table {dbname}.t4 using {dbname}.st1 tags(1)") return @@ -98,7 +121,11 @@ class TDTestCase: sql = pre_insert tdLog.debug("insert table %s rows=%d ..." % (tbname, count)) for i in range(count): - sql += " (%d,%d,%d)" % (ts_start + i*1000, i, i+1) + if random.randint(0, 4) > 2: + tail = '' + else: + tail = 'asd' + sql += " (%d,%d,%d,%s)" % (ts_start + i*1000, i, i+1, '"' + str(random.randint(0,5)) + f'{tail}"') if i > 0 and i % 20000 == 0: tdLog.info("%d rows inserted" % i) tdSql.execute(sql) @@ -125,4 +152,4 @@ class TDTestCase: # add case with filename # tdCases.addWindows(__file__, TDTestCase()) -tdCases.addLinux(__file__, TDTestCase()) \ No newline at end of file +tdCases.addLinux(__file__, TDTestCase()) From 61cfaa856055d474a1eac081ba992d7aec83dbb8 Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Wed, 25 Dec 2024 16:53:19 +0800 Subject: [PATCH 61/84] fix coverage issue with td block blob client --- .../libs/azure/src/td_block_blob_client.cpp | 97 ++++++++++--------- 1 file changed, 49 insertions(+), 48 deletions(-) diff --git a/source/libs/azure/src/td_block_blob_client.cpp b/source/libs/azure/src/td_block_blob_client.cpp index 33ac774d0c..ba2ac14551 100644 --- a/source/libs/azure/src/td_block_blob_client.cpp +++ b/source/libs/azure/src/td_block_blob_client.cpp @@ -38,6 +38,8 @@ TDBlockBlobClient TDBlockBlobClient::CreateFromConnectionString(const std::strin return newClient; } +TDBlockBlobClient::TDBlockBlobClient(BlobClient blobClient) : BlobClient(std::move(blobClient)) {} +#if 0 TDBlockBlobClient::TDBlockBlobClient(const std::string& blobUrl, std::shared_ptr credential, const BlobClientOptions& options) : BlobClient(blobUrl, std::move(credential), options) {} @@ -50,8 +52,6 @@ TDBlockBlobClient::TDBlockBlobClient(const std::string& TDBlockBlobClient::TDBlockBlobClient(const std::string& blobUrl, const BlobClientOptions& options) : BlobClient(blobUrl, options) {} -TDBlockBlobClient::TDBlockBlobClient(BlobClient blobClient) : BlobClient(std::move(blobClient)) {} - TDBlockBlobClient TDBlockBlobClient::WithSnapshot(const std::string& snapshot) const { TDBlockBlobClient newClient(*this); if (snapshot.empty()) { @@ -74,47 +74,6 @@ TDBlockBlobClient TDBlockBlobClient::WithVersionId(const std::string& versionId) return newClient; } -Azure::Response TDBlockBlobClient::Upload(Azure::Core::IO::BodyStream& content, - const UploadBlockBlobOptions& options, - const Azure::Core::Context& context) const { - _detail::BlockBlobClient::UploadBlockBlobOptions protocolLayerOptions; - if (options.TransactionalContentHash.HasValue()) { - if (options.TransactionalContentHash.Value().Algorithm == HashAlgorithm::Md5) { - protocolLayerOptions.TransactionalContentMD5 = options.TransactionalContentHash.Value().Value; - } else if (options.TransactionalContentHash.Value().Algorithm == HashAlgorithm::Crc64) { - protocolLayerOptions.TransactionalContentCrc64 = options.TransactionalContentHash.Value().Value; - } - } - protocolLayerOptions.BlobContentType = options.HttpHeaders.ContentType; - protocolLayerOptions.BlobContentEncoding = options.HttpHeaders.ContentEncoding; - protocolLayerOptions.BlobContentLanguage = options.HttpHeaders.ContentLanguage; - protocolLayerOptions.BlobContentMD5 = options.HttpHeaders.ContentHash.Value; - protocolLayerOptions.BlobContentDisposition = options.HttpHeaders.ContentDisposition; - protocolLayerOptions.BlobCacheControl = options.HttpHeaders.CacheControl; - protocolLayerOptions.Metadata = std::map(options.Metadata.begin(), options.Metadata.end()); - protocolLayerOptions.BlobTagsString = _detail::TagsToString(options.Tags); - protocolLayerOptions.Tier = options.AccessTier; - protocolLayerOptions.LeaseId = options.AccessConditions.LeaseId; - protocolLayerOptions.IfModifiedSince = options.AccessConditions.IfModifiedSince; - protocolLayerOptions.IfUnmodifiedSince = options.AccessConditions.IfUnmodifiedSince; - protocolLayerOptions.IfMatch = options.AccessConditions.IfMatch; - protocolLayerOptions.IfNoneMatch = options.AccessConditions.IfNoneMatch; - protocolLayerOptions.IfTags = options.AccessConditions.TagConditions; - if (m_customerProvidedKey.HasValue()) { - protocolLayerOptions.EncryptionKey = m_customerProvidedKey.Value().Key; - protocolLayerOptions.EncryptionKeySha256 = m_customerProvidedKey.Value().KeyHash; - protocolLayerOptions.EncryptionAlgorithm = m_customerProvidedKey.Value().Algorithm.ToString(); - } - protocolLayerOptions.EncryptionScope = m_encryptionScope; - if (options.ImmutabilityPolicy.HasValue()) { - protocolLayerOptions.ImmutabilityPolicyExpiry = options.ImmutabilityPolicy.Value().ExpiresOn; - protocolLayerOptions.ImmutabilityPolicyMode = options.ImmutabilityPolicy.Value().PolicyMode; - } - protocolLayerOptions.LegalHold = options.HasLegalHold; - - return _detail::BlockBlobClient::Upload(*m_pipeline, m_blobUrl, content, protocolLayerOptions, context); -} - Azure::Response TDBlockBlobClient::UploadFrom( const uint8_t* buffer, size_t bufferSize, const UploadBlockBlobFromOptions& options, const Azure::Core::Context& context) const { @@ -270,6 +229,47 @@ Azure::Response TDBlockBlobClient::UploadFrom return Azure::Response(std::move(result), std::move(commitBlockListResponse.RawResponse)); } +#endif +Azure::Response TDBlockBlobClient::Upload(Azure::Core::IO::BodyStream& content, + const UploadBlockBlobOptions& options, + const Azure::Core::Context& context) const { + _detail::BlockBlobClient::UploadBlockBlobOptions protocolLayerOptions; + if (options.TransactionalContentHash.HasValue()) { + if (options.TransactionalContentHash.Value().Algorithm == HashAlgorithm::Md5) { + protocolLayerOptions.TransactionalContentMD5 = options.TransactionalContentHash.Value().Value; + } else if (options.TransactionalContentHash.Value().Algorithm == HashAlgorithm::Crc64) { + protocolLayerOptions.TransactionalContentCrc64 = options.TransactionalContentHash.Value().Value; + } + } + protocolLayerOptions.BlobContentType = options.HttpHeaders.ContentType; + protocolLayerOptions.BlobContentEncoding = options.HttpHeaders.ContentEncoding; + protocolLayerOptions.BlobContentLanguage = options.HttpHeaders.ContentLanguage; + protocolLayerOptions.BlobContentMD5 = options.HttpHeaders.ContentHash.Value; + protocolLayerOptions.BlobContentDisposition = options.HttpHeaders.ContentDisposition; + protocolLayerOptions.BlobCacheControl = options.HttpHeaders.CacheControl; + protocolLayerOptions.Metadata = std::map(options.Metadata.begin(), options.Metadata.end()); + protocolLayerOptions.BlobTagsString = _detail::TagsToString(options.Tags); + protocolLayerOptions.Tier = options.AccessTier; + protocolLayerOptions.LeaseId = options.AccessConditions.LeaseId; + protocolLayerOptions.IfModifiedSince = options.AccessConditions.IfModifiedSince; + protocolLayerOptions.IfUnmodifiedSince = options.AccessConditions.IfUnmodifiedSince; + protocolLayerOptions.IfMatch = options.AccessConditions.IfMatch; + protocolLayerOptions.IfNoneMatch = options.AccessConditions.IfNoneMatch; + protocolLayerOptions.IfTags = options.AccessConditions.TagConditions; + if (m_customerProvidedKey.HasValue()) { + protocolLayerOptions.EncryptionKey = m_customerProvidedKey.Value().Key; + protocolLayerOptions.EncryptionKeySha256 = m_customerProvidedKey.Value().KeyHash; + protocolLayerOptions.EncryptionAlgorithm = m_customerProvidedKey.Value().Algorithm.ToString(); + } + protocolLayerOptions.EncryptionScope = m_encryptionScope; + if (options.ImmutabilityPolicy.HasValue()) { + protocolLayerOptions.ImmutabilityPolicyExpiry = options.ImmutabilityPolicy.Value().ExpiresOn; + protocolLayerOptions.ImmutabilityPolicyMode = options.ImmutabilityPolicy.Value().PolicyMode; + } + protocolLayerOptions.LegalHold = options.HasLegalHold; + + return _detail::BlockBlobClient::Upload(*m_pipeline, m_blobUrl, content, protocolLayerOptions, context); +} Azure::Response TDBlockBlobClient::UploadFrom( const std::string& fileName, int64_t offset, int64_t size, const UploadBlockBlobFromOptions& options, @@ -349,7 +349,7 @@ Azure::Response TDBlockBlobClient::UploadFrom return Azure::Response(std::move(result), std::move(commitBlockListResponse.RawResponse)); } - +#if 0 Azure::Response TDBlockBlobClient::UploadFromUri( const std::string& sourceUri, const UploadBlockBlobFromUriOptions& options, const Azure::Core::Context& context) const { @@ -396,7 +396,7 @@ Azure::Response TDBlockBlobClient::UploadF return _detail::BlockBlobClient::UploadFromUri(*m_pipeline, m_blobUrl, protocolLayerOptions, context); } - +#endif Azure::Response TDBlockBlobClient::StageBlock(const std::string& blockId, Azure::Core::IO::BodyStream& content, const StageBlockOptions& options, @@ -419,7 +419,7 @@ Azure::Response TDBlockBlobClient::StageBlock(const st protocolLayerOptions.EncryptionScope = m_encryptionScope; return _detail::BlockBlobClient::StageBlock(*m_pipeline, m_blobUrl, content, protocolLayerOptions, context); } - +#if 0 Azure::Response TDBlockBlobClient::StageBlockFromUri( const std::string& blockId, const std::string& sourceUri, const StageBlockFromUriOptions& options, const Azure::Core::Context& context) const { @@ -457,7 +457,7 @@ Azure::Response TDBlockBlobClient::StageBlockFr return _detail::BlockBlobClient::StageBlockFromUri(*m_pipeline, m_blobUrl, protocolLayerOptions, context); } - +#endif Azure::Response TDBlockBlobClient::CommitBlockList( const std::vector& blockIds, const CommitBlockListOptions& options, const Azure::Core::Context& context) const { @@ -492,7 +492,7 @@ Azure::Response TDBlockBlobClient::CommitBlockLis return _detail::BlockBlobClient::CommitBlockList(*m_pipeline, m_blobUrl, protocolLayerOptions, context); } - +#if 0 Azure::Response TDBlockBlobClient::GetBlockList(const GetBlockListOptions& options, const Azure::Core::Context& context) const { _detail::BlockBlobClient::GetBlockBlobBlockListOptions protocolLayerOptions; @@ -502,6 +502,7 @@ Azure::Response TDBlockBlobClient::GetBlockList(cons return _detail::BlockBlobClient::GetBlockList(*m_pipeline, m_blobUrl, protocolLayerOptions, _internal::WithReplicaStatus(context)); } +#endif /* Azure::Response TDBlockBlobClient::Query(const std::string& querySqlExpression, const QueryBlobOptions& options, From 222cd3a39b7d945ca218aa0fee5e90d49058e6df Mon Sep 17 00:00:00 2001 From: wangjiaming0909 Date: Wed, 25 Dec 2024 17:36:45 +0800 Subject: [PATCH 62/84] fix clientTest --- source/client/test/clientTests.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/client/test/clientTests.cpp b/source/client/test/clientTests.cpp index 3e4667fbe7..60f0a72e39 100644 --- a/source/client/test/clientTests.cpp +++ b/source/client/test/clientTests.cpp @@ -126,6 +126,10 @@ void fetchCallback(void* param, void* res, int32_t numOfRow) { void queryCallback(void* param, void* res, int32_t code) { if (code != TSDB_CODE_SUCCESS) { (void)printf("failed to execute, reason:%s\n", taos_errstr(res)); + taos_free_result(res); + tsem_t *sem = (tsem_t *)param; + tsem_post(sem); + return; } (void)printf("start to fetch data\n"); taos_fetch_raw_block_a(res, fetchCallback, param); From dcc2645691b048e9a78d634b648d9ac510198583 Mon Sep 17 00:00:00 2001 From: zyyang Date: Wed, 25 Dec 2024 20:30:11 +0800 Subject: [PATCH 63/84] docs(backup): backup and restore#TD-31475 --- docs/zh/08-operation/09-backup.md | 126 +++++------------- .../zh/08-operation/pic/backup-00-concept.png | Bin 32893 -> 58553 bytes docs/zh/08-operation/pic/backup-01-create.png | Bin 96040 -> 0 bytes docs/zh/08-operation/pic/backup-02-form.png | Bin 56704 -> 0 bytes docs/zh/08-operation/pic/backup-03-list.png | Bin 57186 -> 0 bytes docs/zh/08-operation/pic/backup-04-view.png | Bin 108698 -> 0 bytes docs/zh/08-operation/pic/backup-05-edit.png | Bin 104993 -> 0 bytes docs/zh/08-operation/pic/backup-06-copy.png | Bin 121583 -> 0 bytes docs/zh/08-operation/pic/backup-07-del.png | Bin 56800 -> 0 bytes docs/zh/08-operation/pic/backup-08-files.png | Bin 51071 -> 0 bytes .../08-operation/pic/backup-09-filelist.png | Bin 41014 -> 0 bytes .../pic/backup-10-restore-create.png | Bin 65990 -> 0 bytes .../pic/backup-11-restore-list.png | Bin 57904 -> 0 bytes 13 files changed, 37 insertions(+), 89 deletions(-) delete mode 100644 docs/zh/08-operation/pic/backup-01-create.png delete mode 100644 docs/zh/08-operation/pic/backup-02-form.png delete mode 100644 docs/zh/08-operation/pic/backup-03-list.png delete mode 100644 docs/zh/08-operation/pic/backup-04-view.png delete mode 100644 docs/zh/08-operation/pic/backup-05-edit.png delete mode 100644 docs/zh/08-operation/pic/backup-06-copy.png delete mode 100644 docs/zh/08-operation/pic/backup-07-del.png delete mode 100644 docs/zh/08-operation/pic/backup-08-files.png delete mode 100644 docs/zh/08-operation/pic/backup-09-filelist.png delete mode 100644 docs/zh/08-operation/pic/backup-10-restore-create.png delete mode 100644 docs/zh/08-operation/pic/backup-11-restore-list.png diff --git a/docs/zh/08-operation/09-backup.md b/docs/zh/08-operation/09-backup.md index 075cc244f4..aa4f9f61a0 100644 --- a/docs/zh/08-operation/09-backup.md +++ b/docs/zh/08-operation/09-backup.md @@ -35,119 +35,67 @@ taosdump -i /file/path -h localhost -P 6030 # 2. 基于 TDengine Enterprise 进行数据备份恢复 -## 2.1. 概念 +## 2.1. 概述 基于 TDengine 的数据订阅功能,TDengine Enterprise 实现了数据的增量备份和恢复。用户可以通过 taosExplorer 对 TDengine 集群进行备份和恢复。 TDengine Enterprise 的备份和恢复功能包括以下几个概念: -1. 备份对象:用户可以对一个数据库,或者一个超级表进行备份。 -2. 备份计划:用户可以为某个备份对象创建一个备份计划。备份计划从指定的时间点开始,周期性的执行一次备份任务,并生成一组备份文件。 -3. 备份点:每执行一次备份任务,生成一组备份文件,它们对应一个时间点,称为**备份点**。第一个备份点称为**初始备份点**。 -4. 备份文件:多个备份点,组成备份计划的备份文件。 -5. 恢复任务:用户可以选择备份计划的某个备份点,创建一个恢复任务。恢复任务会从初始备份点开始,逐个应用备份点,恢复到指定的备份点。 +1. 增量数据备份:基于 TDengine 的数据订阅功能,将**备份对象**的所有数据变更(包括:新增、修改、删除、元数据变更等)记录下来,生成备份文件。 +2. 数据恢复:使用增量数据备份生成的备份文件,将**备份对象**恢复到指定的时间点。 +3. 备份对象:用户备份的对象,可以是一个**数据库**,也可以是一个**超级表**。 +4. 备份计划:用户为备份对象创建一个周期性执行的备份任务。备份计划从指定的时间点开始,以**备份周期**为间隔,周期性地执行备份任务。备份任务每次生成一个**备份点**。 +5. 备份点:每次执行备份任务,生成一组备份文件,它们对应一个时间点,称为**备份点**。第一个备份点称为**初始备份点**。 +6. 恢复任务:用户选择备份计划的某个备份点,创建一个恢复任务。恢复任务从**初始备份点**开始,逐个回放**备份文件**中的数据变更,直到指定的备份点结束。 ![backup-zh-00.png](./pic/backup-00-concept.png "数据备份和恢复") -以上面的图为例: +以上图为例: -1. 用户创建了一个备份计划,从 2024-08-27 00:00:00 开始,每隔 1 天执行一次备份任务。 -2. 在 2024-08-27 00:00:00 执行了第一次备份任务,生成了一个备份点。 -3. 之后,每隔 1 天执行一次备份任务,生成了多个备份点,组成了备份文件。 -4. 用户可以选择某个备份点,创建一个恢复任务,恢复到指定的备份点。 +1. 用户创建了一个**备份计划**,从 2024-08-27 00:00:00 开始,每隔 1 天执行一次**备份任务**。 +2. 在 2024-08-27 00:00:00 执行了第一次备份任务,生成了一个**初始备份点**。 +3. 之后,每隔 1 天执行一次备份任务,生成了多个**备份点**。 +4. 用户可以选择某个**备份点**,创建一个**恢复任务**。 5. 恢复任务会从初始备份点开始,逐个应用备份点,恢复到指定的备份点。 -## 2.2. 备份计划 +## 2.2. 数据备份 -### 2.1.1. 创建 - -1. 通过浏览器访问 taosExplorer 服务,访问地址通常为 TDengine 集群所在 IP 地址的端口 6060,如 http://localhost:6060。 -2. 在 taosExplorer 服务页面中,进入“系统管理 - 备份”页面,点击“创建备份计划”按钮。 - -![backup-zh-01.png](./pic/backup-01-create.png "创建备份计划") - -3. 在弹出的“创建备份计划”表单中,填写备份计划的相关信息。 - -![backup-zh-02.png](./pic/backup-02-form.png "填写备份计划信息") +通过浏览器访问 taosExplorer 服务,访问地址通常为 TDengine 集群所在 IP 地址的端口 6060,如 http://localhost:6060。 在 +taosExplorer 服务页面中,进入“系统管理 - 备份”页面,在“备份计划”标签页下,点击“创建备份计划”,填写备份计划的相关信息。 需要填写的信息包括: -* 数据库:需要备份的数据库名称。一个备份计划只能备份一个数据库/超级表。 -* 超级表:需要备份的超级表名称。如果不填写,则备份整个数据库。 -* 下次执行时间:首次执行备份任务的日期时间。 -* 备份周期:备份点之间的时间间隔。注意:备份周期必须大于数据库的 WAL_RETENTION_PERIOD 参数值。 -* 错误重试次数:对于可通过重试解决的错误,系统会按照此次数进行重试。 -* 错误重试间隔:每次重试之间的时间间隔。 -* 目录:存储备份文件的目录。 -* 备份文件大小:备份文件的大小限制。当备份文件大小达到此限制时,会自动创建新的备份文件。 -* 文件压缩等级:备份文件的压缩等级。支持:最快速度、最佳压缩比、兼具速度和压缩比。 +1. 数据库:需要备份的数据库名称。一个备份计划只能备份一个数据库/超级表。 +2. 超级表:需要备份的超级表名称。如果不填写,则备份整个数据库。 +3. 下次执行时间:首次执行备份任务的日期时间。 +4. 备份周期:备份点之间的时间间隔。注意:备份周期必须大于数据库的 WAL_RETENTION_PERIOD 参数值。 +5. 错误重试次数:对于可通过重试解决的错误,系统会按照此次数进行重试。 +6. 错误重试间隔:每次重试之间的时间间隔。 +7. 目录:存储备份文件的目录。 +8. 备份文件大小:备份文件的大小限制。当备份文件大小达到此限制时,会自动创建新的备份文件。 +9. 文件压缩等级:备份文件的压缩等级。支持:最快速度、最佳压缩比、兼具速度和压缩比。 -创建成功后,备份计划会开始按照配置的参数运行。 +创建成功后,备份计划会开始按照配置的参数运行。在“备份计划”下的列表中,可以查看已创建的备份计划。 -### 2.1.2. 查看 +备份计划支持以下操作: -在“备份计划”下的列表中,可以查看已创建的备份计划。 +1. 查看:显示备份计划的详细信息。 +2. 修改:修改备份计划的配置。修改备份计划的配置后,当前运行的备份任务会先停止,然后按照新的配置重新运行。 +3. 复制:以选中的备份计划为模版,创建新的备份计划。除了数据库和超级表需要用户选择以外,其他配置项和被复制的计划相同。 +4. 删除:删除备份计划。删除备份计划时,可以选择是否删除关联的备份文件。 +5. 指标:查看备份计划的统计指标。 +6. 查看备份点:查看和备份计划关联的所有备份点。 -![backup-zh-03.png](./pic/backup-03-list.png "查看备份计划列表") +## 2.3. 备份文件 -点击“操作”中的“查看”按钮,可以查看备份计划的详细信息。 +在“备份文件”列表中,可以查看备份文件的详细信息。 -![backup-zh-04.png](./pic/backup-04-view.png "查看备份计划详情") +## 2.4. 数据恢复 -### 2.1.3. 修改 +在“备份文件”列表中,选择一个备份点,可以创建一个恢复任务,数据库恢复到指定的时间。 -点击“操作”中的“修改”按钮,可以修改备份计划的配置。 - -![backup-zh-05.png](./pic/backup-05-edit.png "修改备份计划") - -修改备份计划的配置后,当前运行的备份任务会先停止,然后按照新的配置重新运行。 - -### 2.1.4. 复制 - -点击“操作”中的“复制”按钮,可以复制备份计划。 - -![backup-zh-06.png](./pic/backup-06-copy.png "复制备份计划") - -除了数据库和超级表被置为空外,其他配置项和被复制的计划相同。用户点击“确认”后,创建一个新的备份计划。 - -### 2.1.5. 删除 - -在操作中点击关闭按钮,可以停止当前备份计划。点击“操作”中的“删除”按钮,可以删除备份计划。 - -![backup-zh-07.png](./pic/backup-07-del.png "删除备份计划") - -删除备份计划时,可以选择,是否删除关联的备份文件。 - -## 2.2. 备份文件 - -### 2.2.1. 查看 - -在备份计划列表中,选择要一个备份计划。在“备份文件”列中,点击“查看”按钮。可以查看和备份计划的所有备份点。 - -![backup-zh-08.png](./pic/backup-08-files.png "查看备份文件") - -在备份文件列表中,可以查看备份文件的详细信息。 - -![backup-zh-09.png](./pic/backup-09-filelist.png "查看备份文件列表") - -## 2.3. 恢复任务 - -### 2.3.1. 创建 - -在备份文件列表中,点击“操作”中的“恢复”按钮,可以创建一个恢复任务。 - -![backup-zh-10.png](./pic/backup-10-restore-create.png "创建恢复任务") - -在弹出的对话框中,选择使用哪个备份点开始恢复,默认为最早的备份点。点击“确定”后,创建恢复任务,并跳转至“恢复任务”列表。 - -### 2.3.2. 查看 - -在“恢复任务”列表中,可以查看已创建的恢复任务。 - -![backup-zh-11.png](./pic/backup-11-restore-list.png "查看恢复任务列表") - -恢复任务可以终止。点击“操作”中的开关,可以终止当前恢复任务。 +在“恢复任务”列表中,可以查看已创建的恢复任务。恢复任务可以终止。 # 3. 常见错误排查 diff --git a/docs/zh/08-operation/pic/backup-00-concept.png b/docs/zh/08-operation/pic/backup-00-concept.png index 5123b4d5403d9379b6067af26fc6a367284814e2..ce65c3f181d475b2dda9ccd40d6618ea9951d95c 100644 GIT binary patch literal 58553 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 diff --git a/docs/zh/08-operation/pic/backup-01-create.png b/docs/zh/08-operation/pic/backup-01-create.png deleted file mode 100644 index a424c276e589e91aa4614932a198f8cab53cce95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96040 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

qcFBvc}LsBmDc@Q=XSvj$I*5bacShU|c#$Lx z(_&9Q+mwyWVQ%w7o?G~-Fav+%beGkjb2N>QZ-uthY2C_8+&m#N1{4+3uDv`j2g_qh z#!DBq8!E|`mkQikY&jTx2TyS42NKF}y{HQC%}9g}jC=5yI+QwTiQP^_LDk1F)6SSSKvsP22x-_O4&32&uXUP*d8H4R`{b8kC$3EX{YlmFgZ;s>F7 zqttJ{F4|CLaUncXMW7}j4%ygWXzs!9PQaRauTXp-4@id}j}G7{otNJ-T;_3|nj57$ z$(dACA){cRRHQhI;y^$FM4CVIxY8(gex|+ngZCHOj%5~rbaqT#XTDy3Cd`$5rO*ha z&U0(H*q;OJSmO9%%OmWojVWL%=Xwg3T|7MXT6Ah!!P}CV5ZJ;S2#7X2JgYyfybnNwS%JT5WL&9#OeTZ}Z#9h}_o(GcP`L}Le;Y%>vAjcf`JP%$KXpNG-zlF=E*(c%3h8d9XAGA^ zUuzdFBECTUkhK0c0e*5-FkyN5Z)Va#b2|QRMqP|oQtB1pGwU#>u8HDx^Tyk16%e

J69HGF4}SR}F6bEY9Cgt2+3arWxM>Z2OGN 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

`VkF){-AdR9t*# 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 diff --git a/docs/zh/08-operation/pic/backup-11-restore-list.png b/docs/zh/08-operation/pic/backup-11-restore-list.png deleted file mode 100644 index ca1f1b45d59e9c391a040940009d1d273e1fd719..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57904 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 Zm&uo_U(&_)53zpw_l)mW{{ArHe*w;qCdL2& From 383a0b5dd5203e5f1e74f397e6327280fc98b013 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Thu, 26 Dec 2024 09:52:36 +0800 Subject: [PATCH 64/84] fix: catalog ut and timer stop issue --- source/libs/catalog/src/catalog.c | 11 +++++++++-- source/libs/catalog/test/catalogTests.cpp | 5 +++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/source/libs/catalog/src/catalog.c b/source/libs/catalog/src/catalog.c index bc1462176a..a0a4cb301c 100644 --- a/source/libs/catalog/src/catalog.c +++ b/source/libs/catalog/src/catalog.c @@ -1986,10 +1986,17 @@ void catalogDestroy(void) { } if (gCtgMgmt.cacheTimer) { - if (taosTmrStop(gCtgMgmt.cacheTimer)) { - qTrace("stop catalog cache timer may failed"); + if (!taosTmrStop(gCtgMgmt.cacheTimer)) { + qDebug("catalog cacheTimer %" PRIuPTR " not stopped", (uintptr_t)gCtgMgmt.cacheTimer); + + while (!taosTmrIsStopped(&gCtgMgmt.cacheTimer)) { + taosMsleep(1); + } } + + qDebug("catalog cacheTimer %" PRIuPTR " is stopped", (uintptr_t)gCtgMgmt.cacheTimer); gCtgMgmt.cacheTimer = NULL; + taosTmrCleanUp(gCtgMgmt.timer); gCtgMgmt.timer = NULL; } diff --git a/source/libs/catalog/test/catalogTests.cpp b/source/libs/catalog/test/catalogTests.cpp index c2889f096b..06eabc09da 100644 --- a/source/libs/catalog/test/catalogTests.cpp +++ b/source/libs/catalog/test/catalogTests.cpp @@ -149,12 +149,13 @@ void ctgTestInitLogFile() { return; } - const char *defaultLogFileNamePrefix = "taoslog"; + const char *defaultLogFileNamePrefix = "catalogTest"; const int32_t maxLogFileNum = 10; tsAsyncLog = 0; qDebugFlag = 159; tmrDebugFlag = 159; + tsNumOfLogLines = 1000000000; TAOS_STRCPY(tsLogDir, TD_LOG_DIR_PATH); (void)ctgdEnableDebug("api", true); @@ -1839,7 +1840,7 @@ TEST(tableMeta, updateStbMeta) { while (true) { uint64_t n = 0; ASSERT(0 == ctgdGetStatNum("runtime.numOfOpDequeue", (void *)&n)); - if (n != 3) { + if (n < 3) { taosMsleep(50); } else { break; From 59b10f414ce58bf70d01a80f4beeaf9d3a565e28 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Thu, 26 Dec 2024 10:10:21 +0800 Subject: [PATCH 65/84] fix: catalog dbg issue --- source/libs/catalog/src/catalog.c | 2 ++ source/libs/catalog/src/ctgDbg.c | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/source/libs/catalog/src/catalog.c b/source/libs/catalog/src/catalog.c index a0a4cb301c..2e16b0968a 100644 --- a/source/libs/catalog/src/catalog.c +++ b/source/libs/catalog/src/catalog.c @@ -1987,11 +1987,13 @@ void catalogDestroy(void) { if (gCtgMgmt.cacheTimer) { if (!taosTmrStop(gCtgMgmt.cacheTimer)) { +/* qDebug("catalog cacheTimer %" PRIuPTR " not stopped", (uintptr_t)gCtgMgmt.cacheTimer); while (!taosTmrIsStopped(&gCtgMgmt.cacheTimer)) { taosMsleep(1); } +*/ } qDebug("catalog cacheTimer %" PRIuPTR " is stopped", (uintptr_t)gCtgMgmt.cacheTimer); diff --git a/source/libs/catalog/src/ctgDbg.c b/source/libs/catalog/src/ctgDbg.c index f3a0b04457..a1512f8fd9 100644 --- a/source/libs/catalog/src/ctgDbg.c +++ b/source/libs/catalog/src/ctgDbg.c @@ -480,6 +480,8 @@ void ctgdShowDBCache(SCatalog *pCtg, SHashObj *dbHash) { dbCache = (SCtgDBCache *)pIter; + CTG_LOCK(CTG_READ, &dbCache->dbLock); + dbFName = taosHashGetKey(pIter, &len); int32_t metaNum = dbCache->tbCache ? taosHashGetSize(dbCache->tbCache) : 0; @@ -509,6 +511,8 @@ void ctgdShowDBCache(SCatalog *pCtg, SHashObj *dbHash) { hashMethod, hashPrefix, hashSuffix, vgNum); if (dbCache->vgCache.vgInfo) { + CTG_LOCK(CTG_READ, &dbCache->vgCache.vgLock); + int32_t i = 0; void *pVgIter = taosHashIterate(dbCache->vgCache.vgInfo->vgHash, NULL); while (pVgIter) { @@ -524,6 +528,8 @@ void ctgdShowDBCache(SCatalog *pCtg, SHashObj *dbHash) { pVgIter = taosHashIterate(dbCache->vgCache.vgInfo->vgHash, pVgIter); } + + CTG_UNLOCK(CTG_READ, &dbCache->vgCache.vgLock); } if (dbCache->cfgCache.cfgInfo) { @@ -544,6 +550,8 @@ void ctgdShowDBCache(SCatalog *pCtg, SHashObj *dbHash) { pCfg->schemaless, pCfg->sstTrigger); } + CTG_UNLOCK(CTG_READ, &dbCache->dbLock); + ++i; pIter = taosHashIterate(dbHash, pIter); } From f6500b35510554eaffdd1aaa7c5826e2057c3537 Mon Sep 17 00:00:00 2001 From: 54liuyao <54liuyao@163.com> Date: Thu, 26 Dec 2024 11:16:02 +0800 Subject: [PATCH 66/84] ci(test):delete invalid code&& add ci --- include/libs/executor/storageapi.h | 2 - include/libs/stream/streamState.h | 2 - include/libs/stream/tstreamFileState.h | 1 - source/dnode/snode/src/snodeInitApi.c | 2 - source/dnode/vnode/src/vnd/vnodeInitApi.c | 2 - source/libs/stream/inc/streamInt.h | 3 + source/libs/stream/src/streamCheckpoint.c | 5 +- source/libs/stream/src/streamState.c | 6 -- source/libs/stream/src/tstreamFileState.c | 22 +----- .../libs/stream/test/streamCheckPointTest.cpp | 71 ++++++++++++++++++- 10 files changed, 77 insertions(+), 39 deletions(-) diff --git a/include/libs/executor/storageapi.h b/include/libs/executor/storageapi.h index a2be706dc0..7a4401827c 100644 --- a/include/libs/executor/storageapi.h +++ b/include/libs/executor/storageapi.h @@ -389,7 +389,6 @@ typedef struct SStateStore { int32_t (*streamStateFillGetGroupKVByCur)(SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen); int32_t (*streamStateGetKVByCur)(SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen); - void (*streamStateSetFillInfo)(SStreamState* pState); void (*streamStateClearExpiredState)(SStreamState* pState); int32_t (*streamStateSessionAddIfNotExist)(SStreamState* pState, SSessionKey* key, TSKEY gap, void** pVal, @@ -455,7 +454,6 @@ typedef struct SStateStore { int32_t (*streamStateBegin)(SStreamState* pState); void (*streamStateCommit)(SStreamState* pState); void (*streamStateDestroy)(SStreamState* pState, bool remove); - int32_t (*streamStateDeleteCheckPoint)(SStreamState* pState, TSKEY mark); void (*streamStateReloadInfo)(SStreamState* pState, TSKEY ts); void (*streamStateCopyBackend)(SStreamState* src, SStreamState* dst); } SStateStore; diff --git a/include/libs/stream/streamState.h b/include/libs/stream/streamState.h index 2179547352..b4e0087b1a 100644 --- a/include/libs/stream/streamState.h +++ b/include/libs/stream/streamState.h @@ -34,7 +34,6 @@ void streamStateClose(SStreamState* pState, bool remove); int32_t streamStateBegin(SStreamState* pState); void streamStateCommit(SStreamState* pState); void streamStateDestroy(SStreamState* pState, bool remove); -int32_t streamStateDeleteCheckPoint(SStreamState* pState, TSKEY mark); int32_t streamStateDelTaskDb(SStreamState* pState); int32_t streamStateFuncPut(SStreamState* pState, const SWinKey* key, const void* value, int32_t vLen); @@ -108,7 +107,6 @@ int32_t streamStateFillGetGroupKVByCur(SStreamStateCur* pCur, SWinKey* pKey, con int32_t streamStateGetKVByCur(SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen); // twa -void streamStateSetFillInfo(SStreamState* pState); void streamStateClearExpiredState(SStreamState* pState); void streamStateCurNext(SStreamState* pState, SStreamStateCur* pCur); diff --git a/include/libs/stream/tstreamFileState.h b/include/libs/stream/tstreamFileState.h index f1f5b00e38..f47c308e18 100644 --- a/include/libs/stream/tstreamFileState.h +++ b/include/libs/stream/tstreamFileState.h @@ -67,7 +67,6 @@ SStreamSnapshot* getSnapshot(SStreamFileState* pFileState); void flushSnapshot(SStreamFileState* pFileState, SStreamSnapshot* pSnapshot, bool flushState); int32_t recoverSnapshot(SStreamFileState* pFileState, int64_t ckId); -int32_t getSnapshotIdList(SStreamFileState* pFileState, SArray* list); int32_t deleteExpiredCheckPoint(SStreamFileState* pFileState, TSKEY mark); int32_t streamFileStateGetSelectRowSize(SStreamFileState* pFileState); void streamFileStateReloadInfo(SStreamFileState* pFileState, TSKEY ts); diff --git a/source/dnode/snode/src/snodeInitApi.c b/source/dnode/snode/src/snodeInitApi.c index 4fe4333534..68dc981338 100644 --- a/source/dnode/snode/src/snodeInitApi.c +++ b/source/dnode/snode/src/snodeInitApi.c @@ -68,7 +68,6 @@ void initStateStoreAPI(SStateStore* pStore) { pStore->streamStateFillGetGroupKVByCur = streamStateFillGetGroupKVByCur; pStore->streamStateGetKVByCur = streamStateGetKVByCur; - pStore->streamStateSetFillInfo = streamStateSetFillInfo; pStore->streamStateClearExpiredState = streamStateClearExpiredState; pStore->streamStateSessionAddIfNotExist = streamStateSessionAddIfNotExist; @@ -117,7 +116,6 @@ void initStateStoreAPI(SStateStore* pStore) { pStore->streamStateBegin = streamStateBegin; pStore->streamStateCommit = streamStateCommit; pStore->streamStateDestroy = streamStateDestroy; - pStore->streamStateDeleteCheckPoint = streamStateDeleteCheckPoint; pStore->streamStateReloadInfo = streamStateReloadInfo; pStore->streamStateCopyBackend = streamStateCopyBackend; } diff --git a/source/dnode/vnode/src/vnd/vnodeInitApi.c b/source/dnode/vnode/src/vnd/vnodeInitApi.c index df6fb17730..41e6c6c2c5 100644 --- a/source/dnode/vnode/src/vnd/vnodeInitApi.c +++ b/source/dnode/vnode/src/vnd/vnodeInitApi.c @@ -191,7 +191,6 @@ void initStateStoreAPI(SStateStore* pStore) { pStore->streamStateFillGetGroupKVByCur = streamStateFillGetGroupKVByCur; pStore->streamStateGetKVByCur = streamStateGetKVByCur; - pStore->streamStateSetFillInfo = streamStateSetFillInfo; pStore->streamStateClearExpiredState = streamStateClearExpiredState; pStore->streamStateSessionAddIfNotExist = streamStateSessionAddIfNotExist; @@ -243,7 +242,6 @@ void initStateStoreAPI(SStateStore* pStore) { pStore->streamStateBegin = streamStateBegin; pStore->streamStateCommit = streamStateCommit; pStore->streamStateDestroy = streamStateDestroy; - pStore->streamStateDeleteCheckPoint = streamStateDeleteCheckPoint; pStore->streamStateReloadInfo = streamStateReloadInfo; pStore->streamStateCopyBackend = streamStateCopyBackend; } diff --git a/source/libs/stream/inc/streamInt.h b/source/libs/stream/inc/streamInt.h index 7af64c041d..f922a5e03e 100644 --- a/source/libs/stream/inc/streamInt.h +++ b/source/libs/stream/inc/streamInt.h @@ -254,6 +254,9 @@ int32_t uploadCheckpointData(SStreamTask* pTask, int64_t checkpointId, int64_t d int32_t chkptTriggerRecvMonitorHelper(SStreamTask* pTask, void* param, SArray** ppNotSendList); int32_t downloadCheckpointByNameS3(const char* id, const char* fname, const char* dstName); int32_t uploadCheckpointToS3(const char* id, const char* path); +int32_t deleteCheckpointFile(const char* id, const char* name); +int32_t doCheckBeforeHandleChkptTrigger(SStreamTask* pTask, int64_t checkpointId, SStreamDataBlock* pBlock, + int32_t transId); #ifdef __cplusplus } diff --git a/source/libs/stream/src/streamCheckpoint.c b/source/libs/stream/src/streamCheckpoint.c index ebde9fe50e..d3eba382c9 100644 --- a/source/libs/stream/src/streamCheckpoint.c +++ b/source/libs/stream/src/streamCheckpoint.c @@ -19,7 +19,6 @@ #include "tcs.h" static int32_t downloadCheckpointDataByName(const char* id, const char* fname, const char* dstName); -static int32_t deleteCheckpointFile(const char* id, const char* name); static int32_t streamTaskUploadCheckpoint(const char* id, const char* path, int64_t checkpointId); #ifdef BUILD_NO_CALL static int32_t deleteCheckpoint(const char* id); @@ -230,8 +229,8 @@ int32_t continueDispatchCheckpointTriggerBlock(SStreamDataBlock* pBlock, SStream return code; } -static int32_t doCheckBeforeHandleChkptTrigger(SStreamTask* pTask, int64_t checkpointId, SStreamDataBlock* pBlock, - int32_t transId) { +int32_t doCheckBeforeHandleChkptTrigger(SStreamTask* pTask, int64_t checkpointId, SStreamDataBlock* pBlock, + int32_t transId) { int32_t code = 0; int32_t vgId = pTask->pMeta->vgId; int32_t taskLevel = pTask->info.taskLevel; diff --git a/source/libs/stream/src/streamState.c b/source/libs/stream/src/streamState.c index 89f0ea9e1f..7259c0e49a 100644 --- a/source/libs/stream/src/streamState.c +++ b/source/libs/stream/src/streamState.c @@ -546,10 +546,6 @@ void streamStateDestroy(SStreamState* pState, bool remove) { taosMemoryFreeClear(pState); } -int32_t streamStateDeleteCheckPoint(SStreamState* pState, TSKEY mark) { - return deleteExpiredCheckPoint(pState->pFileState, mark); -} - void streamStateReloadInfo(SStreamState* pState, TSKEY ts) { streamFileStateReloadInfo(pState->pFileState, ts); } void streamStateCopyBackend(SStreamState* src, SStreamState* dst) { @@ -617,8 +613,6 @@ int32_t streamStateGroupGetKVByCur(SStreamStateCur* pCur, int64_t* pKey, void** void streamStateClearExpiredState(SStreamState* pState) { clearExpiredState(pState->pFileState); } -void streamStateSetFillInfo(SStreamState* pState) { setFillInfo(pState->pFileState); } - int32_t streamStateGetPrev(SStreamState* pState, const SWinKey* pKey, SWinKey* pResKey, void** pVal, int32_t* pVLen, int32_t* pWinCode) { return getRowStatePrevRow(pState->pFileState, pKey, pResKey, pVal, pVLen, pWinCode); diff --git a/source/libs/stream/src/tstreamFileState.c b/source/libs/stream/src/tstreamFileState.c index 05edad0f5f..aaff58d1b4 100644 --- a/source/libs/stream/src/tstreamFileState.c +++ b/source/libs/stream/src/tstreamFileState.c @@ -667,18 +667,6 @@ void deleteRowBuff(SStreamFileState* pFileState, const void* pKey, int32_t keyLe } } -int32_t resetRowBuff(SStreamFileState* pFileState, const void* pKey, int32_t keyLen) { - int32_t code_buff = pFileState->stateBuffRemoveFn(pFileState->rowStateBuff, pKey, keyLen); - int32_t code_file = pFileState->stateFileRemoveFn(pFileState, pKey); - if (pFileState->searchBuff != NULL) { - deleteHashSortRowBuff(pFileState, pKey); - } - if (code_buff == TSDB_CODE_SUCCESS || code_file == TSDB_CODE_SUCCESS) { - return TSDB_CODE_SUCCESS; - } - return TSDB_CODE_FAILED; -} - static int32_t recoverSessionRowBuff(SStreamFileState* pFileState, SRowBuffPos* pPos) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; @@ -868,10 +856,6 @@ int32_t forceRemoveCheckpoint(SStreamFileState* pFileState, int64_t checkpointId return streamDefaultDel_rocksdb(pFileState->pFileStore, keyBuf); } -int32_t getSnapshotIdList(SStreamFileState* pFileState, SArray* list) { - return streamDefaultIterGet_rocksdb(pFileState->pFileStore, TASK_KEY, NULL, list); -} - int32_t deleteExpiredCheckPoint(SStreamFileState* pFileState, TSKEY mark) { int32_t code = TSDB_CODE_SUCCESS; int64_t maxCheckPointId = 0; @@ -1227,10 +1211,6 @@ SSHashObj* getGroupIdCache(SStreamFileState* pFileState) { return pFileState->pGroupIdMap; } -void setFillInfo(SStreamFileState* pFileState) { - pFileState->hasFillCatch = false; -} - void clearExpiredState(SStreamFileState* pFileState) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; @@ -1261,6 +1241,7 @@ _end: } } +#ifdef BUILD_NO_CALL int32_t getStateSearchRowBuff(SStreamFileState* pFileState, const SWinKey* pKey, void** pVal, int32_t* pVLen, int32_t* pWinCode) { int32_t code = TSDB_CODE_SUCCESS; @@ -1328,6 +1309,7 @@ _end: } return code; } +#endif int32_t getRowStatePrevRow(SStreamFileState* pFileState, const SWinKey* pKey, SWinKey* pResKey, void** ppVal, int32_t* pVLen, int32_t* pWinCode) { diff --git a/source/libs/stream/test/streamCheckPointTest.cpp b/source/libs/stream/test/streamCheckPointTest.cpp index c8297d56b7..0f6370d1b6 100644 --- a/source/libs/stream/test/streamCheckPointTest.cpp +++ b/source/libs/stream/test/streamCheckPointTest.cpp @@ -390,9 +390,78 @@ TEST(sstreamTaskGetTriggerRecvStatusTest, streamTaskGetTriggerRecvStatusFnTest) extern int8_t tsS3EpNum; tsS3EpNum = 1; - code = uploadCheckpointToS3("123", "/tmp/backend5/stream"); + code = uploadCheckpointToS3("123", "/tmp/backend5/stream/stream"); EXPECT_EQ(code, TSDB_CODE_SUCCESS); code = downloadCheckpointByNameS3("123", "/root/download", ""); EXPECT_NE(code, TSDB_CODE_OUT_OF_RANGE); + + code = deleteCheckpointFile("aaa123", "bbb"); + EXPECT_NE(code, TSDB_CODE_OUT_OF_RANGE); } + +TEST(doCheckBeforeHandleChkptTriggerTest, doCheckBeforeHandleChkptTriggerFnTest) { + SStreamTask* pTask = NULL; + int64_t uid = 2222222222222; + SArray* array = taosArrayInit(4, POINTER_BYTES); + int32_t code = tNewStreamTask(uid, TASK_LEVEL__SINK, NULL, false, 0, 0, array, + false, 1, &pTask); + ASSERT_EQ(code, TSDB_CODE_SUCCESS); + + initTaskLock(pTask); + + const char *path = "/tmp/doCheckBeforeHandleChkptTriggerTest/stream"; + code = streamMetaOpen((path), NULL, NULL, NULL, 0, 0, NULL, &pTask->pMeta); + ASSERT_EQ(code, TSDB_CODE_SUCCESS); + + SStreamState *pState = streamStateOpen((char *)path, pTask, 0, 0); + ASSERT(pState != NULL); + + pTask->pBackend = pState->pTdbState->pOwner->pBackend; + + code = streamTaskCreateActiveChkptInfo(&pTask->chkInfo.pActiveInfo); + ASSERT_EQ(code, TSDB_CODE_SUCCESS); + + pTask->chkInfo.checkpointId = 123; + code = doCheckBeforeHandleChkptTrigger(pTask, 100, NULL, 0); + ASSERT_EQ(code, TSDB_CODE_STREAM_INVLD_CHKPT); + + pTask->chkInfo.pActiveInfo->failedId = 223; + code = doCheckBeforeHandleChkptTrigger(pTask, 200, NULL, 0); + ASSERT_EQ(code, TSDB_CODE_STREAM_INVLD_CHKPT); + + SStreamDataBlock block; + block.srcTaskId = 456; + SStreamTask upTask; + upTask = *pTask; + upTask.id.taskId = 456; + streamTaskSetUpstreamInfo(pTask, &upTask); + pTask->chkInfo.pActiveInfo->failedId = 23; + code = doCheckBeforeHandleChkptTrigger(pTask, 123, &block, 0); + ASSERT_EQ(code, TSDB_CODE_STREAM_INVLD_CHKPT); + + streamTaskSetUpstreamInfo(pTask, &upTask); + streamTaskSetStatusReady(pTask); + code = streamTaskHandleEvent(pTask->status.pSM, TASK_EVENT_GEN_CHECKPOINT); + ASSERT_EQ(code, TSDB_CODE_SUCCESS); + + pTask->chkInfo.pActiveInfo->activeId = 223; + + STaskCheckpointReadyInfo readyInfo; + readyInfo.upstreamTaskId = 4567; + block.srcTaskId = 4567; + void* pBuf = rpcMallocCont(sizeof(SMsgHead) + 1); + + initRpcMsg(&readyInfo.msg, 0, pBuf, sizeof(SMsgHead) + 1); + taosArrayPush(pTask->chkInfo.pActiveInfo->pReadyMsgList, &readyInfo); + code = doCheckBeforeHandleChkptTrigger(pTask, 223, &block, 0); + ASSERT_NE(code, TSDB_CODE_SUCCESS); + + pTask->chkInfo.pActiveInfo->allUpstreamTriggerRecv = 1; + code = doCheckBeforeHandleChkptTrigger(pTask, 223, &block, 0); + ASSERT_NE(code, TSDB_CODE_SUCCESS); + + pTask->chkInfo.pActiveInfo->activeId = 1111; + code = doCheckBeforeHandleChkptTrigger(pTask, 223, &block, 0); + ASSERT_EQ(code, TSDB_CODE_STREAM_INVLD_CHKPT); +} \ No newline at end of file From ff7a2ebe6ba3a14f80c63543507e683bc1891c45 Mon Sep 17 00:00:00 2001 From: 54liuyao <54liuyao@163.com> Date: Thu, 26 Dec 2024 13:35:50 +0800 Subject: [PATCH 67/84] ci(test):delete invalid code&& add ci --- source/libs/stream/test/streamCheckPointTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/stream/test/streamCheckPointTest.cpp b/source/libs/stream/test/streamCheckPointTest.cpp index 0f6370d1b6..c993743dc3 100644 --- a/source/libs/stream/test/streamCheckPointTest.cpp +++ b/source/libs/stream/test/streamCheckPointTest.cpp @@ -391,7 +391,7 @@ TEST(sstreamTaskGetTriggerRecvStatusTest, streamTaskGetTriggerRecvStatusFnTest) tsS3EpNum = 1; code = uploadCheckpointToS3("123", "/tmp/backend5/stream/stream"); - EXPECT_EQ(code, TSDB_CODE_SUCCESS); + EXPECT_NE(code, TSDB_CODE_OUT_OF_RANGE); code = downloadCheckpointByNameS3("123", "/root/download", ""); EXPECT_NE(code, TSDB_CODE_OUT_OF_RANGE); From cc027f96a2aea32f23a87678a50f8027b4658fcd Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 26 Dec 2024 13:44:44 +0800 Subject: [PATCH 68/84] remove unused code --- source/libs/transport/src/transCli.c | 143 +-------------------------- 1 file changed, 2 insertions(+), 141 deletions(-) diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index 468d9d9b50..398ce32b17 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -224,8 +224,6 @@ static void cliRecvCb(uv_stream_t* cli, ssize_t nread, const uv_buf_t* buf); static void cliConnCb(uv_connect_t* req, int status); static void cliAsyncCb(uv_async_t* handle); -SCliBatch* cliGetHeadFromList(SCliBatchList* pList); - static void destroyCliConnQTable(SCliConn* conn); static void cliHandleException(SCliConn* conn); @@ -1299,8 +1297,8 @@ static void cliHandleException(SCliConn* conn) { if (conn->registered) { int8_t ref = transGetRefCount(conn); if (ref == 0 && !uv_is_closing((uv_handle_t*)conn->stream)) { -// tTrace("%s conn %p fd %d,%d,%d,%p uv_closed", CONN_GET_INST_LABEL(conn), conn, conn->stream->u.fd, -// conn->stream->io_watcher.fd, conn->stream->accepted_fd, conn->stream->queued_fds); + // tTrace("%s conn %p fd %d,%d,%d,%p uv_closed", CONN_GET_INST_LABEL(conn), conn, conn->stream->u.fd, + // conn->stream->io_watcher.fd, conn->stream->accepted_fd, conn->stream->queued_fds); uv_close((uv_handle_t*)conn->stream, cliDestroy); } } @@ -2124,144 +2122,7 @@ static void cliDoReq(queue* wq, SCliThrd* pThrd) { tTrace("cli process batch size:%d", count); } } -SCliBatch* cliGetHeadFromList(SCliBatchList* pList) { - if (QUEUE_IS_EMPTY(&pList->wq) || pList->connCnt > pList->connMax || pList->sending > pList->connMax) { - return NULL; - } - queue* hr = QUEUE_HEAD(&pList->wq); - QUEUE_REMOVE(hr); - pList->sending += 1; - pList->len -= 1; - - SCliBatch* batch = QUEUE_DATA(hr, SCliBatch, listq); - return batch; -} -static int32_t createBatch(SCliBatch** ppBatch, SCliBatchList* pList, SCliReq* pReq); - -static int32_t createBatchList(SCliBatchList** ppBatchList, char* key, char* ip, uint32_t port); - -static void destroyBatchList(SCliBatchList* pList); -static void cliBuildBatch(SCliReq* pReq, queue* h, SCliThrd* pThrd) { - int32_t code = 0; - STrans* pInst = pThrd->pInst; - SReqCtx* pCtx = pReq->ctx; - - char* ip = EPSET_GET_INUSE_IP(pCtx->epSet); - uint32_t port = EPSET_GET_INUSE_PORT(pCtx->epSet); - char key[TSDB_FQDN_LEN + 64] = {0}; - CONN_CONSTRUCT_HASH_KEY(key, ip, port); - size_t klen = strlen(key); - SCliBatchList** ppBatchList = taosHashGet(pThrd->batchCache, key, klen); - if (ppBatchList == NULL || *ppBatchList == NULL) { - SCliBatchList* pBatchList = NULL; - code = createBatchList(&pBatchList, key, ip, port); - if (code != 0) { - destroyReq(pReq); - return; - } - - pBatchList->batchLenLimit = pInst->shareConnLimit; - - SCliBatch* pBatch = NULL; - code = createBatch(&pBatch, pBatchList, pReq); - if (code != 0) { - destroyBatchList(pBatchList); - destroyReq(pReq); - return; - } - - code = taosHashPut(pThrd->batchCache, key, klen, &pBatchList, sizeof(void*)); - if (code != 0) { - destroyBatchList(pBatchList); - } - } else { - if (QUEUE_IS_EMPTY(&(*ppBatchList)->wq)) { - SCliBatch* pBatch = NULL; - code = createBatch(&pBatch, *ppBatchList, pReq); - if (code != 0) { - destroyReq(pReq); - cliDestroyBatch(pBatch); - } - } else { - queue* hdr = QUEUE_TAIL(&((*ppBatchList)->wq)); - SCliBatch* pBatch = QUEUE_DATA(hdr, SCliBatch, listq); - if ((pBatch->shareConnLimit + pReq->msg.contLen) < (*ppBatchList)->batchLenLimit) { - QUEUE_PUSH(&pBatch->wq, h); - pBatch->shareConnLimit += pReq->msg.contLen; - pBatch->wLen += 1; - } else { - SCliBatch* tBatch = NULL; - code = createBatch(&tBatch, *ppBatchList, pReq); - if (code != 0) { - destroyReq(pReq); - } - } - } - } - return; -} -static int32_t createBatchList(SCliBatchList** ppBatchList, char* key, char* ip, uint32_t port) { - SCliBatchList* pBatchList = taosMemoryCalloc(1, sizeof(SCliBatchList)); - if (pBatchList == NULL) { - tError("failed to create batch list since %s", tstrerror(TSDB_CODE_OUT_OF_MEMORY)); - return terrno; - } - QUEUE_INIT(&pBatchList->wq); - pBatchList->port = port; - pBatchList->connMax = 1; - pBatchList->connCnt = 0; - pBatchList->batchLenLimit = 0; - pBatchList->len += 1; - - pBatchList->ip = taosStrdup(ip); - pBatchList->dst = taosStrdup(key); - if (pBatchList->ip == NULL || pBatchList->dst == NULL) { - taosMemoryFree(pBatchList->ip); - taosMemoryFree(pBatchList->dst); - taosMemoryFree(pBatchList); - tError("failed to create batch list since %s", tstrerror(TSDB_CODE_OUT_OF_MEMORY)); - return terrno; - } - *ppBatchList = pBatchList; - return 0; -} -static void destroyBatchList(SCliBatchList* pList) { - if (pList == NULL) { - return; - } - while (!QUEUE_IS_EMPTY(&pList->wq)) { - queue* h = QUEUE_HEAD(&pList->wq); - QUEUE_REMOVE(h); - - SCliBatch* pBatch = QUEUE_DATA(h, SCliBatch, listq); - cliDestroyBatch(pBatch); - } - taosMemoryFree(pList->ip); - taosMemoryFree(pList->dst); - taosMemoryFree(pList); -} -static int32_t createBatch(SCliBatch** ppBatch, SCliBatchList* pList, SCliReq* pReq) { - SCliBatch* pBatch = taosMemoryCalloc(1, sizeof(SCliBatch)); - if (pBatch == NULL) { - tError("failed to create batch since %s", tstrerror(TSDB_CODE_OUT_OF_MEMORY)); - return terrno; - } - - QUEUE_INIT(&pBatch->wq); - QUEUE_INIT(&pBatch->listq); - - QUEUE_PUSH(&pBatch->wq, &pReq->q); - pBatch->wLen += 1; - pBatch->shareConnLimit = pReq->msg.contLen; - pBatch->pList = pList; - - QUEUE_PUSH(&pList->wq, &pBatch->listq); - pList->len += 1; - - *ppBatch = pBatch; - return 0; -} static void cliDoBatchReq(queue* wq, SCliThrd* pThrd) { return cliDoReq(wq, pThrd); } static void cliAsyncCb(uv_async_t* handle) { From 57c1796e553af482165b5e5da8c0825bf76d3670 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 26 Dec 2024 14:44:13 +0800 Subject: [PATCH 69/84] remove unused code --- source/libs/transport/src/transCli.c | 34 ---------------------------- 1 file changed, 34 deletions(-) diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index 398ce32b17..3b84fc4574 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -151,7 +151,6 @@ typedef struct SCliThrd { TdThreadMutex msgMtx; SDelayQueue* delayQueue; SDelayQueue* timeoutQueue; - SDelayQueue* waitConnQueue; uint64_t nextTimeout; // next timeout STrans* pInst; // @@ -159,8 +158,6 @@ typedef struct SCliThrd { SHashObj* fqdn2ipCache; SCvtAddr* pCvtAddr; - SHashObj* failFastCache; - SHashObj* batchCache; SHashObj* connHeapCache; SCliReq* stopMsg; @@ -2355,10 +2352,6 @@ static int32_t createThrdObj(void* trans, SCliThrd** ppThrd) { TAOS_CHECK_GOTO(code, NULL, _end); } - if ((code = transDQCreate(pThrd->loop, &pThrd->waitConnQueue)) != 0) { - TAOS_CHECK_GOTO(code, NULL, _end); - } - pThrd->destroyAhandleFp = pInst->destroyFp; pThrd->fqdn2ipCache = taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK); @@ -2366,11 +2359,6 @@ static int32_t createThrdObj(void* trans, SCliThrd** ppThrd) { TAOS_CHECK_GOTO(terrno, NULL, _end); } - pThrd->batchCache = taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK); - if (pThrd->batchCache == NULL) { - TAOS_CHECK_GOTO(terrno, NULL, _end); - } - pThrd->connHeapCache = taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK); if (pThrd->connHeapCache == NULL) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, NULL, _end); @@ -2414,10 +2402,7 @@ _end: transDQDestroy(pThrd->delayQueue, NULL); transDQDestroy(pThrd->timeoutQueue, NULL); - transDQDestroy(pThrd->waitConnQueue, NULL); taosHashCleanup(pThrd->fqdn2ipCache); - taosHashCleanup(pThrd->failFastCache); - taosHashCleanup(pThrd->batchCache); taosHashCleanup(pThrd->pIdConnTable); taosArrayDestroy(pThrd->pQIdBuf); @@ -2441,7 +2426,6 @@ static void destroyThrdObj(SCliThrd* pThrd) { transDQDestroy(pThrd->delayQueue, destroyReqAndAhanlde); transDQDestroy(pThrd->timeoutQueue, NULL); - transDQDestroy(pThrd->waitConnQueue, NULL); tDebug("thread destroy %" PRId64, pThrd->pid); for (int i = 0; i < taosArrayGetSize(pThrd->timerList); i++) { @@ -2453,24 +2437,6 @@ static void destroyThrdObj(SCliThrd* pThrd) { taosMemoryFree(pThrd->loop); taosHashCleanup(pThrd->fqdn2ipCache); - void** pIter = taosHashIterate(pThrd->batchCache, NULL); - while (pIter != NULL) { - SCliBatchList* pBatchList = (SCliBatchList*)(*pIter); - while (!QUEUE_IS_EMPTY(&pBatchList->wq)) { - queue* h = QUEUE_HEAD(&pBatchList->wq); - QUEUE_REMOVE(h); - - SCliBatch* pBatch = QUEUE_DATA(h, SCliBatch, listq); - cliDestroyBatch(pBatch); - } - taosMemoryFree(pBatchList->ip); - taosMemoryFree(pBatchList->dst); - taosMemoryFree(pBatchList); - - pIter = (void**)taosHashIterate(pThrd->batchCache, pIter); - } - taosHashCleanup(pThrd->batchCache); - void* pIter2 = taosHashIterate(pThrd->connHeapCache, NULL); while (pIter2 != NULL) { SHeap* heap = (SHeap*)(pIter2); From c8b44b82c4c6a5cdb50c4672b4413af4a98f0f0e Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 19 Dec 2024 15:27:23 +0800 Subject: [PATCH 70/84] refactor:do some internal refactor. --- include/common/tanalytics.h | 4 +-- source/libs/executor/src/forecastoperator.c | 33 +++++++++++++-------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/include/common/tanalytics.h b/include/common/tanalytics.h index d0af84ecfb..6ebdb38fa6 100644 --- a/include/common/tanalytics.h +++ b/include/common/tanalytics.h @@ -28,8 +28,8 @@ extern "C" { #define ANAL_FORECAST_DEFAULT_ROWS 10 #define ANAL_FORECAST_DEFAULT_CONF 95 #define ANAL_FORECAST_DEFAULT_WNCHECK 1 -#define ANAL_FORECAST_MAX_ROWS 10000 -#define ANAL_ANOMALY_WINDOW_MAX_ROWS 10000 +#define ANAL_FORECAST_MAX_ROWS 40000 +#define ANAL_ANOMALY_WINDOW_MAX_ROWS 40000 typedef struct { EAnalAlgoType type; diff --git a/source/libs/executor/src/forecastoperator.c b/source/libs/executor/src/forecastoperator.c index a56b0dd214..2985e5e000 100644 --- a/source/libs/executor/src/forecastoperator.c +++ b/source/libs/executor/src/forecastoperator.c @@ -72,17 +72,20 @@ static FORCE_INLINE int32_t forecastEnsureBlockCapacity(SSDataBlock* pBlock, int return TSDB_CODE_SUCCESS; } -static int32_t forecastCacheBlock(SForecastSupp* pSupp, SSDataBlock* pBlock) { - if (pSupp->cachedRows > ANAL_FORECAST_MAX_ROWS) { - return TSDB_CODE_ANA_ANODE_TOO_MANY_ROWS; - } - - int32_t code = TSDB_CODE_SUCCESS; - int32_t lino = 0; +static int32_t forecastCacheBlock(SForecastSupp* pSupp, SSDataBlock* pBlock, const char* id) { + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; SAnalyticBuf* pBuf = &pSupp->analBuf; - qDebug("block:%d, %p rows:%" PRId64, pSupp->numOfBlocks, pBlock, pBlock->info.rows); + if (pSupp->cachedRows > ANAL_FORECAST_MAX_ROWS) { + code = TSDB_CODE_ANA_ANODE_TOO_MANY_ROWS; + qError("%s rows:%" PRId64 " for forecast cache, error happens, code:%s, upper limit:%d", id, pSupp->cachedRows, + tstrerror(code), ANAL_FORECAST_MAX_ROWS); + return code; + } + pSupp->numOfBlocks++; + qDebug("%s block:%d, %p rows:%" PRId64, id, pSupp->numOfBlocks, pBlock, pBlock->info.rows); for (int32_t j = 0; j < pBlock->info.rows; ++j) { SColumnInfoData* pValCol = taosArrayGet(pBlock->pDataBlock, pSupp->inputValSlot); @@ -98,10 +101,16 @@ static int32_t forecastCacheBlock(SForecastSupp* pSupp, SSDataBlock* pBlock) { pSupp->numOfRows++; code = taosAnalBufWriteColData(pBuf, 0, TSDB_DATA_TYPE_TIMESTAMP, &ts); - if (TSDB_CODE_SUCCESS != code) return code; + if (TSDB_CODE_SUCCESS != code) { + qError("%s failed to write ts in buf, code:%s", id, tstrerror(code)); + return code; + } code = taosAnalBufWriteColData(pBuf, 1, valType, val); - if (TSDB_CODE_SUCCESS != code) return code; + if (TSDB_CODE_SUCCESS != code) { + qError("%s failed to write val in buf, code:%s", id, tstrerror(code)); + return code; + } } return 0; @@ -394,7 +403,7 @@ static int32_t forecastNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { pSupp->cachedRows += pBlock->info.rows; qDebug("%s group:%" PRId64 ", blocks:%d, rows:%" PRId64 ", total rows:%" PRId64, pId, pSupp->groupId, numOfBlocks, pBlock->info.rows, pSupp->cachedRows); - code = forecastCacheBlock(pSupp, pBlock); + code = forecastCacheBlock(pSupp, pBlock, pId); QUERY_CHECK_CODE(code, lino, _end); } else { qDebug("%s group:%" PRId64 ", read finish for new group coming, blocks:%d", pId, pSupp->groupId, numOfBlocks); @@ -405,7 +414,7 @@ static int32_t forecastNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { pSupp->cachedRows = pBlock->info.rows; qDebug("%s group:%" PRId64 ", new group, rows:%" PRId64 ", total rows:%" PRId64, pId, pSupp->groupId, pBlock->info.rows, pSupp->cachedRows); - code = forecastCacheBlock(pSupp, pBlock); + code = forecastCacheBlock(pSupp, pBlock, pId); QUERY_CHECK_CODE(code, lino, _end); } From 9198164ac661c5aaf0a21250f91bbc5af51a65f0 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 19 Dec 2024 16:26:17 +0800 Subject: [PATCH 71/84] fix(analytics): fix check return value error. --- source/util/src/tanalytics.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/util/src/tanalytics.c b/source/util/src/tanalytics.c index 68bbbb7e99..3812295381 100644 --- a/source/util/src/tanalytics.c +++ b/source/util/src/tanalytics.c @@ -478,11 +478,13 @@ static int32_t taosAnalJsonBufWriteStrUseCol(SAnalyticBuf *pBuf, const char *buf } if (pBuf->bufType == ANALYTICS_BUF_TYPE_JSON) { - if (taosWriteFile(pBuf->filePtr, buf, bufLen) != bufLen) { + int32_t ret = taosWriteFile(pBuf->filePtr, buf, bufLen); + if (ret < 0) { return terrno; } } else { - if (taosWriteFile(pBuf->pCols[colIndex].filePtr, buf, bufLen) != bufLen) { + int32_t ret = taosWriteFile(pBuf->pCols[colIndex].filePtr, buf, bufLen); + if (ret < 0) { return terrno; } } From bf4da942e4e68f223fdceafd2af076030d4885e4 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 20 Dec 2024 18:49:57 +0800 Subject: [PATCH 72/84] refactor(analytics): do some refactor. --- source/util/src/tanalytics.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/util/src/tanalytics.c b/source/util/src/tanalytics.c index 3812295381..306795f5ed 100644 --- a/source/util/src/tanalytics.c +++ b/source/util/src/tanalytics.c @@ -479,12 +479,12 @@ static int32_t taosAnalJsonBufWriteStrUseCol(SAnalyticBuf *pBuf, const char *buf if (pBuf->bufType == ANALYTICS_BUF_TYPE_JSON) { int32_t ret = taosWriteFile(pBuf->filePtr, buf, bufLen); - if (ret < 0) { + if (ret != bufLen) { return terrno; } } else { int32_t ret = taosWriteFile(pBuf->pCols[colIndex].filePtr, buf, bufLen); - if (ret < 0) { + if (ret != bufLen) { return terrno; } } From 9cb81284f62e0781155120b5dd71a87531b40dee Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Mon, 23 Dec 2024 14:32:04 +0800 Subject: [PATCH 73/84] fix(analytics):copy the correct post rsp. --- source/util/src/tanalytics.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/source/util/src/tanalytics.c b/source/util/src/tanalytics.c index 306795f5ed..5a3ceef422 100644 --- a/source/util/src/tanalytics.c +++ b/source/util/src/tanalytics.c @@ -216,12 +216,28 @@ static size_t taosCurlWriteData(char *pCont, size_t contLen, size_t nmemb, void return 0; } - pRsp->dataLen = (int64_t)contLen * (int64_t)nmemb; - pRsp->data = taosMemoryMalloc(pRsp->dataLen + 1); + int64_t size = pRsp->dataLen + (int64_t)contLen * nmemb; + if (pRsp->data == NULL) { + pRsp->data = taosMemoryMalloc(size + 1); + if (pRsp->data == NULL) { + uError("failed to prepare recv buffer for post rsp, len:%d, code:%s", (int32_t) size + 1, tstrerror(terrno)); + return terrno; + } + } else { + char* p = taosMemoryRealloc(pRsp->data, size + 1); + if (p == NULL) { + uError("failed to prepare recv buffer for post rsp, len:%d, code:%s", (int32_t) size + 1, tstrerror(terrno)); + return terrno; + } + + pRsp->data = p; + } if (pRsp->data != NULL) { - (void)memcpy(pRsp->data, pCont, pRsp->dataLen); + (void)memcpy(pRsp->data + pRsp->dataLen, pCont, pRsp->dataLen); pRsp->data[pRsp->dataLen] = 0; + pRsp->dataLen = size; + uDebugL("curl response is received, len:%" PRId64 ", content:%s", pRsp->dataLen, pRsp->data); return pRsp->dataLen; } else { From ac6c6278b73fcfa1e5739e84abbddc615f8c97ca Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Mon, 23 Dec 2024 16:41:50 +0800 Subject: [PATCH 74/84] fix(analytics): fix bugs in recv post results. --- source/util/src/tanalytics.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/source/util/src/tanalytics.c b/source/util/src/tanalytics.c index 5a3ceef422..e68edd4b76 100644 --- a/source/util/src/tanalytics.c +++ b/source/util/src/tanalytics.c @@ -216,30 +216,33 @@ static size_t taosCurlWriteData(char *pCont, size_t contLen, size_t nmemb, void return 0; } - int64_t size = pRsp->dataLen + (int64_t)contLen * nmemb; + int64_t newDataSize = (int64_t) contLen * nmemb; + int64_t size = pRsp->dataLen + newDataSize; + if (pRsp->data == NULL) { pRsp->data = taosMemoryMalloc(size + 1); if (pRsp->data == NULL) { uError("failed to prepare recv buffer for post rsp, len:%d, code:%s", (int32_t) size + 1, tstrerror(terrno)); - return terrno; + return 0; // return the recv length, if failed, return 0 } } else { char* p = taosMemoryRealloc(pRsp->data, size + 1); if (p == NULL) { uError("failed to prepare recv buffer for post rsp, len:%d, code:%s", (int32_t) size + 1, tstrerror(terrno)); - return terrno; + return 0; // return the recv length, if failed, return 0 } pRsp->data = p; } if (pRsp->data != NULL) { - (void)memcpy(pRsp->data + pRsp->dataLen, pCont, pRsp->dataLen); - pRsp->data[pRsp->dataLen] = 0; - pRsp->dataLen = size; + (void)memcpy(pRsp->data + pRsp->dataLen, pCont, newDataSize); - uDebugL("curl response is received, len:%" PRId64 ", content:%s", pRsp->dataLen, pRsp->data); - return pRsp->dataLen; + pRsp->dataLen = size; + pRsp->data[size] = 0; + + uDebugL("curl response is received, len:%" PRId64 ", content:%s", size, pRsp->data); + return newDataSize; } else { pRsp->dataLen = 0; uError("failed to malloc curl response"); From 44db20492c558b9d3ec165d2c20f07a88ad7192c Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 26 Dec 2024 10:42:34 +0800 Subject: [PATCH 75/84] fix(stream): check error and continue computing, fix memory leak. --- source/libs/stream/src/streamDispatch.c | 23 +++++++++++------------ source/libs/stream/src/streamExec.c | 3 +-- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/source/libs/stream/src/streamDispatch.c b/source/libs/stream/src/streamDispatch.c index b4fcf1edc9..722ab2018e 100644 --- a/source/libs/stream/src/streamDispatch.c +++ b/source/libs/stream/src/streamDispatch.c @@ -954,7 +954,6 @@ static int32_t doTaskChkptStatusCheck(SStreamTask* pTask, void* param, int32_t n int32_t vgId = pTask->pMeta->vgId; if (pTmrInfo->launchChkptId != pActiveInfo->activeId) { - streamCleanBeforeQuitTmr(pTmrInfo, param); stWarn("s-task:%s vgId:%d ready-msg send tmr launched by previous checkpoint procedure, checkpointId:%" PRId64 ", quit", id, vgId, pTmrInfo->launchChkptId); @@ -963,13 +962,11 @@ static int32_t doTaskChkptStatusCheck(SStreamTask* pTask, void* param, int32_t n // active checkpoint info is cleared for now if ((pActiveInfo->activeId == 0) || (pActiveInfo->transId == 0) || (num == 0) || (pTask->chkInfo.startTs == 0)) { - streamCleanBeforeQuitTmr(pTmrInfo, param); stWarn("s-task:%s vgId:%d active checkpoint may be cleared, quit from readyMsg send tmr", id, vgId); return -1; } if (taosArrayGetSize(pTask->upstreamInfo.pList) != num) { - streamCleanBeforeQuitTmr(pTmrInfo, param); stWarn("s-task:%s vgId:%d upstream number:%d not equals sent readyMsg:%d, quit from readyMsg send tmr", id, vgId, (int32_t)taosArrayGetSize(pTask->upstreamInfo.pList), num); return -1; @@ -998,6 +995,7 @@ static int32_t doFindNotConfirmUpstream(SArray** ppNotRspList, SArray* pList, in void* p = taosArrayPush(pTmp, &pInfo->upstreamTaskId); if (p == NULL) { stError("s-task:%s vgId:%d failed to record not rsp task, code: out of memory", id, vgId); + taosArrayDestroy(pTmp); return terrno; } else { stDebug("s-task:%s vgId:%d level:%d checkpoint-ready rsp from upstream:0x%x not confirmed yet", id, vgId, level, @@ -1047,13 +1045,13 @@ static void doSendChkptReadyMsg(SStreamTask* pTask, SArray* pNotRspList, int64_t } } -static int32_t chkptReadyMsgSendHelper(SStreamTask* pTask, void* param, SArray* pNotRspList) { +static int32_t chkptReadyMsgSendHelper(SStreamTask* pTask, void* param, SArray** pNotRspList) { SActiveCheckpointInfo* pActiveInfo = pTask->chkInfo.pActiveInfo; SStreamTmrInfo* pTmrInfo = &pActiveInfo->chkptReadyMsgTmr; SArray* pList = pActiveInfo->pReadyMsgList; int32_t num = taosArrayGetSize(pList); int32_t vgId = pTask->pMeta->vgId; - int32_t checkpointId = pActiveInfo->activeId; + int64_t checkpointId = pActiveInfo->activeId; const char* id = pTask->id.idStr; int32_t notRsp = 0; @@ -1062,18 +1060,17 @@ static int32_t chkptReadyMsgSendHelper(SStreamTask* pTask, void* param, SArray* return code; } - code = doFindNotConfirmUpstream(&pNotRspList, pList, num, vgId, pTask->info.taskLevel, id); + code = doFindNotConfirmUpstream(pNotRspList, pList, num, vgId, pTask->info.taskLevel, id); if (code) { - streamCleanBeforeQuitTmr(pTmrInfo, param); stError("s-task:%s failed to find not rsp checkpoint-ready downstream, code:%s, out of tmr", id, tstrerror(code)); return code; } - notRsp = taosArrayGetSize(pNotRspList); + notRsp = taosArrayGetSize(*pNotRspList); if (notRsp == 0) { streamClearChkptReadyMsg(pActiveInfo); } else { - doSendChkptReadyMsg(pTask, pNotRspList, checkpointId, pList); + doSendChkptReadyMsg(pTask, *pNotRspList, checkpointId, pList); } return code; @@ -1137,10 +1134,12 @@ static void chkptReadyMsgSendMonitorFn(void* param, void* tmrId) { } streamMutexLock(&pActiveInfo->lock); - code = chkptReadyMsgSendHelper(pTask, param, pNotRspList); + code = chkptReadyMsgSendHelper(pTask, param, &pNotRspList); streamMutexUnlock(&pActiveInfo->lock); if (code != TSDB_CODE_SUCCESS) { + streamCleanBeforeQuitTmr(pTmrInfo, param); + streamMetaReleaseTask(pTask->pMeta, pTask); taosArrayDestroy(pNotRspList); return; @@ -1176,7 +1175,7 @@ int32_t streamTaskSendCheckpointReadyMsg(SStreamTask* pTask) { int32_t num = taosArrayGetSize(pList); if (taosArrayGetSize(pTask->upstreamInfo.pList) != num) { - stError("s-task:%s invalid number of sent readyMsg:%d to upstream:%d", id, num, + stError("s-task:%s invalid number of sent readyMsg:%d to upstream:%d not send chkpt-ready msg", id, num, (int32_t)taosArrayGetSize(pTask->upstreamInfo.pList)); streamMutexUnlock(&pActiveInfo->lock); return TSDB_CODE_STREAM_INTERNAL_ERROR; @@ -1200,7 +1199,7 @@ int32_t streamTaskSendCheckpointReadyMsg(SStreamTask* pTask) { stError("s-task:%s failed to send checkpoint-ready msg, try nex time in 10s", id); } } else { - stError("s-task:%s failed to prepare the checkpoint-ready msg, try nex time in 10s", id); + stError("s-task:%s failed to prepare the checkpoint-ready msg, try next time in 10s", id); } } diff --git a/source/libs/stream/src/streamExec.c b/source/libs/stream/src/streamExec.c index 85f287f301..89cb4153fe 100644 --- a/source/libs/stream/src/streamExec.c +++ b/source/libs/stream/src/streamExec.c @@ -915,8 +915,7 @@ int32_t streamResumeTask(SStreamTask* pTask) { while (1) { code = doStreamExecTask(pTask); if (code) { - stError("s-task:%s failed to exec stream task, code:%s", id, tstrerror(code)); - return code; + stError("s-task:%s failed to exec stream task, code:%s, continue", id, tstrerror(code)); } // check if continue streamMutexLock(&pTask->lock); From 388de2a2f1fdb23a0682e3d00932e65259fc6a3b Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 26 Dec 2024 17:24:17 +0800 Subject: [PATCH 76/84] test(analytics): add tests for tdanalytics. --- source/util/src/tanalytics.c | 6 +-- tests/script/sh/stop_dnodes.sh | 8 +-- tests/script/tsim/analytics/basic0.sim | 67 +++++++++++++++++++++++++- 3 files changed, 73 insertions(+), 8 deletions(-) diff --git a/source/util/src/tanalytics.c b/source/util/src/tanalytics.c index e68edd4b76..bf2cb4fd07 100644 --- a/source/util/src/tanalytics.c +++ b/source/util/src/tanalytics.c @@ -20,7 +20,7 @@ #ifdef USE_ANALYTICS #include -#define ANAL_ALGO_SPLIT "," +#define ANALYTICS_ALOG_SPLIT_CHAR "," typedef struct { int64_t ver; @@ -136,7 +136,7 @@ bool taosAnalGetOptStr(const char *option, const char *optName, char *optValue, return false; } - pEnd = strstr(pStart, ANAL_ALGO_SPLIT); + pEnd = strstr(pStart, ANALYTICS_ALOG_SPLIT_CHAR); if (optMaxLen > 0) { if (pEnd > pStart) { int32_t len = (int32_t)(pEnd - pStart); @@ -168,7 +168,7 @@ bool taosAnalGetOptInt(const char *option, const char *optName, int64_t *optValu int32_t bufLen = tsnprintf(buf, sizeof(buf), "%s=", optName); char *pos1 = strstr(option, buf); - char *pos2 = strstr(option, ANAL_ALGO_SPLIT); + char *pos2 = strstr(option, ANALYTICS_ALOG_SPLIT_CHAR); if (pos1 != NULL) { *optValue = taosStr2Int64(pos1 + bufLen, NULL, 10); return true; diff --git a/tests/script/sh/stop_dnodes.sh b/tests/script/sh/stop_dnodes.sh index 8923804547..da2083b013 100755 --- a/tests/script/sh/stop_dnodes.sh +++ b/tests/script/sh/stop_dnodes.sh @@ -13,7 +13,7 @@ if [ -n "$PID" ]; then systemctl stop taosd fi -PID=`ps -ef|grep -w taosd | grep -v grep | awk '{print $2}'` +PID=`ps -ef|grep -w taosd | grep -v grep | grep -v taosanode | awk '{print $2}'` while [ -n "$PID" ]; do echo kill -9 $PID #pkill -9 taosd @@ -38,10 +38,10 @@ while [ -n "$PID" ]; do else lsof -nti:6030 | xargs kill -9 fi - PID=`ps -ef|grep -w taos | grep -v grep | awk '{print $2}'` + PID=`ps -ef|grep -w taos | grep -v grep |grep -v taosanode| awk '{print $2}'` done -PID=`ps -ef|grep -w tmq_sim | grep -v grep | awk '{print $2}'` +PID=`ps -ef|grep -w tmq_sim | grep -v grep | grep -v taosanode|awk '{print $2}'` while [ -n "$PID" ]; do echo kill -9 $PID #pkill -9 tmq_sim @@ -52,5 +52,5 @@ while [ -n "$PID" ]; do else lsof -nti:6030 | xargs kill -9 fi - PID=`ps -ef|grep -w tmq_sim | grep -v grep | awk '{print $2}'` + PID=`ps -ef|grep -w tmq_sim | grep -v grep | grep -v taosanode| awk '{print $2}'` done \ No newline at end of file diff --git a/tests/script/tsim/analytics/basic0.sim b/tests/script/tsim/analytics/basic0.sim index 77c9184e8f..35774e7682 100644 --- a/tests/script/tsim/analytics/basic0.sim +++ b/tests/script/tsim/analytics/basic0.sim @@ -3,7 +3,17 @@ system sh/deploy.sh -n dnode1 -i 1 system sh/exec.sh -n dnode1 -s start sql connect -print =============== create anode +print =============== failed to create anode on '127.0.0.1:1101' +sql_error create anode '127.0.0.1:1101' + +sql show anodes +if $rows != 0 then + return -1 +endi + +sql_error drop anode 1 + +print ================ create anode sql create anode '192.168.1.116:6050' sql show anodes @@ -58,6 +68,61 @@ if $data00 != 1 then return -1 endi +sql_error select _frowts, _flow, _fhigh, forecast(c1, 'algo=holtwinters,conf=0.5,wncheck=1,period=0') from ct1 +sql_error select _frowts, _flow, _fhigh, forecast(c1, 'algo=holtwinters,conf=119,wncheck=1,period=0') from ct1 +sql_error select _frowts, _flow, _fhigh, forecast(c1, 'algo=holtwinters1,conf=0.5,wncheck=1,period=0') from ct1 +sql_error select forecast(c1, 'conf=50 ,algo = arima, rows=0') from ct1 +sql_error select forecast(c1, 'conf=50 ,algo = arima, rows=-10') from ct1 +sql_error select forecast(c1, 'conf=50 ,algo = arima, every=0') from ct1 + +sql select _frowts, _flow, _fhigh, forecast(c1, 'algo=holtwinters, conf=50 ') from ct1 +sql select _frowts, _flow, _fhigh, forecast(c1, ' algo=holtwinters , conf=50 ') from ct1 +sql select _frowts, _flow, _fhigh, forecast(c1, ' algo = holtwinters , conf = 50 ') from ct1 +sql select _frowts, _flow, _fhigh, forecast(c1, 'conf=50 ,algo = holtwinters, ') from ct1 +sql select _frowts, _flow, _fhigh, forecast(c1, 'conf=50 ,algo = holtwinters, ,') from ct1 +sql select _frowts, _flow, _fhigh, forecast(c1, 'conf=50 ,algo = holtwinters, , ,') from ct1 +sql select _frowts, _flow, _fhigh, forecast(c1, 'conf=50 ,algo = holtwinters, a =') from ct1 +sql select _frowts, _flow, _fhigh, forecast(c1, 'conf=50 ,algo = holtwinters, = a ,') from ct1 +sql select forecast(c1, 'conf=50 ,algo = arima') from ct1 +sql select forecast(c1, 'conf=50 ,algo = arima, rows=1') from ct1 + +sql select _frowts, _flow, _fhigh, forecast(c1, 'algo=holtwinters,conf=50,wncheck=1,period=0,start=1700000000000,every=2') from ct1 +if $rows != 10 then + return -1 +endi + +if $data03 != 28 then + return -1 +endi + +if $data00 != @23-11-15 06:13:20.000@ then + print expect 23-11-15 06:13:20.000 , actual $data00 + return -1 +endi + +if $data10 != @23-11-15 06:13:20.002@ then + print expect 23-11-15 06:13:20.002 , actual $data10 + return -1 +endi + +if $data20 != @23-11-15 06:13:20.004@ then + return -1 +endi + +print test the every option and rows option + +sql select _frowts, _flow, _fhigh, forecast(c1, 'algo=holtwinters,conf=50,wncheck=1,period=0,start=1700000000000,every=100,rows=5') from ct1 +if $rows != 5 then + return -1 +endi + +if $data00 != @23-11-15 06:13:20.000@ then + return -1 +endi + +if $data10 != @23-11-15 06:13:20.100@ then + return -1 +endi sql drop anode 1 sql show anodes From 7c395a4fc361aa3e45f19e71e08bfe7664067d29 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 26 Dec 2024 18:17:02 +0800 Subject: [PATCH 77/84] test: add test case for anamaly detection in tdanalytics. --- .../libs/executor/src/anomalywindowoperator.c | 44 ++++++++++--------- tests/script/tsim/analytics/basic0.sim | 44 ++++++++++++++++--- 2 files changed, 63 insertions(+), 25 deletions(-) diff --git a/source/libs/executor/src/anomalywindowoperator.c b/source/libs/executor/src/anomalywindowoperator.c index 3bc9c806b0..275416a2cc 100644 --- a/source/libs/executor/src/anomalywindowoperator.c +++ b/source/libs/executor/src/anomalywindowoperator.c @@ -61,9 +61,13 @@ static int32_t anomalyCacheBlock(SAnomalyWindowOperatorInfo* pInfo, SSDataBlock* int32_t createAnomalywindowOperatorInfo(SOperatorInfo* downstream, SPhysiNode* physiNode, SExecTaskInfo* pTaskInfo, SOperatorInfo** pOptrInfo) { QRY_PARAM_CHECK(pOptrInfo); + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; + size_t keyBufSize = 0; + int32_t num = 0; + SExprInfo* pExprInfo = NULL; + const char* id = GET_TASKID(pTaskInfo); - int32_t code = TSDB_CODE_SUCCESS; - int32_t lino = 0; SAnomalyWindowOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SAnomalyWindowOperatorInfo)); SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo)); SAnomalyWindowPhysiNode* pAnomalyNode = (SAnomalyWindowPhysiNode*)physiNode; @@ -74,13 +78,13 @@ int32_t createAnomalywindowOperatorInfo(SOperatorInfo* downstream, SPhysiNode* p } if (!taosAnalGetOptStr(pAnomalyNode->anomalyOpt, "algo", pInfo->algoName, sizeof(pInfo->algoName))) { - qError("failed to get anomaly_window algorithm name from %s", pAnomalyNode->anomalyOpt); + qError("%s failed to get anomaly_window algorithm name from %s", id, pAnomalyNode->anomalyOpt); code = TSDB_CODE_ANA_ALGO_NOT_FOUND; goto _error; } if (taosAnalGetAlgoUrl(pInfo->algoName, ANAL_ALGO_TYPE_ANOMALY_DETECT, pInfo->algoUrl, sizeof(pInfo->algoUrl)) != 0) { - qError("failed to get anomaly_window algorithm url from %s", pInfo->algoName); + qError("%s failed to get anomaly_window algorithm url from %s", id, pInfo->algoName); code = TSDB_CODE_ANA_ALGO_NOT_LOAD; goto _error; } @@ -94,20 +98,18 @@ int32_t createAnomalywindowOperatorInfo(SOperatorInfo* downstream, SPhysiNode* p SExprInfo* pScalarExprInfo = NULL; code = createExprInfo(pAnomalyNode->window.pExprs, NULL, &pScalarExprInfo, &numOfScalarExpr); QUERY_CHECK_CODE(code, lino, _error); + code = initExprSupp(&pInfo->scalarSup, pScalarExprInfo, numOfScalarExpr, &pTaskInfo->storageAPI.functionStore); QUERY_CHECK_CODE(code, lino, _error); } - size_t keyBufSize = 0; - int32_t num = 0; - SExprInfo* pExprInfo = NULL; code = createExprInfo(pAnomalyNode->window.pFuncs, NULL, &pExprInfo, &num); QUERY_CHECK_CODE(code, lino, _error); initResultSizeInfo(&pOperator->resultInfo, 4096); - code = initAggSup(&pOperator->exprSupp, &pInfo->aggSup, pExprInfo, num, keyBufSize, pTaskInfo->id.str, - pTaskInfo->streamInfo.pState, &pTaskInfo->storageAPI.functionStore); + code = initAggSup(&pOperator->exprSupp, &pInfo->aggSup, pExprInfo, num, keyBufSize, id, pTaskInfo->streamInfo.pState, + &pTaskInfo->storageAPI.functionStore); QUERY_CHECK_CODE(code, lino, _error); SSDataBlock* pResBlock = createDataBlockFromDescNode(pAnomalyNode->window.node.pOutputDataBlockDesc); @@ -124,20 +126,19 @@ int32_t createAnomalywindowOperatorInfo(SOperatorInfo* downstream, SPhysiNode* p pInfo->anomalyCol = extractColumnFromColumnNode(pColNode); pInfo->anomalyKey.type = pInfo->anomalyCol.type; pInfo->anomalyKey.bytes = pInfo->anomalyCol.bytes; + pInfo->anomalyKey.pData = taosMemoryCalloc(1, pInfo->anomalyCol.bytes); - if (pInfo->anomalyKey.pData == NULL) { - goto _error; - } + QUERY_CHECK_NULL(pInfo->anomalyKey.pData, code, lino, _error, terrno) int32_t itemSize = sizeof(int32_t) + pInfo->aggSup.resultRowSize + pInfo->anomalyKey.bytes; pInfo->anomalySup.pResultRow = taosMemoryCalloc(1, itemSize); - pInfo->anomalySup.blocks = taosArrayInit(16, sizeof(SSDataBlock*)); - pInfo->anomalySup.windows = taosArrayInit(16, sizeof(STimeWindow)); + QUERY_CHECK_NULL(pInfo->anomalySup.pResultRow, code, lino, _error, terrno) - if (pInfo->anomalySup.windows == NULL || pInfo->anomalySup.blocks == NULL || pInfo->anomalySup.pResultRow == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _error; - } + pInfo->anomalySup.blocks = taosArrayInit(16, sizeof(SSDataBlock*)); + QUERY_CHECK_NULL(pInfo->anomalySup.blocks, code, lino, _error, terrno) + + pInfo->anomalySup.windows = taosArrayInit(16, sizeof(STimeWindow)); + QUERY_CHECK_NULL(pInfo->anomalySup.windows, code, lino, _error, terrno) code = filterInitFromNode((SNode*)pAnomalyNode->window.node.pConditions, &pOperator->exprSupp.pFilterInfo, 0); QUERY_CHECK_CODE(code, lino, _error); @@ -155,18 +156,21 @@ int32_t createAnomalywindowOperatorInfo(SOperatorInfo* downstream, SPhysiNode* p *pOptrInfo = pOperator; - qDebug("anomaly_window operator is created, algo:%s url:%s opt:%s", pInfo->algoName, pInfo->algoUrl, + qDebug("%s anomaly_window operator is created, algo:%s url:%s opt:%s", id, pInfo->algoName, pInfo->algoUrl, pInfo->anomalyOpt); return TSDB_CODE_SUCCESS; _error: + qError("%s failed to create anomaly_window operator, line:%d algo:%s code:%s", id, lino, pAnomalyNode->anomalyOpt, + tstrerror(code)); + if (pInfo != NULL) { anomalyDestroyOperatorInfo(pInfo); } destroyOperatorAndDownstreams(pOperator, &downstream, 1); pTaskInfo->code = code; - qError("failed to create anomaly_window operator, algo:%s code:0x%x", pInfo->algoName, code); + return code; } diff --git a/tests/script/tsim/analytics/basic0.sim b/tests/script/tsim/analytics/basic0.sim index 35774e7682..3ac49b1fc3 100644 --- a/tests/script/tsim/analytics/basic0.sim +++ b/tests/script/tsim/analytics/basic0.sim @@ -40,7 +40,7 @@ print $data00 $data01 $data02 sql use d0 print =============== create super table, include column type for count/sum/min/max/first -sql create table if not exists stb (ts timestamp, c1 int, c2 float, c3 double) tags (t1 int unsigned) +sql create table if not exists stb (ts timestamp, c1 int, c2 float, c3 double, c4 tinyint, c5 bigint, c6 varchar(12)) tags (t1 int unsigned) sql show stables if $rows != 1 then @@ -52,10 +52,11 @@ sql create table ct1 using stb tags(1000) print ==================== insert data # input_list = [5, 14, 15, 15, 14, 19, 17, 16, 20, 22, 8, 21, 28, 11, 9, 29, 40] -sql insert into ct1(ts, c1) values(now-1a, 5)(now+1a, 14)(now+2a, 15)(now+3a, 15)(now+4a, 14) -sql insert into ct1(ts, c1) values(now+5a, 19)(now+6a, 17)(now+7a, 16)(now+8a, 20)(now+9a, 22) -sql insert into ct1(ts, c1) values(now+10a, 8)(now+11a, 21)(now+12a, 28)(now+13a, 11)(now+14a, 9) -sql insert into ct1(ts, c1) values(now+15a, 29)(now+16a, 40) +sql insert into ct1(ts, c1, c2, c3, c4, c5, c6) values(now-1a, 5, 5, 5, 5, 5, 'a')(now+1a, 14, 14, 14, 14, 14, 'a')(now+2a, 15, 15, 15, 15, 15, 'a') +sql insert into ct1 values(now+3a, 15, 15, 15, 15, 15, 'a')(now+4a, 14, 14, 14, 14, 14, 'a')(now+5a, 19, 19, 19, 19, 19, 'a')(now+6a, 17, 17, 17, 17, 17, 'a') +sql insert into ct1 values(now+7a, 16, 16, 16, 16, 16, 'a')(now+8a, 20, 20, 20, 20, 20, 'a')(now+9a, 22, 22, 22, 22, 22, 'a') +sql insert into ct1 values(now+10a, 8, 8, 8, 8, 8, 'a')(now+11a, 21, 21, 21, 21, 21, 'a')(now+12a, 28, 28, 28, 28, 28, 'a')(now+13a, 11, 11, 11, 11, 11, 'a')(now+14a, 9, 9, 9, 9, 9, 'a') +sql insert into ct1 values(now+15a, 29, 29, 29, 29, 29, 'a')(now+16a, 40, 40, 40, 40, 40, 'a') sql select count(*) from ct1 if $data00 != 17 then @@ -68,6 +69,25 @@ if $data00 != 1 then return -1 endi +print ================= try every loaded anomaly detection algorithm +sql select count(*) from ct1 anomaly_window(c1, 'algo=iqr'); +sql select count(*) from ct1 anomaly_window(c1, 'algo=ksigma'); +sql select count(*) from ct1 anomaly_window(c1, 'algo=lof'); +sql select count(*) from ct1 anomaly_window(c1, 'algo=shesd'); +sql select count(*) from ct1 anomaly_window(c1, 'algo=grubbs'); + +print ================= try every column type of column +sql select count(*) from ct1 anomaly_window(c1, 'algo=ksigma,k=2'); +sql select count(*) from ct1 anomaly_window(c2, 'algo=ksigma,k=2'); +sql select count(*) from ct1 anomaly_window(c3, 'algo=ksigma,k=2'); +sql select count(*) from ct1 anomaly_window(c4, 'algo=ksigma,k=2'); +sql select count(*) from ct1 anomaly_window(c5, 'algo=ksigma,k=2'); + +print =================== invalid column type +sql_error select count(*) from ct1 anomaly_window(c6, 'algo=ksigma,k=2'); +sql_error select forecast(c6, 'algo=holtwinters,conf=0.5,wncheck=1,period=0') from ct1 + + sql_error select _frowts, _flow, _fhigh, forecast(c1, 'algo=holtwinters,conf=0.5,wncheck=1,period=0') from ct1 sql_error select _frowts, _flow, _fhigh, forecast(c1, 'algo=holtwinters,conf=119,wncheck=1,period=0') from ct1 sql_error select _frowts, _flow, _fhigh, forecast(c1, 'algo=holtwinters1,conf=0.5,wncheck=1,period=0') from ct1 @@ -83,8 +103,15 @@ sql select _frowts, _flow, _fhigh, forecast(c1, 'conf=50 ,algo = holtwinters, ,' sql select _frowts, _flow, _fhigh, forecast(c1, 'conf=50 ,algo = holtwinters, , ,') from ct1 sql select _frowts, _flow, _fhigh, forecast(c1, 'conf=50 ,algo = holtwinters, a =') from ct1 sql select _frowts, _flow, _fhigh, forecast(c1, 'conf=50 ,algo = holtwinters, = a ,') from ct1 + +print =================== valid column type sql select forecast(c1, 'conf=50 ,algo = arima') from ct1 sql select forecast(c1, 'conf=50 ,algo = arima, rows=1') from ct1 +sql select forecast(c2, 'conf=50 ,algo = arima, rows=1') from ct1 +sql select forecast(c3, 'conf=50 ,algo = arima, rows=1') from ct1 +sql select forecast(c4, 'conf=50 ,algo = arima, rows=1') from ct1 +sql select forecast(c5, 'conf=50 ,algo = arima, rows=1') from ct1 +sql select forecast(c5, 'conf=50 ,algo = arima, rows=1') from ct1 sql select _frowts, _flow, _fhigh, forecast(c1, 'algo=holtwinters,conf=50,wncheck=1,period=0,start=1700000000000,every=2') from ct1 if $rows != 10 then @@ -131,6 +158,13 @@ if $rows != 0 then return -1 endi +sleep 1000 + +print ===================== query without anodes +sql_error select forecast(c5, 'conf=50 ,algo = arima, rows=1') from ct1 +sql_error select count(*) from ct1 anomaly_window(c1, 'algo=iqr'); + + _OVER: system sh/exec.sh -n dnode1 -s stop -x SIGINT print =============== check From 098ab9f4b443e5572cc7ce174c656b227982c7d6 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 26 Dec 2024 18:25:23 +0800 Subject: [PATCH 78/84] enh: change some documents --- .../en/14-reference/01-components/01-taosd.md | 3 +- .../zh/14-reference/01-components/01-taosd.md | 3 +- include/common/tglobal.h | 5 ++- source/common/src/tglobal.c | 34 ++++++++++++------- source/dnode/mgmt/mgmt_dnode/src/dmHandle.c | 25 -------------- source/libs/executor/src/sysscanoperator.c | 6 ++-- source/libs/parser/src/parTranslater.c | 23 ------------- 7 files changed, 30 insertions(+), 69 deletions(-) diff --git a/docs/en/14-reference/01-components/01-taosd.md b/docs/en/14-reference/01-components/01-taosd.md index 1b7f63510b..c86b631df4 100644 --- a/docs/en/14-reference/01-components/01-taosd.md +++ b/docs/en/14-reference/01-components/01-taosd.md @@ -190,7 +190,8 @@ The effective value of charset is UTF-8. |Parameter Name |Supported Version |Dynamic Modification|Description| |-----------------------|-------------------------|--------------------|------------| |supportVnodes | |Supported, effective immediately |Maximum number of vnodes supported by a dnode, range 0-4096, default value is twice the number of CPU cores + 5| -|numOfCommitThreads | |Supported, effective after restart|Maximum number of commit threads, range 0-1024, default value 4| +|numOfCommitThreads | |Supported, effective after restart|Maximum number of commit threads, range 1-1024, default value 4| +|numOfCompactThreads | |Supported, effective after restart|Maximum number of commit threads, range 1-16, default value 2| |numOfMnodeReadThreads | |Supported, effective after restart|Number of Read threads for mnode, range 0-1024, default value is one quarter of the CPU cores (not exceeding 4)| |numOfVnodeQueryThreads | |Supported, effective after restart|Number of Query threads for vnode, range 0-1024, default value is twice the number of CPU cores (not exceeding 16)| |numOfVnodeFetchThreads | |Supported, effective after restart|Number of Fetch threads for vnode, range 0-1024, default value is one quarter of the CPU cores (not exceeding 4)| diff --git a/docs/zh/14-reference/01-components/01-taosd.md b/docs/zh/14-reference/01-components/01-taosd.md index 7a0a306a41..74e6f485ff 100644 --- a/docs/zh/14-reference/01-components/01-taosd.md +++ b/docs/zh/14-reference/01-components/01-taosd.md @@ -185,7 +185,8 @@ charset 的有效值是 UTF-8。 |参数名称|支持版本|动态修改|参数含义| |--------------------------|----------|-------------------------|-| |supportVnodes | |支持动态修改 立即生效 |dnode 支持的最大 vnode 数目,取值范围 0-4096,默认值 CPU 核数的 2 倍 + 5| -|numOfCommitThreads | |支持动态修改 重启生效 |落盘线程的最大数量,取值范围 0-1024,默认值为 4| +|numOfCommitThreads | |支持动态修改 重启生效 |落盘线程的最大数量,取值范围 1-1024,默认值为 4| +|numOfCompactThreads | |支持动态修改 重启生效 |落盘线程的最大数量,取值范围 1-16,默认值为 2| |numOfMnodeReadThreads | |支持动态修改 重启生效 |mnode 的 Read 线程数目,取值范围 0-1024,默认值为 CPU 核数的四分之一(不超过 4)| |numOfVnodeQueryThreads | |支持动态修改 重启生效 |vnode 的 Query 线程数目,取值范围 0-1024,默认值为 CPU 核数的两倍(不超过 16)| |numOfVnodeFetchThreads | |支持动态修改 重启生效 |vnode 的 Fetch 线程数目,取值范围 0-1024,默认值为 CPU 核数的四分之一(不超过 4)| diff --git a/include/common/tglobal.h b/include/common/tglobal.h index 501f1cabc1..ec130ad6b5 100644 --- a/include/common/tglobal.h +++ b/include/common/tglobal.h @@ -112,9 +112,8 @@ extern int32_t tsNumOfSnodeWriteThreads; extern int64_t tsQueueMemoryAllowed; extern int32_t tsRetentionSpeedLimitMB; -extern const char *tsAlterCompactTaskKeywords; -extern int32_t tsNumOfCompactThreads; -extern int32_t tsNumOfRetentionThreads; +extern int32_t tsNumOfCompactThreads; +extern int32_t tsNumOfRetentionThreads; // sync raft extern int32_t tsElectInterval; diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index c58ad32a18..b298cac725 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -102,9 +102,8 @@ int32_t tsMaxStreamBackendCache = 128; // M int32_t tsPQSortMemThreshold = 16; // M int32_t tsRetentionSpeedLimitMB = 0; // unlimited -const char *tsAlterCompactTaskKeywords = "max_compact_tasks"; -int32_t tsNumOfCompactThreads = 2; -int32_t tsNumOfRetentionThreads = 1; +int32_t tsNumOfCompactThreads = 2; +int32_t tsNumOfRetentionThreads = 1; // sync raft int32_t tsElectInterval = 25 * 1000; @@ -745,8 +744,9 @@ static int32_t taosAddClientCfg(SConfig *pCfg) { CFG_DYN_CLIENT, CFG_CATEGORY_LOCAL)); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "tsmaDataDeleteMark", tsmaDataDeleteMark, 60 * 60 * 1000, INT64_MAX, CFG_SCOPE_CLIENT, CFG_DYN_CLIENT, CFG_CATEGORY_LOCAL)); - - TAOS_CHECK_RETURN(cfgAddBool(pCfg, "streamCoverage", tsStreamCoverage, CFG_DYN_CLIENT, CFG_DYN_CLIENT, CFG_CATEGORY_LOCAL)); + + TAOS_CHECK_RETURN( + cfgAddBool(pCfg, "streamCoverage", tsStreamCoverage, CFG_DYN_CLIENT, CFG_DYN_CLIENT, CFG_CATEGORY_LOCAL)); TAOS_RETURN(TSDB_CODE_SUCCESS); } @@ -795,9 +795,6 @@ static int32_t taosAddServerCfg(SConfig *pCfg) { tsNumOfCommitThreads = tsNumOfCores / 2; tsNumOfCommitThreads = TRANGE(tsNumOfCommitThreads, 2, 4); - tsNumOfCompactThreads = tsNumOfCommitThreads; - tsNumOfCompactThreads = TRANGE(tsNumOfCompactThreads, 2, 4); - tsNumOfSupportVnodes = tsNumOfCores * 2 + 5; tsNumOfSupportVnodes = TMAX(tsNumOfSupportVnodes, 2); @@ -842,7 +839,7 @@ static int32_t taosAddServerCfg(SConfig *pCfg) { TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "queryBufferSize", tsQueryBufferSize, -1, 500000000000, CFG_SCOPE_SERVER, CFG_DYN_SERVER_LAZY, CFG_CATEGORY_LOCAL)); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "queryRspPolicy", tsQueryRspPolicy, 0, 1, CFG_SCOPE_SERVER, CFG_DYN_SERVER,CFG_CATEGORY_GLOBAL)); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "numOfCommitThreads", tsNumOfCommitThreads, 1, 1024, CFG_SCOPE_SERVER, CFG_DYN_SERVER_LAZY,CFG_CATEGORY_LOCAL)); - TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "maxCompactConcurrency", tsNumOfCompactThreads, 1, 1024, CFG_SCOPE_SERVER, CFG_DYN_SERVER_LAZY,CFG_CATEGORY_LOCAL)); + TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "numOfCompactThreads", tsNumOfCompactThreads, 1, 16, CFG_SCOPE_SERVER, CFG_DYN_SERVER,CFG_CATEGORY_LOCAL)); TAOS_CHECK_RETURN(cfgAddInt32(pCfg, "retentionSpeedLimitMB", tsRetentionSpeedLimitMB, 0, 1024, CFG_SCOPE_SERVER, CFG_DYN_SERVER,CFG_CATEGORY_GLOBAL)); TAOS_CHECK_RETURN(cfgAddBool(pCfg, "queryUseMemoryPool", tsQueryUseMemoryPool, CFG_SCOPE_SERVER, CFG_DYN_NONE,CFG_CATEGORY_LOCAL) != 0); TAOS_CHECK_RETURN(cfgAddBool(pCfg, "memPoolFullFunc", tsMemPoolFullFunc, CFG_SCOPE_SERVER, CFG_DYN_NONE,CFG_CATEGORY_LOCAL) != 0); @@ -1040,10 +1037,8 @@ static int32_t taosUpdateServerCfg(SConfig *pCfg) { pItem->stype = stype; } - pItem = cfgGetItem(pCfg, "maxCompactConcurrency"); + pItem = cfgGetItem(pCfg, "numOfCompactThreads"); if (pItem != NULL && pItem->stype == CFG_STYPE_DEFAULT) { - tsNumOfCompactThreads = numOfCores / 2; - tsNumOfCompactThreads = TRANGE(tsNumOfCompactThreads, 2, 4); pItem->i32 = tsNumOfCompactThreads; pItem->stype = stype; } @@ -1548,7 +1543,7 @@ static int32_t taosSetServerCfg(SConfig *pCfg) { TAOS_CHECK_GET_CFG_ITEM(pCfg, pItem, "numOfCommitThreads"); tsNumOfCommitThreads = pItem->i32; - TAOS_CHECK_GET_CFG_ITEM(pCfg, pItem, "maxCompactConcurrency"); + TAOS_CHECK_GET_CFG_ITEM(pCfg, pItem, "numOfCompactThreads"); tsNumOfCompactThreads = pItem->i32; TAOS_CHECK_GET_CFG_ITEM(pCfg, pItem, "retentionSpeedLimitMB"); @@ -2354,6 +2349,8 @@ static int32_t taosCfgSetOption(OptionNameAndVar *pOptions, int32_t optionSize, TAOS_RETURN(code); } +extern void tsdbAlterNumCompactThreads(); + static int32_t taosCfgDynamicOptionsForServer(SConfig *pCfg, const char *name) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = -1; @@ -2404,6 +2401,17 @@ static int32_t taosCfgDynamicOptionsForServer(SConfig *pCfg, const char *name) { goto _exit; } + if (strcasecmp(name, "numOfCompactThreads") == 0) { +#ifdef TD_ENTERPRISE + tsNumOfCompactThreads = pItem->i32; + code = TSDB_CODE_SUCCESS; + // tsdbAlterNumCompactThreads(); +#else + code = TSDB_CODE_INVALID_CFG; +#endif + goto _exit; + } + { // 'bool/int32_t/int64_t/float/double' variables with general modification function static OptionNameAndVar debugOptions[] = { {"dDebugFlag", &dDebugFlag}, {"vDebugFlag", &vDebugFlag}, diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c index 8139e4aa98..9ed4ee83c4 100644 --- a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c +++ b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c @@ -475,27 +475,6 @@ int32_t dmProcessGrantRsp(SDnodeMgmt *pMgmt, SRpcMsg *pMsg) { return 0; } -extern void tsdbAlterNumCompactThreads(); -static int32_t dmAlterMaxCompactTask(const char *value) { - int32_t max_compact_tasks; - char *endptr = NULL; - - max_compact_tasks = taosStr2Int32(value, &endptr, 10); - if (endptr == value || endptr[0] != '\0') { - return TSDB_CODE_INVALID_MSG; - } - - if (max_compact_tasks != tsNumOfCompactThreads) { - dInfo("alter max compact tasks from %d to %d", tsNumOfCompactThreads, max_compact_tasks); - tsNumOfCompactThreads = max_compact_tasks; -#ifdef TD_ENTERPRISE - (void)tsdbAlterNumCompactThreads(); -#endif - } - - return TSDB_CODE_SUCCESS; -} - int32_t dmProcessConfigReq(SDnodeMgmt *pMgmt, SRpcMsg *pMsg) { int32_t code = 0; SDCfgDnodeReq cfgReq = {0}; @@ -509,10 +488,6 @@ int32_t dmProcessConfigReq(SDnodeMgmt *pMgmt, SRpcMsg *pMsg) { return taosUpdateTfsItemDisable(pCfg, cfgReq.value, pMgmt->pTfs); } - if (strncmp(cfgReq.config, tsAlterCompactTaskKeywords, strlen(tsAlterCompactTaskKeywords) + 1) == 0) { - return dmAlterMaxCompactTask(cfgReq.value); - } - dInfo("start to config, option:%s, value:%s", cfgReq.config, cfgReq.value); code = cfgGetAndSetItem(pCfg, &pItem, cfgReq.config, cfgReq.value, CFG_STYPE_ALTER_SERVER_CMD, true); diff --git a/source/libs/executor/src/sysscanoperator.c b/source/libs/executor/src/sysscanoperator.c index 13ae220116..3f08db0e98 100644 --- a/source/libs/executor/src/sysscanoperator.c +++ b/source/libs/executor/src/sysscanoperator.c @@ -1441,7 +1441,7 @@ static int32_t doSetUserTableMetaInfo(SStoreMetaReader* pMetaReaderFn, SStoreMet SMetaReader mr1 = {0}; pMetaReaderFn->initReader(&mr1, pVnode, META_READER_NOLOCK, pMetaFn); - + int64_t suid = pMReader->me.ctbEntry.suid; code = pMetaReaderFn->getTableEntryByUid(&mr1, suid); if (code != TSDB_CODE_SUCCESS) { @@ -1752,7 +1752,7 @@ static SSDataBlock* sysTableBuildUserTables(SOperatorInfo* pOperator) { SMetaReader mr = {0}; pAPI->metaReaderFn.initReader(&mr, pInfo->readHandle.vnode, META_READER_NOLOCK, &pAPI->metaFn); - + uint64_t suid = pInfo->pCur->mr.me.ctbEntry.suid; code = pAPI->metaReaderFn.getTableEntryByUid(&mr, suid); if (code != TSDB_CODE_SUCCESS) { @@ -2284,7 +2284,7 @@ static SSDataBlock* sysTableBuildUserFileSets(SOperatorInfo* pOperator) { // db_name pColInfoData = taosArrayGet(p->pDataBlock, index++); QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno); - code = colDataSetVal(pColInfoData, numOfRows, db, false); + code = colDataSetVal(pColInfoData, numOfRows, dbname, false); QUERY_CHECK_CODE(code, lino, _end); // vgroup_id diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 342bd6d66e..9f411c4296 100755 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -10086,7 +10086,6 @@ static int32_t translateAlterDnode(STranslateContext* pCxt, SAlterDnodeStmt* pSt const char* validConfigs[] = { "encrypt_key", - tsAlterCompactTaskKeywords, }; if (0 == strncasecmp(cfgReq.config, validConfigs[0], strlen(validConfigs[0]) + 1)) { int32_t klen = strlen(cfgReq.value); @@ -10097,28 +10096,6 @@ static int32_t translateAlterDnode(STranslateContext* pCxt, SAlterDnodeStmt* pSt ENCRYPT_KEY_LEN_MIN, ENCRYPT_KEY_LEN); } code = buildCmdMsg(pCxt, TDMT_MND_CREATE_ENCRYPT_KEY, (FSerializeFunc)tSerializeSMCfgDnodeReq, &cfgReq); - } else if (0 == strncasecmp(cfgReq.config, validConfigs[1], strlen(validConfigs[1]) + 1)) { - char* endptr = NULL; - int32_t maxCompactTasks = taosStr2Int32(cfgReq.value, &endptr, 10); - int32_t minMaxCompactTasks = MIN_MAX_COMPACT_TASKS; - int32_t maxMaxCompactTasks = MAX_MAX_COMPACT_TASKS; - - // check format - if (endptr == cfgReq.value || endptr[0] != '\0') { - tFreeSMCfgDnodeReq(&cfgReq); - return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_DNODE_INVALID_COMPACT_TASKS, - "Invalid max compact tasks: %s", cfgReq.value); - } - - // check range - if (maxCompactTasks < minMaxCompactTasks || maxCompactTasks > maxMaxCompactTasks) { - tFreeSMCfgDnodeReq(&cfgReq); - return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_DNODE_INVALID_COMPACT_TASKS, - "Invalid max compact tasks: %d, valid range [%d,%d]", maxCompactTasks, - minMaxCompactTasks, maxMaxCompactTasks); - } - - code = buildCmdMsg(pCxt, TDMT_MND_CONFIG_DNODE, (FSerializeFunc)tSerializeSMCfgDnodeReq, &cfgReq); } else { code = buildCmdMsg(pCxt, TDMT_MND_CONFIG_DNODE, (FSerializeFunc)tSerializeSMCfgDnodeReq, &cfgReq); } From d5f1aab4fec0ee28ac1fabc58c1571f1d340f5b1 Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Thu, 26 Dec 2024 18:27:43 +0800 Subject: [PATCH 79/84] fix(tdb/cd): free cell decoder's mem w.r.t. btree prev --- source/libs/tdb/src/db/tdbBtree.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/source/libs/tdb/src/db/tdbBtree.c b/source/libs/tdb/src/db/tdbBtree.c index 19a3f211b1..c806bdfbd8 100644 --- a/source/libs/tdb/src/db/tdbBtree.c +++ b/source/libs/tdb/src/db/tdbBtree.c @@ -2023,16 +2023,29 @@ int tdbBtreePrev(SBTC *pBtc, void **ppKey, int *kLen, void **ppVal, int *vLen) { memcpy(pKey, cd.pKey, (size_t)cd.kLen); if (ppVal) { - // TODO: vLen may be zero - pVal = tdbRealloc(*ppVal, cd.vLen); - if (pVal == NULL) { - tdbFree(pKey); - return terrno; + if (cd.vLen > 0) { + pVal = tdbRealloc(*ppVal, cd.vLen); + if (pVal == NULL) { + tdbFree(pKey); + return terrno; + } + + memcpy(pVal, cd.pVal, (size_t)cd.vLen); + if (TDB_CELLDECODER_FREE_VAL(&cd)) { + tdbTrace("tdb/btree-next decoder: %p pVal free: %p", &cd, cd.pVal); + tdbFree(cd.pVal); + } + } else { + pVal = NULL; } *ppVal = pVal; *vLen = cd.vLen; - memcpy(pVal, cd.pVal, (size_t)cd.vLen); + } else { + if (TDB_CELLDECODER_FREE_VAL(&cd)) { + tdbTrace("tdb/btree-next2 decoder: %p pVal free: %p", &cd, cd.pVal); + tdbFree(cd.pVal); + } } ret = tdbBtcMoveToPrev(pBtc); From 9443a36d379720771cc284a65efd7292c49b3b74 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 26 Dec 2024 22:52:12 +0800 Subject: [PATCH 80/84] git: set tags --- cmake/taosadapter_CMakeLists.txt.in | 2 +- cmake/taostools_CMakeLists.txt.in | 2 +- cmake/taosws_CMakeLists.txt.in | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/taosadapter_CMakeLists.txt.in b/cmake/taosadapter_CMakeLists.txt.in index 13826a1a74..ef6ed4af1d 100644 --- a/cmake/taosadapter_CMakeLists.txt.in +++ b/cmake/taosadapter_CMakeLists.txt.in @@ -2,7 +2,7 @@ # taosadapter ExternalProject_Add(taosadapter GIT_REPOSITORY https://github.com/taosdata/taosadapter.git - GIT_TAG main + GIT_TAG 3.0 SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosadapter" BINARY_DIR "" #BUILD_IN_SOURCE TRUE diff --git a/cmake/taostools_CMakeLists.txt.in b/cmake/taostools_CMakeLists.txt.in index 9bbda8309f..9a6a5329ae 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 main + GIT_TAG 3.0 SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools" BINARY_DIR "" #BUILD_IN_SOURCE TRUE diff --git a/cmake/taosws_CMakeLists.txt.in b/cmake/taosws_CMakeLists.txt.in index b013d45911..17446d184d 100644 --- a/cmake/taosws_CMakeLists.txt.in +++ b/cmake/taosws_CMakeLists.txt.in @@ -2,7 +2,7 @@ # taosws-rs ExternalProject_Add(taosws-rs GIT_REPOSITORY https://github.com/taosdata/taos-connector-rust.git - GIT_TAG main + GIT_TAG 3.0 SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosws-rs" BINARY_DIR "" #BUILD_IN_SOURCE TRUE From 001a2b653b6e1bb61c0605e04f324434f39c3a61 Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Thu, 26 Dec 2024 18:27:43 +0800 Subject: [PATCH 81/84] fix(tdb/cd): free cell decoder's mem w.r.t. btree prev --- source/libs/tdb/src/db/tdbBtree.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/source/libs/tdb/src/db/tdbBtree.c b/source/libs/tdb/src/db/tdbBtree.c index 19a3f211b1..c806bdfbd8 100644 --- a/source/libs/tdb/src/db/tdbBtree.c +++ b/source/libs/tdb/src/db/tdbBtree.c @@ -2023,16 +2023,29 @@ int tdbBtreePrev(SBTC *pBtc, void **ppKey, int *kLen, void **ppVal, int *vLen) { memcpy(pKey, cd.pKey, (size_t)cd.kLen); if (ppVal) { - // TODO: vLen may be zero - pVal = tdbRealloc(*ppVal, cd.vLen); - if (pVal == NULL) { - tdbFree(pKey); - return terrno; + if (cd.vLen > 0) { + pVal = tdbRealloc(*ppVal, cd.vLen); + if (pVal == NULL) { + tdbFree(pKey); + return terrno; + } + + memcpy(pVal, cd.pVal, (size_t)cd.vLen); + if (TDB_CELLDECODER_FREE_VAL(&cd)) { + tdbTrace("tdb/btree-next decoder: %p pVal free: %p", &cd, cd.pVal); + tdbFree(cd.pVal); + } + } else { + pVal = NULL; } *ppVal = pVal; *vLen = cd.vLen; - memcpy(pVal, cd.pVal, (size_t)cd.vLen); + } else { + if (TDB_CELLDECODER_FREE_VAL(&cd)) { + tdbTrace("tdb/btree-next2 decoder: %p pVal free: %p", &cd, cd.pVal); + tdbFree(cd.pVal); + } } ret = tdbBtcMoveToPrev(pBtc); From 3f642fd0135801ea1e9c8dc344836d8e831e5563 Mon Sep 17 00:00:00 2001 From: kailixu Date: Fri, 27 Dec 2024 12:01:07 +0800 Subject: [PATCH 82/84] fix: unlock and error code of tlog --- source/util/src/tlog.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/util/src/tlog.c b/source/util/src/tlog.c index 88eccfaffd..4df5b322a2 100644 --- a/source/util/src/tlog.c +++ b/source/util/src/tlog.c @@ -673,11 +673,11 @@ static int32_t taosInitNormalLog(const char *logName, int32_t maxFileNum) { } _exit: - taosUnLockLogFile(tsLogObj.logHandle->pFile); if (code != 0) { + taosUnLockLogFile(tsLogObj.logHandle->pFile); TAOS_UNUSED(printf("failed to init normal log file:%s at line %d, reason:%s\n", name, lino, tstrerror(code))); } - return 0; + return code; } static void taosUpdateLogNums(ELogLevel level) { From ec2c8c435edc5793db61bcc3b69f4c500f5af1e2 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Fri, 27 Dec 2024 22:26:43 +0800 Subject: [PATCH 83/84] Revert "Enh:[td 29974]improve trans" --- docs/en/08-operation/04-maintenance.md | 2 +- docs/en/14-reference/03-taos-sql/24-show.md | 3 +- docs/zh/08-operation/04-maintenance.md | 2 +- docs/zh/14-reference/03-taos-sql/24-show.md | 3 +- include/common/systable.h | 1 - include/common/tmsg.h | 2 - include/libs/nodes/cmdnodes.h | 5 - include/util/taoserror.h | 1 - include/util/tdef.h | 6 +- source/common/src/systable.c | 12 - source/dnode/mgmt/mgmt_dnode/src/dmHandle.c | 1 - source/dnode/mnode/impl/inc/mndDef.h | 8 - source/dnode/mnode/impl/inc/mndTrans.h | 4 - .../dnode/mnode/impl/src/mndCompactDetail.c | 2 - source/dnode/mnode/impl/src/mndDb.c | 3 - source/dnode/mnode/impl/src/mndShow.c | 5 +- source/dnode/mnode/impl/src/mndTrans.c | 484 +----------------- source/dnode/mnode/impl/src/mndVgroup.c | 16 +- source/libs/executor/src/sysscanoperator.c | 3 +- source/libs/nodes/src/nodesCodeFuncs.c | 2 - source/libs/nodes/src/nodesUtilFuncs.c | 8 - source/libs/parser/inc/parAst.h | 1 - source/libs/parser/inc/sql.y | 1 - source/libs/parser/src/parAstCreater.c | 12 - source/libs/parser/src/parAstParser.c | 8 - source/libs/parser/src/parTranslater.c | 51 +- source/util/src/terror.c | 1 - .../develop-test/2-query/table_count_scan.py | 16 +- tests/parallel_test/cases.task | 3 - tests/script/tsim/query/sys_tbname.sim | 2 +- tests/script/tsim/query/tableCount.sim | 6 +- .../0-others/information_schema.py | 6 +- .../0-others/kill_balance_leader.py | 64 --- .../0-others/show_transaction_detail.py | 115 ----- tests/system-test/2-query/union.py | 2 +- .../restore/kill_restore_dnode.py | 90 ---- .../3-enterprise/restore/restoreBasic.py | 28 - 37 files changed, 50 insertions(+), 929 deletions(-) delete mode 100644 tests/system-test/0-others/kill_balance_leader.py delete mode 100644 tests/system-test/0-others/show_transaction_detail.py delete mode 100644 tests/system-test/3-enterprise/restore/kill_restore_dnode.py diff --git a/docs/en/08-operation/04-maintenance.md b/docs/en/08-operation/04-maintenance.md index 2f6afbf9df..970ee40d18 100644 --- a/docs/en/08-operation/04-maintenance.md +++ b/docs/en/08-operation/04-maintenance.md @@ -17,7 +17,7 @@ TDengine is designed for various writing scenarios, and many of these scenarios ```sql COMPACT DATABASE db_name [start with 'XXXX'] [end with 'YYYY']; -SHOW COMPACT [compact_id]; +SHOW COMPACTS [compact_id]; KILL COMPACT compact_id; ``` diff --git a/docs/en/14-reference/03-taos-sql/24-show.md b/docs/en/14-reference/03-taos-sql/24-show.md index b46fb41fa0..36c20df0b4 100644 --- a/docs/en/14-reference/03-taos-sql/24-show.md +++ b/docs/en/14-reference/03-taos-sql/24-show.md @@ -304,10 +304,9 @@ Displays information about all topics in the current database. ```sql SHOW TRANSACTIONS; -SHOW TRANSACTION [tranaction_id]; ``` -Displays information about one of or all transaction(s) currently being executed in the system (these transactions are only for metadata level, not for regular tables). +Displays information about transactions currently being executed in the system (these transactions are only for metadata level, not for regular tables). ## SHOW USERS diff --git a/docs/zh/08-operation/04-maintenance.md b/docs/zh/08-operation/04-maintenance.md index 429542485d..9ef165179d 100644 --- a/docs/zh/08-operation/04-maintenance.md +++ b/docs/zh/08-operation/04-maintenance.md @@ -19,7 +19,7 @@ TDengine 面向多种写入场景,而很多写入场景下,TDengine 的存 ```SQL COMPACT DATABASE db_name [start with 'XXXX'] [end with 'YYYY']; COMPACT [db_name.]VGROUPS IN (vgroup_id1, vgroup_id2, ...) [start with 'XXXX'] [end with 'YYYY']; -SHOW COMPACT [compact_id]; +SHOW COMPACTS [compact_id]; KILL COMPACT compact_id; ``` diff --git a/docs/zh/14-reference/03-taos-sql/24-show.md b/docs/zh/14-reference/03-taos-sql/24-show.md index 3898920e65..4596a03281 100644 --- a/docs/zh/14-reference/03-taos-sql/24-show.md +++ b/docs/zh/14-reference/03-taos-sql/24-show.md @@ -306,10 +306,9 @@ SHOW TOPICS; ```sql SHOW TRANSACTIONS; -SHOW TRANSACTION [tranaction_id]; ``` -显示当前系统中正在执行的所有或者某一个事务的信息(该事务仅针对除普通表以外的元数据级别) +显示当前系统中正在执行的事务的信息(该事务仅针对除普通表以外的元数据级别) ## SHOW USERS diff --git a/include/common/systable.h b/include/common/systable.h index fe867c9ad0..bd8ba76f4f 100644 --- a/include/common/systable.h +++ b/include/common/systable.h @@ -63,7 +63,6 @@ extern "C" { #define TSDB_INS_TABLE_TSMAS "ins_tsmas" #define TSDB_INS_DISK_USAGE "ins_disk_usage" #define TSDB_INS_TABLE_FILESETS "ins_filesets" -#define TSDB_INS_TABLE_TRANSACTION_DETAILS "ins_transaction_details" #define TSDB_PERFORMANCE_SCHEMA_DB "performance_schema" #define TSDB_PERFS_TABLE_SMAS "perf_smas" diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 9488e54615..0b6a8b3f1b 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -163,7 +163,6 @@ typedef enum _mgmt_table { TSDB_MGMT_TABLE_ANODE_FULL, TSDB_MGMT_TABLE_USAGE, TSDB_MGMT_TABLE_FILESETS, - TSDB_MGMT_TABLE_TRANSACTION_DETAIL, TSDB_MGMT_TABLE_MAX, } EShowType; @@ -406,7 +405,6 @@ typedef enum ENodeType { QUERY_NODE_SHOW_CREATE_TSMA_STMT, QUERY_NODE_DROP_TSMA_STMT, QUERY_NODE_SHOW_FILESETS_STMT, - QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT, // logic plan node QUERY_NODE_LOGIC_PLAN_SCAN = 1000, diff --git a/include/libs/nodes/cmdnodes.h b/include/libs/nodes/cmdnodes.h index 0f736e7068..8eb30b8184 100644 --- a/include/libs/nodes/cmdnodes.h +++ b/include/libs/nodes/cmdnodes.h @@ -439,11 +439,6 @@ typedef struct SShowCompactDetailsStmt { SNode* pCompactId; } SShowCompactDetailsStmt; -typedef struct SShowTransactionDetailsStmt { - ENodeType type; - SNode* pTransactionId; -} SShowTransactionDetailsStmt; - typedef enum EIndexType { INDEX_TYPE_SMA = 1, INDEX_TYPE_FULLTEXT, INDEX_TYPE_NORMAL } EIndexType; typedef struct SIndexOptions { diff --git a/include/util/taoserror.h b/include/util/taoserror.h index 890758762a..e317fdd65a 100644 --- a/include/util/taoserror.h +++ b/include/util/taoserror.h @@ -411,7 +411,6 @@ int32_t taosGetErrSize(); #define TSDB_CODE_MND_TRANS_CTX_SWITCH TAOS_DEF_ERROR_CODE(0, 0x03D8) #define TSDB_CODE_MND_TRANS_CONFLICT_COMPACT TAOS_DEF_ERROR_CODE(0, 0x03D9) #define TSDB_CODE_MND_TRANS_UNKNOW_ERROR TAOS_DEF_ERROR_CODE(0, 0x03DF) -#define TSDB_CODE_MND_TRANS_NOT_ABLE_TO_kILLED TAOS_DEF_ERROR_CODE(0, 0x03D2) // mnode-mq #define TSDB_CODE_MND_TOPIC_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x03E0) diff --git a/include/util/tdef.h b/include/util/tdef.h index 2b0aa00b1a..2ee84b42bd 100644 --- a/include/util/tdef.h +++ b/include/util/tdef.h @@ -329,11 +329,7 @@ typedef enum ELogicConditionType { #define TSDB_TRANS_STAGE_LEN 12 #define TSDB_TRANS_TYPE_LEN 16 -#define TSDB_TRANS_ERROR_LEN 512 -#define TSDB_TRANS_OBJTYPE_LEN 40 -#define TSDB_TRANS_RESULT_LEN 100 -#define TSDB_TRANS_TARGET_LEN 300 -#define TSDB_TRANS_DETAIL_LEN 100 +#define TSDB_TRANS_ERROR_LEN 512 #define TSDB_STEP_NAME_LEN 32 #define TSDB_STEP_DESC_LEN 128 diff --git a/source/common/src/systable.c b/source/common/src/systable.c index 38dce105bb..cb08046399 100644 --- a/source/common/src/systable.c +++ b/source/common/src/systable.c @@ -314,8 +314,6 @@ static const SSysDbTableSchema transSchema[] = { {.name = "oper", .bytes = TSDB_TRANS_OPER_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, {.name = "db", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, {.name = "stable", .bytes = SYSTABLE_SCH_TABLE_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "killable", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - //{.name = "kill_mnode", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, {.name = "failed_times", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, {.name = "last_exec_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = false}, {.name = "last_action_info", .bytes = (TSDB_TRANS_ERROR_LEN - 1) + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, @@ -405,15 +403,6 @@ static const SSysDbTableSchema userCompactsDetailSchema[] = { {.name = "remain_time(s)", .bytes = 8, .type = TSDB_DATA_TYPE_BIGINT, .sysInfo = false}, }; -static const SSysDbTableSchema userTransactionDetailSchema[] = { - {.name = "transaction_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, - {.name = "action", .bytes = 30 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "obj_type", .bytes = TSDB_TRANS_OBJTYPE_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "result", .bytes = TSDB_TRANS_RESULT_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "target", .bytes = TSDB_TRANS_TARGET_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "detail", .bytes = TSDB_TRANS_DETAIL_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, -}; - static const SSysDbTableSchema anodesSchema[] = { {.name = "id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false}, {.name = "url", .bytes = TSDB_ANALYTIC_ANODE_URL_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, @@ -532,7 +521,6 @@ static const SSysTableMeta infosMeta[] = { {TSDB_INS_TABLE_ANODES_FULL, anodesFullSchema, tListLen(anodesFullSchema), true}, {TSDB_INS_DISK_USAGE, diskUsageSchema, tListLen(diskUsageSchema), false}, {TSDB_INS_TABLE_FILESETS, filesetsFullSchema, tListLen(filesetsFullSchema), false}, - {TSDB_INS_TABLE_TRANSACTION_DETAILS, userTransactionDetailSchema, tListLen(userTransactionDetailSchema), false}, }; static const SSysDbTableSchema connectionsSchema[] = { diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c index 423268a8cc..9ed4ee83c4 100644 --- a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c +++ b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c @@ -681,7 +681,6 @@ int32_t dmProcessRetrieve(SDnodeMgmt *pMgmt, SRpcMsg *pMsg) { if (tDeserializeSRetrieveTableReq(pMsg->pCont, pMsg->contLen, &retrieveReq) != 0) { return TSDB_CODE_INVALID_MSG; } - dInfo("retrieve table:%s, user:%s, compactId:%" PRId64, retrieveReq.tb, retrieveReq.user, retrieveReq.compactId); #if 0 if (strcmp(retrieveReq.user, TSDB_DEFAULT_USER) != 0) { code = TSDB_CODE_MND_NO_RIGHTS; diff --git a/source/dnode/mnode/impl/inc/mndDef.h b/source/dnode/mnode/impl/inc/mndDef.h index b32274e0a7..e3d2ad6d34 100644 --- a/source/dnode/mnode/impl/inc/mndDef.h +++ b/source/dnode/mnode/impl/inc/mndDef.h @@ -133,12 +133,6 @@ typedef enum { TRN_EXEC_SERIAL = 1, } ETrnExec; -typedef enum { - TRN_KILL_MODE_SKIP = 0, - TRN_KILL_MODE_INTERUPT = 1, - //TRN_KILL_MODE_ROLLBACK = 2, -} ETrnKillMode; - typedef enum { DND_REASON_ONLINE = 0, DND_REASON_STATUS_MSG_TIMEOUT, @@ -207,8 +201,6 @@ typedef struct { SRWLatch lockRpcArray; int64_t mTraceId; TdThreadMutex mutex; - bool ableToBeKilled; - ETrnKillMode killMode; } STrans; typedef struct { diff --git a/source/dnode/mnode/impl/inc/mndTrans.h b/source/dnode/mnode/impl/inc/mndTrans.h index 05280d0d68..7f039bc21f 100644 --- a/source/dnode/mnode/impl/inc/mndTrans.h +++ b/source/dnode/mnode/impl/inc/mndTrans.h @@ -54,8 +54,6 @@ typedef struct { SSdbRaw *pRaw; int64_t mTraceId; - int64_t startTime; - int64_t endTime; } STransAction; typedef void (*TransCbFp)(SMnode *pMnode, void *param, int32_t paramLen); @@ -82,8 +80,6 @@ void mndTransSetCb(STrans *pTrans, ETrnFunc startFunc, ETrnFunc stopFunc, voi void mndTransSetDbName(STrans *pTrans, const char *dbname, const char *stbname); void mndTransAddArbGroupId(STrans *pTrans, int32_t groupId); void mndTransSetSerial(STrans *pTrans); -void mndTransSetBeKilled(STrans *pTrans, bool ableToBeKilled); -void mndTransSetKillMode(STrans *pTrans, ETrnKillMode killMode); void mndTransSetParallel(STrans *pTrans); void mndTransSetChangeless(STrans *pTrans); void mndTransSetOper(STrans *pTrans, EOperType oper); diff --git a/source/dnode/mnode/impl/src/mndCompactDetail.c b/source/dnode/mnode/impl/src/mndCompactDetail.c index 0052f5de56..9a053066b2 100644 --- a/source/dnode/mnode/impl/src/mndCompactDetail.c +++ b/source/dnode/mnode/impl/src/mndCompactDetail.c @@ -45,8 +45,6 @@ int32_t mndRetrieveCompactDetail(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pB char *sep = NULL; SDbObj *pDb = NULL; - mInfo("retrieve compact detail"); - if (strlen(pShow->db) > 0) { sep = strchr(pShow->db, '.'); if (sep && diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index 1efbff9d53..c28fd343f0 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -1270,7 +1270,6 @@ static int32_t mndAlterDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pOld, SDbObj *p TAOS_RETURN(code); } mInfo("trans:%d, used to alter db:%s", pTrans->id, pOld->name); - mInfo("trans:%d, used to alter db, ableToBeKilled:%d, killMode:%d", pTrans->id, pTrans->ableToBeKilled, pTrans->killMode); mndTransSetDbName(pTrans, pOld->name, NULL); TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER); @@ -1279,8 +1278,6 @@ static int32_t mndAlterDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pOld, SDbObj *p TAOS_CHECK_GOTO(mndSetAlterDbPrepareLogs(pMnode, pTrans, pOld, pNew), NULL, _OVER); TAOS_CHECK_GOTO(mndSetAlterDbCommitLogs(pMnode, pTrans, pOld, pNew), NULL, _OVER); TAOS_CHECK_GOTO(mndSetAlterDbRedoActions(pMnode, pTrans, pOld, pNew), NULL, _OVER); - - mInfo("trans:%d, used to alter db, ableToBeKilled:%d, killMode:%d", pTrans->id, pTrans->ableToBeKilled, pTrans->killMode); TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER); code = 0; diff --git a/source/dnode/mnode/impl/src/mndShow.c b/source/dnode/mnode/impl/src/mndShow.c index f19eabd885..49dc62d471 100644 --- a/source/dnode/mnode/impl/src/mndShow.c +++ b/source/dnode/mnode/impl/src/mndShow.c @@ -132,8 +132,6 @@ static int32_t convertToRetrieveType(char *name, int32_t len) { type = TSDB_MGMT_TABLE_COMPACT; } else if (strncasecmp(name, TSDB_INS_TABLE_COMPACT_DETAILS, len) == 0) { type = TSDB_MGMT_TABLE_COMPACT_DETAIL; - } else if (strncasecmp(name, TSDB_INS_TABLE_TRANSACTION_DETAILS, len) == 0) { - type = TSDB_MGMT_TABLE_TRANSACTION_DETAIL; } else if (strncasecmp(name, TSDB_INS_TABLE_GRANTS_FULL, len) == 0) { type = TSDB_MGMT_TABLE_GRANTS_FULL; } else if (strncasecmp(name, TSDB_INS_TABLE_GRANTS_LOGS, len) == 0) { @@ -238,8 +236,7 @@ static int32_t mndProcessRetrieveSysTableReq(SRpcMsg *pReq) { SRetrieveTableReq retrieveReq = {0}; TAOS_CHECK_RETURN(tDeserializeSRetrieveTableReq(pReq->pCont, pReq->contLen, &retrieveReq)); - mDebug("process to retrieve systable req db:%s, tb:%s, compactId:%" PRId64, retrieveReq.db, retrieveReq.tb, - retrieveReq.compactId); + mDebug("process to retrieve systable req db:%s, tb:%s", retrieveReq.db, retrieveReq.tb); if (retrieveReq.showId == 0) { STableMetaRsp *pMeta = taosHashGet(pMnode->infosMeta, retrieveReq.tb, strlen(retrieveReq.tb)); diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 83fad45919..718b7d0df6 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -14,21 +14,19 @@ */ #define _DEFAULT_SOURCE -#include "mndTrans.h" #include "mndDb.h" #include "mndPrivilege.h" #include "mndShow.h" #include "mndStb.h" #include "mndSubscribe.h" #include "mndSync.h" +#include "mndTrans.h" #include "mndUser.h" -#include "mndVgroup.h" -#include "osTime.h" #define TRANS_VER1_NUMBER 1 #define TRANS_VER2_NUMBER 2 #define TRANS_ARRAY_SIZE 8 -#define TRANS_RESERVE_SIZE 42 +#define TRANS_RESERVE_SIZE 44 static int32_t mndTransActionInsert(SSdb *pSdb, STrans *pTrans); static int32_t mndTransActionUpdate(SSdb *pSdb, STrans *OldTrans, STrans *pOld); @@ -72,7 +70,7 @@ static int32_t mndProcessKillTransReq(SRpcMsg *pReq); static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows); static void mndCancelGetNextTrans(SMnode *pMnode, void *pIter); -static int32_t mndRetrieveTransDetail(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows); + static int32_t tsMaxTransId = 0; int32_t mndInitTrans(SMnode *pMnode) { @@ -91,7 +89,6 @@ int32_t mndInitTrans(SMnode *pMnode) { mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_TRANS, mndRetrieveTrans); mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_TRANS, mndCancelGetNextTrans); - mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_TRANSACTION_DETAIL, mndRetrieveTransDetail); return sdbSetTable(pMnode->pSdb, table); } @@ -159,7 +156,7 @@ SSdbRaw *mndTransEncode(STrans *pTrans) { int32_t code = 0; int32_t lino = 0; terrno = TSDB_CODE_INVALID_MSG; - int8_t sver = TRANS_VER2_NUMBER; + int8_t sver = taosArrayGetSize(pTrans->prepareActions) ? TRANS_VER2_NUMBER : TRANS_VER1_NUMBER; int32_t rawDataLen = sizeof(STrans) + TRANS_RESERVE_SIZE + pTrans->paramLen; rawDataLen += mndTransGetActionsSize(pTrans->prepareActions); @@ -223,11 +220,6 @@ SSdbRaw *mndTransEncode(STrans *pTrans) { pIter = taosHashIterate(pTrans->arbGroupIds, pIter); } - if (sver > TRANS_VER1_NUMBER) { - SDB_SET_INT8(pRaw, dataPos, pTrans->ableToBeKilled, _OVER) - SDB_SET_INT32(pRaw, dataPos, pTrans->killMode, _OVER) - } - SDB_SET_RESERVE(pRaw, dataPos, TRANS_RESERVE_SIZE, _OVER) SDB_SET_DATALEN(pRaw, dataPos, _OVER) @@ -318,7 +310,7 @@ SSdbRow *mndTransDecode(SSdbRaw *pRaw) { if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER; - if (sver > TRANS_VER2_NUMBER) { + if (sver != TRANS_VER1_NUMBER && sver != TRANS_VER2_NUMBER) { terrno = TSDB_CODE_SDB_INVALID_DATA_VER; goto _OVER; } @@ -397,13 +389,6 @@ SSdbRow *mndTransDecode(SSdbRaw *pRaw) { if ((terrno = taosHashPut(pTrans->arbGroupIds, &arbGroupId, sizeof(int32_t), NULL, 0)) != 0) goto _OVER; } - int8_t ableKill = 0; - int8_t killMode = 0; - SDB_GET_INT8(pRaw, dataPos, &ableKill, _OVER) - SDB_GET_INT8(pRaw, dataPos, &killMode, _OVER) - pTrans->ableToBeKilled = ableKill; - pTrans->killMode = killMode; - SDB_GET_RESERVE(pRaw, dataPos, TRANS_RESERVE_SIZE, _OVER) terrno = 0; @@ -445,25 +430,12 @@ static const char *mndTransStr(ETrnStage stage) { } } -static const char *mndTransTypeStr(ETrnAct actionType) { - switch (actionType) { - case TRANS_ACTION_MSG: - return "msg"; - case TRANS_ACTION_RAW: - return "sdb"; - default: - return "invalid"; - } -} - static void mndSetTransLastAction(STrans *pTrans, STransAction *pAction) { if (pAction != NULL) { - if (pAction->errCode != TSDB_CODE_ACTION_IN_PROGRESS) { - pTrans->lastAction = pAction->id; - pTrans->lastMsgType = pAction->msgType; - pTrans->lastEpset = pAction->epSet; - pTrans->lastErrorNo = pAction->errCode; - } + pTrans->lastAction = pAction->id; + pTrans->lastMsgType = pAction->msgType; + pTrans->lastEpset = pAction->epSet; + pTrans->lastErrorNo = pAction->errCode; } else { pTrans->lastAction = 0; pTrans->lastMsgType = 0; @@ -664,7 +636,6 @@ STrans *mndTransCreate(SMnode *pMnode, ETrnPolicy policy, ETrnConflct conflict, pTrans->policy = policy; pTrans->conflict = conflict; pTrans->exec = TRN_EXEC_PARALLEL; - pTrans->ableToBeKilled = false; pTrans->createdTime = taosGetTimestampMs(); pTrans->prepareActions = taosArrayInit(TRANS_ARRAY_SIZE, sizeof(STransAction)); pTrans->redoActions = taosArrayInit(TRANS_ARRAY_SIZE, sizeof(STransAction)); @@ -833,13 +804,6 @@ void mndTransAddArbGroupId(STrans *pTrans, int32_t groupId) { void mndTransSetSerial(STrans *pTrans) { pTrans->exec = TRN_EXEC_SERIAL; } -void mndTransSetBeKilled(STrans *pTrans, bool ableToBeKilled) { pTrans->ableToBeKilled = ableToBeKilled; } - -void mndTransSetKillMode(STrans *pTrans, ETrnKillMode killMode) { - pTrans->ableToBeKilled = true; - pTrans->killMode = killMode; -} - void mndTransSetParallel(STrans *pTrans) { pTrans->exec = TRN_EXEC_PARALLEL; } void mndTransSetChangeless(STrans *pTrans) { pTrans->changeless = true; } @@ -1079,39 +1043,6 @@ int32_t mndTransPrepare(SMnode *pMnode, STrans *pTrans) { return TSDB_CODE_INVALID_PARA; } - mInfo("trans:%d, action list:", pTrans->id); - int32_t index = 0; - for (int32_t i = 0; i < taosArrayGetSize(pTrans->prepareActions); ++i, ++index) { - STransAction *pAction = taosArrayGet(pTrans->prepareActions, i); - mInfo("trans:%d, action:%d, %s:%d sdbType:%s, sdbStatus:%s", pTrans->id, index, - mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status)); - } - - for (int32_t i = 0; i < taosArrayGetSize(pTrans->redoActions); ++i, ++index) { - STransAction *pAction = taosArrayGet(pTrans->redoActions, i); - mInfo("trans:%d, action:%d, %s:%d msgType:%s", pTrans->id, index, - mndTransStr(pAction->stage), pAction->id, TMSG_INFO(pAction->msgType));; - } - - for (int32_t i = 0; i < taosArrayGetSize(pTrans->commitActions); ++i, ++index) { - STransAction *pAction = taosArrayGet(pTrans->commitActions, i); - mInfo("trans:%d, action:%d, %s:%d sdbType:%s, sdbStatus:%s", pTrans->id, index, - mndTransStr(pAction->stage), i, sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status)); - } - - for (int32_t i = 0; i < taosArrayGetSize(pTrans->undoActions); ++i, ++index) { - STransAction *pAction = taosArrayGet(pTrans->undoActions, i); - if(pAction->actionType == TRANS_ACTION_MSG){ - mInfo("trans:%d, action:%d, %s:%d msgType:%s", pTrans->id, index, - mndTransStr(pAction->stage), pAction->id, TMSG_INFO(pAction->msgType));; - } - else{ - mInfo("trans:%d, action:%d, %s:%d sdbType:%s, sdbStatus:%s", pTrans->id, index, - mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status)); - } - } - - TAOS_CHECK_RETURN(mndTransCheckConflict(pMnode, pTrans)); TAOS_CHECK_RETURN(mndTransCheckParallelActions(pMnode, pTrans)); @@ -1329,10 +1260,7 @@ int32_t mndTransProcessRsp(SRpcMsg *pRsp) { if (pAction != NULL) { pAction->msgReceived = 1; pAction->errCode = pRsp->code; - pAction->endTime = taosGetTimestampMs(); - - // pTrans->lastErrorNo = pRsp->code; - mndSetTransLastAction(pTrans, pAction); + pTrans->lastErrorNo = pRsp->code; mInfo("trans:%d, %s:%d response is received, received code:0x%x(%s), accept:0x%x(%s) retry:0x%x(%s)", transId, mndTransStr(pAction->stage), action, pRsp->code, tstrerror(pRsp->code), pAction->acceptableCode, @@ -1446,8 +1374,6 @@ static int32_t mndTransSendSingleMsg(SMnode *pMnode, STrans *pTrans, STransActio pAction->msgSent = 1; // pAction->msgReceived = 0; pAction->errCode = TSDB_CODE_ACTION_IN_PROGRESS; - pAction->startTime = taosGetTimestampMs(); - pAction->endTime = 0; mInfo("trans:%d, %s:%d is sent, %s", pTrans->id, mndTransStr(pAction->stage), pAction->id, detail); mndSetTransLastAction(pTrans, pAction); @@ -1601,9 +1527,8 @@ static int32_t mndTransExecuteActionsSerial(SMnode *pMnode, STrans *pTrans, SArr for (int32_t action = pTrans->actionPos; action < numOfActions; ++action) { STransAction *pAction = taosArrayGet(pActions, action); - mInfo("trans:%d, current action:%d, stage:%s, actionType(1:msg,2:log):%d, msgSent:%d, msgReceived:%d", - pTrans->id, pTrans->actionPos, mndTransStr(pAction->stage), pAction->actionType, pAction->msgSent, - pAction->msgReceived); + mInfo("trans:%d, current action:%d, stage:%s, actionType(1:msg,2:log):%d", pTrans->id, pTrans->actionPos, + mndTransStr(pAction->stage), pAction->actionType); code = mndTransExecSingleAction(pMnode, pTrans, pAction, topHalf); if (code == 0) { @@ -1999,25 +1924,13 @@ int32_t mndKillTrans(SMnode *pMnode, STrans *pTrans) { TAOS_RETURN(TSDB_CODE_MND_TRANS_INVALID_STAGE); } - if(pTrans->ableToBeKilled == false){ - return TSDB_CODE_MND_TRANS_NOT_ABLE_TO_kILLED; - } - - if(pTrans->killMode == TRN_KILL_MODE_SKIP){ - for (int32_t i = 0; i < taosArrayGetSize(pArray); ++i) { - STransAction *pAction = taosArrayGet(pArray, i); - mInfo("trans:%d, %s:%d set processed for kill msg received, errCode from %s to success", pTrans->id, - mndTransStr(pAction->stage), i, tstrerror(pAction->errCode)); - pAction->msgSent = 1; - pAction->msgReceived = 1; - pAction->errCode = 0; - } - } - else if(pTrans->killMode == TRN_KILL_MODE_INTERUPT){ - pTrans->stage = TRN_STAGE_PRE_FINISH; - } - else{ - return TSDB_CODE_MND_TRANS_NOT_ABLE_TO_kILLED; + for (int32_t i = 0; i < taosArrayGetSize(pArray); ++i) { + STransAction *pAction = taosArrayGet(pArray, i); + mInfo("trans:%d, %s:%d set processed for kill msg received, errCode from %s to success", pTrans->id, + mndTransStr(pAction->stage), i, tstrerror(pAction->errCode)); + pAction->msgSent = 1; + pAction->msgReceived = 1; + pAction->errCode = 0; } mndTransExecute(pMnode, pTrans); @@ -2089,114 +2002,6 @@ void mndTransPullup(SMnode *pMnode) { taosArrayDestroy(pArray); } -static char *formatTimestamp(char *buf, int64_t val, int precision) { - time_t tt; - if (precision == TSDB_TIME_PRECISION_MICRO) { - tt = (time_t)(val / 1000000); - } - if (precision == TSDB_TIME_PRECISION_NANO) { - tt = (time_t)(val / 1000000000); - } else { - tt = (time_t)(val / 1000); - } - - struct tm tm; - if (taosLocalTime(&tt, &tm, NULL, 0, NULL) == NULL) { - mError("failed to get local time"); - return NULL; - } - size_t pos = taosStrfTime(buf, 32, "%Y-%m-%d %H:%M:%S", &tm); - - if (precision == TSDB_TIME_PRECISION_MICRO) { - sprintf(buf + pos, ".%06d", (int)(val % 1000000)); - } else if (precision == TSDB_TIME_PRECISION_NANO) { - sprintf(buf + pos, ".%09d", (int)(val % 1000000000)); - } else { - sprintf(buf + pos, ".%03d", (int)(val % 1000)); - } - - return buf; -} - -static void mndTransLogAction(STrans *pTrans) { - char detail[512] = {0}; - int32_t len = 0; - int32_t index = 0; - - if (pTrans->stage == TRN_STAGE_PREPARE) { - for (int32_t i = 0; i < taosArrayGetSize(pTrans->prepareActions); ++i, ++index) { - len = 0; - STransAction *pAction = taosArrayGet(pTrans->prepareActions, i); - len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s\n", index, - mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), - sdbStatusName(pAction->pRaw->status)); - mDebug("trans:%d, show tran action, detail:%s", pTrans->id, detail); - } - } - - if (pTrans->stage == TRN_STAGE_REDO_ACTION) { - for (int32_t i = 0; i < taosArrayGetSize(pTrans->redoActions); ++i, ++index) { - len = 0; - STransAction *pAction = taosArrayGet(pTrans->redoActions, i); - if (pAction->actionType == TRANS_ACTION_MSG) { - char bufStart[40] = {0}; - (void)formatTimestamp(bufStart, pAction->startTime, TSDB_TIME_PRECISION_MILLI); - - char endStart[40] = {0}; - (void)formatTimestamp(endStart, pAction->endTime, TSDB_TIME_PRECISION_MILLI); - len += snprintf(detail + len, sizeof(detail) - len, - "action:%d, %s:%d msgType:%s," - "sent:%d, received:%d, startTime:%s, endTime:%s, ", - index, mndTransStr(pAction->stage), pAction->id, TMSG_INFO(pAction->msgType), pAction->msgSent, - pAction->msgReceived, bufStart, endStart); - - SEpSet epset = pAction->epSet; - if (epset.numOfEps > 0) { - len += snprintf(detail + len, sizeof(detail) - len, "numOfEps:%d inUse:%d ", epset.numOfEps, epset.inUse); - for (int32_t i = 0; i < epset.numOfEps; ++i) { - len += - snprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u ", i, epset.eps[i].fqdn, epset.eps[i].port); - } - } - - len += snprintf(detail + len, sizeof(detail) - len, ", errCode:0x%x(%s)\n", pAction->errCode & 0xFFFF, - tstrerror(pAction->errCode)); - } else { - len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s, written:%d\n", - index, mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), - sdbStatusName(pAction->pRaw->status), pAction->rawWritten); - } - mDebug("trans:%d, show tran action, detail:%s", pTrans->id, detail); - } - } - - if (pTrans->stage == TRN_STAGE_COMMIT_ACTION) { - for (int32_t i = 0; i < taosArrayGetSize(pTrans->commitActions); ++i, ++index) { - len = 0; - STransAction *pAction = taosArrayGet(pTrans->commitActions, i); - len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s\n", index, - mndTransStr(pAction->stage), i, sdbTableName(pAction->pRaw->type), - sdbStatusName(pAction->pRaw->status)); - mDebug("trans:%d, show tran action, detail:%s", pTrans->id, detail); - } - - for (int32_t i = 0; i < taosArrayGetSize(pTrans->undoActions); ++i, ++index) { - len = 0; - STransAction *pAction = taosArrayGet(pTrans->undoActions, i); - if (pAction->actionType == TRANS_ACTION_MSG) { - len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d msgType:%s\n", index, - mndTransStr(pAction->stage), pAction->id, TMSG_INFO(pAction->msgType)); - ; - } else { - len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s\n", index, - mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), - sdbStatusName(pAction->pRaw->status)); - } - mDebug("trans:%d, show tran action, detail:%s", pTrans->id, detail); - } - } -} - static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) { SMnode *pMnode = pReq->info.node; SSdb *pSdb = pMnode->pSdb; @@ -2239,20 +2044,6 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stbname, false), pTrans, &lino, _OVER); - const char *killableStr = pTrans->ableToBeKilled ? "yes" : "no"; - char killableVstr[10 + VARSTR_HEADER_SIZE] = {0}; - STR_WITH_MAXSIZE_TO_VARSTR(killableVstr, killableStr, 10 + VARSTR_HEADER_SIZE); - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)killableVstr, false), pTrans, &lino, _OVER); - - /* - const char *killModeStr = pTrans->killMode == TRN_KILL_MODE_SKIP ? "skip" : "interrupt"; - char killModeVstr[10 + VARSTR_HEADER_SIZE] = {0}; - STR_WITH_MAXSIZE_TO_VARSTR(killModeVstr, killModeStr, 24); - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)killModeVstr, false), pTrans, &lino, _OVER); - */ - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pTrans->failedTimes, false), pTrans, &lino, _OVER); @@ -2270,15 +2061,13 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl len += tsnprintf(detail + len, sizeof(detail) - len, "msgType:%s numOfEps:%d inUse:%d ", TMSG_INFO(pTrans->lastMsgType), epset.numOfEps, epset.inUse); for (int32_t i = 0; i < pTrans->lastEpset.numOfEps; ++i) { - len += snprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u ", i, epset.eps[i].fqdn, epset.eps[i].port); + len += tsnprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u ", i, epset.eps[i].fqdn, epset.eps[i].port); } } STR_WITH_MAXSIZE_TO_VARSTR(lastInfo, detail, pShow->pMeta->pSchemas[cols].bytes); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)lastInfo, false), pTrans, &lino, _OVER); - mndTransLogAction(pTrans); - numOfRows++; sdbRelease(pSdb, pTrans); } @@ -2289,239 +2078,6 @@ _OVER: return numOfRows; } -static int32_t mndShowTransCommonColumns(SShowObj *pShow, SSDataBlock *pBlock, STransAction *pAction, - int32_t transactionId, int32_t curActionId, int32_t numOfRows, int32_t *cols) { - int32_t code = 0; - int32_t lino = 0; - int32_t len = 0; - - SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, (*cols)++); - TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&transactionId, false), &lino, _OVER); - - char action[30 + 1] = {0}; - if (curActionId == pAction->id) { - len += snprintf(action + len, sizeof(action) - len, "%s:%d(%s)<-last", mndTransStr(pAction->stage), pAction->id, - mndTransTypeStr(pAction->actionType)); - } else { - len += snprintf(action + len, sizeof(action) - len, "%s:%d(%s)", mndTransStr(pAction->stage), pAction->id, - mndTransTypeStr(pAction->actionType)); - } - char actionVStr[30 + VARSTR_HEADER_SIZE] = {0}; - STR_WITH_MAXSIZE_TO_VARSTR(actionVStr, action, pShow->pMeta->pSchemas[*cols].bytes); - pColInfo = taosArrayGet(pBlock->pDataBlock, (*cols)++); - TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)actionVStr, false), &lino, _OVER); -_OVER: - if (code != 0) mError("failed to retrieve at line:%d, since %s", lino, tstrerror(code)); - return code; -} - -static void mndShowTransAction(SShowObj *pShow, SSDataBlock *pBlock, STransAction *pAction, int32_t transactionId, - int32_t curActionId, int32_t rows, int32_t numOfRows) { - int32_t code = 0; - int32_t lino = 0; - int32_t len = 0; - int32_t cols = 0; - - cols = 0; - - if (mndShowTransCommonColumns(pShow, pBlock, pAction, transactionId, curActionId, numOfRows, &cols) != 0) return; - - if (pAction->actionType == TRANS_ACTION_MSG) { - int32_t len = 0; - - char objType[TSDB_TRANS_OBJTYPE_LEN + 1] = {0}; - len += snprintf(objType + len, sizeof(objType) - len, "%s(s:%d,r:%d)", TMSG_INFO(pAction->msgType), - pAction->msgSent, pAction->msgReceived); - char objTypeVStr[TSDB_TRANS_OBJTYPE_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_WITH_MAXSIZE_TO_VARSTR(objTypeVStr, objType, pShow->pMeta->pSchemas[cols].bytes); - SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)objTypeVStr, false), &lino, _OVER); - - char result[TSDB_TRANS_RESULT_LEN + 1] = {0}; - len = 0; - len += snprintf(result + len, sizeof(result) - len, "errCode:0x%x(%s)", pAction->errCode & 0xFFFF, - tstrerror(pAction->errCode)); - char resultVStr[TSDB_TRANS_RESULT_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_WITH_MAXSIZE_TO_VARSTR(resultVStr, result, pShow->pMeta->pSchemas[cols].bytes); - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)resultVStr, false), &lino, _OVER); - - char target[TSDB_TRANS_TARGET_LEN] = {0}; - len = 0; - SEpSet epset = pAction->epSet; - if (epset.numOfEps > 0) { - for (int32_t i = 0; i < epset.numOfEps; ++i) { - len += snprintf(target + len, sizeof(target) - len, "ep:%d-%s:%u,", i, epset.eps[i].fqdn, epset.eps[i].port); - } - len += snprintf(target + len, sizeof(target) - len, "(%d:%d) ", epset.numOfEps, epset.inUse); - } - char targetVStr[TSDB_TRANS_TARGET_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_WITH_MAXSIZE_TO_VARSTR(targetVStr, target, pShow->pMeta->pSchemas[cols].bytes); - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)targetVStr, false), &lino, _OVER); - - char detail[TSDB_TRANS_DETAIL_LEN] = {0}; - len = 0; - char bufStart[40] = {0}; - if (pAction->startTime > 0) (void)formatTimestamp(bufStart, pAction->startTime, TSDB_TIME_PRECISION_MILLI); - char bufEnd[40] = {0}; - if (pAction->endTime > 0) (void)formatTimestamp(bufEnd, pAction->endTime, TSDB_TIME_PRECISION_MILLI); - len += snprintf(detail + len, sizeof(detail) - len, "startTime:%s, endTime:%s, ", bufStart, bufEnd); - char detailVStr[TSDB_TRANS_DETAIL_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_WITH_MAXSIZE_TO_VARSTR(detailVStr, detail, pShow->pMeta->pSchemas[cols].bytes); - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)detailVStr, false), &lino, _OVER); - - } else { - int32_t len = 0; - - char objType[TSDB_TRANS_OBJTYPE_LEN + 1] = {0}; - if (pAction->pRaw->type == SDB_VGROUP) { - SSdbRow *pRow = mndVgroupActionDecode(pAction->pRaw); - SVgObj *pVgroup = sdbGetRowObj(pRow); - len += snprintf(objType + len, sizeof(objType) - len, "%s(%d)", sdbTableName(pAction->pRaw->type), pVgroup->vgId); - taosMemoryFreeClear(pRow); - } else { - strcpy(objType, sdbTableName(pAction->pRaw->type)); - } - char objTypeVStr[TSDB_TRANS_OBJTYPE_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_WITH_MAXSIZE_TO_VARSTR(objTypeVStr, objType, pShow->pMeta->pSchemas[cols].bytes); - SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)objTypeVStr, false), &lino, _OVER); - - char result[TSDB_TRANS_RESULT_LEN + 1] = {0}; - len = 0; - len += snprintf(result + len, sizeof(result) - len, "rawWritten:%d", pAction->rawWritten); - char resultVStr[TSDB_TRANS_RESULT_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_WITH_MAXSIZE_TO_VARSTR(resultVStr, result, pShow->pMeta->pSchemas[cols].bytes); - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)resultVStr, false), &lino, _OVER); - - char target[TSDB_TRANS_TARGET_LEN] = ""; - char targetVStr[TSDB_TRANS_TARGET_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_WITH_MAXSIZE_TO_VARSTR(targetVStr, target, pShow->pMeta->pSchemas[cols].bytes); - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)targetVStr, false), &lino, _OVER); - - char detail[TSDB_TRANS_DETAIL_LEN] = {0}; - len = 0; - len += snprintf(detail + len, sizeof(detail) - len, "sdbStatus:%s", sdbStatusName(pAction->pRaw->status)); - char detailVStr[TSDB_TRANS_DETAIL_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_WITH_MAXSIZE_TO_VARSTR(detailVStr, detail, pShow->pMeta->pSchemas[cols].bytes); - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)detailVStr, false), &lino, _OVER); - } - -_OVER: - if (code != 0) mError("failed to retrieve at line:%d, since %s", lino, tstrerror(code)); -} - -static SArray *mndTransGetAction(STrans *pTrans, ETrnStage stage) { - if (stage == TRN_STAGE_PREPARE) { - return pTrans->prepareActions; - } - if (stage == TRN_STAGE_REDO_ACTION) { - return pTrans->redoActions; - } - if (stage == TRN_STAGE_COMMIT_ACTION) { - return pTrans->commitActions; - } - if (stage == TRN_STAGE_UNDO_ACTION) { - return pTrans->undoActions; - } - return NULL; -} - -typedef struct STransDetailIter { - void *pIter; - STrans *pTrans; - ETrnStage stage; - int32_t num; -} STransDetailIter; - -static void mndTransShowActions(SSdb *pSdb, STransDetailIter *pShowIter, SShowObj *pShow, SSDataBlock *pBlock, - int32_t rows, int32_t *numOfRows, SArray *pActions, int32_t end, int32_t start) { - int32_t actionNum = taosArrayGetSize(pActions); - mInfo("stage:%s, Actions num:%d", mndTransStr(pShowIter->stage), actionNum); - - for (int32_t i = start; i < actionNum; ++i) { - STransAction *pAction = taosArrayGet(pShowIter->pTrans->redoActions, i); - mndShowTransAction(pShow, pBlock, pAction, pShowIter->pTrans->id, pShowIter->pTrans->lastAction, rows, *numOfRows); - (*numOfRows)++; - if (*numOfRows >= rows) break; - } - - if (*numOfRows == end) { - sdbRelease(pSdb, pShowIter->pTrans); - pShowIter->pTrans = NULL; - pShowIter->num = 0; - } else { - pShowIter->pTrans = pShowIter->pTrans; - pShowIter->stage = pShowIter->pTrans->stage; - pShowIter->num += (*numOfRows); - } -} - -static int32_t mndRetrieveTransDetail(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) { - SMnode *pMnode = pReq->info.node; - SSdb *pSdb = pMnode->pSdb; - int32_t numOfRows = 0; - - int32_t code = 0; - int32_t lino = 0; - - mInfo("start to mndRetrieveTransDetail, rows:%d, pShow->numOfRows:%d, pShow->pIter:%p", rows, pShow->numOfRows, - pShow->pIter); - - if (pShow->pIter == NULL) { - pShow->pIter = taosMemoryMalloc(sizeof(STransDetailIter)); - if (pShow->pIter == NULL) { - mError("failed to malloc for pShow->pIter"); - return 0; - } - memset(pShow->pIter, 0, sizeof(STransDetailIter)); - } - - STransDetailIter *pShowIter = (STransDetailIter *)pShow->pIter; - - while (numOfRows < rows) { - if (pShowIter->pTrans == NULL) { - pShowIter->pIter = sdbFetch(pSdb, SDB_TRANS, pShowIter->pIter, (void **)&(pShowIter->pTrans)); - mDebug("retrieve trans detail from fetch, pShow->pIter:%p, pTrans:%p", pShowIter->pIter, pShowIter->pTrans); - if (pShowIter->pIter == NULL) break; - mInfo("retrieve trans detail from fetch, id:%d, trans stage:%d, IterNum:%d", pShowIter->pTrans->id, - pShowIter->pTrans->stage, pShowIter->num); - - SArray *pActions = mndTransGetAction(pShowIter->pTrans, pShowIter->pTrans->stage); - - mndTransShowActions(pSdb, pShowIter, pShow, pBlock, rows, &numOfRows, pActions, taosArrayGetSize(pActions), 0); - break; - } else { - mInfo("retrieve trans detail from iter, id:%d, iterStage:%d, IterNum:%d", pShowIter->pTrans->id, pShowIter->stage, - pShowIter->num); - SArray *pActions = mndTransGetAction(pShowIter->pTrans, pShowIter->stage); - - mndTransShowActions(pSdb, pShowIter, pShow, pBlock, rows, &numOfRows, pActions, - taosArrayGetSize(pActions) - pShowIter->num, pShowIter->num); - break; - } - } - -_OVER: - pShow->numOfRows += numOfRows; - - if (code != 0) { - mError("failed to retrieve at line:%d, since %s", lino, tstrerror(code)); - } else { - mInfo("retrieve trans detail, numOfRows:%d, pShow->numOfRows:%d", numOfRows, pShow->numOfRows) - } - if (numOfRows == 0) { - taosMemoryFree(pShow->pIter); - pShow->pIter = NULL; - } - return numOfRows; -} - static void mndCancelGetNextTrans(SMnode *pMnode, void *pIter) { SSdb *pSdb = pMnode->pSdb; sdbCancelFetchByType(pSdb, pIter, SDB_TRANS); diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c index e20afb7201..0bce21290b 100644 --- a/source/dnode/mnode/impl/src/mndVgroup.c +++ b/source/dnode/mnode/impl/src/mndVgroup.c @@ -2766,14 +2766,12 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb mndTransSetSerial(pTrans); - if (pNewDb->cfg.replications == 3) { + if (pNewVgroup->replica == 1 && pNewDb->cfg.replications == 3) { mInfo("db:%s, vgId:%d, will add 2 vnodes, vn:0 dnode:%d", pVgroup->dbName, pVgroup->vgId, pVgroup->vnodeGid[0].dnodeId); // add second - if (pNewVgroup->replica == 1){ - TAOS_CHECK_RETURN(mndAddVnodeToVgroup(pMnode, pTrans, pNewVgroup, pArray)); - } + TAOS_CHECK_RETURN(mndAddVnodeToVgroup(pMnode, pTrans, pNewVgroup, pArray)); // learner stage pNewVgroup->vnodeGid[0].nodeRole = TAOS_SYNC_ROLE_VOTER; @@ -2792,9 +2790,7 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb TAOS_CHECK_RETURN(mndAddAlterVnodeConfirmAction(pMnode, pTrans, pNewDb, pNewVgroup)); // add third - if (pNewVgroup->replica == 2){ - TAOS_CHECK_RETURN (mndAddVnodeToVgroup(pMnode, pTrans, pNewVgroup, pArray)); - } + TAOS_CHECK_RETURN(mndAddVnodeToVgroup(pMnode, pTrans, pNewVgroup, pArray)); pNewVgroup->vnodeGid[0].nodeRole = TAOS_SYNC_ROLE_VOTER; pNewVgroup->vnodeGid[1].nodeRole = TAOS_SYNC_ROLE_VOTER; @@ -2806,7 +2802,7 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb TAOS_CHECK_RETURN(mndAddCreateVnodeAction(pMnode, pTrans, pNewDb, pNewVgroup, &pNewVgroup->vnodeGid[2])); TAOS_CHECK_RETURN(mndAddAlterVnodeConfirmAction(pMnode, pTrans, pNewDb, pNewVgroup)); - } else if (pNewDb->cfg.replications == 1) { + } else if (pNewVgroup->replica == 3 && pNewDb->cfg.replications == 1) { mInfo("db:%s, vgId:%d, will remove 2 vnodes, vn:0 dnode:%d vn:1 dnode:%d vn:2 dnode:%d", pVgroup->dbName, pVgroup->vgId, pVgroup->vnodeGid[0].dnodeId, pVgroup->vnodeGid[1].dnodeId, pVgroup->vnodeGid[2].dnodeId); @@ -2823,9 +2819,9 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb TAOS_CHECK_RETURN(mndRemoveVnodeFromVgroup(pMnode, pTrans, pNewVgroup, pArray, &del2)); TAOS_CHECK_RETURN(mndAddDropVnodeAction(pMnode, pTrans, pNewDb, pNewVgroup, &del2, true)); TAOS_CHECK_RETURN( - mndAddAlterVnodeReplicaAction(pMnode, pTrans, pNewDb, pNewVgroup, pNewVgroup->vnodeGid[0].dnodeId)); + mndAddAlterVnodeReplicaAction(pMnode, pTrans, pNewDb, pNewVgroup, pNewVgroup->vnodeGid[0].dnodeId)); TAOS_CHECK_RETURN(mndAddAlterVnodeConfirmAction(pMnode, pTrans, pNewDb, pNewVgroup)); - } else if (pNewDb->cfg.replications == 2) { + } else if (pNewVgroup->replica == 1 && pNewDb->cfg.replications == 2) { mInfo("db:%s, vgId:%d, will add 1 vnode, vn:0 dnode:%d", pVgroup->dbName, pVgroup->vgId, pVgroup->vnodeGid[0].dnodeId); diff --git a/source/libs/executor/src/sysscanoperator.c b/source/libs/executor/src/sysscanoperator.c index 7862b36f27..3f08db0e98 100644 --- a/source/libs/executor/src/sysscanoperator.c +++ b/source/libs/executor/src/sysscanoperator.c @@ -2543,8 +2543,7 @@ static int32_t doSysTableScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) if (pInfo->showRewrite) { getDBNameFromCondition(pInfo->pCondition, dbName); if (strncasecmp(name, TSDB_INS_TABLE_COMPACTS, TSDB_TABLE_FNAME_LEN) != 0 && - strncasecmp(name, TSDB_INS_TABLE_COMPACT_DETAILS, TSDB_TABLE_FNAME_LEN) != 0 && - strncasecmp(name, TSDB_INS_TABLE_TRANSACTION_DETAILS, TSDB_TABLE_FNAME_LEN) != 0) { + strncasecmp(name, TSDB_INS_TABLE_COMPACT_DETAILS, TSDB_TABLE_FNAME_LEN) != 0) { TAOS_UNUSED(tsnprintf(pInfo->req.db, sizeof(pInfo->req.db), "%d.%s", pInfo->accountId, dbName)); } } else if (strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0) { diff --git a/source/libs/nodes/src/nodesCodeFuncs.c b/source/libs/nodes/src/nodesCodeFuncs.c index c2290b9eac..6d4d89607f 100644 --- a/source/libs/nodes/src/nodesCodeFuncs.c +++ b/source/libs/nodes/src/nodesCodeFuncs.c @@ -292,8 +292,6 @@ const char* nodesNodeName(ENodeType type) { return "ShowCompactsStmt"; case QUERY_NODE_SHOW_COMPACT_DETAILS_STMT: return "ShowCompactDetailsStmt"; - case QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT: - return "ShowTransactionDetailsStmt"; case QUERY_NODE_SHOW_GRANTS_FULL_STMT: return "ShowGrantsFullStmt"; case QUERY_NODE_SHOW_GRANTS_LOGS_STMT: diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c index 5bfc35aa9c..7beaeaa46c 100644 --- a/source/libs/nodes/src/nodesUtilFuncs.c +++ b/source/libs/nodes/src/nodesUtilFuncs.c @@ -714,9 +714,6 @@ int32_t nodesMakeNode(ENodeType type, SNode** ppNodeOut) { break; case QUERY_NODE_SHOW_COMPACT_DETAILS_STMT: code = makeNode(type, sizeof(SShowCompactDetailsStmt), &pNode); - break; - case QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT: - code = makeNode(type, sizeof(SShowTransactionDetailsStmt), &pNode); break; case QUERY_NODE_KILL_QUERY_STMT: code = makeNode(type, sizeof(SKillQueryStmt), &pNode); @@ -1565,11 +1562,6 @@ void nodesDestroyNode(SNode* pNode) { nodesDestroyNode(pStmt->pCompactId); break; } - case QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT: { - SShowTransactionDetailsStmt* pStmt = (SShowTransactionDetailsStmt*)pNode; - nodesDestroyNode(pStmt->pTransactionId); - break; - } case QUERY_NODE_SHOW_CREATE_DATABASE_STMT: taosMemoryFreeClear(((SShowCreateDatabaseStmt*)pNode)->pCfg); break; diff --git a/source/libs/parser/inc/parAst.h b/source/libs/parser/inc/parAst.h index 8b2a98baf2..e69a3da4a9 100644 --- a/source/libs/parser/inc/parAst.h +++ b/source/libs/parser/inc/parAst.h @@ -320,7 +320,6 @@ SNode* createCreateViewStmt(SAstCreateContext* pCxt, bool orReplace, SNode* pVie SNode* createDropViewStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SNode* pView); SNode* createShowCompactDetailsStmt(SAstCreateContext* pCxt, SNode* pCompactIdNode); SNode* createShowCompactsStmt(SAstCreateContext* pCxt, ENodeType type); -SNode* createShowTransactionDetailsStmt(SAstCreateContext* pCxt, SNode* pTransactionIdNode); SNode* createCreateTSMAStmt(SAstCreateContext* pCxt, bool ignoreExists, SToken* tsmaName, SNode* pOptions, SNode* pRealTable, SNode* pInterval); diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 38e93a7ce3..63eb09d509 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -594,7 +594,6 @@ cmd ::= SHOW BNODES. cmd ::= SHOW SNODES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SNODES_STMT); } cmd ::= SHOW CLUSTER. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CLUSTER_STMT); } cmd ::= SHOW TRANSACTIONS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TRANSACTIONS_STMT); } -cmd ::= SHOW TRANSACTION NK_INTEGER(A). { pCxt->pRootNode = createShowTransactionDetailsStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &A)); } cmd ::= SHOW TABLE DISTRIBUTED full_table_name(A). { pCxt->pRootNode = createShowTableDistributedStmt(pCxt, A); } cmd ::= SHOW CONSUMERS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONSUMERS_STMT); } cmd ::= SHOW SUBSCRIPTIONS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT); } diff --git a/source/libs/parser/src/parAstCreater.c b/source/libs/parser/src/parAstCreater.c index 5fc5f5fafe..fa656667af 100644 --- a/source/libs/parser/src/parAstCreater.c +++ b/source/libs/parser/src/parAstCreater.c @@ -2931,18 +2931,6 @@ _err: return NULL; } -SNode* createShowTransactionDetailsStmt(SAstCreateContext* pCxt, SNode* pTransactionIdNode) { - CHECK_PARSER_STATUS(pCxt); - SShowTransactionDetailsStmt* pStmt = NULL; - pCxt->errCode = nodesMakeNode(QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT, (SNode**)&pStmt); - CHECK_MAKE_NODE(pStmt); - pStmt->pTransactionId = pTransactionIdNode; - return (SNode*)pStmt; -_err: - nodesDestroyNode(pTransactionIdNode); - return NULL; -} - static int32_t getIpV4RangeFromWhitelistItem(char* ipRange, SIpV4Range* pIpRange) { int32_t code = TSDB_CODE_SUCCESS; char* ipCopy = taosStrdup(ipRange); diff --git a/source/libs/parser/src/parAstParser.c b/source/libs/parser/src/parAstParser.c index e876575f48..1687916cb0 100644 --- a/source/libs/parser/src/parAstParser.c +++ b/source/libs/parser/src/parAstParser.c @@ -770,12 +770,6 @@ static int32_t collectMetaKeyFromShowCompactDetails(SCollectMetaKeyCxt* pCxt, SS return code; } -static int32_t collectMetaKeyFromShowTransactionDetails(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) { - int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, - TSDB_INS_TABLE_TRANSACTION_DETAILS, pCxt->pMetaCache); - return code; -} - static int32_t collectMetaKeyFromShowGrantsFull(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) { return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_GRANTS_FULL, pCxt->pMetaCache); @@ -1100,8 +1094,6 @@ static int32_t collectMetaKeyFromQuery(SCollectMetaKeyCxt* pCxt, SNode* pStmt) { return collectMetaKeyFromShowCompacts(pCxt, (SShowStmt*)pStmt); case QUERY_NODE_SHOW_COMPACT_DETAILS_STMT: return collectMetaKeyFromShowCompactDetails(pCxt, (SShowStmt*)pStmt); - case QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT: - return collectMetaKeyFromShowTransactionDetails(pCxt, (SShowStmt*)pStmt); case QUERY_NODE_SHOW_GRANTS_FULL_STMT: return collectMetaKeyFromShowGrantsFull(pCxt, (SShowStmt*)pStmt); case QUERY_NODE_SHOW_GRANTS_LOGS_STMT: diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 8f3cbd6f8b..9f411c4296 100755 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -371,40 +371,12 @@ static const SSysTableShowAdapter sysTableShowAdapter[] = { .pShowCols = {"*"} }, { - .showType = QUERY_NODE_CREATE_TSMA_STMT, - .pDbName = "", - .pTableName = "", - .numOfShowCols = 1, - .pShowCols = {"*"} - }, - { - .showType = QUERY_NODE_SHOW_CREATE_TSMA_STMT, - .pDbName = "", - .pTableName = "", - .numOfShowCols = 1, - .pShowCols = {"*"} - }, - { - .showType = QUERY_NODE_DROP_TSMA_STMT, - .pDbName = "", - .pTableName = "", - .numOfShowCols = 1, - .pShowCols = {"*"} - }, - { .showType = QUERY_NODE_SHOW_FILESETS_STMT, .pDbName = TSDB_INFORMATION_SCHEMA_DB, .pTableName = TSDB_INS_TABLE_FILESETS, .numOfShowCols = 1, .pShowCols = {"*"} - }, - { - .showType = QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT, - .pDbName = TSDB_INFORMATION_SCHEMA_DB, - .pTableName = TSDB_INS_TABLE_TRANSACTION_DETAILS, - .numOfShowCols = 1, - .pShowCols = {"*"} - }, + }, }; // clang-format on @@ -16387,24 +16359,6 @@ static int32_t rewriteShowCompactDetailsStmt(STranslateContext* pCxt, SQuery* pQ return code; } -static int32_t rewriteShowTransactionDetailsStmt(STranslateContext* pCxt, SQuery* pQuery) { - SShowTransactionDetailsStmt* pShow = (SShowTransactionDetailsStmt*)(pQuery->pRoot); - SSelectStmt* pStmt = NULL; - int32_t code = createSelectStmtForShow(QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT, &pStmt); - if (TSDB_CODE_SUCCESS == code) { - if (NULL != pShow->pTransactionId) { - code = createOperatorNode(OP_TYPE_EQUAL, "transaction_id", pShow->pTransactionId, &pStmt->pWhere); - } - } - if (TSDB_CODE_SUCCESS == code) { - pCxt->showRewrite = true; - pQuery->showRewrite = true; - nodesDestroyNode(pQuery->pRoot); - pQuery->pRoot = (SNode*)pStmt; - } - return code; -} - static int32_t createParWhenThenNode(SNode* pWhen, SNode* pThen, SNode** ppResWhenThen) { SWhenThenNode* pWThen = NULL; int32_t code = nodesMakeNode(QUERY_NODE_WHEN_THEN, (SNode**)&pWThen); @@ -16980,9 +16934,6 @@ static int32_t rewriteQuery(STranslateContext* pCxt, SQuery* pQuery) { case QUERY_NODE_SHOW_COMPACT_DETAILS_STMT: code = rewriteShowCompactDetailsStmt(pCxt, pQuery); break; - case QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT: - code = rewriteShowTransactionDetailsStmt(pCxt, pQuery); - break; case QUERY_NODE_SHOW_DB_ALIVE_STMT: case QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT: code = rewriteShowAliveStmt(pCxt, pQuery); diff --git a/source/util/src/terror.c b/source/util/src/terror.c index feed297f71..b2a8c422f7 100644 --- a/source/util/src/terror.c +++ b/source/util/src/terror.c @@ -326,7 +326,6 @@ TAOS_DEFINE_ERROR(TSDB_CODE_MND_TRANS_SYNC_TIMEOUT, "Sync timeout While ex TAOS_DEFINE_ERROR(TSDB_CODE_MND_TRANS_CTX_SWITCH, "Wrong transaction execution context") TAOS_DEFINE_ERROR(TSDB_CODE_MND_TRANS_CONFLICT_COMPACT, "Transaction not completed due to conflict with compact") TAOS_DEFINE_ERROR(TSDB_CODE_MND_TRANS_UNKNOW_ERROR, "Unknown transaction error") -TAOS_DEFINE_ERROR(TSDB_CODE_MND_TRANS_NOT_ABLE_TO_kILLED, "The transaction is not able to be killed") // mnode-mq TAOS_DEFINE_ERROR(TSDB_CODE_MND_TOPIC_ALREADY_EXIST, "Topic already exists") diff --git a/tests/develop-test/2-query/table_count_scan.py b/tests/develop-test/2-query/table_count_scan.py index b5c6140481..9725c36bee 100644 --- a/tests/develop-test/2-query/table_count_scan.py +++ b/tests/develop-test/2-query/table_count_scan.py @@ -68,7 +68,7 @@ class TDTestCase: for i in range(0, 3): db_name = tdSql.getData(i, 1) if db_name == 'information_schema': - tdSql.checkData(i, 0, 37) + tdSql.checkData(i, 0, 36) tdSql.checkData(i, 2, None) elif db_name == 'performance_schema': tdSql.checkData(i, 0, 5) @@ -81,7 +81,7 @@ class TDTestCase: tdSql.query('select count(1) v,db_name, stable_name from information_schema.ins_tables group by db_name, stable_name order by v desc;') tdSql.checkRows(3) - tdSql.checkData(0, 0, 37) + tdSql.checkData(0, 0, 36) tdSql.checkData(0, 1, 'information_schema') tdSql.checkData(0, 2, None) tdSql.checkData(1, 0, 5) @@ -97,7 +97,7 @@ class TDTestCase: tdSql.checkData(1, 1, 'performance_schema') tdSql.checkData(0, 0, 3) tdSql.checkData(0, 1, 'tbl_count') - tdSql.checkData(2, 0, 37) + tdSql.checkData(2, 0, 36) tdSql.checkData(2, 1, 'information_schema') tdSql.query("select count(*) from information_schema.ins_tables where db_name='tbl_count'") @@ -110,7 +110,7 @@ class TDTestCase: tdSql.query('select count(*) from information_schema.ins_tables') tdSql.checkRows(1) - tdSql.checkData(0, 0, 45) + tdSql.checkData(0, 0, 44) tdSql.execute('create table stba (ts timestamp, c1 bool, c2 tinyint, c3 smallint, c4 int, c5 bigint, c6 float, c7 double, c8 binary(10), c9 nchar(10), c10 tinyint unsigned, c11 smallint unsigned, c12 int unsigned, c13 bigint unsigned) TAGS(t1 int, t2 binary(10), t3 double);') @@ -193,7 +193,7 @@ class TDTestCase: tdSql.checkData(2, 0, 5) tdSql.checkData(2, 1, 'performance_schema') tdSql.checkData(2, 2, None) - tdSql.checkData(3, 0, 37) + tdSql.checkData(3, 0, 36) tdSql.checkData(3, 1, 'information_schema') tdSql.checkData(3, 2, None) @@ -208,7 +208,7 @@ class TDTestCase: tdSql.checkData(2, 0, 5) tdSql.checkData(2, 1, 'performance_schema') tdSql.checkData(2, 2, None) - tdSql.checkData(3, 0, 37) + tdSql.checkData(3, 0, 36) tdSql.checkData(3, 1, 'information_schema') tdSql.checkData(3, 2, None) @@ -219,7 +219,7 @@ class TDTestCase: tdSql.checkData(0, 1, 'tbl_count') tdSql.checkData(1, 0, 5) tdSql.checkData(1, 1, 'performance_schema') - tdSql.checkData(2, 0, 37) + tdSql.checkData(2, 0, 36) tdSql.checkData(2, 1, 'information_schema') tdSql.query("select count(*) from information_schema.ins_tables where db_name='tbl_count'") @@ -232,7 +232,7 @@ class TDTestCase: tdSql.query('select count(*) from information_schema.ins_tables') tdSql.checkRows(1) - tdSql.checkData(0, 0, 46) + tdSql.checkData(0, 0, 45) tdSql.execute('drop database tbl_count') diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index 38dd080ef5..ed73a2742c 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -408,9 +408,6 @@ ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/test_hot_refresh_configurations.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/subscribe_stream_privilege.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/empty_identifier.py -,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/show_transaction_detail.py -N 3 -# ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/kill_balance_leader.py -N 3 -# ,,y,system-test,./pytest.sh python3 ./test.py -f 3-enterprise/restore/kill_restore_dnode.py -N 5 ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/persisit_config.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/qmemCtrl.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/compact_vgroups.py diff --git a/tests/script/tsim/query/sys_tbname.sim b/tests/script/tsim/query/sys_tbname.sim index c6c979e97c..f8c1d6a986 100644 --- a/tests/script/tsim/query/sys_tbname.sim +++ b/tests/script/tsim/query/sys_tbname.sim @@ -58,7 +58,7 @@ endi sql select tbname from information_schema.ins_tables; print $rows $data00 -if $rows != 46 then +if $rows != 45 then return -1 endi if $data00 != @ins_tables@ then diff --git a/tests/script/tsim/query/tableCount.sim b/tests/script/tsim/query/tableCount.sim index 19568b42b6..49e9126361 100644 --- a/tests/script/tsim/query/tableCount.sim +++ b/tests/script/tsim/query/tableCount.sim @@ -53,7 +53,7 @@ sql select stable_name,count(table_name) from information_schema.ins_tables grou if $rows != 3 then return -1 endi -if $data01 != 43 then +if $data01 != 42 then return -1 endi if $data11 != 10 then @@ -72,7 +72,7 @@ endi if $data11 != 5 then return -1 endi -if $data21 != 37 then +if $data21 != 36 then return -1 endi if $data31 != 5 then @@ -97,7 +97,7 @@ endi if $data42 != 3 then return -1 endi -if $data52 != 37 then +if $data52 != 36 then return -1 endi if $data62 != 5 then diff --git a/tests/system-test/0-others/information_schema.py b/tests/system-test/0-others/information_schema.py index 8c25b70b76..af0dd6d949 100644 --- a/tests/system-test/0-others/information_schema.py +++ b/tests/system-test/0-others/information_schema.py @@ -61,7 +61,7 @@ class TDTestCase: self.ins_list = ['ins_dnodes','ins_mnodes','ins_qnodes','ins_snodes','ins_cluster','ins_databases','ins_functions',\ 'ins_indexes','ins_stables','ins_tables','ins_tags','ins_columns','ins_users','ins_grants','ins_vgroups','ins_configs','ins_dnode_variables',\ 'ins_topics','ins_subscriptions','ins_streams','ins_stream_tasks','ins_vnodes','ins_user_privileges','ins_views', - 'ins_compacts', 'ins_compact_details', 'ins_grants_full','ins_grants_logs', 'ins_machines', 'ins_arbgroups', 'ins_tsmas', "ins_encryptions", "ins_anodes", "ins_anodes_full", "ins_disk_usagea", "ins_filesets", "ins_transaction_details"] + 'ins_compacts', 'ins_compact_details', 'ins_grants_full','ins_grants_logs', 'ins_machines', 'ins_arbgroups', 'ins_tsmas', "ins_encryptions", "ins_anodes", "ins_anodes_full", "ins_disk_usagea", "ins_filesets"] self.perf_list = ['perf_connections','perf_queries','perf_consumers','perf_trans','perf_apps'] def insert_data(self,column_dict,tbname,row_num): insert_sql = self.setsql.set_insertsql(column_dict,tbname,self.binary_str,self.nchar_str) @@ -222,10 +222,10 @@ class TDTestCase: tdSql.query("select * from information_schema.ins_columns where db_name ='information_schema'") tdLog.info(len(tdSql.queryResult)) - tdSql.checkEqual(True, len(tdSql.queryResult) in range(309, 310)) + tdSql.checkEqual(True, len(tdSql.queryResult) in range(303, 304)) tdSql.query("select * from information_schema.ins_columns where db_name ='performance_schema'") - tdSql.checkEqual(61, len(tdSql.queryResult)) + tdSql.checkEqual(60, len(tdSql.queryResult)) def ins_dnodes_check(self): tdSql.execute('drop database if exists db2') diff --git a/tests/system-test/0-others/kill_balance_leader.py b/tests/system-test/0-others/kill_balance_leader.py deleted file mode 100644 index be86336661..0000000000 --- a/tests/system-test/0-others/kill_balance_leader.py +++ /dev/null @@ -1,64 +0,0 @@ -################################################################### -# Copyright (c) 2016 by TAOS Technologies, Inc. -# All rights reserved. -# -# This file is proprietary and confidential to TAOS Technologies. -# No part of this file may be reproduced, stored, transmitted, -# disclosed or used in any form or by any means other than as -# expressly provided by the written permission from Jianhui Tao -# -################################################################### - -# -*- coding: utf-8 -*- -from util.log import * -from util.cases import * -from util.dnodes import * -from util.sql import * - - - -class TDTestCase: - def init(self, conn, logSql, replicaVar=1): - tdLog.debug(f"start to init {__file__}") - self.replicaVar = int(replicaVar) - tdSql.init(conn.cursor(), logSql) - - def stop(self): - tdSql.close() - tdLog.success(f"{__file__} successfully executed") - - def run(self): - tdLog.debug(f"start to excute {__file__}") - - tdSql.execute('CREATE DATABASE db vgroups 160 replica 3;') - - tdSql.execute('balance vgroup leader') - - sql ="show transactions;" - rows = tdSql.query(sql) - - if rows > 0: - tranId = tdSql.getData(0, 0) - tdLog.info('kill transaction %d'%tranId) - tdSql.execute('kill transaction %d'%tranId, queryTimes=1 ) - - if self.waitTransactionZero() is False: - tdLog.exit(f"{sql} transaction not finished") - return False - - def waitTransactionZero(self, seconds = 300, interval = 1): - # wait end - for i in range(seconds): - sql ="show transactions;" - rows = tdSql.query(sql) - if rows == 0: - tdLog.info("transaction count became zero.") - return True - #tdLog.info(f"i={i} wait ...") - time.sleep(interval) - - return False - - -tdCases.addLinux(__file__, TDTestCase()) -tdCases.addWindows(__file__, TDTestCase()) \ No newline at end of file diff --git a/tests/system-test/0-others/show_transaction_detail.py b/tests/system-test/0-others/show_transaction_detail.py deleted file mode 100644 index ba588f8f01..0000000000 --- a/tests/system-test/0-others/show_transaction_detail.py +++ /dev/null @@ -1,115 +0,0 @@ -################################################################### -# Copyright (c) 2016 by TAOS Technologies, Inc. -# All rights reserved. -# -# This file is proprietary and confidential to TAOS Technologies. -# No part of this file may be reproduced, stored, transmitted, -# disclosed or used in any form or by any means other than as -# expressly provided by the written permission from Jianhui Tao -# -################################################################### - -# -*- coding: utf-8 -*- -from util.log import * -from util.cases import * -from util.dnodes import * -from util.sql import * -from util.cluster import * -import threading - -class TDTestCase: - def init(self, conn, logSql, replicaVar=1): - tdLog.debug(f"start to init {__file__}") - self.replicaVar = int(replicaVar) - tdSql.init(conn.cursor(), logSql) - self.dnodes = cluster.dnodes - - def stop(self): - tdSql.close() - tdLog.success(f"{__file__} successfully executed") - - def run(self): - tdLog.debug(f"start to excute {__file__}") - - tdLog.info("CREATE DATABASE db1 vgroups 16 replica 1;") - tdSql.execute('CREATE DATABASE db1 vgroups 16 replica 1;') - - if self.waitTransactionZero() is False: - tdLog.exit(f"{sql} transaction not finished") - return False - - newTdSql1=tdCom.newTdSql() - t1 = threading.Thread(target=self.alterDbThread, args=('', newTdSql1)) - - newTdSql2=tdCom.newTdSql() - t2 = threading.Thread(target=self.createDbThread, args=('', newTdSql2)) - - t1.start() - t2.start() - - #time.sleep(1) - - dnode = self.dnodes[2] - - # stop dnode - tdLog.info(f"stop dnode 2") - dnode.stoptaosd() - - tdLog.info(f"show transactions;") - rows = tdSql.query("show transactions;", queryTimes=1) - tdLog.info(f"rows={rows}") - if rows > 0: - tranId1 = tdSql.getData(0, 0) - oper1 = tdSql.getData(0, 3) - tdLog.info(f"show transaction {tranId1}, {oper1}") - - #tranId2 = tdSql.getData(1, 0) - #oper2 = tdSql.getData(1, 3) - #tdLog.info(f"show transaction {tranId2}, {oper2}") - - rows = tdSql.query(f"show transaction {tranId1}", queryTimes=1) - if rows != 120 and rows != 176: - tdLog.exit(f"show transaction detial error, rows={rows}") - return False - - #rows = tdSql.query(f"show transaction {tranId2}", queryTimes=1) - #if rows != 176 and rows != 120: - # tdLog.exit(f"show transaction detial error, rows={rows}") - # return False - - tdLog.info(f"select * from ins_transaction_details") - rows = tdSql.query(f"select * from information_schema.ins_transaction_details", queryTimes=1) - - #if rows != 296: - if rows != 176: - tdLog.exit(f"show transaction detial error, rows={rows}") - return False - - dnode.starttaosd() - - t1.join() - t2.join() - - def createDbThread(self, sql, newTdSql): - tdLog.info("CREATE DATABASE db2 vgroups 40 replica 3;") - newTdSql.execute('CREATE DATABASE db2 vgroups 40 replica 3;', queryTimes=1) - - def alterDbThread(self, sql, newTdSql): - tdLog.info("alter DATABASE db1 replica 3;") - newTdSql.execute('alter DATABASE db1 replica 3;', queryTimes=1) - - def waitTransactionZero(self, seconds = 300, interval = 1): - # wait end - for i in range(seconds): - sql ="show transactions;" - rows = tdSql.query(sql) - if rows == 0: - tdLog.info("transaction count became zero.") - return True - #tdLog.info(f"i={i} wait ...") - time.sleep(interval) - - return False - -tdCases.addLinux(__file__, TDTestCase()) -tdCases.addWindows(__file__, TDTestCase()) \ No newline at end of file diff --git a/tests/system-test/2-query/union.py b/tests/system-test/2-query/union.py index 1abe2b1a65..380b7879c4 100644 --- a/tests/system-test/2-query/union.py +++ b/tests/system-test/2-query/union.py @@ -441,7 +441,7 @@ class TDTestCase: tdSql.checkRows(2) sql = "select db_name `TABLE_CAT`, '' `TABLE_SCHEM`, stable_name `TABLE_NAME`, 'TABLE' `TABLE_TYPE`, table_comment `REMARKS` from information_schema.ins_stables union all select db_name `TABLE_CAT`, '' `TABLE_SCHEM`, table_name `TABLE_NAME`, case when `type`='SYSTEM_TABLE' then 'TABLE' when `type`='NORMAL_TABLE' then 'TABLE' when `type`='CHILD_TABLE' then 'TABLE' else 'UNKNOWN' end `TABLE_TYPE`, table_comment `REMARKS` from information_schema.ins_tables union all select db_name `TABLE_CAT`, '' `TABLE_SCHEM`, view_name `TABLE_NAME`, 'VIEW' `TABLE_TYPE`, NULL `REMARKS` from information_schema.ins_views" tdSql.query(sql, queryTimes=1) - tdSql.checkRows(50) + tdSql.checkRows(49) sql = "select null union select null" tdSql.query(sql, queryTimes=1) diff --git a/tests/system-test/3-enterprise/restore/kill_restore_dnode.py b/tests/system-test/3-enterprise/restore/kill_restore_dnode.py deleted file mode 100644 index d29a11f159..0000000000 --- a/tests/system-test/3-enterprise/restore/kill_restore_dnode.py +++ /dev/null @@ -1,90 +0,0 @@ -################################################################### -# Copyright (c) 2016 by TAOS Technologies, Inc. -# All rights reserved. -# -# This file is proprietary and confidential to TAOS Technologies. -# No part of this file may be reproduced, stored, transmitted, -# disclosed or used in any form or by any means other than as -# expressly provided by the written permission from Jianhui Tao -# -################################################################### - -# -*- coding: utf-8 -*- - -import sys - -from util.log import * -from util.cases import * -from util.sql import * -from util.common import * -sys.path.append("./3-enterprise/restore") -from restoreBasic import * -from util.common import tdCom -import threading - - -class TDTestCase: - # init - def init(self, conn, logSql, replicaVar=1): - tdLog.debug("start to execute %s" % __file__) - self.basic = RestoreBasic() - self.basic.init(conn, logSql, replicaVar) - - # run - def run(self): - self.basic.restore_dnode_prepare(2) - - self.execute() - - def execute(self): - newTdSql=tdCom.newTdSql() - t0 = threading.Thread(target=self.restoreDnodeThread, args=('', newTdSql)) - t0.start() - - time.sleep(2) - sql ="show transactions;" - tdLog.info(sql) - rows = tdSql.query(sql) - - if rows > 0: - self.basic.stop_dnode(2) - - tranId = tdSql.getData(0, 0) - - tdLog.info('show transaction %d'%tranId) - rows=tdSql.query('show transaction %d'%tranId, queryTimes=1) - if rows != 11: - tdLog.exit(f"restore transaction detial error, rows={rows}") - return False - - tdLog.info('kill transaction %d'%tranId) - tdSql.execute('kill transaction %d'%tranId, queryTimes=1 ) - - time.sleep(3) - sql ="show transactions;" - tdLog.info(sql) - rows = tdSql.query(sql) - if rows > 0: - tdLog.info(f"{sql} transaction not finished") - return False - - self.basic.restore_dnode_exec(2) - else: - tdLog.exit(f"{sql} no transaction exist") - return False - - def restoreDnodeThread(self, p, newTdSql): - sleep(1) - - sql = f"restore dnode 2" - tdLog.info(sql) - newTdSql.error(sql, expectErrInfo="Wrong transaction execution context") - tdLog.info(f"{sql} finished") - - # stop - def stop(self): - self.basic.stop() - tdLog.success("%s successfully executed" % __file__) - -tdCases.addWindows(__file__, TDTestCase()) -tdCases.addLinux(__file__, TDTestCase()) \ No newline at end of file diff --git a/tests/system-test/3-enterprise/restore/restoreBasic.py b/tests/system-test/3-enterprise/restore/restoreBasic.py index 74cf572018..77fa606b9c 100644 --- a/tests/system-test/3-enterprise/restore/restoreBasic.py +++ b/tests/system-test/3-enterprise/restore/restoreBasic.py @@ -143,34 +143,6 @@ class RestoreBasic: tdSql.execute(sql) self.check_corrent() - def restore_dnode_prepare(self, index): - tdLog.info(f"start restore dnode {index}") - dnode = self.dnodes[index - 1] - - # stop dnode - tdLog.info(f"stop dnode {index}") - dnode.stoptaosd() - - # remove dnode folder - try: - shutil.rmtree(dnode.dataDir) - tdLog.info(f"delete dir {dnode.dataDir} successful") - except OSError as x: - tdLog.exit(f"remove path {dnode.dataDir} error : {x.strerror}") - - dnode.starttaosd() - - def restore_dnode_exec(self, index): - # exec restore - sql = f"restore dnode {index}" - tdLog.info(sql) - tdSql.execute(sql) - self.check_corrent() - - def stop_dnode(self, index): - dnode = self.dnodes[index - 1] - - dnode.starttaosd() # restore vnode def restore_vnode(self, index): tdLog.info(f"start restore vnode on dnode {index}") From 938f6a5fa05068277db223a7b6b26b881367f5d3 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Fri, 27 Dec 2024 22:28:18 +0800 Subject: [PATCH 84/84] git: set tags --- cmake/taosadapter_CMakeLists.txt.in | 2 +- cmake/taostools_CMakeLists.txt.in | 2 +- cmake/taosws_CMakeLists.txt.in | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/taosadapter_CMakeLists.txt.in b/cmake/taosadapter_CMakeLists.txt.in index ef6ed4af1d..13826a1a74 100644 --- a/cmake/taosadapter_CMakeLists.txt.in +++ b/cmake/taosadapter_CMakeLists.txt.in @@ -2,7 +2,7 @@ # taosadapter ExternalProject_Add(taosadapter GIT_REPOSITORY https://github.com/taosdata/taosadapter.git - GIT_TAG 3.0 + GIT_TAG main SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosadapter" BINARY_DIR "" #BUILD_IN_SOURCE TRUE diff --git a/cmake/taostools_CMakeLists.txt.in b/cmake/taostools_CMakeLists.txt.in index 9a6a5329ae..9bbda8309f 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 3.0 + GIT_TAG main SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools" BINARY_DIR "" #BUILD_IN_SOURCE TRUE diff --git a/cmake/taosws_CMakeLists.txt.in b/cmake/taosws_CMakeLists.txt.in index 17446d184d..b013d45911 100644 --- a/cmake/taosws_CMakeLists.txt.in +++ b/cmake/taosws_CMakeLists.txt.in @@ -2,7 +2,7 @@ # taosws-rs ExternalProject_Add(taosws-rs GIT_REPOSITORY https://github.com/taosdata/taos-connector-rust.git - GIT_TAG 3.0 + GIT_TAG main SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosws-rs" BINARY_DIR "" #BUILD_IN_SOURCE TRUE

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ⓈY$R2# zo)AF-$M9zXVZ3gb#tSpT`G1Bq5(LZ!PS{Z1{+gQ|!x?l=)KiHJgi5%JsYOk&`kU%guA9Cv{6|iCQFAqJ!L4>ri1QyC!S5DZ*n{ zH`@cqC{7OHC%i`X)CYWZ+nytdONa$;Tri2`rt;WV=c!UGSR2!YH_AMFP(6W?=2`t8 z!sR3H)uis(a~Jz z)0{1G`e2wXZT<;HrpmVPf^l7zkjz2%DN?)>9_t-LB{v+R$Tf-%@z1b%l<+3n3)g2mFXSk6Ci zo_pZtQhQJOn<1Qg&M#3Jce?g`l%t35Nur9g%nRZ1qUfWiPrkTqaXz_v89Y{zy3@My zqDf+9uq?Fx-IpqF%ul0x~w#aV3G;~AUj5FCvJySGj_M&Y?HlHL%1JMP~^Vo8s|ztUsNwk z`f+cK6Vx1~9Wk)0KWb+rLR0Bji6PkLsi)hjbTi#Gv9R#7*J6E4gn#LNFdI;Jd9s$r z8{jQ@T4g#GKC-jwC#=3dp>@>E-cKMLBmuXTYy2KSsMrL{Pndq+Bz)ugYm*_59c`R< zOS=X5#My$D2uz*BT|Qu1F0>Kprv@# z9E%<+uzCC}pc&o3|0L_OQF!ic_D0AZ5^91fG#CrhrcaLI{W5l%0?uGsSDyV0-jHpr z>i16cQTBF@*$!8Sx^6*{_D9W;Qjc8W$J6`mW<`t&cL5aC1lBRw72aK_P>`=mV!B>V+E9(|Zgn&=C_nuVoDApYx9lbe5Ccm<8v!1#^(31#2 z+;*4b1|2KDV@O=g&iJ6wy#`p&xF=H@8i|$&l+&sb=w(|B0ueLRu;B{*y@CXEr+bB9 z(tVq_O8KVoqEG#Z0CijPz4gZ_xz#dWY*vN3`{lJotL~A$w}kV@WaQVQJ}Ls;&b{Pr zd#z9|t0?jy9wq#f=a?sg|2V_H zw7ZdvdxTk4-&f6uH%V0>)qK|B;f;Tugps9t@uFzE;);AIM2k==aj|E#BK?`^0MOTH$r(B7^q(%3e+LHsf^KB5sHPAEye zxp5KYl>rL>8Ed%u&kF}wbbelBB(Alpf&|~cwe9~&`pm+Q{KB5>-F-L648ZA5X!mRe zthIP?{?1?c&u5ZK>)dt^M6*ap!~Q4t;;-8e9|Mihm+PEpZ=e$?f6||TK;lgCh*AI7 zIDhwHjfNCBe(1xY{LPf|1Sm!O%`rmqM)D8H0pw3OU(5PurwN#oI~w{u8+nI)`uLm4 zp8=4c_jpha>qbi9-~yD|SyJJ;nfy`!`JJ|MGHwi-Bv bov9}{r0m$TvDdr>{E57ge4YPF`_umeNxb@b diff --git a/docs/zh/08-operation/pic/backup-02-form.png b/docs/zh/08-operation/pic/backup-02-form.png deleted file mode 100644 index 3ccd81c8314dd1801b0561b5501bd00b6dfc0572..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56704 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 b*ck^xImVa7pX}@$@lt)HrBwdFJmh}?kErG+ diff --git a/docs/zh/08-operation/pic/backup-04-view.png b/docs/zh/08-operation/pic/backup-04-view.png deleted file mode 100644 index 7bfa6999060b406f5c2e949b638f8d769bf22fd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108698 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 diff --git a/docs/zh/08-operation/pic/backup-05-edit.png b/docs/zh/08-operation/pic/backup-05-edit.png deleted file mode 100644 index 5ff1204ad5d2bf885e57d00cbb4d77c428666a03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104993 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%0An;-zq-|E>>U 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 diff --git a/docs/zh/08-operation/pic/backup-06-copy.png b/docs/zh/08-operation/pic/backup-06-copy.png deleted file mode 100644 index 2ec1ea68d0d591793d807ad7441a7d29212b08d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121583 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 diff --git a/docs/zh/08-operation/pic/backup-07-del.png b/docs/zh/08-operation/pic/backup-07-del.png deleted file mode 100644 index e1cf4748bfdc0bdb3b89248abf677684c8cbe157..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56800 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 bkzWKrY$hoRsRUPnf&Sh|DM;3e8wUSBrp`KE diff --git a/docs/zh/08-operation/pic/backup-08-files.png b/docs/zh/08-operation/pic/backup-08-files.png deleted file mode 100644 index 07f2184d4f6a53466120ac322592e583cd0f66b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51071 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