/* * Copyright (c) 2019 TAOS Data, Inc. * * This program is free software: you can use, redistribute, and/or modify * it under the terms of the GNU Affero General Public License, version 3 * or later ("AGPL"), as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ #define _DEFAULT_SOURCE #include #include #include #include "dnodeSystem.h" #include "mgmt.h" #include "tschemautil.h" #include "tstatus.h" bool mgmtCheckModuleInDnode(SDnodeObj *pDnode, int moduleType); int mgmtGetDnodesNum(); void*mgmtGetNextDnode(SShowObj *pShow, SDnodeObj **pDnode); bool mgmtCheckConfigShow(SGlobalConfig *cfg); void mgmtSetDnodeMaxVnodes(SDnodeObj *pDnode) { int maxVnodes = pDnode->numOfCores * tsNumOfVnodesPerCore; maxVnodes = maxVnodes > TSDB_MAX_VNODES ? TSDB_MAX_VNODES : maxVnodes; maxVnodes = maxVnodes < TSDB_MIN_VNODES ? TSDB_MIN_VNODES : maxVnodes; if (pDnode->numOfTotalVnodes != 0) { maxVnodes = pDnode->numOfTotalVnodes; } if (pDnode->alternativeRole == TSDB_DNODE_ROLE_MGMT) { maxVnodes = 0; } pDnode->numOfVnodes = maxVnodes; pDnode->numOfFreeVnodes = maxVnodes; pDnode->openVnodes = 0; #ifdef CLUSTER pDnode->status = TSDB_STATUS_OFFLINE; #else pDnode->status = TSDB_STATUS_READY; #endif } void mgmtCalcNumOfFreeVnodes(SDnodeObj *pDnode) { int totalVnodes = 0; for (int i = 0; i < pDnode->numOfVnodes; ++i) { SVnodeLoad *pVload = pDnode->vload + i; if (pVload->vgId != 0) { mTrace("dnode:%s, calc free vnodes, exist vnode:%d, vgroup:%d, state:%d %s, dropstate:%d %s, syncstatus:%d %s", taosIpStr(pDnode->privateIp), i, pVload->vgId, pVload->status, sdbDnodeStatusStr[pVload->status], pVload->dropStatus, sdbVnodeDropStateStr[pVload->dropStatus], pVload->syncStatus, sdbVnodeSyncStatusStr[pVload->syncStatus]); totalVnodes++; } } pDnode->numOfFreeVnodes = pDnode->numOfVnodes - totalVnodes; mTrace("dnode:%s, calc free vnodes, numOfVnodes:%d, numOfFreeVnodes:%d, totalVnodes:%d", taosIpStr(pDnode->privateIp), pDnode->numOfVnodes, pDnode->numOfFreeVnodes, totalVnodes); } void mgmtSetDnodeVgid(SVnodeGid vnodeGid[], int numOfVnodes, int vgId) { SDnodeObj *pDnode; for (int i = 0; i < numOfVnodes; ++i) { pDnode = mgmtGetDnode(vnodeGid[i].ip); if (pDnode) { SVnodeLoad *pVload = pDnode->vload + vnodeGid[i].vnode; memset(pVload, 0, sizeof(SVnodeLoad)); pVload->vnode = vnodeGid[i].vnode; pVload->vgId = vgId; mTrace("dnode:%s, vnode:%d add to vgroup:%d", taosIpStr(vnodeGid[i].ip), vnodeGid[i].vnode, pVload->vgId); mgmtCalcNumOfFreeVnodes(pDnode); } else { mError("dnode:%s, not in dnode DB!!!", taosIpStr(vnodeGid[i].ip)); } } } void mgmtUnSetDnodeVgid(SVnodeGid vnodeGid[], int numOfVnodes) { SDnodeObj *pDnode; for (int i = 0; i < numOfVnodes; ++i) { pDnode = mgmtGetDnode(vnodeGid[i].ip); if (pDnode) { SVnodeLoad *pVload = pDnode->vload + vnodeGid[i].vnode; mTrace("dnode:%s, vnode:%d remove from vgroup:%d", taosIpStr(vnodeGid[i].ip), vnodeGid[i].vnode, pVload->vgId); memset(pVload, 0, sizeof(SVnodeLoad)); mgmtCalcNumOfFreeVnodes(pDnode); } else { mError("dnode:%s not in dnode DB!!!", taosIpStr(vnodeGid[i].ip)); } } } int mgmtGetDnodeMeta(SMeterMeta *pMeta, SShowObj *pShow, SConnObj *pConn) { int cols = 0; if (strcmp(pConn->pAcct->user, "root") != 0) return TSDB_CODE_NO_RIGHTS; SSchema *pSchema = tsGetSchema(pMeta); pShow->bytes[cols] = 16; pSchema[cols].type = TSDB_DATA_TYPE_BINARY; strcpy(pSchema[cols].name, "IP"); pSchema[cols].bytes = htons(pShow->bytes[cols]); cols++; pShow->bytes[cols] = 8; pSchema[cols].type = TSDB_DATA_TYPE_TIMESTAMP; strcpy(pSchema[cols].name, "created time"); pSchema[cols].bytes = htons(pShow->bytes[cols]); cols++; pShow->bytes[cols] = 2; pSchema[cols].type = TSDB_DATA_TYPE_SMALLINT; strcpy(pSchema[cols].name, "open vnodes"); pSchema[cols].bytes = htons(pShow->bytes[cols]); cols++; pShow->bytes[cols] = 2; pSchema[cols].type = TSDB_DATA_TYPE_SMALLINT; strcpy(pSchema[cols].name, "free vnodes"); pSchema[cols].bytes = htons(pShow->bytes[cols]); cols++; pShow->bytes[cols] = 10; pSchema[cols].type = TSDB_DATA_TYPE_BINARY; strcpy(pSchema[cols].name, "status"); pSchema[cols].bytes = htons(pShow->bytes[cols]); cols++; pShow->bytes[cols] = 18; pSchema[cols].type = TSDB_DATA_TYPE_BINARY; strcpy(pSchema[cols].name, "balance state"); pSchema[cols].bytes = htons(pShow->bytes[cols]); cols++; pShow->bytes[cols] = 16; pSchema[cols].type = TSDB_DATA_TYPE_BINARY; strcpy(pSchema[cols].name, "public ip"); pSchema[cols].bytes = htons(pShow->bytes[cols]); cols++; pMeta->numOfColumns = htons(cols); pShow->numOfColumns = cols; pShow->offset[0] = 0; for (int i = 1; i < cols; ++i) pShow->offset[i] = pShow->offset[i - 1] + pShow->bytes[i - 1]; pShow->numOfRows = mgmtGetDnodesNum(); pShow->rowSize = pShow->offset[cols - 1] + pShow->bytes[cols - 1]; pShow->pNode = NULL; return 0; } int mgmtRetrieveDnodes(SShowObj *pShow, char *data, int rows, SConnObj *pConn) { int numOfRows = 0; SDnodeObj *pDnode = NULL; char * pWrite; int cols = 0; char ipstr[20]; while (numOfRows < rows) { pShow->pNode = mgmtGetNextDnode(pShow, (SDnodeObj **)&pDnode); if (pDnode == NULL) break; cols = 0; tinet_ntoa(ipstr, pDnode->privateIp); pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; strcpy(pWrite, ipstr); cols++; pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; *(int64_t *)pWrite = pDnode->createdTime; cols++; pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; *(int16_t *)pWrite = pDnode->openVnodes; cols++; pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; *(int16_t *)pWrite = pDnode->numOfFreeVnodes; cols++; pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; strcpy(pWrite, sdbDnodeStatusStr[pDnode->status]); cols++; pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; strcpy(pWrite, sdbDnodeBalanceStateStr[pDnode->lbState]); cols++; tinet_ntoa(ipstr, pDnode->publicIp); pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; strcpy(pWrite, ipstr); cols++; numOfRows++; } pShow->numOfReads += numOfRows; return numOfRows; } int mgmtGetModuleMeta(SMeterMeta *pMeta, SShowObj *pShow, SConnObj *pConn) { int cols = 0; if (strcmp(pConn->pAcct->user, "root") != 0) return TSDB_CODE_NO_RIGHTS; SSchema *pSchema = tsGetSchema(pMeta); pShow->bytes[cols] = 16; pSchema[cols].type = TSDB_DATA_TYPE_BINARY; strcpy(pSchema[cols].name, "IP"); pSchema[cols].bytes = htons(pShow->bytes[cols]); cols++; pShow->bytes[cols] = 10; pSchema[cols].type = TSDB_DATA_TYPE_BINARY; strcpy(pSchema[cols].name, "module type"); pSchema[cols].bytes = htons(pShow->bytes[cols]); cols++; pShow->bytes[cols] = 10; pSchema[cols].type = TSDB_DATA_TYPE_BINARY; strcpy(pSchema[cols].name, "module status"); pSchema[cols].bytes = htons(pShow->bytes[cols]); cols++; pMeta->numOfColumns = htons(cols); pShow->numOfColumns = cols; pShow->offset[0] = 0; for (int i = 1; i < cols; ++i) pShow->offset[i] = pShow->offset[i - 1] + pShow->bytes[i - 1]; pShow->numOfRows = 0; SDnodeObj *pDnode = NULL; while (1) { pShow->pNode = mgmtGetNextDnode(pShow, (SDnodeObj **)&pDnode); if (pDnode == NULL) break; for (int moduleType = 0; moduleType < TSDB_MOD_MAX; ++moduleType) { if (mgmtCheckModuleInDnode(pDnode, moduleType)) { pShow->numOfRows++; } } } pShow->rowSize = pShow->offset[cols - 1] + pShow->bytes[cols - 1]; pShow->pNode = NULL; return 0; } int mgmtRetrieveModules(SShowObj *pShow, char *data, int rows, SConnObj *pConn) { int numOfRows = 0; SDnodeObj *pDnode = NULL; char * pWrite; int cols = 0; char ipstr[20]; while (numOfRows < rows) { pShow->pNode = mgmtGetNextDnode(pShow, (SDnodeObj **)&pDnode); if (pDnode == NULL) break; for (int moduleType = 0; moduleType < TSDB_MOD_MAX; ++moduleType) { if (!mgmtCheckModuleInDnode(pDnode, moduleType)) { continue; } cols = 0; tinet_ntoa(ipstr, pDnode->privateIp); pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; strcpy(pWrite, ipstr); cols++; pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; strcpy(pWrite, tsModule[moduleType].name); cols++; pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; strcpy(pWrite, sdbDnodeStatusStr[pDnode->status]); cols++; numOfRows++; } } pShow->numOfReads += numOfRows; return numOfRows; } int mgmtGetConfigMeta(SMeterMeta *pMeta, SShowObj *pShow, SConnObj *pConn) { int cols = 0; if (strcmp(pConn->pAcct->user, "root") != 0) return TSDB_CODE_NO_RIGHTS; SSchema *pSchema = tsGetSchema(pMeta); pShow->bytes[cols] = TSDB_CFG_OPTION_LEN; pSchema[cols].type = TSDB_DATA_TYPE_BINARY; strcpy(pSchema[cols].name, "config name"); pSchema[cols].bytes = htons(pShow->bytes[cols]); cols++; pShow->bytes[cols] = TSDB_CFG_VALUE_LEN; pSchema[cols].type = TSDB_DATA_TYPE_BINARY; strcpy(pSchema[cols].name, "config value"); pSchema[cols].bytes = htons(pShow->bytes[cols]); cols++; pMeta->numOfColumns = htons(cols); pShow->numOfColumns = cols; pShow->offset[0] = 0; for (int i = 1; i < cols; ++i) pShow->offset[i] = pShow->offset[i - 1] + pShow->bytes[i - 1]; pShow->numOfRows = 0; for (int i = tsGlobalConfigNum - 1; i >= 0; --i) { SGlobalConfig *cfg = tsGlobalConfig + i; if (!mgmtCheckConfigShow(cfg)) continue; pShow->numOfRows++; } pShow->rowSize = pShow->offset[cols - 1] + pShow->bytes[cols - 1]; pShow->pNode = NULL; return 0; } int mgmtRetrieveConfigs(SShowObj *pShow, char *data, int rows, SConnObj *pConn) { int numOfRows = 0; for (int i = tsGlobalConfigNum - 1; i >= 0 && numOfRows < rows; --i) { SGlobalConfig *cfg = tsGlobalConfig + i; if (!mgmtCheckConfigShow(cfg)) continue; char *pWrite; int cols = 0; pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; snprintf(pWrite, TSDB_CFG_OPTION_LEN, "%s", cfg->option); cols++; pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; switch (cfg->valType) { case TSDB_CFG_VTYPE_SHORT: snprintf(pWrite, TSDB_CFG_VALUE_LEN, "%d", *((int16_t *)cfg->ptr)); numOfRows++; break; case TSDB_CFG_VTYPE_INT: snprintf(pWrite, TSDB_CFG_VALUE_LEN, "%d", *((int32_t *)cfg->ptr)); numOfRows++; break; case TSDB_CFG_VTYPE_UINT: snprintf(pWrite, TSDB_CFG_VALUE_LEN, "%d", *((uint32_t *)cfg->ptr)); numOfRows++; break; case TSDB_CFG_VTYPE_FLOAT: snprintf(pWrite, TSDB_CFG_VALUE_LEN, "%f", *((float *)cfg->ptr)); numOfRows++; break; case TSDB_CFG_VTYPE_STRING: case TSDB_CFG_VTYPE_IPSTR: case TSDB_CFG_VTYPE_DIRECTORY: snprintf(pWrite, TSDB_CFG_VALUE_LEN, "%s", (char *)cfg->ptr); numOfRows++; break; default: break; } } pShow->numOfReads += numOfRows; return numOfRows; }