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

taosdata / TDengine / #4192

30 May 2025 03:55AM UTC coverage: 63.023% (-0.2%) from 63.267%
#4192

push

travis-ci

web-flow
fix:defined col bind in interlace mode (#31246)

157832 of 318864 branches covered (49.5%)

Branch coverage included in aggregate %.

1 of 3 new or added lines in 1 file covered. (33.33%)

2934 existing lines in 172 files now uncovered.

243367 of 317732 relevant lines covered (76.6%)

17346426.62 hits per line

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

66.73
/source/dnode/mnode/impl/src/mndSnode.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 "mndDnode.h"
18
#include "mndPrivilege.h"
19
#include "mndShow.h"
20
#include "mndSnode.h"
21
#include "mndTrans.h"
22
#include "mndUser.h"
23

24
#define SNODE_VER_NUMBER   1
25
#define SNODE_RESERVE_SIZE 64
26

27
static SSdbRaw *mndSnodeActionEncode(SSnodeObj *pObj);
28
static SSdbRow *mndSnodeActionDecode(SSdbRaw *pRaw);
29
static int32_t  mndSnodeActionInsert(SSdb *pSdb, SSnodeObj *pObj);
30
static int32_t  mndSnodeActionUpdate(SSdb *pSdb, SSnodeObj *pOld, SSnodeObj *pNew);
31
static int32_t  mndSnodeActionDelete(SSdb *pSdb, SSnodeObj *pObj);
32
static int32_t  mndProcessCreateSnodeReq(SRpcMsg *pReq);
33
static int32_t  mndProcessDropSnodeReq(SRpcMsg *pReq);
34
static int32_t  mndRetrieveSnodes(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
35
static void     mndCancelGetNextSnode(SMnode *pMnode, void *pIter);
36

37
int32_t mndInitSnode(SMnode *pMnode) {
2,189✔
38
  SSdbTable table = {
2,189✔
39
      .sdbType = SDB_SNODE,
40
      .keyType = SDB_KEY_INT32,
41
      .encodeFp = (SdbEncodeFp)mndSnodeActionEncode,
42
      .decodeFp = (SdbDecodeFp)mndSnodeActionDecode,
43
      .insertFp = (SdbInsertFp)mndSnodeActionInsert,
44
      .updateFp = (SdbUpdateFp)mndSnodeActionUpdate,
45
      .deleteFp = (SdbDeleteFp)mndSnodeActionDelete,
46
  };
47

48
  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_SNODE, mndProcessCreateSnodeReq);
2,189✔
49
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_SNODE, mndProcessDropSnodeReq);
2,189✔
50
  mndSetMsgHandle(pMnode, TDMT_DND_CREATE_SNODE_RSP, mndTransProcessRsp);
2,189✔
51
  mndSetMsgHandle(pMnode, TDMT_DND_DROP_SNODE_RSP, mndTransProcessRsp);
2,189✔
52

53
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_SNODE, mndRetrieveSnodes);
2,189✔
54
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_SNODE, mndCancelGetNextSnode);
2,189✔
55

56
  return sdbSetTable(pMnode->pSdb, table);
2,189✔
57
}
58

59
void mndCleanupSnode(SMnode *pMnode) {}
2,188✔
60

61
SEpSet mndAcquireEpFromSnode(SMnode *pMnode, const SSnodeObj *pSnode) {
91✔
62
  SEpSet epSet = {.numOfEps = 1, .inUse = 0};
91✔
63
  memcpy(epSet.eps[0].fqdn, pSnode->pDnode->fqdn, TSDB_FQDN_LEN);
91✔
64
  epSet.eps[0].port = pSnode->pDnode->port;
91✔
65
  return epSet;
91✔
66
}
67

