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

#define _DEFAULT_SOURCE
#include "mndSnode.h"
S
Shengliang Guan 已提交
18
#include "mndAuth.h"
S
Shengliang Guan 已提交
19 20 21
#include "mndDnode.h"
#include "mndShow.h"
#include "mndTrans.h"
S
Shengliang Guan 已提交
22
#include "mndUser.h"
S
Shengliang Guan 已提交
23

24 25
#define SNODE_VER_NUMBER   1
#define SNODE_RESERVE_SIZE 64
S
Shengliang Guan 已提交
26 27 28 29

static SSdbRaw *mndSnodeActionEncode(SSnodeObj *pObj);
static SSdbRow *mndSnodeActionDecode(SSdbRaw *pRaw);
static int32_t  mndSnodeActionInsert(SSdb *pSdb, SSnodeObj *pObj);
S
Shengliang Guan 已提交
30
static int32_t  mndSnodeActionUpdate(SSdb *pSdb, SSnodeObj *pOld, SSnodeObj *pNew);
31
static int32_t  mndSnodeActionDelete(SSdb *pSdb, SSnodeObj *pObj);
S
Shengliang Guan 已提交
32 33
static int32_t  mndProcessCreateSnodeReq(SNodeMsg *pReq);
static int32_t  mndProcessCreateSnodeRsp(SNodeMsg *pRsp);
34
static int32_t  mndProcessDropSnodeReq(SNodeMsg *pReq);
S
Shengliang Guan 已提交
35 36 37
static int32_t  mndProcessDropSnodeRsp(SNodeMsg *pRsp);
static int32_t  mndGetSnodeMeta(SNodeMsg *pReq, SShowObj *pShow, STableMetaRsp *pMeta);
static int32_t  mndRetrieveSnodes(SNodeMsg *pReq, SShowObj *pShow, char *data, int32_t rows);
S
Shengliang Guan 已提交
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
static void     mndCancelGetNextSnode(SMnode *pMnode, void *pIter);

int32_t mndInitSnode(SMnode *pMnode) {
  SSdbTable table = {.sdbType = SDB_SNODE,
                     .keyType = SDB_KEY_INT32,
                     .encodeFp = (SdbEncodeFp)mndSnodeActionEncode,
                     .decodeFp = (SdbDecodeFp)mndSnodeActionDecode,
                     .insertFp = (SdbInsertFp)mndSnodeActionInsert,
                     .updateFp = (SdbUpdateFp)mndSnodeActionUpdate,
                     .deleteFp = (SdbDeleteFp)mndSnodeActionDelete};

  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_SNODE, mndProcessCreateSnodeReq);
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_SNODE, mndProcessDropSnodeReq);
  mndSetMsgHandle(pMnode, TDMT_DND_CREATE_SNODE_RSP, mndProcessCreateSnodeRsp);
  mndSetMsgHandle(pMnode, TDMT_DND_DROP_SNODE_RSP, mndProcessDropSnodeRsp);

  mndAddShowMetaHandle(pMnode, TSDB_MGMT_TABLE_SNODE, mndGetSnodeMeta);
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_SNODE, mndRetrieveSnodes);
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_SNODE, mndCancelGetNextSnode);

  return sdbSetTable(pMnode->pSdb, table);
}

void mndCleanupSnode(SMnode *pMnode) {}

L
Liu Jicong 已提交
63
SEpSet mndAcquireEpFromSnode(SMnode *pMnode, const SSnodeObj *pSnode) {
64 65 66
  SEpSet epSet = {.numOfEps = 1, .inUse = 0};
  memcpy(epSet.eps[0].fqdn, pSnode->pDnode->fqdn, TSDB_FQDN_LEN);
  epSet.eps[0].port = pSnode->pDnode->port;
L
Liu Jicong 已提交
67 68 69
  return epSet;
}

