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

taosdata / TDengine / #4180

27 May 2025 10:49AM UTC coverage: 63.267% (+0.4%) from 62.885%
#4180

push

travis-ci

web-flow
TD-35056 (#31227)

158426 of 318644 branches covered (49.72%)

Branch coverage included in aggregate %.

243945 of 317346 relevant lines covered (76.87%)

18276423.81 hits per line

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

68.95
/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) {
2,282✔
104
  SSdbTable table = {
2,282✔
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);
2,282✔
116
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_DNODE, mndProcessDropDnodeReq);
2,282✔
117
  mndSetMsgHandle(pMnode, TDMT_MND_STATUS, mndProcessStatusReq);
2,282✔
118
  mndSetMsgHandle(pMnode, TDMT_MND_NOTIFY, mndProcessNotifyReq);
2,282✔
119
  mndSetMsgHandle(pMnode, TDMT_MND_DNODE_LIST, mndProcessDnodeListReq);
2,282✔
120
  mndSetMsgHandle(pMnode, TDMT_MND_RESTORE_DNODE, mndProcessRestoreDnodeReq);
2,282✔
121
  mndSetMsgHandle(pMnode, TDMT_MND_STATIS, mndProcessStatisReq);
2,282✔
122
  mndSetMsgHandle(pMnode, TDMT_MND_AUDIT, mndProcessAuditReq);
2,282✔
123
  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_ENCRYPT_KEY, mndProcessCreateEncryptKeyReq);
2,282✔
124
  mndSetMsgHandle(pMnode, TDMT_DND_CREATE_ENCRYPT_KEY_RSP, mndProcessCreateEncryptKeyRsp);
2,282✔
125
  mndSetMsgHandle(pMnode, TDMT_MND_UPDATE_DNODE_INFO, mndProcessUpdateDnodeInfoReq);
2,282✔
126

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

132
  return sdbSetTable(pMnode->pSdb, table);
2,282✔
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) {}
2,279✔
139

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

145
  SDnodeObj dnodeObj = {0};
1,700✔
146
  dnodeObj.id = 1;
1,700✔
147
  dnodeObj.createdTime = taosGetTimestampMs();
1,700✔
148
  dnodeObj.updateTime = dnodeObj.createdTime;
1,700✔
149
  dnodeObj.port = tsServerPort;
1,700✔
150
  tstrncpy(dnodeObj.fqdn, tsLocalFqdn, TSDB_FQDN_LEN);
1,700✔
151
  dnodeObj.fqdn[TSDB_FQDN_LEN - 1] = 0;
1,700✔
152
  (void)snprintf(dnodeObj.ep, TSDB_EP_LEN - 1, "%s:%u", tsLocalFqdn, tsServerPort);
1,700✔
153
  char *machineId = NULL;
1,700✔
154
  code = tGetMachineId(&machineId);
