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

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

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 已提交
39
static int32_t  mndDbActionUpdate(SSdb *pSdb, SDbObj *pOld, SDbObj *pNew);
S
Shengliang Guan 已提交
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);
S
Shengliang Guan 已提交
45
static int32_t  mndProcessTrimDbReq(SRpcMsg *pReq);
S
Shengliang Guan 已提交
46
static int32_t  mndRetrieveDbs(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rowsCapacity);
S
Shengliang Guan 已提交
47
static void     mndCancelGetNextDb(SMnode *pMnode, void *pIter);
S
Shengliang Guan 已提交
48
static int32_t  mndProcessGetDbCfgReq(SRpcMsg *pReq);
S
Shengliang Guan 已提交
49

S
Shengliang Guan 已提交
50
int32_t mndInitDb(SMnode *pMnode) {
S
Shengliang Guan 已提交
51 52 53 54 55 56 57 58 59
  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 已提交
60

S
Shengliang Guan 已提交
61 62 63 64 65
  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);
S
Shengliang Guan 已提交
66
  mndSetMsgHandle(pMnode, TDMT_MND_TRIM_DB, mndProcessTrimDbReq);
D
dapan1121 已提交
67
  mndSetMsgHandle(pMnode, TDMT_MND_GET_DB_CFG, mndProcessGetDbCfgReq);
S
Shengliang Guan 已提交
68 69 70 71

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

S
Shengliang Guan 已提交
72
  return sdbSetTable(pMnode->pSdb, table);
S
Shengliang Guan 已提交
73
}
S
Shengliang Guan 已提交
74

S
Shengliang Guan 已提交
75
void mndCleanupDb(SMnode *pMnode) {}
S
Shengliang Guan 已提交
76

S
Shengliang Guan 已提交
77
static SSdbRaw *mndDbActionEncode(SDbObj *pDb) {
78 79
  terrno = TSDB_CODE_OUT_OF_MEMORY;

S
Shengliang Guan 已提交
80 81 82
  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 已提交
83 84

  int32_t dataPos = 0;
S
Shengliang Guan 已提交
85 86 87 88 89 90 91 92 93
  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 已提交
94 95 96 97
  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)
98
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.cacheLastSize, _OVER)
S
Shengliang Guan 已提交
99 100 101 102 103 104
  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)
105
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.walFsyncPeriod, _OVER)
S
Shengliang Guan 已提交
106 107 108 109 110
  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)
111
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.cacheLast, _OVER)
S
Shengliang Guan 已提交
112 113
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.hashMethod, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.numOfRetensions, _OVER)
S
sma  
Shengliang Guan 已提交
114
  for (int32_t i = 0; i < pDb->cfg.numOfRetensions; ++i) {
C
Cary Xu 已提交
115
    TASSERT(taosArrayGetSize(pDb->cfg.pRetensions) == pDb->cfg.numOfRetensions);
S
sma  
Shengliang Guan 已提交
116
    SRetention *pRetension = taosArrayGet(pDb->cfg.pRetensions, i);
C
Cary Xu 已提交
117 118
    SDB_SET_INT64(pRaw, dataPos, pRetension->freq, _OVER)
    SDB_SET_INT64(pRaw, dataPos, pRetension->keep, _OVER)
S
Shengliang Guan 已提交
119 120
    SDB_SET_INT8(pRaw, dataPos, pRetension->freqUnit, _OVER)
    SDB_SET_INT8(pRaw, dataPos, pRetension->keepUnit, _OVER)
S
sma  
Shengliang Guan 已提交
121
  }
wmmhello's avatar
wmmhello 已提交
122
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.schemaless, _OVER)
S
Shengliang Guan 已提交
123
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.walRetentionPeriod, _OVER)
L
Liu Jicong 已提交
124
  SDB_SET_INT64(pRaw, dataPos, pDb->cfg.walRetentionSize, _OVER)
S
Shengliang Guan 已提交
125
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.walRollPeriod, _OVER)
L
Liu Jicong 已提交
126
  SDB_SET_INT64(pRaw, dataPos, pDb->cfg.walSegmentSize, _OVER)
127
  SDB_SET_INT16(pRaw, dataPos, pDb->cfg.sstTrigger, _OVER)
S
sma  
Shengliang Guan 已提交
128

S
Shengliang Guan 已提交
129 130
  SDB_SET_RESERVE(pRaw, dataPos, DB_RESERVE_SIZE, _OVER)
  SDB_SET_DATALEN(pRaw, dataPos, _OVER)
131 132 133

  terrno = 0;

S
Shengliang Guan 已提交
134
_OVER:
135 136 137 138 139
  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 已提交
140

141
  mTrace("db:%s, encode to raw:%p, row:%p", pDb->name, pRaw, pDb);
S
Shengliang Guan 已提交
142 143 144 145
  return pRaw;
}

static SSdbRow *mndDbActionDecode(SSdbRaw *pRaw) {
146 147
  terrno = TSDB_CODE_OUT_OF_MEMORY;

S
Shengliang Guan 已提交
148
  int8_t sver = 0;
S
Shengliang Guan 已提交
149
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
S
Shengliang Guan 已提交
150

S
Shengliang Guan 已提交
151
  if (sver != DB_VER_NUMBER) {
S
Shengliang Guan 已提交
152
    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
S
Shengliang Guan 已提交
153
    goto _OVER;
S
Shengliang Guan 已提交
154 155 156
  }

  SSdbRow *pRow = sdbAllocRow(sizeof(SDbObj));
S
Shengliang Guan 已提交
157
  if (pRow == NULL) goto _OVER;
158 159

  SDbObj *pDb = sdbGetRowObj(pRow);
S
Shengliang Guan 已提交
160
  if (pDb == NULL) goto _OVER;
S
Shengliang Guan 已提交
161 162

  int32_t dataPos = 0;
S
Shengliang Guan 已提交
163 164 165 166 167 168 169 170 171
  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 已提交
172 173 174 175
  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)
176
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.cacheLastSize, _OVER)
S
Shengliang Guan 已提交
177 178 179 180 181 182
  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)
183
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.walFsyncPeriod, _OVER)
S
Shengliang Guan 已提交
184 185 186 187 188
  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)
189
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.cacheLast, _OVER)
S
Shengliang Guan 已提交
190 191
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.hashMethod, _OVER)
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.numOfRetensions, _OVER)
S
sma  
Shengliang Guan 已提交
192 193
  if (pDb->cfg.numOfRetensions > 0) {
    pDb->cfg.pRetensions = taosArrayInit(pDb->cfg.numOfRetensions, sizeof(SRetention));
S
Shengliang Guan 已提交
194
    if (pDb->cfg.pRetensions == NULL) goto _OVER;
S
sma  
Shengliang Guan 已提交
195
    for (int32_t i = 0; i < pDb->cfg.numOfRetensions; ++i) {
X
Xiaoyu Wang 已提交
196 197 198 199 200 201
      SRetention retention = {0};
      SDB_GET_INT64(pRaw, dataPos, &retention.freq, _OVER)
      SDB_GET_INT64(pRaw, dataPos, &retention.keep, _OVER)
      SDB_GET_INT8(pRaw, dataPos, &retention.freqUnit, _OVER)
      SDB_GET_INT8(pRaw, dataPos, &retention.keepUnit, _OVER)
      if (taosArrayPush(pDb->cfg.pRetensions, &retention) == NULL) {
S
Shengliang Guan 已提交
202
        goto _OVER;
S
sma  
Shengliang Guan 已提交
203 204 205
      }
    }
  }
wmmhello's avatar
wmmhello 已提交
206
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.schemaless, _OVER)
S
Shengliang Guan 已提交
207
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.walRetentionPeriod, _OVER)
L
Liu Jicong 已提交
208
  SDB_GET_INT64(pRaw, dataPos, &pDb->cfg.walRetentionSize, _OVER)
S
Shengliang Guan 已提交
209
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.walRollPeriod, _OVER)
L
Liu Jicong 已提交
210
  SDB_GET_INT64(pRaw, dataPos, &pDb->cfg.walSegmentSize, _OVER)
211
  SDB_GET_INT16(pRaw, dataPos, &pDb->cfg.sstTrigger, _OVER)
S
sma  
Shengliang Guan 已提交
212

S
Shengliang Guan 已提交
213
  SDB_GET_RESERVE(pRaw, dataPos, DB_RESERVE_SIZE, _OVER)
S
Shengliang Guan 已提交
214
  taosInitRWLatch(&pDb->lock);
215 216 217

  terrno = 0;

S
Shengliang Guan 已提交
218
_OVER:
219 220
  if (terrno != 0) {
    mError("db:%s, failed to decode from raw:%p since %s", pDb->name, pRaw, terrstr());
wafwerar's avatar
wafwerar 已提交
221
    taosMemoryFreeClear(pRow);
222 223
    return NULL;
  }
S
Shengliang Guan 已提交
224

225
  mTrace("db:%s, decode from raw:%p, row:%p", pDb->name, pRaw, pDb);
S
Shengliang Guan 已提交
226 227 228 229
  return pRow;
}

static int32_t mndDbActionInsert(SSdb *pSdb, SDbObj *pDb) {
230
  mTrace("db:%s, perform insert action, row:%p", pDb->name, pDb);
S
Shengliang Guan 已提交
231 232 233 234
  return 0;
}

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

S
Shengliang Guan 已提交
240 241
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);
242
  taosWLockLatch(&pOld->lock);
S
Shengliang Guan 已提交
243 244 245
  pOld->updateTime = pNew->updateTime;
  pOld->cfgVersion = pNew->cfgVersion;
  pOld->vgVersion = pNew->vgVersion;
S
Shengliang Guan 已提交
246 247
  pOld->cfg.buffer = pNew->cfg.buffer;
  pOld->cfg.pageSize = pNew->cfg.pageSize;
248
  pOld->cfg.pages = pNew->cfg.pages;
