mndDb.c 54.8 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 33
#define DB_VER_NUMBER   1
#define DB_RESERVE_SIZE 64
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 105 106 107 108 109 110
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.daysPerFile, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.daysToKeep0, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.daysToKeep1, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.daysToKeep2, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.minRows, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.maxRows, _OVER)
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.fsyncPeriod, _OVER)
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.walLevel, _OVER)
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.precision, _OVER)
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.compression, _OVER)
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.replications, _OVER)
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.strict, _OVER)
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
sma  
Shengliang Guan 已提交
123

S
Shengliang Guan 已提交
124 125
  SDB_SET_RESERVE(pRaw, dataPos, DB_RESERVE_SIZE, _OVER)
  SDB_SET_DATALEN(pRaw, dataPos, _OVER)
126 127 128

  terrno = 0;

S
Shengliang Guan 已提交
129
_OVER:
130 131 132 133 134
  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 已提交
135

136
  mTrace("db:%s, encode to raw:%p, row:%p", pDb->name, pRaw, pDb);
S
Shengliang Guan 已提交
137 138 139 140
  return pRaw;
}

static SSdbRow *mndDbActionDecode(SSdbRaw *pRaw) {
141 142
  terrno = TSDB_CODE_OUT_OF_MEMORY;

S
Shengliang Guan 已提交
143
  int8_t sver = 0;
S
Shengliang Guan 已提交
144
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
S
Shengliang Guan 已提交
145

S
Shengliang Guan 已提交
146
  if (sver != DB_VER_NUMBER) {
S
Shengliang Guan 已提交
147
    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
S
Shengliang Guan 已提交
148
    goto _OVER;
S
Shengliang Guan 已提交
149 150 151
  }

  SSdbRow *pRow = sdbAllocRow(sizeof(SDbObj));
S
Shengliang Guan 已提交
152
  if (pRow == NULL) goto _OVER;
153 154

  SDbObj *pDb = sdbGetRowObj(pRow);
S
Shengliang Guan 已提交
155
  if (pDb == NULL) goto _OVER;
S
Shengliang Guan 已提交
156 157

  int32_t dataPos = 0;
S
Shengliang Guan 已提交
158 159 160 161 162 163 164 165 166
  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 已提交
167 168 169 170
  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)
171
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.cacheLastSize, _OVER)
S
Shengliang Guan 已提交
172 173 174 175 176 177 178 179 180 181 182 183
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysPerFile, _OVER)
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysToKeep0, _OVER)
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysToKeep1, _OVER)
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysToKeep2, _OVER)
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.minRows, _OVER)
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.maxRows, _OVER)
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.fsyncPeriod, _OVER)
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.walLevel, _OVER)
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.precision, _OVER)
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.compression, _OVER)
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.replications, _OVER)
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.strict, _OVER)
184
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.cacheLast, _OVER)
S
Shengliang Guan 已提交
185 186
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.hashMethod, _OVER)
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.numOfRetensions, _OVER)
S
sma  
Shengliang Guan 已提交
187 188
  if (pDb->cfg.numOfRetensions > 0) {
    pDb->cfg.pRetensions = taosArrayInit(pDb->cfg.numOfRetensions, sizeof(SRetention));
S
Shengliang Guan 已提交
189
    if (pDb->cfg.pRetensions == NULL) goto _OVER;
S
sma  
Shengliang Guan 已提交
190
    for (int32_t i = 0; i < pDb->cfg.numOfRetensions; ++i) {
X
Xiaoyu Wang 已提交
191 192 193 194 195 196
      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 已提交
197
        goto _OVER;
S
sma  
Shengliang Guan 已提交
198 199 200
      }
    }
  }
wmmhello's avatar
wmmhello 已提交
201
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.schemaless, _OVER)
S
sma  
Shengliang Guan 已提交
202

S
Shengliang Guan 已提交
203
  SDB_GET_RESERVE(pRaw, dataPos, DB_RESERVE_SIZE, _OVER)
S
Shengliang Guan 已提交
204
  taosInitRWLatch(&pDb->lock);
205 206 207

  terrno = 0;

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

215
  mTrace("db:%s, decode from raw:%p, row:%p", pDb->name, pRaw, pDb);
S
Shengliang Guan 已提交
216 217 218 219
  return pRow;
}

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

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

S
Shengliang Guan 已提交
230 231
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);
232
  taosWLockLatch(&pOld->lock);
S
Shengliang Guan 已提交
233 234 235
  pOld->updateTime = pNew->updateTime;
  pOld->cfgVersion = pNew->cfgVersion;
  pOld->vgVersion = pNew->vgVersion;
S
Shengliang Guan 已提交
236 237
  pOld->cfg.buffer = pNew->cfg.buffer;
  pOld->cfg.pageSize = pNew->cfg.pageSize;
238
  pOld->cfg.pages = pNew->cfg.pages;
239
  pOld->cfg.cacheLastSize = pNew->cfg.cacheLastSize;
S
Shengliang Guan 已提交
240 241 242 243 244 245 246
  pOld->cfg.daysPerFile = pNew->cfg.daysPerFile;
  pOld->cfg.daysToKeep0 = pNew->cfg.daysToKeep0;
  pOld->cfg.daysToKeep1 = pNew->cfg.daysToKeep1;
  pOld->cfg.daysToKeep2 = pNew->cfg.daysToKeep2;
  pOld->cfg.fsyncPeriod = pNew->cfg.fsyncPeriod;
  pOld->cfg.walLevel = pNew->cfg.walLevel;
  pOld->cfg.strict = pNew->cfg.strict;
247
  pOld->cfg.cacheLast = pNew->cfg.cacheLast;
S
Shengliang Guan 已提交
248
  pOld->cfg.replications = pNew->cfg.replications;
249
  taosWUnLockLatch(&pOld->lock);
S
Shengliang Guan 已提交
250 251 252
  return 0;
}

S
Shengliang Guan 已提交
253 254 255 256
static inline int32_t mndGetGlobalVgroupVersion(SMnode *pMnode) {
  SSdb *pSdb = pMnode->pSdb;
  return sdbGetTableVer(pSdb, SDB_VGROUP);
}
257

S
Shengliang Guan 已提交
258
SDbObj *mndAcquireDb(SMnode *pMnode, const char *db) {
S
Shengliang Guan 已提交
259 260
  SSdb   *pSdb = pMnode->pSdb;
  SDbObj *pDb = sdbAcquire(pSdb, SDB_DB, db);
S
Shengliang Guan 已提交
261
  if (pDb == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
S
Shengliang Guan 已提交
262 263 264
    terrno = TSDB_CODE_MND_DB_NOT_EXIST;
  }
  return pDb;
S
Shengliang Guan 已提交
265
}
S
Shengliang Guan 已提交
266

S
Shengliang Guan 已提交
267 268 269 270 271
void mndReleaseDb(SMnode *pMnode, SDbObj *pDb) {
  SSdb *pSdb = pMnode->pSdb;
  sdbRelease(pSdb, pDb);
}

