mnodeMnode.c 14.1 KB
Newer Older
H
hzcheng 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * 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/>.
 */

S
slguan 已提交
16
#define _DEFAULT_SOURCE
S
slguan 已提交
17
#include "os.h"
18
#include "taoserror.h"
S
Shengliang Guan 已提交
19
#include "tglobal.h"
S
slguan 已提交
20
#include "trpc.h"
S
slguan 已提交
21
#include "tsync.h"
S
slguan 已提交
22
#include "tbalance.h"
S
slguan 已提交
23 24
#include "tutil.h"
#include "tsocket.h"
25
#include "tdataformat.h"
S
TD-1671  
Shengliang Guan 已提交
26 27
#include "dnode.h"
#include "mnode.h"
S
Shengliang Guan 已提交
28 29 30 31 32
#include "mnodeDef.h"
#include "mnodeInt.h"
#include "mnodeMnode.h"
#include "mnodeDnode.h"
#include "mnodeSdb.h"
33
#include "mnodeShow.h"
S
Shengliang Guan 已提交
34
#include "mnodeUser.h"
S
TD-1671  
Shengliang Guan 已提交
35
#include "mnodeVgroup.h"
S
slguan 已提交
36

37 38
static void *        tsMnodeSdb = NULL;
static int32_t       tsMnodeUpdateSize = 0;
39 40
static SRpcEpSet     tsMnodeEpSetForShell;
static SRpcEpSet     tsMnodeEpSetForPeer;
41
static SDMMnodeInfos tsMnodeInfos;
42 43
static int32_t mnodeGetMnodeMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn);
static int32_t mnodeRetrieveMnodes(SShowObj *pShow, char *data, int32_t rows, void *pConn);
44 45

#if defined(LINUX)
46 47 48 49 50 51
  static pthread_rwlock_t         tsMnodeLock;
  #define mnodeMnodeWrLock()      pthread_rwlock_wrlock(&tsMnodeLock)
  #define mnodeMnodeRdLock()      pthread_rwlock_rdlock(&tsMnodeLock)
  #define mnodeMnodeUnLock()      pthread_rwlock_unlock(&tsMnodeLock)
  #define mnodeMnodeInitLock()    pthread_rwlock_init(&tsMnodeLock, NULL)
  #define mnodeMnodeDestroyLock() pthread_rwlock_destroy(&tsMnodeLock)
52
#else
53 54 55 56 57 58
  static pthread_mutex_t          tsMnodeLock;
  #define mnodeMnodeWrLock()      pthread_mutex_lock(&tsMnodeLock)
  #define mnodeMnodeRdLock()      pthread_mutex_lock(&tsMnodeLock)
  #define mnodeMnodeUnLock()      pthread_mutex_unlock(&tsMnodeLock)
  #define mnodeMnodeInitLock()    pthread_mutex_init(&tsMnodeLock, NULL)
  #define mnodeMnodeDestroyLock() pthread_mutex_destroy(&tsMnodeLock)
59 60
#endif

61
static int32_t mnodeMnodeActionDestroy(SSdbOper *pOper) {
S
Shengliang Guan 已提交
62
  taosTFree(pOper->pObj);
S
slguan 已提交
63 64
  return TSDB_CODE_SUCCESS;
}
S
slguan 已提交
65

66
static int32_t mnodeMnodeActionInsert(SSdbOper *pOper) {
S
slguan 已提交
67
  SMnodeObj *pMnode = pOper->pObj;
68
  SDnodeObj *pDnode = mnodeGetDnode(pMnode->mnodeId);
69
  if (pDnode == NULL) return TSDB_CODE_MND_DNODE_NOT_EXIST;
S
slguan 已提交
70 71

  pDnode->isMgmt = true;
72
  mnodeDecDnodeRef(pDnode);
S
slguan 已提交
73
  
74
  mInfo("mnode:%d, fqdn:%s ep:%s port:%d, do insert action", pMnode->mnodeId, pDnode->dnodeFqdn, pDnode->dnodeEp, pDnode->dnodePort);
75
  return TSDB_CODE_SUCCESS;
S
slguan 已提交
76 77
}