249
  pOld->cfg.cacheLastSize = pNew->cfg.cacheLastSize;
S
Shengliang Guan 已提交
250 251 252 253
  pOld->cfg.daysPerFile = pNew->cfg.daysPerFile;
  pOld->cfg.daysToKeep0 = pNew->cfg.daysToKeep0;
  pOld->cfg.daysToKeep1 = pNew->cfg.daysToKeep1;
  pOld->cfg.daysToKeep2 = pNew->cfg.daysToKeep2;
254
  pOld->cfg.walFsyncPeriod = pNew->cfg.walFsyncPeriod;
S
Shengliang Guan 已提交
255 256
  pOld->cfg.walLevel = pNew->cfg.walLevel;
  pOld->cfg.strict = pNew->cfg.strict;
257
  pOld->cfg.cacheLast = pNew->cfg.cacheLast;
S
Shengliang Guan 已提交
258
  pOld->cfg.replications = pNew->cfg.replications;
259
  pOld->cfg.sstTrigger = pNew->cfg.sstTrigger;
260
  taosWUnLockLatch(&pOld->lock);
S
Shengliang Guan 已提交
261 262 263
  return 0;
}

S
Shengliang Guan 已提交
264 265 266 267
static inline int32_t mndGetGlobalVgroupVersion(SMnode *pMnode) {
  SSdb *pSdb = pMnode->pSdb;
  return sdbGetTableVer(pSdb, SDB_VGROUP);
}
268

S
Shengliang Guan 已提交
269
SDbObj *mndAcquireDb(SMnode *pMnode, const char *db) {
S
Shengliang Guan 已提交
270 271
  SSdb   *pSdb = pMnode->pSdb;
  SDbObj *pDb = sdbAcquire(pSdb, SDB_DB, db);
S
Shengliang Guan 已提交
272
  if (pDb == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
S
Shengliang Guan 已提交
273 274 275
    terrno = TSDB_CODE_MND_DB_NOT_EXIST;
  }
  return pDb;
S
Shengliang Guan 已提交
276
}
S
Shengliang Guan 已提交
277

S
Shengliang Guan 已提交
278 279 280 281 282
void mndReleaseDb(SMnode *pMnode, SDbObj *pDb) {
  SSdb *pSdb = pMnode->pSdb;
  sdbRelease(pSdb, pDb);
}

S
Shengliang Guan 已提交
283
static int32_t mndCheckDbName(const char *dbName, SUserObj *pUser) {
S
Shengliang Guan 已提交
284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
  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 已提交
299
static int32_t mndCheckDbCfg(SMnode *pMnode, SDbCfg *pCfg) {
S
Shengliang Guan 已提交
300 301
  terrno = TSDB_CODE_MND_INVALID_DB_OPTION;

302
  if (pCfg->numOfVgroups < TSDB_MIN_VNODES_PER_DB || pCfg->numOfVgroups > TSDB_MAX_VNODES_PER_DB) return -1;
S
Shengliang Guan 已提交
303 304 305 306
  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;
307
  if (pCfg->cacheLastSize < TSDB_MIN_DB_CACHE_SIZE || pCfg->cacheLastSize > TSDB_MAX_DB_CACHE_SIZE) return -1;
S
Shengliang Guan 已提交
308 309 310 311
  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 已提交
312
  if (pCfg->daysToKeep0 < pCfg->daysPerFile) return -1;
S
Shengliang Guan 已提交
313 314
  if (pCfg->daysToKeep0 > pCfg->daysToKeep1) return -1;
  if (pCfg->daysToKeep1 > pCfg->daysToKeep2) return -1;
S
Shengliang Guan 已提交
315 316
  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 已提交
317
  if (pCfg->minRows > pCfg->maxRows) return -1;
318
  if (pCfg->walFsyncPeriod < TSDB_MIN_FSYNC_PERIOD || pCfg->walFsyncPeriod > TSDB_MAX_FSYNC_PERIOD) return -1;
S
Shengliang Guan 已提交
319 320 321
  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 已提交
322
  if (pCfg->replications < TSDB_MIN_DB_REPLICA || pCfg->replications > TSDB_MAX_DB_REPLICA) return -1;
S
Shengliang Guan 已提交
323
  if (pCfg->replications != 1 && pCfg->replications != 3) return -1;
324
  if (pCfg->strict < TSDB_DB_STRICT_OFF || pCfg->strict > TSDB_DB_STRICT_ON) return -1;
wmmhello's avatar
wmmhello 已提交
325
  if (pCfg->schemaless < TSDB_DB_SCHEMALESS_OFF || pCfg->schemaless > TSDB_DB_SCHEMALESS_ON) return -1;
326
  if (pCfg->cacheLast < TSDB_CACHE_MODEL_NONE || pCfg->cacheLast > TSDB_CACHE_MODEL_BOTH) return -1;
S
Shengliang Guan 已提交
327
  if (pCfg->hashMethod != 1) return -1;
328 329 330 331
  if (pCfg->replications > mndGetDnodeSize(pMnode)) {
    terrno = TSDB_CODE_MND_NO_ENOUGH_DNODES;
    return -1;
  }
S
Shengliang Guan 已提交
332 333 334 335
  if (pCfg->walRetentionPeriod < TSDB_DB_MIN_WAL_RETENTION_PERIOD) return -1;
  if (pCfg->walRetentionSize < TSDB_DB_MIN_WAL_RETENTION_SIZE) return -1;
  if (pCfg->walRollPeriod < TSDB_DB_MIN_WAL_ROLL_PERIOD) return -1;
  if (pCfg->walSegmentSize < TSDB_DB_MIN_WAL_SEGMENT_SIZE) return -1;
336
  if (pCfg->sstTrigger < TSDB_MIN_SST_TRIGGER || pCfg->sstTrigger > TSDB_MAX_SST_TRIGGER) return -1;
S
Shengliang Guan 已提交
337 338

  terrno = 0;
339
  return terrno;
S
Shengliang Guan 已提交
340 341 342
}

static void mndSetDefaultDbCfg(SDbCfg *pCfg) {
343
  if (pCfg->numOfVgroups < 0) pCfg->numOfVgroups = TSDB_DEFAULT_VN_PER_DB;
S
Shengliang Guan 已提交
344 345
  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 已提交
346 347
  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 已提交
348
  if (pCfg->daysPerFile < 0) pCfg->daysPerFile = TSDB_DEFAULT_DURATION_PER_FILE;
S
Shengliang Guan 已提交
349
  if (pCfg->daysToKeep0 < 0) pCfg->daysToKeep0 = TSDB_DEFAULT_KEEP;
350 351
  if (pCfg->daysToKeep1 < 0) pCfg->daysToKeep1 = pCfg->daysToKeep0;
  if (pCfg->daysToKeep2 < 0) pCfg->daysToKeep2 = pCfg->daysToKeep1;
S
Shengliang Guan 已提交
352 353
  if (pCfg->minRows < 0) pCfg->minRows = TSDB_DEFAULT_MINROWS_FBLOCK;
  if (pCfg->maxRows < 0) pCfg->maxRows = TSDB_DEFAULT_MAXROWS_FBLOCK;
354
  if (pCfg->walFsyncPeriod < 0) pCfg->walFsyncPeriod = TSDB_DEFAULT_FSYNC_PERIOD;
S
Shengliang Guan 已提交
355 356 357
  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 已提交
358 359
  if (pCfg->replications < 0) pCfg->replications = TSDB_DEFAULT_DB_REPLICA;
  if (pCfg->strict < 0) pCfg->strict = TSDB_DEFAULT_DB_STRICT;
360 361
  if (pCfg->cacheLast < 0) pCfg->cacheLast = TSDB_DEFAULT_CACHE_MODEL;
  if (pCfg->cacheLastSize <= 0) pCfg->cacheLastSize = TSDB_DEFAULT_CACHE_SIZE;
362
  if (pCfg->numOfRetensions < 0) pCfg->numOfRetensions = 0;
wmmhello's avatar
wmmhello 已提交
363
  if (pCfg->schemaless < 0) pCfg->schemaless = TSDB_DB_SCHEMALESS_OFF;
L
Liu Jicong 已提交
364
  if (pCfg->walRetentionPeriod < 0 && pCfg->walRetentionPeriod != -1)
365
    pCfg->walRetentionPeriod = TSDB_REPS_DEF_DB_WAL_RET_PERIOD;
L
Liu Jicong 已提交
366
  if (pCfg->walRetentionSize < 0 && pCfg->walRetentionSize != -1)
367 368
    pCfg->walRetentionSize = TSDB_REPS_DEF_DB_WAL_RET_SIZE;
  if (pCfg->walRollPeriod < 0) pCfg->walRollPeriod = TSDB_REPS_DEF_DB_WAL_ROLL_PERIOD;
S
Shengliang Guan 已提交
369
  if (pCfg->walSegmentSize < 0) pCfg->walSegmentSize = TSDB_DEFAULT_DB_WAL_SEGMENT_SIZE;
370
  if (pCfg->sstTrigger <= 0) pCfg->sstTrigger = TSDB_DEFAULT_SST_TRIGGER;
S
Shengliang Guan 已提交
371
}
S
Shengliang Guan 已提交
372

S
Shengliang Guan 已提交
373
static int32_t mndSetCreateDbRedoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
S
Shengliang Guan 已提交
374
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
S
Shengliang Guan 已提交
375 376 377
  if (pDbRaw == NULL) return -1;
  if (mndTransAppendRedolog(pTrans, pDbRaw) != 0) return -1;
  if (sdbSetRawStatus(pDbRaw, SDB_STATUS_CREATING) != 0) return -1;
S
Shengliang Guan 已提交
378

S
Shengliang Guan 已提交
379
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
S
Shengliang Guan 已提交
380
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
S
Shengliang Guan 已提交
381 382 383
    if (pVgRaw == NULL) return -1;
    if (mndTransAppendRedolog(pTrans, pVgRaw) != 0) return -1;
    if (sdbSetRawStatus(pVgRaw, SDB_STATUS_CREATING) != 0) return -1;
S
Shengliang Guan 已提交
384 385 386 387 388
  }

  return 0;
}