S
Shengliang Guan 已提交
272
static int32_t mndCheckDbName(const char *dbName, SUserObj *pUser) {
S
Shengliang Guan 已提交
273 274 275 276 277 278 279 280 281 282 283 284 285 286 287
  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 已提交
288
static int32_t mndCheckDbCfg(SMnode *pMnode, SDbCfg *pCfg) {
S
Shengliang Guan 已提交
289 290
  terrno = TSDB_CODE_MND_INVALID_DB_OPTION;

291
  if (pCfg->numOfVgroups < TSDB_MIN_VNODES_PER_DB || pCfg->numOfVgroups > TSDB_MAX_VNODES_PER_DB) return -1;
S
Shengliang Guan 已提交
292 293 294 295
  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;
296
  if (pCfg->cacheLastSize < TSDB_MIN_DB_CACHE_SIZE || pCfg->cacheLastSize > TSDB_MAX_DB_CACHE_SIZE) return -1;
S
Shengliang Guan 已提交
297 298 299 300
  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 已提交
301
  if (pCfg->daysToKeep0 < pCfg->daysPerFile) return -1;
S
Shengliang Guan 已提交
302 303
  if (pCfg->daysToKeep0 > pCfg->daysToKeep1) return -1;
  if (pCfg->daysToKeep1 > pCfg->daysToKeep2) return -1;
S
Shengliang Guan 已提交
304 305
  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 已提交
306 307 308 309 310
  if (pCfg->minRows > pCfg->maxRows) return -1;
  if (pCfg->fsyncPeriod < TSDB_MIN_FSYNC_PERIOD || pCfg->fsyncPeriod > TSDB_MAX_FSYNC_PERIOD) return -1;
  if (pCfg->walLevel < TSDB_MIN_WAL_LEVEL || pCfg->walLevel > TSDB_MAX_WAL_LEVEL) return -1;
  if (pCfg->precision < TSDB_MIN_PRECISION && pCfg->precision > TSDB_MAX_PRECISION) return -1;
  if (pCfg->compression < TSDB_MIN_COMP_LEVEL || pCfg->compression > TSDB_MAX_COMP_LEVEL) return -1;
S
Shengliang Guan 已提交
311
  if (pCfg->replications < TSDB_MIN_DB_REPLICA || pCfg->replications > TSDB_MAX_DB_REPLICA) return -1;
S
Shengliang Guan 已提交
312
  if (pCfg->replications != 1 && pCfg->replications != 3) return -1;
313
  if (pCfg->strict < TSDB_DB_STRICT_OFF || pCfg->strict > TSDB_DB_STRICT_ON) return -1;
wmmhello's avatar
wmmhello 已提交
314
  if (pCfg->schemaless < TSDB_DB_SCHEMALESS_OFF || pCfg->schemaless > TSDB_DB_SCHEMALESS_ON) return -1;
315
  if (pCfg->cacheLast < TSDB_CACHE_MODEL_NONE || pCfg->cacheLast > TSDB_CACHE_MODEL_BOTH) return -1;
S
Shengliang Guan 已提交
316
  if (pCfg->hashMethod != 1) return -1;
317 318 319 320
  if (pCfg->replications > mndGetDnodeSize(pMnode)) {
    terrno = TSDB_CODE_MND_NO_ENOUGH_DNODES;
    return -1;
  }
S
Shengliang Guan 已提交
321 322

  terrno = 0;
323
  return terrno;
S
Shengliang Guan 已提交
324 325 326
}

static void mndSetDefaultDbCfg(SDbCfg *pCfg) {
327
  if (pCfg->numOfVgroups < 0) pCfg->numOfVgroups = TSDB_DEFAULT_VN_PER_DB;
S
Shengliang Guan 已提交
328 329
  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 已提交
330 331
  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 已提交
332
  if (pCfg->daysPerFile < 0) pCfg->daysPerFile = TSDB_DEFAULT_DURATION_PER_FILE;
S
Shengliang Guan 已提交
333
  if (pCfg->daysToKeep0 < 0) pCfg->daysToKeep0 = TSDB_DEFAULT_KEEP;
334 335
  if (pCfg->daysToKeep1 < 0) pCfg->daysToKeep1 = pCfg->daysToKeep0;
  if (pCfg->daysToKeep2 < 0) pCfg->daysToKeep2 = pCfg->daysToKeep1;
S
Shengliang Guan 已提交
336 337
  if (pCfg->minRows < 0) pCfg->minRows = TSDB_DEFAULT_MINROWS_FBLOCK;
  if (pCfg->maxRows < 0) pCfg->maxRows = TSDB_DEFAULT_MAXROWS_FBLOCK;
S
Shengliang Guan 已提交
338 339 340 341
  if (pCfg->fsyncPeriod < 0) pCfg->fsyncPeriod = TSDB_DEFAULT_FSYNC_PERIOD;
  if (pCfg->walLevel < 0) pCfg->walLevel = TSDB_DEFAULT_WAL_LEVEL;
  if (pCfg->precision < 0) pCfg->precision = TSDB_DEFAULT_PRECISION;
  if (pCfg->compression < 0) pCfg->compression = TSDB_DEFAULT_COMP_LEVEL;
S
Shengliang Guan 已提交
342 343
  if (pCfg->replications < 0) pCfg->replications = TSDB_DEFAULT_DB_REPLICA;
  if (pCfg->strict < 0) pCfg->strict = TSDB_DEFAULT_DB_STRICT;
344 345
  if (pCfg->cacheLast < 0) pCfg->cacheLast = TSDB_DEFAULT_CACHE_MODEL;
  if (pCfg->cacheLastSize <= 0) pCfg->cacheLastSize = TSDB_DEFAULT_CACHE_SIZE;
346
  if (pCfg->numOfRetensions < 0) pCfg->numOfRetensions = 0;
wmmhello's avatar
wmmhello 已提交
347
  if (pCfg->schemaless < 0) pCfg->schemaless = TSDB_DB_SCHEMALESS_OFF;
S
Shengliang Guan 已提交
348
}
S
Shengliang Guan 已提交
349

S
Shengliang Guan 已提交
350
static int32_t mndSetCreateDbRedoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
S
Shengliang Guan 已提交
351
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
S
Shengliang Guan 已提交
352 353 354
  if (pDbRaw == NULL) return -1;
  if (mndTransAppendRedolog(pTrans, pDbRaw) != 0) return -1;
  if (sdbSetRawStatus(pDbRaw, SDB_STATUS_CREATING) != 0) return -1;
S
Shengliang Guan 已提交
355

S
Shengliang Guan 已提交
356
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
S
Shengliang Guan 已提交
357
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
S
Shengliang Guan 已提交
358 359 360
    if (pVgRaw == NULL) return -1;
    if (mndTransAppendRedolog(pTrans, pVgRaw) != 0) return -1;
    if (sdbSetRawStatus(pVgRaw, SDB_STATUS_CREATING) != 0) return -1;
S
Shengliang Guan 已提交
361 362 363 364 365
  }

  return 0;
}

S
Shengliang Guan 已提交
366
static int32_t mndSetCreateDbUndoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
S
Shengliang Guan 已提交
367
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
S
Shengliang Guan 已提交
368 369 370
  if (pDbRaw == NULL) return -1;
  if (mndTransAppendUndolog(pTrans, pDbRaw) != 0) return -1;
  if (sdbSetRawStatus(pDbRaw, SDB_STATUS_DROPPED) != 0) return -1;
S
Shengliang Guan 已提交
371

S
Shengliang Guan 已提交
372
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
S
Shengliang Guan 已提交
373
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
S
Shengliang Guan 已提交
374 375 376
    if (pVgRaw == NULL) return -1;
    if (mndTransAppendUndolog(pTrans, pVgRaw) != 0) return -1;
    if (sdbSetRawStatus(pVgRaw, SDB_STATUS_DROPPED) != 0) return -1;
S
Shengliang Guan 已提交
377 378 379 380 381
  }

  return 0;
}

S
Shengliang Guan 已提交
382
static int32_t mndSetCreateDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
S
Shengliang Guan 已提交
383
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
S
Shengliang Guan 已提交
384 385 386
  if (pDbRaw == NULL) return -1;
  if (mndTransAppendCommitlog(pTrans, pDbRaw) != 0) return -1;
  if (sdbSetRawStatus(pDbRaw, SDB_STATUS_READY) != 0) return -1;
S
Shengliang Guan 已提交
387

S
Shengliang Guan 已提交
388
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
S
Shengliang Guan 已提交
389
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
S
Shengliang Guan 已提交
390 391 392
    if (pVgRaw == NULL) return -1;
    if (mndTransAppendCommitlog(pTrans, pVgRaw) != 0) return -1;
    if (sdbSetRawStatus(pVgRaw, SDB_STATUS_READY) != 0) return -1;
S
Shengliang Guan 已提交
393 394 395 396 397
  }

  return 0;
}

S
Shengliang Guan 已提交
398 399
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 已提交
400
    SVgObj *pVgroup = pVgroups + vg;
S
Shengliang Guan 已提交
401 402

    for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
S
Shengliang Guan 已提交
403
      SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
404
      if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid, false) != 0) {
S
Shengliang Guan 已提交
405 406 407 408 409
        return -1;
      }
    }
  }

S
Shengliang Guan 已提交
410 411 412
  return 0;
}

S
Shengliang Guan 已提交
413 414
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 已提交
415
    SVgObj *pVgroup = pVgroups + vg;
S
Shengliang Guan 已提交
416 417

    for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
S
Shengliang Guan 已提交
418 419
      SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
      if (mndAddDropVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid, false) != 0) {
S
Shengliang Guan 已提交
420 421 422 423 424
        return -1;
      }
    }
  }