1,700✔
155
  if (machineId) {
1,700!
156
    (void)memcpy(dnodeObj.machineId, machineId, TSDB_MACHINE_ID_LEN);
1,700✔
157
    taosMemoryFreeClear(machineId);
1,700!
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,700✔
166
  if (pTrans == NULL) {
1,700!
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,700!
172

173
  pRaw = mndDnodeActionEncode(&dnodeObj);
1,700✔
174
  if (pRaw == NULL) {
1,700!
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,700!
180
  TAOS_CHECK_GOTO(sdbSetRawStatus(pRaw, SDB_STATUS_READY), NULL, _OVER);
1,700!
181
  pRaw = NULL;
1,700✔
182

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

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

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

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

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

214
  terrno = 0;
13,103✔
215

216
_OVER:
13,103✔
217
  if (terrno != 0) {
13,103!
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);
13,103✔
224
  return pRaw;
13,103✔
225
}
226

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

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

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

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

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

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

268
_OVER:
10,044✔
269
  if (terrno != 0) {
10,044!
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);
10,044✔
276
  return pRow;
10,044✔
277
}
278

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

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

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

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

303
SDnodeObj *mndAcquireDnode(SMnode *pMnode, int32_t dnodeId) {
22,072,260✔
304
  SSdb      *pSdb = pMnode->pSdb;
22,072,260✔
305
  SDnodeObj *pDnode = sdbAcquire(pSdb, SDB_DNODE, &dnodeId);
22,072,260✔
306
  if (pDnode == NULL) {
22,082,842✔
307
    if (terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
599✔
308
      terrno = TSDB_CODE_MND_DNODE_NOT_EXIST;
117✔
309
    } else if (terrno == TSDB_CODE_SDB_OBJ_CREATING) {
482!
310
      terrno = TSDB_CODE_MND_DNODE_IN_CREATING;
×
311
    } else if (terrno == TSDB_CODE_SDB_OBJ_DROPPING) {
482!
312
      terrno = TSDB_CODE_MND_DNODE_IN_DROPPING;
482✔
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;
22,082,780✔
320
}
321

322
void mndReleaseDnode(SMnode *pMnode, SDnodeObj *pDnode) {
21,667,400✔
323
  SSdb *pSdb = pMnode->pSdb;
21,667,400✔
324
  sdbRelease(pSdb, pDnode);
21,667,400✔
325
}
21,668,642✔
326

327
SEpSet mndGetDnodeEpset(SDnodeObj *pDnode) {
33,069✔
328
  SEpSet epSet = {0};
33,069✔
329
  terrno = addEpIntoEpSet(&epSet, pDnode->fqdn, pDnode->port);
33,069✔
330
  return epSet;
33,069✔
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) {
4,314✔
345
  SSdb *pSdb = pMnode->pSdb;
4,314✔
346

347
  void *pIter = NULL;
4,314✔
348
  while (1) {
5,078✔
349
    SDnodeObj *pDnode = NULL;
9,392✔
350
    pIter = sdbFetch(pSdb, SDB_DNODE, pIter, (void **)&pDnode);
9,392✔
351
    if (pIter == NULL) break;
9,392✔
352

353
    if (taosStrncasecmp(pEpStr, pDnode->ep, TSDB_EP_LEN) == 0) {
7,809✔
354
      sdbCancelFetch(pSdb, pIter);
2,731✔
355
      return pDnode;
2,731✔
356
    }
357

358
    sdbRelease(pSdb, pDnode);
5,078✔
359
  }
360

361
  terrno = TSDB_CODE_MND_DNODE_NOT_EXIST;
1,583✔
362
  return NULL;
1,583✔
363
}
364

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

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

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

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

383
  return NULL;
×
384
}
385

386
int32_t mndGetDnodeSize(SMnode *pMnode) {
475,101✔
387
  SSdb *pSdb = pMnode->pSdb;
475,101✔
388
  return sdbGetSize(pSdb, SDB_DNODE);
475,101✔
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,510,042✔
397
  int64_t interval = TABS(pDnode->lastAccessTime - curMs);
1,510,042✔
398
  if (interval > 5000 * (int64_t)tsStatusInterval) {
1,510,042✔
399
    if (pDnode->rebootTime > 0 && pDnode->offlineReason == DND_REASON_ONLINE) {
9,335✔
400
      pDnode->offlineReason = DND_REASON_STATUS_MSG_TIMEOUT;
177✔
401
    }
402
    return false;
9,335✔
403
  }
404
  return true;
1,500,707✔
405
}
406

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

410
  int32_t numOfEps = 0;
10,278✔
411
  void   *pIter = NULL;
10,278✔
412
  while (1) {
29,975✔
413
    SDnodeObj *pDnode = NULL;
40,253✔
414
    ESdbStatus objStatus = 0;
40,253✔
415
    pIter = sdbFetchAll(pSdb, SDB_DNODE, pIter, (void **)&pDnode, &objStatus, true);
40,253✔
416
    if (pIter == NULL) break;
40,253✔
417

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

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

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

438
  int32_t numOfEps = 0;
65,201✔
439
  void   *pIter = NULL;
65,201✔
440
  while (1) {
286,733✔
441
    SDnodeObj *pDnode = NULL;
351,934✔
442
    ESdbStatus objStatus = 0;
351,934✔
443
    pIter = sdbFetchAll(pSdb, SDB_DNODE, pIter, (void **)&pDnode, &objStatus, true);
351,934✔
444
    if (pIter == NULL) break;
351,934✔
445

446
    SDnodeInfo dInfo;
447
    dInfo.id = pDnode->id;
286,733✔
448
    dInfo.ep.port = pDnode->port;
286,733✔
449
    dInfo.offlineReason = pDnode->offlineReason;
286,733✔
450
    tstrncpy(dInfo.ep.fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
286,733✔
451
    sdbRelease(pSdb, pDnode);
286,733✔
452
    if (mndIsMnode(pMnode, pDnode->id)) {
286,733✔
453
      dInfo.isMnode = 1;
86,322✔
454
    } else {
455
      dInfo.isMnode = 0;
200,411✔
456
    }
457

458
    if (taosArrayPush(pDnodeInfo, &dInfo) == NULL) {
286,733!
459
      code = terrno;
×
460
      sdbCancelFetch(pSdb, pIter);
×
461
      break;
×
462
    }
463
  }
464
  TAOS_RETURN(code);
65,201✔
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) {
10,278✔
475
  CHECK_MONITOR_PARA(tsEnableMonitor, DND_REASON_STATUS_MONITOR_SWITCH_NOT_MATCH);
10,278!
476
  CHECK_MONITOR_PARA(tsMonitorInterval, DND_REASON_STATUS_MONITOR_INTERVAL_NOT_MATCH);
10,278!
477
  CHECK_MONITOR_PARA(tsSlowLogThreshold, DND_REASON_STATUS_MONITOR_SLOW_LOG_THRESHOLD_NOT_MATCH);
10,278!
478
  CHECK_MONITOR_PARA(tsSlowLogMaxLen, DND_REASON_STATUS_MONITOR_SLOW_LOG_SQL_MAX_LEN_NOT_MATCH);
10,278!
479
  CHECK_MONITOR_PARA(tsSlowLogScope, DND_REASON_STATUS_MONITOR_SLOW_LOG_SCOPE_NOT_MATCH);
10,278!
480

481
  if (0 != taosStrcasecmp(pCfg->monitorParas.tsSlowLogExceptDb, tsSlowLogExceptDb)) {
10,278!
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) {
10,278!
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 != taosStrcasecmp(pCfg->timezone, tsTimezoneStr)) && (pMnode->checkTime != pCfg->checkTime)) {
10,278!
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 != taosStrcasecmp(pCfg->locale, tsLocale)) {
10,278!
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 != taosStrcasecmp(pCfg->charset, tsCharset)) {
10,278!
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) {
10,278!
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;
10,278✔
521
  if (pCfg->enableWhiteList != enable) {
10,278!
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) &&
10,278!
528
      (pCfg->encryptionKeyStat != tsEncryptionKeyStat || pCfg->encryptionKeyChksum != tsEncryptionKeyChksum)) {
10,278!
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;
10,278✔
536
}
537

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

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

549
static bool mndUpdateVnodeState(int32_t vgId, SVnodeGid *pGid, SVnodeLoad *pVload) {
692,951✔
550
  bool stateChanged = false;
692,951✔
551
  bool roleChanged = pGid->syncState != pVload->syncState ||
2,074,908✔
552
                     (pVload->syncTerm != -1 && pGid->syncTerm != pVload->syncTerm) ||
1,370,156!
553
                     pGid->roleTimeMs != pVload->roleTimeMs;
677,205✔
554

555
  if (pVload->syncCommitIndex > pVload->syncAppliedIndex) {
692,951✔
556
    if (pGid->lastSyncAppliedIndexUpdateTime == 0) {
309✔
557
      pGid->lastSyncAppliedIndexUpdateTime = taosGetTimestampMs();
134✔
558
    } else if (pGid->syncAppliedIndex != pVload->syncAppliedIndex) {
175✔
559
      int64_t currentTimeMs = taosGetTimestampMs();
170✔
560
      pGid->appliedRate = calcAppliedRate(pVload->syncAppliedIndex, pGid->syncAppliedIndex, currentTimeMs,
170✔
561
                                          pGid->lastSyncAppliedIndexUpdateTime);
562

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

567
  pGid->syncAppliedIndex = pVload->syncAppliedIndex;
692,951✔
568
  pGid->syncCommitIndex = pVload->syncCommitIndex;
692,951✔
569
  pGid->bufferSegmentUsed = pVload->bufferSegmentUsed;
692,951✔
570
  pGid->bufferSegmentSize = pVload->bufferSegmentSize;
692,951✔
571
  if (roleChanged || pGid->syncRestore != pVload->syncRestore || pGid->syncCanRead != pVload->syncCanRead ||
692,951!
572
      pGid->startTimeMs != pVload->startTimeMs) {
676,009!
573
    mInfo(
16,942!
574
        "vgId:%d, state changed by status msg, old state:%s restored:%d canRead:%d new state:%s restored:%d "
575
        "canRead:%d, dnode:%d",
576
        vgId, syncStr(pGid->syncState), pGid->syncRestore, pGid->syncCanRead, syncStr(pVload->syncState),
577
        pVload->syncRestore, pVload->syncCanRead, pGid->dnodeId);
578
    pGid->syncState = pVload->syncState;
16,942✔
579
    pGid->syncTerm = pVload->syncTerm;
16,942✔
580
    pGid->syncRestore = pVload->syncRestore;
16,942✔
581
    pGid->syncCanRead = pVload->syncCanRead;
16,942✔
582
    pGid->startTimeMs = pVload->startTimeMs;
16,942✔
583
    pGid->roleTimeMs = pVload->roleTimeMs;
16,942✔
584
    stateChanged = true;
16,942✔
585
  }
586
  return stateChanged;
692,951✔
587
}
588

589
static bool mndUpdateMnodeState(SMnodeObj *pObj, SMnodeLoad *pMload) {
78,346✔
590
  bool stateChanged = false;
78,346✔
591
  bool roleChanged = pObj->syncState != pMload->syncState ||
232,836✔
592
                     (pMload->syncTerm != -1 && pObj->syncTerm != pMload->syncTerm) ||
154,444!
593
                     pObj->roleTimeMs != pMload->roleTimeMs;
76,098✔
594
  if (roleChanged || pObj->syncRestore != pMload->syncRestore) {
78,346✔
595
    mInfo("dnode:%d, mnode syncState from %s to %s, restoreState from %d to %d, syncTerm from %" PRId64 " to %" PRId64,
2,351!
596
          pObj->id, syncStr(pObj->syncState), syncStr(pMload->syncState), pObj->syncRestore, pMload->syncRestore,
597
          pObj->syncTerm, pMload->syncTerm);
598
    pObj->syncState = pMload->syncState;
2,351✔
599
    pObj->syncTerm = pMload->syncTerm;
2,351✔
600
    pObj->syncRestore = pMload->syncRestore;
2,351✔
601
    pObj->roleTimeMs = pMload->roleTimeMs;
2,351✔
602
    stateChanged = true;
2,351✔
603
  }
604
  return stateChanged;
78,346✔
605
}
606

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

614
  TAOS_CHECK_RETURN(tDeserializeSStatisReq(pReq->pCont, pReq->contLen, &statisReq));
5,993!
615

616
  if (tsMonitorLogProtocol) {
5,993!
617
    mInfo("process statis req,\n %s", statisReq.pCont);
×
618
  }
619

620
  if (statisReq.type == MONITOR_TYPE_COUNTER) {
5,993✔
621
    monSendContent(statisReq.pCont, tsMonFwUri);
4,645✔
622
  } else if (statisReq.type == MONITOR_TYPE_SLOW_LOG) {
1,348!
623
    monSendContent(statisReq.pCont, tsMonSlowLogUri);
1,348✔
624
  }
625

626
  tFreeSStatisReq(&statisReq);
5,993✔
627
  return 0;
5,993✔
628
}
629

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

636
    TAOS_CHECK_RETURN(tDeserializeSAuditReq(pReq->pCont, pReq->contLen, &auditReq));
57,557!
637

638
    mDebug("received audit req:%s, %s, %s, %s", auditReq.operation, auditReq.db, auditReq.table, auditReq.pSql);
57,556✔
639

640
    auditAddRecord(pReq, pMnode->clusterId, auditReq.operation, auditReq.db, auditReq.table, auditReq.pSql,
57,556✔
641
                   auditReq.sqlLen);
642

643
    tFreeSAuditReq(&auditReq);
57,557✔
644
  }
645
  return 0;
57,556✔
646
}
647

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

654
  infoReq.dnodeId = pDnode->id;
4,622✔
655
  tstrncpy(infoReq.machineId, pDnode->machineId, TSDB_MACHINE_ID_LEN + 1);
4,622✔
656

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

665
  if ((contLen = tSerializeSDnodeInfoReq(pReq, contLen, &infoReq)) <= 0) {
4,622!
666
    code = contLen;
×
667
    goto _exit;
×
668
  }
669

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

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

687
  TAOS_CHECK_EXIT(tDeserializeSDnodeInfoReq(pReq->pCont, pReq->contLen, &infoReq));
4,615!
688

689
  pDnode = mndAcquireDnode(pMnode, infoReq.dnodeId);
4,615✔
690
  if (pDnode == NULL) {
4,615✔
691
    TAOS_CHECK_EXIT(terrno);
1!
692
  }
693

694
  pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_NOTHING, NULL, "update-dnode-obj");
4,614✔
695
  if (pTrans == NULL) {
4,614!
696
    TAOS_CHECK_EXIT(terrno);
×
697
  }
698

699
  pDnode->updateTime = taosGetTimestampMs();
4,614✔
700

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

711
  if ((code = mndTransPrepare(pMnode, pTrans)) != 0) {
4,614✔
712
    mError("trans:%d, failed to prepare since %s", pTrans->id, tstrerror(code));
1!
713
    TAOS_CHECK_EXIT(code);
1!
714
  }
715

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

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

732
  TAOS_CHECK_GOTO(tDeserializeSStatusReq(pReq->pCont, pReq->contLen, &statusReq), NULL, _OVER);
120,359!
733

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

742
  if (statusReq.dnodeId == 0) {
120,299✔
743
    pDnode = mndAcquireDnodeByEp(pMnode, statusReq.dnodeEp);
3,366✔
744
    if (pDnode == NULL) {
3,366✔
745
      mInfo("dnode:%s, not created yet", statusReq.dnodeEp);
639!
746
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
639✔
747
      if (terrno != 0) code = terrno;
639!
748
      goto _OVER;
639✔
749
    }
750
  } else {
751
    pDnode = mndAcquireDnode(pMnode, statusReq.dnodeId);
116,933✔
752
    if (pDnode == NULL) {
116,933✔
753
      int32_t err = terrno;
434✔
754
      pDnode = mndAcquireDnodeByEp(pMnode, statusReq.dnodeEp);
434✔
755
      if (pDnode != NULL) {
434✔
756
        pDnode->offlineReason = DND_REASON_DNODE_ID_NOT_MATCH;
4✔
757
        terrno = err;
4✔
758
        goto _OVER;
4✔
759
      }
760

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

772
  pMnode->ipWhiteVer = mndGetIpWhiteVer(pMnode);
119,565✔
773

774
  int64_t analVer = sdbGetTableVer(pMnode->pSdb, SDB_ANODE);
119,565✔
775
  int64_t dnodeVer = sdbGetTableVer(pMnode->pSdb, SDB_DNODE) + sdbGetTableVer(pMnode->pSdb, SDB_MNODE);
119,565✔
776
  int64_t curMs = taosGetTimestampMs();
119,565✔
777
  bool    online = mndIsDnodeOnline(pDnode, curMs);
119,565✔
778
  bool    dnodeChanged = (statusReq.dnodeVer == 0) || (statusReq.dnodeVer != dnodeVer);
119,565✔
779
  bool    reboot = (pDnode->rebootTime != statusReq.rebootTime);
119,565✔
780
  bool    supportVnodesChanged = pDnode->numOfSupportVnodes != statusReq.numOfSupportVnodes;
119,565✔
781
  bool    encryptKeyChanged = pDnode->encryptionKeyChksum != statusReq.clusterCfg.encryptionKeyChksum;
119,565✔
782
  bool    enableWhiteListChanged = statusReq.clusterCfg.enableWhiteList != (tsEnableWhiteList ? 1 : 0);
119,565✔
783
  bool    analVerChanged = (analVer != statusReq.analVer);
119,565✔
784
  bool    needCheck = !online || dnodeChanged || reboot || supportVnodesChanged || analVerChanged ||
116,587✔
785
                   pMnode->ipWhiteVer != statusReq.ipWhiteVer || encryptKeyChanged || enableWhiteListChanged;
236,152!
786
  const STraceId *trace = &pReq->info.traceId;
119,565✔
787
  char            timestamp[TD_TIME_STR_LEN] = {0};
119,565✔
788
  if (mDebugFlag & DEBUG_TRACE) (void)formatTimestampLocal(timestamp, statusReq.timestamp, TSDB_TIME_PRECISION_MILLI);
119,565✔
789
  mGTrace(
119,565!
790
      "dnode:%d, status received, accessTimes:%d check:%d online:%d reboot:%d changed:%d statusSeq:%d "
791
      "timestamp:%s",
792
      pDnode->id, pDnode->accessTimes, needCheck, online, reboot, dnodeChanged, statusReq.statusSeq, timestamp);
793

794
  if (reboot) {
119,565✔
795
    tsGrantHBInterval = GRANT_HEART_BEAT_MIN;
2,980✔
796
  }
797

798
  for (int32_t v = 0; v < taosArrayGetSize(statusReq.pVloads); ++v) {
815,576✔
799
    SVnodeLoad *pVload = taosArrayGet(statusReq.pVloads, v);
696,011✔
800

801
    SVgObj *pVgroup = mndAcquireVgroup(pMnode, pVload->vgId);
696,011✔
802
    if (pVgroup != NULL) {
696,011✔
803
      if (pVload->syncState == TAOS_SYNC_STATE_LEADER || pVload->syncState == TAOS_SYNC_STATE_ASSIGNED_LEADER) {
692,972!
804
        pVgroup->cacheUsage = pVload->cacheUsage;
635,659✔
805
        pVgroup->numOfCachedTables = pVload->numOfCachedTables;
635,659✔
806
        pVgroup->numOfTables = pVload->numOfTables;
635,659✔
807
        pVgroup->numOfTimeSeries = pVload->numOfTimeSeries;
635,659✔
808
        pVgroup->totalStorage = pVload->totalStorage;
635,659✔
809
        pVgroup->compStorage = pVload->compStorage;
635,659✔
810
        pVgroup->pointsWritten = pVload->pointsWritten;
635,659✔
811
      }
812
      bool stateChanged = false;
692,972✔
813
      for (int32_t vg = 0; vg < pVgroup->replica; ++vg) {
771,349✔
814
        SVnodeGid *pGid = &pVgroup->vnodeGid[vg];
771,328✔
815
        if (pGid->dnodeId == statusReq.dnodeId) {
771,328✔
816
          if (pVload->startTimeMs == 0) {
692,951!
817
            pVload->startTimeMs = statusReq.rebootTime;
×
818
          }
819
          if (pVload->roleTimeMs == 0) {
692,951!
820
            pVload->roleTimeMs = statusReq.rebootTime;
×
821
          }
822
          stateChanged = mndUpdateVnodeState(pVgroup->vgId, pGid, pVload);
692,951✔
823
          break;
692,951✔
824
        }
825
      }
826
      if (stateChanged) {
692,972✔
827
        SDbObj *pDb = mndAcquireDb(pMnode, pVgroup->dbName);
16,942✔
828
        if (pDb != NULL && pDb->stateTs != curMs) {
16,942✔
829
          mInfo("db:%s, stateTs changed by status msg, old stateTs:%" PRId64 " new stateTs:%" PRId64, pDb->name,
10,245!
830
                pDb->stateTs, curMs);
831
          pDb->stateTs = curMs;
10,245✔
832
        }
833
        mndReleaseDb(pMnode, pDb);
16,942✔
834
      }
835
    }
836

837
    mndReleaseVgroup(pMnode, pVgroup);
696,011✔
838
  }
839

840
  SMnodeObj *pObj = mndAcquireMnode(pMnode, pDnode->id);
119,565✔
841
  if (pObj != NULL) {
119,565✔
842
    if (statusReq.mload.roleTimeMs == 0) {
78,346✔
843
      statusReq.mload.roleTimeMs = statusReq.rebootTime;
2,089✔
844
    }
845
    (void)mndUpdateMnodeState(pObj, &statusReq.mload);
78,346✔
846
    mndReleaseMnode(pMnode, pObj);
78,346✔
847
  }
848

849
  SQnodeObj *pQnode = mndAcquireQnode(pMnode, statusReq.qload.dnodeId);
119,565✔
850
  if (pQnode != NULL) {
119,565✔
851
    pQnode->load = statusReq.qload;
42,658✔
852
    mndReleaseQnode(pMnode, pQnode);
42,658✔
853
  }
854

855
  if (needCheck) {
119,565✔
856
    if (statusReq.sver != tsVersion) {
10,278!
857
      if (pDnode != NULL) {
×
858
        pDnode->offlineReason = DND_REASON_VERSION_NOT_MATCH;
×
859
      }
860
      mError("dnode:%d, status msg version:%d not match cluster:%d", statusReq.dnodeId, statusReq.sver, tsVersion);
×
861
      terrno = TSDB_CODE_VERSION_NOT_COMPATIBLE;
×
862
      goto _OVER;
×
863
    }
864

865
    if (statusReq.dnodeId == 0) {
10,278✔
866
      mInfo("dnode:%d, %s first access, clusterId:%" PRId64, pDnode->id, pDnode->ep, pMnode->clusterId);
2,727!
867
    } else {
868
      if (statusReq.clusterId != pMnode->clusterId) {
7,551!
869
        if (pDnode != NULL) {
×
870
          pDnode->offlineReason = DND_REASON_CLUSTER_ID_NOT_MATCH;
×
871
        }
872
        mError("dnode:%d, clusterId %" PRId64 " not match exist %" PRId64, pDnode->id, statusReq.clusterId,
×
873
               pMnode->clusterId);
874
        terrno = TSDB_CODE_MND_INVALID_CLUSTER_ID;
×
875
        goto _OVER;
×
876
      }
877
    }
878

879
    // Verify whether the cluster parameters are consistent when status change from offline to ready
880
    pDnode->offlineReason = mndCheckClusterCfgPara(pMnode, pDnode, &statusReq.clusterCfg);
10,278✔
881
    if (pDnode->offlineReason != 0) {
10,278!
882
      mError("dnode:%d, cluster cfg inconsistent since:%s", pDnode->id, offlineReason[pDnode->offlineReason]);
×
883
      if (terrno == 0) terrno = TSDB_CODE_MND_INVALID_CLUSTER_CFG;
×
884
      goto _OVER;
×
885
    }
886

887
    if (!online) {
10,278✔
888
      mInfo("dnode:%d, from offline to online, memory avail:%" PRId64 " total:%" PRId64 " cores:%.2f", pDnode->id,
2,978!
889
            statusReq.memAvail, statusReq.memTotal, statusReq.numOfCores);
890
    } else {
891
      mInfo("dnode:%d, send dnode epset, online:%d dnodeVer:%" PRId64 ":%" PRId64 " reboot:%d", pDnode->id, online,
7,300!
892
            statusReq.dnodeVer, dnodeVer, reboot);
893
    }
894

895
    pDnode->rebootTime = statusReq.rebootTime;
10,278✔
896
    pDnode->numOfCores = statusReq.numOfCores;
10,278✔
897
    pDnode->numOfSupportVnodes = statusReq.numOfSupportVnodes;
10,278✔
898
    pDnode->numOfDiskCfg = statusReq.numOfDiskCfg;
10,278✔
899
    pDnode->memAvail = statusReq.memAvail;
10,278✔
900
    pDnode->memTotal = statusReq.memTotal;
10,278✔
901
    pDnode->encryptionKeyStat = statusReq.clusterCfg.encryptionKeyStat;
10,278✔
902
    pDnode->encryptionKeyChksum = statusReq.clusterCfg.encryptionKeyChksum;
10,278✔
903
    if (memcmp(pDnode->machineId, statusReq.machineId, TSDB_MACHINE_ID_LEN) != 0) {
10,278✔
904
      tstrncpy(pDnode->machineId, statusReq.machineId, TSDB_MACHINE_ID_LEN + 1);
4,622✔
905
      if ((terrno = mndUpdateDnodeObj(pMnode, pDnode)) != 0) {
4,622!
906
        goto _OVER;
×
907
      }
908
    }
909

910
    SStatusRsp statusRsp = {0};
10,278✔
911
    statusRsp.statusSeq++;
10,278✔
912
    statusRsp.analVer = analVer;
10,278✔
913
    statusRsp.dnodeVer = dnodeVer;
10,278✔
914
    statusRsp.dnodeCfg.dnodeId = pDnode->id;
10,278✔
915
    statusRsp.dnodeCfg.clusterId = pMnode->clusterId;
10,278✔
916
    statusRsp.pDnodeEps = taosArrayInit(mndGetDnodeSize(pMnode), sizeof(SDnodeEp));
10,278✔
917
    if (statusRsp.pDnodeEps == NULL) {
10,278!
918
      terrno = TSDB_CODE_OUT_OF_MEMORY;
×
919
      goto _OVER;
×
920
    }
921

922
    mndGetDnodeEps(pMnode, statusRsp.pDnodeEps);
10,278✔
923
    statusRsp.ipWhiteVer = pMnode->ipWhiteVer;
10,278✔
924

925
    int32_t contLen = tSerializeSStatusRsp(NULL, 0, &statusRsp);
10,278✔
926
    void   *pHead = rpcMallocCont(contLen);
10,278✔
927
    contLen = tSerializeSStatusRsp(pHead, contLen, &statusRsp);
10,278✔
928
    taosArrayDestroy(statusRsp.pDnodeEps);
10,278✔
929
    if (contLen < 0) {
10,278!
930
      code = contLen;
×
931
      goto _OVER;
×
932
    }
933

934
    pReq->info.rspLen = contLen;
10,278✔
935
    pReq->info.rsp = pHead;
10,278✔
936
  }
937

938
  pDnode->accessTimes++;
119,565✔
939
  pDnode->lastAccessTime = curMs;
119,565✔
940
  code = 0;
119,565✔
941

942
_OVER:
120,359✔
943
  mndReleaseDnode(pMnode, pDnode);
120,359✔
944
  taosArrayDestroy(statusReq.pVloads);
120,359✔
945
  return mndUpdClusterInfo(pReq);
120,359✔
946
}
947

948
static int32_t mndProcessNotifyReq(SRpcMsg *pReq) {
×
949
  SMnode    *pMnode = pReq->info.node;
×
950
  SNotifyReq notifyReq = {0};
×
951
  int32_t    code = 0;
×
952

953
  if ((code = tDeserializeSNotifyReq(pReq->pCont, pReq->contLen, &notifyReq)) != 0) {
×
954
    terrno = code;
×
955
    goto _OVER;
×
956
  }
957

958
  int64_t clusterid = mndGetClusterId(pMnode);
×
959
  if (notifyReq.clusterId != 0 && notifyReq.clusterId != clusterid) {
×
960
    code = TSDB_CODE_MND_DNODE_DIFF_CLUSTER;
×
961
    mWarn("dnode:%d, its clusterid:%" PRId64 " differ from current cluster:%" PRId64 " since %s", notifyReq.dnodeId,
×
962
          notifyReq.clusterId, clusterid, tstrerror(code));
963
    goto _OVER;
×
964
  }
965

966
  int32_t nVgroup = taosArrayGetSize(notifyReq.pVloads);
×
967
  for (int32_t v = 0; v < nVgroup; ++v) {
×
968
    SVnodeLoadLite *pVload = taosArrayGet(notifyReq.pVloads, v);
×
969

970
    SVgObj *pVgroup = mndAcquireVgroup(pMnode, pVload->vgId);
×
971
    if (pVgroup != NULL) {
×
972
      pVgroup->numOfTimeSeries = pVload->nTimeSeries;
×
973
      mndReleaseVgroup(pMnode, pVgroup);
×
974
    }
975
  }
976
  code = mndUpdClusterInfo(pReq);
×
977
_OVER:
×
978
  tFreeSNotifyReq(&notifyReq);
×
979
  return code;
×
980
}
981

982
static int32_t mndCreateDnode(SMnode *pMnode, SRpcMsg *pReq, SCreateDnodeReq *pCreate) {
513✔
983
  int32_t  code = -1;
513✔
984
  SSdbRaw *pRaw = NULL;
513✔
985
  STrans  *pTrans = NULL;
513✔
986

987
  SDnodeObj dnodeObj = {0};
513✔
988
  dnodeObj.id = sdbGetMaxId(pMnode->pSdb, SDB_DNODE);
513✔
989
  dnodeObj.createdTime = taosGetTimestampMs();
513✔
990
  dnodeObj.updateTime = dnodeObj.createdTime;
513✔
991
  dnodeObj.port = pCreate->port;
513✔
992
  tstrncpy(dnodeObj.fqdn, pCreate->fqdn, TSDB_FQDN_LEN);
513✔
993
  (void)snprintf(dnodeObj.ep, TSDB_EP_LEN - 1, "%s:%u", pCreate->fqdn, pCreate->port);
513✔
994

995
  pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_GLOBAL, pReq, "create-dnode");
513✔
996
  if (pTrans == NULL) {
513!
997
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
998
    if (terrno != 0) code = terrno;
×
999
    goto _OVER;
×
1000
  }
1001
  mInfo("trans:%d, used to create dnode:%s", pTrans->id, dnodeObj.ep);
513!
1002
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
513!
1003

1004
  pRaw = mndDnodeActionEncode(&dnodeObj);
513✔
1005
  if (pRaw == NULL) {
513!
1006
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1007
    if (terrno != 0) code = terrno;
×
1008
    goto _OVER;
×
1009
  }
1010
  TAOS_CHECK_GOTO(mndTransAppendCommitlog(pTrans, pRaw), NULL, _OVER);
513!
1011
  TAOS_CHECK_GOTO(sdbSetRawStatus(pRaw, SDB_STATUS_READY), NULL, _OVER);
513!
1012
  pRaw = NULL;
513✔
1013

1014
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
513!
1015
  code = 0;
513✔
1016

1017
  (void)mndUpdateIpWhiteForAllUser(pMnode, TSDB_DEFAULT_USER, dnodeObj.fqdn, IP_WHITE_ADD,
513✔
1018
                                   1);  // TODO: check the return value
1019
_OVER:
513✔
1020
  mndTransDrop(pTrans);
513✔
1021
  sdbFreeRaw(pRaw);
513✔
1022
  return code;
513✔
1023
}
1024

1025
static int32_t mndProcessDnodeListReq(SRpcMsg *pReq) {
7,636✔
1026
  SMnode       *pMnode = pReq->info.node;
7,636✔
1027
  SSdb         *pSdb = pMnode->pSdb;
7,636✔
1028
  SDnodeObj    *pObj = NULL;
7,636✔
1029
  void         *pIter = NULL;
7,636✔
1030
  SDnodeListRsp rsp = {0};
7,636✔
1031
  int32_t       code = -1;
7,636✔
1032

1033
  rsp.dnodeList = taosArrayInit(5, sizeof(SDNodeAddr));
7,636✔
1034
  if (NULL == rsp.dnodeList) {
7,636!
1035
    mError("failed to alloc epSet while process dnode list req");
×
1036
    code = terrno;
×
1037
    goto _OVER;
×
1038
  }
1039

1040
  while (1) {
7,972✔
1041
    pIter = sdbFetch(pSdb, SDB_DNODE, pIter, (void **)&pObj);
15,608✔
1042
    if (pIter == NULL) break;
15,608✔
1043

1044
    SDNodeAddr dnodeAddr = {0};
7,972✔
1045
    dnodeAddr.nodeId = pObj->id;
7,972✔
1046
    dnodeAddr.epSet.numOfEps = 1;
7,972✔
1047
    tstrncpy(dnodeAddr.epSet.eps[0].fqdn, pObj->fqdn, TSDB_FQDN_LEN);
7,972✔
1048
    dnodeAddr.epSet.eps[0].port = pObj->port;
7,972✔
1049

1050
    if (taosArrayPush(rsp.dnodeList, &dnodeAddr) == NULL) {
15,944!
1051
      if (terrno != 0) code = terrno;
×
1052
      sdbRelease(pSdb, pObj);
×
1053
      sdbCancelFetch(pSdb, pIter);
×
1054
      goto _OVER;
×
1055
    }
1056

1057
    sdbRelease(pSdb, pObj);
7,972✔
1058
  }
1059

1060
  int32_t rspLen = tSerializeSDnodeListRsp(NULL, 0, &rsp);
7,636✔
1061
  void   *pRsp = rpcMallocCont(rspLen);
7,636✔
1062
  if (pRsp == NULL) {
7,636!
1063
    code = terrno;
×
1064
    goto _OVER;
×
1065
  }
1066

1067
  if ((rspLen = tSerializeSDnodeListRsp(pRsp, rspLen, &rsp)) <= 0) {
7,636!
1068
    code = rspLen;
×
1069
    goto _OVER;
×
1070
  }
1071

1072
  pReq->info.rspLen = rspLen;
7,636✔
1073
  pReq->info.rsp = pRsp;
7,636✔
1074
  code = 0;
7,636✔
1075

1076
_OVER:
7,636✔
1077

1078
  if (code != 0) {
7,636!
1079
    mError("failed to get dnode list since %s", tstrerror(code));
×
1080
  }
1081

1082
  tFreeSDnodeListRsp(&rsp);
7,636✔
1083

1084
  TAOS_RETURN(code);
7,636✔
1085
}
1086

1087
void getSlowLogScopeString(int32_t scope, char *result) {
1,445✔
1088
  if (scope == SLOW_LOG_TYPE_NULL) {
1,445!
1089
    (void)strncat(result, "NONE", 64);
×
1090
    return;
×
1091
  }
1092
  while (scope > 0) {
5,771✔
1093
    if (scope & SLOW_LOG_TYPE_QUERY) {
4,322✔
1094
      (void)strncat(result, "QUERY", 64);
1,446✔
1095
      scope &= ~SLOW_LOG_TYPE_QUERY;
1,446✔
1096
    } else if (scope & SLOW_LOG_TYPE_INSERT) {
2,876✔
1097
      (void)strncat(result, "INSERT", 64);
1,440✔
1098
      scope &= ~SLOW_LOG_TYPE_INSERT;
1,440✔
1099
    } else if (scope & SLOW_LOG_TYPE_OTHERS) {
1,436!
1100
      (void)strncat(result, "OTHERS", 64);
1,440✔
1101
      scope &= ~SLOW_LOG_TYPE_OTHERS;
1,440✔
1102
    } else {
1103
      (void)printf("invalid slow log scope:%d", scope);
×
1104
      return;
×
1105
    }
1106

1107
    if (scope > 0) {
4,326✔
1108
      (void)strncat(result, "|", 64);
2,876✔
1109
    }
1110
  }
1111
}
1112

1113
static int32_t mndProcessCreateDnodeReq(SRpcMsg *pReq) {
514✔
1114
  SMnode         *pMnode = pReq->info.node;
514✔
1115
  int32_t         code = -1;
514✔
1116
  SDnodeObj      *pDnode = NULL;
514✔
1117
  SCreateDnodeReq createReq = {0};
514✔
1118

1119
  if ((code = grantCheck(TSDB_GRANT_DNODE)) != 0 || (code = grantCheck(TSDB_GRANT_CPU_CORES)) != 0) {
514!
1120
    goto _OVER;
×
1121
  }
1122

1123
  TAOS_CHECK_GOTO(tDeserializeSCreateDnodeReq(pReq->pCont, pReq->contLen, &createReq), NULL, _OVER);
514!
1124

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

1128
  if (createReq.fqdn[0] == 0 || createReq.port <= 0 || createReq.port > UINT16_MAX) {
513!
1129
    code = TSDB_CODE_MND_INVALID_DNODE_EP;
×
1130
    goto _OVER;
×
1131
  }
1132

1133
  char ep[TSDB_EP_LEN];
1134
  (void)snprintf(ep, TSDB_EP_LEN, "%s:%d", createReq.fqdn, createReq.port);
513✔
1135
  pDnode = mndAcquireDnodeByEp(pMnode, ep);
513✔
1136
  if (pDnode != NULL) {
513!
1137
    code = TSDB_CODE_MND_DNODE_ALREADY_EXIST;
×
1138
    goto _OVER;
×
1139
  }
1140

1141
  code = mndCreateDnode(pMnode, pReq, &createReq);
513✔
1142
  if (code == 0) {
513!
1143
    code = TSDB_CODE_ACTION_IN_PROGRESS;
513✔
1144
    tsGrantHBInterval = 5;
513✔
1145
  }
1146

1147
  char obj[200] = {0};
513✔
1148
  (void)tsnprintf(obj, sizeof(obj), "%s:%d", createReq.fqdn, createReq.port);
513✔
1149

1150
  auditRecord(pReq, pMnode->clusterId, "createDnode", "", obj, createReq.sql, createReq.sqlLen);
513✔
1151

1152
_OVER:
514✔
1153
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
514!
1154
    mError("dnode:%s:%d, failed to create since %s", createReq.fqdn, createReq.port, tstrerror(code));
1!
1155
  }
1156

1157
  mndReleaseDnode(pMnode, pDnode);
514✔
1158
  tFreeSCreateDnodeReq(&createReq);
514✔
1159
  TAOS_RETURN(code);
514✔
1160
}
1161

