mndDnode.c 25.0 KB
Newer Older
H
refact  
Hongze Cheng 已提交
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
Shengliang Guan 已提交
16
#define _DEFAULT_SOURCE
S
Shengliang Guan 已提交
17
#include "mndDnode.h"
S
Shengliang Guan 已提交
18
#include "mndAuth.h"
S
Shengliang Guan 已提交
19
#include "mndMnode.h"
S
Shengliang Guan 已提交
20
#include "mndShow.h"
S
Shengliang Guan 已提交
21
#include "mndTrans.h"
S
Shengliang Guan 已提交
22
#include "mndUser.h"
S
Shengliang Guan 已提交
23
#include "mndVgroup.h"
S
Shengliang Guan 已提交
24

S
Shengliang Guan 已提交
25
#define TSDB_DNODE_VER_NUMBER   1
26
#define TSDB_DNODE_RESERVE_SIZE 64
S
Shengliang Guan 已提交
27 28 29
#define TSDB_CONFIG_OPTION_LEN  16
#define TSDB_CONIIG_VALUE_LEN   48
#define TSDB_CONFIG_NUMBER      8
S
Shengliang Guan 已提交
30

S
Shengliang Guan 已提交
31
static const char *offlineReason[] = {
S
Shengliang Guan 已提交
32 33 34 35 36 37 38 39 40 41 42 43 44
    "",
    "status msg timeout",
    "status not received",
    "version not match",
    "dnodeId not match",
    "clusterId not match",
    "interval not match",
    "timezone not match",
    "locale not match",
    "charset not match",
    "unknown",
};

S
Shengliang Guan 已提交
45 46 47 48 49
static int32_t  mndCreateDefaultDnode(SMnode *pMnode);
static SSdbRaw *mndDnodeActionEncode(SDnodeObj *pDnode);
static SSdbRow *mndDnodeActionDecode(SSdbRaw *pRaw);
static int32_t  mndDnodeActionInsert(SSdb *pSdb, SDnodeObj *pDnode);
static int32_t  mndDnodeActionDelete(SSdb *pSdb, SDnodeObj *pDnode);
50
static int32_t  mndDnodeActionUpdate(SSdb *pSdb, SDnodeObj *pOld, SDnodeObj *pNew);
S
Shengliang Guan 已提交
51

S
Shengliang Guan 已提交
52 53 54 55 56 57 58 59
static int32_t mndProcessCreateDnodeReq(SNodeMsg *pReq);
static int32_t mndProcessDropDnodeReq(SNodeMsg *pReq);
static int32_t mndProcessConfigDnodeReq(SNodeMsg *pReq);
static int32_t mndProcessConfigDnodeRsp(SNodeMsg *pRsp);
static int32_t mndProcessStatusReq(SNodeMsg *pReq);

static int32_t mndGetConfigMeta(SNodeMsg *pReq, SShowObj *pShow, STableMetaRsp *pMeta);
static int32_t mndRetrieveConfigs(SNodeMsg *pReq, SShowObj *pShow, char *data, int32_t rows);
S
Shengliang Guan 已提交
60
static void    mndCancelGetNextConfig(SMnode *pMnode, void *pIter);
S
Shengliang Guan 已提交
61
static int32_t mndRetrieveDnodes(SNodeMsg *pReq, SShowObj *pShow, char *data, int32_t rows);
S
Shengliang Guan 已提交
62
static void    mndCancelGetNextDnode(SMnode *pMnode, void *pIter);
S
Shengliang Guan 已提交
63 64 65 66 67 68 69 70 71 72 73

int32_t mndInitDnode(SMnode *pMnode) {
  SSdbTable table = {.sdbType = SDB_DNODE,
                     .keyType = SDB_KEY_INT32,
                     .deployFp = (SdbDeployFp)mndCreateDefaultDnode,
                     .encodeFp = (SdbEncodeFp)mndDnodeActionEncode,
                     .decodeFp = (SdbDecodeFp)mndDnodeActionDecode,
                     .insertFp = (SdbInsertFp)mndDnodeActionInsert,
                     .updateFp = (SdbUpdateFp)mndDnodeActionUpdate,
                     .deleteFp = (SdbDeleteFp)mndDnodeActionDelete};

S
Shengliang Guan 已提交
74 75 76
  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_DNODE, mndProcessCreateDnodeReq);
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_DNODE, mndProcessDropDnodeReq);
  mndSetMsgHandle(pMnode, TDMT_MND_CONFIG_DNODE, mndProcessConfigDnodeReq);
H
Hongze Cheng 已提交
77
  mndSetMsgHandle(pMnode, TDMT_DND_CONFIG_DNODE_RSP, mndProcessConfigDnodeRsp);
S
Shengliang Guan 已提交
78
  mndSetMsgHandle(pMnode, TDMT_MND_STATUS, mndProcessStatusReq);
S
Shengliang Guan 已提交
79

S
Shengliang Guan 已提交
80 81 82 83 84
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_VARIABLES, mndRetrieveConfigs);
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_VARIABLES, mndCancelGetNextConfig);
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_DNODE, mndRetrieveDnodes);
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_DNODE, mndCancelGetNextDnode);

S
Shengliang Guan 已提交
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
  return sdbSetTable(pMnode->pSdb, table);
}

void mndCleanupDnode(SMnode *pMnode) {}

static int32_t mndCreateDefaultDnode(SMnode *pMnode) {
  SDnodeObj dnodeObj = {0};
  dnodeObj.id = 1;
  dnodeObj.createdTime = taosGetTimestampMs();
  dnodeObj.updateTime = dnodeObj.createdTime;
  dnodeObj.port = pMnode->replicas[0].port;
  memcpy(&dnodeObj.fqdn, pMnode->replicas[0].fqdn, TSDB_FQDN_LEN);

  SSdbRaw *pRaw = mndDnodeActionEncode(&dnodeObj);
  if (pRaw == NULL) return -1;
S
Shengliang Guan 已提交
100
  if (sdbSetRawStatus(pRaw, SDB_STATUS_READY) != 0) return -1;
S
Shengliang Guan 已提交
101

102
  mDebug("dnode:%d, will be created while deploy sdb, raw:%p", dnodeObj.id, pRaw);
S
Shengliang Guan 已提交
103 104 105
  return sdbWrite(pMnode->pSdb, pRaw);
}

