mndDb.c 52.2 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 "mndDb.h"
S
Shengliang Guan 已提交
18
#include "mndAuth.h"
S
Shengliang Guan 已提交
19
#include "mndDnode.h"
L
Liu Jicong 已提交
20
#include "mndOffset.h"
S
Shengliang Guan 已提交
21
#include "mndShow.h"
S
Shengliang Guan 已提交
22
#include "mndSma.h"
23
#include "mndStb.h"
L
Liu Jicong 已提交
24 25
#include "mndSubscribe.h"
#include "mndTopic.h"
S
Shengliang Guan 已提交
26
#include "mndTrans.h"
S
Shengliang Guan 已提交
27
#include "mndUser.h"
28
#include "mndVgroup.h"
29
#include "systable.h"
S
Shengliang Guan 已提交
30

S
Shengliang Guan 已提交
31 32
#define DB_VER_NUMBER   1
#define DB_RESERVE_SIZE 64
S
Shengliang Guan 已提交
33 34 35 36 37

static SSdbRaw *mndDbActionEncode(SDbObj *pDb);
static SSdbRow *mndDbActionDecode(SSdbRaw *pRaw);
static int32_t  mndDbActionInsert(SSdb *pSdb, SDbObj *pDb);
static int32_t  mndDbActionDelete(SSdb *pSdb, SDbObj *pDb);
S
Shengliang Guan 已提交
38
static int32_t  mndDbActionUpdate(SSdb *pSdb, SDbObj *pOld, SDbObj *pNew);
S
Shengliang Guan 已提交
39 40 41 42 43
static int32_t  mndProcessCreateDbReq(SNodeMsg *pReq);
static int32_t  mndProcessAlterDbReq(SNodeMsg *pReq);
static int32_t  mndProcessDropDbReq(SNodeMsg *pReq);
static int32_t  mndProcessUseDbReq(SNodeMsg *pReq);
static int32_t  mndProcessCompactDbReq(SNodeMsg *pReq);
S
Shengliang Guan 已提交
44
static int32_t  mndRetrieveDbs(SNodeMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rowsCapacity);
S
Shengliang Guan 已提交
45
static void     mndCancelGetNextDb(SMnode *pMnode, void *pIter);
D
dapan1121 已提交
46
static int32_t  mndProcessGetDbCfgReq(SNodeMsg *pReq);
S
Shengliang Guan 已提交
47

S
Shengliang Guan 已提交
48
int32_t mndInitDb(SMnode *pMnode) {
S
Shengliang Guan 已提交
49 50 51 52 53 54 55 56 57
  SSdbTable table = {
      .sdbType = SDB_DB,
      .keyType = SDB_KEY_BINARY,
      .encodeFp = (SdbEncodeFp)mndDbActionEncode,
      .decodeFp = (SdbDecodeFp)mndDbActionDecode,
      .insertFp = (SdbInsertFp)mndDbActionInsert,
      .updateFp = (SdbUpdateFp)mndDbActionUpdate,
      .deleteFp = (SdbDeleteFp)mndDbActionDelete,
  };
S
Shengliang Guan 已提交
58

S
Shengliang Guan 已提交
59 60 61 62 63
  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_DB, mndProcessCreateDbReq);
  mndSetMsgHandle(pMnode, TDMT_MND_ALTER_DB, mndProcessAlterDbReq);
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_DB, mndProcessDropDbReq);
  mndSetMsgHandle(pMnode, TDMT_MND_USE_DB, mndProcessUseDbReq);
  mndSetMsgHandle(pMnode, TDMT_MND_COMPACT_DB, mndProcessCompactDbReq);
D
dapan1121 已提交
64
  mndSetMsgHandle(pMnode, TDMT_MND_GET_DB_CFG, mndProcessGetDbCfgReq);
S
Shengliang Guan 已提交
65 66 67 68

  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_DB, mndRetrieveDbs);
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_DB, mndCancelGetNextDb);

S
Shengliang Guan 已提交
69
  return sdbSetTable(pMnode->pSdb, table);
S
Shengliang Guan 已提交
70
}
S
Shengliang Guan 已提交
71

S
Shengliang Guan 已提交
72
void mndCleanupDb(SMnode *pMnode) {}
S
Shengliang Guan 已提交
73

S
Shengliang Guan 已提交
74
static SSdbRaw *mndDbActionEncode(SDbObj *pDb) {
75 76
  terrno = TSDB_CODE_OUT_OF_MEMORY;

S
Shengliang Guan 已提交
77 78 79
  int32_t  size = sizeof(SDbObj) + pDb->cfg.numOfRetensions * sizeof(SRetention) + DB_RESERVE_SIZE;
  SSdbRaw *pRaw = sdbAllocRaw(SDB_DB, DB_VER_NUMBER, size);
  if (pRaw == NULL) goto _OVER;
S
Shengliang Guan 已提交
80 81

  int32_t dataPos = 0;
S
Shengliang Guan 已提交
82 83 84 85 86 87 88 89 90
  SDB_SET_BINARY(pRaw, dataPos, pDb->name, TSDB_DB_FNAME_LEN, _OVER)
  SDB_SET_BINARY(pRaw, dataPos, pDb->acct, TSDB_USER_LEN, _OVER)
  SDB_SET_BINARY(pRaw, dataPos, pDb->createUser, TSDB_USER_LEN, _OVER)
  SDB_SET_INT64(pRaw, dataPos, pDb->createdTime, _OVER)
  SDB_SET_INT64(pRaw, dataPos, pDb->updateTime, _OVER)
  SDB_SET_INT64(pRaw, dataPos, pDb->uid, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfgVersion, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->vgVersion, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.numOfVgroups, _OVER)
S
Shengliang Guan 已提交
91 92 93 94
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.numOfStables, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.buffer, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.pageSize, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.pages, _OVER)
S
Shengliang Guan 已提交
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.daysPerFile, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.daysToKeep0, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.daysToKeep1, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.daysToKeep2, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.minRows, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.maxRows, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.fsyncPeriod, _OVER)
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.walLevel, _OVER)
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.precision, _OVER)
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.compression, _OVER)
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.replications, _OVER)
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.strict, _OVER)
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.cacheLastRow, _OVER)
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.hashMethod, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.numOfRetensions, _OVER)
S
sma  
Shengliang Guan 已提交
110
  for (int32_t i = 0; i < pDb->cfg.numOfRetensions; ++i) {
C
Cary Xu 已提交
111
    TASSERT(taosArrayGetSize(pDb->cfg.pRetensions) == pDb->cfg.numOfRetensions);
S
sma  
Shengliang Guan 已提交
112
    SRetention *pRetension = taosArrayGet(pDb->cfg.pRetensions, i);
C
Cary Xu 已提交
113 114
    SDB_SET_INT64(pRaw, dataPos, pRetension->freq, _OVER)
    SDB_SET_INT64(pRaw, dataPos, pRetension->keep, _OVER)
S
Shengliang Guan 已提交
115 116
    SDB_SET_INT8(pRaw, dataPos, pRetension->freqUnit, _OVER)
    SDB_SET_INT8(pRaw, dataPos, pRetension->keepUnit, _OVER)
S
sma  
Shengliang Guan 已提交
117 118
  }

S
Shengliang Guan 已提交
119 120
  SDB_SET_RESERVE(pRaw, dataPos, DB_RESERVE_SIZE, _OVER)
  SDB_SET_DATALEN(pRaw, dataPos, _OVER)
121 122 123

  terrno = 0;

S
Shengliang Guan 已提交
124
_OVER:
125 126 127 128 129
  if (terrno != 0) {
    mError("db:%s, failed to encode to raw:%p since %s", pDb->name, pRaw, terrstr());
    sdbFreeRaw(pRaw);
    return NULL;
  }
S
Shengliang Guan 已提交
130

131
  mTrace("db:%s, encode to raw:%p, row:%p", pDb->name, pRaw, pDb);
S
Shengliang Guan 已提交
132 133 134 135
  return pRaw;
}

static SSdbRow *mndDbActionDecode(SSdbRaw *pRaw) {
136 137
  terrno = TSDB_CODE_OUT_OF_MEMORY;

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

S
Shengliang Guan 已提交
141
  if (sver != DB_VER_NUMBER) {
S
Shengliang Guan 已提交
142
    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
S
Shengliang Guan 已提交
143
    goto _OVER;
S
Shengliang Guan 已提交
144 145 146
  }

  SSdbRow *pRow = sdbAllocRow(sizeof(SDbObj));
S
Shengliang Guan 已提交
147
  if (pRow == NULL) goto _OVER;
148 149

  SDbObj *pDb = sdbGetRowObj(pRow);
S
Shengliang Guan 已提交
150
  if (pDb == NULL) goto _OVER;
S
Shengliang Guan 已提交
151 152

  int32_t dataPos = 0;
S
Shengliang Guan 已提交
153 154 155 156 157 158 159 160 161
  SDB_GET_BINARY(pRaw, dataPos, pDb->name, TSDB_DB_FNAME_LEN, _OVER)
  SDB_GET_BINARY(pRaw, dataPos, pDb->acct, TSDB_USER_LEN, _OVER)
  SDB_GET_BINARY(pRaw, dataPos, pDb->createUser, TSDB_USER_LEN, _OVER)
  SDB_GET_INT64(pRaw, dataPos, &pDb->createdTime, _OVER)
  SDB_GET_INT64(pRaw, dataPos, &pDb->updateTime, _OVER)
  SDB_GET_INT64(pRaw, dataPos, &pDb->uid, _OVER)
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfgVersion, _OVER)
  SDB_GET_INT32(pRaw, dataPos, &pDb->vgVersion, _OVER)
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.numOfVgroups, _OVER)
S
Shengliang Guan 已提交
162 163 164 165
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.numOfStables, _OVER)
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.buffer, _OVER)
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.pageSize, _OVER)
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.pages, _OVER)
S
Shengliang Guan 已提交
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysPerFile, _OVER)
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysToKeep0, _OVER)
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysToKeep1, _OVER)
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysToKeep2, _OVER)
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.minRows, _OVER)
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.maxRows, _OVER)
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.fsyncPeriod, _OVER)
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.walLevel, _OVER)
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.precision, _OVER)
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.compression, _OVER)
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.replications, _OVER)
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.strict, _OVER)
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.cacheLastRow, _OVER)
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.hashMethod, _OVER)
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.numOfRetensions, _OVER)
S
sma  
Shengliang Guan 已提交
181 182
  if (pDb->cfg.numOfRetensions > 0) {
    pDb->cfg.pRetensions = taosArrayInit(pDb->cfg.numOfRetensions, sizeof(SRetention));
S
Shengliang Guan 已提交
183
    if (pDb->cfg.pRetensions == NULL) goto _OVER;
S
sma  
Shengliang Guan 已提交
184 185
    for (int32_t i = 0; i < pDb->cfg.numOfRetensions; ++i) {
      SRetention retension = {0};
C
Cary Xu 已提交
186 187
      SDB_GET_INT64(pRaw, dataPos, &retension.freq, _OVER)
      SDB_GET_INT64(pRaw, dataPos, &retension.keep, _OVER)
S
Shengliang Guan 已提交
188 189
      SDB_GET_INT8(pRaw, dataPos, &retension.freqUnit, _OVER)
      SDB_GET_INT8(pRaw, dataPos, &retension.keepUnit, _OVER)
S
sma  
Shengliang Guan 已提交
190
      if (taosArrayPush(pDb->cfg.pRetensions, &retension) == NULL) {
S
Shengliang Guan 已提交
191
        goto _OVER;
S
sma  
Shengliang Guan 已提交
192 193 194 195
      }
    }
  }