1162
extern int32_t mndProcessRestoreDnodeReqImpl(SRpcMsg *pReq);
1163

1164
int32_t mndProcessRestoreDnodeReq(SRpcMsg *pReq) { return mndProcessRestoreDnodeReqImpl(pReq); }
9✔
1165

1166
#ifndef TD_ENTERPRISE
1167
int32_t mndProcessRestoreDnodeReqImpl(SRpcMsg *pReq) { return 0; }
1168
#endif
1169

1170
static int32_t mndDropDnode(SMnode *pMnode, SRpcMsg *pReq, SDnodeObj *pDnode, SMnodeObj *pMObj, SQnodeObj *pQObj,
26✔
1171
                            SSnodeObj *pSObj, int32_t numOfVnodes, bool force, bool unsafe) {
1172
  int32_t  code = -1;
26✔
1173
  SSdbRaw *pRaw = NULL;
26✔
1174
  STrans  *pTrans = NULL;
26✔
1175

1176
  pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, pReq, "drop-dnode");
26✔
1177
  if (pTrans == NULL) {
26!
1178
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1179
    if (terrno != 0) code = terrno;
×
1180
    goto _OVER;
×
1181
  }
1182
  mndTransSetSerial(pTrans);
26✔
1183
  mInfo("trans:%d, used to drop dnode:%d, force:%d", pTrans->id, pDnode->id, force);