S
Shengliang Guan 已提交
106
static SSdbRaw *mndDnodeActionEncode(SDnodeObj *pDnode) {
107 108
  terrno = TSDB_CODE_OUT_OF_MEMORY;

S
Shengliang Guan 已提交
109
  SSdbRaw *pRaw = sdbAllocRaw(SDB_DNODE, TSDB_DNODE_VER_NUMBER, sizeof(SDnodeObj) + TSDB_DNODE_RESERVE_SIZE);
110
  if (pRaw == NULL) goto DNODE_ENCODE_OVER;
S
Shengliang Guan 已提交
111 112

  int32_t dataPos = 0;
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
  SDB_SET_INT32(pRaw, dataPos, pDnode->id, DNODE_ENCODE_OVER)
  SDB_SET_INT64(pRaw, dataPos, pDnode->createdTime, DNODE_ENCODE_OVER)
  SDB_SET_INT64(pRaw, dataPos, pDnode->updateTime, DNODE_ENCODE_OVER)
  SDB_SET_INT16(pRaw, dataPos, pDnode->port, DNODE_ENCODE_OVER)
  SDB_SET_BINARY(pRaw, dataPos, pDnode->fqdn, TSDB_FQDN_LEN, DNODE_ENCODE_OVER)
  SDB_SET_RESERVE(pRaw, dataPos, TSDB_DNODE_RESERVE_SIZE, DNODE_ENCODE_OVER)
  SDB_SET_DATALEN(pRaw, dataPos, DNODE_ENCODE_OVER);

  terrno = 0;

DNODE_ENCODE_OVER:
  if (terrno != 0) {
    mError("dnode:%d, failed to encode to raw:%p since %s", pDnode->id, pRaw, terrstr());
    sdbFreeRaw(pRaw);
    return NULL;
  }
S
Shengliang Guan 已提交
129

130
  mTrace("dnode:%d, encode to raw:%p, row:%p", pDnode->id, pRaw, pDnode);
S
Shengliang Guan 已提交
131 132 133 134
  return pRaw;
}

static SSdbRow *mndDnodeActionDecode(SSdbRaw *pRaw) {
135 136
  terrno = TSDB_CODE_OUT_OF_MEMORY;

S
Shengliang Guan 已提交
137
  int8_t sver = 0;
138
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto DNODE_DECODE_OVER;
S
Shengliang Guan 已提交
139

S
Shengliang Guan 已提交
140
  if (sver != TSDB_DNODE_VER_NUMBER) {
S
Shengliang Guan 已提交
141
    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
142
    goto DNODE_DECODE_OVER;
S
Shengliang Guan 已提交
143 144
  }

145 146 147
  SSdbRow *pRow = sdbAllocRow(sizeof(SDnodeObj));
  if (pRow == NULL) goto DNODE_DECODE_OVER;

S
Shengliang Guan 已提交
148
  SDnodeObj *pDnode = sdbGetRowObj(pRow);
149
  if (pDnode == NULL) goto DNODE_DECODE_OVER;
S
Shengliang Guan 已提交
150 151

  int32_t dataPos = 0;
152 153 154 155 156 157 158 159 160 161 162 163
  SDB_GET_INT32(pRaw, dataPos, &pDnode->id, DNODE_DECODE_OVER)
  SDB_GET_INT64(pRaw, dataPos, &pDnode->createdTime, DNODE_DECODE_OVER)
  SDB_GET_INT64(pRaw, dataPos, &pDnode->updateTime, DNODE_DECODE_OVER)
  SDB_GET_INT16(pRaw, dataPos, &pDnode->port, DNODE_DECODE_OVER)
  SDB_GET_BINARY(pRaw, dataPos, pDnode->fqdn, TSDB_FQDN_LEN, DNODE_DECODE_OVER)
  SDB_GET_RESERVE(pRaw, dataPos, TSDB_DNODE_RESERVE_SIZE, DNODE_DECODE_OVER)

  terrno = 0;

DNODE_DECODE_OVER:
  if (terrno != 0) {
    mError("dnode:%d, failed to decode from raw:%p since %s", pDnode->id, pRaw, terrstr());
wafwerar's avatar
wafwerar 已提交
164
    taosMemoryFreeClear(pRow);
165 166
    return NULL;
  }
S
Shengliang Guan 已提交
167

168
  mTrace("dnode:%d, decode from raw:%p, row:%p", pDnode->id, pRaw, pDnode);
S
Shengliang Guan 已提交
169 170 171
  return pRow;
}

172
static int32_t mndDnodeActionInsert(SSdb *pSdb, SDnodeObj *pDnode) {
173
  mTrace("dnode:%d, perform insert action, row:%p", pDnode->id, pDnode);
S
Shengliang Guan 已提交
174
  pDnode->offlineReason = DND_REASON_STATUS_NOT_RECEIVED;
S
Shengliang Guan 已提交
175 176 177 178
  snprintf(pDnode->ep, TSDB_EP_LEN, "%s:%u", pDnode->fqdn, pDnode->port);
  return 0;
}

S
Shengliang Guan 已提交
179
static int32_t mndDnodeActionDelete(SSdb *pSdb, SDnodeObj *pDnode) {
180
  mTrace("dnode:%d, perform delete action, row:%p", pDnode->id, pDnode);
S
Shengliang Guan 已提交
181 182
  return 0;
}
S
Shengliang Guan 已提交
183

184
static int32_t mndDnodeActionUpdate(SSdb *pSdb, SDnodeObj *pOld, SDnodeObj *pNew) {
S
Shengliang Guan 已提交
185
  mTrace("dnode:%d, perform update action, old row:%p new row:%p", pOld->id, pOld, pNew);
186
  pOld->updateTime = pNew->updateTime;
S
Shengliang Guan 已提交
187
  return 0;
S
Shengliang Guan 已提交
188 189
}