78
static int32_t mnodeMnodeActionDelete(SSdbOper *pOper) {
S
slguan 已提交
79
  SMnodeObj *pMnode = pOper->pObj;
S
slguan 已提交
80

81
  SDnodeObj *pDnode = mnodeGetDnode(pMnode->mnodeId);
82
  if (pDnode == NULL) return TSDB_CODE_MND_DNODE_NOT_EXIST;
S
slguan 已提交
83
  pDnode->isMgmt = false;
84
  mnodeDecDnodeRef(pDnode);
S
slguan 已提交
85

86
  mDebug("mnode:%d, is dropped from sdb", pMnode->mnodeId);
S
slguan 已提交
87 88 89
  return TSDB_CODE_SUCCESS;
}

90
static int32_t mnodeMnodeActionUpdate(SSdbOper *pOper) {
S
slguan 已提交
91
  SMnodeObj *pMnode = pOper->pObj;
92
  SMnodeObj *pSaved = mnodeGetMnode(pMnode->mnodeId);
S
slguan 已提交
93 94 95
  if (pMnode != pSaved) {
    memcpy(pSaved, pMnode, pOper->rowSize);
    free(pMnode);
S
slguan 已提交
96
  }
97
  mnodeDecMnodeRef(pSaved);
S
slguan 已提交
98
  return TSDB_CODE_SUCCESS;
S
slguan 已提交
99 100
}

101
static int32_t mnodeMnodeActionEncode(SSdbOper *pOper) {
S
slguan 已提交
102 103 104 105
  SMnodeObj *pMnode = pOper->pObj;
  memcpy(pOper->rowData, pMnode, tsMnodeUpdateSize);
  pOper->rowSize = tsMnodeUpdateSize;
  return TSDB_CODE_SUCCESS;
S
slguan 已提交
106 107
}

108
static int32_t mnodeMnodeActionDecode(SSdbOper *pOper) {
S
slguan 已提交
109
  SMnodeObj *pMnode = calloc(1, sizeof(SMnodeObj));
110
  if (pMnode == NULL) return TSDB_CODE_MND_OUT_OF_MEMORY;
S
slguan 已提交
111

S
slguan 已提交
112 113 114
  memcpy(pMnode, pOper->rowData, tsMnodeUpdateSize);
  pOper->pObj = pMnode;
  return TSDB_CODE_SUCCESS;
S
slguan 已提交
115 116
}

117 118
static int32_t mnodeMnodeActionRestored() {
  if (mnodeGetMnodesNum() == 1) {
S
slguan 已提交
119
    SMnodeObj *pMnode = NULL;
120
    void *pIter = mnodeGetNextMnode(NULL, &pMnode);
S
slguan 已提交
121 122
    if (pMnode != NULL) {
      pMnode->role = TAOS_SYNC_ROLE_MASTER;
123
      mnodeDecMnodeRef(pMnode);
S
slguan 已提交
124
    }
S
Shengliang Guan 已提交
125
    sdbFreeIter(pIter);
S
slguan 已提交
126
  }
127

128
  mnodeUpdateMnodeEpSet();
129

S
slguan 已提交
130 131
  return TSDB_CODE_SUCCESS;
}
S
slguan 已提交
132

133 134
int32_t mnodeInitMnodes() {
  mnodeMnodeInitLock();
135

S
slguan 已提交
136 137 138 139 140 141
  SMnodeObj tObj;
  tsMnodeUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;

  SSdbTableDesc tableDesc = {
    .tableId      = SDB_TABLE_MNODE,
    .tableName    = "mnodes",
S
Shengliang Guan 已提交
142
    .hashSessions = TSDB_DEFAULT_MNODES_HASH_SIZE,
S
slguan 已提交
143 144 145
    .maxRowSize   = tsMnodeUpdateSize,
    .refCountPos  = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
    .keyType      = SDB_KEY_INT,
146 147 148 149 150 151 152
    .insertFp     = mnodeMnodeActionInsert,
    .deleteFp     = mnodeMnodeActionDelete,
    .updateFp     = mnodeMnodeActionUpdate,
    .encodeFp     = mnodeMnodeActionEncode,
    .decodeFp     = mnodeMnodeActionDecode,
    .destroyFp    = mnodeMnodeActionDestroy,
    .restoredFp   = mnodeMnodeActionRestored
S
slguan 已提交
153 154 155 156 157 158 159
  };

  tsMnodeSdb = sdbOpenTable(&tableDesc);
  if (tsMnodeSdb == NULL) {
    mError("failed to init mnodes data");
    return -1;
  }
S
slguan 已提交
160

161 162
  mnodeAddShowMetaHandle(TSDB_MGMT_TABLE_MNODE, mnodeGetMnodeMeta);
  mnodeAddShowRetrieveHandle(TSDB_MGMT_TABLE_MNODE, mnodeRetrieveMnodes);
S
slguan 已提交
163

164
  mDebug("table:mnodes table is created");
S
slguan 已提交
165 166 167
  return TSDB_CODE_SUCCESS;
}