26!
1184
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
26!
1185

1186
  pRaw = mndDnodeActionEncode(pDnode);
26✔
1187
  if (pRaw == NULL) {
26!
1188
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1189
    if (terrno != 0) code = terrno;
×
1190
    goto _OVER;
×
1191
  }
1192
  TAOS_CHECK_GOTO(mndTransAppendRedolog(pTrans, pRaw), NULL, _OVER);
26!
1193
  TAOS_CHECK_GOTO(sdbSetRawStatus(pRaw, SDB_STATUS_DROPPING), NULL, _OVER);
26!
1194
  pRaw = NULL;
26✔
1195

1196
  pRaw = mndDnodeActionEncode(pDnode);
26✔
1197
  if (pRaw == NULL) {
26!
1198
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1199
    if (terrno != 0) code = terrno;
×
1200
    goto _OVER;
×
1201
  }
1202
  TAOS_CHECK_GOTO(mndTransAppendCommitlog(pTrans, pRaw), NULL, _OVER);
26!
1203
  TAOS_CHECK_GOTO(sdbSetRawStatus(pRaw, SDB_STATUS_DROPPED), NULL, _OVER);
26!
1204
  pRaw = NULL;
26✔
1205

1206
  if (pMObj != NULL) {
26✔
1207
    mInfo("trans:%d, mnode on dnode:%d will be dropped", pTrans->id, pDnode->id);
4!
1208
    TAOS_CHECK_GOTO(mndSetDropMnodeInfoToTrans(pMnode, pTrans, pMObj, force), NULL, _OVER);
4!
1209
  }