S
Shengliang Guan 已提交
190
SDnodeObj *mndAcquireDnode(SMnode *pMnode, int32_t dnodeId) {
S
Shengliang Guan 已提交
191 192 193 194 195 196
  SSdb      *pSdb = pMnode->pSdb;
  SDnodeObj *pDnode = sdbAcquire(pSdb, SDB_DNODE, &dnodeId);
  if (pDnode == NULL) {
    terrno = TSDB_CODE_MND_DNODE_NOT_EXIST;
  }
  return pDnode;
S
Shengliang Guan 已提交
197
}
S
Shengliang Guan 已提交
198

S
Shengliang Guan 已提交
199 200 201
void mndReleaseDnode(SMnode *pMnode, SDnodeObj *pDnode) {
  SSdb *pSdb = pMnode->pSdb;
  sdbRelease(pSdb, pDnode);
S
Shengliang Guan 已提交
202 203
}

S
Shengliang Guan 已提交
204
SEpSet mndGetDnodeEpset(SDnodeObj *pDnode) {
H
Haojun Liao 已提交
205 206
  SEpSet epSet = {0};
  addEpIntoEpSet(&epSet, pDnode->fqdn, pDnode->port);
S
Shengliang Guan 已提交
207 208 209
  return epSet;
}

S
Shengliang Guan 已提交
210 211 212 213 214 215 216 217 218 219 220 221 222
static SDnodeObj *mndAcquireDnodeByEp(SMnode *pMnode, char *pEpStr) {
  SSdb *pSdb = pMnode->pSdb;

  void *pIter = NULL;
  while (1) {
    SDnodeObj *pDnode = NULL;
    pIter = sdbFetch(pSdb, SDB_DNODE, pIter, (void **)&pDnode);
    if (pIter == NULL) break;

    if (strncasecmp(pEpStr, pDnode->ep, TSDB_EP_LEN) == 0) {
      sdbCancelFetch(pSdb, pIter);
      return pDnode;
    }
S
Shengliang Guan 已提交
223 224

    sdbRelease(pSdb, pDnode);
S
Shengliang Guan 已提交
225 226 227 228 229
  }

  return NULL;
}

S
Shengliang Guan 已提交
230
int32_t mndGetDnodeSize(SMnode *pMnode) {
S
Shengliang Guan 已提交
231 232 233 234
  SSdb *pSdb = pMnode->pSdb;
  return sdbGetSize(pSdb, SDB_DNODE);
}

S
Shengliang Guan 已提交
235
bool mndIsDnodeOnline(SMnode *pMnode, SDnodeObj *pDnode, int64_t curMs) {
dengyihao's avatar
dengyihao 已提交
236
  int64_t interval = TABS(pDnode->lastAccessTime - curMs);
237
  if (interval > 30000 * tsStatusInterval) {
S
Shengliang Guan 已提交
238 239 240
    if (pDnode->rebootTime > 0) {
      pDnode->offlineReason = DND_REASON_STATUS_MSG_TIMEOUT;
    }
S
Shengliang Guan 已提交
241 242 243 244 245
    return false;
  }
  return true;
}

S
Shengliang Guan 已提交
246
static void mndGetDnodeData(SMnode *pMnode, SArray *pDnodeEps) {
S
Shengliang Guan 已提交
247 248
  SSdb *pSdb = pMnode->pSdb;

249
  int32_t numOfEps = 0;
S
Shengliang Guan 已提交
250 251 252 253 254 255
  void   *pIter = NULL;
  while (1) {
    SDnodeObj *pDnode = NULL;
    pIter = sdbFetch(pSdb, SDB_DNODE, pIter, (void **)&pDnode);
    if (pIter == NULL) break;

S
Shengliang Guan 已提交
256 257 258 259 260 261
    SDnodeEp dnodeEp = {0};
    dnodeEp.id = pDnode->id;
    dnodeEp.isMnode = 0;
    dnodeEp.ep.port = pDnode->port;
    memcpy(dnodeEp.ep.fqdn, pDnode->fqdn, TSDB_FQDN_LEN);

S
Shengliang Guan 已提交
262
    if (mndIsMnode(pMnode, pDnode->id)) {
S
Shengliang Guan 已提交
263
      dnodeEp.isMnode = 1;
S
Shengliang Guan 已提交
264
    }
S
Shengliang Guan 已提交
265

266
    sdbRelease(pSdb, pDnode);
S
Shengliang Guan 已提交
267
    taosArrayPush(pDnodeEps, &dnodeEp);
S
Shengliang Guan 已提交
268 269 270 271
  }
}

static int32_t mndCheckClusterCfgPara(SMnode *pMnode, const SClusterCfg *pCfg) {
S
Shengliang Guan 已提交
272 273
  if (pCfg->statusInterval != tsStatusInterval) {
    mError("statusInterval [%d - %d] cfg inconsistent", pCfg->statusInterval, tsStatusInterval);
S
Shengliang Guan 已提交
274 275 276
    return DND_REASON_STATUS_INTERVAL_NOT_MATCH;
  }

wafwerar's avatar
wafwerar 已提交
277 278
  if ((0 != strcasecmp(pCfg->timezone, tsTimezoneStr)) && (pMnode->checkTime != pCfg->checkTime)) {
    mError("timezone [%s - %s] [%" PRId64 " - %" PRId64 "] cfg inconsistent", pCfg->timezone, tsTimezoneStr,
S
Shengliang Guan 已提交
279
           pCfg->checkTime, pMnode->checkTime);
S
Shengliang Guan 已提交
280 281 282
    return DND_REASON_TIME_ZONE_NOT_MATCH;
  }

S
os env  
Shengliang Guan 已提交
283 284
  if (0 != strcasecmp(pCfg->locale, tsLocale)) {
    mError("locale [%s - %s]  cfg inconsistent", pCfg->locale, tsLocale);
S
Shengliang Guan 已提交
285 286 287
    return DND_REASON_LOCALE_NOT_MATCH;
  }

S
os env  
Shengliang Guan 已提交
288 289
  if (0 != strcasecmp(pCfg->charset, tsCharset)) {
    mError("charset [%s - %s] cfg inconsistent.", pCfg->charset, tsCharset);
S
Shengliang Guan 已提交
290 291 292 293 294 295
    return DND_REASON_CHARSET_NOT_MATCH;
  }

  return 0;
}

