• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

taosdata / TDengine / #3620

21 Feb 2025 09:00AM UTC coverage: 63.573% (+0.2%) from 63.423%
#3620

push

travis-ci

web-flow
ci: taosBenchmark add coverage cases branch 3.0 (#29788)

* fix: add unit test for taos-tools

* fix: only .cpp include

* fix: remove no use function

* fix: restore toolsSys.c

* fix: add toolsSys case

* fix: rebuild error fixed

* fix: fix build error

* fix: support get vgroups with core and memory limit

* fix: build error for strcasecmp

* fix: add insertBasic.py case

* fix: add command line set vgroups=3

* fix: change with ns database

* toolscJson read with int replace float and add insertPrecison.py

* fix: add insertBindVGroup.json case

* fix: remove public fun removeQuotation

* fix: vgroups change method

* fix: memory leak for runInsertLimitThread slot

* insertPrecision.py word write wrong

* fix: check isFloat number

* fix: vgroups change logic error

* fix: insertBasic.py real and expect error

* fix: adjust default vgroups

* fix: adjust default vgroups modify comment

148962 of 300203 branches covered (49.62%)

Branch coverage included in aggregate %.

15 of 16 new or added lines in 1 file covered. (93.75%)

2018 existing lines in 133 files now uncovered.

233201 of 300933 relevant lines covered (77.49%)

18174406.98 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

63.53
/source/dnode/mnode/impl/src/mndDnode.c
1
/*
2
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
3
 *
4
 * This program is free software: you can use, redistribute, and/or modify
5
 * it under the terms of the GNU Affero General Public License, version 3
6
 * or later ("AGPL"), as published by the Free Software Foundation.
7
 *
8
 * This program is distributed in the hope that it will be useful, but WITHOUT
9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
 * FITNESS FOR A PARTICULAR PURPOSE.
11
 *
12
 * You should have received a copy of the GNU Affero General Public License
13
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14
 */
15

16
#define _DEFAULT_SOURCE
17
#include <stdio.h>
18
#include "audit.h"
19
#include "mndCluster.h"
20
#include "mndDb.h"
21
#include "mndDnode.h"
22
#include "mndMnode.h"
23
#include "mndPrivilege.h"
24
#include "mndQnode.h"
25
#include "mndShow.h"
26
#include "mndSnode.h"
27
#include "mndTrans.h"
28
#include "mndUser.h"
29
#include "mndVgroup.h"
30
#include "taos_monitor.h"
31
#include "tconfig.h"
32
#include "tjson.h"
33
#include "tmisce.h"
34
#include "tunit.h"
35

36
#define TSDB_DNODE_VER_NUMBER   2
37
#define TSDB_DNODE_RESERVE_SIZE 40
38

39
static const char *offlineReason[] = {
40
    "",
41
    "status msg timeout",
42
    "status not received",
43
    "version not match",
44
    "dnodeId not match",
45
    "clusterId not match",
46
    "statusInterval not match",
47
    "timezone not match",
48
    "locale not match",
49
    "charset not match",
50
    "ttlChangeOnWrite not match",
51
    "enableWhiteList not match",
52
    "encryptionKey not match",
53
    "monitor not match",
54
    "monitor switch not match",
55
    "monitor interval not match",
56
    "monitor slow log threshold not match",
57
    "monitor slow log sql max len not match",
58
    "monitor slow log scope not match",
59
    "unknown",
60
};
61

62
enum {
63
  DND_ACTIVE_CODE,
64
  DND_CONN_ACTIVE_CODE,
65
};
66

67
enum {
68
  DND_CREATE,
69
  DND_ADD,
70
  DND_DROP,
71
};
72

73
static int32_t  mndCreateDefaultDnode(SMnode *pMnode);
74
static SSdbRaw *mndDnodeActionEncode(SDnodeObj *pDnode);
75
static SSdbRow *mndDnodeActionDecode(SSdbRaw *pRaw);
76
static int32_t  mndDnodeActionInsert(SSdb *pSdb, SDnodeObj *pDnode);
77
static int32_t  mndDnodeActionDelete(SSdb *pSdb, SDnodeObj *pDnode);
78
static int32_t  mndDnodeActionUpdate(SSdb *pSdb, SDnodeObj *pOld, SDnodeObj *pNew);
79
static int32_t  mndProcessDnodeListReq(SRpcMsg *pReq);
80

81
static int32_t mndProcessCreateDnodeReq(SRpcMsg *pReq);
82
static int32_t mndProcessDropDnodeReq(SRpcMsg *pReq);
83
static int32_t mndProcessStatusReq(SRpcMsg *pReq);
84
static int32_t mndProcessNotifyReq(SRpcMsg *pReq);
85
static int32_t mndProcessRestoreDnodeReq(SRpcMsg *pReq);
86
static int32_t mndProcessStatisReq(SRpcMsg *pReq);
87
static int32_t mndProcessAuditReq(SRpcMsg *pReq);
88
static int32_t mndProcessUpdateDnodeInfoReq(SRpcMsg *pReq);
89
static int32_t mndProcessCreateEncryptKeyReq(SRpcMsg *pRsp);
90
static int32_t mndProcessCreateEncryptKeyRsp(SRpcMsg *pRsp);
91

92
static int32_t mndRetrieveConfigs(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
93
static void    mndCancelGetNextConfig(SMnode *pMnode, void *pIter);
94
static int32_t mndRetrieveDnodes(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
95
static void    mndCancelGetNextDnode(SMnode *pMnode, void *pIter);
96

97
#ifdef _GRANT
98
int32_t mndUpdClusterInfo(SRpcMsg *pReq);
99
#else
100
static int32_t mndUpdClusterInfo(SRpcMsg *pReq) { return 0; }
101
#endif
102

103
int32_t mndInitDnode(SMnode *pMnode) {
1,871✔
104
  SSdbTable table = {
1,871✔
105
      .sdbType = SDB_DNODE,
106
      .keyType = SDB_KEY_INT32,
107
      .deployFp = (SdbDeployFp)mndCreateDefaultDnode,
108
      .encodeFp = (SdbEncodeFp)mndDnodeActionEncode,
109
      .decodeFp = (SdbDecodeFp)mndDnodeActionDecode,
110
      .insertFp = (SdbInsertFp)mndDnodeActionInsert,
111
      .updateFp = (SdbUpdateFp)mndDnodeActionUpdate,
112
      .deleteFp = (SdbDeleteFp)mndDnodeActionDelete,
113
  };
114

115
  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_DNODE, mndProcessCreateDnodeReq);
1,871✔
116
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_DNODE, mndProcessDropDnodeReq);
1,871✔
117
  mndSetMsgHandle(pMnode, TDMT_MND_STATUS, mndProcessStatusReq);
1,871✔
118
  mndSetMsgHandle(pMnode, TDMT_MND_NOTIFY, mndProcessNotifyReq);
1,871✔
119
  mndSetMsgHandle(pMnode, TDMT_MND_DNODE_LIST, mndProcessDnodeListReq);
1,871✔
120
  mndSetMsgHandle(pMnode, TDMT_MND_RESTORE_DNODE, mndProcessRestoreDnodeReq);
1,871✔
121
  mndSetMsgHandle(pMnode, TDMT_MND_STATIS, mndProcessStatisReq);
1,871✔
122
  mndSetMsgHandle(pMnode, TDMT_MND_AUDIT, mndProcessAuditReq);
1,871✔
123
  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_ENCRYPT_KEY, mndProcessCreateEncryptKeyReq);
1,871✔
124
  mndSetMsgHandle(pMnode, TDMT_DND_CREATE_ENCRYPT_KEY_RSP, mndProcessCreateEncryptKeyRsp);
1,871✔
125
  mndSetMsgHandle(pMnode, TDMT_MND_UPDATE_DNODE_INFO, mndProcessUpdateDnodeInfoReq);
1,871✔
126

127
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_CONFIGS, mndRetrieveConfigs);
1,871✔
128
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_CONFIGS, mndCancelGetNextConfig);
1,871✔
129
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_DNODE, mndRetrieveDnodes);
1,871✔
130
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_DNODE, mndCancelGetNextDnode);
1,871✔
131

132
  return sdbSetTable(pMnode->pSdb, table);
1,871✔
133
}
134

135
SIpWhiteList *mndCreateIpWhiteOfDnode(SMnode *pMnode);
136
SIpWhiteList *mndAddIpWhiteOfDnode(SIpWhiteList *pIpWhiteList, char *fqdn);
137
SIpWhiteList *mndRmIpWhiteOfDnode(SIpWhiteList *pIpWhiteList, char *fqdn);
138
void          mndCleanupDnode(SMnode *pMnode) {}
1,870✔
139

140
static int32_t mndCreateDefaultDnode(SMnode *pMnode) {
1,372✔
141
  int32_t  code = -1;
1,372✔
142
  SSdbRaw *pRaw = NULL;
1,372✔
143
  STrans  *pTrans = NULL;
1,372✔
144

145
  SDnodeObj dnodeObj = {0};
1,372✔
146
  dnodeObj.id = 1;
1,372✔
147
  dnodeObj.createdTime = taosGetTimestampMs();
1,372✔
148
  dnodeObj.updateTime = dnodeObj.createdTime;
1,372✔
149
  dnodeObj.port = tsServerPort;
1,372✔
150
  tstrncpy(dnodeObj.fqdn, tsLocalFqdn, TSDB_FQDN_LEN);
1,372✔
151
  dnodeObj.fqdn[TSDB_FQDN_LEN - 1] = 0;
1,372✔
152
  (void)snprintf(dnodeObj.ep, TSDB_EP_LEN - 1, "%s:%u", tsLocalFqdn, tsServerPort);
1,372✔
153
  char *machineId = NULL;
1,372✔
154
  code = tGetMachineId(&machineId);
1,372✔
155
  if (machineId) {
1,372!
156
    (void)memcpy(dnodeObj.machineId, machineId, TSDB_MACHINE_ID_LEN);
1,372✔
157
    taosMemoryFreeClear(machineId);
1,372!
158
  } else {
159
#if defined(TD_ENTERPRISE) && !defined(GRANTS_CFG)
160
    terrno = TSDB_CODE_DNODE_NO_MACHINE_CODE;
×
161
    goto _OVER;
×
162
#endif
163
  }
164

165
  pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, NULL, "create-dnode");
1,372✔
166
  if (pTrans == NULL) {
1,372!
167
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
168
    if (terrno != 0) code = terrno;
×
169
    goto _OVER;
×
170
  }
171
  mInfo("trans:%d, used to create dnode:%s on first deploy", pTrans->id, dnodeObj.ep);
1,372!
172

173
  pRaw = mndDnodeActionEncode(&dnodeObj);
1,372✔
174
  if (pRaw == NULL) {
1,372!
175
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
176
    if (terrno != 0) code = terrno;
×
177
    goto _OVER;
×
178
  }
179
  TAOS_CHECK_GOTO(mndTransAppendCommitlog(pTrans, pRaw), NULL, _OVER);
1,372!
180
  TAOS_CHECK_GOTO(sdbSetRawStatus(pRaw, SDB_STATUS_READY), NULL, _OVER);
1,372!
181
  pRaw = NULL;
1,372✔
182

183
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
1,372!
184
  code = 0;
1,372✔
185
  (void)mndUpdateIpWhiteForAllUser(pMnode, TSDB_DEFAULT_USER, dnodeObj.fqdn, IP_WHITE_ADD,
1,372✔
186
                                   1);  // TODO: check the return value
187

188
_OVER:
1,372✔
189
  mndTransDrop(pTrans);
1,372✔
190
  sdbFreeRaw(pRaw);
1,372✔
191
  return code;
1,372✔
192
}
193