1210

1211
  if (pQObj != NULL) {
26✔
1212
    mInfo("trans:%d, qnode on dnode:%d will be dropped", pTrans->id, pDnode->id);
3!
1213
    TAOS_CHECK_GOTO(mndSetDropQnodeInfoToTrans(pMnode, pTrans, pQObj, force), NULL, _OVER);
3!
1214
  }
1215

1216
  if (pSObj != NULL) {
26✔
1217
    mInfo("trans:%d, snode on dnode:%d will be dropped", pTrans->id, pDnode->id);
3!
1218
    TAOS_CHECK_GOTO(mndSetDropSnodeInfoToTrans(pMnode, pTrans, pSObj, force), NULL, _OVER);
3!
1219
  }
1220

1221
  if (numOfVnodes > 0) {
26✔
1222
    mInfo("trans:%d, %d vnodes on dnode:%d will be dropped", pTrans->id, numOfVnodes, pDnode->id);
16!
1223
    TAOS_CHECK_GOTO(mndSetMoveVgroupsInfoToTrans(pMnode, pTrans, pDnode->id, force, unsafe), NULL, _OVER);
16✔
1224
  }
1225

1226
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
24!
1227

1228
  code = 0;
24✔
1229

1230
_OVER:
26✔
1231
  mndTransDrop(pTrans);