S
Shengliang Guan 已提交
168
void mnodeCleanupMnodes() {
S
slguan 已提交
169
  sdbCloseTable(tsMnodeSdb);
170
  tsMnodeSdb = NULL;
171
  mnodeMnodeDestroyLock();
S
slguan 已提交
172 173
}

174
int32_t mnodeGetMnodesNum() { 
S
slguan 已提交
175 176 177
  return sdbGetNumOfRows(tsMnodeSdb); 
}

178
void *mnodeGetMnode(int32_t mnodeId) {
S
slguan 已提交
179 180 181
  return sdbGetRow(tsMnodeSdb, &mnodeId);
}

182
void mnodeIncMnodeRef(SMnodeObj *pMnode) {
183 184 185
  sdbIncRef(tsMnodeSdb, pMnode);
}

186
void mnodeDecMnodeRef(SMnodeObj *pMnode) {
S
slguan 已提交
187
  sdbDecRef(tsMnodeSdb, pMnode);
S
slguan 已提交
188 189
}

190
void *mnodeGetNextMnode(void *pIter, SMnodeObj **pMnode) { 
S
Shengliang Guan 已提交
191
  return sdbFetchRow(tsMnodeSdb, pIter, (void **)pMnode); 
S
slguan 已提交
192 193
}

194
char *mnodeGetMnodeRoleStr(int32_t role) {
陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
195
  return syncRole[role];
S
slguan 已提交
196 197
}

198 199
void mnodeUpdateMnodeEpSet() {
  mInfo("update mnodes epSet, numOfEps:%d ", mnodeGetMnodesNum());
200

201
  mnodeMnodeWrLock();
S
slguan 已提交
202

203 204
  memset(&tsMnodeEpSetForShell, 0, sizeof(SRpcEpSet));
  memset(&tsMnodeEpSetForPeer, 0, sizeof(SRpcEpSet));
205
  memset(&tsMnodeInfos, 0, sizeof(SDMMnodeInfos));
206

S
slguan 已提交
207
  int32_t index = 0;
208
  void *  pIter = NULL;
S
slguan 已提交
209 210
  while (1) {
    SMnodeObj *pMnode = NULL;
211
    pIter = mnodeGetNextMnode(pIter, &pMnode);
S
slguan 已提交
212 213
    if (pMnode == NULL) break;

214
    SDnodeObj *pDnode = mnodeGetDnode(pMnode->mnodeId);
215
    if (pDnode != NULL) {
216 217 218
      strcpy(tsMnodeEpSetForShell.fqdn[index], pDnode->dnodeFqdn);
      tsMnodeEpSetForShell.port[index] = htons(pDnode->dnodePort);
      mDebug("mnode:%d, for shell fqdn:%s %d", pDnode->dnodeId, tsMnodeEpSetForShell.fqdn[index], htons(tsMnodeEpSetForShell.port[index]));      
219

220 221 222
      strcpy(tsMnodeEpSetForPeer.fqdn[index], pDnode->dnodeFqdn);
      tsMnodeEpSetForPeer.port[index] = htons(pDnode->dnodePort + TSDB_PORT_DNODEDNODE);
      mDebug("mnode:%d, for peer fqdn:%s %d", pDnode->dnodeId, tsMnodeEpSetForPeer.fqdn[index], htons(tsMnodeEpSetForPeer.port[index]));
223

224 225
      tsMnodeInfos.nodeInfos[index].nodeId = htonl(pMnode->mnodeId);
      strcpy(tsMnodeInfos.nodeInfos[index].nodeEp, pDnode->dnodeEp);
226

227
      if (pMnode->role == TAOS_SYNC_ROLE_MASTER) {
228 229
        tsMnodeEpSetForShell.inUse = index;
        tsMnodeEpSetForPeer.inUse = index;
230
        tsMnodeInfos.inUse = index;
231
      }
S
slguan 已提交
232

233
      mInfo("mnode:%d, ep:%s %s", pDnode->dnodeId, pDnode->dnodeEp, pMnode->role == TAOS_SYNC_ROLE_MASTER ? "master" : "");
234 235 236
      index++;
    }

237 238
    mnodeDecDnodeRef(pDnode);
    mnodeDecMnodeRef(pMnode);
S
slguan 已提交
239 240
  }

241
  tsMnodeInfos.nodeNum = index;
242 243
  tsMnodeEpSetForShell.numOfEps = index;
  tsMnodeEpSetForPeer.numOfEps = index;
244

245 246
  sdbFreeIter(pIter);

247 248 249
  mnodeMnodeUnLock();
}