194
static SSdbRaw *mndDnodeActionEncode(SDnodeObj *pDnode) {
7,345✔
195
  int32_t code = 0;
7,345✔
196
  int32_t lino = 0;
7,345✔
197
  terrno = TSDB_CODE_OUT_OF_MEMORY;
7,345✔
198

199
  SSdbRaw *pRaw = sdbAllocRaw(SDB_DNODE, TSDB_DNODE_VER_NUMBER, sizeof(SDnodeObj) + TSDB_DNODE_RESERVE_SIZE);
7,345✔
200
  if (pRaw == NULL) goto _OVER;
7,345!
201

202
  int32_t dataPos = 0;
7,345✔
203
  SDB_SET_INT32(pRaw, dataPos, pDnode->id, _OVER)
7,345!
204
  SDB_SET_INT64(pRaw, dataPos, pDnode->createdTime, _OVER)
7,345!
205
  SDB_SET_INT64(pRaw, dataPos, pDnode->updateTime, _OVER)
7,345!
206
  SDB_SET_INT16(pRaw, dataPos, pDnode->port, _OVER)
7,345!
207
  SDB_SET_BINARY(pRaw, dataPos, pDnode->fqdn, TSDB_FQDN_LEN, _OVER)
7,345!
208
  SDB_SET_BINARY(pRaw, dataPos, pDnode->machineId, TSDB_MACHINE_ID_LEN, _OVER)
7,345!
209
  SDB_SET_RESERVE(pRaw, dataPos, TSDB_DNODE_RESERVE_SIZE, _OVER)
7,345!
210
  SDB_SET_INT16(pRaw, dataPos, 0, _OVER)  // forward/backward compatible
7,345!
211
  SDB_SET_INT16(pRaw, dataPos, 0, _OVER)  // forward/backward compatible
7,345!
212
  SDB_SET_DATALEN(pRaw, dataPos, _OVER);
7,345!
213

214
  terrno = 0;
7,345✔
215

216
_OVER:
7,345✔
217
  if (terrno != 0) {
7,345!
218
    mError("dnode:%d, failed to encode to raw:%p since %s", pDnode->id, pRaw, terrstr());
×
219
    sdbFreeRaw(pRaw);
×
220
    return NULL;
×
221
  }
222

223
  mTrace("dnode:%d, encode to raw:%p, row:%p", pDnode->id, pRaw, pDnode);
7,345✔
224
  return pRaw;
7,345✔
225
}
226

227
static SSdbRow *mndDnodeActionDecode(SSdbRaw *pRaw) {
4,519✔
228
  int32_t code = 0;
4,519✔
229
  int32_t lino = 0;
4,519✔
230
  terrno = TSDB_CODE_OUT_OF_MEMORY;
4,519✔
231
  SSdbRow   *pRow = NULL;
4,519✔
232
  SDnodeObj *pDnode = NULL;
4,519✔
233

234
  int8_t sver = 0;
4,519✔
235
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
4,519!
236
  if (sver < 1 || sver > TSDB_DNODE_VER_NUMBER) {
4,519!
237
    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
×
238
    goto _OVER;
×
239
  }
240

241
  pRow = sdbAllocRow(sizeof(SDnodeObj));
4,519✔
242
  if (pRow == NULL) goto _OVER;
4,519!
243

244
  pDnode = sdbGetRowObj(pRow);
4,519✔
245
  if (pDnode == NULL) goto _OVER;
4,519!
246

247
  int32_t dataPos = 0;
4,519✔
248
  SDB_GET_INT32(pRaw, dataPos, &pDnode->id, _OVER)
4,519!
249
  SDB_GET_INT64(pRaw, dataPos, &pDnode->createdTime, _OVER)
4,519!
250
  SDB_GET_INT64(pRaw, dataPos, &pDnode->updateTime, _OVER)
4,519!
251
  SDB_GET_INT16(pRaw, dataPos, &pDnode->port, _OVER)
4,519!
252
  SDB_GET_BINARY(pRaw, dataPos, pDnode->fqdn, TSDB_FQDN_LEN, _OVER)
4,519!
253
  SDB_GET_BINARY(pRaw, dataPos, pDnode->machineId, TSDB_MACHINE_ID_LEN, _OVER)
4,519!
254
  SDB_GET_RESERVE(pRaw, dataPos, TSDB_DNODE_RESERVE_SIZE, _OVER)
4,519!
255
  if (sver > 1) {
4,519!
256
    int16_t keyLen = 0;
4,519✔
257
    SDB_GET_INT16(pRaw, dataPos, &keyLen, _OVER)
4,519!
258
    SDB_GET_BINARY(pRaw, dataPos, NULL, keyLen, _OVER)
4,519!
259
    SDB_GET_INT16(pRaw, dataPos, &keyLen, _OVER)
4,519!
260
    SDB_GET_BINARY(pRaw, dataPos, NULL, keyLen, _OVER)
4,519!
261
  }
262

263
  terrno = 0;
4,519✔
264
  if (tmsgUpdateDnodeInfo(&pDnode->id, NULL, pDnode->fqdn, &pDnode->port)) {
4,519!
265
    mInfo("dnode:%d, endpoint changed", pDnode->id);
×
266
  }
267

268
_OVER:
4,519✔
269
  if (terrno != 0) {
4,519!
270
    mError("dnode:%d, failed to decode from raw:%p since %s", pDnode == NULL ? 0 : pDnode->id, pRaw, terrstr());
×
271
    taosMemoryFreeClear(pRow);
×
272
    return NULL;
×
273
  }
274

275
  mTrace("dnode:%d, decode from raw:%p, row:%p ep:%s:%u", pDnode->id, pRaw, pDnode, pDnode->fqdn, pDnode->port);
4,519✔
276
  return pRow;
4,519✔
277
}
278

279
static int32_t mndDnodeActionInsert(SSdb *pSdb, SDnodeObj *pDnode) {
3,594✔
280
  mTrace("dnode:%d, perform insert action, row:%p", pDnode->id, pDnode);
3,594✔
281
  pDnode->offlineReason = DND_REASON_STATUS_NOT_RECEIVED;
3,594✔
282

283
  char ep[TSDB_EP_LEN] = {0};
3,594✔
284
  (void)snprintf(ep, TSDB_EP_LEN - 1, "%s:%u", pDnode->fqdn, pDnode->port);
3,594✔
285
  tstrncpy(pDnode->ep, ep, TSDB_EP_LEN);
3,594✔
286
  return 0;
3,594✔
287
}
288

289
static int32_t mndDnodeActionDelete(SSdb *pSdb, SDnodeObj *pDnode) {
4,518✔
290
  mTrace("dnode:%d, perform delete action, row:%p", pDnode->id, pDnode);
4,518✔
291
  return 0;
4,518✔
292
}
293

294
static int32_t mndDnodeActionUpdate(SSdb *pSdb, SDnodeObj *pOld, SDnodeObj *pNew) {
899✔
295
  mTrace("dnode:%d, perform update action, old row:%p new row:%p", pOld->id, pOld, pNew);
899!
296
  pOld->updateTime = pNew->updateTime;
899✔
297
#ifdef TD_ENTERPRISE
298
  tstrncpy(pOld->machineId, pNew->machineId, TSDB_MACHINE_ID_LEN + 1);
899✔
299
#endif
300
  return 0;
899✔
301
}
302

303
SDnodeObj *mndAcquireDnode(SMnode *pMnode, int32_t dnodeId) {
19,616,324✔
304
  SSdb      *pSdb = pMnode->pSdb;
19,616,324✔
305
  SDnodeObj *pDnode = sdbAcquire(pSdb, SDB_DNODE, &dnodeId);
19,616,324✔
306
  if (pDnode == NULL) {
19,624,184✔
307
    if (terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
581✔
308
      terrno = TSDB_CODE_MND_DNODE_NOT_EXIST;
49✔
309
    } else if (terrno == TSDB_CODE_SDB_OBJ_CREATING) {
532!
310
      terrno = TSDB_CODE_MND_DNODE_IN_CREATING;
×
311
    } else if (terrno == TSDB_CODE_SDB_OBJ_DROPPING) {
532!
312
      terrno = TSDB_CODE_MND_DNODE_IN_DROPPING;
532✔
313
    } else {
314
      terrno = TSDB_CODE_APP_ERROR;
×
315
      mFatal("dnode:%d, failed to acquire db since %s", dnodeId, terrstr());
×
316
    }
317
  }
318

319
  return pDnode;
19,624,134✔
320
}
321

322
void mndReleaseDnode(SMnode *pMnode, SDnodeObj *pDnode) {
19,301,697✔
323
  SSdb *pSdb = pMnode->pSdb;
19,301,697✔
324
  sdbRelease(pSdb, pDnode);
19,301,697✔
325
}
19,302,938✔
326

327
SEpSet mndGetDnodeEpset(SDnodeObj *pDnode) {
28,682✔
328
  SEpSet epSet = {0};
28,682✔
329
  terrno = addEpIntoEpSet(&epSet, pDnode->fqdn, pDnode->port);
28,682✔
330
  return epSet;
28,682✔
331
}
332

333
SEpSet mndGetDnodeEpsetById(SMnode *pMnode, int32_t dnodeId) {
×
334
  SEpSet     epSet = {0};
×
335
  SDnodeObj *pDnode = mndAcquireDnode(pMnode, dnodeId);
×
336
  if (!pDnode) return epSet;
×
337

338
  epSet = mndGetDnodeEpset(pDnode);
×
339

340
  mndReleaseDnode(pMnode, pDnode);
×
341
  return epSet;
×
342
}
343

344
static SDnodeObj *mndAcquireDnodeByEp(SMnode *pMnode, char *pEpStr) {
2,769✔
345
  SSdb *pSdb = pMnode->pSdb;
2,769✔
346

347
  void *pIter = NULL;
2,769✔
348
  while (1) {
3,500✔
349
    SDnodeObj *pDnode = NULL;
6,269✔
350
    pIter = sdbFetch(pSdb, SDB_DNODE, pIter, (void **)&pDnode);
6,269✔
351
    if (pIter == NULL) break;
6,269✔
352

353
    if (strncasecmp(pEpStr, pDnode->ep, TSDB_EP_LEN) == 0) {
5,339✔
354
      sdbCancelFetch(pSdb, pIter);
1,839✔
355
      return pDnode;
1,839✔
356
    }
357

358
    sdbRelease(pSdb, pDnode);
3,500✔
359
  }
360

361
  terrno = TSDB_CODE_MND_DNODE_NOT_EXIST;
930✔
362
  return NULL;
930✔
363
}
364

365
static SDnodeObj *mndAcquireDnodeAllStatusByEp(SMnode *pMnode, char *pEpStr) {
321✔
366
  SSdb *pSdb = pMnode->pSdb;
321✔
367

368
  void *pIter = NULL;
321✔
369
  while (1) {
321✔
370
    SDnodeObj *pDnode = NULL;
642✔
371
    ESdbStatus objStatus = 0;
642✔
372
    pIter = sdbFetchAll(pSdb, SDB_DNODE, pIter, (void **)&pDnode, &objStatus, true);
642✔
373
    if (pIter == NULL) break;
642!
374

375
    if (strncasecmp(pEpStr, pDnode->ep, TSDB_EP_LEN) == 0) {
642✔
376
      sdbCancelFetch(pSdb, pIter);
321✔
377
      return pDnode;
321✔
378
    }
379

380
    sdbRelease(pSdb, pDnode);
321✔
381
  }
382

383
  return NULL;
×
384
}
385

386
int32_t mndGetDnodeSize(SMnode *pMnode) {
610,478✔
387
  SSdb *pSdb = pMnode->pSdb;
610,478✔
388
  return sdbGetSize(pSdb, SDB_DNODE);
610,478✔
389
}
390

391
int32_t mndGetDbSize(SMnode *pMnode) {
×
392
  SSdb *pSdb = pMnode->pSdb;
×
393
  return sdbGetSize(pSdb, SDB_DB);
×
394
}
395

396
bool mndIsDnodeOnline(SDnodeObj *pDnode, int64_t curMs) {
1,544,855✔
397
  int64_t interval = TABS(pDnode->lastAccessTime - curMs);
1,544,855✔
398
  if (interval > 5000 * (int64_t)tsStatusInterval) {
1,544,855✔
399
    if (pDnode->rebootTime > 0 && pDnode->offlineReason == DND_REASON_ONLINE) {
7,185✔
400
      pDnode->offlineReason = DND_REASON_STATUS_MSG_TIMEOUT;
107✔
401
    }
402
    return false;
7,185✔
403
  }
404
  return true;
1,537,670✔
405
}
406

