mndDb.c 53.1 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 44
static int32_t  mndProcessCreateDbReq(SRpcMsg *pReq);
static int32_t  mndProcessAlterDbReq(SRpcMsg *pReq);
static int32_t  mndProcessDropDbReq(SRpcMsg *pReq);
static int32_t  mndProcessUseDbReq(SRpcMsg *pReq);
static int32_t  mndProcessCompactDbReq(SRpcMsg *pReq);
static int32_t  mndRetrieveDbs(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rowsCapacity);
S
Shengliang Guan 已提交
45
static void     mndCancelGetNextDb(SMnode *pMnode, void *pIter);
S
Shengliang Guan 已提交
46
static int32_t  mndProcessGetDbCfgReq(SRpcMsg *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
  }
wmmhello's avatar
wmmhello 已提交
118
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.schemaless, _OVER)
S
sma  
Shengliang Guan 已提交
119

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

  terrno = 0;

S
Shengliang Guan 已提交
125
_OVER:
126 127 128 129 130
  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 已提交
131

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

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

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

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

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

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

  int32_t dataPos = 0;
S
Shengliang Guan 已提交
154 155 156 157 158 159 160 161 162
  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 已提交
163 164 165 166
  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 已提交
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
  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 已提交
182 183
  if (pDb->cfg.numOfRetensions > 0) {
    pDb->cfg.pRetensions = taosArrayInit(pDb->cfg.numOfRetensions, sizeof(SRetention));
S
Shengliang Guan 已提交
184
    if (pDb->cfg.pRetensions == NULL) goto _OVER;
S
sma  
Shengliang Guan 已提交
185 186
    for (int32_t i = 0; i < pDb->cfg.numOfRetensions; ++i) {
      SRetention retension = {0};
C
Cary Xu 已提交
187 188
      SDB_GET_INT64(pRaw, dataPos, &retension.freq, _OVER)
      SDB_GET_INT64(pRaw, dataPos, &retension.keep, _OVER)
S
Shengliang Guan 已提交
189 190
      SDB_GET_INT8(pRaw, dataPos, &retension.freqUnit, _OVER)
      SDB_GET_INT8(pRaw, dataPos, &retension.keepUnit, _OVER)
S
sma  
Shengliang Guan 已提交
191
      if (taosArrayPush(pDb->cfg.pRetensions, &retension) == NULL) {
S
Shengliang Guan 已提交
192
        goto _OVER;
S
sma  
Shengliang Guan 已提交
193 194 195
      }
    }
  }
wmmhello's avatar
wmmhello 已提交
196
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.schemaless, _OVER)
S
sma  
Shengliang Guan 已提交
197

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

  terrno = 0;

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

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

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

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

S
Shengliang Guan 已提交
225 226
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);
227
  taosWLockLatch(&pOld->lock);
S
Shengliang Guan 已提交
228 229 230
  pOld->updateTime = pNew->updateTime;
  pOld->cfgVersion = pNew->cfgVersion;
  pOld->vgVersion = pNew->vgVersion;
S
Shengliang Guan 已提交
231 232 233 234 235 236 237 238 239 240 241 242
  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;
243
  taosWUnLockLatch(&pOld->lock);
S
Shengliang Guan 已提交
244 245 246
  return 0;
}

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

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

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

266
static int32_t mndAddCreateVnodeAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup, SVnodeGid *pVgid, bool standby) {
S
Shengliang Guan 已提交
267 268 269 270 271 272 273 274
  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;
275
  void   *pReq = mndBuildCreateVnodeReq(pMnode, pDnode, pDb, pVgroup, &contLen, standby);
S
Shengliang Guan 已提交
276 277 278 279 280 281 282
  if (pReq == NULL) return -1;

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

283 284 285
  if (mndTransAppendRedoAction(pTrans, &action) != 0) {
    taosMemoryFree(pReq);
    return -1;
S
Shengliang Guan 已提交
286 287 288 289 290
  }

  return 0;
}

291
static int32_t mndAddAlterVnodeAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup, tmsg_t msgType) {
S
Shengliang Guan 已提交
292
  STransAction action = {0};
293
  action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
S
Shengliang Guan 已提交
294 295

  int32_t contLen = 0;
296
  void   *pReq = mndBuildAlterVnodeReq(pMnode, pDb, pVgroup, &contLen);
S
Shengliang Guan 已提交
297 298 299 300
  if (pReq == NULL) return -1;

  action.pCont = pReq;
  action.contLen = contLen;
301
  action.msgType = msgType;
S
Shengliang Guan 已提交
302

303 304 305
  if (mndTransAppendRedoAction(pTrans, &action) != 0) {
    taosMemoryFree(pReq);
    return -1;
S
Shengliang Guan 已提交
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
  }

  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 已提交
344
static int32_t mndCheckDbName(const char *dbName, SUserObj *pUser) {
S
Shengliang Guan 已提交
345 346 347 348 349 350 351 352 353 354 355 356 357 358 359
  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 已提交
360
static int32_t mndCheckDbCfg(SMnode *pMnode, SDbCfg *pCfg) {
S
Shengliang Guan 已提交
361 362
  terrno = TSDB_CODE_MND_INVALID_DB_OPTION;

363
  if (pCfg->numOfVgroups < TSDB_MIN_VNODES_PER_DB || pCfg->numOfVgroups > TSDB_MAX_VNODES_PER_DB) return -1;
S
Shengliang Guan 已提交
364 365 366 367
  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 已提交
368 369 370 371
  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 已提交
372
  if (pCfg->daysToKeep0 < pCfg->daysPerFile) return -1;
S
Shengliang Guan 已提交
373 374
  if (pCfg->daysToKeep0 > pCfg->daysToKeep1) return -1;
  if (pCfg->daysToKeep1 > pCfg->daysToKeep2) return -1;
S
Shengliang Guan 已提交
375 376
  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 已提交
377 378 379 380 381
  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 已提交
382
  if (pCfg->replications < TSDB_MIN_DB_REPLICA || pCfg->replications > TSDB_MAX_DB_REPLICA) return -1;
S
Shengliang Guan 已提交
383
  if (pCfg->replications != 1 && pCfg->replications != 3) return -1;
384
  if (pCfg->strict < TSDB_DB_STRICT_OFF || pCfg->strict > TSDB_DB_STRICT_ON) return -1;
wmmhello's avatar
wmmhello 已提交
385
  if (pCfg->schemaless < TSDB_DB_SCHEMALESS_OFF || pCfg->schemaless > TSDB_DB_SCHEMALESS_ON) return -1;
S
Shengliang Guan 已提交
386
  if (pCfg->cacheLastRow < TSDB_MIN_DB_CACHE_LAST_ROW || pCfg->cacheLastRow > TSDB_MAX_DB_CACHE_LAST_ROW) return -1;
S
Shengliang Guan 已提交
387
  if (pCfg->hashMethod != 1) return -1;
388 389 390 391
  if (pCfg->replications > mndGetDnodeSize(pMnode)) {
    terrno = TSDB_CODE_MND_NO_ENOUGH_DNODES;
    return -1;
  }
S
Shengliang Guan 已提交
392 393

  terrno = 0;
394
  return terrno;
S
Shengliang Guan 已提交
395 396 397
}

static void mndSetDefaultDbCfg(SDbCfg *pCfg) {
398
  if (pCfg->numOfVgroups < 0) pCfg->numOfVgroups = TSDB_DEFAULT_VN_PER_DB;
S
Shengliang Guan 已提交
399 400
  if (pCfg->numOfStables < 0) pCfg->numOfStables = TSDB_DEFAULT_DB_SINGLE_STABLE;
  if (pCfg->buffer < 0) pCfg->buffer = TSDB_DEFAULT_BUFFER_PER_VNODE;
H
Hongze Cheng 已提交
401 402
  if (pCfg->pageSize < 0) pCfg->pageSize = TSDB_DEFAULT_PAGESIZE_PER_VNODE;
  if (pCfg->pages < 0) pCfg->pages = TSDB_DEFAULT_PAGES_PER_VNODE;
S
Shengliang Guan 已提交
403
  if (pCfg->daysPerFile < 0) pCfg->daysPerFile = TSDB_DEFAULT_DURATION_PER_FILE;
S
Shengliang Guan 已提交
404
  if (pCfg->daysToKeep0 < 0) pCfg->daysToKeep0 = TSDB_DEFAULT_KEEP;
405 406
  if (pCfg->daysToKeep1 < 0) pCfg->daysToKeep1 = pCfg->daysToKeep0;
  if (pCfg->daysToKeep2 < 0) pCfg->daysToKeep2 = pCfg->daysToKeep1;
S
Shengliang Guan 已提交
407 408
  if (pCfg->minRows < 0) pCfg->minRows = TSDB_DEFAULT_MINROWS_FBLOCK;
  if (pCfg->maxRows < 0) pCfg->maxRows = TSDB_DEFAULT_MAXROWS_FBLOCK;
S
Shengliang Guan 已提交
409 410 411 412
  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 已提交
413 414
  if (pCfg->replications < 0) pCfg->replications = TSDB_DEFAULT_DB_REPLICA;
  if (pCfg->strict < 0) pCfg->strict = TSDB_DEFAULT_DB_STRICT;
S
Shengliang Guan 已提交
415
  if (pCfg->cacheLastRow < 0) pCfg->cacheLastRow = TSDB_DEFAULT_CACHE_LAST_ROW;
416
  if (pCfg->numOfRetensions < 0) pCfg->numOfRetensions = 0;
wmmhello's avatar
wmmhello 已提交
417 418
  if (pCfg->schemaless < 0) pCfg->schemaless = TSDB_DB_SCHEMALESS_OFF;

S
Shengliang Guan 已提交
419
}
S
Shengliang Guan 已提交
420

S
Shengliang Guan 已提交
421
static int32_t mndSetCreateDbRedoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
S
Shengliang Guan 已提交
422
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
S
Shengliang Guan 已提交
423 424 425
  if (pDbRaw == NULL) return -1;
  if (mndTransAppendRedolog(pTrans, pDbRaw) != 0) return -1;
  if (sdbSetRawStatus(pDbRaw, SDB_STATUS_CREATING) != 0) return -1;
S
Shengliang Guan 已提交
426

S
Shengliang Guan 已提交
427
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
S
Shengliang Guan 已提交
428
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
S
Shengliang Guan 已提交
429 430 431
    if (pVgRaw == NULL) return -1;
    if (mndTransAppendRedolog(pTrans, pVgRaw) != 0) return -1;
    if (sdbSetRawStatus(pVgRaw, SDB_STATUS_CREATING) != 0) return -1;
S
Shengliang Guan 已提交
432 433 434 435 436
  }

  return 0;
}

S
Shengliang Guan 已提交
437
static int32_t mndSetCreateDbUndoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
S
Shengliang Guan 已提交
438
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
S
Shengliang Guan 已提交
439 440 441
  if (pDbRaw == NULL) return -1;
  if (mndTransAppendUndolog(pTrans, pDbRaw) != 0) return -1;
  if (sdbSetRawStatus(pDbRaw, SDB_STATUS_DROPPED) != 0) return -1;
S
Shengliang Guan 已提交
442

S
Shengliang Guan 已提交
443
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
S
Shengliang Guan 已提交
444
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
S
Shengliang Guan 已提交
445 446 447
    if (pVgRaw == NULL) return -1;
    if (mndTransAppendUndolog(pTrans, pVgRaw) != 0) return -1;
    if (sdbSetRawStatus(pVgRaw, SDB_STATUS_DROPPED) != 0) return -1;
S
Shengliang Guan 已提交
448 449 450 451 452
  }

  return 0;
}

S
Shengliang Guan 已提交
453
static int32_t mndSetCreateDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
S
Shengliang Guan 已提交
454
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
S
Shengliang Guan 已提交
455 456 457
  if (pDbRaw == NULL) return -1;
  if (mndTransAppendCommitlog(pTrans, pDbRaw) != 0) return -1;
  if (sdbSetRawStatus(pDbRaw, SDB_STATUS_READY) != 0) return -1;
S
Shengliang Guan 已提交
458

S
Shengliang Guan 已提交
459
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
S
Shengliang Guan 已提交
460
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
S
Shengliang Guan 已提交
461 462 463
    if (pVgRaw == NULL) return -1;
    if (mndTransAppendCommitlog(pTrans, pVgRaw) != 0) return -1;
    if (sdbSetRawStatus(pVgRaw, SDB_STATUS_READY) != 0) return -1;
S
Shengliang Guan 已提交
464 465 466 467 468
  }

  return 0;
}

S
Shengliang Guan 已提交
469 470
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 已提交
471
    SVgObj *pVgroup = pVgroups + vg;
S
Shengliang Guan 已提交
472 473

    for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
S
Shengliang Guan 已提交
474
      SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
475
      if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid, false) != 0) {
S
Shengliang Guan 已提交
476 477 478 479 480
        return -1;
      }
    }
  }

S
Shengliang Guan 已提交
481 482 483
  return 0;
}

S
Shengliang Guan 已提交
484 485
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 已提交
486
    SVgObj *pVgroup = pVgroups + vg;
S
Shengliang Guan 已提交
487 488

    for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
S
Shengliang Guan 已提交
489 490
      SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
      if (mndAddDropVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid, false) != 0) {
S
Shengliang Guan 已提交
491 492 493 494 495
        return -1;
      }
    }
  }

S
Shengliang Guan 已提交
496 497 498
  return 0;
}

S
Shengliang Guan 已提交
499
static int32_t mndCreateDb(SMnode *pMnode, SRpcMsg *pReq, SCreateDbReq *pCreate, SUserObj *pUser) {
S
Shengliang Guan 已提交
500
  SDbObj dbObj = {0};
501
  memcpy(dbObj.name, pCreate->db, TSDB_DB_FNAME_LEN);
S
Shengliang Guan 已提交
502
  memcpy(dbObj.acct, pUser->acct, TSDB_USER_LEN);
S
Shengliang Guan 已提交
503 504
  dbObj.createdTime = taosGetTimestampMs();
  dbObj.updateTime = dbObj.createdTime;
505
  dbObj.uid = mndGenerateUid(dbObj.name, TSDB_DB_FNAME_LEN);
S
Shengliang Guan 已提交
506 507
  dbObj.cfgVersion = 1;
  dbObj.vgVersion = 1;
S
Shengliang Guan 已提交
508
  memcpy(dbObj.createUser, pUser->user, TSDB_USER_LEN);
L
Liu Jicong 已提交
509 510
  dbObj.cfg = (SDbCfg){
      .numOfVgroups = pCreate->numOfVgroups,
S
Shengliang Guan 已提交
511 512 513 514
      .numOfStables = pCreate->numOfStables,
      .buffer = pCreate->buffer,
      .pageSize = pCreate->pageSize,
      .pages = pCreate->pages,
L
Liu Jicong 已提交
515 516 517 518 519 520
      .daysPerFile = pCreate->daysPerFile,
      .daysToKeep0 = pCreate->daysToKeep0,
      .daysToKeep1 = pCreate->daysToKeep1,
      .daysToKeep2 = pCreate->daysToKeep2,
      .minRows = pCreate->minRows,
      .maxRows = pCreate->maxRows,
521 522
      .fsyncPeriod = pCreate->fsyncPeriod,
      .walLevel = pCreate->walLevel,
L
Liu Jicong 已提交
523 524 525
      .precision = pCreate->precision,
      .compression = pCreate->compression,
      .replications = pCreate->replications,
S
Shengliang Guan 已提交
526
      .strict = pCreate->strict,
L
Liu Jicong 已提交
527
      .cacheLastRow = pCreate->cacheLastRow,
S
Shengliang Guan 已提交
528
      .hashMethod = 1,
wmmhello's avatar
wmmhello 已提交
529
      .schemaless = pCreate->schemaless,
L
Liu Jicong 已提交
530
  };
S
Shengliang Guan 已提交
531

S
sma  
Shengliang Guan 已提交
532 533 534
  dbObj.cfg.numOfRetensions = pCreate->numOfRetensions;
  dbObj.cfg.pRetensions = pCreate->pRetensions;

S
Shengliang Guan 已提交
535 536
  mndSetDefaultDbCfg(&dbObj.cfg);

S
Shengliang Guan 已提交
537 538 539 540 541
  if (mndCheckDbName(dbObj.name, pUser) != 0) {
    mError("db:%s, failed to create since %s", pCreate->db, terrstr());
    return -1;
  }

S
Shengliang Guan 已提交
542
  if (mndCheckDbCfg(pMnode, &dbObj.cfg) != 0) {
S
Shengliang Guan 已提交
543 544 545
    mError("db:%s, failed to create since %s", pCreate->db, terrstr());
    return -1;
  }
S
Shengliang Guan 已提交
546

S
Shengliang Guan 已提交
547 548
  SVgObj *pVgroups = NULL;
  if (mndAllocVgroup(pMnode, &dbObj, &pVgroups) != 0) {
549 550 551 552
    mError("db:%s, failed to create since %s", pCreate->db, terrstr());
    return -1;
  }

S
Shengliang Guan 已提交
553
  int32_t code = -1;
554
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_DB, pReq);
S
Shengliang Guan 已提交
555
  if (pTrans == NULL) goto _OVER;
S
Shengliang Guan 已提交
556

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

559
  mndTransSetDbName(pTrans, dbObj.name);
S
Shengliang Guan 已提交
560 561 562 563 564 565
  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 已提交
566

S
Shengliang Guan 已提交
567 568
  code = 0;

S
Shengliang Guan 已提交
569
_OVER:
wafwerar's avatar
wafwerar 已提交
570
  taosMemoryFree(pVgroups);
S
Shengliang Guan 已提交
571
  mndTransDrop(pTrans);
S
Shengliang Guan 已提交
572
  return code;
S
Shengliang Guan 已提交
573 574
}

S
Shengliang Guan 已提交
575 576
static int32_t mndProcessCreateDbReq(SRpcMsg *pReq) {
  SMnode      *pMnode = pReq->info.node;
S
Shengliang Guan 已提交
577 578 579 580 581
  int32_t      code = -1;
  SDbObj      *pDb = NULL;
  SUserObj    *pUser = NULL;
  SCreateDbReq createReq = {0};

S
Shengliang Guan 已提交
582
  if (tDeserializeSCreateDbReq(pReq->pCont, pReq->contLen, &createReq) != 0) {
S
Shengliang Guan 已提交
583
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
584
    goto _OVER;
S
Shengliang Guan 已提交
585 586 587 588 589
  }

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

  pDb = mndAcquireDb(pMnode, createReq.db);
S
Shengliang Guan 已提交
590
  if (pDb != NULL) {
S
Shengliang Guan 已提交
591 592 593
    if (createReq.ignoreExist) {
      mDebug("db:%s, already exist, ignore exist is set", createReq.db);
      code = 0;
S
Shengliang Guan 已提交
594
      goto _OVER;
S
Shengliang Guan 已提交
595 596
    } else {
      terrno = TSDB_CODE_MND_DB_ALREADY_EXIST;
S
Shengliang Guan 已提交
597
      goto _OVER;
S
Shengliang Guan 已提交
598
    }
S
Shengliang Guan 已提交
599
  } else if (terrno != TSDB_CODE_MND_DB_NOT_EXIST) {
S
Shengliang Guan 已提交
600
    goto _OVER;
S
Shengliang Guan 已提交
601 602
  }

S
Shengliang Guan 已提交
603
  pUser = mndAcquireUser(pMnode, pReq->conn.user);
S
Shengliang Guan 已提交
604
  if (pUser == NULL) {
S
Shengliang Guan 已提交
605
    goto _OVER;
S
Shengliang Guan 已提交
606 607 608
  }

  if (mndCheckCreateDbAuth(pUser) != 0) {
S
Shengliang Guan 已提交
609
    goto _OVER;
S
Shengliang Guan 已提交
610 611
  }

S
Shengliang Guan 已提交
612
  code = mndCreateDb(pMnode, pReq, &createReq, pUser);
S
Shengliang Guan 已提交
613
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
S
Shengliang Guan 已提交
614

S
Shengliang Guan 已提交
615
_OVER:
S
Shengliang Guan 已提交
616
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
S
Shengliang Guan 已提交
617
    mError("db:%s, failed to create since %s", createReq.db, terrstr());
S
Shengliang Guan 已提交
618 619
  }

S
Shengliang Guan 已提交
620 621
  mndReleaseDb(pMnode, pDb);
  mndReleaseUser(pMnode, pUser);
S
sma  
Shengliang Guan 已提交
622
  tFreeSCreateDbReq(&createReq);
S
Shengliang Guan 已提交
623 624

  return code;
S
Shengliang Guan 已提交
625 626
}

S
Shengliang Guan 已提交
627
static int32_t mndSetDbCfgFromAlterDbReq(SDbObj *pDb, SAlterDbReq *pAlter) {
S
Shengliang Guan 已提交
628
  terrno = TSDB_CODE_MND_DB_OPTION_UNCHANGED;
S
Shengliang Guan 已提交
629

S
Shengliang Guan 已提交
630
  if (pAlter->buffer > 0 && pAlter->buffer != pDb->cfg.buffer) {
S
Shengliang Guan 已提交
631 632 633 634
    pDb->cfg.buffer = pAlter->buffer;
    terrno = 0;
  }

S
Shengliang Guan 已提交
635
  if (pAlter->pages > 0 && pAlter->pages != pDb->cfg.pages) {
S
Shengliang Guan 已提交
636
    pDb->cfg.pages = pAlter->pages;
S
Shengliang Guan 已提交
637
    terrno = 0;
S
Shengliang Guan 已提交
638 639
  }

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

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

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

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

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

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

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

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

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

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

S
Shengliang Guan 已提交
691 692 693
  return terrno;
}

S
Shengliang Guan 已提交
694
static int32_t mndSetAlterDbRedoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
S
Shengliang Guan 已提交
695
  SSdbRaw *pRedoRaw = mndDbActionEncode(pOld);
S
Shengliang Guan 已提交
696
  if (pRedoRaw == NULL) return -1;
697 698 699 700
  if (mndTransAppendRedolog(pTrans, pRedoRaw) != 0) {
    sdbFreeRaw(pRedoRaw);
    return -1;
  }
S
Shengliang Guan 已提交
701

702
  sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY);
S
Shengliang Guan 已提交
703 704 705
  return 0;
}

S
Shengliang Guan 已提交
706
static int32_t mndSetAlterDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
S
Shengliang Guan 已提交
707
  SSdbRaw *pCommitRaw = mndDbActionEncode(pNew);
S
Shengliang Guan 已提交
708
  if (pCommitRaw == NULL) return -1;
709 710 711 712
  if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
    sdbFreeRaw(pCommitRaw);
    return -1;
  }
S
Shengliang Guan 已提交
713

714
  sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY);
S
Shengliang Guan 已提交
715 716 717
  return 0;
}

S
Shengliang Guan 已提交
718
static int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup, SArray *pArray) {
S
Shengliang Guan 已提交
719
  if (pVgroup->replica <= 0 || pVgroup->replica == pDb->cfg.replications) {
720
    if (mndAddAlterVnodeAction(pMnode, pTrans, pDb, pVgroup, TDMT_VND_ALTER_CONFIG) != 0) {
721
      return -1;
S
Shengliang Guan 已提交
722
    }
S
Shengliang Guan 已提交
723
  } else {
S
Shengliang Guan 已提交
724 725
    SVgObj newVgroup = {0};
    memcpy(&newVgroup, pVgroup, sizeof(SVgObj));
726 727
    mndTransSetSerial(pTrans);

S
Shengliang Guan 已提交
728
    if (newVgroup.replica < pDb->cfg.replications) {
S
Shengliang Guan 已提交
729 730 731 732
      mInfo("db:%s, vgId:%d, will add 2 vnodes, vn:0 dnode:%d", pVgroup->dbName, pVgroup->vgId,
            pVgroup->vnodeGid[0].dnodeId);

      if (mndAddVnodeToVgroup(pMnode, &newVgroup, pArray) != 0) {
S
Shengliang Guan 已提交
733 734 735
        mError("db:%s, failed to add vnode to vgId:%d since %s", pDb->name, newVgroup.vgId, terrstr());
        return -1;
      }
S
Shengliang Guan 已提交
736
      newVgroup.replica = pDb->cfg.replications;
737 738 739
      if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, &newVgroup, &newVgroup.vnodeGid[1], true) != 0) return -1;
      if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, &newVgroup, &newVgroup.vnodeGid[2], true) != 0) return -1;
      if (mndAddAlterVnodeAction(pMnode, pTrans, pDb, &newVgroup, TDMT_VND_ALTER_REPLICA) != 0) return -1;
S
Shengliang Guan 已提交
740
    } else {
S
Shengliang Guan 已提交
741 742
      mInfo("db:%s, vgId:%d, will remove 2 vnodes", pVgroup->dbName, pVgroup->vgId);

S
Shengliang Guan 已提交
743 744
      SVnodeGid del1 = {0};
      SVnodeGid del2 = {0};
S
Shengliang Guan 已提交
745
      if (mndRemoveVnodeFromVgroup(pMnode, &newVgroup, pArray, &del1, &del2) != 0) {
S
Shengliang Guan 已提交
746 747 748
        mError("db:%s, failed to remove vnode from vgId:%d since %s", pDb->name, newVgroup.vgId, terrstr());
        return -1;
      }
S
Shengliang Guan 已提交
749
      newVgroup.replica = pDb->cfg.replications;
750
      if (mndAddAlterVnodeAction(pMnode, pTrans, pDb, &newVgroup, TDMT_VND_ALTER_REPLICA) != 0) return -1;
S
Shengliang Guan 已提交
751 752 753 754 755 756
      if (mndAddDropVnodeAction(pMnode, pTrans, pDb, &newVgroup, &del1, true) != 0) return -1;
      if (mndAddDropVnodeAction(pMnode, pTrans, pDb, &newVgroup, &del2, true) != 0) return -1;
    }

    SSdbRaw *pVgRaw = mndVgroupActionEncode(&newVgroup);
    if (pVgRaw == NULL) return -1;
757 758 759 760 761
    if (mndTransAppendCommitlog(pTrans, pVgRaw) != 0) {
      sdbFreeRaw(pVgRaw);
      return -1;
    }
    sdbSetRawStatus(pVgRaw, SDB_STATUS_READY);
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 770
  SSdb   *pSdb = pMnode->pSdb;
  void   *pIter = NULL;
  SArray *pArray = mndBuildDnodesArray(pMnode);
S
Shengliang Guan 已提交
771

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

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

    sdbRelease(pSdb, pVgroup);
  }

S
Shengliang Guan 已提交
789
  taosArrayDestroy(pArray);
S
Shengliang Guan 已提交
790 791
  return 0;
}
S
Shengliang Guan 已提交
792

S
Shengliang Guan 已提交
793
static int32_t mndAlterDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pOld, SDbObj *pNew) {
794
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq);
795
  if (pTrans == NULL) return -1;
S
Shengliang Guan 已提交
796
  mDebug("trans:%d, used to alter db:%s", pTrans->id, pOld->name);
S
Shengliang Guan 已提交
797

798
  int32_t code = -1;
799
  mndTransSetDbName(pTrans, pOld->name);
S
Shengliang Guan 已提交
800 801 802 803
  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 已提交
804 805
  code = 0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

S
Shengliang Guan 已提交
888
  cfgRsp.numOfVgroups = pDb->cfg.numOfVgroups;
S
Shengliang Guan 已提交
889 890 891 892
  cfgRsp.numOfStables = pDb->cfg.numOfStables;
  cfgRsp.buffer = pDb->cfg.buffer;
  cfgRsp.pageSize = pDb->cfg.pageSize;
  cfgRsp.pages = pDb->cfg.pages;
S
Shengliang Guan 已提交
893 894 895 896 897 898 899 900 901 902 903 904 905
  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 已提交
906 907
  cfgRsp.numOfRetensions = pDb->cfg.numOfRetensions;
  cfgRsp.pRetensions = pDb->cfg.pRetensions;
wmmhello's avatar
wmmhello 已提交
908
  cfgRsp.schemaless = pDb->cfg.schemaless;
D
dapan1121 已提交
909 910 911 912 913 914

  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 已提交
915
    goto _OVER;
D
dapan1121 已提交
916 917 918 919
  }

  tSerializeSDbCfgRsp(pRsp, contLen, &cfgRsp);

S
Shengliang Guan 已提交
920 921
  pReq->info.rsp = pRsp;
  pReq->info.rspLen = contLen;
D
dapan1121 已提交
922

923 924
  code = 0;

S
Shengliang Guan 已提交
925
_OVER:
D
dapan1121 已提交
926

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

  mndReleaseDb(pMnode, pDb);

  return code;
}

S
Shengliang Guan 已提交
936 937 938 939 940 941 942 943 944 945 946 947 948 949 950
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 已提交
951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971
  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);
  }

972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989
  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 已提交
990 991 992 993 994
  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 已提交
995 996
    SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
    if (mndAddDropVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid, true) != 0) {
S
Shengliang Guan 已提交
997 998 999 1000
      return -1;
    }
  }

S
Shengliang Guan 已提交
1001 1002 1003
  return 0;
}

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

S
Shengliang Guan 已提交
1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025
  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 已提交
1026

1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038
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 已提交
1039
    pRsp = taosMemoryMalloc(rspLen);
1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052
  }

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

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

S
Shengliang Guan 已提交
1053
static int32_t mndDropDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb) {
S
Shengliang Guan 已提交
1054
  int32_t code = -1;
1055
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq);
S
Shengliang Guan 已提交
1056
  if (pTrans == NULL) goto _OVER;
S
Shengliang Guan 已提交
1057

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

S
Shengliang Guan 已提交
1061 1062
  if (mndSetDropDbRedoLogs(pMnode, pTrans, pDb) != 0) goto _OVER;
  if (mndSetDropDbCommitLogs(pMnode, pTrans, pDb) != 0) goto _OVER;
L
Liu Jicong 已提交
1063 1064 1065
  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 已提交
1066
  if (mndSetDropDbRedoActions(pMnode, pTrans, pDb) != 0) goto _OVER;
S
Shengliang Guan 已提交
1067

1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078
  SUserObj *pUser = mndAcquireUser(pMnode, pDb->createUser);
  if (pUser != NULL) {
    pUser->authVersion++;
    SSdbRaw *pCommitRaw = mndUserActionEncode(pUser);
    if (pCommitRaw == NULL || mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
      mError("trans:%d, failed to append redo log since %s", pTrans->id, terrstr());
      goto _OVER;
    }
    sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY);
  }

1079 1080
  int32_t rspLen = 0;
  void   *pRsp = NULL;
S
Shengliang Guan 已提交
1081
  if (mndBuildDropDbRsp(pDb, &rspLen, &pRsp, false) < 0) goto _OVER;
S
Shengliang Guan 已提交
1082 1083
  mndTransSetRpcRsp(pTrans, pRsp, rspLen);

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

S
Shengliang Guan 已提交
1086 1087
  code = 0;

S
Shengliang Guan 已提交
1088
_OVER:
S
Shengliang Guan 已提交
1089
  mndTransDrop(pTrans);
S
Shengliang Guan 已提交
1090
  return code;
S
Shengliang Guan 已提交
1091 1092
}

S
Shengliang Guan 已提交
1093 1094
static int32_t mndProcessDropDbReq(SRpcMsg *pReq) {
  SMnode    *pMnode = pReq->info.node;
S
Shengliang Guan 已提交
1095 1096 1097 1098 1099
  int32_t    code = -1;
  SDbObj    *pDb = NULL;
  SUserObj  *pUser = NULL;
  SDropDbReq dropReq = {0};

S
Shengliang Guan 已提交
1100
  if (tDeserializeSDropDbReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
S
Shengliang Guan 已提交
1101
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
1102
    goto _OVER;
S
Shengliang Guan 已提交
1103
  }
S
Shengliang Guan 已提交
1104

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

S
Shengliang Guan 已提交
1107
  pDb = mndAcquireDb(pMnode, dropReq.db);
S
Shengliang Guan 已提交
1108
  if (pDb == NULL) {
S
Shengliang Guan 已提交
1109
    if (dropReq.ignoreNotExists) {
S
Shengliang Guan 已提交
1110
      code = mndBuildDropDbRsp(pDb, &pReq->info.rspLen, &pReq->info.rsp, true);
S
Shengliang Guan 已提交
1111
      goto _OVER;
S
Shengliang Guan 已提交
1112 1113
    } else {
      terrno = TSDB_CODE_MND_DB_NOT_EXIST;
S
Shengliang Guan 已提交
1114
      goto _OVER;
S
Shengliang Guan 已提交
1115 1116 1117
    }
  }

S
Shengliang Guan 已提交
1118
  pUser = mndAcquireUser(pMnode, pReq->conn.user);
S
Shengliang Guan 已提交
1119
  if (pUser == NULL) {
S
Shengliang Guan 已提交
1120
    goto _OVER;
S
Shengliang Guan 已提交
1121
  }
S
Shengliang Guan 已提交
1122

S
Shengliang Guan 已提交
1123 1124
  if (mndCheckAlterDropCompactDbAuth(pUser, pDb) != 0) {
    goto _OVER;
S
Shengliang Guan 已提交
1125 1126
  }

S
Shengliang Guan 已提交
1127
  code = mndDropDb(pMnode, pReq, pDb);
S
Shengliang Guan 已提交
1128
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
S
Shengliang Guan 已提交
1129

S
Shengliang Guan 已提交
1130
_OVER:
S
Shengliang Guan 已提交
1131
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
S
Shengliang Guan 已提交
1132 1133 1134 1135 1136 1137 1138
    mError("db:%s, failed to drop since %s", dropReq.db, terrstr());
  }

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

  return code;
S
Shengliang Guan 已提交
1139
}
S
Shengliang Guan 已提交
1140

S
Shengliang Guan 已提交
1141 1142
static int32_t mndGetDBTableNum(SDbObj *pDb, SMnode *pMnode) {
  int32_t numOfTables = 0;
D
dapan1121 已提交
1143 1144 1145 1146 1147 1148 1149 1150 1151 1152
  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 已提交
1153
      numOfTables += pVgroup->numOfTables / TSDB_TABLE_NUM_UNIT;
D
dapan1121 已提交
1154 1155 1156 1157 1158 1159 1160
      vindex++;
    }

    sdbRelease(pSdb, pVgroup);
  }

  sdbCancelFetch(pSdb, pIter);
S
Shengliang Guan 已提交
1161
  return numOfTables;
D
dapan1121 已提交
1162 1163
}

S
Shengliang Guan 已提交
1164
static void mndBuildDBVgroupInfo(SDbObj *pDb, SMnode *pMnode, SArray *pVgList) {
D
dapan1121 已提交
1165
  int32_t vindex = 0;
S
Shengliang Guan 已提交
1166
  SSdb   *pSdb = pMnode->pSdb;
D
dapan1121 已提交
1167 1168

  void *pIter = NULL;
1169
  while (1) {
D
dapan1121 已提交
1170 1171 1172 1173
    SVgObj *pVgroup = NULL;
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
    if (pIter == NULL) break;

S
Shengliang Guan 已提交
1174
    if ((NULL == pDb || pVgroup->dbUid == pDb->uid) && !pVgroup->isTsma) {
S
Shengliang Guan 已提交
1175 1176 1177 1178
      SVgroupInfo vgInfo = {0};
      vgInfo.vgId = pVgroup->vgId;
      vgInfo.hashBegin = pVgroup->hashBegin;
      vgInfo.hashEnd = pVgroup->hashEnd;
D
dapan1121 已提交
1179
      vgInfo.numOfTable = pVgroup->numOfTables / TSDB_TABLE_NUM_UNIT;
L
Liu Jicong 已提交
1180
      vgInfo.epSet.numOfEps = pVgroup->replica;
D
dapan1121 已提交
1181
      for (int32_t gid = 0; gid < pVgroup->replica; ++gid) {
S
Shengliang Guan 已提交
1182
        SVnodeGid *pVgid = &pVgroup->vnodeGid[gid];
L
Liu Jicong 已提交
1183
        SEp       *pEp = &vgInfo.epSet.eps[gid];
S
Shengliang Guan 已提交
1184
        SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
D
dapan1121 已提交
1185
        if (pDnode != NULL) {
1186
          memcpy(pEp->fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
S
Shengliang Guan 已提交
1187
          pEp->port = pDnode->port;
D
dapan1121 已提交
1188 1189 1190
        }
        mndReleaseDnode(pMnode, pDnode);
        if (pVgid->role == TAOS_SYNC_STATE_LEADER) {
L
Liu Jicong 已提交
1191
          vgInfo.epSet.inUse = gid;
D
dapan1121 已提交
1192 1193 1194
        }
      }
      vindex++;
S
Shengliang Guan 已提交
1195
      taosArrayPush(pVgList, &vgInfo);
D
dapan1121 已提交
1196 1197 1198
    }

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

D
dapan1121 已提交
1200 1201 1202
    if (pDb && (vindex >= pDb->cfg.numOfVgroups)) {
      break;
    }
D
dapan1121 已提交
1203
  }
S
Shengliang Guan 已提交
1204 1205

  sdbCancelFetch(pSdb, pIter);
D
dapan1121 已提交
1206 1207
}

L
Liu Jicong 已提交
1208 1209 1210 1211 1212 1213 1214
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 已提交
1215
  int32_t numOfTable = mndGetDBTableNum(pDb, pMnode);
L
Liu Jicong 已提交
1216 1217 1218 1219 1220 1221 1222 1223 1224

  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 已提交
1225
  pRsp->hashMethod = pDb->cfg.hashMethod;
L
Liu Jicong 已提交
1226 1227 1228
  return 0;
}

S
Shengliang Guan 已提交
1229 1230
static int32_t mndProcessUseDbReq(SRpcMsg *pReq) {
  SMnode   *pMnode = pReq->info.node;
S
Shengliang Guan 已提交
1231 1232 1233 1234 1235 1236
  int32_t   code = -1;
  SDbObj   *pDb = NULL;
  SUserObj *pUser = NULL;
  SUseDbReq usedbReq = {0};
  SUseDbRsp usedbRsp = {0};

S
Shengliang Guan 已提交
1237
  if (tDeserializeSUseDbReq(pReq->pCont, pReq->contLen, &usedbReq) != 0) {
S
Shengliang Guan 已提交
1238
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
1239
    goto _OVER;
S
Shengliang Guan 已提交
1240
  }
S
Shengliang Guan 已提交
1241

D
dapan1121 已提交
1242
  char *p = strchr(usedbReq.db, '.');
1243
  if (p && ((0 == strcmp(p + 1, TSDB_INFORMATION_SCHEMA_DB) || (0 == strcmp(p + 1, TSDB_PERFORMANCE_SCHEMA_DB))))) {
D
dapan1121 已提交
1244
    memcpy(usedbRsp.db, usedbReq.db, TSDB_DB_FNAME_LEN);
1245
    int32_t vgVersion = mndGetGlobalVgroupVersion(pMnode);
D
dapan1121 已提交
1246 1247 1248 1249
    if (usedbReq.vgVersion < vgVersion) {
      usedbRsp.pVgroupInfos = taosArrayInit(10, sizeof(SVgroupInfo));
      if (usedbRsp.pVgroupInfos == NULL) {
        terrno = TSDB_CODE_OUT_OF_MEMORY;
S
Shengliang Guan 已提交
1250
        goto _OVER;
D
dapan1121 已提交
1251
      }
L
Liu Jicong 已提交
1252

D
dapan1121 已提交
1253
      mndBuildDBVgroupInfo(NULL, pMnode, usedbRsp.pVgroupInfos);
D
dapan1121 已提交
1254
      usedbRsp.vgVersion = vgVersion++;
D
dapan1121 已提交
1255 1256 1257
    } else {
      usedbRsp.vgVersion = usedbReq.vgVersion;
    }
L
Liu Jicong 已提交
1258
    usedbRsp.vgNum = taosArrayGetSize(usedbRsp.pVgroupInfos);
D
dapan1121 已提交
1259
    code = 0;
D
dapan1121 已提交
1260 1261

    // no jump, need to construct rsp
D
dapan1121 已提交
1262 1263 1264 1265
  } else {
    pDb = mndAcquireDb(pMnode, usedbReq.db);
    if (pDb == NULL) {
      terrno = TSDB_CODE_MND_DB_NOT_EXIST;
S
Shengliang Guan 已提交
1266

X
Xiaoyu Wang 已提交
1267 1268 1269
      memcpy(usedbRsp.db, usedbReq.db, TSDB_DB_FNAME_LEN);
      usedbRsp.uid = usedbReq.dbId;
      usedbRsp.vgVersion = usedbReq.vgVersion;
S
Shengliang Guan 已提交
1270

X
Xiaoyu Wang 已提交
1271 1272
      mError("db:%s, failed to process use db req since %s", usedbReq.db, terrstr());
    } else {
S
Shengliang Guan 已提交
1273
      pUser = mndAcquireUser(pMnode, pReq->conn.user);
X
Xiaoyu Wang 已提交
1274
      if (pUser == NULL) {
S
Shengliang Guan 已提交
1275
        goto _OVER;
X
Xiaoyu Wang 已提交
1276
      }
S
Shengliang Guan 已提交
1277

X
Xiaoyu Wang 已提交
1278
      if (mndCheckUseDbAuth(pUser, pDb) != 0) {
S
Shengliang Guan 已提交
1279
        goto _OVER;
X
Xiaoyu Wang 已提交
1280
      }
S
Shengliang Guan 已提交
1281

L
Liu Jicong 已提交
1282
      if (mndExtractDbInfo(pMnode, pDb, &usedbRsp, &usedbReq) < 0) {
S
Shengliang Guan 已提交
1283
        goto _OVER;
X
Xiaoyu Wang 已提交
1284 1285 1286 1287
      }

      code = 0;
    }
D
dapan1121 已提交
1288
  }
S
Shengliang Guan 已提交
1289

S
Shengliang Guan 已提交
1290 1291 1292 1293
  int32_t contLen = tSerializeSUseDbRsp(NULL, 0, &usedbRsp);
  void   *pRsp = rpcMallocCont(contLen);
  if (pRsp == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
X
Xiaoyu Wang 已提交
1294
    code = -1;
S
Shengliang Guan 已提交
1295
    goto _OVER;
S
Shengliang Guan 已提交
1296 1297
  }

S
Shengliang Guan 已提交
1298
  tSerializeSUseDbRsp(pRsp, contLen, &usedbRsp);
S
Shengliang Guan 已提交
1299

S
Shengliang Guan 已提交
1300 1301
  pReq->info.rsp = pRsp;
  pReq->info.rspLen = contLen;
S
Shengliang Guan 已提交
1302

S
Shengliang Guan 已提交
1303
_OVER:
S
Shengliang Guan 已提交
1304 1305 1306
  if (code != 0) {
    mError("db:%s, failed to process use db req since %s", usedbReq.db, terrstr());
  }
D
dapan1121 已提交
1307

S
Shengliang Guan 已提交
1308 1309 1310
  mndReleaseDb(pMnode, pDb);
  mndReleaseUser(pMnode, pUser);
  tFreeSUsedbRsp(&usedbRsp);
D
dapan1121 已提交
1311

S
Shengliang Guan 已提交
1312 1313
  return code;
}
S
Shengliang Guan 已提交
1314

S
Shengliang Guan 已提交
1315 1316 1317 1318 1319 1320 1321
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 已提交
1322

S
Shengliang Guan 已提交
1323 1324 1325 1326
  for (int32_t i = 0; i < numOfDbs; ++i) {
    SDbVgVersion *pDbVgVersion = &pDbs[i];
    pDbVgVersion->dbId = htobe64(pDbVgVersion->dbId);
    pDbVgVersion->vgVersion = htonl(pDbVgVersion->vgVersion);
D
dapan1121 已提交
1327
    pDbVgVersion->numOfTable = htonl(pDbVgVersion->numOfTable);
D
dapan1121 已提交
1328

S
Shengliang Guan 已提交
1329 1330
    SUseDbRsp usedbRsp = {0};

S
Shengliang Guan 已提交
1331
    SDbObj *pDb = mndAcquireDb(pMnode, pDbVgVersion->dbFName);
S
Shengliang Guan 已提交
1332
    if (pDb == NULL) {
1333
      mTrace("db:%s, no exist", pDbVgVersion->dbFName);
S
Shengliang Guan 已提交
1334 1335 1336 1337
      memcpy(usedbRsp.db, pDbVgVersion->dbFName, TSDB_DB_FNAME_LEN);
      usedbRsp.uid = pDbVgVersion->dbId;
      usedbRsp.vgVersion = -1;
      taosArrayPush(batchUseRsp.pArray, &usedbRsp);
D
dapan1121 已提交
1338
      continue;
D
dapan1121 已提交
1339
    }
S
Shengliang Guan 已提交
1340

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

D
dapan1121 已提交
1343 1344
    if (pDbVgVersion->vgVersion >= pDb->vgVersion && numOfTable == pDbVgVersion->numOfTable) {
      mDebug("db:%s, version & numOfTable not changed", pDbVgVersion->dbFName);
S
Shengliang Guan 已提交
1345
      mndReleaseDb(pMnode, pDb);
D
dapan1121 已提交
1346
      continue;
1347 1348 1349
    } else {
      mDebug("db:%s, vgroup version changed from %d to %d", pDbVgVersion->dbFName, pDbVgVersion->vgVersion,
             pDb->vgVersion);
D
dapan1121 已提交
1350
    }
L
Liu Jicong 已提交
1351

D
dapan1121 已提交
1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363
    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 已提交
1364
    usedbRsp.hashMethod = pDb->cfg.hashMethod;
D
dapan1121 已提交
1365 1366 1367

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

S
Shengliang Guan 已提交
1370
  int32_t rspLen = tSerializeSUseDbBatchRsp(NULL, 0, &batchUseRsp);
wafwerar's avatar
wafwerar 已提交
1371
  void   *pRsp = taosMemoryMalloc(rspLen);
S
Shengliang Guan 已提交
1372 1373 1374 1375
  if (pRsp == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    tFreeSUseDbBatchRsp(&batchUseRsp);
    return -1;
D
dapan1121 已提交
1376
  }
S
Shengliang Guan 已提交
1377
  tSerializeSUseDbBatchRsp(pRsp, rspLen, &batchUseRsp);
D
dapan1121 已提交
1378

S
Shengliang Guan 已提交
1379 1380 1381 1382
  *ppRsp = pRsp;
  *pRspLen = rspLen;

  tFreeSUseDbBatchRsp(&batchUseRsp);
D
dapan1121 已提交
1383 1384 1385
  return 0;
}

S
Shengliang Guan 已提交
1386 1387
static int32_t mndProcessCompactDbReq(SRpcMsg *pReq) {
  SMnode       *pMnode = pReq->info.node;
S
Shengliang Guan 已提交
1388 1389 1390 1391 1392
  int32_t       code = -1;
  SDbObj       *pDb = NULL;
  SUserObj     *pUser = NULL;
  SCompactDbReq compactReq = {0};

S
Shengliang Guan 已提交
1393
  if (tDeserializeSCompactDbReq(pReq->pCont, pReq->contLen, &compactReq) != 0) {
S
Shengliang Guan 已提交
1394
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
1395
    goto _OVER;
S
Shengliang Guan 已提交
1396 1397 1398 1399 1400
  }

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

  pDb = mndAcquireDb(pMnode, compactReq.db);
S
Shengliang Guan 已提交
1401
  if (pDb == NULL) {
S
Shengliang Guan 已提交
1402
    goto _OVER;
S
Shengliang Guan 已提交
1403 1404
  }

S
Shengliang Guan 已提交
1405
  pUser = mndAcquireUser(pMnode, pReq->conn.user);
S
Shengliang Guan 已提交
1406
  if (pUser == NULL) {
S
Shengliang Guan 已提交
1407
    goto _OVER;
S
Shengliang Guan 已提交
1408 1409
  }

S
Shengliang Guan 已提交
1410 1411
  if (mndCheckAlterDropCompactDbAuth(pUser, pDb) != 0) {
    goto _OVER;
S
Shengliang Guan 已提交
1412 1413
  }

S
Shengliang Guan 已提交
1414
  // code = mndCompactDb();
S
Shengliang Guan 已提交
1415

S
Shengliang Guan 已提交
1416
_OVER:
S
Shengliang Guan 已提交
1417 1418
  if (code != 0) {
    mError("db:%s, failed to process compact db req since %s", compactReq.db, terrstr());
S
Shengliang Guan 已提交
1419
  }
S
Shengliang Guan 已提交
1420 1421

  mndReleaseDb(pMnode, pDb);
S
Shengliang Guan 已提交
1422 1423 1424
  mndReleaseUser(pMnode, pUser);

  return code;
S
Shengliang Guan 已提交
1425
}
S
Shengliang Guan 已提交
1426

S
Shengliang Guan 已提交
1427
const char *mndGetDbStr(const char *src) {
S
Shengliang Guan 已提交
1428 1429
  char *pos = strstr(src, TS_PATH_DELIMITER);
  if (pos != NULL) ++pos;
S
Shengliang Guan 已提交
1430
  if (pos == NULL) return src;
S
Shengliang Guan 已提交
1431 1432 1433
  return pos;
}

S
Shengliang Guan 已提交
1434 1435
static void dumpDbInfoData(SSDataBlock *pBlock, SDbObj *pDb, SShowObj *pShow, int32_t rows, int64_t numOfTables,
                           bool sysDb) {
S
Shengliang Guan 已提交
1436 1437
  int32_t cols = 0;

L
Liu Jicong 已提交
1438
  int32_t     bytes = pShow->pMeta->pSchemas[cols].bytes;
1439
  char       *buf = taosMemoryMalloc(bytes);
S
Shengliang Guan 已提交
1440
  const char *name = mndGetDbStr(pDb->name);
H
Haojun Liao 已提交
1441
  if (name != NULL) {
1442
    STR_WITH_MAXSIZE_TO_VARSTR(buf, name, bytes);
H
Haojun Liao 已提交
1443
  } else {
1444
    STR_WITH_MAXSIZE_TO_VARSTR(buf, "NULL", bytes);
H
Haojun Liao 已提交
1445
  }
S
Shengliang Guan 已提交
1446

1447
  char *status = "ready";
S
Shengliang Guan 已提交
1448 1449
  char  statusB[24] = {0};
  STR_WITH_SIZE_TO_VARSTR(statusB, status, strlen(status));
S
Shengliang Guan 已提交
1450

1451
  if (sysDb) {
S
Shengliang Guan 已提交
1452 1453
    for (int32_t i = 0; i < pShow->numOfColumns; ++i) {
      SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, i);
1454 1455 1456 1457 1458
      if (i == 0) {
        colDataAppend(pColInfo, rows, buf, false);
      } else if (i == 3) {
        colDataAppend(pColInfo, rows, (const char *)&numOfTables, false);
      } else if (i == 20) {
S
Shengliang Guan 已提交
1459
        colDataAppend(pColInfo, rows, statusB, false);
1460 1461 1462 1463 1464 1465 1466 1467
      } else {
        colDataAppendNULL(pColInfo, rows);
      }
    }
  } else {
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, buf, false);
    taosMemoryFree(buf);
S
Shengliang Guan 已提交
1468

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

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

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

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

S
Shengliang Guan 已提交
1481
    const char *src = pDb->cfg.strict ? "strict" : "nostrict";
S
Shengliang Guan 已提交
1482 1483
    char        strict[24] = {0};
    STR_WITH_SIZE_TO_VARSTR(strict, src, strlen(src));
1484
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
S
Shengliang Guan 已提交
1485
    colDataAppend(pColInfo, rows, (const char *)strict, false);
S
Shengliang Guan 已提交
1486

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

1490 1491 1492 1493 1494 1495 1496 1497 1498
    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);
    }
1499

1500 1501 1502
    varDataSetLen(tmp, len);
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, (const char *)tmp, false);
S
Shengliang Guan 已提交
1503

1504
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
S
Shengliang Guan 已提交
1505 1506 1507 1508
    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 已提交
1509

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

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

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

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

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

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

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

1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545
    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 已提交
1546

1547 1548 1549 1550
    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 已提交
1551

1552
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1553
    colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.numOfStables, false);
1554

wmmhello's avatar
wmmhello 已提交
1555
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
S
Shengliang Guan 已提交
1556
    colDataAppend(pColInfo, rows, (const char *)statusB, false);
wmmhello's avatar
wmmhello 已提交
1557

1558 1559
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
    colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.schemaless, false);
1560
  }
H
Haojun Liao 已提交
1561 1562
}

L
Liu Jicong 已提交
1563
static void setInformationSchemaDbCfg(SDbObj *pDbObj) {
H
Haojun Liao 已提交
1564 1565 1566
  ASSERT(pDbObj != NULL);
  strncpy(pDbObj->name, TSDB_INFORMATION_SCHEMA_DB, tListLen(pDbObj->name));

L
Liu Jicong 已提交
1567
  pDbObj->createdTime = 0;
H
Haojun Liao 已提交
1568
  pDbObj->cfg.numOfVgroups = 0;
S
Shengliang Guan 已提交
1569
  pDbObj->cfg.strict = 1;
H
Haojun Liao 已提交
1570
  pDbObj->cfg.replications = 1;
L
Liu Jicong 已提交
1571
  pDbObj->cfg.precision = TSDB_TIME_PRECISION_MILLI;
H
Haojun Liao 已提交
1572 1573
}

S
Shengliang Guan 已提交
1574
static void setPerfSchemaDbCfg(SDbObj *pDbObj) {
1575 1576 1577 1578 1579
  ASSERT(pDbObj != NULL);
  strncpy(pDbObj->name, TSDB_PERFORMANCE_SCHEMA_DB, tListLen(pDbObj->name));

  pDbObj->createdTime = 0;
  pDbObj->cfg.numOfVgroups = 0;
S
Shengliang Guan 已提交
1580
  pDbObj->cfg.strict = 1;
1581 1582 1583 1584
  pDbObj->cfg.replications = 1;
  pDbObj->cfg.precision = TSDB_TIME_PRECISION_MILLI;
}

1585 1586 1587 1588 1589 1590 1591
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 已提交
1592 1593
static int32_t mndRetrieveDbs(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rowsCapacity) {
  SMnode *pMnode = pReq->info.node;
H
Haojun Liao 已提交
1594 1595 1596 1597
  SSdb   *pSdb = pMnode->pSdb;
  int32_t numOfRows = 0;
  SDbObj *pDb = NULL;

1598 1599 1600 1601
  // Append the information_schema database into the result.
  if (!pShow->sysDbRsp) {
    SDbObj infoschemaDb = {0};
    setInformationSchemaDbCfg(&infoschemaDb);
1602
    dumpDbInfoData(pBlock, &infoschemaDb, pShow, numOfRows, 14, true);
1603 1604 1605 1606 1607

    numOfRows += 1;

    SDbObj perfschemaDb = {0};
    setPerfSchemaDbCfg(&perfschemaDb);
1608
    dumpDbInfoData(pBlock, &perfschemaDb, pShow, numOfRows, 3, true);
1609 1610 1611 1612 1613

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

H
Haojun Liao 已提交
1614 1615 1616 1617
  while (numOfRows < rowsCapacity) {
    pShow->pIter = sdbFetch(pSdb, SDB_DB, pShow->pIter, (void **)&pDb);
    if (pShow->pIter == NULL) {
      break;
S
Shengliang Guan 已提交
1618 1619
    }

1620 1621 1622
    int32_t numOfTables = 0;
    sdbTraverse(pSdb, SDB_VGROUP, mndGetTablesOfDbFp, &numOfTables, NULL, NULL);

1623
    dumpDbInfoData(pBlock, pDb, pShow, numOfRows, numOfTables, false);
S
Shengliang Guan 已提交
1624 1625 1626 1627
    numOfRows++;
    sdbRelease(pSdb, pDb);
  }

1628
  pShow->numOfRows += numOfRows;
S
Shengliang Guan 已提交
1629 1630 1631 1632 1633 1634

  return numOfRows;
}

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