S
Shengliang Guan 已提交
70
static SSnodeObj *mndAcquireSnode(SMnode *pMnode, int32_t snodeId) {
71 72
  SSnodeObj *pObj = sdbAcquire(pMnode->pSdb, SDB_SNODE, &snodeId);
  if (pObj == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
S
Shengliang Guan 已提交
73 74 75 76 77 78 79 80 81 82 83
    terrno = TSDB_CODE_MND_SNODE_NOT_EXIST;
  }
  return pObj;
}

static void mndReleaseSnode(SMnode *pMnode, SSnodeObj *pObj) {
  SSdb *pSdb = pMnode->pSdb;
  sdbRelease(pSdb, pObj);
}

static SSdbRaw *mndSnodeActionEncode(SSnodeObj *pObj) {
84 85
  terrno = TSDB_CODE_OUT_OF_MEMORY;

86 87
  SSdbRaw *pRaw = sdbAllocRaw(SDB_SNODE, SNODE_VER_NUMBER, sizeof(SSnodeObj) + SNODE_RESERVE_SIZE);
  if (pRaw == NULL) goto _OVER;
S
Shengliang Guan 已提交
88 89

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

  terrno = 0;
S
Shengliang Guan 已提交
96

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

  mTrace("snode:%d, encode to raw:%p, row:%p", pObj->id, pRaw, pObj);
S
Shengliang Guan 已提交
105 106 107 108
  return pRaw;
}

static SSdbRow *mndSnodeActionDecode(SSdbRaw *pRaw) {
109 110
  terrno = TSDB_CODE_OUT_OF_MEMORY;

S
Shengliang Guan 已提交
111
  int8_t sver = 0;
112
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
S
Shengliang Guan 已提交
113

114
  if (sver != SNODE_VER_NUMBER) {
S
Shengliang Guan 已提交
115
    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
116
    goto _OVER;
S
Shengliang Guan 已提交
117 118
  }

119
  SSdbRow *pRow = sdbAllocRow(sizeof(SSnodeObj));
120
  if (pRow == NULL) goto _OVER;
121

S
Shengliang Guan 已提交
122
  SSnodeObj *pObj = sdbGetRowObj(pRow);
123
  if (pObj == NULL) goto _OVER;
S
Shengliang Guan 已提交
124 125

  int32_t dataPos = 0;
126 127 128 129
  SDB_GET_INT32(pRaw, dataPos, &pObj->id, _OVER)
  SDB_GET_INT64(pRaw, dataPos, &pObj->createdTime, _OVER)
  SDB_GET_INT64(pRaw, dataPos, &pObj->updateTime, _OVER)
  SDB_GET_RESERVE(pRaw, dataPos, SNODE_RESERVE_SIZE, _OVER)
130 131

  terrno = 0;
S
Shengliang Guan 已提交
132

133
_OVER:
134 135
  if (terrno != 0) {
    mError("snode:%d, failed to decode from raw:%p since %s", pObj->id, pRaw, terrstr());
wafwerar's avatar
wafwerar 已提交
136
    taosMemoryFreeClear(pRow);
137 138 139 140
    return NULL;
  }

  mTrace("snode:%d, decode from raw:%p, row:%p", pObj->id, pRaw, pObj);
S
Shengliang Guan 已提交
141 142 143 144
  return pRow;
}

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

  return 0;
}

static int32_t mndSnodeActionDelete(SSdb *pSdb, SSnodeObj *pObj) {
157
  mTrace("snode:%d, perform delete action, row:%p", pObj->id, pObj);
S
Shengliang Guan 已提交
158 159 160 161 162 163 164 165
  if (pObj->pDnode != NULL) {
    sdbRelease(pSdb, pObj->pDnode);
    pObj->pDnode = NULL;
  }

  return 0;
}