407
static void mndGetDnodeEps(SMnode *pMnode, SArray *pDnodeEps) {
3,993✔
408
  SSdb *pSdb = pMnode->pSdb;
3,993✔
409

410
  int32_t numOfEps = 0;
3,993✔
411
  void   *pIter = NULL;
3,993✔
412
  while (1) {
13,665✔
413
    SDnodeObj *pDnode = NULL;
17,658✔
414
    ESdbStatus objStatus = 0;
17,658✔
415
    pIter = sdbFetchAll(pSdb, SDB_DNODE, pIter, (void **)&pDnode, &objStatus, true);
17,658✔
416
    if (pIter == NULL) break;
17,658✔
417

418
    SDnodeEp dnodeEp = {0};
13,665✔
419
    dnodeEp.id = pDnode->id;
13,665✔
420
    dnodeEp.ep.port = pDnode->port;
13,665✔
421
    tstrncpy(dnodeEp.ep.fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
13,665✔
422
    sdbRelease(pSdb, pDnode);
13,665✔
423

424
    dnodeEp.isMnode = 0;
13,665✔
425
    if (mndIsMnode(pMnode, pDnode->id)) {
13,665✔
426
      dnodeEp.isMnode = 1;
5,667✔
427
    }
428
    if (taosArrayPush(pDnodeEps, &dnodeEp) == NULL) {
13,665!
429
      mError("failed to put ep into array, but continue at this call");
×
430
    }
431
  }
432
}
3,993✔
433

434
int32_t mndGetDnodeData(SMnode *pMnode, SArray *pDnodeInfo) {
58,137✔
435
  SSdb   *pSdb = pMnode->pSdb;
58,137✔
436
  int32_t code = 0;
58,137✔
437

438
  int32_t numOfEps = 0;
58,137✔
439
  void   *pIter = NULL;
58,137✔
440
  while (1) {
252,166✔
441
    SDnodeObj *pDnode = NULL;
310,303✔
442
    ESdbStatus objStatus = 0;
310,303✔
443
    pIter = sdbFetchAll(pSdb, SDB_DNODE, pIter, (void **)&pDnode, &objStatus, true);
310,303✔
444
    if (pIter == NULL) break;
310,304✔
445

446
    SDnodeInfo dInfo;
447
    dInfo.id = pDnode->id;
252,166✔
448
    dInfo.ep.port = pDnode->port;
252,166✔
449
    dInfo.offlineReason = pDnode->offlineReason;
252,166✔
450
    tstrncpy(dInfo.ep.fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
252,166✔
451
    sdbRelease(pSdb, pDnode);
252,166✔
452
    if (mndIsMnode(pMnode, pDnode->id)) {
252,166✔
453
      dInfo.isMnode = 1;
74,911✔
454
    } else {
455
      dInfo.isMnode = 0;
177,255✔
456
    }
457

458
    if (taosArrayPush(pDnodeInfo, &dInfo) == NULL) {
252,166!
459
      code = terrno;
×
460
      sdbCancelFetch(pSdb, pIter);
×
461
      break;
×
462
    }
463
  }
464
  TAOS_RETURN(code);
58,138✔
465
}
466

467
#define CHECK_MONITOR_PARA(para, err)                                                                    \
468
  if (pCfg->monitorParas.para != para) {                                                                 \
469
    mError("dnode:%d, para:%d inconsistent with cluster:%d", pDnode->id, pCfg->monitorParas.para, para); \
470
    terrno = err;                                                                                        \
471
    return err;                                                                                          \
472
  }
473

474
static int32_t mndCheckClusterCfgPara(SMnode *pMnode, SDnodeObj *pDnode, const SClusterCfg *pCfg) {
3,993✔
475
  CHECK_MONITOR_PARA(tsEnableMonitor, DND_REASON_STATUS_MONITOR_SWITCH_NOT_MATCH);
3,993!
476
  CHECK_MONITOR_PARA(tsMonitorInterval, DND_REASON_STATUS_MONITOR_INTERVAL_NOT_MATCH);
3,993!
477
  CHECK_MONITOR_PARA(tsSlowLogThreshold, DND_REASON_STATUS_MONITOR_SLOW_LOG_THRESHOLD_NOT_MATCH);
3,993!
478
  CHECK_MONITOR_PARA(tsSlowLogMaxLen, DND_REASON_STATUS_MONITOR_SLOW_LOG_SQL_MAX_LEN_NOT_MATCH);
3,993!
479
  CHECK_MONITOR_PARA(tsSlowLogScope, DND_REASON_STATUS_MONITOR_SLOW_LOG_SCOPE_NOT_MATCH);
3,993!
480

481
  if (0 != strcasecmp(pCfg->monitorParas.tsSlowLogExceptDb, tsSlowLogExceptDb)) {
3,993!
482
    mError("dnode:%d, tsSlowLogExceptDb:%s inconsistent with cluster:%s", pDnode->id,
×
483
           pCfg->monitorParas.tsSlowLogExceptDb, tsSlowLogExceptDb);
484
    terrno = TSDB_CODE_DNODE_INVALID_MONITOR_PARAS;
×
485
    return DND_REASON_STATUS_MONITOR_NOT_MATCH;
×
486
  }
487

488
  if (pCfg->statusInterval != tsStatusInterval) {
3,993!
489
    mError("dnode:%d, statusInterval:%d inconsistent with cluster:%d", pDnode->id, pCfg->statusInterval,
×
490
           tsStatusInterval);
491
    terrno = TSDB_CODE_DNODE_INVALID_STATUS_INTERVAL;
×
492
    return DND_REASON_STATUS_INTERVAL_NOT_MATCH;
×
493
  }
494

495
  if ((0 != strcasecmp(pCfg->timezone, tsTimezoneStr)) && (pMnode->checkTime != pCfg->checkTime)) {
3,993!
496
    mError("dnode:%d, timezone:%s checkTime:%" PRId64 " inconsistent with cluster %s %" PRId64, pDnode->id,
×
497
           pCfg->timezone, pCfg->checkTime, tsTimezoneStr, pMnode->checkTime);
498
    terrno = TSDB_CODE_DNODE_INVALID_TIMEZONE;
×
499
    return DND_REASON_TIME_ZONE_NOT_MATCH;
×
500
  }
501

502
  if (0 != strcasecmp(pCfg->locale, tsLocale)) {
3,993!
503
    mError("dnode:%d, locale:%s inconsistent with cluster:%s", pDnode->id, pCfg->locale, tsLocale);
×
504
    terrno = TSDB_CODE_DNODE_INVALID_LOCALE;
×
505
    return DND_REASON_LOCALE_NOT_MATCH;
×
506
  }
507

508
  if (0 != strcasecmp(pCfg->charset, tsCharset)) {
3,993!
509
    mError("dnode:%d, charset:%s inconsistent with cluster:%s", pDnode->id, pCfg->charset, tsCharset);
×
510
    terrno = TSDB_CODE_DNODE_INVALID_CHARSET;
×
511
    return DND_REASON_CHARSET_NOT_MATCH;
×
512
  }
513

514
  if (pCfg->ttlChangeOnWrite != tsTtlChangeOnWrite) {
3,993!
515
    mError("dnode:%d, ttlChangeOnWrite:%d inconsistent with cluster:%d", pDnode->id, pCfg->ttlChangeOnWrite,
×
516
           tsTtlChangeOnWrite);
517
    terrno = TSDB_CODE_DNODE_INVALID_TTL_CHG_ON_WR;
×
518
    return DND_REASON_TTL_CHANGE_ON_WRITE_NOT_MATCH;
×
519
  }
520
  int8_t enable = tsEnableWhiteList ? 1 : 0;
3,993✔
521
  if (pCfg->enableWhiteList != enable) {
3,993!
522
    mError("dnode:%d, enableWhiteList:%d inconsistent with cluster:%d", pDnode->id, pCfg->enableWhiteList, enable);
×
523
    terrno = TSDB_CODE_DNODE_INVALID_EN_WHITELIST;
×
524
    return DND_REASON_ENABLE_WHITELIST_NOT_MATCH;
×
525
  }
526

527
  if (!atomic_load_8(&pMnode->encryptMgmt.encrypting) &&
3,993!
528
      (pCfg->encryptionKeyStat != tsEncryptionKeyStat || pCfg->encryptionKeyChksum != tsEncryptionKeyChksum)) {
3,993!
529
    mError("dnode:%d, encryptionKey:%" PRIi8 "-%u inconsistent with cluster:%" PRIi8 "-%u", pDnode->id,
×
530
           pCfg->encryptionKeyStat, pCfg->encryptionKeyChksum, tsEncryptionKeyStat, tsEncryptionKeyChksum);
531
    terrno = pCfg->encryptionKeyChksum ? TSDB_CODE_DNODE_INVALID_ENCRYPTKEY : TSDB_CODE_DNODE_NO_ENCRYPT_KEY;
×
532
    return DND_REASON_ENCRYPTION_KEY_NOT_MATCH;
×
533
  }
534

535
  return DND_REASON_ONLINE;
3,993✔
536
}
537

538
double calcAppliedRate(int64_t currentCount, int64_t lastCount, int64_t currentTimeMs, int64_t lastTimeMs) {
35✔
539
  if ((currentTimeMs <= lastTimeMs) || (currentCount <= lastCount)) {
35!
UNCOV
540
    return 0.0;
×
541
  }
542

543
  int64_t deltaCount = currentCount - lastCount;
35✔
544
  int64_t deltaMs = currentTimeMs - lastTimeMs;
35✔
545
  double  rate = (double)deltaCount / (double)deltaMs;
35✔
546
  return rate;
35✔
547
}
548

549
static bool mndUpdateVnodeState(int32_t vgId, SVnodeGid *pGid, SVnodeLoad *pVload) {
1,032,376✔
550
  bool stateChanged = false;
1,032,376✔
551
  bool roleChanged = pGid->syncState != pVload->syncState ||
3,093,801✔
552
                     (pVload->syncTerm != -1 && pGid->syncTerm != pVload->syncTerm) ||
2,051,753!
553
                     pGid->roleTimeMs != pVload->roleTimeMs;
1,019,377✔
554

555
  if (pVload->syncCommitIndex > pVload->syncAppliedIndex) {
1,032,376✔
556
    if (pGid->lastSyncAppliedIndexUpdateTime == 0) {
94✔
557
      pGid->lastSyncAppliedIndexUpdateTime = taosGetTimestampMs();
54✔
558
    } else if (pGid->syncAppliedIndex != pVload->syncAppliedIndex) {
40✔
559
      int64_t currentTimeMs = taosGetTimestampMs();
35✔
560
      pGid->appliedRate = calcAppliedRate(pVload->syncAppliedIndex, pGid->syncAppliedIndex, currentTimeMs,
35✔
561
                                          pGid->lastSyncAppliedIndexUpdateTime);
562

563
      pGid->lastSyncAppliedIndexUpdateTime = currentTimeMs;
35✔
564
    }
565
  }
566

567
  pGid->syncAppliedIndex = pVload->syncAppliedIndex;
1,032,376✔
568
  pGid->syncCommitIndex = pVload->syncCommitIndex;
1,032,376✔
569
  if (roleChanged || pGid->syncRestore != pVload->syncRestore || pGid->syncCanRead != pVload->syncCanRead ||
1,032,376!
570
      pGid->startTimeMs != pVload->startTimeMs) {
1,018,760!
571
    mInfo(
13,616!
572
        "vgId:%d, state changed by status msg, old state:%s restored:%d canRead:%d new state:%s restored:%d "
573
        "canRead:%d, dnode:%d",
574
        vgId, syncStr(pGid->syncState), pGid->syncRestore, pGid->syncCanRead, syncStr(pVload->syncState),
575
        pVload->syncRestore, pVload->syncCanRead, pGid->dnodeId);
576
    pGid->syncState = pVload->syncState;
13,617✔
577
    pGid->syncTerm = pVload->syncTerm;
13,617✔
578
    pGid->syncRestore = pVload->syncRestore;
13,617✔
579
    pGid->syncCanRead = pVload->syncCanRead;
13,617✔
580
    pGid->startTimeMs = pVload->startTimeMs;
13,617✔
581
    pGid->roleTimeMs = pVload->roleTimeMs;
13,617✔
582
    stateChanged = true;
13,617✔
583
  }
584
  return stateChanged;
1,032,377✔
585
}
586

587
static bool mndUpdateMnodeState(SMnodeObj *pObj, SMnodeLoad *pMload) {
71,048✔
588
  bool stateChanged = false;
71,048✔
589
  bool roleChanged = pObj->syncState != pMload->syncState ||
211,292✔
590
                     (pMload->syncTerm != -1 && pObj->syncTerm != pMload->syncTerm) ||
140,164!
591
                     pObj->roleTimeMs != pMload->roleTimeMs;
69,116✔
592
  if (roleChanged || pObj->syncRestore != pMload->syncRestore) {
71,048✔
593
    mInfo("dnode:%d, mnode syncState from %s to %s, restoreState from %d to %d, syncTerm from %" PRId64 " to %" PRId64,
1,971!
594
          pObj->id, syncStr(pObj->syncState), syncStr(pMload->syncState), pObj->syncRestore, pMload->syncRestore,
595
          pObj->syncTerm, pMload->syncTerm);
596
    pObj->syncState = pMload->syncState;
1,971✔
597
    pObj->syncTerm = pMload->syncTerm;
1,971✔
598
    pObj->syncRestore = pMload->syncRestore;
1,971✔
599
    pObj->roleTimeMs = pMload->roleTimeMs;
1,971✔
600
    stateChanged = true;
1,971✔
601
  }
602
  return stateChanged;
71,048✔
603
}
604

605
extern char   *tsMonFwUri;
606
extern char   *tsMonSlowLogUri;
607
static int32_t mndProcessStatisReq(SRpcMsg *pReq) {
11,671✔
608
  SMnode    *pMnode = pReq->info.node;
11,671✔
609
  SStatisReq statisReq = {0};
11,671✔
610
  int32_t    code = -1;
11,671✔
611

612
  TAOS_CHECK_RETURN(tDeserializeSStatisReq(pReq->pCont, pReq->contLen, &statisReq));
11,671!
613

614
  if (tsMonitorLogProtocol) {
11,671!
615
    mInfo("process statis req,\n %s", statisReq.pCont);
×
616
  }
617

618
  if (statisReq.type == MONITOR_TYPE_COUNTER) {
11,671✔
619
    monSendContent(statisReq.pCont, tsMonFwUri);
9,039✔
620
  } else if (statisReq.type == MONITOR_TYPE_SLOW_LOG) {
2,632!
621
    monSendContent(statisReq.pCont, tsMonSlowLogUri);
2,632✔
622
  }
623

624
  tFreeSStatisReq(&statisReq);
11,671✔
625
  return 0;
11,671✔
626
}
627

628
static int32_t mndProcessAuditReq(SRpcMsg *pReq) {
66,449✔
629
  mTrace("process audit req:%p", pReq);
66,449✔
630
  if (tsEnableAudit && tsEnableAuditDelete) {
66,449!
631
    SMnode   *pMnode = pReq->info.node;
66,449✔
632
    SAuditReq auditReq = {0};
66,449✔
633

634
    TAOS_CHECK_RETURN(tDeserializeSAuditReq(pReq->pCont, pReq->contLen, &auditReq));
66,449!
635

636
    mDebug("received audit req:%s, %s, %s, %s", auditReq.operation, auditReq.db, auditReq.table, auditReq.pSql);
66,449✔
637

638
    auditAddRecord(pReq, pMnode->clusterId, auditReq.operation, auditReq.db, auditReq.table, auditReq.pSql,
66,449✔
639
                   auditReq.sqlLen);
640

641
    tFreeSAuditReq(&auditReq);
66,448✔
642
  }
643
  return 0;
66,449✔
644
}
645

646
static int32_t mndUpdateDnodeObj(SMnode *pMnode, SDnodeObj *pDnode) {
468✔
647
  int32_t       code = 0, lino = 0;
468✔
648
  SDnodeInfoReq infoReq = {0};
468✔
649
  int32_t       contLen = 0;
468✔
650
  void         *pReq = NULL;
468✔
651

652
  infoReq.dnodeId = pDnode->id;
468✔
653
  tstrncpy(infoReq.machineId, pDnode->machineId, TSDB_MACHINE_ID_LEN + 1);
468✔
654

655
  if ((contLen = tSerializeSDnodeInfoReq(NULL, 0, &infoReq)) <= 0) {
468!
656
    TAOS_RETURN(contLen ? contLen : TSDB_CODE_OUT_OF_MEMORY);
×
657
  }
658
  pReq = rpcMallocCont(contLen);
468✔
659
  if (pReq == NULL) {
468!
660
    TAOS_RETURN(terrno);
×
661
  }
662

663
  if ((contLen = tSerializeSDnodeInfoReq(pReq, contLen, &infoReq)) <= 0) {
468!
664
    code = contLen;
×
665
    goto _exit;
×
666
  }
667

668
  SRpcMsg rpcMsg = {.msgType = TDMT_MND_UPDATE_DNODE_INFO, .pCont = pReq, .contLen = contLen};
468✔
669
  TAOS_CHECK_EXIT(tmsgPutToQueue(&pMnode->msgCb, WRITE_QUEUE, &rpcMsg));
468!
670
_exit:
468✔
671
  if (code < 0) {
468!
672
    mError("dnode:%d, failed to update dnode info since %s", pDnode->id, tstrerror(code));
×
673
  }
674
  TAOS_RETURN(code);
468✔
675
}
676

677
static int32_t mndProcessUpdateDnodeInfoReq(SRpcMsg *pReq) {
468✔
678
  int32_t       code = 0, lino = 0;
468✔
679
  SMnode       *pMnode = pReq->info.node;
468✔
680
  SDnodeInfoReq infoReq = {0};
468✔
681
  SDnodeObj    *pDnode = NULL;
468✔
682
  STrans       *pTrans = NULL;
468✔
683
  SSdbRaw      *pCommitRaw = NULL;
468✔
684

685
  TAOS_CHECK_EXIT(tDeserializeSDnodeInfoReq(pReq->pCont, pReq->contLen, &infoReq));
468!
686

687
  pDnode = mndAcquireDnode(pMnode, infoReq.dnodeId);
468✔
688
  if (pDnode == NULL) {
468!
689
    TAOS_CHECK_EXIT(terrno);
×
690
  }
691

692
  pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_NOTHING, NULL, "update-dnode-obj");
468✔
693
  if (pTrans == NULL) {
468!
694
    TAOS_CHECK_EXIT(terrno);
×
695
  }
696

697
  pDnode->updateTime = taosGetTimestampMs();
468✔
698

699
  if ((pCommitRaw = mndDnodeActionEncode(pDnode)) == NULL) {
468!
700
    TAOS_CHECK_EXIT(terrno);
×
701
  }
702
  if ((code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
468!
703
    mError("trans:%d, failed to append commit log since %s", pTrans->id, tstrerror(code));
×
704
    TAOS_CHECK_EXIT(code);
×
705
  }
706
  TAOS_CHECK_EXIT(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
468!
707
  pCommitRaw = NULL;
468✔
708

709
  if ((code = mndTransPrepare(pMnode, pTrans)) != 0) {
468!
710
    mError("trans:%d, failed to prepare since %s", pTrans->id, tstrerror(code));
×
711
    TAOS_CHECK_EXIT(code);
×
712
  }
713

714
_exit:
468✔
715
  mndReleaseDnode(pMnode, pDnode);
468✔
716
  if (code != 0) {
468!
717
    mError("dnode:%d, failed to update dnode info at line %d since %s", infoReq.dnodeId, lino, tstrerror(code));
×
718
  }
719
  mndTransDrop(pTrans);
468✔
720
  sdbFreeRaw(pCommitRaw);
468✔
721
  TAOS_RETURN(code);
468✔
722
}
723

724
static int32_t mndProcessStatusReq(SRpcMsg *pReq) {
109,125✔
725
  SMnode    *pMnode = pReq->info.node;
109,125✔
726
  SStatusReq statusReq = {0};
109,125✔
727
  SDnodeObj *pDnode = NULL;
109,125✔
728
  int32_t    code = -1;
109,125✔
729

730
  TAOS_CHECK_GOTO(tDeserializeSStatusReq(pReq->pCont, pReq->contLen, &statusReq), NULL, _OVER);
109,125!
731

732
  int64_t clusterid = mndGetClusterId(pMnode);
109,127✔
733
  if (statusReq.clusterId != 0 && statusReq.clusterId != clusterid) {
109,129✔
734
    code = TSDB_CODE_MND_DNODE_DIFF_CLUSTER;
33✔
735
    mWarn("dnode:%d, %s, its clusterid:%" PRId64 " differ from current clusterid:%" PRId64 ", code:0x%x",
33!
736
          statusReq.dnodeId, statusReq.dnodeEp, statusReq.clusterId, clusterid, code);
737
    goto _OVER;
33✔
738
  }
739

740
  if (statusReq.dnodeId == 0) {
109,096✔
741
    pDnode = mndAcquireDnodeByEp(pMnode, statusReq.dnodeEp);
1,942✔
742
    if (pDnode == NULL) {
1,942✔
743
      mInfo("dnode:%s, not created yet", statusReq.dnodeEp);
106!
744
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
106✔
745
      if (terrno != 0) code = terrno;
106!
746
      goto _OVER;
106✔
747
    }
748
  } else {
749
    pDnode = mndAcquireDnode(pMnode, statusReq.dnodeId);
107,154✔
750
    if (pDnode == NULL) {
107,153✔
751
      int32_t err = terrno;
356✔
752
      pDnode = mndAcquireDnodeByEp(pMnode, statusReq.dnodeEp);
356✔
753
      if (pDnode != NULL) {
356✔
754
        pDnode->offlineReason = DND_REASON_DNODE_ID_NOT_MATCH;
3✔
755
        terrno = err;
3✔
756
        goto _OVER;
3✔
757
      }
758

759
      mError("dnode:%d, %s not exist, code:0x%x", statusReq.dnodeId, statusReq.dnodeEp, err);
353!
760
      if (err == TSDB_CODE_MND_DNODE_NOT_EXIST) {
353✔
761
        terrno = err;
32✔
762
        goto _OVER;
32✔
763
      } else {
764
        pDnode = mndAcquireDnodeAllStatusByEp(pMnode, statusReq.dnodeEp);
321✔
765
        if (pDnode == NULL) goto _OVER;
321!
766
      }
767
    }
768
  }
769

770
  pMnode->ipWhiteVer = mndGetIpWhiteVer(pMnode);
108,954✔
771

772
  int64_t analVer = sdbGetTableVer(pMnode->pSdb, SDB_ANODE);
108,954✔
773
  int64_t dnodeVer = sdbGetTableVer(pMnode->pSdb, SDB_DNODE) + sdbGetTableVer(pMnode->pSdb, SDB_MNODE);
108,954✔
774
  int64_t curMs = taosGetTimestampMs();
108,954✔
775
  bool    online = mndIsDnodeOnline(pDnode, curMs);
108,954✔
776
  bool    dnodeChanged = (statusReq.dnodeVer == 0) || (statusReq.dnodeVer != dnodeVer);
108,952✔
777
  bool    reboot = (pDnode->rebootTime != statusReq.rebootTime);
108,952✔
778
  bool    supportVnodesChanged = pDnode->numOfSupportVnodes != statusReq.numOfSupportVnodes;
108,952✔
779
  bool    encryptKeyChanged = pDnode->encryptionKeyChksum != statusReq.clusterCfg.encryptionKeyChksum;
108,952✔
780
  bool    enableWhiteListChanged = statusReq.clusterCfg.enableWhiteList != (tsEnableWhiteList ? 1 : 0);
108,952✔
781
  bool    analVerChanged = (analVer != statusReq.analVer);
108,952✔
782
  bool    needCheck = !online || dnodeChanged || reboot || supportVnodesChanged || analVerChanged ||
106,547!
783
                   pMnode->ipWhiteVer != statusReq.ipWhiteVer || encryptKeyChanged || enableWhiteListChanged;
215,499!
784
  const STraceId *trace = &pReq->info.traceId;
108,952✔
785
  mGTrace("dnode:%d, status received, accessTimes:%d check:%d online:%d reboot:%d changed:%d statusSeq:%d", pDnode->id,
108,952!
786
          pDnode->accessTimes, needCheck, online, reboot, dnodeChanged, statusReq.statusSeq);
787

788
  if (reboot) {
108,952✔
789
    tsGrantHBInterval = GRANT_HEART_BEAT_MIN;
2,451✔
790
  }
791

792
  for (int32_t v = 0; v < taosArrayGetSize(statusReq.pVloads); ++v) {
1,143,719✔
793
    SVnodeLoad *pVload = taosArrayGet(statusReq.pVloads, v);
1,034,766✔
794

795
    SVgObj *pVgroup = mndAcquireVgroup(pMnode, pVload->vgId);
1,034,766✔
796
    if (pVgroup != NULL) {
1,034,767✔
797
      if (pVload->syncState == TAOS_SYNC_STATE_LEADER || pVload->syncState == TAOS_SYNC_STATE_ASSIGNED_LEADER) {
1,032,404✔
798
        pVgroup->cacheUsage = pVload->cacheUsage;
992,175✔
799
        pVgroup->numOfCachedTables = pVload->numOfCachedTables;
992,175✔
800
        pVgroup->numOfTables = pVload->numOfTables;
992,175✔
801
        pVgroup->numOfTimeSeries = pVload->numOfTimeSeries;
992,175✔
802
        pVgroup->totalStorage = pVload->totalStorage;
992,175✔
803
        pVgroup->compStorage = pVload->compStorage;
992,175✔
804
        pVgroup->pointsWritten = pVload->pointsWritten;
992,175✔
805
      }
806
      bool stateChanged = false;
1,032,404✔
807
      for (int32_t vg = 0; vg < pVgroup->replica; ++vg) {
1,086,810✔
808
        SVnodeGid *pGid = &pVgroup->vnodeGid[vg];
1,086,784✔
809
        if (pGid->dnodeId == statusReq.dnodeId) {
1,086,784✔
810
          if (pVload->startTimeMs == 0) {
1,032,378!
811
            pVload->startTimeMs = statusReq.rebootTime;
×
812
          }
813
          if (pVload->roleTimeMs == 0) {
1,032,378!
814
            pVload->roleTimeMs = statusReq.rebootTime;
×
815
          }
816
          stateChanged = mndUpdateVnodeState(pVgroup->vgId, pGid, pVload);
1,032,378✔
817
          break;
1,032,376✔
818
        }
819
      }
820
      if (stateChanged) {
1,032,402✔
821
        SDbObj *pDb = mndAcquireDb(pMnode, pVgroup->dbName);
13,617✔
822
        if (pDb != NULL && pDb->stateTs != curMs) {
13,617✔
823
          mInfo("db:%s, stateTs changed by status msg, old stateTs:%" PRId64 " new stateTs:%" PRId64, pDb->name,
8,247!
824
                pDb->stateTs, curMs);
825
          pDb->stateTs = curMs;
8,247✔
826
        }
827
        mndReleaseDb(pMnode, pDb);
13,617✔
828
      }
829
    }
830

831
    mndReleaseVgroup(pMnode, pVgroup);
1,034,765✔
832
  }
833

834
  SMnodeObj *pObj = mndAcquireMnode(pMnode, pDnode->id);
108,951✔
835
  if (pObj != NULL) {
108,955✔
836
    if (statusReq.mload.roleTimeMs == 0) {
71,048✔
837
      statusReq.mload.roleTimeMs = statusReq.rebootTime;
8✔
838
    }
839
    (void)mndUpdateMnodeState(pObj, &statusReq.mload);
71,048✔
840
    mndReleaseMnode(pMnode, pObj);
71,048✔
841
  }
842

843
  SQnodeObj *pQnode = mndAcquireQnode(pMnode, statusReq.qload.dnodeId);
108,955✔
844
  if (pQnode != NULL) {
108,952✔
845
    pQnode->load = statusReq.qload;
50,221✔
846
    mndReleaseQnode(pMnode, pQnode);
50,221✔
847
  }
848

849
  if (needCheck) {
108,955✔
850
    if (statusReq.sver != tsVersion) {
3,993!
851
      if (pDnode != NULL) {
×
852
        pDnode->offlineReason = DND_REASON_VERSION_NOT_MATCH;
×
853
      }
854
      mError("dnode:%d, status msg version:%d not match cluster:%d", statusReq.dnodeId, statusReq.sver, tsVersion);
×
855
      terrno = TSDB_CODE_VERSION_NOT_COMPATIBLE;
×
856
      goto _OVER;
×
857
    }
858

859
    if (statusReq.dnodeId == 0) {
3,993✔
860
      mInfo("dnode:%d, %s first access, clusterId:%" PRId64, pDnode->id, pDnode->ep, pMnode->clusterId);
1,836!
861
    } else {
862
      if (statusReq.clusterId != pMnode->clusterId) {
2,157!
863
        if (pDnode != NULL) {
×
864
          pDnode->offlineReason = DND_REASON_CLUSTER_ID_NOT_MATCH;
×
865
        }
866
        mError("dnode:%d, clusterId %" PRId64 " not match exist %" PRId64, pDnode->id, statusReq.clusterId,
×
867
               pMnode->clusterId);
868
        terrno = TSDB_CODE_MND_INVALID_CLUSTER_ID;
×
869
        goto _OVER;
×
870
      }
871
    }
872

873
    // Verify whether the cluster parameters are consistent when status change from offline to ready
874
    pDnode->offlineReason = mndCheckClusterCfgPara(pMnode, pDnode, &statusReq.clusterCfg);
3,993✔
875
    if (pDnode->offlineReason != 0) {
3,993!
876
      mError("dnode:%d, cluster cfg inconsistent since:%s", pDnode->id, offlineReason[pDnode->offlineReason]);
×
877
      if (terrno == 0) terrno = TSDB_CODE_MND_INVALID_CLUSTER_CFG;
×
878
      goto _OVER;
×
879
    }
880

881
    if (!online) {
3,993✔
882
      mInfo("dnode:%d, from offline to online, memory avail:%" PRId64 " total:%" PRId64 " cores:%.2f", pDnode->id,
2,405!
883
            statusReq.memAvail, statusReq.memTotal, statusReq.numOfCores);
884
    } else {
885
      mInfo("dnode:%d, send dnode epset, online:%d dnodeVer:%" PRId64 ":%" PRId64 " reboot:%d", pDnode->id, online,
1,588!
886
            statusReq.dnodeVer, dnodeVer, reboot);
887
    }
888

889
    pDnode->rebootTime = statusReq.rebootTime;
3,993✔
890
    pDnode->numOfCores = statusReq.numOfCores;
3,993✔
891
    pDnode->numOfSupportVnodes = statusReq.numOfSupportVnodes;
3,993✔
892
    pDnode->numOfDiskCfg = statusReq.numOfDiskCfg;
3,993✔
893
    pDnode->memAvail = statusReq.memAvail;
3,993✔
894
    pDnode->memTotal = statusReq.memTotal;
3,993✔
895
    pDnode->encryptionKeyStat = statusReq.clusterCfg.encryptionKeyStat;
3,993✔
896
    pDnode->encryptionKeyChksum = statusReq.clusterCfg.encryptionKeyChksum;
3,993✔
897
    if (memcmp(pDnode->machineId, statusReq.machineId, TSDB_MACHINE_ID_LEN) != 0) {
3,993✔
898
      tstrncpy(pDnode->machineId, statusReq.machineId, TSDB_MACHINE_ID_LEN + 1);
468✔
899
      if ((terrno = mndUpdateDnodeObj(pMnode, pDnode)) != 0) {
468!
900
        goto _OVER;
×
901
      }
902
    }
903

904
    SStatusRsp statusRsp = {0};
3,993✔
905
    statusRsp.statusSeq++;
3,993✔
906
    statusRsp.analVer = analVer;
3,993✔
907
    statusRsp.dnodeVer = dnodeVer;
3,993✔
908
    statusRsp.dnodeCfg.dnodeId = pDnode->id;
3,993✔
909
    statusRsp.dnodeCfg.clusterId = pMnode->clusterId;
3,993✔
910
    statusRsp.pDnodeEps = taosArrayInit(mndGetDnodeSize(pMnode), sizeof(SDnodeEp));
3,993✔
911
    if (statusRsp.pDnodeEps == NULL) {
3,993!
912
      terrno = TSDB_CODE_OUT_OF_MEMORY;
×
913
      goto _OVER;
×
914
    }
915

916
    mndGetDnodeEps(pMnode, statusRsp.pDnodeEps);
3,993✔
917
    statusRsp.ipWhiteVer = pMnode->ipWhiteVer;
3,993✔
918

919
    int32_t contLen = tSerializeSStatusRsp(NULL, 0, &statusRsp);
3,993✔
920
    void   *pHead = rpcMallocCont(contLen);
3,993✔
921
    contLen = tSerializeSStatusRsp(pHead, contLen, &statusRsp);
3,993✔
922
    taosArrayDestroy(statusRsp.pDnodeEps);
3,993✔
923
    if (contLen < 0) {
3,993!
924
      code = contLen;
×
925
      goto _OVER;
×
926
    }
927

928
    pReq->info.rspLen = contLen;
3,993✔
929
    pReq->info.rsp = pHead;
3,993✔
930
  }
931

932
  pDnode->accessTimes++;
108,955✔
933
  pDnode->lastAccessTime = curMs;
108,955✔
934
  code = 0;
108,955✔
935

936
_OVER:
109,129✔
937
  mndReleaseDnode(pMnode, pDnode);
109,129✔
938
  taosArrayDestroy(statusReq.pVloads);
109,129✔
939
  return mndUpdClusterInfo(pReq);
109,129✔
940
}
941

942
static int32_t mndProcessNotifyReq(SRpcMsg *pReq) {
×
943
  SMnode    *pMnode = pReq->info.node;
×
944
  SNotifyReq notifyReq = {0};
×
945
  int32_t    code = 0;
×
946

947
  if ((code = tDeserializeSNotifyReq(pReq->pCont, pReq->contLen, &notifyReq)) != 0) {
×
948
    terrno = code;
×
949
    goto _OVER;
×
950
  }
951

952
  int64_t clusterid = mndGetClusterId(pMnode);
×
953
  if (notifyReq.clusterId != 0 && notifyReq.clusterId != clusterid) {
×
954
    code = TSDB_CODE_MND_DNODE_DIFF_CLUSTER;
×
955
    mWarn("dnode:%d, its clusterid:%" PRId64 " differ from current cluster:%" PRId64 " since %s", notifyReq.dnodeId,
×
956
          notifyReq.clusterId, clusterid, tstrerror(code));
957
    goto _OVER;
×
958
  }
959

960
  int32_t nVgroup = taosArrayGetSize(notifyReq.pVloads);
×
961
  for (int32_t v = 0; v < nVgroup; ++v) {
×
962
    SVnodeLoadLite *pVload = taosArrayGet(notifyReq.pVloads, v);
×
963

964
    SVgObj *pVgroup = mndAcquireVgroup(pMnode, pVload->vgId);
×
965
    if (pVgroup != NULL) {
×
966
      pVgroup->numOfTimeSeries = pVload->nTimeSeries;
×
967
      mndReleaseVgroup(pMnode, pVgroup);
×
968
    }
969
  }
970
  code = mndUpdClusterInfo(pReq);
×
971
_OVER:
×
972
  tFreeSNotifyReq(&notifyReq);
×
973
  return code;
×
974
}
975

976
static int32_t mndCreateDnode(SMnode *pMnode, SRpcMsg *pReq, SCreateDnodeReq *pCreate) {
470✔
977
  int32_t  code = -1;
470✔
978
  SSdbRaw *pRaw = NULL;
470✔
979
  STrans  *pTrans = NULL;
470✔
980

981
  SDnodeObj dnodeObj = {0};
470✔
982
  dnodeObj.id = sdbGetMaxId(pMnode->pSdb, SDB_DNODE);
470✔
983
  dnodeObj.createdTime = taosGetTimestampMs();
470✔
984
  dnodeObj.updateTime = dnodeObj.createdTime;
470✔
985
  dnodeObj.port = pCreate->port;
470✔
986
  tstrncpy(dnodeObj.fqdn, pCreate->fqdn, TSDB_FQDN_LEN);
470✔
987
  (void)snprintf(dnodeObj.ep, TSDB_EP_LEN - 1, "%s:%u", pCreate->fqdn, pCreate->port);
470✔
988

989
  pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_GLOBAL, pReq, "create-dnode");
470✔
990
  if (pTrans == NULL) {
470!
991
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
992
    if (terrno != 0) code = terrno;
×
993
    goto _OVER;
×
994
  }
995
  mInfo("trans:%d, used to create dnode:%s", pTrans->id, dnodeObj.ep);
470!
996
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
470!
997

998
  pRaw = mndDnodeActionEncode(&dnodeObj);
470✔
999
  if (pRaw == NULL) {
470!
1000
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1001
    if (terrno != 0) code = terrno;
×
1002
    goto _OVER;
×
1003
  }
1004
  TAOS_CHECK_GOTO(mndTransAppendCommitlog(pTrans, pRaw), NULL, _OVER);
470!
1005
  TAOS_CHECK_GOTO(sdbSetRawStatus(pRaw, SDB_STATUS_READY), NULL, _OVER);
470!
1006
  pRaw = NULL;
470✔
1007

1008
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
470!
1009
  code = 0;
470✔
1010

1011
  (void)mndUpdateIpWhiteForAllUser(pMnode, TSDB_DEFAULT_USER, dnodeObj.fqdn, IP_WHITE_ADD,
470✔
1012
                                   1);  // TODO: check the return value
1013
_OVER:
470✔
1014
  mndTransDrop(pTrans);
470✔
1015
  sdbFreeRaw(pRaw);
470✔
1016
  return code;
470✔
1017
}
1018

1019
static int32_t mndProcessDnodeListReq(SRpcMsg *pReq) {
7,686✔
1020
  SMnode       *pMnode = pReq->info.node;
7,686✔
1021
  SSdb         *pSdb = pMnode->pSdb;
7,686✔
1022
  SDnodeObj    *pObj = NULL;
7,686✔
1023
  void         *pIter = NULL;
7,686✔
1024
  SDnodeListRsp rsp = {0};
7,686✔
1025
  int32_t       code = -1;
7,686✔
1026

1027
  rsp.dnodeList = taosArrayInit(5, sizeof(SEpSet));
7,686✔
1028
  if (NULL == rsp.dnodeList) {
7,686!
1029
    mError("failed to alloc epSet while process dnode list req");
×
1030
    code = terrno;
×
1031
    goto _OVER;
×
1032
  }
1033

1034
  while (1) {
8,320✔
1035
    pIter = sdbFetch(pSdb, SDB_DNODE, pIter, (void **)&pObj);
16,006✔
1036
    if (pIter == NULL) break;
16,006✔
1037

1038
    SEpSet epSet = {0};
8,320✔
1039
    epSet.numOfEps = 1;
8,320✔
1040
    tstrncpy(epSet.eps[0].fqdn, pObj->fqdn, TSDB_FQDN_LEN);
8,320✔
1041
    epSet.eps[0].port = pObj->port;
8,320✔
1042

1043
    if (taosArrayPush(rsp.dnodeList, &epSet) == NULL) {
16,640!
1044
      if (terrno != 0) code = terrno;
×
1045
      sdbRelease(pSdb, pObj);
×
1046
      sdbCancelFetch(pSdb, pIter);
×
1047
      goto _OVER;
×
1048
    }
1049

1050
    sdbRelease(pSdb, pObj);
8,320✔
1051
  }
1052

1053
  int32_t rspLen = tSerializeSDnodeListRsp(NULL, 0, &rsp);
7,686✔
1054
  void   *pRsp = rpcMallocCont(rspLen);
7,686✔
1055
  if (pRsp == NULL) {
7,686!
1056
    code = terrno;
×
1057
    goto _OVER;
×
1058
  }
1059

1060
  if ((rspLen = tSerializeSDnodeListRsp(pRsp, rspLen, &rsp)) <= 0) {
7,686!
1061
    code = rspLen;
×
1062
    goto _OVER;
×
1063
  }
1064

1065
  pReq->info.rspLen = rspLen;
7,686✔
1066
  pReq->info.rsp = pRsp;
7,686✔
1067
  code = 0;
7,686✔
1068

1069
_OVER:
7,686✔
1070

1071
  if (code != 0) {
7,686!
1072
    mError("failed to get dnode list since %s", tstrerror(code));
×
1073
  }
1074

1075
  tFreeSDnodeListRsp(&rsp);
7,686✔
1076

1077
  TAOS_RETURN(code);
7,686✔
1078
}
1079

1080
void getSlowLogScopeString(int32_t scope, char *result) {
1,446✔
1081
  if (scope == SLOW_LOG_TYPE_NULL) {
1,446!
1082
    (void)strncat(result, "NONE", 64);
×
1083
    return;
×
1084
  }
1085
  while (scope > 0) {
5,772✔
1086
    if (scope & SLOW_LOG_TYPE_QUERY) {
4,323✔
1087
      (void)strncat(result, "QUERY", 64);
1,446✔
1088
      scope &= ~SLOW_LOG_TYPE_QUERY;
1,446✔
1089
    } else if (scope & SLOW_LOG_TYPE_INSERT) {
2,877✔
1090
      (void)strncat(result, "INSERT", 64);
1,440✔
1091
      scope &= ~SLOW_LOG_TYPE_INSERT;
1,440✔
1092
    } else if (scope & SLOW_LOG_TYPE_OTHERS) {
1,437!
1093
      (void)strncat(result, "OTHERS", 64);
1,440✔
1094
      scope &= ~SLOW_LOG_TYPE_OTHERS;
1,440✔
1095
    } else {
1096
      (void)printf("invalid slow log scope:%d", scope);
×
1097
      return;
×
1098
    }
1099

1100
    if (scope > 0) {
4,326✔
1101
      (void)strncat(result, "|", 64);
2,875✔
1102
    }
1103
  }
1104
}
1105

1106
static int32_t mndProcessCreateDnodeReq(SRpcMsg *pReq) {
471✔
1107
  SMnode         *pMnode = pReq->info.node;
471✔
1108
  int32_t         code = -1;
471✔
1109
  SDnodeObj      *pDnode = NULL;
471✔
1110
  SCreateDnodeReq createReq = {0};
471✔
1111

1112
  if ((code = grantCheck(TSDB_GRANT_DNODE)) != 0 || (code = grantCheck(TSDB_GRANT_CPU_CORES)) != 0) {
471!
1113
    goto _OVER;
×
1114
  }
1115

1116
  TAOS_CHECK_GOTO(tDeserializeSCreateDnodeReq(pReq->pCont, pReq->contLen, &createReq), NULL, _OVER);
471!
1117

1118
  mInfo("dnode:%s:%d, start to create", createReq.fqdn, createReq.port);
471!
1119
  TAOS_CHECK_GOTO(mndCheckOperPrivilege(pMnode, pReq->info.conn.user, MND_OPER_CREATE_DNODE), NULL, _OVER);
471✔
1120

1121
  if (createReq.fqdn[0] == 0 || createReq.port <= 0 || createReq.port > UINT16_MAX) {
470!
1122
    code = TSDB_CODE_MND_INVALID_DNODE_EP;
×
1123
    goto _OVER;
×
1124
  }
1125

1126
  char ep[TSDB_EP_LEN];
1127
  (void)snprintf(ep, TSDB_EP_LEN, "%s:%d", createReq.fqdn, createReq.port);
470✔
1128
  pDnode = mndAcquireDnodeByEp(pMnode, ep);
470✔
1129
  if (pDnode != NULL) {
470!
1130
    code = TSDB_CODE_MND_DNODE_ALREADY_EXIST;
×
1131
    goto _OVER;
×
1132
  }
1133

1134
  code = mndCreateDnode(pMnode, pReq, &createReq);
470✔
1135
  if (code == 0) {
470!
1136
    code = TSDB_CODE_ACTION_IN_PROGRESS;
470✔
1137
    tsGrantHBInterval = 5;
470✔
1138
  }
1139

1140
  char obj[200] = {0};
470✔
1141
  (void)tsnprintf(obj, sizeof(obj), "%s:%d", createReq.fqdn, createReq.port);
470✔
1142

1143
  auditRecord(pReq, pMnode->clusterId, "createDnode", "", obj, createReq.sql, createReq.sqlLen);
470✔
1144

1145
_OVER:
471✔
1146
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
471!
1147
    mError("dnode:%s:%d, failed to create since %s", createReq.fqdn, createReq.port, tstrerror(code));
1!
1148
  }
1149

1150
  mndReleaseDnode(pMnode, pDnode);
471✔
1151
  tFreeSCreateDnodeReq(&createReq);
471✔
1152
  TAOS_RETURN(code);
471✔
1153
}
1154

1155
extern int32_t mndProcessRestoreDnodeReqImpl(SRpcMsg *pReq);
1156

1157
int32_t mndProcessRestoreDnodeReq(SRpcMsg *pReq) { return mndProcessRestoreDnodeReqImpl(pReq); }
8✔
1158

1159
#ifndef TD_ENTERPRISE
1160
int32_t mndProcessRestoreDnodeReqImpl(SRpcMsg *pReq) { return 0; }
1161
#endif
1162

1163
static int32_t mndDropDnode(SMnode *pMnode, SRpcMsg *pReq, SDnodeObj *pDnode, SMnodeObj *pMObj, SQnodeObj *pQObj,
23✔
1164
                            SSnodeObj *pSObj, int32_t numOfVnodes, bool force, bool unsafe) {
1165
  int32_t  code = -1;
23✔
1166
  SSdbRaw *pRaw = NULL;
23✔
1167
  STrans  *pTrans = NULL;
23✔
1168

1169
  pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, pReq, "drop-dnode");
23✔
1170
  if (pTrans == NULL) {
23!
1171
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1172
    if (terrno != 0) code = terrno;
×
1173
    goto _OVER;
×
1174
  }
1175
  mndTransSetSerial(pTrans);
23✔
1176
  mInfo("trans:%d, used to drop dnode:%d, force:%d", pTrans->id, pDnode->id, force);
23!
1177
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
23!
1178

1179
  pRaw = mndDnodeActionEncode(pDnode);
23✔
1180
  if (pRaw == NULL) {
23!
1181
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1182
    if (terrno != 0) code = terrno;
×
1183
    goto _OVER;
×
1184
  }
1185
  TAOS_CHECK_GOTO(mndTransAppendRedolog(pTrans, pRaw), NULL, _OVER);
23!
1186
  TAOS_CHECK_GOTO(sdbSetRawStatus(pRaw, SDB_STATUS_DROPPING), NULL, _OVER);
23!
1187
  pRaw = NULL;
23✔
1188

1189
  pRaw = mndDnodeActionEncode(pDnode);
23✔
1190
  if (pRaw == NULL) {
23!
1191
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1192
    if (terrno != 0) code = terrno;
×
1193
    goto _OVER;
×
1194
  }
1195
  TAOS_CHECK_GOTO(mndTransAppendCommitlog(pTrans, pRaw), NULL, _OVER);
23!
1196
  TAOS_CHECK_GOTO(sdbSetRawStatus(pRaw, SDB_STATUS_DROPPED), NULL, _OVER);
23!
1197
  pRaw = NULL;
23✔
1198

1199
  if (pMObj != NULL) {
23✔
1200
    mInfo("trans:%d, mnode on dnode:%d will be dropped", pTrans->id, pDnode->id);
4!
1201
    TAOS_CHECK_GOTO(mndSetDropMnodeInfoToTrans(pMnode, pTrans, pMObj, force), NULL, _OVER);
4!
1202
  }
1203

1204
  if (pQObj != NULL) {
23✔
1205
    mInfo("trans:%d, qnode on dnode:%d will be dropped", pTrans->id, pDnode->id);
3!
1206
    TAOS_CHECK_GOTO(mndSetDropQnodeInfoToTrans(pMnode, pTrans, pQObj, force), NULL, _OVER);
3!
1207
  }
1208

1209
  if (pSObj != NULL) {
23✔
1210
    mInfo("trans:%d, snode on dnode:%d will be dropped", pTrans->id, pDnode->id);
3!
1211
    TAOS_CHECK_GOTO(mndSetDropSnodeInfoToTrans(pMnode, pTrans, pSObj, force), NULL, _OVER);
3!
1212
  }
1213

1214
  if (numOfVnodes > 0) {
23✔
1215
    mInfo("trans:%d, %d vnodes on dnode:%d will be dropped", pTrans->id, numOfVnodes, pDnode->id);
16!
1216
    TAOS_CHECK_GOTO(mndSetMoveVgroupsInfoToTrans(pMnode, pTrans, pDnode->id, force, unsafe), NULL, _OVER);
16✔
1217
  }
1218

1219
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
21!
1220

1221
  (void)mndUpdateIpWhiteForAllUser(pMnode, TSDB_DEFAULT_USER, pDnode->fqdn, IP_WHITE_DROP,
21✔
1222
                                   1);  // TODO: check the return value
1223
  code = 0;
21✔
1224

1225
_OVER:
23✔
1226
  mndTransDrop(pTrans);
23✔
1227
  sdbFreeRaw(pRaw);
23✔
1228
  TAOS_RETURN(code);
23✔
1229
}
1230

