mndQnode.c 17.4 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 "mndQnode.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 QNODE_VER_NUMBER   1
#define QNODE_RESERVE_SIZE 64
S
Shengliang Guan 已提交
26 27 28 29

static SSdbRaw *mndQnodeActionEncode(SQnodeObj *pObj);
static SSdbRow *mndQnodeActionDecode(SSdbRaw *pRaw);
static int32_t  mndQnodeActionInsert(SSdb *pSdb, SQnodeObj *pObj);
S
Shengliang Guan 已提交
30
static int32_t  mndQnodeActionUpdate(SSdb *pSdb, SQnodeObj *pOld, SQnodeObj *pNew);
31
static int32_t  mndQnodeActionDelete(SSdb *pSdb, SQnodeObj *pObj);
S
Shengliang Guan 已提交
32 33
static int32_t  mndProcessCreateQnodeReq(SNodeMsg *pReq);
static int32_t  mndProcessCreateQnodeRsp(SNodeMsg *pRsp);
34
static int32_t  mndProcessDropQnodeReq(SNodeMsg *pReq);
S
Shengliang Guan 已提交
35
static int32_t  mndProcessDropQnodeRsp(SNodeMsg *pRsp);
36
static int32_t  mndProcessQnodeListReq(SNodeMsg *pReq);
S
Shengliang Guan 已提交
37 38
static int32_t  mndGetQnodeMeta(SNodeMsg *pReq, SShowObj *pShow, STableMetaRsp *pMeta);
static int32_t  mndRetrieveQnodes(SNodeMsg *pReq, SShowObj *pShow, char *data, int32_t rows);
S
Shengliang Guan 已提交
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
static void     mndCancelGetNextQnode(SMnode *pMnode, void *pIter);

int32_t mndInitQnode(SMnode *pMnode) {
  SSdbTable table = {.sdbType = SDB_QNODE,
                     .keyType = SDB_KEY_INT32,
                     .encodeFp = (SdbEncodeFp)mndQnodeActionEncode,
                     .decodeFp = (SdbDecodeFp)mndQnodeActionDecode,
                     .insertFp = (SdbInsertFp)mndQnodeActionInsert,
                     .updateFp = (SdbUpdateFp)mndQnodeActionUpdate,
                     .deleteFp = (SdbDeleteFp)mndQnodeActionDelete};

  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_QNODE, mndProcessCreateQnodeReq);
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_QNODE, mndProcessDropQnodeReq);
  mndSetMsgHandle(pMnode, TDMT_DND_CREATE_QNODE_RSP, mndProcessCreateQnodeRsp);
  mndSetMsgHandle(pMnode, TDMT_DND_DROP_QNODE_RSP, mndProcessDropQnodeRsp);
54
  mndSetMsgHandle(pMnode, TDMT_MND_QNODE_LIST, mndProcessQnodeListReq);
S
Shengliang Guan 已提交
55 56 57 58 59 60 61 62 63 64 65

  mndAddShowMetaHandle(pMnode, TSDB_MGMT_TABLE_QNODE, mndGetQnodeMeta);
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_QNODE, mndRetrieveQnodes);
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_QNODE, mndCancelGetNextQnode);

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

void mndCleanupQnode(SMnode *pMnode) {}

static SQnodeObj *mndAcquireQnode(SMnode *pMnode, int32_t qnodeId) {
66 67
  SQnodeObj *pObj = sdbAcquire(pMnode->pSdb, SDB_QNODE, &qnodeId);
  if (pObj == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
S
Shengliang Guan 已提交
68 69 70 71 72 73 74 75 76 77 78
    terrno = TSDB_CODE_MND_QNODE_NOT_EXIST;
  }
  return pObj;
}

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

static SSdbRaw *mndQnodeActionEncode(SQnodeObj *pObj) {
79 80
  terrno = TSDB_CODE_OUT_OF_MEMORY;

81 82
  SSdbRaw *pRaw = sdbAllocRaw(SDB_QNODE, QNODE_VER_NUMBER, sizeof(SQnodeObj) + QNODE_RESERVE_SIZE);
  if (pRaw == NULL) goto _OVER;
S
Shengliang Guan 已提交
83 84

  int32_t dataPos = 0;
85 86 87 88
  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, QNODE_RESERVE_SIZE, _OVER)
89 90

  terrno = 0;
S
Shengliang Guan 已提交
91