68
SSnodeObj *mndAcquireSnode(SMnode *pMnode, int32_t snodeId) {
42✔
69
  SSnodeObj *pObj = sdbAcquire(pMnode->pSdb, SDB_SNODE, &snodeId);
42✔
70
  if (pObj == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
42!
71
    terrno = TSDB_CODE_MND_SNODE_NOT_EXIST;
33✔
72
  }
73
  return pObj;
42✔
74
}
75

76
void mndReleaseSnode(SMnode *pMnode, SSnodeObj *pObj) {
45✔
77
  SSdb *pSdb = pMnode->pSdb;
45✔
78
  sdbRelease(pSdb, pObj);
45✔
79
}
45✔
80

81
static SSdbRaw *mndSnodeActionEncode(SSnodeObj *pObj) {
214✔
82
  int32_t code = 0;
214✔
83
  int32_t lino = 0;
214✔
84
  terrno = TSDB_CODE_OUT_OF_MEMORY;
214✔
85

86
  SSdbRaw *pRaw = sdbAllocRaw(SDB_SNODE, SNODE_VER_NUMBER, sizeof(SSnodeObj) + SNODE_RESERVE_SIZE);
214✔
87
  if (pRaw == NULL) goto _OVER;
214!
88

89
  int32_t dataPos = 0;
214✔
90
  SDB_SET_INT32(pRaw, dataPos, pObj->id, _OVER)
214!
91
  SDB_SET_INT64(pRaw, dataPos, pObj->createdTime, _OVER)
214!
92
  SDB_SET_INT64(pRaw, dataPos, pObj->updateTime, _OVER)
214!
93
  SDB_SET_RESERVE(pRaw, dataPos, SNODE_RESERVE_SIZE, _OVER)
214!
94

95
  terrno = 0;
214✔
96

97
_OVER:
214✔
98
  if (terrno != 0) {
214!
99
    mError("snode:%d, failed to encode to raw:%p since %s", pObj->id, pRaw, terrstr());
×
100
    sdbFreeRaw(pRaw);
×
101
    return NULL;
×
102
  }
103

104
  mTrace("snode:%d, encode to raw:%p, row:%p", pObj->id, pRaw, pObj);
214!
105
  return pRaw;
214✔
106
}
107

108
static SSdbRow *mndSnodeActionDecode(SSdbRaw *pRaw) {
88✔
109
  int32_t code = 0;
88✔
110
  int32_t lino = 0;
88✔
111
  terrno = TSDB_CODE_OUT_OF_MEMORY;
88✔
112
  SSdbRow   *pRow = NULL;
88✔
113
  SSnodeObj *pObj = NULL;
88✔
114

115
  int8_t sver = 0;
88✔
116
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
88!
117

118
  if (sver != SNODE_VER_NUMBER) {
88!
119
    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
×
120
    goto _OVER;
×
121
  }
122

123
  pRow = sdbAllocRow(sizeof(SSnodeObj));
88✔
124
  if (pRow == NULL) goto _OVER;
88!
125

126
  pObj = sdbGetRowObj(pRow);
88✔
127
  if (pObj == NULL) goto _OVER;
88!
128

129
  int32_t dataPos = 0;
88✔
130
  SDB_GET_INT32(pRaw, dataPos, &pObj->id, _OVER)
88!
131
  SDB_GET_INT64(pRaw, dataPos, &pObj->createdTime, _OVER)
88!
132
  SDB_GET_INT64(pRaw, dataPos, &pObj->updateTime, _OVER)
88!
133
  SDB_GET_RESERVE(pRaw, dataPos, SNODE_RESERVE_SIZE, _OVER)
88!
134

135
  terrno = 0;
88✔
136

137
_OVER:
88✔
138
  if (terrno != 0) {
88!
139
    mError("snode:%d, failed to decode from raw:%p since %s", pObj == NULL ? 0 : pObj->id, pRaw, terrstr());
×
140
    taosMemoryFreeClear(pRow);
×
141
    return NULL;
×
142
  }
143

144
  mTrace("snode:%d, decode from raw:%p, row:%p", pObj->id, pRaw, pObj);
88!
145
  return pRow;
88✔
146
}
147