1231
static bool mndIsEmptyDnode(SMnode *pMnode, int32_t dnodeId) {
25✔
1232
  bool       isEmpty = false;
25✔
1233
  SMnodeObj *pMObj = NULL;
25✔
1234
  SQnodeObj *pQObj = NULL;
25✔
1235
  SSnodeObj *pSObj = NULL;
25✔
1236

1237
  pQObj = mndAcquireQnode(pMnode, dnodeId);
25✔
1238
  if (pQObj) goto _OVER;
25✔
1239

1240
  pSObj = mndAcquireSnode(pMnode, dnodeId);
21✔
1241
  if (pSObj) goto _OVER;
21!
1242

1243
  pMObj = mndAcquireMnode(pMnode, dnodeId);
21✔
1244
  if (pMObj) goto _OVER;
21✔
1245

1246
  int32_t numOfVnodes = mndGetVnodesNum(pMnode, dnodeId);
19✔
1247
  if (numOfVnodes > 0) goto _OVER;
19✔
1248

1249
  isEmpty = true;
4✔
1250
_OVER:
25✔
1251
  mndReleaseMnode(pMnode, pMObj);
25✔
1252
  mndReleaseQnode(pMnode, pQObj);
25✔
1253
  mndReleaseSnode(pMnode, pSObj);
25✔
1254
  return isEmpty;
25✔
1255
}
1256

