TDengine/source/dnode/mnode/impl/src/mndDnode.c

1632 lines
56 KiB
C
Raw Normal View History

2021-09-22 08:15:20 +00:00
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
2021-10-16 07:16:05 +00:00
#define _DEFAULT_SOURCE
#include <stdio.h>
2023-09-01 07:11:25 +00:00
#include "audit.h"
#include "mndCluster.h"
#include "mndDb.h"
#include "mndDnode.h"
2021-11-30 11:42:51 +00:00
#include "mndMnode.h"
#include "mndPrivilege.h"
2022-05-31 06:03:47 +00:00
#include "mndQnode.h"
2021-12-08 10:50:52 +00:00
#include "mndShow.h"
2022-06-22 07:41:30 +00:00
#include "mndSnode.h"
2021-11-30 07:28:51 +00:00
#include "mndTrans.h"
2022-02-12 06:06:13 +00:00
#include "mndUser.h"
2021-12-29 07:10:50 +00:00
#include "mndVgroup.h"
#include "taos_monitor.h"
2024-11-11 03:33:10 +00:00
#include "tconfig.h"
#include "tjson.h"
2022-11-23 14:08:35 +00:00
#include "tmisce.h"
2023-11-09 09:22:35 +00:00
#include "tunit.h"
2021-10-17 03:42:05 +00:00
2023-05-06 12:38:50 +00:00
#define TSDB_DNODE_VER_NUMBER 2
2024-03-18 10:06:18 +00:00
#define TSDB_DNODE_RESERVE_SIZE 40
2021-11-30 07:28:51 +00:00
2021-12-08 10:50:52 +00:00
static const char *offlineReason[] = {
2024-03-28 08:59:00 +00:00
"",
2021-11-30 11:42:51 +00:00
"status msg timeout",
"status not received",
"version not match",
"dnodeId not match",
"clusterId not match",
"statusInterval not match",
2021-11-30 11:42:51 +00:00
"timezone not match",
"locale not match",
"charset not match",
2023-09-01 05:24:47 +00:00
"ttlChangeOnWrite not match",
2024-03-27 12:03:38 +00:00
"enableWhiteList not match",
"encryptionKey not match",
2024-06-26 10:32:09 +00:00
"monitor not match",
"monitor switch not match",
"monitor interval not match",
"monitor slow log threshold not match",
"monitor slow log sql max len not match",
2024-06-27 02:11:38 +00:00
"monitor slow log scope not match",
2021-11-30 11:42:51 +00:00
"unknown",
};
2023-05-18 11:13:04 +00:00
enum {
DND_ACTIVE_CODE,
DND_CONN_ACTIVE_CODE,
};
2023-09-08 03:49:12 +00:00
enum {
DND_CREATE,
DND_ADD,
DND_DROP,
};
2023-09-23 23:52:27 +00:00
2021-12-08 06:30:28 +00:00
static int32_t mndCreateDefaultDnode(SMnode *pMnode);
static SSdbRaw *mndDnodeActionEncode(SDnodeObj *pDnode);
static SSdbRow *mndDnodeActionDecode(SSdbRaw *pRaw);
static int32_t mndDnodeActionInsert(SSdb *pSdb, SDnodeObj *pDnode);
static int32_t mndDnodeActionDelete(SSdb *pSdb, SDnodeObj *pDnode);
static int32_t mndDnodeActionUpdate(SSdb *pSdb, SDnodeObj *pOld, SDnodeObj *pNew);
2022-06-22 09:17:18 +00:00
static int32_t mndProcessDnodeListReq(SRpcMsg *pReq);
2021-12-08 10:50:52 +00:00
2022-05-16 06:55:31 +00:00
static int32_t mndProcessCreateDnodeReq(SRpcMsg *pReq);
static int32_t mndProcessDropDnodeReq(SRpcMsg *pReq);
static int32_t mndProcessStatusReq(SRpcMsg *pReq);
static int32_t mndProcessNotifyReq(SRpcMsg *pReq);
2023-05-10 03:23:35 +00:00
static int32_t mndProcessRestoreDnodeReq(SRpcMsg *pReq);
2023-10-23 08:59:54 +00:00
static int32_t mndProcessStatisReq(SRpcMsg *pReq);
2024-10-17 03:34:57 +00:00
static int32_t mndProcessAuditReq(SRpcMsg *pReq);
static int32_t mndProcessUpdateDnodeInfoReq(SRpcMsg *pReq);
static int32_t mndProcessCreateEncryptKeyReq(SRpcMsg *pRsp);
2024-03-31 16:49:25 +00:00
static int32_t mndProcessCreateEncryptKeyRsp(SRpcMsg *pRsp);
2022-03-15 12:53:29 +00:00
2022-05-16 06:55:31 +00:00
static int32_t mndRetrieveConfigs(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
2021-12-08 10:50:52 +00:00
static void mndCancelGetNextConfig(SMnode *pMnode, void *pIter);
2022-05-16 06:55:31 +00:00
static int32_t mndRetrieveDnodes(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
2021-12-08 10:50:52 +00:00
static void mndCancelGetNextDnode(SMnode *pMnode, void *pIter);
2021-12-08 06:30:28 +00:00
2023-09-25 08:16:12 +00:00
#ifdef _GRANT
int32_t mndUpdClusterInfo(SRpcMsg *pReq);
2023-09-25 07:57:54 +00:00
#else
static int32_t mndUpdClusterInfo(SRpcMsg *pReq) { return 0; }
2023-09-19 00:29:51 +00:00
#endif
2021-12-08 06:30:28 +00:00
int32_t mndInitDnode(SMnode *pMnode) {
2022-05-25 08:41:38 +00:00
SSdbTable table = {
.sdbType = SDB_DNODE,
.keyType = SDB_KEY_INT32,
.deployFp = (SdbDeployFp)mndCreateDefaultDnode,
.encodeFp = (SdbEncodeFp)mndDnodeActionEncode,
.decodeFp = (SdbDecodeFp)mndDnodeActionDecode,
.insertFp = (SdbInsertFp)mndDnodeActionInsert,
.updateFp = (SdbUpdateFp)mndDnodeActionUpdate,
.deleteFp = (SdbDeleteFp)mndDnodeActionDelete,
};
2021-12-08 06:30:28 +00:00
2022-01-06 09:04:48 +00:00
mndSetMsgHandle(pMnode, TDMT_MND_CREATE_DNODE, mndProcessCreateDnodeReq);
mndSetMsgHandle(pMnode, TDMT_MND_DROP_DNODE, mndProcessDropDnodeReq);
mndSetMsgHandle(pMnode, TDMT_MND_STATUS, mndProcessStatusReq);
2023-09-19 00:29:51 +00:00
mndSetMsgHandle(pMnode, TDMT_MND_NOTIFY, mndProcessNotifyReq);
2022-06-21 13:05:47 +00:00
mndSetMsgHandle(pMnode, TDMT_MND_DNODE_LIST, mndProcessDnodeListReq);
2023-05-10 03:23:35 +00:00
mndSetMsgHandle(pMnode, TDMT_MND_RESTORE_DNODE, mndProcessRestoreDnodeReq);
2023-10-23 08:59:54 +00:00
mndSetMsgHandle(pMnode, TDMT_MND_STATIS, mndProcessStatisReq);
2024-10-17 03:34:57 +00:00
mndSetMsgHandle(pMnode, TDMT_MND_AUDIT, mndProcessAuditReq);
mndSetMsgHandle(pMnode, TDMT_MND_CREATE_ENCRYPT_KEY, mndProcessCreateEncryptKeyReq);
2024-03-31 16:49:25 +00:00
mndSetMsgHandle(pMnode, TDMT_DND_CREATE_ENCRYPT_KEY_RSP, mndProcessCreateEncryptKeyRsp);
mndSetMsgHandle(pMnode, TDMT_MND_UPDATE_DNODE_INFO, mndProcessUpdateDnodeInfoReq);
2021-12-08 06:30:28 +00:00
2022-04-14 12:54:43 +00:00
mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_CONFIGS, mndRetrieveConfigs);
mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_CONFIGS, mndCancelGetNextConfig);
2021-12-08 10:50:52 +00:00
mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_DNODE, mndRetrieveDnodes);
mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_DNODE, mndCancelGetNextDnode);
2021-12-08 06:30:28 +00:00
return sdbSetTable(pMnode->pSdb, table);
}
2023-09-08 03:49:12 +00:00
SIpWhiteList *mndCreateIpWhiteOfDnode(SMnode *pMnode);
SIpWhiteList *mndAddIpWhiteOfDnode(SIpWhiteList *pIpWhiteList, char *fqdn);
SIpWhiteList *mndRmIpWhiteOfDnode(SIpWhiteList *pIpWhiteList, char *fqdn);
void mndCleanupDnode(SMnode *pMnode) {}
2021-12-08 06:30:28 +00:00
static int32_t mndCreateDefaultDnode(SMnode *pMnode) {
2022-06-07 01:59:15 +00:00
int32_t code = -1;
SSdbRaw *pRaw = NULL;
STrans *pTrans = NULL;
2021-12-08 06:30:28 +00:00
SDnodeObj dnodeObj = {0};
dnodeObj.id = 1;
dnodeObj.createdTime = taosGetTimestampMs();
dnodeObj.updateTime = dnodeObj.createdTime;
2022-06-14 02:58:36 +00:00
dnodeObj.port = tsServerPort;
2022-10-08 03:29:46 +00:00
tstrncpy(dnodeObj.fqdn, tsLocalFqdn, TSDB_FQDN_LEN);
dnodeObj.fqdn[TSDB_FQDN_LEN - 1] = 0;
2024-07-25 09:49:58 +00:00
(void)snprintf(dnodeObj.ep, TSDB_EP_LEN - 1, "%s:%u", tsLocalFqdn, tsServerPort);
2024-07-23 05:55:26 +00:00
char *machineId = NULL;
code = tGetMachineId(&machineId);
2023-12-06 11:13:54 +00:00
if (machineId) {
2024-07-25 09:49:58 +00:00
(void)memcpy(dnodeObj.machineId, machineId, TSDB_MACHINE_ID_LEN);
2023-12-07 08:00:13 +00:00
taosMemoryFreeClear(machineId);
2024-01-22 05:20:15 +00:00
} else {
2024-02-21 01:07:38 +00:00
#if defined(TD_ENTERPRISE) && !defined(GRANTS_CFG)
2024-01-22 05:20:15 +00:00
terrno = TSDB_CODE_DNODE_NO_MACHINE_CODE;
goto _OVER;
2024-01-31 04:36:58 +00:00
#endif
2023-12-06 11:13:54 +00:00
}
2021-12-08 06:30:28 +00:00
2022-09-22 08:18:51 +00:00
pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, NULL, "create-dnode");
2024-07-20 01:25:18 +00:00
if (pTrans == NULL) {
code = TSDB_CODE_MND_RETURN_VALUE_NULL;
if (terrno != 0) code = terrno;
goto _OVER;
}
2022-09-23 07:42:36 +00:00
mInfo("trans:%d, used to create dnode:%s on first deploy", pTrans->id, dnodeObj.ep);
2022-06-07 01:59:15 +00:00
pRaw = mndDnodeActionEncode(&dnodeObj);
2024-07-20 01:25:18 +00:00
if (pRaw == NULL) {
code = TSDB_CODE_MND_RETURN_VALUE_NULL;
if (terrno != 0) code = terrno;
goto _OVER;
}
TAOS_CHECK_GOTO(mndTransAppendCommitlog(pTrans, pRaw), NULL, _OVER);
2024-09-05 11:39:49 +00:00
TAOS_CHECK_GOTO(sdbSetRawStatus(pRaw, SDB_STATUS_READY), NULL, _OVER);
2022-06-07 01:59:15 +00:00
pRaw = NULL;
2024-07-20 01:25:18 +00:00
TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
2022-06-07 01:59:15 +00:00
code = 0;
2024-07-29 11:38:04 +00:00
(void)mndUpdateIpWhiteForAllUser(pMnode, TSDB_DEFAULT_USER, dnodeObj.fqdn, IP_WHITE_ADD,
1); // TODO: check the return value
2022-06-07 01:59:15 +00:00
_OVER:
mndTransDrop(pTrans);
2022-06-07 01:59:15 +00:00
sdbFreeRaw(pRaw);
return code;
2021-12-08 06:30:28 +00:00
}
2021-11-30 07:28:51 +00:00
static SSdbRaw *mndDnodeActionEncode(SDnodeObj *pDnode) {
2024-07-22 08:33:42 +00:00
int32_t code = 0;
int32_t lino = 0;
2021-12-31 06:22:50 +00:00
terrno = TSDB_CODE_OUT_OF_MEMORY;
2021-12-20 06:41:12 +00:00
SSdbRaw *pRaw = sdbAllocRaw(SDB_DNODE, TSDB_DNODE_VER_NUMBER, sizeof(SDnodeObj) + TSDB_DNODE_RESERVE_SIZE);
2022-06-07 01:59:15 +00:00
if (pRaw == NULL) goto _OVER;
2021-11-30 07:28:51 +00:00
int32_t dataPos = 0;
2022-06-07 01:59:15 +00:00
SDB_SET_INT32(pRaw, dataPos, pDnode->id, _OVER)
SDB_SET_INT64(pRaw, dataPos, pDnode->createdTime, _OVER)
SDB_SET_INT64(pRaw, dataPos, pDnode->updateTime, _OVER)
SDB_SET_INT16(pRaw, dataPos, pDnode->port, _OVER)
SDB_SET_BINARY(pRaw, dataPos, pDnode->fqdn, TSDB_FQDN_LEN, _OVER)
2024-03-18 10:06:18 +00:00
SDB_SET_BINARY(pRaw, dataPos, pDnode->machineId, TSDB_MACHINE_ID_LEN, _OVER)
2022-06-07 01:59:15 +00:00
SDB_SET_RESERVE(pRaw, dataPos, TSDB_DNODE_RESERVE_SIZE, _OVER)
SDB_SET_INT16(pRaw, dataPos, 0, _OVER) // forward/backward compatible
SDB_SET_INT16(pRaw, dataPos, 0, _OVER) // forward/backward compatible
2022-06-07 01:59:15 +00:00
SDB_SET_DATALEN(pRaw, dataPos, _OVER);
2021-12-31 06:22:50 +00:00
terrno = 0;
2022-06-07 01:59:15 +00:00
_OVER:
2021-12-31 06:22:50 +00:00
if (terrno != 0) {
mError("dnode:%d, failed to encode to raw:%p since %s", pDnode->id, pRaw, terrstr());
sdbFreeRaw(pRaw);
return NULL;
}
2021-11-30 07:28:51 +00:00
2021-12-31 06:22:50 +00:00
mTrace("dnode:%d, encode to raw:%p, row:%p", pDnode->id, pRaw, pDnode);
2021-11-30 07:28:51 +00:00
return pRaw;
}
static SSdbRow *mndDnodeActionDecode(SSdbRaw *pRaw) {
2024-07-22 08:33:42 +00:00
int32_t code = 0;
int32_t lino = 0;
2021-12-31 06:22:50 +00:00
terrno = TSDB_CODE_OUT_OF_MEMORY;
2022-12-01 08:04:39 +00:00
SSdbRow *pRow = NULL;
SDnodeObj *pDnode = NULL;
2021-12-31 06:22:50 +00:00
2021-11-30 07:28:51 +00:00
int8_t sver = 0;
2022-06-07 01:59:15 +00:00
if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
2023-05-06 12:38:50 +00:00
if (sver < 1 || sver > TSDB_DNODE_VER_NUMBER) {
2021-11-30 07:28:51 +00:00
terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
2022-06-07 01:59:15 +00:00
goto _OVER;
2021-11-30 07:28:51 +00:00
}
2022-06-07 01:59:15 +00:00
pRow = sdbAllocRow(sizeof(SDnodeObj));
if (pRow == NULL) goto _OVER;
2022-12-01 08:04:39 +00:00
pDnode = sdbGetRowObj(pRow);
2022-06-07 01:59:15 +00:00
if (pDnode == NULL) goto _OVER;
2021-11-30 07:28:51 +00:00
int32_t dataPos = 0;
2022-06-07 01:59:15 +00:00
SDB_GET_INT32(pRaw, dataPos, &pDnode->id, _OVER)
SDB_GET_INT64(pRaw, dataPos, &pDnode->createdTime, _OVER)
SDB_GET_INT64(pRaw, dataPos, &pDnode->updateTime, _OVER)
SDB_GET_INT16(pRaw, dataPos, &pDnode->port, _OVER)
SDB_GET_BINARY(pRaw, dataPos, pDnode->fqdn, TSDB_FQDN_LEN, _OVER)
2024-03-18 10:06:18 +00:00
SDB_GET_BINARY(pRaw, dataPos, pDnode->machineId, TSDB_MACHINE_ID_LEN, _OVER)
2022-06-07 01:59:15 +00:00
SDB_GET_RESERVE(pRaw, dataPos, TSDB_DNODE_RESERVE_SIZE, _OVER)
2023-05-11 06:57:50 +00:00
if (sver > 1) {
2023-05-11 07:09:02 +00:00
int16_t keyLen = 0;
SDB_GET_INT16(pRaw, dataPos, &keyLen, _OVER)
2024-03-19 03:03:30 +00:00
SDB_GET_BINARY(pRaw, dataPos, NULL, keyLen, _OVER)
2023-05-11 07:09:02 +00:00
SDB_GET_INT16(pRaw, dataPos, &keyLen, _OVER)
2024-03-19 03:03:30 +00:00
SDB_GET_BINARY(pRaw, dataPos, NULL, keyLen, _OVER)
2023-05-06 12:38:50 +00:00
}
2021-12-31 06:22:50 +00:00
terrno = 0;
if (tmsgUpdateDnodeInfo(&pDnode->id, NULL, pDnode->fqdn, &pDnode->port)) {
mInfo("dnode:%d, endpoint changed", pDnode->id);
}
2021-12-31 06:22:50 +00:00
2022-06-07 01:59:15 +00:00
_OVER:
2021-12-31 06:22:50 +00:00
if (terrno != 0) {
2022-12-01 08:04:39 +00:00
mError("dnode:%d, failed to decode from raw:%p since %s", pDnode == NULL ? 0 : pDnode->id, pRaw, terrstr());
2022-03-25 16:29:53 +00:00
taosMemoryFreeClear(pRow);
2021-12-31 06:22:50 +00:00
return NULL;
}
2021-11-30 07:28:51 +00:00
mTrace("dnode:%d, decode from raw:%p, row:%p ep:%s:%u", pDnode->id, pRaw, pDnode, pDnode->fqdn, pDnode->port);
2021-11-30 07:28:51 +00:00
return pRow;
}
2021-12-12 04:14:26 +00:00
static int32_t mndDnodeActionInsert(SSdb *pSdb, SDnodeObj *pDnode) {
2021-12-31 06:22:50 +00:00
mTrace("dnode:%d, perform insert action, row:%p", pDnode->id, pDnode);
2021-11-30 11:42:51 +00:00
pDnode->offlineReason = DND_REASON_STATUS_NOT_RECEIVED;
2022-10-08 03:29:46 +00:00
char ep[TSDB_EP_LEN] = {0};
2024-07-25 09:49:58 +00:00
(void)snprintf(ep, TSDB_EP_LEN - 1, "%s:%u", pDnode->fqdn, pDnode->port);
2022-10-08 03:29:46 +00:00
tstrncpy(pDnode->ep, ep, TSDB_EP_LEN);
2021-11-30 07:28:51 +00:00
return 0;
}
2021-12-01 06:58:35 +00:00
static int32_t mndDnodeActionDelete(SSdb *pSdb, SDnodeObj *pDnode) {
2021-12-31 06:22:50 +00:00
mTrace("dnode:%d, perform delete action, row:%p", pDnode->id, pDnode);
2021-12-01 06:58:35 +00:00
return 0;
}
2021-11-30 07:28:51 +00:00
static int32_t mndDnodeActionUpdate(SSdb *pSdb, SDnodeObj *pOld, SDnodeObj *pNew) {
2022-01-10 08:24:23 +00:00
mTrace("dnode:%d, perform update action, old row:%p new row:%p", pOld->id, pOld, pNew);
pOld->updateTime = pNew->updateTime;
#ifdef TD_ENTERPRISE
2024-03-18 10:06:18 +00:00
tstrncpy(pOld->machineId, pNew->machineId, TSDB_MACHINE_ID_LEN + 1);
#endif
2021-12-01 09:27:31 +00:00
return 0;
2021-11-30 07:28:51 +00:00
}
2021-12-08 06:30:28 +00:00
SDnodeObj *mndAcquireDnode(SMnode *pMnode, int32_t dnodeId) {
2021-12-18 12:56:05 +00:00
SSdb *pSdb = pMnode->pSdb;
SDnodeObj *pDnode = sdbAcquire(pSdb, SDB_DNODE, &dnodeId);
if (pDnode == NULL) {
if (terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
terrno = TSDB_CODE_MND_DNODE_NOT_EXIST;
} else if (terrno == TSDB_CODE_SDB_OBJ_CREATING) {
terrno = TSDB_CODE_MND_DNODE_IN_CREATING;
} else if (terrno == TSDB_CODE_SDB_OBJ_DROPPING) {
terrno = TSDB_CODE_MND_DNODE_IN_DROPPING;
} else {
terrno = TSDB_CODE_APP_ERROR;
mFatal("dnode:%d, failed to acquire db since %s", dnodeId, terrstr());
}
2021-12-18 12:56:05 +00:00
}
2021-12-18 12:56:05 +00:00
return pDnode;
2021-12-08 06:30:28 +00:00
}
2021-11-30 07:28:51 +00:00
2021-12-08 06:30:28 +00:00
void mndReleaseDnode(SMnode *pMnode, SDnodeObj *pDnode) {
SSdb *pSdb = pMnode->pSdb;
sdbRelease(pSdb, pDnode);
2021-11-30 07:28:51 +00:00
}
2021-12-08 10:50:52 +00:00
SEpSet mndGetDnodeEpset(SDnodeObj *pDnode) {
2022-01-26 06:00:15 +00:00
SEpSet epSet = {0};
2024-07-25 09:49:58 +00:00
terrno = addEpIntoEpSet(&epSet, pDnode->fqdn, pDnode->port);
2021-12-08 10:50:52 +00:00
return epSet;
}
SEpSet mndGetDnodeEpsetById(SMnode *pMnode, int32_t dnodeId) {
2024-03-18 03:26:54 +00:00
SEpSet epSet = {0};
SDnodeObj *pDnode = mndAcquireDnode(pMnode, dnodeId);
if (!pDnode) return epSet;
2024-03-18 03:26:54 +00:00
epSet = mndGetDnodeEpset(pDnode);
mndReleaseDnode(pMnode, pDnode);
return epSet;
}
2021-11-30 11:42:51 +00:00
static SDnodeObj *mndAcquireDnodeByEp(SMnode *pMnode, char *pEpStr) {
SSdb *pSdb = pMnode->pSdb;
void *pIter = NULL;
while (1) {
SDnodeObj *pDnode = NULL;
pIter = sdbFetch(pSdb, SDB_DNODE, pIter, (void **)&pDnode);
if (pIter == NULL) break;
if (strncasecmp(pEpStr, pDnode->ep, TSDB_EP_LEN) == 0) {
sdbCancelFetch(pSdb, pIter);
return pDnode;
}
2021-12-30 07:09:07 +00:00
sdbRelease(pSdb, pDnode);
2021-11-30 11:42:51 +00:00
}
2022-06-07 01:59:15 +00:00
terrno = TSDB_CODE_MND_DNODE_NOT_EXIST;
2021-11-30 11:42:51 +00:00
return NULL;
}
static SDnodeObj *mndAcquireDnodeAllStatusByEp(SMnode *pMnode, char *pEpStr) {
SSdb *pSdb = pMnode->pSdb;
void *pIter = NULL;
while (1) {
SDnodeObj *pDnode = NULL;
ESdbStatus objStatus = 0;
pIter = sdbFetchAll(pSdb, SDB_DNODE, pIter, (void **)&pDnode, &objStatus, true);
if (pIter == NULL) break;
if (strncasecmp(pEpStr, pDnode->ep, TSDB_EP_LEN) == 0) {
sdbCancelFetch(pSdb, pIter);
return pDnode;
}
sdbRelease(pSdb, pDnode);
}
return NULL;
}
2021-12-09 05:07:00 +00:00
int32_t mndGetDnodeSize(SMnode *pMnode) {
2021-11-30 11:42:51 +00:00
SSdb *pSdb = pMnode->pSdb;
return sdbGetSize(pSdb, SDB_DNODE);
}
2023-05-09 09:15:37 +00:00
int32_t mndGetDbSize(SMnode *pMnode) {
SSdb *pSdb = pMnode->pSdb;
return sdbGetSize(pSdb, SDB_DB);
}
2022-06-06 03:49:30 +00:00
bool mndIsDnodeOnline(SDnodeObj *pDnode, int64_t curMs) {
2022-01-24 04:57:42 +00:00
int64_t interval = TABS(pDnode->lastAccessTime - curMs);
2022-09-30 03:26:26 +00:00
if (interval > 5000 * (int64_t)tsStatusInterval) {
2024-03-28 08:59:00 +00:00
if (pDnode->rebootTime > 0 && pDnode->offlineReason == DND_REASON_ONLINE) {
pDnode->offlineReason = DND_REASON_STATUS_MSG_TIMEOUT;
2021-12-30 05:43:34 +00:00
}
2021-12-15 12:37:21 +00:00
return false;
}
return true;
}
2023-05-10 16:16:41 +00:00
static void mndGetDnodeEps(SMnode *pMnode, SArray *pDnodeEps) {
2021-11-30 11:42:51 +00:00
SSdb *pSdb = pMnode->pSdb;
int32_t numOfEps = 0;
2021-11-30 11:42:51 +00:00
void *pIter = NULL;
while (1) {
SDnodeObj *pDnode = NULL;
ESdbStatus objStatus = 0;
pIter = sdbFetchAll(pSdb, SDB_DNODE, pIter, (void **)&pDnode, &objStatus, true);
2021-11-30 11:42:51 +00:00
if (pIter == NULL) break;
2022-02-10 07:06:01 +00:00
SDnodeEp dnodeEp = {0};
dnodeEp.id = pDnode->id;
dnodeEp.ep.port = pDnode->port;
2022-10-08 03:29:46 +00:00
tstrncpy(dnodeEp.ep.fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
2022-07-05 06:40:48 +00:00
sdbRelease(pSdb, pDnode);
2022-02-10 07:06:01 +00:00
2022-07-05 06:40:48 +00:00
dnodeEp.isMnode = 0;
2021-11-30 11:42:51 +00:00
if (mndIsMnode(pMnode, pDnode->id)) {
2022-02-10 07:06:01 +00:00
dnodeEp.isMnode = 1;
2021-11-30 11:42:51 +00:00
}
if (taosArrayPush(pDnodeEps, &dnodeEp) == NULL) {
mError("failed to put ep into array, but continue at this call");
}
2021-11-30 11:42:51 +00:00
}
}
2024-07-22 07:29:37 +00:00
int32_t mndGetDnodeData(SMnode *pMnode, SArray *pDnodeInfo) {
SSdb *pSdb = pMnode->pSdb;
int32_t code = 0;
2023-05-06 12:38:50 +00:00
int32_t numOfEps = 0;
void *pIter = NULL;
while (1) {
SDnodeObj *pDnode = NULL;
ESdbStatus objStatus = 0;
pIter = sdbFetchAll(pSdb, SDB_DNODE, pIter, (void **)&pDnode, &objStatus, true);
if (pIter == NULL) break;
SDnodeInfo dInfo;
dInfo.id = pDnode->id;
dInfo.ep.port = pDnode->port;
dInfo.offlineReason = pDnode->offlineReason;
2023-05-06 12:38:50 +00:00
tstrncpy(dInfo.ep.fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
sdbRelease(pSdb, pDnode);
2023-05-11 03:32:39 +00:00
if (mndIsMnode(pMnode, pDnode->id)) {
dInfo.isMnode = 1;
} else {
dInfo.isMnode = 0;
}
2023-05-06 12:38:50 +00:00
if (taosArrayPush(pDnodeInfo, &dInfo) == NULL) {
2024-09-12 07:46:30 +00:00
code = terrno;
2024-07-22 07:29:37 +00:00
sdbCancelFetch(pSdb, pIter);
break;
}
2023-05-06 12:38:50 +00:00
}
2024-07-22 07:29:37 +00:00
TAOS_RETURN(code);
2023-05-06 12:38:50 +00:00
}
#define CHECK_MONITOR_PARA(para, err) \
if (pCfg->monitorParas.para != para) { \
mError("dnode:%d, para:%d inconsistent with cluster:%d", pDnode->id, pCfg->monitorParas.para, para); \
terrno = err; \
return err; \
}
2024-06-19 10:54:26 +00:00
2022-06-07 01:59:15 +00:00
static int32_t mndCheckClusterCfgPara(SMnode *pMnode, SDnodeObj *pDnode, const SClusterCfg *pCfg) {
2024-06-26 10:32:09 +00:00
CHECK_MONITOR_PARA(tsEnableMonitor, DND_REASON_STATUS_MONITOR_SWITCH_NOT_MATCH);
CHECK_MONITOR_PARA(tsMonitorInterval, DND_REASON_STATUS_MONITOR_INTERVAL_NOT_MATCH);
CHECK_MONITOR_PARA(tsSlowLogThreshold, DND_REASON_STATUS_MONITOR_SLOW_LOG_THRESHOLD_NOT_MATCH);
CHECK_MONITOR_PARA(tsSlowLogMaxLen, DND_REASON_STATUS_MONITOR_SLOW_LOG_SQL_MAX_LEN_NOT_MATCH);
CHECK_MONITOR_PARA(tsSlowLogScope, DND_REASON_STATUS_MONITOR_SLOW_LOG_SCOPE_NOT_MATCH);
2024-06-19 10:54:26 +00:00
if (0 != strcasecmp(pCfg->monitorParas.tsSlowLogExceptDb, tsSlowLogExceptDb)) {
mError("dnode:%d, tsSlowLogExceptDb:%s inconsistent with cluster:%s", pDnode->id,
pCfg->monitorParas.tsSlowLogExceptDb, tsSlowLogExceptDb);
terrno = TSDB_CODE_DNODE_INVALID_MONITOR_PARAS;
return DND_REASON_STATUS_MONITOR_NOT_MATCH;
}
2022-02-24 12:17:48 +00:00
if (pCfg->statusInterval != tsStatusInterval) {
2022-06-07 01:59:15 +00:00
mError("dnode:%d, statusInterval:%d inconsistent with cluster:%d", pDnode->id, pCfg->statusInterval,
tsStatusInterval);
terrno = TSDB_CODE_DNODE_INVALID_STATUS_INTERVAL;
2021-11-30 11:42:51 +00:00
return DND_REASON_STATUS_INTERVAL_NOT_MATCH;
}
2022-03-26 09:58:56 +00:00
if ((0 != strcasecmp(pCfg->timezone, tsTimezoneStr)) && (pMnode->checkTime != pCfg->checkTime)) {
2022-06-07 01:59:15 +00:00
mError("dnode:%d, timezone:%s checkTime:%" PRId64 " inconsistent with cluster %s %" PRId64, pDnode->id,
pCfg->timezone, pCfg->checkTime, tsTimezoneStr, pMnode->checkTime);
terrno = TSDB_CODE_DNODE_INVALID_TIMEZONE;
2021-11-30 11:42:51 +00:00
return DND_REASON_TIME_ZONE_NOT_MATCH;
}
2022-02-24 13:27:13 +00:00
if (0 != strcasecmp(pCfg->locale, tsLocale)) {
2022-06-07 01:59:15 +00:00
mError("dnode:%d, locale:%s inconsistent with cluster:%s", pDnode->id, pCfg->locale, tsLocale);
terrno = TSDB_CODE_DNODE_INVALID_LOCALE;
2021-11-30 11:42:51 +00:00
return DND_REASON_LOCALE_NOT_MATCH;
}
2022-02-24 13:27:13 +00:00
if (0 != strcasecmp(pCfg->charset, tsCharset)) {
2022-06-07 01:59:15 +00:00
mError("dnode:%d, charset:%s inconsistent with cluster:%s", pDnode->id, pCfg->charset, tsCharset);
terrno = TSDB_CODE_DNODE_INVALID_CHARSET;
2021-11-30 11:42:51 +00:00
return DND_REASON_CHARSET_NOT_MATCH;
}
if (pCfg->ttlChangeOnWrite != tsTtlChangeOnWrite) {
mError("dnode:%d, ttlChangeOnWrite:%d inconsistent with cluster:%d", pDnode->id, pCfg->ttlChangeOnWrite,
tsTtlChangeOnWrite);
terrno = TSDB_CODE_DNODE_INVALID_TTL_CHG_ON_WR;
return DND_REASON_TTL_CHANGE_ON_WRITE_NOT_MATCH;
}
2023-09-01 07:11:25 +00:00
int8_t enable = tsEnableWhiteList ? 1 : 0;
if (pCfg->enableWhiteList != enable) {
2024-03-27 12:03:38 +00:00
mError("dnode:%d, enableWhiteList:%d inconsistent with cluster:%d", pDnode->id, pCfg->enableWhiteList, enable);
terrno = TSDB_CODE_DNODE_INVALID_EN_WHITELIST;
2023-09-01 07:11:25 +00:00
return DND_REASON_ENABLE_WHITELIST_NOT_MATCH;
}
2024-03-31 16:49:25 +00:00
if (!atomic_load_8(&pMnode->encryptMgmt.encrypting) &&
2024-03-29 03:37:40 +00:00
(pCfg->encryptionKeyStat != tsEncryptionKeyStat || pCfg->encryptionKeyChksum != tsEncryptionKeyChksum)) {
2024-03-28 08:17:35 +00:00
mError("dnode:%d, encryptionKey:%" PRIi8 "-%u inconsistent with cluster:%" PRIi8 "-%u", pDnode->id,
pCfg->encryptionKeyStat, pCfg->encryptionKeyChksum, tsEncryptionKeyStat, tsEncryptionKeyChksum);
terrno = pCfg->encryptionKeyChksum ? TSDB_CODE_DNODE_INVALID_ENCRYPTKEY : TSDB_CODE_DNODE_NO_ENCRYPT_KEY;
2024-03-27 12:03:38 +00:00
return DND_REASON_ENCRYPTION_KEY_NOT_MATCH;
}
2024-03-29 02:25:19 +00:00
return DND_REASON_ONLINE;
2021-11-30 11:42:51 +00:00
}
2023-09-01 05:24:47 +00:00
static bool mndUpdateVnodeState(int32_t vgId, SVnodeGid *pGid, SVnodeLoad *pVload) {
bool stateChanged = false;
bool roleChanged = pGid->syncState != pVload->syncState ||
(pVload->syncTerm != -1 && pGid->syncTerm != pVload->syncTerm) ||
pGid->roleTimeMs != pVload->roleTimeMs;
if (roleChanged || pGid->syncRestore != pVload->syncRestore || pGid->syncCanRead != pVload->syncCanRead ||
pGid->startTimeMs != pVload->startTimeMs) {
mInfo(
"vgId:%d, state changed by status msg, old state:%s restored:%d canRead:%d new state:%s restored:%d "
"canRead:%d, dnode:%d",
vgId, syncStr(pGid->syncState), pGid->syncRestore, pGid->syncCanRead, syncStr(pVload->syncState),
pVload->syncRestore, pVload->syncCanRead, pGid->dnodeId);
pGid->syncState = pVload->syncState;
pGid->syncTerm = pVload->syncTerm;
pGid->syncRestore = pVload->syncRestore;
pGid->syncCanRead = pVload->syncCanRead;
pGid->startTimeMs = pVload->startTimeMs;
pGid->roleTimeMs = pVload->roleTimeMs;
stateChanged = true;
}
return stateChanged;
}
static bool mndUpdateMnodeState(SMnodeObj *pObj, SMnodeLoad *pMload) {
bool stateChanged = false;
bool roleChanged = pObj->syncState != pMload->syncState ||
(pMload->syncTerm != -1 && pObj->syncTerm != pMload->syncTerm) ||
pObj->roleTimeMs != pMload->roleTimeMs;
if (roleChanged || pObj->syncRestore != pMload->syncRestore) {
mInfo("dnode:%d, mnode syncState from %s to %s, restoreState from %d to %d, syncTerm from %" PRId64 " to %" PRId64,
pObj->id, syncStr(pObj->syncState), syncStr(pMload->syncState), pObj->syncRestore, pMload->syncRestore,
pObj->syncTerm, pMload->syncTerm);
pObj->syncState = pMload->syncState;
pObj->syncTerm = pMload->syncTerm;
pObj->syncRestore = pMload->syncRestore;
pObj->roleTimeMs = pMload->roleTimeMs;
stateChanged = true;
}
return stateChanged;
}
extern char *tsMonFwUri;
extern char *tsMonSlowLogUri;
2023-10-23 08:59:54 +00:00
static int32_t mndProcessStatisReq(SRpcMsg *pReq) {
SMnode *pMnode = pReq->info.node;
SStatisReq statisReq = {0};
int32_t code = -1;
2024-07-22 06:13:48 +00:00
TAOS_CHECK_RETURN(tDeserializeSStatisReq(pReq->pCont, pReq->contLen, &statisReq));
2023-10-23 08:59:54 +00:00
if (tsMonitorLogProtocol) {
2024-01-24 09:44:44 +00:00
mInfo("process statis req,\n %s", statisReq.pCont);
2024-02-05 03:28:33 +00:00
}
2024-01-24 09:44:44 +00:00
if (statisReq.type == MONITOR_TYPE_COUNTER) {
2024-06-19 10:54:26 +00:00
monSendContent(statisReq.pCont, tsMonFwUri);
} else if (statisReq.type == MONITOR_TYPE_SLOW_LOG) {
2024-06-19 10:54:26 +00:00
monSendContent(statisReq.pCont, tsMonSlowLogUri);
2024-02-06 08:29:09 +00:00
}
tFreeSStatisReq(&statisReq);
return 0;
2023-10-23 08:59:54 +00:00
}
2024-10-17 03:34:57 +00:00
static int32_t mndProcessAuditReq(SRpcMsg *pReq) {
2024-11-04 03:12:18 +00:00
mTrace("process audit req:%p", pReq);
2024-10-17 03:34:57 +00:00
if (tsEnableAudit && tsEnableAuditDelete) {
SMnode *pMnode = pReq->info.node;
SAuditReq auditReq = {0};
TAOS_CHECK_RETURN(tDeserializeSAuditReq(pReq->pCont, pReq->contLen, &auditReq));
2024-11-04 03:12:18 +00:00
mDebug("received audit req:%s, %s, %s, %s", auditReq.operation, auditReq.db, auditReq.table, auditReq.pSql);
2024-10-17 03:34:57 +00:00
auditAddRecord(pReq, pMnode->clusterId, auditReq.operation, auditReq.db, auditReq.table, auditReq.pSql,
auditReq.sqlLen);
tFreeSAuditReq(&auditReq);
}
return 0;
}
2024-03-18 10:06:18 +00:00
static int32_t mndUpdateDnodeObj(SMnode *pMnode, SDnodeObj *pDnode) {
int32_t code = 0, lino = 0;
SDnodeInfoReq infoReq = {0};
int32_t contLen = 0;
void *pReq = NULL;
infoReq.dnodeId = pDnode->id;
tstrncpy(infoReq.machineId, pDnode->machineId, TSDB_MACHINE_ID_LEN + 1);
if ((contLen = tSerializeSDnodeInfoReq(NULL, 0, &infoReq)) <= 0) {
TAOS_RETURN(contLen ? contLen : TSDB_CODE_OUT_OF_MEMORY);
}
pReq = rpcMallocCont(contLen);
if (pReq == NULL) {
2024-09-12 07:46:30 +00:00
TAOS_RETURN(terrno);
}
2024-09-05 11:39:49 +00:00
if ((contLen = tSerializeSDnodeInfoReq(pReq, contLen, &infoReq)) <= 0) {
code = contLen;
goto _exit;
}
SRpcMsg rpcMsg = {.msgType = TDMT_MND_UPDATE_DNODE_INFO, .pCont = pReq, .contLen = contLen};
TAOS_CHECK_EXIT(tmsgPutToQueue(&pMnode->msgCb, WRITE_QUEUE, &rpcMsg));
_exit:
if (code < 0) {
mError("dnode:%d, failed to update dnode info since %s", pDnode->id, tstrerror(code));
}
TAOS_RETURN(code);
}
static int32_t mndProcessUpdateDnodeInfoReq(SRpcMsg *pReq) {
int32_t code = 0, lino = 0;
SMnode *pMnode = pReq->info.node;
SDnodeInfoReq infoReq = {0};
SDnodeObj *pDnode = NULL;
STrans *pTrans = NULL;
SSdbRaw *pCommitRaw = NULL;
TAOS_CHECK_EXIT(tDeserializeSDnodeInfoReq(pReq->pCont, pReq->contLen, &infoReq));
pDnode = mndAcquireDnode(pMnode, infoReq.dnodeId);
if (pDnode == NULL) {
TAOS_CHECK_EXIT(terrno);
}
pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_NOTHING, NULL, "update-dnode-obj");
2024-03-18 10:06:18 +00:00
if (pTrans == NULL) {
TAOS_CHECK_EXIT(terrno);
2024-03-18 10:06:18 +00:00
}
pDnode->updateTime = taosGetTimestampMs();
if ((pCommitRaw = mndDnodeActionEncode(pDnode)) == NULL) {
TAOS_CHECK_EXIT(terrno);
2024-07-22 05:24:39 +00:00
}
if ((code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
mError("trans:%d, failed to append commit log since %s", pTrans->id, tstrerror(code));
TAOS_CHECK_EXIT(code);
2024-03-18 10:06:18 +00:00
}
2024-09-05 11:39:49 +00:00
TAOS_CHECK_EXIT(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
pCommitRaw = NULL;
2024-03-18 10:06:18 +00:00
2024-07-20 01:25:18 +00:00
if ((code = mndTransPrepare(pMnode, pTrans)) != 0) {
2024-07-22 05:24:39 +00:00
mError("trans:%d, failed to prepare since %s", pTrans->id, tstrerror(code));
TAOS_CHECK_EXIT(code);
2024-03-18 10:06:18 +00:00
}
_exit:
mndReleaseDnode(pMnode, pDnode);
if (code != 0) {
mError("dnode:%d, failed to update dnode info at line %d since %s", infoReq.dnodeId, lino, tstrerror(code));
}
2024-03-18 10:06:18 +00:00
mndTransDrop(pTrans);
sdbFreeRaw(pCommitRaw);
TAOS_RETURN(code);
2024-03-18 10:06:18 +00:00
}
2022-05-16 06:55:31 +00:00
static int32_t mndProcessStatusReq(SRpcMsg *pReq) {
SMnode *pMnode = pReq->info.node;
2022-02-10 03:40:16 +00:00
SStatusReq statusReq = {0};
SDnodeObj *pDnode = NULL;
int32_t code = -1;
2021-12-30 05:23:52 +00:00
2024-07-20 01:25:18 +00:00
TAOS_CHECK_GOTO(tDeserializeSStatusReq(pReq->pCont, pReq->contLen, &statusReq), NULL, _OVER);
2021-11-30 11:42:51 +00:00
2023-03-18 03:16:52 +00:00
int64_t clusterid = mndGetClusterId(pMnode);
2023-03-23 14:31:20 +00:00
if (statusReq.clusterId != 0 && statusReq.clusterId != clusterid) {
2023-03-18 03:16:52 +00:00
code = TSDB_CODE_MND_DNODE_DIFF_CLUSTER;
2024-10-09 09:20:13 +00:00
mWarn("dnode:%d, %s, its clusterid:%" PRId64 " differ from current clusterid:%" PRId64 ", code:0x%x",
2023-03-23 14:31:20 +00:00
statusReq.dnodeId, statusReq.dnodeEp, statusReq.clusterId, clusterid, code);
2023-03-18 03:16:52 +00:00
goto _OVER;
}
2022-02-10 03:40:16 +00:00
if (statusReq.dnodeId == 0) {
pDnode = mndAcquireDnodeByEp(pMnode, statusReq.dnodeEp);
2021-11-30 11:42:51 +00:00
if (pDnode == NULL) {
2022-09-23 07:42:36 +00:00
mInfo("dnode:%s, not created yet", statusReq.dnodeEp);
2024-07-20 01:25:18 +00:00
code = TSDB_CODE_MND_RETURN_VALUE_NULL;
if (terrno != 0) code = terrno;
2022-06-07 01:59:15 +00:00
goto _OVER;
2021-11-30 11:42:51 +00:00
}
} else {
2022-02-10 03:40:16 +00:00
pDnode = mndAcquireDnode(pMnode, statusReq.dnodeId);
2021-11-30 11:42:51 +00:00
if (pDnode == NULL) {
int32_t err = terrno;
2022-02-10 03:40:16 +00:00
pDnode = mndAcquireDnodeByEp(pMnode, statusReq.dnodeEp);
2021-12-30 05:43:34 +00:00
if (pDnode != NULL) {
2021-11-30 11:42:51 +00:00
pDnode->offlineReason = DND_REASON_DNODE_ID_NOT_MATCH;
terrno = err;
goto _OVER;
}
mError("dnode:%d, %s not exist, code:0x%x", statusReq.dnodeId, statusReq.dnodeEp, err);
if (err == TSDB_CODE_MND_DNODE_NOT_EXIST) {
terrno = err;
goto _OVER;
} else {
pDnode = mndAcquireDnodeAllStatusByEp(pMnode, statusReq.dnodeEp);
if (pDnode == NULL) goto _OVER;
2021-11-30 11:42:51 +00:00
}
}
}
2023-09-11 02:45:45 +00:00
pMnode->ipWhiteVer = mndGetIpWhiteVer(pMnode);
2021-11-30 11:42:51 +00:00
2024-10-15 02:00:38 +00:00
int64_t analVer = sdbGetTableVer(pMnode->pSdb, SDB_ANODE);
2022-11-03 02:42:33 +00:00
int64_t dnodeVer = sdbGetTableVer(pMnode->pSdb, SDB_DNODE) + sdbGetTableVer(pMnode->pSdb, SDB_MNODE);
int64_t curMs = taosGetTimestampMs();
bool online = mndIsDnodeOnline(pDnode, curMs);
bool dnodeChanged = (statusReq.dnodeVer == 0) || (statusReq.dnodeVer != dnodeVer);
bool reboot = (pDnode->rebootTime != statusReq.rebootTime);
2023-09-01 05:24:47 +00:00
bool supportVnodesChanged = pDnode->numOfSupportVnodes != statusReq.numOfSupportVnodes;
2024-03-29 03:37:40 +00:00
bool encryptKeyChanged = pDnode->encryptionKeyChksum != statusReq.clusterCfg.encryptionKeyChksum;
bool enableWhiteListChanged = statusReq.clusterCfg.enableWhiteList != (tsEnableWhiteList ? 1 : 0);
2024-10-15 02:00:38 +00:00
bool analVerChanged = (analVer != statusReq.analVer);
bool needCheck = !online || dnodeChanged || reboot || supportVnodesChanged || analVerChanged ||
pMnode->ipWhiteVer != statusReq.ipWhiteVer || encryptKeyChanged || enableWhiteListChanged;
2022-11-03 02:42:33 +00:00
const STraceId *trace = &pReq->info.traceId;
2025-02-27 07:22:33 +00:00
char timestamp[TD_TIME_STR_LEN] = {0};
if (mDebugFlag & DEBUG_TRACE) (void)formatTimestampLocal(timestamp, statusReq.timestamp, TSDB_TIME_PRECISION_MILLI);
mGTrace(
"dnode:%d, status received, accessTimes:%d check:%d online:%d reboot:%d changed:%d statusSeq:%d "
"timestamp:%s",
pDnode->id, pDnode->accessTimes, needCheck, online, reboot, dnodeChanged, statusReq.statusSeq, timestamp);
2022-11-03 02:42:33 +00:00
2023-09-23 23:52:27 +00:00
if (reboot) {
tsGrantHBInterval = GRANT_HEART_BEAT_MIN;
}
2022-06-07 01:59:15 +00:00
for (int32_t v = 0; v < taosArrayGetSize(statusReq.pVloads); ++v) {
2022-02-10 08:37:22 +00:00
SVnodeLoad *pVload = taosArrayGet(statusReq.pVloads, v);
SVgObj *pVgroup = mndAcquireVgroup(pMnode, pVload->vgId);
if (pVgroup != NULL) {
if (pVload->syncState == TAOS_SYNC_STATE_LEADER || pVload->syncState == TAOS_SYNC_STATE_ASSIGNED_LEADER) {
pVgroup->cacheUsage = pVload->cacheUsage;
2023-03-22 08:08:16 +00:00
pVgroup->numOfCachedTables = pVload->numOfCachedTables;
2022-02-10 08:37:22 +00:00
pVgroup->numOfTables = pVload->numOfTables;
pVgroup->numOfTimeSeries = pVload->numOfTimeSeries;
pVgroup->totalStorage = pVload->totalStorage;
pVgroup->compStorage = pVload->compStorage;
pVgroup->pointsWritten = pVload->pointsWritten;
}
2023-09-01 05:24:47 +00:00
bool stateChanged = false;
2022-02-10 08:37:22 +00:00
for (int32_t vg = 0; vg < pVgroup->replica; ++vg) {
SVnodeGid *pGid = &pVgroup->vnodeGid[vg];
if (pGid->dnodeId == statusReq.dnodeId) {
2023-09-01 05:24:47 +00:00
if (pVload->startTimeMs == 0) {
pVload->startTimeMs = statusReq.rebootTime;
2022-04-20 02:24:37 +00:00
}
2023-09-01 05:24:47 +00:00
if (pVload->roleTimeMs == 0) {
pVload->roleTimeMs = statusReq.rebootTime;
}
stateChanged = mndUpdateVnodeState(pVgroup->vgId, pGid, pVload);
2022-06-07 01:59:15 +00:00
break;
2022-03-07 08:30:28 +00:00
}
2022-02-10 08:37:22 +00:00
}
2023-09-01 05:24:47 +00:00
if (stateChanged) {
SDbObj *pDb = mndAcquireDb(pMnode, pVgroup->dbName);
if (pDb != NULL && pDb->stateTs != curMs) {
2023-03-16 10:25:46 +00:00
mInfo("db:%s, stateTs changed by status msg, old stateTs:%" PRId64 " new stateTs:%" PRId64, pDb->name,
pDb->stateTs, curMs);
pDb->stateTs = curMs;
}
mndReleaseDb(pMnode, pDb);
2022-03-07 08:30:28 +00:00
}
2022-02-10 08:37:22 +00:00
}
mndReleaseVgroup(pMnode, pVgroup);
}
2022-05-25 08:41:38 +00:00
SMnodeObj *pObj = mndAcquireMnode(pMnode, pDnode->id);
if (pObj != NULL) {
2023-09-01 05:24:47 +00:00
if (statusReq.mload.roleTimeMs == 0) {
statusReq.mload.roleTimeMs = statusReq.rebootTime;
}
2024-07-25 09:49:58 +00:00
(void)mndUpdateMnodeState(pObj, &statusReq.mload);
2022-05-25 08:41:38 +00:00
mndReleaseMnode(pMnode, pObj);
}
2022-05-31 06:03:47 +00:00
SQnodeObj *pQnode = mndAcquireQnode(pMnode, statusReq.qload.dnodeId);
if (pQnode != NULL) {
pQnode->load = statusReq.qload;
mndReleaseQnode(pMnode, pQnode);
}
if (needCheck) {
2022-02-24 12:17:48 +00:00
if (statusReq.sver != tsVersion) {
2021-12-30 05:43:34 +00:00
if (pDnode != NULL) {
2021-12-30 06:22:09 +00:00
pDnode->offlineReason = DND_REASON_VERSION_NOT_MATCH;
2021-11-30 11:42:51 +00:00
}
2022-02-24 12:17:48 +00:00
mError("dnode:%d, status msg version:%d not match cluster:%d", statusReq.dnodeId, statusReq.sver, tsVersion);
2022-04-26 08:00:40 +00:00
terrno = TSDB_CODE_VERSION_NOT_COMPATIBLE;
2022-06-07 01:59:15 +00:00
goto _OVER;
2021-12-30 06:22:09 +00:00
}
2022-02-10 03:40:16 +00:00
if (statusReq.dnodeId == 0) {
2022-07-08 08:47:22 +00:00
mInfo("dnode:%d, %s first access, clusterId:%" PRId64, pDnode->id, pDnode->ep, pMnode->clusterId);
2021-11-30 11:42:51 +00:00
} else {
2022-02-10 03:40:16 +00:00
if (statusReq.clusterId != pMnode->clusterId) {
2021-12-30 06:22:09 +00:00
if (pDnode != NULL) {
pDnode->offlineReason = DND_REASON_CLUSTER_ID_NOT_MATCH;
}
2022-02-10 03:40:16 +00:00
mError("dnode:%d, clusterId %" PRId64 " not match exist %" PRId64, pDnode->id, statusReq.clusterId,
2021-12-30 06:22:09 +00:00
pMnode->clusterId);
terrno = TSDB_CODE_MND_INVALID_CLUSTER_ID;
2022-06-07 01:59:15 +00:00
goto _OVER;
2021-12-30 06:22:09 +00:00
}
2021-11-30 11:42:51 +00:00
}
// Verify whether the cluster parameters are consistent when status change from offline to ready
2022-06-07 01:59:15 +00:00
pDnode->offlineReason = mndCheckClusterCfgPara(pMnode, pDnode, &statusReq.clusterCfg);
if (pDnode->offlineReason != 0) {
mError("dnode:%d, cluster cfg inconsistent since:%s", pDnode->id, offlineReason[pDnode->offlineReason]);
if (terrno == 0) terrno = TSDB_CODE_MND_INVALID_CLUSTER_CFG;
2022-06-07 01:59:15 +00:00
goto _OVER;
2021-11-30 11:42:51 +00:00
}
if (!online) {
mInfo("dnode:%d, from offline to online, memory avail:%" PRId64 " total:%" PRId64 " cores:%.2f", pDnode->id,
statusReq.memAvail, statusReq.memTotal, statusReq.numOfCores);
} else {
2022-09-23 07:42:36 +00:00
mInfo("dnode:%d, send dnode epset, online:%d dnodeVer:%" PRId64 ":%" PRId64 " reboot:%d", pDnode->id, online,
2022-10-13 03:56:16 +00:00
statusReq.dnodeVer, dnodeVer, reboot);
}
2021-11-30 11:42:51 +00:00
2022-02-10 03:40:16 +00:00
pDnode->rebootTime = statusReq.rebootTime;
pDnode->numOfCores = statusReq.numOfCores;
pDnode->numOfSupportVnodes = statusReq.numOfSupportVnodes;
2024-01-24 11:08:19 +00:00
pDnode->numOfDiskCfg = statusReq.numOfDiskCfg;
pDnode->memAvail = statusReq.memAvail;
pDnode->memTotal = statusReq.memTotal;
2024-03-28 08:17:35 +00:00
pDnode->encryptionKeyStat = statusReq.clusterCfg.encryptionKeyStat;
pDnode->encryptionKeyChksum = statusReq.clusterCfg.encryptionKeyChksum;
2024-03-19 00:40:48 +00:00
if (memcmp(pDnode->machineId, statusReq.machineId, TSDB_MACHINE_ID_LEN) != 0) {
2024-01-24 11:08:19 +00:00
tstrncpy(pDnode->machineId, statusReq.machineId, TSDB_MACHINE_ID_LEN + 1);
2024-07-25 09:49:58 +00:00
if ((terrno = mndUpdateDnodeObj(pMnode, pDnode)) != 0) {
goto _OVER;
}
2024-01-24 11:08:19 +00:00
}
2021-11-30 11:42:51 +00:00
2022-02-10 07:06:01 +00:00
SStatusRsp statusRsp = {0};
2022-11-03 02:42:33 +00:00
statusRsp.statusSeq++;
2024-10-15 02:00:38 +00:00
statusRsp.analVer = analVer;
statusRsp.dnodeVer = dnodeVer;
2022-02-10 07:06:01 +00:00
statusRsp.dnodeCfg.dnodeId = pDnode->id;
statusRsp.dnodeCfg.clusterId = pMnode->clusterId;
statusRsp.pDnodeEps = taosArrayInit(mndGetDnodeSize(pMnode), sizeof(SDnodeEp));
if (statusRsp.pDnodeEps == NULL) {
2021-12-30 06:22:09 +00:00
terrno = TSDB_CODE_OUT_OF_MEMORY;
2022-06-07 01:59:15 +00:00
goto _OVER;
2021-12-30 06:22:09 +00:00
}
2023-05-10 16:16:41 +00:00
mndGetDnodeEps(pMnode, statusRsp.pDnodeEps);
2023-09-11 02:45:45 +00:00
statusRsp.ipWhiteVer = pMnode->ipWhiteVer;
2022-02-10 07:06:01 +00:00
2022-02-16 05:36:03 +00:00
int32_t contLen = tSerializeSStatusRsp(NULL, 0, &statusRsp);
2022-02-10 07:06:01 +00:00
void *pHead = rpcMallocCont(contLen);
2024-09-05 11:39:49 +00:00
contLen = tSerializeSStatusRsp(pHead, contLen, &statusRsp);
2022-02-10 07:06:01 +00:00
taosArrayDestroy(statusRsp.pDnodeEps);
2024-09-05 11:39:49 +00:00
if (contLen < 0) {
code = contLen;
goto _OVER;
}
2021-11-30 11:42:51 +00:00
2022-05-16 06:55:31 +00:00
pReq->info.rspLen = contLen;
pReq->info.rsp = pHead;
2021-12-30 06:22:09 +00:00
}
2021-11-30 11:42:51 +00:00
pDnode->accessTimes++;
pDnode->lastAccessTime = curMs;
2021-12-30 05:23:52 +00:00
code = 0;
2022-06-07 01:59:15 +00:00
_OVER:
2021-12-30 05:23:52 +00:00
mndReleaseDnode(pMnode, pDnode);
2022-02-10 07:06:01 +00:00
taosArrayDestroy(statusReq.pVloads);
2024-09-05 11:39:49 +00:00
return mndUpdClusterInfo(pReq);
}
static int32_t mndProcessNotifyReq(SRpcMsg *pReq) {
SMnode *pMnode = pReq->info.node;
SNotifyReq notifyReq = {0};
int32_t code = 0;
if ((code = tDeserializeSNotifyReq(pReq->pCont, pReq->contLen, &notifyReq)) != 0) {
terrno = code;
goto _OVER;
}
2023-09-23 10:10:08 +00:00
int64_t clusterid = mndGetClusterId(pMnode);
if (notifyReq.clusterId != 0 && notifyReq.clusterId != clusterid) {
code = TSDB_CODE_MND_DNODE_DIFF_CLUSTER;
mWarn("dnode:%d, its clusterid:%" PRId64 " differ from current cluster:%" PRId64 " since %s", notifyReq.dnodeId,
notifyReq.clusterId, clusterid, tstrerror(code));
goto _OVER;
}
int32_t nVgroup = taosArrayGetSize(notifyReq.pVloads);
for (int32_t v = 0; v < nVgroup; ++v) {
SVnodeLoadLite *pVload = taosArrayGet(notifyReq.pVloads, v);
SVgObj *pVgroup = mndAcquireVgroup(pMnode, pVload->vgId);
if (pVgroup != NULL) {
pVgroup->numOfTimeSeries = pVload->nTimeSeries;
mndReleaseVgroup(pMnode, pVgroup);
}
2023-09-14 12:16:02 +00:00
}
2024-07-25 09:49:58 +00:00
code = mndUpdClusterInfo(pReq);
_OVER:
tFreeSNotifyReq(&notifyReq);
2021-12-30 05:23:52 +00:00
return code;
2021-11-30 11:42:51 +00:00
}
2022-05-16 06:55:31 +00:00
static int32_t mndCreateDnode(SMnode *pMnode, SRpcMsg *pReq, SCreateDnodeReq *pCreate) {
2022-06-07 01:59:15 +00:00
int32_t code = -1;
SSdbRaw *pRaw = NULL;
STrans *pTrans = NULL;
2021-12-08 10:50:52 +00:00
SDnodeObj dnodeObj = {0};
2021-12-14 11:29:37 +00:00
dnodeObj.id = sdbGetMaxId(pMnode->pSdb, SDB_DNODE);
2021-12-08 10:50:52 +00:00
dnodeObj.createdTime = taosGetTimestampMs();
dnodeObj.updateTime = dnodeObj.createdTime;
2021-12-28 05:43:11 +00:00
dnodeObj.port = pCreate->port;
2022-10-08 03:29:46 +00:00
tstrncpy(dnodeObj.fqdn, pCreate->fqdn, TSDB_FQDN_LEN);
2024-07-25 09:49:58 +00:00
(void)snprintf(dnodeObj.ep, TSDB_EP_LEN - 1, "%s:%u", pCreate->fqdn, pCreate->port);
2021-12-08 10:50:52 +00:00
2022-09-22 08:18:51 +00:00
pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_GLOBAL, pReq, "create-dnode");
2024-07-20 01:25:18 +00:00
if (pTrans == NULL) {
code = TSDB_CODE_MND_RETURN_VALUE_NULL;
if (terrno != 0) code = terrno;
goto _OVER;
}
2022-09-23 07:42:36 +00:00
mInfo("trans:%d, used to create dnode:%s", pTrans->id, dnodeObj.ep);
2024-07-20 01:25:18 +00:00
TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
2021-12-08 10:50:52 +00:00
2022-06-07 01:59:15 +00:00
pRaw = mndDnodeActionEncode(&dnodeObj);
2024-07-20 01:25:18 +00:00
if (pRaw == NULL) {
code = TSDB_CODE_MND_RETURN_VALUE_NULL;
if (terrno != 0) code = terrno;
goto _OVER;
}
TAOS_CHECK_GOTO(mndTransAppendCommitlog(pTrans, pRaw), NULL, _OVER);
2024-09-05 11:39:49 +00:00
TAOS_CHECK_GOTO(sdbSetRawStatus(pRaw, SDB_STATUS_READY), NULL, _OVER);
2022-06-07 01:59:15 +00:00
pRaw = NULL;
2021-12-08 10:50:52 +00:00
2024-07-20 01:25:18 +00:00
TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
2022-06-07 01:59:15 +00:00
code = 0;
2021-12-08 10:50:52 +00:00
2024-07-29 11:38:04 +00:00
(void)mndUpdateIpWhiteForAllUser(pMnode, TSDB_DEFAULT_USER, dnodeObj.fqdn, IP_WHITE_ADD,
1); // TODO: check the return value
2022-06-07 01:59:15 +00:00
_OVER:
2021-12-08 10:50:52 +00:00
mndTransDrop(pTrans);
2022-06-07 01:59:15 +00:00
sdbFreeRaw(pRaw);
return code;
2021-12-08 10:50:52 +00:00
}
2022-06-21 13:05:47 +00:00
static int32_t mndProcessDnodeListReq(SRpcMsg *pReq) {
2022-06-23 07:35:22 +00:00
SMnode *pMnode = pReq->info.node;
SSdb *pSdb = pMnode->pSdb;
SDnodeObj *pObj = NULL;
void *pIter = NULL;
2022-06-21 13:05:47 +00:00
SDnodeListRsp rsp = {0};
2022-06-23 07:35:22 +00:00
int32_t code = -1;
2022-06-21 13:05:47 +00:00
rsp.dnodeList = taosArrayInit(5, sizeof(SEpSet));
if (NULL == rsp.dnodeList) {
mError("failed to alloc epSet while process dnode list req");
2024-09-12 07:46:30 +00:00
code = terrno;
2022-06-21 13:05:47 +00:00
goto _OVER;
}
2022-06-23 07:35:22 +00:00
2022-06-21 13:05:47 +00:00
while (1) {
pIter = sdbFetch(pSdb, SDB_DNODE, pIter, (void **)&pObj);
if (pIter == NULL) break;
SEpSet epSet = {0};
epSet.numOfEps = 1;
tstrncpy(epSet.eps[0].fqdn, pObj->fqdn, TSDB_FQDN_LEN);
epSet.eps[0].port = pObj->port;
if (taosArrayPush(rsp.dnodeList, &epSet) == NULL) {
if (terrno != 0) code = terrno;
sdbRelease(pSdb, pObj);
sdbCancelFetch(pSdb, pIter);
goto _OVER;
}
2022-06-21 13:05:47 +00:00
sdbRelease(pSdb, pObj);
}
int32_t rspLen = tSerializeSDnodeListRsp(NULL, 0, &rsp);
void *pRsp = rpcMallocCont(rspLen);
if (pRsp == NULL) {
2024-09-12 07:46:30 +00:00
code = terrno;
2022-06-21 13:05:47 +00:00
goto _OVER;
}
2024-09-05 11:39:49 +00:00
if ((rspLen = tSerializeSDnodeListRsp(pRsp, rspLen, &rsp)) <= 0) {
code = rspLen;
goto _OVER;
}
2022-06-21 13:05:47 +00:00
pReq->info.rspLen = rspLen;
pReq->info.rsp = pRsp;
code = 0;
_OVER:
if (code != 0) {
2024-07-22 05:24:39 +00:00
mError("failed to get dnode list since %s", tstrerror(code));
2022-06-21 13:05:47 +00:00
}
tFreeSDnodeListRsp(&rsp);
2024-07-20 01:25:18 +00:00
TAOS_RETURN(code);
2022-06-21 13:05:47 +00:00
}
void getSlowLogScopeString(int32_t scope, char *result) {
if (scope == SLOW_LOG_TYPE_NULL) {
2024-12-13 09:48:51 +00:00
(void)strncat(result, "NONE", 64);
return;
}
while (scope > 0) {
if (scope & SLOW_LOG_TYPE_QUERY) {
2024-12-13 09:48:51 +00:00
(void)strncat(result, "QUERY", 64);
scope &= ~SLOW_LOG_TYPE_QUERY;
} else if (scope & SLOW_LOG_TYPE_INSERT) {
2024-12-13 09:48:51 +00:00
(void)strncat(result, "INSERT", 64);
scope &= ~SLOW_LOG_TYPE_INSERT;
} else if (scope & SLOW_LOG_TYPE_OTHERS) {
2024-12-13 09:48:51 +00:00
(void)strncat(result, "OTHERS", 64);
scope &= ~SLOW_LOG_TYPE_OTHERS;
} else {
2024-07-25 09:49:58 +00:00
(void)printf("invalid slow log scope:%d", scope);
return;
}
if (scope > 0) {
2024-12-13 09:48:51 +00:00
(void)strncat(result, "|", 64);
}
}
}
2022-05-16 06:55:31 +00:00
static int32_t mndProcessCreateDnodeReq(SRpcMsg *pReq) {
SMnode *pMnode = pReq->info.node;
2022-02-12 06:06:13 +00:00
int32_t code = -1;
SDnodeObj *pDnode = NULL;
SCreateDnodeReq createReq = {0};
2024-07-20 01:25:18 +00:00
if ((code = grantCheck(TSDB_GRANT_DNODE)) != 0 || (code = grantCheck(TSDB_GRANT_CPU_CORES)) != 0) {
2022-07-18 05:22:21 +00:00
goto _OVER;
}
2024-07-20 01:25:18 +00:00
TAOS_CHECK_GOTO(tDeserializeSCreateDnodeReq(pReq->pCont, pReq->contLen, &createReq), NULL, _OVER);
2022-02-12 06:06:13 +00:00
2022-06-22 06:55:29 +00:00
mInfo("dnode:%s:%d, start to create", createReq.fqdn, createReq.port);
2024-07-20 01:25:18 +00:00
TAOS_CHECK_GOTO(mndCheckOperPrivilege(pMnode, pReq->info.conn.user, MND_OPER_CREATE_DNODE), NULL, _OVER);
2021-12-08 10:50:52 +00:00
2022-02-12 06:06:13 +00:00
if (createReq.fqdn[0] == 0 || createReq.port <= 0 || createReq.port > UINT16_MAX) {
2024-07-20 01:25:18 +00:00
code = TSDB_CODE_MND_INVALID_DNODE_EP;
2022-06-07 01:59:15 +00:00
goto _OVER;
2021-12-08 10:50:52 +00:00
}
2021-12-28 05:43:11 +00:00
char ep[TSDB_EP_LEN];
2024-07-25 09:49:58 +00:00
(void)snprintf(ep, TSDB_EP_LEN, "%s:%d", createReq.fqdn, createReq.port);
2022-02-12 06:06:13 +00:00
pDnode = mndAcquireDnodeByEp(pMnode, ep);
2021-12-08 10:50:52 +00:00
if (pDnode != NULL) {
2024-07-20 01:25:18 +00:00
code = TSDB_CODE_MND_DNODE_ALREADY_EXIST;
2022-06-07 01:59:15 +00:00
goto _OVER;
2021-12-08 10:50:52 +00:00
}
2021-11-30 07:28:51 +00:00
2022-02-12 06:06:13 +00:00
code = mndCreateDnode(pMnode, pReq, &createReq);
2023-12-07 08:00:13 +00:00
if (code == 0) {
code = TSDB_CODE_ACTION_IN_PROGRESS;
tsGrantHBInterval = 5;
}
2023-09-01 05:24:47 +00:00
char obj[200] = {0};
2024-12-13 09:48:51 +00:00
(void)tsnprintf(obj, sizeof(obj), "%s:%d", createReq.fqdn, createReq.port);
2023-09-01 05:24:47 +00:00
2023-11-01 07:04:20 +00:00
auditRecord(pReq, pMnode->clusterId, "createDnode", "", obj, createReq.sql, createReq.sqlLen);
2023-09-01 05:24:47 +00:00
2022-06-07 01:59:15 +00:00
_OVER:
2022-05-21 08:35:24 +00:00
if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
2024-07-22 05:24:39 +00:00
mError("dnode:%s:%d, failed to create since %s", createReq.fqdn, createReq.port, tstrerror(code));
2021-12-08 10:50:52 +00:00
}
2022-02-12 06:06:13 +00:00
mndReleaseDnode(pMnode, pDnode);
2023-09-06 03:00:24 +00:00
tFreeSCreateDnodeReq(&createReq);
2024-07-20 01:25:18 +00:00
TAOS_RETURN(code);
2021-12-08 10:50:52 +00:00
}
2023-05-09 09:15:37 +00:00
extern int32_t mndProcessRestoreDnodeReqImpl(SRpcMsg *pReq);
2023-09-01 07:11:25 +00:00
int32_t mndProcessRestoreDnodeReq(SRpcMsg *pReq) { return mndProcessRestoreDnodeReqImpl(pReq); }
2023-05-09 09:15:37 +00:00
#ifndef TD_ENTERPRISE
2023-09-01 07:11:25 +00:00
int32_t mndProcessRestoreDnodeReqImpl(SRpcMsg *pReq) { return 0; }
2023-05-10 03:23:35 +00:00
#endif
2023-05-09 09:15:37 +00:00
2022-06-22 07:41:30 +00:00
static int32_t mndDropDnode(SMnode *pMnode, SRpcMsg *pReq, SDnodeObj *pDnode, SMnodeObj *pMObj, SQnodeObj *pQObj,
2023-05-16 06:02:54 +00:00
SSnodeObj *pSObj, int32_t numOfVnodes, bool force, bool unsafe) {
2022-06-06 03:49:30 +00:00
int32_t code = -1;
SSdbRaw *pRaw = NULL;
STrans *pTrans = NULL;
2022-09-22 08:18:51 +00:00
pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, pReq, "drop-dnode");
2024-07-20 01:25:18 +00:00
if (pTrans == NULL) {
code = TSDB_CODE_MND_RETURN_VALUE_NULL;
if (terrno != 0) code = terrno;
goto _OVER;
}
2022-06-06 08:21:56 +00:00
mndTransSetSerial(pTrans);
2022-10-31 07:54:47 +00:00
mInfo("trans:%d, used to drop dnode:%d, force:%d", pTrans->id, pDnode->id, force);
2024-07-20 01:25:18 +00:00
TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
2021-12-08 10:50:52 +00:00
2022-06-06 03:49:30 +00:00
pRaw = mndDnodeActionEncode(pDnode);
2024-07-20 01:25:18 +00:00
if (pRaw == NULL) {
code = TSDB_CODE_MND_RETURN_VALUE_NULL;
if (terrno != 0) code = terrno;
goto _OVER;
}
TAOS_CHECK_GOTO(mndTransAppendRedolog(pTrans, pRaw), NULL, _OVER);
2024-09-05 11:39:49 +00:00
TAOS_CHECK_GOTO(sdbSetRawStatus(pRaw, SDB_STATUS_DROPPING), NULL, _OVER);
2022-06-06 03:49:30 +00:00
pRaw = NULL;
2021-12-08 10:50:52 +00:00
2022-06-06 03:49:30 +00:00
pRaw = mndDnodeActionEncode(pDnode);
2024-07-20 01:25:18 +00:00
if (pRaw == NULL) {
code = TSDB_CODE_MND_RETURN_VALUE_NULL;
if (terrno != 0) code = terrno;
goto _OVER;
}
TAOS_CHECK_GOTO(mndTransAppendCommitlog(pTrans, pRaw), NULL, _OVER);
2024-09-05 11:39:49 +00:00
TAOS_CHECK_GOTO(sdbSetRawStatus(pRaw, SDB_STATUS_DROPPED), NULL, _OVER);
2022-06-06 03:49:30 +00:00
pRaw = NULL;
2022-06-07 06:31:07 +00:00
if (pMObj != NULL) {
2022-06-22 06:55:29 +00:00
mInfo("trans:%d, mnode on dnode:%d will be dropped", pTrans->id, pDnode->id);
2024-07-20 01:25:18 +00:00
TAOS_CHECK_GOTO(mndSetDropMnodeInfoToTrans(pMnode, pTrans, pMObj, force), NULL, _OVER);
2022-06-07 06:31:07 +00:00
}
2022-06-22 07:41:30 +00:00
if (pQObj != NULL) {
mInfo("trans:%d, qnode on dnode:%d will be dropped", pTrans->id, pDnode->id);
2024-07-20 01:25:18 +00:00
TAOS_CHECK_GOTO(mndSetDropQnodeInfoToTrans(pMnode, pTrans, pQObj, force), NULL, _OVER);
2022-06-22 07:41:30 +00:00
}
if (pSObj != NULL) {
mInfo("trans:%d, snode on dnode:%d will be dropped", pTrans->id, pDnode->id);
2024-07-20 01:25:18 +00:00
TAOS_CHECK_GOTO(mndSetDropSnodeInfoToTrans(pMnode, pTrans, pSObj, force), NULL, _OVER);
2022-06-22 07:41:30 +00:00
}
2022-06-07 06:31:07 +00:00
if (numOfVnodes > 0) {
2022-06-22 06:55:29 +00:00
mInfo("trans:%d, %d vnodes on dnode:%d will be dropped", pTrans->id, numOfVnodes, pDnode->id);
2024-07-20 01:25:18 +00:00
TAOS_CHECK_GOTO(mndSetMoveVgroupsInfoToTrans(pMnode, pTrans, pDnode->id, force, unsafe), NULL, _OVER);
2022-06-07 06:31:07 +00:00
}
2022-06-22 11:55:00 +00:00
2024-07-20 01:25:18 +00:00
TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
2021-12-08 10:50:52 +00:00
2024-07-29 11:38:04 +00:00
(void)mndUpdateIpWhiteForAllUser(pMnode, TSDB_DEFAULT_USER, pDnode->fqdn, IP_WHITE_DROP,
1); // TODO: check the return value
2022-06-06 03:49:30 +00:00
code = 0;
_OVER:
2021-12-08 10:50:52 +00:00
mndTransDrop(pTrans);
2022-06-06 03:49:30 +00:00
sdbFreeRaw(pRaw);
2024-07-20 01:25:18 +00:00
TAOS_RETURN(code);
2021-12-08 10:50:52 +00:00
}
static bool mndIsEmptyDnode(SMnode *pMnode, int32_t dnodeId) {
bool isEmpty = false;
SMnodeObj *pMObj = NULL;
SQnodeObj *pQObj = NULL;
SSnodeObj *pSObj = NULL;
pQObj = mndAcquireQnode(pMnode, dnodeId);
if (pQObj) goto _OVER;
pSObj = mndAcquireSnode(pMnode, dnodeId);
if (pSObj) goto _OVER;
pMObj = mndAcquireMnode(pMnode, dnodeId);
if (pMObj) goto _OVER;
int32_t numOfVnodes = mndGetVnodesNum(pMnode, dnodeId);
if (numOfVnodes > 0) goto _OVER;
isEmpty = true;
_OVER:
mndReleaseMnode(pMnode, pMObj);
mndReleaseQnode(pMnode, pQObj);
mndReleaseSnode(pMnode, pSObj);
return isEmpty;
}
2022-05-16 06:55:31 +00:00
static int32_t mndProcessDropDnodeReq(SRpcMsg *pReq) {
2022-06-23 03:11:55 +00:00
SMnode *pMnode = pReq->info.node;
int32_t code = -1;
SDnodeObj *pDnode = NULL;
SMnodeObj *pMObj = NULL;
SQnodeObj *pQObj = NULL;
SSnodeObj *pSObj = NULL;
SDropDnodeReq dropReq = {0};
2024-07-20 01:25:18 +00:00
TAOS_CHECK_GOTO(tDeserializeSDropDnodeReq(pReq->pCont, pReq->contLen, &dropReq), NULL, _OVER);
2021-12-08 10:50:52 +00:00
2023-09-01 07:11:25 +00:00
mInfo("dnode:%d, start to drop, ep:%s:%d, force:%s, unsafe:%s", dropReq.dnodeId, dropReq.fqdn, dropReq.port,
dropReq.force ? "true" : "false", dropReq.unsafe ? "true" : "false");
2024-07-20 01:25:18 +00:00
TAOS_CHECK_GOTO(mndCheckOperPrivilege(pMnode, pReq->info.conn.user, MND_OPER_DROP_MNODE), NULL, _OVER);
2021-12-08 10:50:52 +00:00
2023-05-16 06:02:54 +00:00
bool force = dropReq.force;
2023-09-01 07:11:25 +00:00
if (dropReq.unsafe) {
2023-05-16 06:02:54 +00:00
force = true;
}
2022-02-12 06:06:13 +00:00
pDnode = mndAcquireDnode(pMnode, dropReq.dnodeId);
2021-12-08 10:50:52 +00:00
if (pDnode == NULL) {
int32_t err = terrno;
char ep[TSDB_EP_LEN + 1] = {0};
2024-07-25 09:49:58 +00:00
(void)snprintf(ep, sizeof(ep), dropReq.fqdn, dropReq.port);
2022-06-23 03:11:55 +00:00
pDnode = mndAcquireDnodeByEp(pMnode, ep);
if (pDnode == NULL) {
2024-07-20 01:25:18 +00:00
code = err;
2022-06-23 03:11:55 +00:00
goto _OVER;
}
2022-06-06 03:49:30 +00:00
}
2022-06-22 07:41:30 +00:00
pQObj = mndAcquireQnode(pMnode, dropReq.dnodeId);
pSObj = mndAcquireSnode(pMnode, dropReq.dnodeId);
2022-04-09 11:00:52 +00:00
pMObj = mndAcquireMnode(pMnode, dropReq.dnodeId);
if (pMObj != NULL) {
2022-06-06 03:49:30 +00:00
if (sdbGetSize(pMnode->pSdb, SDB_MNODE) <= 1) {
2024-07-20 01:25:18 +00:00
code = TSDB_CODE_MND_TOO_FEW_MNODES;
2022-06-06 03:49:30 +00:00
goto _OVER;
}
if (pMnode->selfDnodeId == dropReq.dnodeId) {
2024-07-20 01:25:18 +00:00
code = TSDB_CODE_MND_CANT_DROP_LEADER;
2022-06-07 06:31:07 +00:00
goto _OVER;
}
}
int32_t numOfVnodes = mndGetVnodesNum(pMnode, pDnode->id);
2023-09-01 07:11:25 +00:00
bool isonline = mndIsDnodeOnline(pDnode, taosGetTimestampMs());
2023-07-17 10:37:00 +00:00
2023-05-26 11:01:13 +00:00
if (isonline && force) {
2024-07-20 01:25:18 +00:00
code = TSDB_CODE_DNODE_ONLY_USE_WHEN_OFFLINE;
2024-07-22 05:24:39 +00:00
mError("dnode:%d, failed to drop since %s, vnodes:%d mnode:%d qnode:%d snode:%d", pDnode->id, tstrerror(code),
2023-09-01 07:11:25 +00:00
numOfVnodes, pMObj != NULL, pQObj != NULL, pSObj != NULL);
2023-05-26 11:01:13 +00:00
goto _OVER;
}
bool isEmpty = mndIsEmptyDnode(pMnode, pDnode->id);
if (!isonline && !force && !isEmpty) {
2024-07-20 01:25:18 +00:00
code = TSDB_CODE_DNODE_OFFLINE;
2024-07-22 05:24:39 +00:00
mError("dnode:%d, failed to drop since %s, vnodes:%d mnode:%d qnode:%d snode:%d", pDnode->id, tstrerror(code),
2023-09-01 07:11:25 +00:00
numOfVnodes, pMObj != NULL, pQObj != NULL, pSObj != NULL);
2023-05-29 08:12:26 +00:00
goto _OVER;
2022-04-09 11:00:52 +00:00
}
2023-05-16 06:02:54 +00:00
code = mndDropDnode(pMnode, pReq, pDnode, pMObj, pQObj, pSObj, numOfVnodes, force, dropReq.unsafe);
2022-05-21 08:35:24 +00:00
if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
2022-02-12 06:06:13 +00:00
2023-09-01 05:24:47 +00:00
char obj1[30] = {0};
2024-12-13 09:48:51 +00:00
(void)tsnprintf(obj1, sizeof(obj1), "%d", dropReq.dnodeId);
2023-09-01 05:24:47 +00:00
2023-11-01 07:04:20 +00:00
auditRecord(pReq, pMnode->clusterId, "dropDnode", "", obj1, dropReq.sql, dropReq.sqlLen);
2023-09-01 05:24:47 +00:00
2022-06-06 03:49:30 +00:00
_OVER:
2022-05-21 08:35:24 +00:00
if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
2024-07-22 05:24:39 +00:00
mError("dnode:%d, failed to drop since %s", dropReq.dnodeId, tstrerror(code));
2021-12-08 10:50:52 +00:00
}
2021-12-12 04:14:26 +00:00
mndReleaseDnode(pMnode, pDnode);
2022-04-09 11:00:52 +00:00
mndReleaseMnode(pMnode, pMObj);
2022-06-22 07:41:30 +00:00
mndReleaseQnode(pMnode, pQObj);
mndReleaseSnode(pMnode, pSObj);
2023-09-06 03:00:24 +00:00
tFreeSDropDnodeReq(&dropReq);
2024-07-20 01:25:18 +00:00
TAOS_RETURN(code);
2021-12-08 10:50:52 +00:00
}
static int32_t mndProcessCreateEncryptKeyReqImpl(SRpcMsg *pReq, int32_t dnodeId, SDCfgDnodeReq *pDcfgReq) {
int32_t code = 0;
SMnode *pMnode = pReq->info.node;
SSdb *pSdb = pMnode->pSdb;
void *pIter = NULL;
int8_t encrypting = 0;
const STraceId *trace = &pReq->info.traceId;
int32_t klen = strlen(pDcfgReq->value);
if (klen > ENCRYPT_KEY_LEN || klen < ENCRYPT_KEY_LEN_MIN) {
code = TSDB_CODE_DNODE_INVALID_ENCRYPT_KLEN;
mGError("msg:%p, failed to create encrypt_key since invalid key length:%d, valid range:[%d, %d]", pReq, klen,
2024-04-16 00:34:41 +00:00
ENCRYPT_KEY_LEN_MIN, ENCRYPT_KEY_LEN);
goto _exit;
}
if (0 != (encrypting = atomic_val_compare_exchange_8(&pMnode->encryptMgmt.encrypting, 0, 1))) {
code = TSDB_CODE_QRY_DUPLICATED_OPERATION;
mGWarn("msg:%p, failed to create encrypt key since %s, encrypting:%" PRIi8, pReq, tstrerror(code), encrypting);
goto _exit;
}
if (tsEncryptionKeyStat == ENCRYPT_KEY_STAT_SET || tsEncryptionKeyStat == ENCRYPT_KEY_STAT_LOADED) {
atomic_store_8(&pMnode->encryptMgmt.encrypting, 0);
code = TSDB_CODE_QRY_DUPLICATED_OPERATION;
mGWarn("msg:%p, failed to create encrypt key since %s, stat:%" PRIi8 ", checksum:%u", pReq, tstrerror(code),
tsEncryptionKeyStat, tsEncryptionKeyChksum);
goto _exit;
}
atomic_store_16(&pMnode->encryptMgmt.nEncrypt, 0);
atomic_store_16(&pMnode->encryptMgmt.nSuccess, 0);
atomic_store_16(&pMnode->encryptMgmt.nFailed, 0);
while (1) {
SDnodeObj *pDnode = NULL;
pIter = sdbFetch(pSdb, SDB_DNODE, pIter, (void **)&pDnode);
if (pIter == NULL) break;
if (pDnode->offlineReason != DND_REASON_ONLINE) {
mGWarn("msg:%p, don't send create encrypt_key req since dnode:%d in offline state:%s", pReq, pDnode->id,
offlineReason[pDnode->offlineReason]);
2024-04-16 00:34:41 +00:00
sdbRelease(pSdb, pDnode);
continue;
}
if (dnodeId == -1 || pDnode->id == dnodeId || dnodeId == 0) {
SEpSet epSet = mndGetDnodeEpset(pDnode);
int32_t bufLen = tSerializeSDCfgDnodeReq(NULL, 0, pDcfgReq);
void *pBuf = rpcMallocCont(bufLen);
if (pBuf != NULL) {
2024-09-05 11:39:49 +00:00
if ((bufLen = tSerializeSDCfgDnodeReq(pBuf, bufLen, pDcfgReq)) <= 0) {
code = bufLen;
sdbRelease(pSdb, pDnode);
goto _exit;
}
SRpcMsg rpcMsg = {.msgType = TDMT_DND_CREATE_ENCRYPT_KEY, .pCont = pBuf, .contLen = bufLen};
if (0 == tmsgSendReq(&epSet, &rpcMsg)) {
2024-07-25 09:49:58 +00:00
(void)atomic_add_fetch_16(&pMnode->encryptMgmt.nEncrypt, 1);
}
}
}
sdbRelease(pSdb, pDnode);
}
if (atomic_load_16(&pMnode->encryptMgmt.nEncrypt) <= 0) {
atomic_store_8(&pMnode->encryptMgmt.encrypting, 0);
}
_exit:
if (code != 0) {
if (terrno == 0) terrno = code;
}
return code;
}
static int32_t mndProcessCreateEncryptKeyReq(SRpcMsg *pReq) {
2024-07-20 01:25:18 +00:00
int32_t code = 0;
#ifdef TD_ENTERPRISE
SMnode *pMnode = pReq->info.node;
SMCfgDnodeReq cfgReq = {0};
2024-07-22 06:13:48 +00:00
TAOS_CHECK_RETURN(tDeserializeSMCfgDnodeReq(pReq->pCont, pReq->contLen, &cfgReq));
2024-07-20 01:25:18 +00:00
if ((code = mndCheckOperPrivilege(pMnode, pReq->info.conn.user, MND_OPER_CONFIG_DNODE)) != 0) {
tFreeSMCfgDnodeReq(&cfgReq);
2024-07-20 01:25:18 +00:00
TAOS_RETURN(code);
}
const STraceId *trace = &pReq->info.traceId;
SDCfgDnodeReq dcfgReq = {0};
if (strncasecmp(cfgReq.config, "encrypt_key", 12) == 0) {
tstrncpy(dcfgReq.config, cfgReq.config, sizeof(dcfgReq.config));
tstrncpy(dcfgReq.value, cfgReq.value, sizeof(dcfgReq.value));
tFreeSMCfgDnodeReq(&cfgReq);
return mndProcessCreateEncryptKeyReqImpl(pReq, cfgReq.dnodeId, &dcfgReq);
} else {
2024-07-20 01:25:18 +00:00
code = TSDB_CODE_PAR_INTERNAL_ERROR;
tFreeSMCfgDnodeReq(&cfgReq);
2024-07-20 01:25:18 +00:00
TAOS_RETURN(code);
}
#else
2024-07-20 01:25:18 +00:00
TAOS_RETURN(code);
#endif
}
2024-03-31 16:49:25 +00:00
static int32_t mndProcessCreateEncryptKeyRsp(SRpcMsg *pRsp) {
SMnode *pMnode = pRsp->info.node;
int16_t nSuccess = 0;
int16_t nFailed = 0;
if (0 == pRsp->code) {
nSuccess = atomic_add_fetch_16(&pMnode->encryptMgmt.nSuccess, 1);
} else {
nFailed = atomic_add_fetch_16(&pMnode->encryptMgmt.nFailed, 1);
}
int16_t nReq = atomic_load_16(&pMnode->encryptMgmt.nEncrypt);
bool finished = nSuccess + nFailed >= nReq;
if (finished) {
atomic_store_8(&pMnode->encryptMgmt.encrypting, 0);
}
const STraceId *trace = &pRsp->info.traceId;
mGInfo("msg:%p, create encrypt key rsp, nReq:%" PRIi16 ", nSucess:%" PRIi16 ", nFailed:%" PRIi16 ", %s", pRsp, nReq,
2024-04-07 06:53:05 +00:00
nSuccess, nFailed, finished ? "encrypt done" : "in encrypting");
2024-03-31 16:49:25 +00:00
return 0;
}
2022-05-16 06:55:31 +00:00
static int32_t mndRetrieveConfigs(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
SMnode *pMnode = pReq->info.node;
2022-02-25 08:33:00 +00:00
int32_t totalRows = 0;
2021-12-08 10:50:52 +00:00
int32_t numOfRows = 0;
char *cfgOpts[TSDB_CONFIG_NUMBER] = {0};
2022-06-22 09:17:18 +00:00
char cfgVals[TSDB_CONFIG_NUMBER][TSDB_CONFIG_VALUE_LEN + 1] = {0};
2022-06-07 01:59:15 +00:00
char *pWrite = NULL;
2021-12-08 10:50:52 +00:00
int32_t cols = 0;
2024-09-18 03:45:41 +00:00
int32_t code = 0;
int32_t lino = 0;
2021-12-08 10:50:52 +00:00
2022-02-25 08:33:00 +00:00
cfgOpts[totalRows] = "statusInterval";
2024-07-25 09:49:58 +00:00
(void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%d", tsStatusInterval);
2022-02-25 08:33:00 +00:00
totalRows++;
2021-12-08 10:50:52 +00:00
2022-02-25 08:33:00 +00:00
cfgOpts[totalRows] = "timezone";
2024-07-25 09:49:58 +00:00
(void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%s", tsTimezoneStr);
2022-02-25 08:33:00 +00:00
totalRows++;
2021-12-08 10:50:52 +00:00
2022-02-25 08:33:00 +00:00
cfgOpts[totalRows] = "locale";
2024-07-25 09:49:58 +00:00
(void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%s", tsLocale);
2022-02-25 08:33:00 +00:00
totalRows++;
2021-12-08 10:50:52 +00:00
2022-02-25 08:33:00 +00:00
cfgOpts[totalRows] = "charset";
2024-07-25 09:49:58 +00:00
(void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%s", tsCharset);
2022-02-25 08:33:00 +00:00
totalRows++;
2021-12-08 10:50:52 +00:00
cfgOpts[totalRows] = "monitor";
2024-07-25 09:49:58 +00:00
(void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%d", tsEnableMonitor);
totalRows++;
cfgOpts[totalRows] = "monitorInterval";
2024-07-25 09:49:58 +00:00
(void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%d", tsMonitorInterval);
totalRows++;
cfgOpts[totalRows] = "slowLogThreshold";
2024-07-25 09:49:58 +00:00
(void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%d", tsSlowLogThreshold);
totalRows++;
cfgOpts[totalRows] = "slowLogMaxLen";
2024-07-25 09:49:58 +00:00
(void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%d", tsSlowLogMaxLen);
totalRows++;
char scopeStr[64] = {0};
getSlowLogScopeString(tsSlowLogScope, scopeStr);
cfgOpts[totalRows] = "slowLogScope";
2024-07-25 09:49:58 +00:00
(void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%s", scopeStr);
totalRows++;
char buf[TSDB_CONFIG_OPTION_LEN + VARSTR_HEADER_SIZE] = {0};
2022-06-22 09:17:18 +00:00
char bufVal[TSDB_CONFIG_VALUE_LEN + VARSTR_HEADER_SIZE] = {0};
2022-02-25 08:33:00 +00:00
for (int32_t i = 0; i < totalRows; i++) {
2021-12-08 10:50:52 +00:00
cols = 0;
STR_WITH_MAXSIZE_TO_VARSTR(buf, cfgOpts[i], TSDB_CONFIG_OPTION_LEN);
2022-04-20 02:24:37 +00:00
SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
2024-09-18 03:45:41 +00:00
TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)buf, false), &lino, _OVER);
2021-12-08 10:50:52 +00:00
2022-06-22 09:17:18 +00:00
STR_WITH_MAXSIZE_TO_VARSTR(bufVal, cfgVals[i], TSDB_CONFIG_VALUE_LEN);
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
2024-09-18 03:45:41 +00:00
TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)bufVal, false), &lino, _OVER);
2022-02-25 08:33:00 +00:00
numOfRows++;
2021-12-08 10:50:52 +00:00
}
2024-09-18 03:45:41 +00:00
_OVER:
if (code != 0) mError("failed to retrieve configs at line:%d since %s", lino, tstrerror(code));
pShow->numOfRows += numOfRows;
2021-12-08 10:50:52 +00:00
return numOfRows;
}
static void mndCancelGetNextConfig(SMnode *pMnode, void *pIter) {}
2022-05-16 06:55:31 +00:00
static int32_t mndRetrieveDnodes(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
SMnode *pMnode = pReq->info.node;
2021-12-08 10:50:52 +00:00
SSdb *pSdb = pMnode->pSdb;
int32_t numOfRows = 0;
int32_t cols = 0;
ESdbStatus objStatus = 0;
2021-12-08 10:50:52 +00:00
SDnodeObj *pDnode = NULL;
2021-12-30 06:22:09 +00:00
int64_t curMs = taosGetTimestampMs();
2024-03-27 12:03:38 +00:00
char buf[TSDB_EP_LEN + VARSTR_HEADER_SIZE];
2024-09-18 03:45:41 +00:00
int32_t code = 0;
int32_t lino = 0;
2021-12-08 10:50:52 +00:00
while (numOfRows < rows) {
pShow->pIter = sdbFetchAll(pSdb, SDB_DNODE, pShow->pIter, (void **)&pDnode, &objStatus, true);
2021-12-08 10:50:52 +00:00
if (pShow->pIter == NULL) break;
2022-06-06 03:49:30 +00:00
bool online = mndIsDnodeOnline(pDnode, curMs);
2021-12-08 10:50:52 +00:00
cols = 0;
2022-04-20 02:24:37 +00:00
SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
2024-09-18 03:45:41 +00:00
RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pDnode->id, false), pDnode, &lino, _OVER);
STR_WITH_MAXSIZE_TO_VARSTR(buf, pDnode->ep, pShow->pMeta->pSchemas[cols].bytes);
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
2024-09-18 03:45:41 +00:00
RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, buf, false), pDnode, &lino, _OVER);
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
int16_t id = mndGetVnodesNum(pMnode, pDnode->id);
2024-09-18 03:45:41 +00:00
RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&id, false), pDnode, &lino, _OVER);
2021-12-08 10:50:52 +00:00
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
2024-09-18 03:45:41 +00:00
RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pDnode->numOfSupportVnodes, false), pDnode,
&lino, _OVER);
2021-12-08 10:50:52 +00:00
const char *status = "ready";
if (objStatus == SDB_STATUS_CREATING) status = "creating";
if (objStatus == SDB_STATUS_DROPPING) status = "dropping";
if (!online) {
if (objStatus == SDB_STATUS_CREATING)
status = "creating*";
else if (objStatus == SDB_STATUS_DROPPING)
status = "dropping*";
else
status = "offline";
}
2023-05-11 06:57:50 +00:00
STR_TO_VARSTR(buf, status);
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
2024-09-18 03:45:41 +00:00
RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, buf, false), pDnode, &lino, _OVER);
2021-12-08 10:50:52 +00:00
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
2024-09-18 03:45:41 +00:00
RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pDnode->createdTime, false), pDnode, &lino,
_OVER);
2021-12-08 10:50:52 +00:00
2023-03-07 10:27:26 +00:00
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
2024-09-18 03:45:41 +00:00
RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pDnode->rebootTime, false), pDnode, &lino,
_OVER);
2023-03-07 10:27:26 +00:00
2022-06-17 06:56:54 +00:00
char *b = taosMemoryCalloc(VARSTR_HEADER_SIZE + strlen(offlineReason[pDnode->offlineReason]) + 1, 1);
STR_TO_VARSTR(b, online ? "" : offlineReason[pDnode->offlineReason]);
2021-12-08 10:50:52 +00:00
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
2024-09-18 03:45:41 +00:00
RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, b, false), pDnode, &lino, _OVER);
2022-06-17 06:56:54 +00:00
taosMemoryFreeClear(b);
2021-12-08 10:50:52 +00:00
2023-05-11 06:57:50 +00:00
#ifdef TD_ENTERPRISE
2023-12-07 06:11:41 +00:00
STR_TO_VARSTR(buf, pDnode->machineId);
2023-05-06 12:38:50 +00:00
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
2024-09-18 03:45:41 +00:00
RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, buf, false), pDnode, &lino, _OVER);
2023-05-11 06:57:50 +00:00
#endif
2023-05-06 12:38:50 +00:00
2021-12-08 10:50:52 +00:00
numOfRows++;
sdbRelease(pSdb, pDnode);
}
2024-09-18 03:45:41 +00:00
_OVER:
if (code != 0) mError("failed to retrieve dnodes at line:%d since %s", lino, tstrerror(code));
pShow->numOfRows += numOfRows;
2021-12-08 10:50:52 +00:00
return numOfRows;
}
static void mndCancelGetNextDnode(SMnode *pMnode, void *pIter) {
SSdb *pSdb = pMnode->pSdb;
sdbCancelFetchByType(pSdb, pIter, SDB_DNODE);
2022-03-07 08:30:28 +00:00
}
2023-09-08 03:49:12 +00:00
SArray *mndGetAllDnodeFqdns(SMnode *pMnode) {
SDnodeObj *pObj = NULL;
void *pIter = NULL;
SSdb *pSdb = pMnode->pSdb;
SArray *fqdns = taosArrayInit(4, sizeof(void *));
while (1) {
pIter = sdbFetch(pSdb, SDB_DNODE, pIter, (void **)&pObj);
if (pIter == NULL) break;
char *fqdn = taosStrdup(pObj->fqdn);
if (taosArrayPush(fqdns, &fqdn) == NULL) {
mError("failed to fqdn into array, but continue at this time");
}
2023-09-08 03:49:12 +00:00
sdbRelease(pSdb, pObj);
}
return fqdns;
}