S
Shengliang Guan 已提交
196
  SDB_GET_RESERVE(pRaw, dataPos, DB_RESERVE_SIZE, _OVER)
S
Shengliang Guan 已提交
197
  taosInitRWLatch(&pDb->lock);
198 199 200

  terrno = 0;

S
Shengliang Guan 已提交
201
_OVER:
202 203
  if (terrno != 0) {
    mError("db:%s, failed to decode from raw:%p since %s", pDb->name, pRaw, terrstr());
wafwerar's avatar
wafwerar 已提交
204
    taosMemoryFreeClear(pRow);
205 206
    return NULL;
  }
S
Shengliang Guan 已提交
207

208
  mTrace("db:%s, decode from raw:%p, row:%p", pDb->name, pRaw, pDb);
S
Shengliang Guan 已提交
209 210 211 212
  return pRow;
}

static int32_t mndDbActionInsert(SSdb *pSdb, SDbObj *pDb) {
213
  mTrace("db:%s, perform insert action, row:%p", pDb->name, pDb);
S
Shengliang Guan 已提交
214 215 216 217
  return 0;
}

static int32_t mndDbActionDelete(SSdb *pSdb, SDbObj *pDb) {
218
  mTrace("db:%s, perform delete action, row:%p", pDb->name, pDb);
S
sma  
Shengliang Guan 已提交
219
  taosArrayDestroy(pDb->cfg.pRetensions);
S
Shengliang Guan 已提交
220 221 222
  return 0;
}

S
Shengliang Guan 已提交
223 224
static int32_t mndDbActionUpdate(SSdb *pSdb, SDbObj *pOld, SDbObj *pNew) {
  mTrace("db:%s, perform update action, old row:%p new row:%p", pOld->name, pOld, pNew);
225
  taosWLockLatch(&pOld->lock);
S
Shengliang Guan 已提交
226 227 228
  pOld->updateTime = pNew->updateTime;
  pOld->cfgVersion = pNew->cfgVersion;
  pOld->vgVersion = pNew->vgVersion;
S
Shengliang Guan 已提交
229 230 231 232 233 234 235 236 237 238 239 240
  pOld->cfg.buffer = pNew->cfg.buffer;
  pOld->cfg.pages = pNew->cfg.pages;
  pOld->cfg.pageSize = pNew->cfg.pageSize;
  pOld->cfg.daysPerFile = pNew->cfg.daysPerFile;
  pOld->cfg.daysToKeep0 = pNew->cfg.daysToKeep0;
  pOld->cfg.daysToKeep1 = pNew->cfg.daysToKeep1;
  pOld->cfg.daysToKeep2 = pNew->cfg.daysToKeep2;
  pOld->cfg.fsyncPeriod = pNew->cfg.fsyncPeriod;
  pOld->cfg.walLevel = pNew->cfg.walLevel;
  pOld->cfg.strict = pNew->cfg.strict;
  pOld->cfg.cacheLastRow = pNew->cfg.cacheLastRow;
  pOld->cfg.replications = pNew->cfg.replications;
241
  taosWUnLockLatch(&pOld->lock);
S
Shengliang Guan 已提交
242 243 244
  return 0;
}

S
Shengliang Guan 已提交
245 246 247 248
static inline int32_t mndGetGlobalVgroupVersion(SMnode *pMnode) {
  SSdb *pSdb = pMnode->pSdb;
  return sdbGetTableVer(pSdb, SDB_VGROUP);
}
249

S
Shengliang Guan 已提交
250
SDbObj *mndAcquireDb(SMnode *pMnode, const char *db) {
S
Shengliang Guan 已提交
251 252
  SSdb   *pSdb = pMnode->pSdb;
  SDbObj *pDb = sdbAcquire(pSdb, SDB_DB, db);
S
Shengliang Guan 已提交
253
  if (pDb == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
S
Shengliang Guan 已提交
254 255 256
    terrno = TSDB_CODE_MND_DB_NOT_EXIST;
  }
  return pDb;
S
Shengliang Guan 已提交
257
}
S
Shengliang Guan 已提交
258

S
Shengliang Guan 已提交
259 260 261 262 263
void mndReleaseDb(SMnode *pMnode, SDbObj *pDb) {
  SSdb *pSdb = pMnode->pSdb;
  sdbRelease(pSdb, pDb);
}

S
Shengliang Guan 已提交
264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361
static int32_t mndAddCreateVnodeAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup, SVnodeGid *pVgid,
                                       bool isRedo) {
  STransAction action = {0};

  SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
  if (pDnode == NULL) return -1;
  action.epSet = mndGetDnodeEpset(pDnode);
  mndReleaseDnode(pMnode, pDnode);

  int32_t contLen = 0;
  void   *pReq = mndBuildCreateVnodeReq(pMnode, pDnode, pDb, pVgroup, &contLen);
  if (pReq == NULL) return -1;

  action.pCont = pReq;
  action.contLen = contLen;
  action.msgType = TDMT_DND_CREATE_VNODE;
  action.acceptableCode = TSDB_CODE_NODE_ALREADY_DEPLOYED;

  if (isRedo) {
    if (mndTransAppendRedoAction(pTrans, &action) != 0) {
      taosMemoryFree(pReq);
      return -1;
    }
  } else {
    if (mndTransAppendUndoAction(pTrans, &action) != 0) {
      taosMemoryFree(pReq);
      return -1;
    }
  }

  return 0;
}

static int32_t mndAddAlterVnodeAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup, SVnodeGid *pVgid,
                                      bool isRedo) {
  STransAction action = {0};

  SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
  if (pDnode == NULL) return -1;
  action.epSet = mndGetDnodeEpset(pDnode);
  mndReleaseDnode(pMnode, pDnode);

  int32_t contLen = 0;
  void   *pReq = mndBuildAlterVnodeReq(pMnode, pDnode, pDb, pVgroup, &contLen);
  if (pReq == NULL) return -1;

  action.pCont = pReq;
  action.contLen = contLen;
  action.msgType = TDMT_VND_ALTER_VNODE;

  if (isRedo) {
    if (mndTransAppendRedoAction(pTrans, &action) != 0) {
      taosMemoryFree(pReq);
      return -1;
    }
  } else {
    if (mndTransAppendUndoAction(pTrans, &action) != 0) {
      taosMemoryFree(pReq);
      return -1;
    }
  }

  return 0;
}

static int32_t mndAddDropVnodeAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup, SVnodeGid *pVgid,
                                     bool isRedo) {
  STransAction action = {0};

  SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
  if (pDnode == NULL) return -1;
  action.epSet = mndGetDnodeEpset(pDnode);
  mndReleaseDnode(pMnode, pDnode);

  int32_t contLen = 0;
  void   *pReq = mndBuildDropVnodeReq(pMnode, pDnode, pDb, pVgroup, &contLen);
  if (pReq == NULL) return -1;

  action.pCont = pReq;
  action.contLen = contLen;
  action.msgType = TDMT_DND_DROP_VNODE;
  action.acceptableCode = TSDB_CODE_NODE_NOT_DEPLOYED;

  if (isRedo) {
    if (mndTransAppendRedoAction(pTrans, &action) != 0) {
      taosMemoryFree(pReq);
      return -1;
    }
  } else {
    if (mndTransAppendUndoAction(pTrans, &action) != 0) {
      taosMemoryFree(pReq);
      return -1;
    }
  }

  return 0;
}

S
Shengliang Guan 已提交
362
static int32_t mndCheckDbName(const char *dbName, SUserObj *pUser) {
S
Shengliang Guan 已提交
363 364 365 366 367 368 369 370 371 372 373 374 375 376 377
  char *pos = strstr(dbName, TS_PATH_DELIMITER);
  if (pos == NULL) {
    terrno = TSDB_CODE_MND_INVALID_DB;
    return -1;
  }

  int32_t acctId = atoi(dbName);
  if (acctId != pUser->acctId) {
    terrno = TSDB_CODE_MND_INVALID_DB_ACCT;
    return -1;
  }

  return 0;
}

S
Shengliang Guan 已提交
378
static int32_t mndCheckDbCfg(SMnode *pMnode, SDbCfg *pCfg) {
S
Shengliang Guan 已提交
379 380
  terrno = TSDB_CODE_MND_INVALID_DB_OPTION;

381
  if (pCfg->numOfVgroups < TSDB_MIN_VNODES_PER_DB || pCfg->numOfVgroups > TSDB_MAX_VNODES_PER_DB) return -1;
S
Shengliang Guan 已提交
382 383 384 385
  if (pCfg->numOfStables < TSDB_DB_STREAM_MODE_OFF || pCfg->numOfStables > TSDB_DB_STREAM_MODE_ON) return -1;
  if (pCfg->buffer < TSDB_MIN_BUFFER_PER_VNODE || pCfg->buffer > TSDB_MAX_BUFFER_PER_VNODE) return -1;
  if (pCfg->pageSize < TSDB_MIN_PAGESIZE_PER_VNODE || pCfg->pageSize > TSDB_MAX_PAGESIZE_PER_VNODE) return -1;
  if (pCfg->pages < TSDB_MIN_PAGES_PER_VNODE || pCfg->pages > TSDB_MAX_PAGES_PER_VNODE) return -1;
S
Shengliang Guan 已提交
386 387 388 389
  if (pCfg->daysPerFile < TSDB_MIN_DAYS_PER_FILE || pCfg->daysPerFile > TSDB_MAX_DAYS_PER_FILE) return -1;
  if (pCfg->daysToKeep0 < TSDB_MIN_KEEP || pCfg->daysToKeep0 > TSDB_MAX_KEEP) return -1;
  if (pCfg->daysToKeep1 < TSDB_MIN_KEEP || pCfg->daysToKeep1 > TSDB_MAX_KEEP) return -1;
  if (pCfg->daysToKeep2 < TSDB_MIN_KEEP || pCfg->daysToKeep2 > TSDB_MAX_KEEP) return -1;
S
Shengliang Guan 已提交
390
  if (pCfg->daysToKeep0 < pCfg->daysPerFile) return -1;
S
Shengliang Guan 已提交
391 392
  if (pCfg->daysToKeep0 > pCfg->daysToKeep1) return -1;
  if (pCfg->daysToKeep1 > pCfg->daysToKeep2) return -1;
S
Shengliang Guan 已提交
393 394
  if (pCfg->minRows < TSDB_MIN_MINROWS_FBLOCK || pCfg->minRows > TSDB_MAX_MINROWS_FBLOCK) return -1;
  if (pCfg->maxRows < TSDB_MIN_MAXROWS_FBLOCK || pCfg->maxRows > TSDB_MAX_MAXROWS_FBLOCK) return -1;
S
Shengliang Guan 已提交
395 396 397 398 399
  if (pCfg->minRows > pCfg->maxRows) return -1;
  if (pCfg->fsyncPeriod < TSDB_MIN_FSYNC_PERIOD || pCfg->fsyncPeriod > TSDB_MAX_FSYNC_PERIOD) return -1;
  if (pCfg->walLevel < TSDB_MIN_WAL_LEVEL || pCfg->walLevel > TSDB_MAX_WAL_LEVEL) return -1;
  if (pCfg->precision < TSDB_MIN_PRECISION && pCfg->precision > TSDB_MAX_PRECISION) return -1;
  if (pCfg->compression < TSDB_MIN_COMP_LEVEL || pCfg->compression > TSDB_MAX_COMP_LEVEL) return -1;
S
Shengliang Guan 已提交
400
  if (pCfg->replications < TSDB_MIN_DB_REPLICA || pCfg->replications > TSDB_MAX_DB_REPLICA) return -1;
S
Shengliang Guan 已提交
401
  if (pCfg->replications > mndGetDnodeSize(pMnode)) return -1;
402
  if (pCfg->strict < TSDB_DB_STRICT_OFF || pCfg->strict > TSDB_DB_STRICT_ON) return -1;
S
Shengliang Guan 已提交
403
  if (pCfg->cacheLastRow < TSDB_MIN_DB_CACHE_LAST_ROW || pCfg->cacheLastRow > TSDB_MAX_DB_CACHE_LAST_ROW) return -1;
S
Shengliang Guan 已提交
404
  if (pCfg->hashMethod != 1) return -1;
S
Shengliang Guan 已提交
405 406

  terrno = 0;
S
Shengliang Guan 已提交
407 408 409 410
  return TSDB_CODE_SUCCESS;
}