S
Shengliang Guan 已提交
296 297
static int32_t mndProcessStatusReq(SNodeMsg *pReq) {
  SMnode    *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
298 299 300
  SStatusReq statusReq = {0};
  SDnodeObj *pDnode = NULL;
  int32_t    code = -1;
S
Shengliang Guan 已提交
301

S
Shengliang Guan 已提交
302 303 304 305
  if (tDeserializeSStatusReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &statusReq) != 0) {
    terrno = TSDB_CODE_INVALID_MSG;
    goto PROCESS_STATUS_MSG_OVER;
  }
S
Shengliang Guan 已提交
306

S
Shengliang Guan 已提交
307 308
  if (statusReq.dnodeId == 0) {
    pDnode = mndAcquireDnodeByEp(pMnode, statusReq.dnodeEp);
S
Shengliang Guan 已提交
309
    if (pDnode == NULL) {
S
Shengliang Guan 已提交
310
      mDebug("dnode:%s, not created yet", statusReq.dnodeEp);
311
      terrno = TSDB_CODE_MND_DNODE_NOT_EXIST;
S
Shengliang Guan 已提交
312
      goto PROCESS_STATUS_MSG_OVER;
S
Shengliang Guan 已提交
313 314
    }
  } else {
S
Shengliang Guan 已提交
315
    pDnode = mndAcquireDnode(pMnode, statusReq.dnodeId);
S
Shengliang Guan 已提交
316
    if (pDnode == NULL) {
S
Shengliang Guan 已提交
317
      pDnode = mndAcquireDnodeByEp(pMnode, statusReq.dnodeEp);
S
Shengliang Guan 已提交
318
      if (pDnode != NULL) {
S
Shengliang Guan 已提交
319 320
        pDnode->offlineReason = DND_REASON_DNODE_ID_NOT_MATCH;
      }
S
Shengliang Guan 已提交
321
      mError("dnode:%d, %s not exist", statusReq.dnodeId, statusReq.dnodeEp);
322
      terrno = TSDB_CODE_MND_DNODE_NOT_EXIST;
S
Shengliang Guan 已提交
323
      goto PROCESS_STATUS_MSG_OVER;
S
Shengliang Guan 已提交
324 325 326
    }
  }

S
Shengliang Guan 已提交
327 328 329 330 331 332 333 334 335 336 337 338 339
  int32_t numOfVloads = (int32_t)taosArrayGetSize(statusReq.pVloads);
  for (int32_t v = 0; v < numOfVloads; ++v) {
    SVnodeLoad *pVload = taosArrayGet(statusReq.pVloads, v);

    SVgObj *pVgroup = mndAcquireVgroup(pMnode, pVload->vgId);
    if (pVgroup != NULL) {
      if (pVload->role == TAOS_SYNC_STATE_LEADER) {
        pVgroup->numOfTables = pVload->numOfTables;
        pVgroup->numOfTimeSeries = pVload->numOfTimeSeries;
        pVgroup->totalStorage = pVload->totalStorage;
        pVgroup->compStorage = pVload->compStorage;
        pVgroup->pointsWritten = pVload->pointsWritten;
      }
L
Liu Jicong 已提交
340
      bool roleChanged = false;
S
Shengliang Guan 已提交
341
      for (int32_t vg = 0; vg < pVgroup->replica; ++vg) {
L
Liu Jicong 已提交
342 343 344
        if (pVgroup->vnodeGid[vg].role != pVload->role) {
          roleChanged = true;
        }
S
Shengliang Guan 已提交
345 346
        pVgroup->vnodeGid[vg].role = pVload->role;
      }
L
Liu Jicong 已提交
347 348 349
      if (roleChanged) {
        // notify scheduler role has changed
      }
S
Shengliang Guan 已提交
350 351 352 353 354
    }

    mndReleaseVgroup(pMnode, pVgroup);
  }

S
Shengliang Guan 已提交
355 356
  int64_t curMs = taosGetTimestampMs();
  bool    online = mndIsDnodeOnline(pMnode, pDnode, curMs);
S
Shengliang Guan 已提交
357 358
  bool    dnodeChanged = (statusReq.dver != sdbGetTableVer(pMnode->pSdb, SDB_DNODE));
  bool    reboot = (pDnode->rebootTime != statusReq.rebootTime);
359
  bool    needCheck = !online || dnodeChanged || reboot;
S
Shengliang Guan 已提交
360