S
Shengliang Guan 已提交
389
static int32_t mndSetCreateDbUndoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
S
Shengliang Guan 已提交
390
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
S
Shengliang Guan 已提交
391 392 393
  if (pDbRaw == NULL) return -1;
  if (mndTransAppendUndolog(pTrans, pDbRaw) != 0) return -1;
  if (sdbSetRawStatus(pDbRaw, SDB_STATUS_DROPPED) != 0) return -1;
S
Shengliang Guan 已提交
394

S
Shengliang Guan 已提交
395
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
S
Shengliang Guan 已提交
396
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
S
Shengliang Guan 已提交
397 398 399
    if (pVgRaw == NULL) return -1;
    if (mndTransAppendUndolog(pTrans, pVgRaw) != 0) return -1;
    if (sdbSetRawStatus(pVgRaw, SDB_STATUS_DROPPED) != 0) return -1;
S
Shengliang Guan 已提交
400 401 402 403 404
  }

  return 0;
}

S
Shengliang Guan 已提交
405
static int32_t mndSetCreateDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
S
Shengliang Guan 已提交
406
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
S
Shengliang Guan 已提交
407 408 409
  if (pDbRaw == NULL) return -1;
  if (mndTransAppendCommitlog(pTrans, pDbRaw) != 0) return -1;
  if (sdbSetRawStatus(pDbRaw, SDB_STATUS_READY) != 0) return -1;
S
Shengliang Guan 已提交
410

S
Shengliang Guan 已提交
411
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
S
Shengliang Guan 已提交
412
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
S
Shengliang Guan 已提交
413 414 415
    if (pVgRaw == NULL) return -1;
    if (mndTransAppendCommitlog(pTrans, pVgRaw) != 0) return -1;
    if (sdbSetRawStatus(pVgRaw, SDB_STATUS_READY) != 0) return -1;
S
Shengliang Guan 已提交
416 417 418 419 420
  }

  return 0;
}

S
Shengliang Guan 已提交
421 422
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 已提交
423
    SVgObj *pVgroup = pVgroups + vg;
S
Shengliang Guan 已提交
424 425

    for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
S
Shengliang Guan 已提交
426
      SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
427
      if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid, false) != 0) {
S
Shengliang Guan 已提交
428 429 430 431 432
        return -1;
      }
    }
  }

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

S
Shengliang Guan 已提交
436 437
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 已提交
438
    SVgObj *pVgroup = pVgroups + vg;
S
Shengliang Guan 已提交
439 440

    for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
S
Shengliang Guan 已提交
441 442
      SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
      if (mndAddDropVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid, false) != 0) {
S
Shengliang Guan 已提交
443 444 445 446 447
        return -1;
      }
    }
  }

S
Shengliang Guan 已提交
448 449 450
  return 0;
}

S
Shengliang Guan 已提交
451
static int32_t mndCreateDb(SMnode *pMnode, SRpcMsg *pReq, SCreateDbReq *pCreate, SUserObj *pUser) {
S
Shengliang Guan 已提交
452
  SDbObj dbObj = {0};
453
  memcpy(dbObj.name, pCreate->db, TSDB_DB_FNAME_LEN);
S
Shengliang Guan 已提交
454
  memcpy(dbObj.acct, pUser->acct, TSDB_USER_LEN);
S
Shengliang Guan 已提交
455 456
  dbObj.createdTime = taosGetTimestampMs();
  dbObj.updateTime = dbObj.createdTime;
457
  dbObj.uid = mndGenerateUid(dbObj.name, TSDB_DB_FNAME_LEN);
S
Shengliang Guan 已提交
458 459
  dbObj.cfgVersion = 1;
  dbObj.vgVersion = 1;
S
Shengliang Guan 已提交
460
  memcpy(dbObj.createUser, pUser->user, TSDB_USER_LEN);
L
Liu Jicong 已提交
461 462
  dbObj.cfg = (SDbCfg){
      .numOfVgroups = pCreate->numOfVgroups,
S
Shengliang Guan 已提交
463 464 465 466
      .numOfStables = pCreate->numOfStables,
      .buffer = pCreate->buffer,
      .pageSize = pCreate->pageSize,
      .pages = pCreate->pages,
467
      .cacheLastSize = pCreate->cacheLastSize,
L
Liu Jicong 已提交
468 469 470 471 472 473
      .daysPerFile = pCreate->daysPerFile,
      .daysToKeep0 = pCreate->daysToKeep0,
      .daysToKeep1 = pCreate->daysToKeep1,
      .daysToKeep2 = pCreate->daysToKeep2,
      .minRows = pCreate->minRows,
      .maxRows = pCreate->maxRows,
474
      .walFsyncPeriod = pCreate->walFsyncPeriod,
475
      .walLevel = pCreate->walLevel,
L
Liu Jicong 已提交
476 477 478
      .precision = pCreate->precision,
      .compression = pCreate->compression,
      .replications = pCreate->replications,
S
Shengliang Guan 已提交
479
      .strict = pCreate->strict,
480
      .cacheLast = pCreate->cacheLast,
S
Shengliang Guan 已提交
481
      .hashMethod = 1,
wmmhello's avatar
wmmhello 已提交
482
      .schemaless = pCreate->schemaless,
S
Shengliang Guan 已提交
483 484 485 486
      .walRetentionPeriod = pCreate->walRetentionPeriod,
      .walRetentionSize = pCreate->walRetentionSize,
      .walRollPeriod = pCreate->walRollPeriod,
      .walSegmentSize = pCreate->walSegmentSize,
487
      .sstTrigger = pCreate->sstTrigger,
L
Liu Jicong 已提交
488
  };
S
Shengliang Guan 已提交
489

S
sma  
Shengliang Guan 已提交
490 491 492
  dbObj.cfg.numOfRetensions = pCreate->numOfRetensions;
  dbObj.cfg.pRetensions = pCreate->pRetensions;

S
Shengliang Guan 已提交
493 494
  mndSetDefaultDbCfg(&dbObj.cfg);

S
Shengliang Guan 已提交
495 496 497 498 499
  if (mndCheckDbName(dbObj.name, pUser) != 0) {
    mError("db:%s, failed to create since %s", pCreate->db, terrstr());
    return -1;
  }

S
Shengliang Guan 已提交
500
  if (mndCheckDbCfg(pMnode, &dbObj.cfg) != 0) {
S
Shengliang Guan 已提交
501 502 503
    mError("db:%s, failed to create since %s", pCreate->db, terrstr());
    return -1;
  }
S
Shengliang Guan 已提交
504

S
Shengliang Guan 已提交
505 506
  SVgObj *pVgroups = NULL;
  if (mndAllocVgroup(pMnode, &dbObj, &pVgroups) != 0) {
507 508 509 510
    mError("db:%s, failed to create since %s", pCreate->db, terrstr());
    return -1;
  }

S
Shengliang Guan 已提交
511
  int32_t code = -1;
S
Shengliang Guan 已提交
512
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq);
S
Shengliang Guan 已提交
513
  if (pTrans == NULL) goto _OVER;
514
  // mndTransSetSerial(pTrans);
S
Shengliang Guan 已提交
515 516
  mDebug("trans:%d, used to create db:%s", pTrans->id, pCreate->db);

517
  mndTransSetDbName(pTrans, dbObj.name, NULL);
518
  mndTransSetOper(pTrans, MND_OPER_CREATE_DB);
S
Shengliang Guan 已提交
519 520 521 522 523 524
  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 已提交
525

S
Shengliang Guan 已提交
526 527
  code = 0;

S
Shengliang Guan 已提交
528
_OVER:
wafwerar's avatar
wafwerar 已提交
529
  taosMemoryFree(pVgroups);
S
Shengliang Guan 已提交
530
  mndTransDrop(pTrans);
S
Shengliang Guan 已提交
531
  return code;
S
Shengliang Guan 已提交
532 533
}

S
Shengliang Guan 已提交
534 535
static int32_t mndProcessCreateDbReq(SRpcMsg *pReq) {
  SMnode      *pMnode = pReq->info.node;
S
Shengliang Guan 已提交
536 537 538 539 540
  int32_t      code = -1;
  SDbObj      *pDb = NULL;
  SUserObj    *pUser = NULL;
  SCreateDbReq createReq = {0};

C
Cary Xu 已提交
541 542 543 544
  if ((terrno = grantCheck(TSDB_GRANT_DB)) != 0) {
    code = terrno;
    goto _OVER;
  }
545

S
Shengliang Guan 已提交
546
  if (tDeserializeSCreateDbReq(pReq->pCont, pReq->contLen, &createReq) != 0) {
S
Shengliang Guan 已提交
547
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
548
    goto _OVER;
S
Shengliang Guan 已提交
549 550 551
  }

  mDebug("db:%s, start to create, vgroups:%d", createReq.db, createReq.numOfVgroups);
552 553 554
  if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_CREATE_DB, NULL) != 0) {
    goto _OVER;
  }
S
Shengliang Guan 已提交
555 556

  pDb = mndAcquireDb(pMnode, createReq.db);