static void mndSetDefaultDbCfg(SDbCfg *pCfg) {
411
  if (pCfg->numOfVgroups < 0) pCfg->numOfVgroups = TSDB_DEFAULT_VN_PER_DB;
S
Shengliang Guan 已提交
412 413 414 415 416
  if (pCfg->numOfStables < 0) pCfg->numOfStables = TSDB_DEFAULT_DB_SINGLE_STABLE;
  if (pCfg->buffer < 0) pCfg->buffer = TSDB_DEFAULT_BUFFER_PER_VNODE;
  if (pCfg->pageSize < 0) pCfg->pageSize = TSDB_DEFAULT_PAGES_PER_VNODE;
  if (pCfg->pages < 0) pCfg->pages = TSDB_MAX_PAGESIZE_PER_VNODE;
  if (pCfg->daysPerFile < 0) pCfg->daysPerFile = TSDB_DEFAULT_DURATION_PER_FILE;
S
Shengliang Guan 已提交
417
  if (pCfg->daysToKeep0 < 0) pCfg->daysToKeep0 = TSDB_DEFAULT_KEEP;
418 419
  if (pCfg->daysToKeep1 < 0) pCfg->daysToKeep1 = pCfg->daysToKeep0;
  if (pCfg->daysToKeep2 < 0) pCfg->daysToKeep2 = pCfg->daysToKeep1;
S
Shengliang Guan 已提交
420 421
  if (pCfg->minRows < 0) pCfg->minRows = TSDB_DEFAULT_MINROWS_FBLOCK;
  if (pCfg->maxRows < 0) pCfg->maxRows = TSDB_DEFAULT_MAXROWS_FBLOCK;
S
Shengliang Guan 已提交
422 423 424 425
  if (pCfg->fsyncPeriod < 0) pCfg->fsyncPeriod = TSDB_DEFAULT_FSYNC_PERIOD;
  if (pCfg->walLevel < 0) pCfg->walLevel = TSDB_DEFAULT_WAL_LEVEL;
  if (pCfg->precision < 0) pCfg->precision = TSDB_DEFAULT_PRECISION;
  if (pCfg->compression < 0) pCfg->compression = TSDB_DEFAULT_COMP_LEVEL;
S
Shengliang Guan 已提交
426 427
  if (pCfg->replications < 0) pCfg->replications = TSDB_DEFAULT_DB_REPLICA;
  if (pCfg->strict < 0) pCfg->strict = TSDB_DEFAULT_DB_STRICT;
S
Shengliang Guan 已提交
428
  if (pCfg->cacheLastRow < 0) pCfg->cacheLastRow = TSDB_DEFAULT_CACHE_LAST_ROW;
429
  if (pCfg->numOfRetensions < 0) pCfg->numOfRetensions = 0;
S
Shengliang Guan 已提交
430
}
S
Shengliang Guan 已提交
431

S
Shengliang Guan 已提交
432
static int32_t mndSetCreateDbRedoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
S
Shengliang Guan 已提交
433
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
S
Shengliang Guan 已提交
434 435 436
  if (pDbRaw == NULL) return -1;
  if (mndTransAppendRedolog(pTrans, pDbRaw) != 0) return -1;
  if (sdbSetRawStatus(pDbRaw, SDB_STATUS_CREATING) != 0) return -1;
S
Shengliang Guan 已提交
437

S
Shengliang Guan 已提交
438
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
S
Shengliang Guan 已提交
439
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
S
Shengliang Guan 已提交
440 441 442
    if (pVgRaw == NULL) return -1;
    if (mndTransAppendRedolog(pTrans, pVgRaw) != 0) return -1;
    if (sdbSetRawStatus(pVgRaw, SDB_STATUS_CREATING) != 0) return -1;
S
Shengliang Guan 已提交
443 444 445 446 447
  }

  return 0;
}

S
Shengliang Guan 已提交
448
static int32_t mndSetCreateDbUndoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
S
Shengliang Guan 已提交
449
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
S
Shengliang Guan 已提交
450 451 452
  if (pDbRaw == NULL) return -1;
  if (mndTransAppendUndolog(pTrans, pDbRaw) != 0) return -1;
  if (sdbSetRawStatus(pDbRaw, SDB_STATUS_DROPPED) != 0) return -1;
S
Shengliang Guan 已提交
453

S
Shengliang Guan 已提交
454
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
S
Shengliang Guan 已提交
455
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
S
Shengliang Guan 已提交
456 457 458
    if (pVgRaw == NULL) return -1;
    if (mndTransAppendUndolog(pTrans, pVgRaw) != 0) return -1;
    if (sdbSetRawStatus(pVgRaw, SDB_STATUS_DROPPED) != 0) return -1;
S
Shengliang Guan 已提交
459 460 461 462 463
  }

  return 0;
}

S
Shengliang Guan 已提交
464
static int32_t mndSetCreateDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
S
Shengliang Guan 已提交
465
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
S
Shengliang Guan 已提交
466 467 468
  if (pDbRaw == NULL) return -1;
  if (mndTransAppendCommitlog(pTrans, pDbRaw) != 0) return -1;
  if (sdbSetRawStatus(pDbRaw, SDB_STATUS_READY) != 0) return -1;
S
Shengliang Guan 已提交
469

S
Shengliang Guan 已提交
470
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
S
Shengliang Guan 已提交
471
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
S
Shengliang Guan 已提交
472 473 474
    if (pVgRaw == NULL) return -1;
    if (mndTransAppendCommitlog(pTrans, pVgRaw) != 0) return -1;
    if (sdbSetRawStatus(pVgRaw, SDB_STATUS_READY) != 0) return -1;
S
Shengliang Guan 已提交
475 476 477 478 479
  }

  return 0;
}

S
Shengliang Guan 已提交
480 481
static int32_t mndSetCreateDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
  for (int32_t vg = 0; vg < pDb->cfg.numOfVgroups; ++vg) {
S
Shengliang Guan 已提交
482
    SVgObj *pVgroup = pVgroups + vg;
S
Shengliang Guan 已提交
483 484

    for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
S
Shengliang Guan 已提交
485 486
      SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
      if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid, true) != 0) {
S
Shengliang Guan 已提交
487 488 489 490 491
        return -1;
      }
    }
  }

S
Shengliang Guan 已提交
492 493 494
  return 0;
}

S
Shengliang Guan 已提交
495 496
static int32_t mndSetCreateDbUndoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
  for (int32_t vg = 0; vg < pDb->cfg.numOfVgroups; ++vg) {
S
Shengliang Guan 已提交
497
    SVgObj *pVgroup = pVgroups + vg;
S
Shengliang Guan 已提交
498 499

    for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
S
Shengliang Guan 已提交
500 501
      SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
      if (mndAddDropVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid, false) != 0) {
S
Shengliang Guan 已提交
502 503 504 505 506
        return -1;
      }
    }
  }

S
Shengliang Guan 已提交
507 508 509
  return 0;
}

S
Shengliang Guan 已提交
510
static int32_t mndCreateDb(SMnode *pMnode, SNodeMsg *pReq, SCreateDbReq *pCreate, SUserObj *pUser) {
S
Shengliang Guan 已提交
511
  SDbObj dbObj = {0};
512
  memcpy(dbObj.name, pCreate->db, TSDB_DB_FNAME_LEN);
S
Shengliang Guan 已提交
513
  memcpy(dbObj.acct, pUser->acct, TSDB_USER_LEN);
S
Shengliang Guan 已提交
514 515
  dbObj.createdTime = taosGetTimestampMs();
  dbObj.updateTime = dbObj.createdTime;
516
  dbObj.uid = mndGenerateUid(dbObj.name, TSDB_DB_FNAME_LEN);
S
Shengliang Guan 已提交
517 518
  dbObj.cfgVersion = 1;
  dbObj.vgVersion = 1;
S
Shengliang Guan 已提交
519
  memcpy(dbObj.createUser, pUser->user, TSDB_USER_LEN);
L
Liu Jicong 已提交
520 521
  dbObj.cfg = (SDbCfg){
      .numOfVgroups = pCreate->numOfVgroups,
S
Shengliang Guan 已提交
522 523 524 525
      .numOfStables = pCreate->numOfStables,
      .buffer = pCreate->buffer,
      .pageSize = pCreate->pageSize,
      .pages = pCreate->pages,
L
Liu Jicong 已提交
526 527 528 529 530 531
      .daysPerFile = pCreate->daysPerFile,
      .daysToKeep0 = pCreate->daysToKeep0,
      .daysToKeep1 = pCreate->daysToKeep1,
      .daysToKeep2 = pCreate->daysToKeep2,
      .minRows = pCreate->minRows,
      .maxRows = pCreate->maxRows,
532 533
      .fsyncPeriod = pCreate->fsyncPeriod,
      .walLevel = pCreate->walLevel,
L
Liu Jicong 已提交
534 535 536
      .precision = pCreate->precision,
      .compression = pCreate->compression,
      .replications = pCreate->replications,
S
Shengliang Guan 已提交
537
      .strict = pCreate->strict,
L
Liu Jicong 已提交
538
      .cacheLastRow = pCreate->cacheLastRow,
S
Shengliang Guan 已提交
539
      .hashMethod = 1,
L
Liu Jicong 已提交
540
  };
S
Shengliang Guan 已提交
541

S
sma  
Shengliang Guan 已提交
542 543
  dbObj.cfg.numOfRetensions = pCreate->numOfRetensions;
  dbObj.cfg.pRetensions = pCreate->pRetensions;
544
  pCreate->pRetensions = NULL;
S
sma  
Shengliang Guan 已提交
545

S
Shengliang Guan 已提交
546 547
  mndSetDefaultDbCfg(&dbObj.cfg);

S
Shengliang Guan 已提交
548 549 550 551 552
  if (mndCheckDbName(dbObj.name, pUser) != 0) {
    mError("db:%s, failed to create since %s", pCreate->db, terrstr());
    return -1;
  }

S
Shengliang Guan 已提交
553
  if (mndCheckDbCfg(pMnode, &dbObj.cfg) != 0) {
S
Shengliang Guan 已提交
554 555 556
    mError("db:%s, failed to create since %s", pCreate->db, terrstr());
    return -1;
  }
S
Shengliang Guan 已提交
557

S
Shengliang Guan 已提交
558 559
  SVgObj *pVgroups = NULL;
  if (mndAllocVgroup(pMnode, &dbObj, &pVgroups) != 0) {
560 561 562 563
    mError("db:%s, failed to create since %s", pCreate->db, terrstr());
    return -1;
  }

S
Shengliang Guan 已提交
564
  int32_t code = -1;
S
Shengliang Guan 已提交
565
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_TYPE_CREATE_DB, &pReq->rpcMsg);
S
Shengliang Guan 已提交
566
  if (pTrans == NULL) goto _OVER;
S
Shengliang Guan 已提交
567

S
Shengliang Guan 已提交
568 569
  mDebug("trans:%d, used to create db:%s", pTrans->id, pCreate->db);

S
Shengliang Guan 已提交
570
  mndTransSetDbInfo(pTrans, &dbObj);