S
Shengliang Guan 已提交
425 426 427
  return 0;
}

S
Shengliang Guan 已提交
428
static int32_t mndCreateDb(SMnode *pMnode, SRpcMsg *pReq, SCreateDbReq *pCreate, SUserObj *pUser) {
S
Shengliang Guan 已提交
429
  SDbObj dbObj = {0};
430
  memcpy(dbObj.name, pCreate->db, TSDB_DB_FNAME_LEN);
S
Shengliang Guan 已提交
431
  memcpy(dbObj.acct, pUser->acct, TSDB_USER_LEN);
S
Shengliang Guan 已提交
432 433
  dbObj.createdTime = taosGetTimestampMs();
  dbObj.updateTime = dbObj.createdTime;
434
  dbObj.uid = mndGenerateUid(dbObj.name, TSDB_DB_FNAME_LEN);
S
Shengliang Guan 已提交
435 436
  dbObj.cfgVersion = 1;
  dbObj.vgVersion = 1;
S
Shengliang Guan 已提交
437
  memcpy(dbObj.createUser, pUser->user, TSDB_USER_LEN);
L
Liu Jicong 已提交
438 439
  dbObj.cfg = (SDbCfg){
      .numOfVgroups = pCreate->numOfVgroups,
S
Shengliang Guan 已提交
440 441 442 443
      .numOfStables = pCreate->numOfStables,
      .buffer = pCreate->buffer,
      .pageSize = pCreate->pageSize,
      .pages = pCreate->pages,
444
      .cacheLastSize = pCreate->cacheLastSize,
L
Liu Jicong 已提交
445 446 447 448 449 450
      .daysPerFile = pCreate->daysPerFile,
      .daysToKeep0 = pCreate->daysToKeep0,
      .daysToKeep1 = pCreate->daysToKeep1,
      .daysToKeep2 = pCreate->daysToKeep2,
      .minRows = pCreate->minRows,
      .maxRows = pCreate->maxRows,
451 452
      .fsyncPeriod = pCreate->fsyncPeriod,
      .walLevel = pCreate->walLevel,
L
Liu Jicong 已提交
453 454 455
      .precision = pCreate->precision,
      .compression = pCreate->compression,
      .replications = pCreate->replications,
S
Shengliang Guan 已提交
456
      .strict = pCreate->strict,
457
      .cacheLast = pCreate->cacheLast,
S
Shengliang Guan 已提交
458
      .hashMethod = 1,
wmmhello's avatar
wmmhello 已提交
459
      .schemaless = pCreate->schemaless,
L
Liu Jicong 已提交
460
  };
S
Shengliang Guan 已提交
461

S
sma  
Shengliang Guan 已提交
462 463 464
  dbObj.cfg.numOfRetensions = pCreate->numOfRetensions;
  dbObj.cfg.pRetensions = pCreate->pRetensions;

S
Shengliang Guan 已提交
465 466
  mndSetDefaultDbCfg(&dbObj.cfg);

S
Shengliang Guan 已提交
467 468 469 470 471
  if (mndCheckDbName(dbObj.name, pUser) != 0) {
    mError("db:%s, failed to create since %s", pCreate->db, terrstr());
    return -1;
  }

S
Shengliang Guan 已提交
472
  if (mndCheckDbCfg(pMnode, &dbObj.cfg) != 0) {
S
Shengliang Guan 已提交
473 474 475
    mError("db:%s, failed to create since %s", pCreate->db, terrstr());
    return -1;
  }
S
Shengliang Guan 已提交
476

S
Shengliang Guan 已提交
477 478
  SVgObj *pVgroups = NULL;
  if (mndAllocVgroup(pMnode, &dbObj, &pVgroups) != 0) {
479 480 481 482
    mError("db:%s, failed to create since %s", pCreate->db, terrstr());
    return -1;
  }

S
Shengliang Guan 已提交
483
  int32_t code = -1;
S
Shengliang Guan 已提交
484
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq);
S
Shengliang Guan 已提交
485
  if (pTrans == NULL) goto _OVER;
486
  // mndTransSetSerial(pTrans);
S
Shengliang Guan 已提交
487 488
  mDebug("trans:%d, used to create db:%s", pTrans->id, pCreate->db);

489
  mndTransSetDbName(pTrans, dbObj.name, NULL);
S
Shengliang Guan 已提交
490 491 492 493 494 495
  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 已提交
496

S
Shengliang Guan 已提交
497 498
  code = 0;

S
Shengliang Guan 已提交
499
_OVER:
wafwerar's avatar
wafwerar 已提交
500
  taosMemoryFree(pVgroups);
S
Shengliang Guan 已提交
501
  mndTransDrop(pTrans);
S
Shengliang Guan 已提交
502
  return code;
S
Shengliang Guan 已提交
503 504
}

S
Shengliang Guan 已提交
505 506
static int32_t mndProcessCreateDbReq(SRpcMsg *pReq) {
  SMnode      *pMnode = pReq->info.node;
S
Shengliang Guan 已提交
507 508 509 510 511
  int32_t      code = -1;
  SDbObj      *pDb = NULL;
  SUserObj    *pUser = NULL;
  SCreateDbReq createReq = {0};

C
Cary Xu 已提交
512 513 514 515
  if ((terrno = grantCheck(TSDB_GRANT_DB)) != 0) {
    code = terrno;
    goto _OVER;
  }
516

S
Shengliang Guan 已提交
517
  if (tDeserializeSCreateDbReq(pReq->pCont, pReq->contLen, &createReq) != 0) {
S
Shengliang Guan 已提交
518
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
519
    goto _OVER;
S
Shengliang Guan 已提交
520 521 522
  }

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

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

541
  pUser = mndAcquireUser(pMnode, pReq->info.conn.user);
S
Shengliang Guan 已提交
542
  if (pUser == NULL) {
S
Shengliang Guan 已提交
543
    goto _OVER;
S
Shengliang Guan 已提交
544 545 546
  }

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

S
Shengliang Guan 已提交
549
_OVER:
S
Shengliang Guan 已提交
550
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
S
Shengliang Guan 已提交
551
    mError("db:%s, failed to create since %s", createReq.db, terrstr());
S
Shengliang Guan 已提交
552 553
  }

S
Shengliang Guan 已提交
554 555
  mndReleaseDb(pMnode, pDb);
  mndReleaseUser(pMnode, pUser);
S
sma  
Shengliang Guan 已提交
556
  tFreeSCreateDbReq(&createReq);
S
Shengliang Guan 已提交
557 558

  return code;
S
Shengliang Guan 已提交
559 560
}

S
Shengliang Guan 已提交
561
static int32_t mndSetDbCfgFromAlterDbReq(SDbObj *pDb, SAlterDbReq *pAlter) {
S
Shengliang Guan 已提交
562
  terrno = TSDB_CODE_MND_DB_OPTION_UNCHANGED;
S
Shengliang Guan 已提交
563

S
Shengliang Guan 已提交
564
  if (pAlter->buffer > 0 && pAlter->buffer != pDb->cfg.buffer) {
565 566 567 568
#if 1
    terrno = TSDB_CODE_OPS_NOT_SUPPORT;
    return terrno;
#else
S
Shengliang Guan 已提交
569 570
    pDb->cfg.buffer = pAlter->buffer;
    terrno = 0;
571
#endif
S
Shengliang Guan 已提交
572 573
  }

S
Shengliang Guan 已提交
574
  if (pAlter->pages > 0 && pAlter->pages != pDb->cfg.pages) {
575 576 577 578
#if 1
    terrno = TSDB_CODE_OPS_NOT_SUPPORT;
    return terrno;
#else
S
Shengliang Guan 已提交
579
    pDb->cfg.pages = pAlter->pages;
S
Shengliang Guan 已提交
580
    terrno = 0;
581
#endif
S
Shengliang Guan 已提交
582 583
  }

S
Shengliang Guan 已提交
584
  if (pAlter->pageSize > 0 && pAlter->pageSize != pDb->cfg.pageSize) {
585 586 587 588
#if 1
    terrno = TSDB_CODE_OPS_NOT_SUPPORT;
    return terrno;
#else
S
Shengliang Guan 已提交
589
    pDb->cfg.pageSize = pAlter->pageSize;
S
Shengliang Guan 已提交
590
    terrno = 0;
591
#endif
S
Shengliang Guan 已提交
592 593
  }

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

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

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

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

  if (pAlter->fsyncPeriod >= 0 && pAlter->fsyncPeriod != pDb->cfg.fsyncPeriod) {
    pDb->cfg.fsyncPeriod = pAlter->fsyncPeriod;
S
Shengliang Guan 已提交
616
    terrno = 0;
S
Shengliang Guan 已提交
617 618 619 620
  }

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

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

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

638 639
  if (pAlter->cacheLastSize > 0 && pAlter->cacheLastSize != pDb->cfg.cacheLastSize) {
    pDb->cfg.cacheLastSize = pAlter->cacheLastSize;
640 641 642
    terrno = 0;
  }

S
Shengliang Guan 已提交
643
  if (pAlter->replications > 0 && pAlter->replications != pDb->cfg.replications) {
644 645 646
#if 1
    terrno = TSDB_CODE_OPS_NOT_SUPPORT;
#else
S
Shengliang Guan 已提交
647
    pDb->cfg.replications = pAlter->replications;
S
Shengliang Guan 已提交
648
    pDb->vgVersion++;
S
Shengliang Guan 已提交
649
    terrno = 0;
650
#endif
S
Shengliang Guan 已提交
651 652
  }

S
Shengliang Guan 已提交
653 654 655
  return terrno;
}