361
  if (needCheck) {
S
Shengliang Guan 已提交
362
    if (statusReq.sver != tsVersion) {
S
Shengliang Guan 已提交
363
      if (pDnode != NULL) {
S
Shengliang Guan 已提交
364
        pDnode->offlineReason = DND_REASON_VERSION_NOT_MATCH;
S
Shengliang Guan 已提交
365
      }
S
Shengliang Guan 已提交
366
      mError("dnode:%d, status msg version:%d not match cluster:%d", statusReq.dnodeId, statusReq.sver, tsVersion);
S
Shengliang Guan 已提交
367
      terrno = TSDB_CODE_MND_INVALID_MSG_VERSION;
S
Shengliang Guan 已提交
368
      goto PROCESS_STATUS_MSG_OVER;
S
Shengliang Guan 已提交
369 370
    }

S
Shengliang Guan 已提交
371
    if (statusReq.dnodeId == 0) {
S
Shengliang Guan 已提交
372
      mDebug("dnode:%d, %s first access, set clusterId %" PRId64, pDnode->id, pDnode->ep, pMnode->clusterId);
S
Shengliang Guan 已提交
373
    } else {
S
Shengliang Guan 已提交
374
      if (statusReq.clusterId != pMnode->clusterId) {
S
Shengliang Guan 已提交
375 376 377
        if (pDnode != NULL) {
          pDnode->offlineReason = DND_REASON_CLUSTER_ID_NOT_MATCH;
        }
S
Shengliang Guan 已提交
378
        mError("dnode:%d, clusterId %" PRId64 " not match exist %" PRId64, pDnode->id, statusReq.clusterId,
S
Shengliang Guan 已提交
379 380 381 382 383 384 385
               pMnode->clusterId);
        terrno = TSDB_CODE_MND_INVALID_CLUSTER_ID;
        goto PROCESS_STATUS_MSG_OVER;
      } else {
        pDnode->accessTimes++;
        mTrace("dnode:%d, status received, access times %d", pDnode->id, pDnode->accessTimes);
      }
S
Shengliang Guan 已提交
386 387 388
    }

    // Verify whether the cluster parameters are consistent when status change from offline to ready
S
Shengliang Guan 已提交
389
    int32_t ret = mndCheckClusterCfgPara(pMnode, &statusReq.clusterCfg);
S
Shengliang Guan 已提交
390 391 392
    if (0 != ret) {
      pDnode->offlineReason = ret;
      mError("dnode:%d, cluster cfg inconsistent since:%s", pDnode->id, offlineReason[ret]);
393
      terrno = TSDB_CODE_MND_INVALID_CLUSTER_CFG;
S
Shengliang Guan 已提交
394
      goto PROCESS_STATUS_MSG_OVER;
S
Shengliang Guan 已提交
395 396
    }

397 398 399 400 401
    if (!online) {
      mInfo("dnode:%d, from offline to online", pDnode->id);
    } else {
      mDebug("dnode:%d, send dnode eps", pDnode->id);
    }
S
Shengliang Guan 已提交
402

S
Shengliang Guan 已提交
403 404 405
    pDnode->rebootTime = statusReq.rebootTime;
    pDnode->numOfCores = statusReq.numOfCores;
    pDnode->numOfSupportVnodes = statusReq.numOfSupportVnodes;
S
Shengliang Guan 已提交
406

S
Shengliang Guan 已提交
407 408 409 410 411 412
    SStatusRsp statusRsp = {0};
    statusRsp.dver = sdbGetTableVer(pMnode->pSdb, SDB_DNODE);
    statusRsp.dnodeCfg.dnodeId = pDnode->id;
    statusRsp.dnodeCfg.clusterId = pMnode->clusterId;
    statusRsp.pDnodeEps = taosArrayInit(mndGetDnodeSize(pMnode), sizeof(SDnodeEp));
    if (statusRsp.pDnodeEps == NULL) {
S
Shengliang Guan 已提交
413 414 415 416
      terrno = TSDB_CODE_OUT_OF_MEMORY;
      goto PROCESS_STATUS_MSG_OVER;
    }

S
Shengliang Guan 已提交
417 418
    mndGetDnodeData(pMnode, statusRsp.pDnodeEps);

S
Shengliang Guan 已提交
419
    int32_t contLen = tSerializeSStatusRsp(NULL, 0, &statusRsp);
S
Shengliang Guan 已提交
420
    void   *pHead = rpcMallocCont(contLen);
S
Shengliang Guan 已提交
421
    tSerializeSStatusRsp(pHead, contLen, &statusRsp);
S
Shengliang Guan 已提交
422
    taosArrayDestroy(statusRsp.pDnodeEps);
S
Shengliang Guan 已提交
423

S
Shengliang Guan 已提交
424 425
    pReq->rspLen = contLen;
    pReq->pRsp = pHead;
S
Shengliang Guan 已提交
426
  }
S
Shengliang Guan 已提交
427

S
Shengliang Guan 已提交
428
  pDnode->lastAccessTime = curMs;
S
Shengliang Guan 已提交
429 430 431 432
  code = 0;

PROCESS_STATUS_MSG_OVER:
  mndReleaseDnode(pMnode, pDnode);
S
Shengliang Guan 已提交
433
  taosArrayDestroy(statusReq.pVloads);
S
Shengliang Guan 已提交
434
  return code;
S
Shengliang Guan 已提交
435 436
}

S
Shengliang Guan 已提交
437
static int32_t mndCreateDnode(SMnode *pMnode, SNodeMsg *pReq, SCreateDnodeReq *pCreate) {
S
Shengliang Guan 已提交
438
  SDnodeObj dnodeObj = {0};
S
Shengliang Guan 已提交
439
  dnodeObj.id = sdbGetMaxId(pMnode->pSdb, SDB_DNODE);
S
Shengliang Guan 已提交
440 441
  dnodeObj.createdTime = taosGetTimestampMs();
  dnodeObj.updateTime = dnodeObj.createdTime;
S
Shengliang Guan 已提交
442 443
  dnodeObj.port = pCreate->port;
  memcpy(dnodeObj.fqdn, pCreate->fqdn, TSDB_FQDN_LEN);
S
Shengliang Guan 已提交
444
  snprintf(dnodeObj.ep, TSDB_EP_LEN, "%s:%u", dnodeObj.fqdn, dnodeObj.port);
S
Shengliang Guan 已提交
445

S
Shengliang Guan 已提交
446
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_TYPE_CREATE_DNODE, &pReq->rpcMsg);
S
Shengliang Guan 已提交
447
  if (pTrans == NULL) {
S
Shengliang Guan 已提交
448
    mError("dnode:%s, failed to create since %s", dnodeObj.ep, terrstr());
S
Shengliang Guan 已提交
449 450
    return -1;
  }
S
Shengliang Guan 已提交
451
  mDebug("trans:%d, used to create dnode:%s", pTrans->id, dnodeObj.ep);