S
Shengliang Guan 已提交
571 572 573 574 575 576
  if (mndSetCreateDbRedoLogs(pMnode, pTrans, &dbObj, pVgroups) != 0) goto _OVER;
  if (mndSetCreateDbUndoLogs(pMnode, pTrans, &dbObj, pVgroups) != 0) goto _OVER;
  if (mndSetCreateDbCommitLogs(pMnode, pTrans, &dbObj, pVgroups) != 0) goto _OVER;
  if (mndSetCreateDbRedoActions(pMnode, pTrans, &dbObj, pVgroups) != 0) goto _OVER;
  if (mndSetCreateDbUndoActions(pMnode, pTrans, &dbObj, pVgroups) != 0) goto _OVER;
  if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
S
Shengliang Guan 已提交
577

S
Shengliang Guan 已提交
578 579
  code = 0;

S
Shengliang Guan 已提交
580
_OVER:
wafwerar's avatar
wafwerar 已提交
581
  taosMemoryFree(pVgroups);
S
Shengliang Guan 已提交
582
  mndTransDrop(pTrans);
S
Shengliang Guan 已提交
583
  return code;
S
Shengliang Guan 已提交
584 585
}

S
Shengliang Guan 已提交
586 587
static int32_t mndProcessCreateDbReq(SNodeMsg *pReq) {
  SMnode      *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
588 589 590 591 592 593 594
  int32_t      code = -1;
  SDbObj      *pDb = NULL;
  SUserObj    *pUser = NULL;
  SCreateDbReq createReq = {0};

  if (tDeserializeSCreateDbReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &createReq) != 0) {
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
595
    goto _OVER;
S
Shengliang Guan 已提交
596 597 598 599 600
  }

  mDebug("db:%s, start to create, vgroups:%d", createReq.db, createReq.numOfVgroups);

  pDb = mndAcquireDb(pMnode, createReq.db);
S
Shengliang Guan 已提交
601
  if (pDb != NULL) {
S
Shengliang Guan 已提交
602 603 604
    if (createReq.ignoreExist) {
      mDebug("db:%s, already exist, ignore exist is set", createReq.db);
      code = 0;
S
Shengliang Guan 已提交
605
      goto _OVER;
S
Shengliang Guan 已提交
606 607
    } else {
      terrno = TSDB_CODE_MND_DB_ALREADY_EXIST;
S
Shengliang Guan 已提交
608
      goto _OVER;
S
Shengliang Guan 已提交
609
    }
S
Shengliang Guan 已提交
610
  } else if (terrno != TSDB_CODE_MND_DB_NOT_EXIST) {
S
Shengliang Guan 已提交
611
    goto _OVER;
S
Shengliang Guan 已提交
612 613
  }

S
Shengliang Guan 已提交
614 615
  pUser = mndAcquireUser(pMnode, pReq->user);
  if (pUser == NULL) {
S
Shengliang Guan 已提交
616
    goto _OVER;
S
Shengliang Guan 已提交
617 618 619
  }

  if (mndCheckCreateDbAuth(pUser) != 0) {
S
Shengliang Guan 已提交
620
    goto _OVER;
S
Shengliang Guan 已提交
621 622
  }

S
Shengliang Guan 已提交
623 624
  code = mndCreateDb(pMnode, pReq, &createReq, pUser);
  if (code == 0) code = TSDB_CODE_MND_ACTION_IN_PROGRESS;
S
Shengliang Guan 已提交
625

S
Shengliang Guan 已提交
626
_OVER:
S
Shengliang Guan 已提交
627 628
  if (code != 0 && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
    mError("db:%s, failed to create since %s", createReq.db, terrstr());
S
Shengliang Guan 已提交
629 630
  }

S
Shengliang Guan 已提交
631 632
  mndReleaseDb(pMnode, pDb);
  mndReleaseUser(pMnode, pUser);
S
sma  
Shengliang Guan 已提交
633
  tFreeSCreateDbReq(&createReq);
S
Shengliang Guan 已提交
634 635

  return code;
S
Shengliang Guan 已提交
636 637
}

S
Shengliang Guan 已提交
638
static int32_t mndSetDbCfgFromAlterDbReq(SDbObj *pDb, SAlterDbReq *pAlter) {
S
Shengliang Guan 已提交
639
  terrno = TSDB_CODE_MND_DB_OPTION_UNCHANGED;
S
Shengliang Guan 已提交
640

S
Shengliang Guan 已提交
641
  if (pAlter->buffer > 0 && pAlter->buffer != pDb->cfg.buffer) {
S
Shengliang Guan 已提交
642 643 644 645
    pDb->cfg.buffer = pAlter->buffer;
    terrno = 0;
  }

S
Shengliang Guan 已提交
646
  if (pAlter->pages > 0 && pAlter->pages != pDb->cfg.pages) {
S
Shengliang Guan 已提交
647
    pDb->cfg.pages = pAlter->pages;
S
Shengliang Guan 已提交
648
    terrno = 0;
S
Shengliang Guan 已提交
649 650
  }

S
Shengliang Guan 已提交
651
  if (pAlter->pageSize > 0 && pAlter->pageSize != pDb->cfg.pageSize) {
S
Shengliang Guan 已提交
652
    pDb->cfg.pageSize = pAlter->pageSize;
S
Shengliang Guan 已提交
653
    terrno = 0;
S
Shengliang Guan 已提交
654 655
  }

S
Shengliang Guan 已提交
656
  if (pAlter->daysPerFile > 0 && pAlter->daysPerFile != pDb->cfg.daysPerFile) {
S
Shengliang Guan 已提交
657
    pDb->cfg.daysPerFile = pAlter->daysPerFile;
S
Shengliang Guan 已提交
658
    terrno = 0;
S
Shengliang Guan 已提交
659 660
  }

S
Shengliang Guan 已提交
661
  if (pAlter->daysToKeep0 > 0 && pAlter->daysToKeep0 != pDb->cfg.daysToKeep0) {
S
Shengliang Guan 已提交
662
    pDb->cfg.daysToKeep0 = pAlter->daysToKeep0;
S
Shengliang Guan 已提交
663
    terrno = 0;
S
Shengliang Guan 已提交
664 665
  }

S
Shengliang Guan 已提交
666
  if (pAlter->daysToKeep1 > 0 && pAlter->daysToKeep1 != pDb->cfg.daysToKeep1) {
S
Shengliang Guan 已提交
667
    pDb->cfg.daysToKeep1 = pAlter->daysToKeep1;
S
Shengliang Guan 已提交
668
    terrno = 0;
S
Shengliang Guan 已提交
669 670
  }

S
Shengliang Guan 已提交
671
  if (pAlter->daysToKeep2 > 0 && pAlter->daysToKeep2 != pDb->cfg.daysToKeep2) {
S
Shengliang Guan 已提交
672
    pDb->cfg.daysToKeep2 = pAlter->daysToKeep2;
S
Shengliang Guan 已提交
673
    terrno = 0;
S
Shengliang Guan 已提交
674 675 676 677
  }

  if (pAlter->fsyncPeriod >= 0 && pAlter->fsyncPeriod != pDb->cfg.fsyncPeriod) {
    pDb->cfg.fsyncPeriod = pAlter->fsyncPeriod;
S
Shengliang Guan 已提交
678
    terrno = 0;
S
Shengliang Guan 已提交
679 680 681 682
  }

  if (pAlter->walLevel >= 0 && pAlter->walLevel != pDb->cfg.walLevel) {
    pDb->cfg.walLevel = pAlter->walLevel;
S
Shengliang Guan 已提交
683
    terrno = 0;
S
Shengliang Guan 已提交
684 685
  }

S
Shengliang Guan 已提交
686 687
  if (pAlter->strict >= 0 && pAlter->strict != pDb->cfg.strict) {
    pDb->cfg.strict = pAlter->strict;
S
Shengliang Guan 已提交
688
    terrno = 0;
S
Shengliang Guan 已提交
689 690 691 692
  }

  if (pAlter->cacheLastRow >= 0 && pAlter->cacheLastRow != pDb->cfg.cacheLastRow) {
    pDb->cfg.cacheLastRow = pAlter->cacheLastRow;
S
Shengliang Guan 已提交
693
    terrno = 0;
S
Shengliang Guan 已提交
694 695
  }

S
Shengliang Guan 已提交
696
  if (pAlter->replications > 0 && pAlter->replications != pDb->cfg.replications) {
S
Shengliang Guan 已提交
697
    pDb->cfg.replications = pAlter->replications;
S
Shengliang Guan 已提交
698
    pDb->vgVersion++;
S
Shengliang Guan 已提交
699 700 701
    terrno = 0;
  }

S
Shengliang Guan 已提交
702 703 704
  return terrno;
}

S
Shengliang Guan 已提交
705
static int32_t mndSetAlterDbRedoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
S
Shengliang Guan 已提交
706
  SSdbRaw *pRedoRaw = mndDbActionEncode(pOld);
S
Shengliang Guan 已提交
707 708
  if (pRedoRaw == NULL) return -1;
  if (mndTransAppendRedolog(pTrans, pRedoRaw) != 0) return -1;
709
  if (sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY) != 0) return -1;
S
Shengliang Guan 已提交
710 711 712 713

  return 0;
}

S
Shengliang Guan 已提交
714
static int32_t mndSetAlterDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
S
Shengliang Guan 已提交
715
  SSdbRaw *pCommitRaw = mndDbActionEncode(pNew);
S
Shengliang Guan 已提交
716 717 718
  if (pCommitRaw == NULL) return -1;
  if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) return -1;
  if (sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY) != 0) return -1;
S
Shengliang Guan 已提交
719 720 721 722

  return 0;
}

S
Shengliang Guan 已提交
723
static int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup) {
S
Shengliang Guan 已提交
724
  if (pVgroup->replica <= 0 || pVgroup->replica == pDb->cfg.replications) {
S
Shengliang Guan 已提交
725
    for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
S
Shengliang Guan 已提交
726 727
      SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
      if (mndAddAlterVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid, true) != 0) {
S
Shengliang Guan 已提交
728 729
        return -1;
      }
S
Shengliang Guan 已提交
730
    }
S
Shengliang Guan 已提交
731
  } else {
S
Shengliang Guan 已提交
732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761
    SVgObj newVgroup = {0};
    memcpy(&newVgroup, pVgroup, sizeof(SVgObj));
    if (newVgroup.replica < pDb->cfg.replications) {
      SVnodeGid new1 = {0};
      SVnodeGid new2 = {0};
      SVnodeGid exist = {0};
      if (mndAddVnodeToVgroup(pMnode, &newVgroup, &new1, &new2, &exist) != 0) {
        mError("db:%s, failed to add vnode to vgId:%d since %s", pDb->name, newVgroup.vgId, terrstr());
        return -1;
      }
      if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, &newVgroup, &new1, true) != 0) return -1;
      if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, &newVgroup, &new2, true) != 0) return -1;
      if (mndAddAlterVnodeAction(pMnode, pTrans, pDb, &newVgroup, &exist, true) != 0) return -1;
    } else {
      SVnodeGid del1 = {0};
      SVnodeGid del2 = {0};
      SVnodeGid exist = {0};
      if (mndRemoveVnodeFromVgroup(pMnode, &newVgroup, &del1, &del2, &exist) != 0) {
        mError("db:%s, failed to remove vnode from vgId:%d since %s", pDb->name, newVgroup.vgId, terrstr());
        return -1;
      }
      if (mndAddDropVnodeAction(pMnode, pTrans, pDb, &newVgroup, &del1, true) != 0) return -1;
      if (mndAddDropVnodeAction(pMnode, pTrans, pDb, &newVgroup, &del2, true) != 0) return -1;
      if (mndAddAlterVnodeAction(pMnode, pTrans, pDb, &newVgroup, &exist, true) != 0) return -1;
    }

    SSdbRaw *pVgRaw = mndVgroupActionEncode(&newVgroup);
    if (pVgRaw == NULL) return -1;
    if (mndTransAppendCommitlog(pTrans, pVgRaw) != 0) return -1;
    if (sdbSetRawStatus(pVgRaw, SDB_STATUS_READY) != 0) return -1;