S
Shengliang Guan 已提交
656
static int32_t mndSetAlterDbRedoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
S
Shengliang Guan 已提交
657
  SSdbRaw *pRedoRaw = mndDbActionEncode(pOld);
S
Shengliang Guan 已提交
658
  if (pRedoRaw == NULL) return -1;
659 660 661 662
  if (mndTransAppendRedolog(pTrans, pRedoRaw) != 0) {
    sdbFreeRaw(pRedoRaw);
    return -1;
  }
S
Shengliang Guan 已提交
663

664
  sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY);
S
Shengliang Guan 已提交
665 666 667
  return 0;
}

S
Shengliang Guan 已提交
668
static int32_t mndSetAlterDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
S
Shengliang Guan 已提交
669
  SSdbRaw *pCommitRaw = mndDbActionEncode(pNew);
S
Shengliang Guan 已提交
670
  if (pCommitRaw == NULL) return -1;
671 672 673 674
  if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
    sdbFreeRaw(pCommitRaw);
    return -1;
  }
S
Shengliang Guan 已提交
675

676
  sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY);
S
Shengliang Guan 已提交
677 678 679
  return 0;
}

S
Shengliang Guan 已提交
680
static int32_t mndSetAlterDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
S
Shengliang Guan 已提交
681 682
  SSdb   *pSdb = pMnode->pSdb;
  void   *pIter = NULL;
S
Shengliang Guan 已提交
683
  SArray *pArray = mndBuildDnodesArray(pMnode, 0);
S
Shengliang Guan 已提交
684

S
Shengliang Guan 已提交
685 686 687 688
  while (1) {
    SVgObj *pVgroup = NULL;
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
    if (pIter == NULL) break;
S
Shengliang Guan 已提交
689

S
Shengliang Guan 已提交
690
    if (mndVgroupInDb(pVgroup, pNew->uid)) {
S
Shengliang Guan 已提交
691
      if (mndBuildAlterVgroupAction(pMnode, pTrans, pNew, pVgroup, pArray) != 0) {
S
Shengliang Guan 已提交
692 693
        sdbCancelFetch(pSdb, pIter);
        sdbRelease(pSdb, pVgroup);
S
Shengliang Guan 已提交
694
        taosArrayDestroy(pArray);
S
Shengliang Guan 已提交
695 696 697 698 699 700 701
        return -1;
      }
    }

    sdbRelease(pSdb, pVgroup);
  }

S
Shengliang Guan 已提交
702
  taosArrayDestroy(pArray);
S
Shengliang Guan 已提交
703 704
  return 0;
}
S
Shengliang Guan 已提交
705

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

711
  int32_t code = -1;
712
  mndTransSetDbName(pTrans, pOld->name, NULL);
S
Shengliang Guan 已提交
713 714 715 716
  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 已提交
717 718
  code = 0;

S
Shengliang Guan 已提交
719
_OVER:
S
Shengliang Guan 已提交
720
  mndTransDrop(pTrans);
S
Shengliang Guan 已提交
721
  return code;
S
Shengliang Guan 已提交
722 723
}

S
Shengliang Guan 已提交
724 725
static int32_t mndProcessAlterDbReq(SRpcMsg *pReq) {
  SMnode     *pMnode = pReq->info.node;
S
Shengliang Guan 已提交
726 727 728
  int32_t     code = -1;
  SDbObj     *pDb = NULL;
  SAlterDbReq alterReq = {0};
S
Shengliang Guan 已提交
729
  SDbObj      dbObj = {0};
S
Shengliang Guan 已提交
730

S
Shengliang Guan 已提交
731
  if (tDeserializeSAlterDbReq(pReq->pCont, pReq->contLen, &alterReq) != 0) {
S
Shengliang Guan 已提交
732
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
733
    goto _OVER;
S
Shengliang Guan 已提交
734
  }
S
Shengliang Guan 已提交
735

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

S
Shengliang Guan 已提交
738
  pDb = mndAcquireDb(pMnode, alterReq.db);
S
Shengliang Guan 已提交
739
  if (pDb == NULL) {
S
Shengliang Guan 已提交
740
    terrno = TSDB_CODE_MND_DB_NOT_EXIST;
S
Shengliang Guan 已提交
741
    goto _OVER;
S
Shengliang Guan 已提交
742 743
  }

744
  if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_ALTER_DB, pDb) != 0) {
S
Shengliang Guan 已提交
745
    goto _OVER;
S
Shengliang Guan 已提交
746 747 748
  }

  memcpy(&dbObj, pDb, sizeof(SDbObj));
S
Shengliang Guan 已提交
749 750 751 752
  if (dbObj.cfg.pRetensions != NULL) {
    dbObj.cfg.pRetensions = taosArrayDup(pDb->cfg.pRetensions);
    if (dbObj.cfg.pRetensions == NULL) goto _OVER;
  }
S
Shengliang Guan 已提交
753

S
Shengliang Guan 已提交
754
  code = mndSetDbCfgFromAlterDbReq(&dbObj, &alterReq);
S
Shengliang Guan 已提交
755
  if (code != 0) goto _OVER;
S
Shengliang Guan 已提交
756

S
Shengliang Guan 已提交
757 758 759
  code = mndCheckDbCfg(pMnode, &dbObj.cfg);
  if (code != 0) goto _OVER;

S
Shengliang Guan 已提交
760 761
  dbObj.cfgVersion++;
  dbObj.updateTime = taosGetTimestampMs();
S
Shengliang Guan 已提交
762
  code = mndAlterDb(pMnode, pReq, pDb, &dbObj);
S
Shengliang Guan 已提交
763
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
S
Shengliang Guan 已提交
764

S
Shengliang Guan 已提交
765
_OVER:
S
Shengliang Guan 已提交
766
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
S
Shengliang Guan 已提交
767
    mError("db:%s, failed to alter since %s", alterReq.db, terrstr());
S
Shengliang Guan 已提交
768 769
  }

S
Shengliang Guan 已提交
770
  mndReleaseDb(pMnode, pDb);
S
Shengliang Guan 已提交
771
  taosArrayDestroy(dbObj.cfg.pRetensions);
S
Shengliang Guan 已提交
772 773

  return code;
S
Shengliang Guan 已提交
774 775
}