S
Shengliang Guan 已提交
166
static int32_t mndSnodeActionUpdate(SSdb *pSdb, SSnodeObj *pOld, SSnodeObj *pNew) {
S
Shengliang Guan 已提交
167
  mTrace("snode:%d, perform update action, old row:%p new row:%p", pOld->id, pOld, pNew);
S
Shengliang Guan 已提交
168
  pOld->updateTime = pNew->updateTime;
S
Shengliang Guan 已提交
169 170 171 172 173 174 175 176 177 178 179
  return 0;
}

static int32_t mndSetCreateSnodeRedoLogs(STrans *pTrans, SSnodeObj *pObj) {
  SSdbRaw *pRedoRaw = mndSnodeActionEncode(pObj);
  if (pRedoRaw == NULL) return -1;
  if (mndTransAppendRedolog(pTrans, pRedoRaw) != 0) return -1;
  if (sdbSetRawStatus(pRedoRaw, SDB_STATUS_CREATING) != 0) return -1;
  return 0;
}

180 181 182 183 184 185 186 187
static int32_t mndSetCreateSnodeUndoLogs(STrans *pTrans, SSnodeObj *pObj) {
  SSdbRaw *pUndoRaw = mndSnodeActionEncode(pObj);
  if (pUndoRaw == NULL) return -1;
  if (mndTransAppendUndolog(pTrans, pUndoRaw) != 0) return -1;
  if (sdbSetRawStatus(pUndoRaw, SDB_STATUS_DROPPED) != 0) return -1;
  return 0;
}

S
Shengliang Guan 已提交
188 189 190 191 192 193 194 195 196
static int32_t mndSetCreateSnodeCommitLogs(STrans *pTrans, SSnodeObj *pObj) {
  SSdbRaw *pCommitRaw = mndSnodeActionEncode(pObj);
  if (pCommitRaw == NULL) return -1;
  if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) return -1;
  if (sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY) != 0) return -1;
  return 0;
}

static int32_t mndSetCreateSnodeRedoActions(STrans *pTrans, SDnodeObj *pDnode, SSnodeObj *pObj) {
S
Shengliang Guan 已提交
197 198 199
  SDCreateSnodeReq createReq = {0};
  createReq.dnodeId = pDnode->id;

200
  int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
wafwerar's avatar
wafwerar 已提交
201
  void   *pReq = taosMemoryMalloc(contLen);
S
Shengliang Guan 已提交
202
  if (pReq == NULL) {
S
Shengliang Guan 已提交
203 204 205
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    return -1;
  }
206
  tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
S
Shengliang Guan 已提交
207 208 209

  STransAction action = {0};
  action.epSet = mndGetDnodeEpset(pDnode);
S
Shengliang Guan 已提交
210
  action.pCont = pReq;
S
Shengliang Guan 已提交
211
  action.contLen = contLen;
S
Shengliang Guan 已提交
212
  action.msgType = TDMT_DND_CREATE_SNODE;
S
shm  
Shengliang Guan 已提交
213
  action.acceptableCode = TSDB_CODE_NODE_ALREADY_DEPLOYED;
S
Shengliang Guan 已提交
214 215

  if (mndTransAppendRedoAction(pTrans, &action) != 0) {
wafwerar's avatar
wafwerar 已提交
216
    taosMemoryFree(pReq);
S
Shengliang Guan 已提交
217 218 219 220 221 222
    return -1;
  }

  return 0;
}

223
static int32_t mndSetCreateSnodeUndoActions(STrans *pTrans, SDnodeObj *pDnode, SSnodeObj *pObj) {
S
Shengliang Guan 已提交
224 225 226
  SDDropSnodeReq dropReq = {0};
  dropReq.dnodeId = pDnode->id;

227
  int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
wafwerar's avatar
wafwerar 已提交
228
  void   *pReq = taosMemoryMalloc(contLen);
S
Shengliang Guan 已提交
229
  if (pReq == NULL) {
230 231 232
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    return -1;
  }
233
  tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
234 235 236

  STransAction action = {0};
  action.epSet = mndGetDnodeEpset(pDnode);
S
Shengliang Guan 已提交
237
  action.pCont = pReq;
S
Shengliang Guan 已提交
238
  action.contLen = contLen;
239
  action.msgType = TDMT_DND_DROP_SNODE;
S
shm  
Shengliang Guan 已提交
240
  action.acceptableCode = TSDB_CODE_NODE_NOT_DEPLOYED;
241 242

  if (mndTransAppendUndoAction(pTrans, &action) != 0) {
wafwerar's avatar
wafwerar 已提交
243
    taosMemoryFree(pReq);
244 245 246 247 248 249
    return -1;
  }

  return 0;
}