S
Shengliang Guan 已提交
452 453 454 455 456 457 458

  SSdbRaw *pRedoRaw = mndDnodeActionEncode(&dnodeObj);
  if (pRedoRaw == NULL || mndTransAppendRedolog(pTrans, pRedoRaw) != 0) {
    mError("trans:%d, failed to append redo log since %s", pTrans->id, terrstr());
    mndTransDrop(pTrans);
    return -1;
  }
S
Shengliang Guan 已提交
459
  sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY);
S
Shengliang Guan 已提交
460

S
Shengliang Guan 已提交
461
  if (mndTransPrepare(pMnode, pTrans) != 0) {
S
Shengliang Guan 已提交
462 463 464 465 466 467 468 469 470
    mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
    mndTransDrop(pTrans);
    return -1;
  }

  mndTransDrop(pTrans);
  return 0;
}

S
Shengliang Guan 已提交
471 472
static int32_t mndProcessCreateDnodeReq(SNodeMsg *pReq) {
  SMnode         *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
473 474 475 476 477 478 479 480 481 482 483
  int32_t         code = -1;
  SUserObj       *pUser = NULL;
  SDnodeObj      *pDnode = NULL;
  SCreateDnodeReq createReq = {0};

  if (tDeserializeSCreateDnodeReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &createReq) != 0) {
    terrno = TSDB_CODE_INVALID_MSG;
    goto CREATE_DNODE_OVER;
  }

  mDebug("dnode:%s:%d, start to create", createReq.fqdn, createReq.port);
S
Shengliang Guan 已提交
484

S
Shengliang Guan 已提交
485
  if (createReq.fqdn[0] == 0 || createReq.port <= 0 || createReq.port > UINT16_MAX) {
486
    terrno = TSDB_CODE_MND_INVALID_DNODE_EP;
S
Shengliang Guan 已提交
487
    goto CREATE_DNODE_OVER;
S
Shengliang Guan 已提交
488 489
  }

S
Shengliang Guan 已提交
490
  char ep[TSDB_EP_LEN];
S
Shengliang Guan 已提交
491 492
  snprintf(ep, TSDB_EP_LEN, "%s:%d", createReq.fqdn, createReq.port);
  pDnode = mndAcquireDnodeByEp(pMnode, ep);
S
Shengliang Guan 已提交
493 494
  if (pDnode != NULL) {
    terrno = TSDB_CODE_MND_DNODE_ALREADY_EXIST;
S
Shengliang Guan 已提交
495
    goto CREATE_DNODE_OVER;
S
Shengliang Guan 已提交
496
  }
S
Shengliang Guan 已提交
497

S
Shengliang Guan 已提交
498 499 500 501 502
  pUser = mndAcquireUser(pMnode, pReq->user);
  if (pUser == NULL) {
    terrno = TSDB_CODE_MND_NO_USER_FROM_CONN;
    goto CREATE_DNODE_OVER;
  }
S
Shengliang Guan 已提交
503

S
Shengliang Guan 已提交
504
  if (mndCheckNodeAuth(pUser)) {
S
Shengliang Guan 已提交
505 506 507 508 509 510 511 512 513
    goto CREATE_DNODE_OVER;
  }

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

CREATE_DNODE_OVER:
  if (code != 0 && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
    mError("dnode:%s:%d, failed to create since %s", createReq.fqdn, createReq.port, terrstr());
S
Shengliang Guan 已提交
514 515
  }

S
Shengliang Guan 已提交
516 517 518
  mndReleaseDnode(pMnode, pDnode);
  mndReleaseUser(pMnode, pUser);
  return code;
S
Shengliang Guan 已提交
519 520
}

S
Shengliang Guan 已提交
521
static int32_t mndDropDnode(SMnode *pMnode, SNodeMsg *pReq, SDnodeObj *pDnode) {
S
Shengliang Guan 已提交
522
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_TYPE_DROP_DNODE, &pReq->rpcMsg);
S
Shengliang Guan 已提交
523 524 525 526
  if (pTrans == NULL) {
    mError("dnode:%d, failed to drop since %s", pDnode->id, terrstr());
    return -1;
  }
527
  mDebug("trans:%d, used to drop dnode:%d", pTrans->id, pDnode->id);
S
Shengliang Guan 已提交
528 529 530 531 532 533 534

  SSdbRaw *pRedoRaw = mndDnodeActionEncode(pDnode);
  if (pRedoRaw == NULL || mndTransAppendRedolog(pTrans, pRedoRaw) != 0) {
    mError("trans:%d, failed to append redo log since %s", pTrans->id, terrstr());
    mndTransDrop(pTrans);
    return -1;
  }
S
Shengliang Guan 已提交
535
  sdbSetRawStatus(pRedoRaw, SDB_STATUS_DROPPED);
S
Shengliang Guan 已提交
536

S
Shengliang Guan 已提交
537
  if (mndTransPrepare(pMnode, pTrans) != 0) {
S
Shengliang Guan 已提交
538 539 540 541 542 543 544 545 546
    mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
    mndTransDrop(pTrans);
    return -1;
  }

  mndTransDrop(pTrans);
  return 0;
}

S
Shengliang Guan 已提交
547 548
static int32_t mndProcessDropDnodeReq(SNodeMsg *pReq) {
  SMnode        *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
549 550 551
  int32_t        code = -1;
  SUserObj      *pUser = NULL;
  SDnodeObj     *pDnode = NULL;
552
  SMnodeObj     *pMObj = NULL;
S
Shengliang Guan 已提交
553
  SMDropMnodeReq dropReq = {0};
S
Shengliang Guan 已提交
554

555
  if (tDeserializeSCreateDropMQSBNodeReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &dropReq) != 0) {
S
Shengliang Guan 已提交
556 557 558
    terrno = TSDB_CODE_INVALID_MSG;
    goto DROP_DNODE_OVER;
  }
S
Shengliang Guan 已提交
559

S
Shengliang Guan 已提交
560
  mDebug("dnode:%d, start to drop", dropReq.dnodeId);