S
Shengliang Guan 已提交
762
  }
S
Shengliang Guan 已提交
763 764 765 766

  return 0;
}

S
Shengliang Guan 已提交
767
static int32_t mndSetAlterDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
S
Shengliang Guan 已提交
768 769
  SSdb *pSdb = pMnode->pSdb;
  void *pIter = NULL;
S
Shengliang Guan 已提交
770

S
Shengliang Guan 已提交
771 772 773 774
  while (1) {
    SVgObj *pVgroup = NULL;
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
    if (pIter == NULL) break;
S
Shengliang Guan 已提交
775

S
Shengliang Guan 已提交
776
    if (pVgroup->dbUid == pNew->uid) {
S
Shengliang Guan 已提交
777
      if (mndBuildAlterVgroupAction(pMnode, pTrans, pNew, pVgroup) != 0) {
S
Shengliang Guan 已提交
778 779 780 781 782 783 784 785 786 787 788
        sdbCancelFetch(pSdb, pIter);
        sdbRelease(pSdb, pVgroup);
        return -1;
      }
    }

    sdbRelease(pSdb, pVgroup);
  }

  return 0;
}
S
Shengliang Guan 已提交
789

S
Shengliang Guan 已提交
790
static int32_t mndAlterDb(SMnode *pMnode, SNodeMsg *pReq, SDbObj *pOld, SDbObj *pNew) {
S
Shengliang Guan 已提交
791
  int32_t code = -1;
S
Shengliang Guan 已提交
792
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_TYPE_ALTER_DB, &pReq->rpcMsg);
S
Shengliang Guan 已提交
793
  if (pTrans == NULL) goto _OVER;
S
Shengliang Guan 已提交
794

S
Shengliang Guan 已提交
795
  mDebug("trans:%d, used to alter db:%s", pTrans->id, pOld->name);
S
Shengliang Guan 已提交
796

S
Shengliang Guan 已提交
797
  mndTransSetDbInfo(pTrans, pOld);
S
Shengliang Guan 已提交
798 799 800 801
  if (mndSetAlterDbRedoLogs(pMnode, pTrans, pOld, pNew) != 0) goto _OVER;
  if (mndSetAlterDbCommitLogs(pMnode, pTrans, pOld, pNew) != 0) goto _OVER;
  if (mndSetAlterDbRedoActions(pMnode, pTrans, pOld, pNew) != 0) goto _OVER;
  if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
S
Shengliang Guan 已提交
802

S
Shengliang Guan 已提交
803 804
  code = 0;

S
Shengliang Guan 已提交
805
_OVER:
S
Shengliang Guan 已提交
806
  mndTransDrop(pTrans);
S
Shengliang Guan 已提交
807
  return code;
S
Shengliang Guan 已提交
808 809
}

S
Shengliang Guan 已提交
810 811
static int32_t mndProcessAlterDbReq(SNodeMsg *pReq) {
  SMnode     *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
812 813 814 815
  int32_t     code = -1;
  SDbObj     *pDb = NULL;
  SUserObj   *pUser = NULL;
  SAlterDbReq alterReq = {0};
S
Shengliang Guan 已提交
816
  SDbObj      dbObj = {0};
S
Shengliang Guan 已提交
817 818 819

  if (tDeserializeSAlterDbReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &alterReq) != 0) {
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
820
    goto _OVER;
S
Shengliang Guan 已提交
821
  }
S
Shengliang Guan 已提交
822

S
Shengliang Guan 已提交
823
  mDebug("db:%s, start to alter", alterReq.db);
S
Shengliang Guan 已提交
824

S
Shengliang Guan 已提交
825
  pDb = mndAcquireDb(pMnode, alterReq.db);
S
Shengliang Guan 已提交
826
  if (pDb == NULL) {
S
Shengliang Guan 已提交
827
    terrno = TSDB_CODE_MND_DB_NOT_EXIST;
S
Shengliang Guan 已提交
828
    goto _OVER;
S
Shengliang Guan 已提交
829 830 831 832
  }

  pUser = mndAcquireUser(pMnode, pReq->user);
  if (pUser == NULL) {
S
Shengliang Guan 已提交
833
    goto _OVER;
S
Shengliang Guan 已提交
834 835
  }

S
Shengliang Guan 已提交
836
  if (mndCheckAlterDropCompactDbAuth(pUser, pDb) != 0) {
S
Shengliang Guan 已提交
837
    goto _OVER;
S
Shengliang Guan 已提交
838 839 840
  }

  memcpy(&dbObj, pDb, sizeof(SDbObj));
S
Shengliang Guan 已提交
841 842 843 844
  if (dbObj.cfg.pRetensions != NULL) {
    dbObj.cfg.pRetensions = taosArrayDup(pDb->cfg.pRetensions);
    if (dbObj.cfg.pRetensions == NULL) goto _OVER;
  }
S
Shengliang Guan 已提交
845

S
Shengliang Guan 已提交
846
  code = mndSetDbCfgFromAlterDbReq(&dbObj, &alterReq);
S
Shengliang Guan 已提交
847
  if (code != 0) goto _OVER;
S
Shengliang Guan 已提交
848

S
Shengliang Guan 已提交
849 850 851
  code = mndCheckDbCfg(pMnode, &dbObj.cfg);
  if (code != 0) goto _OVER;

S
Shengliang Guan 已提交
852 853
  dbObj.cfgVersion++;
  dbObj.updateTime = taosGetTimestampMs();
S
Shengliang Guan 已提交
854
  code = mndAlterDb(pMnode, pReq, pDb, &dbObj);
S
Shengliang Guan 已提交
855
  if (code == 0) code = TSDB_CODE_MND_ACTION_IN_PROGRESS;
S
Shengliang Guan 已提交
856

S
Shengliang Guan 已提交
857
_OVER:
S
Shengliang Guan 已提交
858 859
  if (code != 0 && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
    mError("db:%s, failed to alter since %s", alterReq.db, terrstr());
S
Shengliang Guan 已提交
860 861
  }

S
Shengliang Guan 已提交
862 863
  mndReleaseDb(pMnode, pDb);
  mndReleaseUser(pMnode, pUser);
S
Shengliang Guan 已提交
864
  taosArrayDestroy(dbObj.cfg.pRetensions);
S
Shengliang Guan 已提交
865 866

  return code;
S
Shengliang Guan 已提交
867 868
}

D
dapan1121 已提交
869
static int32_t mndProcessGetDbCfgReq(SNodeMsg *pReq) {
S
Shengliang Guan 已提交
870 871 872 873 874
  SMnode   *pMnode = pReq->pNode;
  int32_t   code = -1;
  SDbObj   *pDb = NULL;
  SDbCfgReq cfgReq = {0};
  SDbCfgRsp cfgRsp = {0};
D
dapan1121 已提交
875 876 877

  if (tDeserializeSDbCfgReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &cfgReq) != 0) {
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
878
    goto _OVER;
D
dapan1121 已提交
879 880 881 882 883
  }

  pDb = mndAcquireDb(pMnode, cfgReq.db);
  if (pDb == NULL) {
    terrno = TSDB_CODE_MND_DB_NOT_EXIST;
S
Shengliang Guan 已提交
884
    goto _OVER;
D
dapan1121 已提交
885 886
  }

S
Shengliang Guan 已提交
887
  cfgRsp.numOfVgroups = pDb->cfg.numOfVgroups;
S
Shengliang Guan 已提交
888 889 890 891
  cfgRsp.numOfStables = pDb->cfg.numOfStables;
  cfgRsp.buffer = pDb->cfg.buffer;
  cfgRsp.pageSize = pDb->cfg.pageSize;
  cfgRsp.pages = pDb->cfg.pages;
S
Shengliang Guan 已提交
892 893 894 895 896 897 898 899 900 901 902 903 904
  cfgRsp.daysPerFile = pDb->cfg.daysPerFile;
  cfgRsp.daysToKeep0 = pDb->cfg.daysToKeep0;
  cfgRsp.daysToKeep1 = pDb->cfg.daysToKeep1;
  cfgRsp.daysToKeep2 = pDb->cfg.daysToKeep2;
  cfgRsp.minRows = pDb->cfg.minRows;
  cfgRsp.maxRows = pDb->cfg.maxRows;
  cfgRsp.fsyncPeriod = pDb->cfg.fsyncPeriod;
  cfgRsp.walLevel = pDb->cfg.walLevel;
  cfgRsp.precision = pDb->cfg.precision;
  cfgRsp.compression = pDb->cfg.compression;
  cfgRsp.replications = pDb->cfg.replications;
  cfgRsp.strict = pDb->cfg.strict;
  cfgRsp.cacheLastRow = pDb->cfg.cacheLastRow;
C
Cary Xu 已提交
905 906
  cfgRsp.numOfRetensions = pDb->cfg.numOfRetensions;
  cfgRsp.pRetensions = pDb->cfg.pRetensions;
D
dapan1121 已提交
907 908 909 910 911 912

  int32_t contLen = tSerializeSDbCfgRsp(NULL, 0, &cfgRsp);
  void   *pRsp = rpcMallocCont(contLen);
  if (pRsp == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    code = -1;
S
Shengliang Guan 已提交
913
    goto _OVER;
D
dapan1121 已提交
914 915 916 917 918 919 920
  }

  tSerializeSDbCfgRsp(pRsp, contLen, &cfgRsp);

  pReq->pRsp = pRsp;
  pReq->rspLen = contLen;

921 922
  code = 0;

S
Shengliang Guan 已提交
923
_OVER:
D
dapan1121 已提交
924

S
Shengliang Guan 已提交
925
  if (code != 0) {
D
dapan1121 已提交
926 927 928 929 930 931 932 933
    mError("db:%s, failed to get cfg since %s", cfgReq.db, terrstr());
  }

  mndReleaseDb(pMnode, pDb);

  return code;
}

S
Shengliang Guan 已提交
934 935 936 937 938 939 940 941 942 943 944 945 946 947 948
static int32_t mndSetDropDbRedoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
  SSdbRaw *pRedoRaw = mndDbActionEncode(pDb);
  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 mndSetDropDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
  SSdbRaw *pCommitRaw = mndDbActionEncode(pDb);
  if (pCommitRaw == NULL) return -1;
  if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) return -1;
  if (sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED) != 0) return -1;

S
Shengliang Guan 已提交
949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969
  SSdb *pSdb = pMnode->pSdb;
  void *pIter = NULL;

  while (1) {
    SVgObj *pVgroup = NULL;
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
    if (pIter == NULL) break;

    if (pVgroup->dbUid == pDb->uid) {
      SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroup);
      if (pVgRaw == NULL || mndTransAppendCommitlog(pTrans, pVgRaw) != 0) {
        sdbCancelFetch(pSdb, pIter);
        sdbRelease(pSdb, pVgroup);
        return -1;
      }
      sdbSetRawStatus(pVgRaw, SDB_STATUS_DROPPED);
    }

    sdbRelease(pSdb, pVgroup);
  }