S
Shengliang Guan 已提交
250
static int32_t mndCreateSnode(SMnode *pMnode, SNodeMsg *pReq, SDnodeObj *pDnode, SMCreateSnodeReq *pCreate) {
251 252
  int32_t code = -1;

S
Shengliang Guan 已提交
253 254 255 256 257
  SSnodeObj snodeObj = {0};
  snodeObj.id = pDnode->id;
  snodeObj.createdTime = taosGetTimestampMs();
  snodeObj.updateTime = snodeObj.createdTime;

S
Shengliang Guan 已提交
258
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_TYPE_CREATE_SNODE, &pReq->rpcMsg);
259
  if (pTrans == NULL) goto _OVER;
S
Shengliang Guan 已提交
260

261
  mDebug("trans:%d, used to create snode:%d", pTrans->id, pCreate->dnodeId);
S
Shengliang Guan 已提交
262

263 264 265 266 267 268
  if (mndSetCreateSnodeRedoLogs(pTrans, &snodeObj) != 0) goto _OVER;
  if (mndSetCreateSnodeUndoLogs(pTrans, &snodeObj) != 0) goto _OVER;
  if (mndSetCreateSnodeCommitLogs(pTrans, &snodeObj) != 0) goto _OVER;
  if (mndSetCreateSnodeRedoActions(pTrans, pDnode, &snodeObj) != 0) goto _OVER;
  if (mndSetCreateSnodeUndoActions(pTrans, pDnode, &snodeObj) != 0) goto _OVER;
  if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
S
Shengliang Guan 已提交
269 270 271

  code = 0;

272
_OVER:
S
Shengliang Guan 已提交
273 274 275 276
  mndTransDrop(pTrans);
  return code;
}

S
Shengliang Guan 已提交
277 278
static int32_t mndProcessCreateSnodeReq(SNodeMsg *pReq) {
  SMnode          *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
279 280 281 282 283 284
  int32_t          code = -1;
  SSnodeObj       *pObj = NULL;
  SDnodeObj       *pDnode = NULL;
  SUserObj        *pUser = NULL;
  SMCreateSnodeReq createReq = {0};

285
  if (tDeserializeSCreateDropMQSBNodeReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &createReq) != 0) {
S
Shengliang Guan 已提交
286
    terrno = TSDB_CODE_INVALID_MSG;
287
    goto _OVER;
S
Shengliang Guan 已提交
288
  }
S
Shengliang Guan 已提交
289

S
Shengliang Guan 已提交
290
  mDebug("snode:%d, start to create", createReq.dnodeId);
S
Shengliang Guan 已提交
291

S
Shengliang Guan 已提交
292
  pObj = mndAcquireSnode(pMnode, createReq.dnodeId);
S
Shengliang Guan 已提交
293
  if (pObj != NULL) {
S
Shengliang Guan 已提交
294
    terrno = TSDB_CODE_MND_SNODE_ALREADY_EXIST;
295
    goto _OVER;
296
  } else if (terrno != TSDB_CODE_MND_SNODE_NOT_EXIST) {
297
    goto _OVER;
S
Shengliang Guan 已提交
298 299
  }

S
Shengliang Guan 已提交
300
  pDnode = mndAcquireDnode(pMnode, createReq.dnodeId);