1257
static int32_t mndProcessDropDnodeReq(SRpcMsg *pReq) {
31✔
1258
  SMnode       *pMnode = pReq->info.node;
31✔
1259
  int32_t       code = -1;
31✔
1260
  SDnodeObj    *pDnode = NULL;
31✔
1261
  SMnodeObj    *pMObj = NULL;
31✔
1262
  SQnodeObj    *pQObj = NULL;
31✔
1263
  SSnodeObj    *pSObj = NULL;
31✔
1264
  SDropDnodeReq dropReq = {0};
31✔
1265

1266
  TAOS_CHECK_GOTO(tDeserializeSDropDnodeReq(pReq->pCont, pReq->contLen, &dropReq), NULL, _OVER);
31!
1267

1268
  mInfo("dnode:%d, start to drop, ep:%s:%d, force:%s, unsafe:%s", dropReq.dnodeId, dropReq.fqdn, dropReq.port,
31!
1269
        dropReq.force ? "true" : "false", dropReq.unsafe ? "true" : "false");
1270
  TAOS_CHECK_GOTO(mndCheckOperPrivilege(pMnode, pReq->info.conn.user, MND_OPER_DROP_MNODE), NULL, _OVER);
31✔
1271

1272
  bool force = dropReq.force;
30✔
1273
  if (dropReq.unsafe) {
30✔
1274
    force = true;
1✔
1275
  }
1276

1277
  pDnode = mndAcquireDnode(pMnode, dropReq.dnodeId);
30✔
1278
  if (pDnode == NULL) {
30✔
1279
    int32_t err = terrno;
1✔
1280
    char    ep[TSDB_EP_LEN + 1] = {0};
1✔
1281
    (void)snprintf(ep, sizeof(ep), dropReq.fqdn, dropReq.port);
1✔
1282
    pDnode = mndAcquireDnodeByEp(pMnode, ep);
1✔
1283
    if (pDnode == NULL) {
1!
1284
      code = err;
1✔
1285
      goto _OVER;
1✔
1286
    }
1287
  }
1288

1289
  pQObj = mndAcquireQnode(pMnode, dropReq.dnodeId);
29✔
1290
  pSObj = mndAcquireSnode(pMnode, dropReq.dnodeId);
29✔
1291
  pMObj = mndAcquireMnode(pMnode, dropReq.dnodeId);
29✔
1292
  if (pMObj != NULL) {
29✔
1293
    if (sdbGetSize(pMnode->pSdb, SDB_MNODE) <= 1) {
9✔
1294
      code = TSDB_CODE_MND_TOO_FEW_MNODES;
2✔
1295
      goto _OVER;
2✔
1296
    }
1297
    if (pMnode->selfDnodeId == dropReq.dnodeId) {
7✔
1298
      code = TSDB_CODE_MND_CANT_DROP_LEADER;
2✔
1299
      goto _OVER;
2✔
1300
    }
1301
  }
1302

1303
  int32_t numOfVnodes = mndGetVnodesNum(pMnode, pDnode->id);
25✔
1304
  bool    isonline = mndIsDnodeOnline(pDnode, taosGetTimestampMs());
25✔
1305

1306
  if (isonline && force) {
25!
1307
    code = TSDB_CODE_DNODE_ONLY_USE_WHEN_OFFLINE;
×
1308
    mError("dnode:%d, failed to drop since %s, vnodes:%d mnode:%d qnode:%d snode:%d", pDnode->id, tstrerror(code),
×
1309
           numOfVnodes, pMObj != NULL, pQObj != NULL, pSObj != NULL);
1310
    goto _OVER;
×
1311
  }
1312

1313
  bool isEmpty = mndIsEmptyDnode(pMnode, pDnode->id);
25✔
1314
  if (!isonline && !force && !isEmpty) {
25!
1315
    code = TSDB_CODE_DNODE_OFFLINE;
2✔
1316
    mError("dnode:%d, failed to drop since %s, vnodes:%d mnode:%d qnode:%d snode:%d", pDnode->id, tstrerror(code),
2!
1317
           numOfVnodes, pMObj != NULL, pQObj != NULL, pSObj != NULL);
1318
    goto _OVER;
2✔
1319
  }
1320

1321
  code = mndDropDnode(pMnode, pReq, pDnode, pMObj, pQObj, pSObj, numOfVnodes, force, dropReq.unsafe);
23✔
1322
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
23✔
1323

1324
  char obj1[30] = {0};
23✔
1325
  (void)tsnprintf(obj1, sizeof(obj1), "%d", dropReq.dnodeId);
23✔
1326

1327
  auditRecord(pReq, pMnode->clusterId, "dropDnode", "", obj1, dropReq.sql, dropReq.sqlLen);
23✔
1328

1329
_OVER:
31✔
1330
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
31!
1331
    mError("dnode:%d, failed to drop since %s", dropReq.dnodeId, tstrerror(code));
10!
1332
  }