S
Shengliang Guan 已提交
561

S
Shengliang Guan 已提交
562
  if (dropReq.dnodeId <= 0) {
563
    terrno = TSDB_CODE_MND_INVALID_DNODE_ID;
S
Shengliang Guan 已提交
564
    goto DROP_DNODE_OVER;
S
Shengliang Guan 已提交
565 566
  }

S
Shengliang Guan 已提交
567
  pDnode = mndAcquireDnode(pMnode, dropReq.dnodeId);
S
Shengliang Guan 已提交
568 569
  if (pDnode == NULL) {
    terrno = TSDB_CODE_MND_DNODE_NOT_EXIST;
S
Shengliang Guan 已提交
570 571 572
    goto DROP_DNODE_OVER;
  }

573 574 575 576 577 578
  pMObj = mndAcquireMnode(pMnode, dropReq.dnodeId);
  if (pMObj != NULL) {
    terrno = TSDB_CODE_MND_MNODE_DEPLOYED;
    goto DROP_DNODE_OVER;
  }

S
Shengliang Guan 已提交
579 580 581 582
  pUser = mndAcquireUser(pMnode, pReq->user);
  if (pUser == NULL) {
    terrno = TSDB_CODE_MND_NO_USER_FROM_CONN;
    goto DROP_DNODE_OVER;
S
Shengliang Guan 已提交
583 584
  }

S
Shengliang Guan 已提交
585
  if (mndCheckNodeAuth(pUser)) {
S
Shengliang Guan 已提交
586 587 588 589 590 591 592 593 594
    goto DROP_DNODE_OVER;
  }

  code = mndDropDnode(pMnode, pReq, pDnode);
  if (code == 0) code = TSDB_CODE_MND_ACTION_IN_PROGRESS;

DROP_DNODE_OVER:
  if (code != 0 && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
    mError("dnode:%d, failed to drop since %s", dropReq.dnodeId, terrstr());
S
Shengliang Guan 已提交
595 596
  }

597
  mndReleaseDnode(pMnode, pDnode);
S
Shengliang Guan 已提交
598
  mndReleaseUser(pMnode, pUser);
599
  mndReleaseMnode(pMnode, pMObj);
S
Shengliang Guan 已提交
600 601

  return code;
S
Shengliang Guan 已提交
602 603
}

S
Shengliang Guan 已提交
604 605
static int32_t mndProcessConfigDnodeReq(SNodeMsg *pReq) {
  SMnode *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
606 607 608 609 610 611

  SMCfgDnodeReq cfgReq = {0};
  if (tDeserializeSMCfgDnodeReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &cfgReq) != 0) {
    terrno = TSDB_CODE_INVALID_MSG;
    return -1;
  }
S
Shengliang Guan 已提交
612

S
Shengliang Guan 已提交
613
  SDnodeObj *pDnode = mndAcquireDnode(pMnode, cfgReq.dnodeId);
S
Shengliang Guan 已提交
614 615
  if (pDnode == NULL) {
    terrno = TSDB_CODE_MND_DNODE_NOT_EXIST;
S
Shengliang Guan 已提交
616
    mError("dnode:%d, failed to config since %s ", cfgReq.dnodeId, terrstr());
S
Shengliang Guan 已提交
617 618 619 620 621 622
    return -1;
  }

  SEpSet epSet = mndGetDnodeEpset(pDnode);
  mndReleaseDnode(pMnode, pDnode);

S
Shengliang Guan 已提交
623 624 625 626 627 628
  int32_t bufLen = tSerializeSMCfgDnodeReq(NULL, 0, &cfgReq);
  void   *pBuf = rpcMallocCont(bufLen);
  tSerializeSMCfgDnodeReq(pBuf, bufLen, &cfgReq);

  SRpcMsg rpcMsg = {
      .msgType = TDMT_DND_CONFIG_DNODE, .pCont = pBuf, .contLen = bufLen, .ahandle = pReq->rpcMsg.ahandle};
S
Shengliang Guan 已提交
629

S
Shengliang Guan 已提交
630
  mInfo("dnode:%d, app:%p config:%s req send to dnode", cfgReq.dnodeId, rpcMsg.ahandle, cfgReq.config);
S
Shengliang Guan 已提交
631
  tmsgSendReq(&pMnode->msgCb, &epSet, &rpcMsg);
S
Shengliang Guan 已提交
632 633 634 635

  return 0;
}

S
Shengliang Guan 已提交
636
static int32_t mndProcessConfigDnodeRsp(SNodeMsg *pRsp) {
S
Shengliang Guan 已提交
637
  mInfo("app:%p config rsp from dnode", pRsp->rpcMsg.ahandle);
638
  return TSDB_CODE_SUCCESS;
639
}
S
Shengliang Guan 已提交
640

S
Shengliang Guan 已提交
641
static int32_t mndGetConfigMeta(SNodeMsg *pReq, SShowObj *pShow, STableMetaRsp *pMeta) {
S
Shengliang Guan 已提交
642
  int32_t  cols = 0;
S
Shengliang Guan 已提交
643
  SSchema *pSchema = pMeta->pSchemas;
S
Shengliang Guan 已提交
644 645 646

  pShow->bytes[cols] = TSDB_CONFIG_OPTION_LEN + VARSTR_HEADER_SIZE;
  pSchema[cols].type = TSDB_DATA_TYPE_BINARY;
L
Liu Jicong 已提交
647
  strcpy(pSchema[cols].name, "name");
S
Shengliang Guan 已提交
648
  pSchema[cols].bytes = pShow->bytes[cols];
S
Shengliang Guan 已提交
649 650 651 652
  cols++;

  pShow->bytes[cols] = TSDB_CONIIG_VALUE_LEN + VARSTR_HEADER_SIZE;
  pSchema[cols].type = TSDB_DATA_TYPE_BINARY;
L
Liu Jicong 已提交
653
  strcpy(pSchema[cols].name, "value");
S
Shengliang Guan 已提交
654
  pSchema[cols].bytes = pShow->bytes[cols];
S
Shengliang Guan 已提交
655 656
  cols++;

S
Shengliang Guan 已提交
657
  pMeta->numOfColumns = cols;
S
Shengliang Guan 已提交
658 659 660 661 662 663 664 665 666
  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 = TSDB_CONFIG_NUMBER;
  pShow->rowSize = pShow->offset[cols - 1] + pShow->bytes[cols - 1];
D
dapan1121 已提交
667
  strcpy(pMeta->tbName, mndShowStr(pShow->type));
S
Shengliang Guan 已提交
668 669 670 671

  return 0;
}