S
Shengliang Guan 已提交
776 777
static int32_t mndProcessGetDbCfgReq(SRpcMsg *pReq) {
  SMnode   *pMnode = pReq->info.node;
S
Shengliang Guan 已提交
778 779 780 781
  int32_t   code = -1;
  SDbObj   *pDb = NULL;
  SDbCfgReq cfgReq = {0};
  SDbCfgRsp cfgRsp = {0};
D
dapan1121 已提交
782

S
Shengliang Guan 已提交
783
  if (tDeserializeSDbCfgReq(pReq->pCont, pReq->contLen, &cfgReq) != 0) {
D
dapan1121 已提交
784
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
785
    goto _OVER;
D
dapan1121 已提交
786 787 788 789 790
  }

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

S
Shengliang Guan 已提交
794
  cfgRsp.numOfVgroups = pDb->cfg.numOfVgroups;
S
Shengliang Guan 已提交
795 796 797 798
  cfgRsp.numOfStables = pDb->cfg.numOfStables;
  cfgRsp.buffer = pDb->cfg.buffer;
  cfgRsp.pageSize = pDb->cfg.pageSize;
  cfgRsp.pages = pDb->cfg.pages;
S
Shengliang Guan 已提交
799 800 801 802 803 804 805 806 807 808 809 810
  cfgRsp.daysPerFile = pDb->cfg.daysPerFile;
  cfgRsp.daysToKeep0 = pDb->cfg.daysToKeep0;
  cfgRsp.daysToKeep1 = pDb->cfg.daysToKeep1;
  cfgRsp.daysToKeep2 = pDb->cfg.daysToKeep2;
  cfgRsp.minRows = pDb->cfg.minRows;
  cfgRsp.maxRows = pDb->cfg.maxRows;
  cfgRsp.fsyncPeriod = pDb->cfg.fsyncPeriod;
  cfgRsp.walLevel = pDb->cfg.walLevel;
  cfgRsp.precision = pDb->cfg.precision;
  cfgRsp.compression = pDb->cfg.compression;
  cfgRsp.replications = pDb->cfg.replications;
  cfgRsp.strict = pDb->cfg.strict;
811
  cfgRsp.cacheLast = pDb->cfg.cacheLast;
C
Cary Xu 已提交
812 813
  cfgRsp.numOfRetensions = pDb->cfg.numOfRetensions;
  cfgRsp.pRetensions = pDb->cfg.pRetensions;
wmmhello's avatar
wmmhello 已提交
814
  cfgRsp.schemaless = pDb->cfg.schemaless;
D
dapan1121 已提交
815 816 817 818 819 820

  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 已提交
821
    goto _OVER;
D
dapan1121 已提交
822 823 824 825
  }

  tSerializeSDbCfgRsp(pRsp, contLen, &cfgRsp);

S
Shengliang Guan 已提交
826 827
  pReq->info.rsp = pRsp;
  pReq->info.rspLen = contLen;
D
dapan1121 已提交
828

829 830
  code = 0;

S
Shengliang Guan 已提交
831
_OVER:
D
dapan1121 已提交
832

S
Shengliang Guan 已提交
833
  if (code != 0) {
D
dapan1121 已提交
834 835 836 837 838 839 840 841
    mError("db:%s, failed to get cfg since %s", cfgReq.db, terrstr());
  }

  mndReleaseDb(pMnode, pDb);

  return code;
}

S
Shengliang Guan 已提交
842 843 844 845 846 847 848 849 850 851 852 853 854 855 856
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 已提交
857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877
  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);
  }

878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895
  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 已提交
896 897 898 899 900
  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 已提交
901 902
    SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
    if (mndAddDropVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid, true) != 0) {
S
Shengliang Guan 已提交
903 904 905 906
      return -1;
    }
  }

S
Shengliang Guan 已提交
907 908 909
  return 0;
}

S
Shengliang Guan 已提交
910 911 912
static int32_t mndSetDropDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
  SSdb *pSdb = pMnode->pSdb;
  void *pIter = NULL;
S
Shengliang Guan 已提交
913

S
Shengliang Guan 已提交
914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931
  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 已提交
932

933 934 935 936 937 938 939 940 941 942 943 944
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 已提交
945
    pRsp = taosMemoryMalloc(rspLen);
946 947 948 949 950 951 952 953 954 955 956 957 958
  }

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

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

S
Shengliang Guan 已提交
959
static int32_t mndDropDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb) {
S
Shengliang Guan 已提交
960
  int32_t code = -1;
961
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq);
S
Shengliang Guan 已提交
962
  if (pTrans == NULL) goto _OVER;
S
Shengliang Guan 已提交
963

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

S
Shengliang Guan 已提交
967 968
  if (mndSetDropDbRedoLogs(pMnode, pTrans, pDb) != 0) goto _OVER;
  if (mndSetDropDbCommitLogs(pMnode, pTrans, pDb) != 0) goto _OVER;
L
Liu Jicong 已提交
969 970 971
  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 已提交
972
  if (mndDropStreamByDb(pMnode, pTrans, pDb) != 0) goto _OVER;
973
  if (mndDropSmasByDb(pMnode, pTrans, pDb) != 0) goto _OVER;
S
Shengliang Guan 已提交
974
  if (mndSetDropDbRedoActions(pMnode, pTrans, pDb) != 0) goto _OVER;
S
Shengliang Guan 已提交
975

976 977 978 979 980 981 982 983 984 985 986
  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);
  }

987 988
  int32_t rspLen = 0;
  void   *pRsp = NULL;
S
Shengliang Guan 已提交
989
  if (mndBuildDropDbRsp(pDb, &rspLen, &pRsp, false) < 0) goto _OVER;
S
Shengliang Guan 已提交
990 991
  mndTransSetRpcRsp(pTrans, pRsp, rspLen);

S
Shengliang Guan 已提交
992
  if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
S
Shengliang Guan 已提交
993 994
  code = 0;

S
Shengliang Guan 已提交
995
_OVER:
S
Shengliang Guan 已提交
996
  mndTransDrop(pTrans);
S
Shengliang Guan 已提交
997
  return code;
S
Shengliang Guan 已提交
998 999
}

S
Shengliang Guan 已提交
1000 1001
static int32_t mndProcessDropDbReq(SRpcMsg *pReq) {
  SMnode    *pMnode = pReq->info.node;
S
Shengliang Guan 已提交
1002 1003 1004 1005
  int32_t    code = -1;
  SDbObj    *pDb = NULL;
  SDropDbReq dropReq = {0};

S
Shengliang Guan 已提交
1006
  if (tDeserializeSDropDbReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
S
Shengliang Guan 已提交
1007
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
1008
    goto _OVER;
S
Shengliang Guan 已提交
1009
  }
S
Shengliang Guan 已提交
1010

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

S
Shengliang Guan 已提交
1013
  pDb = mndAcquireDb(pMnode, dropReq.db);
S
Shengliang Guan 已提交
1014
  if (pDb == NULL) {
S
Shengliang Guan 已提交
1015
    if (dropReq.ignoreNotExists) {
S
Shengliang Guan 已提交
1016
      code = mndBuildDropDbRsp(pDb, &pReq->info.rspLen, &pReq->info.rsp, true);
S
Shengliang Guan 已提交
1017
      goto _OVER;
S
Shengliang Guan 已提交
1018 1019
    } else {
      terrno = TSDB_CODE_MND_DB_NOT_EXIST;
S
Shengliang Guan 已提交
1020
      goto _OVER;
S
Shengliang Guan 已提交
1021 1022 1023
    }
  }

1024
  if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_DROP_DB, pDb) != 0) {
S
Shengliang Guan 已提交
1025
    goto _OVER;
S
Shengliang Guan 已提交
1026 1027
  }

S
Shengliang Guan 已提交
1028
  code = mndDropDb(pMnode, pReq, pDb);
S
Shengliang Guan 已提交
1029
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
S
Shengliang Guan 已提交
1030

S
Shengliang Guan 已提交
1031
_OVER:
S
Shengliang Guan 已提交
1032
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
S
Shengliang Guan 已提交
1033 1034 1035 1036 1037
    mError("db:%s, failed to drop since %s", dropReq.db, terrstr());
  }

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

S
Shengliang Guan 已提交
1040 1041
static int32_t mndGetDBTableNum(SDbObj *pDb, SMnode *pMnode) {
  int32_t numOfTables = 0;
D
dapan1121 已提交
1042 1043 1044 1045 1046 1047 1048 1049 1050
  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 已提交
1051
    if (mndVgroupInDb(pVgroup, pDb->uid)) {
S
Shengliang Guan 已提交
1052
      numOfTables += pVgroup->numOfTables / TSDB_TABLE_NUM_UNIT;
D
dapan1121 已提交
1053 1054 1055 1056 1057 1058 1059
      vindex++;
    }

    sdbRelease(pSdb, pVgroup);
  }

  sdbCancelFetch(pSdb, pIter);
S
Shengliang Guan 已提交
1060
  return numOfTables;
D
dapan1121 已提交
1061 1062
}