1333

1334
  mndReleaseDnode(pMnode, pDnode);
31✔
1335
  mndReleaseMnode(pMnode, pMObj);
31✔
1336
  mndReleaseQnode(pMnode, pQObj);
31✔
1337
  mndReleaseSnode(pMnode, pSObj);
31✔
1338
  tFreeSDropDnodeReq(&dropReq);
31✔
1339
  TAOS_RETURN(code);
31✔
1340
}
1341

1342
static int32_t mndProcessCreateEncryptKeyReqImpl(SRpcMsg *pReq, int32_t dnodeId, SDCfgDnodeReq *pDcfgReq) {
×
1343
  int32_t code = 0;
×
1344
  SMnode *pMnode = pReq->info.node;
×
1345
  SSdb   *pSdb = pMnode->pSdb;
×
1346
  void   *pIter = NULL;
×
1347
  int8_t  encrypting = 0;
×
1348

1349
  const STraceId *trace = &pReq->info.traceId;
×
1350

1351
  int32_t klen = strlen(pDcfgReq->value);
×
1352
  if (klen > ENCRYPT_KEY_LEN || klen < ENCRYPT_KEY_LEN_MIN) {
×
1353
    code = TSDB_CODE_DNODE_INVALID_ENCRYPT_KLEN;
×
1354
    mGError("msg:%p, failed to create encrypt_key since invalid key length:%d, valid range:[%d, %d]", pReq, klen,
×
1355
            ENCRYPT_KEY_LEN_MIN, ENCRYPT_KEY_LEN);
1356
    goto _exit;
×
1357
  }
1358

1359
  if (0 != (encrypting = atomic_val_compare_exchange_8(&pMnode->encryptMgmt.encrypting, 0, 1))) {
×
1360
    code = TSDB_CODE_QRY_DUPLICATED_OPERATION;
×
1361
    mGWarn("msg:%p, failed to create encrypt key since %s, encrypting:%" PRIi8, pReq, tstrerror(code), encrypting);
×
1362
    goto _exit;
×
1363
  }
1364

1365
  if (tsEncryptionKeyStat == ENCRYPT_KEY_STAT_SET || tsEncryptionKeyStat == ENCRYPT_KEY_STAT_LOADED) {
×
1366
    atomic_store_8(&pMnode->encryptMgmt.encrypting, 0);
×
1367
    code = TSDB_CODE_QRY_DUPLICATED_OPERATION;
×
1368
    mGWarn("msg:%p, failed to create encrypt key since %s, stat:%" PRIi8 ", checksum:%u", pReq, tstrerror(code),
×
1369
           tsEncryptionKeyStat, tsEncryptionKeyChksum);
1370
    goto _exit;
×
1371
  }
1372

1373
  atomic_store_16(&pMnode->encryptMgmt.nEncrypt, 0);
×
1374
  atomic_store_16(&pMnode->encryptMgmt.nSuccess, 0);
×
1375
  atomic_store_16(&pMnode->encryptMgmt.nFailed, 0);
×
1376

1377
  while (1) {
×
1378
    SDnodeObj *pDnode = NULL;
×
1379
    pIter = sdbFetch(pSdb, SDB_DNODE, pIter, (void **)&pDnode);
×
1380
    if (pIter == NULL) break;
×
1381
    if (pDnode->offlineReason != DND_REASON_ONLINE) {
×
1382
      mGWarn("msg:%p, don't send create encrypt_key req since dnode:%d in offline state:%s", pReq, pDnode->id,
×
1383
             offlineReason[pDnode->offlineReason]);
1384
      sdbRelease(pSdb, pDnode);
×
1385
      continue;
×
1386
    }
1387

1388
    if (dnodeId == -1 || pDnode->id == dnodeId || dnodeId == 0) {
×
1389
      SEpSet  epSet = mndGetDnodeEpset(pDnode);
×
1390
      int32_t bufLen = tSerializeSDCfgDnodeReq(NULL, 0, pDcfgReq);
×
1391
      void   *pBuf = rpcMallocCont(bufLen);
×
1392

1393
      if (pBuf != NULL) {
×
1394
        if ((bufLen = tSerializeSDCfgDnodeReq(pBuf, bufLen, pDcfgReq)) <= 0) {
×
1395
          code = bufLen;
×
1396
          sdbRelease(pSdb, pDnode);
×
1397
          goto _exit;
×
1398
        }
1399
        SRpcMsg rpcMsg = {.msgType = TDMT_DND_CREATE_ENCRYPT_KEY, .pCont = pBuf, .contLen = bufLen};
×
1400
        if (0 == tmsgSendReq(&epSet, &rpcMsg)) {
×
1401
          (void)atomic_add_fetch_16(&pMnode->encryptMgmt.nEncrypt, 1);
×
1402
        }
1403
      }
1404
    }
1405

1406
    sdbRelease(pSdb, pDnode);
×
1407
  }
1408

1409
  if (atomic_load_16(&pMnode->encryptMgmt.nEncrypt) <= 0) {
×
1410
    atomic_store_8(&pMnode->encryptMgmt.encrypting, 0);
×
1411
  }
1412

1413
_exit:
×
1414
  if (code != 0) {
×
1415
    if (terrno == 0) terrno = code;
×
1416
  }
1417
  return code;
×
1418
}
1419