148
static int32_t mndSnodeActionInsert(SSdb *pSdb, SSnodeObj *pObj) {
47✔
149
  mTrace("snode:%d, perform insert action, row:%p", pObj->id, pObj);
47!
150
  pObj->pDnode = sdbAcquire(pSdb, SDB_DNODE, &pObj->id);
47✔
151
  if (pObj->pDnode == NULL) {
47!
152
    terrno = TSDB_CODE_MND_DNODE_NOT_EXIST;
×
153
    mError("snode:%d, failed to perform insert action since %s", pObj->id, terrstr());
×
154
    return -1;
×
155
  }
156

157
  return 0;
47✔
158
}
159

160
static int32_t mndSnodeActionDelete(SSdb *pSdb, SSnodeObj *pObj) {
88✔
161
  mTrace("snode:%d, perform delete action, row:%p", pObj->id, pObj);
88!
162
  if (pObj->pDnode != NULL) {
88✔
163
    sdbRelease(pSdb, pObj->pDnode);
47✔
164
    pObj->pDnode = NULL;
47✔
165
  }
166

167
  return 0;
88✔
168
}
169

170
static int32_t mndSnodeActionUpdate(SSdb *pSdb, SSnodeObj *pOld, SSnodeObj *pNew) {
33✔
171
  mTrace("snode:%d, perform update action, old row:%p new row:%p", pOld->id, pOld, pNew);
33!
172
  pOld->updateTime = pNew->updateTime;
33✔
173
  return 0;
33✔
174
}
175

176
static int32_t mndSetCreateSnodeRedoLogs(STrans *pTrans, SSnodeObj *pObj) {
22✔
177
  int32_t  code = 0;
22✔
178
  SSdbRaw *pRedoRaw = mndSnodeActionEncode(pObj);
22✔
179
  if (pRedoRaw == NULL) {
22!
180
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
181
    if (terrno != 0) code = terrno;
×
182
    TAOS_RETURN(code);
×
183
  }
184
  TAOS_CHECK_RETURN(mndTransAppendRedolog(pTrans, pRedoRaw));
22!
185
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_CREATING));
22!
186
  TAOS_RETURN(code);
22✔
187
}
188

189
static int32_t mndSetCreateSnodeUndoLogs(STrans *pTrans, SSnodeObj *pObj) {
22✔
190
  int32_t  code = 0;
22✔
191
  SSdbRaw *pUndoRaw = mndSnodeActionEncode(pObj);
22✔
192
  if (pUndoRaw == NULL) {
22!
193
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
194
    if (terrno != 0) code = terrno;
×
195
    TAOS_RETURN(code);
×
196
  }
197
  TAOS_CHECK_RETURN(mndTransAppendUndolog(pTrans, pUndoRaw));
22!
198
  TAOS_CHECK_RETURN(sdbSetRawStatus(pUndoRaw, SDB_STATUS_DROPPED));
22!
199
  TAOS_RETURN(code);
22✔
200
}
201

202
static int32_t mndSetCreateSnodeCommitLogs(STrans *pTrans, SSnodeObj *pObj) {
22✔
203
  int32_t  code = 0;
22✔
204
  SSdbRaw *pCommitRaw = mndSnodeActionEncode(pObj);
22✔
205
  if (pCommitRaw == NULL) {
22!
206
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
207
    if (terrno != 0) code = terrno;
×
208
    TAOS_RETURN(code);
×
209
  }
210
  TAOS_CHECK_RETURN(mndTransAppendCommitlog(pTrans, pCommitRaw));
22!
211
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
22!
212
  TAOS_RETURN(code);
22✔
213
}
214