S
Shengliang Guan 已提交
301 302
  if (pDnode == NULL) {
    terrno = TSDB_CODE_MND_DNODE_NOT_EXIST;
303
    goto _OVER;
S
Shengliang Guan 已提交
304 305
  }

S
Shengliang Guan 已提交
306 307 308
  pUser = mndAcquireUser(pMnode, pReq->user);
  if (pUser == NULL) {
    terrno = TSDB_CODE_MND_NO_USER_FROM_CONN;
309
    goto _OVER;
S
Shengliang Guan 已提交
310
  }
S
Shengliang Guan 已提交
311

S
Shengliang Guan 已提交
312
  if (mndCheckNodeAuth(pUser)) {
313
    goto _OVER;
S
Shengliang Guan 已提交
314 315 316 317 318
  }

  code = mndCreateSnode(pMnode, pReq, pDnode, &createReq);
  if (code == 0) code = TSDB_CODE_MND_ACTION_IN_PROGRESS;

319
_OVER:
S
Shengliang Guan 已提交
320
  if (code != 0 && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
S
Shengliang Guan 已提交
321
    mError("snode:%d, failed to create since %s", createReq.dnodeId, terrstr());
S
Shengliang Guan 已提交
322 323 324
    return -1;
  }

S
Shengliang Guan 已提交
325 326 327 328
  mndReleaseSnode(pMnode, pObj);
  mndReleaseDnode(pMnode, pDnode);
  mndReleaseUser(pMnode, pUser);
  return code;
S
Shengliang Guan 已提交
329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
}

static int32_t mndSetDropSnodeRedoLogs(STrans *pTrans, SSnodeObj *pObj) {
  SSdbRaw *pRedoRaw = mndSnodeActionEncode(pObj);
  if (pRedoRaw == NULL) return -1;
  if (mndTransAppendRedolog(pTrans, pRedoRaw) != 0) return -1;
  if (sdbSetRawStatus(pRedoRaw, SDB_STATUS_DROPPING) != 0) return -1;
  return 0;
}

static int32_t mndSetDropSnodeCommitLogs(STrans *pTrans, SSnodeObj *pObj) {
  SSdbRaw *pCommitRaw = mndSnodeActionEncode(pObj);
  if (pCommitRaw == NULL) return -1;
  if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) return -1;
  if (sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED) != 0) return -1;
  return 0;
}

static int32_t mndSetDropSnodeRedoActions(STrans *pTrans, SDnodeObj *pDnode, SSnodeObj *pObj) {
S
Shengliang Guan 已提交
348 349 350
  SDDropSnodeReq dropReq = {0};
  dropReq.dnodeId = pDnode->id;

351
  int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
wafwerar's avatar
wafwerar 已提交
352
  void   *pReq = taosMemoryMalloc(contLen);
S
Shengliang Guan 已提交
353
  if (pReq == NULL) {
S
Shengliang Guan 已提交
354 355 356
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    return -1;
  }
357
  tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
S
Shengliang Guan 已提交
358 359 360

  STransAction action = {0};
  action.epSet = mndGetDnodeEpset(pDnode);
S
Shengliang Guan 已提交
361
  action.pCont = pReq;
S
Shengliang Guan 已提交
362
  action.contLen = contLen;
S
Shengliang Guan 已提交
363
  action.msgType = TDMT_DND_DROP_SNODE;
S
shm  
Shengliang Guan 已提交
364
  action.acceptableCode = TSDB_CODE_NODE_NOT_DEPLOYED;
S
Shengliang Guan 已提交
365 366

  if (mndTransAppendRedoAction(pTrans, &action) != 0) {
wafwerar's avatar
wafwerar 已提交
367
    taosMemoryFree(pReq);
S
Shengliang Guan 已提交
368 369 370 371 372 373
    return -1;
  }

  return 0;
}