S
Shengliang Guan 已提交
672 673
static int32_t mndRetrieveConfigs(SNodeMsg *pReq, SShowObj *pShow, char *data, int32_t rows) {
  SMnode *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
674
  int32_t totalRows = 0;
S
Shengliang Guan 已提交
675 676 677 678 679 680
  int32_t numOfRows = 0;
  char   *cfgOpts[TSDB_CONFIG_NUMBER] = {0};
  char    cfgVals[TSDB_CONFIG_NUMBER][TSDB_CONIIG_VALUE_LEN + 1] = {0};
  char   *pWrite;
  int32_t cols = 0;

S
Shengliang Guan 已提交
681 682 683
  cfgOpts[totalRows] = "statusInterval";
  snprintf(cfgVals[totalRows], TSDB_CONIIG_VALUE_LEN, "%d", tsStatusInterval);
  totalRows++;
S
Shengliang Guan 已提交
684

S
Shengliang Guan 已提交
685
  cfgOpts[totalRows] = "timezone";
wafwerar's avatar
wafwerar 已提交
686
  snprintf(cfgVals[totalRows], TSDB_CONIIG_VALUE_LEN, "%s", tsTimezoneStr);
S
Shengliang Guan 已提交
687
  totalRows++;
S
Shengliang Guan 已提交
688

S
Shengliang Guan 已提交
689 690 691
  cfgOpts[totalRows] = "locale";
  snprintf(cfgVals[totalRows], TSDB_CONIIG_VALUE_LEN, "%s", tsLocale);
  totalRows++;
S
Shengliang Guan 已提交
692

S
Shengliang Guan 已提交
693 694 695
  cfgOpts[totalRows] = "charset";
  snprintf(cfgVals[totalRows], TSDB_CONIIG_VALUE_LEN, "%s", tsCharset);
  totalRows++;
S
Shengliang Guan 已提交
696

S
Shengliang Guan 已提交
697
  for (int32_t i = 0; i < totalRows; i++) {
S
Shengliang Guan 已提交
698 699 700 701 702 703 704 705 706
    cols = 0;

    pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
    STR_WITH_MAXSIZE_TO_VARSTR(pWrite, cfgOpts[i], TSDB_CONFIG_OPTION_LEN);
    cols++;

    pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
    STR_WITH_MAXSIZE_TO_VARSTR(pWrite, cfgVals[i], TSDB_CONIIG_VALUE_LEN);
    cols++;
S
Shengliang Guan 已提交
707 708

    numOfRows++;
S
Shengliang Guan 已提交
709 710
  }

S
Shengliang Guan 已提交
711
  mndVacuumResult(data, pShow->numOfColumns, numOfRows, rows, pShow);
S
Shengliang Guan 已提交
712 713 714 715 716 717
  pShow->numOfReads += numOfRows;
  return numOfRows;
}

static void mndCancelGetNextConfig(SMnode *pMnode, void *pIter) {}

S
Shengliang Guan 已提交
718 719
static int32_t mndRetrieveDnodes(SNodeMsg *pReq, SShowObj *pShow, char *data, int32_t rows) {
  SMnode    *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
720 721 722 723 724
  SSdb      *pSdb = pMnode->pSdb;
  int32_t    numOfRows = 0;
  int32_t    cols = 0;
  SDnodeObj *pDnode = NULL;
  char      *pWrite;
S
Shengliang Guan 已提交
725
  int64_t    curMs = taosGetTimestampMs();
S
Shengliang Guan 已提交
726 727 728 729

  while (numOfRows < rows) {
    pShow->pIter = sdbFetch(pSdb, SDB_DNODE, pShow->pIter, (void **)&pDnode);
    if (pShow->pIter == NULL) break;
S
Shengliang Guan 已提交
730
    bool online = mndIsDnodeOnline(pMnode, pDnode, curMs);
S
Shengliang Guan 已提交
731 732 733 734 735 736 737 738 739 740 741 742

    cols = 0;

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

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

    pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
S
Shengliang Guan 已提交
743
    *(int16_t *)pWrite = mndGetVnodesNum(pMnode, pDnode->id);
S
Shengliang Guan 已提交
744 745 746
    cols++;

    pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
747
    *(int16_t *)pWrite = pDnode->numOfSupportVnodes;
S
Shengliang Guan 已提交
748 749 750
    cols++;

    pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
S
Shengliang Guan 已提交
751
    STR_TO_VARSTR(pWrite, online ? "ready" : "offline");
S
Shengliang Guan 已提交
752 753 754 755 756 757 758
    cols++;

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

    pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
S
Shengliang Guan 已提交
759
    STR_TO_VARSTR(pWrite, online ? "" : offlineReason[pDnode->offlineReason]);
S
Shengliang Guan 已提交
760 761 762 763 764 765
    cols++;

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

S
Shengliang Guan 已提交
766
  mndVacuumResult(data, pShow->numOfColumns, numOfRows, rows, pShow);
S
Shengliang Guan 已提交
767
  pShow->numOfReads += numOfRows;
S
Shengliang Guan 已提交
768

S
Shengliang Guan 已提交
769 770 771 772 773 774
  return numOfRows;
}

static void mndCancelGetNextDnode(SMnode *pMnode, void *pIter) {
  SSdb *pSdb = pMnode->pSdb;
  sdbCancelFetch(pSdb, pIter);
L
Liu Jicong 已提交
775
}