S
Shengliang Guan 已提交
557
  if (pDb != NULL) {
S
Shengliang Guan 已提交
558 559 560
    if (createReq.ignoreExist) {
      mDebug("db:%s, already exist, ignore exist is set", createReq.db);
      code = 0;
S
Shengliang Guan 已提交
561
      goto _OVER;
S
Shengliang Guan 已提交
562 563
    } else {
      terrno = TSDB_CODE_MND_DB_ALREADY_EXIST;
S
Shengliang Guan 已提交
564
      goto _OVER;
S
Shengliang Guan 已提交
565
    }
566 567 568 569 570 571 572 573
  } else if (terrno == TSDB_CODE_SDB_OBJ_CREATING) {
    if (mndSetRpcInfoForDbTrans(pMnode, pReq, MND_OPER_CREATE_DB, createReq.db) == 0) {
      mDebug("db:%s, is creating and response after trans finished", createReq.db);
      code = TSDB_CODE_ACTION_IN_PROGRESS;
      goto _OVER;
    } else {
      goto _OVER;
    }
S
Shengliang Guan 已提交
574
  } else if (terrno != TSDB_CODE_MND_DB_NOT_EXIST) {
S
Shengliang Guan 已提交
575
    goto _OVER;
S
Shengliang Guan 已提交
576 577
  }

578
  pUser = mndAcquireUser(pMnode, pReq->info.conn.user);
S
Shengliang Guan 已提交
579
  if (pUser == NULL) {
S
Shengliang Guan 已提交
580
    goto _OVER;
S
Shengliang Guan 已提交
581 582 583
  }

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

S
Shengliang Guan 已提交
586
_OVER:
S
Shengliang Guan 已提交
587
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
S
Shengliang Guan 已提交
588
    mError("db:%s, failed to create since %s", createReq.db, terrstr());
S
Shengliang Guan 已提交
589 590
  }

S
Shengliang Guan 已提交
591 592
  mndReleaseDb(pMnode, pDb);
  mndReleaseUser(pMnode, pUser);
S
sma  
Shengliang Guan 已提交
593
  tFreeSCreateDbReq(&createReq);
S
Shengliang Guan 已提交
594 595

  return code;
S
Shengliang Guan 已提交
596 597
}

S
Shengliang Guan 已提交
598
static int32_t mndSetDbCfgFromAlterDbReq(SDbObj *pDb, SAlterDbReq *pAlter) {
S
Shengliang Guan 已提交
599
  terrno = TSDB_CODE_MND_DB_OPTION_UNCHANGED;
S
Shengliang Guan 已提交
600

S
Shengliang Guan 已提交
601
  if (pAlter->buffer > 0 && pAlter->buffer != pDb->cfg.buffer) {
602 603 604 605
#if 1
    terrno = TSDB_CODE_OPS_NOT_SUPPORT;
    return terrno;
#else
S
Shengliang Guan 已提交
606 607
    pDb->cfg.buffer = pAlter->buffer;
    terrno = 0;
608
#endif
S
Shengliang Guan 已提交
609 610
  }

S
Shengliang Guan 已提交
611
  if (pAlter->pages > 0 && pAlter->pages != pDb->cfg.pages) {
612 613 614 615
#if 1
    terrno = TSDB_CODE_OPS_NOT_SUPPORT;
    return terrno;
#else
S
Shengliang Guan 已提交
616
    pDb->cfg.pages = pAlter->pages;
S
Shengliang Guan 已提交
617
    terrno = 0;
618
#endif
S
Shengliang Guan 已提交
619 620
  }

S
Shengliang Guan 已提交
621
  if (pAlter->pageSize > 0 && pAlter->pageSize != pDb->cfg.pageSize) {
622 623 624 625
#if 1
    terrno = TSDB_CODE_OPS_NOT_SUPPORT;
    return terrno;
#else
S
Shengliang Guan 已提交
626
    pDb->cfg.pageSize = pAlter->pageSize;
S
Shengliang Guan 已提交
627
    terrno = 0;
628
#endif
S
Shengliang Guan 已提交
629 630
  }

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

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

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

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

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

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

S
Shengliang Guan 已提交
661
  if (pAlter->strict >= 0 && pAlter->strict != pDb->cfg.strict) {
662 663 664
#if 1
    terrno = TSDB_CODE_OPS_NOT_SUPPORT;
#else
S
Shengliang Guan 已提交
665
    pDb->cfg.strict = pAlter->strict;
S
Shengliang Guan 已提交
666
    terrno = 0;
667
#endif
S
Shengliang Guan 已提交
668 669
  }

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

675 676
  if (pAlter->cacheLastSize > 0 && pAlter->cacheLastSize != pDb->cfg.cacheLastSize) {
    pDb->cfg.cacheLastSize = pAlter->cacheLastSize;
677 678 679
    terrno = 0;
  }

S
Shengliang Guan 已提交
680
  if (pAlter->replications > 0 && pAlter->replications != pDb->cfg.replications) {
681 682 683
#if 1
    terrno = TSDB_CODE_OPS_NOT_SUPPORT;
#else
S
Shengliang Guan 已提交
684
    pDb->cfg.replications = pAlter->replications;
S
Shengliang Guan 已提交
685
    pDb->vgVersion++;
S
Shengliang Guan 已提交
686
    terrno = 0;
687
#endif
S
Shengliang Guan 已提交
688 689
  }

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

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

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

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

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

S
Shengliang Guan 已提交
717
static int32_t mndSetAlterDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
S
Shengliang Guan 已提交
718 719
  SSdb   *pSdb = pMnode->pSdb;
  void   *pIter = NULL;
S
Shengliang Guan 已提交
720
  SArray *pArray = mndBuildDnodesArray(pMnode, 0);
S
Shengliang Guan 已提交
721

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

S
Shengliang Guan 已提交
727
    if (mndVgroupInDb(pVgroup, pNew->uid)) {
S
Shengliang Guan 已提交
728
      if (mndBuildAlterVgroupAction(pMnode, pTrans, pNew, pVgroup, pArray) != 0) {
S
Shengliang Guan 已提交
729 730
        sdbCancelFetch(pSdb, pIter);
        sdbRelease(pSdb, pVgroup);
S
Shengliang Guan 已提交
731
        taosArrayDestroy(pArray);
S
Shengliang Guan 已提交
732 733 734 735 736 737 738
        return -1;
      }
    }

    sdbRelease(pSdb, pVgroup);
  }

S
Shengliang Guan 已提交
739
  taosArrayDestroy(pArray);
S
Shengliang Guan 已提交
740 741
  return 0;
}
S
Shengliang Guan 已提交
742

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

748
  int32_t code = -1;
749
  mndTransSetDbName(pTrans, pOld->name, NULL);
S
Shengliang Guan 已提交
750 751 752 753
  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 已提交
754 755
  code = 0;

S
Shengliang Guan 已提交
756
_OVER:
S
Shengliang Guan 已提交
757
  mndTransDrop(pTrans);
S
Shengliang Guan 已提交
758
  return code;
S
Shengliang Guan 已提交
759 760
}

S
Shengliang Guan 已提交
761 762
static int32_t mndProcessAlterDbReq(SRpcMsg *pReq) {
  SMnode     *pMnode = pReq->info.node;
S
Shengliang Guan 已提交
763 764 765
  int32_t     code = -1;
  SDbObj     *pDb = NULL;
  SAlterDbReq alterReq = {0};
S
Shengliang Guan 已提交
766
  SDbObj      dbObj = {0};
S
Shengliang Guan 已提交
767

S
Shengliang Guan 已提交
768
  if (tDeserializeSAlterDbReq(pReq->pCont, pReq->contLen, &alterReq) != 0) {
S
Shengliang Guan 已提交
769
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
770
    goto _OVER;
S
Shengliang Guan 已提交
771
  }
S
Shengliang Guan 已提交
772

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

S
Shengliang Guan 已提交
775
  pDb = mndAcquireDb(pMnode, alterReq.db);
S
Shengliang Guan 已提交
776
  if (pDb == NULL) {
S
Shengliang Guan 已提交
777
    terrno = TSDB_CODE_MND_DB_NOT_EXIST;
S
Shengliang Guan 已提交
778
    goto _OVER;
S
Shengliang Guan 已提交
779 780
  }

781
  if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_ALTER_DB, pDb) != 0) {
S
Shengliang Guan 已提交
782
    goto _OVER;
S
Shengliang Guan 已提交
783 784 785
  }

  memcpy(&dbObj, pDb, sizeof(SDbObj));
S
Shengliang Guan 已提交
786 787 788 789
  if (dbObj.cfg.pRetensions != NULL) {
    dbObj.cfg.pRetensions = taosArrayDup(pDb->cfg.pRetensions);
    if (dbObj.cfg.pRetensions == NULL) goto _OVER;
  }
S
Shengliang Guan 已提交
790

S
Shengliang Guan 已提交
791
  code = mndSetDbCfgFromAlterDbReq(&dbObj, &alterReq);
S
Shengliang Guan 已提交
792
  if (code != 0) goto _OVER;
S
Shengliang Guan 已提交
793

S
Shengliang Guan 已提交
794 795 796
  code = mndCheckDbCfg(pMnode, &dbObj.cfg);
  if (code != 0) goto _OVER;

S
Shengliang Guan 已提交
797 798
  dbObj.cfgVersion++;
  dbObj.updateTime = taosGetTimestampMs();
S
Shengliang Guan 已提交
799
  code = mndAlterDb(pMnode, pReq, pDb, &dbObj);
S
Shengliang Guan 已提交
800
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
S
Shengliang Guan 已提交
801

S
Shengliang Guan 已提交
802
_OVER:
S
Shengliang Guan 已提交
803
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
S
Shengliang Guan 已提交
804
    mError("db:%s, failed to alter since %s", alterReq.db, terrstr());
S
Shengliang Guan 已提交
805 806
  }

S
Shengliang Guan 已提交
807
  mndReleaseDb(pMnode, pDb);
S
Shengliang Guan 已提交
808
  taosArrayDestroy(dbObj.cfg.pRetensions);
S
Shengliang Guan 已提交
809 810

  return code;
S
Shengliang Guan 已提交
811 812
}