92
_OVER:
93 94 95 96 97 98 99
  if (terrno != 0) {
    mError("qnode:%d, failed to encode to raw:%p since %s", pObj->id, pRaw, terrstr());
    sdbFreeRaw(pRaw);
    return NULL;
  }

  mTrace("qnode:%d, encode to raw:%p, row:%p", pObj->id, pRaw, pObj);
S
Shengliang Guan 已提交
100 101 102 103
  return pRaw;
}

static SSdbRow *mndQnodeActionDecode(SSdbRaw *pRaw) {
104 105
  terrno = TSDB_CODE_OUT_OF_MEMORY;

S
Shengliang Guan 已提交
106
  int8_t sver = 0;
107
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
S
Shengliang Guan 已提交
108

109
  if (sver != QNODE_VER_NUMBER) {
S
Shengliang Guan 已提交
110
    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
111
    goto _OVER;
S
Shengliang Guan 已提交
112 113
  }

114
  SSdbRow *pRow = sdbAllocRow(sizeof(SQnodeObj));
115
  if (pRow == NULL) goto _OVER;
116

S
Shengliang Guan 已提交
117
  SQnodeObj *pObj = sdbGetRowObj(pRow);
118
  if (pObj == NULL) goto _OVER;
S
Shengliang Guan 已提交
119 120

  int32_t dataPos = 0;
121 122 123 124
  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, QNODE_RESERVE_SIZE, _OVER)
125 126

  terrno = 0;
S
Shengliang Guan 已提交
127

128
_OVER:
129 130
  if (terrno != 0) {
    mError("qnode:%d, failed to decode from raw:%p since %s", pObj->id, pRaw, terrstr());
wafwerar's avatar
wafwerar 已提交
131
    taosMemoryFreeClear(pRow);
132 133 134 135
    return NULL;
  }

  mTrace("qnode:%d, decode from raw:%p, row:%p", pObj->id, pRaw, pObj);
S
Shengliang Guan 已提交
136 137 138 139
  return pRow;
}

static int32_t mndQnodeActionInsert(SSdb *pSdb, SQnodeObj *pObj) {
140
  mTrace("qnode:%d, perform insert action, row:%p", pObj->id, pObj);
S
Shengliang Guan 已提交
141 142 143 144 145 146 147 148 149 150 151
  pObj->pDnode = sdbAcquire(pSdb, SDB_DNODE, &pObj->id);
  if (pObj->pDnode == NULL) {
    terrno = TSDB_CODE_MND_DNODE_NOT_EXIST;
    mError("qnode:%d, failed to perform insert action since %s", pObj->id, terrstr());
    return -1;
  }

  return 0;
}

static int32_t mndQnodeActionDelete(SSdb *pSdb, SQnodeObj *pObj) {
152
  mTrace("qnode:%d, perform delete action, row:%p", pObj->id, pObj);
S
Shengliang Guan 已提交
153 154 155 156 157 158 159 160
  if (pObj->pDnode != NULL) {
    sdbRelease(pSdb, pObj->pDnode);
    pObj->pDnode = NULL;
  }

  return 0;
}

S
Shengliang Guan 已提交
161
static int32_t mndQnodeActionUpdate(SSdb *pSdb, SQnodeObj *pOld, SQnodeObj *pNew) {
S
Shengliang Guan 已提交
162
  mTrace("qnode:%d, perform update action, old row:%p new row:%p", pOld->id, pOld, pNew);
S
Shengliang Guan 已提交
163
  pOld->updateTime = pNew->updateTime;
S
Shengliang Guan 已提交
164 165 166 167 168 169 170 171 172 173 174
  return 0;
}

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