215
static int32_t mndSetCreateSnodeRedoActions(STrans *pTrans, SDnodeObj *pDnode, SSnodeObj *pObj) {
22✔
216
  int32_t          code = 0;
22✔
217
  SDCreateSnodeReq createReq = {0};
22✔
218
  createReq.dnodeId = pDnode->id;
22✔
219

220
  int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
22✔
221
  void   *pReq = taosMemoryMalloc(contLen);
22!
222
  if (pReq == NULL) {
22!
223
    code = terrno;
×
224
    TAOS_RETURN(code);
×
225
  }
226
  code = tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
22✔
227
  if (code < 0) {
22!
228
    mError("snode:%d, failed to serialize create drop snode request since %s", createReq.dnodeId, terrstr());
×
229
  }
230

231
  STransAction action = {0};
22✔
232
  action.epSet = mndGetDnodeEpset(pDnode);
22✔
233
  action.pCont = pReq;
22✔
234
  action.contLen = contLen;
22✔
235
  action.msgType = TDMT_DND_CREATE_SNODE;
22✔
236
  action.acceptableCode = TSDB_CODE_SNODE_ALREADY_DEPLOYED;
22✔
237

238
  if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
22!
239
    taosMemoryFree(pReq);
×
240
    TAOS_RETURN(code);
×
241
  }
242

243
  TAOS_RETURN(code);
22✔
244
}
245

246
static int32_t mndSetCreateSnodeUndoActions(STrans *pTrans, SDnodeObj *pDnode, SSnodeObj *pObj) {
22✔
247
  int32_t        code = 0;
22✔
248
  SDDropSnodeReq dropReq = {0};
22✔
249
  dropReq.dnodeId = pDnode->id;
22✔
250

251
  int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
22✔
252
  void   *pReq = taosMemoryMalloc(contLen);
22!
253
  if (pReq == NULL) {
22!
254
    code = terrno;
×
255
    TAOS_RETURN(code);
×
256
  }
257
  code = tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
22✔
258
  if (code < 0) {
22!
259
    mError("snode:%d, failed to serialize create drop snode request since %s", dropReq.dnodeId, terrstr());
×
260
  }
261

262
  STransAction action = {0};
22✔
263
  action.epSet = mndGetDnodeEpset(pDnode);
22✔
264
  action.pCont = pReq;
22✔
265
  action.contLen = contLen;
22✔
266
  action.msgType = TDMT_DND_DROP_SNODE;
22✔
267
  action.acceptableCode = TSDB_CODE_SNODE_NOT_DEPLOYED;
22✔
268

269
  if ((code = mndTransAppendUndoAction(pTrans, &action)) != 0) {
22!
270
    taosMemoryFree(pReq);
×
271
    TAOS_RETURN(code);
×
272
  }
273

274
  TAOS_RETURN(code);
22✔
275
}
276

277
static int32_t mndCreateSnode(SMnode *pMnode, SRpcMsg *pReq, SDnodeObj *pDnode, SMCreateSnodeReq *pCreate) {
22✔
278
  int32_t code = -1;
22✔
279

280
  SSnodeObj snodeObj = {0};
22✔
281
  snodeObj.id = pDnode->id;
22✔
282
  snodeObj.createdTime = taosGetTimestampMs();
22✔
283
  snodeObj.updateTime = snodeObj.createdTime;
22✔
284

285
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_NOTHING, pReq, "create-snode");
22✔
286
  if (pTrans == NULL) {
22!
287
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
288
    if (terrno != 0) code = terrno;
×
289
    goto _OVER;
×
290
  }
291
  mndTransSetSerial(pTrans);
22✔
292

293
  mInfo("trans:%d, used to create snode:%d", pTrans->id, pCreate->dnodeId);
22!
294

295
  TAOS_CHECK_GOTO(mndSetCreateSnodeRedoLogs(pTrans, &snodeObj), NULL, _OVER);
22!
296
  TAOS_CHECK_GOTO(mndSetCreateSnodeUndoLogs(pTrans, &snodeObj), NULL, _OVER);
