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

taosdata / TDengine / #3798

31 Mar 2025 10:39AM UTC coverage: 9.424% (-20.9%) from 30.372%
#3798

push

travis-ci

happyguoxy
test:add test cases

21549 of 307601 branches covered (7.01%)

Branch coverage included in aggregate %.

36084 of 303967 relevant lines covered (11.87%)

58620.7 hits per line

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

0.0
/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) {
×
38
  SSdbTable table = {
×
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);
×
49
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_SNODE, mndProcessDropSnodeReq);
×
50
  mndSetMsgHandle(pMnode, TDMT_DND_CREATE_SNODE_RSP, mndTransProcessRsp);
×
51
  mndSetMsgHandle(pMnode, TDMT_DND_DROP_SNODE_RSP, mndTransProcessRsp);
×
52

53
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_SNODE, mndRetrieveSnodes);
×
54
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_SNODE, mndCancelGetNextSnode);
×
55

56
  return sdbSetTable(pMnode->pSdb, table);
×
57
}
58

59
void mndCleanupSnode(SMnode *pMnode) {}
×
60

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

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

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

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

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

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

95
  terrno = 0;
×
96

97
_OVER:
×
98
  if (terrno != 0) {
×
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);
×
105
  return pRaw;
×
106
}
107

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

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

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

123
  pRow = sdbAllocRow(sizeof(SSnodeObj));
×
124
  if (pRow == NULL) goto _OVER;
×
125

126
  pObj = sdbGetRowObj(pRow);
×
127
  if (pObj == NULL) goto _OVER;
×
128

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

135
  terrno = 0;
×
136

137
_OVER:
×
138
  if (terrno != 0) {
×
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);
×
145
  return pRow;
×
146
}
147

148
static int32_t mndSnodeActionInsert(SSdb *pSdb, SSnodeObj *pObj) {
×
149
  mTrace("snode:%d, perform insert action, row:%p", pObj->id, pObj);
×
150
  pObj->pDnode = sdbAcquire(pSdb, SDB_DNODE, &pObj->id);
×
151
  if (pObj->pDnode == NULL) {
×
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;
×
158
}
159

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

167
  return 0;
×
168
}
169

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

176
static int32_t mndSetCreateSnodeRedoLogs(STrans *pTrans, SSnodeObj *pObj) {
×
177
  int32_t  code = 0;
×
178
  SSdbRaw *pRedoRaw = mndSnodeActionEncode(pObj);
×
179
  if (pRedoRaw == NULL) {
×
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));
×
185
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_CREATING));
×
186
  TAOS_RETURN(code);
×
187
}
188

189
static int32_t mndSetCreateSnodeUndoLogs(STrans *pTrans, SSnodeObj *pObj) {
×
190
  int32_t  code = 0;
×
191
  SSdbRaw *pUndoRaw = mndSnodeActionEncode(pObj);
×
192
  if (pUndoRaw == NULL) {
×
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));
×
198
  TAOS_CHECK_RETURN(sdbSetRawStatus(pUndoRaw, SDB_STATUS_DROPPED));
×
199
  TAOS_RETURN(code);
×
200
}
201

202
static int32_t mndSetCreateSnodeCommitLogs(STrans *pTrans, SSnodeObj *pObj) {
×
203
  int32_t  code = 0;
×
204
  SSdbRaw *pCommitRaw = mndSnodeActionEncode(pObj);
×
205
  if (pCommitRaw == NULL) {
×
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));
×
211
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
×
212
  TAOS_RETURN(code);
×
213
}
214

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

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

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

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

243
  TAOS_RETURN(code);
×
244
}
245

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

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

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

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

274
  TAOS_RETURN(code);
×
275
}
276

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

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

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

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

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

302
  code = 0;
×
303

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

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

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

318
  mInfo("snode:%d, start to create", createReq.dnodeId);
×
319
  TAOS_CHECK_GOTO(mndCheckOperPrivilege(pMnode, pReq->info.conn.user, MND_OPER_CREATE_SNODE), NULL, _OVER);
×
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) {
×
330
    code = TSDB_CODE_MND_SNODE_ALREADY_EXIST;
×
331
    goto _OVER;
×
332
  }
333

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

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

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

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

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

368
static int32_t mndSetDropSnodeCommitLogs(STrans *pTrans, SSnodeObj *pObj) {
×
369
  int32_t  code = 0;
×
370
  SSdbRaw *pCommitRaw = mndSnodeActionEncode(pObj);
×
371
  if (pCommitRaw == NULL) {
×
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));
×
377
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED));
×
378
  TAOS_RETURN(code);
×
379
}
380

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

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

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

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

409
  TAOS_RETURN(code);
×
410
}
411

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

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

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

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

437
  code = 0;
×
438

439
_OVER:
×
440
  mndTransDrop(pTrans);
×
441
  TAOS_RETURN(code);
×
442
}
443

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

450
  TAOS_CHECK_GOTO(tDeserializeSCreateDropMQSNodeReq(pReq->pCont, pReq->contLen, &dropReq), NULL, _OVER);
×
451

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

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

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

467
  // check deletable
468
  code = mndDropSnode(pMnode, pReq, pObj);
×
469
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
×
470

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

476
  mndReleaseSnode(pMnode, pObj);
×
477
  tFreeSMCreateQnodeReq(&dropReq);
×
478
  TAOS_RETURN(code);
×
479
}
480

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

488
  while (numOfRows < rows) {
×
489
    pShow->pIter = sdbFetch(pSdb, SDB_SNODE, pShow->pIter, (void **)&pObj);
×
490
    if (pShow->pIter == NULL) break;
×
491

492
    cols = 0;
×
493
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
×
494
    TAOS_CHECK_RETURN_WITH_RELEASE(colDataSetVal(pColInfo, numOfRows, (const char *)&pObj->id, false), pSdb, pObj);
×
495

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

499
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
×
500
    TAOS_CHECK_RETURN_WITH_RELEASE(colDataSetVal(pColInfo, numOfRows, (const char *)ep, false), pSdb, pObj);
×
501

502
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
×
503
    TAOS_CHECK_RETURN_WITH_RELEASE(colDataSetVal(pColInfo, numOfRows, (const char *)&pObj->createdTime, false), pSdb,
×
504
                                   pObj);
505

506
    numOfRows++;
×
507
    sdbRelease(pSdb, pObj);
×
508
  }
509

510
  pShow->numOfRows += numOfRows;
×
511

512
  return numOfRows;
×
513
}
514

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