S
Shengliang Guan 已提交
374
static int32_t mndDropSnode(SMnode *pMnode, SNodeMsg *pReq, SSnodeObj *pObj) {
S
Shengliang Guan 已提交
375
  int32_t code = -1;
376

S
Shengliang Guan 已提交
377
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_TYPE_DROP_SNODE, &pReq->rpcMsg);
378
  if (pTrans == NULL) goto _OVER;
S
Shengliang Guan 已提交
379 380 381

  mDebug("trans:%d, used to drop snode:%d", pTrans->id, pObj->id);

382 383 384 385
  if (mndSetDropSnodeRedoLogs(pTrans, pObj) != 0) goto _OVER;
  if (mndSetDropSnodeCommitLogs(pTrans, pObj) != 0) goto _OVER;
  if (mndSetDropSnodeRedoActions(pTrans, pObj->pDnode, pObj) != 0) goto _OVER;
  if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
S
Shengliang Guan 已提交
386 387 388

  code = 0;

389
_OVER:
S
Shengliang Guan 已提交
390 391 392 393
  mndTransDrop(pTrans);
  return code;
}

S
Shengliang Guan 已提交
394 395
static int32_t mndProcessDropSnodeReq(SNodeMsg *pReq) {
  SMnode        *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
396 397 398 399 400
  int32_t        code = -1;
  SUserObj      *pUser = NULL;
  SSnodeObj     *pObj = NULL;
  SMDropSnodeReq dropReq = {0};

401
  if (tDeserializeSCreateDropMQSBNodeReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &dropReq) != 0) {
S
Shengliang Guan 已提交
402
    terrno = TSDB_CODE_INVALID_MSG;
403
    goto _OVER;
S
Shengliang Guan 已提交
404
  }
S
Shengliang Guan 已提交
405

S
Shengliang Guan 已提交
406
  mDebug("snode:%d, start to drop", dropReq.dnodeId);
S
Shengliang Guan 已提交
407

S
Shengliang Guan 已提交
408
  if (dropReq.dnodeId <= 0) {
S
Shengliang Guan 已提交
409
    terrno = TSDB_CODE_SDB_APP_ERROR;
410
    goto _OVER;
S
Shengliang Guan 已提交
411 412
  }

S
Shengliang Guan 已提交
413
  pObj = mndAcquireSnode(pMnode, dropReq.dnodeId);
S
Shengliang Guan 已提交
414
  if (pObj == NULL) {
415
    goto _OVER;
S
Shengliang Guan 已提交
416 417 418 419 420
  }

  pUser = mndAcquireUser(pMnode, pReq->user);
  if (pUser == NULL) {
    terrno = TSDB_CODE_MND_NO_USER_FROM_CONN;
421
    goto _OVER;
S
Shengliang Guan 已提交
422 423
  }

S
Shengliang Guan 已提交
424
  if (mndCheckNodeAuth(pUser)) {
425
    goto _OVER;
S
Shengliang Guan 已提交
426 427 428 429 430
  }

  code = mndDropSnode(pMnode, pReq, pObj);
  if (code == 0) code = TSDB_CODE_MND_ACTION_IN_PROGRESS;

431
_OVER:
S
Shengliang Guan 已提交
432
  if (code != 0 && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
S
shm  
Shengliang Guan 已提交
433
    mError("snode:%d, failed to drop since %s", dropReq.dnodeId, terrstr());
S
Shengliang Guan 已提交
434 435
  }

S
Shengliang Guan 已提交
436 437 438 439
  mndReleaseSnode(pMnode, pObj);
  mndReleaseUser(pMnode, pUser);

  return code;
S
Shengliang Guan 已提交
440 441
}

S
Shengliang Guan 已提交
442
static int32_t mndProcessCreateSnodeRsp(SNodeMsg *pRsp) {
S
Shengliang Guan 已提交
443
  mndTransProcessRsp(pRsp);
S
Shengliang Guan 已提交
444 445 446
  return 0;
}