250
void mnodeGetMnodeEpSetForPeer(SRpcEpSet *epSet) {
251
  mnodeMnodeRdLock();
252
  *epSet = tsMnodeEpSetForPeer;
253
  mnodeMnodeUnLock();
254 255
}

256
void mnodeGetMnodeEpSetForShell(SRpcEpSet *epSet) {
257
  mnodeMnodeRdLock();
258
  *epSet = tsMnodeEpSetForShell;
259
  mnodeMnodeUnLock();
260 261
}

H
Hui Li 已提交
262 263 264 265
char* mnodeGetMnodeMasterEp() {
  return tsMnodeInfos.nodeInfos[tsMnodeInfos.inUse].nodeEp;
}

266 267
void mnodeGetMnodeInfos(void *mnodeInfos) {
  mnodeMnodeRdLock();
268
  *(SDMMnodeInfos *)mnodeInfos = tsMnodeInfos;
269
  mnodeMnodeUnLock();
S
slguan 已提交
270 271
}

S
TD-1671  
Shengliang Guan 已提交
272 273 274 275 276 277 278
static int32_t mnodeSendCreateMnodeMsg(int32_t dnodeId, char *dnodeEp) {
  mDebug("dnode:%d, send create mnode msg to dnode %s", dnodeId, dnodeEp);

  SMDCreateMnodeMsg *pCreate = rpcMallocCont(sizeof(SMDCreateMnodeMsg));
  if (pCreate == NULL) {
    return TSDB_CODE_MND_OUT_OF_MEMORY;
  } else {
S
TD-1671  
Shengliang Guan 已提交
279
    pCreate->dnodeId = htonl(dnodeId);
S
TD-1671  
Shengliang Guan 已提交
280
    tstrncpy(pCreate->dnodeEp, dnodeEp, sizeof(pCreate->dnodeEp));
S
TD-1671  
Shengliang Guan 已提交
281 282 283 284 285 286 287 288 289 290 291 292
    pCreate->mnodes = tsMnodeInfos;
    bool found = false;
    for (int i = 0; i < pCreate->mnodes.nodeNum; ++i) {
      if (pCreate->mnodes.nodeInfos[i].nodeId == htonl(dnodeId)) {
        found = true;
      }
    }
    if (!found) {
      pCreate->mnodes.nodeInfos[pCreate->mnodes.nodeNum].nodeId = htonl(dnodeId);
      tstrncpy(pCreate->mnodes.nodeInfos[pCreate->mnodes.nodeNum].nodeEp, dnodeEp, sizeof(pCreate->dnodeEp));
      pCreate->mnodes.nodeNum++;
    }
S
TD-1671  
Shengliang Guan 已提交
293 294 295 296 297 298 299 300 301 302 303 304 305
  }

  SRpcMsg rpcMsg = {0};
  rpcMsg.pCont = pCreate;
  rpcMsg.contLen = sizeof(SMDCreateMnodeMsg);
  rpcMsg.msgType = TSDB_MSG_TYPE_MD_CREATE_MNODE;

  SRpcMsg   rpcRsp = {0};
  SRpcEpSet epSet = mnodeGetEpSetFromIp(pCreate->dnodeEp);
  dnodeSendMsgToDnodeRecv(&rpcMsg, &rpcRsp, &epSet);

  if (rpcRsp.code != TSDB_CODE_SUCCESS) {
    mError("dnode:%d, failed to send create mnode msg, ep:%s reason:%s", dnodeId, dnodeEp, tstrerror(rpcRsp.code));
S
TD-1671  
Shengliang Guan 已提交
306 307
  } else {
    mDebug("dnode:%d, create mnode msg is disposed, mnode is created in dnode", dnodeId);
S
TD-1671  
Shengliang Guan 已提交
308 309 310 311 312 313 314 315 316 317
  }

  rpcFreeCont(rpcRsp.pCont);
  return rpcRsp.code;
}