26✔
1232
  sdbFreeRaw(pRaw);
26✔
1233
  TAOS_RETURN(code);
26✔
1234
}
1235

1236
static bool mndIsEmptyDnode(SMnode *pMnode, int32_t dnodeId) {
28✔
1237
  bool       isEmpty = false;
28✔
1238
  SMnodeObj *pMObj = NULL;
28✔
1239
  SQnodeObj *pQObj = NULL;
28✔
1240
  SSnodeObj *pSObj = NULL;
28✔
1241

1242
  pQObj = mndAcquireQnode(pMnode, dnodeId);
28✔
1243
  if (pQObj) goto _OVER;
28✔
1244

1245
  pSObj = mndAcquireSnode(pMnode, dnodeId);
24✔
1246
  if (pSObj) goto _OVER;
24!
1247

1248
  pMObj = mndAcquireMnode(pMnode, dnodeId);
24✔
1249
  if (pMObj) goto _OVER;
24✔
1250

1251
  int32_t numOfVnodes = mndGetVnodesNum(pMnode, dnodeId);
22✔
1252
  if (numOfVnodes > 0) goto _OVER;
22✔
1253

1254
  isEmpty = true;
7✔
1255
_OVER:
28✔
1256
  mndReleaseMnode(pMnode, pMObj);
28✔
1257
  mndReleaseQnode(pMnode, pQObj);
28✔
1258
  mndReleaseSnode(pMnode, pSObj);
28✔
1259
  return isEmpty;
28✔
1260
}
1261

