diff --git a/docs-cn/14-reference/03-connector/python.mdx b/docs-cn/14-reference/03-connector/python.mdx index 6608fb7bd21ab586216d82c1b137830576a1e432..828e0a4abb758a72c3a127be13dd89c4d86186f4 100644 --- a/docs-cn/14-reference/03-connector/python.mdx +++ b/docs-cn/14-reference/03-connector/python.mdx @@ -199,10 +199,9 @@ curl -u root:taosdata http://:/rest/sql -d "select server_version()" `connect()` 函数的所有参数都是可选的关键字参数。下面是连接参数的具体说明: -- `host`: 要连接的主机。默认是 localhost。 +- `url`: taosAdapter REST 服务的 URL。默认是 。 - `user`: TDenigne 用户名。默认是 root。 - `password`: TDeingine 用户密码。默认是 taosdata。 -- `port`: taosAdapter REST 服务监听端口。默认是 6041. - `timeout`: HTTP 请求超时时间。单位为秒。默认为 `socket._GLOBAL_DEFAULT_TIMEOUT`。 一般无需配置。 diff --git a/docs-cn/27-train-faq/01-faq.md b/docs-cn/27-train-faq/01-faq.md index f298d7e14dec682b58a76ce1d7f1c10970ab2738..5b57e345c892f60999ca3cf7478222b344d91a95 100644 --- a/docs-cn/27-train-faq/01-faq.md +++ b/docs-cn/27-train-faq/01-faq.md @@ -74,7 +74,7 @@ title: 常见问题及反馈 检查服务器侧 TCP 端口连接是否工作:`nc -l {port}` 检查客户端侧 TCP 端口连接是否工作:`nc {hostIP} {port}` - - Windows 系统请使用 PowerShell 命令 Net-TestConnection -ComputerName {fqdn} -Port {port} 检测服务段端口是否访问 + - Windows 系统请使用 PowerShell 命令 Test-NetConnection -ComputerName {fqdn} -Port {port} 检测服务段端口是否访问 10. 也可以使用 taos 程序内嵌的网络连通检测功能,来验证服务器和客户端之间指定的端口连接是否通畅(包括 TCP 和 UDP):[TDengine 内嵌网络检测工具使用指南](https://www.taosdata.com/blog/2020/09/08/1816.html)。 diff --git a/docs-en/14-reference/03-connector/python.mdx b/docs-en/14-reference/03-connector/python.mdx index 69eec2388d460754493d2b775f14ab4bbf129799..53e07d9660f57a6ce556b293d7871d225afef2b4 100644 --- a/docs-en/14-reference/03-connector/python.mdx +++ b/docs-en/14-reference/03-connector/python.mdx @@ -199,10 +199,10 @@ The `connect()` function returns a `taos.TaosConnection` instance. In client-sid All arguments to the `connect()` function are optional keyword arguments. The following are the connection parameters specified. +- - `url`: The URL of taosAdapter REST service. The default is . - `host`: The host to connect to. The default is localhost. - `user`: TDengine user name. The default is `root`. - `password`: TDengine user password. The default is `taosdata`. -- `port`: The port on which the taosAdapter REST service listens. Default is 6041. - `timeout`: HTTP request timeout in seconds. The default is `socket._GLOBAL_DEFAULT_TIMEOUT`. Usually, no configuration is needed. diff --git a/docs-examples/python/connect_rest_examples.py b/docs-examples/python/connect_rest_examples.py index 3303eb0e194ac28e9486ab153183c3b1f0b639f2..900ec1022ec81ac2db761d918d1ec11c9bb26852 100644 --- a/docs-examples/python/connect_rest_examples.py +++ b/docs-examples/python/connect_rest_examples.py @@ -1,10 +1,9 @@ # ANCHOR: connect from taosrest import connect, TaosRestConnection, TaosRestCursor -conn: TaosRestConnection = connect(host="localhost", +conn: TaosRestConnection = connect(url="http://localhost:6041", user="root", password="taosdata", - port=6041, timeout=30) # ANCHOR_END: connect diff --git a/docs-examples/python/rest_client_example.py b/docs-examples/python/rest_client_example.py index 46d33a1d795f8c8dbb0b830061d43ed4510046ba..59c629df95fdc7dcee8d764d061afeb360b51dfc 100644 --- a/docs-examples/python/rest_client_example.py +++ b/docs-examples/python/rest_client_example.py @@ -1,6 +1,6 @@ from taosrest import RestClient -client = RestClient("localhost", 6041, "root", "taosdata") +client = RestClient("http://localhost:6041", user="root", password="taosdata") res: dict = client.sql("SELECT ts, current FROM power.meters LIMIT 1") print(res) diff --git a/include/common/tdatablock.h b/include/common/tdatablock.h index 8d69bb6c701f24e71d645f358e75168d3f89b356..ab76cb404afa3480e7bb2cab15b40dfe8b2df8af 100644 --- a/include/common/tdatablock.h +++ b/include/common/tdatablock.h @@ -71,7 +71,7 @@ SEpSet getEpSet_s(SCorEpSet* pEpSet); #define colDataGetData(p1_, r_) \ ((IS_VAR_DATA_TYPE((p1_)->info.type)) ? colDataGetVarData(p1_, r_) : colDataGetNumData(p1_, r_)) -#define IS_JSON_NULL(type,data) ((type) == TSDB_DATA_TYPE_JSON && *(data) == TSDB_DATA_TYPE_NULL) +#define IS_JSON_NULL(type, data) ((type) == TSDB_DATA_TYPE_JSON && *(data) == TSDB_DATA_TYPE_NULL) static FORCE_INLINE bool colDataIsNull_s(const SColumnInfoData* pColumnInfoData, uint32_t row) { if (!pColumnInfoData->hasNull) { @@ -180,7 +180,7 @@ static FORCE_INLINE void colDataAppendDouble(SColumnInfoData* pColumnInfoData, u *(double*)p = *(double*)v; } -int32_t getJsonValueLen(const char *data); +int32_t getJsonValueLen(const char* data); int32_t colDataAppend(SColumnInfoData* pColumnInfoData, uint32_t currentRow, const char* pData, bool isNull); int32_t colDataMergeCol(SColumnInfoData* pColumnInfoData, uint32_t numOfRow1, int32_t* capacity, @@ -223,7 +223,8 @@ int32_t blockDataTrimFirstNRows(SSDataBlock* pBlock, size_t n); SSDataBlock* createOneDataBlock(const SSDataBlock* pDataBlock, bool copyData); -void blockCompressEncode(const SSDataBlock* pBlock, char* data, int32_t* dataLen, int32_t numOfCols, int8_t needCompress); +void blockCompressEncode(const SSDataBlock* pBlock, char* data, int32_t* dataLen, int32_t numOfCols, + int8_t needCompress); const char* blockCompressDecode(SSDataBlock* pBlock, int32_t numOfCols, int32_t numOfRows, const char* pData); void blockDebugShowData(const SArray* dataBlocks, const char* flag); @@ -231,6 +232,8 @@ void blockDebugShowData(const SArray* dataBlocks, const char* flag); int32_t buildSubmitReqFromDataBlock(SSubmitReq** pReq, const SArray* pDataBlocks, STSchema* pTSchema, int32_t vgId, tb_uid_t suid); +char* buildCtbNameByGroupId(const char* stbName, uint64_t groupId); + SSubmitReq* tdBlockToSubmit(const SArray* pBlocks, const STSchema* pSchema, bool createTb, int64_t suid, const char* stbFullName, int32_t vgId); diff --git a/include/libs/stream/tstream.h b/include/libs/stream/tstream.h index db8d3ac033636adba4d4807897adea5b1e4bd1d5..3b825207feed863ea0bdf747ba56c1f0372ea35f 100644 --- a/include/libs/stream/tstream.h +++ b/include/libs/stream/tstream.h @@ -145,26 +145,6 @@ SStreamDataSubmit* streamSubmitRefClone(SStreamDataSubmit* pSubmit); #if 0 int32_t streamDataBlockEncode(void** buf, const SStreamDataBlock* pOutput); void* streamDataBlockDecode(const void* buf, SStreamDataBlock* pInput); - -static FORCE_INLINE int32_t streamEnqueue1(SStreamQueue* queue, SStreamQueueItem* pItem) { - int8_t inputStatus = atomic_load_8(&queue->enqueueStatus); - if (inputStatus == TASK_INPUT_STATUS__NORMAL) { - if (pItem->type == STREAM_INPUT__DATA_SUBMIT) { - SStreamDataSubmit* pSubmitClone = streamSubmitRefClone((SStreamDataSubmit*)pItem); - if (pSubmitClone == NULL) { - atomic_store_8(&queue->enqueueStatus, TASK_INPUT_STATUS__FAILED); - return -1; - } - taosWriteQitem(queue->queue, pSubmitClone); - } else if (pItem->type == STREAM_INPUT__DATA_BLOCK) { - taosWriteQitem(queue->queue, pItem); - } else if (pItem->type == STREAM_INPUT__CHECKPOINT) { - taosWriteQitem(queue->queue, pItem); - } - return 0; - } - return 0; -} #endif typedef struct { diff --git a/include/util/taoserror.h b/include/util/taoserror.h index 842c8a44e17abb55b1796cca5c7090cab89fbadc..450eb432802f5296bb30f97132417bdcbea2c624 100644 --- a/include/util/taoserror.h +++ b/include/util/taoserror.h @@ -185,7 +185,7 @@ int32_t* taosGetErrno(); #define TSDB_CODE_MND_BNODE_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0357) #define TSDB_CODE_MND_TOO_FEW_MNODES TAOS_DEF_ERROR_CODE(0, 0x0358) #define TSDB_CODE_MND_TOO_MANY_MNODES TAOS_DEF_ERROR_CODE(0, 0x0359) -#define TSDB_CODE_MND_CANT_DROP_MASTER TAOS_DEF_ERROR_CODE(0, 0x035A) +#define TSDB_CODE_MND_CANT_DROP_LEADER TAOS_DEF_ERROR_CODE(0, 0x035A) // mnode-acct #define TSDB_CODE_MND_ACCT_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0360) diff --git a/source/client/src/tmq.c b/source/client/src/tmq.c index c2170631c2c90ca1d7322a4210f7763c6a703c57..ef37eed284ccdd11b5b8a32451104327e73433c8 100644 --- a/source/client/src/tmq.c +++ b/source/client/src/tmq.c @@ -195,7 +195,7 @@ typedef struct { tmq_conf_t* tmq_conf_new() { tmq_conf_t* conf = taosMemoryCalloc(1, sizeof(tmq_conf_t)); - conf->withTbName = -1; + conf->withTbName = false; conf->autoCommit = true; conf->autoCommitInterval = 5000; conf->resetOffset = TMQ_CONF__RESET_OFFSET__EARLIEAST; @@ -256,13 +256,10 @@ tmq_conf_res_t tmq_conf_set(tmq_conf_t* conf, const char* key, const char* value if (strcmp(key, "msg.with.table.name") == 0) { if (strcmp(value, "true") == 0) { - conf->withTbName = 1; + conf->withTbName = true; return TMQ_CONF_OK; } else if (strcmp(value, "false") == 0) { - conf->withTbName = 0; - return TMQ_CONF_OK; - } else if (strcmp(value, "none") == 0) { - conf->withTbName = -1; + conf->withTbName = false; return TMQ_CONF_OK; } else { return TMQ_CONF_INVALID; diff --git a/source/common/src/tdatablock.c b/source/common/src/tdatablock.c index 3fc65aaff1bd2bff2af8fedd2d138428f94888f7..9caa9a73a5e803df67ae54b642e392a6e75ba075 100644 --- a/source/common/src/tdatablock.c +++ b/source/common/src/tdatablock.c @@ -18,6 +18,7 @@ #include "tcompare.h" #include "tglobal.h" #include "tlog.h" +#include "tname.h" int32_t taosGetFqdnPortFromEp(const char* ep, SEp* pEp) { pEp->port = 0; @@ -99,7 +100,7 @@ void colDataTrim(SColumnInfoData* pColumnInfoData) { // TODO } -int32_t getJsonValueLen(const char *data) { +int32_t getJsonValueLen(const char* data) { int32_t dataLen = 0; if (*data == TSDB_DATA_TYPE_NULL) { dataLen = CHAR_BYTES; @@ -109,7 +110,7 @@ int32_t getJsonValueLen(const char *data) { dataLen = DOUBLE_BYTES + CHAR_BYTES; } else if (*data == TSDB_DATA_TYPE_BOOL) { dataLen = CHAR_BYTES + CHAR_BYTES; - } else if (*data & TD_TAG_JSON) { // json string + } else if (*data & TD_TAG_JSON) { // json string dataLen = ((STag*)(data))->len; } else { ASSERT(0); @@ -137,7 +138,7 @@ int32_t colDataAppend(SColumnInfoData* pColumnInfoData, uint32_t currentRow, con int32_t dataLen = 0; if (type == TSDB_DATA_TYPE_JSON) { dataLen = getJsonValueLen(pData); - }else { + } else { dataLen = varDataTLen(pData); } @@ -1283,7 +1284,7 @@ static void doShiftBitmap(char* nullBitmap, size_t n, size_t total) { if (n % 8 == 0) { memmove(nullBitmap, nullBitmap + n / 8, newLen); } else { - int32_t tail = n % 8; + int32_t tail = n % 8; int32_t i = 0; uint8_t* p = (uint8_t*)nullBitmap; @@ -1301,7 +1302,7 @@ static void doShiftBitmap(char* nullBitmap, size_t n, size_t total) { } } else if (n > 8) { int32_t gap = len - newLen; - while(i < newLen) { + while (i < newLen) { uint8_t v = p[i + gap]; p[i] = (v << tail); @@ -1316,7 +1317,6 @@ static void doShiftBitmap(char* nullBitmap, size_t n, size_t total) { } } - static void colDataTrimFirstNRows(SColumnInfoData* pColInfoData, size_t n, size_t total) { if (IS_VAR_DATA_TYPE(pColInfoData->info.type)) { memmove(pColInfoData->varmeta.offset, &pColInfoData->varmeta.offset[n], (total - n) * sizeof(int32_t)); @@ -1544,7 +1544,8 @@ void blockDebugShowData(const SArray* dataBlocks, const char* flag) { * * TODO: colId should be set */ -int32_t buildSubmitReqFromDataBlock(SSubmitReq** pReq, const SArray* pDataBlocks, STSchema* pTSchema, int32_t vgId, tb_uid_t suid) { +int32_t buildSubmitReqFromDataBlock(SSubmitReq** pReq, const SArray* pDataBlocks, STSchema* pTSchema, int32_t vgId, + tb_uid_t suid) { int32_t sz = taosArrayGetSize(pDataBlocks); int32_t bufSize = sizeof(SSubmitReq); for (int32_t i = 0; i < sz; ++i) { @@ -1585,12 +1586,12 @@ int32_t buildSubmitReqFromDataBlock(SSubmitReq** pReq, const SArray* pDataBlocks int32_t dataLen = 0; for (int32_t j = 0; j < rows; ++j) { // iterate by row tdSRowResetBuf(&rb, POINTER_SHIFT(pDataBuf, msgLen)); // set row buf - bool isStartKey = false; + bool isStartKey = false; int32_t offset = 0; for (int32_t k = 0; k < colNum; ++k) { // iterate by column SColumnInfoData* pColInfoData = taosArrayGet(pDataBlock->pDataBlock, k); - STColumn* pCol = &pTSchema->columns[k]; - void* var = POINTER_SHIFT(pColInfoData->pData, j * pColInfoData->info.bytes); + STColumn* pCol = &pTSchema->columns[k]; + void* var = POINTER_SHIFT(pColInfoData->pData, j * pColInfoData->info.bytes); switch (pColInfoData->info.type) { case TSDB_DATA_TYPE_TIMESTAMP: if (!isStartKey) { @@ -1599,15 +1600,18 @@ int32_t buildSubmitReqFromDataBlock(SSubmitReq** pReq, const SArray* pDataBlocks offset, k); } else { - tdAppendColValToRow(&rb, PRIMARYKEY_TIMESTAMP_COL_ID + k, TSDB_DATA_TYPE_TIMESTAMP, TD_VTYPE_NORM, var, true, offset, k); + tdAppendColValToRow(&rb, PRIMARYKEY_TIMESTAMP_COL_ID + k, TSDB_DATA_TYPE_TIMESTAMP, TD_VTYPE_NORM, var, + true, offset, k); } break; case TSDB_DATA_TYPE_NCHAR: { - tdAppendColValToRow(&rb, PRIMARYKEY_TIMESTAMP_COL_ID + k, TSDB_DATA_TYPE_NCHAR, TD_VTYPE_NORM, var, true, offset, k); + tdAppendColValToRow(&rb, PRIMARYKEY_TIMESTAMP_COL_ID + k, TSDB_DATA_TYPE_NCHAR, TD_VTYPE_NORM, var, true, + offset, k); break; } case TSDB_DATA_TYPE_VARCHAR: { // TSDB_DATA_TYPE_BINARY - tdAppendColValToRow(&rb, PRIMARYKEY_TIMESTAMP_COL_ID + k, TSDB_DATA_TYPE_VARCHAR, TD_VTYPE_NORM, var, true, offset, k); + tdAppendColValToRow(&rb, PRIMARYKEY_TIMESTAMP_COL_ID + k, TSDB_DATA_TYPE_VARCHAR, TD_VTYPE_NORM, var, true, + offset, k); break; } case TSDB_DATA_TYPE_VARBINARY: @@ -1645,7 +1649,7 @@ int32_t buildSubmitReqFromDataBlock(SSubmitReq** pReq, const SArray* pDataBlocks } break; } - offset += TYPE_BYTES[pCol->type]; // sum/avg would convert to int64_t/uint64_t/double during aggregation + offset += TYPE_BYTES[pCol->type]; // sum/avg would convert to int64_t/uint64_t/double during aggregation } dataLen += TD_ROW_LEN(rb.pBuf); #ifdef TD_DEBUG_PRINT_ROW @@ -1681,11 +1685,38 @@ int32_t buildSubmitReqFromDataBlock(SSubmitReq** pReq, const SArray* pDataBlocks return TSDB_CODE_SUCCESS; } +char* buildCtbNameByGroupId(const char* stbName, uint64_t groupId) { + SArray* tags = taosArrayInit(0, sizeof(void*)); + SSmlKv* pTag = taosMemoryCalloc(1, sizeof(SSmlKv)); + pTag->key = "group_id"; + pTag->keyLen = strlen(pTag->key); + pTag->type = TSDB_DATA_TYPE_UBIGINT; + pTag->u = groupId; + taosArrayPush(tags, &pTag); + + void* cname = taosMemoryCalloc(1, TSDB_TABLE_NAME_LEN + 1); + + RandTableName rname = { + .tags = tags, + .sTableName = stbName, + .sTableNameLen = strlen(stbName), + .childTableName = cname, + }; + + buildChildTableName(&rname); + + taosMemoryFree(pTag); + taosArrayDestroy(tags); + + ASSERT(rname.childTableName && rname.childTableName[0]); + return rname.childTableName; +} + SSubmitReq* tdBlockToSubmit(const SArray* pBlocks, const STSchema* pTSchema, bool createTb, int64_t suid, const char* stbFullName, int32_t vgId) { SSubmitReq* ret = NULL; SArray* tagArray = taosArrayInit(1, sizeof(STagVal)); - if(!tagArray) { + if (!tagArray) { terrno = TSDB_CODE_OUT_OF_MEMORY; return NULL; } @@ -1703,15 +1734,12 @@ SSubmitReq* tdBlockToSubmit(const SArray* pBlocks, const STSchema* pTSchema, boo if (createTb) { SVCreateTbReq createTbReq = {0}; - char* cname = taosMemoryCalloc(1, TSDB_TABLE_FNAME_LEN); - snprintf(cname, TSDB_TABLE_FNAME_LEN, "%s:%ld", stbFullName, pDataBlock->info.groupId); + char* cname = buildCtbNameByGroupId(stbFullName, pDataBlock->info.groupId); createTbReq.name = cname; createTbReq.flags = 0; createTbReq.type = TSDB_CHILD_TABLE; createTbReq.ctb.suid = suid; - - STagVal tagVal = {.cid = 1, .type = TSDB_DATA_TYPE_UBIGINT, .pData = (uint8_t*)&pDataBlock->info.groupId, diff --git a/source/dnode/mgmt/node_mgmt/src/dmTransport.c b/source/dnode/mgmt/node_mgmt/src/dmTransport.c index 8b939d15ce35e4a8ccb9f032025250476a3b8a82..de7d46ed83b863c22e0d6eca7904115445648c4e 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmTransport.c +++ b/source/dnode/mgmt/node_mgmt/src/dmTransport.c @@ -131,7 +131,8 @@ static void dmProcessRpcMsg(SDnode *pDnode, SRpcMsg *pRpc, SEpSet *pEpSet) { _OVER: if (code != 0) { - dTrace("msg:%p, failed to process since %s, type:%s", pMsg, terrstr(), TMSG_INFO(pRpc->msgType)); + dTrace("failed to process msg:%p since %s, handle:%p", pMsg, terrstr(), pRpc->info.handle); + if (terrno != 0) code = terrno; if (IsReq(pRpc)) { @@ -149,8 +150,10 @@ _OVER: } } - dTrace("msg:%p, is freed", pMsg); - taosFreeQitem(pMsg); + if (pMsg != NULL) { + dTrace("msg:%p, is freed", pMsg); + taosFreeQitem(pMsg); + } rpcFreeCont(pRpc->pCont); } diff --git a/source/dnode/mgmt/node_util/src/dmEps.c b/source/dnode/mgmt/node_util/src/dmEps.c index 937c1ab7faa29191ea65f8770d0ffb2c531b3c35..6f6896ff9f11ae040e765e613e0cd2f7732a599e 100644 --- a/source/dnode/mgmt/node_util/src/dmEps.c +++ b/source/dnode/mgmt/node_util/src/dmEps.c @@ -318,9 +318,9 @@ void dmGetMnodeEpSet(SDnodeData *pData, SEpSet *pEpSet) { void dmGetMnodeEpSetForRedirect(SDnodeData *pData, SRpcMsg *pMsg, SEpSet *pEpSet) { dmGetMnodeEpSet(pData, pEpSet); - dDebug("msg:%p, is redirected, num:%d use:%d", pMsg, pEpSet->numOfEps, pEpSet->inUse); + dTrace("msg is redirected, handle:%p num:%d use:%d", pMsg->info.handle, pEpSet->numOfEps, pEpSet->inUse); for (int32_t i = 0; i < pEpSet->numOfEps; ++i) { - dDebug("mnode index:%d %s:%u", i, pEpSet->eps[i].fqdn, pEpSet->eps[i].port); + dTrace("mnode index:%d %s:%u", i, pEpSet->eps[i].fqdn, pEpSet->eps[i].port); if (strcmp(pEpSet->eps[i].fqdn, tsLocalFqdn) == 0 && pEpSet->eps[i].port == tsServerPort) { pEpSet->inUse = (i + 1) % pEpSet->numOfEps; } diff --git a/source/dnode/mnode/impl/inc/mndTrans.h b/source/dnode/mnode/impl/inc/mndTrans.h index 736fa3b36108e2e840b1f24a25c302262f83e6ca..5ac9d2233f376c4d0435464e6f3032ad105db613 100644 --- a/source/dnode/mnode/impl/inc/mndTrans.h +++ b/source/dnode/mnode/impl/inc/mndTrans.h @@ -36,19 +36,19 @@ typedef enum { } ETrnAct; typedef struct { - int32_t id; - int32_t errCode; - int32_t acceptableCode; - int8_t stage; - ETrnAct actionType; - int8_t rawWritten; - int8_t msgSent; - int8_t msgReceived; - tmsg_t msgType; - SEpSet epSet; - int32_t contLen; - void *pCont; - SSdbRaw *pRaw; + int32_t id; + int32_t errCode; + int32_t acceptableCode; + ETrnStage stage; + ETrnAct actionType; + int8_t rawWritten; + int8_t msgSent; + int8_t msgReceived; + tmsg_t msgType; + SEpSet epSet; + int32_t contLen; + void *pCont; + SSdbRaw *pRaw; } STransAction; typedef void (*TransCbFp)(SMnode *pMnode, void *param, int32_t paramLen); diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c index c7e347fb8b9573423139565e92bd5e8d59ebf1cd..7be49393372f6d58ac9ce3e1205a52bec07889be 100644 --- a/source/dnode/mnode/impl/src/mndDnode.c +++ b/source/dnode/mnode/impl/src/mndDnode.c @@ -87,6 +87,10 @@ int32_t mndInitDnode(SMnode *pMnode) { void mndCleanupDnode(SMnode *pMnode) {} static int32_t mndCreateDefaultDnode(SMnode *pMnode) { + int32_t code = -1; + SSdbRaw *pRaw = NULL; + STrans *pTrans = NULL; + SDnodeObj dnodeObj = {0}; dnodeObj.id = 1; dnodeObj.createdTime = taosGetTimestampMs(); @@ -95,54 +99,42 @@ static int32_t mndCreateDefaultDnode(SMnode *pMnode) { memcpy(&dnodeObj.fqdn, pMnode->replicas[0].fqdn, TSDB_FQDN_LEN); snprintf(dnodeObj.ep, TSDB_EP_LEN, "%s:%u", dnodeObj.fqdn, dnodeObj.port); - SSdbRaw *pRaw = mndDnodeActionEncode(&dnodeObj); - if (pRaw == NULL) return -1; - if (sdbSetRawStatus(pRaw, SDB_STATUS_READY) != 0) return -1; - - mDebug("dnode:%d, will be created when deploying, raw:%p", dnodeObj.id, pRaw); - - STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, NULL); - if (pTrans == NULL) { - mError("dnode:%s, failed to create since %s", dnodeObj.ep, terrstr()); - return -1; - } - mDebug("trans:%d, used to create dnode:%s", pTrans->id, dnodeObj.ep); + pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, NULL); + if (pTrans == NULL) goto _OVER; + mDebug("trans:%d, used to create dnode:%s on first deploy", pTrans->id, dnodeObj.ep); - if (mndTransAppendCommitlog(pTrans, pRaw) != 0) { - mError("trans:%d, failed to append commit log since %s", pTrans->id, terrstr()); - mndTransDrop(pTrans); - return -1; - } + pRaw = mndDnodeActionEncode(&dnodeObj); + if (pRaw == NULL || mndTransAppendCommitlog(pTrans, pRaw) != 0) goto _OVER; sdbSetRawStatus(pRaw, SDB_STATUS_READY); + pRaw = NULL; - if (mndTransPrepare(pMnode, pTrans) != 0) { - mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr()); - mndTransDrop(pTrans); - return -1; - } + if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER; + code = 0; +_OVER: mndTransDrop(pTrans); - return 0; + sdbFreeRaw(pRaw); + return code; } static SSdbRaw *mndDnodeActionEncode(SDnodeObj *pDnode) { terrno = TSDB_CODE_OUT_OF_MEMORY; SSdbRaw *pRaw = sdbAllocRaw(SDB_DNODE, TSDB_DNODE_VER_NUMBER, sizeof(SDnodeObj) + TSDB_DNODE_RESERVE_SIZE); - if (pRaw == NULL) goto DNODE_ENCODE_OVER; + if (pRaw == NULL) goto _OVER; int32_t dataPos = 0; - SDB_SET_INT32(pRaw, dataPos, pDnode->id, DNODE_ENCODE_OVER) - SDB_SET_INT64(pRaw, dataPos, pDnode->createdTime, DNODE_ENCODE_OVER) - SDB_SET_INT64(pRaw, dataPos, pDnode->updateTime, DNODE_ENCODE_OVER) - SDB_SET_INT16(pRaw, dataPos, pDnode->port, DNODE_ENCODE_OVER) - SDB_SET_BINARY(pRaw, dataPos, pDnode->fqdn, TSDB_FQDN_LEN, DNODE_ENCODE_OVER) - SDB_SET_RESERVE(pRaw, dataPos, TSDB_DNODE_RESERVE_SIZE, DNODE_ENCODE_OVER) - SDB_SET_DATALEN(pRaw, dataPos, DNODE_ENCODE_OVER); + SDB_SET_INT32(pRaw, dataPos, pDnode->id, _OVER) + SDB_SET_INT64(pRaw, dataPos, pDnode->createdTime, _OVER) + SDB_SET_INT64(pRaw, dataPos, pDnode->updateTime, _OVER) + SDB_SET_INT16(pRaw, dataPos, pDnode->port, _OVER) + SDB_SET_BINARY(pRaw, dataPos, pDnode->fqdn, TSDB_FQDN_LEN, _OVER) + SDB_SET_RESERVE(pRaw, dataPos, TSDB_DNODE_RESERVE_SIZE, _OVER) + SDB_SET_DATALEN(pRaw, dataPos, _OVER); terrno = 0; -DNODE_ENCODE_OVER: +_OVER: if (terrno != 0) { mError("dnode:%d, failed to encode to raw:%p since %s", pDnode->id, pRaw, terrstr()); sdbFreeRaw(pRaw); @@ -154,33 +146,32 @@ DNODE_ENCODE_OVER: } static SSdbRow *mndDnodeActionDecode(SSdbRaw *pRaw) { + SSdbRow *pRow = NULL; terrno = TSDB_CODE_OUT_OF_MEMORY; int8_t sver = 0; - if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto DNODE_DECODE_OVER; - + if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER; if (sver != TSDB_DNODE_VER_NUMBER) { terrno = TSDB_CODE_SDB_INVALID_DATA_VER; - goto DNODE_DECODE_OVER; + goto _OVER; } - SSdbRow *pRow = sdbAllocRow(sizeof(SDnodeObj)); - if (pRow == NULL) goto DNODE_DECODE_OVER; - + pRow = sdbAllocRow(sizeof(SDnodeObj)); + if (pRow == NULL) goto _OVER; SDnodeObj *pDnode = sdbGetRowObj(pRow); - if (pDnode == NULL) goto DNODE_DECODE_OVER; + if (pDnode == NULL) goto _OVER; int32_t dataPos = 0; - SDB_GET_INT32(pRaw, dataPos, &pDnode->id, DNODE_DECODE_OVER) - SDB_GET_INT64(pRaw, dataPos, &pDnode->createdTime, DNODE_DECODE_OVER) - SDB_GET_INT64(pRaw, dataPos, &pDnode->updateTime, DNODE_DECODE_OVER) - SDB_GET_INT16(pRaw, dataPos, &pDnode->port, DNODE_DECODE_OVER) - SDB_GET_BINARY(pRaw, dataPos, pDnode->fqdn, TSDB_FQDN_LEN, DNODE_DECODE_OVER) - SDB_GET_RESERVE(pRaw, dataPos, TSDB_DNODE_RESERVE_SIZE, DNODE_DECODE_OVER) + SDB_GET_INT32(pRaw, dataPos, &pDnode->id, _OVER) + SDB_GET_INT64(pRaw, dataPos, &pDnode->createdTime, _OVER) + SDB_GET_INT64(pRaw, dataPos, &pDnode->updateTime, _OVER) + SDB_GET_INT16(pRaw, dataPos, &pDnode->port, _OVER) + SDB_GET_BINARY(pRaw, dataPos, pDnode->fqdn, TSDB_FQDN_LEN, _OVER) + SDB_GET_RESERVE(pRaw, dataPos, TSDB_DNODE_RESERVE_SIZE, _OVER) terrno = 0; -DNODE_DECODE_OVER: +_OVER: if (terrno != 0) { mError("dnode:%d, failed to decode from raw:%p since %s", pDnode->id, pRaw, terrstr()); taosMemoryFreeClear(pRow); @@ -246,6 +237,7 @@ static SDnodeObj *mndAcquireDnodeByEp(SMnode *pMnode, char *pEpStr) { sdbRelease(pSdb, pDnode); } + terrno = TSDB_CODE_MND_DNODE_NOT_EXIST; return NULL; } @@ -290,25 +282,26 @@ static void mndGetDnodeData(SMnode *pMnode, SArray *pDnodeEps) { } } -static int32_t mndCheckClusterCfgPara(SMnode *pMnode, const SClusterCfg *pCfg) { +static int32_t mndCheckClusterCfgPara(SMnode *pMnode, SDnodeObj *pDnode, const SClusterCfg *pCfg) { if (pCfg->statusInterval != tsStatusInterval) { - mError("statusInterval [%d - %d] cfg inconsistent", pCfg->statusInterval, tsStatusInterval); + mError("dnode:%d, statusInterval:%d inconsistent with cluster:%d", pDnode->id, pCfg->statusInterval, + tsStatusInterval); return DND_REASON_STATUS_INTERVAL_NOT_MATCH; } if ((0 != strcasecmp(pCfg->timezone, tsTimezoneStr)) && (pMnode->checkTime != pCfg->checkTime)) { - mError("timezone [%s - %s] [%" PRId64 " - %" PRId64 "] cfg inconsistent", pCfg->timezone, tsTimezoneStr, - pCfg->checkTime, pMnode->checkTime); + mError("dnode:%d, timezone:%s checkTime:%" PRId64 " inconsistent with cluster %s %" PRId64, pDnode->id, + pCfg->timezone, pCfg->checkTime, tsTimezoneStr, pMnode->checkTime); return DND_REASON_TIME_ZONE_NOT_MATCH; } if (0 != strcasecmp(pCfg->locale, tsLocale)) { - mError("locale [%s - %s] cfg inconsistent", pCfg->locale, tsLocale); + mError("dnode:%d, locale:%s inconsistent with cluster:%s", pDnode->id, pCfg->locale, tsLocale); return DND_REASON_LOCALE_NOT_MATCH; } if (0 != strcasecmp(pCfg->charset, tsCharset)) { - mError("charset [%s - %s] cfg inconsistent.", pCfg->charset, tsCharset); + mError("dnode:%d, charset:%s inconsistent with cluster:%s", pDnode->id, pCfg->charset, tsCharset); return DND_REASON_CHARSET_NOT_MATCH; } @@ -323,15 +316,14 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) { if (tDeserializeSStatusReq(pReq->pCont, pReq->contLen, &statusReq) != 0) { terrno = TSDB_CODE_INVALID_MSG; - goto PROCESS_STATUS_MSG_OVER; + goto _OVER; } if (statusReq.dnodeId == 0) { pDnode = mndAcquireDnodeByEp(pMnode, statusReq.dnodeEp); if (pDnode == NULL) { mDebug("dnode:%s, not created yet", statusReq.dnodeEp); - terrno = TSDB_CODE_MND_DNODE_NOT_EXIST; - goto PROCESS_STATUS_MSG_OVER; + goto _OVER; } } else { pDnode = mndAcquireDnode(pMnode, statusReq.dnodeId); @@ -341,13 +333,11 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) { pDnode->offlineReason = DND_REASON_DNODE_ID_NOT_MATCH; } mError("dnode:%d, %s not exist", statusReq.dnodeId, statusReq.dnodeEp); - terrno = TSDB_CODE_MND_DNODE_NOT_EXIST; - goto PROCESS_STATUS_MSG_OVER; + goto _OVER; } } - int32_t numOfVloads = (int32_t)taosArrayGetSize(statusReq.pVloads); - for (int32_t v = 0; v < numOfVloads; ++v) { + for (int32_t v = 0; v < taosArrayGetSize(statusReq.pVloads); ++v) { SVnodeLoad *pVload = taosArrayGet(statusReq.pVloads, v); SVgObj *pVgroup = mndAcquireVgroup(pMnode, pVload->vgId); @@ -366,6 +356,7 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) { roleChanged = true; } pVgroup->vnodeGid[vg].role = pVload->syncState; + break; } } if (roleChanged) { @@ -405,11 +396,11 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) { } mError("dnode:%d, status msg version:%d not match cluster:%d", statusReq.dnodeId, statusReq.sver, tsVersion); terrno = TSDB_CODE_VERSION_NOT_COMPATIBLE; - goto PROCESS_STATUS_MSG_OVER; + goto _OVER; } if (statusReq.dnodeId == 0) { - mDebug("dnode:%d, %s first access, set clusterId %" PRId64, pDnode->id, pDnode->ep, pMnode->clusterId); + mInfo("dnode:%d, %s first access, set clusterId %" PRId64, pDnode->id, pDnode->ep, pMnode->clusterId); } else { if (statusReq.clusterId != pMnode->clusterId) { if (pDnode != NULL) { @@ -418,7 +409,7 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) { mError("dnode:%d, clusterId %" PRId64 " not match exist %" PRId64, pDnode->id, statusReq.clusterId, pMnode->clusterId); terrno = TSDB_CODE_MND_INVALID_CLUSTER_ID; - goto PROCESS_STATUS_MSG_OVER; + goto _OVER; } else { pDnode->accessTimes++; mTrace("dnode:%d, status received, access times %d", pDnode->id, pDnode->accessTimes); @@ -426,18 +417,17 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) { } // Verify whether the cluster parameters are consistent when status change from offline to ready - int32_t ret = mndCheckClusterCfgPara(pMnode, &statusReq.clusterCfg); - if (0 != ret) { - pDnode->offlineReason = ret; - mError("dnode:%d, cluster cfg inconsistent since:%s", pDnode->id, offlineReason[ret]); + pDnode->offlineReason = mndCheckClusterCfgPara(pMnode, pDnode, &statusReq.clusterCfg); + if (pDnode->offlineReason != 0) { + mError("dnode:%d, cluster cfg inconsistent since:%s", pDnode->id, offlineReason[pDnode->offlineReason]); terrno = TSDB_CODE_MND_INVALID_CLUSTER_CFG; - goto PROCESS_STATUS_MSG_OVER; + goto _OVER; } if (!online) { mInfo("dnode:%d, from offline to online", pDnode->id); } else { - mDebug("dnode:%d, send dnode epset, online:%d ver:% " PRId64 ":%" PRId64 " reboot:%d", pDnode->id, online, + mDebug("dnode:%d, send dnode epset, online:%d dnode_ver:%" PRId64 ":%" PRId64 " reboot:%d", pDnode->id, online, statusReq.dnodeVer, dnodeVer, reboot); } @@ -452,7 +442,7 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) { statusRsp.pDnodeEps = taosArrayInit(mndGetDnodeSize(pMnode), sizeof(SDnodeEp)); if (statusRsp.pDnodeEps == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; - goto PROCESS_STATUS_MSG_OVER; + goto _OVER; } mndGetDnodeData(pMnode, statusRsp.pDnodeEps); @@ -469,13 +459,17 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) { pDnode->lastAccessTime = curMs; code = 0; -PROCESS_STATUS_MSG_OVER: +_OVER: mndReleaseDnode(pMnode, pDnode); taosArrayDestroy(statusReq.pVloads); return code; } static int32_t mndCreateDnode(SMnode *pMnode, SRpcMsg *pReq, SCreateDnodeReq *pCreate) { + int32_t code = -1; + SSdbRaw *pRaw = NULL; + STrans *pTrans = NULL; + SDnodeObj dnodeObj = {0}; dnodeObj.id = sdbGetMaxId(pMnode->pSdb, SDB_DNODE); dnodeObj.createdTime = taosGetTimestampMs(); @@ -484,29 +478,22 @@ static int32_t mndCreateDnode(SMnode *pMnode, SRpcMsg *pReq, SCreateDnodeReq *pC memcpy(dnodeObj.fqdn, pCreate->fqdn, TSDB_FQDN_LEN); snprintf(dnodeObj.ep, TSDB_EP_LEN, "%s:%u", dnodeObj.fqdn, dnodeObj.port); - STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_GLOBAL, pReq); - if (pTrans == NULL) { - mError("dnode:%s, failed to create since %s", dnodeObj.ep, terrstr()); - return -1; - } + pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_GLOBAL, pReq); + if (pTrans == NULL) goto _OVER; mDebug("trans:%d, used to create dnode:%s", pTrans->id, dnodeObj.ep); - SSdbRaw *pCommitRaw = mndDnodeActionEncode(&dnodeObj); - if (pCommitRaw == NULL || mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) { - mError("trans:%d, failed to append commit log since %s", pTrans->id, terrstr()); - mndTransDrop(pTrans); - return -1; - } - sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY); + pRaw = mndDnodeActionEncode(&dnodeObj); + if (pRaw == NULL || mndTransAppendCommitlog(pTrans, pRaw) != 0) goto _OVER; + sdbSetRawStatus(pRaw, SDB_STATUS_READY); + pRaw = NULL; - if (mndTransPrepare(pMnode, pTrans) != 0) { - mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr()); - mndTransDrop(pTrans); - return -1; - } + if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER; + code = 0; +_OVER: mndTransDrop(pTrans); - return 0; + sdbFreeRaw(pRaw); + return code; } static int32_t mndProcessCreateDnodeReq(SRpcMsg *pReq) { @@ -518,38 +505,37 @@ static int32_t mndProcessCreateDnodeReq(SRpcMsg *pReq) { if (tDeserializeSCreateDnodeReq(pReq->pCont, pReq->contLen, &createReq) != 0) { terrno = TSDB_CODE_INVALID_MSG; - goto CREATE_DNODE_OVER; + goto _OVER; } mDebug("dnode:%s:%d, start to create", createReq.fqdn, createReq.port); if (createReq.fqdn[0] == 0 || createReq.port <= 0 || createReq.port > UINT16_MAX) { terrno = TSDB_CODE_MND_INVALID_DNODE_EP; - goto CREATE_DNODE_OVER; + goto _OVER; } char ep[TSDB_EP_LEN]; snprintf(ep, TSDB_EP_LEN, "%s:%d", createReq.fqdn, createReq.port); pDnode = mndAcquireDnodeByEp(pMnode, ep); if (pDnode != NULL) { - terrno = TSDB_CODE_MND_DNODE_ALREADY_EXIST; - goto CREATE_DNODE_OVER; + goto _OVER; } pUser = mndAcquireUser(pMnode, pReq->conn.user); if (pUser == NULL) { terrno = TSDB_CODE_MND_NO_USER_FROM_CONN; - goto CREATE_DNODE_OVER; + goto _OVER; } if (mndCheckNodeAuth(pUser) != 0) { - goto CREATE_DNODE_OVER; + goto _OVER; } code = mndCreateDnode(pMnode, pReq, &createReq); if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS; -CREATE_DNODE_OVER: +_OVER: if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) { mError("dnode:%s:%d, failed to create since %s", createReq.fqdn, createReq.port, terrstr()); } @@ -559,7 +545,7 @@ CREATE_DNODE_OVER: return code; } -static int32_t mndDropDnode(SMnode *pMnode, SRpcMsg *pReq, SDnodeObj *pDnode, SMnodeObj *pMObj) { +static int32_t mndDropDnode(SMnode *pMnode, SRpcMsg *pReq, SDnodeObj *pDnode, SMnodeObj *pMObj, int32_t numOfVnodes) { int32_t code = -1; SSdbRaw *pRaw = NULL; STrans *pTrans = NULL; @@ -579,8 +565,12 @@ static int32_t mndDropDnode(SMnode *pMnode, SRpcMsg *pReq, SDnodeObj *pDnode, SM sdbSetRawStatus(pRaw, SDB_STATUS_DROPPED); pRaw = NULL; - if (mndSetDropMnodeInfoToTrans(pMnode, pTrans, pMObj) != 0) goto _OVER; - if (mndSetMoveVgroupsInfoToTrans(pMnode, pTrans, pDnode->id) != 0) goto _OVER; + if (pMObj != NULL) { + if (mndSetDropMnodeInfoToTrans(pMnode, pTrans, pMObj) != 0) goto _OVER; + } + if (numOfVnodes > 0) { + if (mndSetMoveVgroupsInfoToTrans(pMnode, pTrans, pDnode->id) != 0) goto _OVER; + } if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER; code = 0; @@ -617,11 +607,6 @@ static int32_t mndProcessDropDnodeReq(SRpcMsg *pReq) { goto _OVER; } - if (!mndIsDnodeOnline(pDnode, taosGetTimestampMs())) { - terrno = TSDB_CODE_NODE_OFFLINE; - goto _OVER; - } - pMObj = mndAcquireMnode(pMnode, dropReq.dnodeId); if (pMObj != NULL) { if (sdbGetSize(pMnode->pSdb, SDB_MNODE) <= 1) { @@ -629,7 +614,17 @@ static int32_t mndProcessDropDnodeReq(SRpcMsg *pReq) { goto _OVER; } if (pMnode->selfDnodeId == dropReq.dnodeId) { - terrno = TSDB_CODE_MND_CANT_DROP_MASTER; + terrno = TSDB_CODE_MND_CANT_DROP_LEADER; + goto _OVER; + } + } + + int32_t numOfVnodes = mndGetVnodesNum(pMnode, pDnode->id); + if (numOfVnodes > 0 || pMObj != NULL) { + if (!mndIsDnodeOnline(pDnode, taosGetTimestampMs())) { + terrno = TSDB_CODE_NODE_OFFLINE; + mError("dnode:%d, failed to drop since %s, has_mnode:%d numOfVnodes:%d", pDnode->id, terrstr(), pMObj != NULL, + numOfVnodes); goto _OVER; } } @@ -644,7 +639,7 @@ static int32_t mndProcessDropDnodeReq(SRpcMsg *pReq) { goto _OVER; } - code = mndDropDnode(pMnode, pReq, pDnode, pMObj); + code = mndDropDnode(pMnode, pReq, pDnode, pMObj, numOfVnodes); if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS; _OVER: @@ -669,7 +664,6 @@ static int32_t mndProcessConfigDnodeReq(SRpcMsg *pReq) { SDnodeObj *pDnode = mndAcquireDnode(pMnode, cfgReq.dnodeId); if (pDnode == NULL) { - terrno = TSDB_CODE_MND_DNODE_NOT_EXIST; mError("dnode:%d, failed to config since %s ", cfgReq.dnodeId, terrstr()); return -1; } @@ -679,17 +673,18 @@ static int32_t mndProcessConfigDnodeReq(SRpcMsg *pReq) { int32_t bufLen = tSerializeSMCfgDnodeReq(NULL, 0, &cfgReq); void *pBuf = rpcMallocCont(bufLen); + + if (pBuf == NULL) return -1; tSerializeSMCfgDnodeReq(pBuf, bufLen, &cfgReq); + mDebug("dnode:%d, send config req to dnode, app:%p", cfgReq.dnodeId, pReq->info.ahandle); SRpcMsg rpcMsg = {.msgType = TDMT_DND_CONFIG_DNODE, .pCont = pBuf, .contLen = bufLen, .info = pReq->info}; - - mDebug("dnode:%d, send config req to dnode, app:%p", cfgReq.dnodeId, rpcMsg.info.ahandle); return tmsgSendReq(&epSet, &rpcMsg); } static int32_t mndProcessConfigDnodeRsp(SRpcMsg *pRsp) { mDebug("config rsp from dnode, app:%p", pRsp->info.ahandle); - return TSDB_CODE_SUCCESS; + return 0; } static int32_t mndRetrieveConfigs(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) { @@ -698,7 +693,7 @@ static int32_t mndRetrieveConfigs(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *p int32_t numOfRows = 0; char *cfgOpts[TSDB_CONFIG_NUMBER] = {0}; char cfgVals[TSDB_CONFIG_NUMBER][TSDB_CONIIG_VALUE_LEN + 1] = {0}; - char *pWrite; + char *pWrite = NULL; int32_t cols = 0; cfgOpts[totalRows] = "statusInterval"; @@ -724,7 +719,6 @@ static int32_t mndRetrieveConfigs(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *p cols = 0; STR_WITH_MAXSIZE_TO_VARSTR(buf, cfgOpts[i], TSDB_CONFIG_OPTION_LEN); - SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, numOfRows, (const char *)buf, false); @@ -774,7 +768,6 @@ static int32_t mndRetrieveDnodes(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pB char b1[9] = {0}; STR_TO_VARSTR(b1, online ? "ready" : "offline"); - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, numOfRows, b1, false); @@ -792,7 +785,6 @@ static int32_t mndRetrieveDnodes(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pB } pShow->numOfRows += numOfRows; - return numOfRows; } diff --git a/source/dnode/mnode/impl/src/mndMnode.c b/source/dnode/mnode/impl/src/mndMnode.c index 072ad05f5abbc10cdb93ff36a30e493a570d811e..027de66b42ddf4cf6a42fbf5e02e39e50f479106 100644 --- a/source/dnode/mnode/impl/src/mndMnode.c +++ b/source/dnode/mnode/impl/src/mndMnode.c @@ -588,7 +588,7 @@ static int32_t mndProcessDropMnodeReq(SRpcMsg *pReq) { } if (pMnode->selfDnodeId == dropReq.dnodeId) { - terrno = TSDB_CODE_MND_CANT_DROP_MASTER; + terrno = TSDB_CODE_MND_CANT_DROP_LEADER; goto _OVER; } diff --git a/source/dnode/mnode/impl/src/mndSync.c b/source/dnode/mnode/impl/src/mndSync.c index 245f0938b906300af29bf3f6caf71c834877eaa1..ce025d55478a913681229a0ff6d2563512406711 100644 --- a/source/dnode/mnode/impl/src/mndSync.c +++ b/source/dnode/mnode/impl/src/mndSync.c @@ -193,7 +193,7 @@ int32_t mndInitSync(SMnode *pMnode) { void mndCleanupSync(SMnode *pMnode) { SSyncMgmt *pMgmt = &pMnode->syncMgmt; syncStop(pMgmt->sync); - mDebug("sync:%" PRId64 " is stopped", pMgmt->sync); + mDebug("mnode sync is stopped, id:%" PRId64, pMgmt->sync); tsem_destroy(&pMgmt->syncSem); if (pMgmt->pWal != NULL) { diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 8c0ba65fb295758ed3b0bcbd517259b6ca7846ed..c2097c069b10fe2d7dcb2211d0f93cd5cc9048d7 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -117,10 +117,10 @@ static SSdbRaw *mndTransActionEncode(STrans *pTrans) { int32_t dataPos = 0; SDB_SET_INT32(pRaw, dataPos, pTrans->id, _OVER) - SDB_SET_INT16(pRaw, dataPos, pTrans->stage, _OVER) - SDB_SET_INT16(pRaw, dataPos, pTrans->policy, _OVER) - SDB_SET_INT16(pRaw, dataPos, pTrans->conflict, _OVER) - SDB_SET_INT16(pRaw, dataPos, pTrans->exec, _OVER) + SDB_SET_INT8(pRaw, dataPos, pTrans->stage, _OVER) + SDB_SET_INT8(pRaw, dataPos, pTrans->policy, _OVER) + SDB_SET_INT8(pRaw, dataPos, pTrans->conflict, _OVER) + SDB_SET_INT8(pRaw, dataPos, pTrans->exec, _OVER) SDB_SET_INT64(pRaw, dataPos, pTrans->createdTime, _OVER) SDB_SET_BINARY(pRaw, dataPos, pTrans->dbname, TSDB_DB_FNAME_LEN, _OVER) SDB_SET_INT32(pRaw, dataPos, pTrans->redoActionPos, _OVER) @@ -256,15 +256,15 @@ static SSdbRow *mndTransActionDecode(SSdbRaw *pRaw) { SDB_GET_INT32(pRaw, dataPos, &pTrans->id, _OVER) - int16_t stage = 0; - int16_t policy = 0; - int16_t conflict = 0; - int16_t exec = 0; - int8_t actionType = 0; - SDB_GET_INT16(pRaw, dataPos, &stage, _OVER) - SDB_GET_INT16(pRaw, dataPos, &policy, _OVER) - SDB_GET_INT16(pRaw, dataPos, &conflict, _OVER) - SDB_GET_INT16(pRaw, dataPos, &exec, _OVER) + int8_t stage = 0; + int8_t policy = 0; + int8_t conflict = 0; + int8_t exec = 0; + int8_t actionType = 0; + SDB_GET_INT8(pRaw, dataPos, &stage, _OVER) + SDB_GET_INT8(pRaw, dataPos, &policy, _OVER) + SDB_GET_INT8(pRaw, dataPos, &conflict, _OVER) + SDB_GET_INT8(pRaw, dataPos, &exec, _OVER) pTrans->stage = stage; pTrans->policy = policy; pTrans->conflict = conflict; @@ -290,7 +290,8 @@ static SSdbRow *mndTransActionDecode(SSdbRaw *pRaw) { SDB_GET_INT32(pRaw, dataPos, &action.acceptableCode, _OVER) SDB_GET_INT8(pRaw, dataPos, &actionType, _OVER) action.actionType = actionType; - SDB_GET_INT8(pRaw, dataPos, &action.stage, _OVER) + SDB_GET_INT8(pRaw, dataPos, &stage, _OVER) + action.stage = stage; if (action.actionType == TRANS_ACTION_RAW) { SDB_GET_INT8(pRaw, dataPos, &action.rawWritten, _OVER) SDB_GET_INT32(pRaw, dataPos, &dataLen, _OVER) @@ -322,7 +323,8 @@ static SSdbRow *mndTransActionDecode(SSdbRaw *pRaw) { SDB_GET_INT32(pRaw, dataPos, &action.acceptableCode, _OVER) SDB_GET_INT8(pRaw, dataPos, &actionType, _OVER) action.actionType = actionType; - SDB_GET_INT8(pRaw, dataPos, &action.stage, _OVER) + SDB_GET_INT8(pRaw, dataPos, &stage, _OVER) + action.stage = stage; if (action.actionType == TRANS_ACTION_RAW) { SDB_GET_INT8(pRaw, dataPos, &action.rawWritten, _OVER) SDB_GET_INT32(pRaw, dataPos, &dataLen, _OVER) @@ -354,7 +356,8 @@ static SSdbRow *mndTransActionDecode(SSdbRaw *pRaw) { SDB_GET_INT32(pRaw, dataPos, &action.acceptableCode, _OVER) SDB_GET_INT8(pRaw, dataPos, &actionType, _OVER) action.actionType = actionType; - SDB_GET_INT8(pRaw, dataPos, &action.stage, _OVER) + SDB_GET_INT8(pRaw, dataPos, &stage, _OVER) + action.stage = stage; if (action.actionType) { SDB_GET_INT8(pRaw, dataPos, &action.rawWritten, _OVER) SDB_GET_INT32(pRaw, dataPos, &dataLen, _OVER) @@ -878,7 +881,6 @@ static void mndTransResetActions(SMnode *pMnode, STrans *pTrans, SArray *pArray) mDebug("trans:%d, %s:%d execute status is reset", pTrans->id, mndTransStr(pAction->stage), action); } pAction->errCode = 0; - } } @@ -890,11 +892,12 @@ static int32_t mndTransWriteSingleLog(SMnode *pMnode, STrans *pTrans, STransActi pAction->rawWritten = true; pAction->errCode = 0; code = 0; - mDebug("trans:%d, %s:%d write to sdb", pTrans->id, mndTransStr(pAction->stage), pAction->id); + mDebug("trans:%d, %s:%d write to sdb, type:%s status:%s", pTrans->id, mndTransStr(pAction->stage), pAction->id, + sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status)); } else { pAction->errCode = (terrno != 0) ? terrno : code; - mError("trans:%d, %s:%d failed to write sdb since %s", pTrans->id, mndTransStr(pAction->stage), pAction->id, - terrstr()); + mError("trans:%d, %s:%d failed to write sdb since %s, type:%s status:%s", pTrans->id, mndTransStr(pAction->stage), + pAction->id, terrstr(), sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status)); } return code; @@ -916,18 +919,26 @@ static int32_t mndTransSendSingleMsg(SMnode *pMnode, STrans *pTrans, STransActio } memcpy(rpcMsg.pCont, pAction->pCont, pAction->contLen); + char detail[1024] = {0}; + int32_t len = snprintf(detail, sizeof(detail), "msgType:%s numOfEps:%d inUse:%d", TMSG_INFO(pAction->msgType), + pAction->epSet.numOfEps, pAction->epSet.inUse); + for (int32_t i = 0; i < pTrans->lastErrorEpset.numOfEps; ++i) { + len += snprintf(detail + len, sizeof(detail) - len, " ep:%d-%s:%u", i, pAction->epSet.eps[i].fqdn, + pAction->epSet.eps[i].port); + } + int32_t code = tmsgSendReq(&pAction->epSet, &rpcMsg); if (code == 0) { pAction->msgSent = 1; pAction->msgReceived = 0; pAction->errCode = 0; - mDebug("trans:%d, %s:%d is sent to %s:%u", pTrans->id, mndTransStr(pAction->stage), pAction->id, - pAction->epSet.eps[pAction->epSet.inUse].fqdn, pAction->epSet.eps[pAction->epSet.inUse].port); + mDebug("trans:%d, %s:%d is sent, %s", pTrans->id, mndTransStr(pAction->stage), pAction->id, detail); } else { pAction->msgSent = 0; pAction->msgReceived = 0; pAction->errCode = (terrno != 0) ? terrno : code; - mError("trans:%d, %s:%d not send since %s", pTrans->id, mndTransStr(pAction->stage), pAction->id, terrstr()); + mError("trans:%d, %s:%d not send since %s, %s", pTrans->id, mndTransStr(pAction->stage), pAction->id, terrstr(), + detail); } return code; @@ -1424,9 +1435,9 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl if (epset.numOfEps > 0) { len += snprintf(detail + len, sizeof(detail) - len, "msgType:%s numOfEps:%d inUse:%d ", TMSG_INFO(pTrans->lastErrorMsgType), epset.numOfEps, epset.inUse); - } - for (int32_t i = 0; i < pTrans->lastErrorEpset.numOfEps; ++i) { - len += snprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u ", i, epset.eps[i].fqdn, epset.eps[i].port); + for (int32_t i = 0; i < pTrans->lastErrorEpset.numOfEps; ++i) { + len += snprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u ", i, epset.eps[i].fqdn, epset.eps[i].port); + } } } STR_WITH_MAXSIZE_TO_VARSTR(lastError, detail, pShow->pMeta->pSchemas[cols].bytes); diff --git a/source/dnode/mnode/sdb/inc/sdb.h b/source/dnode/mnode/sdb/inc/sdb.h index 4a00befa1e8ec1b4ef4ff20a51a066ed08cf1883..944454380433ed1ee4944269ba6ef864e33742ed 100644 --- a/source/dnode/mnode/sdb/inc/sdb.h +++ b/source/dnode/mnode/sdb/inc/sdb.h @@ -392,6 +392,7 @@ int32_t sdbStopWrite(SSdb *pSdb, SSdbIter *pIter, bool isApply); int32_t sdbDoWrite(SSdb *pSdb, SSdbIter *pIter, void *pBuf, int32_t len); const char *sdbTableName(ESdbType type); +const char *sdbStatusName(ESdbStatus status); void sdbPrintOper(SSdb *pSdb, SSdbRow *pRow, const char *oper); int32_t sdbGetIdFromRaw(SSdb *pSdb, SSdbRaw *pRaw); diff --git a/source/dnode/mnode/sdb/src/sdbHash.c b/source/dnode/mnode/sdb/src/sdbHash.c index 162da2bd0aaa3e2400f14cefa0596b5022e7afbe..d1b1e3163574efe1152c282455af19ad1ff569f1 100644 --- a/source/dnode/mnode/sdb/src/sdbHash.c +++ b/source/dnode/mnode/sdb/src/sdbHash.c @@ -65,7 +65,7 @@ const char *sdbTableName(ESdbType type) { } } -static const char *sdbStatusName(ESdbStatus status) { +const char *sdbStatusName(ESdbStatus status) { switch (status) { case SDB_STATUS_CREATING: return "creating"; diff --git a/source/libs/stream/src/streamData.c b/source/libs/stream/src/streamData.c index 7139e77407ba59ec643108cb42a7a365f1880347..4a242d9c010816e36c405908d8f0b8dc47f5bed8 100644 --- a/source/libs/stream/src/streamData.c +++ b/source/libs/stream/src/streamData.c @@ -13,7 +13,7 @@ * along with this program. If not, see . */ -#include "tstream.h" +#include "streamInc.h" #if 0 int32_t streamDataBlockEncode(void** buf, const SStreamDataBlock* pOutput) { @@ -74,7 +74,6 @@ FAIL: } static FORCE_INLINE void streamDataSubmitRefInc(SStreamDataSubmit* pDataSubmit) { - // atomic_add_fetch_32(pDataSubmit->dataRef, 1); } diff --git a/source/libs/stream/src/streamMsg.c b/source/libs/stream/src/streamMsg.c index e5f953b7cc4e2d2c99a124fc49ee06ff8463ceea..06c12ec343e05a907566a7f6cb5d2a64f602a172 100644 --- a/source/libs/stream/src/streamMsg.c +++ b/source/libs/stream/src/streamMsg.c @@ -116,11 +116,9 @@ int32_t streamBuildDispatchMsg(SStreamTask* pTask, SStreamDataBlock* data, SRpcM *ppEpSet = &pTask->fixedEpDispatcher.epSet; downstreamTaskId = pTask->fixedEpDispatcher.taskId; } else if (pTask->dispatchType == TASK_DISPATCH__SHUFFLE) { - // TODO get ctbName - char ctbName[TSDB_TABLE_FNAME_LEN + 22] = {0}; + // TODO get ctbName for each block SSDataBlock* pBlock = taosArrayGet(data->blocks, 0); - sprintf(ctbName, "%s:%ld", pTask->shuffleDispatcher.stbFullName, pBlock->info.groupId); - // get vg and ep + char* ctbName = buildCtbNameByGroupId(pTask->shuffleDispatcher.stbFullName, pBlock->info.groupId); // TODO: get hash function by hashMethod // get groupId, compute hash value diff --git a/source/util/src/terror.c b/source/util/src/terror.c index c14c279d8151d80a5009f70a1c3ca0b1142e794f..0357ce7b4b1a934dd2a380c0cc2e2e5a2cc6708b 100644 --- a/source/util/src/terror.c +++ b/source/util/src/terror.c @@ -188,9 +188,9 @@ TAOS_DEFINE_ERROR(TSDB_CODE_MND_SNODE_ALREADY_EXIST, "Snode already exists" TAOS_DEFINE_ERROR(TSDB_CODE_MND_SNODE_NOT_EXIST, "Snode not there") TAOS_DEFINE_ERROR(TSDB_CODE_MND_BNODE_ALREADY_EXIST, "Bnode already exists") TAOS_DEFINE_ERROR(TSDB_CODE_MND_BNODE_NOT_EXIST, "Bnode not there") -TAOS_DEFINE_ERROR(TSDB_CODE_MND_TOO_FEW_MNODES, "The replicas of mnode cannot less than 1") -TAOS_DEFINE_ERROR(TSDB_CODE_MND_TOO_MANY_MNODES, "The replicas of mnode cannot exceed 3") -TAOS_DEFINE_ERROR(TSDB_CODE_MND_CANT_DROP_MASTER, "Can't drop mnode which is leader") +TAOS_DEFINE_ERROR(TSDB_CODE_MND_TOO_FEW_MNODES, "The replica of mnode cannot less than 1") +TAOS_DEFINE_ERROR(TSDB_CODE_MND_TOO_MANY_MNODES, "The replica of mnode cannot exceed 3") +TAOS_DEFINE_ERROR(TSDB_CODE_MND_CANT_DROP_LEADER, "Cannot drop mnode which is leader") // mnode-acct TAOS_DEFINE_ERROR(TSDB_CODE_MND_ACCT_ALREADY_EXIST, "Account already exists") diff --git a/tests/script/jenkins/basic.txt b/tests/script/jenkins/basic.txt index 32056e8d0ceb2d128b25b86e24ce9d42dfa6ba15..3249c02e8869e51a738914fb531a9e315d3e7c41 100644 --- a/tests/script/jenkins/basic.txt +++ b/tests/script/jenkins/basic.txt @@ -21,7 +21,7 @@ ./test.sh -f tsim/db/taosdlog.sim # ---- dnode -./test.sh -f tsim/dnode/basic1.sim +./test.sh -f tsim/dnode/create_dnode.sim # ---- insert ./test.sh -f tsim/insert/basic0.sim diff --git a/tests/script/tsim/dnode/basic1.sim b/tests/script/tsim/dnode/create_dnode.sim similarity index 100% rename from tests/script/tsim/dnode/basic1.sim rename to tests/script/tsim/dnode/create_dnode.sim diff --git a/tests/script/tsim/sync/oneReplica1VgElectWithInsert.sim b/tests/script/tsim/sync/oneReplica1VgElectWithInsert.sim index 06a67b3c1bfdf183f919fb7ac9c861055f566f42..b816226cfff3bc230f5629d432139690a86ca29e 100644 --- a/tests/script/tsim/sync/oneReplica1VgElectWithInsert.sim +++ b/tests/script/tsim/sync/oneReplica1VgElectWithInsert.sim @@ -31,7 +31,7 @@ if $data[0][4] != ready then goto check_dnode_ready endi -#sql connect +sql connect sql create dnode $hostname port 7200 sql create dnode $hostname port 7300 sql create dnode $hostname port 7400 @@ -71,7 +71,7 @@ sql create database db replica $replica vgroups $vgroups $loop_cnt = 0 check_db_ready: $loop_cnt = $loop_cnt + 1 -sleep 200 +sleep 20 if $loop_cnt == 10 then print ====> db not ready! return -1 @@ -93,13 +93,12 @@ $loop_cnt = 0 check_vg_ready: $loop_cnt = $loop_cnt + 1 sleep 200 -if $loop_cnt == 10 then +if $loop_cnt == 300 then print ====> vgroups not ready! return -1 endi sql show vgroups print ===> rows: $rows -print $data(2)[0] $data(2)[1] $data(2)[2] $data(2)[3] $data(2)[4] $data(2)[5] $data(2)[6] $data(2)[7] $data(2)[8] $data(2)[9] $data(2)[10] $data(2)[11] $data(2)[12] $data(2)[13] print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4] $data[0][5] $data[0][6] $data[0][7] $data[0][8] $data[0][9] $data[10][6] $data[0][11] $data[0][12] $data[0][13] if $rows != $vgroups then return -1 @@ -132,10 +131,12 @@ if $data[0][8] == leader then goto check_vg_ready endi print ---- vgroup $data[0][0] leader locate on dnode $data[0][7] - goto vg_ready + goto vg_ready +else + goto check_vg_ready endi -vg_ready: +vg_ready: print ====> create stable/child table sql create table stb (ts timestamp, c1 int, c2 float, c3 binary(10)) tags (t1 int) @@ -156,27 +157,13 @@ while $i < $tbNum sql create table $ctb using stb tags( $i ) $ntb = $ntbPrefix . $i sql create table $ntb (ts timestamp, c1 int, c2 float, c3 binary(10)) - -# $x = 0 -# while $x < $rowNum -# $binary = ' . binary -# $binary = $binary . $i -# $binary = $binary . ' -# -# sql insert into $ctb values ($tstart , $i , $x , $binary ) -# sql insert into $ntb values ($tstart , 999 , 999 , 'binary-ntb' ) -# $tstart = $tstart + 1 -# $x = $x + 1 -# endw - -# print ====> insert rows: $rowNum into $ctb and $ntb - $i = $i + 1 -# $tstart = 1640966400000 endw $totalTblNum = $tbNum * 2 +sleep 1000 sql show tables +print ====> expect $totalTblNum and infinsert $rows in fact if $rows != $totalTblNum then return -1 endi @@ -185,7 +172,7 @@ print ====> create a normal table for interaction between main and back threads sql create table interaction (ts timestamp, flag binary(10), childrows int, stbrows int) print ====> start to run_back to insert data -run_back tsim/tmq/insertDataByRunBack.sim +run_back tsim/sync/insertDataByRunBack.sim print ====> waiting insert thread starting insert data @@ -222,12 +209,15 @@ endi $dnodeId = dnode . $dnodeId print ====> stop $dnodeId system sh/exec.sh -n $dnodeId -s stop -x SIGINT +sleep 1000 +print ====> start $dnodeId +system sh/exec.sh -n $dnodeId -s start $loop_cnt = 0 check_vg_ready_2: $loop_cnt = $loop_cnt + 1 sleep 200 -if $loop_cnt == 10 then +if $loop_cnt == 300 then print ====> vgroups switch fail!!! return -1 endi @@ -242,38 +232,38 @@ if $data[0][4] == leader then if $data[0][6] != NULL then goto check_vg_ready_2 endi - if $data[0][8] != NULL then + if $data[0][8] != FOLLOWER then goto check_vg_ready_2 endi - print ---- vgroup $data[0][0] leader switch to dnode $data[0][3] + print ---- vgroup $dnodeId leader switch to dnode $data[0][3] goto vg_ready_2 endi if $data[0][6] == leader then if $data[0][4] != NULL then goto check_vg_ready_2 endi - if $data[0][8] != NULL then + if $data[0][8] != FOLLOWER then goto check_vg_ready_2 endi - print ---- vgroup $data[0][0] leader switch to dnode $data[0][5] + print ---- vgroup $dnodeId leader switch to dnode $data[0][5] goto vg_ready_2 endi if $data[0][8] == leader then if $data[0][4] != NULL then goto check_vg_ready_2 endi - if $data[0][6] != NULL then + if $data[0][6] != FOLLOWER then goto check_vg_ready_2 endi - print ---- vgroup $data[0][0] leader switch to dnode $data[0][7] + print ---- vgroup $dnodeId leader switch to dnode $data[0][7] goto vg_ready_2 +else + goto check_vg_ready_2 endi vg_ready_2: $switch_loop_cnt = $switch_loop_cnt + 1 if $switch_loop_cnt < 3 then - print ====> start $dnodeId - system sh/exec.sh -n $dnodeId -s start goto switch_leader_loop endi @@ -347,7 +337,7 @@ if $data[0][4] == leader then if $data[0][6] != NULL then goto check_vg_ready_1 endi - if $data[0][8] != NULL then + if $data[0][8] != FOLLOWER then goto check_vg_ready_1 endi goto vg_ready_1 @@ -356,7 +346,7 @@ if $data[0][6] == leader then if $data[0][4] != NULL then goto check_vg_ready_1 endi - if $data[0][8] != NULL then + if $data[0][8] != FOLLOWER then goto check_vg_ready_1 endi goto vg_ready_1 @@ -365,7 +355,7 @@ if $data[0][8] == leader then if $data[0][4] != NULL then goto check_vg_ready_1 endi - if $data[0][6] != NULL then + if $data[0][6] != FOLLOWER then goto check_vg_ready_1 endi goto vg_ready_1 @@ -394,6 +384,73 @@ if $data[0][0] != $totalRowsOfStb then return -1 endi +print ====> once stop one dnode by loop, and do query every time +$i = 2 +loop_stop_dnode: +$dnodeId = dnode . $i +print ====> stop $dnodeId +system sh/exec.sh -n $dnodeId -s stop -x SIGINT + +check_vg_ready_3: +sql show vgroups +print $data(2)[0] $data(2)[1] $data(2)[2] $data(2)[3] $data(2)[4] $data(2)[5] $data(2)[6] $data(2)[7] $data(2)[8] $data(2)[9] $data(2)[10] $data(2)[11] $data(2)[12] $data(2)[13] +if $data[0][4] == LEADER then + if $data[0][6] == LEADER then + goto check_vg_ready_3 + endi + if $data[0][8] == LEADER then + goto check_vg_ready_3 + endi + print ---- vgroup $data[0][0] leader locating dnode $data[0][5] +elif $data[0][6] == LEADER then + if $data[0][4] == LEADER then + goto check_vg_ready_3 + endi + if $data[0][8] == LEADER then + goto check_vg_ready_3 + endi + print ---- vgroup $data[0][0] leader locating dnode $data[0][7] +elif $data[0][8] == LEADER then + if $data[0][4] == LEADER then + goto check_vg_ready_3 + endi + if $data[0][6] == LEADER then + goto check_vg_ready_3 + endi + print ---- vgroup $data[0][0] leader locating dnode $data[0][9] +else + print ====> no leader vnode!!! + return -1 +endi + +sql select count(*) from ntb0 +print rows: $rows +print $data[0][0] $data[0][1] +if $data[0][0] != $totalRowsOfCtb then + return -1 +endi + +sql select count(*) from ctb0 +print rows: $rows +print $data[0][0] $data[0][1] +if $data[0][0] != $totalRowsOfCtb then + return -1 +endi + +sql select count(*) from stb +print rows: $rows +print $data[0][0] $data[0][1] +if $data[0][0] != $totalRowsOfStb then + return -1 +endi + +$i = $i + 1 +if $i <= 4 then + print ====> start $dnodeId + system sh/exec.sh -n $dnodeId -s start + goto loop_stop_dnode +endi + system sh/exec.sh -n dnode1 -s stop -x SIGINT system sh/exec.sh -n dnode2 -s stop -x SIGINT system sh/exec.sh -n dnode3 -s stop -x SIGINT diff --git a/tests/system-test/1-insert/test_stmt_insert_query_ex.py b/tests/system-test/1-insert/test_stmt_insert_query_ex.py index 376b60d615941323bedcf40d591817e30c8da05a..c0836b79c8da4ef50b20e4763bb2208780d274b1 100644 --- a/tests/system-test/1-insert/test_stmt_insert_query_ex.py +++ b/tests/system-test/1-insert/test_stmt_insert_query_ex.py @@ -80,93 +80,9 @@ class TDTestCase: con=taos.connect(host=host, user=user, password=password, config=cfg ,port=port) print(con) return con - - def test_stmt_insert_multi(self,conn): - # type: (TaosConnection) -> None - - dbname = "pytest_taos_stmt_multi" - try: - conn.execute("drop database if exists %s" % dbname) - conn.execute("create database if not exists %s" % dbname) - conn.select_db(dbname) - - conn.execute( - "create table if not exists log(ts timestamp, bo bool, nil tinyint, ti tinyint, si smallint, ii int,\ - bi bigint, tu tinyint unsigned, su smallint unsigned, iu int unsigned, bu bigint unsigned, \ - ff float, dd double, bb binary(100), nn nchar(100), tt timestamp)", - ) - # conn.load_table_info("log") - - start = datetime.now() - stmt = conn.statement("insert into log values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") - - params = new_multi_binds(16) - params[0].timestamp((1626861392589, 1626861392590, 1626861392591)) - params[1].bool((True, None, False)) - params[2].tinyint([-128, -128, None]) # -128 is tinyint null - params[3].tinyint([0, 127, None]) - params[4].smallint([3, None, 2]) - params[5].int([3, 4, None]) - params[6].bigint([3, 4, None]) - params[7].tinyint_unsigned([3, 4, None]) - params[8].smallint_unsigned([3, 4, None]) - params[9].int_unsigned([3, 4, None]) - params[10].bigint_unsigned([3, 4, None]) - params[11].float([3, None, 1]) - params[12].double([3, None, 1.2]) - params[13].binary(["abc", "dddafadfadfadfadfa", None]) - params[14].nchar(["涛思数据", None, "a long string with 中文字符"]) - params[15].timestamp([None, None, 1626861392591]) - # print(type(stmt)) - stmt.bind_param_batch(params) - stmt.execute() - end = datetime.now() - print("elapsed time: ", end - start) - assert stmt.affected_rows == 3 - - #query - querystmt=conn.statement("select ?,bu from log") - queryparam=new_bind_params(1) - print(type(queryparam)) - queryparam[0].binary("ts") - querystmt.bind_param(queryparam) - querystmt.execute() - result=querystmt.use_result() - # rows=result.fetch_all() - # print( querystmt.use_result()) - - # result = conn.query("select * from log") - rows=result.fetch_all() - # rows=result.fetch_all() - print(rows) - assert rows[1][0] == "ts" - assert rows[0][1] == 3 - - #query - querystmt1=conn.statement("select * from log where bu < ?") - queryparam1=new_bind_params(1) - print(type(queryparam1)) - queryparam1[0].int(4) - querystmt1.bind_param(queryparam1) - querystmt1.execute() - result1=querystmt1.use_result() - rows1=result1.fetch_all() - assert str(rows1[0][0]) == "2021-07-21 17:56:32.589000" - assert rows1[0][10] == 3 - - - stmt.close() - - # conn.execute("drop database if exists %s" % dbname) - conn.close() - - except Exception as err: - # conn.execute("drop database if exists %s" % dbname) - conn.close() - raise err def test_stmt_set_tbname_tag(self,conn): - dbname = "pytest_taos_stmt_set_tbname_tag" + dbname = "stmt_set_tbname_tag" try: conn.execute("drop database if exists %s" % dbname) @@ -174,16 +90,16 @@ class TDTestCase: conn.select_db(dbname) conn.execute("create table if not exists log(ts timestamp, bo bool, nil tinyint, ti tinyint, si smallint, ii int,\ bi bigint, tu tinyint unsigned, su smallint unsigned, iu int unsigned, bu bigint unsigned, \ - ff float, dd double, bb binary(100), nn nchar(100), tt timestamp) tags (t1 timestamp, t2 bool,\ + ff float, dd double, bb binary(100), nn nchar(100), tt timestamp , vc varchar(100)) tags (t1 timestamp, t2 bool,\ t3 tinyint, t4 tinyint, t5 smallint, t6 int, t7 bigint, t8 tinyint unsigned, t9 smallint unsigned, \ t10 int unsigned, t11 bigint unsigned, t12 float, t13 double, t14 binary(100), t15 nchar(100), t16 timestamp)") stmt = conn.statement("insert into ? using log tags (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) \ - values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)") + values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)") tags = new_bind_params(16) tags[0].timestamp(1626861392589123, PrecisionEnum.Microseconds) tags[1].bool(True) - tags[2].null() + tags[2].bool(False) tags[3].tinyint(2) tags[4].smallint(3) tags[5].int(4) @@ -198,7 +114,7 @@ class TDTestCase: tags[14].nchar("stmt") tags[15].timestamp(1626861392589, PrecisionEnum.Milliseconds) stmt.set_tbname_tags("tb1", tags) - params = new_multi_binds(16) + params = new_multi_binds(17) params[0].timestamp((1626861392589111, 1626861392590111, 1626861392591111)) params[1].bool((True, None, False)) params[2].tinyint([-128, -128, None]) # -128 is tinyint null @@ -213,25 +129,32 @@ class TDTestCase: params[11].float([3, None, 1]) params[12].double([3, None, 1.2]) params[13].binary(["abc", "dddafadfadfadfadfa", None]) - params[14].nchar(["涛思数据", None, "a? long string with 中文字符"]) + params[14].nchar(["涛思数据", None, "a long string with 中文字符"]) params[15].timestamp([None, None, 1626861392591]) - + params[16].binary(["涛思数据16", None, "a long string with 中文-字符"]) + stmt.bind_param_batch(params) stmt.execute() assert stmt.affected_rows == 3 - #query + #query all querystmt1=conn.statement("select * from log where bu < ?") queryparam1=new_bind_params(1) print(type(queryparam1)) - queryparam1[0].int(5) + queryparam1[0].int(10) querystmt1.bind_param(queryparam1) querystmt1.execute() result1=querystmt1.use_result() rows1=result1.fetch_all() - print("1",rows1) + print(rows1[0]) + print(rows1[1]) + print(rows1[2]) + assert str(rows1[0][0]) == "2021-07-21 17:56:32.589111" + assert rows1[0][10] == 3 + assert rows1[1][10] == 4 + #query: Numeric Functions querystmt2=conn.statement("select abs(?) from log where bu < ?") queryparam2=new_bind_params(2) print(type(queryparam2)) @@ -242,6 +165,11 @@ class TDTestCase: result2=querystmt2.use_result() rows2=result2.fetch_all() print("2",rows2) + assert rows2[0][0] == 5 + assert rows2[1][0] == 5 + + + #query: Numeric Functions and escapes querystmt3=conn.statement("select abs(?) from log where nn= 'a? long string with 中文字符' ") queryparam3=new_bind_params(1) @@ -252,9 +180,63 @@ class TDTestCase: result3=querystmt3.use_result() rows3=result3.fetch_all() print("3",rows3) - # assert str(rows1[0][0]) == "2021-07-21 17:56:32.589111" - # assert rows1[0][10] == 3 - # assert rows1[1][10] == 4 + assert rows3 == [] + + #query: string Functions + + querystmt3=conn.statement("select CHAR_LENGTH(?) from log ") + queryparam3=new_bind_params(1) + print(type(queryparam3)) + queryparam3[0].binary('中文字符') + querystmt3.bind_param(queryparam3) + querystmt3.execute() + result3=querystmt3.use_result() + rows3=result3.fetch_all() + print("4",rows3) + assert rows3[0][0] == 12, 'fourth case is failed' + assert rows3[1][0] == 12, 'fourth case is failed' + + # #query: conversion Functions + + # querystmt4=conn.statement("select cast( ? as bigint) from log ") + # queryparam4=new_bind_params(1) + # print(type(queryparam4)) + # queryparam4[0].binary('1232a') + # querystmt4.bind_param(queryparam4) + # querystmt4.execute() + # result4=querystmt4.use_result() + # rows4=result4.fetch_all() + # print("5",rows4) + # assert rows4[0][0] == 1232 + # assert rows4[1][0] == 1232 + + # querystmt4=conn.statement("select cast( ? as binary(10)) from log ") + # queryparam4=new_bind_params(1) + # print(type(queryparam4)) + # queryparam4[0].int(123) + # querystmt4.bind_param(queryparam4) + # querystmt4.execute() + # result4=querystmt4.use_result() + # rows4=result4.fetch_all() + # print("6",rows4) + # assert rows4[0][0] == '123' + # assert rows4[1][0] == '123' + + # #query: datatime Functions + + # querystmt4=conn.statement(" select timediff('2021-07-21 17:56:32.590111',?,1s) from log ") + # queryparam4=new_bind_params(1) + # print(type(queryparam4)) + # queryparam4[0].timestamp(1626861392591111) + # querystmt4.bind_param(queryparam4) + # querystmt4.execute() + # result4=querystmt4.use_result() + # rows4=result4.fetch_all() + # print("7",rows4) + # assert rows4[0][0] == 1, 'seventh case is failed' + # assert rows4[1][0] == 1, 'seventh case is failed' + + # conn.execute("drop database if exists %s" % dbname) conn.close() @@ -269,8 +251,6 @@ class TDTestCase: config = buildPath+ "../sim/dnode1/cfg/" host="localhost" connectstmt=self.newcon(host,config) - self.test_stmt_insert_multi(connectstmt) - connectstmt=self.newcon(host,config) self.test_stmt_set_tbname_tag(connectstmt) return diff --git a/tests/system-test/1-insert/test_stmt_muti_insert_query.py b/tests/system-test/1-insert/test_stmt_muti_insert_query.py index 486bcd806219c73fa344e5422727c46fe03cde5e..f838fd90f51246ee11f5e16648167491cfe52989 100644 --- a/tests/system-test/1-insert/test_stmt_muti_insert_query.py +++ b/tests/system-test/1-insert/test_stmt_muti_insert_query.py @@ -124,7 +124,7 @@ class TDTestCase: print("elapsed time: ", end - start) assert stmt.affected_rows == 3 - #query + #query 1 querystmt=conn.statement("select ?,bu from log") queryparam=new_bind_params(1) print(type(queryparam)) @@ -141,8 +141,9 @@ class TDTestCase: print(rows) assert rows[1][0] == "ts" assert rows[0][1] == 3 + assert rows[2][1] == None - #query + #query 2 querystmt1=conn.statement("select * from log where bu < ?") queryparam1=new_bind_params(1) print(type(queryparam1)) diff --git a/tests/system-test/1-insert/test_stmt_set_tbname_tag.py b/tests/system-test/1-insert/test_stmt_set_tbname_tag.py index 54d5cfbafb0b3f98d55f310accccb19ef693c08b..fb9f455d4da6fa75efd380dc9bedf6aa3e415906 100644 --- a/tests/system-test/1-insert/test_stmt_set_tbname_tag.py +++ b/tests/system-test/1-insert/test_stmt_set_tbname_tag.py @@ -82,7 +82,7 @@ class TDTestCase: return con def test_stmt_set_tbname_tag(self,conn): - dbname = "pytest_taos_stmt_set_tbname_tag" + dbname = "stmt_set_tbname_tag" try: conn.execute("drop database if exists %s" % dbname) @@ -99,7 +99,7 @@ class TDTestCase: tags = new_bind_params(16) tags[0].timestamp(1626861392589123, PrecisionEnum.Microseconds) tags[1].bool(True) - tags[2].null() + tags[2].bool(False) tags[3].tinyint(2) tags[4].smallint(3) tags[5].int(4) @@ -114,7 +114,7 @@ class TDTestCase: tags[14].nchar("stmt") tags[15].timestamp(1626861392589, PrecisionEnum.Milliseconds) stmt.set_tbname_tags("tb1", tags) - params = new_multi_binds(16) + params = new_multi_binds(17) params[0].timestamp((1626861392589111, 1626861392590111, 1626861392591111)) params[1].bool((True, None, False)) params[2].tinyint([-128, -128, None]) # -128 is tinyint null @@ -129,28 +129,153 @@ class TDTestCase: params[11].float([3, None, 1]) params[12].double([3, None, 1.2]) params[13].binary(["abc", "dddafadfadfadfadfa", None]) - params[14].nchar(["涛思数据", None, "a long string with 中文字符"]) + params[14].nchar(["涛思数据", None, "a long string with 中文?字符"]) params[15].timestamp([None, None, 1626861392591]) - params[16].binary(["涛思数据16", None, "a long string with 中文-字符"]) + params[16].binary(["涛思数据16", None, None]) stmt.bind_param_batch(params) stmt.execute() assert stmt.affected_rows == 3 - #query + #query all querystmt1=conn.statement("select * from log where bu < ?") queryparam1=new_bind_params(1) print(type(queryparam1)) - queryparam1[0].int(5) + queryparam1[0].int(10) querystmt1.bind_param(queryparam1) querystmt1.execute() result1=querystmt1.use_result() rows1=result1.fetch_all() - print(rows1) - # assert str(rows1[0][0]) == "2021-07-21 17:56:32.589111" - # assert rows1[0][10] == 3 - # assert rows1[1][10] == 4 + print(rows1[0]) + print(rows1[1]) + print(rows1[2]) + assert str(rows1[0][0]) == "2021-07-21 17:56:32.589111" + assert rows1[0][10] == 3 + assert rows1[1][10] == 4 + + #query: Numeric Functions + querystmt2=conn.statement("select abs(?) from log where bu < ?") + queryparam2=new_bind_params(2) + print(type(queryparam2)) + queryparam2[0].int(5) + queryparam2[1].int(5) + querystmt2.bind_param(queryparam2) + querystmt2.execute() + result2=querystmt2.use_result() + rows2=result2.fetch_all() + print("2",rows2) + assert rows2[0][0] == 5 + assert rows2[1][0] == 5 + + + #query: Numeric Functions and escapes + + querystmt3=conn.statement("select abs(?) from log where nn= 'a? long string with 中文字符' ") + queryparam3=new_bind_params(1) + print(type(queryparam3)) + queryparam3[0].int(5) + querystmt3.bind_param(queryparam3) + querystmt3.execute() + result3=querystmt3.use_result() + rows3=result3.fetch_all() + print("3",rows3) + assert rows3 == [] + + # #query: string Functions + + # querystmt3=conn.statement("select CHAR_LENGTH(?) from log ") + # queryparam3=new_bind_params(1) + # print(type(queryparam3)) + # queryparam3[0].binary('中文字符') + # querystmt3.bind_param(queryparam3) + # querystmt3.execute() + # result3=querystmt3.use_result() + # rows3=result3.fetch_all() + # print("4",rows3) + # assert rows3[0][0] == 12, 'fourth case is failed' + # assert rows3[1][0] == 12, 'fourth case is failed' + + # #query: conversion Functions + + # querystmt4=conn.statement("select cast( ? as bigint) from log ") + # queryparam4=new_bind_params(1) + # print(type(queryparam4)) + # queryparam4[0].binary('1232a') + # querystmt4.bind_param(queryparam4) + # querystmt4.execute() + # result4=querystmt4.use_result() + # rows4=result4.fetch_all() + # print("5",rows4) + # assert rows4[0][0] == 1232 + # assert rows4[1][0] == 1232 + + # querystmt4=conn.statement("select cast( ? as binary(10)) from log ") + # queryparam4=new_bind_params(1) + # print(type(queryparam4)) + # queryparam4[0].int(123) + # querystmt4.bind_param(queryparam4) + # querystmt4.execute() + # result4=querystmt4.use_result() + # rows4=result4.fetch_all() + # print("6",rows4) + # assert rows4[0][0] == '123' + # assert rows4[1][0] == '123' + + # #query: datatime Functions + + # querystmt4=conn.statement(" select timediff('2021-07-21 17:56:32.590111',?,1s) from log ") + # queryparam4=new_bind_params(1) + # print(type(queryparam4)) + # queryparam4[0].timestamp(1626861392591111) + # querystmt4.bind_param(queryparam4) + # querystmt4.execute() + # result4=querystmt4.use_result() + # rows4=result4.fetch_all() + # print("7",rows4) + # assert rows4[0][0] == 1, 'seventh case is failed' + # assert rows4[1][0] == 1, 'seventh case is failed' + + #query: aggregate Functions + + querystmt4=conn.statement(" select count(?) from log ") + queryparam4=new_bind_params(1) + print(type(queryparam4)) + queryparam4[0].int(123) + querystmt4.bind_param(queryparam4) + querystmt4.execute() + result4=querystmt4.use_result() + rows4=result4.fetch_all() + print("8",rows4) + assert rows4[0][0] == 3, ' 8 case is failed' + + #query: selector Functions 9 + + querystmt4=conn.statement(" select bottom(bu,?) from log group by bu ; ") + queryparam4=new_bind_params(1) + print(type(queryparam4)) + queryparam4[0].int(2) + querystmt4.bind_param(queryparam4) + querystmt4.execute() + result4=querystmt4.use_result() + rows4=result4.fetch_all() + print("9",rows4) + assert rows4[0][0] == 4, ' 9 case is failed' + assert rows4[1][0] == 3, ' 9 case is failed' + + # #query: time-series specific Functions 10 + + querystmt4=conn.statement(" select twa(?) from log; ") + queryparam4=new_bind_params(1) + print(type(queryparam4)) + queryparam4[0].int(15) + querystmt4.bind_param(queryparam4) + querystmt4.execute() + result4=querystmt4.use_result() + rows4=result4.fetch_all() + print("10",rows4) + assert rows4[0][0] == 15, ' 10 case is failed' + # conn.execute("drop database if exists %s" % dbname) conn.close()