S
Shengliang Guan 已提交
813 814
static int32_t mndProcessGetDbCfgReq(SRpcMsg *pReq) {
  SMnode   *pMnode = pReq->info.node;
S
Shengliang Guan 已提交
815 816 817 818
  int32_t   code = -1;
  SDbObj   *pDb = NULL;
  SDbCfgReq cfgReq = {0};
  SDbCfgRsp cfgRsp = {0};
D
dapan1121 已提交
819

S
Shengliang Guan 已提交
820
  if (tDeserializeSDbCfgReq(pReq->pCont, pReq->contLen, &cfgReq) != 0) {
D
dapan1121 已提交
821
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
822
    goto _OVER;
D
dapan1121 已提交
823 824 825 826 827
  }

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

S
Shengliang Guan 已提交
831
  cfgRsp.numOfVgroups = pDb->cfg.numOfVgroups;
S
Shengliang Guan 已提交
832 833 834 835
  cfgRsp.numOfStables = pDb->cfg.numOfStables;
  cfgRsp.buffer = pDb->cfg.buffer;
  cfgRsp.pageSize = pDb->cfg.pageSize;
  cfgRsp.pages = pDb->cfg.pages;
S
Shengliang Guan 已提交
836 837 838 839 840 841
  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;
842
  cfgRsp.walFsyncPeriod = pDb->cfg.walFsyncPeriod;
S
Shengliang Guan 已提交
843 844 845 846 847
  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;
848
  cfgRsp.cacheLast = pDb->cfg.cacheLast;
C
Cary Xu 已提交
849 850
  cfgRsp.numOfRetensions = pDb->cfg.numOfRetensions;
  cfgRsp.pRetensions = pDb->cfg.pRetensions;
wmmhello's avatar
wmmhello 已提交
851
  cfgRsp.schemaless = pDb->cfg.schemaless;
D
dapan1121 已提交
852 853 854 855 856 857

  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 已提交
858
    goto _OVER;
D
dapan1121 已提交
859 860 861 862
  }

  tSerializeSDbCfgRsp(pRsp, contLen, &cfgRsp);

S
Shengliang Guan 已提交
863 864
  pReq->info.rsp = pRsp;
  pReq->info.rspLen = contLen;
D
dapan1121 已提交
865

866 867
  code = 0;

S
Shengliang Guan 已提交
868
_OVER:
D
dapan1121 已提交
869

S
Shengliang Guan 已提交
870
  if (code != 0) {
D
dapan1121 已提交
871 872 873 874 875 876 877 878
    mError("db:%s, failed to get cfg since %s", cfgReq.db, terrstr());
  }

  mndReleaseDb(pMnode, pDb);

  return code;
}

S
Shengliang Guan 已提交
879 880 881 882 883 884 885 886 887 888 889 890 891 892 893
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 已提交
894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914
  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);
  }

915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932
  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 已提交
933 934 935 936 937
  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 已提交
938 939
    SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
    if (mndAddDropVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid, true) != 0) {
S
Shengliang Guan 已提交
940 941 942 943
      return -1;
    }
  }

S
Shengliang Guan 已提交
944 945 946
  return 0;
}

S
Shengliang Guan 已提交
947 948 949
static int32_t mndSetDropDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
  SSdb *pSdb = pMnode->pSdb;
  void *pIter = NULL;
S
Shengliang Guan 已提交
950

S
Shengliang Guan 已提交
951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968
  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 已提交
969

970 971 972 973 974 975 976 977 978 979 980 981
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 已提交
982
    pRsp = taosMemoryMalloc(rspLen);
983 984 985 986 987 988 989 990 991 992 993 994 995
  }

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

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

S
Shengliang Guan 已提交
996
static int32_t mndDropDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb) {
S
Shengliang Guan 已提交
997
  int32_t code = -1;
998
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq);
S
Shengliang Guan 已提交
999
  if (pTrans == NULL) goto _OVER;
S
Shengliang Guan 已提交
1000

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

1004 1005
  if (mndCheckTopicExist(pMnode, pDb) < 0) goto _OVER;

S
Shengliang Guan 已提交
1006 1007
  if (mndSetDropDbRedoLogs(pMnode, pTrans, pDb) != 0) goto _OVER;
  if (mndSetDropDbCommitLogs(pMnode, pTrans, pDb) != 0) goto _OVER;