1262
static int32_t mndProcessDropDnodeReq(SRpcMsg *pReq) {
34✔
1263
  SMnode       *pMnode = pReq->info.node;
34✔
1264
  int32_t       code = -1;
34✔
1265
  SDnodeObj    *pDnode = NULL;
34✔
1266
  SMnodeObj    *pMObj = NULL;
34✔
1267
  SQnodeObj    *pQObj = NULL;
34✔
1268
  SSnodeObj    *pSObj = NULL;
34✔
1269
  SDropDnodeReq dropReq = {0};
34✔
1270

1271
  TAOS_CHECK_GOTO(tDeserializeSDropDnodeReq(pReq->pCont, pReq->contLen, &dropReq), NULL, _OVER);
34!
1272

1273
  mInfo("dnode:%d, start to drop, ep:%s:%d, force:%s, unsafe:%s", dropReq.dnodeId, dropReq.fqdn, dropReq.port,
34!
1274
        dropReq.force ? "true" : "false", dropReq.unsafe ? "true" : "false");
1275
  TAOS_CHECK_GOTO(mndCheckOperPrivilege(pMnode, pReq->info.conn.user, MND_OPER_DROP_MNODE), NULL, _OVER);
34✔
1276

1277
  bool force = dropReq.force;
33✔
1278
  if (dropReq.unsafe) {
33✔
1279
    force = true;
1✔
1280
  }
1281

1282
  pDnode = mndAcquireDnode(pMnode, dropReq.dnodeId);
33✔
1283
  if (pDnode == NULL) {
33✔
1284
    int32_t err = terrno;
1✔
1285
    char    ep[TSDB_EP_LEN + 1] = {0};
1✔
1286
    (void)snprintf(ep, sizeof(ep), dropReq.fqdn, dropReq.port);
1✔
1287
    pDnode = mndAcquireDnodeByEp(pMnode, ep);
1✔
1288
    if (pDnode == NULL) {
1!
1289
      code = err;
1✔
1290
      goto _OVER;
1✔
1291
    }
1292
  }
1293

1294
  pQObj = mndAcquireQnode(pMnode, dropReq.dnodeId);
32✔
1295
  pSObj = mndAcquireSnode(pMnode, dropReq.dnodeId);
32✔
1296
  pMObj = mndAcquireMnode(pMnode, dropReq.dnodeId);
32✔
1297
  if (pMObj != NULL) {
32✔
1298
    if (sdbGetSize(pMnode->pSdb, SDB_MNODE) <= 1) {
9✔
1299
      code = TSDB_CODE_MND_TOO_FEW_MNODES;
2✔
1300
      goto _OVER;
2✔
1301
    }
1302
    if (pMnode->selfDnodeId == dropReq.dnodeId) {
7✔
1303
      code = TSDB_CODE_MND_CANT_DROP_LEADER;
2✔
1304
      goto _OVER;
2✔
1305
    }
1306
  }
1307

1308
  int32_t numOfVnodes = mndGetVnodesNum(pMnode, pDnode->id);
28✔
1309
  bool    isonline = mndIsDnodeOnline(pDnode, taosGetTimestampMs());
28✔
1310

1311
  if (isonline && force) {
28!
1312
    code = TSDB_CODE_DNODE_ONLY_USE_WHEN_OFFLINE;
×
1313
    mError("dnode:%d, failed to drop since %s, vnodes:%d mnode:%d qnode:%d snode:%d", pDnode->id, tstrerror(code),
×
1314
           numOfVnodes, pMObj != NULL, pQObj != NULL, pSObj != NULL);
1315
    goto _OVER;
×
1316
  }
1317

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

1326
  code = mndDropDnode(pMnode, pReq, pDnode, pMObj, pQObj, pSObj, numOfVnodes, force, dropReq.unsafe);
26✔
1327
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
26✔
1328

1329
  char obj1[30] = {0};
26✔
1330
  (void)tsnprintf(obj1, sizeof(obj1), "%d", dropReq.dnodeId);
26✔
1331

1332
  auditRecord(pReq, pMnode->clusterId, "dropDnode", "", obj1, dropReq.sql, dropReq.sqlLen);
26✔
1333

1334
_OVER:
34✔
1335
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
34!
1336
    mError("dnode:%d, failed to drop since %s", dropReq.dnodeId, tstrerror(code));
10!
1337
  }
1338

1339
  mndReleaseDnode(pMnode, pDnode);
34✔
1340
  mndReleaseMnode(pMnode, pMObj);
34✔
1341
  mndReleaseQnode(pMnode, pQObj);
34✔
1342
  mndReleaseSnode(pMnode, pSObj);
34✔
1343
  tFreeSDropDnodeReq(&dropReq);
34✔
1344
  TAOS_RETURN(code);
34✔
1345
}
1346

1347
static int32_t mndProcessCreateEncryptKeyReqImpl(SRpcMsg *pReq, int32_t dnodeId, SDCfgDnodeReq *pDcfgReq) {
1✔
1348
  int32_t code = 0;
1✔
1349
  SMnode *pMnode = pReq->info.node;
1✔
1350
  SSdb   *pSdb = pMnode->pSdb;
1✔
1351
  void   *pIter = NULL;
1✔
1352
  int8_t  encrypting = 0;
1✔
1353

1354
  const STraceId *trace = &pReq->info.traceId;
1✔
1355

1356
  int32_t klen = strlen(pDcfgReq->value);
1✔
1357
  if (klen > ENCRYPT_KEY_LEN || klen < ENCRYPT_KEY_LEN_MIN) {
1!
1358
    code = TSDB_CODE_DNODE_INVALID_ENCRYPT_KLEN;
×
1359
    mGError("msg:%p, failed to create encrypt_key since invalid key length:%d, valid range:[%d, %d]", pReq, klen,
×
1360
            ENCRYPT_KEY_LEN_MIN, ENCRYPT_KEY_LEN);
1361
    goto _exit;
×
1362
  }
1363

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

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

1378
  atomic_store_16(&pMnode->encryptMgmt.nEncrypt, 0);
1✔
1379
  atomic_store_16(&pMnode->encryptMgmt.nSuccess, 0);
1✔
1380
  atomic_store_16(&pMnode->encryptMgmt.nFailed, 0);
1✔
1381

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

1393
    if (dnodeId == -1 || pDnode->id == dnodeId || dnodeId == 0) {
1!
1394
      SEpSet  epSet = mndGetDnodeEpset(pDnode);
1✔
1395
      int32_t bufLen = tSerializeSDCfgDnodeReq(NULL, 0, pDcfgReq);
1✔
1396
      void   *pBuf = rpcMallocCont(bufLen);
1✔
1397

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

1411
    sdbRelease(pSdb, pDnode);
1✔
1412
  }
1413

1414
  if (atomic_load_16(&pMnode->encryptMgmt.nEncrypt) <= 0) {
1!
1415
    atomic_store_8(&pMnode->encryptMgmt.encrypting, 0);
×
1416
  }
1417

1418
_exit:
1✔
1419
  if (code != 0) {
1!
1420
    if (terrno == 0) terrno = code;
×
1421
  }
1422
  return code;
1✔
1423
}
1424

1425
static int32_t mndProcessCreateEncryptKeyReq(SRpcMsg *pReq) {
1✔
1426
  int32_t code = 0;
1✔
1427

1428
#if defined(TD_ENTERPRISE) || defined(TD_ASTRA_TODO)
1429
  SMnode       *pMnode = pReq->info.node;
1✔
1430
  SMCfgDnodeReq cfgReq = {0};
1✔
1431
  TAOS_CHECK_RETURN(tDeserializeSMCfgDnodeReq(pReq->pCont, pReq->contLen, &cfgReq));
1!
1432

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

1450
#else
1451
  TAOS_RETURN(code);
1452
#endif
1453
}
1454

1455
static int32_t mndProcessCreateEncryptKeyRsp(SRpcMsg *pRsp) {
1✔
1456
  SMnode *pMnode = pRsp->info.node;
1✔
1457
  int16_t nSuccess = 0;
1✔
1458
  int16_t nFailed = 0;
1✔
1459

1460
  if (0 == pRsp->code) {
1!
1461
    nSuccess = atomic_add_fetch_16(&pMnode->encryptMgmt.nSuccess, 1);
1✔
1462
  } else {
1463
    nFailed = atomic_add_fetch_16(&pMnode->encryptMgmt.nFailed, 1);
×
1464
  }
1465

1466
  int16_t nReq = atomic_load_16(&pMnode->encryptMgmt.nEncrypt);
1✔
1467
  bool    finished = nSuccess + nFailed >= nReq;
1✔
1468

1469
  if (finished) {
1!
1470
    atomic_store_8(&pMnode->encryptMgmt.encrypting, 0);
1✔
1471
  }
1472

1473
  const STraceId *trace = &pRsp->info.traceId;
1✔
1474
  mGInfo("msg:%p, create encrypt key rsp, nReq:%" PRIi16 ", nSucess:%" PRIi16 ", nFailed:%" PRIi16 ", %s", pRsp, nReq,
1!
1475
         nSuccess, nFailed, finished ? "encrypt done" : "in encrypting");
1476

1477
  return 0;
1✔
1478
}
1479

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