S
Shengliang Guan 已提交
1063
static void mndBuildDBVgroupInfo(SDbObj *pDb, SMnode *pMnode, SArray *pVgList) {
D
dapan1121 已提交
1064
  int32_t vindex = 0;
S
Shengliang Guan 已提交
1065
  SSdb   *pSdb = pMnode->pSdb;
D
dapan1121 已提交
1066 1067

  void *pIter = NULL;
1068
  while (1) {
D
dapan1121 已提交
1069 1070 1071 1072
    SVgObj *pVgroup = NULL;
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
    if (pIter == NULL) break;

S
Shengliang Guan 已提交
1073
    if ((NULL == pDb || pVgroup->dbUid == pDb->uid) && !pVgroup->isTsma) {
S
Shengliang Guan 已提交
1074 1075 1076 1077
      SVgroupInfo vgInfo = {0};
      vgInfo.vgId = pVgroup->vgId;
      vgInfo.hashBegin = pVgroup->hashBegin;
      vgInfo.hashEnd = pVgroup->hashEnd;
D
dapan1121 已提交
1078
      vgInfo.numOfTable = pVgroup->numOfTables / TSDB_TABLE_NUM_UNIT;
L
Liu Jicong 已提交
1079
      vgInfo.epSet.numOfEps = pVgroup->replica;
D
dapan1121 已提交
1080
      for (int32_t gid = 0; gid < pVgroup->replica; ++gid) {
S
Shengliang Guan 已提交
1081
        SVnodeGid *pVgid = &pVgroup->vnodeGid[gid];
L
Liu Jicong 已提交
1082
        SEp       *pEp = &vgInfo.epSet.eps[gid];
S
Shengliang Guan 已提交
1083
        SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
D
dapan1121 已提交
1084
        if (pDnode != NULL) {
1085
          memcpy(pEp->fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
S
Shengliang Guan 已提交
1086
          pEp->port = pDnode->port;
D
dapan1121 已提交
1087 1088 1089
        }
        mndReleaseDnode(pMnode, pDnode);
        if (pVgid->role == TAOS_SYNC_STATE_LEADER) {
L
Liu Jicong 已提交
1090
          vgInfo.epSet.inUse = gid;
D
dapan1121 已提交
1091 1092 1093
        }
      }
      vindex++;
S
Shengliang Guan 已提交
1094
      taosArrayPush(pVgList, &vgInfo);
D
dapan1121 已提交
1095 1096 1097
    }

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

D
dapan1121 已提交
1099 1100 1101
    if (pDb && (vindex >= pDb->cfg.numOfVgroups)) {
      break;
    }
D
dapan1121 已提交
1102
  }
S
Shengliang Guan 已提交
1103 1104

  sdbCancelFetch(pSdb, pIter);
D
dapan1121 已提交
1105 1106
}

L
Liu Jicong 已提交
1107 1108 1109 1110 1111 1112 1113
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 已提交
1114
  int32_t numOfTable = mndGetDBTableNum(pDb, pMnode);
L
Liu Jicong 已提交
1115 1116 1117 1118 1119 1120 1121 1122 1123

  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 已提交
1124
  pRsp->hashMethod = pDb->cfg.hashMethod;
L
Liu Jicong 已提交
1125 1126 1127
  return 0;
}

S
Shengliang Guan 已提交
1128 1129
static int32_t mndProcessUseDbReq(SRpcMsg *pReq) {
  SMnode   *pMnode = pReq->info.node;
S
Shengliang Guan 已提交
1130 1131 1132 1133 1134
  int32_t   code = -1;
  SDbObj   *pDb = NULL;
  SUseDbReq usedbReq = {0};
  SUseDbRsp usedbRsp = {0};

S
Shengliang Guan 已提交
1135
  if (tDeserializeSUseDbReq(pReq->pCont, pReq->contLen, &usedbReq) != 0) {
S
Shengliang Guan 已提交
1136
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
1137
    goto _OVER;
S
Shengliang Guan 已提交
1138
  }
S
Shengliang Guan 已提交
1139

D
dapan1121 已提交
1140
  char *p = strchr(usedbReq.db, '.');
1141
  if (p && ((0 == strcmp(p + 1, TSDB_INFORMATION_SCHEMA_DB) || (0 == strcmp(p + 1, TSDB_PERFORMANCE_SCHEMA_DB))))) {
D
dapan1121 已提交
1142
    memcpy(usedbRsp.db, usedbReq.db, TSDB_DB_FNAME_LEN);
1143
    int32_t vgVersion = mndGetGlobalVgroupVersion(pMnode);
D
dapan1121 已提交
1144 1145 1146 1147
    if (usedbReq.vgVersion < vgVersion) {
      usedbRsp.pVgroupInfos = taosArrayInit(10, sizeof(SVgroupInfo));
      if (usedbRsp.pVgroupInfos == NULL) {
        terrno = TSDB_CODE_OUT_OF_MEMORY;
S
Shengliang Guan 已提交
1148
        goto _OVER;
D
dapan1121 已提交
1149
      }
L
Liu Jicong 已提交
1150

D
dapan1121 已提交
1151
      mndBuildDBVgroupInfo(NULL, pMnode, usedbRsp.pVgroupInfos);
D
dapan1121 已提交
1152
      usedbRsp.vgVersion = vgVersion++;
D
dapan1121 已提交
1153 1154 1155
    } else {
      usedbRsp.vgVersion = usedbReq.vgVersion;
    }
L
Liu Jicong 已提交
1156
    usedbRsp.vgNum = taosArrayGetSize(usedbRsp.pVgroupInfos);
D
dapan1121 已提交
1157
    code = 0;
D
dapan1121 已提交
1158 1159

    // no jump, need to construct rsp
D
dapan1121 已提交
1160 1161 1162 1163
  } else {
    pDb = mndAcquireDb(pMnode, usedbReq.db);
    if (pDb == NULL) {
      terrno = TSDB_CODE_MND_DB_NOT_EXIST;
S
Shengliang Guan 已提交
1164

X
Xiaoyu Wang 已提交
1165 1166 1167
      memcpy(usedbRsp.db, usedbReq.db, TSDB_DB_FNAME_LEN);
      usedbRsp.uid = usedbReq.dbId;
      usedbRsp.vgVersion = usedbReq.vgVersion;
S
Shengliang Guan 已提交
1168

X
Xiaoyu Wang 已提交
1169 1170
      mError("db:%s, failed to process use db req since %s", usedbReq.db, terrstr());
    } else {
1171
      if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_USE_DB, pDb) != 0) {
S
Shengliang Guan 已提交
1172
        goto _OVER;
X
Xiaoyu Wang 已提交
1173
      }
S
Shengliang Guan 已提交
1174

L
Liu Jicong 已提交
1175
      if (mndExtractDbInfo(pMnode, pDb, &usedbRsp, &usedbReq) < 0) {
S
Shengliang Guan 已提交
1176
        goto _OVER;
X
Xiaoyu Wang 已提交
1177 1178 1179 1180
      }

      code = 0;
    }
D
dapan1121 已提交
1181
  }
S
Shengliang Guan 已提交
1182

S
Shengliang Guan 已提交
1183 1184 1185 1186
  int32_t contLen = tSerializeSUseDbRsp(NULL, 0, &usedbRsp);
  void   *pRsp = rpcMallocCont(contLen);
  if (pRsp == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
X
Xiaoyu Wang 已提交
1187
    code = -1;
S
Shengliang Guan 已提交
1188
    goto _OVER;
S
Shengliang Guan 已提交
1189 1190
  }

S
Shengliang Guan 已提交
1191
  tSerializeSUseDbRsp(pRsp, contLen, &usedbRsp);
S
Shengliang Guan 已提交
1192

S
Shengliang Guan 已提交
1193 1194
  pReq->info.rsp = pRsp;
  pReq->info.rspLen = contLen;
S
Shengliang Guan 已提交
1195

S
Shengliang Guan 已提交
1196
_OVER:
S
Shengliang Guan 已提交
1197 1198 1199
  if (code != 0) {
    mError("db:%s, failed to process use db req since %s", usedbReq.db, terrstr());
  }
D
dapan1121 已提交
1200

S
Shengliang Guan 已提交
1201 1202
  mndReleaseDb(pMnode, pDb);
  tFreeSUsedbRsp(&usedbRsp);