970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987
  while (1) {
    SStbObj *pStb = NULL;
    pIter = sdbFetch(pSdb, SDB_STB, pIter, (void **)&pStb);
    if (pIter == NULL) break;

    if (pStb->dbUid == pDb->uid) {
      SSdbRaw *pStbRaw = mndStbActionEncode(pStb);
      if (pStbRaw == NULL || mndTransAppendCommitlog(pTrans, pStbRaw) != 0) {
        sdbCancelFetch(pSdb, pIter);
        sdbRelease(pSdb, pStbRaw);
        return -1;
      }
      sdbSetRawStatus(pStbRaw, SDB_STATUS_DROPPED);
    }

    sdbRelease(pSdb, pStb);
  }

S
Shengliang Guan 已提交
988 989 990 991 992
  return 0;
}

static int32_t mndBuildDropVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup) {
  for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
S
Shengliang Guan 已提交
993 994
    SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
    if (mndAddDropVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid, true) != 0) {
S
Shengliang Guan 已提交
995 996 997 998
      return -1;
    }
  }

S
Shengliang Guan 已提交
999 1000 1001
  return 0;
}

S
Shengliang Guan 已提交
1002 1003 1004
static int32_t mndSetDropDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
  SSdb *pSdb = pMnode->pSdb;
  void *pIter = NULL;
S
Shengliang Guan 已提交
1005

S
Shengliang Guan 已提交
1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023
  while (1) {
    SVgObj *pVgroup = NULL;
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
    if (pIter == NULL) break;

    if (pVgroup->dbUid == pDb->uid) {
      if (mndBuildDropVgroupAction(pMnode, pTrans, pDb, pVgroup) != 0) {
        sdbCancelFetch(pSdb, pIter);
        sdbRelease(pSdb, pVgroup);
        return -1;
      }
    }

    sdbRelease(pSdb, pVgroup);
  }

  return 0;
}
S
Shengliang Guan 已提交
1024

1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036
static int32_t mndBuildDropDbRsp(SDbObj *pDb, int32_t *pRspLen, void **ppRsp, bool useRpcMalloc) {
  SDropDbRsp dropRsp = {0};
  if (pDb != NULL) {
    memcpy(dropRsp.db, pDb->name, TSDB_DB_FNAME_LEN);
    dropRsp.uid = pDb->uid;
  }

  int32_t rspLen = tSerializeSDropDbRsp(NULL, 0, &dropRsp);
  void   *pRsp = NULL;
  if (useRpcMalloc) {
    pRsp = rpcMallocCont(rspLen);
  } else {
wafwerar's avatar
wafwerar 已提交
1037
    pRsp = taosMemoryMalloc(rspLen);
1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050
  }

  if (pRsp == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    return -1;
  }

  tSerializeSDropDbRsp(pRsp, rspLen, &dropRsp);
  *pRspLen = rspLen;
  *ppRsp = pRsp;
  return 0;
}

S
Shengliang Guan 已提交
1051
static int32_t mndDropDb(SMnode *pMnode, SNodeMsg *pReq, SDbObj *pDb) {
S
Shengliang Guan 已提交
1052
  int32_t code = -1;
S
Shengliang Guan 已提交
1053
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_TYPE_DROP_DB, &pReq->rpcMsg);
S
Shengliang Guan 已提交
1054
  if (pTrans == NULL) goto _OVER;
S
Shengliang Guan 已提交
1055

S
Shengliang Guan 已提交
1056
  mDebug("trans:%d, used to drop db:%s", pTrans->id, pDb->name);
S
Shengliang Guan 已提交
1057
  mndTransSetDbInfo(pTrans, pDb);
S
Shengliang Guan 已提交
1058

S
Shengliang Guan 已提交
1059 1060
  if (mndSetDropDbRedoLogs(pMnode, pTrans, pDb) != 0) goto _OVER;
  if (mndSetDropDbCommitLogs(pMnode, pTrans, pDb) != 0) goto _OVER;
L
Liu Jicong 已提交
1061 1062 1063
  /*if (mndDropOffsetByDB(pMnode, pTrans, pDb) != 0) goto _OVER;*/
  /*if (mndDropSubByDB(pMnode, pTrans, pDb) != 0) goto _OVER;*/
  /*if (mndDropTopicByDB(pMnode, pTrans, pDb) != 0) goto _OVER;*/
S
Shengliang Guan 已提交
1064
  if (mndSetDropDbRedoActions(pMnode, pTrans, pDb) != 0) goto _OVER;
S
Shengliang Guan 已提交
1065

1066 1067
  int32_t rspLen = 0;
  void   *pRsp = NULL;
S
Shengliang Guan 已提交
1068
  if (mndBuildDropDbRsp(pDb, &rspLen, &pRsp, false) < 0) goto _OVER;
S
Shengliang Guan 已提交
1069 1070
  mndTransSetRpcRsp(pTrans, pRsp, rspLen);

S
Shengliang Guan 已提交
1071
  if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
S
Shengliang Guan 已提交
1072

S
Shengliang Guan 已提交
1073 1074
  code = 0;

S
Shengliang Guan 已提交
1075
_OVER:
S
Shengliang Guan 已提交
1076
  mndTransDrop(pTrans);
S
Shengliang Guan 已提交
1077
  return code;
S
Shengliang Guan 已提交
1078 1079
}

S
Shengliang Guan 已提交
1080 1081
static int32_t mndProcessDropDbReq(SNodeMsg *pReq) {
  SMnode    *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
1082 1083 1084 1085 1086 1087 1088
  int32_t    code = -1;
  SDbObj    *pDb = NULL;
  SUserObj  *pUser = NULL;
  SDropDbReq dropReq = {0};

  if (tDeserializeSDropDbReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &dropReq) != 0) {
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
1089
    goto _OVER;
S
Shengliang Guan 已提交
1090
  }
S
Shengliang Guan 已提交
1091

S
Shengliang Guan 已提交
1092
  mDebug("db:%s, start to drop", dropReq.db);
S
Shengliang Guan 已提交
1093

S
Shengliang Guan 已提交
1094
  pDb = mndAcquireDb(pMnode, dropReq.db);
S
Shengliang Guan 已提交
1095
  if (pDb == NULL) {
S
Shengliang Guan 已提交
1096
    if (dropReq.ignoreNotExists) {
1097
      code = mndBuildDropDbRsp(pDb, &pReq->rspLen, &pReq->pRsp, true);
S
Shengliang Guan 已提交
1098
      goto _OVER;
S
Shengliang Guan 已提交
1099 1100
    } else {
      terrno = TSDB_CODE_MND_DB_NOT_EXIST;
S
Shengliang Guan 已提交
1101
      goto _OVER;
S
Shengliang Guan 已提交
1102 1103 1104
    }
  }

S
Shengliang Guan 已提交
1105 1106
  pUser = mndAcquireUser(pMnode, pReq->user);
  if (pUser == NULL) {
S
Shengliang Guan 已提交
1107
    goto _OVER;
S
Shengliang Guan 已提交
1108
  }
S
Shengliang Guan 已提交
1109

S
Shengliang Guan 已提交
1110 1111
  if (mndCheckAlterDropCompactDbAuth(pUser, pDb) != 0) {
    goto _OVER;
S
Shengliang Guan 已提交
1112 1113
  }

S
Shengliang Guan 已提交
1114 1115 1116
  code = mndDropDb(pMnode, pReq, pDb);
  if (code == 0) code = TSDB_CODE_MND_ACTION_IN_PROGRESS;

S
Shengliang Guan 已提交
1117
_OVER:
S
Shengliang Guan 已提交
1118 1119 1120 1121 1122 1123 1124 1125
  if (code != 0 && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
    mError("db:%s, failed to drop since %s", dropReq.db, terrstr());
  }

  mndReleaseDb(pMnode, pDb);
  mndReleaseUser(pMnode, pUser);

  return code;
S
Shengliang Guan 已提交
1126
}
S
Shengliang Guan 已提交
1127

S
Shengliang Guan 已提交
1128 1129
static int32_t mndGetDBTableNum(SDbObj *pDb, SMnode *pMnode) {
  int32_t numOfTables = 0;
D
dapan1121 已提交
1130 1131 1132 1133 1134 1135 1136 1137 1138 1139
  int32_t vindex = 0;
  SSdb   *pSdb = pMnode->pSdb;

  void *pIter = NULL;
  while (vindex < pDb->cfg.numOfVgroups) {
    SVgObj *pVgroup = NULL;
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
    if (pIter == NULL) break;

    if (pVgroup->dbUid == pDb->uid) {
S
Shengliang Guan 已提交
1140
      numOfTables += pVgroup->numOfTables / TSDB_TABLE_NUM_UNIT;
D
dapan1121 已提交
1141 1142 1143 1144 1145 1146 1147
      vindex++;
    }

    sdbRelease(pSdb, pVgroup);
  }

  sdbCancelFetch(pSdb, pIter);
S
Shengliang Guan 已提交
1148
  return numOfTables;
D
dapan1121 已提交
1149 1150
}