static int32_t mnodeCreateMnodeCb(SMnodeMsg *pMsg, int32_t code) {
  if (code != TSDB_CODE_SUCCESS) {
    mError("failed to create mnode, reason:%s", tstrerror(code));
  } else {
S
TD-1671  
Shengliang Guan 已提交
318
    mDebug("mnode is created successfully");
S
TD-1671  
Shengliang Guan 已提交
319
    mnodeUpdateMnodeEpSet();
S
TD-1671  
Shengliang Guan 已提交
320
    sdbUpdateSync(NULL);
S
TD-1671  
Shengliang Guan 已提交
321 322 323 324 325 326
  }

  return code;
}

void mnodeCreateMnode(int32_t dnodeId, char *dnodeEp, bool needConfirm) {
S
slguan 已提交
327 328 329 330
  SMnodeObj *pMnode = calloc(1, sizeof(SMnodeObj));
  pMnode->mnodeId = dnodeId;
  pMnode->createdTime = taosGetTimestampMs();

S
slguan 已提交
331
  SSdbOper oper = {
S
TD-1671  
Shengliang Guan 已提交
332
    .type  = SDB_OPER_GLOBAL,
S
slguan 已提交
333
    .table = tsMnodeSdb,
S
TD-1671  
Shengliang Guan 已提交
334
    .pObj  = pMnode,
S
TD-1671  
Shengliang Guan 已提交
335
    .writeCb = mnodeCreateMnodeCb
S
slguan 已提交
336 337
  };

S
TD-1671  
Shengliang Guan 已提交
338 339 340
  int32_t code = TSDB_CODE_SUCCESS;
  if (needConfirm) {
    code = mnodeSendCreateMnodeMsg(dnodeId, dnodeEp);
S
slguan 已提交
341 342
  }

S
TD-1671  
Shengliang Guan 已提交
343 344 345 346
  if (code != TSDB_CODE_SUCCESS) {
    taosTFree(pMnode);
    return;
  }
347

S
TD-1671  
Shengliang Guan 已提交
348 349 350 351 352
  code = sdbInsertRow(&oper);
  if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
    mError("dnode:%d, failed to create mnode, ep:%s reason:%s", dnodeId, dnodeEp, tstrerror(code));
    taosTFree(pMnode);
  }
S
slguan 已提交
353 354
}

355 356
void mnodeDropMnodeLocal(int32_t dnodeId) {
  SMnodeObj *pMnode = mnodeGetMnode(dnodeId);
357 358 359
  if (pMnode != NULL) {
    SSdbOper oper = {.type = SDB_OPER_LOCAL, .table = tsMnodeSdb, .pObj = pMnode};
    sdbDeleteRow(&oper);
360
    mnodeDecMnodeRef(pMnode);
361
  }
362

363
  mnodeUpdateMnodeEpSet();
S
TD-1671  
Shengliang Guan 已提交
364
  sdbUpdateSync(NULL);
365 366
}

367 368
int32_t mnodeDropMnode(int32_t dnodeId) {
  SMnodeObj *pMnode = mnodeGetMnode(dnodeId);
S
slguan 已提交
369
  if (pMnode == NULL) {
370
    return TSDB_CODE_MND_DNODE_NOT_EXIST;
S
slguan 已提交
371 372
  }
  
S
slguan 已提交
373
  SSdbOper oper = {
S
slguan 已提交
374 375 376 377 378 379 380 381
    .type = SDB_OPER_GLOBAL,
    .table = tsMnodeSdb,
    .pObj = pMnode
  };

  int32_t code = sdbDeleteRow(&oper);

  sdbDecRef(tsMnodeSdb, pMnode);
382

383
  mnodeUpdateMnodeEpSet();
S
TD-1671  
Shengliang Guan 已提交
384
  sdbUpdateSync(NULL);
385

S
slguan 已提交
386 387 388
  return code;
}