D
dapan1121 已提交
1203

S
Shengliang Guan 已提交
1204 1205
  return code;
}
S
Shengliang Guan 已提交
1206

S
Shengliang Guan 已提交
1207 1208 1209 1210 1211 1212 1213
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 已提交
1214

S
Shengliang Guan 已提交
1215 1216 1217 1218
  for (int32_t i = 0; i < numOfDbs; ++i) {
    SDbVgVersion *pDbVgVersion = &pDbs[i];
    pDbVgVersion->dbId = htobe64(pDbVgVersion->dbId);
    pDbVgVersion->vgVersion = htonl(pDbVgVersion->vgVersion);
D
dapan1121 已提交
1219
    pDbVgVersion->numOfTable = htonl(pDbVgVersion->numOfTable);
D
dapan1121 已提交
1220

S
Shengliang Guan 已提交
1221 1222
    SUseDbRsp usedbRsp = {0};

S
Shengliang Guan 已提交
1223
    SDbObj *pDb = mndAcquireDb(pMnode, pDbVgVersion->dbFName);
S
Shengliang Guan 已提交
1224
    if (pDb == NULL) {
1225
      mTrace("db:%s, no exist", pDbVgVersion->dbFName);
S
Shengliang Guan 已提交
1226 1227 1228 1229
      memcpy(usedbRsp.db, pDbVgVersion->dbFName, TSDB_DB_FNAME_LEN);
      usedbRsp.uid = pDbVgVersion->dbId;
      usedbRsp.vgVersion = -1;
      taosArrayPush(batchUseRsp.pArray, &usedbRsp);
D
dapan1121 已提交
1230
      continue;
D
dapan1121 已提交
1231
    }
S
Shengliang Guan 已提交
1232

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

D
dapan1121 已提交
1235
    if (pDbVgVersion->vgVersion >= pDb->vgVersion && numOfTable == pDbVgVersion->numOfTable) {
1236
      mDebug("db:%s, version and numOfTable not changed", pDbVgVersion->dbFName);
S
Shengliang Guan 已提交
1237
      mndReleaseDb(pMnode, pDb);
D
dapan1121 已提交
1238
      continue;
1239 1240 1241
    } else {
      mDebug("db:%s, vgroup version changed from %d to %d", pDbVgVersion->dbFName, pDbVgVersion->vgVersion,
             pDb->vgVersion);
D
dapan1121 已提交
1242
    }
L
Liu Jicong 已提交
1243

D
dapan1121 已提交
1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255
    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 已提交
1256
    usedbRsp.hashMethod = pDb->cfg.hashMethod;
D
dapan1121 已提交
1257 1258 1259

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

S
Shengliang Guan 已提交
1262
  int32_t rspLen = tSerializeSUseDbBatchRsp(NULL, 0, &batchUseRsp);
wafwerar's avatar
wafwerar 已提交
1263
  void   *pRsp = taosMemoryMalloc(rspLen);
S
Shengliang Guan 已提交
1264 1265 1266 1267
  if (pRsp == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    tFreeSUseDbBatchRsp(&batchUseRsp);
    return -1;
D
dapan1121 已提交
1268
  }
S
Shengliang Guan 已提交
1269
  tSerializeSUseDbBatchRsp(pRsp, rspLen, &batchUseRsp);
D
dapan1121 已提交
1270

S
Shengliang Guan 已提交
1271 1272 1273 1274
  *ppRsp = pRsp;
  *pRspLen = rspLen;

  tFreeSUseDbBatchRsp(&batchUseRsp);
D
dapan1121 已提交
1275 1276 1277
  return 0;
}

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

S
Shengliang Guan 已提交
1280 1281
static int32_t mndProcessCompactDbReq(SRpcMsg *pReq) {
  SMnode       *pMnode = pReq->info.node;
S
Shengliang Guan 已提交
1282 1283 1284 1285
  int32_t       code = -1;
  SDbObj       *pDb = NULL;
  SCompactDbReq compactReq = {0};

S
Shengliang Guan 已提交
1286
  if (tDeserializeSCompactDbReq(pReq->pCont, pReq->contLen, &compactReq) != 0) {
S
Shengliang Guan 已提交
1287
    terrno = TSDB_CODE_INVALID_MSG;
S
Shengliang Guan 已提交
1288
    goto _OVER;
S
Shengliang Guan 已提交
1289 1290
  }

S
Shengliang Guan 已提交
1291
  mDebug("db:%s, start to compact", compactReq.db);
S
Shengliang Guan 已提交
1292 1293

  pDb = mndAcquireDb(pMnode, compactReq.db);
S
Shengliang Guan 已提交
1294
  if (pDb == NULL) {
S
Shengliang Guan 已提交
1295
    goto _OVER;
S
Shengliang Guan 已提交
1296 1297
  }

1298
  if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_COMPACT_DB, pDb) != 0) {
S
Shengliang Guan 已提交
1299
    goto _OVER;
S
Shengliang Guan 已提交
1300 1301
  }

S
Shengliang Guan 已提交
1302
  code = mndCompactDb(pMnode, pDb);
S
Shengliang Guan 已提交
1303

S
Shengliang Guan 已提交
1304
_OVER:
S
Shengliang Guan 已提交
1305 1306
  if (code != 0) {
    mError("db:%s, failed to process compact db req since %s", compactReq.db, terrstr());
S
Shengliang Guan 已提交
1307
  }
S
Shengliang Guan 已提交
1308 1309

  mndReleaseDb(pMnode, pDb);
S
Shengliang Guan 已提交
1310
  return code;
S
Shengliang Guan 已提交
1311
}
S
Shengliang Guan 已提交
1312

S
Shengliang Guan 已提交
1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 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
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 已提交
1382
const char *mndGetDbStr(const char *src) {
S
Shengliang Guan 已提交
1383 1384
  char *pos = strstr(src, TS_PATH_DELIMITER);
  if (pos != NULL) ++pos;
S
Shengliang Guan 已提交
1385
  if (pos == NULL) return src;
S
Shengliang Guan 已提交
1386 1387 1388
  return pos;
}

1389 1390
int64_t getValOfDiffPrecision(int8_t unit, int64_t val) {
  int64_t v = 0;
1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406
  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;
1407 1408 1409 1410 1411 1412 1413
    default:
      break;
  }

  return v;
}

1414
char *buildRetension(SArray *pRetension) {
1415 1416 1417 1418 1419
  size_t size = taosArrayGetSize(pRetension);
  if (size == 0) {
    return NULL;
  }

1420 1421
  char       *p1 = taosMemoryCalloc(1, 100);
  SRetention *p = taosArrayGet(pRetension, 0);
1422 1423 1424 1425 1426

  int32_t len = 2;

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

1429 1430 1431
  if (size > 1) {
    len += sprintf(p1 + len, ",");
    p = taosArrayGet(pRetension, 1);
1432

1433 1434 1435 1436
    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);
  }
1437

1438 1439 1440
  if (size > 2) {
    len += sprintf(p1 + len, ",");
    p = taosArrayGet(pRetension, 2);
1441

1442 1443 1444 1445
    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);
  }
1446 1447 1448 1449 1450

  varDataSetLen(p1, len);
  return p1;
}

1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466
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";
}