1420
static int32_t mndProcessCreateEncryptKeyReq(SRpcMsg *pReq) {
×
1421
  int32_t code = 0;
×
1422

1423
#ifdef TD_ENTERPRISE
1424
  SMnode       *pMnode = pReq->info.node;
×
1425
  SMCfgDnodeReq cfgReq = {0};
×
1426
  TAOS_CHECK_RETURN(tDeserializeSMCfgDnodeReq(pReq->pCont, pReq->contLen, &cfgReq));
×
1427

1428
  if ((code = mndCheckOperPrivilege(pMnode, pReq->info.conn.user, MND_OPER_CONFIG_DNODE)) != 0) {
×
1429
    tFreeSMCfgDnodeReq(&cfgReq);
×
1430
    TAOS_RETURN(code);
×
1431
  }
1432
  const STraceId *trace = &pReq->info.traceId;
×
1433
  SDCfgDnodeReq   dcfgReq = {0};
×
1434
  if (strncasecmp(cfgReq.config, "encrypt_key", 12) == 0) {
×
1435
    tstrncpy(dcfgReq.config, cfgReq.config, sizeof(dcfgReq.config));
×
1436
    tstrncpy(dcfgReq.value, cfgReq.value, sizeof(dcfgReq.value));
×
1437
    tFreeSMCfgDnodeReq(&cfgReq);
×
1438
    return mndProcessCreateEncryptKeyReqImpl(pReq, cfgReq.dnodeId, &dcfgReq);
×
1439
  } else {
1440
    code = TSDB_CODE_PAR_INTERNAL_ERROR;
×
1441
    tFreeSMCfgDnodeReq(&cfgReq);
×
1442
    TAOS_RETURN(code);
×
1443
  }
1444

1445
#else
1446
  TAOS_RETURN(code);
1447
#endif
1448
}
1449

