diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index 9d80c7ed50944f14a5687d3034d5368552861cb1..f76a1341d24beec8295011f01fe4bd5e57e3b0e8 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -4642,21 +4642,24 @@ typedef struct SDNodeDynConfOption { } SDNodeDynConfOption; -int32_t validateEp(char* ep) { +int32_t validateEp(char* ep) { char buf[TSDB_EP_LEN + 1] = {0}; tstrncpy(buf, ep, TSDB_EP_LEN); - char *pos = strchr(buf, ':'); - if (NULL == pos) { - return TSDB_CODE_TSC_INVALID_SQL; + char* pos = strchr(buf, ':'); + if (NULL == pos) { + int32_t val = strtol(ep, NULL, 10); + if (val <= 0 || val > 65536) { + return TSDB_CODE_TSC_INVALID_SQL; + } + } else { + uint16_t port = atoi(pos + 1); + if (0 == port) { + return TSDB_CODE_TSC_INVALID_SQL; + } } - - uint16_t port = atoi(pos+1); - if (0 == port) { - return TSDB_CODE_TSC_INVALID_SQL; - } - return TSDB_CODE_SUCCESS; + return TSDB_CODE_SUCCESS; } int32_t validateDNodeConfig(tDCLSQL* pOptions) { @@ -4664,13 +4667,13 @@ int32_t validateDNodeConfig(tDCLSQL* pOptions) { return TSDB_CODE_TSC_INVALID_SQL; } - const int DNODE_DYNAMIC_CFG_OPTIONS_SIZE = 17; + const int DNODE_DYNAMIC_CFG_OPTIONS_SIZE = 19; const SDNodeDynConfOption DNODE_DYNAMIC_CFG_OPTIONS[] = { {"resetLog", 8}, {"resetQueryCache", 15}, {"debugFlag", 9}, {"mDebugFlag", 10}, {"dDebugFlag", 10}, {"sdbDebugFlag", 12}, {"vDebugFlag", 10}, {"cDebugFlag", 10}, {"httpDebugFlag", 13}, {"monitorDebugFlag", 16}, {"rpcDebugFlag", 12}, {"uDebugFlag", 10}, {"tmrDebugFlag", 12}, {"qDebugflag", 10}, {"sDebugflag", 10}, {"tsdbDebugFlag", 13}, - {"monitor", 7}}; + {"mqttDebugFlag", 13}, {"wDebugFlag", 10}, {"monitor", 7}}; SSQLToken* pOptionToken = &pOptions->a[1]; @@ -4694,7 +4697,7 @@ int32_t validateDNodeConfig(tDCLSQL* pOptions) { SSQLToken* pValToken = &pOptions->a[2]; int32_t val = strtol(pValToken->z, NULL, 10); - if (val < 131 || val > 199) { + if (val < 0 || val > 256) { /* options value is out of valid range */ return TSDB_CODE_TSC_INVALID_SQL; } diff --git a/src/dnode/src/dnodeMgmt.c b/src/dnode/src/dnodeMgmt.c index bcaff255f769b7833648081bd6c3e05ff888e94a..86a222b3e6af1109df949657fed54f8e0f7653d7 100644 --- a/src/dnode/src/dnodeMgmt.c +++ b/src/dnode/src/dnodeMgmt.c @@ -706,6 +706,7 @@ static void dnodeSendStatusMsg(void *handle, void *tmrId) { // fill cluster cfg parameters pStatus->clusterCfg.numOfMnodes = htonl(tsNumOfMnodes); + pStatus->clusterCfg.enableBalance = htonl(tsEnableBalance); pStatus->clusterCfg.mnodeEqualVnodeNum = htonl(tsMnodeEqualVnodeNum); pStatus->clusterCfg.offlineThreshold = htonl(tsOfflineThreshold); pStatus->clusterCfg.statusInterval = htonl(tsStatusInterval); diff --git a/src/inc/taosmsg.h b/src/inc/taosmsg.h index e13534c363cf424d8557d9c19a01b67412bf5160..b7afaf1e065074018d9725796434776dae1a9158 100644 --- a/src/inc/taosmsg.h +++ b/src/inc/taosmsg.h @@ -563,15 +563,16 @@ typedef struct { typedef struct { int32_t numOfMnodes; // tsNumOfMnodes + int32_t enableBalance; // tsEnableBalance int32_t mnodeEqualVnodeNum; // tsMnodeEqualVnodeNum int32_t offlineThreshold; // tsOfflineThreshold int32_t statusInterval; // tsStatusInterval + int32_t maxtablesPerVnode; + int32_t maxVgroupsPerDb; char arbitrator[TSDB_EP_LEN]; // tsArbitrator char timezone[64]; // tsTimezone char locale[TSDB_LOCALE_LEN]; // tsLocale char charset[TSDB_LOCALE_LEN]; // tsCharset - int32_t maxtablesPerVnode; - int32_t maxVgroupsPerDb; } SClusterCfg; typedef struct { diff --git a/src/mnode/src/mnodeDnode.c b/src/mnode/src/mnodeDnode.c index a65f54cd8bd186adaf67bc5c45ebe3ea933a4c75..06d79bd7e11eca1f8381777667e5d4844be8b440 100644 --- a/src/mnode/src/mnodeDnode.c +++ b/src/mnode/src/mnodeDnode.c @@ -269,18 +269,37 @@ void mnodeUpdateDnode(SDnodeObj *pDnode) { } static int32_t mnodeProcessCfgDnodeMsg(SMnodeMsg *pMsg) { + if (strcmp(pMsg->pUser->user, TSDB_DEFAULT_USER) != 0) { + mError("failed to cfg dnode, no rights"); + return TSDB_CODE_MND_NO_RIGHTS; + } + SCMCfgDnodeMsg *pCmCfgDnode = pMsg->rpcMsg.pCont; if (pCmCfgDnode->ep[0] == 0) { - strcpy(pCmCfgDnode->ep, tsLocalEp); - } else { - // TODO temporary disabled for compiling: strcpy(pCmCfgDnode->ep, pCmCfgDnode->ep); + tstrncpy(pCmCfgDnode->ep, tsLocalEp, TSDB_EP_LEN); + } + + int32_t dnodeId = 0; + char* pos = strchr(pCmCfgDnode->ep, ':'); + if (NULL == pos) { + dnodeId = strtol(pCmCfgDnode->ep, NULL, 10); + if (dnodeId <= 0 || dnodeId > 65536) { + mError("failed to cfg dnode, invalid dnodeId:%s", pCmCfgDnode->ep); + return TSDB_CODE_MND_DNODE_NOT_EXIST; + } } - if (strcmp(pMsg->pUser->user, TSDB_DEFAULT_USER) != 0) { - return TSDB_CODE_MND_NO_RIGHTS; + SRpcIpSet ipSet = mnodeGetIpSetFromIp(pCmCfgDnode->ep); + if (dnodeId != 0) { + SDnodeObj *pDnode = mnodeGetDnode(dnodeId); + if (pDnode == NULL) { + mError("failed to cfg dnode, invalid dnodeId:%d", dnodeId); + return TSDB_CODE_MND_DNODE_NOT_EXIST; + } + ipSet = mnodeGetIpSetFromIp(pDnode->dnodeEp); + mnodeDecDnodeRef(pDnode); } - SRpcIpSet ipSet = mnodeGetIpSetFromIp(pCmCfgDnode->ep); SMDCfgDnodeMsg *pMdCfgDnode = rpcMallocCont(sizeof(SMDCfgDnodeMsg)); strcpy(pMdCfgDnode->ep, pCmCfgDnode->ep); strcpy(pMdCfgDnode->config, pCmCfgDnode->config); @@ -292,9 +311,9 @@ static int32_t mnodeProcessCfgDnodeMsg(SMnodeMsg *pMsg) { .pCont = pMdCfgDnode, .contLen = sizeof(SMDCfgDnodeMsg) }; - dnodeSendMsgToDnode(&ipSet, &rpcMdCfgDnodeMsg); mInfo("dnode:%s, is configured by %s", pCmCfgDnode->ep, pMsg->pUser->user); + dnodeSendMsgToDnode(&ipSet, &rpcMdCfgDnodeMsg); return TSDB_CODE_SUCCESS; } @@ -305,6 +324,7 @@ static void mnodeProcessCfgDnodeMsgRsp(SRpcMsg *rpcMsg) { static bool mnodeCheckClusterCfgPara(const SClusterCfg *clusterCfg) { if (clusterCfg->numOfMnodes != htonl(tsNumOfMnodes)) return false; + if (clusterCfg->enableBalance != htonl(tsEnableBalance)) return false; if (clusterCfg->mnodeEqualVnodeNum != htonl(tsMnodeEqualVnodeNum)) return false; if (clusterCfg->offlineThreshold != htonl(tsOfflineThreshold)) return false; if (clusterCfg->statusInterval != htonl(tsStatusInterval)) return false; diff --git a/src/mnode/src/mnodeVgroup.c b/src/mnode/src/mnodeVgroup.c index 8b4d62a8b0711b7ddf44bc370f279df113a9e884..8c8aa5fb31977851b8928593639bd095f9cb9f55 100644 --- a/src/mnode/src/mnodeVgroup.c +++ b/src/mnode/src/mnodeVgroup.c @@ -593,7 +593,7 @@ static int32_t mnodeGetVgroupMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *p pShow->bytes[cols] = 4; pSchema[cols].type = TSDB_DATA_TYPE_INT; - strcpy(pSchema[cols].name, "maxTables"); + strcpy(pSchema[cols].name, "onlineVnodes"); pSchema[cols].bytes = htons(pShow->bytes[cols]); cols++; @@ -692,8 +692,15 @@ static int32_t mnodeRetrieveVgroups(SShowObj *pShow, char *data, int32_t rows, v *(int32_t *)pWrite = taosIdPoolMaxSize(pVgroup->idPool); cols++; + int32_t onlineVnodes = 0; + for (int32_t i = 0; i < pShow->maxReplica; ++i) { + if (pVgroup->vnodeGid[i].role == TAOS_SYNC_ROLE_SLAVE || pVgroup->vnodeGid[i].role == TAOS_SYNC_ROLE_MASTER) { + onlineVnodes++; + } + } + pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; - *(int32_t *)pWrite = tsMaxTablePerVnode; + *(int32_t *)pWrite = onlineVnodes; cols++; for (int32_t i = 0; i < pShow->maxReplica; ++i) {