22!
297
  TAOS_CHECK_GOTO(mndSetCreateSnodeCommitLogs(pTrans, &snodeObj), NULL, _OVER);
22!
298
  TAOS_CHECK_GOTO(mndSetCreateSnodeRedoActions(pTrans, pDnode, &snodeObj), NULL, _OVER);
22!
299
  TAOS_CHECK_GOTO(mndSetCreateSnodeUndoActions(pTrans, pDnode, &snodeObj), NULL, _OVER);
22!
300
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
22!
301

302
  code = 0;
22✔
303

304
_OVER:
22✔
305
  mndTransDrop(pTrans);
22✔
306
  TAOS_RETURN(code);
22✔
307
}
308

309
static int32_t mndProcessCreateSnodeReq(SRpcMsg *pReq) {
29✔
310
  SMnode          *pMnode = pReq->info.node;
29✔
311
  int32_t          code = -1;
29✔
312
  SSnodeObj       *pObj = NULL;
29✔
313
  SDnodeObj       *pDnode = NULL;
29✔
314
  SMCreateSnodeReq createReq = {0};
29✔
315

316
  TAOS_CHECK_GOTO(tDeserializeSCreateDropMQSNodeReq(pReq->pCont, pReq->contLen, &createReq), NULL, _OVER);
29!
317

318
  mInfo("snode:%d, start to create", createReq.dnodeId);
29!
319
  TAOS_CHECK_GOTO(mndCheckOperPrivilege(pMnode, pReq->info.conn.user, MND_OPER_CREATE_SNODE), NULL, _OVER);
29✔
320

321
  //  pObj = mndAcquireSnode(pMnode, createReq.dnodeId);
322
  //  if (pObj != NULL) {
323
  //    terrno = TSDB_CODE_MND_SNODE_ALREADY_EXIST;
324
  //    goto _OVER;
325
  //  } else if (terrno != TSDB_CODE_MND_SNODE_NOT_EXIST) {
326
  //    goto _OVER;
327
  //  }
328

329
  if (sdbGetSize(pMnode->pSdb, SDB_SNODE) >= 1) {
28✔
330
    code = TSDB_CODE_MND_SNODE_ALREADY_EXIST;
6✔
331
    goto _OVER;
6✔
332
  }
333

334
  pDnode = mndAcquireDnode(pMnode, createReq.dnodeId);
22✔
335
  if (pDnode == NULL) {
22!
336
    code = TSDB_CODE_MND_DNODE_NOT_EXIST;
×
337
    goto _OVER;
×
338
  }
339

340
  code = mndCreateSnode(pMnode, pReq, pDnode, &createReq);
22✔
341
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
22!
342

343
_OVER:
×
344
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
29!
345
    mError("snode:%d, failed to create since %s", createReq.dnodeId, tstrerror(code));
7!
346
    TAOS_RETURN(code);
7✔
347
  }
348

349
  //  mndReleaseSnode(pMnode, pObj);
350
  mndReleaseDnode(pMnode, pDnode);
22✔
351
  tFreeSMCreateQnodeReq(&createReq);
22✔
352
  TAOS_RETURN(code);
22✔
353
}
354

355
static int32_t mndSetDropSnodeRedoLogs(STrans *pTrans, SSnodeObj *pObj) {
8✔
356
  int32_t  code = 0;
8✔
357
  SSdbRaw *pRedoRaw = mndSnodeActionEncode(pObj);
8✔
358
  if (pRedoRaw == NULL) {
8!
359
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
360
    if (terrno != 0) code = terrno;
×
361
    TAOS_RETURN(code);
×
362
  }
363
  TAOS_CHECK_RETURN(mndTransAppendGroupRedolog(pTrans, pRedoRaw, -1));
8!
364
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_DROPPING));
8!
365
  TAOS_RETURN(code);
8✔
366
}
367