S
Shengliang Guan 已提交
1151
static void mndBuildDBVgroupInfo(SDbObj *pDb, SMnode *pMnode, SArray *pVgList) {
D
dapan1121 已提交
1152
  int32_t vindex = 0;
S
Shengliang Guan 已提交
1153
  SSdb   *pSdb = pMnode->pSdb;
D
dapan1121 已提交
1154 1155

  void *pIter = NULL;
1156
  while (1) {
D
dapan1121 已提交
1157 1158 1159 1160
    SVgObj *pVgroup = NULL;
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
    if (pIter == NULL) break;

D
dapan1121 已提交
1161
    if (NULL == pDb || pVgroup->dbUid == pDb->uid) {
S
Shengliang Guan 已提交
1162 1163 1164 1165
      SVgroupInfo vgInfo = {0};
      vgInfo.vgId = pVgroup->vgId;
      vgInfo.hashBegin = pVgroup->hashBegin;
      vgInfo.hashEnd = pVgroup->hashEnd;
D
dapan1121 已提交
1166
      vgInfo.numOfTable = pVgroup->numOfTables / TSDB_TABLE_NUM_UNIT;
L
Liu Jicong 已提交
1167
      vgInfo.epSet.numOfEps = pVgroup->replica;
D
dapan1121 已提交
1168
      for (int32_t gid = 0; gid < pVgroup->replica; ++gid) {
S
Shengliang Guan 已提交
1169
        SVnodeGid *pVgid = &pVgroup->vnodeGid[gid];
L
Liu Jicong 已提交
1170
        SEp       *pEp = &vgInfo.epSet.eps[gid];
S
Shengliang Guan 已提交
1171
        SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
D
dapan1121 已提交
1172
        if (pDnode != NULL) {
1173
          memcpy(pEp->fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
S
Shengliang Guan 已提交
1174
          pEp->port = pDnode->port;
D
dapan1121 已提交
1175 1176 1177
        }
        mndReleaseDnode(pMnode, pDnode);
        if (pVgid->role == TAOS_SYNC_STATE_LEADER) {
L
Liu Jicong 已提交
1178
          vgInfo.epSet.inUse = gid;
D
dapan1121 已提交
1179 1180 1181
        }
      }
      vindex++;
S
Shengliang Guan 已提交
1182
      taosArrayPush(pVgList, &vgInfo);
D
dapan1121 已提交
1183 1184 1185
    }

    sdbRelease(pSdb, pVgroup);
L
Liu Jicong 已提交
1186

D
dapan1121 已提交
1187 1188 1189
    if (pDb && (vindex >= pDb->cfg.numOfVgroups)) {
      break;
    }
D
dapan1121 已提交
1190
  }
S
Shengliang Guan 已提交
1191 1192

  sdbCancelFetch(pSdb, pIter);
D
dapan1121 已提交
1193 1194
}

L
Liu Jicong 已提交
1195 1196 1197 1198 1199 1200 1201
int32_t mndExtractDbInfo(SMnode *pMnode, SDbObj *pDb, SUseDbRsp *pRsp, const SUseDbReq *pReq) {
  pRsp->pVgroupInfos = taosArrayInit(pDb->cfg.numOfVgroups, sizeof(SVgroupInfo));
  if (pRsp->pVgroupInfos == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    return -1;
  }

S
Shengliang Guan 已提交
1202
  int32_t numOfTable = mndGetDBTableNum(pDb, pMnode);
L
Liu Jicong 已提交
1203 1204 1205 1206 1207 1208 1209 1210 1211

  if (pReq == NULL || pReq->vgVersion < pDb->vgVersion || pReq->dbId != pDb->uid || numOfTable != pReq->numOfTable) {
    mndBuildDBVgroupInfo(pDb, pMnode, pRsp->pVgroupInfos);
  }

  memcpy(pRsp->db, pDb->name, TSDB_DB_FNAME_LEN);
  pRsp->uid = pDb->uid;
  pRsp->vgVersion = pDb->vgVersion;
  pRsp->vgNum = taosArrayGetSize(pRsp->pVgroupInfos);
S
Shengliang Guan 已提交
1212
  pRsp->hashMethod = pDb->cfg.hashMethod;
L
Liu Jicong 已提交
1213 1214 1215
  return 0;
}

S
Shengliang Guan 已提交
1216 1217
static int32_t mndProcessUseDbReq(SNodeMsg *pReq) {
  SMnode   *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
1218 1219 1220 1221 1222 1223 1224 1225
  int32_t   code = -1;
  SDbObj   *pDb = NULL;
  SUserObj *pUser = NULL;
  SUseDbReq usedbReq = {0};
  SUseDbRsp usedbRsp = {0};

  if (tDeserializeSUseDbReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &usedbReq) != 0) {
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
1226
    goto _OVER;
S
Shengliang Guan 已提交
1227
  }
S
Shengliang Guan 已提交
1228

D
dapan1121 已提交
1229
  char *p = strchr(usedbReq.db, '.');
1230
  if (p && ((0 == strcmp(p + 1, TSDB_INFORMATION_SCHEMA_DB) || (0 == strcmp(p + 1, TSDB_PERFORMANCE_SCHEMA_DB))))) {
D
dapan1121 已提交
1231
    memcpy(usedbRsp.db, usedbReq.db, TSDB_DB_FNAME_LEN);
1232
    int32_t vgVersion = mndGetGlobalVgroupVersion(pMnode);
D
dapan1121 已提交
1233 1234 1235 1236
    if (usedbReq.vgVersion < vgVersion) {
      usedbRsp.pVgroupInfos = taosArrayInit(10, sizeof(SVgroupInfo));
      if (usedbRsp.pVgroupInfos == NULL) {
        terrno = TSDB_CODE_OUT_OF_MEMORY;
S
Shengliang Guan 已提交
1237
        goto _OVER;
D
dapan1121 已提交
1238
      }
L
Liu Jicong 已提交
1239

D
dapan1121 已提交
1240
      mndBuildDBVgroupInfo(NULL, pMnode, usedbRsp.pVgroupInfos);
D
dapan1121 已提交
1241
      usedbRsp.vgVersion = vgVersion++;
D
dapan1121 已提交
1242 1243 1244
    } else {
      usedbRsp.vgVersion = usedbReq.vgVersion;
    }
L
Liu Jicong 已提交
1245
    usedbRsp.vgNum = taosArrayGetSize(usedbRsp.pVgroupInfos);
D
dapan1121 已提交
1246
    code = 0;
D
dapan1121 已提交
1247 1248

    // no jump, need to construct rsp
D
dapan1121 已提交
1249 1250 1251 1252
  } else {
    pDb = mndAcquireDb(pMnode, usedbReq.db);
    if (pDb == NULL) {
      terrno = TSDB_CODE_MND_DB_NOT_EXIST;
S
Shengliang Guan 已提交
1253

X
Xiaoyu Wang 已提交
1254 1255 1256
      memcpy(usedbRsp.db, usedbReq.db, TSDB_DB_FNAME_LEN);
      usedbRsp.uid = usedbReq.dbId;
      usedbRsp.vgVersion = usedbReq.vgVersion;
S
Shengliang Guan 已提交
1257

X
Xiaoyu Wang 已提交
1258 1259 1260 1261
      mError("db:%s, failed to process use db req since %s", usedbReq.db, terrstr());
    } else {
      pUser = mndAcquireUser(pMnode, pReq->user);
      if (pUser == NULL) {
S
Shengliang Guan 已提交
1262
        goto _OVER;
X
Xiaoyu Wang 已提交
1263
      }
S
Shengliang Guan 已提交
1264

X
Xiaoyu Wang 已提交
1265
      if (mndCheckUseDbAuth(pUser, pDb) != 0) {
S
Shengliang Guan 已提交
1266
        goto _OVER;
X
Xiaoyu Wang 已提交
1267
      }
S
Shengliang Guan 已提交
1268

L
Liu Jicong 已提交
1269
      if (mndExtractDbInfo(pMnode, pDb, &usedbRsp, &usedbReq) < 0) {
S
Shengliang Guan 已提交
1270
        goto _OVER;
X
Xiaoyu Wang 已提交
1271 1272 1273 1274
      }

      code = 0;
    }
D
dapan1121 已提交
1275
  }
S
Shengliang Guan 已提交
1276

S
Shengliang Guan 已提交
1277 1278 1279 1280
  int32_t contLen = tSerializeSUseDbRsp(NULL, 0, &usedbRsp);
  void   *pRsp = rpcMallocCont(contLen);
  if (pRsp == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
X
Xiaoyu Wang 已提交
1281
    code = -1;
S
Shengliang Guan 已提交
1282
    goto _OVER;
S
Shengliang Guan 已提交
1283 1284
  }

S
Shengliang Guan 已提交
1285
  tSerializeSUseDbRsp(pRsp, contLen, &usedbRsp);
S
Shengliang Guan 已提交
1286

S
Shengliang Guan 已提交
1287 1288
  pReq->pRsp = pRsp;
  pReq->rspLen = contLen;
S
Shengliang Guan 已提交
1289

S
Shengliang Guan 已提交
1290
_OVER:
S
Shengliang Guan 已提交
1291 1292 1293
  if (code != 0) {
    mError("db:%s, failed to process use db req since %s", usedbReq.db, terrstr());
  }
D
dapan1121 已提交
1294

S
Shengliang Guan 已提交
1295 1296 1297
  mndReleaseDb(pMnode, pDb);
  mndReleaseUser(pMnode, pUser);
  tFreeSUsedbRsp(&usedbRsp);
D
dapan1121 已提交
1298

S
Shengliang Guan 已提交
1299 1300
  return code;
}
S
Shengliang Guan 已提交
1301

S
Shengliang Guan 已提交
1302 1303 1304 1305 1306 1307 1308
int32_t mndValidateDbInfo(SMnode *pMnode, SDbVgVersion *pDbs, int32_t numOfDbs, void **ppRsp, int32_t *pRspLen) {
  SUseDbBatchRsp batchUseRsp = {0};
  batchUseRsp.pArray = taosArrayInit(numOfDbs, sizeof(SUseDbRsp));
  if (batchUseRsp.pArray == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    return -1;
  }
S
Shengliang Guan 已提交
1309

S
Shengliang Guan 已提交
1310 1311 1312 1313
  for (int32_t i = 0; i < numOfDbs; ++i) {
    SDbVgVersion *pDbVgVersion = &pDbs[i];
    pDbVgVersion->dbId = htobe64(pDbVgVersion->dbId);
    pDbVgVersion->vgVersion = htonl(pDbVgVersion->vgVersion);
D
dapan1121 已提交
1314
    pDbVgVersion->numOfTable = htonl(pDbVgVersion->numOfTable);
D
dapan1121 已提交
1315

S
Shengliang Guan 已提交
1316 1317
    SUseDbRsp usedbRsp = {0};

S
Shengliang Guan 已提交
1318
    SDbObj *pDb = mndAcquireDb(pMnode, pDbVgVersion->dbFName);
S
Shengliang Guan 已提交
1319 1320 1321 1322 1323 1324
    if (pDb == NULL) {
      mDebug("db:%s, no exist", pDbVgVersion->dbFName);
      memcpy(usedbRsp.db, pDbVgVersion->dbFName, TSDB_DB_FNAME_LEN);
      usedbRsp.uid = pDbVgVersion->dbId;
      usedbRsp.vgVersion = -1;
      taosArrayPush(batchUseRsp.pArray, &usedbRsp);
D
dapan1121 已提交
1325
      continue;
D
dapan1121 已提交
1326
    }
S
Shengliang Guan 已提交
1327

S
Shengliang Guan 已提交
1328
    int32_t numOfTable = mndGetDBTableNum(pDb, pMnode);
S
Shengliang Guan 已提交
1329

D
dapan1121 已提交
1330 1331
    if (pDbVgVersion->vgVersion >= pDb->vgVersion && numOfTable == pDbVgVersion->numOfTable) {
      mDebug("db:%s, version & numOfTable not changed", pDbVgVersion->dbFName);
S
Shengliang Guan 已提交
1332
      mndReleaseDb(pMnode, pDb);
D
dapan1121 已提交
1333
      continue;
D
dapan1121 已提交
1334
    }
L
Liu Jicong 已提交
1335

D
dapan1121 已提交
1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347
    usedbRsp.pVgroupInfos = taosArrayInit(pDb->cfg.numOfVgroups, sizeof(SVgroupInfo));
    if (usedbRsp.pVgroupInfos == NULL) {
      mndReleaseDb(pMnode, pDb);
      mError("db:%s, failed to malloc usedb response", pDb->name);
      continue;
    }

    mndBuildDBVgroupInfo(pDb, pMnode, usedbRsp.pVgroupInfos);
    memcpy(usedbRsp.db, pDb->name, TSDB_DB_FNAME_LEN);
    usedbRsp.uid = pDb->uid;
    usedbRsp.vgVersion = pDb->vgVersion;
    usedbRsp.vgNum = (int32_t)taosArrayGetSize(usedbRsp.pVgroupInfos);
S
Shengliang Guan 已提交
1348
    usedbRsp.hashMethod = pDb->cfg.hashMethod;
D
dapan1121 已提交
1349 1350 1351

    taosArrayPush(batchUseRsp.pArray, &usedbRsp);
    mndReleaseDb(pMnode, pDb);
D
dapan1121 已提交
1352 1353
  }

S
Shengliang Guan 已提交
1354
  int32_t rspLen = tSerializeSUseDbBatchRsp(NULL, 0, &batchUseRsp);
wafwerar's avatar
wafwerar 已提交
1355
  void   *pRsp = taosMemoryMalloc(rspLen);
S
Shengliang Guan 已提交
1356 1357 1358 1359
  if (pRsp == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    tFreeSUseDbBatchRsp(&batchUseRsp);
    return -1;
D
dapan1121 已提交
1360
  }
S
Shengliang Guan 已提交
1361
  tSerializeSUseDbBatchRsp(pRsp, rspLen, &batchUseRsp);
D
dapan1121 已提交
1362

S
Shengliang Guan 已提交
1363 1364 1365 1366
  *ppRsp = pRsp;
  *pRspLen = rspLen;

  tFreeSUseDbBatchRsp(&batchUseRsp);
D
dapan1121 已提交
1367 1368 1369
  return 0;
}

S
Shengliang Guan 已提交
1370 1371
static int32_t mndProcessCompactDbReq(SNodeMsg *pReq) {
  SMnode       *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
1372 1373 1374 1375 1376
  int32_t       code = -1;
  SDbObj       *pDb = NULL;
  SUserObj     *pUser = NULL;
  SCompactDbReq compactReq = {0};

S
Shengliang Guan 已提交
1377
  if (tDeserializeSCompactDbReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &compactReq) != 0) {
S
Shengliang Guan 已提交
1378
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
1379
    goto _OVER;
S
Shengliang Guan 已提交
1380 1381 1382 1383 1384
  }

  mDebug("db:%s, start to sync", compactReq.db);

  pDb = mndAcquireDb(pMnode, compactReq.db);