S
Shengliang Guan 已提交
1467
static void dumpDbInfoData(SSDataBlock *pBlock, SDbObj *pDb, SShowObj *pShow, int32_t rows, int64_t numOfTables,
1468
                           bool sysDb, ESdbStatus objStatus, bool sysinfo) {
S
Shengliang Guan 已提交
1469
  int32_t cols = 0;
1470 1471
  int32_t bytes = pShow->pMeta->pSchemas[cols].bytes;
  char   *buf = taosMemoryMalloc(bytes);
S
Shengliang Guan 已提交
1472

S
Shengliang Guan 已提交
1473
  const char *name = mndGetDbStr(pDb->name);
H
Haojun Liao 已提交
1474
  if (name != NULL) {
1475
    STR_WITH_MAXSIZE_TO_VARSTR(buf, name, bytes);
H
Haojun Liao 已提交
1476
  } else {
1477
    STR_WITH_MAXSIZE_TO_VARSTR(buf, "NULL", bytes);
H
Haojun Liao 已提交
1478
  }
S
Shengliang Guan 已提交
1479

1480 1481 1482 1483 1484
  char *statusStr = "ready";
  if (objStatus == SDB_STATUS_CREATING) statusStr = "creating";
  if (objStatus == SDB_STATUS_DROPPING) statusStr = "dropping";
  char statusVstr[24] = {0};
  STR_WITH_SIZE_TO_VARSTR(statusVstr, statusStr, strlen(statusStr));
S
Shengliang Guan 已提交
1485

1486
  if (sysDb || !sysinfo) {
S
Shengliang Guan 已提交
1487 1488
    for (int32_t i = 0; i < pShow->numOfColumns; ++i) {
      SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, i);
1489 1490 1491 1492 1493
      if (i == 0) {
        colDataAppend(pColInfo, rows, buf, false);
      } else if (i == 3) {
        colDataAppend(pColInfo, rows, (const char *)&numOfTables, false);
      } else if (i == 20) {
1494
        colDataAppend(pColInfo, rows, statusVstr, false);
1495 1496 1497 1498 1499 1500 1501
      } else {
        colDataAppendNULL(pColInfo, rows);
      }
    }
  } else {
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
    colDataAppend(pColInfo, rows, buf, false);
S
Shengliang Guan 已提交
1502

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

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

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

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

1515
    const char *strictStr = pDb->cfg.strict ? "on" : "off";
1516 1517
    char        strictVstr[24] = {0};
    STR_WITH_SIZE_TO_VARSTR(strictVstr, strictStr, strlen(strictStr));
1518
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1519
    colDataAppend(pColInfo, rows, (const char *)strictVstr, false);
S
Shengliang Guan 已提交
1520

1521 1522 1523
    char    durationVstr[128] = {0};
    int32_t len = sprintf(&durationVstr[VARSTR_HEADER_SIZE], "%dm", pDb->cfg.daysPerFile);
    varDataSetLen(durationVstr, len);
D
dapan1121 已提交
1524
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1525
    colDataAppend(pColInfo, rows, (const char *)durationVstr, false);
D
dapan1121 已提交
1526

1527
    char keepVstr[128] = {0};
1528
    if (pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep1 || pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep2) {
1529
      len = sprintf(&keepVstr[VARSTR_HEADER_SIZE], "%dm,%dm,%dm", pDb->cfg.daysToKeep1, pDb->cfg.daysToKeep2,
1530 1531
                    pDb->cfg.daysToKeep0);
    } else {
1532
      len = sprintf(&keepVstr[VARSTR_HEADER_SIZE], "%dm,%dm,%dm", pDb->cfg.daysToKeep0, pDb->cfg.daysToKeep1,
1533 1534
                    pDb->cfg.daysToKeep2);
    }
1535
    varDataSetLen(keepVstr, len);
1536
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1537
    colDataAppend(pColInfo, rows, (const char *)keepVstr, false);
S
Shengliang Guan 已提交
1538

1539
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
S
Shengliang Guan 已提交
1540 1541 1542 1543
    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 已提交
1544

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

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

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

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

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

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

1563 1564 1565
    const char *cacheModelStr = getCacheModelStr(pDb->cfg.cacheLast);
    char        cacheModelVstr[24] = {0};
    STR_WITH_SIZE_TO_VARSTR(cacheModelVstr, cacheModelStr, strlen(cacheModelStr));
1566
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1567
    colDataAppend(pColInfo, rows, (const char *)cacheModelVstr, false);
H
Haojun Liao 已提交
1568

1569
    const char *precStr = NULL;
1570 1571
    switch (pDb->cfg.precision) {
      case TSDB_TIME_PRECISION_MILLI:
1572
        precStr = TSDB_TIME_PRECISION_MILLI_STR;
1573 1574
        break;
      case TSDB_TIME_PRECISION_MICRO:
1575
        precStr = TSDB_TIME_PRECISION_MICRO_STR;
1576 1577
        break;
      case TSDB_TIME_PRECISION_NANO:
1578
        precStr = TSDB_TIME_PRECISION_NANO_STR;
1579 1580
        break;
      default:
1581
        precStr = "none";
1582 1583
        break;
    }
1584 1585
    char precVstr[10] = {0};
    STR_WITH_SIZE_TO_VARSTR(precVstr, precStr, 2);
1586
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1587
    colDataAppend(pColInfo, rows, (const char *)precVstr, false);
D
dapan1121 已提交
1588

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

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

1595
    char *rentensionVstr = buildRetension(pDb->cfg.pRetensions);
1596
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
1597
    if (rentensionVstr == NULL) {
1598 1599
      colDataAppendNULL(pColInfo, rows);
    } else {
1600 1601
      colDataAppend(pColInfo, rows, (const char *)rentensionVstr, false);
      taosMemoryFree(rentensionVstr);
1602
    }
1603
  }
1604 1605

  taosMemoryFree(buf);
H
Haojun Liao 已提交
1606 1607
}

L
Liu Jicong 已提交
1608
static void setInformationSchemaDbCfg(SDbObj *pDbObj) {
1609
  tstrncpy(pDbObj->name, TSDB_INFORMATION_SCHEMA_DB, tListLen(pDbObj->name));
L
Liu Jicong 已提交
1610
  pDbObj->createdTime = 0;
H
Haojun Liao 已提交
1611
  pDbObj->cfg.numOfVgroups = 0;
S
Shengliang Guan 已提交
1612
  pDbObj->cfg.strict = 1;
H
Haojun Liao 已提交
1613
  pDbObj->cfg.replications = 1;
L
Liu Jicong 已提交
1614
  pDbObj->cfg.precision = TSDB_TIME_PRECISION_MILLI;
H
Haojun Liao 已提交
1615 1616
}

S
Shengliang Guan 已提交
1617
static void setPerfSchemaDbCfg(SDbObj *pDbObj) {
1618
  tstrncpy(pDbObj->name, TSDB_PERFORMANCE_SCHEMA_DB, tListLen(pDbObj->name));
1619 1620
  pDbObj->createdTime = 0;
  pDbObj->cfg.numOfVgroups = 0;
S
Shengliang Guan 已提交
1621
  pDbObj->cfg.strict = 1;
1622 1623 1624 1625
  pDbObj->cfg.replications = 1;
  pDbObj->cfg.precision = TSDB_TIME_PRECISION_MILLI;
}

1626 1627 1628 1629 1630 1631 1632
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 已提交
1633
static int32_t mndRetrieveDbs(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rowsCapacity) {
1634 1635 1636 1637 1638
  SMnode    *pMnode = pReq->info.node;
  SSdb      *pSdb = pMnode->pSdb;
  int32_t    numOfRows = 0;
  SDbObj    *pDb = NULL;
  ESdbStatus objStatus = 0;
H
Haojun Liao 已提交
1639

1640 1641 1642 1643
  SUserObj *pUser = mndAcquireUser(pMnode, pReq->info.conn.user);
  if (pUser == NULL) return 0;
  bool sysinfo = pUser->sysInfo;

1644 1645 1646 1647
  // Append the information_schema database into the result.
  if (!pShow->sysDbRsp) {
    SDbObj infoschemaDb = {0};
    setInformationSchemaDbCfg(&infoschemaDb);
1648
    dumpDbInfoData(pBlock, &infoschemaDb, pShow, numOfRows, 14, true, 0, 1);
1649 1650 1651 1652 1653

    numOfRows += 1;

    SDbObj perfschemaDb = {0};
    setPerfSchemaDbCfg(&perfschemaDb);
1654
    dumpDbInfoData(pBlock, &perfschemaDb, pShow, numOfRows, 3, true, 0, 1);
1655 1656 1657 1658 1659

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

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

1664 1665 1666 1667 1668 1669
    if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_READ_OR_WRITE_DB, pDb) == 0) {
      int32_t numOfTables = 0;
      sdbTraverse(pSdb, SDB_VGROUP, mndGetTablesOfDbFp, &numOfTables, NULL, NULL);
      dumpDbInfoData(pBlock, pDb, pShow, numOfRows, numOfTables, false, objStatus, sysinfo);
      numOfRows++;
    }
1670

S
Shengliang Guan 已提交
1671 1672 1673
    sdbRelease(pSdb, pDb);
  }

1674
  pShow->numOfRows += numOfRows;
1675
  mndReleaseUser(pMnode, pUser);
S
Shengliang Guan 已提交
1676 1677 1678 1679 1680
  return numOfRows;
}

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