368
static int32_t mndSetDropSnodeCommitLogs(STrans *pTrans, SSnodeObj *pObj) {
8✔
369
  int32_t  code = 0;
8✔
370
  SSdbRaw *pCommitRaw = mndSnodeActionEncode(pObj);
8✔
371
  if (pCommitRaw == NULL) {
8!
372
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
373
    if (terrno != 0) code = terrno;
×
374
    TAOS_RETURN(code);
×
375
  }
376
  TAOS_CHECK_RETURN(mndTransAppendCommitlog(pTrans, pCommitRaw));
8!
377
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED));
8!
378
  TAOS_RETURN(code);
8✔
379
}
380

381
static int32_t mndSetDropSnodeRedoActions(STrans *pTrans, SDnodeObj *pDnode, SSnodeObj *pObj) {
6✔
382
  int32_t        code = 0;
6✔
383
  SDDropSnodeReq dropReq = {0};
6✔
384
  dropReq.dnodeId = pDnode->id;
6✔
385

386
  int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
6✔
387
  void   *pReq = taosMemoryMalloc(contLen);
6!
388
  if (pReq == NULL) {
6!
389
    code = terrno;
×
390
    TAOS_RETURN(code);
×
391
  }
392
  code = tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
6✔
393
  if (code < 0) {
6!
394
    mError("snode:%d, failed to serialize create drop snode request since %s", dropReq.dnodeId, terrstr());
×
395
  }
396

397
  STransAction action = {0};
6✔
398
  action.epSet = mndGetDnodeEpset(pDnode);
6✔
399
  action.pCont = pReq;
6✔
400
  action.contLen = contLen;
6✔
401
  action.msgType = TDMT_DND_DROP_SNODE;
6✔
402
  action.acceptableCode = TSDB_CODE_SNODE_NOT_DEPLOYED;
6✔
403
  action.groupId = 1;
6✔
404

405
  if ((code = mndTransAppendRedoAction(pTrans, &action)) != 0) {
6!
406
    taosMemoryFree(pReq);
×
UNCOV
407
    TAOS_RETURN(code);
×
408
  }
409

410
  TAOS_RETURN(code);
6✔
411
}
412

413
int32_t mndSetDropSnodeInfoToTrans(SMnode *pMnode, STrans *pTrans, SSnodeObj *pObj, bool force) {
8✔
414
  if (pObj == NULL) return 0;
8!
415
  TAOS_CHECK_RETURN(mndSetDropSnodeRedoLogs(pTrans, pObj));
8!
416
  TAOS_CHECK_RETURN(mndSetDropSnodeCommitLogs(pTrans, pObj));
8!
417
  if (!force) {
8✔
418
    TAOS_CHECK_RETURN(mndSetDropSnodeRedoActions(pTrans, pObj->pDnode, pObj));
6!
419
  }
420
  return 0;
8✔
421
}
422

423
static int32_t mndDropSnode(SMnode *pMnode, SRpcMsg *pReq, SSnodeObj *pObj) {
5✔
424
  int32_t code = -1;
5✔
425

426
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_NOTHING, pReq, "drop-snode");
5✔
427
  if (pTrans == NULL) {
5!
428
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
429
    if (terrno != 0) code = terrno;
×
UNCOV
430
    goto _OVER;
×
431
  }
432
  mndTransSetSerial(pTrans);
5✔
433

434
  mInfo("trans:%d, used to drop snode:%d", pTrans->id, pObj->id);
5!
435
  TAOS_CHECK_GOTO(mndSetDropSnodeInfoToTrans(pMnode, pTrans, pObj, false), NULL, _OVER);
5!
436
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
5!
437

438
  code = 0;
5✔
439

440
_OVER:
5✔
441
  mndTransDrop(pTrans);
5✔
442
  TAOS_RETURN(code);
5✔
443
}
444