389
static int32_t mnodeGetMnodeMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn) {
S
slguan 已提交
390
  sdbUpdateMnodeRoles();
391
  SUserObj *pUser = mnodeGetUserFromConn(pConn);
S
slguan 已提交
392 393
  if (pUser == NULL) return 0;

394
  if (strcmp(pUser->pAcct->user, TSDB_DEFAULT_USER) != 0)  {
395
    mnodeDecUserRef(pUser);
396
    return TSDB_CODE_MND_NO_RIGHTS;
S
slguan 已提交
397
  }
S
slguan 已提交
398

399
  int32_t  cols = 0;
H
hjxilinx 已提交
400
  SSchema *pSchema = pMeta->schema;
S
slguan 已提交
401

402 403 404 405 406 407
  pShow->bytes[cols] = 2;
  pSchema[cols].type = TSDB_DATA_TYPE_SMALLINT;
  strcpy(pSchema[cols].name, "id");
  pSchema[cols].bytes = htons(pShow->bytes[cols]);
  cols++;

408
  pShow->bytes[cols] = 40 + VARSTR_HEADER_SIZE;
409
  pSchema[cols].type = TSDB_DATA_TYPE_BINARY;
410
  strcpy(pSchema[cols].name, "end_point");
411 412 413
  pSchema[cols].bytes = htons(pShow->bytes[cols]);
  cols++;

S
slguan 已提交
414
  pShow->bytes[cols] = 12 + VARSTR_HEADER_SIZE;
S
slguan 已提交
415 416 417 418
  pSchema[cols].type = TSDB_DATA_TYPE_BINARY;
  strcpy(pSchema[cols].name, "role");
  pSchema[cols].bytes = htons(pShow->bytes[cols]);
  cols++;
S
slguan 已提交
419 420 421
  
  pShow->bytes[cols] = 8;
  pSchema[cols].type = TSDB_DATA_TYPE_TIMESTAMP;
422
  strcpy(pSchema[cols].name, "create_time");
S
slguan 已提交
423 424
  pSchema[cols].bytes = htons(pShow->bytes[cols]);
  cols++;
S
slguan 已提交
425 426 427 428 429 430 431 432 433

  pMeta->numOfColumns = htons(cols);
  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];
  }

434
  pShow->numOfRows = mnodeGetMnodesNum();
S
slguan 已提交
435
  pShow->rowSize = pShow->offset[cols - 1] + pShow->bytes[cols - 1];
S
Shengliang Guan 已提交
436
  pShow->pIter = NULL;
437
  mnodeDecUserRef(pUser);
S
slguan 已提交
438 439 440 441

  return 0;
}

442
static int32_t mnodeRetrieveMnodes(SShowObj *pShow, char *data, int32_t rows, void *pConn) {
443 444
  int32_t    numOfRows = 0;
  int32_t    cols      = 0;
S
slguan 已提交
445
  SMnodeObj *pMnode   = NULL;
446
  char      *pWrite;
S
slguan 已提交
447 448

  while (numOfRows < rows) {
449
    pShow->pIter = mnodeGetNextMnode(pShow->pIter, &pMnode);
S
slguan 已提交
450 451 452 453
    if (pMnode == NULL) break;

    cols = 0;

454 455 456 457
    pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
    *(int16_t *)pWrite = pMnode->mnodeId;
    cols++;

S
slguan 已提交
458
    pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
459
    
460
    SDnodeObj *pDnode = mnodeGetDnode(pMnode->mnodeId);
461
    if (pDnode != NULL) {
H
Hui Li 已提交
462
      STR_WITH_MAXSIZE_TO_VARSTR(pWrite, pDnode->dnodeEp, pShow->bytes[cols]);
463
    } else {
H
Hui Li 已提交
464
      STR_WITH_MAXSIZE_TO_VARSTR(pWrite, "invalid ep", pShow->bytes[cols]);
465
    }
466
    mnodeDecDnodeRef(pDnode);
467

S
slguan 已提交
468 469 470
    cols++;

    pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
471
    char* roles = mnodeGetMnodeRoleStr(pMnode->role);
H
Hui Li 已提交
472
    STR_WITH_MAXSIZE_TO_VARSTR(pWrite, roles, pShow->bytes[cols]);
S
slguan 已提交
473 474 475
    cols++;

    pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
S
slguan 已提交
476
    *(int64_t *)pWrite = pMnode->createdTime;
S
slguan 已提交
477
    cols++;
S
slguan 已提交
478
    
S
slguan 已提交
479
    numOfRows++;
S
slguan 已提交
480

481
    mnodeDecMnodeRef(pMnode);
S
slguan 已提交
482
  }
Y
TD-1659  
yihaoDeng 已提交
483
  mnodeVacuumResult(data, cols, numOfRows, rows, pShow);
S
slguan 已提交
484 485

  pShow->numOfReads += numOfRows;
S
slguan 已提交
486

S
slguan 已提交
487
  return numOfRows;
S
slguan 已提交
488
}