S
Shengliang Guan 已提交
447
static int32_t mndProcessDropSnodeRsp(SNodeMsg *pRsp) {
S
Shengliang Guan 已提交
448
  mndTransProcessRsp(pRsp);
S
Shengliang Guan 已提交
449 450 451
  return 0;
}

S
Shengliang Guan 已提交
452 453
static int32_t mndGetSnodeMeta(SNodeMsg *pReq, SShowObj *pShow, STableMetaRsp *pMeta) {
  SMnode *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
454 455 456
  SSdb   *pSdb = pMnode->pSdb;

  int32_t  cols = 0;
S
Shengliang Guan 已提交
457
  SSchema *pSchema = pMeta->pSchemas;
S
Shengliang Guan 已提交
458 459 460 461

  pShow->bytes[cols] = 2;
  pSchema[cols].type = TSDB_DATA_TYPE_SMALLINT;
  strcpy(pSchema[cols].name, "id");
S
Shengliang Guan 已提交
462
  pSchema[cols].bytes = pShow->bytes[cols];
S
Shengliang Guan 已提交
463 464 465 466 467
  cols++;

  pShow->bytes[cols] = TSDB_EP_LEN + VARSTR_HEADER_SIZE;
  pSchema[cols].type = TSDB_DATA_TYPE_BINARY;
  strcpy(pSchema[cols].name, "endpoint");
S
Shengliang Guan 已提交
468
  pSchema[cols].bytes = pShow->bytes[cols];
S
Shengliang Guan 已提交
469 470 471 472 473
  cols++;

  pShow->bytes[cols] = 8;
  pSchema[cols].type = TSDB_DATA_TYPE_TIMESTAMP;
  strcpy(pSchema[cols].name, "create_time");
S
Shengliang Guan 已提交
474
  pSchema[cols].bytes = pShow->bytes[cols];
S
Shengliang Guan 已提交
475 476
  cols++;

S
Shengliang Guan 已提交
477
  pMeta->numOfColumns = cols;
S
Shengliang Guan 已提交
478 479 480 481 482 483 484 485 486
  pShow->numOfColumns = cols;

  pShow->offset[0] = 0;
  for (int32_t i = 1; i < cols; ++i) {
    pShow->offset[i] = pShow->offset[i - 1] + pShow->bytes[i - 1];
  }

  pShow->numOfRows = sdbGetSize(pSdb, SDB_SNODE);
  pShow->rowSize = pShow->offset[cols - 1] + pShow->bytes[cols - 1];
D
dapan1121 已提交
487
  strcpy(pMeta->tbName, mndShowStr(pShow->type));
S
Shengliang Guan 已提交
488 489 490 491

  return 0;
}

S
Shengliang Guan 已提交
492 493
static int32_t mndRetrieveSnodes(SNodeMsg *pReq, SShowObj *pShow, char *data, int32_t rows) {
  SMnode    *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532
  SSdb      *pSdb = pMnode->pSdb;
  int32_t    numOfRows = 0;
  int32_t    cols = 0;
  SSnodeObj *pObj = NULL;
  char      *pWrite;

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

    cols = 0;

    pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
    *(int16_t *)pWrite = pObj->id;
    cols++;

    pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
    STR_WITH_MAXSIZE_TO_VARSTR(pWrite, pObj->pDnode->ep, pShow->bytes[cols]);

    cols++;

    pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
    *(int64_t *)pWrite = pObj->createdTime;
    cols++;

    numOfRows++;
    sdbRelease(pSdb, pObj);
  }

  mndVacuumResult(data, pShow->numOfColumns, numOfRows, rows, pShow);
  pShow->numOfReads += numOfRows;

  return numOfRows;
}

static void mndCancelGetNextSnode(SMnode *pMnode, void *pIter) {
  SSdb *pSdb = pMnode->pSdb;
  sdbCancelFetch(pSdb, pIter);
}