445
static int32_t mndProcessDropSnodeReq(SRpcMsg *pReq) {
10✔
446
  SMnode        *pMnode = pReq->info.node;
10✔
447
  int32_t        code = -1;
10✔
448
  SSnodeObj     *pObj = NULL;
10✔
449
  SMDropSnodeReq dropReq = {0};
10✔
450

451
  TAOS_CHECK_GOTO(tDeserializeSCreateDropMQSNodeReq(pReq->pCont, pReq->contLen, &dropReq), NULL, _OVER);
10!
452

453
  mInfo("snode:%d, start to drop", dropReq.dnodeId);
10!
454
  TAOS_CHECK_GOTO(mndCheckOperPrivilege(pMnode, pReq->info.conn.user, MND_OPER_DROP_SNODE), NULL, _OVER);
10✔
455

456
  if (dropReq.dnodeId <= 0) {
9!
457
    code = TSDB_CODE_INVALID_MSG;
×
UNCOV
458
    goto _OVER;
×
459
  }
460

461
  pObj = mndAcquireSnode(pMnode, dropReq.dnodeId);
9✔
462
  if (pObj == NULL) {
9✔
463
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
4✔
464
    if (terrno != 0) code = terrno;
4!
465
    goto _OVER;
4✔
466
  }
467

468
  // check deletable
469
  code = mndDropSnode(pMnode, pReq, pObj);
5✔
470
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
5!
471

UNCOV
472
_OVER:
×
473
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
10!
474
    mError("snode:%d, failed to drop since %s", dropReq.dnodeId, tstrerror(code));
5!
475
  }
476

477
  mndReleaseSnode(pMnode, pObj);
10✔
478
  tFreeSMCreateQnodeReq(&dropReq);
10✔
479
  TAOS_RETURN(code);
10✔
480
}
481

482
static int32_t mndRetrieveSnodes(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
2,195✔
483
  SMnode    *pMnode = pReq->info.node;
2,195✔
484
  SSdb      *pSdb = pMnode->pSdb;
2,195✔
485
  int32_t    numOfRows = 0;
2,195✔
486
  int32_t    cols = 0;
2,195✔
487
  SSnodeObj *pObj = NULL;
2,195✔
488

489
  while (numOfRows < rows) {
4,377✔
490
    pShow->pIter = sdbFetch(pSdb, SDB_SNODE, pShow->pIter, (void **)&pObj);
4,374✔
491
    if (pShow->pIter == NULL) break;
4,375✔
492

493
    cols = 0;
2,180✔
494
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
2,180✔
495
    TAOS_CHECK_RETURN_WITH_RELEASE(colDataSetVal(pColInfo, numOfRows, (const char *)&pObj->id, false), pSdb, pObj);
2,179!
496

497
    char ep[TSDB_EP_LEN + VARSTR_HEADER_SIZE] = {0};
2,178✔
498
    STR_WITH_MAXSIZE_TO_VARSTR(ep, pObj->pDnode->ep, pShow->pMeta->pSchemas[cols].bytes);
2,178✔
499

500
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
2,178✔
501
    TAOS_CHECK_RETURN_WITH_RELEASE(colDataSetVal(pColInfo, numOfRows, (const char *)ep, false), pSdb, pObj);
2,176!
502

503
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
2,178✔
504
    TAOS_CHECK_RETURN_WITH_RELEASE(colDataSetVal(pColInfo, numOfRows, (const char *)&pObj->createdTime, false), pSdb,
2,178!
505
                                   pObj);
506

507
    numOfRows++;
2,177✔
508
    sdbRelease(pSdb, pObj);
2,177✔
509
  }
510

511
  pShow->numOfRows += numOfRows;
2,198✔
512

513
  return numOfRows;
2,198✔
514
}
515

516
static void mndCancelGetNextSnode(SMnode *pMnode, void *pIter) {
×
517
  SSdb *pSdb = pMnode->pSdb;
×
518
  sdbCancelFetchByType(pSdb, pIter, SDB_SNODE);
×
UNCOV
519
}
×
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