From 0d0d4652bb40e2d769d9173124b13fed5a7f2946 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 24 Dec 2021 23:02:30 +0800 Subject: [PATCH 01/10] [td-11818] Add async send callback mechanism. --- source/client/inc/clientInt.h | 42 +++++--- source/client/src/clientEnv.c | 31 +++--- source/client/src/clientImpl.c | 150 ++++++++++++++------------- source/client/src/clientMain.c | 14 +-- source/client/src/clientMsgHandler.c | 128 ++++++++++++----------- source/client/test/clientTests.cpp | 115 +++++++++++--------- source/libs/parser/inc/astToMsg.h | 2 +- source/libs/parser/src/astToMsg.c | 8 +- source/libs/parser/src/astValidate.c | 2 +- 9 files changed, 268 insertions(+), 224 deletions(-) diff --git a/source/client/inc/clientInt.h b/source/client/inc/clientInt.h index a34250ccab..550d8c3ecf 100644 --- a/source/client/inc/clientInt.h +++ b/source/client/inc/clientInt.h @@ -37,7 +37,7 @@ typedef struct SQueryExecMetric { int64_t rsp; // receive response from server } SQueryExecMetric; -typedef struct SInstanceActivity { +typedef struct SInstanceSummary { uint64_t numOfInsertsReq; uint64_t numOfInsertRows; uint64_t insertElapsedTime; @@ -48,7 +48,7 @@ typedef struct SInstanceActivity { uint64_t numOfSlowQueries; uint64_t totalRequests; uint64_t currentRequests; // the number of SRequestObj -} SInstanceActivity; +} SInstanceSummary; typedef struct SHeartBeatInfo { void *pTimer; // timer, used to send request msg to mnode @@ -57,7 +57,7 @@ typedef struct SHeartBeatInfo { typedef struct SAppInstInfo { int64_t numOfConns; SCorEpSet mgmtEp; - SInstanceActivity summary; + SInstanceSummary summary; SList *pConnList; // STscObj linked list uint32_t clusterId; void *pTransporter; @@ -100,16 +100,16 @@ typedef struct SReqResultInfo { uint32_t current; } SReqResultInfo; -typedef struct SReqMsg { - void *pMsg; +typedef struct SDataBuf { + void *pData; uint32_t len; -} SReqMsgInfo; +} SDataBuf; typedef struct SRequestSendRecvBody { tsem_t rspSem; // not used now void* fp; int64_t execId; // showId/queryId - SReqMsgInfo requestMsg; + SDataBuf requestMsg; SReqResultInfo resInfo; } SRequestSendRecvBody; @@ -121,26 +121,38 @@ typedef struct SRequestObj { STscObj *pTscObj; SQueryExecMetric metric; char *sqlstr; // sql string - SRequestSendRecvBody body; + SRequestSendRecvBody body; int64_t self; char *msgBuf; - int32_t code; void *pInfo; // sql parse info, generated by parser module + int32_t code; } SRequestObj; typedef struct SRequestMsgBody { int32_t msgType; - SReqMsgInfo msgInfo; + SDataBuf msgInfo; uint64_t requestId; uint64_t requestObjRefId; } SRequestMsgBody; -extern SAppInfo appInfo; -extern int32_t tscReqRef; -extern int32_t tscConnRef; +typedef int (*__async_send_cb_fn_t)(void* param, const SDataBuf* pMsg, int32_t code); -SRequestMsgBody buildRequestMsgImpl(SRequestObj *pRequest); -extern int (*handleRequestRspFp[TSDB_MSG_TYPE_MAX])(SRequestObj *pRequest, const char* pMsg, int32_t msgLen); +typedef struct SMsgSendInfo { + __async_send_cb_fn_t fp; + void *param; + uint64_t requestId; + uint64_t requestObjRefId; + int32_t msgType; + SDataBuf msgInfo; +} SMsgSendInfo; + +extern SAppInfo appInfo; +extern int32_t msgObjRefPool; +extern int32_t clientConnRefPool; + +SMsgSendInfo* buildSendMsgInfoImpl(SRequestObj *pRequest); +int genericExecCallback(void* param, const SDataBuf* pMsg, int32_t code); +extern int (*handleRequestRspFp[TSDB_MSG_TYPE_MAX])(void* param, const SDataBuf* pMsg, int32_t code); int taos_init(); diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c index b54f7fedd7..dca4d85ad6 100644 --- a/source/client/src/clientEnv.c +++ b/source/client/src/clientEnv.c @@ -13,10 +13,10 @@ * along with this program. If not, see . */ -#include +#include "os.h" +#include "catalog.h" #include "clientInt.h" #include "clientLog.h" -#include "os.h" #include "query.h" #include "taosmsg.h" #include "tcache.h" @@ -32,26 +32,26 @@ #define TSC_VAR_RELEASED 0 SAppInfo appInfo; -int32_t tscReqRef = -1; -int32_t tscConnRef = -1; +int32_t msgObjRefPool = -1; +int32_t clientConnRefPool = -1; static pthread_once_t tscinit = PTHREAD_ONCE_INIT; volatile int32_t tscInitRes = 0; static void registerRequest(SRequestObj* pRequest) { - STscObj *pTscObj = (STscObj *)taosAcquireRef(tscConnRef, pRequest->pTscObj->id); + STscObj *pTscObj = (STscObj *)taosAcquireRef(clientConnRefPool, pRequest->pTscObj->id); assert(pTscObj != NULL); // connection has been released already, abort creating request. - pRequest->self = taosAddRef(tscReqRef, pRequest); + pRequest->self = taosAddRef(msgObjRefPool, pRequest); int32_t num = atomic_add_fetch_32(&pTscObj->numOfReqs, 1); if (pTscObj->pAppInfo) { - SInstanceActivity *pActivity = &pTscObj->pAppInfo->summary; + SInstanceSummary *pSummary = &pTscObj->pAppInfo->summary; - int32_t total = atomic_add_fetch_32(&pActivity->totalRequests, 1); - int32_t currentInst = atomic_add_fetch_32(&pActivity->currentRequests, 1); + int32_t total = atomic_add_fetch_32(&pSummary->totalRequests, 1); + int32_t currentInst = atomic_add_fetch_32(&pSummary->currentRequests, 1); tscDebug("0x%" PRIx64 " new Request from connObj:0x%" PRIx64 ", current:%d, app current:%d, total:%d", pRequest->self, pRequest->pTscObj->id, num, currentInst, total); } @@ -61,13 +61,13 @@ static void deregisterRequest(SRequestObj* pRequest) { assert(pRequest != NULL); STscObj* pTscObj = pRequest->pTscObj; - SInstanceActivity* pActivity = &pTscObj->pAppInfo->summary; + SInstanceSummary* pActivity = &pTscObj->pAppInfo->summary; int32_t currentInst = atomic_sub_fetch_32(&pActivity->currentRequests, 1); int32_t num = atomic_sub_fetch_32(&pTscObj->numOfReqs, 1); tscDebug("0x%"PRIx64" free Request from connObj: 0x%"PRIx64", current:%d, app current:%d", pRequest->self, pTscObj->id, num, currentInst); - taosReleaseRef(tscConnRef, pTscObj->id); + taosReleaseRef(clientConnRefPool, pTscObj->id); } static void tscInitLogFile() { @@ -150,7 +150,7 @@ void* createTscObj(const char* user, const char* auth, const char *db, SAppInstI } pthread_mutex_init(&pObj->mutex, NULL); - pObj->id = taosAddRef(tscConnRef, pObj); + pObj->id = taosAddRef(clientConnRefPool, pObj); tscDebug("connObj created, 0x%"PRIx64, pObj->id); return pObj; @@ -173,7 +173,6 @@ void* createRequest(STscObj* pObj, __taos_async_fn_t fp, void* param, int32_t ty pRequest->type = type; pRequest->pTscObj = pObj; pRequest->body.fp = fp; -// pRequest->body.requestMsg. = param; pRequest->msgBuf = calloc(1, ERROR_MSG_BUF_DEFAULT_SIZE); tsem_init(&pRequest->body.rspSem, 0, 0); @@ -202,7 +201,7 @@ void destroyRequest(SRequestObj* pRequest) { return; } - taosReleaseRef(tscReqRef, pRequest->self); + taosReleaseRef(msgObjRefPool, pRequest->self); } void taos_init_imp(void) { @@ -238,8 +237,8 @@ void taos_init_imp(void) { initTaskQueue(); - tscConnRef = taosOpenRef(200, destroyTscObj); - tscReqRef = taosOpenRef(40960, doDestroyRequest); + clientConnRefPool = taosOpenRef(200, destroyTscObj); + msgObjRefPool = taosOpenRef(40960, doDestroyRequest); taosGetAppName(appInfo.appName, NULL); appInfo.pid = taosGetPId(); diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index f00e7bd578..7cd8e9d359 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -11,10 +11,10 @@ #include "parser.h" static int32_t initEpSetFromCfg(const char *firstEp, const char *secondEp, SCorEpSet *pEpSet); -static int32_t buildConnectMsg(SRequestObj *pRequest, SRequestMsgBody* pMsgBody); -static void destroyRequestMsgBody(SRequestMsgBody* pMsgBody); +static SMsgSendInfo* buildConnectMsg(SRequestObj *pRequest); +static void destroySendMsgInfo(SMsgSendInfo* pMsgBody); -static int32_t sendMsgToServer(void *pTransporter, SEpSet* epSet, const SRequestMsgBody *pBody, int64_t* pTransporterId); +static int32_t sendMsgToServer(void *pTransporter, SEpSet* epSet, int64_t* pTransporterId, const SMsgSendInfo* pInfo); static bool stringLengthCheck(const char* str, size_t maxsize) { if (str == NULL) { @@ -163,10 +163,11 @@ TAOS_RES *taos_query_l(TAOS *taos, const char *sql, int sqlLen) { int32_t code = qParseQuerySql(&cxt, &pQuery); if (qIsDclQuery(pQuery)) { SDclStmtInfo* pDcl = (SDclStmtInfo*) pQuery; - pRequest->type = pDcl->msgType; - pRequest->body.requestMsg = (SReqMsgInfo){.pMsg = pDcl->pMsg, .len = pDcl->msgLen}; - SRequestMsgBody body = buildRequestMsgImpl(pRequest); + pRequest->type = pDcl->msgType; + pRequest->body.requestMsg = (SDataBuf){.pData = pDcl->pMsg, .len = pDcl->msgLen}; + + SMsgSendInfo* body = buildSendMsgInfoImpl(pRequest); SEpSet* pEpSet = &pTscObj->pAppInfo->mgmtEp.epSet; if (pDcl->msgType == TSDB_MSG_TYPE_CREATE_TABLE) { @@ -180,7 +181,7 @@ TAOS_RES *taos_query_l(TAOS *taos, const char *sql, int sqlLen) { return pRequest; } - SCreateTableMsg* pMsg = body.msgInfo.pMsg; + SCreateTableMsg* pMsg = body->msgInfo.pData; SName t = {0}; tNameFromString(&t, pMsg->name, T_NAME_ACCT|T_NAME_DB|T_NAME_TABLE); @@ -200,14 +201,14 @@ TAOS_RES *taos_query_l(TAOS *taos, const char *sql, int sqlLen) { tstrncpy(ep.fqdn[i], info.epAddr[i].fqdn, tListLen(ep.fqdn[i])); } - sendMsgToServer(pTscObj->pTransporter, &ep, &body, &transporterId); + sendMsgToServer(pTscObj->pTransporter, &ep, &transporterId, body); } else { int64_t transporterId = 0; - sendMsgToServer(pTscObj->pTransporter, pEpSet, &body, &transporterId); + sendMsgToServer(pTscObj->pTransporter, pEpSet, &transporterId, body); } tsem_wait(&pRequest->body.rspSem); - destroyRequestMsgBody(&body); + destroySendMsgInfo(body); } tfree(cxt.ctx.db); @@ -270,14 +271,13 @@ STscObj* taosConnectImpl(const char *ip, const char *user, const char *auth, con return NULL; } - SRequestMsgBody body = {0}; - buildConnectMsg(pRequest, &body); + SMsgSendInfo* body = buildConnectMsg(pRequest); int64_t transporterId = 0; - sendMsgToServer(pTscObj->pTransporter, &pTscObj->pAppInfo->mgmtEp.epSet, &body, &transporterId); + sendMsgToServer(pTscObj->pTransporter, &pTscObj->pAppInfo->mgmtEp.epSet, &transporterId, body); tsem_wait(&pRequest->body.rspSem); - destroyRequestMsgBody(&body); + destroySendMsgInfo(body); if (pRequest->code != TSDB_CODE_SUCCESS) { const char *errorMsg = (pRequest->code == TSDB_CODE_RPC_FQDN_ERROR) ? taos_errstr(pRequest) : tstrerror(terrno); @@ -294,15 +294,25 @@ STscObj* taosConnectImpl(const char *ip, const char *user, const char *auth, con return pTscObj; } -static int32_t buildConnectMsg(SRequestObj *pRequest, SRequestMsgBody* pMsgBody) { - pMsgBody->msgType = TSDB_MSG_TYPE_CONNECT; - pMsgBody->msgInfo.len = sizeof(SConnectMsg); - pMsgBody->requestObjRefId = pRequest->self; +static SMsgSendInfo* buildConnectMsg(SRequestObj *pRequest) { + SMsgSendInfo *pMsgSendInfo = calloc(1, sizeof(SMsgSendInfo)); + if (pMsgSendInfo == NULL) { + terrno = TSDB_CODE_TSC_OUT_OF_MEMORY; + return NULL; + } + + pMsgSendInfo->msgType = TSDB_MSG_TYPE_CONNECT; + pMsgSendInfo->msgInfo.len = sizeof(SConnectMsg); + pMsgSendInfo->requestObjRefId = pRequest->self; + pMsgSendInfo->requestId = pRequest->requestId; + pMsgSendInfo->fp = handleRequestRspFp[pMsgSendInfo->msgType]; + pMsgSendInfo->param = pRequest; SConnectMsg *pConnect = calloc(1, sizeof(SConnectMsg)); if (pConnect == NULL) { + tfree(pMsgSendInfo); terrno = TSDB_CODE_TSC_OUT_OF_MEMORY; - return -1; + return NULL; } STscObj *pObj = pRequest->pTscObj; @@ -315,84 +325,78 @@ static int32_t buildConnectMsg(SRequestObj *pRequest, SRequestMsgBody* pMsgBody) pConnect->startTime = htobe64(appInfo.startTime); tstrncpy(pConnect->app, appInfo.appName, tListLen(pConnect->app)); - pMsgBody->msgInfo.pMsg = pConnect; - return 0; + pMsgSendInfo->msgInfo.pData = pConnect; + return pMsgSendInfo; } -static void destroyRequestMsgBody(SRequestMsgBody* pMsgBody) { +static void destroySendMsgInfo(SMsgSendInfo* pMsgBody) { assert(pMsgBody != NULL); - tfree(pMsgBody->msgInfo.pMsg); + tfree(pMsgBody->msgInfo.pData); + tfree(pMsgBody); } -int32_t sendMsgToServer(void *pTransporter, SEpSet* epSet, const SRequestMsgBody *pBody, int64_t* pTransporterId) { - char *pMsg = rpcMallocCont(pBody->msgInfo.len); +int32_t sendMsgToServer(void *pTransporter, SEpSet* epSet, int64_t* pTransporterId, const SMsgSendInfo* pInfo) { + char *pMsg = rpcMallocCont(pInfo->msgInfo.len); if (NULL == pMsg) { - tscError("0x%"PRIx64" msg:%s malloc failed", pBody->requestId, taosMsg[pBody->msgType]); + tscError("0x%"PRIx64" msg:%s malloc failed", pInfo->requestId, taosMsg[pInfo->msgType]); terrno = TSDB_CODE_TSC_OUT_OF_MEMORY; return -1; } - memcpy(pMsg, pBody->msgInfo.pMsg, pBody->msgInfo.len); + memcpy(pMsg, pInfo->msgInfo.pData, pInfo->msgInfo.len); SRpcMsg rpcMsg = { - .msgType = pBody->msgType, + .msgType = pInfo->msgType, .pCont = pMsg, - .contLen = pBody->msgInfo.len, - .ahandle = (void*) pBody->requestObjRefId, + .contLen = pInfo->msgInfo.len, + .ahandle = (void*) pInfo, .handle = NULL, .code = 0 }; + assert(pInfo->fp != NULL); + rpcSendRequest(pTransporter, epSet, &rpcMsg, pTransporterId); return TSDB_CODE_SUCCESS; } void processMsgFromServer(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) { - int64_t requestRefId = (int64_t)pMsg->ahandle; + SMsgSendInfo *pSendInfo = (SMsgSendInfo *) pMsg->ahandle; + assert(pMsg->ahandle != NULL); - SRequestObj *pRequest = (SRequestObj *)taosAcquireRef(tscReqRef, requestRefId); - if (pRequest == NULL) { - rpcFreeCont(pMsg->pCont); - return; - } + if (pSendInfo->requestObjRefId != 0) { + SRequestObj *pRequest = (SRequestObj *)taosAcquireRef(msgObjRefPool, pSendInfo->requestObjRefId); + assert(pRequest->self == pSendInfo->requestObjRefId); - assert(pRequest->self == requestRefId); - pRequest->metric.rsp = taosGetTimestampMs(); + pRequest->metric.rsp = taosGetTimestampMs(); + pRequest->code = pMsg->code; - pRequest->code = pMsg->code; - - STscObj *pTscObj = pRequest->pTscObj; - if (pEpSet) { - if (!isEpsetEqual(&pTscObj->pAppInfo->mgmtEp.epSet, pEpSet)) { - updateEpSet_s(&pTscObj->pAppInfo->mgmtEp, pEpSet); - } - } - - /* - * There is not response callback function for submit response. - * The actual inserted number of points is the first number. - */ - if (pMsg->code == TSDB_CODE_SUCCESS) { - tscDebug("0x%" PRIx64 " message:%s, code:%s rspLen:%d, elapsed:%"PRId64 " ms", pRequest->requestId, taosMsg[pMsg->msgType], - tstrerror(pMsg->code), pMsg->contLen, pRequest->metric.rsp - pRequest->metric.start); - if (handleRequestRspFp[pRequest->type]) { - char *p = malloc(pMsg->contLen); - if (p == NULL) { - pRequest->code = TSDB_CODE_TSC_OUT_OF_MEMORY; - terrno = pRequest->code; - } else { - memcpy(p, pMsg->pCont, pMsg->contLen); - pMsg->code = (*handleRequestRspFp[pRequest->type])(pRequest, p, pMsg->contLen); + STscObj *pTscObj = pRequest->pTscObj; + if (pEpSet) { + if (!isEpsetEqual(&pTscObj->pAppInfo->mgmtEp.epSet, pEpSet)) { + updateEpSet_s(&pTscObj->pAppInfo->mgmtEp, pEpSet); } } - } else { - tscError("0x%" PRIx64 " SQL cmd:%s, code:%s rspLen:%d, elapsed time:%"PRId64" ms", pRequest->requestId, taosMsg[pMsg->msgType], - tstrerror(pMsg->code), pMsg->contLen, pRequest->metric.rsp - pRequest->metric.start); + + /* + * There is not response callback function for submit response. + * The actual inserted number of points is the first number. + */ + if (pMsg->code == TSDB_CODE_SUCCESS) { + tscDebug("0x%" PRIx64 " message:%s, code:%s rspLen:%d, elapsed:%" PRId64 " ms", pRequest->requestId, + taosMsg[pMsg->msgType], tstrerror(pMsg->code), pMsg->contLen, + pRequest->metric.rsp - pRequest->metric.start); + } else { + tscError("0x%" PRIx64 " SQL cmd:%s, code:%s rspLen:%d, elapsed time:%" PRId64 " ms", pRequest->requestId, + taosMsg[pMsg->msgType], tstrerror(pMsg->code), pMsg->contLen, + pRequest->metric.rsp - pRequest->metric.start); + } + + taosReleaseRef(msgObjRefPool, pSendInfo->requestObjRefId); } - taosReleaseRef(tscReqRef, requestRefId); + SDataBuf buf = {.pData = pMsg->pCont, .len = pMsg->contLen}; + pSendInfo->fp(pSendInfo->param, &buf, pMsg->code); rpcFreeCont(pMsg->pCont); - - sem_post(&pRequest->body.rspSem); } TAOS *taos_connect_auth(const char *ip, const char *user, const char *auth, const char *db, uint16_t port) { @@ -429,14 +433,14 @@ void* doFetchRow(SRequestObj* pRequest) { if (pResultInfo->pData == NULL || pResultInfo->current >= pResultInfo->numOfRows) { pRequest->type = TSDB_MSG_TYPE_SHOW_RETRIEVE; - SRequestMsgBody body = buildRequestMsgImpl(pRequest); + SMsgSendInfo* body = buildSendMsgInfoImpl(pRequest); - int64_t transporterId = 0; - STscObj* pTscObj = pRequest->pTscObj; - sendMsgToServer(pTscObj->pTransporter, &pTscObj->pAppInfo->mgmtEp.epSet, &body, &transporterId); + int64_t transporterId = 0; + STscObj *pTscObj = pRequest->pTscObj; + sendMsgToServer(pTscObj->pTransporter, &pTscObj->pAppInfo->mgmtEp.epSet, &transporterId, body); tsem_wait(&pRequest->body.rspSem); - destroyRequestMsgBody(&body); + destroySendMsgInfo(body); pResultInfo->current = 0; if (pResultInfo->numOfRows <= pResultInfo->current) { diff --git a/source/client/src/clientMain.c b/source/client/src/clientMain.c index f50765d37a..44c78076d9 100644 --- a/source/client/src/clientMain.c +++ b/source/client/src/clientMain.c @@ -35,14 +35,14 @@ void taos_cleanup(void) { return; } - int32_t id = tscReqRef; - tscReqRef = -1; + int32_t id = msgObjRefPool; + msgObjRefPool = -1; taosCloseRef(id); cleanupTaskQueue(); - id = tscConnRef; - tscConnRef = -1; + id = clientConnRefPool; + clientConnRefPool = -1; taosCloseRef(id); rpcCleanup(); @@ -72,7 +72,7 @@ void taos_close(TAOS* taos) { STscObj *pTscObj = (STscObj *)taos; tscDebug("0x%"PRIx64" try to close connection, numOfReq:%d", pTscObj->id, pTscObj->numOfReqs); - taosRemoveRef(tscConnRef, pTscObj->id); + taosRemoveRef(clientConnRefPool, pTscObj->id); } int taos_errno(TAOS_RES *tres) { @@ -130,7 +130,7 @@ TAOS_RES *taos_query(TAOS *taos, const char *sql) { return NULL; } - return taos_query_l(taos, sql, strlen(sql)); + return taos_query_l(taos, sql, (int32_t) strlen(sql)); } TAOS_ROW taos_fetch_row(TAOS_RES *pRes) { @@ -140,7 +140,7 @@ TAOS_ROW taos_fetch_row(TAOS_RES *pRes) { SRequestObj *pRequest = (SRequestObj *) pRes; if (pRequest->type == TSDB_SQL_RETRIEVE_EMPTY_RESULT || - pRequest->type == TSDB_SQL_INSERT) { + pRequest->type == TSDB_SQL_INSERT || pRequest->code != TSDB_CODE_SUCCESS) { return NULL; } diff --git a/source/client/src/clientMsgHandler.c b/source/client/src/clientMsgHandler.c index 548ea3d725..b18b3ecb51 100644 --- a/source/client/src/clientMsgHandler.c +++ b/source/client/src/clientMsgHandler.c @@ -18,45 +18,23 @@ #include "tname.h" #include "clientInt.h" #include "clientLog.h" -#include "tmsgtype.h" #include "trpc.h" -int (*handleRequestRspFp[TSDB_MSG_TYPE_MAX])(SRequestObj *pRequest, const char* pMsg, int32_t msgLen); +int (*handleRequestRspFp[TSDB_MSG_TYPE_MAX])(void*, const SDataBuf* pMsg, int32_t code); -int32_t buildConnectMsg(SRequestObj *pRequest, SRequestMsgBody* pMsgBody) { - pMsgBody->msgType = TSDB_MSG_TYPE_CONNECT; - pMsgBody->msgInfo.len = sizeof(SConnectMsg); - pMsgBody->requestObjRefId = pRequest->self; - - SConnectMsg *pConnect = calloc(1, sizeof(SConnectMsg)); - if (pConnect == NULL) { - terrno = TSDB_CODE_TSC_OUT_OF_MEMORY; - return -1; - } - - // TODO refactor full_name - char *db; // ugly code to move the space - - STscObj *pObj = pRequest->pTscObj; - pthread_mutex_lock(&pObj->mutex); - db = strstr(pObj->db, TS_PATH_DELIMITER); - - db = (db == NULL) ? pObj->db : db + 1; - tstrncpy(pConnect->db, db, sizeof(pConnect->db)); - pthread_mutex_unlock(&pObj->mutex); - - pConnect->pid = htonl(appInfo.pid); - pConnect->startTime = htobe64(appInfo.startTime); - tstrncpy(pConnect->app, appInfo.appName, tListLen(pConnect->app)); - - pMsgBody->msgInfo.pMsg = pConnect; +int genericExecCallback(void* param, const SDataBuf* pMsg, int32_t code) { + SRequestObj* pRequest = param; + pRequest->code = code; + sem_post(&pRequest->body.rspSem); return 0; } -int processConnectRsp(SRequestObj *pRequest, const char* pMsg, int32_t msgLen) { +int processConnectRsp(void* param, const SDataBuf* pMsg, int32_t code) { + SRequestObj* pRequest = param; + STscObj *pTscObj = pRequest->pTscObj; - SConnectRsp *pConnect = (SConnectRsp *)pMsg; + SConnectRsp *pConnect = (SConnectRsp *)pMsg->pData; pConnect->acctId = htonl(pConnect->acctId); pConnect->connId = htonl(pConnect->connId); pConnect->clusterId = htonl(pConnect->clusterId); @@ -81,15 +59,19 @@ int processConnectRsp(SRequestObj *pRequest, const char* pMsg, int32_t msgLen) { pTscObj->pAppInfo->clusterId = pConnect->clusterId; atomic_add_fetch_64(&pTscObj->pAppInfo->numOfConns, 1); - pRequest->body.resInfo.pRspMsg = pMsg; +// pRequest->body.resInfo.pRspMsg = pMsg->pData; tscDebug("0x%" PRIx64 " clusterId:%d, totalConn:%"PRId64, pRequest->requestId, pConnect->clusterId, pTscObj->pAppInfo->numOfConns); + + sem_post(&pRequest->body.rspSem); return 0; } -static int32_t buildRetrieveMnodeMsg(SRequestObj *pRequest, SRequestMsgBody* pMsgBody) { - pMsgBody->msgType = TSDB_MSG_TYPE_SHOW_RETRIEVE; - pMsgBody->msgInfo.len = sizeof(SRetrieveTableMsg); - pMsgBody->requestObjRefId = pRequest->self; +static int32_t buildRetrieveMnodeMsg(SRequestObj *pRequest, SMsgSendInfo* pMsgSendInfo) { + pMsgSendInfo->msgType = TSDB_MSG_TYPE_SHOW_RETRIEVE; + pMsgSendInfo->msgInfo.len = sizeof(SRetrieveTableMsg); + pMsgSendInfo->requestObjRefId = pRequest->self; + pMsgSendInfo->param = pRequest; + pMsgSendInfo->fp = handleRequestRspFp[pMsgSendInfo->msgType]; SRetrieveTableMsg *pRetrieveMsg = calloc(1, sizeof(SRetrieveTableMsg)); if (pRetrieveMsg == NULL) { @@ -97,29 +79,38 @@ static int32_t buildRetrieveMnodeMsg(SRequestObj *pRequest, SRequestMsgBody* pMs } pRetrieveMsg->showId = htonl(pRequest->body.execId); - pMsgBody->msgInfo.pMsg = pRetrieveMsg; + pMsgSendInfo->msgInfo.pData = pRetrieveMsg; return TSDB_CODE_SUCCESS; } -SRequestMsgBody buildRequestMsgImpl(SRequestObj *pRequest) { +SMsgSendInfo* buildSendMsgInfoImpl(SRequestObj *pRequest) { + SMsgSendInfo* pMsgSendInfo = calloc(1, sizeof(SMsgSendInfo)); + if (pRequest->type == TSDB_MSG_TYPE_SHOW_RETRIEVE) { - SRequestMsgBody body = {0}; - buildRetrieveMnodeMsg(pRequest, &body); - return body; + buildRetrieveMnodeMsg(pRequest, pMsgSendInfo); } else { assert(pRequest != NULL); - SRequestMsgBody body = { - .requestObjRefId = pRequest->self, - .msgInfo = pRequest->body.requestMsg, - .msgType = pRequest->type, - .requestId = pRequest->requestId, - }; - return body; + pMsgSendInfo->requestObjRefId = pRequest->self; + pMsgSendInfo->msgInfo = pRequest->body.requestMsg; + pMsgSendInfo->msgType = pRequest->type; + pMsgSendInfo->requestId = pRequest->requestId; + pMsgSendInfo->param = pRequest; + + pMsgSendInfo->fp = (handleRequestRspFp[pRequest->type] == NULL)? genericExecCallback:handleRequestRspFp[pRequest->type]; } + + return pMsgSendInfo; } -int32_t processShowRsp(SRequestObj *pRequest, const char* pMsg, int32_t msgLen) { - SShowRsp* pShow = (SShowRsp *)pMsg; +int32_t processShowRsp(void* param, const SDataBuf* pMsg, int32_t code) { + SRequestObj* pRequest = param; + if (code != TSDB_CODE_SUCCESS) { + pRequest->code = code; + tsem_post(&pRequest->body.rspSem); + return code; + } + + SShowRsp* pShow = (SShowRsp *)pMsg->pData; pShow->showId = htonl(pShow->showId); STableMetaMsg *pMetaMsg = &(pShow->tableMeta); @@ -140,7 +131,7 @@ int32_t processShowRsp(SRequestObj *pRequest, const char* pMsg, int32_t msgLen) pFields[i].bytes = pSchema[i].bytes; } - pRequest->body.resInfo.pRspMsg = pMsg; +// pRequest->body.resInfo.pRspMsg = pMsg->pData; SReqResultInfo* pResInfo = &pRequest->body.resInfo; pResInfo->fields = pFields; @@ -150,16 +141,18 @@ int32_t processShowRsp(SRequestObj *pRequest, const char* pMsg, int32_t msgLen) pResInfo->length = calloc(pResInfo->numOfCols, sizeof(int32_t)); pRequest->body.execId = pShow->showId; + tsem_post(&pRequest->body.rspSem); return 0; } -int32_t processRetrieveMnodeRsp(SRequestObj *pRequest, const char* pMsg, int32_t msgLen) { - assert(msgLen >= sizeof(SRetrieveTableRsp)); +int32_t processRetrieveMnodeRsp(void* param, const SDataBuf* pMsg, int32_t code) { + assert(pMsg->len >= sizeof(SRetrieveTableRsp)); - tfree(pRequest->body.resInfo.pRspMsg); - pRequest->body.resInfo.pRspMsg = pMsg; + SRequestObj* pRequest = param; +// tfree(pRequest->body.resInfo.pRspMsg); +// pRequest->body.resInfo.pRspMsg = pMsg->pData; - SRetrieveTableRsp *pRetrieve = (SRetrieveTableRsp *) pMsg; + SRetrieveTableRsp *pRetrieve = (SRetrieveTableRsp *) pMsg->pData; pRetrieve->numOfRows = htonl(pRetrieve->numOfRows); pRetrieve->precision = htons(pRetrieve->precision); @@ -172,29 +165,42 @@ int32_t processRetrieveMnodeRsp(SRequestObj *pRequest, const char* pMsg, int32_t tscDebug("0x%"PRIx64" numOfRows:%d, complete:%d, qId:0x%"PRIx64, pRequest->self, pRetrieve->numOfRows, pRetrieve->completed, pRequest->body.execId); + + tsem_post(&pRequest->body.rspSem); return 0; } -int32_t processCreateDbRsp(SRequestObj *pRequest, const char* pMsg, int32_t msgLen) { +int32_t processCreateDbRsp(void* param, const SDataBuf* pMsg, int32_t code) { // todo rsp with the vnode id list + SRequestObj* pRequest = param; + tsem_post(&pRequest->body.rspSem); } -int32_t processUseDbRsp(SRequestObj *pRequest, const char* pMsg, int32_t msgLen) { - SUseDbRsp* pUseDbRsp = (SUseDbRsp*) pMsg; +int32_t processUseDbRsp(void* param, const SDataBuf* pMsg, int32_t code) { + SUseDbRsp* pUseDbRsp = (SUseDbRsp*) pMsg->pData; SName name = {0}; tNameFromString(&name, pUseDbRsp->db, T_NAME_ACCT|T_NAME_DB); char db[TSDB_DB_NAME_LEN] = {0}; tNameGetDbName(&name, db); + + SRequestObj* pRequest = param; setConnectionDB(pRequest->pTscObj, db); + + tsem_post(&pRequest->body.rspSem); + return 0; } -int32_t processCreateTableRsp(SRequestObj *pRequest, const char* pMsg, int32_t msgLen) { +int32_t processCreateTableRsp(void* param, const SDataBuf* pMsg, int32_t code) { assert(pMsg != NULL); + SRequestObj* pRequest = param; + tsem_post(&pRequest->body.rspSem); } -int32_t processDropDbRsp(SRequestObj *pRequest, const char* pMsg, int32_t msgLen) { +int32_t processDropDbRsp(void* param, const SDataBuf* pMsg, int32_t code) { // todo: Remove cache in catalog cache. + SRequestObj* pRequest = param; + tsem_post(&pRequest->body.rspSem); } void initMsgHandleFp() { diff --git a/source/client/test/clientTests.cpp b/source/client/test/clientTests.cpp index 2938d0180a..1a5872f77a 100644 --- a/source/client/test/clientTests.cpp +++ b/source/client/test/clientTests.cpp @@ -49,54 +49,54 @@ int main(int argc, char** argv) { TEST(testCase, driverInit_Test) { taos_init(); } - TEST(testCase, connect_Test) { +TEST(testCase, connect_Test) { TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0); + assert(pConn != NULL); + taos_close(pConn); +} + +//TEST(testCase, create_user_Test) { +// TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0); // assert(pConn != NULL); - taos_close(pConn); -} - - TEST(testCase, create_user_Test) { - TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0); - assert(pConn != NULL); - - TAOS_RES* pRes = taos_query(pConn, "create user abc pass 'abc'"); - if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { - printf("failed to create user, reason:%s\n", taos_errstr(pRes)); - } - - taos_free_result(pRes); - taos_close(pConn); -} - - TEST(testCase, create_account_Test) { - TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0); - assert(pConn != NULL); - - TAOS_RES* pRes = taos_query(pConn, "create account aabc pass 'abc'"); - if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { - printf("failed to create user, reason:%s\n", taos_errstr(pRes)); - } - - taos_free_result(pRes); - taos_close(pConn); -} - - TEST(testCase, drop_account_Test) { - TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0); - assert(pConn != NULL); - - TAOS_RES* pRes = taos_query(pConn, "drop account aabc"); - if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { - printf("failed to create user, reason:%s\n", taos_errstr(pRes)); - } - - taos_free_result(pRes); - taos_close(pConn); -} - - TEST(testCase, show_user_Test) { - TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0); +// +// TAOS_RES* pRes = taos_query(pConn, "create user abc pass 'abc'"); +// if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { +// printf("failed to create user, reason:%s\n", taos_errstr(pRes)); +// } +// +// taos_free_result(pRes); +// taos_close(pConn); +//} +// +//TEST(testCase, create_account_Test) { +// TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0); // assert(pConn != NULL); +// +// TAOS_RES* pRes = taos_query(pConn, "create account aabc pass 'abc'"); +// if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { +// printf("failed to create user, reason:%s\n", taos_errstr(pRes)); +// } +// +// taos_free_result(pRes); +// taos_close(pConn); +//} +// +//TEST(testCase, drop_account_Test) { +// TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0); +// assert(pConn != NULL); +// +// TAOS_RES* pRes = taos_query(pConn, "drop account aabc"); +// if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { +// printf("failed to create user, reason:%s\n", taos_errstr(pRes)); +// } +// +// taos_free_result(pRes); +// taos_close(pConn); +//} + +TEST(testCase, show_user_Test) { + TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0); + assert(pConn != NULL); TAOS_RES* pRes = taos_query(pConn, "show users"); TAOS_ROW pRow = NULL; @@ -113,7 +113,7 @@ TEST(testCase, driverInit_Test) { taos_init(); } taos_close(pConn); } - TEST(testCase, drop_user_Test) { +TEST(testCase, drop_user_Test) { TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0); assert(pConn != NULL); @@ -126,7 +126,7 @@ TEST(testCase, driverInit_Test) { taos_init(); } taos_close(pConn); } - TEST(testCase, show_db_Test) { +TEST(testCase, show_db_Test) { TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0); // assert(pConn != NULL); @@ -191,10 +191,15 @@ TEST(testCase, drop_db_test) { if (taos_errno(pRes) != 0) { printf("failed to drop db, reason:%s\n", taos_errstr(pRes)); } - taos_free_result(pRes); showDB(pConn); + + pRes = taos_query(pConn, "create database abc1"); + if (taos_errno(pRes) != 0) { + printf("create to drop db, reason:%s\n", taos_errstr(pRes)); + } + taos_free_result(pRes); taos_close(pConn); } @@ -248,7 +253,19 @@ TEST(testCase, show_stable_Test) { TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0); assert(pConn != NULL); - TAOS_RES* pRes = taos_query(pConn, "show stables"); + TAOS_RES* pRes = taos_query(pConn, "use abc1"); + if (taos_errno(pRes) != 0) { + printf("failed to use db, reason:%s\n", taos_errstr(pRes)); + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "show stables"); + if (taos_errno(pRes) != 0) { + printf("failed to show stables, reason:%s\n", taos_errstr(pRes)); + taos_free_result(pRes); + ASSERT_TRUE(false); + } + TAOS_ROW pRow = NULL; TAOS_FIELD* pFields = taos_fetch_fields(pRes); diff --git a/source/libs/parser/inc/astToMsg.h b/source/libs/parser/inc/astToMsg.h index c0c3c8386b..361b4e71cb 100644 --- a/source/libs/parser/inc/astToMsg.h +++ b/source/libs/parser/inc/astToMsg.h @@ -7,7 +7,7 @@ SCreateUserMsg* buildUserManipulationMsg(SSqlInfo* pInfo, int32_t* outputLen, int64_t id, char* msgBuf, int32_t msgLen); SCreateAcctMsg* buildAcctManipulationMsg(SSqlInfo* pInfo, int32_t* outputLen, int64_t id, char* msgBuf, int32_t msgLen); SDropUserMsg* buildDropUserMsg(SSqlInfo* pInfo, int32_t* outputLen, int64_t id, char* msgBuf, int32_t msgLen); -SShowMsg* buildShowMsg(SShowInfo* pShowInfo, int64_t id, char* msgBuf, int32_t msgLen); +SShowMsg* buildShowMsg(SShowInfo* pShowInfo, SParseBasicCtx* pParseCtx, char* msgBuf, int32_t msgLen); SCreateDbMsg* buildCreateDbMsg(SCreateDbInfo* pCreateDbInfo, SParseBasicCtx *pCtx, SMsgBuf* pMsgBuf); SCreateStbMsg* buildCreateTableMsg(SCreateTableSql* pCreateTableSql, int32_t* len, SParseBasicCtx* pParseCtx, SMsgBuf* pMsgBuf); SDropTableMsg* buildDropTableMsg(SSqlInfo* pInfo, int32_t* len, SParseBasicCtx* pParseCtx, SMsgBuf* pMsgBuf); diff --git a/source/libs/parser/src/astToMsg.c b/source/libs/parser/src/astToMsg.c index 00f3d3f716..7f2f15ac65 100644 --- a/source/libs/parser/src/astToMsg.c +++ b/source/libs/parser/src/astToMsg.c @@ -86,7 +86,7 @@ SDropUserMsg* buildDropUserMsg(SSqlInfo* pInfo, int32_t *msgLen, int64_t id, cha return pMsg; } -SShowMsg* buildShowMsg(SShowInfo* pShowInfo, int64_t id, char* msgBuf, int32_t msgLen) { +SShowMsg* buildShowMsg(SShowInfo* pShowInfo, SParseBasicCtx *pCtx, char* msgBuf, int32_t msgLen) { SShowMsg* pShowMsg = calloc(1, sizeof(SShowMsg)); pShowMsg->type = pShowInfo->showType; @@ -105,6 +105,12 @@ SShowMsg* buildShowMsg(SShowInfo* pShowInfo, int64_t id, char* msgBuf, int32_t m pShowMsg->payloadLen = htons(pEpAddr->n); } + if (pShowInfo->showType == TSDB_MGMT_TABLE_STB || pShowInfo->showType == TSDB_MGMT_TABLE_VGROUP) { + SName n = {0}; + tNameSetDbName(&n, pCtx->acctId, pCtx->db, strlen(pCtx->db)); + tNameGetFullDbName(&n, pShowMsg->db); + } + return pShowMsg; } diff --git a/source/libs/parser/src/astValidate.c b/source/libs/parser/src/astValidate.c index cd11607326..2510f354fb 100644 --- a/source/libs/parser/src/astValidate.c +++ b/source/libs/parser/src/astValidate.c @@ -4090,7 +4090,7 @@ static int32_t setShowInfo(SShowInfo* pShowInfo, SParseBasicCtx *pCtx, void** ou } } - *output = buildShowMsg(pShowInfo, pCtx->requestId, pMsgBuf->buf, pMsgBuf->len); + *output = buildShowMsg(pShowInfo, pCtx, pMsgBuf->buf, pMsgBuf->len); *outputLen = sizeof(SShowMsg)/* + htons(pShowMsg->payloadLen)*/; return TSDB_CODE_SUCCESS; } From 5ef4444c122667822a64784749510ca46d48c908 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 24 Dec 2021 23:09:38 +0800 Subject: [PATCH 02/10] [td-11818]add test case for support show vgroups; --- source/client/test/clientTests.cpp | 109 +++++++++++++++++++---------- 1 file changed, 71 insertions(+), 38 deletions(-) diff --git a/source/client/test/clientTests.cpp b/source/client/test/clientTests.cpp index 1a5872f77a..0f2c0a727f 100644 --- a/source/client/test/clientTests.cpp +++ b/source/client/test/clientTests.cpp @@ -55,44 +55,44 @@ TEST(testCase, connect_Test) { taos_close(pConn); } -//TEST(testCase, create_user_Test) { -// TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0); -// assert(pConn != NULL); -// -// TAOS_RES* pRes = taos_query(pConn, "create user abc pass 'abc'"); -// if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { -// printf("failed to create user, reason:%s\n", taos_errstr(pRes)); -// } -// -// taos_free_result(pRes); -// taos_close(pConn); -//} -// -//TEST(testCase, create_account_Test) { -// TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0); -// assert(pConn != NULL); -// -// TAOS_RES* pRes = taos_query(pConn, "create account aabc pass 'abc'"); -// if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { -// printf("failed to create user, reason:%s\n", taos_errstr(pRes)); -// } -// -// taos_free_result(pRes); -// taos_close(pConn); -//} -// -//TEST(testCase, drop_account_Test) { -// TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0); -// assert(pConn != NULL); -// -// TAOS_RES* pRes = taos_query(pConn, "drop account aabc"); -// if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { -// printf("failed to create user, reason:%s\n", taos_errstr(pRes)); -// } -// -// taos_free_result(pRes); -// taos_close(pConn); -//} +TEST(testCase, create_user_Test) { + TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0); + assert(pConn != NULL); + + TAOS_RES* pRes = taos_query(pConn, "create user abc pass 'abc'"); + if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { + printf("failed to create user, reason:%s\n", taos_errstr(pRes)); + } + + taos_free_result(pRes); + taos_close(pConn); +} + +TEST(testCase, create_account_Test) { + TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0); + assert(pConn != NULL); + + TAOS_RES* pRes = taos_query(pConn, "create account aabc pass 'abc'"); + if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { + printf("failed to create user, reason:%s\n", taos_errstr(pRes)); + } + + taos_free_result(pRes); + taos_close(pConn); +} + +TEST(testCase, drop_account_Test) { + TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0); + assert(pConn != NULL); + + TAOS_RES* pRes = taos_query(pConn, "drop account aabc"); + if (taos_errno(pRes) != TSDB_CODE_SUCCESS) { + printf("failed to create user, reason:%s\n", taos_errstr(pRes)); + } + + taos_free_result(pRes); + taos_close(pConn); +} TEST(testCase, show_user_Test) { TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0); @@ -282,6 +282,39 @@ TEST(testCase, show_stable_Test) { taos_close(pConn); } +TEST(testCase, show_vgroup_Test) { + TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0); + assert(pConn != NULL); + + TAOS_RES* pRes = taos_query(pConn, "use abc1"); + if (taos_errno(pRes) != 0) { + printf("failed to use db, reason:%s\n", taos_errstr(pRes)); + } + taos_free_result(pRes); + + pRes = taos_query(pConn, "show vgroups"); + if (taos_errno(pRes) != 0) { + printf("failed to show vgroups, reason:%s\n", taos_errstr(pRes)); + taos_free_result(pRes); + ASSERT_TRUE(false); + } + + TAOS_ROW pRow = NULL; + + TAOS_FIELD* pFields = taos_fetch_fields(pRes); + int32_t numOfFields = taos_num_fields(pRes); + + char str[512] = {0}; + while((pRow = taos_fetch_row(pRes)) != NULL) { + int32_t code = taos_print_row(str, pRow, pFields, numOfFields); + printf("%s\n", str); + } + + taos_free_result(pRes); + + taos_close(pConn); +} + TEST(testCase, drop_stable_Test) { TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0); assert(pConn != NULL); From 563c0ddd4473e814b9272e203023f14b3751f1ad Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 24 Dec 2021 23:39:55 +0800 Subject: [PATCH 03/10] [td-11818] refactor. --- include/libs/qcom/query.h | 23 +++++++++++++--- source/client/inc/clientInt.h | 38 ++++++--------------------- source/client/src/clientEnv.c | 11 ++++---- source/client/src/clientImpl.c | 16 +++++------ source/client/src/clientMain.c | 4 +-- source/client/src/clientMsgHandler.c | 4 +-- source/client/test/CMakeLists.txt | 2 +- source/libs/qcom/src/queryUtil.c | 4 +-- source/libs/scheduler/src/scheduler.c | 2 +- 9 files changed, 48 insertions(+), 56 deletions(-) diff --git a/include/libs/qcom/query.h b/include/libs/qcom/query.h index 877cfb130c..86b51dbb85 100644 --- a/include/libs/qcom/query.h +++ b/include/libs/qcom/query.h @@ -88,12 +88,27 @@ typedef struct SUseDbOutput { typedef struct STableMetaOutput { int32_t metaNum; char ctbFname[TSDB_TABLE_FNAME_LEN]; - char tbFname[TSDB_TABLE_FNAME_LEN]; + char tbFname[TSDB_TABLE_FNAME_LEN]; SCTableMeta ctbMeta; STableMeta *tbMeta; } STableMetaOutput; -typedef int32_t __async_exec_fn_t(void* param); +typedef struct SDataBuf { + void *pData; + uint32_t len; +} SDataBuf; + +typedef int32_t (*__async_send_cb_fn_t)(void* param, const SDataBuf* pMsg, int32_t code); +typedef int32_t (*__async_exec_fn_t)(void* param); + +typedef struct SMsgSendInfo { + __async_send_cb_fn_t fp; //async callback function + void *param; + uint64_t requestId; + uint64_t requestObjRefId; + int32_t msgType; + SDataBuf msgInfo; +} SMsgSendInfo; bool tIsValidSchema(struct SSchema* pSchema, int32_t numOfCols, int32_t numOfTags); @@ -109,7 +124,9 @@ int32_t cleanupTaskQueue(); */ int32_t taosAsyncExec(__async_exec_fn_t execFn, void* execParam, int32_t* code); -SSchema* tGetTbnameColumnSchema(); +int32_t asyncSendMsgToServer(void *pTransporter, SEpSet* epSet, int64_t* pTransporterId, const SMsgSendInfo* pInfo); + +const SSchema* tGetTbnameColumnSchema(); void initQueryModuleMsgHandle(); extern int32_t (*queryBuildMsg[TSDB_MSG_TYPE_MAX])(void* input, char **msg, int32_t msgSize, int32_t *msgLen); diff --git a/source/client/inc/clientInt.h b/source/client/inc/clientInt.h index 550d8c3ecf..eba904c0b8 100644 --- a/source/client/inc/clientInt.h +++ b/source/client/inc/clientInt.h @@ -29,6 +29,7 @@ extern "C" { #include "tlist.h" #include "tmsgtype.h" #include "trpc.h" +#include "query.h" typedef struct SQueryExecMetric { int64_t start; // start timestamp @@ -100,11 +101,6 @@ typedef struct SReqResultInfo { uint32_t current; } SReqResultInfo; -typedef struct SDataBuf { - void *pData; - uint32_t len; -} SDataBuf; - typedef struct SRequestSendRecvBody { tsem_t rspSem; // not used now void* fp; @@ -119,39 +115,21 @@ typedef struct SRequestObj { uint64_t requestId; int32_t type; // request type STscObj *pTscObj; - SQueryExecMetric metric; char *sqlstr; // sql string - SRequestSendRecvBody body; int64_t self; char *msgBuf; void *pInfo; // sql parse info, generated by parser module int32_t code; + SQueryExecMetric metric; + SRequestSendRecvBody body; } SRequestObj; -typedef struct SRequestMsgBody { - int32_t msgType; - SDataBuf msgInfo; - uint64_t requestId; - uint64_t requestObjRefId; -} SRequestMsgBody; - -typedef int (*__async_send_cb_fn_t)(void* param, const SDataBuf* pMsg, int32_t code); - -typedef struct SMsgSendInfo { - __async_send_cb_fn_t fp; - void *param; - uint64_t requestId; - uint64_t requestObjRefId; - int32_t msgType; - SDataBuf msgInfo; -} SMsgSendInfo; - extern SAppInfo appInfo; -extern int32_t msgObjRefPool; +extern int32_t clientReqRefPool; extern int32_t clientConnRefPool; SMsgSendInfo* buildSendMsgInfoImpl(SRequestObj *pRequest); -int genericExecCallback(void* param, const SDataBuf* pMsg, int32_t code); +int genericRspCallback(void* param, const SDataBuf* pMsg, int32_t code); extern int (*handleRequestRspFp[TSDB_MSG_TYPE_MAX])(void* param, const SDataBuf* pMsg, int32_t code); int taos_init(); @@ -166,7 +144,7 @@ char *getConnectionDB(STscObj* pObj); void setConnectionDB(STscObj* pTscObj, const char* db); void taos_init_imp(void); -int taos_options_imp(TSDB_OPTION option, const char *str); +int taos_options_imp(TSDB_OPTION option, const char *str); void* openTransporter(const char *user, const char *auth, int32_t numOfThreads); @@ -176,8 +154,8 @@ void initMsgHandleFp(); TAOS *taos_connect_internal(const char *ip, const char *user, const char *pass, const char *auth, const char *db, uint16_t port); TAOS_RES *taos_query_l(TAOS *taos, const char *sql, int sqlLen); -void* doFetchRow(SRequestObj* pRequest); -void setResultDataPtr(SReqResultInfo* pResultInfo, TAOS_FIELD* pFields, int32_t numOfCols, int32_t numOfRows); +void *doFetchRow(SRequestObj* pRequest); +void setResultDataPtr(SReqResultInfo* pResultInfo, TAOS_FIELD* pFields, int32_t numOfCols, int32_t numOfRows); #ifdef __cplusplus } diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c index dca4d85ad6..7fcdafaf44 100644 --- a/source/client/src/clientEnv.c +++ b/source/client/src/clientEnv.c @@ -32,7 +32,7 @@ #define TSC_VAR_RELEASED 0 SAppInfo appInfo; -int32_t msgObjRefPool = -1; +int32_t clientReqRefPool = -1; int32_t clientConnRefPool = -1; static pthread_once_t tscinit = PTHREAD_ONCE_INIT; @@ -43,7 +43,7 @@ static void registerRequest(SRequestObj* pRequest) { assert(pTscObj != NULL); // connection has been released already, abort creating request. - pRequest->self = taosAddRef(msgObjRefPool, pRequest); + pRequest->self = taosAddRef(clientReqRefPool, pRequest); int32_t num = atomic_add_fetch_32(&pTscObj->numOfReqs, 1); @@ -167,12 +167,11 @@ void* createRequest(STscObj* pObj, __taos_async_fn_t fp, void* param, int32_t ty // TODO generated request uuid pRequest->requestId = 0; - pRequest->metric.start = taosGetTimestampMs(); pRequest->type = type; pRequest->pTscObj = pObj; - pRequest->body.fp = fp; + pRequest->body.fp = fp; // not used it yet pRequest->msgBuf = calloc(1, ERROR_MSG_BUF_DEFAULT_SIZE); tsem_init(&pRequest->body.rspSem, 0, 0); @@ -201,7 +200,7 @@ void destroyRequest(SRequestObj* pRequest) { return; } - taosReleaseRef(msgObjRefPool, pRequest->self); + taosReleaseRef(clientReqRefPool, pRequest->self); } void taos_init_imp(void) { @@ -238,7 +237,7 @@ void taos_init_imp(void) { initTaskQueue(); clientConnRefPool = taosOpenRef(200, destroyTscObj); - msgObjRefPool = taosOpenRef(40960, doDestroyRequest); + clientReqRefPool = taosOpenRef(40960, doDestroyRequest); taosGetAppName(appInfo.appName, NULL); appInfo.pid = taosGetPId(); diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index 7cd8e9d359..ed211e142c 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -14,8 +14,6 @@ static int32_t initEpSetFromCfg(const char *firstEp, const char *secondEp, SCorE static SMsgSendInfo* buildConnectMsg(SRequestObj *pRequest); static void destroySendMsgInfo(SMsgSendInfo* pMsgBody); -static int32_t sendMsgToServer(void *pTransporter, SEpSet* epSet, int64_t* pTransporterId, const SMsgSendInfo* pInfo); - static bool stringLengthCheck(const char* str, size_t maxsize) { if (str == NULL) { return false; @@ -201,10 +199,10 @@ TAOS_RES *taos_query_l(TAOS *taos, const char *sql, int sqlLen) { tstrncpy(ep.fqdn[i], info.epAddr[i].fqdn, tListLen(ep.fqdn[i])); } - sendMsgToServer(pTscObj->pTransporter, &ep, &transporterId, body); + asyncSendMsgToServer(pTscObj->pTransporter, &ep, &transporterId, body); } else { int64_t transporterId = 0; - sendMsgToServer(pTscObj->pTransporter, pEpSet, &transporterId, body); + asyncSendMsgToServer(pTscObj->pTransporter, pEpSet, &transporterId, body); } tsem_wait(&pRequest->body.rspSem); @@ -274,7 +272,7 @@ STscObj* taosConnectImpl(const char *ip, const char *user, const char *auth, con SMsgSendInfo* body = buildConnectMsg(pRequest); int64_t transporterId = 0; - sendMsgToServer(pTscObj->pTransporter, &pTscObj->pAppInfo->mgmtEp.epSet, &transporterId, body); + asyncSendMsgToServer(pTscObj->pTransporter, &pTscObj->pAppInfo->mgmtEp.epSet, &transporterId, body); tsem_wait(&pRequest->body.rspSem); destroySendMsgInfo(body); @@ -335,7 +333,7 @@ static void destroySendMsgInfo(SMsgSendInfo* pMsgBody) { tfree(pMsgBody); } -int32_t sendMsgToServer(void *pTransporter, SEpSet* epSet, int64_t* pTransporterId, const SMsgSendInfo* pInfo) { +int32_t asyncSendMsgToServer(void *pTransporter, SEpSet* epSet, int64_t* pTransporterId, const SMsgSendInfo* pInfo) { char *pMsg = rpcMallocCont(pInfo->msgInfo.len); if (NULL == pMsg) { tscError("0x%"PRIx64" msg:%s malloc failed", pInfo->requestId, taosMsg[pInfo->msgType]); @@ -364,7 +362,7 @@ void processMsgFromServer(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) { assert(pMsg->ahandle != NULL); if (pSendInfo->requestObjRefId != 0) { - SRequestObj *pRequest = (SRequestObj *)taosAcquireRef(msgObjRefPool, pSendInfo->requestObjRefId); + SRequestObj *pRequest = (SRequestObj *)taosAcquireRef(clientReqRefPool, pSendInfo->requestObjRefId); assert(pRequest->self == pSendInfo->requestObjRefId); pRequest->metric.rsp = taosGetTimestampMs(); @@ -391,7 +389,7 @@ void processMsgFromServer(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) { pRequest->metric.rsp - pRequest->metric.start); } - taosReleaseRef(msgObjRefPool, pSendInfo->requestObjRefId); + taosReleaseRef(clientReqRefPool, pSendInfo->requestObjRefId); } SDataBuf buf = {.pData = pMsg->pCont, .len = pMsg->contLen}; @@ -437,7 +435,7 @@ void* doFetchRow(SRequestObj* pRequest) { int64_t transporterId = 0; STscObj *pTscObj = pRequest->pTscObj; - sendMsgToServer(pTscObj->pTransporter, &pTscObj->pAppInfo->mgmtEp.epSet, &transporterId, body); + asyncSendMsgToServer(pTscObj->pTransporter, &pTscObj->pAppInfo->mgmtEp.epSet, &transporterId, body); tsem_wait(&pRequest->body.rspSem); destroySendMsgInfo(body); diff --git a/source/client/src/clientMain.c b/source/client/src/clientMain.c index 44c78076d9..af85f1b310 100644 --- a/source/client/src/clientMain.c +++ b/source/client/src/clientMain.c @@ -35,8 +35,8 @@ void taos_cleanup(void) { return; } - int32_t id = msgObjRefPool; - msgObjRefPool = -1; + int32_t id = clientReqRefPool; + clientReqRefPool = -1; taosCloseRef(id); cleanupTaskQueue(); diff --git a/source/client/src/clientMsgHandler.c b/source/client/src/clientMsgHandler.c index b18b3ecb51..700a7a20cf 100644 --- a/source/client/src/clientMsgHandler.c +++ b/source/client/src/clientMsgHandler.c @@ -22,7 +22,7 @@ int (*handleRequestRspFp[TSDB_MSG_TYPE_MAX])(void*, const SDataBuf* pMsg, int32_t code); -int genericExecCallback(void* param, const SDataBuf* pMsg, int32_t code) { +int genericRspCallback(void* param, const SDataBuf* pMsg, int32_t code) { SRequestObj* pRequest = param; pRequest->code = code; sem_post(&pRequest->body.rspSem); @@ -96,7 +96,7 @@ SMsgSendInfo* buildSendMsgInfoImpl(SRequestObj *pRequest) { pMsgSendInfo->requestId = pRequest->requestId; pMsgSendInfo->param = pRequest; - pMsgSendInfo->fp = (handleRequestRspFp[pRequest->type] == NULL)? genericExecCallback:handleRequestRspFp[pRequest->type]; + pMsgSendInfo->fp = (handleRequestRspFp[pRequest->type] == NULL)? genericRspCallback:handleRequestRspFp[pRequest->type]; } return pMsgSendInfo; diff --git a/source/client/test/CMakeLists.txt b/source/client/test/CMakeLists.txt index a3f2ad88bb..6886206363 100644 --- a/source/client/test/CMakeLists.txt +++ b/source/client/test/CMakeLists.txt @@ -8,7 +8,7 @@ AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} SOURCE_LIST) ADD_EXECUTABLE(clientTest ${SOURCE_LIST}) TARGET_LINK_LIBRARIES( clientTest - PUBLIC os util common transport gtest taos + PUBLIC os util common transport gtest taos qcom ) TARGET_INCLUDE_DIRECTORIES( diff --git a/source/libs/qcom/src/queryUtil.c b/source/libs/qcom/src/queryUtil.c index 829f426c9d..df3fa40004 100644 --- a/source/libs/qcom/src/queryUtil.c +++ b/source/libs/qcom/src/queryUtil.c @@ -14,7 +14,7 @@ static struct SSchema _s = { .name = "tbname", }; -SSchema* tGetTbnameColumnSchema() { +const SSchema* tGetTbnameColumnSchema() { return &_s; } @@ -103,7 +103,7 @@ int32_t cleanupTaskQueue() { static void execHelper(struct SSchedMsg* pSchedMsg) { assert(pSchedMsg != NULL && pSchedMsg->ahandle != NULL); - __async_exec_fn_t* execFn = (__async_exec_fn_t*) pSchedMsg->ahandle; + __async_exec_fn_t execFn = (__async_exec_fn_t) pSchedMsg->ahandle; int32_t code = execFn(pSchedMsg->thandle); if (code != 0 && pSchedMsg->msg != NULL) { *(int32_t*) pSchedMsg->msg = code; diff --git a/source/libs/scheduler/src/scheduler.c b/source/libs/scheduler/src/scheduler.c index 4185b3176c..8e57f12777 100644 --- a/source/libs/scheduler/src/scheduler.c +++ b/source/libs/scheduler/src/scheduler.c @@ -32,7 +32,7 @@ int32_t schBuildAndSendRequest(void *pRpc, const SEpSet* pMgmtEps, __taos_async_ buildConnectMsg(pRequest, &body); int64_t transporterId = 0; - sendMsgToServer(pTscObj->pTransporter, &pTscObj->pAppInfo->mgmtEp.epSet, &body, &transporterId); + asyncSendMsgToServer(pTscObj->pTransporter, &pTscObj->pAppInfo->mgmtEp.epSet, &body, &transporterId); tsem_wait(&pRequest->body.rspSem); destroyConnectMsg(&body); From 0d11825d383c3b5dd116886c98198ecf32f436e4 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Sun, 26 Dec 2021 23:46:22 +0800 Subject: [PATCH 04/10] refact trans --- include/common/tmsg.h | 4 + include/common/tmsgdef.h | 1 + source/dnode/mgmt/impl/src/dndTransport.c | 2 + source/dnode/mnode/impl/inc/mndDef.h | 21 +- source/dnode/mnode/impl/inc/mndInt.h | 1 + source/dnode/mnode/impl/inc/mndTrans.h | 6 +- source/dnode/mnode/impl/src/mndMnode.c | 6 +- source/dnode/mnode/impl/src/mndStb.c | 6 +- source/dnode/mnode/impl/src/mndTopic.c | 6 +- source/dnode/mnode/impl/src/mndTrans.c | 440 +++++++++++++--------- source/dnode/mnode/impl/src/mndVgroup.c | 6 +- source/dnode/mnode/impl/src/mnode.c | 21 ++ 12 files changed, 323 insertions(+), 197 deletions(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 92b453bc1f..f0188a5b51 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -655,6 +655,10 @@ typedef struct { SVnodeLoads vnodeLoads; } SStatusMsg; +typedef struct { + int32_t reserved; +} STransMsg; + typedef struct { int32_t dnodeId; int32_t clusterId; diff --git a/include/common/tmsgdef.h b/include/common/tmsgdef.h index 15b5b9da28..ff22e077c0 100644 --- a/include/common/tmsgdef.h +++ b/include/common/tmsgdef.h @@ -114,6 +114,7 @@ enum { TD_DEF_MSG_TYPE(TDMT_MND_SHOW, "mnode-show", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_SHOW_RETRIEVE, "mnode-retrieve", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_STATUS, "mnode-status", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_MND_TRANS, "mnode-trans", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_GRANT, "mnode-grant", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_AUTH, "mnode-auth", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_CREATE_TOPIC, "mnode-create-topic", NULL, NULL) diff --git a/source/dnode/mgmt/impl/src/dndTransport.c b/source/dnode/mgmt/impl/src/dndTransport.c index b8ebe3f884..a5be338a17 100644 --- a/source/dnode/mgmt/impl/src/dndTransport.c +++ b/source/dnode/mgmt/impl/src/dndTransport.c @@ -118,6 +118,8 @@ static void dndInitMsgFp(STransMgmt *pMgmt) { // message from dnode to mnode pMgmt->msgFp[TMSG_INDEX(TDMT_MND_GRANT)] = dndProcessMnodeWriteMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_MND_GRANT_RSP)] = dndProcessDnodeRsp; + pMgmt->msgFp[TMSG_INDEX(TDMT_MND_TRANS)] = dndProcessMnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_MND_TRANS_RSP)] = dndProcessMnodeWriteMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_MND_STATUS)] = dndProcessMnodeWriteMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_MND_STATUS_RSP)] = dndProcessDnodeRsp; pMgmt->msgFp[TMSG_INDEX(TDMT_MND_AUTH)] = dndProcessMnodeReadMsg; diff --git a/source/dnode/mnode/impl/inc/mndDef.h b/source/dnode/mnode/impl/inc/mndDef.h index c6fb0cce1d..fbe7da49c6 100644 --- a/source/dnode/mnode/impl/inc/mndDef.h +++ b/source/dnode/mnode/impl/inc/mndDef.h @@ -62,10 +62,14 @@ typedef enum { typedef enum { TRN_STAGE_PREPARE = 0, - TRN_STAGE_EXECUTE = 1, - TRN_STAGE_ROLLBACK = 2, - TRN_STAGE_COMMIT = 3, - TRN_STAGE_OVER = 4, + TRN_STAGE_REDO_LOG = 1, + TRN_STAGE_REDO_ACTION = 2, + TRN_STAGE_UNDO_LOG = 3, + TRN_STAGE_UNDO_ACTION = 4, + TRN_STAGE_COMMIT_LOG = 5, + TRN_STAGE_COMMIT = 6, + TRN_STAGE_ROLLBACK = 7, + TRN_STAGE_FINISHED = 8 } ETrnStage; typedef enum { TRN_POLICY_ROLLBACK = 0, TRN_POLICY_RETRY = 1 } ETrnPolicy; @@ -95,7 +99,8 @@ typedef struct { int32_t id; ETrnStage stage; ETrnPolicy policy; - int32_t retryTimes; + int32_t code; + int32_t failedTimes; void *rpcHandle; void *rpcAHandle; SArray *redoLogs; @@ -313,12 +318,6 @@ typedef struct SMnodeMsg { void *pCont; } SMnodeMsg; -typedef struct { - int32_t id; - int32_t code; - void *rpcHandle; -} STransMsg; - #ifdef __cplusplus } #endif diff --git a/source/dnode/mnode/impl/inc/mndInt.h b/source/dnode/mnode/impl/inc/mndInt.h index a9932ce048..01dd893e66 100644 --- a/source/dnode/mnode/impl/inc/mndInt.h +++ b/source/dnode/mnode/impl/inc/mndInt.h @@ -75,6 +75,7 @@ typedef struct SMnode { int8_t selfIndex; SReplica replicas[TSDB_MAX_REPLICA]; tmr_h timer; + tmr_h transTimer; char *path; SMnodeCfg cfg; int64_t checkTime; diff --git a/source/dnode/mnode/impl/inc/mndTrans.h b/source/dnode/mnode/impl/inc/mndTrans.h index 2d57179f1c..201fcde1a9 100644 --- a/source/dnode/mnode/impl/inc/mndTrans.h +++ b/source/dnode/mnode/impl/inc/mndTrans.h @@ -44,11 +44,7 @@ int32_t mndTransAppendRedoAction(STrans *pTrans, STransAction *pAction); int32_t mndTransAppendUndoAction(STrans *pTrans, STransAction *pAction); int32_t mndTransPrepare(SMnode *pMnode, STrans *pTrans); -void mndTransApply(SMnode *pMnode, SSdbRaw *pRaw, STransMsg *pMsg, int32_t code); -void mndTransHandleActionRsp(SMnodeMsg *pMsg); - -char *mndTransStageStr(ETrnStage stage); -char *mndTransPolicyStr(ETrnPolicy policy); +void mndTransProcessRsp(SMnodeMsg *pMsg); #ifdef __cplusplus } diff --git a/source/dnode/mnode/impl/src/mndMnode.c b/source/dnode/mnode/impl/src/mndMnode.c index 8f57a18a1d..1800fd8e83 100644 --- a/source/dnode/mnode/impl/src/mndMnode.c +++ b/source/dnode/mnode/impl/src/mndMnode.c @@ -567,17 +567,17 @@ static int32_t mndProcessDropMnodeReq(SMnodeMsg *pMsg) { } static int32_t mndProcessCreateMnodeRsp(SMnodeMsg *pMsg) { - mndTransHandleActionRsp(pMsg); + mndTransProcessRsp(pMsg); return 0; } static int32_t mndProcessAlterMnodeRsp(SMnodeMsg *pMsg) { - mndTransHandleActionRsp(pMsg); + mndTransProcessRsp(pMsg); return 0; } static int32_t mndProcessDropMnodeRsp(SMnodeMsg *pMsg) { - mndTransHandleActionRsp(pMsg); + mndTransProcessRsp(pMsg); return 0; } diff --git a/source/dnode/mnode/impl/src/mndStb.c b/source/dnode/mnode/impl/src/mndStb.c index 24d88068bf..bdc13f91b7 100644 --- a/source/dnode/mnode/impl/src/mndStb.c +++ b/source/dnode/mnode/impl/src/mndStb.c @@ -552,7 +552,7 @@ static int32_t mndProcessCreateStbMsg(SMnodeMsg *pMsg) { } static int32_t mndProcessCreateStbInRsp(SMnodeMsg *pMsg) { - mndTransHandleActionRsp(pMsg); + mndTransProcessRsp(pMsg); return 0; } @@ -616,7 +616,7 @@ static int32_t mndProcessAlterStbMsg(SMnodeMsg *pMsg) { } static int32_t mndProcessAlterStbInRsp(SMnodeMsg *pMsg) { - mndTransHandleActionRsp(pMsg); + mndTransProcessRsp(pMsg); return 0; } @@ -728,7 +728,7 @@ static int32_t mndProcessDropStbMsg(SMnodeMsg *pMsg) { } static int32_t mndProcessDropStbInRsp(SMnodeMsg *pMsg) { - mndTransHandleActionRsp(pMsg); + mndTransProcessRsp(pMsg); return 0; } diff --git a/source/dnode/mnode/impl/src/mndTopic.c b/source/dnode/mnode/impl/src/mndTopic.c index 04f6907918..7106c79588 100644 --- a/source/dnode/mnode/impl/src/mndTopic.c +++ b/source/dnode/mnode/impl/src/mndTopic.c @@ -524,7 +524,7 @@ static int32_t mndProcessAlterTopicMsg(SMnodeMsg *pMsg) { } static int32_t mndProcessAlterTopicInRsp(SMnodeMsg *pMsg) { - mndTransHandleActionRsp(pMsg); + mndTransProcessRsp(pMsg); return 0; } @@ -636,7 +636,7 @@ static int32_t mndProcessDropTopicMsg(SMnodeMsg *pMsg) { } static int32_t mndProcessDropTopicInRsp(SMnodeMsg *pMsg) { - mndTransHandleActionRsp(pMsg); + mndTransProcessRsp(pMsg); return 0; } @@ -706,7 +706,7 @@ static int32_t mndProcessTopicMetaMsg(SMnodeMsg *pMsg) { } static int32_t mndProcessCreateTopicInRsp(SMnodeMsg *pMsg) { - mndTransHandleActionRsp(pMsg); + mndTransProcessRsp(pMsg); return 0; } diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 0b714c34ae..b3a584c682 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -27,7 +27,6 @@ static int32_t mndTransActionInsert(SSdb *pSdb, STrans *pTrans); static int32_t mndTransActionUpdate(SSdb *pSdb, STrans *OldTrans, STrans *pOldTrans); static int32_t mndTransActionDelete(SSdb *pSdb, STrans *pTrans); -static void mndTransSendRpcRsp(STrans *pTrans, int32_t code); static int32_t mndTransAppendLog(SArray *pArray, SSdbRaw *pRaw); static int32_t mndTransAppendAction(SArray *pArray, STransAction *pAction); static void mndTransDropLogs(SArray *pArray); @@ -36,14 +35,22 @@ static int32_t mndTransExecuteLogs(SMnode *pMnode, SArray *pArray); static int32_t mndTransExecuteActions(SMnode *pMnode, STrans *pTrans, SArray *pArray); static int32_t mndTransExecuteRedoLogs(SMnode *pMnode, STrans *pTrans); static int32_t mndTransExecuteUndoLogs(SMnode *pMnode, STrans *pTrans); -static int32_t mndTransExecuteCommitLogs(SMnode *pMnode, STrans *pTrans); static int32_t mndTransExecuteRedoActions(SMnode *pMnode, STrans *pTrans); static int32_t mndTransExecuteUndoActions(SMnode *pMnode, STrans *pTrans); -static void mndTransPerformPrepareStage(SMnode *pMnode, STrans *pTrans); -static int32_t mndTransPerformExecuteStage(SMnode *pMnode, STrans *pTrans); -static int32_t mndTransPerformCommitStage(SMnode *pMnode, STrans *pTrans); -static int32_t mndTransPerformRollbackStage(SMnode *pMnode, STrans *pTrans); +static int32_t mndTransExecuteCommitLogs(SMnode *pMnode, STrans *pTrans); +static bool mndTransPerformPrepareStage(SMnode *pMnode, STrans *pTrans); +static bool mndTransPerformRedoLogStage(SMnode *pMnode, STrans *pTrans); +static bool mndTransPerformRedoActionStage(SMnode *pMnode, STrans *pTrans); +static bool mndTransPerformUndoLogStage(SMnode *pMnode, STrans *pTrans); +static bool mndTransPerformUndoActionStage(SMnode *pMnode, STrans *pTrans); +static bool mndTransPerformCommitLogStage(SMnode *pMnode, STrans *pTrans); +static bool mndTransPerformCommitStage(SMnode *pMnode, STrans *pTrans); +static bool mndTransPerformRollbackStage(SMnode *pMnode, STrans *pTrans); +static bool mndTransPerfromFinishedStage(SMnode *pMnode, STrans *pTrans); + static void mndTransExecute(SMnode *pMnode, STrans *pTrans); +static void mndTransSendRpcRsp(STrans *pTrans); +static int32_t mndProcessTransMsg(SMnodeMsg *pMsg); int32_t mndInitTrans(SMnode *pMnode) { SSdbTable table = {.sdbType = SDB_TRANS, @@ -54,6 +61,7 @@ int32_t mndInitTrans(SMnode *pMnode) { .updateFp = (SdbUpdateFp)mndTransActionUpdate, .deleteFp = (SdbDeleteFp)mndTransActionDelete}; + mndSetMsgHandle(pMnode, TDMT_MND_TRANS, mndProcessTransMsg); return sdbSetTable(pMnode->pSdb, table); } @@ -290,12 +298,12 @@ TRANS_DECODE_OVER: static int32_t mndTransActionInsert(SSdb *pSdb, STrans *pTrans) { pTrans->stage = TRN_STAGE_PREPARE; - mTrace("trans:%d, perform insert action, stage:%s", pTrans->id, mndTransStageStr(pTrans->stage)); + mTrace("trans:%d, perform insert action", pTrans->id); return 0; } static int32_t mndTransActionDelete(SSdb *pSdb, STrans *pTrans) { - mTrace("trans:%d, perform delete action, stage:%s", pTrans->id, mndTransStageStr(pTrans->stage)); + mTrace("trans:%d, perform delete action", pTrans->id); mndTransDropLogs(pTrans->redoLogs); mndTransDropLogs(pTrans->undoLogs); @@ -307,7 +315,7 @@ static int32_t mndTransActionDelete(SSdb *pSdb, STrans *pTrans) { } static int32_t mndTransActionUpdate(SSdb *pSdb, STrans *pOldTrans, STrans *pNewTrans) { - mTrace("trans:%d, perform update action, stage:%s", pOldTrans->id, mndTransStageStr(pNewTrans->stage)); + mTrace("trans:%d, perform update action", pOldTrans->id); pOldTrans->stage = pNewTrans->stage; return 0; } @@ -326,34 +334,6 @@ void mndReleaseTrans(SMnode *pMnode, STrans *pTrans) { sdbRelease(pSdb, pTrans); } -char *mndTransStageStr(ETrnStage stage) { - switch (stage) { - case TRN_STAGE_PREPARE: - return "prepare"; - case TRN_STAGE_EXECUTE: - return "execute"; - case TRN_STAGE_COMMIT: - return "commit"; - case TRN_STAGE_ROLLBACK: - return "rollback"; - case TRN_STAGE_OVER: - return "over"; - default: - return "undefined"; - } -} - -char *mndTransPolicyStr(ETrnPolicy policy) { - switch (policy) { - case TRN_POLICY_ROLLBACK: - return "prepare"; - case TRN_POLICY_RETRY: - return "retry"; - default: - return "undefined"; - } -} - STrans *mndTransCreate(SMnode *pMnode, ETrnPolicy policy, SRpcMsg *pMsg) { STrans *pTrans = calloc(1, sizeof(STrans)); if (pTrans == NULL) { @@ -428,23 +408,11 @@ static int32_t mndTransAppendLog(SArray *pArray, SSdbRaw *pRaw) { return 0; } -int32_t mndTransAppendRedolog(STrans *pTrans, SSdbRaw *pRaw) { - int32_t code = mndTransAppendLog(pTrans->redoLogs, pRaw); - mTrace("trans:%d, raw:%p append to redo logs, code:0x%x", pTrans->id, pRaw, code); - return code; -} +int32_t mndTransAppendRedolog(STrans *pTrans, SSdbRaw *pRaw) { return mndTransAppendLog(pTrans->redoLogs, pRaw); } -int32_t mndTransAppendUndolog(STrans *pTrans, SSdbRaw *pRaw) { - int32_t code = mndTransAppendLog(pTrans->undoLogs, pRaw); - mTrace("trans:%d, raw:%p append to undo logs, code:0x%x", pTrans->id, pRaw, code); - return code; -} +int32_t mndTransAppendUndolog(STrans *pTrans, SSdbRaw *pRaw) { return mndTransAppendLog(pTrans->undoLogs, pRaw); } -int32_t mndTransAppendCommitlog(STrans *pTrans, SSdbRaw *pRaw) { - int32_t code = mndTransAppendLog(pTrans->commitLogs, pRaw); - mTrace("trans:%d, raw:%p append to commit logs, code:0x%x", pTrans->id, pRaw, code); - return code; -} +int32_t mndTransAppendCommitlog(STrans *pTrans, SSdbRaw *pRaw) { return mndTransAppendLog(pTrans->commitLogs, pRaw); } static int32_t mndTransAppendAction(SArray *pArray, STransAction *pAction) { void *ptr = taosArrayPush(pArray, pAction); @@ -457,20 +425,14 @@ static int32_t mndTransAppendAction(SArray *pArray, STransAction *pAction) { } int32_t mndTransAppendRedoAction(STrans *pTrans, STransAction *pAction) { - int32_t code = mndTransAppendAction(pTrans->redoActions, pAction); - mTrace("trans:%d, msg:%s append to redo actions, code:0x%x", pTrans->id, TMSG_INFO(pAction->msgType), code); - return code; + return mndTransAppendAction(pTrans->redoActions, pAction); } int32_t mndTransAppendUndoAction(STrans *pTrans, STransAction *pAction) { - int32_t code = mndTransAppendAction(pTrans->undoActions, pAction); - mTrace("trans:%d, msg:%s append to undo actions, code:0x%x", pTrans->id, TMSG_INFO(pAction->msgType), code); - return code; + return mndTransAppendAction(pTrans->undoActions, pAction); } -int32_t mndTransPrepare(SMnode *pMnode, STrans *pTrans) { - mDebug("trans:%d, prepare transaction", pTrans->id); - +static int32_t mndTransSync(SMnode *pMnode, STrans *pTrans) { SSdbRaw *pRaw = mndTransActionEncode(pTrans); if (pRaw == NULL) { mError("trans:%d, failed to decode trans since %s", pTrans->id, terrstr()); @@ -494,6 +456,17 @@ int32_t mndTransPrepare(SMnode *pMnode, STrans *pTrans) { return -1; } + return 0; +} + +int32_t mndTransPrepare(SMnode *pMnode, STrans *pTrans) { + mDebug("trans:%d, prepare transaction", pTrans->id); + if (mndTransSync(pMnode, pTrans) != 0) { + mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr()); + return -1; + } + mDebug("trans:%d, prepare finished", pTrans->id); + STrans *pNewTrans = mndAcquireTrans(pMnode, pTrans->id); if (pNewTrans == NULL) { mError("trans:%d, failed to read from sdb since %s", pTrans->id, terrstr()); @@ -507,84 +480,41 @@ int32_t mndTransPrepare(SMnode *pMnode, STrans *pTrans) { return 0; } -int32_t mndTransCommit(SMnode *pMnode, STrans *pTrans) { +static int32_t mndTransCommit(SMnode *pMnode, STrans *pTrans) { + if (taosArrayGetSize(pTrans->commitLogs) == 0 && taosArrayGetSize(pTrans->redoActions) == 0) return 0; + mDebug("trans:%d, commit transaction", pTrans->id); - - SSdbRaw *pRaw = mndTransActionEncode(pTrans); - if (pRaw == NULL) { - mError("trans:%d, failed to decode trans since %s", pTrans->id, terrstr()); + if (mndTransSync(pMnode, pTrans) != 0) { + mError("trans:%d, failed to commit since %s", pTrans->id, terrstr()); return -1; } - sdbSetRawStatus(pRaw, SDB_STATUS_DROPPED); - - if (taosArrayGetSize(pTrans->commitLogs) != 0) { - mTrace("trans:%d, sync to other nodes", pTrans->id); - if (mndSyncPropose(pMnode, pRaw) != 0) { - mError("trans:%d, failed to sync since %s", pTrans->id, terrstr()); - sdbFreeRaw(pRaw); - return -1; - } - mTrace("trans:%d, sync finished", pTrans->id); - } - - if (sdbWrite(pMnode->pSdb, pRaw) != 0) { - mError("trans:%d, failed to write sdb since %s", pTrans->id, terrstr()); - return -1; - } - mDebug("trans:%d, commit finished", pTrans->id); return 0; } -int32_t mndTransRollback(SMnode *pMnode, STrans *pTrans) { +static int32_t mndTransRollback(SMnode *pMnode, STrans *pTrans) { mDebug("trans:%d, rollback transaction", pTrans->id); - - SSdbRaw *pRaw = mndTransActionEncode(pTrans); - if (pRaw == NULL) { - mError("trans:%d, failed to decode trans since %s", pTrans->id, terrstr()); + if (mndTransSync(pMnode, pTrans) != 0) { + mError("trans:%d, failed to rollback since %s", pTrans->id, terrstr()); return -1; } - sdbSetRawStatus(pRaw, SDB_STATUS_DROPPED); - - mTrace("trans:%d, sync to other nodes", pTrans->id); - int32_t code = mndSyncPropose(pMnode, pRaw); - if (code != 0) { - mError("trans:%d, failed to sync since %s", pTrans->id, terrstr()); - sdbFreeRaw(pRaw); - return -1; - } - - mTrace("trans:%d, sync finished", pTrans->id); - code = sdbWrite(pMnode->pSdb, pRaw); - if (code != 0) { - mError("trans:%d, failed to write sdb since %s", pTrans->id, terrstr()); - return -1; - } - mDebug("trans:%d, rollback finished", pTrans->id); return 0; } -static void mndTransSendRpcRsp(STrans *pTrans, int32_t code) { - if (code == TSDB_CODE_MND_ACTION_IN_PROGRESS) return; - mDebug("trans:%d, send rpc rsp, RPC:%p ahandle:%p code:0x%x", pTrans->id, pTrans->rpcHandle, pTrans->rpcAHandle, - code & 0xFFFF); - +static void mndTransSendRpcRsp(STrans *pTrans) { if (pTrans->rpcHandle != NULL) { - SRpcMsg rspMsg = {.handle = pTrans->rpcHandle, .code = code, .ahandle = pTrans->rpcAHandle}; + mDebug("trans:%d, send rsp, ahandle:%p code:0x%x", pTrans->id, pTrans->rpcAHandle, pTrans->code & 0xFFFF); + SRpcMsg rspMsg = {.handle = pTrans->rpcHandle, .code = pTrans->code, .ahandle = pTrans->rpcAHandle}; rpcSendResponse(&rspMsg); } } -void mndTransApply(SMnode *pMnode, SSdbRaw *pRaw, STransMsg *pMsg, int32_t code) { - // todo -} - -void mndTransHandleActionRsp(SMnodeMsg *pMsg) { +void mndTransProcessRsp(SMnodeMsg *pMsg) { SMnode *pMnode = pMsg->pMnode; - int64_t sig = (int64_t)(pMsg->rpcMsg.ahandle); - int32_t transId = (int32_t)(sig >> 32); - int32_t action = (int32_t)((sig << 32) >> 32); + int64_t signature = (int64_t)(pMsg->rpcMsg.ahandle); + int32_t transId = (int32_t)(signature >> 32); + int32_t action = (int32_t)((signature << 32) >> 32); STrans *pTrans = mndAcquireTrans(pMnode, transId); if (pTrans == NULL) { @@ -593,15 +523,17 @@ void mndTransHandleActionRsp(SMnodeMsg *pMsg) { } SArray *pArray = NULL; - if (pTrans->stage == TRN_STAGE_EXECUTE) { + if (pTrans->stage == TRN_STAGE_REDO_ACTION) { pArray = pTrans->redoActions; - } else if (pTrans->stage == TRN_STAGE_ROLLBACK) { + } else if (pTrans->stage == TRN_STAGE_UNDO_ACTION) { pArray = pTrans->undoActions; } else { + mError("trans:%d, invalid trans stage:%d while recv action rsp", pTrans->id, pTrans->stage); + goto HANDLE_ACTION_RSP_OVER; } if (pArray == NULL) { - mError("trans:%d, invalid trans stage:%s", transId, mndTransStageStr(pTrans->stage)); + mError("trans:%d, invalid trans stage:%d", transId, pTrans->stage); goto HANDLE_ACTION_RSP_OVER; } @@ -653,15 +585,27 @@ static int32_t mndTransExecuteCommitLogs(SMnode *pMnode, STrans *pTrans) { return mndTransExecuteLogs(pMnode, pTrans->commitLogs); } -static int32_t mndTransExecuteActions(SMnode *pMnode, STrans *pTrans, SArray *pArray) { +static void mndTransResetActions(SMnode *pMnode, STrans *pTrans, SArray *pArray) { + int32_t numOfActions = taosArrayGetSize(pArray); + + for (int32_t action = 0; action < numOfActions; ++action) { + STransAction *pAction = taosArrayGet(pArray, action); + if (pAction == NULL) continue; + if (pAction->msgSent && pAction->msgReceived && pAction->errCode == 0) continue; + + pAction->msgSent = 0; + pAction->msgReceived = 0; + pAction->errCode = 0; + mDebug("trans:%d, action:%d is reset and will be re-executed", pTrans->id, action); + } +} + +static int32_t mndTransSendActionMsg(SMnode *pMnode, STrans *pTrans, SArray *pArray) { int32_t numOfActions = taosArrayGetSize(pArray); - if (numOfActions == 0) return 0; for (int32_t action = 0; action < numOfActions; ++action) { STransAction *pAction = taosArrayGet(pArray, action); if (pAction == NULL) continue; - // if (pAction->msgSent && !pAction->msgReceived) continue; - // if (pAction->msgSent && pAction->msgReceived && pAction->errCode == 0) continue; if (pAction->msgSent) continue; int64_t signature = pTrans->id; @@ -684,6 +628,17 @@ static int32_t mndTransExecuteActions(SMnode *pMnode, STrans *pTrans, SArray *pA mndSendMsgToDnode(pMnode, &pAction->epSet, &rpcMsg); } + return 0; +} + +static int32_t mndTransExecuteActions(SMnode *pMnode, STrans *pTrans, SArray *pArray) { + int32_t numOfActions = taosArrayGetSize(pArray); + if (numOfActions == 0) return 0; + + if (mndTransSendActionMsg(pMnode, pTrans, pArray) != 0) { + return -1; + } + int32_t numOfReceived = 0; int32_t errCode = 0; for (int32_t action = 0; action < numOfActions; ++action) { @@ -698,9 +653,15 @@ static int32_t mndTransExecuteActions(SMnode *pMnode, STrans *pTrans, SArray *pA } if (numOfReceived == numOfActions) { - mDebug("trans:%d, all %d actions executed, code:0x%x", pTrans->id, numOfActions, errCode); - terrno = errCode; - return errCode; + if (errCode == 0) { + mDebug("trans:%d, all %d actions execute successfully", pTrans->id, numOfActions); + return 0; + } else { + mError("trans:%d, all %d actions executed, code:0x%x", pTrans->id, numOfActions, errCode); + mndTransResetActions(pMnode, pTrans, pArray); + terrno = errCode; + return errCode; + } } else { mDebug("trans:%d, %d of %d actions executed, code:0x%x", pTrans->id, numOfReceived, numOfActions, errCode); return TSDB_CODE_MND_ACTION_IN_PROGRESS; @@ -715,88 +676,229 @@ static int32_t mndTransExecuteUndoActions(SMnode *pMnode, STrans *pTrans) { return mndTransExecuteActions(pMnode, pTrans, pTrans->undoActions); } -static void mndTransPerformPrepareStage(SMnode *pMnode, STrans *pTrans) { +static bool mndTransPerformPrepareStage(SMnode *pMnode, STrans *pTrans) { + bool continueExec = true; + pTrans->stage = TRN_STAGE_REDO_LOG; + mDebug("trans:%d, stage from prepare to redoLog", pTrans->id); + return continueExec; +} + +static bool mndTransPerformRedoLogStage(SMnode *pMnode, STrans *pTrans) { + bool continueExec = true; int32_t code = mndTransExecuteRedoLogs(pMnode, pTrans); if (code == 0) { - pTrans->stage = TRN_STAGE_EXECUTE; - mDebug("trans:%d, stage from prepare to execute", pTrans->id); + pTrans->code = 0; + pTrans->stage = TRN_STAGE_REDO_ACTION; + mDebug("trans:%d, stage from redoLog to redoAction", pTrans->id); } else { - pTrans->stage = TRN_STAGE_ROLLBACK; - mError("trans:%d, stage from prepare to rollback since %s", pTrans->id, terrstr()); + pTrans->code = terrno; + pTrans->stage = TRN_STAGE_UNDO_LOG; + mError("trans:%d, stage from redoLog to undoLog", pTrans->id); } + + return continueExec; } -static int32_t mndTransPerformExecuteStage(SMnode *pMnode, STrans *pTrans) { +static bool mndTransPerformRedoActionStage(SMnode *pMnode, STrans *pTrans) { + bool continueExec = true; int32_t code = mndTransExecuteRedoActions(pMnode, pTrans); if (code == 0) { + pTrans->code = 0; pTrans->stage = TRN_STAGE_COMMIT; - mDebug("trans:%d, stage from execute to commit", pTrans->id); + mDebug("trans:%d, stage from redoAction to commit", pTrans->id); + continueExec = true; } else if (code == TSDB_CODE_MND_ACTION_IN_PROGRESS) { - mDebug("trans:%d, stage keep on execute since %s", pTrans->id, tstrerror(code)); + mDebug("trans:%d, stage keep on redoAction since %s", pTrans->id, tstrerror(code)); + continueExec = false; } else { + pTrans->code = terrno; if (pTrans->policy == TRN_POLICY_ROLLBACK) { - pTrans->stage = TRN_STAGE_ROLLBACK; - mError("trans:%d, stage from execute to rollback since %s", pTrans->id, terrstr()); + pTrans->stage = TRN_STAGE_UNDO_ACTION; + mError("trans:%d, stage from redoAction to undoAction since %s", pTrans->id, terrstr()); + continueExec = true; } else { - pTrans->stage = TRN_STAGE_EXECUTE; - pTrans->retryTimes++; - mError("trans:%d, stage keep on execute since %s", pTrans->id, terrstr()); + pTrans->failedTimes++; + mError("trans:%d, stage keep on redoAction since %s, failedTimes:%d", pTrans->id, terrstr(), pTrans->failedTimes); + continueExec = false; } } - return code; + return continueExec; } -static int32_t mndTransPerformCommitStage(SMnode *pMnode, STrans *pTrans) { - mndTransExecuteCommitLogs(pMnode, pTrans); - pTrans->stage = TRN_STAGE_OVER; - return 0; +static bool mndTransPerformCommitStage(SMnode *pMnode, STrans *pTrans) { + bool continueExec = true; + int32_t code = mndTransCommit(pMnode, pTrans); + + if (code == 0) { + pTrans->code = 0; + pTrans->stage = TRN_STAGE_COMMIT_LOG; + mDebug("trans:%d, stage from commit to commitLog", pTrans->id); + continueExec = true; + } else { + pTrans->code = terrno; + if (pTrans->policy == TRN_POLICY_ROLLBACK) { + pTrans->stage = TRN_STAGE_REDO_ACTION; + mError("trans:%d, stage from commit to redoAction since %s, failedTimes:%d", pTrans->id, terrstr(), + pTrans->failedTimes); + continueExec = true; + } else { + pTrans->failedTimes++; + mError("trans:%d, stage keep on commit since %s, failedTimes:%d", pTrans->id, terrstr(), pTrans->failedTimes); + continueExec = false; + } + } + + return continueExec; } -static int32_t mndTransPerformRollbackStage(SMnode *pMnode, STrans *pTrans) { +static bool mndTransPerformCommitLogStage(SMnode *pMnode, STrans *pTrans) { + bool continueExec = true; + int32_t code = mndTransExecuteCommitLogs(pMnode, pTrans); + + if (code == 0) { + pTrans->code = 0; + pTrans->stage = TRN_STAGE_FINISHED; + mDebug("trans:%d, stage from commitLog to finished", pTrans->id); + continueExec = true; + } else { + pTrans->code = terrno; + pTrans->failedTimes++; + mError("trans:%d, stage keep on commitLog since %s", pTrans->id, terrstr()); + continueExec = false; + ; + } + + return continueExec; +} + +static bool mndTransPerformUndoLogStage(SMnode *pMnode, STrans *pTrans) { + bool continueExec = true; + int32_t code = mndTransExecuteUndoLogs(pMnode, pTrans); + + if (code == 0) { + pTrans->stage = TRN_STAGE_ROLLBACK; + mDebug("trans:%d, stage from undoLog to rollback", pTrans->id); + continueExec = true; + } else { + mDebug("trans:%d, stage keep on undoLog since %s", pTrans->id, terrstr()); + continueExec = false; + } + + return continueExec; +} + +static bool mndTransPerformUndoActionStage(SMnode *pMnode, STrans *pTrans) { + bool continueExec = true; int32_t code = mndTransExecuteUndoActions(pMnode, pTrans); if (code == 0) { - mDebug("trans:%d, rollbacked", pTrans->id); + pTrans->stage = TRN_STAGE_REDO_LOG; + mDebug("trans:%d, stage from undoAction to undoLog", pTrans->id); + continueExec = true; + } else if (code == TSDB_CODE_MND_ACTION_IN_PROGRESS) { + mDebug("trans:%d, stage keep on undoAction since %s", pTrans->id, tstrerror(code)); + continueExec = false; } else { - pTrans->stage = TRN_STAGE_ROLLBACK; - pTrans->retryTimes++; - mError("trans:%d, stage keep on rollback since %s", pTrans->id, terrstr()); + pTrans->failedTimes++; + mError("trans:%d, stage keep on undoAction since %s", pTrans->id, terrstr()); + continueExec = false; } - return code; + return continueExec; +} + +static bool mndTransPerformRollbackStage(SMnode *pMnode, STrans *pTrans) { + bool continueExec = true; + int32_t code = mndTransRollback(pMnode, pTrans); + + if (code == 0) { + pTrans->stage = TRN_STAGE_FINISHED; + mDebug("trans:%d, stage from rollback to finished", pTrans->id); + continueExec = true; + ; + } else { + pTrans->failedTimes++; + mError("trans:%d, stage keep on rollback since %s", pTrans->id, terrstr()); + continueExec = false; + } + + return continueExec; +} + +static bool mndTransPerfromFinishedStage(SMnode *pMnode, STrans *pTrans) { + bool continueExec = false; + + SSdbRaw *pRaw = mndTransActionEncode(pTrans); + if (pRaw == NULL) { + mError("trans:%d, failed to decode trans since %s", pTrans->id, terrstr()); + } + sdbSetRawStatus(pRaw, SDB_STATUS_DROPPED); + + int32_t code = sdbWrite(pMnode->pSdb, pRaw); + if (code != 0) { + mError("trans:%d, failed to write sdb since %s", pTrans->id, terrstr()); + } + + mError("trans:%d, exec finished, code:0x%x, failedTimes:%d", pTrans->id, pTrans->code, pTrans->failedTimes); + return continueExec; } static void mndTransExecute(SMnode *pMnode, STrans *pTrans) { - int32_t code = 0; + bool continueExec = true; - while (code == 0) { + while (continueExec) { switch (pTrans->stage) { case TRN_STAGE_PREPARE: - mndTransPerformPrepareStage(pMnode, pTrans); + continueExec = mndTransPerformPrepareStage(pMnode, pTrans); break; - case TRN_STAGE_EXECUTE: - code = mndTransPerformExecuteStage(pMnode, pTrans); + case TRN_STAGE_REDO_LOG: + continueExec = mndTransPerformRedoLogStage(pMnode, pTrans); + break; + case TRN_STAGE_REDO_ACTION: + continueExec = mndTransPerformRedoActionStage(pMnode, pTrans); + break; + case TRN_STAGE_UNDO_LOG: + continueExec = mndTransPerformUndoLogStage(pMnode, pTrans); + break; + case TRN_STAGE_UNDO_ACTION: + continueExec = mndTransPerformUndoActionStage(pMnode, pTrans); + break; + case TRN_STAGE_COMMIT_LOG: + continueExec = mndTransPerformCommitLogStage(pMnode, pTrans); break; case TRN_STAGE_COMMIT: - code = mndTransCommit(pMnode, pTrans); - if (code == 0) { - mndTransPerformCommitStage(pMnode, pTrans); - } + continueExec = mndTransPerformCommitStage(pMnode, pTrans); break; case TRN_STAGE_ROLLBACK: - code = mndTransRollback(pMnode, pTrans); - if (code == 0) { - mndTransPerformRollbackStage(pMnode, pTrans); - } + continueExec = mndTransPerformRollbackStage(pMnode, pTrans); + break; + case TRN_STAGE_FINISHED: + continueExec = mndTransPerfromFinishedStage(pMnode, pTrans); break; default: - mndTransSendRpcRsp(pTrans, 0); - return; + continueExec = false; + break; } } - mndTransSendRpcRsp(pTrans, code); + if (pTrans->stage == TRN_STAGE_FINISHED) { + mndTransSendRpcRsp(pTrans); + } } + +static int32_t mndProcessTransMsg(SMnodeMsg *pMsg) { + SMnode *pMnode = pMsg->pMnode; + STrans *pTrans = NULL; + void *pIter = NULL; + + while (1) { + pIter = sdbFetch(pMnode->pSdb, SDB_TRANS, pIter, (void **)&pTrans); + if (pIter == NULL) break; + + mndTransExecute(pMnode, pTrans); + sdbRelease(pMnode->pSdb, pTrans); + } +} \ No newline at end of file diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c index 8ff2139314..c9f4401264 100644 --- a/source/dnode/mnode/impl/src/mndVgroup.c +++ b/source/dnode/mnode/impl/src/mndVgroup.c @@ -333,17 +333,17 @@ SEpSet mndGetVgroupEpset(SMnode *pMnode, SVgObj *pVgroup) { } static int32_t mndProcessCreateVnodeRsp(SMnodeMsg *pMsg) { - mndTransHandleActionRsp(pMsg); + mndTransProcessRsp(pMsg); return 0; } static int32_t mndProcessAlterVnodeRsp(SMnodeMsg *pMsg) { - mndTransHandleActionRsp(pMsg); + mndTransProcessRsp(pMsg); return 0; } static int32_t mndProcessDropVnodeRsp(SMnodeMsg *pMsg) { - mndTransHandleActionRsp(pMsg); + mndTransProcessRsp(pMsg); return 0; } diff --git a/source/dnode/mnode/impl/src/mnode.c b/source/dnode/mnode/impl/src/mnode.c index 27668a585a..64ea85044a 100644 --- a/source/dnode/mnode/impl/src/mnode.c +++ b/source/dnode/mnode/impl/src/mnode.c @@ -50,6 +50,20 @@ void mndSendRedirectMsg(SMnode *pMnode, SRpcMsg *pMsg) { } } +static void mndTransReExecute(void *param, void *tmrId) { + SMnode *pMnode = param; + if (mndIsMaster(pMnode)) { + STransMsg *pMsg = rpcMallocCont(sizeof(STransMsg)); + SEpSet epSet = {.inUse = 0, .numOfEps = 1}; + epSet.port[0] = pMnode->replicas[pMnode->selfIndex].port; + memcpy(epSet.fqdn[0], pMnode->replicas[pMnode->selfIndex].fqdn, TSDB_FQDN_LEN); + SRpcMsg rpcMsg = {.msgType = TDMT_MND_TRANS, .pCont = pMsg, .contLen = sizeof(STransMsg)}; + mndSendMsgToDnode(pMnode, &epSet, &rpcMsg); + } + + taosTmrReset(mndTransReExecute, 3000, pMnode, pMnode->timer, &pMnode->transTimer); +} + static int32_t mndInitTimer(SMnode *pMnode) { if (pMnode->timer == NULL) { pMnode->timer = taosTmrInit(5000, 200, 3600000, "MND"); @@ -60,11 +74,18 @@ static int32_t mndInitTimer(SMnode *pMnode) { return -1; } + if (taosTmrReset(mndTransReExecute, 1000, pMnode, pMnode->timer, &pMnode->transTimer)) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return -1; + } + return 0; } static void mndCleanupTimer(SMnode *pMnode) { if (pMnode->timer != NULL) { + taosTmrStop(pMnode->transTimer); + pMnode->transTimer = NULL; taosTmrCleanUp(pMnode->timer); pMnode->timer = NULL; } From 791c6c849ed47edd2fd8d34dc1500c1292e50bda Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Sun, 26 Dec 2021 18:47:14 -0800 Subject: [PATCH 05/10] adjust status msg --- include/common/tmsg.h | 5 +-- include/dnode/mgmt/dnode.h | 2 - include/dnode/mnode/mnode.h | 2 +- source/dnode/mgmt/daemon/src/daemon.c | 2 - source/dnode/mgmt/impl/inc/dndDnode.h | 2 +- source/dnode/mgmt/impl/inc/dndInt.h | 9 +++- source/dnode/mgmt/impl/src/dndDnode.c | 45 +++++++++---------- .../dnode/mgmt/impl/test/sut/src/server.cpp | 2 - source/dnode/mnode/impl/src/mndDnode.c | 5 +-- 9 files changed, 34 insertions(+), 40 deletions(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index f0188a5b51..3f28d2894d 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -645,11 +645,10 @@ typedef struct { int32_t sver; int32_t dnodeId; int32_t clusterId; - int64_t rebootTime; // time stamp for last reboot + int64_t rebootTime; + int64_t updateTime; int16_t numOfCores; - int16_t numOfSupportMnodes; int16_t numOfSupportVnodes; - int16_t numOfSupportQnodes; char dnodeEp[TSDB_EP_LEN]; SClusterCfg clusterCfg; SVnodeLoads vnodeLoads; diff --git a/include/dnode/mgmt/dnode.h b/include/dnode/mgmt/dnode.h index fbe447baf9..b7f3cea7fc 100644 --- a/include/dnode/mgmt/dnode.h +++ b/include/dnode/mgmt/dnode.h @@ -28,9 +28,7 @@ typedef struct SDnode SDnode; typedef struct { int32_t sver; int16_t numOfCores; - int16_t numOfSupportMnodes; int16_t numOfSupportVnodes; - int16_t numOfSupportQnodes; int8_t enableTelem; int32_t statusInterval; float numOfThreadsPerCore; diff --git a/include/dnode/mnode/mnode.h b/include/dnode/mnode/mnode.h index 09d1f8c013..e0619b2133 100644 --- a/include/dnode/mnode/mnode.h +++ b/include/dnode/mnode/mnode.h @@ -56,7 +56,7 @@ typedef struct SMnodeCfg { typedef struct { int32_t dnodeId; - int32_t clusterId; + int64_t clusterId; int8_t replica; int8_t selfIndex; SReplica replicas[TSDB_MAX_REPLICA]; diff --git a/source/dnode/mgmt/daemon/src/daemon.c b/source/dnode/mgmt/daemon/src/daemon.c index 083935c706..75c2ff00e0 100644 --- a/source/dnode/mgmt/daemon/src/daemon.c +++ b/source/dnode/mgmt/daemon/src/daemon.c @@ -139,9 +139,7 @@ void dmnWaitSignal() { void dmnInitOption(SDnodeOpt *pOption) { pOption->sver = 30000000; //3.0.0.0 pOption->numOfCores = tsNumOfCores; - pOption->numOfSupportMnodes = 1; pOption->numOfSupportVnodes = 1; - pOption->numOfSupportQnodes = 1; pOption->statusInterval = tsStatusInterval; pOption->numOfThreadsPerCore = tsNumOfThreadsPerCore; pOption->ratioOfQueryCores = tsRatioOfQueryCores; diff --git a/source/dnode/mgmt/impl/inc/dndDnode.h b/source/dnode/mgmt/impl/inc/dndDnode.h index 27cc99c27c..e242334be5 100644 --- a/source/dnode/mgmt/impl/inc/dndDnode.h +++ b/source/dnode/mgmt/impl/inc/dndDnode.h @@ -27,7 +27,7 @@ void dndProcessDnodeReq(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet); void dndProcessDnodeRsp(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet); int32_t dndGetDnodeId(SDnode *pDnode); -int32_t dndGetClusterId(SDnode *pDnode); +int64_t dndGetClusterId(SDnode *pDnode); void dndGetDnodeEp(SDnode *pDnode, int32_t dnodeId, char *pEp, char *pFqdn, uint16_t *pPort); void dndGetMnodeEpSet(SDnode *pDnode, SEpSet *pEpSet); void dndSendRedirectMsg(SDnode *pDnode, SRpcMsg *pMsg); diff --git a/source/dnode/mgmt/impl/inc/dndInt.h b/source/dnode/mgmt/impl/inc/dndInt.h index 6f1357e9c1..032471c5c5 100644 --- a/source/dnode/mgmt/impl/inc/dndInt.h +++ b/source/dnode/mgmt/impl/inc/dndInt.h @@ -22,10 +22,11 @@ extern "C" { #include "cJSON.h" #include "os.h" -#include "tmsg.h" +#include "tep.h" #include "thash.h" #include "tlockfree.h" #include "tlog.h" +#include "tmsg.h" #include "tqueue.h" #include "trpc.h" #include "tthread.h" @@ -51,14 +52,18 @@ typedef void (*DndMsgFp)(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEps); typedef struct { char *dnode; char *mnode; + char *qnode; + char *snode; + char *bnode; char *vnodes; } SDnodeDir; typedef struct { int32_t dnodeId; int32_t dropped; - int32_t clusterId; + int64_t clusterId; int64_t rebootTime; + int64_t updateTime; int8_t statusSent; SEpSet mnodeEpSet; char *file; diff --git a/source/dnode/mgmt/impl/src/dndDnode.c b/source/dnode/mgmt/impl/src/dndDnode.c index af86e59518..8b3b745a55 100644 --- a/source/dnode/mgmt/impl/src/dndDnode.c +++ b/source/dnode/mgmt/impl/src/dndDnode.c @@ -17,7 +17,6 @@ #include "dndDnode.h" #include "dndTransport.h" #include "dndVnodes.h" -#include "tep.h" int32_t dndGetDnodeId(SDnode *pDnode) { SDnodeMgmt *pMgmt = &pDnode->dmgmt; @@ -27,10 +26,10 @@ int32_t dndGetDnodeId(SDnode *pDnode) { return dnodeId; } -int32_t dndGetClusterId(SDnode *pDnode) { +int64_t dndGetClusterId(SDnode *pDnode) { SDnodeMgmt *pMgmt = &pDnode->dmgmt; taosRLockLatch(&pMgmt->latch); - int32_t clusterId = pMgmt->clusterId; + int64_t clusterId = pMgmt->clusterId; taosRUnLockLatch(&pMgmt->latch); return clusterId; } @@ -68,7 +67,7 @@ void dndSendRedirectMsg(SDnode *pDnode, SRpcMsg *pMsg) { SEpSet epSet = {0}; dndGetMnodeEpSet(pDnode, &epSet); - dDebug("RPC %p, msg:%s is redirected, num:%d inUse:%d", pMsg->handle, TMSG_INFO(msgType), epSet.numOfEps, epSet.inUse); + dDebug("RPC %p, msg:%s is redirected, num:%d use:%d", pMsg->handle, TMSG_INFO(msgType), epSet.numOfEps, epSet.inUse); for (int32_t i = 0; i < epSet.numOfEps; ++i) { dDebug("mnode index:%d %s:%u", i, epSet.fqdn[i], epSet.port[i]); if (strcmp(epSet.fqdn[i], pDnode->opt.localFqdn) == 0 && epSet.port[i] == pDnode->opt.serverPort) { @@ -82,7 +81,7 @@ void dndSendRedirectMsg(SDnode *pDnode, SRpcMsg *pMsg) { } static void dndUpdateMnodeEpSet(SDnode *pDnode, SEpSet *pEpSet) { - dInfo("mnode is changed, num:%d inUse:%d", pEpSet->numOfEps, pEpSet->inUse); + dInfo("mnode is changed, num:%d use:%d", pEpSet->numOfEps, pEpSet->inUse); SDnodeMgmt *pMgmt = &pDnode->dmgmt; taosWLockLatch(&pMgmt->latch); @@ -165,7 +164,7 @@ static int32_t dndReadDnodes(SDnode *pDnode) { int32_t code = TSDB_CODE_DND_DNODE_READ_FILE_ERROR; int32_t len = 0; - int32_t maxLen = 30000; + int32_t maxLen = 256 *1024; char *content = calloc(1, maxLen + 1); cJSON *root = NULL; FILE *fp = NULL; @@ -198,11 +197,11 @@ static int32_t dndReadDnodes(SDnode *pDnode) { pMgmt->dnodeId = dnodeId->valueint; cJSON *clusterId = cJSON_GetObjectItem(root, "clusterId"); - if (!clusterId || clusterId->type != cJSON_Number) { + if (!clusterId || clusterId->type != cJSON_String) { dError("failed to read %s since clusterId not found", pMgmt->file); goto PRASE_DNODE_OVER; } - pMgmt->clusterId = clusterId->valueint; + pMgmt->clusterId = atoll(clusterId->valuestring); cJSON *dropped = cJSON_GetObjectItem(root, "dropped"); if (!dropped || dropped->type != cJSON_Number) { @@ -217,20 +216,20 @@ static int32_t dndReadDnodes(SDnode *pDnode) { goto PRASE_DNODE_OVER; } - int32_t numOfNodes = cJSON_GetArraySize(dnodes); - if (numOfNodes <= 0) { - dError("failed to read %s since numOfNodes:%d invalid", pMgmt->file, numOfNodes); + int32_t numOfDnodes = cJSON_GetArraySize(dnodes); + if (numOfDnodes <= 0) { + dError("failed to read %s since numOfDnodes:%d invalid", pMgmt->file, numOfDnodes); goto PRASE_DNODE_OVER; } - pMgmt->dnodeEps = calloc(1, numOfNodes * sizeof(SDnodeEp) + sizeof(SDnodeEps)); + pMgmt->dnodeEps = calloc(1, numOfDnodes * sizeof(SDnodeEp) + sizeof(SDnodeEps)); if (pMgmt->dnodeEps == NULL) { dError("failed to calloc dnodeEpList since %s", strerror(errno)); goto PRASE_DNODE_OVER; } - pMgmt->dnodeEps->num = numOfNodes; + pMgmt->dnodeEps->num = numOfDnodes; - for (int32_t i = 0; i < numOfNodes; ++i) { + for (int32_t i = 0; i < numOfDnodes; ++i) { cJSON *node = cJSON_GetArrayItem(dnodes, i); if (node == NULL) break; @@ -238,28 +237,28 @@ static int32_t dndReadDnodes(SDnode *pDnode) { cJSON *dnodeId = cJSON_GetObjectItem(node, "id"); if (!dnodeId || dnodeId->type != cJSON_Number) { - dError("failed to read %s, dnodeId not found", pMgmt->file); + dError("failed to read %s since dnodeId not found", pMgmt->file); goto PRASE_DNODE_OVER; } pDnodeEp->id = dnodeId->valueint; cJSON *dnodeFqdn = cJSON_GetObjectItem(node, "fqdn"); if (!dnodeFqdn || dnodeFqdn->type != cJSON_String || dnodeFqdn->valuestring == NULL) { - dError("failed to read %s, dnodeFqdn not found", pMgmt->file); + dError("failed to read %s since dnodeFqdn not found", pMgmt->file); goto PRASE_DNODE_OVER; } tstrncpy(pDnodeEp->fqdn, dnodeFqdn->valuestring, TSDB_FQDN_LEN); cJSON *dnodePort = cJSON_GetObjectItem(node, "port"); if (!dnodePort || dnodePort->type != cJSON_Number) { - dError("failed to read %s, dnodePort not found", pMgmt->file); + dError("failed to read %s since dnodePort not found", pMgmt->file); goto PRASE_DNODE_OVER; } pDnodeEp->port = dnodePort->valueint; cJSON *isMnode = cJSON_GetObjectItem(node, "isMnode"); if (!isMnode || isMnode->type != cJSON_Number) { - dError("failed to read %s, isMnode not found", pMgmt->file); + dError("failed to read %s since isMnode not found", pMgmt->file); goto PRASE_DNODE_OVER; } pDnodeEp->isMnode = isMnode->valueint; @@ -282,7 +281,7 @@ PRASE_DNODE_OVER: if (pMgmt->dnodeEps == NULL) { pMgmt->dnodeEps = calloc(1, sizeof(SDnodeEps) + sizeof(SDnodeEp)); pMgmt->dnodeEps->num = 1; - pMgmt->dnodeEps->eps[0].isMnode = 1; + pMgmt->dnodeEps->eps[0].isMnode = 1; taosGetFqdnPortFromEp(pDnode->opt.firstEp, pMgmt->dnodeEps->eps[0].fqdn, &pMgmt->dnodeEps->eps[0].port); } @@ -303,7 +302,7 @@ static int32_t dndWriteDnodes(SDnode *pDnode) { } int32_t len = 0; - int32_t maxLen = 30000; + int32_t maxLen = 256 *1024; char *content = calloc(1, maxLen + 1); len += snprintf(content + len, maxLen - len, "{\n"); @@ -331,6 +330,7 @@ static int32_t dndWriteDnodes(SDnode *pDnode) { free(content); terrno = 0; + pMgmt->updateTime = taosGetTimestampMs(); dInfo("successed to write %s", pMgmt->file); return 0; } @@ -350,10 +350,9 @@ void dndSendStatusMsg(SDnode *pDnode) { pStatus->dnodeId = htonl(pMgmt->dnodeId); pStatus->clusterId = htonl(pMgmt->clusterId); pStatus->rebootTime = htobe64(pMgmt->rebootTime); + pStatus->updateTime = htobe64(pMgmt->updateTime); pStatus->numOfCores = htons(pDnode->opt.numOfCores); - pStatus->numOfSupportMnodes = htons(pDnode->opt.numOfCores); - pStatus->numOfSupportVnodes = htons(pDnode->opt.numOfCores); - pStatus->numOfSupportQnodes = htons(pDnode->opt.numOfCores); + pStatus->numOfSupportVnodes = htons(pDnode->opt.numOfSupportVnodes); tstrncpy(pStatus->dnodeEp, pDnode->opt.localEp, TSDB_EP_LEN); pStatus->clusterCfg.statusInterval = htonl(pDnode->opt.statusInterval); diff --git a/source/dnode/mgmt/impl/test/sut/src/server.cpp b/source/dnode/mgmt/impl/test/sut/src/server.cpp index e96f7deaf5..a001748a12 100644 --- a/source/dnode/mgmt/impl/test/sut/src/server.cpp +++ b/source/dnode/mgmt/impl/test/sut/src/server.cpp @@ -26,9 +26,7 @@ SDnodeOpt TestServer::BuildOption(const char* path, const char* fqdn, uint16_t p SDnodeOpt option = {0}; option.sver = 1; option.numOfCores = 1; - option.numOfSupportMnodes = 1; option.numOfSupportVnodes = 1; - option.numOfSupportQnodes = 1; option.statusInterval = 1; option.numOfThreadsPerCore = 1; option.ratioOfQueryCores = 1; diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c index 80c9f9544e..dffedd41c5 100644 --- a/source/dnode/mnode/impl/src/mndDnode.c +++ b/source/dnode/mnode/impl/src/mndDnode.c @@ -278,10 +278,9 @@ static void mndParseStatusMsg(SStatusMsg *pStatus) { pStatus->dnodeId = htonl(pStatus->dnodeId); pStatus->clusterId = htonl(pStatus->clusterId); pStatus->rebootTime = htobe64(pStatus->rebootTime); + pStatus->updateTime = htobe64(pStatus->updateTime); pStatus->numOfCores = htons(pStatus->numOfCores); - pStatus->numOfSupportMnodes = htons(pStatus->numOfSupportMnodes); pStatus->numOfSupportVnodes = htons(pStatus->numOfSupportVnodes); - pStatus->numOfSupportQnodes = htons(pStatus->numOfSupportQnodes); pStatus->clusterCfg.statusInterval = htonl(pStatus->clusterCfg.statusInterval); pStatus->clusterCfg.checkTime = htobe64(pStatus->clusterCfg.checkTime); } @@ -356,9 +355,7 @@ static int32_t mndProcessStatusMsg(SMnodeMsg *pMsg) { pDnode->rebootTime = pStatus->rebootTime; pDnode->numOfCores = pStatus->numOfCores; - pDnode->numOfSupportMnodes = pStatus->numOfSupportMnodes; pDnode->numOfSupportVnodes = pStatus->numOfSupportVnodes; - pDnode->numOfSupportQnodes = pStatus->numOfSupportQnodes; pDnode->lastAccessTime = taosGetTimestampMs(); pDnode->status = DND_STATUS_READY; From bb3a0b21d24d92562383b227f4723b1ea8e951b1 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Sun, 26 Dec 2021 18:57:31 -0800 Subject: [PATCH 06/10] change clusterid from int32 to int64 --- include/common/tmsg.h | 6 +++--- source/client/inc/clientInt.h | 2 +- source/client/src/clientImpl.c | 4 ++-- source/client/src/clientMsgHandler.c | 5 +++-- source/dnode/mgmt/impl/src/dndDnode.c | 8 ++++---- source/dnode/mnode/impl/inc/mndDef.h | 2 +- source/dnode/mnode/impl/inc/mndInt.h | 2 +- source/dnode/mnode/impl/src/mndCluster.c | 22 +++++++++++----------- source/dnode/mnode/impl/src/mndDnode.c | 9 +++++---- source/dnode/mnode/impl/src/mndProfile.c | 2 +- source/dnode/mnode/impl/src/mndTrans.c | 6 +++++- 11 files changed, 37 insertions(+), 31 deletions(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 3f28d2894d..6727dd3289 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -320,7 +320,7 @@ typedef struct SEpSet { typedef struct { int32_t acctId; - uint32_t clusterId; + int64_t clusterId; int32_t connId; int8_t superUser; int8_t reserved[5]; @@ -644,7 +644,7 @@ typedef struct { typedef struct { int32_t sver; int32_t dnodeId; - int32_t clusterId; + int64_t clusterId; int64_t rebootTime; int64_t updateTime; int16_t numOfCores; @@ -660,7 +660,7 @@ typedef struct { typedef struct { int32_t dnodeId; - int32_t clusterId; + int64_t clusterId; int8_t dropped; char reserved[7]; } SDnodeCfg; diff --git a/source/client/inc/clientInt.h b/source/client/inc/clientInt.h index ee068cf3eb..767489fc40 100644 --- a/source/client/inc/clientInt.h +++ b/source/client/inc/clientInt.h @@ -59,7 +59,7 @@ typedef struct SAppInstInfo { SCorEpSet mgmtEp; SInstanceActivity summary; SList *pConnList; // STscObj linked list - uint32_t clusterId; + int64_t clusterId; void *pTransporter; } SAppInstInfo; diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index c7ea3c2e09..f8f9ade3c3 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -170,8 +170,8 @@ int32_t execDdlQuery(SRequestObj* pRequest, SQueryNode* pQuery) { if (pDcl->msgType == TDMT_MND_CREATE_TABLE) { struct SCatalog* pCatalog = NULL; - char buf[12] = {0}; - sprintf(buf, "%d", pRequest->pTscObj->pAppInfo->clusterId); + char buf[18] = {0}; + sprintf(buf, "%" PRId64, pRequest->pTscObj->pAppInfo->clusterId); int32_t code = catalogGetHandle(buf, &pCatalog); if (code != TSDB_CODE_SUCCESS) { return code; diff --git a/source/client/src/clientMsgHandler.c b/source/client/src/clientMsgHandler.c index 1f737b33d2..091b9574c0 100644 --- a/source/client/src/clientMsgHandler.c +++ b/source/client/src/clientMsgHandler.c @@ -59,7 +59,7 @@ int processConnectRsp(SRequestObj *pRequest, const char* pMsg, int32_t msgLen) { SConnectRsp *pConnect = (SConnectRsp *)pMsg; pConnect->acctId = htonl(pConnect->acctId); pConnect->connId = htonl(pConnect->connId); - pConnect->clusterId = htonl(pConnect->clusterId); + pConnect->clusterId = htobe64(pConnect->clusterId); assert(pConnect->epSet.numOfEps > 0); for(int32_t i = 0; i < pConnect->epSet.numOfEps; ++i) { @@ -82,7 +82,8 @@ int processConnectRsp(SRequestObj *pRequest, const char* pMsg, int32_t msgLen) { atomic_add_fetch_64(&pTscObj->pAppInfo->numOfConns, 1); pRequest->body.resInfo.pRspMsg = pMsg; - tscDebug("0x%" PRIx64 " clusterId:%d, totalConn:%"PRId64, pRequest->requestId, pConnect->clusterId, pTscObj->pAppInfo->numOfConns); + tscDebug("0x%" PRIx64 " clusterId:%" PRId64 ", totalConn:%" PRId64, pRequest->requestId, pConnect->clusterId, + pTscObj->pAppInfo->numOfConns); return 0; } diff --git a/source/dnode/mgmt/impl/src/dndDnode.c b/source/dnode/mgmt/impl/src/dndDnode.c index 8b3b745a55..3362632b15 100644 --- a/source/dnode/mgmt/impl/src/dndDnode.c +++ b/source/dnode/mgmt/impl/src/dndDnode.c @@ -307,7 +307,7 @@ static int32_t dndWriteDnodes(SDnode *pDnode) { len += snprintf(content + len, maxLen - len, "{\n"); len += snprintf(content + len, maxLen - len, " \"dnodeId\": %d,\n", pMgmt->dnodeId); - len += snprintf(content + len, maxLen - len, " \"clusterId\": %d,\n", pMgmt->clusterId); + len += snprintf(content + len, maxLen - len, " \"clusterId\": \"%" PRId64 "\",\n", pMgmt->clusterId); len += snprintf(content + len, maxLen - len, " \"dropped\": %d,\n", pMgmt->dropped); len += snprintf(content + len, maxLen - len, " \"dnodes\": [{\n"); for (int32_t i = 0; i < pMgmt->dnodeEps->num; ++i) { @@ -348,7 +348,7 @@ void dndSendStatusMsg(SDnode *pDnode) { taosRLockLatch(&pMgmt->latch); pStatus->sver = htonl(pDnode->opt.sver); pStatus->dnodeId = htonl(pMgmt->dnodeId); - pStatus->clusterId = htonl(pMgmt->clusterId); + pStatus->clusterId = htobe64(pMgmt->clusterId); pStatus->rebootTime = htobe64(pMgmt->rebootTime); pStatus->updateTime = htobe64(pMgmt->updateTime); pStatus->numOfCores = htons(pDnode->opt.numOfCores); @@ -378,7 +378,7 @@ void dndSendStatusMsg(SDnode *pDnode) { static void dndUpdateDnodeCfg(SDnode *pDnode, SDnodeCfg *pCfg) { SDnodeMgmt *pMgmt = &pDnode->dmgmt; if (pMgmt->dnodeId == 0 || pMgmt->dropped != pCfg->dropped) { - dInfo("set dnodeId:%d clusterId:%d dropped:%d", pCfg->dnodeId, pCfg->clusterId, pCfg->dropped); + dInfo("set dnodeId:%d clusterId:% " PRId64 " dropped:%d", pCfg->dnodeId, pCfg->clusterId, pCfg->dropped); taosWLockLatch(&pMgmt->latch); pMgmt->dnodeId = pCfg->dnodeId; @@ -424,7 +424,7 @@ static void dndProcessStatusRsp(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) { SStatusRsp *pRsp = pMsg->pCont; SDnodeCfg *pCfg = &pRsp->dnodeCfg; pCfg->dnodeId = htonl(pCfg->dnodeId); - pCfg->clusterId = htonl(pCfg->clusterId); + pCfg->clusterId = htobe64(pCfg->clusterId); dndUpdateDnodeCfg(pDnode, pCfg); if (pCfg->dropped) { diff --git a/source/dnode/mnode/impl/inc/mndDef.h b/source/dnode/mnode/impl/inc/mndDef.h index fbe7da49c6..1ac2c3d171 100644 --- a/source/dnode/mnode/impl/inc/mndDef.h +++ b/source/dnode/mnode/impl/inc/mndDef.h @@ -111,7 +111,7 @@ typedef struct { } STrans; typedef struct { - int32_t id; + int64_t id; char name[TSDB_CLUSTER_ID_LEN]; int64_t createdTime; int64_t updateTime; diff --git a/source/dnode/mnode/impl/inc/mndInt.h b/source/dnode/mnode/impl/inc/mndInt.h index 01dd893e66..6eb82daa11 100644 --- a/source/dnode/mnode/impl/inc/mndInt.h +++ b/source/dnode/mnode/impl/inc/mndInt.h @@ -70,7 +70,7 @@ typedef struct { typedef struct SMnode { int32_t dnodeId; - int32_t clusterId; + int64_t clusterId; int8_t replica; int8_t selfIndex; SReplica replicas[TSDB_MAX_REPLICA]; diff --git a/source/dnode/mnode/impl/src/mndCluster.c b/source/dnode/mnode/impl/src/mndCluster.c index cf8511c054..f656c27dcd 100644 --- a/source/dnode/mnode/impl/src/mndCluster.c +++ b/source/dnode/mnode/impl/src/mndCluster.c @@ -67,7 +67,7 @@ static SSdbRaw *mndClusterActionEncode(SClusterObj *pCluster) { if (pRaw == NULL) return NULL; int32_t dataPos = 0; - SDB_SET_INT32(pRaw, dataPos, pCluster->id); + SDB_SET_INT64(pRaw, dataPos, pCluster->id); SDB_SET_INT64(pRaw, dataPos, pCluster->createdTime) SDB_SET_INT64(pRaw, dataPos, pCluster->updateTime) SDB_SET_BINARY(pRaw, dataPos, pCluster->name, TSDB_CLUSTER_ID_LEN) @@ -91,7 +91,7 @@ static SSdbRow *mndClusterActionDecode(SSdbRaw *pRaw) { if (pCluster == NULL) return NULL; int32_t dataPos = 0; - SDB_GET_INT32(pRaw, pRow, dataPos, &pCluster->id) + SDB_GET_INT64(pRaw, pRow, dataPos, &pCluster->id) SDB_GET_INT64(pRaw, pRow, dataPos, &pCluster->createdTime) SDB_GET_INT64(pRaw, pRow, dataPos, &pCluster->updateTime) SDB_GET_BINARY(pRaw, pRow, dataPos, pCluster->name, TSDB_CLUSTER_ID_LEN) @@ -101,17 +101,17 @@ static SSdbRow *mndClusterActionDecode(SSdbRaw *pRaw) { } static int32_t mndClusterActionInsert(SSdb *pSdb, SClusterObj *pCluster) { - mTrace("cluster:%d, perform insert action", pCluster->id); + mTrace("cluster:%" PRId64 ", perform insert action", pCluster->id); return 0; } static int32_t mndClusterActionDelete(SSdb *pSdb, SClusterObj *pCluster) { - mTrace("cluster:%d, perform delete action", pCluster->id); + mTrace("cluster:%" PRId64 ", perform delete action", pCluster->id); return 0; } static int32_t mndClusterActionUpdate(SSdb *pSdb, SClusterObj *pOldCluster, SClusterObj *pNewCluster) { - mTrace("cluster:%d, perform update action", pOldCluster->id); + mTrace("cluster:%" PRId64 ", perform update action", pOldCluster->id); return 0; } @@ -125,17 +125,17 @@ static int32_t mndCreateDefaultCluster(SMnode *pMnode) { strcpy(clusterObj.name, "tdengine2.0"); mError("failed to get name from system, set to default val %s", clusterObj.name); } else { - mDebug("cluster:%d, name is %s", clusterObj.id, clusterObj.name); + mDebug("cluster:%" PRId64 ", name is %s", clusterObj.id, clusterObj.name); } clusterObj.id = MurmurHash3_32(clusterObj.name, TSDB_CLUSTER_ID_LEN); - clusterObj.id = abs(clusterObj.id); + clusterObj.id = (clusterObj.id >= 0 ? clusterObj.id : -clusterObj.id); pMnode->clusterId = clusterObj.id; SSdbRaw *pRaw = mndClusterActionEncode(&clusterObj); if (pRaw == NULL) return -1; sdbSetRawStatus(pRaw, SDB_STATUS_READY); - mDebug("cluster:%d, will be created while deploy sdb", clusterObj.id); + mDebug("cluster:%" PRId64 ", will be created while deploy sdb", clusterObj.id); return sdbWrite(pMnode->pSdb, pRaw); } @@ -143,8 +143,8 @@ static int32_t mndGetClusterMeta(SMnodeMsg *pMsg, SShowObj *pShow, STableMetaMsg int32_t cols = 0; SSchema *pSchema = pMeta->pSchema; - pShow->bytes[cols] = 4; - pSchema[cols].type = TSDB_DATA_TYPE_INT; + pShow->bytes[cols] = 8; + pSchema[cols].type = TSDB_DATA_TYPE_BIGINT; strcpy(pSchema[cols].name, "id"); pSchema[cols].bytes = htonl(pShow->bytes[cols]); cols++; @@ -192,7 +192,7 @@ static int32_t mndRetrieveClusters(SMnodeMsg *pMsg, SShowObj *pShow, char *data, cols = 0; pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; - *(int32_t *)pWrite = pCluster->id; + *(int64_t *)pWrite = pCluster->id; cols++; pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c index dffedd41c5..153d75ffd0 100644 --- a/source/dnode/mnode/impl/src/mndDnode.c +++ b/source/dnode/mnode/impl/src/mndDnode.c @@ -276,7 +276,7 @@ static int32_t mndCheckClusterCfgPara(SMnode *pMnode, const SClusterCfg *pCfg) { static void mndParseStatusMsg(SStatusMsg *pStatus) { pStatus->sver = htonl(pStatus->sver); pStatus->dnodeId = htonl(pStatus->dnodeId); - pStatus->clusterId = htonl(pStatus->clusterId); + pStatus->clusterId = htobe64(pStatus->clusterId); pStatus->rebootTime = htobe64(pStatus->rebootTime); pStatus->updateTime = htobe64(pStatus->updateTime); pStatus->numOfCores = htons(pStatus->numOfCores); @@ -323,13 +323,14 @@ static int32_t mndProcessStatusMsg(SMnodeMsg *pMsg) { } if (pStatus->dnodeId == 0) { - mDebug("dnode:%d %s, first access, set clusterId %d", pDnode->id, pDnode->ep, pMnode->clusterId); + mDebug("dnode:%d %s, first access, set clusterId %" PRId64, pDnode->id, pDnode->ep, pMnode->clusterId); } else { if (pStatus->clusterId != pMnode->clusterId) { if (pDnode != NULL && pDnode->status != DND_STATUS_READY) { pDnode->offlineReason = DND_REASON_CLUSTER_ID_NOT_MATCH; } - mError("dnode:%d, clusterId %d not match exist %d", pDnode->id, pStatus->clusterId, pMnode->clusterId); + mError("dnode:%d, clusterId %" PRId64 " not match exist %" PRId64, pDnode->id, pStatus->clusterId, + pMnode->clusterId); mndReleaseDnode(pMnode, pDnode); terrno != TSDB_CODE_MND_INVALID_CLUSTER_ID; return -1; @@ -370,7 +371,7 @@ static int32_t mndProcessStatusMsg(SMnodeMsg *pMsg) { pRsp->dnodeCfg.dnodeId = htonl(pDnode->id); pRsp->dnodeCfg.dropped = 0; - pRsp->dnodeCfg.clusterId = htonl(pMnode->clusterId); + pRsp->dnodeCfg.clusterId = htobe64(pMnode->clusterId); mndGetDnodeData(pMnode, &pRsp->dnodeEps, numOfEps); pMsg->contLen = contLen; diff --git a/source/dnode/mnode/impl/src/mndProfile.c b/source/dnode/mnode/impl/src/mndProfile.c index 833be3884c..548e2f7be6 100644 --- a/source/dnode/mnode/impl/src/mndProfile.c +++ b/source/dnode/mnode/impl/src/mndProfile.c @@ -225,7 +225,7 @@ static int32_t mndProcessConnectMsg(SMnodeMsg *pMsg) { mndReleaseUser(pMnode, pUser); } - pRsp->clusterId = htonl(pMnode->clusterId); + pRsp->clusterId = htobe64(pMnode->clusterId); pRsp->connId = htonl(pConn->id); mndGetMnodeEpSet(pMnode, &pRsp->epSet); mndReleaseConn(pMnode, pConn); diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index b3a584c682..cf85befb61 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -51,6 +51,7 @@ static bool mndTransPerfromFinishedStage(SMnode *pMnode, STrans *pTrans); static void mndTransExecute(SMnode *pMnode, STrans *pTrans); static void mndTransSendRpcRsp(STrans *pTrans); static int32_t mndProcessTransMsg(SMnodeMsg *pMsg); +static int32_t mndProcessTransRsp(SMnodeMsg *pMsg); int32_t mndInitTrans(SMnode *pMnode) { SSdbTable table = {.sdbType = SDB_TRANS, @@ -62,6 +63,7 @@ int32_t mndInitTrans(SMnode *pMnode) { .deleteFp = (SdbDeleteFp)mndTransActionDelete}; mndSetMsgHandle(pMnode, TDMT_MND_TRANS, mndProcessTransMsg); + mndSetMsgHandle(pMnode, TDMT_MND_TRANS_RSP, mndProcessTransRsp); return sdbSetTable(pMnode->pSdb, table); } @@ -901,4 +903,6 @@ static int32_t mndProcessTransMsg(SMnodeMsg *pMsg) { mndTransExecute(pMnode, pTrans); sdbRelease(pMnode->pSdb, pTrans); } -} \ No newline at end of file +} + +static int32_t mndProcessTransRsp(SMnodeMsg *pMsg) { return 0; } \ No newline at end of file From 6160aa6e07e03124a8a1130284a44bf65e8d4631 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Sun, 26 Dec 2021 19:56:37 -0800 Subject: [PATCH 07/10] mgmt queue --- source/dnode/mgmt/impl/inc/dndDnode.h | 9 +- source/dnode/mgmt/impl/inc/dndInt.h | 28 ++--- source/dnode/mgmt/impl/inc/dndMnode.h | 5 +- source/dnode/mgmt/impl/src/dndDnode.c | 145 +++++++++++++++++----- source/dnode/mgmt/impl/src/dndMnode.c | 108 +--------------- source/dnode/mgmt/impl/src/dndTransport.c | 18 +-- 6 files changed, 152 insertions(+), 161 deletions(-) diff --git a/source/dnode/mgmt/impl/inc/dndDnode.h b/source/dnode/mgmt/impl/inc/dndDnode.h index e242334be5..a2015913a7 100644 --- a/source/dnode/mgmt/impl/inc/dndDnode.h +++ b/source/dnode/mgmt/impl/inc/dndDnode.h @@ -23,15 +23,16 @@ extern "C" { int32_t dndInitDnode(SDnode *pDnode); void dndCleanupDnode(SDnode *pDnode); -void dndProcessDnodeReq(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet); -void dndProcessDnodeRsp(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet); int32_t dndGetDnodeId(SDnode *pDnode); int64_t dndGetClusterId(SDnode *pDnode); void dndGetDnodeEp(SDnode *pDnode, int32_t dnodeId, char *pEp, char *pFqdn, uint16_t *pPort); void dndGetMnodeEpSet(SDnode *pDnode, SEpSet *pEpSet); -void dndSendRedirectMsg(SDnode *pDnode, SRpcMsg *pMsg); -void dndSendStatusMsg(SDnode *pDnode); + +void dndSendRedirectMsg(SDnode *pDnode, SRpcMsg *pMsg); +void dndSendStatusMsg(SDnode *pDnode); +void dndProcessMgmtMsg(SDnode *pDnode, SRpcMsg *pRpcMsg, SEpSet *pEpSet); +void dndProcessStartupReq(SDnode *pDnode, SRpcMsg *pMsg); #ifdef __cplusplus } diff --git a/source/dnode/mgmt/impl/inc/dndInt.h b/source/dnode/mgmt/impl/inc/dndInt.h index 032471c5c5..c352b37ef0 100644 --- a/source/dnode/mgmt/impl/inc/dndInt.h +++ b/source/dnode/mgmt/impl/inc/dndInt.h @@ -59,18 +59,20 @@ typedef struct { } SDnodeDir; typedef struct { - int32_t dnodeId; - int32_t dropped; - int64_t clusterId; - int64_t rebootTime; - int64_t updateTime; - int8_t statusSent; - SEpSet mnodeEpSet; - char *file; - SHashObj *dnodeHash; - SDnodeEps *dnodeEps; - pthread_t *threadId; - SRWLatch latch; + int32_t dnodeId; + int32_t dropped; + int64_t clusterId; + int64_t rebootTime; + int64_t updateTime; + int8_t statusSent; + SEpSet mnodeEpSet; + char *file; + SHashObj *dnodeHash; + SDnodeEps *dnodeEps; + pthread_t *threadId; + SRWLatch latch; + taos_queue pMgmtQ; + SWorkerPool mgmtPool; } SDnodeMgmt; typedef struct { @@ -86,8 +88,6 @@ typedef struct { taos_queue pReadQ; taos_queue pWriteQ; taos_queue pSyncQ; - taos_queue pMgmtQ; - SWorkerPool mgmtPool; SWorkerPool readPool; SWorkerPool writePool; SWorkerPool syncPool; diff --git a/source/dnode/mgmt/impl/inc/dndMnode.h b/source/dnode/mgmt/impl/inc/dndMnode.h index 67c51e51a8..0f7cec230e 100644 --- a/source/dnode/mgmt/impl/inc/dndMnode.h +++ b/source/dnode/mgmt/impl/inc/dndMnode.h @@ -23,11 +23,14 @@ extern "C" { int32_t dndInitMnode(SDnode *pDnode); void dndCleanupMnode(SDnode *pDnode); + int32_t dndGetUserAuthFromMnode(SDnode *pDnode, char *user, char *spi, char *encrypt, char *secret, char *ckey); -void dndProcessMnodeMgmtMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet); void dndProcessMnodeReadMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet); void dndProcessMnodeWriteMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet); void dndProcessMnodeSyncMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet); +int32_t dndProcessCreateMnodeReq(SDnode *pDnode, SRpcMsg *pRpcMsg); +int32_t dndProcessAlterMnodeReq(SDnode *pDnode, SRpcMsg *pRpcMsg); +int32_t dndProcessDropMnodeReq(SDnode *pDnode, SRpcMsg *pRpcMsg); #ifdef __cplusplus } diff --git a/source/dnode/mgmt/impl/src/dndDnode.c b/source/dnode/mgmt/impl/src/dndDnode.c index 3362632b15..777d6f77d9 100644 --- a/source/dnode/mgmt/impl/src/dndDnode.c +++ b/source/dnode/mgmt/impl/src/dndDnode.c @@ -18,6 +18,21 @@ #include "dndTransport.h" #include "dndVnodes.h" +static int32_t dndInitMgmtWorker(SDnode *pDnode); +static void dndCleanupMgmtWorker(SDnode *pDnode); +static int32_t dndAllocMgmtQueue(SDnode *pDnode); +static void dndFreeMgmtQueue(SDnode *pDnode); +static void dndProcessMgmtQueue(SDnode *pDnode, SRpcMsg *pMsg); + +static int32_t dndReadDnodes(SDnode *pDnode); +static int32_t dndWriteDnodes(SDnode *pDnode); +static void *dnodeThreadRoutine(void *param); + +static void dndProcessConfigDnodeReq(SDnode *pDnode, SRpcMsg *pMsg); +static void dndProcessStatusRsp(SDnode *pDnode, SRpcMsg *pMsg); +static void dndProcessAuthRsp(SDnode *pDnode, SRpcMsg *pMsg); +static void dndProcessGrantRsp(SDnode *pDnode, SRpcMsg *pMsg); + int32_t dndGetDnodeId(SDnode *pDnode) { SDnodeMgmt *pMgmt = &pDnode->dmgmt; taosRLockLatch(&pMgmt->latch); @@ -164,7 +179,7 @@ static int32_t dndReadDnodes(SDnode *pDnode) { int32_t code = TSDB_CODE_DND_DNODE_READ_FILE_ERROR; int32_t len = 0; - int32_t maxLen = 256 *1024; + int32_t maxLen = 256 * 1024; char *content = calloc(1, maxLen + 1); cJSON *root = NULL; FILE *fp = NULL; @@ -302,7 +317,7 @@ static int32_t dndWriteDnodes(SDnode *pDnode) { } int32_t len = 0; - int32_t maxLen = 256 *1024; + int32_t maxLen = 256 * 1024; char *content = calloc(1, maxLen + 1); len += snprintf(content + len, maxLen - len, "{\n"); @@ -409,13 +424,9 @@ static void dndUpdateDnodeEps(SDnode *pDnode, SDnodeEps *pDnodeEps) { taosWUnLockLatch(&pMgmt->latch); } -static void dndProcessStatusRsp(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) { +static void dndProcessStatusRsp(SDnode *pDnode, SRpcMsg *pMsg) { SDnodeMgmt *pMgmt = &pDnode->dmgmt; - if (pEpSet && pEpSet->numOfEps > 0) { - dndUpdateMnodeEpSet(pDnode, pEpSet); - } - if (pMsg->code != TSDB_CODE_SUCCESS) { pMgmt->statusSent = 0; return; @@ -443,9 +454,9 @@ static void dndProcessStatusRsp(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) { pMgmt->statusSent = 0; } -static void dndProcessAuthRsp(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) { assert(1); } +static void dndProcessAuthRsp(SDnode *pDnode, SRpcMsg *pMsg) { assert(1); } -static void dndProcessGrantRsp(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) { assert(1); } +static void dndProcessGrantRsp(SDnode *pDnode, SRpcMsg *pMsg) { assert(1); } static void dndProcessConfigDnodeReq(SDnode *pDnode, SRpcMsg *pMsg) { dError("config msg is received, but not supported yet"); @@ -456,7 +467,7 @@ static void dndProcessConfigDnodeReq(SDnode *pDnode, SRpcMsg *pMsg) { rpcSendResponse(&rspMsg); } -static void dndProcessStartupReq(SDnode *pDnode, SRpcMsg *pMsg) { +void dndProcessStartupReq(SDnode *pDnode, SRpcMsg *pMsg) { dDebug("startup msg is received"); SStartupMsg *pStartup = rpcMallocCont(sizeof(SStartupMsg)); @@ -490,6 +501,7 @@ int32_t dndInitDnode(SDnode *pDnode) { pMgmt->rebootTime = taosGetTimestampMs(); pMgmt->dropped = 0; pMgmt->clusterId = 0; + taosInitRWLatch(&pMgmt->latch); char path[PATH_MAX]; snprintf(path, PATH_MAX, "%s/dnode.json", pDnode->dir.dnode); @@ -511,7 +523,15 @@ int32_t dndInitDnode(SDnode *pDnode) { return -1; } - taosInitRWLatch(&pMgmt->latch); + if (dndInitMgmtWorker(pDnode) != 0) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return -1; + } + + if (dndAllocMgmtQueue(pDnode) != 0) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return -1; + } pMgmt->threadId = taosCreateThread(dnodeThreadRoutine, pDnode); if (pMgmt->threadId == NULL) { @@ -527,6 +547,9 @@ int32_t dndInitDnode(SDnode *pDnode) { void dndCleanupDnode(SDnode *pDnode) { SDnodeMgmt *pMgmt = &pDnode->dmgmt; + dndCleanupMgmtWorker(pDnode); + dndFreeMgmtQueue(pDnode); + if (pMgmt->threadId != NULL) { taosDestoryThread(pMgmt->threadId); pMgmt->threadId = NULL; @@ -553,39 +576,105 @@ void dndCleanupDnode(SDnode *pDnode) { dInfo("dnode-dnode is cleaned up"); } -void dndProcessDnodeReq(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) { +static int32_t dndInitMgmtWorker(SDnode *pDnode) { + SDnodeMgmt *pMgmt = &pDnode->dmgmt; + SWorkerPool *pPool = &pMgmt->mgmtPool; + pPool->name = "dnode-mgmt"; + pPool->min = 1; + pPool->max = 1; + if (tWorkerInit(pPool) != 0) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return -1; + } + + dDebug("dnode mgmt worker is initialized"); + return 0; +} + +static void dndCleanupMgmtWorker(SDnode *pDnode) { + SDnodeMgmt *pMgmt = &pDnode->dmgmt; + tWorkerCleanup(&pMgmt->mgmtPool); + dDebug("dnode mgmt worker is closed"); +} + +static int32_t dndAllocMgmtQueue(SDnode *pDnode) { + SDnodeMgmt *pMgmt = &pDnode->dmgmt; + pMgmt->pMgmtQ = tWorkerAllocQueue(&pMgmt->mgmtPool, pDnode, (FProcessItem)dndProcessMgmtQueue); + if (pMgmt->pMgmtQ == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return -1; + } + return 0; +} + +static void dndFreeMgmtQueue(SDnode *pDnode) { + SDnodeMgmt *pMgmt = &pDnode->dmgmt; + tWorkerFreeQueue(&pMgmt->mgmtPool, pMgmt->pMgmtQ); + pMgmt->pMgmtQ = NULL; +} + +void dndProcessMgmtMsg(SDnode *pDnode, SRpcMsg *pRpcMsg, SEpSet *pEpSet) { + SDnodeMgmt *pMgmt = &pDnode->dmgmt; + + if (pEpSet && pEpSet->numOfEps > 0 && pRpcMsg->msgType == TDMT_MND_STATUS_RSP) { + dndUpdateMnodeEpSet(pDnode, pEpSet); + } + + SRpcMsg *pMsg = taosAllocateQitem(sizeof(SRpcMsg)); + if (pMsg != NULL) *pMsg = *pRpcMsg; + + if (pMsg == NULL || taosWriteQitem(pMgmt->pMgmtQ, pMsg) != 0) { + if (pRpcMsg->msgType & 1u) { + SRpcMsg rsp = {.handle = pRpcMsg->handle, .code = TSDB_CODE_OUT_OF_MEMORY}; + rpcSendResponse(&rsp); + } + rpcFreeCont(pRpcMsg->pCont); + taosFreeQitem(pMsg); + } +} + +static void dndProcessMgmtQueue(SDnode *pDnode, SRpcMsg *pMsg) { + int32_t code = 0; + switch (pMsg->msgType) { + case TDMT_DND_CREATE_MNODE: + code = dndProcessCreateMnodeReq(pDnode, pMsg); + break; + case TDMT_DND_ALTER_MNODE: + code = dndProcessAlterMnodeReq(pDnode, pMsg); + break; + case TDMT_DND_DROP_MNODE: + code = dndProcessDropMnodeReq(pDnode, pMsg); + break; case TDMT_DND_NETWORK_TEST: dndProcessStartupReq(pDnode, pMsg); break; case TDMT_DND_CONFIG_DNODE: dndProcessConfigDnodeReq(pDnode, pMsg); break; - default: - dError("RPC %p, dnode req:%s not processed", pMsg->handle, TMSG_INFO(pMsg->msgType)); - SRpcMsg rspMsg = {.handle = pMsg->handle, .code = TSDB_CODE_MSG_NOT_PROCESSED}; - rpcSendResponse(&rspMsg); - } - - rpcFreeCont(pMsg->pCont); - pMsg->pCont = NULL; -} - -void dndProcessDnodeRsp(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) { - switch (pMsg->msgType) { case TDMT_MND_STATUS_RSP: - dndProcessStatusRsp(pDnode, pMsg, pEpSet); + dndProcessStatusRsp(pDnode, pMsg); break; case TDMT_MND_AUTH_RSP: - dndProcessAuthRsp(pDnode, pMsg, pEpSet); + dndProcessAuthRsp(pDnode, pMsg); break; case TDMT_MND_GRANT_RSP: - dndProcessGrantRsp(pDnode, pMsg, pEpSet); + dndProcessGrantRsp(pDnode, pMsg); break; default: - dError("RPC %p, dnode rsp:%s not processed", pMsg->handle, TMSG_INFO(pMsg->msgType)); + terrno = TSDB_CODE_MSG_NOT_PROCESSED; + code = -1; + dError("RPC %p, dnode req:%s not processed", pMsg->handle, TMSG_INFO(pMsg->msgType)); + break; + } + + if (pMsg->msgType & 1u) { + if (code != 0) code = terrno; + SRpcMsg rsp = {.code = code, .handle = pMsg->handle, .ahandle = pMsg->ahandle}; + rpcSendResponse(&rsp); } rpcFreeCont(pMsg->pCont); pMsg->pCont = NULL; + taosFreeQitem(pMsg); } diff --git a/source/dnode/mgmt/impl/src/dndMnode.c b/source/dnode/mgmt/impl/src/dndMnode.c index 8fbb473af1..50da49d325 100644 --- a/source/dnode/mgmt/impl/src/dndMnode.c +++ b/source/dnode/mgmt/impl/src/dndMnode.c @@ -21,7 +21,6 @@ static int32_t dndInitMnodeReadWorker(SDnode *pDnode); static int32_t dndInitMnodeWriteWorker(SDnode *pDnode); static int32_t dndInitMnodeSyncWorker(SDnode *pDnode); -static int32_t dndInitMnodeMgmtWorker(SDnode *pDnode); static void dndCleanupMnodeReadWorker(SDnode *pDnode); static void dndCleanupMnodeWriteWorker(SDnode *pDnode); static void dndCleanupMnodeSyncWorker(SDnode *pDnode); @@ -29,7 +28,6 @@ static void dndCleanupMnodeMgmtWorker(SDnode *pDnode); static int32_t dndAllocMnodeReadQueue(SDnode *pDnode); static int32_t dndAllocMnodeWriteQueue(SDnode *pDnode); static int32_t dndAllocMnodeSyncQueue(SDnode *pDnode); -static int32_t dndAllocMnodeMgmtQueue(SDnode *pDnode); static void dndFreeMnodeReadQueue(SDnode *pDnode); static void dndFreeMnodeWriteQueue(SDnode *pDnode); static void dndFreeMnodeSyncQueue(SDnode *pDnode); @@ -38,12 +36,10 @@ static void dndFreeMnodeMgmtQueue(SDnode *pDnode); static void dndProcessMnodeReadQueue(SDnode *pDnode, SMnodeMsg *pMsg); static void dndProcessMnodeWriteQueue(SDnode *pDnode, SMnodeMsg *pMsg); static void dndProcessMnodeSyncQueue(SDnode *pDnode, SMnodeMsg *pMsg); -static void dndProcessMnodeMgmtQueue(SDnode *pDnode, SRpcMsg *pMsg); static int32_t dndWriteMnodeMsgToQueue(SMnode *pMnode, taos_queue pQueue, SRpcMsg *pRpcMsg); void dndProcessMnodeReadMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet); void dndProcessMnodeWriteMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet); void dndProcessMnodeSyncMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet); -void dndProcessMnodeMgmtMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet); static int32_t dndStartMnodeWorker(SDnode *pDnode); static void dndStopMnodeWorker(SDnode *pDnode); @@ -58,10 +54,6 @@ static int32_t dndOpenMnode(SDnode *pDnode, SMnodeOpt *pOption); static int32_t dndAlterMnode(SDnode *pDnode, SMnodeOpt *pOption); static int32_t dndDropMnode(SDnode *pDnode); -static int32_t dndProcessCreateMnodeReq(SDnode *pDnode, SRpcMsg *pRpcMsg); -static int32_t dndProcessAlterMnodeReq(SDnode *pDnode, SRpcMsg *pRpcMsg); -static int32_t dndProcessDropMnodeReq(SDnode *pDnode, SRpcMsg *pRpcMsg); - static SMnode *dndAcquireMnode(SDnode *pDnode) { SMnodeMgmt *pMgmt = &pDnode->mmgmt; SMnode *pMnode = NULL; @@ -488,7 +480,7 @@ static SCreateMnodeInMsg *dndParseCreateMnodeMsg(SRpcMsg *pRpcMsg) { return pMsg; } -static int32_t dndProcessCreateMnodeReq(SDnode *pDnode, SRpcMsg *pRpcMsg) { +int32_t dndProcessCreateMnodeReq(SDnode *pDnode, SRpcMsg *pRpcMsg) { SCreateMnodeInMsg *pMsg = dndParseCreateMnodeMsg(pRpcMsg); if (pMsg->dnodeId != dndGetDnodeId(pDnode)) { @@ -504,7 +496,7 @@ static int32_t dndProcessCreateMnodeReq(SDnode *pDnode, SRpcMsg *pRpcMsg) { } } -static int32_t dndProcessAlterMnodeReq(SDnode *pDnode, SRpcMsg *pRpcMsg) { +int32_t dndProcessAlterMnodeReq(SDnode *pDnode, SRpcMsg *pRpcMsg) { SAlterMnodeInMsg *pMsg = dndParseCreateMnodeMsg(pRpcMsg); if (pMsg->dnodeId != dndGetDnodeId(pDnode)) { @@ -524,7 +516,7 @@ static int32_t dndProcessAlterMnodeReq(SDnode *pDnode, SRpcMsg *pRpcMsg) { return dndWriteMnodeFile(pDnode); } -static int32_t dndProcessDropMnodeReq(SDnode *pDnode, SRpcMsg *pRpcMsg) { +int32_t dndProcessDropMnodeReq(SDnode *pDnode, SRpcMsg *pRpcMsg) { SDropMnodeInMsg *pMsg = pRpcMsg->pCont; pMsg->dnodeId = htonl(pMsg->dnodeId); @@ -536,33 +528,6 @@ static int32_t dndProcessDropMnodeReq(SDnode *pDnode, SRpcMsg *pRpcMsg) { } } -static void dndProcessMnodeMgmtQueue(SDnode *pDnode, SRpcMsg *pMsg) { - int32_t code = 0; - - switch (pMsg->msgType) { - case TDMT_DND_CREATE_MNODE: - code = dndProcessCreateMnodeReq(pDnode, pMsg); - break; - case TDMT_DND_ALTER_MNODE: - code = dndProcessAlterMnodeReq(pDnode, pMsg); - break; - case TDMT_DND_DROP_MNODE: - code = dndProcessDropMnodeReq(pDnode, pMsg); - break; - default: - terrno = TSDB_CODE_MSG_NOT_PROCESSED; - code = -1; - break; - } - - if (pMsg->msgType & 1u) { - if (code != 0) code = terrno; - SRpcMsg rsp = {.code = code, .handle = pMsg->handle}; - rpcSendResponse(&rsp); - } - rpcFreeCont(pMsg->pCont); - taosFreeQitem(pMsg); -} static void dndProcessMnodeReadQueue(SDnode *pDnode, SMnodeMsg *pMsg) { SMnodeMgmt *pMgmt = &pDnode->mmgmt; @@ -622,25 +587,6 @@ static int32_t dndWriteMnodeMsgToQueue(SMnode *pMnode, taos_queue pQueue, SRpcMs return 0; } -void dndProcessMnodeMgmtMsg(SDnode *pDnode, SRpcMsg *pRpcMsg, SEpSet *pEpSet) { - SMnodeMgmt *pMgmt = &pDnode->mmgmt; - SMnode *pMnode = dndAcquireMnode(pDnode); - - SRpcMsg *pMsg = taosAllocateQitem(sizeof(SRpcMsg)); - if (pMsg != NULL) *pMsg = *pRpcMsg; - - if (pMsg == NULL || taosWriteQitem(pMgmt->pMgmtQ, pMsg) != 0) { - if (pRpcMsg->msgType & 1u) { - SRpcMsg rsp = {.handle = pRpcMsg->handle, .code = TSDB_CODE_OUT_OF_MEMORY}; - rpcSendResponse(&rsp); - } - rpcFreeCont(pRpcMsg->pCont); - taosFreeQitem(pMsg); - } - - dndReleaseMnode(pDnode, pMnode); -} - void dndProcessMnodeWriteMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) { SMnodeMgmt *pMgmt = &pDnode->mmgmt; SMnode *pMnode = dndAcquireMnode(pDnode); @@ -686,42 +632,6 @@ void dndProcessMnodeReadMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) { dndReleaseMnode(pDnode, pMnode); } -static int32_t dndAllocMnodeMgmtQueue(SDnode *pDnode) { - SMnodeMgmt *pMgmt = &pDnode->mmgmt; - pMgmt->pMgmtQ = tWorkerAllocQueue(&pMgmt->mgmtPool, pDnode, (FProcessItem)dndProcessMnodeMgmtQueue); - if (pMgmt->pMgmtQ == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return -1; - } - return 0; -} - -static void dndFreeMnodeMgmtQueue(SDnode *pDnode) { - SMnodeMgmt *pMgmt = &pDnode->mmgmt; - tWorkerFreeQueue(&pMgmt->mgmtPool, pMgmt->pMgmtQ); - pMgmt->pMgmtQ = NULL; -} - -static int32_t dndInitMnodeMgmtWorker(SDnode *pDnode) { - SMnodeMgmt *pMgmt = &pDnode->mmgmt; - SWorkerPool *pPool = &pMgmt->mgmtPool; - pPool->name = "mnode-mgmt"; - pPool->min = 1; - pPool->max = 1; - if (tWorkerInit(pPool) != 0) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return -1; - } - - dDebug("mnode mgmt worker is initialized"); - return 0; -} - -static void dndCleanupMnodeMgmtWorker(SDnode *pDnode) { - SMnodeMgmt *pMgmt = &pDnode->mmgmt; - tWorkerCleanup(&pMgmt->mgmtPool); - dDebug("mnode mgmt worker is closed"); -} static int32_t dndAllocMnodeReadQueue(SDnode *pDnode) { SMnodeMgmt *pMgmt = &pDnode->mmgmt; @@ -842,16 +752,6 @@ int32_t dndInitMnode(SDnode *pDnode) { SMnodeMgmt *pMgmt = &pDnode->mmgmt; taosInitRWLatch(&pMgmt->latch); - if (dndInitMnodeMgmtWorker(pDnode) != 0) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return -1; - } - - if (dndAllocMnodeMgmtQueue(pDnode) != 0) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return -1; - } - char path[PATH_MAX]; snprintf(path, PATH_MAX, "%s/mnode.json", pDnode->dir.dnode); pMgmt->file = strdup(path); @@ -894,8 +794,6 @@ void dndCleanupMnode(SDnode *pDnode) { dInfo("dnode-mnode start to clean up"); if (pMgmt->pMnode) dndStopMnodeWorker(pDnode); - dndCleanupMnodeMgmtWorker(pDnode); - dndFreeMnodeMgmtQueue(pDnode); tfree(pMgmt->file); mndClose(pMgmt->pMnode); dInfo("dnode-mnode is cleaned up"); diff --git a/source/dnode/mgmt/impl/src/dndTransport.c b/source/dnode/mgmt/impl/src/dndTransport.c index a5be338a17..f39bbb6ba3 100644 --- a/source/dnode/mgmt/impl/src/dndTransport.c +++ b/source/dnode/mgmt/impl/src/dndTransport.c @@ -83,7 +83,7 @@ static void dndInitMsgFp(STransMgmt *pMgmt) { pMgmt->msgFp[TMSG_INDEX(TDMT_MND_SHOW_RETRIEVE)] = dndProcessMnodeReadMsg; // message from client to dnode - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_NETWORK_TEST)] = dndProcessDnodeReq; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_NETWORK_TEST)] = dndProcessMgmtMsg; // message from mnode to vnode pMgmt->msgFp[TMSG_INDEX(TDMT_VND_CREATE_STB)] = dndProcessVnodeWriteMsg; @@ -106,24 +106,24 @@ static void dndInitMsgFp(STransMgmt *pMgmt) { pMgmt->msgFp[TMSG_INDEX(TDMT_DND_AUTH_VNODE_RSP)] = dndProcessMnodeWriteMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_DND_COMPACT_VNODE)] = dndProcessVnodeMgmtMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_DND_COMPACT_VNODE_RSP)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CREATE_MNODE)] = dndProcessMnodeMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CREATE_MNODE)] = dndProcessMgmtMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CREATE_MNODE_RSP)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_ALTER_MNODE)] = dndProcessMnodeMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_ALTER_MNODE)] = dndProcessMgmtMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_DND_ALTER_MNODE_RSP)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_DROP_MNODE)] = dndProcessMnodeMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_DROP_MNODE)] = dndProcessMgmtMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_DND_DROP_MNODE_RSP)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CONFIG_DNODE)] = dndProcessDnodeReq; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CONFIG_DNODE)] = dndProcessMgmtMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CONFIG_DNODE_RSP)] = dndProcessMnodeWriteMsg; // message from dnode to mnode pMgmt->msgFp[TMSG_INDEX(TDMT_MND_GRANT)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_MND_GRANT_RSP)] = dndProcessDnodeRsp; + pMgmt->msgFp[TMSG_INDEX(TDMT_MND_GRANT_RSP)] = dndProcessMgmtMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_MND_TRANS)] = dndProcessMnodeWriteMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_MND_TRANS_RSP)] = dndProcessMnodeWriteMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_MND_STATUS)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_MND_STATUS_RSP)] = dndProcessDnodeRsp; + pMgmt->msgFp[TMSG_INDEX(TDMT_MND_STATUS_RSP)] = dndProcessMgmtMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_MND_AUTH)] = dndProcessMnodeReadMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_MND_AUTH_RSP)] = dndProcessDnodeRsp; + pMgmt->msgFp[TMSG_INDEX(TDMT_MND_AUTH_RSP)] = dndProcessMgmtMsg; } static void dndProcessResponse(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet) { @@ -191,7 +191,7 @@ static void dndProcessRequest(void *param, SRpcMsg *pMsg, SEpSet *pEpSet) { tmsg_t msgType = pMsg->msgType; if (msgType == TDMT_DND_NETWORK_TEST) { dTrace("RPC %p, network test req, app:%p will be processed, code:0x%x", pMsg->handle, pMsg->ahandle, pMsg->code); - dndProcessDnodeReq(pDnode, pMsg, pEpSet); + dndProcessStartupReq(pDnode, pMsg); return; } From 8420c3aab28a7da8fc92e574983b3c2aa3055fcc Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Mon, 27 Dec 2021 13:19:18 +0800 Subject: [PATCH 08/10] remove mgmtq --- source/dnode/mgmt/impl/inc/dndInt.h | 2 - source/dnode/mgmt/impl/inc/dndVnodes.h | 8 +- source/dnode/mgmt/impl/src/dndDnode.c | 18 ++++ source/dnode/mgmt/impl/src/dndTransport.c | 12 +-- source/dnode/mgmt/impl/src/dndVnodes.c | 96 ++----------------- .../dnode/mgmt/impl/test/cluster/cluster.cpp | 4 +- source/dnode/mnode/impl/src/mndTrans.c | 2 +- source/dnode/mnode/sdb/src/sdbHash.c | 4 + 8 files changed, 44 insertions(+), 102 deletions(-) diff --git a/source/dnode/mgmt/impl/inc/dndInt.h b/source/dnode/mgmt/impl/inc/dndInt.h index c352b37ef0..d6e9a6b4a1 100644 --- a/source/dnode/mgmt/impl/inc/dndInt.h +++ b/source/dnode/mgmt/impl/inc/dndInt.h @@ -98,8 +98,6 @@ typedef struct { int32_t openVnodes; int32_t totalVnodes; SRWLatch latch; - taos_queue pMgmtQ; - SWorkerPool mgmtPool; SWorkerPool queryPool; SWorkerPool fetchPool; SMWorkerPool syncPool; diff --git a/source/dnode/mgmt/impl/inc/dndVnodes.h b/source/dnode/mgmt/impl/inc/dndVnodes.h index 35f99ee73b..bf5f0122c1 100644 --- a/source/dnode/mgmt/impl/inc/dndVnodes.h +++ b/source/dnode/mgmt/impl/inc/dndVnodes.h @@ -24,12 +24,18 @@ extern "C" { int32_t dndInitVnodes(SDnode *pDnode); void dndCleanupVnodes(SDnode *pDnode); void dndGetVnodeLoads(SDnode *pDnode, SVnodeLoads *pVloads); -void dndProcessVnodeMgmtMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet); void dndProcessVnodeWriteMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet); void dndProcessVnodeSyncMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet); void dndProcessVnodeQueryMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet); void dndProcessVnodeFetchMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet); +int32_t dndProcessCreateVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg); +int32_t dndProcessAlterVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg); +int32_t dndProcessDropVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg); +int32_t dndProcessAuthVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg); +int32_t dndProcessSyncVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg); +int32_t dndProcessCompactVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg); + #ifdef __cplusplus } #endif diff --git a/source/dnode/mgmt/impl/src/dndDnode.c b/source/dnode/mgmt/impl/src/dndDnode.c index 777d6f77d9..c67e55f048 100644 --- a/source/dnode/mgmt/impl/src/dndDnode.c +++ b/source/dnode/mgmt/impl/src/dndDnode.c @@ -661,6 +661,24 @@ static void dndProcessMgmtQueue(SDnode *pDnode, SRpcMsg *pMsg) { case TDMT_MND_GRANT_RSP: dndProcessGrantRsp(pDnode, pMsg); break; + case TDMT_DND_CREATE_VNODE: + code = dndProcessCreateVnodeReq(pDnode, pMsg); + break; + case TDMT_DND_ALTER_VNODE: + code = dndProcessAlterVnodeReq(pDnode, pMsg); + break; + case TDMT_DND_DROP_VNODE: + code = dndProcessDropVnodeReq(pDnode, pMsg); + break; + case TDMT_DND_AUTH_VNODE: + code = dndProcessAuthVnodeReq(pDnode, pMsg); + break; + case TDMT_DND_SYNC_VNODE: + code = dndProcessSyncVnodeReq(pDnode, pMsg); + break; + case TDMT_DND_COMPACT_VNODE: + code = dndProcessCompactVnodeReq(pDnode, pMsg); + break; default: terrno = TSDB_CODE_MSG_NOT_PROCESSED; code = -1; diff --git a/source/dnode/mgmt/impl/src/dndTransport.c b/source/dnode/mgmt/impl/src/dndTransport.c index f39bbb6ba3..000510970f 100644 --- a/source/dnode/mgmt/impl/src/dndTransport.c +++ b/source/dnode/mgmt/impl/src/dndTransport.c @@ -94,17 +94,17 @@ static void dndInitMsgFp(STransMgmt *pMgmt) { pMgmt->msgFp[TMSG_INDEX(TDMT_VND_DROP_STB_RSP)] = dndProcessMnodeWriteMsg; // message from mnode to dnode - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CREATE_VNODE)] = dndProcessVnodeMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CREATE_VNODE)] = dndProcessMgmtMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CREATE_VNODE_RSP)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_ALTER_VNODE)] = dndProcessVnodeMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_ALTER_VNODE)] = dndProcessMgmtMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_DND_ALTER_VNODE_RSP)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_DROP_VNODE)] = dndProcessVnodeMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_DROP_VNODE)] = dndProcessMgmtMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_DND_DROP_VNODE_RSP)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_SYNC_VNODE)] = dndProcessVnodeMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_SYNC_VNODE)] = dndProcessMgmtMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_DND_SYNC_VNODE_RSP)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_AUTH_VNODE)] = dndProcessVnodeMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_AUTH_VNODE)] = dndProcessMgmtMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_DND_AUTH_VNODE_RSP)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_COMPACT_VNODE)] = dndProcessVnodeMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_COMPACT_VNODE)] = dndProcessMgmtMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_DND_COMPACT_VNODE_RSP)] = dndProcessMnodeWriteMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CREATE_MNODE)] = dndProcessMgmtMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CREATE_MNODE_RSP)] = dndProcessMnodeWriteMsg; diff --git a/source/dnode/mgmt/impl/src/dndVnodes.c b/source/dnode/mgmt/impl/src/dndVnodes.c index 351fc20784..1e03bba10b 100644 --- a/source/dnode/mgmt/impl/src/dndVnodes.c +++ b/source/dnode/mgmt/impl/src/dndVnodes.c @@ -56,11 +56,9 @@ typedef struct { static int32_t dndInitVnodeReadWorker(SDnode *pDnode); static int32_t dndInitVnodeWriteWorker(SDnode *pDnode); static int32_t dndInitVnodeSyncWorker(SDnode *pDnode); -static int32_t dndInitVnodeMgmtWorker(SDnode *pDnode); static void dndCleanupVnodeReadWorker(SDnode *pDnode); static void dndCleanupVnodeWriteWorker(SDnode *pDnode); static void dndCleanupVnodeSyncWorker(SDnode *pDnode); -static void dndCleanupVnodeMgmtWorker(SDnode *pDnode); static int32_t dndAllocVnodeQueryQueue(SDnode *pDnode, SVnodeObj *pVnode); static int32_t dndAllocVnodeFetchQueue(SDnode *pDnode, SVnodeObj *pVnode); static int32_t dndAllocVnodeWriteQueue(SDnode *pDnode, SVnodeObj *pVnode); @@ -77,12 +75,10 @@ static void dndProcessVnodeFetchQueue(SVnodeObj *pVnode, SRpcMsg *pMsg); static void dndProcessVnodeWriteQueue(SVnodeObj *pVnode, taos_qall qall, int32_t numOfMsgs); static void dndProcessVnodeApplyQueue(SVnodeObj *pVnode, taos_qall qall, int32_t numOfMsgs); static void dndProcessVnodeSyncQueue(SVnodeObj *pVnode, taos_qall qall, int32_t numOfMsgs); -static void dndProcessVnodeMgmtQueue(SDnode *pDnode, SRpcMsg *pMsg); void dndProcessVnodeQueryMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet); void dndProcessVnodeFetchMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet); void dndProcessVnodeWriteMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet); void dndProcessVnodeSyncMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet); -void dndProcessVnodeMgmtMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet); static int32_t dndPutMsgIntoVnodeApplyQueue(SDnode *pDnode, int32_t vgId, SRpcMsg *pMsg); static SVnodeObj *dndAcquireVnode(SDnode *pDnode, int32_t vgId); @@ -96,13 +92,6 @@ static int32_t dndWriteVnodesToFile(SDnode *pDnode); static int32_t dndOpenVnodes(SDnode *pDnode); static void dndCloseVnodes(SDnode *pDnode); -static int32_t dndProcessCreateVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg); -static int32_t dndProcessAlterVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg); -static int32_t dndProcessDropVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg); -static int32_t dndProcessAuthVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg); -static int32_t dndProcessSyncVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg); -static int32_t dndProcessCompactVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg); - static SVnodeObj *dndAcquireVnode(SDnode *pDnode, int32_t vgId) { SVnodesMgmt *pMgmt = &pDnode->vmgmt; SVnodeObj *pVnode = NULL; @@ -600,7 +589,7 @@ static SAuthVnodeMsg *vnodeParseAuthVnodeReq(SRpcMsg *rpcMsg) { return pAuth; } -static int32_t dndProcessCreateVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg) { +int32_t dndProcessCreateVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg) { SCreateVnodeMsg *pCreate = dndParseCreateVnodeReq(rpcMsg); dDebug("vgId:%d, create vnode req is received", pCreate->vgId); @@ -641,7 +630,7 @@ static int32_t dndProcessCreateVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg) { return 0; } -static int32_t dndProcessAlterVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg) { +int32_t dndProcessAlterVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg) { SAlterVnodeMsg *pAlter = (SAlterVnodeMsg *)dndParseCreateVnodeReq(rpcMsg); dDebug("vgId:%d, alter vnode req is received", pAlter->vgId); @@ -680,7 +669,7 @@ static int32_t dndProcessAlterVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg) { return code; } -static int32_t dndProcessDropVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg) { +int32_t dndProcessDropVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg) { SDropVnodeMsg *pDrop = vnodeParseDropVnodeReq(rpcMsg); int32_t vgId = pDrop->vgId; @@ -707,7 +696,7 @@ static int32_t dndProcessDropVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg) { return 0; } -static int32_t dndProcessAuthVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg) { +int32_t dndProcessAuthVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg) { SAuthVnodeMsg *pAuth = (SAuthVnodeMsg *)vnodeParseAuthVnodeReq(rpcMsg); int32_t code = 0; @@ -725,7 +714,7 @@ static int32_t dndProcessAuthVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg) { return 0; } -static int32_t dndProcessSyncVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg) { +int32_t dndProcessSyncVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg) { SAuthVnodeMsg *pAuth = (SAuthVnodeMsg *)vnodeParseAuthVnodeReq(rpcMsg); int32_t vgId = pAuth->vgId; @@ -747,7 +736,7 @@ static int32_t dndProcessSyncVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg) { return 0; } -static int32_t dndProcessCompactVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg) { +int32_t dndProcessCompactVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg) { SCompactVnodeMsg *pCompact = (SCompactVnodeMsg *)vnodeParseDropVnodeReq(rpcMsg); int32_t vgId = pCompact->vgId; @@ -769,39 +758,6 @@ static int32_t dndProcessCompactVnodeReq(SDnode *pDnode, SRpcMsg *rpcMsg) { return 0; } -static void dndProcessVnodeMgmtQueue(SDnode *pDnode, SRpcMsg *pMsg) { - int32_t code = 0; - - switch (pMsg->msgType) { - case TDMT_DND_CREATE_VNODE: - code = dndProcessCreateVnodeReq(pDnode, pMsg); - break; - case TDMT_DND_ALTER_VNODE: - code = dndProcessAlterVnodeReq(pDnode, pMsg); - break; - case TDMT_DND_DROP_VNODE: - code = dndProcessDropVnodeReq(pDnode, pMsg); - break; - case TDMT_DND_AUTH_VNODE: - code = dndProcessAuthVnodeReq(pDnode, pMsg); - break; - case TDMT_DND_SYNC_VNODE: - code = dndProcessSyncVnodeReq(pDnode, pMsg); - break; - case TDMT_DND_COMPACT_VNODE: - code = dndProcessCompactVnodeReq(pDnode, pMsg); - break; - default: - code = TSDB_CODE_MSG_NOT_PROCESSED; - break; - } - - SRpcMsg rsp = {.code = code, .handle = pMsg->handle, .ahandle = pMsg->ahandle}; - rpcSendResponse(&rsp); - rpcFreeCont(pMsg->pCont); - taosFreeQitem(pMsg); -} - static void dndProcessVnodeQueryQueue(SVnodeObj *pVnode, SRpcMsg *pMsg) { SRpcMsg *pRsp = NULL; vnodeProcessQueryReq(pVnode->pImpl, pMsg, &pRsp); @@ -909,11 +865,6 @@ static SVnodeObj *dndAcquireVnodeFromMsg(SDnode *pDnode, SRpcMsg *pMsg) { return pVnode; } -void dndProcessVnodeMgmtMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) { - SVnodesMgmt *pMgmt = &pDnode->vmgmt; - dndWriteRpcMsgToVnodeQueue(pMgmt->pMgmtQ, pMsg); -} - void dndProcessVnodeWriteMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) { SVnodeObj *pVnode = dndAcquireVnodeFromMsg(pDnode, pMsg); if (pVnode != NULL) { @@ -957,35 +908,6 @@ static int32_t dndPutMsgIntoVnodeApplyQueue(SDnode *pDnode, int32_t vgId, SRpcMs return code; } -static int32_t dndInitVnodeMgmtWorker(SDnode *pDnode) { - SVnodesMgmt *pMgmt = &pDnode->vmgmt; - SWorkerPool *pPool = &pMgmt->mgmtPool; - pPool->name = "vnode-mgmt"; - pPool->min = 1; - pPool->max = 1; - if (tWorkerInit(pPool) != 0) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return -1; - } - - pMgmt->pMgmtQ = tWorkerAllocQueue(pPool, pDnode, (FProcessItem)dndProcessVnodeMgmtQueue); - if (pMgmt->pMgmtQ == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return -1; - } - - dDebug("vnode mgmt worker is initialized"); - return 0; -} - -static void dndCleanupVnodeMgmtWorker(SDnode *pDnode) { - SVnodesMgmt *pMgmt = &pDnode->vmgmt; - tWorkerFreeQueue(&pMgmt->mgmtPool, pMgmt->pMgmtQ); - tWorkerCleanup(&pMgmt->mgmtPool); - pMgmt->pMgmtQ = NULL; - dDebug("vnode mgmt worker is closed"); -} - static int32_t dndAllocVnodeQueryQueue(SDnode *pDnode, SVnodeObj *pVnode) { SVnodesMgmt *pMgmt = &pDnode->vmgmt; pVnode->pQueryQ = tWorkerAllocQueue(&pMgmt->queryPool, pVnode, (FProcessItem)dndProcessVnodeQueryQueue); @@ -1167,11 +1089,6 @@ int32_t dndInitVnodes(SDnode *pDnode) { return -1; } - if (dndInitVnodeMgmtWorker(pDnode) != 0) { - dError("failed to init vnodes mgmt worker since %s", terrstr()); - return -1; - } - if (dndOpenVnodes(pDnode) != 0) { dError("failed to open vnodes since %s", terrstr()); return -1; @@ -1187,7 +1104,6 @@ void dndCleanupVnodes(SDnode *pDnode) { dndCleanupVnodeReadWorker(pDnode); dndCleanupVnodeWriteWorker(pDnode); dndCleanupVnodeSyncWorker(pDnode); - dndCleanupVnodeMgmtWorker(pDnode); dInfo("dnode-vnodes is cleaned up"); } diff --git a/source/dnode/mgmt/impl/test/cluster/cluster.cpp b/source/dnode/mgmt/impl/test/cluster/cluster.cpp index 7230c3eb74..7734826789 100644 --- a/source/dnode/mgmt/impl/test/cluster/cluster.cpp +++ b/source/dnode/mgmt/impl/test/cluster/cluster.cpp @@ -28,14 +28,14 @@ Testbase DndTestCluster::test; TEST_F(DndTestCluster, 01_ShowCluster) { test.SendShowMetaMsg(TSDB_MGMT_TABLE_CLUSTER, ""); CHECK_META( "show cluster", 3); - CHECK_SCHEMA(0, TSDB_DATA_TYPE_INT, 4, "id"); + CHECK_SCHEMA(0, TSDB_DATA_TYPE_BIGINT, 8, "id"); CHECK_SCHEMA(1, TSDB_DATA_TYPE_BINARY, TSDB_CLUSTER_ID_LEN + VARSTR_HEADER_SIZE, "name"); CHECK_SCHEMA(2, TSDB_DATA_TYPE_TIMESTAMP, 8, "create_time"); test.SendShowRetrieveMsg(); EXPECT_EQ(test.GetShowRows(), 1); - IgnoreInt32(); + IgnoreInt64(); IgnoreBinary(TSDB_CLUSTER_ID_LEN); CheckTimestamp(); } \ No newline at end of file diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index cf85befb61..9459c5e525 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -844,7 +844,7 @@ static bool mndTransPerfromFinishedStage(SMnode *pMnode, STrans *pTrans) { mError("trans:%d, failed to write sdb since %s", pTrans->id, terrstr()); } - mError("trans:%d, exec finished, code:0x%x, failedTimes:%d", pTrans->id, pTrans->code, pTrans->failedTimes); + mDebug("trans:%d, finished, code:0x%x, failedTimes:%d", pTrans->id, pTrans->code, pTrans->failedTimes); return continueExec; } diff --git a/source/dnode/mnode/sdb/src/sdbHash.c b/source/dnode/mnode/sdb/src/sdbHash.c index 0c311b86b6..e288f598a2 100644 --- a/source/dnode/mnode/sdb/src/sdbHash.c +++ b/source/dnode/mnode/sdb/src/sdbHash.c @@ -123,6 +123,10 @@ static int32_t sdbDeleteRow(SSdb *pSdb, SHashObj *hash, SSdbRaw *pRaw, SSdbRow * SRWLatch *pLock = &pSdb->locks[pRow->type]; taosWLockLatch(pLock); + // remove attached object such as trans + SdbDeleteFp deleteFp = pSdb->deleteFps[pRow->type]; + if (deleteFp != NULL) (*deleteFp)(pSdb, pRow); + SSdbRow **ppOldRow = taosHashGet(hash, pRow->pObj, keySize); if (ppOldRow == NULL || *ppOldRow == NULL) { taosWUnLockLatch(pLock); From 0b14f7366807e2134a7610acf216b803dfdd3571 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Sun, 26 Dec 2021 22:27:32 -0800 Subject: [PATCH 09/10] minor changes --- source/dnode/mnode/sdb/src/sdbHash.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dnode/mnode/sdb/src/sdbHash.c b/source/dnode/mnode/sdb/src/sdbHash.c index e288f598a2..27ff8e697d 100644 --- a/source/dnode/mnode/sdb/src/sdbHash.c +++ b/source/dnode/mnode/sdb/src/sdbHash.c @@ -125,7 +125,7 @@ static int32_t sdbDeleteRow(SSdb *pSdb, SHashObj *hash, SSdbRaw *pRaw, SSdbRow * // remove attached object such as trans SdbDeleteFp deleteFp = pSdb->deleteFps[pRow->type]; - if (deleteFp != NULL) (*deleteFp)(pSdb, pRow); + if (deleteFp != NULL) (*deleteFp)(pSdb, pRow->pObj); SSdbRow **ppOldRow = taosHashGet(hash, pRow->pObj, keySize); if (ppOldRow == NULL || *ppOldRow == NULL) { From b77149240fd05975c4fcd4bce5f896a55960e0f3 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Sun, 26 Dec 2021 23:15:03 -0800 Subject: [PATCH 10/10] fix msg error --- include/common/tmsgdef.h | 19 +-- source/client/src/clientImpl.c | 2 +- source/client/src/clientMsgHandler.c | 2 +- source/dnode/mgmt/impl/src/dndTransport.c | 114 +++++++++--------- .../dnode/mgmt/impl/test/profile/profile.cpp | 4 +- source/dnode/mgmt/impl/test/stb/stb.cpp | 2 +- source/dnode/mnode/impl/src/mndStb.c | 16 ++- source/dnode/vnode/impl/src/vnodeRequest.c | 4 +- source/dnode/vnode/impl/src/vnodeWrite.c | 2 +- .../dnode/vnode/impl/test/vnodeApiTests.cpp | 12 +- source/libs/parser/src/astValidate.c | 2 +- src/client/src/tscServer.c | 2 +- 12 files changed, 94 insertions(+), 87 deletions(-) diff --git a/include/common/tmsgdef.h b/include/common/tmsgdef.h index ff22e077c0..9aa4325d58 100644 --- a/include/common/tmsgdef.h +++ b/include/common/tmsgdef.h @@ -67,23 +67,21 @@ enum { #endif // Requests handled by DNODE TD_NEW_MSG_SEG(TDMT_DND_MSG) - TD_DEF_MSG_TYPE(TDMT_DND_NETWORK_TEST, "dnode-nettest", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_DND_CREATE_MNODE, "dnode-create-mnode", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_DND_ALTER_MNODE, "dnode-alter-mnode", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_DND_DROP_MNODE, "dnode-drop-mnode", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_DND_CREATE_VNODE, "dnode-create-vnode", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_DND_ALTER_VNODE, "dnode-alter-vnode", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_DND_DROP_VNODE, "dnode-drop-vnode", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_DND_AUTH_VNODE, "dnode-auth-vnode", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_DND_SYNC_VNODE, "dnode-sync-vnode", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_DND_COMPACT_VNODE, "dnode-compact-vnode", NULL, NULL) - TD_DEF_MSG_TYPE(TDMT_DND_CREATE_MNODE, "dnode-create-mnode", NULL, NULL) - TD_DEF_MSG_TYPE(TDMT_DND_ALTER_MNODE, "dnode-alter-mnode", NULL, NULL) - TD_DEF_MSG_TYPE(TDMT_DND_DROP_MNODE, "dnode-drop-mnode", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_DND_CONFIG_DNODE, "dnode-config-dnode", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_DND_NETWORK_TEST, "dnode-nettest", NULL, NULL) // Requests handled by MNODE TD_NEW_MSG_SEG(TDMT_MND_MSG) TD_DEF_MSG_TYPE(TDMT_MND_CONNECT, "mnode-connect", NULL, NULL) - TD_DEF_MSG_TYPE(TDMT_MND_CREATE_TABLE, "mnode-create-table", NULL, NULL) - TD_DEF_MSG_TYPE(TDMT_MND_DROP_TABLE, "mnode-drop-table", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_CREATE_ACCT, "mnode-create-acct", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_ALTER_ACCT, "mnode-alter-acct", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_DROP_ACCT, "mnode-drop-acct", NULL, NULL) @@ -107,6 +105,7 @@ enum { TD_DEF_MSG_TYPE(TDMT_MND_CREATE_STB, "mnode-create-stb", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_ALTER_STB, "mnode-alter-stb", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_DROP_STB, "mnode-drop-stb", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_MND_STB_META, "mnode-stb-meta", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_VGROUP_LIST, "mnode-vgroup-list", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_KILL_QUERY, "mnode-kill-query", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_KILL_CONN, "mnode-kill-conn", NULL, NULL) @@ -126,10 +125,15 @@ enum { TD_DEF_MSG_TYPE(TDMT_VND_SUBMIT, "vnode-submit", SSubmitReq, SSubmitRsp) TD_DEF_MSG_TYPE(TDMT_VND_QUERY, "vnode-query", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_VND_FETCH, "vnode-fetch", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_VND_CREATE_TABLE, "vnode-create-table", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_VND_ALTER_TABLE, "vnode-alter-table", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_VND_DROP_TABLE, "vnode-drop-table", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_VND_UPDATE_TAG_VAL, "vnode-update-tag-val", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_VND_TABLE_META, "vnode-table-meta", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_VND_TABLES_META, "vnode-tables-meta", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_VND_CREATE_STB, "vnode-create-stb", SVCreateTbReq, SVCreateTbRsp) + TD_DEF_MSG_TYPE(TDMT_VND_ALTER_STB, "vnode-alter-stb", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_VND_DROP_STB, "vnode-drop-stb", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_VND_MQ_CONSUME, "vnode-mq-consume", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_VND_MQ_QUERY, "vnode-mq-query", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_VND_MQ_CONNECT, "vnode-mq-connect", NULL, NULL) @@ -139,9 +143,6 @@ enum { TD_DEF_MSG_TYPE(TDMT_VND_TASKS_STATUS, "vnode-tasks-status", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_VND_CANCEL_TASK, "vnode-cancel-task", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_VND_DROP_TASK, "vnode-drop-task", NULL, NULL) - TD_DEF_MSG_TYPE(TDMT_VND_CREATE_STB, "vnode-create-super-table", SVCreateTbReq, SVCreateTbRsp) - TD_DEF_MSG_TYPE(TDMT_VND_ALTER_STB, "vnode-alter-stb", NULL, NULL) - TD_DEF_MSG_TYPE(TDMT_VND_DROP_STB, "vnode-drop-stb", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_VND_CREATE_TOPIC, "vnode-create-topic", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_VND_ALTER_TOPIC, "vnode-alter-topic", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_VND_DROP_TOPIC, "vnode-drop-topic", NULL, NULL) diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index 3830eadfc7..7780fcd6a4 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -167,7 +167,7 @@ int32_t execDdlQuery(SRequestObj* pRequest, SQueryNode* pQuery) { SMsgSendInfo* body = buildSendMsgInfoImpl(pRequest); SEpSet* pEpSet = &pTscObj->pAppInfo->mgmtEp.epSet; - if (pDcl->msgType == TDMT_MND_CREATE_TABLE) { + if (pDcl->msgType == TDMT_VND_CREATE_TABLE) { struct SCatalog* pCatalog = NULL; char buf[18] = {0}; diff --git a/source/client/src/clientMsgHandler.c b/source/client/src/clientMsgHandler.c index ad0b3ccc0f..79d61423a7 100644 --- a/source/client/src/clientMsgHandler.c +++ b/source/client/src/clientMsgHandler.c @@ -285,6 +285,6 @@ void initMsgHandleFp() { handleRequestRspFp[TDMT_MND_SHOW_RETRIEVE] = processRetrieveMnodeRsp; handleRequestRspFp[TDMT_MND_CREATE_DB] = processCreateDbRsp; handleRequestRspFp[TDMT_MND_USE_DB] = processUseDbRsp; - handleRequestRspFp[TDMT_MND_CREATE_TABLE] = processCreateTableRsp; + handleRequestRspFp[TDMT_MND_CREATE_STB] = processCreateTableRsp; handleRequestRspFp[TDMT_MND_DROP_DB] = processDropDbRsp; } \ No newline at end of file diff --git a/source/dnode/mgmt/impl/src/dndTransport.c b/source/dnode/mgmt/impl/src/dndTransport.c index 000510970f..8db09ea4cd 100644 --- a/source/dnode/mgmt/impl/src/dndTransport.c +++ b/source/dnode/mgmt/impl/src/dndTransport.c @@ -30,27 +30,30 @@ #define INTERNAL_SECRET "_secret" static void dndInitMsgFp(STransMgmt *pMgmt) { - // msg from client to dnode - pMgmt->msgFp[TMSG_INDEX(TDMT_VND_SUBMIT)] = dndProcessVnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_VND_QUERY)] = dndProcessVnodeQueryMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_VND_FETCH)] = dndProcessVnodeFetchMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_MND_CREATE_TABLE)] = dndProcessVnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_MND_DROP_TABLE)] = dndProcessVnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_VND_ALTER_TABLE)] = dndProcessVnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_VND_UPDATE_TAG_VAL)] = dndProcessVnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_VND_TABLE_META)] = dndProcessMnodeReadMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_VND_TABLES_META)] = dndProcessVnodeQueryMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_QUERY)] = dndProcessVnodeQueryMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_CONSUME)] = dndProcessVnodeQueryMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_CONNECT)] = dndProcessVnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_DISCONNECT)] = dndProcessVnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_SET_CUR)] = dndProcessVnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_VND_RES_READY)] = dndProcessVnodeFetchMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_VND_TASKS_STATUS)] = dndProcessVnodeFetchMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_VND_CANCEL_TASK)] = dndProcessVnodeFetchMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_VND_DROP_TASK)] = dndProcessVnodeFetchMsg; + // Requests handled by DNODE + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CREATE_MNODE)] = dndProcessMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CREATE_MNODE_RSP)] = dndProcessMnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_ALTER_MNODE)] = dndProcessMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_ALTER_MNODE_RSP)] = dndProcessMnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_DROP_MNODE)] = dndProcessMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_DROP_MNODE_RSP)] = dndProcessMnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CREATE_VNODE)] = dndProcessMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CREATE_VNODE_RSP)] = dndProcessMnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_ALTER_VNODE)] = dndProcessMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_ALTER_VNODE_RSP)] = dndProcessMnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_DROP_VNODE)] = dndProcessMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_DROP_VNODE_RSP)] = dndProcessMnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_SYNC_VNODE)] = dndProcessMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_SYNC_VNODE_RSP)] = dndProcessMnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_AUTH_VNODE)] = dndProcessMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_AUTH_VNODE_RSP)] = dndProcessMnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_COMPACT_VNODE)] = dndProcessMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_COMPACT_VNODE_RSP)] = dndProcessMnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CONFIG_DNODE)] = dndProcessMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CONFIG_DNODE_RSP)] = dndProcessMnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_DND_NETWORK_TEST)] = dndProcessMgmtMsg; - // msg from client to mnode + // Requests handled by MNODE pMgmt->msgFp[TMSG_INDEX(TDMT_MND_CONNECT)] = dndProcessMnodeReadMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_MND_CREATE_ACCT)] = dndProcessMnodeWriteMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_MND_ALTER_ACCT)] = dndProcessMnodeWriteMsg; @@ -75,55 +78,51 @@ static void dndInitMsgFp(STransMgmt *pMgmt) { pMgmt->msgFp[TMSG_INDEX(TDMT_MND_CREATE_STB)] = dndProcessMnodeWriteMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_MND_ALTER_STB)] = dndProcessMnodeWriteMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_MND_DROP_STB)] = dndProcessMnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_MND_STB_META)] = dndProcessMnodeReadMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_MND_VGROUP_LIST)] = dndProcessMnodeReadMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_MND_KILL_QUERY)] = dndProcessMnodeWriteMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_MND_KILL_CONN)] = dndProcessMnodeWriteMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_MND_HEARTBEAT)] = dndProcessMnodeReadMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_MND_SHOW)] = dndProcessMnodeReadMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_MND_SHOW_RETRIEVE)] = dndProcessMnodeReadMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_MND_STATUS)] = dndProcessMnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_MND_STATUS_RSP)] = dndProcessMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_MND_TRANS)] = dndProcessMnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_MND_TRANS_RSP)] = dndProcessMnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_MND_GRANT)] = dndProcessMnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_MND_GRANT_RSP)] = dndProcessMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_MND_AUTH)] = dndProcessMnodeReadMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_MND_AUTH_RSP)] = dndProcessMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_MND_CREATE_TOPIC)] = dndProcessMnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_MND_ALTER_TOPIC)] = dndProcessMnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_MND_DROP_TOPIC)] = dndProcessMnodeWriteMsg; - // message from client to dnode - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_NETWORK_TEST)] = dndProcessMgmtMsg; - - // message from mnode to vnode + // Requests handled by VNODE + pMgmt->msgFp[TMSG_INDEX(TDMT_VND_SUBMIT)] = dndProcessVnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_VND_QUERY)] = dndProcessVnodeQueryMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_VND_FETCH)] = dndProcessVnodeFetchMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_VND_ALTER_TABLE)] = dndProcessVnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_VND_UPDATE_TAG_VAL)] = dndProcessVnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_VND_TABLE_META)] = dndProcessVnodeQueryMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_VND_TABLES_META)] = dndProcessVnodeQueryMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_CONSUME)] = dndProcessVnodeQueryMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_QUERY)] = dndProcessVnodeQueryMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_CONNECT)] = dndProcessVnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_DISCONNECT)] = dndProcessVnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_SET_CUR)] = dndProcessVnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_VND_RES_READY)] = dndProcessVnodeFetchMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_VND_TASKS_STATUS)] = dndProcessVnodeFetchMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_VND_CANCEL_TASK)] = dndProcessVnodeFetchMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_VND_DROP_TASK)] = dndProcessVnodeFetchMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_VND_CREATE_STB)] = dndProcessVnodeWriteMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_VND_CREATE_STB_RSP)] = dndProcessMnodeWriteMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_VND_ALTER_STB)] = dndProcessVnodeWriteMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_VND_ALTER_STB_RSP)] = dndProcessMnodeWriteMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_VND_DROP_STB)] = dndProcessVnodeWriteMsg; pMgmt->msgFp[TMSG_INDEX(TDMT_VND_DROP_STB_RSP)] = dndProcessMnodeWriteMsg; - - // message from mnode to dnode - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CREATE_VNODE)] = dndProcessMgmtMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CREATE_VNODE_RSP)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_ALTER_VNODE)] = dndProcessMgmtMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_ALTER_VNODE_RSP)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_DROP_VNODE)] = dndProcessMgmtMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_DROP_VNODE_RSP)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_SYNC_VNODE)] = dndProcessMgmtMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_SYNC_VNODE_RSP)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_AUTH_VNODE)] = dndProcessMgmtMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_AUTH_VNODE_RSP)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_COMPACT_VNODE)] = dndProcessMgmtMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_COMPACT_VNODE_RSP)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CREATE_MNODE)] = dndProcessMgmtMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CREATE_MNODE_RSP)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_ALTER_MNODE)] = dndProcessMgmtMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_ALTER_MNODE_RSP)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_DROP_MNODE)] = dndProcessMgmtMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_DROP_MNODE_RSP)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CONFIG_DNODE)] = dndProcessMgmtMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CONFIG_DNODE_RSP)] = dndProcessMnodeWriteMsg; - - // message from dnode to mnode - pMgmt->msgFp[TMSG_INDEX(TDMT_MND_GRANT)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_MND_GRANT_RSP)] = dndProcessMgmtMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_MND_TRANS)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_MND_TRANS_RSP)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_MND_STATUS)] = dndProcessMnodeWriteMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_MND_STATUS_RSP)] = dndProcessMgmtMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_MND_AUTH)] = dndProcessMnodeReadMsg; - pMgmt->msgFp[TMSG_INDEX(TDMT_MND_AUTH_RSP)] = dndProcessMgmtMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_VND_CREATE_TABLE)] = dndProcessVnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_VND_ALTER_TABLE)] = dndProcessVnodeWriteMsg; + pMgmt->msgFp[TMSG_INDEX(TDMT_VND_DROP_TABLE)] = dndProcessVnodeWriteMsg; } static void dndProcessResponse(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet) { @@ -210,7 +209,8 @@ static void dndProcessRequest(void *param, SRpcMsg *pMsg, SEpSet *pEpSet) { } if (pMsg->pCont == NULL) { - dTrace("RPC %p, req:%s app:%p not processed since content is null", pMsg->handle, TMSG_INFO(msgType), pMsg->ahandle); + dTrace("RPC %p, req:%s app:%p not processed since content is null", pMsg->handle, TMSG_INFO(msgType), + pMsg->ahandle); SRpcMsg rspMsg = {.handle = pMsg->handle, .code = TSDB_CODE_DND_INVALID_MSG_LEN}; rpcSendResponse(&rspMsg); return; diff --git a/source/dnode/mgmt/impl/test/profile/profile.cpp b/source/dnode/mgmt/impl/test/profile/profile.cpp index 081f9e7ef5..87e6bfde74 100644 --- a/source/dnode/mgmt/impl/test/profile/profile.cpp +++ b/source/dnode/mgmt/impl/test/profile/profile.cpp @@ -42,7 +42,7 @@ TEST_F(DndTestProfile, 01_ConnectMsg) { SConnectRsp* pRsp = (SConnectRsp*)pMsg->pCont; ASSERT_NE(pRsp, nullptr); pRsp->acctId = htonl(pRsp->acctId); - pRsp->clusterId = htonl(pRsp->clusterId); + pRsp->clusterId = htobe64(pRsp->clusterId); pRsp->connId = htonl(pRsp->connId); pRsp->epSet.port[0] = htons(pRsp->epSet.port[0]); @@ -174,7 +174,7 @@ TEST_F(DndTestProfile, 05_KillConnMsg) { SConnectRsp* pRsp = (SConnectRsp*)pMsg->pCont; ASSERT_NE(pRsp, nullptr); pRsp->acctId = htonl(pRsp->acctId); - pRsp->clusterId = htonl(pRsp->clusterId); + pRsp->clusterId = htobe64(pRsp->clusterId); pRsp->connId = htonl(pRsp->connId); pRsp->epSet.port[0] = htons(pRsp->epSet.port[0]); diff --git a/source/dnode/mgmt/impl/test/stb/stb.cpp b/source/dnode/mgmt/impl/test/stb/stb.cpp index e67a3ea8cf..c55e952a89 100644 --- a/source/dnode/mgmt/impl/test/stb/stb.cpp +++ b/source/dnode/mgmt/impl/test/stb/stb.cpp @@ -133,7 +133,7 @@ TEST_F(DndTestStb, 01_Create_Show_Meta_Drop_Restart_Stb) { STableInfoMsg* pReq = (STableInfoMsg*)rpcMallocCont(contLen); strcpy(pReq->tableFname, "1.d1.stb"); - SRpcMsg* pMsg = test.SendMsg(TDMT_VND_TABLE_META, pReq, contLen); + SRpcMsg* pMsg = test.SendMsg(TDMT_MND_STB_META, pReq, contLen); ASSERT_NE(pMsg, nullptr); ASSERT_EQ(pMsg->code, 0); diff --git a/source/dnode/mnode/impl/src/mndStb.c b/source/dnode/mnode/impl/src/mndStb.c index bdc13f91b7..799eb4afa7 100644 --- a/source/dnode/mnode/impl/src/mndStb.c +++ b/source/dnode/mnode/impl/src/mndStb.c @@ -58,7 +58,7 @@ int32_t mndInitStb(SMnode *pMnode) { mndSetMsgHandle(pMnode, TDMT_VND_CREATE_STB_RSP, mndProcessCreateStbInRsp); mndSetMsgHandle(pMnode, TDMT_VND_ALTER_STB_RSP, mndProcessAlterStbInRsp); mndSetMsgHandle(pMnode, TDMT_VND_DROP_STB_RSP, mndProcessDropStbInRsp); - mndSetMsgHandle(pMnode, TDMT_VND_TABLE_META, mndProcessStbMetaMsg); + mndSetMsgHandle(pMnode, TDMT_MND_STB_META, mndProcessStbMetaMsg); mndAddShowMetaHandle(pMnode, TSDB_MGMT_TABLE_STB, mndGetStbMeta); mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STB, mndRetrieveStb); @@ -886,14 +886,19 @@ static void mndExtractTableName(char *tableId, char *name) { } static int32_t mndRetrieveStb(SMnodeMsg *pMsg, SShowObj *pShow, char *data, int32_t rows) { - SMnode * pMnode = pMsg->pMnode; - SSdb * pSdb = pMnode->pSdb; + SMnode *pMnode = pMsg->pMnode; + SSdb *pSdb = pMnode->pSdb; int32_t numOfRows = 0; SStbObj *pStb = NULL; int32_t cols = 0; - char * pWrite; + char *pWrite; char prefix[64] = {0}; + SDbObj *pDb = mndAcquireDb(pMnode, pShow->db); + if (pDb == NULL) { + return TSDB_CODE_MND_INVALID_DB; + } + tstrncpy(prefix, pShow->db, 64); strcat(prefix, TS_PATH_DELIMITER); int32_t prefixLen = (int32_t)strlen(prefix); @@ -902,7 +907,7 @@ static int32_t mndRetrieveStb(SMnodeMsg *pMsg, SShowObj *pShow, char *data, int3 pShow->pIter = sdbFetch(pSdb, SDB_STB, pShow->pIter, (void **)&pStb); if (pShow->pIter == NULL) break; - if (strncmp(pStb->name, prefix, prefixLen) != 0) { + if (pStb->dbUid != pDb->uid) { sdbRelease(pSdb, pStb); continue; } @@ -931,6 +936,7 @@ static int32_t mndRetrieveStb(SMnodeMsg *pMsg, SShowObj *pShow, char *data, int3 sdbRelease(pSdb, pStb); } + mndReleaseDb(pMnode, pDb); pShow->numOfReads += numOfRows; mndVacuumResult(data, pShow->numOfColumns, numOfRows, rows, pShow); return numOfRows; diff --git a/source/dnode/vnode/impl/src/vnodeRequest.c b/source/dnode/vnode/impl/src/vnodeRequest.c index efbba6352f..afc43602d8 100644 --- a/source/dnode/vnode/impl/src/vnodeRequest.c +++ b/source/dnode/vnode/impl/src/vnodeRequest.c @@ -23,7 +23,7 @@ int vnodeBuildReq(void **buf, const SVnodeReq *pReq, tmsg_t type) { tsize += taosEncodeFixedU64(buf, pReq->ver); switch (type) { - case TDMT_MND_CREATE_TABLE: + case TDMT_VND_CREATE_STB: tsize += vnodeBuildCreateTableReq(buf, &(pReq->ctReq)); break; case TDMT_VND_SUBMIT: @@ -40,7 +40,7 @@ void *vnodeParseReq(void *buf, SVnodeReq *pReq, tmsg_t type) { buf = taosDecodeFixedU64(buf, &(pReq->ver)); switch (type) { - case TDMT_MND_CREATE_TABLE: + case TDMT_VND_CREATE_STB: buf = vnodeParseCreateTableReq(buf, &(pReq->ctReq)); break; diff --git a/source/dnode/vnode/impl/src/vnodeWrite.c b/source/dnode/vnode/impl/src/vnodeWrite.c index 18a808f955..ef35c81e06 100644 --- a/source/dnode/vnode/impl/src/vnodeWrite.c +++ b/source/dnode/vnode/impl/src/vnodeWrite.c @@ -78,7 +78,7 @@ int vnodeApplyWMsg(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) { // TODO: maybe need to clear the requst struct break; case TDMT_VND_DROP_STB: - case TDMT_MND_DROP_TABLE: + case TDMT_VND_DROP_TABLE: if (metaDropTable(pVnode->pMeta, vReq.dtReq.uid) < 0) { // TODO: handle error } diff --git a/source/dnode/vnode/impl/test/vnodeApiTests.cpp b/source/dnode/vnode/impl/test/vnodeApiTests.cpp index 13d703f0be..71ffdd1d0f 100644 --- a/source/dnode/vnode/impl/test/vnodeApiTests.cpp +++ b/source/dnode/vnode/impl/test/vnodeApiTests.cpp @@ -84,14 +84,14 @@ static void vtBuildCreateStbReq(tb_uid_t suid, char *tbname, SRpcMsg **ppMsg) { SVnodeReq vCreateSTbReq; vnodeSetCreateStbReq(&vCreateSTbReq, tbname, UINT32_MAX, UINT32_MAX, suid, pSchema, pTagSchema); - zs = vnodeBuildReq(NULL, &vCreateSTbReq, TDMT_MND_CREATE_TABLE); + zs = vnodeBuildReq(NULL, &vCreateSTbReq, TDMT_VND_CREATE_STB); pMsg = (SRpcMsg *)malloc(sizeof(SRpcMsg) + zs); - pMsg->msgType = TDMT_MND_CREATE_TABLE; + pMsg->msgType = TDMT_VND_CREATE_STB; pMsg->contLen = zs; pMsg->pCont = POINTER_SHIFT(pMsg, sizeof(SRpcMsg)); pBuf = pMsg->pCont; - vnodeBuildReq(&pBuf, &vCreateSTbReq, TDMT_MND_CREATE_TABLE); + vnodeBuildReq(&pBuf, &vCreateSTbReq, TDMT_VND_CREATE_STB); META_CLEAR_TB_CFG(&vCreateSTbReq); tdFreeSchema(pSchema); @@ -108,14 +108,14 @@ static void vtBuildCreateCtbReq(tb_uid_t suid, char *tbname, SRpcMsg **ppMsg) { SVnodeReq vCreateCTbReq; vnodeSetCreateCtbReq(&vCreateCTbReq, tbname, UINT32_MAX, UINT32_MAX, suid, pTag); - tz = vnodeBuildReq(NULL, &vCreateCTbReq, TDMT_MND_CREATE_TABLE); + tz = vnodeBuildReq(NULL, &vCreateCTbReq, TDMT_VND_CREATE_TABLE); pMsg = (SRpcMsg *)malloc(sizeof(SRpcMsg) + tz); - pMsg->msgType = TDMT_MND_CREATE_TABLE; + pMsg->msgType = TDMT_VND_CREATE_TABLE; pMsg->contLen = tz; pMsg->pCont = POINTER_SHIFT(pMsg, sizeof(*pMsg)); void *pBuf = pMsg->pCont; - vnodeBuildReq(&pBuf, &vCreateCTbReq, TDMT_MND_CREATE_TABLE); + vnodeBuildReq(&pBuf, &vCreateCTbReq, TDMT_VND_CREATE_TABLE); META_CLEAR_TB_CFG(&vCreateCTbReq); free(pTag); diff --git a/source/libs/parser/src/astValidate.c b/source/libs/parser/src/astValidate.c index 1c5f9f5cb3..a286ddb9fb 100644 --- a/source/libs/parser/src/astValidate.c +++ b/source/libs/parser/src/astValidate.c @@ -4495,7 +4495,7 @@ int32_t qParserValidateDclSqlNode(SSqlInfo* pInfo, SParseBasicCtx* pCtx, SDclStm return code; } pDcl->pMsg = (char*)buildCreateTableMsg(pCreateTable, &pDcl->msgLen, pCtx, pMsgBuf); - pDcl->msgType = (pCreateTable->type == TSQL_CREATE_TABLE)? TDMT_MND_CREATE_TABLE:TDMT_MND_CREATE_STB; + pDcl->msgType = (pCreateTable->type == TSQL_CREATE_TABLE)? TDMT_VND_CREATE_TABLE:TDMT_MND_CREATE_STB; } else if (pCreateTable->type == TSQL_CREATE_CTABLE) { // if ((code = doCheckForCreateFromStable(pSql, pInfo)) != TSDB_CODE_SUCCESS) { // return code; diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index 42799927e6..563799079d 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -1592,7 +1592,7 @@ int tscBuildCreateTableMsg(SSqlObj *pSql, SSqlInfo *pInfo) { msgLen = (int32_t)(pMsg - (char*)pCreateTableMsg); pCreateTableMsg->contLen = htonl(msgLen); pCmd->payloadLen = msgLen; - pCmd->msgType = TDMT_MND_CREATE_TABLE; + pCmd->msgType = TDMT_VND_CREATE_TABLE; assert(msgLen + minMsgSize() <= size); return TSDB_CODE_SUCCESS;