S
Shengliang Guan 已提交
1385
  if (pDb == NULL) {
S
Shengliang Guan 已提交
1386
    goto _OVER;
S
Shengliang Guan 已提交
1387 1388 1389 1390
  }

  pUser = mndAcquireUser(pMnode, pReq->user);
  if (pUser == NULL) {
S
Shengliang Guan 已提交
1391
    goto _OVER;
S
Shengliang Guan 已提交
1392 1393
  }

S
Shengliang Guan 已提交
1394 1395
  if (mndCheckAlterDropCompactDbAuth(pUser, pDb) != 0) {
    goto _OVER;
S
Shengliang Guan 已提交
1396 1397
  }

S
Shengliang Guan 已提交
1398
  // code = mndCompactDb();
S
Shengliang Guan 已提交
1399

S
Shengliang Guan 已提交
1400
_OVER:
S
Shengliang Guan 已提交
1401 1402
  if (code != 0) {
    mError("db:%s, failed to process compact db req since %s", compactReq.db, terrstr());
S
Shengliang Guan 已提交
1403
  }
S
Shengliang Guan 已提交
1404 1405

  mndReleaseDb(pMnode, pDb);
S
Shengliang Guan 已提交
1406 1407 1408
  mndReleaseUser(pMnode, pUser);

  return code;
S
Shengliang Guan 已提交
1409
}
S
Shengliang Guan 已提交
1410

S
Shengliang Guan 已提交
1411
const char *mndGetDbStr(const char *src) {
S
Shengliang Guan 已提交
1412 1413
  char *pos = strstr(src, TS_PATH_DELIMITER);
  if (pos != NULL) ++pos;
S
Shengliang Guan 已提交
1414
  if (pos == NULL) return src;
S
Shengliang Guan 已提交
1415 1416 1417
  return pos;
}

S
Shengliang Guan 已提交
1418 1419
static void dumpDbInfoData(SSDataBlock *pBlock, SDbObj *pDb, SShowObj *pShow, int32_t rows, int64_t numOfTables,
                           bool sysDb) {
S
Shengliang Guan 已提交
1420 1421
  int32_t cols = 0;

L
Liu Jicong 已提交
1422
  int32_t     bytes = pShow->pMeta->pSchemas[cols].bytes;
1423
  char       *buf = taosMemoryMalloc(bytes);
S
Shengliang Guan 已提交
1424
  const char *name = mndGetDbStr(pDb->name);
H
Haojun Liao 已提交
1425
  if (name != NULL) {
1426
    STR_WITH_MAXSIZE_TO_VARSTR(buf, name, bytes);
H
Haojun Liao 已提交
1427
  } else {
1428
    STR_WITH_MAXSIZE_TO_VARSTR(buf, "NULL", bytes);
H
Haojun Liao 已提交
1429
  }
S
Shengliang Guan 已提交
1430

1431 1432 1433
  char *status = "ready";
  char  b[24] = {0};
  STR_WITH_SIZE_TO_VARSTR(b, status, strlen(status));
S
Shengliang Guan 已提交
1434

1435
  if (sysDb) {
S
Shengliang Guan 已提交
1436 1437
    for (int32_t i = 0; i < pShow->numOfColumns; ++i) {
      SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, i);
1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451
      if (i == 0) {
        colDataAppend(pColInfo, rows, buf, false);
      } else if (i == 3) {
        colDataAppend(pColInfo, rows, (const char *)&numOfTables, false);
      } else if (i == 20) {
        colDataAppend(pColInfo, rows, b, false);
      } else {
        colDataAppendNULL(pColInfo, rows);
      }
    }
  } else {
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, buf, false);
    taosMemoryFree(buf);
S
Shengliang Guan 已提交
1452

1453 1454
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, (const char *)&pDb->createdTime, false);
S
Shengliang Guan 已提交
1455

1456 1457
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.numOfVgroups, false);
S
Shengliang Guan 已提交
1458

1459 1460
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, (const char *)&numOfTables, false);
S
Shengliang Guan 已提交
1461

1462 1463
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.replications, false);
1464

S
Shengliang Guan 已提交
1465 1466
    const char *src = pDb->cfg.strict ? "strict" : "nostrict";
    STR_WITH_SIZE_TO_VARSTR(b, src, strlen(src));
1467
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
S
Shengliang Guan 已提交
1468
    colDataAppend(pColInfo, rows, (const char *)b, false);
S
Shengliang Guan 已提交
1469

1470 1471
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.daysPerFile, false);
S
Shengliang Guan 已提交
1472

1473 1474 1475 1476 1477 1478 1479 1480 1481
    char    tmp[128] = {0};
    int32_t len = 0;
    if (pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep1 || pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep2) {
      len = sprintf(&tmp[VARSTR_HEADER_SIZE], "%d,%d,%d", pDb->cfg.daysToKeep1, pDb->cfg.daysToKeep2,
                    pDb->cfg.daysToKeep0);
    } else {
      len = sprintf(&tmp[VARSTR_HEADER_SIZE], "%d,%d,%d", pDb->cfg.daysToKeep0, pDb->cfg.daysToKeep1,
                    pDb->cfg.daysToKeep2);
    }
1482

1483 1484 1485
    varDataSetLen(tmp, len);
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, (const char *)tmp, false);
S
Shengliang Guan 已提交
1486

1487
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
S
Shengliang Guan 已提交
1488 1489 1490 1491
    colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.buffer, false);

    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.pageSize, false);
S
Shengliang Guan 已提交
1492

1493
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
S
Shengliang Guan 已提交
1494
    colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.pages, false);
S
Shengliang Guan 已提交
1495

1496 1497
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.minRows, false);
H
Haojun Liao 已提交
1498

1499 1500
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.maxRows, false);
H
Haojun Liao 已提交
1501

1502 1503
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.walLevel, false);
H
Haojun Liao 已提交
1504

1505 1506
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.fsyncPeriod, false);
H
Haojun Liao 已提交
1507

1508 1509
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.compression, false);
H
Haojun Liao 已提交
1510

1511 1512
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.cacheLastRow, false);
H
Haojun Liao 已提交
1513

1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528
    char *prec = NULL;
    switch (pDb->cfg.precision) {
      case TSDB_TIME_PRECISION_MILLI:
        prec = TSDB_TIME_PRECISION_MILLI_STR;
        break;
      case TSDB_TIME_PRECISION_MICRO:
        prec = TSDB_TIME_PRECISION_MICRO_STR;
        break;
      case TSDB_TIME_PRECISION_NANO:
        prec = TSDB_TIME_PRECISION_NANO_STR;
        break;
      default:
        prec = "none";
        break;
    }
D
dapan1121 已提交
1529

1530 1531 1532 1533
    char t[10] = {0};
    STR_WITH_SIZE_TO_VARSTR(t, prec, 2);
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, (const char *)t, false);
D
dapan1121 已提交
1534

1535 1536
    //  single stable model
    int8_t m = 0;
1537
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1538
    colDataAppend(pColInfo, rows, (const char *)&m, false);
1539

1540 1541 1542
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
    colDataAppend(pColInfo, rows, (const char *)b, false);
  }
H
Haojun Liao 已提交
1543 1544
}

L
Liu Jicong 已提交
1545
static void setInformationSchemaDbCfg(SDbObj *pDbObj) {
H
Haojun Liao 已提交
1546 1547 1548
  ASSERT(pDbObj != NULL);
  strncpy(pDbObj->name, TSDB_INFORMATION_SCHEMA_DB, tListLen(pDbObj->name));

L
Liu Jicong 已提交
1549
  pDbObj->createdTime = 0;
H
Haojun Liao 已提交
1550
  pDbObj->cfg.numOfVgroups = 0;
S
Shengliang Guan 已提交
1551
  pDbObj->cfg.strict = 1;
H
Haojun Liao 已提交
1552
  pDbObj->cfg.replications = 1;
L
Liu Jicong 已提交
1553
  pDbObj->cfg.precision = TSDB_TIME_PRECISION_MILLI;
H
Haojun Liao 已提交
1554 1555
}

S
Shengliang Guan 已提交
1556
static void setPerfSchemaDbCfg(SDbObj *pDbObj) {
1557 1558 1559 1560 1561
  ASSERT(pDbObj != NULL);
  strncpy(pDbObj->name, TSDB_PERFORMANCE_SCHEMA_DB, tListLen(pDbObj->name));

  pDbObj->createdTime = 0;
  pDbObj->cfg.numOfVgroups = 0;
S
Shengliang Guan 已提交
1562
  pDbObj->cfg.strict = 1;
1563 1564 1565 1566
  pDbObj->cfg.replications = 1;
  pDbObj->cfg.precision = TSDB_TIME_PRECISION_MILLI;
}

1567 1568 1569 1570 1571 1572 1573
static bool mndGetTablesOfDbFp(SMnode *pMnode, void *pObj, void *p1, void *p2, void *p3) {
  SVgObj  *pVgroup = pObj;
  int32_t *numOfTables = p1;
  *numOfTables += pVgroup->numOfTables;
  return true;
}

S
Shengliang Guan 已提交
1574
static int32_t mndRetrieveDbs(SNodeMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rowsCapacity) {
X
Xiaoyu Wang 已提交
1575
  SMnode *pMnode = pReq->pNode;
H
Haojun Liao 已提交
1576 1577 1578 1579
  SSdb   *pSdb = pMnode->pSdb;
  int32_t numOfRows = 0;
  SDbObj *pDb = NULL;

1580 1581 1582 1583
  // Append the information_schema database into the result.
  if (!pShow->sysDbRsp) {
    SDbObj infoschemaDb = {0};
    setInformationSchemaDbCfg(&infoschemaDb);
1584
    dumpDbInfoData(pBlock, &infoschemaDb, pShow, numOfRows, 14, true);
1585 1586 1587 1588 1589

    numOfRows += 1;

    SDbObj perfschemaDb = {0};
    setPerfSchemaDbCfg(&perfschemaDb);
1590
    dumpDbInfoData(pBlock, &perfschemaDb, pShow, numOfRows, 3, true);
1591 1592 1593 1594 1595

    numOfRows += 1;
    pShow->sysDbRsp = true;
  }

H
Haojun Liao 已提交
1596 1597 1598 1599
  while (numOfRows < rowsCapacity) {
    pShow->pIter = sdbFetch(pSdb, SDB_DB, pShow->pIter, (void **)&pDb);
    if (pShow->pIter == NULL) {
      break;
S
Shengliang Guan 已提交
1600 1601
    }

1602 1603 1604
    int32_t numOfTables = 0;
    sdbTraverse(pSdb, SDB_VGROUP, mndGetTablesOfDbFp, &numOfTables, NULL, NULL);

1605
    dumpDbInfoData(pBlock, pDb, pShow, numOfRows, numOfTables, false);
S
Shengliang Guan 已提交
1606 1607 1608 1609
    numOfRows++;
    sdbRelease(pSdb, pDb);
  }

1610
  pShow->numOfRows += numOfRows;
S
Shengliang Guan 已提交
1611 1612 1613 1614 1615 1616

  return numOfRows;
}

static void mndCancelGetNextDb(SMnode *pMnode, void *pIter) {
  SSdb *pSdb = pMnode->pSdb;
D
dapan1121 已提交
1617
  sdbCancelFetch(pSdb, pIter);
L
Liu Jicong 已提交
1618
}