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

taosdata / TDengine / #3523

06 Nov 2024 02:29AM UTC coverage: 55.861% (-2.4%) from 58.216%
#3523

push

travis-ci

web-flow
Merge pull request #28551 from taosdata/feat/TS-5215-2

test(blob): testing & fixes for blob

106075 of 245834 branches covered (43.15%)

Branch coverage included in aggregate %.

0 of 15 new or added lines in 2 files covered. (0.0%)

17003 existing lines in 254 files now uncovered.

181910 of 269703 relevant lines covered (67.45%)

1527639.59 hits per line

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

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

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

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

59
void mndCleanupSnode(SMnode *pMnode) {}
715✔
60

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

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

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

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

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

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

95
  terrno = 0;
90✔
96

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

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

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

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

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

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

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

135
  terrno = 0;
20✔
136

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

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

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

167
  return 0;
20✔
168
}
169

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

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

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

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

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

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

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

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

243
  TAOS_RETURN(code);
7✔
244
}
245

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

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

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

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

274
  TAOS_RETURN(code);
7✔
275
}
276

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

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

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

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

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

302
  code = 0;
7✔
303

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

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

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

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

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

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

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

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

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

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

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

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

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

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

UNCOV
409
  TAOS_RETURN(code);
×
410
}
411

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

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

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

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

UNCOV
437
  code = 0;
×
438

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

510
  pShow->numOfRows += numOfRows;
13✔
511

512
  return numOfRows;
13✔
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