1450
static int32_t mndProcessCreateEncryptKeyRsp(SRpcMsg *pRsp) {
×
1451
  SMnode *pMnode = pRsp->info.node;
×
1452
  int16_t nSuccess = 0;
×
1453
  int16_t nFailed = 0;
×
1454

1455
  if (0 == pRsp->code) {
×
1456
    nSuccess = atomic_add_fetch_16(&pMnode->encryptMgmt.nSuccess, 1);
×
1457
  } else {
1458
    nFailed = atomic_add_fetch_16(&pMnode->encryptMgmt.nFailed, 1);
×
1459
  }
1460

1461
  int16_t nReq = atomic_load_16(&pMnode->encryptMgmt.nEncrypt);
×
1462
  bool    finished = nSuccess + nFailed >= nReq;
×
1463

1464
  if (finished) {
×
1465
    atomic_store_8(&pMnode->encryptMgmt.encrypting, 0);
×
1466
  }
1467

1468
  const STraceId *trace = &pRsp->info.traceId;
×
1469
  mGInfo("msg:%p, create encrypt key rsp, nReq:%" PRIi16 ", nSucess:%" PRIi16 ", nFailed:%" PRIi16 ", %s", pRsp, nReq,
×
1470
         nSuccess, nFailed, finished ? "encrypt done" : "in encrypting");
1471

1472
  return 0;
×
1473
}
1474

1475
static int32_t mndRetrieveConfigs(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
1,443✔
1476
  SMnode *pMnode = pReq->info.node;
1,443✔
1477
  int32_t totalRows = 0;
1,443✔
1478
  int32_t numOfRows = 0;
1,443✔
1479
  char   *cfgOpts[TSDB_CONFIG_NUMBER] = {0};
1,443✔
1480
  char    cfgVals[TSDB_CONFIG_NUMBER][TSDB_CONFIG_VALUE_LEN + 1] = {0};
1,443✔
1481
  char   *pWrite = NULL;
1,443✔
1482
  int32_t cols = 0;
1,443✔
1483
  int32_t code = 0;
1,443✔
1484
  int32_t lino = 0;
1,443✔
1485

1486
  cfgOpts[totalRows] = "statusInterval";
1,443✔
1487
  (void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%d", tsStatusInterval);
1,443✔
1488
  totalRows++;
1,443✔
1489

1490
  cfgOpts[totalRows] = "timezone";
1,443✔
1491
  (void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%s", tsTimezoneStr);
1,443✔
1492
  totalRows++;
1,443✔
1493

1494
  cfgOpts[totalRows] = "locale";
1,443✔
1495
  (void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%s", tsLocale);
1,443✔
1496
  totalRows++;
1,443✔
1497

1498
  cfgOpts[totalRows] = "charset";
1,443✔
1499
  (void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%s", tsCharset);
1,443✔
1500
  totalRows++;
1,443✔
1501

1502
  cfgOpts[totalRows] = "monitor";
1,443✔
1503
  (void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%d", tsEnableMonitor);
1,443✔
1504
  totalRows++;
1,443✔
1505

1506
  cfgOpts[totalRows] = "monitorInterval";
1,443✔
1507
  (void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%d", tsMonitorInterval);
1,443✔
1508
  totalRows++;
1,443✔
1509

1510
  cfgOpts[totalRows] = "slowLogThreshold";
1,443✔
1511
  (void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%d", tsSlowLogThreshold);
1,443✔
1512
  totalRows++;
1,443✔
1513

1514
  cfgOpts[totalRows] = "slowLogMaxLen";
1,443✔
1515
  (void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%d", tsSlowLogMaxLen);
1,443✔
1516
  totalRows++;
1,443✔
1517

1518
  char scopeStr[64] = {0};
1,443✔
1519
  getSlowLogScopeString(tsSlowLogScope, scopeStr);
1,443✔
1520
  cfgOpts[totalRows] = "slowLogScope";
1,446✔
1521
  (void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%s", scopeStr);
1,446✔
1522
  totalRows++;
1,446✔
1523

1524
  char buf[TSDB_CONFIG_OPTION_LEN + VARSTR_HEADER_SIZE] = {0};
1,446✔
1525
  char bufVal[TSDB_CONFIG_VALUE_LEN + VARSTR_HEADER_SIZE] = {0};
1,446✔
1526

1527
  for (int32_t i = 0; i < totalRows; i++) {
14,206✔
1528
    cols = 0;
12,799✔
1529

1530
    STR_WITH_MAXSIZE_TO_VARSTR(buf, cfgOpts[i], TSDB_CONFIG_OPTION_LEN);
12,799✔
1531
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
12,799✔
1532
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)buf, false), &lino, _OVER);
12,814!
1533

1534
    STR_WITH_MAXSIZE_TO_VARSTR(bufVal, cfgVals[i], TSDB_CONFIG_VALUE_LEN);
12,827✔
1535
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
12,827✔
1536
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)bufVal, false), &lino, _OVER);
12,827!
1537

1538
    numOfRows++;
12,760✔
1539
  }
1540

1541
_OVER:
1,407✔
1542
  if (code != 0) mError("failed to retrieve configs at line:%d since %s", lino, tstrerror(code));
1,407!
1543
  pShow->numOfRows += numOfRows;
1,444✔
1544
  return numOfRows;
1,444✔
1545
}
1546

1547
static void mndCancelGetNextConfig(SMnode *pMnode, void *pIter) {}
×
1548

1549
static int32_t mndRetrieveDnodes(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
7,333✔
1550
  SMnode    *pMnode = pReq->info.node;
7,333✔
1551
  SSdb      *pSdb = pMnode->pSdb;
7,333✔
1552
  int32_t    numOfRows = 0;
7,333✔
1553
  int32_t    cols = 0;
7,333✔
1554
  ESdbStatus objStatus = 0;
7,333✔
1555
  SDnodeObj *pDnode = NULL;
7,333✔
1556
  int64_t    curMs = taosGetTimestampMs();
7,334✔
1557
  char       buf[TSDB_EP_LEN + VARSTR_HEADER_SIZE];
1558
  int32_t    code = 0;
7,334✔
1559
  int32_t    lino = 0;
7,334✔
1560

1561
  while (numOfRows < rows) {
17,095✔
1562
    pShow->pIter = sdbFetchAll(pSdb, SDB_DNODE, pShow->pIter, (void **)&pDnode, &objStatus, true);
17,093✔
1563
    if (pShow->pIter == NULL) break;
17,104✔
1564
    bool online = mndIsDnodeOnline(pDnode, curMs);
9,760✔
1565

1566
    cols = 0;
9,749✔
1567

1568
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
9,749✔
1569
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pDnode->id, false), pDnode, &lino, _OVER);
9,745!
1570

1571
    STR_WITH_MAXSIZE_TO_VARSTR(buf, pDnode->ep, pShow->pMeta->pSchemas[cols].bytes);
9,743✔
1572

1573
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
9,743✔
1574
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, buf, false), pDnode, &lino, _OVER);
9,743!
1575

1576
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
9,744✔
1577
    int16_t id = mndGetVnodesNum(pMnode, pDnode->id);
9,737✔
1578
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&id, false), pDnode, &lino, _OVER);
9,760!
1579

1580
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
9,754✔
1581
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pDnode->numOfSupportVnodes, false), pDnode,
9,745!
1582
                        &lino, _OVER);
1583

1584
    const char *status = "ready";
9,746✔
1585
    if (objStatus == SDB_STATUS_CREATING) status = "creating";
9,746!
1586
    if (objStatus == SDB_STATUS_DROPPING) status = "dropping";
9,746!
1587
    if (!online) {
9,746✔
1588
      if (objStatus == SDB_STATUS_CREATING)
476!
1589
        status = "creating*";
×
1590
      else if (objStatus == SDB_STATUS_DROPPING)
476!
1591
        status = "dropping*";
×
1592
      else
1593
        status = "offline";
476✔
1594
    }
1595

1596
    STR_TO_VARSTR(buf, status);
9,746✔
1597
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
9,746✔
1598
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, buf, false), pDnode, &lino, _OVER);
9,742!
1599

1600
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
9,745✔
1601
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pDnode->createdTime, false), pDnode, &lino,
9,741!
1602
                        _OVER);
1603

1604
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
9,737✔
1605
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pDnode->rebootTime, false), pDnode, &lino,
9,738!
1606
                        _OVER);
1607

1608
    char *b = taosMemoryCalloc(VARSTR_HEADER_SIZE + strlen(offlineReason[pDnode->offlineReason]) + 1, 1);
9,739!
1609
    STR_TO_VARSTR(b, online ? "" : offlineReason[pDnode->offlineReason]);
9,757✔
1610

1611
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
9,757✔
1612
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, b, false), pDnode, &lino, _OVER);
9,752!
1613
    taosMemoryFreeClear(b);
9,749!
1614

1615
#ifdef TD_ENTERPRISE
1616
    STR_TO_VARSTR(buf, pDnode->machineId);
9,754✔
1617
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
9,754✔
1618
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, buf, false), pDnode, &lino, _OVER);
9,750!
1619
#endif
1620

1621
    numOfRows++;
9,747✔
1622
    sdbRelease(pSdb, pDnode);
9,747✔
1623
  }
1624

1625
_OVER:
2✔
1626
  if (code != 0) mError("failed to retrieve dnodes at line:%d since %s", lino, tstrerror(code));
7,346!
1627

1628
  pShow->numOfRows += numOfRows;
7,344✔
1629
  return numOfRows;
7,344✔
1630
}
1631

1632
static void mndCancelGetNextDnode(SMnode *pMnode, void *pIter) {
×
1633
  SSdb *pSdb = pMnode->pSdb;
×
1634
  sdbCancelFetchByType(pSdb, pIter, SDB_DNODE);
×
1635
}
×
1636

1637
SArray *mndGetAllDnodeFqdns(SMnode *pMnode) {
2,301✔
1638
  SDnodeObj *pObj = NULL;
2,301✔
1639
  void      *pIter = NULL;
2,301✔
1640
  SSdb      *pSdb = pMnode->pSdb;
2,301✔
1641
  SArray    *fqdns = taosArrayInit(4, sizeof(void *));
2,301✔
1642
  while (1) {
2,089✔
1643
    pIter = sdbFetch(pSdb, SDB_DNODE, pIter, (void **)&pObj);
4,390✔
1644
    if (pIter == NULL) break;
4,390✔
1645

1646
    char *fqdn = taosStrdup(pObj->fqdn);
2,089!
1647
    if (taosArrayPush(fqdns, &fqdn) == NULL) {
2,089!
1648
      mError("failed to fqdn into array, but continue at this time");
×
1649
    }
1650
    sdbRelease(pSdb, pObj);
2,089✔
1651
  }
1652
  return fqdns;
2,301✔
1653
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc