mndDb.c 53.0 KB
Newer Older
H
refact  
Hongze Cheng 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
 *
 * This program is free software: you can use, redistribute, and/or modify
 * it under the terms of the GNU Affero General Public License, version 3
 * or later ("AGPL"), as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

S
Shengliang Guan 已提交
16
#define _DEFAULT_SOURCE
S
Shengliang Guan 已提交
17
#include "mndDb.h"
S
Shengliang Guan 已提交
18
#include "mndAuth.h"
S
Shengliang Guan 已提交
19
#include "mndDnode.h"
S
Shengliang Guan 已提交
20
#include "mndShow.h"
S
Shengliang Guan 已提交
21
#include "mndSma.h"
22
#include "mndStb.h"
S
Shengliang Guan 已提交
23
#include "mndTrans.h"
S
Shengliang Guan 已提交
24
#include "mndUser.h"
25
#include "mndVgroup.h"
S
Shengliang Guan 已提交
26

S
Shengliang Guan 已提交
27 28
#define DB_VER_NUMBER   1
#define DB_RESERVE_SIZE 64
S
Shengliang Guan 已提交
29 30 31 32 33

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 已提交
34
static int32_t  mndDbActionUpdate(SSdb *pSdb, SDbObj *pOld, SDbObj *pNew);
S
Shengliang Guan 已提交
35 36 37 38 39
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 已提交
40
static int32_t  mndRetrieveDbs(SNodeMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rowsCapacity);
S
Shengliang Guan 已提交
41
static void     mndCancelGetNextDb(SMnode *pMnode, void *pIter);
D
dapan1121 已提交
42 43
static int32_t  mndProcessGetDbCfgReq(SNodeMsg *pReq);
static int32_t  mndProcessGetIndexReq(SNodeMsg *pReq);
S
Shengliang Guan 已提交
44

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

S
Shengliang Guan 已提交
54 55 56 57 58
  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 已提交
59
  mndSetMsgHandle(pMnode, TDMT_MND_GET_DB_CFG, mndProcessGetDbCfgReq);
D
dapan1121 已提交
60
  mndSetMsgHandle(pMnode, TDMT_MND_GET_INDEX, mndProcessGetIndexReq);
S
Shengliang Guan 已提交
61 62 63 64

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

S
Shengliang Guan 已提交
65
  return sdbSetTable(pMnode->pSdb, table);
S
Shengliang Guan 已提交
66
}
S
Shengliang Guan 已提交
67

S
Shengliang Guan 已提交
68
void mndCleanupDb(SMnode *pMnode) {}
S
Shengliang Guan 已提交
69

S
Shengliang Guan 已提交
70
static SSdbRaw *mndDbActionEncode(SDbObj *pDb) {
71 72
  terrno = TSDB_CODE_OUT_OF_MEMORY;

S
Shengliang Guan 已提交
73 74 75
  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 已提交
76 77

  int32_t dataPos = 0;
S
Shengliang Guan 已提交
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
  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)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.cacheBlockSize, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.totalBlocks, _OVER)
  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.commitTime, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.fsyncPeriod, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.ttl, _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.update, _OVER)
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.cacheLastRow, _OVER)
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.streamMode, _OVER)
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.singleSTable, _OVER)
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.hashMethod, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.numOfRetensions, _OVER)
S
sma  
Shengliang Guan 已提交
109
  for (int32_t i = 0; i < pDb->cfg.numOfRetensions; ++i) {
C
Cary Xu 已提交
110
    TASSERT(taosArrayGetSize(pDb->cfg.pRetensions) == pDb->cfg.numOfRetensions);
S
sma  
Shengliang Guan 已提交
111
    SRetention *pRetension = taosArrayGet(pDb->cfg.pRetensions, i);
S
Shengliang Guan 已提交
112 113 114 115
    SDB_SET_INT32(pRaw, dataPos, pRetension->freq, _OVER)
    SDB_SET_INT32(pRaw, dataPos, pRetension->keep, _OVER)
    SDB_SET_INT8(pRaw, dataPos, pRetension->freqUnit, _OVER)
    SDB_SET_INT8(pRaw, dataPos, pRetension->keepUnit, _OVER)
S
sma  
Shengliang Guan 已提交
116 117
  }

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

  terrno = 0;

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

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

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

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

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

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

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

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

S
Shengliang Guan 已提交
198
  SDB_GET_RESERVE(pRaw, dataPos, DB_RESERVE_SIZE, _OVER)
199 200 201

  terrno = 0;

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

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

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

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

S
Shengliang Guan 已提交
224 225
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);
226 227
  taosWLockLatch(&pOld->lock);
  SArray *pOldRetensions = pOld->cfg.pRetensions;
S
Shengliang Guan 已提交
228 229 230 231
  pOld->updateTime = pNew->updateTime;
  pOld->cfgVersion = pNew->cfgVersion;
  pOld->vgVersion = pNew->vgVersion;
  memcpy(&pOld->cfg, &pNew->cfg, sizeof(SDbCfg));
232 233
  pNew->cfg.pRetensions = pOldRetensions;
  taosWUnLockLatch(&pOld->lock);
S
Shengliang Guan 已提交
234 235 236
  return 0;
}

237 238
static int32_t mndGetGlobalVgroupVersion(SMnode *pMnode) { return sdbGetTableVer(pMnode->pSdb, SDB_VGROUP); }

S
Shengliang Guan 已提交
239
SDbObj *mndAcquireDb(SMnode *pMnode, const char *db) {
S
Shengliang Guan 已提交
240 241
  SSdb   *pSdb = pMnode->pSdb;
  SDbObj *pDb = sdbAcquire(pSdb, SDB_DB, db);
S
Shengliang Guan 已提交
242
  if (pDb == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
S
Shengliang Guan 已提交
243 244 245
    terrno = TSDB_CODE_MND_DB_NOT_EXIST;
  }
  return pDb;
S
Shengliang Guan 已提交
246
}
S
Shengliang Guan 已提交
247

S
Shengliang Guan 已提交
248 249 250 251 252
void mndReleaseDb(SMnode *pMnode, SDbObj *pDb) {
  SSdb *pSdb = pMnode->pSdb;
  sdbRelease(pSdb, pDb);
}

S
Shengliang Guan 已提交
253
static int32_t mndCheckDbName(const char *dbName, SUserObj *pUser) {
S
Shengliang Guan 已提交
254 255 256 257 258 259 260 261 262 263 264 265 266 267 268
  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 已提交
269
static int32_t mndCheckDbCfg(SMnode *pMnode, SDbCfg *pCfg) {
270
  if (pCfg->numOfVgroups < TSDB_MIN_VNODES_PER_DB || pCfg->numOfVgroups > TSDB_MAX_VNODES_PER_DB) return -1;
S
Shengliang Guan 已提交
271 272 273 274 275 276
  if (pCfg->cacheBlockSize < TSDB_MIN_CACHE_BLOCK_SIZE || pCfg->cacheBlockSize > TSDB_MAX_CACHE_BLOCK_SIZE) return -1;
  if (pCfg->totalBlocks < TSDB_MIN_TOTAL_BLOCKS || pCfg->totalBlocks > TSDB_MAX_TOTAL_BLOCKS) return -1;
  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 已提交
277
  if (pCfg->daysToKeep0 < pCfg->daysPerFile) return -1;
S
Shengliang Guan 已提交
278 279
  if (pCfg->daysToKeep0 > pCfg->daysToKeep1) return -1;
  if (pCfg->daysToKeep1 > pCfg->daysToKeep2) return -1;
S
Shengliang Guan 已提交
280 281
  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 已提交
282 283 284
  if (pCfg->minRows > pCfg->maxRows) return -1;
  if (pCfg->commitTime < TSDB_MIN_COMMIT_TIME || pCfg->commitTime > TSDB_MAX_COMMIT_TIME) return -1;
  if (pCfg->fsyncPeriod < TSDB_MIN_FSYNC_PERIOD || pCfg->fsyncPeriod > TSDB_MAX_FSYNC_PERIOD) return -1;
S
Shengliang Guan 已提交
285
  if (pCfg->ttl < TSDB_MIN_DB_TTL) return -1;
S
Shengliang Guan 已提交
286 287 288
  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 已提交
289
  if (pCfg->replications < TSDB_MIN_DB_REPLICA || pCfg->replications > TSDB_MAX_DB_REPLICA) return -1;
S
Shengliang Guan 已提交
290
  if (pCfg->replications > mndGetDnodeSize(pMnode)) return -1;
291
  if (pCfg->strict < TSDB_DB_STRICT_OFF || pCfg->strict > TSDB_DB_STRICT_ON) return -1;
S
Shengliang Guan 已提交
292
  if (pCfg->strict > pCfg->replications) return -1;
S
Shengliang Guan 已提交
293 294
  if (pCfg->update < TSDB_MIN_DB_UPDATE || pCfg->update > TSDB_MAX_DB_UPDATE) return -1;
  if (pCfg->cacheLastRow < TSDB_MIN_DB_CACHE_LAST_ROW || pCfg->cacheLastRow > TSDB_MAX_DB_CACHE_LAST_ROW) return -1;
295 296
  if (pCfg->streamMode < TSDB_DB_STREAM_MODE_OFF || pCfg->streamMode > TSDB_DB_STREAM_MODE_ON) return -1;
  if (pCfg->singleSTable < TSDB_DB_SINGLE_STABLE_ON || pCfg->streamMode > TSDB_DB_SINGLE_STABLE_OFF) return -1;
S
Shengliang Guan 已提交
297
  if (pCfg->hashMethod != 1) return -1;
S
Shengliang Guan 已提交
298 299 300 301
  return TSDB_CODE_SUCCESS;
}

static void mndSetDefaultDbCfg(SDbCfg *pCfg) {
302
  if (pCfg->numOfVgroups < 0) pCfg->numOfVgroups = TSDB_DEFAULT_VN_PER_DB;
S
Shengliang Guan 已提交
303 304 305 306
  if (pCfg->cacheBlockSize < 0) pCfg->cacheBlockSize = TSDB_DEFAULT_CACHE_BLOCK_SIZE;
  if (pCfg->totalBlocks < 0) pCfg->totalBlocks = TSDB_DEFAULT_TOTAL_BLOCKS;
  if (pCfg->daysPerFile < 0) pCfg->daysPerFile = TSDB_DEFAULT_DAYS_PER_FILE;
  if (pCfg->daysToKeep0 < 0) pCfg->daysToKeep0 = TSDB_DEFAULT_KEEP;
307 308
  if (pCfg->daysToKeep1 < 0) pCfg->daysToKeep1 = pCfg->daysToKeep0;
  if (pCfg->daysToKeep2 < 0) pCfg->daysToKeep2 = pCfg->daysToKeep1;
S
Shengliang Guan 已提交
309 310
  if (pCfg->minRows < 0) pCfg->minRows = TSDB_DEFAULT_MINROWS_FBLOCK;
  if (pCfg->maxRows < 0) pCfg->maxRows = TSDB_DEFAULT_MAXROWS_FBLOCK;
S
Shengliang Guan 已提交
311 312
  if (pCfg->commitTime < 0) pCfg->commitTime = TSDB_DEFAULT_COMMIT_TIME;
  if (pCfg->fsyncPeriod < 0) pCfg->fsyncPeriod = TSDB_DEFAULT_FSYNC_PERIOD;
S
Shengliang Guan 已提交
313
  if (pCfg->ttl < 0) pCfg->ttl = TSDB_DEFAULT_DB_TTL;
S
Shengliang Guan 已提交
314 315 316
  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 已提交
317 318 319
  if (pCfg->replications < 0) pCfg->replications = TSDB_DEFAULT_DB_REPLICA;
  if (pCfg->strict < 0) pCfg->strict = TSDB_DEFAULT_DB_STRICT;
  if (pCfg->update < 0) pCfg->update = TSDB_DEFAULT_DB_UPDATE;
S
Shengliang Guan 已提交
320
  if (pCfg->cacheLastRow < 0) pCfg->cacheLastRow = TSDB_DEFAULT_CACHE_LAST_ROW;
321
  if (pCfg->streamMode < 0) pCfg->streamMode = TSDB_DEFAULT_DB_STREAM_MODE;
S
Shengliang Guan 已提交
322
  if (pCfg->singleSTable < 0) pCfg->singleSTable = TSDB_DEFAULT_DB_SINGLE_STABLE;
323
  if (pCfg->numOfRetensions < 0) pCfg->numOfRetensions = 0;
S
Shengliang Guan 已提交
324
}
S
Shengliang Guan 已提交
325

S
Shengliang Guan 已提交
326
static int32_t mndSetCreateDbRedoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
S
Shengliang Guan 已提交
327
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
S
Shengliang Guan 已提交
328 329 330
  if (pDbRaw == NULL) return -1;
  if (mndTransAppendRedolog(pTrans, pDbRaw) != 0) return -1;
  if (sdbSetRawStatus(pDbRaw, SDB_STATUS_CREATING) != 0) return -1;
S
Shengliang Guan 已提交
331

S
Shengliang Guan 已提交
332
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
S
Shengliang Guan 已提交
333
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
S
Shengliang Guan 已提交
334 335 336
    if (pVgRaw == NULL) return -1;
    if (mndTransAppendRedolog(pTrans, pVgRaw) != 0) return -1;
    if (sdbSetRawStatus(pVgRaw, SDB_STATUS_CREATING) != 0) return -1;
S
Shengliang Guan 已提交
337 338 339 340 341
  }

  return 0;
}

S
Shengliang Guan 已提交
342
static int32_t mndSetCreateDbUndoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
S
Shengliang Guan 已提交
343
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
S
Shengliang Guan 已提交
344 345 346
  if (pDbRaw == NULL) return -1;
  if (mndTransAppendUndolog(pTrans, pDbRaw) != 0) return -1;
  if (sdbSetRawStatus(pDbRaw, SDB_STATUS_DROPPED) != 0) return -1;
S
Shengliang Guan 已提交
347

S
Shengliang Guan 已提交
348
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
S
Shengliang Guan 已提交
349
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
S
Shengliang Guan 已提交
350 351 352
    if (pVgRaw == NULL) return -1;
    if (mndTransAppendUndolog(pTrans, pVgRaw) != 0) return -1;
    if (sdbSetRawStatus(pVgRaw, SDB_STATUS_DROPPED) != 0) return -1;
S
Shengliang Guan 已提交
353 354 355 356 357
  }

  return 0;
}

S
Shengliang Guan 已提交
358
static int32_t mndSetCreateDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
S
Shengliang Guan 已提交
359
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
S
Shengliang Guan 已提交
360 361 362
  if (pDbRaw == NULL) return -1;
  if (mndTransAppendCommitlog(pTrans, pDbRaw) != 0) return -1;
  if (sdbSetRawStatus(pDbRaw, SDB_STATUS_READY) != 0) return -1;
S
Shengliang Guan 已提交
363

S
Shengliang Guan 已提交
364
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
S
Shengliang Guan 已提交
365
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
S
Shengliang Guan 已提交
366 367 368
    if (pVgRaw == NULL) return -1;
    if (mndTransAppendCommitlog(pTrans, pVgRaw) != 0) return -1;
    if (sdbSetRawStatus(pVgRaw, SDB_STATUS_READY) != 0) return -1;
S
Shengliang Guan 已提交
369 370 371 372 373
  }

  return 0;
}

S
Shengliang Guan 已提交
374 375
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 已提交
376
    SVgObj *pVgroup = pVgroups + vg;
S
Shengliang Guan 已提交
377 378

    for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
S
Shengliang Guan 已提交
379 380
      STransAction action = {0};
      SVnodeGid   *pVgid = pVgroup->vnodeGid + vn;
S
Shengliang Guan 已提交
381

S
Shengliang Guan 已提交
382 383 384
      SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
      if (pDnode == NULL) return -1;
      action.epSet = mndGetDnodeEpset(pDnode);
S
Shengliang Guan 已提交
385 386
      mndReleaseDnode(pMnode, pDnode);

S
Shengliang Guan 已提交
387 388
      int32_t contLen = 0;
      void   *pReq = mndBuildCreateVnodeReq(pMnode, pDnode, pDb, pVgroup, &contLen);
S
Shengliang Guan 已提交
389
      if (pReq == NULL) return -1;
S
Shengliang Guan 已提交
390

S
Shengliang Guan 已提交
391
      action.pCont = pReq;
S
Shengliang Guan 已提交
392
      action.contLen = contLen;
H
Hongze Cheng 已提交
393
      action.msgType = TDMT_DND_CREATE_VNODE;
394
      action.acceptableCode = TSDB_CODE_NODE_ALREADY_DEPLOYED;
S
Shengliang Guan 已提交
395
      if (mndTransAppendRedoAction(pTrans, &action) != 0) {
wafwerar's avatar
wafwerar 已提交
396
        taosMemoryFree(pReq);
S
Shengliang Guan 已提交
397 398 399 400 401
        return -1;
      }
    }
  }

S
Shengliang Guan 已提交
402 403 404
  return 0;
}

S
Shengliang Guan 已提交
405 406
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 已提交
407
    SVgObj *pVgroup = pVgroups + vg;
S
Shengliang Guan 已提交
408 409

    for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
S
Shengliang Guan 已提交
410 411
      STransAction action = {0};
      SVnodeGid   *pVgid = pVgroup->vnodeGid + vn;
S
Shengliang Guan 已提交
412

S
Shengliang Guan 已提交
413 414 415
      SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
      if (pDnode == NULL) return -1;
      action.epSet = mndGetDnodeEpset(pDnode);
S
Shengliang Guan 已提交
416 417
      mndReleaseDnode(pMnode, pDnode);

S
Shengliang Guan 已提交
418 419
      int32_t contLen = 0;
      void   *pReq = mndBuildDropVnodeReq(pMnode, pDnode, pDb, pVgroup, &contLen);
S
Shengliang Guan 已提交
420
      if (pReq == NULL) return -1;
S
Shengliang Guan 已提交
421

S
Shengliang Guan 已提交
422
      action.pCont = pReq;
S
Shengliang Guan 已提交
423
      action.contLen = contLen;
H
Hongze Cheng 已提交
424
      action.msgType = TDMT_DND_DROP_VNODE;
425
      action.acceptableCode = TSDB_CODE_NODE_NOT_DEPLOYED;
S
Shengliang Guan 已提交
426
      if (mndTransAppendUndoAction(pTrans, &action) != 0) {
wafwerar's avatar
wafwerar 已提交
427
        taosMemoryFree(pReq);
S
Shengliang Guan 已提交
428 429 430 431 432
        return -1;
      }
    }
  }

S
Shengliang Guan 已提交
433 434 435
  return 0;
}

S
Shengliang Guan 已提交
436
static int32_t mndCreateDb(SMnode *pMnode, SNodeMsg *pReq, SCreateDbReq *pCreate, SUserObj *pUser) {
S
Shengliang Guan 已提交
437
  SDbObj dbObj = {0};
438
  memcpy(dbObj.name, pCreate->db, TSDB_DB_FNAME_LEN);
S
Shengliang Guan 已提交
439
  memcpy(dbObj.acct, pUser->acct, TSDB_USER_LEN);
S
Shengliang Guan 已提交
440 441
  dbObj.createdTime = taosGetTimestampMs();
  dbObj.updateTime = dbObj.createdTime;
442
  dbObj.uid = mndGenerateUid(dbObj.name, TSDB_DB_FNAME_LEN);
S
Shengliang Guan 已提交
443 444
  dbObj.cfgVersion = 1;
  dbObj.vgVersion = 1;
S
Shengliang Guan 已提交
445
  memcpy(dbObj.createUser, pUser->user, TSDB_USER_LEN);
L
Liu Jicong 已提交
446 447 448 449 450 451 452 453 454 455 456
  dbObj.cfg = (SDbCfg){
      .numOfVgroups = pCreate->numOfVgroups,
      .cacheBlockSize = pCreate->cacheBlockSize,
      .totalBlocks = pCreate->totalBlocks,
      .daysPerFile = pCreate->daysPerFile,
      .daysToKeep0 = pCreate->daysToKeep0,
      .daysToKeep1 = pCreate->daysToKeep1,
      .daysToKeep2 = pCreate->daysToKeep2,
      .minRows = pCreate->minRows,
      .maxRows = pCreate->maxRows,
      .commitTime = pCreate->commitTime,
457
      .fsyncPeriod = pCreate->fsyncPeriod,
D
dapan1121 已提交
458
      .ttl = pCreate->ttl,
459
      .walLevel = pCreate->walLevel,
L
Liu Jicong 已提交
460 461 462
      .precision = pCreate->precision,
      .compression = pCreate->compression,
      .replications = pCreate->replications,
S
Shengliang Guan 已提交
463
      .strict = pCreate->strict,
L
Liu Jicong 已提交
464 465 466
      .update = pCreate->update,
      .cacheLastRow = pCreate->cacheLastRow,
      .streamMode = pCreate->streamMode,
D
dapan1121 已提交
467
      .singleSTable = pCreate->singleSTable,
S
Shengliang Guan 已提交
468
      .hashMethod = 1,
L
Liu Jicong 已提交
469
  };
S
Shengliang Guan 已提交
470

S
sma  
Shengliang Guan 已提交
471 472
  dbObj.cfg.numOfRetensions = pCreate->numOfRetensions;
  dbObj.cfg.pRetensions = pCreate->pRetensions;
473
  pCreate->pRetensions = NULL;
S
sma  
Shengliang Guan 已提交
474

S
Shengliang Guan 已提交
475 476
  mndSetDefaultDbCfg(&dbObj.cfg);

S
Shengliang Guan 已提交
477 478 479 480 481
  if (mndCheckDbName(dbObj.name, pUser) != 0) {
    mError("db:%s, failed to create since %s", pCreate->db, terrstr());
    return -1;
  }

S
Shengliang Guan 已提交
482 483
  if (mndCheckDbCfg(pMnode, &dbObj.cfg) != 0) {
    terrno = TSDB_CODE_MND_INVALID_DB_OPTION;
S
Shengliang Guan 已提交
484 485 486
    mError("db:%s, failed to create since %s", pCreate->db, terrstr());
    return -1;
  }
S
Shengliang Guan 已提交
487

S
Shengliang Guan 已提交
488 489
  SVgObj *pVgroups = NULL;
  if (mndAllocVgroup(pMnode, &dbObj, &pVgroups) != 0) {
490 491 492 493
    mError("db:%s, failed to create since %s", pCreate->db, terrstr());
    return -1;
  }

S
Shengliang Guan 已提交
494
  int32_t code = -1;
S
Shengliang Guan 已提交
495
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_TYPE_CREATE_DB, &pReq->rpcMsg);
S
Shengliang Guan 已提交
496
  if (pTrans == NULL) goto _OVER;
S
Shengliang Guan 已提交
497

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

S
Shengliang Guan 已提交
500
  mndTransSetDbInfo(pTrans, &dbObj);
S
Shengliang Guan 已提交
501 502 503 504 505 506
  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 已提交
507

S
Shengliang Guan 已提交
508 509
  code = 0;

S
Shengliang Guan 已提交
510
_OVER:
wafwerar's avatar
wafwerar 已提交
511
  taosMemoryFree(pVgroups);
S
Shengliang Guan 已提交
512
  mndTransDrop(pTrans);
S
Shengliang Guan 已提交
513
  return code;
S
Shengliang Guan 已提交
514 515
}

S
Shengliang Guan 已提交
516 517
static int32_t mndProcessCreateDbReq(SNodeMsg *pReq) {
  SMnode      *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
518 519 520 521 522 523 524
  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 已提交
525
    goto _OVER;
S
Shengliang Guan 已提交
526 527 528 529 530
  }

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

  pDb = mndAcquireDb(pMnode, createReq.db);
S
Shengliang Guan 已提交
531
  if (pDb != NULL) {
S
Shengliang Guan 已提交
532 533 534
    if (createReq.ignoreExist) {
      mDebug("db:%s, already exist, ignore exist is set", createReq.db);
      code = 0;
S
Shengliang Guan 已提交
535
      goto _OVER;
S
Shengliang Guan 已提交
536 537
    } else {
      terrno = TSDB_CODE_MND_DB_ALREADY_EXIST;
S
Shengliang Guan 已提交
538
      goto _OVER;
S
Shengliang Guan 已提交
539
    }
S
Shengliang Guan 已提交
540
  } else if (terrno != TSDB_CODE_MND_DB_NOT_EXIST) {
S
Shengliang Guan 已提交
541
    goto _OVER;
S
Shengliang Guan 已提交
542 543
  }

S
Shengliang Guan 已提交
544 545
  pUser = mndAcquireUser(pMnode, pReq->user);
  if (pUser == NULL) {
S
Shengliang Guan 已提交
546
    goto _OVER;
S
Shengliang Guan 已提交
547 548 549
  }

  if (mndCheckCreateDbAuth(pUser) != 0) {
S
Shengliang Guan 已提交
550
    goto _OVER;
S
Shengliang Guan 已提交
551 552
  }

S
Shengliang Guan 已提交
553 554
  code = mndCreateDb(pMnode, pReq, &createReq, pUser);
  if (code == 0) code = TSDB_CODE_MND_ACTION_IN_PROGRESS;
S
Shengliang Guan 已提交
555

S
Shengliang Guan 已提交
556
_OVER:
S
Shengliang Guan 已提交
557 558
  if (code != 0 && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
    mError("db:%s, failed to create since %s", createReq.db, terrstr());
S
Shengliang Guan 已提交
559 560
  }

S
Shengliang Guan 已提交
561 562
  mndReleaseDb(pMnode, pDb);
  mndReleaseUser(pMnode, pUser);
S
sma  
Shengliang Guan 已提交
563
  tFreeSCreateDbReq(&createReq);
S
Shengliang Guan 已提交
564 565

  return code;
S
Shengliang Guan 已提交
566 567
}

S
Shengliang Guan 已提交
568
static int32_t mndSetDbCfgFromAlterDbReq(SDbObj *pDb, SAlterDbReq *pAlter) {
S
Shengliang Guan 已提交
569
  terrno = TSDB_CODE_MND_DB_OPTION_UNCHANGED;
S
Shengliang Guan 已提交
570 571 572

  if (pAlter->totalBlocks >= 0 && pAlter->totalBlocks != pDb->cfg.totalBlocks) {
    pDb->cfg.totalBlocks = pAlter->totalBlocks;
S
Shengliang Guan 已提交
573
    terrno = 0;
S
Shengliang Guan 已提交
574 575 576 577
  }

  if (pAlter->daysToKeep0 >= 0 && pAlter->daysToKeep0 != pDb->cfg.daysToKeep0) {
    pDb->cfg.daysToKeep0 = pAlter->daysToKeep0;
S
Shengliang Guan 已提交
578
    terrno = 0;
S
Shengliang Guan 已提交
579 580 581 582
  }

  if (pAlter->daysToKeep1 >= 0 && pAlter->daysToKeep1 != pDb->cfg.daysToKeep1) {
    pDb->cfg.daysToKeep1 = pAlter->daysToKeep1;
S
Shengliang Guan 已提交
583
    terrno = 0;
S
Shengliang Guan 已提交
584 585 586 587
  }

  if (pAlter->daysToKeep2 >= 0 && pAlter->daysToKeep2 != pDb->cfg.daysToKeep2) {
    pDb->cfg.daysToKeep2 = pAlter->daysToKeep2;
S
Shengliang Guan 已提交
588
    terrno = 0;
S
Shengliang Guan 已提交
589 590 591 592
  }

  if (pAlter->fsyncPeriod >= 0 && pAlter->fsyncPeriod != pDb->cfg.fsyncPeriod) {
    pDb->cfg.fsyncPeriod = pAlter->fsyncPeriod;
S
Shengliang Guan 已提交
593
    terrno = 0;
S
Shengliang Guan 已提交
594 595 596 597
  }

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

S
Shengliang Guan 已提交
601 602
  if (pAlter->strict >= 0 && pAlter->strict != pDb->cfg.strict) {
    pDb->cfg.strict = pAlter->strict;
S
Shengliang Guan 已提交
603
    terrno = 0;
S
Shengliang Guan 已提交
604 605 606 607
  }

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

S
Shengliang Guan 已提交
611 612 613 614 615
  if (pAlter->replications >= 0 && pAlter->replications != pDb->cfg.replications) {
    pDb->cfg.replications = pAlter->replications;
    terrno = 0;
  }

S
Shengliang Guan 已提交
616 617 618
  return terrno;
}

S
Shengliang Guan 已提交
619
static int32_t mndSetAlterDbRedoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
S
Shengliang Guan 已提交
620
  SSdbRaw *pRedoRaw = mndDbActionEncode(pOld);
S
Shengliang Guan 已提交
621 622
  if (pRedoRaw == NULL) return -1;
  if (mndTransAppendRedolog(pTrans, pRedoRaw) != 0) return -1;
623
  if (sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY) != 0) return -1;
S
Shengliang Guan 已提交
624 625 626 627

  return 0;
}

S
Shengliang Guan 已提交
628
static int32_t mndSetAlterDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
S
Shengliang Guan 已提交
629
  SSdbRaw *pCommitRaw = mndDbActionEncode(pNew);
S
Shengliang Guan 已提交
630 631 632
  if (pCommitRaw == NULL) return -1;
  if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) return -1;
  if (sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY) != 0) return -1;
S
Shengliang Guan 已提交
633 634 635 636

  return 0;
}

S
Shengliang Guan 已提交
637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677
void *mndBuildAlterVnodeReq(SMnode *pMnode, SDnodeObj *pDnode, SDbObj *pDb, SVgObj *pVgroup, int32_t *pContLen) {
  SAlterVnodeReq alterReq = {0};
  alterReq.vgVersion = pVgroup->version;
  alterReq.totalBlocks = pDb->cfg.totalBlocks;
  alterReq.daysToKeep0 = pDb->cfg.daysToKeep0;
  alterReq.daysToKeep1 = pDb->cfg.daysToKeep1;
  alterReq.daysToKeep2 = pDb->cfg.daysToKeep2;
  alterReq.walLevel = pDb->cfg.walLevel;
  alterReq.strict = pDb->cfg.strict;
  alterReq.cacheLastRow = pDb->cfg.cacheLastRow;
  alterReq.replica = pVgroup->replica;
  alterReq.selfIndex = -1;

  for (int32_t v = 0; v < pVgroup->replica; ++v) {
    SReplica  *pReplica = &alterReq.replicas[v];
    SVnodeGid *pVgid = &pVgroup->vnodeGid[v];
    SDnodeObj *pVgidDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
    if (pVgidDnode == NULL) {
      return NULL;
    }

    pReplica->id = pVgidDnode->id;
    pReplica->port = pVgidDnode->port;
    memcpy(pReplica->fqdn, pVgidDnode->fqdn, TSDB_FQDN_LEN);
    mndReleaseDnode(pMnode, pVgidDnode);

    if (pDnode->id == pVgid->dnodeId) {
      alterReq.selfIndex = v;
    }
  }

  if (alterReq.selfIndex == -1) {
    terrno = TSDB_CODE_MND_APP_ERROR;
    return NULL;
  }

  int32_t contLen = tSerializeSAlterVnodeReq(NULL, 0, &alterReq);
  if (contLen < 0) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    return NULL;
  }
S
Shengliang Guan 已提交
678
  contLen += +sizeof(SMsgHead);
S
Shengliang Guan 已提交
679 680 681 682 683 684 685

  void *pReq = taosMemoryMalloc(contLen);
  if (pReq == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    return NULL;
  }

S
Shengliang Guan 已提交
686 687 688 689 690
  SMsgHead *pHead = pReq;
  pHead->contLen = htonl(contLen);
  pHead->vgId = htonl(pVgroup->vgId);

  tSerializeSAlterVnodeReq((char *)pReq + sizeof(SMsgHead), contLen, &alterReq);
S
Shengliang Guan 已提交
691 692 693 694 695
  *pContLen = contLen;
  return pReq;
}

static int32_t mndBuilAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup) {
S
Shengliang Guan 已提交
696 697 698 699 700 701 702 703 704
  for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
    STransAction action = {0};
    SVnodeGid   *pVgid = pVgroup->vnodeGid + vn;

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

S
Shengliang Guan 已提交
705
    int32_t contLen = 0;
S
Shengliang Guan 已提交
706
    void   *pReq = mndBuildAlterVnodeReq(pMnode, pDnode, pDb, pVgroup, &contLen);
S
Shengliang Guan 已提交
707
    if (pReq == NULL) return -1;
S
Shengliang Guan 已提交
708

S
Shengliang Guan 已提交
709
    action.pCont = pReq;
S
Shengliang Guan 已提交
710
    action.contLen = contLen;
S
Shengliang Guan 已提交
711
    action.msgType = TDMT_VND_ALTER_VNODE;
S
Shengliang Guan 已提交
712
    if (mndTransAppendRedoAction(pTrans, &action) != 0) {
wafwerar's avatar
wafwerar 已提交
713
      taosMemoryFree(pReq);
S
Shengliang Guan 已提交
714 715 716
      return -1;
    }
  }
S
Shengliang Guan 已提交
717 718 719 720

  return 0;
}

S
Shengliang Guan 已提交
721
static int32_t mndSetAlterDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
S
Shengliang Guan 已提交
722 723
  SSdb *pSdb = pMnode->pSdb;
  void *pIter = NULL;
S
Shengliang Guan 已提交
724

S
Shengliang Guan 已提交
725 726 727 728
  while (1) {
    SVgObj *pVgroup = NULL;
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
    if (pIter == NULL) break;
S
Shengliang Guan 已提交
729

S
Shengliang Guan 已提交
730
    if (pVgroup->dbUid == pNew->uid) {
S
Shengliang Guan 已提交
731
      if (mndBuilAlterVgroupAction(pMnode, pTrans, pNew, pVgroup) != 0) {
S
Shengliang Guan 已提交
732 733 734 735 736 737 738 739 740 741 742
        sdbCancelFetch(pSdb, pIter);
        sdbRelease(pSdb, pVgroup);
        return -1;
      }
    }

    sdbRelease(pSdb, pVgroup);
  }

  return 0;
}
S
Shengliang Guan 已提交
743

S
Shengliang Guan 已提交
744
static int32_t mndAlterDb(SMnode *pMnode, SNodeMsg *pReq, SDbObj *pOld, SDbObj *pNew) {
S
Shengliang Guan 已提交
745
  int32_t code = -1;
S
Shengliang Guan 已提交
746
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_TYPE_ALTER_DB, &pReq->rpcMsg);
S
Shengliang Guan 已提交
747
  if (pTrans == NULL) goto UPDATE_DB_OVER;
S
Shengliang Guan 已提交
748

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

S
Shengliang Guan 已提交
751
  mndTransSetDbInfo(pTrans, pOld);
S
Shengliang Guan 已提交
752 753 754
  if (mndSetAlterDbRedoLogs(pMnode, pTrans, pOld, pNew) != 0) goto UPDATE_DB_OVER;
  if (mndSetAlterDbCommitLogs(pMnode, pTrans, pOld, pNew) != 0) goto UPDATE_DB_OVER;
  if (mndSetAlterDbRedoActions(pMnode, pTrans, pOld, pNew) != 0) goto UPDATE_DB_OVER;
S
Shengliang Guan 已提交
755
  if (mndTransPrepare(pMnode, pTrans) != 0) goto UPDATE_DB_OVER;
S
Shengliang Guan 已提交
756

S
Shengliang Guan 已提交
757 758 759
  code = 0;

UPDATE_DB_OVER:
S
Shengliang Guan 已提交
760
  mndTransDrop(pTrans);
S
Shengliang Guan 已提交
761
  return code;
S
Shengliang Guan 已提交
762 763
}

S
Shengliang Guan 已提交
764 765
static int32_t mndProcessAlterDbReq(SNodeMsg *pReq) {
  SMnode     *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
766 767 768 769 770 771 772 773 774
  int32_t     code = -1;
  SDbObj     *pDb = NULL;
  SUserObj   *pUser = NULL;
  SAlterDbReq alterReq = {0};

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

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

S
Shengliang Guan 已提交
778
  pDb = mndAcquireDb(pMnode, alterReq.db);
S
Shengliang Guan 已提交
779
  if (pDb == NULL) {
S
Shengliang Guan 已提交
780 781 782 783 784 785 786 787 788
    terrno = TSDB_CODE_MND_DB_NOT_EXIST;
    goto ALTER_DB_OVER;
  }

  pUser = mndAcquireUser(pMnode, pReq->user);
  if (pUser == NULL) {
    goto ALTER_DB_OVER;
  }

S
Shengliang Guan 已提交
789
  if (mndCheckAlterDropCompactDbAuth(pUser, pDb) != 0) {
S
Shengliang Guan 已提交
790
    goto ALTER_DB_OVER;
S
Shengliang Guan 已提交
791 792 793 794 795
  }

  SDbObj dbObj = {0};
  memcpy(&dbObj, pDb, sizeof(SDbObj));

S
Shengliang Guan 已提交
796
  code = mndSetDbCfgFromAlterDbReq(&dbObj, &alterReq);
S
Shengliang Guan 已提交
797
  if (code != 0) {
S
Shengliang Guan 已提交
798
    goto ALTER_DB_OVER;
S
Shengliang Guan 已提交
799 800
  }

S
Shengliang Guan 已提交
801 802
  dbObj.cfgVersion++;
  dbObj.updateTime = taosGetTimestampMs();
S
Shengliang Guan 已提交
803
  code = mndAlterDb(pMnode, pReq, pDb, &dbObj);
S
Shengliang Guan 已提交
804
  if (code == 0) code = TSDB_CODE_MND_ACTION_IN_PROGRESS;
S
Shengliang Guan 已提交
805

S
Shengliang Guan 已提交
806 807 808
ALTER_DB_OVER:
  if (code != 0 && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
    mError("db:%s, failed to alter since %s", alterReq.db, terrstr());
S
Shengliang Guan 已提交
809 810
  }

S
Shengliang Guan 已提交
811 812 813 814
  mndReleaseDb(pMnode, pDb);
  mndReleaseUser(pMnode, pUser);

  return code;
S
Shengliang Guan 已提交
815 816
}

D
dapan1121 已提交
817
static int32_t mndProcessGetDbCfgReq(SNodeMsg *pReq) {
S
Shengliang Guan 已提交
818 819 820 821 822
  SMnode   *pMnode = pReq->pNode;
  int32_t   code = -1;
  SDbObj   *pDb = NULL;
  SDbCfgReq cfgReq = {0};
  SDbCfgRsp cfgRsp = {0};
D
dapan1121 已提交
823 824 825 826 827 828 829 830 831 832 833 834

  if (tDeserializeSDbCfgReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &cfgReq) != 0) {
    terrno = TSDB_CODE_INVALID_MSG;
    goto GET_DB_CFG_OVER;
  }

  pDb = mndAcquireDb(pMnode, cfgReq.db);
  if (pDb == NULL) {
    terrno = TSDB_CODE_MND_DB_NOT_EXIST;
    goto GET_DB_CFG_OVER;
  }

S
Shengliang Guan 已提交
835
  cfgRsp.numOfVgroups = pDb->cfg.numOfVgroups;
D
dapan1121 已提交
836
  cfgRsp.cacheBlockSize = pDb->cfg.cacheBlockSize;
S
Shengliang Guan 已提交
837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855
  cfgRsp.totalBlocks = pDb->cfg.totalBlocks;
  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.commitTime = pDb->cfg.commitTime;
  cfgRsp.fsyncPeriod = pDb->cfg.fsyncPeriod;
  cfgRsp.ttl = pDb->cfg.ttl;
  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.update = pDb->cfg.update;
  cfgRsp.cacheLastRow = pDb->cfg.cacheLastRow;
  cfgRsp.streamMode = pDb->cfg.streamMode;
  cfgRsp.singleSTable = pDb->cfg.singleSTable;
C
Cary Xu 已提交
856 857
  cfgRsp.numOfRetensions = pDb->cfg.numOfRetensions;
  cfgRsp.pRetensions = pDb->cfg.pRetensions;
D
dapan1121 已提交
858 859 860 861 862 863 864 865 866 867 868 869 870 871

  int32_t contLen = tSerializeSDbCfgRsp(NULL, 0, &cfgRsp);
  void   *pRsp = rpcMallocCont(contLen);
  if (pRsp == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    code = -1;
    goto GET_DB_CFG_OVER;
  }

  tSerializeSDbCfgRsp(pRsp, contLen, &cfgRsp);

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

872 873
  code = 0;

D
dapan1121 已提交
874 875 876 877 878 879 880 881 882 883 884
GET_DB_CFG_OVER:

  if (code != 0 && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
    mError("db:%s, failed to get cfg since %s", cfgReq.db, terrstr());
  }

  mndReleaseDb(pMnode, pDb);

  return code;
}

S
Shengliang Guan 已提交
885 886 887 888 889 890 891 892 893 894 895 896 897 898 899
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 已提交
900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920
  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);
  }

921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938
  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 已提交
939 940 941 942 943 944
  return 0;
}

static int32_t mndBuildDropVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup) {
  for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
    STransAction action = {0};
S
Shengliang Guan 已提交
945
    SVnodeGid   *pVgid = pVgroup->vnodeGid + vn;
S
Shengliang Guan 已提交
946 947 948 949 950 951

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

S
Shengliang Guan 已提交
952 953
    int32_t contLen = 0;
    void   *pReq = mndBuildDropVnodeReq(pMnode, pDnode, pDb, pVgroup, &contLen);
S
Shengliang Guan 已提交
954
    if (pReq == NULL) return -1;
S
Shengliang Guan 已提交
955

S
Shengliang Guan 已提交
956
    action.pCont = pReq;
S
Shengliang Guan 已提交
957
    action.contLen = contLen;
H
Hongze Cheng 已提交
958
    action.msgType = TDMT_DND_DROP_VNODE;
959
    action.acceptableCode = TSDB_CODE_NODE_NOT_DEPLOYED;
S
Shengliang Guan 已提交
960
    if (mndTransAppendRedoAction(pTrans, &action) != 0) {
wafwerar's avatar
wafwerar 已提交
961
      taosMemoryFree(pReq);
S
Shengliang Guan 已提交
962 963 964 965
      return -1;
    }
  }

S
Shengliang Guan 已提交
966 967 968
  return 0;
}

S
Shengliang Guan 已提交
969 970 971
static int32_t mndSetDropDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
  SSdb *pSdb = pMnode->pSdb;
  void *pIter = NULL;
S
Shengliang Guan 已提交
972

S
Shengliang Guan 已提交
973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990
  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 已提交
991

992 993 994 995 996 997 998 999 1000 1001 1002 1003
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 已提交
1004
    pRsp = taosMemoryMalloc(rspLen);
1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
  }

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

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

S
Shengliang Guan 已提交
1018
static int32_t mndDropDb(SMnode *pMnode, SNodeMsg *pReq, SDbObj *pDb) {
S
Shengliang Guan 已提交
1019
  int32_t code = -1;
S
Shengliang Guan 已提交
1020
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_TYPE_DROP_DB, &pReq->rpcMsg);
S
Shengliang Guan 已提交
1021
  if (pTrans == NULL) goto _OVER;
S
Shengliang Guan 已提交
1022

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

S
Shengliang Guan 已提交
1026 1027 1028
  if (mndSetDropDbRedoLogs(pMnode, pTrans, pDb) != 0) goto _OVER;
  if (mndSetDropDbCommitLogs(pMnode, pTrans, pDb) != 0) goto _OVER;
  if (mndSetDropDbRedoActions(pMnode, pTrans, pDb) != 0) goto _OVER;
S
Shengliang Guan 已提交
1029

1030 1031
  int32_t rspLen = 0;
  void   *pRsp = NULL;
S
Shengliang Guan 已提交
1032
  if (mndBuildDropDbRsp(pDb, &rspLen, &pRsp, false) < 0) goto _OVER;
S
Shengliang Guan 已提交
1033 1034
  mndTransSetRpcRsp(pTrans, pRsp, rspLen);

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

S
Shengliang Guan 已提交
1037 1038
  code = 0;

S
Shengliang Guan 已提交
1039
_OVER:
S
Shengliang Guan 已提交
1040
  mndTransDrop(pTrans);
S
Shengliang Guan 已提交
1041
  return code;
S
Shengliang Guan 已提交
1042 1043
}

S
Shengliang Guan 已提交
1044 1045
static int32_t mndProcessDropDbReq(SNodeMsg *pReq) {
  SMnode    *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
1046 1047 1048 1049 1050 1051 1052
  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 已提交
1053
    goto _OVER;
S
Shengliang Guan 已提交
1054
  }
S
Shengliang Guan 已提交
1055

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

S
Shengliang Guan 已提交
1058
  pDb = mndAcquireDb(pMnode, dropReq.db);
S
Shengliang Guan 已提交
1059
  if (pDb == NULL) {
S
Shengliang Guan 已提交
1060
    if (dropReq.ignoreNotExists) {
1061
      code = mndBuildDropDbRsp(pDb, &pReq->rspLen, &pReq->pRsp, true);
S
Shengliang Guan 已提交
1062
      goto _OVER;
S
Shengliang Guan 已提交
1063 1064
    } else {
      terrno = TSDB_CODE_MND_DB_NOT_EXIST;
S
Shengliang Guan 已提交
1065
      goto _OVER;
S
Shengliang Guan 已提交
1066 1067 1068
    }
  }

S
Shengliang Guan 已提交
1069 1070
  pUser = mndAcquireUser(pMnode, pReq->user);
  if (pUser == NULL) {
S
Shengliang Guan 已提交
1071
    goto _OVER;
S
Shengliang Guan 已提交
1072
  }
S
Shengliang Guan 已提交
1073

S
Shengliang Guan 已提交
1074 1075
  if (mndCheckAlterDropCompactDbAuth(pUser, pDb) != 0) {
    goto _OVER;
S
Shengliang Guan 已提交
1076 1077
  }

S
Shengliang Guan 已提交
1078 1079 1080
  code = mndDropDb(pMnode, pReq, pDb);
  if (code == 0) code = TSDB_CODE_MND_ACTION_IN_PROGRESS;

S
Shengliang Guan 已提交
1081
_OVER:
S
Shengliang Guan 已提交
1082 1083 1084 1085 1086 1087 1088 1089
  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 已提交
1090
}
S
Shengliang Guan 已提交
1091

D
dapan1121 已提交
1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113
void mndGetDBTableNum(SDbObj *pDb, SMnode *pMnode, int32_t *num) {
  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) {
      *num += pVgroup->numOfTables / TSDB_TABLE_NUM_UNIT;

      vindex++;
    }

    sdbRelease(pSdb, pVgroup);
  }

  sdbCancelFetch(pSdb, pIter);
}

S
Shengliang Guan 已提交
1114
static void mndBuildDBVgroupInfo(SDbObj *pDb, SMnode *pMnode, SArray *pVgList) {
D
dapan1121 已提交
1115
  int32_t vindex = 0;
S
Shengliang Guan 已提交
1116
  SSdb   *pSdb = pMnode->pSdb;
D
dapan1121 已提交
1117 1118

  void *pIter = NULL;
1119
  while (1) {
D
dapan1121 已提交
1120 1121 1122 1123
    SVgObj *pVgroup = NULL;
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
    if (pIter == NULL) break;

D
dapan1121 已提交
1124
    if (NULL == pDb || pVgroup->dbUid == pDb->uid) {
S
Shengliang Guan 已提交
1125 1126 1127 1128
      SVgroupInfo vgInfo = {0};
      vgInfo.vgId = pVgroup->vgId;
      vgInfo.hashBegin = pVgroup->hashBegin;
      vgInfo.hashEnd = pVgroup->hashEnd;
D
dapan1121 已提交
1129
      vgInfo.numOfTable = pVgroup->numOfTables / TSDB_TABLE_NUM_UNIT;
L
Liu Jicong 已提交
1130
      vgInfo.epSet.numOfEps = pVgroup->replica;
D
dapan1121 已提交
1131
      for (int32_t gid = 0; gid < pVgroup->replica; ++gid) {
S
Shengliang Guan 已提交
1132
        SVnodeGid *pVgid = &pVgroup->vnodeGid[gid];
L
Liu Jicong 已提交
1133
        SEp       *pEp = &vgInfo.epSet.eps[gid];
S
Shengliang Guan 已提交
1134
        SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
D
dapan1121 已提交
1135
        if (pDnode != NULL) {
1136
          memcpy(pEp->fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
S
Shengliang Guan 已提交
1137
          pEp->port = pDnode->port;
D
dapan1121 已提交
1138 1139 1140
        }
        mndReleaseDnode(pMnode, pDnode);
        if (pVgid->role == TAOS_SYNC_STATE_LEADER) {
L
Liu Jicong 已提交
1141
          vgInfo.epSet.inUse = gid;
D
dapan1121 已提交
1142 1143 1144
        }
      }
      vindex++;
S
Shengliang Guan 已提交
1145
      taosArrayPush(pVgList, &vgInfo);
D
dapan1121 已提交
1146 1147 1148
    }

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

D
dapan1121 已提交
1150 1151 1152
    if (pDb && (vindex >= pDb->cfg.numOfVgroups)) {
      break;
    }
D
dapan1121 已提交
1153
  }
S
Shengliang Guan 已提交
1154 1155

  sdbCancelFetch(pSdb, pIter);
D
dapan1121 已提交
1156 1157
}

L
Liu Jicong 已提交
1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175
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;
  }

  int32_t numOfTable = 0;
  mndGetDBTableNum(pDb, pMnode, &numOfTable);

  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 已提交
1176
  pRsp->hashMethod = pDb->cfg.hashMethod;
L
Liu Jicong 已提交
1177 1178 1179
  return 0;
}

S
Shengliang Guan 已提交
1180 1181
static int32_t mndProcessUseDbReq(SNodeMsg *pReq) {
  SMnode   *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
1182 1183 1184 1185 1186 1187 1188 1189 1190 1191
  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;
    goto USE_DB_OVER;
  }
S
Shengliang Guan 已提交
1192

D
dapan1121 已提交
1193 1194
  char *p = strchr(usedbReq.db, '.');
  if (p && 0 == strcmp(p + 1, TSDB_INFORMATION_SCHEMA_DB)) {
D
dapan1121 已提交
1195
    memcpy(usedbRsp.db, usedbReq.db, TSDB_DB_FNAME_LEN);
1196
    int32_t vgVersion = mndGetGlobalVgroupVersion(pMnode);
D
dapan1121 已提交
1197 1198 1199 1200 1201 1202
    if (usedbReq.vgVersion < vgVersion) {
      usedbRsp.pVgroupInfos = taosArrayInit(10, sizeof(SVgroupInfo));
      if (usedbRsp.pVgroupInfos == NULL) {
        terrno = TSDB_CODE_OUT_OF_MEMORY;
        goto USE_DB_OVER;
      }
L
Liu Jicong 已提交
1203

D
dapan1121 已提交
1204
      mndBuildDBVgroupInfo(NULL, pMnode, usedbRsp.pVgroupInfos);
D
dapan1121 已提交
1205
      usedbRsp.vgVersion = vgVersion++;
L
Liu Jicong 已提交
1206

D
dapan1121 已提交
1207 1208 1209
    } else {
      usedbRsp.vgVersion = usedbReq.vgVersion;
    }
L
Liu Jicong 已提交
1210
    usedbRsp.vgNum = taosArrayGetSize(usedbRsp.pVgroupInfos);
D
dapan1121 已提交
1211
    code = 0;
D
dapan1121 已提交
1212 1213

    // no jump, need to construct rsp
D
dapan1121 已提交
1214 1215 1216 1217
  } else {
    pDb = mndAcquireDb(pMnode, usedbReq.db);
    if (pDb == NULL) {
      terrno = TSDB_CODE_MND_DB_NOT_EXIST;
S
Shengliang Guan 已提交
1218

X
Xiaoyu Wang 已提交
1219 1220 1221
      memcpy(usedbRsp.db, usedbReq.db, TSDB_DB_FNAME_LEN);
      usedbRsp.uid = usedbReq.dbId;
      usedbRsp.vgVersion = usedbReq.vgVersion;
S
Shengliang Guan 已提交
1222

X
Xiaoyu Wang 已提交
1223 1224 1225 1226 1227 1228
      mError("db:%s, failed to process use db req since %s", usedbReq.db, terrstr());
    } else {
      pUser = mndAcquireUser(pMnode, pReq->user);
      if (pUser == NULL) {
        goto USE_DB_OVER;
      }
S
Shengliang Guan 已提交
1229

X
Xiaoyu Wang 已提交
1230 1231 1232
      if (mndCheckUseDbAuth(pUser, pDb) != 0) {
        goto USE_DB_OVER;
      }
S
Shengliang Guan 已提交
1233

L
Liu Jicong 已提交
1234
      if (mndExtractDbInfo(pMnode, pDb, &usedbRsp, &usedbReq) < 0) {
X
Xiaoyu Wang 已提交
1235 1236 1237 1238 1239
        goto USE_DB_OVER;
      }

      code = 0;
    }
D
dapan1121 已提交
1240
  }
S
Shengliang Guan 已提交
1241

S
Shengliang Guan 已提交
1242 1243 1244 1245
  int32_t contLen = tSerializeSUseDbRsp(NULL, 0, &usedbRsp);
  void   *pRsp = rpcMallocCont(contLen);
  if (pRsp == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
X
Xiaoyu Wang 已提交
1246
    code = -1;
S
Shengliang Guan 已提交
1247
    goto USE_DB_OVER;
S
Shengliang Guan 已提交
1248 1249
  }

S
Shengliang Guan 已提交
1250
  tSerializeSUseDbRsp(pRsp, contLen, &usedbRsp);
S
Shengliang Guan 已提交
1251

S
Shengliang Guan 已提交
1252 1253
  pReq->pRsp = pRsp;
  pReq->rspLen = contLen;
S
Shengliang Guan 已提交
1254

S
Shengliang Guan 已提交
1255 1256 1257 1258
USE_DB_OVER:
  if (code != 0) {
    mError("db:%s, failed to process use db req since %s", usedbReq.db, terrstr());
  }
D
dapan1121 已提交
1259

S
Shengliang Guan 已提交
1260 1261 1262
  mndReleaseDb(pMnode, pDb);
  mndReleaseUser(pMnode, pUser);
  tFreeSUsedbRsp(&usedbRsp);
D
dapan1121 已提交
1263

S
Shengliang Guan 已提交
1264 1265
  return code;
}
S
Shengliang Guan 已提交
1266

S
Shengliang Guan 已提交
1267 1268 1269 1270 1271 1272 1273
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 已提交
1274

S
Shengliang Guan 已提交
1275 1276 1277 1278
  for (int32_t i = 0; i < numOfDbs; ++i) {
    SDbVgVersion *pDbVgVersion = &pDbs[i];
    pDbVgVersion->dbId = htobe64(pDbVgVersion->dbId);
    pDbVgVersion->vgVersion = htonl(pDbVgVersion->vgVersion);
D
dapan1121 已提交
1279
    pDbVgVersion->numOfTable = htonl(pDbVgVersion->numOfTable);
D
dapan1121 已提交
1280

S
Shengliang Guan 已提交
1281 1282
    SUseDbRsp usedbRsp = {0};

S
Shengliang Guan 已提交
1283
    SDbObj *pDb = mndAcquireDb(pMnode, pDbVgVersion->dbFName);
S
Shengliang Guan 已提交
1284 1285 1286 1287 1288 1289
    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 已提交
1290
      continue;
D
dapan1121 已提交
1291
    }
S
Shengliang Guan 已提交
1292

D
dapan1121 已提交
1293 1294
    int32_t numOfTable = 0;
    mndGetDBTableNum(pDb, pMnode, &numOfTable);
S
Shengliang Guan 已提交
1295

D
dapan1121 已提交
1296 1297
    if (pDbVgVersion->vgVersion >= pDb->vgVersion && numOfTable == pDbVgVersion->numOfTable) {
      mDebug("db:%s, version & numOfTable not changed", pDbVgVersion->dbFName);
S
Shengliang Guan 已提交
1298
      mndReleaseDb(pMnode, pDb);
D
dapan1121 已提交
1299
      continue;
D
dapan1121 已提交
1300
    }
L
Liu Jicong 已提交
1301

D
dapan1121 已提交
1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313
    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 已提交
1314
    usedbRsp.hashMethod = pDb->cfg.hashMethod;
D
dapan1121 已提交
1315 1316 1317

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

S
Shengliang Guan 已提交
1320
  int32_t rspLen = tSerializeSUseDbBatchRsp(NULL, 0, &batchUseRsp);
wafwerar's avatar
wafwerar 已提交
1321
  void   *pRsp = taosMemoryMalloc(rspLen);
S
Shengliang Guan 已提交
1322 1323 1324 1325
  if (pRsp == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    tFreeSUseDbBatchRsp(&batchUseRsp);
    return -1;
D
dapan1121 已提交
1326
  }
S
Shengliang Guan 已提交
1327
  tSerializeSUseDbBatchRsp(pRsp, rspLen, &batchUseRsp);
D
dapan1121 已提交
1328

S
Shengliang Guan 已提交
1329 1330 1331 1332
  *ppRsp = pRsp;
  *pRspLen = rspLen;

  tFreeSUseDbBatchRsp(&batchUseRsp);
D
dapan1121 已提交
1333 1334 1335
  return 0;
}

S
Shengliang Guan 已提交
1336 1337
static int32_t mndProcessCompactDbReq(SNodeMsg *pReq) {
  SMnode       *pMnode = pReq->pNode;
S
Shengliang Guan 已提交
1338 1339 1340 1341 1342
  int32_t       code = -1;
  SDbObj       *pDb = NULL;
  SUserObj     *pUser = NULL;
  SCompactDbReq compactReq = {0};

S
Shengliang Guan 已提交
1343
  if (tDeserializeSCompactDbReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &compactReq) != 0) {
S
Shengliang Guan 已提交
1344
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
1345
    goto _OVER;
S
Shengliang Guan 已提交
1346 1347 1348 1349 1350
  }

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

  pDb = mndAcquireDb(pMnode, compactReq.db);
S
Shengliang Guan 已提交
1351
  if (pDb == NULL) {
S
Shengliang Guan 已提交
1352
    goto _OVER;
S
Shengliang Guan 已提交
1353 1354 1355 1356
  }

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

S
Shengliang Guan 已提交
1360 1361
  if (mndCheckAlterDropCompactDbAuth(pUser, pDb) != 0) {
    goto _OVER;
S
Shengliang Guan 已提交
1362 1363
  }

S
Shengliang Guan 已提交
1364
  // code = mndCompactDb();
S
Shengliang Guan 已提交
1365

S
Shengliang Guan 已提交
1366
_OVER:
S
Shengliang Guan 已提交
1367 1368
  if (code != 0) {
    mError("db:%s, failed to process compact db req since %s", compactReq.db, terrstr());
S
Shengliang Guan 已提交
1369
  }
S
Shengliang Guan 已提交
1370 1371

  mndReleaseDb(pMnode, pDb);
S
Shengliang Guan 已提交
1372 1373 1374
  mndReleaseUser(pMnode, pUser);

  return code;
S
Shengliang Guan 已提交
1375
}
S
Shengliang Guan 已提交
1376

S
Shengliang Guan 已提交
1377
const char *mndGetDbStr(const char *src) {
S
Shengliang Guan 已提交
1378 1379
  char *pos = strstr(src, TS_PATH_DELIMITER);
  if (pos != NULL) ++pos;
S
Shengliang Guan 已提交
1380
  if (pos == NULL) return src;
S
Shengliang Guan 已提交
1381 1382 1383
  return pos;
}

S
Shengliang Guan 已提交
1384 1385
static void dumpDbInfoData(SSDataBlock *pBlock, SDbObj *pDb, SShowObj *pShow, int32_t rows, int64_t numOfTables,
                           bool sysDb) {
S
Shengliang Guan 已提交
1386 1387
  int32_t cols = 0;

S
Shengliang Guan 已提交
1388 1389
  char       *buf = taosMemoryMalloc(pShow->bytes[cols]);
  const char *name = mndGetDbStr(pDb->name);
H
Haojun Liao 已提交
1390
  if (name != NULL) {
1391
    STR_WITH_MAXSIZE_TO_VARSTR(buf, name, pShow->bytes[cols]);
H
Haojun Liao 已提交
1392
  } else {
S
Shengliang Guan 已提交
1393
    STR_WITH_MAXSIZE_TO_VARSTR(buf, "NULL", pShow->bytes[cols]);
H
Haojun Liao 已提交
1394
  }
S
Shengliang Guan 已提交
1395

1396 1397 1398
  char *status = "ready";
  char  b[24] = {0};
  STR_WITH_SIZE_TO_VARSTR(b, status, strlen(status));
S
Shengliang Guan 已提交
1399

1400
  if (sysDb) {
S
Shengliang Guan 已提交
1401 1402
    for (int32_t i = 0; i < pShow->numOfColumns; ++i) {
      SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, i);
1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416
      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 已提交
1417

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

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

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

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

S
Shengliang Guan 已提交
1430
    const char *src = pDb->cfg.strict ? "strict" : "nostrict";
S
Shengliang Guan 已提交
1431
    char        b[9 + VARSTR_HEADER_SIZE] = {0};
S
Shengliang Guan 已提交
1432
    STR_WITH_SIZE_TO_VARSTR(b, src, strlen(src));
1433
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
S
Shengliang Guan 已提交
1434
    colDataAppend(pColInfo, rows, (const char *)b, false);
S
Shengliang Guan 已提交
1435

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

1439 1440 1441 1442 1443 1444 1445 1446 1447
    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);
    }
1448

1449 1450 1451
    varDataSetLen(tmp, len);
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, (const char *)tmp, false);
S
Shengliang Guan 已提交
1452

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

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

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

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

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

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

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

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

1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491
    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 已提交
1492

1493 1494 1495 1496
    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 已提交
1497

1498 1499
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.ttl, false);
1500

1501 1502
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.singleSTable, false);
D
dapan1121 已提交
1503

1504 1505
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.streamMode, false);
1506

1507 1508 1509
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
    colDataAppend(pColInfo, rows, (const char *)b, false);
  }
D
dapan1121 已提交
1510

L
Liu Jicong 已提交
1511 1512
  //  pWrite = getDataPosition(data, pShow, cols, rows, rowCapacity);
  //  *(int8_t *)pWrite = pDb->cfg.update;
H
Haojun Liao 已提交
1513 1514
}

L
Liu Jicong 已提交
1515
static void setInformationSchemaDbCfg(SDbObj *pDbObj) {
H
Haojun Liao 已提交
1516 1517 1518
  ASSERT(pDbObj != NULL);
  strncpy(pDbObj->name, TSDB_INFORMATION_SCHEMA_DB, tListLen(pDbObj->name));

L
Liu Jicong 已提交
1519
  pDbObj->createdTime = 0;
H
Haojun Liao 已提交
1520
  pDbObj->cfg.numOfVgroups = 0;
S
Shengliang Guan 已提交
1521
  pDbObj->cfg.strict = 1;
H
Haojun Liao 已提交
1522
  pDbObj->cfg.replications = 1;
L
Liu Jicong 已提交
1523 1524
  pDbObj->cfg.update = 1;
  pDbObj->cfg.precision = TSDB_TIME_PRECISION_MILLI;
H
Haojun Liao 已提交
1525 1526
}

S
Shengliang Guan 已提交
1527
static void setPerfSchemaDbCfg(SDbObj *pDbObj) {
1528 1529 1530 1531 1532
  ASSERT(pDbObj != NULL);
  strncpy(pDbObj->name, TSDB_PERFORMANCE_SCHEMA_DB, tListLen(pDbObj->name));

  pDbObj->createdTime = 0;
  pDbObj->cfg.numOfVgroups = 0;
S
Shengliang Guan 已提交
1533
  pDbObj->cfg.strict = 1;
1534 1535 1536 1537 1538
  pDbObj->cfg.replications = 1;
  pDbObj->cfg.update = 1;
  pDbObj->cfg.precision = TSDB_TIME_PRECISION_MILLI;
}

1539 1540 1541 1542 1543 1544 1545 1546
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 已提交
1547
static int32_t mndRetrieveDbs(SNodeMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rowsCapacity) {
X
Xiaoyu Wang 已提交
1548
  SMnode *pMnode = pReq->pNode;
H
Haojun Liao 已提交
1549 1550 1551 1552
  SSdb   *pSdb = pMnode->pSdb;
  int32_t numOfRows = 0;
  SDbObj *pDb = NULL;

1553 1554 1555 1556
  // Append the information_schema database into the result.
  if (!pShow->sysDbRsp) {
    SDbObj infoschemaDb = {0};
    setInformationSchemaDbCfg(&infoschemaDb);
1557
    dumpDbInfoData(pBlock, &infoschemaDb, pShow, numOfRows, 14, true);
1558 1559 1560 1561 1562

    numOfRows += 1;

    SDbObj perfschemaDb = {0};
    setPerfSchemaDbCfg(&perfschemaDb);
1563
    dumpDbInfoData(pBlock, &perfschemaDb, pShow, numOfRows, 3, true);
1564 1565 1566 1567 1568

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

H
Haojun Liao 已提交
1569 1570 1571 1572
  while (numOfRows < rowsCapacity) {
    pShow->pIter = sdbFetch(pSdb, SDB_DB, pShow->pIter, (void **)&pDb);
    if (pShow->pIter == NULL) {
      break;
S
Shengliang Guan 已提交
1573 1574
    }

1575 1576 1577
    int32_t numOfTables = 0;
    sdbTraverse(pSdb, SDB_VGROUP, mndGetTablesOfDbFp, &numOfTables, NULL, NULL);

1578
    dumpDbInfoData(pBlock, pDb, pShow, numOfRows, numOfTables, false);
S
Shengliang Guan 已提交
1579 1580 1581 1582
    numOfRows++;
    sdbRelease(pSdb, pDb);
  }

1583
  pShow->numOfRows += numOfRows;
S
Shengliang Guan 已提交
1584 1585 1586 1587 1588 1589

  return numOfRows;
}

static void mndCancelGetNextDb(SMnode *pMnode, void *pIter) {
  SSdb *pSdb = pMnode->pSdb;
D
dapan1121 已提交
1590
  sdbCancelFetch(pSdb, pIter);
L
Liu Jicong 已提交
1591
}
D
dapan1121 已提交
1592 1593 1594

static int32_t mndProcessGetIndexReq(SNodeMsg *pReq) {
  SUserIndexReq indexReq = {0};
S
Shengliang Guan 已提交
1595 1596
  SMnode       *pMnode = pReq->pNode;
  int32_t       code = -1;
D
dapan1121 已提交
1597
  SUserIndexRsp rsp = {0};
S
Shengliang Guan 已提交
1598
  bool          exist = false;
D
dapan1121 已提交
1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610

  if (tDeserializeSUserIndexReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &indexReq) != 0) {
    terrno = TSDB_CODE_INVALID_MSG;
    goto _OVER;
  }

  code = mndProcessGetSmaReq(pMnode, &indexReq, &rsp, &exist);
  if (code) {
    goto _OVER;
  }

  if (!exist) {
S
Shengliang Guan 已提交
1611
    // TODO GET INDEX FROM FULLTEXT
D
dapan1121 已提交
1612 1613
    code = -1;
    terrno = TSDB_CODE_MND_DB_INDEX_NOT_EXIST;
D
dapan1121 已提交
1614 1615 1616 1617 1618 1619 1620 1621
  } else {
    int32_t contLen = tSerializeSUserIndexRsp(NULL, 0, &rsp);
    void   *pRsp = rpcMallocCont(contLen);
    if (pRsp == NULL) {
      terrno = TSDB_CODE_OUT_OF_MEMORY;
      code = -1;
      goto _OVER;
    }
S
Shengliang Guan 已提交
1622

D
dapan1121 已提交
1623
    tSerializeSUserIndexRsp(pRsp, contLen, &rsp);
S
Shengliang Guan 已提交
1624

D
dapan1121 已提交
1625 1626 1627 1628 1629 1630 1631
    pReq->pRsp = pRsp;
    pReq->rspLen = contLen;

    code = 0;
  }

_OVER:
D
dapan1121 已提交
1632
  if (code != 0) {
D
dapan1121 已提交
1633 1634 1635 1636 1637
    mError("failed to get index %s since %s", indexReq.indexFName, terrstr());
  }

  return code;
}