175 176 177 178 179 180 181 182
static int32_t mndSetCreateQnodeUndoLogs(STrans *pTrans, SQnodeObj *pObj) {
  SSdbRaw *pUndoRaw = mndQnodeActionEncode(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 已提交
183 184 185 186 187 188 189 190 191
static int32_t mndSetCreateQnodeCommitLogs(STrans *pTrans, SQnodeObj *pObj) {
  SSdbRaw *pCommitRaw = mndQnodeActionEncode(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 mndSetCreateQnodeRedoActions(STrans *pTrans, SDnodeObj *pDnode, SQnodeObj *pObj) {
S
Shengliang Guan 已提交
192 193 194
  SDCreateQnodeReq createReq = {0};
  createReq.dnodeId = pDnode->id;

195
  int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
wafwerar's avatar
wafwerar 已提交
196
  void   *pReq = taosMemoryMalloc(contLen);
S
Shengliang Guan 已提交
197
  if (pReq == NULL) {
S
Shengliang Guan 已提交
198 199 200
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    return -1;
  }
201
  tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
S
Shengliang Guan 已提交
202 203 204

  STransAction action = {0};
  action.epSet = mndGetDnodeEpset(pDnode);
S
Shengliang Guan 已提交
205
  action.pCont = pReq;
S
Shengliang Guan 已提交
206
  action.contLen = contLen;
S
Shengliang Guan 已提交
207
  action.msgType = TDMT_DND_CREATE_QNODE;
S
shm  
Shengliang Guan 已提交
208
  action.acceptableCode = TSDB_CODE_NODE_ALREADY_DEPLOYED;
S
Shengliang Guan 已提交
209 210

  if (mndTransAppendRedoAction(pTrans, &action) != 0) {
wafwerar's avatar
wafwerar 已提交
211
    taosMemoryFree(pReq);
S
Shengliang Guan 已提交
212 213 214 215 216 217
    return -1;
  }

  return 0;
}

218
static int32_t mndSetCreateQnodeUndoActions(STrans *pTrans, SDnodeObj *pDnode, SQnodeObj *pObj) {
S
Shengliang Guan 已提交
219 220 221
  SDDropQnodeReq dropReq = {0};
  dropReq.dnodeId = pDnode->id;

222
  int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
wafwerar's avatar
wafwerar 已提交
223
  void   *pReq = taosMemoryMalloc(contLen);
S
Shengliang Guan 已提交
224
  if (pReq == NULL) {
225 226 227
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    return -1;
  }
228
  tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
229 230 231

  STransAction action = {0};
  action.epSet = mndGetDnodeEpset(pDnode);
S
Shengliang Guan 已提交
232
  action.pCont = pReq;
S
Shengliang Guan 已提交
233
  action.contLen = contLen;
234
  action.msgType = TDMT_DND_DROP_QNODE;
S
shm  
Shengliang Guan 已提交
235
  action.acceptableCode = TSDB_CODE_NODE_NOT_DEPLOYED;
236 237

  if (mndTransAppendUndoAction(pTrans, &action) != 0) {
wafwerar's avatar
wafwerar 已提交
238
    taosMemoryFree(pReq);
239 240 241 242 243 244
    return -1;
  }

  return 0;
}

S
Shengliang Guan 已提交
245
static int32_t mndCreateQnode(SMnode *pMnode, SNodeMsg *pReq, SDnodeObj *pDnode, SMCreateQnodeReq *pCreate) {
246 247
  int32_t code = -1;

S
Shengliang Guan 已提交
248 249 250 251 252
  SQnodeObj qnodeObj = {0};
  qnodeObj.id = pDnode->id;
  qnodeObj.createdTime = taosGetTimestampMs();
  qnodeObj.updateTime = qnodeObj.createdTime;

S
Shengliang Guan 已提交
253
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_TYPE_CREATE_QNODE, &pReq->rpcMsg);
254
  if (pTrans == NULL) goto _OVER;
S
Shengliang Guan 已提交
255

256
  mDebug("trans:%d, used to create qnode:%d", pTrans->id, pCreate->dnodeId);
257 258 259 260 261 262
  if (mndSetCreateQnodeRedoLogs(pTrans, &qnodeObj) != 0) goto _OVER;
  if (mndSetCreateQnodeUndoLogs(pTrans, &qnodeObj) != 0) goto _OVER;
  if (mndSetCreateQnodeCommitLogs(pTrans, &qnodeObj) != 0) goto _OVER;
  if (mndSetCreateQnodeRedoActions(pTrans, pDnode, &qnodeObj) != 0) goto _OVER;
  if (mndSetCreateQnodeUndoActions(pTrans, pDnode, &qnodeObj) != 0) goto _OVER;
  if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
S
Shengliang Guan 已提交
263 264 265

  code = 0;

266
_OVER:
S
Shengliang Guan 已提交
267 268 269 270
  mndTransDrop(pTrans);
  return code;
}

S
Shengliang Guan 已提交
271 272
static int32_t mndProcessCreateQnodeReq(SNodeMsg *pReq) {
  SMnode          *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
273 274 275 276 277 278
  int32_t          code = -1;
  SQnodeObj       *pObj = NULL;
  SDnodeObj       *pDnode = NULL;
  SUserObj        *pUser = NULL;
  SMCreateQnodeReq createReq = {0};

279
  if (tDeserializeSCreateDropMQSBNodeReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &createReq) != 0) {
S
Shengliang Guan 已提交
280
    terrno = TSDB_CODE_INVALID_MSG;
281
    goto _OVER;
S
Shengliang Guan 已提交
282
  }
S
Shengliang Guan 已提交
283

S
Shengliang Guan 已提交
284
  mDebug("qnode:%d, start to create", createReq.dnodeId);
S
Shengliang Guan 已提交
285

S
Shengliang Guan 已提交
286
  pObj = mndAcquireQnode(pMnode, createReq.dnodeId);
S
Shengliang Guan 已提交
287
  if (pObj != NULL) {
S
Shengliang Guan 已提交
288
    terrno = TSDB_CODE_MND_QNODE_ALREADY_EXIST;
289
    goto _OVER;
290
  } else if (terrno != TSDB_CODE_MND_QNODE_NOT_EXIST) {
291
    goto _OVER;
S
Shengliang Guan 已提交
292 293
  }

S
Shengliang Guan 已提交
294
  pDnode = mndAcquireDnode(pMnode, createReq.dnodeId);
S
Shengliang Guan 已提交
295 296
  if (pDnode == NULL) {
    terrno = TSDB_CODE_MND_DNODE_NOT_EXIST;
297
    goto _OVER;
S
Shengliang Guan 已提交
298 299
  }

S
Shengliang Guan 已提交
300 301 302
  pUser = mndAcquireUser(pMnode, pReq->user);
  if (pUser == NULL) {
    terrno = TSDB_CODE_MND_NO_USER_FROM_CONN;
303
    goto _OVER;
S
Shengliang Guan 已提交
304
  }
S
Shengliang Guan 已提交
305

S
Shengliang Guan 已提交
306
  if (mndCheckNodeAuth(pUser)) {
307
    goto _OVER;
S
Shengliang Guan 已提交
308 309 310 311 312
  }

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

313
_OVER:
S
Shengliang Guan 已提交
314 315
  if (code != 0 && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
    mError("qnode:%d, failed to create since %s", createReq.dnodeId, terrstr());
S
Shengliang Guan 已提交
316 317
  }

S
Shengliang Guan 已提交
318 319 320 321
  mndReleaseQnode(pMnode, pObj);
  mndReleaseDnode(pMnode, pDnode);
  mndReleaseUser(pMnode, pUser);
  return code;
S
Shengliang Guan 已提交
322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340
}

static int32_t mndSetDropQnodeRedoLogs(STrans *pTrans, SQnodeObj *pObj) {
  SSdbRaw *pRedoRaw = mndQnodeActionEncode(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 mndSetDropQnodeCommitLogs(STrans *pTrans, SQnodeObj *pObj) {
  SSdbRaw *pCommitRaw = mndQnodeActionEncode(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 mndSetDropQnodeRedoActions(STrans *pTrans, SDnodeObj *pDnode, SQnodeObj *pObj) {
S
Shengliang Guan 已提交
341 342 343
  SDDropQnodeReq dropReq = {0};
  dropReq.dnodeId = pDnode->id;

344
  int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
wafwerar's avatar
wafwerar 已提交
345
  void   *pReq = taosMemoryMalloc(contLen);
S
Shengliang Guan 已提交
346
  if (pReq == NULL) {
S
Shengliang Guan 已提交
347 348 349
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    return -1;
  }
350
  tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
S
Shengliang Guan 已提交
351 352 353

  STransAction action = {0};
  action.epSet = mndGetDnodeEpset(pDnode);
S
Shengliang Guan 已提交
354
  action.pCont = pReq;
S
Shengliang Guan 已提交
355
  action.contLen = contLen;
S
Shengliang Guan 已提交
356
  action.msgType = TDMT_DND_DROP_QNODE;
S
shm  
Shengliang Guan 已提交
357
  action.acceptableCode = TSDB_CODE_NODE_NOT_DEPLOYED;
S
Shengliang Guan 已提交
358 359

  if (mndTransAppendRedoAction(pTrans, &action) != 0) {
wafwerar's avatar
wafwerar 已提交
360
    taosMemoryFree(pReq);
S
Shengliang Guan 已提交
361 362 363 364 365 366
    return -1;
  }

  return 0;
}

S
Shengliang Guan 已提交
367
static int32_t mndDropQnode(SMnode *pMnode, SNodeMsg *pReq, SQnodeObj *pObj) {
S
Shengliang Guan 已提交
368
  int32_t code = -1;
369

S
Shengliang Guan 已提交
370
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_TYPE_DROP_QNODE, &pReq->rpcMsg);
371
  if (pTrans == NULL) goto _OVER;
S
Shengliang Guan 已提交
372 373

  mDebug("trans:%d, used to drop qnode:%d", pTrans->id, pObj->id);
374 375 376 377
  if (mndSetDropQnodeRedoLogs(pTrans, pObj) != 0) goto _OVER;
  if (mndSetDropQnodeCommitLogs(pTrans, pObj) != 0) goto _OVER;
  if (mndSetDropQnodeRedoActions(pTrans, pObj->pDnode, pObj) != 0) goto _OVER;
  if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
S
Shengliang Guan 已提交
378 379 380

  code = 0;

381
_OVER:
S
Shengliang Guan 已提交
382 383 384 385
  mndTransDrop(pTrans);
  return code;
}

S
Shengliang Guan 已提交
386 387
static int32_t mndProcessDropQnodeReq(SNodeMsg *pReq) {
  SMnode        *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
388 389 390 391 392
  int32_t        code = -1;
  SUserObj      *pUser = NULL;
  SQnodeObj     *pObj = NULL;
  SMDropQnodeReq dropReq = {0};

393
  if (tDeserializeSCreateDropMQSBNodeReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &dropReq) != 0) {
S
Shengliang Guan 已提交
394
    terrno = TSDB_CODE_INVALID_MSG;
395
    goto _OVER;
S
Shengliang Guan 已提交
396
  }
S
Shengliang Guan 已提交
397

S
Shengliang Guan 已提交
398
  mDebug("qnode:%d, start to drop", dropReq.dnodeId);
S
Shengliang Guan 已提交
399

S
Shengliang Guan 已提交
400
  if (dropReq.dnodeId <= 0) {
S
Shengliang Guan 已提交
401
    terrno = TSDB_CODE_SDB_APP_ERROR;
402
    goto _OVER;
S
Shengliang Guan 已提交
403 404
  }

S
Shengliang Guan 已提交
405
  pObj = mndAcquireQnode(pMnode, dropReq.dnodeId);
S
Shengliang Guan 已提交
406
  if (pObj == NULL) {
407
    goto _OVER;
S
Shengliang Guan 已提交
408 409 410 411 412
  }

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

S
Shengliang Guan 已提交
416
  if (mndCheckNodeAuth(pUser)) {
417
    goto _OVER;
S
Shengliang Guan 已提交
418 419 420 421 422
  }

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

423
_OVER:
S
Shengliang Guan 已提交
424
  if (code != 0 && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
S
shm  
Shengliang Guan 已提交
425
    mError("qnode:%d, failed to drop since %s", dropReq.dnodeId, terrstr());
S
Shengliang Guan 已提交
426 427
  }

S
Shengliang Guan 已提交
428 429 430 431
  mndReleaseQnode(pMnode, pObj);
  mndReleaseUser(pMnode, pUser);

  return code;
S
Shengliang Guan 已提交
432 433
}

S
Shengliang Guan 已提交
434
static int32_t mndProcessQnodeListReq(SNodeMsg *pReq) {
435 436 437 438 439 440
  int32_t       code = -1;
  int32_t       numOfRows = 0;
  SMnode       *pMnode = pReq->pNode;
  SSdb         *pSdb = pMnode->pSdb;
  SQnodeObj    *pObj = NULL;
  SQnodeListReq qlistReq = {0};
D
dapan1121 已提交
441 442 443
  SQnodeListRsp qlistRsp = {0};

  if (tDeserializeSQnodeListReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &qlistReq) != 0) {
444
    mError("failed to parse qnode list req");
D
dapan1121 已提交
445
    terrno = TSDB_CODE_INVALID_MSG;
446
    goto _OVER;
D
dapan1121 已提交
447 448
  }

D
dapan1121 已提交
449 450
  qlistRsp.epSetList = taosArrayInit(5, sizeof(SEpSet));
  if (NULL == qlistRsp.epSetList) {
451
    mError("failed to alloc epSet while process qnode list req");
D
dapan1121 已提交
452
    terrno = TSDB_CODE_OUT_OF_MEMORY;
453
    goto _OVER;
D
dapan1121 已提交
454
  }
455

D
dapan1121 已提交
456 457 458 459
  while (true) {
    void *pIter = sdbFetch(pSdb, SDB_QNODE, NULL, (void **)&pObj);
    if (pIter == NULL) break;

460 461
    SEpSet epSet = {.numOfEps = 1};
    tstrncpy(epSet.eps[0].fqdn, pObj->pDnode->fqdn, TSDB_FQDN_LEN);
D
dapan1121 已提交
462 463
    epSet.eps[0].port = pObj->pDnode->port;

464
    (void)taosArrayPush(qlistRsp.epSetList, &epSet);
D
dapan1121 已提交
465 466 467 468

    numOfRows++;
    sdbRelease(pSdb, pObj);

D
dapan1121 已提交
469
    if (qlistReq.rowNum > 0 && numOfRows >= qlistReq.rowNum) {
D
dapan1121 已提交
470 471 472 473 474
      break;
    }
  }

  int32_t rspLen = tSerializeSQnodeListRsp(NULL, 0, &qlistRsp);
wafwerar's avatar
wafwerar 已提交
475
  void   *pRsp = taosMemoryMalloc(rspLen);
D
dapan1121 已提交
476 477
  if (pRsp == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
478
    goto _OVER;
D
dapan1121 已提交
479
  }
480

D
dapan1121 已提交
481
  tSerializeSQnodeListRsp(pRsp, rspLen, &qlistRsp);
482

S
Shengliang Guan 已提交
483 484
  pReq->rspLen = rspLen;
  pReq->pRsp = pRsp;
D
dapan1121 已提交
485 486
  code = 0;

487
_OVER:
D
dapan1121 已提交
488 489 490 491
  tFreeSQnodeListRsp(&qlistRsp);
  return code;
}

S
Shengliang Guan 已提交
492
static int32_t mndProcessCreateQnodeRsp(SNodeMsg *pRsp) {
S
Shengliang Guan 已提交
493
  mndTransProcessRsp(pRsp);
S
Shengliang Guan 已提交
494 495 496
  return 0;
}

S
Shengliang Guan 已提交
497
static int32_t mndProcessDropQnodeRsp(SNodeMsg *pRsp) {
S
Shengliang Guan 已提交
498
  mndTransProcessRsp(pRsp);
S
Shengliang Guan 已提交
499 500 501
  return 0;
}

S
Shengliang Guan 已提交
502 503
static int32_t mndGetQnodeMeta(SNodeMsg *pReq, SShowObj *pShow, STableMetaRsp *pMeta) {
  SMnode *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
504 505 506
  SSdb   *pSdb = pMnode->pSdb;

  int32_t  cols = 0;
S
Shengliang Guan 已提交
507
  SSchema *pSchema = pMeta->pSchemas;
S
Shengliang Guan 已提交
508 509 510 511

  pShow->bytes[cols] = 2;
  pSchema[cols].type = TSDB_DATA_TYPE_SMALLINT;
  strcpy(pSchema[cols].name, "id");
S
Shengliang Guan 已提交
512
  pSchema[cols].bytes = pShow->bytes[cols];
S
Shengliang Guan 已提交
513 514 515 516 517
  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 已提交
518
  pSchema[cols].bytes = pShow->bytes[cols];
S
Shengliang Guan 已提交
519 520 521 522 523
  cols++;

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

S
Shengliang Guan 已提交
527
  pMeta->numOfColumns = cols;
S
Shengliang Guan 已提交
528 529 530 531 532 533 534 535 536
  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_QNODE);
  pShow->rowSize = pShow->offset[cols - 1] + pShow->bytes[cols - 1];
D
dapan1121 已提交
537
  strcpy(pMeta->tbName, mndShowStr(pShow->type));
S
Shengliang Guan 已提交
538 539 540 541

  return 0;
}

S
Shengliang Guan 已提交
542 543
static int32_t mndRetrieveQnodes(SNodeMsg *pReq, SShowObj *pShow, char *data, int32_t rows) {
  SMnode    *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582
  SSdb      *pSdb = pMnode->pSdb;
  int32_t    numOfRows = 0;
  int32_t    cols = 0;
  SQnodeObj *pObj = NULL;
  char      *pWrite;

  while (numOfRows < rows) {
    pShow->pIter = sdbFetch(pSdb, SDB_QNODE, 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 mndCancelGetNextQnode(SMnode *pMnode, void *pIter) {
  SSdb *pSdb = pMnode->pSdb;
  sdbCancelFetch(pSdb, pIter);
}