1008 1009 1010
  /*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 已提交
1011
  if (mndDropStreamByDb(pMnode, pTrans, pDb) != 0) goto _OVER;
1012
  if (mndDropSmasByDb(pMnode, pTrans, pDb) != 0) goto _OVER;
S
Shengliang Guan 已提交
1013
  if (mndSetDropDbRedoActions(pMnode, pTrans, pDb) != 0) goto _OVER;
S
Shengliang Guan 已提交
1014

1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025
  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);
  }

1026 1027
  int32_t rspLen = 0;
  void   *pRsp = NULL;
S
Shengliang Guan 已提交
1028
  if (mndBuildDropDbRsp(pDb, &rspLen, &pRsp, false) < 0) goto _OVER;
S
Shengliang Guan 已提交
1029 1030
  mndTransSetRpcRsp(pTrans, pRsp, rspLen);

S
Shengliang Guan 已提交
1031
  if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
S
Shengliang Guan 已提交
1032 1033
  code = 0;

S
Shengliang Guan 已提交
1034
_OVER:
S
Shengliang Guan 已提交
1035
  mndTransDrop(pTrans);
S
Shengliang Guan 已提交
1036
  return code;
S
Shengliang Guan 已提交
1037 1038
}

S
Shengliang Guan 已提交
1039 1040
static int32_t mndProcessDropDbReq(SRpcMsg *pReq) {
  SMnode    *pMnode = pReq->info.node;
S
Shengliang Guan 已提交
1041 1042 1043 1044
  int32_t    code = -1;
  SDbObj    *pDb = NULL;
  SDropDbReq dropReq = {0};

S
Shengliang Guan 已提交
1045
  if (tDeserializeSDropDbReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
S
Shengliang Guan 已提交
1046
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
1047
    goto _OVER;
S
Shengliang Guan 已提交
1048
  }
S
Shengliang Guan 已提交
1049

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

S
Shengliang Guan 已提交
1052
  pDb = mndAcquireDb(pMnode, dropReq.db);
S
Shengliang Guan 已提交
1053
  if (pDb == NULL) {
S
Shengliang Guan 已提交
1054
    if (dropReq.ignoreNotExists) {
S
Shengliang Guan 已提交
1055
      code = mndBuildDropDbRsp(pDb, &pReq->info.rspLen, &pReq->info.rsp, true);
S
Shengliang Guan 已提交
1056
      goto _OVER;
S
Shengliang Guan 已提交
1057 1058
    } else {
      terrno = TSDB_CODE_MND_DB_NOT_EXIST;
S
Shengliang Guan 已提交
1059
      goto _OVER;
S
Shengliang Guan 已提交
1060 1061 1062
    }
  }

1063
  if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_DROP_DB, pDb) != 0) {
S
Shengliang Guan 已提交
1064
    goto _OVER;
S
Shengliang Guan 已提交
1065 1066
  }

S
Shengliang Guan 已提交
1067
  code = mndDropDb(pMnode, pReq, pDb);
S
Shengliang Guan 已提交
1068
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
S
Shengliang Guan 已提交
1069

S
Shengliang Guan 已提交
1070
_OVER:
S
Shengliang Guan 已提交
1071
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
S
Shengliang Guan 已提交
1072 1073 1074 1075 1076
    mError("db:%s, failed to drop since %s", dropReq.db, terrstr());
  }

  mndReleaseDb(pMnode, pDb);
  return code;
S
Shengliang Guan 已提交
1077
}
S
Shengliang Guan 已提交
1078

S
Shengliang Guan 已提交
1079 1080
static int32_t mndGetDBTableNum(SDbObj *pDb, SMnode *pMnode) {
  int32_t numOfTables = 0;
D
dapan1121 已提交
1081 1082 1083 1084 1085 1086 1087 1088 1089
  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;

S
Shengliang Guan 已提交
1090
    if (mndVgroupInDb(pVgroup, pDb->uid)) {
S
Shengliang Guan 已提交
1091
      numOfTables += pVgroup->numOfTables / TSDB_TABLE_NUM_UNIT;
D
dapan1121 已提交
1092 1093 1094 1095 1096 1097 1098
      vindex++;
    }

    sdbRelease(pSdb, pVgroup);
  }

  sdbCancelFetch(pSdb, pIter);
S
Shengliang Guan 已提交
1099
  return numOfTables;
D
dapan1121 已提交
1100 1101
}

S
Shengliang Guan 已提交
1102
static void mndBuildDBVgroupInfo(SDbObj *pDb, SMnode *pMnode, SArray *pVgList) {
D
dapan1121 已提交
1103
  int32_t vindex = 0;
S
Shengliang Guan 已提交
1104
  SSdb   *pSdb = pMnode->pSdb;
D
dapan1121 已提交
1105 1106

  void *pIter = NULL;
1107
  while (1) {
D
dapan1121 已提交
1108 1109 1110 1111
    SVgObj *pVgroup = NULL;
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
    if (pIter == NULL) break;

S
Shengliang Guan 已提交
1112
    if ((NULL == pDb || pVgroup->dbUid == pDb->uid) && !pVgroup->isTsma) {
S
Shengliang Guan 已提交
1113 1114 1115 1116
      SVgroupInfo vgInfo = {0};
      vgInfo.vgId = pVgroup->vgId;
      vgInfo.hashBegin = pVgroup->hashBegin;
      vgInfo.hashEnd = pVgroup->hashEnd;
D
dapan1121 已提交
1117
      vgInfo.numOfTable = pVgroup->numOfTables / TSDB_TABLE_NUM_UNIT;
L
Liu Jicong 已提交
1118
      vgInfo.epSet.numOfEps = pVgroup->replica;
D
dapan1121 已提交
1119
      for (int32_t gid = 0; gid < pVgroup->replica; ++gid) {
S
Shengliang Guan 已提交
1120
        SVnodeGid *pVgid = &pVgroup->vnodeGid[gid];
L
Liu Jicong 已提交
1121
        SEp       *pEp = &vgInfo.epSet.eps[gid];
S
Shengliang Guan 已提交
1122
        SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
D
dapan1121 已提交
1123
        if (pDnode != NULL) {
1124
          memcpy(pEp->fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
S
Shengliang Guan 已提交
1125
          pEp->port = pDnode->port;
D
dapan1121 已提交
1126 1127 1128
        }
        mndReleaseDnode(pMnode, pDnode);
        if (pVgid->role == TAOS_SYNC_STATE_LEADER) {
L
Liu Jicong 已提交
1129
          vgInfo.epSet.inUse = gid;
D
dapan1121 已提交
1130 1131 1132
        }
      }
      vindex++;
S
Shengliang Guan 已提交
1133
      taosArrayPush(pVgList, &vgInfo);
D
dapan1121 已提交
1134 1135 1136
    }

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

D
dapan1121 已提交
1138 1139 1140
    if (pDb && (vindex >= pDb->cfg.numOfVgroups)) {
      break;
    }
D
dapan1121 已提交
1141
  }
S
Shengliang Guan 已提交
1142 1143

  sdbCancelFetch(pSdb, pIter);
D
dapan1121 已提交
1144 1145
}

L
Liu Jicong 已提交
1146 1147 1148 1149 1150 1151 1152
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 已提交
1153
  int32_t numOfTable = mndGetDBTableNum(pDb, pMnode);
L
Liu Jicong 已提交
1154 1155 1156 1157 1158 1159 1160 1161 1162

  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 已提交
1163
  pRsp->hashMethod = pDb->cfg.hashMethod;
L
Liu Jicong 已提交
1164 1165 1166
  return 0;
}

S
Shengliang Guan 已提交
1167 1168
static int32_t mndProcessUseDbReq(SRpcMsg *pReq) {
  SMnode   *pMnode = pReq->info.node;
S
Shengliang Guan 已提交
1169 1170 1171 1172 1173
  int32_t   code = -1;
  SDbObj   *pDb = NULL;
  SUseDbReq usedbReq = {0};
  SUseDbRsp usedbRsp = {0};

S
Shengliang Guan 已提交
1174
  if (tDeserializeSUseDbReq(pReq->pCont, pReq->contLen, &usedbReq) != 0) {
S
Shengliang Guan 已提交
1175
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
1176
    goto _OVER;
S
Shengliang Guan 已提交
1177
  }
S
Shengliang Guan 已提交
1178

D
dapan1121 已提交
1179
  char *p = strchr(usedbReq.db, '.');
1180
  if (p && ((0 == strcmp(p + 1, TSDB_INFORMATION_SCHEMA_DB) || (0 == strcmp(p + 1, TSDB_PERFORMANCE_SCHEMA_DB))))) {
D
dapan1121 已提交
1181
    memcpy(usedbRsp.db, usedbReq.db, TSDB_DB_FNAME_LEN);
1182
    int32_t vgVersion = mndGetGlobalVgroupVersion(pMnode);
D
dapan1121 已提交
1183 1184 1185 1186
    if (usedbReq.vgVersion < vgVersion) {
      usedbRsp.pVgroupInfos = taosArrayInit(10, sizeof(SVgroupInfo));
      if (usedbRsp.pVgroupInfos == NULL) {
        terrno = TSDB_CODE_OUT_OF_MEMORY;
S
Shengliang Guan 已提交
1187
        goto _OVER;
D
dapan1121 已提交
1188
      }
L
Liu Jicong 已提交
1189

D
dapan1121 已提交
1190
      mndBuildDBVgroupInfo(NULL, pMnode, usedbRsp.pVgroupInfos);
D
dapan1121 已提交
1191
      usedbRsp.vgVersion = vgVersion++;
D
dapan1121 已提交
1192 1193 1194
    } else {
      usedbRsp.vgVersion = usedbReq.vgVersion;
    }
L
Liu Jicong 已提交
1195
    usedbRsp.vgNum = taosArrayGetSize(usedbRsp.pVgroupInfos);
D
dapan1121 已提交
1196
    code = 0;
D
dapan1121 已提交
1197 1198

    // no jump, need to construct rsp
D
dapan1121 已提交
1199 1200 1201 1202
  } else {
    pDb = mndAcquireDb(pMnode, usedbReq.db);
    if (pDb == NULL) {
      terrno = TSDB_CODE_MND_DB_NOT_EXIST;
S
Shengliang Guan 已提交
1203

X
Xiaoyu Wang 已提交
1204 1205 1206
      memcpy(usedbRsp.db, usedbReq.db, TSDB_DB_FNAME_LEN);
      usedbRsp.uid = usedbReq.dbId;
      usedbRsp.vgVersion = usedbReq.vgVersion;
S
Shengliang Guan 已提交
1207

X
Xiaoyu Wang 已提交
1208 1209
      mError("db:%s, failed to process use db req since %s", usedbReq.db, terrstr());
    } else {
1210
      if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_USE_DB, pDb) != 0) {
S
Shengliang Guan 已提交
1211
        goto _OVER;
X
Xiaoyu Wang 已提交
1212
      }
S
Shengliang Guan 已提交
1213

L
Liu Jicong 已提交
1214
      if (mndExtractDbInfo(pMnode, pDb, &usedbRsp, &usedbReq) < 0) {
S
Shengliang Guan 已提交
1215
        goto _OVER;
X
Xiaoyu Wang 已提交
1216 1217 1218 1219
      }

      code = 0;
    }
D
dapan1121 已提交
1220
  }
S
Shengliang Guan 已提交
1221

S
Shengliang Guan 已提交
1222 1223 1224 1225
  int32_t contLen = tSerializeSUseDbRsp(NULL, 0, &usedbRsp);
  void   *pRsp = rpcMallocCont(contLen);
  if (pRsp == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
X
Xiaoyu Wang 已提交
1226
    code = -1;
S
Shengliang Guan 已提交
1227
    goto _OVER;
S
Shengliang Guan 已提交
1228 1229
  }

S
Shengliang Guan 已提交
1230
  tSerializeSUseDbRsp(pRsp, contLen, &usedbRsp);
S
Shengliang Guan 已提交
1231

S
Shengliang Guan 已提交
1232 1233
  pReq->info.rsp = pRsp;
  pReq->info.rspLen = contLen;
S
Shengliang Guan 已提交
1234

S
Shengliang Guan 已提交
1235
_OVER:
S
Shengliang Guan 已提交
1236 1237 1238
  if (code != 0) {
    mError("db:%s, failed to process use db req since %s", usedbReq.db, terrstr());
  }
D
dapan1121 已提交
1239

S
Shengliang Guan 已提交
1240 1241
  mndReleaseDb(pMnode, pDb);
  tFreeSUsedbRsp(&usedbRsp);
D
dapan1121 已提交
1242

S
Shengliang Guan 已提交
1243 1244
  return code;
}
S
Shengliang Guan 已提交
1245

S
Shengliang Guan 已提交
1246 1247 1248 1249 1250 1251 1252
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 已提交
1253

S
Shengliang Guan 已提交
1254 1255 1256 1257
  for (int32_t i = 0; i < numOfDbs; ++i) {
    SDbVgVersion *pDbVgVersion = &pDbs[i];
    pDbVgVersion->dbId = htobe64(pDbVgVersion->dbId);
    pDbVgVersion->vgVersion = htonl(pDbVgVersion->vgVersion);
D
dapan1121 已提交
1258
    pDbVgVersion->numOfTable = htonl(pDbVgVersion->numOfTable);
D
dapan1121 已提交
1259

S
Shengliang Guan 已提交
1260 1261
    SUseDbRsp usedbRsp = {0};

S
Shengliang Guan 已提交
1262
    SDbObj *pDb = mndAcquireDb(pMnode, pDbVgVersion->dbFName);
S
Shengliang Guan 已提交
1263
    if (pDb == NULL) {
1264
      mTrace("db:%s, no exist", pDbVgVersion->dbFName);
S
Shengliang Guan 已提交
1265 1266 1267 1268
      memcpy(usedbRsp.db, pDbVgVersion->dbFName, TSDB_DB_FNAME_LEN);
      usedbRsp.uid = pDbVgVersion->dbId;
      usedbRsp.vgVersion = -1;
      taosArrayPush(batchUseRsp.pArray, &usedbRsp);
D
dapan1121 已提交
1269
      continue;
D
dapan1121 已提交
1270
    }
S
Shengliang Guan 已提交
1271

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

D
dapan1121 已提交
1274
    if (pDbVgVersion->vgVersion >= pDb->vgVersion && numOfTable == pDbVgVersion->numOfTable) {
1275
      mDebug("db:%s, version and numOfTable not changed", pDbVgVersion->dbFName);
S
Shengliang Guan 已提交
1276
      mndReleaseDb(pMnode, pDb);
D
dapan1121 已提交
1277
      continue;
1278 1279 1280
    } else {
      mDebug("db:%s, vgroup version changed from %d to %d", pDbVgVersion->dbFName, pDbVgVersion->vgVersion,
             pDb->vgVersion);
D
dapan1121 已提交
1281
    }
L
Liu Jicong 已提交
1282

D
dapan1121 已提交
1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294
    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 已提交
1295
    usedbRsp.hashMethod = pDb->cfg.hashMethod;
D
dapan1121 已提交
1296 1297 1298

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

S
Shengliang Guan 已提交
1301
  int32_t rspLen = tSerializeSUseDbBatchRsp(NULL, 0, &batchUseRsp);
wafwerar's avatar
wafwerar 已提交
1302
  void   *pRsp = taosMemoryMalloc(rspLen);
S
Shengliang Guan 已提交
1303 1304 1305 1306
  if (pRsp == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    tFreeSUseDbBatchRsp(&batchUseRsp);
    return -1;
D
dapan1121 已提交
1307
  }
S
Shengliang Guan 已提交
1308
  tSerializeSUseDbBatchRsp(pRsp, rspLen, &batchUseRsp);
D
dapan1121 已提交
1309

S
Shengliang Guan 已提交
1310 1311 1312 1313
  *ppRsp = pRsp;
  *pRspLen = rspLen;

  tFreeSUseDbBatchRsp(&batchUseRsp);
D
dapan1121 已提交
1314 1315 1316
  return 0;
}

S
Shengliang Guan 已提交
1317 1318
static int32_t mndCompactDb(SMnode *pMnode, SDbObj *pDb) { return 0; }

S
Shengliang Guan 已提交
1319 1320
static int32_t mndProcessCompactDbReq(SRpcMsg *pReq) {
  SMnode       *pMnode = pReq->info.node;
S
Shengliang Guan 已提交
1321 1322 1323 1324
  int32_t       code = -1;
  SDbObj       *pDb = NULL;
  SCompactDbReq compactReq = {0};

S
Shengliang Guan 已提交
1325
  if (tDeserializeSCompactDbReq(pReq->pCont, pReq->contLen, &compactReq) != 0) {
S
Shengliang Guan 已提交
1326
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
1327
    goto _OVER;
S
Shengliang Guan 已提交
1328 1329
  }

S
Shengliang Guan 已提交
1330
  mDebug("db:%s, start to compact", compactReq.db);
S
Shengliang Guan 已提交
1331 1332

  pDb = mndAcquireDb(pMnode, compactReq.db);
S
Shengliang Guan 已提交
1333
  if (pDb == NULL) {
S
Shengliang Guan 已提交
1334
    goto _OVER;
S
Shengliang Guan 已提交
1335 1336
  }

1337
  if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_COMPACT_DB, pDb) != 0) {
S
Shengliang Guan 已提交
1338
    goto _OVER;
S
Shengliang Guan 已提交
1339 1340
  }

S
Shengliang Guan 已提交
1341
  code = mndCompactDb(pMnode, pDb);
S
Shengliang Guan 已提交
1342

S
Shengliang Guan 已提交
1343
_OVER:
S
Shengliang Guan 已提交
1344 1345
  if (code != 0) {
    mError("db:%s, failed to process compact db req since %s", compactReq.db, terrstr());
S
Shengliang Guan 已提交
1346
  }
S
Shengliang Guan 已提交
1347 1348

  mndReleaseDb(pMnode, pDb);
S
Shengliang Guan 已提交
1349
  return code;
S
Shengliang Guan 已提交
1350
}
S
Shengliang Guan 已提交
1351

S
Shengliang Guan 已提交
1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420
static int32_t mndTrimDb(SMnode *pMnode, SDbObj *pDb) {
  SSdb       *pSdb = pMnode->pSdb;
  SVgObj     *pVgroup = NULL;
  void       *pIter = NULL;
  SVTrimDbReq trimReq = {.timestamp = taosGetTimestampSec()};
  int32_t     reqLen = tSerializeSVTrimDbReq(NULL, 0, &trimReq);
  int32_t     contLen = reqLen + sizeof(SMsgHead);

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

    SMsgHead *pHead = rpcMallocCont(contLen);
    if (pHead == NULL) {
      sdbCancelFetch(pSdb, pVgroup);
      sdbRelease(pSdb, pVgroup);
      continue;
    }
    pHead->contLen = htonl(contLen);
    pHead->vgId = htonl(pVgroup->vgId);
    tSerializeSVTrimDbReq((char *)pHead + sizeof(SMsgHead), contLen, &trimReq);

    SRpcMsg rpcMsg = {.msgType = TDMT_VND_TRIM, .pCont = pHead, .contLen = contLen};
    SEpSet  epSet = mndGetVgroupEpset(pMnode, pVgroup);
    int32_t code = tmsgSendReq(&epSet, &rpcMsg);
    if (code != 0) {
      mError("vgId:%d, failed to send vnode-trim request to vnode since 0x%x", pVgroup->vgId, code);
    } else {
      mDebug("vgId:%d, send vnode-trim request to vnode, time:%d", pVgroup->vgId, trimReq.timestamp);
    }
    sdbRelease(pSdb, pVgroup);
  }

  return 0;
}

static int32_t mndProcessTrimDbReq(SRpcMsg *pReq) {
  SMnode    *pMnode = pReq->info.node;
  int32_t    code = -1;
  SDbObj    *pDb = NULL;
  STrimDbReq trimReq = {0};

  if (tDeserializeSTrimDbReq(pReq->pCont, pReq->contLen, &trimReq) != 0) {
    terrno = TSDB_CODE_INVALID_MSG;
    goto _OVER;
  }

  mDebug("db:%s, start to trim", trimReq.db);

  pDb = mndAcquireDb(pMnode, trimReq.db);
  if (pDb == NULL) {
    goto _OVER;
  }

  if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_TRIM_DB, pDb) != 0) {
    goto _OVER;
  }

  code = mndTrimDb(pMnode, pDb);

_OVER:
  if (code != 0) {
    mError("db:%s, failed to process trim db req since %s", trimReq.db, terrstr());
  }

  mndReleaseDb(pMnode, pDb);
  return code;
}

S
Shengliang Guan 已提交
1421
const char *mndGetDbStr(const char *src) {
S
Shengliang Guan 已提交
1422 1423
  char *pos = strstr(src, TS_PATH_DELIMITER);
  if (pos != NULL) ++pos;
S
Shengliang Guan 已提交
1424
  if (pos == NULL) return src;
S
Shengliang Guan 已提交
1425 1426 1427
  return pos;
}

M
Minglei Jin 已提交
1428
static int64_t getValOfDiffPrecision(int8_t unit, int64_t val) {
1429
  int64_t v = 0;
1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445
  switch (unit) {
    case 's':
      v = val / 1000;
      break;
    case 'm':
      v = val / tsTickPerMin[TSDB_TIME_PRECISION_MILLI];
      break;
    case 'h':
      v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 60);
      break;
    case 'd':
      v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 24 * 60);
      break;
    case 'w':
      v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 24 * 60 * 7);
      break;
1446 1447 1448 1449 1450 1451 1452
    default:
      break;
  }

  return v;
}

M
Minglei Jin 已提交
1453
static char *buildRetension(SArray *pRetension) {
1454 1455 1456 1457 1458
  size_t size = taosArrayGetSize(pRetension);
  if (size == 0) {
    return NULL;
  }

1459 1460
  char       *p1 = taosMemoryCalloc(1, 100);
  SRetention *p = taosArrayGet(pRetension, 0);
1461 1462 1463 1464 1465

  int32_t len = 2;

  int64_t v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
  int64_t v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
1466
  len += sprintf(p1 + len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
1467

1468 1469 1470
  if (size > 1) {
    len += sprintf(p1 + len, ",");
    p = taosArrayGet(pRetension, 1);
1471

1472 1473 1474 1475
    v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
    v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
    len += sprintf(p1 + len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
  }
1476

1477 1478 1479
  if (size > 2) {
    len += sprintf(p1 + len, ",");
    p = taosArrayGet(pRetension, 2);
1480

1481 1482 1483 1484
    v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
    v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
    len += sprintf(p1 + len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
  }
1485 1486 1487 1488 1489

  varDataSetLen(p1, len);
  return p1;
}

1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505
static const char *getCacheModelStr(int8_t cacheModel) {
  switch (cacheModel) {
    case TSDB_CACHE_MODEL_NONE:
      return TSDB_CACHE_MODEL_NONE_STR;
    case TSDB_CACHE_MODEL_LAST_ROW:
      return TSDB_CACHE_MODEL_LAST_ROW_STR;
    case TSDB_CACHE_MODEL_LAST_VALUE:
      return TSDB_CACHE_MODEL_LAST_VALUE_STR;
    case TSDB_CACHE_MODEL_BOTH:
      return TSDB_CACHE_MODEL_BOTH_STR;
    default:
      break;
  }
  return "unknown";
}

1506
bool mndIsDbReady(SMnode *pMnode, SDbObj *pDb) {
1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533
  if (pDb->cfg.replications == 1) return true;

  SSdb *pSdb = pMnode->pSdb;
  void *pIter = NULL;
  bool  isReady = true;
  while (1) {
    SVgObj *pVgroup = NULL;
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
    if (pIter == NULL) break;

    if (pVgroup->dbUid == pDb->uid && pVgroup->replica > 1) {
      bool hasLeader = false;
      for (int32_t i = 0; i < pVgroup->replica; ++i) {
        if (pVgroup->vnodeGid[i].role == TAOS_SYNC_STATE_LEADER) {
          hasLeader = true;
        }
      }
      if (!hasLeader) isReady = false;
    }
    sdbRelease(pSdb, pVgroup);
  }

  return isReady;
}

static void mndDumpDbInfoData(SMnode *pMnode, SSDataBlock *pBlock, SDbObj *pDb, SShowObj *pShow, int32_t rows,
                              int64_t numOfTables, bool sysDb, ESdbStatus objStatus, bool sysinfo) {
S
Shengliang Guan 已提交
1534
  int32_t cols = 0;
1535 1536
  int32_t bytes = pShow->pMeta->pSchemas[cols].bytes;
  char   *buf = taosMemoryMalloc(bytes);
S
Shengliang Guan 已提交
1537

S
Shengliang Guan 已提交
1538
  const char *name = mndGetDbStr(pDb->name);
H
Haojun Liao 已提交
1539
  if (name != NULL) {
1540
    STR_WITH_MAXSIZE_TO_VARSTR(buf, name, bytes);
H
Haojun Liao 已提交
1541
  } else {
1542
    STR_WITH_MAXSIZE_TO_VARSTR(buf, "NULL", bytes);
H
Haojun Liao 已提交
1543
  }
S
Shengliang Guan 已提交
1544

1545
  char *statusStr = "ready";
1546 1547 1548 1549 1550 1551 1552 1553 1554 1555
  if (objStatus == SDB_STATUS_CREATING) {
    statusStr = "creating";
  } else if (objStatus == SDB_STATUS_DROPPING) {
    statusStr = "dropping";
  } else {
    if (!sysDb && !mndIsDbReady(pMnode, pDb)) {
      statusStr = "unsynced";
    }
  }

1556 1557
  char statusVstr[24] = {0};
  STR_WITH_SIZE_TO_VARSTR(statusVstr, statusStr, strlen(statusStr));
S
Shengliang Guan 已提交
1558

1559
  if (sysDb || !sysinfo) {
S
Shengliang Guan 已提交
1560 1561
    for (int32_t i = 0; i < pShow->numOfColumns; ++i) {
      SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, i);
1562 1563 1564 1565
      if (i == 0) {
        colDataAppend(pColInfo, rows, buf, false);
      } else if (i == 3) {
        colDataAppend(pColInfo, rows, (const char *)&numOfTables, false);
1566
      } else if (i == 15) {
1567
        colDataAppend(pColInfo, rows, statusVstr, false);
1568 1569 1570 1571 1572 1573 1574
      } else {
        colDataAppendNULL(pColInfo, rows);
      }
    }
  } else {
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, buf, false);
S
Shengliang Guan 已提交
1575

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

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

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

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

1588
    const char *strictStr = pDb->cfg.strict ? "on" : "off";
1589 1590
    char        strictVstr[24] = {0};
    STR_WITH_SIZE_TO_VARSTR(strictVstr, strictStr, strlen(strictStr));
1591
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1592
    colDataAppend(pColInfo, rows, (const char *)strictVstr, false);
S
Shengliang Guan 已提交
1593

1594 1595 1596
    char    durationVstr[128] = {0};
    int32_t len = sprintf(&durationVstr[VARSTR_HEADER_SIZE], "%dm", pDb->cfg.daysPerFile);
    varDataSetLen(durationVstr, len);
D
dapan1121 已提交
1597
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1598
    colDataAppend(pColInfo, rows, (const char *)durationVstr, false);
D
dapan1121 已提交
1599

1600
    char keepVstr[128] = {0};
1601
    if (pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep1 || pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep2) {
1602
      len = sprintf(&keepVstr[VARSTR_HEADER_SIZE], "%dm,%dm,%dm", pDb->cfg.daysToKeep1, pDb->cfg.daysToKeep2,
1603 1604
                    pDb->cfg.daysToKeep0);
    } else {
1605
      len = sprintf(&keepVstr[VARSTR_HEADER_SIZE], "%dm,%dm,%dm", pDb->cfg.daysToKeep0, pDb->cfg.daysToKeep1,
1606 1607
                    pDb->cfg.daysToKeep2);
    }
1608
    varDataSetLen(keepVstr, len);
1609
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1610
    colDataAppend(pColInfo, rows, (const char *)keepVstr, false);
S
Shengliang Guan 已提交
1611

1612
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
S
Shengliang Guan 已提交
1613 1614 1615 1616
    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 已提交
1617

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

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

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

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

1630
    const char *precStr = NULL;
1631 1632
    switch (pDb->cfg.precision) {
      case TSDB_TIME_PRECISION_MILLI:
1633
        precStr = TSDB_TIME_PRECISION_MILLI_STR;
1634 1635
        break;
      case TSDB_TIME_PRECISION_MICRO:
1636
        precStr = TSDB_TIME_PRECISION_MICRO_STR;
1637 1638
        break;
      case TSDB_TIME_PRECISION_NANO:
1639
        precStr = TSDB_TIME_PRECISION_NANO_STR;
1640 1641
        break;
      default:
1642
        precStr = "none";
1643 1644
        break;
    }
1645 1646
    char precVstr[10] = {0};
    STR_WITH_SIZE_TO_VARSTR(precVstr, precStr, 2);
1647
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1648
    colDataAppend(pColInfo, rows, (const char *)precVstr, false);
D
dapan1121 已提交
1649

wmmhello's avatar
wmmhello 已提交
1650
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1651
    colDataAppend(pColInfo, rows, (const char *)statusVstr, false);
1652

1653
    char *rentensionVstr = buildRetension(pDb->cfg.pRetensions);
1654
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1655
    if (rentensionVstr == NULL) {
1656 1657
      colDataAppendNULL(pColInfo, rows);
    } else {
1658 1659
      colDataAppend(pColInfo, rows, (const char *)rentensionVstr, false);
      taosMemoryFree(rentensionVstr);
1660
    }
1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683

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

    const char *cacheModelStr = getCacheModelStr(pDb->cfg.cacheLast);
    char        cacheModelVstr[24] = {0};
    STR_WITH_SIZE_TO_VARSTR(cacheModelVstr, cacheModelStr, strlen(cacheModelStr));
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, (const char *)cacheModelVstr, false);

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

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

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

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

    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1684
    colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.walRetentionSize, false);
1685 1686

    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1687
    colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.walRollPeriod, false);
1688 1689 1690

    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.walSegmentSize, false);
1691 1692 1693

    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.sstTrigger, false);
1694
  }
1695 1696

  taosMemoryFree(buf);
H
Haojun Liao 已提交
1697 1698
}

L
Liu Jicong 已提交
1699
static void setInformationSchemaDbCfg(SDbObj *pDbObj) {
1700
  tstrncpy(pDbObj->name, TSDB_INFORMATION_SCHEMA_DB, tListLen(pDbObj->name));
L
Liu Jicong 已提交
1701
  pDbObj->createdTime = 0;
H
Haojun Liao 已提交
1702
  pDbObj->cfg.numOfVgroups = 0;
S
Shengliang Guan 已提交
1703
  pDbObj->cfg.strict = 1;
H
Haojun Liao 已提交
1704
  pDbObj->cfg.replications = 1;
L
Liu Jicong 已提交
1705
  pDbObj->cfg.precision = TSDB_TIME_PRECISION_MILLI;
H
Haojun Liao 已提交
1706 1707
}

S
Shengliang Guan 已提交
1708
static void setPerfSchemaDbCfg(SDbObj *pDbObj) {
1709
  tstrncpy(pDbObj->name, TSDB_PERFORMANCE_SCHEMA_DB, tListLen(pDbObj->name));
1710 1711
  pDbObj->createdTime = 0;
  pDbObj->cfg.numOfVgroups = 0;
S
Shengliang Guan 已提交
1712
  pDbObj->cfg.strict = 1;
1713 1714 1715 1716
  pDbObj->cfg.replications = 1;
  pDbObj->cfg.precision = TSDB_TIME_PRECISION_MILLI;
}

1717 1718 1719
static bool mndGetTablesOfDbFp(SMnode *pMnode, void *pObj, void *p1, void *p2, void *p3) {
  SVgObj  *pVgroup = pObj;
  int32_t *numOfTables = p1;
1720
  int64_t  uid = *(int64_t *)p2;
D
dapan1121 已提交
1721 1722 1723
  if (pVgroup->dbUid == uid) {
    *numOfTables += pVgroup->numOfTables;
  }
1724 1725 1726
  return true;
}

S
Shengliang Guan 已提交
1727
static int32_t mndRetrieveDbs(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rowsCapacity) {
1728 1729 1730 1731 1732
  SMnode    *pMnode = pReq->info.node;
  SSdb      *pSdb = pMnode->pSdb;
  int32_t    numOfRows = 0;
  SDbObj    *pDb = NULL;
  ESdbStatus objStatus = 0;
H
Haojun Liao 已提交
1733

1734 1735 1736 1737
  SUserObj *pUser = mndAcquireUser(pMnode, pReq->info.conn.user);
  if (pUser == NULL) return 0;
  bool sysinfo = pUser->sysInfo;

1738 1739 1740 1741
  // Append the information_schema database into the result.
  if (!pShow->sysDbRsp) {
    SDbObj infoschemaDb = {0};
    setInformationSchemaDbCfg(&infoschemaDb);
D
dapan1121 已提交
1742
    size_t numOfTables = 0;
1743
    getVisibleInfosTablesNum(sysinfo, &numOfTables);
1744
    mndDumpDbInfoData(pMnode, pBlock, &infoschemaDb, pShow, numOfRows, numOfTables, true, 0, 1);
1745 1746 1747 1748 1749

    numOfRows += 1;

    SDbObj perfschemaDb = {0};
    setPerfSchemaDbCfg(&perfschemaDb);
D
dapan1121 已提交
1750 1751
    numOfTables = 0;
    getPerfDbMeta(NULL, &numOfTables);
1752
    mndDumpDbInfoData(pMnode, pBlock, &perfschemaDb, pShow, numOfRows, numOfTables, true, 0, 1);
1753 1754 1755 1756 1757

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

H
Haojun Liao 已提交
1758
  while (numOfRows < rowsCapacity) {
1759
    pShow->pIter = sdbFetchAll(pSdb, SDB_DB, pShow->pIter, (void **)&pDb, &objStatus);
1760
    if (pShow->pIter == NULL) break;
S
Shengliang Guan 已提交
1761

1762 1763
    if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_READ_OR_WRITE_DB, pDb) == 0) {
      int32_t numOfTables = 0;
D
dapan1121 已提交
1764
      sdbTraverse(pSdb, SDB_VGROUP, mndGetTablesOfDbFp, &numOfTables, &pDb->uid, NULL);
1765
      mndDumpDbInfoData(pMnode, pBlock, pDb, pShow, numOfRows, numOfTables, false, objStatus, sysinfo);
1766 1767
      numOfRows++;
    }
1768

S
Shengliang Guan 已提交
1769 1770 1771
    sdbRelease(pSdb, pDb);
  }

1772
  pShow->numOfRows += numOfRows;
1773
  mndReleaseUser(pMnode, pUser);
S
Shengliang Guan 已提交
1774 1775 1776 1777 1778
  return numOfRows;
}

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