1491
  cfgOpts[totalRows] = "statusInterval";
1,445✔
1492
  (void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%d", tsStatusInterval);
1,445✔
1493
  totalRows++;
1,445✔
1494

1495
  cfgOpts[totalRows] = "timezone";
1,445✔
1496
  (void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%s", tsTimezoneStr);
1,445✔
1497
  totalRows++;
1,445✔
1498

1499
  cfgOpts[totalRows] = "locale";
1,445✔
1500
  (void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%s", tsLocale);
1,445✔
1501
  totalRows++;
1,445✔
1502

1503
  cfgOpts[totalRows] = "charset";
1,445✔
1504
  (void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%s", tsCharset);
1,445✔
1505
  totalRows++;
1,445✔
1506

1507
  cfgOpts[totalRows] = "monitor";
1,445✔
1508
  (void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%d", tsEnableMonitor);
1,445✔
1509
  totalRows++;
1,445✔
1510

1511
  cfgOpts[totalRows] = "monitorInterval";
1,445✔
1512
  (void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%d", tsMonitorInterval);
1,445✔
1513
  totalRows++;
1,445✔
1514

1515
  cfgOpts[totalRows] = "slowLogThreshold";
1,445✔
1516
  (void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%d", tsSlowLogThreshold);
1,445✔
1517
  totalRows++;
1,445✔
1518

1519
  cfgOpts[totalRows] = "slowLogMaxLen";
1,445✔
1520
  (void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%d", tsSlowLogMaxLen);
1,445✔
1521
  totalRows++;
1,445✔
1522

1523
  char scopeStr[64] = {0};
1,445✔
1524
  getSlowLogScopeString(tsSlowLogScope, scopeStr);
1,445✔
1525
  cfgOpts[totalRows] = "slowLogScope";
1,447✔
1526
  (void)snprintf(cfgVals[totalRows], TSDB_CONFIG_VALUE_LEN, "%s", scopeStr);
1,447✔
1527
  totalRows++;
1,447✔
1528

1529
  char buf[TSDB_CONFIG_OPTION_LEN + VARSTR_HEADER_SIZE] = {0};
1,447✔
1530
  char bufVal[TSDB_CONFIG_VALUE_LEN + VARSTR_HEADER_SIZE] = {0};
1,447✔
1531

1532
  for (int32_t i = 0; i < totalRows; i++) {
14,239✔
1533
    cols = 0;
12,821✔
1534

1535
    STR_WITH_MAXSIZE_TO_VARSTR(buf, cfgOpts[i], TSDB_CONFIG_OPTION_LEN);
12,821✔
1536
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
12,821✔
1537
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)buf, false), &lino, _OVER);
12,480!
1538

1539
    STR_WITH_MAXSIZE_TO_VARSTR(bufVal, cfgVals[i], TSDB_CONFIG_VALUE_LEN);
12,816✔
1540
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
12,816✔
1541
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)bufVal, false), &lino, _OVER);
12,496!
1542

1543
    numOfRows++;
12,792✔
1544
  }
1545

1546
_OVER:
1,418✔
1547
  if (code != 0) mError("failed to retrieve configs at line:%d since %s", lino, tstrerror(code));
1,418!
1548
  pShow->numOfRows += numOfRows;
1,442✔
1549
  return numOfRows;
1,442✔
1550
}
1551

1552
static void mndCancelGetNextConfig(SMnode *pMnode, void *pIter) {}
×
1553

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

1566
  while (numOfRows < rows) {
18,005✔
1567
    pShow->pIter = sdbFetchAll(pSdb, SDB_DNODE, pShow->pIter, (void **)&pDnode, &objStatus, true);
18,004✔
1568
    if (pShow->pIter == NULL) break;
18,008✔
1569
    bool online = mndIsDnodeOnline(pDnode, curMs);
10,391✔
1570

1571
    cols = 0;
10,382✔
1572

1573
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
10,382✔
1574
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pDnode->id, false), pDnode, &lino, _OVER);
10,382!
1575

1576
    STR_WITH_MAXSIZE_TO_VARSTR(buf, pDnode->ep, pShow->pMeta->pSchemas[cols].bytes);
10,379✔
1577

1578
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
10,379✔
1579
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, buf, false), pDnode, &lino, _OVER);
10,372!
1580

1581
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
10,372✔
1582
    int16_t id = mndGetVnodesNum(pMnode, pDnode->id);
10,364✔
1583
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&id, false), pDnode, &lino, _OVER);
10,391!
1584

1585
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
10,383✔
1586
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pDnode->numOfSupportVnodes, false), pDnode,
10,373!
1587
                        &lino, _OVER);
1588

1589
    const char *status = "ready";
10,375✔
1590
    if (objStatus == SDB_STATUS_CREATING) status = "creating";
10,375!
1591
    if (objStatus == SDB_STATUS_DROPPING) status = "dropping";
10,375!
1592
    if (!online) {
10,375✔
1593
      if (objStatus == SDB_STATUS_CREATING)
544!
1594
        status = "creating*";
×
1595
      else if (objStatus == SDB_STATUS_DROPPING)
544!
1596
        status = "dropping*";
×
1597
      else
1598
        status = "offline";
544✔
1599
    }
1600

1601
    STR_TO_VARSTR(buf, status);
10,375✔
1602
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
10,375✔
1603
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, buf, false), pDnode, &lino, _OVER);
10,373!
1604

1605
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
10,376✔
1606
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pDnode->createdTime, false), pDnode, &lino,
10,371!
1607
                        _OVER);
1608

1609
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
10,367✔
1610
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pDnode->rebootTime, false), pDnode, &lino,
10,368!
1611
                        _OVER);
1612

1613
    char *b = taosMemoryCalloc(VARSTR_HEADER_SIZE + strlen(offlineReason[pDnode->offlineReason]) + 1, 1);
10,364!
1614
    STR_TO_VARSTR(b, online ? "" : offlineReason[pDnode->offlineReason]);
10,388✔
1615

1616
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
10,388✔
1617
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, b, false), pDnode, &lino, _OVER);
10,378!
1618
    taosMemoryFreeClear(b);
10,376!
1619

1620
#ifdef TD_ENTERPRISE
1621
    STR_TO_VARSTR(buf, pDnode->machineId);
10,379✔
1622
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
10,379✔
1623
    RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, buf, false), pDnode, &lino, _OVER);
10,374!
1624
#endif
1625

1626
    numOfRows++;
10,372✔
1627
    sdbRelease(pSdb, pDnode);
10,372✔
1628
  }
1629

1630
_OVER:
1✔
1631
  if (code != 0) mError("failed to retrieve dnodes at line:%d since %s", lino, tstrerror(code));
7,618!
1632

1633
  pShow->numOfRows += numOfRows;
7,616✔
1634
  return numOfRows;
7,616✔
1635
}
1636

1637
static void mndCancelGetNextDnode(SMnode *pMnode, void *pIter) {
×
1638
  SSdb *pSdb = pMnode->pSdb;
×
1639
  sdbCancelFetchByType(pSdb, pIter, SDB_DNODE);
×
1640
}
×
1641

1642
SArray *mndGetAllDnodeFqdns(SMnode *pMnode) {
4,002✔
1643
  SDnodeObj *pObj = NULL;
4,002✔
1644
  void      *pIter = NULL;
4,002✔
1645
  SSdb      *pSdb = pMnode->pSdb;
4,002✔
1646
  SArray    *fqdns = taosArrayInit(4, sizeof(void *));
4,002✔
1647
  while (1) {
3,632✔
1648
    pIter = sdbFetch(pSdb, SDB_DNODE, pIter, (void **)&pObj);
7,634✔
1649
    if (pIter == NULL) break;
7,634✔
1650

1651
    char *fqdn = taosStrdup(pObj->fqdn);
3,632!
1652
    if (taosArrayPush(fqdns, &fqdn) == NULL) {
3,632!
1653
      mError("failed to fqdn into array, but continue at this time");
×
1654
    }
1655
    sdbRelease(pSdb, pObj);
3,632✔
1656
  }
1657
  return fqdns;
4,002✔
1658
}
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