• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

taosdata / TDengine / #4882

14 Dec 2025 03:48AM UTC coverage: 64.674% (+4.1%) from 60.617%
#4882

push

travis-ci

web-flow
test: update coverage workflow time (#33918)

167512 of 259010 relevant lines covered (64.67%)

106102375.15 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

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

16
#define _DEFAULT_SOURCE
17
#include "mndDb.h"
18
#include "audit.h"
19
#include "command.h"
20
#include "mndArbGroup.h"
21
#include "mndCluster.h"
22
#include "mndCompact.h"
23
#include "mndCompactDetail.h"
24
#include "mndConfig.h"
25
#include "mndDnode.h"
26
#include "mndEncryptAlgr.h"
27
#include "mndIndex.h"
28
#include "mndPrivilege.h"
29
#include "mndRetention.h"
30
#include "mndRetentionDetail.h"
31
#include "mndRsma.h"
32
#include "mndScan.h"
33
#include "mndShow.h"
34
#include "mndSma.h"
35
#include "mndSsMigrate.h"
36
#include "mndStb.h"
37
#include "mndStream.h"
38
#include "mndSubscribe.h"
39
#include "mndTopic.h"
40
#include "mndTrans.h"
41
#include "mndUser.h"
42
#include "mndVgroup.h"
43
#include "mndView.h"
44
#include "systable.h"
45
#include "thttp.h"
46
#include "tjson.h"
47

48
#define DB_VER_NUMBER   1
49
#define DB_RESERVE_SIZE 14
50

51
static SSdbRow *mndDbActionDecode(SSdbRaw *pRaw);
52
static int32_t  mndDbActionInsert(SSdb *pSdb, SDbObj *pDb);
53
static int32_t  mndDbActionDelete(SSdb *pSdb, SDbObj *pDb);
54
static int32_t  mndDbActionUpdate(SSdb *pSdb, SDbObj *pOld, SDbObj *pNew);
55
static int32_t  mndNewDbActionValidate(SMnode *pMnode, STrans *pTrans, SSdbRaw *pRaw);
56

57
static int32_t mndProcessCreateDbReq(SRpcMsg *pReq);
58
static int32_t mndProcessAlterDbReq(SRpcMsg *pReq);
59
static int32_t mndProcessDropDbReq(SRpcMsg *pReq);
60
static int32_t mndProcessUseDbReq(SRpcMsg *pReq);
61
static int32_t mndProcessTrimDbReq(SRpcMsg *pReq);
62
static int32_t mndProcessSsMigrateDbReq(SRpcMsg *pReq);
63
static int32_t mndProcessTrimDbWalReq(SRpcMsg *pReq);
64
static int32_t mndProcessS3MigrateDbReq(SRpcMsg *pReq);
65
static int32_t mndRetrieveDbs(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rowsCapacity);
66
static void    mndCancelGetNextDb(SMnode *pMnode, void *pIter);
67
static int32_t mndProcessGetDbCfgReq(SRpcMsg *pReq);
68

69
#ifndef TD_ENTERPRISE
70
int32_t mndProcessCompactDbReq(SRpcMsg *pReq) { return TSDB_CODE_OPS_NOT_SUPPORT; }
71
#endif
72

73
int32_t mndInitDb(SMnode *pMnode) {
501,119✔
74
  SSdbTable table = {
501,119✔
75
      .sdbType = SDB_DB,
76
      .keyType = SDB_KEY_BINARY,
77
      .encodeFp = (SdbEncodeFp)mndDbActionEncode,
78
      .decodeFp = (SdbDecodeFp)mndDbActionDecode,
79
      .insertFp = (SdbInsertFp)mndDbActionInsert,
80
      .updateFp = (SdbUpdateFp)mndDbActionUpdate,
81
      .deleteFp = (SdbDeleteFp)mndDbActionDelete,
82
      .validateFp = (SdbValidateFp)mndNewDbActionValidate,
83
  };
84

85
  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_DB, mndProcessCreateDbReq);
501,119✔
86
  mndSetMsgHandle(pMnode, TDMT_MND_ALTER_DB, mndProcessAlterDbReq);
501,119✔
87
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_DB, mndProcessDropDbReq);
501,119✔
88
  mndSetMsgHandle(pMnode, TDMT_MND_USE_DB, mndProcessUseDbReq);
501,119✔
89
  mndSetMsgHandle(pMnode, TDMT_MND_COMPACT_DB, mndProcessCompactDbReq);
501,119✔
90
  mndSetMsgHandle(pMnode, TDMT_MND_SCAN_DB, mndProcessScanDbReq);
501,119✔
91
  mndSetMsgHandle(pMnode, TDMT_MND_TRIM_DB, mndProcessTrimDbReq);
501,119✔
92
  mndSetMsgHandle(pMnode, TDMT_MND_TRIM_DB_WAL, mndProcessTrimDbWalReq);
501,119✔
93
  mndSetMsgHandle(pMnode, TDMT_MND_GET_DB_CFG, mndProcessGetDbCfgReq);
501,119✔
94
  mndSetMsgHandle(pMnode, TDMT_MND_SSMIGRATE_DB, mndProcessSsMigrateDbReq);
501,119✔
95
  mndSetMsgHandle(pMnode, TDMT_MND_GET_DB_INFO, mndProcessUseDbReq);
501,119✔
96

97
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_DB, mndRetrieveDbs);
501,119✔
98
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_DB, mndCancelGetNextDb);
501,119✔
99

100
  return sdbSetTable(pMnode->pSdb, table);
501,119✔
101
}
102

103
void mndCleanupDb(SMnode *pMnode) {}
501,002✔
104

105
SSdbRaw *mndDbActionEncode(SDbObj *pDb) {
6,062,522✔
106
  int32_t code = 0;
6,062,522✔
107
  int32_t lino = 0;
6,062,522✔
108
  terrno = TSDB_CODE_OUT_OF_MEMORY;
6,062,522✔
109

110
  int32_t  size = sizeof(SDbObj) + pDb->cfg.numOfRetensions * sizeof(SRetention) + DB_RESERVE_SIZE;
6,062,522✔
111
  SSdbRaw *pRaw = sdbAllocRaw(SDB_DB, DB_VER_NUMBER, size);
6,062,522✔
112
  if (pRaw == NULL) goto _OVER;
6,062,522✔
113

114
  int32_t dataPos = 0;
6,062,522✔
115
  SDB_SET_BINARY(pRaw, dataPos, pDb->name, TSDB_DB_FNAME_LEN, _OVER)
6,062,522✔
116
  SDB_SET_BINARY(pRaw, dataPos, pDb->acct, TSDB_USER_LEN, _OVER)
6,062,522✔
117
  SDB_SET_BINARY(pRaw, dataPos, pDb->createUser, TSDB_USER_LEN, _OVER)
6,062,522✔
118
  SDB_SET_INT64(pRaw, dataPos, pDb->createdTime, _OVER)
6,062,522✔
119
  SDB_SET_INT64(pRaw, dataPos, pDb->updateTime, _OVER)
6,062,522✔
120
  SDB_SET_INT64(pRaw, dataPos, pDb->uid, _OVER)
6,062,522✔
121
  SDB_SET_INT32(pRaw, dataPos, pDb->cfgVersion, _OVER)
6,062,522✔
122
  SDB_SET_INT32(pRaw, dataPos, pDb->vgVersion, _OVER)
6,062,522✔
123
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.numOfVgroups, _OVER)
6,062,522✔
124
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.numOfStables, _OVER)
6,062,522✔
125
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.buffer, _OVER)
6,062,522✔
126
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.pageSize, _OVER)
6,062,522✔
127
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.pages, _OVER)
6,062,522✔
128
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.cacheLastSize, _OVER)
6,062,522✔
129
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.daysPerFile, _OVER)
6,062,522✔
130
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.daysToKeep0, _OVER)
6,062,522✔
131
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.daysToKeep1, _OVER)
6,062,522✔
132
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.daysToKeep2, _OVER)
6,062,522✔
133
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.minRows, _OVER)
6,062,522✔
134
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.maxRows, _OVER)
6,062,522✔
135
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.walFsyncPeriod, _OVER)
6,062,522✔
136
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.walLevel, _OVER)
6,062,522✔
137
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.precision, _OVER)
6,062,522✔
138
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.compression, _OVER)
6,062,522✔
139
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.replications, _OVER)
6,062,522✔
140
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.strict, _OVER)
6,062,522✔
141
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.cacheLast, _OVER)
6,062,522✔
142
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.hashMethod, _OVER)
6,062,522✔
143
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.numOfRetensions, _OVER)
6,062,522✔
144
  for (int32_t i = 0; i < pDb->cfg.numOfRetensions; ++i) {
6,062,522✔
145
    SRetention *pRetension = taosArrayGet(pDb->cfg.pRetensions, i);
×
146
    SDB_SET_INT64(pRaw, dataPos, pRetension->freq, _OVER)
×
147
    SDB_SET_INT64(pRaw, dataPos, pRetension->keep, _OVER)
×
148
    SDB_SET_INT8(pRaw, dataPos, pRetension->freqUnit, _OVER)
×
149
    SDB_SET_INT8(pRaw, dataPos, pRetension->keepUnit, _OVER)
×
150
  }
151
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.schemaless, _OVER)
6,062,522✔
152
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.walRetentionPeriod, _OVER)
6,062,522✔
153
  SDB_SET_INT64(pRaw, dataPos, pDb->cfg.walRetentionSize, _OVER)
6,062,522✔
154
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.walRollPeriod, _OVER)
6,062,522✔
155
  SDB_SET_INT64(pRaw, dataPos, pDb->cfg.walSegmentSize, _OVER)
6,062,522✔
156
  SDB_SET_INT16(pRaw, dataPos, pDb->cfg.sstTrigger, _OVER)
6,062,522✔
157
  SDB_SET_INT16(pRaw, dataPos, pDb->cfg.hashPrefix, _OVER)
6,062,522✔
158
  SDB_SET_INT16(pRaw, dataPos, pDb->cfg.hashSuffix, _OVER)
6,062,522✔
159
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.tsdbPageSize, _OVER)
6,062,522✔
160
  SDB_SET_INT64(pRaw, dataPos, pDb->compactStartTime, _OVER)
6,062,522✔
161
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.keepTimeOffset, _OVER)
6,062,522✔
162
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.ssChunkSize, _OVER)
6,062,522✔
163
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.ssKeepLocal, _OVER)
6,062,522✔
164
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.ssCompact, _OVER)
6,062,522✔
165
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.withArbitrator, _OVER)
6,062,522✔
166
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.encryptAlgorithm, _OVER)
6,062,522✔
167
  SDB_SET_INT32(pRaw, dataPos, pDb->tsmaVersion, _OVER);
6,062,522✔
168
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.compactTimeOffset, _OVER)
6,062,522✔
169
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.compactStartTime, _OVER)
6,062,522✔
170
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.compactEndTime, _OVER)
6,062,522✔
171
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.compactInterval, _OVER)
6,062,522✔
172

173
  SDB_SET_RESERVE(pRaw, dataPos, DB_RESERVE_SIZE, _OVER)
6,062,522✔
174
  SDB_SET_UINT8(pRaw, dataPos, pDb->cfg.flags, _OVER)
6,062,522✔
175
  SDB_SET_DATALEN(pRaw, dataPos, _OVER)
6,062,522✔
176

177
  terrno = 0;
6,062,522✔
178

179
_OVER:
6,062,522✔
180
  if (terrno != 0) {
6,062,522✔
181
    mError("db:%s, failed to encode to raw:%p since %s", pDb->name, pRaw, terrstr());
×
182
    sdbFreeRaw(pRaw);
×
183
    return NULL;
×
184
  }
185

186
  mTrace("db:%s, encode to raw:%p, row:%p", pDb->name, pRaw, pDb);
6,062,522✔
187
  return pRaw;
6,062,522✔
188
}
189

190
static SSdbRow *mndDbActionDecode(SSdbRaw *pRaw) {
5,633,546✔
191
  int32_t code = 0;
5,633,546✔
192
  int32_t lino = 0;
5,633,546✔
193
  terrno = TSDB_CODE_OUT_OF_MEMORY;
5,633,546✔
194
  SSdbRow *pRow = NULL;
5,633,546✔
195
  SDbObj  *pDb = NULL;
5,633,546✔
196

197
  int8_t sver = 0;
5,633,546✔
198
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
5,633,546✔
199

200
  if (sver != DB_VER_NUMBER) {
5,633,546✔
201
    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
×
202
    goto _OVER;
×
203
  }
204

205
  pRow = sdbAllocRow(sizeof(SDbObj));
5,633,546✔
206
  if (pRow == NULL) goto _OVER;
5,633,546✔
207

208
  pDb = sdbGetRowObj(pRow);
5,633,546✔
209
  if (pDb == NULL) goto _OVER;
5,633,546✔
210

211
  int32_t dataPos = 0;
5,633,546✔
212
  SDB_GET_BINARY(pRaw, dataPos, pDb->name, TSDB_DB_FNAME_LEN, _OVER)
5,633,546✔
213
  SDB_GET_BINARY(pRaw, dataPos, pDb->acct, TSDB_USER_LEN, _OVER)
5,633,546✔
214
  SDB_GET_BINARY(pRaw, dataPos, pDb->createUser, TSDB_USER_LEN, _OVER)
5,633,546✔
215
  SDB_GET_INT64(pRaw, dataPos, &pDb->createdTime, _OVER)
5,633,546✔
216
  SDB_GET_INT64(pRaw, dataPos, &pDb->updateTime, _OVER)
5,633,546✔
217
  SDB_GET_INT64(pRaw, dataPos, &pDb->uid, _OVER)
5,633,546✔
218
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfgVersion, _OVER)
5,633,546✔
219
  SDB_GET_INT32(pRaw, dataPos, &pDb->vgVersion, _OVER)
5,633,546✔
220
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.numOfVgroups, _OVER)
5,633,546✔
221
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.numOfStables, _OVER)
5,633,546✔
222
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.buffer, _OVER)
5,633,546✔
223
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.pageSize, _OVER)
5,633,546✔
224
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.pages, _OVER)
5,633,546✔
225
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.cacheLastSize, _OVER)
5,633,546✔
226
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysPerFile, _OVER)
5,633,546✔
227
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysToKeep0, _OVER)
5,633,546✔
228
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysToKeep1, _OVER)
5,633,546✔
229
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysToKeep2, _OVER)
5,633,546✔
230
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.minRows, _OVER)
5,633,546✔
231
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.maxRows, _OVER)
5,633,546✔
232
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.walFsyncPeriod, _OVER)
5,633,546✔
233
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.walLevel, _OVER)
5,633,546✔
234
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.precision, _OVER)
5,633,546✔
235
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.compression, _OVER)
5,633,546✔
236
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.replications, _OVER)
5,633,546✔
237
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.strict, _OVER)
5,633,546✔
238
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.cacheLast, _OVER)
5,633,546✔
239
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.hashMethod, _OVER)
5,633,546✔
240
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.numOfRetensions, _OVER)
5,633,546✔
241
  if (pDb->cfg.numOfRetensions > 0) {
5,633,546✔
242
    pDb->cfg.pRetensions = taosArrayInit(pDb->cfg.numOfRetensions, sizeof(SRetention));
×
243
    if (pDb->cfg.pRetensions == NULL) goto _OVER;
×
244
    for (int32_t i = 0; i < pDb->cfg.numOfRetensions; ++i) {
×
245
      SRetention retention = {0};
×
246
      SDB_GET_INT64(pRaw, dataPos, &retention.freq, _OVER)
×
247
      SDB_GET_INT64(pRaw, dataPos, &retention.keep, _OVER)
×
248
      SDB_GET_INT8(pRaw, dataPos, &retention.freqUnit, _OVER)
×
249
      SDB_GET_INT8(pRaw, dataPos, &retention.keepUnit, _OVER)
×
250
      if (taosArrayPush(pDb->cfg.pRetensions, &retention) == NULL) {
×
251
        goto _OVER;
×
252
      }
253
    }
254
  }
255
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.schemaless, _OVER)
5,633,546✔
256
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.walRetentionPeriod, _OVER)
5,633,546✔
257
  SDB_GET_INT64(pRaw, dataPos, &pDb->cfg.walRetentionSize, _OVER)
5,633,546✔
258
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.walRollPeriod, _OVER)
5,633,546✔
259
  SDB_GET_INT64(pRaw, dataPos, &pDb->cfg.walSegmentSize, _OVER)
5,633,546✔
260
  SDB_GET_INT16(pRaw, dataPos, &pDb->cfg.sstTrigger, _OVER)
5,633,546✔
261
  SDB_GET_INT16(pRaw, dataPos, &pDb->cfg.hashPrefix, _OVER)
5,633,546✔
262
  SDB_GET_INT16(pRaw, dataPos, &pDb->cfg.hashSuffix, _OVER)
5,633,546✔
263
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.tsdbPageSize, _OVER)
5,633,546✔
264
  SDB_GET_INT64(pRaw, dataPos, &pDb->compactStartTime, _OVER)
5,633,546✔
265
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.keepTimeOffset, _OVER)
5,633,546✔
266
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.ssChunkSize, _OVER)
5,633,546✔
267
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.ssKeepLocal, _OVER)
5,633,546✔
268
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.ssCompact, _OVER)
5,633,546✔
269
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.withArbitrator, _OVER)
5,633,546✔
270
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.encryptAlgorithm, _OVER)
5,633,546✔
271
  SDB_GET_INT32(pRaw, dataPos, &pDb->tsmaVersion, _OVER);
5,633,546✔
272
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.compactTimeOffset, _OVER)
5,633,546✔
273
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.compactStartTime, _OVER)
5,633,546✔
274
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.compactEndTime, _OVER)
5,633,546✔
275
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.compactInterval, _OVER)
5,633,546✔
276
  SDB_GET_RESERVE(pRaw, dataPos, DB_RESERVE_SIZE, _OVER)
5,633,546✔
277
  if (dataPos + sizeof(uint8_t) <= pRaw->dataLen) {
5,633,546✔
278
    SDB_GET_UINT8(pRaw, dataPos, &pDb->cfg.flags, _OVER)
5,633,546✔
279
  }
280

281
  taosInitRWLatch(&pDb->lock);
5,633,546✔
282

283
  if (pDb->cfg.ssChunkSize == 0) {
5,633,546✔
284
    pDb->cfg.ssChunkSize = TSDB_DEFAULT_SS_CHUNK_SIZE;
×
285

286
    mInfo("db:%s, ssChunkSize set from %d to default %d", pDb->name, pDb->cfg.ssChunkSize, TSDB_DEFAULT_SS_CHUNK_SIZE);
×
287
  }
288

289
  if (pDb->cfg.ssKeepLocal == 0) {
5,633,546✔
290
    pDb->cfg.ssKeepLocal = TSDB_DEFAULT_SS_KEEP_LOCAL;
×
291

292
    mInfo("db:%s, ssKeepLocal set from %d to default %d", pDb->name, pDb->cfg.ssKeepLocal, TSDB_DEFAULT_SS_KEEP_LOCAL);
×
293
  }
294

295
  if (pDb->cfg.tsdbPageSize != TSDB_MIN_TSDB_PAGESIZE) {
5,633,546✔
296
    mInfo("db:%s, tsdbPageSize set from %d to default %d", pDb->name, pDb->cfg.tsdbPageSize,
5,633,546✔
297
          TSDB_DEFAULT_TSDB_PAGESIZE);
298
  }
299

300
  if (pDb->cfg.sstTrigger != TSDB_MIN_STT_TRIGGER) {
5,633,546✔
301
    mInfo("db:%s, sstTrigger set from %d to default %d", pDb->name, pDb->cfg.sstTrigger, TSDB_DEFAULT_SST_TRIGGER);
5,525,480✔
302
  }
303

304
  terrno = 0;
5,633,546✔
305

306
_OVER:
5,633,546✔
307
  if (terrno != 0) {
5,633,546✔
308
    mError("db:%s, failed to decode from raw:%p since %s", pDb == NULL ? "null" : pDb->name, pRaw, terrstr());
×
309
    taosMemoryFreeClear(pRow);
×
310
    return NULL;
×
311
  }
312

313
  mTrace("db:%s, decode from raw:%p, row:%p", pDb->name, pRaw, pDb);
5,633,546✔
314
  return pRow;
5,633,546✔
315
}
316

317
static int32_t mndNewDbActionValidate(SMnode *pMnode, STrans *pTrans, SSdbRaw *pRaw) {
1,270,509✔
318
  SSdb    *pSdb = pMnode->pSdb;
1,270,509✔
319
  SSdbRow *pRow = NULL;
1,270,509✔
320
  SDbObj  *pNewDb = NULL;
1,270,509✔
321
  int      code = -1;
1,270,509✔
322

323
  pRow = mndDbActionDecode(pRaw);
1,270,509✔
324
  if (pRow == NULL) {
1,270,509✔
325
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
326
    if (terrno != 0) code = terrno;
×
327
    goto _OVER;
×
328
  }
329
  pNewDb = sdbGetRowObj(pRow);
1,270,509✔
330
  if (pNewDb == NULL) {
1,270,509✔
331
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
332
    if (terrno != 0) code = terrno;
×
333
    goto _OVER;
×
334
  }
335

336
  SDbObj *pOldDb = sdbAcquire(pMnode->pSdb, SDB_DB, pNewDb->name);
1,270,509✔
337
  if (pOldDb != NULL) {
1,270,509✔
338
    mError("trans:%d, db name already in use. name: %s", pTrans->id, pNewDb->name);
×
339
    sdbRelease(pMnode->pSdb, pOldDb);
×
340
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
341
    if (terrno != 0) code = terrno;
×
342
    goto _OVER;
×
343
  }
344

345
  code = 0;
1,270,509✔
346
_OVER:
1,270,509✔
347
  if (pNewDb) mndDbActionDelete(pSdb, pNewDb);
1,270,509✔
348
  taosMemoryFreeClear(pRow);
1,270,509✔
349
  return code;
1,270,509✔
350
}
351

352
static int32_t mndDbActionInsert(SSdb *pSdb, SDbObj *pDb) {
1,447,024✔
353
  mTrace("db:%s, perform insert action, row:%p", pDb->name, pDb);
1,447,024✔
354
  return 0;
1,447,024✔
355
}
356

357
static int32_t mndDbActionDelete(SSdb *pSdb, SDbObj *pDb) {
5,633,546✔
358
  mTrace("db:%s, perform delete action, row:%p", pDb->name, pDb);
5,633,546✔
359
  taosArrayDestroy(pDb->cfg.pRetensions);
5,633,546✔
360
  return 0;
5,633,546✔
361
}
362

363
static int32_t mndDbActionUpdate(SSdb *pSdb, SDbObj *pOld, SDbObj *pNew) {
2,204,878✔
364
  mTrace("db:%s, perform update action, old row:%p new row:%p", pOld->name, pOld, pNew);
2,204,878✔
365
  taosWLockLatch(&pOld->lock);
2,204,878✔
366
  pOld->updateTime = pNew->updateTime;
2,204,878✔
367
  pOld->cfgVersion = pNew->cfgVersion;
2,204,878✔
368
  pOld->vgVersion = pNew->vgVersion;
2,204,878✔
369
  pOld->cfg.numOfVgroups = pNew->cfg.numOfVgroups;
2,204,878✔
370
  pOld->cfg.buffer = pNew->cfg.buffer;
2,204,878✔
371
  pOld->cfg.pageSize = pNew->cfg.pageSize;
2,204,878✔
372
  pOld->cfg.pages = pNew->cfg.pages;
2,204,878✔
373
  pOld->cfg.cacheLastSize = pNew->cfg.cacheLastSize;
2,204,878✔
374
  pOld->cfg.daysPerFile = pNew->cfg.daysPerFile;
2,204,878✔
375
  pOld->cfg.daysToKeep0 = pNew->cfg.daysToKeep0;
2,204,878✔
376
  pOld->cfg.daysToKeep1 = pNew->cfg.daysToKeep1;
2,204,878✔
377
  pOld->cfg.daysToKeep2 = pNew->cfg.daysToKeep2;
2,204,878✔
378
  pOld->cfg.keepTimeOffset = pNew->cfg.keepTimeOffset;
2,204,878✔
379
  pOld->cfg.walFsyncPeriod = pNew->cfg.walFsyncPeriod;
2,204,878✔
380
  pOld->cfg.walLevel = pNew->cfg.walLevel;
2,204,878✔
381
  pOld->cfg.walRetentionPeriod = pNew->cfg.walRetentionPeriod;
2,204,878✔
382
  pOld->cfg.walRetentionSize = pNew->cfg.walRetentionSize;
2,204,878✔
383
  pOld->cfg.strict = pNew->cfg.strict;
2,204,878✔
384
  pOld->cfg.cacheLast = pNew->cfg.cacheLast;
2,204,878✔
385
  pOld->cfg.replications = pNew->cfg.replications;
2,204,878✔
386
  pOld->cfg.sstTrigger = pNew->cfg.sstTrigger;
2,204,878✔
387
  pOld->cfg.minRows = pNew->cfg.minRows;
2,204,878✔
388
  pOld->cfg.maxRows = pNew->cfg.maxRows;
2,204,878✔
389
  pOld->cfg.tsdbPageSize = pNew->cfg.tsdbPageSize;
2,204,878✔
390
  pOld->cfg.ssChunkSize = pNew->cfg.ssChunkSize;
2,204,878✔
391
  pOld->cfg.ssKeepLocal = pNew->cfg.ssKeepLocal;
2,204,878✔
392
  pOld->cfg.ssCompact = pNew->cfg.ssCompact;
2,204,878✔
393
  pOld->cfg.withArbitrator = pNew->cfg.withArbitrator;
2,204,878✔
394
  pOld->cfg.compactInterval = pNew->cfg.compactInterval;
2,204,878✔
395
  pOld->cfg.compactStartTime = pNew->cfg.compactStartTime;
2,204,878✔
396
  pOld->cfg.compactEndTime = pNew->cfg.compactEndTime;
2,204,878✔
397
  pOld->cfg.compactTimeOffset = pNew->cfg.compactTimeOffset;
2,204,878✔
398
  pOld->compactStartTime = pNew->compactStartTime;
2,204,878✔
399
  pOld->tsmaVersion = pNew->tsmaVersion;
2,204,878✔
400
  taosWUnLockLatch(&pOld->lock);
2,204,878✔
401
  return 0;
2,204,878✔
402
}
403

404
static inline int32_t mndGetGlobalVgroupVersion(SMnode *pMnode) {
7,825,483✔
405
  SSdb *pSdb = pMnode->pSdb;
7,825,483✔
406
  return sdbGetTableVer(pSdb, SDB_VGROUP);
7,825,483✔
407
}
408

409
SDbObj *mndAcquireDb(SMnode *pMnode, const char *db) {
77,002,515✔
410
  SSdb   *pSdb = pMnode->pSdb;
77,002,515✔
411
  SDbObj *pDb = sdbAcquire(pSdb, SDB_DB, db);
77,002,515✔
412
  if (pDb == NULL) {
77,002,714✔
413
    if (terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
2,218,381✔
414
      terrno = TSDB_CODE_MND_DB_NOT_EXIST;
2,078,400✔
415
    } else if (terrno == TSDB_CODE_SDB_OBJ_CREATING) {
139,981✔
416
      terrno = TSDB_CODE_MND_DB_IN_CREATING;
10,805✔
417
    } else if (terrno == TSDB_CODE_SDB_OBJ_DROPPING) {
129,176✔
418
      terrno = TSDB_CODE_MND_DB_IN_DROPPING;
129,176✔
419
    } else {
420
      terrno = TSDB_CODE_APP_ERROR;
×
421
      mFatal("db:%s, failed to acquire db since %s", db, terrstr());
×
422
    }
423
  }
424
  return pDb;
77,002,515✔
425
}
426

427
void mndReleaseDb(SMnode *pMnode, SDbObj *pDb) {
85,844,836✔
428
  SSdb *pSdb = pMnode->pSdb;
85,844,836✔
429
  sdbRelease(pSdb, pDb);
85,844,836✔
430
}
85,844,836✔
431

432
bool mndDbIsExist(SMnode *pMnode, const char *db, int64_t uid) {
137,346✔
433
  SDbObj *pDb = mndAcquireDb(pMnode, db);
137,346✔
434
  if (pDb == NULL) {
137,346✔
435
    return false;
1,388✔
436
  } else {
437
    bool result = (uid == 0) || (uid == pDb->uid);
135,958✔
438
    mndReleaseDb(pMnode, pDb);
135,958✔
439
    pDb = NULL;
135,958✔
440
    return result;
135,958✔
441
  }
442
}
443

444
int32_t mndCheckDbName(const char *dbName, SUserObj *pUser) {
1,196,853✔
445
  char *pos = strstr(dbName, TS_PATH_DELIMITER);
1,196,853✔
446
  if (pos == NULL) {
1,196,853✔
447
    return TSDB_CODE_MND_INVALID_DB;
×
448
  }
449

450
  int32_t acctId;
1,196,552✔
451
  int32_t code = taosStr2int32(dbName, &acctId);
1,196,853✔
452
  if (code != 0) {
1,196,853✔
453
    return code;
×
454
  }
455

456
  if (acctId != pUser->acctId) {
1,196,853✔
457
    return TSDB_CODE_MND_INVALID_DB_ACCT;
×
458
  }
459

460
  return 0;
1,196,853✔
461
}
462

463
int32_t mndCheckDbCfg(SMnode *pMnode, SDbCfg *pCfg) {
1,196,853✔
464
  int32_t code = TSDB_CODE_MND_INVALID_DB_OPTION;
1,196,853✔
465

466
  if (pCfg->numOfVgroups < TSDB_MIN_VNODES_PER_DB || pCfg->numOfVgroups > TSDB_MAX_VNODES_PER_DB) return code;
1,196,853✔
467
  if (pCfg->numOfStables < TSDB_DB_STREAM_MODE_OFF || pCfg->numOfStables > TSDB_DB_STREAM_MODE_ON) return code;
1,196,853✔
468
  if (pCfg->buffer < TSDB_MIN_BUFFER_PER_VNODE || pCfg->buffer > TSDB_MAX_BUFFER_PER_VNODE) return code;
1,196,853✔
469
  if (pCfg->pageSize < TSDB_MIN_PAGESIZE_PER_VNODE || pCfg->pageSize > TSDB_MAX_PAGESIZE_PER_VNODE) return code;
1,196,853✔
470
  if (pCfg->pages < TSDB_MIN_PAGES_PER_VNODE || pCfg->pages > TSDB_MAX_PAGES_PER_VNODE) return code;
1,196,853✔
471
  if (pCfg->cacheLastSize < TSDB_MIN_DB_CACHE_SIZE || pCfg->cacheLastSize > TSDB_MAX_DB_CACHE_SIZE) return code;
1,196,853✔
472
  if (pCfg->daysPerFile < TSDB_MIN_DAYS_PER_FILE || pCfg->daysPerFile > TSDB_MAX_DAYS_PER_FILE) return code;
1,196,853✔
473
  if (pCfg->daysToKeep0 < TSDB_MIN_KEEP || pCfg->daysToKeep0 > TSDB_MAX_KEEP) return code;
1,196,853✔
474
  if (pCfg->daysToKeep1 < TSDB_MIN_KEEP || pCfg->daysToKeep1 > TSDB_MAX_KEEP) return code;
1,196,853✔
475
  if (pCfg->daysToKeep2 < TSDB_MIN_KEEP || pCfg->daysToKeep2 > TSDB_MAX_KEEP) return code;
1,196,853✔
476
  if (pCfg->daysToKeep0 < pCfg->daysPerFile) return code;
1,196,853✔
477
  if (pCfg->daysToKeep0 > pCfg->daysToKeep1) return code;
1,196,853✔
478
  if (pCfg->daysToKeep1 > pCfg->daysToKeep2) return code;
1,196,853✔
479
  if (pCfg->keepTimeOffset < TSDB_MIN_KEEP_TIME_OFFSET || pCfg->keepTimeOffset > TSDB_MAX_KEEP_TIME_OFFSET) return code;
1,196,853✔
480
  if (pCfg->minRows < TSDB_MIN_MINROWS_FBLOCK || pCfg->minRows > TSDB_MAX_MINROWS_FBLOCK) return code;
1,196,853✔
481
  if (pCfg->maxRows < TSDB_MIN_MAXROWS_FBLOCK || pCfg->maxRows > TSDB_MAX_MAXROWS_FBLOCK) return code;
1,196,853✔
482
  if (pCfg->minRows > pCfg->maxRows) return code;
1,196,853✔
483
  if (pCfg->walFsyncPeriod < TSDB_MIN_FSYNC_PERIOD || pCfg->walFsyncPeriod > TSDB_MAX_FSYNC_PERIOD) return code;
1,196,087✔
484
  if (pCfg->walLevel < TSDB_MIN_WAL_LEVEL || pCfg->walLevel > TSDB_MAX_WAL_LEVEL) return code;
1,196,087✔
485
  if (pCfg->precision < TSDB_MIN_PRECISION && pCfg->precision > TSDB_MAX_PRECISION) return code;
1,196,087✔
486
  if (pCfg->compression < TSDB_MIN_COMP_LEVEL || pCfg->compression > TSDB_MAX_COMP_LEVEL) return code;
1,196,087✔
487
  if (pCfg->replications < TSDB_MIN_DB_REPLICA || pCfg->replications > TSDB_MAX_DB_REPLICA) return code;
1,196,087✔
488
#ifdef TD_ENTERPRISE
489
  if ((pCfg->replications == 2) ^ (pCfg->withArbitrator == TSDB_MAX_DB_WITH_ARBITRATOR)) return code;
1,196,087✔
490
  // if (pCfg->encryptAlgorithm < TSDB_MIN_ENCRYPT_ALGO || pCfg->encryptAlgorithm > TSDB_MAX_ENCRYPT_ALGO) return code;
491
#else
492
  if (pCfg->replications != 1 && pCfg->replications != 3) return code;
493
  if (pCfg->encryptAlgorithm != TSDB_DEFAULT_ENCRYPT_ALGO) return code;
494
#endif
495

496
  if (pCfg->strict < TSDB_DB_STRICT_OFF || pCfg->strict > TSDB_DB_STRICT_ON) return code;
1,196,087✔
497
  if (pCfg->schemaless < TSDB_DB_SCHEMALESS_OFF || pCfg->schemaless > TSDB_DB_SCHEMALESS_ON) return code;
1,196,087✔
498
  if (pCfg->cacheLast < TSDB_CACHE_MODEL_NONE || pCfg->cacheLast > TSDB_CACHE_MODEL_BOTH) return code;
1,196,087✔
499
  if (pCfg->hashMethod != 1) return code;
1,196,087✔
500
  if (pCfg->replications > mndGetDnodeSize(pMnode)) {
1,196,087✔
501
    code = TSDB_CODE_MND_NO_ENOUGH_DNODES;
×
502
    TAOS_RETURN(code);
×
503
  }
504
  if (pCfg->walRetentionPeriod < TSDB_DB_MIN_WAL_RETENTION_PERIOD) return code;
1,196,087✔
505
  if (pCfg->walRetentionSize < TSDB_DB_MIN_WAL_RETENTION_SIZE) return code;
1,196,087✔
506
  if (pCfg->walRollPeriod < TSDB_DB_MIN_WAL_ROLL_PERIOD) return code;
1,196,087✔
507
  if (pCfg->walSegmentSize < TSDB_DB_MIN_WAL_SEGMENT_SIZE) return code;
1,196,087✔
508
  if (pCfg->sstTrigger < TSDB_MIN_STT_TRIGGER || pCfg->sstTrigger > TSDB_MAX_STT_TRIGGER) return code;
1,196,087✔
509
  if (pCfg->hashPrefix < TSDB_MIN_HASH_PREFIX || pCfg->hashPrefix > TSDB_MAX_HASH_PREFIX) return code;
1,196,087✔
510
  if (pCfg->hashSuffix < TSDB_MIN_HASH_SUFFIX || pCfg->hashSuffix > TSDB_MAX_HASH_SUFFIX) return code;
1,196,087✔
511
  if ((pCfg->hashSuffix * pCfg->hashPrefix) < 0) return code;
1,196,087✔
512
  if ((pCfg->hashPrefix + pCfg->hashSuffix) >= (TSDB_TABLE_NAME_LEN - 1)) return code;
1,196,087✔
513
  if (pCfg->tsdbPageSize < TSDB_MIN_TSDB_PAGESIZE || pCfg->tsdbPageSize > TSDB_MAX_TSDB_PAGESIZE) return code;
1,196,087✔
514
  if (taosArrayGetSize(pCfg->pRetensions) != pCfg->numOfRetensions) return code;
1,196,087✔
515

516
  if (pCfg->ssChunkSize < TSDB_MIN_SS_CHUNK_SIZE || pCfg->ssChunkSize > TSDB_MAX_SS_CHUNK_SIZE) return code;
1,196,087✔
517
  if (pCfg->ssKeepLocal < TSDB_MIN_SS_KEEP_LOCAL || pCfg->ssKeepLocal > TSDB_MAX_SS_KEEP_LOCAL) return code;
1,196,087✔
518
  if (pCfg->ssCompact < TSDB_MIN_SS_COMPACT || pCfg->ssCompact > TSDB_MAX_SS_COMPACT) return code;
1,196,087✔
519

520
  if (pCfg->compactInterval != 0 &&
1,196,087✔
521
      (pCfg->compactInterval < TSDB_MIN_COMPACT_INTERVAL || pCfg->compactInterval > pCfg->daysToKeep2))
4,542✔
522
    return code;
×
523
  if (pCfg->compactStartTime != 0 &&
1,196,087✔
524
      (pCfg->compactStartTime < -pCfg->daysToKeep2 || pCfg->compactStartTime > -pCfg->daysPerFile))
4,587✔
525
    return code;
×
526
  if (pCfg->compactEndTime != 0 &&
1,196,087✔
527
      (pCfg->compactEndTime < -pCfg->daysToKeep2 || pCfg->compactEndTime > -pCfg->daysPerFile))
4,587✔
528
    return code;
×
529
  if (pCfg->compactStartTime != 0 && pCfg->compactEndTime != 0 && pCfg->compactStartTime >= pCfg->compactEndTime)
1,196,087✔
530
    return code;
×
531
  if (pCfg->compactTimeOffset < TSDB_MIN_COMPACT_TIME_OFFSET || pCfg->compactTimeOffset > TSDB_MAX_COMPACT_TIME_OFFSET)
1,196,087✔
532
    return code;
×
533

534
  code = 0;
1,196,087✔
535
  TAOS_RETURN(code);
1,196,087✔
536
}
537

538
static int32_t mndCheckInChangeDbCfg(SMnode *pMnode, SDbCfg *pOldCfg, SDbCfg *pNewCfg) {
82,054✔
539
  int32_t code = TSDB_CODE_MND_INVALID_DB_OPTION;
82,054✔
540
  if (pNewCfg->buffer < TSDB_MIN_BUFFER_PER_VNODE || pNewCfg->buffer > TSDB_MAX_BUFFER_PER_VNODE) return code;
82,054✔
541
  if (pNewCfg->pages < TSDB_MIN_PAGES_PER_VNODE || pNewCfg->pages > TSDB_MAX_PAGES_PER_VNODE) return code;
82,054✔
542
  if (pNewCfg->pageSize < TSDB_MIN_PAGESIZE_PER_VNODE || pNewCfg->pageSize > TSDB_MAX_PAGESIZE_PER_VNODE) return code;
82,054✔
543
  if (pNewCfg->daysPerFile < TSDB_MIN_DAYS_PER_FILE || pNewCfg->daysPerFile > TSDB_MAX_DAYS_PER_FILE) return code;
82,054✔
544
  if (pNewCfg->daysToKeep0 < TSDB_MIN_KEEP || pNewCfg->daysToKeep0 > TSDB_MAX_KEEP) return code;
82,054✔
545
  if (pNewCfg->daysToKeep1 < TSDB_MIN_KEEP || pNewCfg->daysToKeep1 > TSDB_MAX_KEEP) return code;
82,054✔
546
  if (pNewCfg->daysToKeep2 < TSDB_MIN_KEEP || pNewCfg->daysToKeep2 > TSDB_MAX_KEEP) return code;
82,054✔
547
  if (pNewCfg->daysToKeep0 < pNewCfg->daysPerFile) return code;
82,054✔
548
  if (pNewCfg->daysToKeep0 > pNewCfg->daysToKeep1) return code;
82,054✔
549
  if (pNewCfg->daysToKeep1 > pNewCfg->daysToKeep2) return code;
82,054✔
550
  if (pNewCfg->keepTimeOffset < TSDB_MIN_KEEP_TIME_OFFSET || pNewCfg->keepTimeOffset > TSDB_MAX_KEEP_TIME_OFFSET)
82,054✔
551
    return code;
×
552
  if (pNewCfg->walFsyncPeriod < TSDB_MIN_FSYNC_PERIOD || pNewCfg->walFsyncPeriod > TSDB_MAX_FSYNC_PERIOD) return code;
82,054✔
553
  if (pNewCfg->walLevel < TSDB_MIN_WAL_LEVEL || pNewCfg->walLevel > TSDB_MAX_WAL_LEVEL) return code;
82,054✔
554
  if (pNewCfg->cacheLast < TSDB_CACHE_MODEL_NONE || pNewCfg->cacheLast > TSDB_CACHE_MODEL_BOTH) return code;
82,054✔
555
  if (pNewCfg->cacheLastSize < TSDB_MIN_DB_CACHE_SIZE || pNewCfg->cacheLastSize > TSDB_MAX_DB_CACHE_SIZE) return code;
82,054✔
556
  if (pNewCfg->replications < TSDB_MIN_DB_REPLICA || pNewCfg->replications > TSDB_MAX_DB_REPLICA) return code;
82,054✔
557
#ifdef TD_ENTERPRISE
558
  if ((pNewCfg->replications == 2) ^ (pNewCfg->withArbitrator == TSDB_MAX_DB_WITH_ARBITRATOR)) return code;
82,054✔
559
  if (pNewCfg->replications == 2 && pNewCfg->withArbitrator == TSDB_MAX_DB_WITH_ARBITRATOR) {
82,054✔
560
    if (pOldCfg->replications != 1 && pOldCfg->replications != 2) {
755✔
561
      terrno = TSDB_CODE_OPS_NOT_SUPPORT;
755✔
562
      return code;
755✔
563
    }
564
  }
565
  if (pNewCfg->replications != 2 && pOldCfg->replications == 2) {
81,299✔
566
    terrno = TSDB_CODE_OPS_NOT_SUPPORT;
×
567
    return code;
×
568
  }
569
#else
570
  if (pNewCfg->replications != 1 && pNewCfg->replications != 3) return code;
571
#endif
572

573
  if (pNewCfg->walLevel == 0 && pOldCfg->replications > 1) {
81,299✔
574
    terrno = TSDB_CODE_MND_INVALID_WAL_LEVEL;
×
575
    return code;
×
576
  }
577
  if (pNewCfg->replications > 1 && pOldCfg->walLevel == 0) {
81,299✔
578
    terrno = TSDB_CODE_MND_INVALID_WAL_LEVEL;
×
579
    return code;
×
580
  }
581

582
  if (pNewCfg->sstTrigger != pOldCfg->sstTrigger &&
81,299✔
583
      (pNewCfg->sstTrigger < TSDB_MIN_STT_TRIGGER || pNewCfg->sstTrigger > TSDB_MAX_STT_TRIGGER))
1,339✔
584
    return code;
×
585
  if (pNewCfg->minRows < TSDB_MIN_MINROWS_FBLOCK || pNewCfg->minRows > TSDB_MAX_MINROWS_FBLOCK) return code;
81,299✔
586
  if (pNewCfg->maxRows < TSDB_MIN_MAXROWS_FBLOCK || pNewCfg->maxRows > TSDB_MAX_MAXROWS_FBLOCK) return code;
81,299✔
587
  if (pNewCfg->minRows > pNewCfg->maxRows) return code;
81,299✔
588
  if (pNewCfg->walRetentionPeriod < TSDB_DB_MIN_WAL_RETENTION_PERIOD) return code;
80,544✔
589
  if (pNewCfg->walRetentionSize < TSDB_DB_MIN_WAL_RETENTION_SIZE) return code;
80,544✔
590
  if (pNewCfg->strict < TSDB_DB_STRICT_OFF || pNewCfg->strict > TSDB_DB_STRICT_ON) return code;
80,544✔
591
  if (pNewCfg->replications > mndGetDnodeSize(pMnode)) {
80,544✔
592
    terrno = TSDB_CODE_MND_NO_ENOUGH_DNODES;
×
593
    return code;
×
594
  }
595
  if (pNewCfg->ssChunkSize < TSDB_MIN_SS_CHUNK_SIZE || pNewCfg->ssChunkSize > TSDB_MAX_SS_CHUNK_SIZE) return code;
80,544✔
596
  if (pNewCfg->ssKeepLocal < TSDB_MIN_SS_KEEP_LOCAL || pNewCfg->ssKeepLocal > TSDB_MAX_SS_KEEP_LOCAL) return code;
80,544✔
597
  if (pNewCfg->ssCompact < TSDB_MIN_SS_COMPACT || pNewCfg->ssCompact > TSDB_MAX_SS_COMPACT) return code;
80,544✔
598

599
  if (pNewCfg->compactInterval != 0 &&
80,544✔
600
      (pNewCfg->compactInterval < TSDB_MIN_COMPACT_INTERVAL || pNewCfg->compactInterval > pNewCfg->daysToKeep2))
6,897✔
601
    return code;
×
602
  if (pNewCfg->compactStartTime != 0 &&
80,544✔
603
      (pNewCfg->compactStartTime < -pNewCfg->daysToKeep2 || pNewCfg->compactStartTime > -pNewCfg->daysPerFile))
4,632✔
604
    return code;
×
605
  if (pNewCfg->compactEndTime != 0 &&
80,544✔
606
      (pNewCfg->compactEndTime < -pNewCfg->daysToKeep2 || pNewCfg->compactEndTime > -pNewCfg->daysPerFile))
4,632✔
607
    return code;
×
608
  if (pNewCfg->compactStartTime != 0 && pNewCfg->compactEndTime != 0 &&
80,544✔
609
      pNewCfg->compactStartTime >= pNewCfg->compactEndTime)
4,632✔
610
    return code;
×
611
  if (pNewCfg->compactTimeOffset < TSDB_MIN_COMPACT_TIME_OFFSET ||
80,544✔
612
      pNewCfg->compactTimeOffset > TSDB_MAX_COMPACT_TIME_OFFSET)
80,544✔
613
    return code;
×
614

615
  code = 0;
80,544✔
616
  TAOS_RETURN(code);
80,544✔
617
}
618

619
static void mndSetDefaultDbCfg(SDbCfg *pCfg) {
1,195,551✔
620
  if (pCfg->numOfVgroups < 0) pCfg->numOfVgroups = TSDB_DEFAULT_VN_PER_DB;
1,195,551✔
621
  if (pCfg->numOfStables < 0) pCfg->numOfStables = TSDB_DEFAULT_DB_SINGLE_STABLE;
1,195,551✔
622
  if (pCfg->buffer < 0) pCfg->buffer = TSDB_DEFAULT_BUFFER_PER_VNODE;
1,195,551✔
623
  if (pCfg->pageSize < 0) pCfg->pageSize = TSDB_DEFAULT_PAGESIZE_PER_VNODE;
1,195,551✔
624
  if (pCfg->pages < 0) pCfg->pages = TSDB_DEFAULT_PAGES_PER_VNODE;
1,195,551✔
625
  if (pCfg->daysPerFile < 0) pCfg->daysPerFile = TSDB_DEFAULT_DURATION_PER_FILE;
1,195,551✔
626
  if (pCfg->daysToKeep0 < 0) pCfg->daysToKeep0 = TSDB_DEFAULT_KEEP;
1,195,551✔
627
  if (pCfg->daysToKeep1 < 0) pCfg->daysToKeep1 = pCfg->daysToKeep0;
1,195,551✔
628
  if (pCfg->daysToKeep2 < 0) pCfg->daysToKeep2 = pCfg->daysToKeep1;
1,195,551✔
629
  if (pCfg->keepTimeOffset < 0) pCfg->keepTimeOffset = TSDB_DEFAULT_KEEP_TIME_OFFSET;
1,195,551✔
630
  if (pCfg->minRows < 0) pCfg->minRows = TSDB_DEFAULT_MINROWS_FBLOCK;
1,195,551✔
631
  if (pCfg->maxRows < 0) pCfg->maxRows = TSDB_DEFAULT_MAXROWS_FBLOCK;
1,195,551✔
632
  if (pCfg->walFsyncPeriod < 0) pCfg->walFsyncPeriod = TSDB_DEFAULT_FSYNC_PERIOD;
1,195,551✔
633
  if (pCfg->walLevel < 0) pCfg->walLevel = TSDB_DEFAULT_WAL_LEVEL;
1,195,551✔
634
  if (pCfg->precision < 0) pCfg->precision = TSDB_DEFAULT_PRECISION;
1,195,551✔
635
  if (pCfg->compression < 0) pCfg->compression = TSDB_DEFAULT_COMP_LEVEL;
1,195,551✔
636
  if (pCfg->replications < 0) pCfg->replications = TSDB_DEFAULT_DB_REPLICA;
1,195,551✔
637
  if (pCfg->strict < 0) pCfg->strict = TSDB_DEFAULT_DB_STRICT;
1,195,551✔
638
  if (pCfg->cacheLast < 0) pCfg->cacheLast = TSDB_DEFAULT_CACHE_MODEL;
1,195,551✔
639
  if (pCfg->cacheLastSize <= 0) pCfg->cacheLastSize = TSDB_DEFAULT_CACHE_SIZE;
1,195,551✔
640
  if (pCfg->numOfRetensions < 0) pCfg->numOfRetensions = 0;
1,195,551✔
641
  if (pCfg->schemaless < 0) pCfg->schemaless = TSDB_DB_SCHEMALESS_OFF;
1,195,551✔
642
  if (pCfg->walRetentionPeriod < 0 && pCfg->walRetentionPeriod != -1)
1,195,551✔
643
    pCfg->walRetentionPeriod = TSDB_REPS_DEF_DB_WAL_RET_PERIOD;
×
644
  if (pCfg->walRetentionSize < 0 && pCfg->walRetentionSize != -1)
1,195,551✔
645
    pCfg->walRetentionSize = TSDB_REPS_DEF_DB_WAL_RET_SIZE;
×
646
  if (pCfg->walRollPeriod < 0) pCfg->walRollPeriod = TSDB_REPS_DEF_DB_WAL_ROLL_PERIOD;
1,195,551✔
647
  if (pCfg->walSegmentSize < 0) pCfg->walSegmentSize = TSDB_DEFAULT_DB_WAL_SEGMENT_SIZE;
1,195,551✔
648
  if (pCfg->sstTrigger <= 0) pCfg->sstTrigger = TSDB_DEFAULT_SST_TRIGGER;
1,195,551✔
649
  if (pCfg->tsdbPageSize <= 0) pCfg->tsdbPageSize = TSDB_DEFAULT_TSDB_PAGESIZE;
1,195,551✔
650
  if (pCfg->ssChunkSize <= 0) pCfg->ssChunkSize = TSDB_DEFAULT_SS_CHUNK_SIZE;
1,195,551✔
651
  if (pCfg->ssKeepLocal <= 0) pCfg->ssKeepLocal = TSDB_DEFAULT_SS_KEEP_LOCAL;
1,195,551✔
652
  if (pCfg->ssCompact < 0) pCfg->ssCompact = TSDB_DEFAULT_SS_COMPACT;
1,195,551✔
653
  if (pCfg->withArbitrator < 0) pCfg->withArbitrator = TSDB_DEFAULT_DB_WITH_ARBITRATOR;
1,195,551✔
654
  if (pCfg->encryptAlgorithm < 0) pCfg->encryptAlgorithm = TSDB_DEFAULT_ENCRYPT_ALGO;
1,195,551✔
655
}
1,195,551✔
656

657
int32_t mndSetCreateDbPrepareAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
1,190,685✔
658
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
1,190,685✔
659
  if (pDbRaw == NULL) return -1;
1,190,685✔
660

661
  if (mndTransAppendPrepareLog(pTrans, pDbRaw) != 0) return -1;
1,190,685✔
662
  if (sdbSetRawStatus(pDbRaw, SDB_STATUS_CREATING) != 0) return -1;
1,190,685✔
663
  return 0;
1,190,685✔
664
}
665

666
static int32_t mndSetNewVgPrepareActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
1,189,383✔
667
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
3,692,945✔
668
    if (mndAddNewVgPrepareAction(pMnode, pTrans, (pVgroups + v)) != 0) return -1;
2,503,562✔
669
  }
670
  return 0;
1,189,383✔
671
}
672

673
static int32_t mndSetCreateDbRedoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
×
674
  int32_t  code = 0;
×
675
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
×
676
  if (pDbRaw == NULL) {
×
677
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
678
    if (terrno != 0) code = terrno;
×
679
    TAOS_RETURN(code);
×
680
  }
681
  TAOS_CHECK_RETURN(mndTransAppendRedolog(pTrans, pDbRaw));
×
682
  TAOS_CHECK_RETURN(sdbSetRawStatus(pDbRaw, SDB_STATUS_UPDATE));
×
683

684
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
×
685
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
×
686
    if (pVgRaw == NULL) {
×
687
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
688
      if (terrno != 0) code = terrno;
×
689
      TAOS_RETURN(code);
×
690
    }
691
    TAOS_CHECK_RETURN(mndTransAppendRedolog(pTrans, pVgRaw));
×
692
    TAOS_CHECK_RETURN(sdbSetRawStatus(pVgRaw, SDB_STATUS_UPDATE));
×
693
  }
694

695
  if (pDb->cfg.withArbitrator) {
×
696
    for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
×
697
      SVgObj   *pVgObj = pVgroups + v;
×
698
      SArbGroup arbGroup = {0};
×
699
      TAOS_CHECK_RETURN(mndArbGroupInitFromVgObj(pVgObj, &arbGroup));
×
700
      TAOS_CHECK_RETURN(mndSetCreateArbGroupRedoLogs(pTrans, &arbGroup));
×
701
    }
702
  }
703

704
  TAOS_RETURN(code);
×
705
}
706

707
static int32_t mndSetCreateDbUndoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
1,189,383✔
708
  int32_t  code = 0;
1,189,383✔
709
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
1,189,383✔
710
  if (pDbRaw == NULL) {
1,189,383✔
711
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
712
    if (terrno != 0) code = terrno;
×
713
    TAOS_RETURN(code);
×
714
  }
715
  TAOS_CHECK_RETURN(mndTransAppendUndolog(pTrans, pDbRaw));
1,189,383✔
716
  TAOS_CHECK_RETURN(sdbSetRawStatus(pDbRaw, SDB_STATUS_DROPPED));
1,189,383✔
717

718
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
3,692,945✔
719
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
2,503,562✔
720
    if (pVgRaw == NULL) {
2,503,562✔
721
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
722
      if (terrno != 0) code = terrno;
×
723
      TAOS_RETURN(code);
×
724
    }
725
    TAOS_CHECK_RETURN(mndTransAppendUndolog(pTrans, pVgRaw));
2,503,562✔
726
    TAOS_CHECK_RETURN(sdbSetRawStatus(pVgRaw, SDB_STATUS_DROPPED));
2,503,562✔
727
  }
728

729
  if (pDb->cfg.withArbitrator) {
1,189,383✔
730
    for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
10,568✔
731
      SVgObj   *pVgObj = pVgroups + v;
6,427✔
732
      SArbGroup arbGroup = {0};
6,427✔
733
      TAOS_CHECK_RETURN(mndArbGroupInitFromVgObj(pVgObj, &arbGroup));
6,427✔
734
      TAOS_CHECK_RETURN(mndSetCreateArbGroupUndoLogs(pTrans, &arbGroup));
6,427✔
735
    }
736
  }
737

738
  TAOS_RETURN(code);
1,189,383✔
739
}
740

741
static int32_t mndSetCreateDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups,
1,189,383✔
742
                                        SUserObj *pUserDuped) {
743
  int32_t  code = 0;
1,189,383✔
744
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
1,189,383✔
745
  if (pDbRaw == NULL) {
1,189,383✔
746
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
747
    if (terrno != 0) code = terrno;
×
748
    TAOS_RETURN(code);
×
749
  }
750
  TAOS_CHECK_RETURN(mndTransAppendCommitlog(pTrans, pDbRaw));
1,189,383✔
751
  TAOS_CHECK_RETURN(sdbSetRawStatus(pDbRaw, SDB_STATUS_READY));
1,189,383✔
752

753
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
3,692,945✔
754
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
2,503,562✔
755
    if (pVgRaw == NULL) {
2,503,562✔
756
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
757
      if (terrno != 0) code = terrno;
×
758
      TAOS_RETURN(code);
×
759
    }
760
    TAOS_CHECK_RETURN(mndTransAppendCommitlog(pTrans, pVgRaw));
2,503,562✔
761
    TAOS_CHECK_RETURN(sdbSetRawStatus(pVgRaw, SDB_STATUS_READY));
2,503,562✔
762
  }
763

764
  if (pDb->cfg.withArbitrator) {
1,189,383✔
765
    for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
10,568✔
766
      SVgObj   *pVgObj = pVgroups + v;
6,427✔
767
      SArbGroup arbGroup = {0};
6,427✔
768
      TAOS_CHECK_RETURN(mndArbGroupInitFromVgObj(pVgObj, &arbGroup));
6,427✔
769
      TAOS_CHECK_RETURN(mndSetCreateArbGroupCommitLogs(pTrans, &arbGroup));
6,427✔
770
    }
771
  }
772

773
  if (pUserDuped) {
1,189,383✔
774
    SSdbRaw *pUserRaw = mndUserActionEncode(pUserDuped);
2,544✔
775
    if (pUserRaw == NULL) {
2,544✔
776
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
777
      if (terrno != 0) code = terrno;
×
778
      TAOS_RETURN(code);
×
779
    }
780
    TAOS_CHECK_RETURN(mndTransAppendCommitlog(pTrans, pUserRaw));
2,544✔
781
    TAOS_CHECK_RETURN(sdbSetRawStatus(pUserRaw, SDB_STATUS_READY));
2,544✔
782
  }
783

784
  TAOS_RETURN(code);
1,189,383✔
785
}
786

787
static int32_t mndSetCreateDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
1,189,383✔
788
  int32_t code = 0;
1,189,383✔
789
  for (int32_t vg = 0; vg < pDb->cfg.numOfVgroups; ++vg) {
3,692,945✔
790
    SVgObj *pVgroup = pVgroups + vg;
2,503,562✔
791

792
    for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
5,329,271✔
793
      SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
2,825,709✔
794
      TAOS_CHECK_RETURN(mndAddCreateVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid));
2,825,709✔
795
    }
796
  }
797

798
  TAOS_RETURN(code);
1,189,383✔
799
}
800

801
static int32_t mndSetCreateDbUndoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
1,189,383✔
802
  int32_t code = 0;
1,189,383✔
803
  for (int32_t vg = 0; vg < pDb->cfg.numOfVgroups; ++vg) {
3,692,945✔
804
    SVgObj *pVgroup = pVgroups + vg;
2,503,562✔
805

806
    for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
5,329,271✔
807
      SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
2,825,709✔
808
      TAOS_CHECK_RETURN(mndAddDropVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid, false));
2,825,709✔
809
    }
810
  }
811

812
  TAOS_RETURN(code);
1,189,383✔
813
}
814

815
static int32_t mndCreateDb(SMnode *pMnode, SRpcMsg *pReq, SCreateDbReq *pCreate, SUserObj *pUser, SArray *dnodeList) {
1,196,346✔
816
  int32_t  code = 0;
1,196,346✔
817
  SUserObj newUserObj = {0};
1,196,346✔
818
  SDbObj   dbObj = {0};
1,196,346✔
819
  (void)memcpy(dbObj.name, pCreate->db, TSDB_DB_FNAME_LEN);
1,196,346✔
820
  (void)memcpy(dbObj.acct, pUser->acct, TSDB_USER_LEN);
1,196,346✔
821
  dbObj.createdTime = taosGetTimestampMs();
1,196,346✔
822
  dbObj.updateTime = dbObj.createdTime;
1,196,346✔
823
  dbObj.uid = mndGenerateUid(dbObj.name, TSDB_DB_FNAME_LEN);
1,196,346✔
824
  dbObj.cfgVersion = 1;
1,196,346✔
825
  dbObj.vgVersion = 1;
1,196,346✔
826
  dbObj.tsmaVersion = 1;
1,196,346✔
827
  (void)memcpy(dbObj.createUser, pUser->user, TSDB_USER_LEN);
1,196,346✔
828
  dbObj.cfg = (SDbCfg){
2,392,391✔
829
      .numOfVgroups = pCreate->numOfVgroups,
1,196,346✔
830
      .numOfStables = pCreate->numOfStables,
1,196,346✔
831
      .buffer = pCreate->buffer,
1,196,346✔
832
      .pageSize = pCreate->pageSize,
1,196,346✔
833
      .pages = pCreate->pages,
1,196,346✔
834
      .cacheLastSize = pCreate->cacheLastSize,
1,196,346✔
835
      .daysPerFile = pCreate->daysPerFile,
1,196,346✔
836
      .daysToKeep0 = pCreate->daysToKeep0,
1,196,346✔
837
      .daysToKeep1 = pCreate->daysToKeep1,
1,196,346✔
838
      .daysToKeep2 = pCreate->daysToKeep2,
1,196,346✔
839
      .keepTimeOffset = pCreate->keepTimeOffset,
1,196,346✔
840
      .minRows = pCreate->minRows,
1,196,346✔
841
      .maxRows = pCreate->maxRows,
1,196,346✔
842
      .walFsyncPeriod = pCreate->walFsyncPeriod,
1,196,346✔
843
      .walLevel = pCreate->walLevel,
1,196,346✔
844
      .precision = pCreate->precision,
1,196,346✔
845
      .compression = pCreate->compression,
1,196,346✔
846
      .replications = pCreate->replications,
1,196,346✔
847
      .strict = pCreate->strict,
1,196,346✔
848
      .cacheLast = pCreate->cacheLast,
1,196,346✔
849
      .hashMethod = 1,
850
      .schemaless = pCreate->schemaless,
1,196,346✔
851
      .walRetentionPeriod = pCreate->walRetentionPeriod,
1,196,346✔
852
      .walRetentionSize = pCreate->walRetentionSize,
1,196,346✔
853
      .walRollPeriod = pCreate->walRollPeriod,
1,196,346✔
854
      .walSegmentSize = pCreate->walSegmentSize,
1,196,346✔
855
      .sstTrigger = pCreate->sstTrigger,
1,196,346✔
856
      .hashPrefix = pCreate->hashPrefix,
1,196,346✔
857
      .hashSuffix = pCreate->hashSuffix,
1,196,346✔
858
      .ssChunkSize = pCreate->ssChunkSize,
1,196,346✔
859
      .ssKeepLocal = pCreate->ssKeepLocal,
1,196,346✔
860
      .ssCompact = pCreate->ssCompact,
1,196,346✔
861
      .tsdbPageSize = pCreate->tsdbPageSize,
1,196,346✔
862
      .withArbitrator = pCreate->withArbitrator,
1,196,346✔
863
      .encryptAlgorithm = pCreate->encryptAlgorithm,
1,196,346✔
864
      .compactInterval = pCreate->compactInterval,
1,196,346✔
865
      .compactStartTime = pCreate->compactStartTime,
1,196,346✔
866
      .compactEndTime = pCreate->compactEndTime,
1,196,346✔
867
      .compactTimeOffset = pCreate->compactTimeOffset,
1,196,346✔
868
  };
869
  if (strlen(pCreate->encryptAlgrName) > 0) {
1,196,346✔
870
    if (strncasecmp(pCreate->encryptAlgrName, "none", TSDB_ENCRYPT_ALGR_NAME_LEN) == 0) {
6,160✔
871
      dbObj.cfg.encryptAlgorithm = 0;
4,455✔
872
    } else {
873
      SEncryptAlgrObj *pEncryptAlgr = mndAcquireEncryptAlgrByAId(pMnode, pCreate->encryptAlgrName);
1,705✔
874
      if (pEncryptAlgr != NULL) {
1,705✔
875
        if (pEncryptAlgr->type != ENCRYPT_ALGR_TYPE__SYMMETRIC_CIPHERS) {
910✔
876
          code = TSDB_CODE_MNODE_ENCRYPT_TYPE_NOT_MATCH;
×
877
          mError("db:%s, failed to create, encrypt algorithm not match, %s, expect type %d", pCreate->db,
×
878
                 pCreate->encryptAlgrName, ENCRYPT_ALGR_TYPE__SYMMETRIC_CIPHERS);
879
          TAOS_RETURN(code);
×
880
        }
881
        dbObj.cfg.encryptAlgorithm = pEncryptAlgr->id;
910✔
882
      } else {
883
        code = TSDB_CODE_MNODE_ENCRYPT_ALGR_NOT_EXIST;
795✔
884
        mError("db:%s, failed to create, encrypt algorithm not exist, %s", pCreate->db, pCreate->encryptAlgrName);
795✔
885
        TAOS_RETURN(code);
795✔
886
      }
887
    }
888
  }
889
  dbObj.cfg.numOfRetensions = pCreate->numOfRetensions;
1,195,551✔
890
  dbObj.cfg.pRetensions = pCreate->pRetensions;
1,195,551✔
891

892
  mndSetDefaultDbCfg(&dbObj.cfg);
1,195,551✔
893

894
  if ((code = mndCheckDbName(dbObj.name, pUser)) != 0) {
1,195,551✔
895
    mError("db:%s, failed to create, check db name failed, since %s", pCreate->db, tstrerror(code));
×
896
    TAOS_RETURN(code);
×
897
  }
898

899
  if ((code = mndCheckDbCfg(pMnode, &dbObj.cfg)) != 0) {
1,195,551✔
900
    mError("db:%s, failed to create, check db cfg failed, since %s", pCreate->db, tstrerror(code));
766✔
901
    TAOS_RETURN(code);
766✔
902
  }
903

904
  if (dbObj.cfg.hashPrefix > 0) {
1,194,785✔
905
    int32_t dbLen = strlen(dbObj.name) + 1;
4,919✔
906
    mInfo("db:%s, hashPrefix adjust from %d to %d", dbObj.name, dbObj.cfg.hashPrefix, dbObj.cfg.hashPrefix + dbLen);
4,919✔
907
    dbObj.cfg.hashPrefix += dbLen;
4,919✔
908
  } else if (dbObj.cfg.hashPrefix < 0) {
1,189,866✔
909
    int32_t dbLen = strlen(dbObj.name) + 1;
5,015✔
910
    mInfo("db:%s, hashPrefix adjust from %d to %d", dbObj.name, dbObj.cfg.hashPrefix, dbObj.cfg.hashPrefix - dbLen);
5,015✔
911
    dbObj.cfg.hashPrefix -= dbLen;
5,015✔
912
  }
913

914
  SVgObj *pVgroups = NULL;
1,194,785✔
915
  if ((code = mndAllocVgroup(pMnode, &dbObj, &pVgroups, dnodeList)) != 0) {
1,194,785✔
916
    mError("db:%s, failed to create, alloc vgroup failed, since %s", pCreate->db, terrstr());
5,402✔
917
    TAOS_RETURN(code);
5,402✔
918
  }
919

920
  // add database privileges for user
921
  SUserObj *pNewUserDuped = NULL;
1,189,383✔
922
  if (!pUser->superUser) {
1,189,383✔
923
    TAOS_CHECK_GOTO(mndUserDupObj(pUser, &newUserObj), NULL, _OVER);
2,544✔
924
    TAOS_CHECK_GOTO(taosHashPut(newUserObj.readDbs, dbObj.name, strlen(dbObj.name) + 1, dbObj.name, TSDB_FILENAME_LEN),
2,544✔
925
                    NULL, _OVER);
926
    TAOS_CHECK_GOTO(taosHashPut(newUserObj.writeDbs, dbObj.name, strlen(dbObj.name) + 1, dbObj.name, TSDB_FILENAME_LEN),
2,544✔
927
                    NULL, _OVER);
928
    pNewUserDuped = &newUserObj;
2,544✔
929
  }
930

931
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq, "create-db");
1,189,383✔
932
  if (pTrans == NULL) {
1,189,383✔
933
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
934
    if (terrno != 0) code = terrno;
×
935
    goto _OVER;
×
936
  }
937
  // mndTransSetSerial(pTrans);
938
  mInfo("trans:%d, used to create db:%s", pTrans->id, pCreate->db);
1,189,383✔
939

940
  mndTransSetDbName(pTrans, dbObj.name, NULL);
1,189,383✔
941
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
1,189,383✔
942

943
  void   *pIter = NULL;
1,189,383✔
944
  STrans *exitTrans = NULL;
1,189,383✔
945

946
  if (!pUser->superUser) {
1,189,383✔
947
    while (1) {
948
      pIter = sdbFetch(pMnode->pSdb, SDB_TRANS, pIter, (void **)&exitTrans);
2,544✔
949
      if (pIter == NULL) break;
2,544✔
950

951
      if (exitTrans->conflict == TRN_CONFLICT_DB &&
×
952
          strncmp(exitTrans->opername, "create-db", TSDB_TRANS_OPER_LEN) == 0) {
×
953
        code = TSDB_CODE_MND_TRANS_CONFLICT;
×
954
        sdbRelease(pMnode->pSdb, exitTrans);
×
955
        sdbCancelFetch(pMnode->pSdb, pIter);
×
956
        goto _OVER;
×
957
      }
958

959
      sdbRelease(pMnode->pSdb, exitTrans);
×
960
    }
961
  }
962

963
  mndTransSetOper(pTrans, MND_OPER_CREATE_DB);
1,189,383✔
964
  TAOS_CHECK_GOTO(mndSetCreateDbPrepareAction(pMnode, pTrans, &dbObj), NULL, _OVER);
1,189,383✔
965
  TAOS_CHECK_GOTO(mndSetCreateDbRedoActions(pMnode, pTrans, &dbObj, pVgroups), NULL, _OVER);
1,189,383✔
966
  TAOS_CHECK_GOTO(mndSetNewVgPrepareActions(pMnode, pTrans, &dbObj, pVgroups), NULL, _OVER);
1,189,383✔
967
  TAOS_CHECK_GOTO(mndSetCreateDbUndoLogs(pMnode, pTrans, &dbObj, pVgroups), NULL, _OVER);
1,189,383✔
968
  TAOS_CHECK_GOTO(mndSetCreateDbCommitLogs(pMnode, pTrans, &dbObj, pVgroups, pNewUserDuped), NULL, _OVER);
1,189,383✔
969
  TAOS_CHECK_GOTO(mndSetCreateDbUndoActions(pMnode, pTrans, &dbObj, pVgroups), NULL, _OVER);
1,189,383✔
970
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
1,189,383✔
971

972
_OVER:
1,189,383✔
973
  taosMemoryFree(pVgroups);
1,189,383✔
974
  mndUserFreeObj(&newUserObj);
1,189,383✔
975
  mndTransDrop(pTrans);
1,189,383✔
976
  TAOS_RETURN(code);
1,189,383✔
977
}
978

979
static int32_t mndCheckDbEncryptKey(SMnode *pMnode, SCreateDbReq *pReq) {
1,208,538✔
980
  int32_t    code = 0;
1,208,538✔
981
  SSdb      *pSdb = pMnode->pSdb;
1,208,538✔
982
  SDnodeObj *pDnode = NULL;
1,208,538✔
983
  void      *pIter = NULL;
1,208,538✔
984

985
#if defined(TD_ENTERPRISE) || defined(TD_ASTRA_TODO)
986
  if (pReq->encryptAlgorithm == TSDB_ENCRYPT_ALGO_NONE) goto _exit;
1,208,538✔
987
  TAOS_CHECK_GOTO(grantCheck(TSDB_GRANT_DB_ENCRYPTION), NULL, _exit);
×
988
  if (tsEncryptionKeyStat != ENCRYPT_KEY_STAT_LOADED) {
×
989
    code = TSDB_CODE_MND_INVALID_ENCRYPT_KEY;
×
990
    mError("db:%s, failed to check encryption key:%" PRIi8 " in mnode leader since it's not loaded", pReq->db,
×
991
           tsEncryptionKeyStat);
992
    goto _exit;
×
993
  }
994

995
  int64_t curMs = taosGetTimestampMs();
×
996
  while ((pIter = sdbFetch(pSdb, SDB_DNODE, pIter, (void **)&pDnode))) {
×
997
    bool online = false;
×
998
    if ((pDnode->encryptionKeyStat != tsEncryptionKeyStat || pDnode->encryptionKeyChksum != tsEncryptionKeyChksum) &&
×
999
        (online = mndIsDnodeOnline(pDnode, curMs))) {
×
1000
      code = TSDB_CODE_MND_INVALID_ENCRYPT_KEY;
×
1001
      mError("db:%s, failed to check encryption key:%" PRIi8
×
1002
             "-%u in dnode:%d since it's inconsitent with mnode leader:%" PRIi8 "-%u",
1003
             pReq->db, pDnode->encryptionKeyStat, pDnode->encryptionKeyChksum, pDnode->id, tsEncryptionKeyStat,
1004
             tsEncryptionKeyChksum);
1005
      sdbCancelFetch(pSdb, pIter);
×
1006
      sdbRelease(pSdb, pDnode);
×
1007
      break;
×
1008
    }
1009
    sdbRelease(pSdb, pDnode);
×
1010
  }
1011
#else
1012
  if (pReq->encryptAlgorithm != TSDB_ENCRYPT_ALGO_NONE) {
1013
    code = TSDB_CODE_MND_INVALID_DB_OPTION;
1014
    goto _exit;
1015
  }
1016
#endif
1017
_exit:
1,208,237✔
1018
  TAOS_RETURN(code);
1,208,538✔
1019
}
1020

1021
#ifndef TD_ENTERPRISE
1022
int32_t mndCheckDbDnodeList(SMnode *pMnode, char *db, char *dnodeListStr, SArray *dnodeList) {
1023
  if (dnodeListStr[0] != 0) {
1024
    terrno = TSDB_CODE_OPS_NOT_SUPPORT;
1025
    return terrno;
1026
  } else {
1027
    return 0;
1028
  }
1029
}
1030
#endif
1031

1032
static int32_t mndProcessCreateDbReq(SRpcMsg *pReq) {
1,262,286✔
1033
  SMnode      *pMnode = pReq->info.node;
1,262,286✔
1034
  int32_t      code = -1;
1,262,286✔
1035
  int32_t      lino = 0;
1,262,286✔
1036
  SDbObj      *pDb = NULL;
1,262,286✔
1037
  SUserObj    *pUser = NULL;
1,262,286✔
1038
  SCreateDbReq createReq = {0};
1,262,286✔
1039
  SArray      *dnodeList = NULL;
1,262,286✔
1040

1041
  dnodeList = taosArrayInit(mndGetDnodeSize(pMnode), sizeof(int32_t));
1,262,286✔
1042
  TSDB_CHECK_NULL(dnodeList, code, lino, _OVER, TSDB_CODE_OUT_OF_MEMORY);
1,262,286✔
1043

1044
  TAOS_CHECK_GOTO(tDeserializeSCreateDbReq(pReq->pCont, pReq->contLen, &createReq), NULL, _OVER);
1,262,286✔
1045
#ifdef WINDOWS
1046
  if (taosArrayGetSize(createReq.pRetensions) > 0) {
1047
    terrno = TSDB_CODE_MND_INVALID_PLATFORM;
1048
    goto _OVER;
1049
  }
1050
#endif
1051
  mInfo("db:%s, start to create, vgroups:%d", createReq.db, createReq.numOfVgroups);
1,262,286✔
1052

1053
  pDb = mndAcquireDb(pMnode, createReq.db);
1,262,286✔
1054
  if (pDb != NULL) {
1,262,286✔
1055
    if (createReq.ignoreExist) {
43,594✔
1056
      mInfo("db:%s, already exist, ignore exist is set", createReq.db);
40,280✔
1057
      code = 0;
40,280✔
1058
      goto _OVER;
40,280✔
1059
    } else {
1060
      code = TSDB_CODE_MND_DB_ALREADY_EXIST;
3,314✔
1061
      goto _OVER;
3,314✔
1062
    }
1063
  } else {
1064
    if (terrno == TSDB_CODE_MND_DB_IN_CREATING) {
1,218,692✔
1065
      code = terrno;
9,104✔
1066
      goto _OVER;
9,104✔
1067
    } else if (terrno == TSDB_CODE_MND_DB_IN_DROPPING) {
1,209,588✔
1068
      goto _OVER;
×
1069
    } else if (terrno == TSDB_CODE_MND_DB_NOT_EXIST) {
1,209,588✔
1070
      // continue
1071
    } else {  // TSDB_CODE_APP_ERROR
1072
      goto _OVER;
×
1073
    }
1074
  }
1075

1076
  TAOS_CHECK_GOTO(mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_CREATE_DB, NULL), &lino, _OVER);
1,209,588✔
1077

1078
  TAOS_CHECK_GOTO(grantCheck(TSDB_GRANT_DB), &lino, _OVER);
1,208,538✔
1079

1080
  int32_t nVnodes = createReq.numOfVgroups * createReq.replications;
1,208,538✔
1081
  TAOS_CHECK_GOTO(grantCheckEx(TSDB_GRANT_VNODE, &nVnodes), &lino, _OVER);
1,208,538✔
1082

1083
  if (createReq.replications == 2) {
1,208,538✔
1084
    TAOS_CHECK_GOTO(grantCheck(TSDB_GRANT_DUAL_REPLICA_HA), &lino, _OVER);
5,665✔
1085
  }
1086

1087
  TAOS_CHECK_GOTO(mndCheckDbEncryptKey(pMnode, &createReq), &lino, _OVER);
1,208,538✔
1088

1089
  TAOS_CHECK_GOTO(mndCheckDbDnodeList(pMnode, createReq.db, createReq.dnodeListStr, dnodeList), &lino, _OVER);
1,208,538✔
1090

1091
  TAOS_CHECK_GOTO(mndAcquireUser(pMnode, pReq->info.conn.user, &pUser), &lino, _OVER);
1,196,346✔
1092

1093
  if (sdbGetSize(pMnode->pSdb, SDB_MOUNT) > 0) {
1,196,346✔
1094
    TAOS_CHECK_GOTO(TSDB_CODE_MND_MOUNT_NOT_EMPTY, &lino, _OVER);
×
1095
  }
1096

1097
  TAOS_CHECK_GOTO(mndCreateDb(pMnode, pReq, &createReq, pUser, dnodeList), &lino, _OVER);
1,196,346✔
1098
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
1,189,383✔
1099

1100
  SName name = {0};
1,189,383✔
1101
  if (tNameFromString(&name, createReq.db, T_NAME_ACCT | T_NAME_DB) < 0)
1,189,383✔
1102
    mError("db:%s, failed to parse db name", createReq.db);
×
1103

1104
  auditRecord(pReq, pMnode->clusterId, "createDB", name.dbname, "", createReq.sql, createReq.sqlLen);
1,189,383✔
1105

1106
_OVER:
1,262,286✔
1107
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
1,262,286✔
1108
    mError("db:%s, failed to create at line:%d since %s", createReq.db, lino, tstrerror(code));
32,623✔
1109
  }
1110

1111
  mndReleaseDb(pMnode, pDb);
1,262,286✔
1112
  mndReleaseUser(pMnode, pUser);
1,262,286✔
1113
  tFreeSCreateDbReq(&createReq);
1,262,286✔
1114
  taosArrayDestroy(dnodeList);
1,262,286✔
1115

1116
  TAOS_RETURN(code);
1,262,286✔
1117
}
1118

1119
static int32_t mndSetDbCfgFromAlterDbReq(SDbObj *pDb, SAlterDbReq *pAlter) {
105,344✔
1120
  int32_t code = TSDB_CODE_MND_DB_OPTION_UNCHANGED;
105,344✔
1121

1122
  if (pAlter->buffer > 0 && pAlter->buffer != pDb->cfg.buffer) {
105,344✔
1123
    pDb->cfg.buffer = pAlter->buffer;
4,730✔
1124
    code = 0;
4,730✔
1125
  }
1126

1127
  if (pAlter->pages > 0 && pAlter->pages != pDb->cfg.pages) {
105,344✔
1128
    pDb->cfg.pages = pAlter->pages;
2,385✔
1129
    code = 0;
2,385✔
1130
  }
1131

1132
  if (pAlter->pageSize > 0 && pAlter->pageSize != pDb->cfg.pageSize) {
105,344✔
1133
    pDb->cfg.pageSize = pAlter->pageSize;
×
1134
    code = 0;
×
1135
  }
1136

1137
  if (pAlter->daysPerFile > 0 && pAlter->daysPerFile != pDb->cfg.daysPerFile) {
105,344✔
1138
    pDb->cfg.daysPerFile = pAlter->daysPerFile;
×
1139
    code = 0;
×
1140
  }
1141

1142
  if (pAlter->daysToKeep0 > 0 && pAlter->daysToKeep0 != pDb->cfg.daysToKeep0) {
105,344✔
1143
    pDb->cfg.daysToKeep0 = pAlter->daysToKeep0;
15,179✔
1144
    code = 0;
15,179✔
1145
  }
1146

1147
  if (pAlter->daysToKeep1 > 0 && pAlter->daysToKeep1 != pDb->cfg.daysToKeep1) {
105,344✔
1148
    pDb->cfg.daysToKeep1 = pAlter->daysToKeep1;
14,406✔
1149
    code = 0;
14,406✔
1150
  }
1151

1152
  if (pAlter->daysToKeep2 > 0 && pAlter->daysToKeep2 != pDb->cfg.daysToKeep2) {
105,344✔
1153
    pDb->cfg.daysToKeep2 = pAlter->daysToKeep2;
11,970✔
1154
    code = 0;
11,970✔
1155
  }
1156

1157
  if (pAlter->keepTimeOffset >= 0 && pAlter->keepTimeOffset != pDb->cfg.keepTimeOffset) {
105,344✔
1158
    pDb->cfg.keepTimeOffset = pAlter->keepTimeOffset;
3,834✔
1159
    code = 0;
3,834✔
1160
  }
1161

1162
  if (pAlter->walFsyncPeriod >= 0 && pAlter->walFsyncPeriod != pDb->cfg.walFsyncPeriod) {
105,344✔
1163
    pDb->cfg.walFsyncPeriod = pAlter->walFsyncPeriod;
9,152✔
1164
    code = 0;
9,152✔
1165
  }
1166

1167
  if (pAlter->walLevel >= 0 && pAlter->walLevel != pDb->cfg.walLevel) {
105,344✔
1168
    pDb->cfg.walLevel = pAlter->walLevel;
9,149✔
1169
    code = 0;
9,149✔
1170
  }
1171

1172
  if (pAlter->strict >= 0 && pAlter->strict != pDb->cfg.strict) {
105,344✔
1173
#if 1
1174
    code = TSDB_CODE_OPS_NOT_SUPPORT;
×
1175
#else
1176
    pDb->cfg.strict = pAlter->strict;
1177
    code = 0;
1178
#endif
1179
  }
1180

1181
  if (pAlter->cacheLast >= 0 && pAlter->cacheLast != pDb->cfg.cacheLast) {
105,344✔
1182
    pDb->cfg.cacheLast = pAlter->cacheLast;
11,319✔
1183
    code = 0;
11,319✔
1184
  }
1185

1186
  if (pAlter->cacheLastSize > 0 && pAlter->cacheLastSize != pDb->cfg.cacheLastSize) {
105,344✔
1187
    pDb->cfg.cacheLastSize = pAlter->cacheLastSize;
1,587✔
1188
    code = 0;
1,587✔
1189
  }
1190

1191
  if (pAlter->replications > 0 && pAlter->replications != pDb->cfg.replications) {
105,344✔
1192
    pDb->cfg.replications = pAlter->replications;
7,611✔
1193
    pDb->vgVersion++;
7,611✔
1194
    code = 0;
7,611✔
1195
  }
1196

1197
  if (pAlter->sstTrigger > 0 && pAlter->sstTrigger != pDb->cfg.sstTrigger) {
105,344✔
1198
    pDb->cfg.sstTrigger = pAlter->sstTrigger;
1,339✔
1199
    pDb->vgVersion++;
1,339✔
1200
    code = 0;
1,339✔
1201
  }
1202

1203
  if (pAlter->minRows > 0 && pAlter->minRows != pDb->cfg.minRows) {
105,344✔
1204
    pDb->cfg.minRows = pAlter->minRows;
1,510✔
1205
    pDb->vgVersion++;
1,510✔
1206
    code = 0;
1,510✔
1207
  }
1208

1209
  if (pAlter->walRetentionPeriod > TSDB_DB_MIN_WAL_RETENTION_PERIOD &&
105,344✔
1210
      pAlter->walRetentionPeriod != pDb->cfg.walRetentionPeriod) {
4,952✔
1211
    pDb->cfg.walRetentionPeriod = pAlter->walRetentionPeriod;
2,322✔
1212
    pDb->vgVersion++;
2,322✔
1213
    code = 0;
2,322✔
1214
  }
1215

1216
  if (pAlter->walRetentionSize > TSDB_DB_MIN_WAL_RETENTION_SIZE &&
105,344✔
1217
      pAlter->walRetentionSize != pDb->cfg.walRetentionSize) {
1,550✔
1218
    pDb->cfg.walRetentionSize = pAlter->walRetentionSize;
755✔
1219
    pDb->vgVersion++;
755✔
1220
    code = 0;
755✔
1221
  }
1222

1223
  if (pAlter->ssKeepLocal >= TSDB_MIN_SS_KEEP_LOCAL && pAlter->ssKeepLocal <= TSDB_MAX_SS_KEEP_LOCAL && pAlter->ssKeepLocal != pDb->cfg.ssKeepLocal) {
105,344✔
1224
    pDb->cfg.ssKeepLocal = pAlter->ssKeepLocal;
755✔
1225
    pDb->vgVersion++;
755✔
1226
    code = 0;
755✔
1227
  }
1228

1229
  if (pAlter->ssCompact >= TSDB_MIN_SS_COMPACT && pAlter->ssCompact <= TSDB_MAX_SS_COMPACT && pAlter->ssCompact != pDb->cfg.ssCompact) {
105,344✔
1230
    pDb->cfg.ssCompact = pAlter->ssCompact;
755✔
1231
    pDb->vgVersion++;
755✔
1232
    code = 0;
755✔
1233
  }
1234

1235
  if (pAlter->withArbitrator >= TSDB_MIN_DB_WITH_ARBITRATOR && pAlter->withArbitrator != pDb->cfg.withArbitrator) {
105,344✔
1236
    pDb->cfg.withArbitrator = pAlter->withArbitrator;
755✔
1237
    pDb->vgVersion++;
755✔
1238
    code = 0;
755✔
1239
  }
1240

1241
  if (pAlter->compactInterval >= TSDB_DEFAULT_COMPACT_INTERVAL && pAlter->compactInterval != pDb->cfg.compactInterval) {
105,344✔
1242
    pDb->cfg.compactInterval = pAlter->compactInterval;
5,370✔
1243
    pDb->vgVersion++;
5,370✔
1244
    code = 0;
5,370✔
1245
  }
1246

1247
  bool compactTimeRangeChanged = false;
105,344✔
1248
  if (pAlter->compactStartTime != pDb->cfg.compactStartTime &&
105,344✔
1249
      (pAlter->compactStartTime == TSDB_DEFAULT_COMPACT_START_TIME ||
103,005✔
1250
       pAlter->compactStartTime <= -pDb->cfg.daysPerFile)) {
103,005✔
1251
    pDb->cfg.compactStartTime = pAlter->compactStartTime;
4,632✔
1252
    compactTimeRangeChanged = true;
4,632✔
1253
    code = 0;
4,632✔
1254
  }
1255

1256
  if (pAlter->compactEndTime != pDb->cfg.compactEndTime &&
105,344✔
1257
      (pAlter->compactEndTime == TSDB_DEFAULT_COMPACT_END_TIME || pAlter->compactEndTime <= -pDb->cfg.daysPerFile)) {
103,005✔
1258
    pDb->cfg.compactEndTime = pAlter->compactEndTime;
4,632✔
1259
    compactTimeRangeChanged = true;
4,632✔
1260
    code = 0;
4,632✔
1261
  }
1262
  if(compactTimeRangeChanged) {
105,344✔
1263
    pDb->vgVersion++;
4,632✔
1264
  }
1265

1266
  if (pAlter->compactTimeOffset >= TSDB_MIN_COMPACT_TIME_OFFSET &&
105,344✔
1267
      pAlter->compactTimeOffset != pDb->cfg.compactTimeOffset) {
9,270✔
1268
    pDb->cfg.compactTimeOffset = pAlter->compactTimeOffset;
3,843✔
1269
    pDb->vgVersion++;
3,843✔
1270
    code = 0;
3,843✔
1271
  }
1272

1273
  TAOS_RETURN(code);
105,344✔
1274
}
1275

1276
static int32_t mndSetAlterDbPrepareLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
80,271✔
1277
  int32_t  code = 0;
80,271✔
1278
  SSdbRaw *pRedoRaw = mndDbActionEncode(pOld);
80,271✔
1279
  if (pRedoRaw == NULL) {
80,271✔
1280
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1281
    if (terrno != 0) code = terrno;
×
1282
    TAOS_RETURN(code);
×
1283
  }
1284
  if ((code = mndTransAppendPrepareLog(pTrans, pRedoRaw)) != 0) {
80,271✔
1285
    sdbFreeRaw(pRedoRaw);
×
1286
    TAOS_RETURN(code);
×
1287
  }
1288

1289
  if ((code = sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY)) != 0) {
80,271✔
1290
    sdbFreeRaw(pRedoRaw);
×
1291
    TAOS_RETURN(code);
×
1292
  }
1293
  return 0;
80,271✔
1294
}
1295

1296
static int32_t mndSetAlterDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
80,271✔
1297
  int32_t  code = 0;
80,271✔
1298
  SSdbRaw *pCommitRaw = mndDbActionEncode(pNew);
80,271✔
1299
  if (pCommitRaw == NULL) {
80,271✔
1300
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1301
    if (terrno != 0) code = terrno;
×
1302
    TAOS_RETURN(code);
×
1303
  }
1304
  if ((code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
80,271✔
1305
    sdbFreeRaw(pCommitRaw);
×
1306
    TAOS_RETURN(code);
×
1307
  }
1308

1309
  if ((code = sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY)) != 0) {
80,271✔
1310
    sdbFreeRaw(pCommitRaw);
×
1311
    TAOS_RETURN(code);
×
1312
  }
1313
  TAOS_RETURN(code);
80,271✔
1314
}
1315

1316
static int32_t mndSetAlterDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb, SDbObj *pNewDb) {
80,271✔
1317
  int32_t code = 0, lino = 0;
80,271✔
1318
  SSdb   *pSdb = pMnode->pSdb;
80,271✔
1319
  void   *pIter = NULL;
80,271✔
1320
  SVgObj *pVgroup = NULL;
80,271✔
1321
  SArray *pArray = mndBuildDnodesArray(pMnode, 0, NULL);
80,271✔
1322

1323
  TSDB_CHECK_NULL(pArray, code, lino, _err, TSDB_CODE_OUT_OF_MEMORY);
80,271✔
1324

1325
  while (1) {
1326
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
542,375✔
1327
    if (pIter == NULL) break;
542,375✔
1328

1329
    if (mndVgroupInDb(pVgroup, pNewDb->uid)) {
462,844✔
1330
      SVgObj newVgroup = {0};
205,069✔
1331
      TAOS_CHECK_GOTO(mndBuildAlterVgroupAction(pMnode, pTrans, pOldDb, pNewDb, pVgroup, pArray, &newVgroup), &lino,
205,069✔
1332
                      _err);
1333

1334
      if (pNewDb->cfg.withArbitrator != pOldDb->cfg.withArbitrator) {
204,329✔
1335
        if (pNewDb->cfg.withArbitrator) {
×
1336
          SArbGroup arbGroup = {0};
×
1337
          TAOS_CHECK_GOTO(mndArbGroupInitFromVgObj(&newVgroup, &arbGroup), &lino, _err);
×
1338
          TAOS_CHECK_GOTO(mndSetCreateArbGroupCommitLogs(pTrans, &arbGroup), &lino, _err);
×
1339
        } else {
1340
          SArbGroup arbGroup = {0};
×
1341
          TAOS_CHECK_GOTO(mndArbGroupInitFromVgObj(pVgroup, &arbGroup), &lino, _err);
×
1342
          TAOS_CHECK_GOTO(mndSetDropArbGroupCommitLogs(pTrans, &arbGroup), &lino, _err);
×
1343
        }
1344
      }
1345
    }
1346

1347
    sdbRelease(pSdb, pVgroup);
462,104✔
1348
  }
1349

1350
  taosArrayDestroy(pArray);
79,531✔
1351
  TAOS_RETURN(code);
79,531✔
1352

1353
_err:
740✔
1354
  mError("db:%s, %s failed at %d since %s", pNewDb->name, __func__, lino, tstrerror(code));
740✔
1355

1356
  sdbCancelFetch(pSdb, pIter);
740✔
1357
  sdbRelease(pSdb, pVgroup);
740✔
1358
  taosArrayDestroy(pArray);
740✔
1359
  TAOS_RETURN(code);
740✔
1360
}
1361

1362
static int32_t mndAlterDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pOld, SDbObj *pNew) {
80,544✔
1363
  int32_t code = -1;
80,544✔
1364
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq, "alter-db");
80,544✔
1365
  if (pTrans == NULL) {
80,544✔
1366
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1367
    if (terrno != 0) code = terrno;
×
1368
    TAOS_RETURN(code);
×
1369
  }
1370
  mInfo("trans:%d, used to alter db:%s", pTrans->id, pOld->name);
80,544✔
1371
  mInfo("trans:%d, used to alter db, ableToBeKilled:%d, killMode:%d", pTrans->id, pTrans->ableToBeKilled, pTrans->killMode);
80,544✔
1372

1373
  mndTransSetDbName(pTrans, pOld->name, NULL);
80,544✔
1374
  mndTransSetGroupParallel(pTrans);
80,544✔
1375
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
80,544✔
1376
  TAOS_CHECK_GOTO(mndTransCheckConflictWithCompact(pMnode, pTrans), NULL, _OVER);
80,544✔
1377
  TAOS_CHECK_GOTO(mndTransCheckConflictWithRetention(pMnode, pTrans), NULL, _OVER);
80,271✔
1378

1379
  TAOS_CHECK_GOTO(mndSetAlterDbPrepareLogs(pMnode, pTrans, pOld, pNew), NULL, _OVER);
80,271✔
1380
  TAOS_CHECK_GOTO(mndSetAlterDbCommitLogs(pMnode, pTrans, pOld, pNew), NULL, _OVER);
80,271✔
1381
  TAOS_CHECK_GOTO(mndSetAlterDbRedoActions(pMnode, pTrans, pOld, pNew), NULL, _OVER);
80,271✔
1382

1383
  mInfo("trans:%d, used to alter db, ableToBeKilled:%d, killMode:%d", pTrans->id, pTrans->ableToBeKilled, pTrans->killMode);
79,531✔
1384
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
79,531✔
1385
  code = 0;
79,531✔
1386

1387
_OVER:
80,544✔
1388
  mndTransDrop(pTrans);
80,544✔
1389
  TAOS_RETURN(code);
80,544✔
1390
}
1391

1392
static int32_t mndProcessAlterDbReq(SRpcMsg *pReq) {
110,505✔
1393
  SMnode     *pMnode = pReq->info.node;
110,505✔
1394
  int32_t     code = -1;
110,505✔
1395
  SDbObj     *pDb = NULL;
110,505✔
1396
  SAlterDbReq alterReq = {0};
110,505✔
1397
  SDbObj      dbObj = {0};
110,505✔
1398

1399
  TAOS_CHECK_GOTO(tDeserializeSAlterDbReq(pReq->pCont, pReq->contLen, &alterReq), NULL, _OVER);
110,505✔
1400

1401
  mInfo("db:%s, start to alter, encryt_algr:%s", alterReq.db, alterReq.encryptAlgrName);
110,505✔
1402

1403
  pDb = mndAcquireDb(pMnode, alterReq.db);
110,505✔
1404
  if (pDb == NULL) {
110,505✔
1405
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
2,464✔
1406
    if (terrno != 0) code = terrno;
2,464✔
1407
    goto _OVER;
2,464✔
1408
  }
1409

1410
  TAOS_CHECK_GOTO(mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_ALTER_DB, pDb), NULL, _OVER);
108,041✔
1411

1412
  if (alterReq.replications == 2) {
107,689✔
1413
    TAOS_CHECK_GOTO(grantCheck(TSDB_GRANT_DUAL_REPLICA_HA), NULL, _OVER);
755✔
1414
  }
1415

1416
  int32_t numOfTopics = 0;
107,689✔
1417
  TAOS_CHECK_GOTO(mndGetNumOfTopics(pMnode, pDb->name, &numOfTopics), NULL, _OVER);
107,689✔
1418

1419
  if (numOfTopics != 0 && alterReq.walRetentionPeriod == 0) {
107,689✔
1420
    code = TSDB_CODE_MND_DB_RETENTION_PERIOD_ZERO;
×
1421
    mError("db:%s, not allowed to set WAL_RETENTION_PERIOD 0 when there are topics defined. numOfTopics:%d", pDb->name,
×
1422
           numOfTopics);
1423
    goto _OVER;
×
1424
  }
1425

1426
  if (pDb->cfg.isMount) {
107,689✔
1427
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
×
1428
    goto _OVER;
×
1429
  }
1430

1431
  (void)memcpy(&dbObj, pDb, sizeof(SDbObj));
107,689✔
1432
  if (dbObj.cfg.pRetensions != NULL) {
107,689✔
1433
    dbObj.cfg.pRetensions = taosArrayDup(pDb->cfg.pRetensions, NULL);
×
1434
    if (dbObj.cfg.pRetensions == NULL) goto _OVER;
×
1435
  }
1436

1437
  if (strlen(alterReq.encryptAlgrName) > 0) {
107,689✔
1438
    mInfo("db:%s, check encryt algr:%s", alterReq.db, alterReq.encryptAlgrName);
3,140✔
1439

1440
    if (strncasecmp(alterReq.encryptAlgrName, "none", TSDB_ENCRYPT_ALGR_NAME_LEN) == 0) {
3,140✔
1441
      if (pDb->cfg.encryptAlgorithm != 0) {
795✔
1442
        code = TSDB_CODE_MND_ENCRYPT_NOT_ALLOW_CHANGE;
×
1443
        mError("db:%s, failed to alter, not allowed to change, %s", alterReq.db, alterReq.encryptAlgrName);
×
1444
        goto _OVER;
×
1445
      }
1446
    } else {
1447
      SEncryptAlgrObj *pEncryptAlgr = mndAcquireEncryptAlgrByAId(pMnode, alterReq.encryptAlgrName);
2,345✔
1448
      if (pEncryptAlgr != NULL) {
2,345✔
1449
        if (pEncryptAlgr->type != ENCRYPT_ALGR_TYPE__SYMMETRIC_CIPHERS) {
1,550✔
1450
          code = TSDB_CODE_MNODE_ENCRYPT_TYPE_NOT_MATCH;
×
1451
          mError("db:%s, failed to alter, encrypt algorithm not match, %s, expect type %d", alterReq.db,
×
1452
                 alterReq.encryptAlgrName, ENCRYPT_ALGR_TYPE__SYMMETRIC_CIPHERS);
1453
          goto _OVER;
×
1454
        }
1455
        if (pEncryptAlgr->id != pDb->cfg.encryptAlgorithm) {
1,550✔
1456
          code = TSDB_CODE_MND_ENCRYPT_NOT_ALLOW_CHANGE;
1,550✔
1457
          mError("db:%s, failed to alter, not allowed to change, %s", alterReq.db, alterReq.encryptAlgrName);
1,550✔
1458
          goto _OVER;
1,550✔
1459
        }
1460
      } else {
1461
        code = TSDB_CODE_MNODE_ENCRYPT_ALGR_NOT_EXIST;
795✔
1462
        mError("db:%s, failed to alter, encrypt algorithm not exist, %s", alterReq.db, alterReq.encryptAlgrName);
795✔
1463
        goto _OVER;
795✔
1464
      }
1465
    }
1466
  }
1467

1468
  code = mndSetDbCfgFromAlterDbReq(&dbObj, &alterReq);
105,344✔
1469
  if (code != 0) {
105,344✔
1470
    if (code == TSDB_CODE_MND_DB_OPTION_UNCHANGED) code = 0;
23,290✔
1471
    goto _OVER;
23,290✔
1472
  }
1473

1474
  TAOS_CHECK_GOTO(mndCheckInChangeDbCfg(pMnode, &pDb->cfg, &dbObj.cfg), NULL, _OVER);
82,054✔
1475

1476
  dbObj.cfgVersion++;
80,544✔
1477
  dbObj.updateTime = taosGetTimestampMs();
80,544✔
1478
  code = mndAlterDb(pMnode, pReq, pDb, &dbObj);
80,544✔
1479

1480
  if (dbObj.cfg.replications != pDb->cfg.replications) {
80,544✔
1481
    // return quickly, operation executed asynchronously
1482
    mInfo("db:%s, alter db replica from %d to %d", pDb->name, pDb->cfg.replications, dbObj.cfg.replications);
6,856✔
1483
  } else {
1484
    if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
73,688✔
1485
  }
1486

1487
  SName name = {0};
80,544✔
1488
  if (tNameFromString(&name, alterReq.db, T_NAME_ACCT | T_NAME_DB) < 0)
80,544✔
1489
    mError("db:%s, failed to parse db name", alterReq.db);
×
1490

1491
  auditRecord(pReq, pMnode->clusterId, "alterDB", name.dbname, "", alterReq.sql, alterReq.sqlLen);
80,544✔
1492

1493
_OVER:
110,505✔
1494
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
110,505✔
1495
    if (terrno != 0) code = terrno;
7,684✔
1496
    mError("db:%s, failed to alter since %s", alterReq.db, tstrerror(code));
7,684✔
1497
  }
1498

1499
  mndReleaseDb(pMnode, pDb);
110,505✔
1500
  taosArrayDestroy(dbObj.cfg.pRetensions);
110,505✔
1501
  tFreeSAlterDbReq(&alterReq);
110,505✔
1502

1503
  TAOS_RETURN(code);
110,505✔
1504
}
1505

1506
static void mndDumpDbCfgInfo(SDbCfgRsp *cfgRsp, SDbObj *pDb, char *algorithmsId) {
1,457,629✔
1507
  tstrncpy(cfgRsp->db, pDb->name, sizeof(cfgRsp->db));
1,457,629✔
1508
  cfgRsp->dbId = pDb->uid;
1,457,629✔
1509
  cfgRsp->cfgVersion = pDb->cfgVersion;
1,457,629✔
1510
  cfgRsp->numOfVgroups = pDb->cfg.numOfVgroups;
1,457,629✔
1511
  cfgRsp->numOfStables = pDb->cfg.numOfStables;
1,457,629✔
1512
  cfgRsp->buffer = pDb->cfg.buffer;
1,457,629✔
1513
  cfgRsp->cacheSize = pDb->cfg.cacheLastSize;
1,457,629✔
1514
  cfgRsp->pageSize = pDb->cfg.pageSize;
1,457,629✔
1515
  cfgRsp->pages = pDb->cfg.pages;
1,457,629✔
1516
  cfgRsp->daysPerFile = pDb->cfg.daysPerFile;
1,457,629✔
1517
  cfgRsp->daysToKeep0 = pDb->cfg.daysToKeep0;
1,457,629✔
1518
  cfgRsp->daysToKeep1 = pDb->cfg.daysToKeep1;
1,457,629✔
1519
  cfgRsp->daysToKeep2 = pDb->cfg.daysToKeep2;
1,457,629✔
1520
  cfgRsp->keepTimeOffset = pDb->cfg.keepTimeOffset;
1,457,629✔
1521
  cfgRsp->minRows = pDb->cfg.minRows;
1,457,629✔
1522
  cfgRsp->maxRows = pDb->cfg.maxRows;
1,457,629✔
1523
  cfgRsp->walFsyncPeriod = pDb->cfg.walFsyncPeriod;
1,457,629✔
1524
  cfgRsp->hashPrefix = pDb->cfg.hashPrefix;
1,457,629✔
1525
  cfgRsp->hashSuffix = pDb->cfg.hashSuffix;
1,457,629✔
1526
  cfgRsp->hashMethod = pDb->cfg.hashMethod;
1,457,629✔
1527
  cfgRsp->walLevel = pDb->cfg.walLevel;
1,457,629✔
1528
  cfgRsp->precision = pDb->cfg.precision;
1,457,629✔
1529
  cfgRsp->compression = pDb->cfg.compression;
1,457,629✔
1530
  cfgRsp->replications = pDb->cfg.replications;
1,457,629✔
1531
  cfgRsp->strict = pDb->cfg.strict;
1,457,629✔
1532
  cfgRsp->cacheLast = pDb->cfg.cacheLast;
1,457,629✔
1533
  cfgRsp->tsdbPageSize = pDb->cfg.tsdbPageSize;
1,457,629✔
1534
  cfgRsp->walRetentionPeriod = pDb->cfg.walRetentionPeriod;
1,457,629✔
1535
  cfgRsp->walRollPeriod = pDb->cfg.walRollPeriod;
1,457,629✔
1536
  cfgRsp->walRetentionSize = pDb->cfg.walRetentionSize;
1,457,629✔
1537
  cfgRsp->walSegmentSize = pDb->cfg.walSegmentSize;
1,457,629✔
1538
  cfgRsp->numOfRetensions = pDb->cfg.numOfRetensions;
1,457,629✔
1539
  cfgRsp->pRetensions = taosArrayDup(pDb->cfg.pRetensions, NULL);
1,457,629✔
1540
  cfgRsp->schemaless = pDb->cfg.schemaless;
1,457,629✔
1541
  cfgRsp->sstTrigger = pDb->cfg.sstTrigger;
1,457,629✔
1542
  cfgRsp->ssChunkSize = pDb->cfg.ssChunkSize;
1,457,629✔
1543
  cfgRsp->ssKeepLocal = pDb->cfg.ssKeepLocal;
1,457,629✔
1544
  cfgRsp->ssCompact = pDb->cfg.ssCompact;
1,457,629✔
1545
  cfgRsp->withArbitrator = pDb->cfg.withArbitrator;
1,457,629✔
1546
  // cfgRsp->encryptAlgr = pDb->cfg.encryptAlgorithm;
1547
  cfgRsp->compactInterval = pDb->cfg.compactInterval;
1,457,629✔
1548
  cfgRsp->compactStartTime = pDb->cfg.compactStartTime;
1,457,629✔
1549
  cfgRsp->compactEndTime = pDb->cfg.compactEndTime;
1,457,629✔
1550
  cfgRsp->compactTimeOffset = pDb->cfg.compactTimeOffset;
1,457,629✔
1551
  cfgRsp->flags = pDb->cfg.flags;
1,457,629✔
1552
  tstrncpy(cfgRsp->algorithmsId, algorithmsId, sizeof(cfgRsp->algorithmsId));
1,457,629✔
1553
}
1,457,629✔
1554

1555
static int32_t mndProcessGetDbCfgReq(SRpcMsg *pReq) {
1,603,127✔
1556
  SMnode   *pMnode = pReq->info.node;
1,603,127✔
1557
  int32_t   code = -1;
1,603,127✔
1558
  SDbObj   *pDb = NULL;
1,603,127✔
1559
  SDbCfgReq cfgReq = {0};
1,603,127✔
1560
  SDbCfgRsp cfgRsp = {0};
1,603,127✔
1561

1562
  TAOS_CHECK_GOTO(tDeserializeSDbCfgReq(pReq->pCont, pReq->contLen, &cfgReq), NULL, _OVER);
1,603,127✔
1563

1564
  if (strcasecmp(cfgReq.db, TSDB_INFORMATION_SCHEMA_DB) && strcasecmp(cfgReq.db, TSDB_PERFORMANCE_SCHEMA_DB)) {
1,603,127✔
1565
    pDb = mndAcquireDb(pMnode, cfgReq.db);
1,603,127✔
1566
    if (pDb == NULL) {
1,603,127✔
1567
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
286,213✔
1568
      if (terrno != 0) code = terrno;
286,213✔
1569
      goto _OVER;
286,213✔
1570
    }
1571

1572
    char algrId[TSDB_ENCRYPT_ALGR_NAME_LEN] = {0};
1,316,914✔
1573
    mndGetEncryptOsslAlgrNameById(pMnode, pDb->cfg.encryptAlgorithm, algrId);
1,316,914✔
1574
    mndDumpDbCfgInfo(&cfgRsp, pDb, algrId);
1,316,914✔
1575
  }
1576

1577
  int32_t contLen = tSerializeSDbCfgRsp(NULL, 0, &cfgRsp);
1,316,914✔
1578
  void   *pRsp = rpcMallocCont(contLen);
1,316,914✔
1579
  if (pRsp == NULL) {
1,316,914✔
1580
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1581
    if (terrno != 0) code = terrno;
×
1582
    goto _OVER;
×
1583
  }
1584

1585
  int32_t ret = 0;
1,316,914✔
1586
  if ((ret = tSerializeSDbCfgRsp(pRsp, contLen, &cfgRsp)) < 0) {
1,316,914✔
1587
    code = ret;
×
1588
    goto _OVER;
×
1589
  }
1590

1591
  pReq->info.rsp = pRsp;
1,316,914✔
1592
  pReq->info.rspLen = contLen;
1,316,914✔
1593

1594
  code = 0;
1,316,914✔
1595

1596
_OVER:
1,603,127✔
1597

1598
  tFreeSDbCfgRsp(&cfgRsp);
1,603,127✔
1599

1600
  if (code != 0) {
1,603,127✔
1601
    mError("db:%s, failed to get cfg since %s", cfgReq.db, terrstr());
286,213✔
1602
  }
1603

1604
  mndReleaseDb(pMnode, pDb);
1,603,127✔
1605

1606
  TAOS_RETURN(code);
1,603,127✔
1607
}
1608

1609
int32_t mndSetDropDbPrepareLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
702,651✔
1610
  int32_t  code = 0;
702,651✔
1611
  SSdbRaw *pRedoRaw = mndDbActionEncode(pDb);
702,651✔
1612
  if (pRedoRaw == NULL) {
702,651✔
1613
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1614
    if (terrno != 0) code = terrno;
×
1615
    return -1;
×
1616
  }
1617
  TAOS_CHECK_RETURN(mndTransAppendPrepareLog(pTrans, pRedoRaw));
702,651✔
1618
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_DROPPING));
702,651✔
1619

1620
  SSdb *pSdb = pMnode->pSdb;
702,651✔
1621
  void *pIter = NULL;
702,651✔
1622

1623
  while (1) {
4,572✔
1624
    SArbGroup *pArbGroup = NULL;
707,223✔
1625
    pIter = sdbFetch(pSdb, SDB_ARBGROUP, pIter, (void **)&pArbGroup);
707,223✔
1626
    if (pIter == NULL) break;
707,223✔
1627

1628
    if (pArbGroup->dbUid == pDb->uid) {
4,572✔
1629
      if ((code = mndSetDropArbGroupPrepareLogs(pTrans, pArbGroup)) != 0) {
4,572✔
1630
        sdbCancelFetch(pSdb, pIter);
×
1631
        sdbRelease(pSdb, pArbGroup);
×
1632
        TAOS_RETURN(code);
×
1633
      }
1634
    }
1635

1636
    sdbRelease(pSdb, pArbGroup);
4,572✔
1637
  }
1638

1639
  TAOS_RETURN(code);
702,651✔
1640
}
1641

1642
int32_t mndSetDropDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
702,651✔
1643
  int32_t  code = 0;
702,651✔
1644
  SSdbRaw *pCommitRaw = mndDbActionEncode(pDb);
702,651✔
1645
  if (pCommitRaw == NULL) {
702,651✔
1646
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1647
    if (terrno != 0) code = terrno;
×
1648
    return -1;
×
1649
  }
1650
  TAOS_CHECK_RETURN(mndTransAppendCommitlog(pTrans, pCommitRaw));
702,651✔
1651
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED));
702,651✔
1652

1653
  SSdb *pSdb = pMnode->pSdb;
702,651✔
1654
  void *pIter = NULL;
702,651✔
1655

1656
  while (1) {
4,572✔
1657
    SArbGroup *pArbGroup = NULL;
707,223✔
1658
    pIter = sdbFetch(pSdb, SDB_ARBGROUP, pIter, (void **)&pArbGroup);
707,223✔
1659
    if (pIter == NULL) break;
707,223✔
1660

1661
    if (pArbGroup->dbUid == pDb->uid) {
4,572✔
1662
      if ((code = mndSetDropArbGroupCommitLogs(pTrans, pArbGroup)) != 0) {
4,572✔
1663
        sdbCancelFetch(pSdb, pIter);
×
1664
        sdbRelease(pSdb, pArbGroup);
×
1665
        TAOS_RETURN(code);
×
1666
      }
1667
    }
1668

1669
    sdbRelease(pSdb, pArbGroup);
4,572✔
1670
  }
1671

1672
  while (1) {
3,104,213✔
1673
    SVgObj *pVgroup = NULL;
3,806,864✔
1674
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
3,806,864✔
1675
    if (pIter == NULL) break;
3,806,864✔
1676

1677
    if (pVgroup->dbUid == pDb->uid) {
3,104,213✔
1678
      SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroup);
1,429,735✔
1679
      if (pVgRaw == NULL) {
1,429,735✔
1680
        sdbCancelFetch(pSdb, pIter);
×
1681
        sdbRelease(pSdb, pVgroup);
×
1682
        code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1683
        if (terrno != 0) code = terrno;
×
1684
        TAOS_RETURN(code);
×
1685
      }
1686
      if ((code = mndTransAppendCommitlog(pTrans, pVgRaw)) != 0) {
1,429,735✔
1687
        sdbCancelFetch(pSdb, pIter);
×
1688
        sdbRelease(pSdb, pVgroup);
×
1689
        TAOS_RETURN(code);
×
1690
      }
1691
      if ((code = sdbSetRawStatus(pVgRaw, SDB_STATUS_DROPPED)) != 0) {
1,429,735✔
1692
        sdbCancelFetch(pSdb, pIter);
×
1693
        sdbRelease(pSdb, pVgroup);
×
1694
        TAOS_RETURN(code);
×
1695
      }
1696
    }
1697

1698
    sdbRelease(pSdb, pVgroup);
3,104,213✔
1699
  }
1700

1701
  while (1) {
912,186✔
1702
    SStbObj *pStb = NULL;
1,614,837✔
1703
    ESdbStatus status;
1,614,613✔
1704
    pIter = sdbFetchAll(pSdb, SDB_STB, pIter, (void **)&pStb, &status, true);
1,614,837✔
1705
    if (pIter == NULL) break;
1,614,837✔
1706

1707
    if (pStb->dbUid == pDb->uid) {
912,186✔
1708
      SSdbRaw *pStbRaw = mndStbActionEncode(pStb);
528,356✔
1709
      if (pStbRaw == NULL) {
528,356✔
1710
        sdbCancelFetch(pSdb, pIter);
×
1711
        sdbRelease(pSdb, pStbRaw);
×
1712
        code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1713
        if (terrno != 0) code = terrno;
×
1714
        return -1;
×
1715
      }
1716
      if ((code = mndTransAppendCommitlog(pTrans, pStbRaw)) != 0) {
528,356✔
1717
        sdbCancelFetch(pSdb, pIter);
×
1718
        sdbRelease(pSdb, pStbRaw);
×
1719
        return -1;
×
1720
      }
1721
      if ((code = sdbSetRawStatus(pStbRaw, SDB_STATUS_DROPPED)) != 0) {
528,356✔
1722
        sdbCancelFetch(pSdb, pIter);
×
1723
        sdbRelease(pSdb, pStbRaw);
×
1724
        return -1;
×
1725
      }
1726
    }
1727

1728
    sdbRelease(pSdb, pStb);
912,186✔
1729
  }
1730

1731
  TAOS_RETURN(code);
702,651✔
1732
}
1733

1734
static int32_t mndBuildDropVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup) {
1,429,735✔
1735
  int32_t code = 0;
1,429,735✔
1736
  for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
2,913,092✔
1737
    SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
1,483,357✔
1738
    TAOS_CHECK_RETURN(mndAddDropVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid, true));
1,483,357✔
1739
  }
1740

1741
  TAOS_RETURN(code);
1,429,735✔
1742
}
1743

1744
int32_t mndSetDropDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
702,651✔
1745
  int32_t code = 0;
702,651✔
1746
  SSdb   *pSdb = pMnode->pSdb;
702,651✔
1747
  void   *pIter = NULL;
702,651✔
1748

1749
  while (1) {
3,104,213✔
1750
    SVgObj *pVgroup = NULL;
3,806,864✔
1751
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
3,806,864✔
1752
    if (pIter == NULL) break;
3,806,864✔
1753

1754
    if (pVgroup->dbUid == pDb->uid) {
3,104,213✔
1755
      if ((code = mndBuildDropVgroupAction(pMnode, pTrans, pDb, pVgroup)) != 0) {
1,429,735✔
1756
        sdbCancelFetch(pSdb, pIter);
×
1757
        sdbRelease(pSdb, pVgroup);
×
1758
        TAOS_RETURN(code);
×
1759
      }
1760
    }
1761

1762
    sdbRelease(pSdb, pVgroup);
3,104,213✔
1763
  }
1764

1765
  TAOS_RETURN(code);
702,651✔
1766
}
1767

1768
static int32_t mndBuildDropDbRsp(SDbObj *pDb, int32_t *pRspLen, void **ppRsp, bool useRpcMalloc) {
1,120,238✔
1769
  int32_t    code = 0;
1,120,238✔
1770
  SDropDbRsp dropRsp = {0};
1,120,238✔
1771
  if (pDb != NULL) {
1,120,238✔
1772
    (void)memcpy(dropRsp.db, pDb->name, TSDB_DB_FNAME_LEN);
701,357✔
1773
    dropRsp.uid = pDb->uid;
701,357✔
1774
  }
1775

1776
  int32_t rspLen = tSerializeSDropDbRsp(NULL, 0, &dropRsp);
1,120,238✔
1777
  void   *pRsp = NULL;
1,120,238✔
1778
  if (useRpcMalloc) {
1,120,238✔
1779
    pRsp = rpcMallocCont(rspLen);
418,881✔
1780
  } else {
1781
    pRsp = taosMemoryMalloc(rspLen);
701,357✔
1782
  }
1783

1784
  if (pRsp == NULL) {
1,120,238✔
1785
    code = terrno;
×
1786
    TAOS_RETURN(code);
×
1787
  }
1788

1789
  int32_t ret = 0;
1,120,238✔
1790
  if ((ret = tSerializeSDropDbRsp(pRsp, rspLen, &dropRsp)) < 0) return ret;
1,120,238✔
1791
  *pRspLen = rspLen;
1,120,238✔
1792
  *ppRsp = pRsp;
1,120,238✔
1793
  TAOS_RETURN(code);
1,120,238✔
1794
}
1795

1796
static int32_t mndDropDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb) {
701,462✔
1797
  int32_t code = -1;
701,462✔
1798

1799
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq, "drop-db");
701,462✔
1800
  if (pTrans == NULL) {
701,462✔
1801
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1802
    if (terrno != 0) code = terrno;
×
1803
    goto _OVER;
×
1804
  }
1805

1806
  mInfo("trans:%d start to drop db:%s", pTrans->id, pDb->name);
701,462✔
1807

1808
  mndTransSetDbName(pTrans, pDb->name, NULL);
701,462✔
1809
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
701,462✔
1810

1811
  if (mndTopicExistsForDb(pMnode, pDb)) {
701,462✔
1812
    code = TSDB_CODE_MND_TOPIC_MUST_BE_DELETED;
105✔
1813
    goto _OVER;
105✔
1814
  }
1815

1816
  TAOS_CHECK_GOTO(mndSetDropDbPrepareLogs(pMnode, pTrans, pDb), NULL, _OVER);
701,357✔
1817
  TAOS_CHECK_GOTO(mndSetDropDbCommitLogs(pMnode, pTrans, pDb), NULL, _OVER);
701,357✔
1818
  TAOS_CHECK_GOTO(mndDropStreamByDb(pMnode, pTrans, pDb), NULL, _OVER);
701,357✔
1819
#ifdef TD_ENTERPRISE
1820
  TAOS_CHECK_GOTO(mndDropViewByDb(pMnode, pTrans, pDb), NULL, _OVER);
701,357✔
1821
#endif
1822
  TAOS_CHECK_GOTO(mndDropTSMAsByDb(pMnode, pTrans, pDb), NULL, _OVER);
701,357✔
1823
  TAOS_CHECK_GOTO(mndDropRsmasByDb(pMnode, pTrans, pDb), NULL, _OVER);
701,357✔
1824
  TAOS_CHECK_GOTO(mndDropIdxsByDb(pMnode, pTrans, pDb), NULL, _OVER);
701,357✔
1825
  //TAOS_CHECK_GOTO(mndStreamSetStopStreamTasksActions(pMnode, pTrans, pDb->uid), NULL, _OVER);
1826
  TAOS_CHECK_GOTO(mndSetDropDbRedoActions(pMnode, pTrans, pDb), NULL, _OVER);
701,357✔
1827
  TAOS_CHECK_GOTO(mndUserRemoveDb(pMnode, pTrans, pDb, NULL), NULL, _OVER);
701,357✔
1828

1829
  int32_t rspLen = 0;
701,357✔
1830
  void   *pRsp = NULL;
701,357✔
1831
  TAOS_CHECK_GOTO(mndBuildDropDbRsp(pDb, &rspLen, &pRsp, false), NULL, _OVER);
701,357✔
1832
  mndTransSetRpcRsp(pTrans, pRsp, rspLen);
701,357✔
1833

1834
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
701,357✔
1835
  code = 0;
701,357✔
1836

1837
_OVER:
701,462✔
1838
  mndTransDrop(pTrans);
701,462✔
1839
  TAOS_RETURN(code);
701,462✔
1840
}
1841

1842
static int32_t mndProcessDropDbReq(SRpcMsg *pReq) {
1,130,419✔
1843
  SMnode    *pMnode = pReq->info.node;
1,130,419✔
1844
  int32_t    code = -1;
1,130,419✔
1845
  SDbObj    *pDb = NULL;
1,130,419✔
1846
  SDropDbReq dropReq = {0};
1,130,419✔
1847

1848
  TAOS_CHECK_GOTO(tDeserializeSDropDbReq(pReq->pCont, pReq->contLen, &dropReq), NULL, _OVER);
1,130,419✔
1849

1850
  mInfo("db:%s, start to drop", dropReq.db);
1,130,419✔
1851

1852
  pDb = mndAcquireDb(pMnode, dropReq.db);
1,130,419✔
1853
  if (pDb == NULL) {
1,130,419✔
1854
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
423,131✔
1855
    if (terrno != 0) code = terrno;
423,131✔
1856
    if (dropReq.ignoreNotExists) {
423,131✔
1857
      code = mndBuildDropDbRsp(pDb, &pReq->info.rspLen, &pReq->info.rsp, true);
418,881✔
1858
    }
1859
    goto _OVER;
423,131✔
1860
  }
1861

1862
  TAOS_CHECK_GOTO(mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_DROP_DB, pDb), NULL, _OVER);
707,288✔
1863

1864
  if(pDb->cfg.isMount) {
705,592✔
1865
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
1,294✔
1866
    goto _OVER;
1,294✔
1867
  }
1868

1869
  SSdb *pSdb = pMnode->pSdb;
704,298✔
1870
  void *pIter = NULL;
704,298✔
1871

1872
  while (1) {
3,122,603✔
1873
    SVgObj *pVgroup = NULL;
3,826,901✔
1874
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
3,826,901✔
1875
    if (pIter == NULL) break;
3,826,901✔
1876

1877
    if (pVgroup->dbUid == pDb->uid) {
3,122,603✔
1878
      bool isFound = false;
1,430,088✔
1879
      for (int32_t i = 0; i < pVgroup->replica; i++) {
2,913,798✔
1880
        if (pVgroup->vnodeGid[i].syncState == TAOS_SYNC_STATE_OFFLINE) {
1,483,710✔
1881
          isFound = true;
×
1882
          break;
×
1883
        }
1884
      }
1885
      if (!isFound) {
1,430,088✔
1886
        sdbRelease(pSdb, pVgroup);
1,430,088✔
1887
        continue;
1,430,088✔
1888
      }
1889
      code = TSDB_CODE_MND_VGROUP_OFFLINE;
×
1890
      sdbCancelFetch(pSdb, pIter);
×
1891
      sdbRelease(pSdb, pVgroup);
×
1892
      goto _OVER;
×
1893
    }
1894

1895
    sdbRelease(pSdb, pVgroup);
1,692,515✔
1896
  }
1897

1898
  bool dbStream = false;
704,298✔
1899
  bool vtableStream = false;
704,298✔
1900
  mstCheckDbInUse(pMnode, dropReq.db, &dbStream, &vtableStream, true);
704,298✔
1901
  if (dbStream) {
704,298✔
1902
    code = TSDB_CODE_MND_STREAM_DB_IN_USE;
2,432✔
1903
    mError("db:%s used by streams, drop db not allowed", dropReq.db);
2,432✔
1904
    goto _OVER;
2,432✔
1905
  }
1906

1907
  if (vtableStream && !dropReq.force) {
701,866✔
1908
    code = TSDB_CODE_MND_STREAM_VTABLE_EXITS;
404✔
1909
    mError("db:%s, vtable stream exists, drop db not allowed", dropReq.db);
404✔
1910
    goto _OVER;
404✔
1911
  }
1912

1913
  code = mndDropDb(pMnode, pReq, pDb);
701,462✔
1914
  if (code == TSDB_CODE_SUCCESS) {
701,462✔
1915
    code = TSDB_CODE_ACTION_IN_PROGRESS;
701,357✔
1916
  }
1917

1918
  SName name = {0};
701,462✔
1919
  if (tNameFromString(&name, dropReq.db, T_NAME_ACCT | T_NAME_DB) < 0)
701,462✔
1920
    mError("db:%s, failed to parse db name", dropReq.db);
×
1921

1922
  auditRecord(pReq, pMnode->clusterId, "dropDB", name.dbname, "", dropReq.sql, dropReq.sqlLen);
701,462✔
1923

1924
_OVER:
1,130,419✔
1925
  if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_ACTION_IN_PROGRESS) {
1,130,419✔
1926
    mError("db:%s, failed to drop since %s", dropReq.db, terrstr());
10,181✔
1927
  }
1928

1929
  mndReleaseDb(pMnode, pDb);
1,130,419✔
1930
  tFreeSDropDbReq(&dropReq);
1,130,419✔
1931
  TAOS_RETURN(code);
1,130,419✔
1932
}
1933

1934
static int32_t mndGetDBTableNum(SDbObj *pDb, SMnode *pMnode) {
23,369,219✔
1935
  int32_t numOfTables = 0;
23,369,219✔
1936
  int32_t vindex = 0;
23,369,219✔
1937
  SSdb   *pSdb = pMnode->pSdb;
23,369,219✔
1938

1939
  void *pIter = NULL;
23,369,219✔
1940
  while (vindex < pDb->cfg.numOfVgroups) {
89,721,545✔
1941
    SVgObj *pVgroup = NULL;
66,352,326✔
1942
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
66,352,326✔
1943
    if (pIter == NULL) break;
66,352,326✔
1944

1945
    if (mndVgroupInDb(pVgroup, pDb->uid)) {
66,352,326✔
1946
      numOfTables += pVgroup->numOfTables / TSDB_TABLE_NUM_UNIT;
47,208,098✔
1947
      vindex++;
47,207,400✔
1948
    }
1949

1950
    sdbRelease(pSdb, pVgroup);
66,351,628✔
1951
  }
1952

1953
  sdbCancelFetch(pSdb, pIter);
23,368,456✔
1954
  return numOfTables;
23,369,219✔
1955
}
1956

1957
void mndBuildDBVgroupInfo(SDbObj *pDb, SMnode *pMnode, SArray *pVgList) {
26,107,541✔
1958
  int32_t vindex = 0;
26,107,541✔
1959
  SSdb   *pSdb = pMnode->pSdb;
26,107,541✔
1960

1961
  void *pIter = NULL;
26,108,239✔
1962
  while (1) {
49,173,842✔
1963
    SVgObj *pVgroup = NULL;
75,282,081✔
1964
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
75,282,081✔
1965
    if (pIter == NULL) break;
75,282,081✔
1966

1967
    if ((NULL == pDb || pVgroup->dbUid == pDb->uid) && !pVgroup->isTsma) {
68,912,828✔
1968
      SVgroupInfo vgInfo = {0};
57,251,967✔
1969
      vgInfo.vgId = pVgroup->vgId;
57,251,269✔
1970
      vgInfo.hashBegin = pVgroup->hashBegin;
57,251,269✔
1971
      vgInfo.hashEnd = pVgroup->hashEnd;
57,251,967✔
1972
      vgInfo.numOfTable = pVgroup->numOfTables / TSDB_TABLE_NUM_UNIT;
57,251,967✔
1973
      vgInfo.epSet.numOfEps = pVgroup->replica;
57,251,269✔
1974
      for (int32_t gid = 0; gid < pVgroup->replica; ++gid) {
119,259,191✔
1975
        SVnodeGid *pVgid = &pVgroup->vnodeGid[gid];
62,011,634✔
1976
        SEp       *pEp = &vgInfo.epSet.eps[gid];
62,011,634✔
1977
        SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
62,011,634✔
1978
        if (pDnode != NULL) {
62,011,917✔
1979
          (void)memcpy(pEp->fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
61,971,338✔
1980
          pEp->port = pDnode->port;
61,971,338✔
1981
        }
1982
        mndReleaseDnode(pMnode, pDnode);
62,011,917✔
1983
        if (pVgid->syncState == TAOS_SYNC_STATE_LEADER || pVgid->syncState == TAOS_SYNC_STATE_ASSIGNED_LEADER) {
62,011,623✔
1984
          vgInfo.epSet.inUse = gid;
56,747,967✔
1985
        }
1986
      }
1987
      vindex++;
57,251,967✔
1988
      if (taosArrayPush(pVgList, &vgInfo) == NULL) {
57,251,967✔
1989
        mError("db:%s, failed to push vgInfo to array, vgId:%d, but continue next", pDb->name, vgInfo.vgId);
×
1990
      }
1991
    }
1992

1993
    sdbRelease(pSdb, pVgroup);
68,912,828✔
1994

1995
    if (pDb && (vindex >= pDb->cfg.numOfVgroups)) {
68,912,828✔
1996
      sdbCancelFetch(pSdb, pIter);
19,738,986✔
1997
      break;
19,738,986✔
1998
    }
1999
  }
2000
}
26,108,239✔
2001

2002
int32_t mndExtractDbInfo(SMnode *pMnode, SDbObj *pDb, SUseDbRsp *pRsp, const SUseDbReq *pReq) {
20,282,028✔
2003
  int32_t code = 0;
20,282,028✔
2004
  pRsp->pVgroupInfos = taosArrayInit(pDb->cfg.numOfVgroups, sizeof(SVgroupInfo));
20,282,028✔
2005
  if (pRsp->pVgroupInfos == NULL) {
20,282,028✔
2006
    code = terrno;
×
2007
    TAOS_RETURN(code);
×
2008
  }
2009

2010
  int32_t numOfTable = mndGetDBTableNum(pDb, pMnode);
20,282,028✔
2011

2012
  if (pReq == NULL || pReq->vgVersion < pDb->vgVersion || pReq->dbId != pDb->uid || numOfTable != pReq->numOfTable ||
20,282,028✔
2013
      pReq->stateTs < pDb->stateTs) {
1,418,531✔
2014
    mndBuildDBVgroupInfo(pDb, pMnode, pRsp->pVgroupInfos);
18,998,249✔
2015
  }
2016

2017
  (void)memcpy(pRsp->db, pDb->name, TSDB_DB_FNAME_LEN);
20,282,028✔
2018
  pRsp->uid = pDb->uid;
20,282,028✔
2019
  pRsp->vgVersion = pDb->vgVersion;
20,282,028✔
2020
  pRsp->stateTs = pDb->stateTs;
20,282,028✔
2021
  pRsp->vgNum = taosArrayGetSize(pRsp->pVgroupInfos);
20,282,028✔
2022
  pRsp->hashMethod = pDb->cfg.hashMethod;
20,282,028✔
2023
  pRsp->hashPrefix = pDb->cfg.hashPrefix;
20,282,028✔
2024
  pRsp->hashSuffix = pDb->cfg.hashSuffix;
20,282,028✔
2025
  pRsp->flags = pDb->cfg.flags;
20,282,028✔
2026
  TAOS_RETURN(code);
20,282,028✔
2027
}
2028

2029
static int32_t mndProcessUseDbReq(SRpcMsg *pReq) {
26,577,610✔
2030
  SMnode   *pMnode = pReq->info.node;
26,577,610✔
2031
  int32_t   code = -1;
26,577,610✔
2032
  SDbObj   *pDb = NULL;
26,577,610✔
2033
  SUseDbReq usedbReq = {0};
26,577,610✔
2034
  SUseDbRsp usedbRsp = {0};
26,577,610✔
2035

2036
  TAOS_CHECK_GOTO(tDeserializeSUseDbReq(pReq->pCont, pReq->contLen, &usedbReq), NULL, _OVER);
26,577,610✔
2037

2038
  char *p = strchr(usedbReq.db, '.');
26,576,912✔
2039
  if (p && ((0 == strcmp(p + 1, TSDB_INFORMATION_SCHEMA_DB) || (0 == strcmp(p + 1, TSDB_PERFORMANCE_SCHEMA_DB))))) {
26,576,912✔
2040
    (void)memcpy(usedbRsp.db, usedbReq.db, TSDB_DB_FNAME_LEN);
6,149,442✔
2041
    int32_t vgVersion = mndGetGlobalVgroupVersion(pMnode);
6,149,442✔
2042
    if (usedbReq.vgVersion < vgVersion) {
6,148,744✔
2043
      usedbRsp.pVgroupInfos = taosArrayInit(10, sizeof(SVgroupInfo));
6,136,484✔
2044
      if (usedbRsp.pVgroupInfos == NULL) goto _OVER;
6,136,484✔
2045

2046
      mndBuildDBVgroupInfo(NULL, pMnode, usedbRsp.pVgroupInfos);
6,136,484✔
2047
      usedbRsp.vgVersion = vgVersion++;
6,136,484✔
2048
    } else {
2049
      usedbRsp.vgVersion = usedbReq.vgVersion;
12,260✔
2050
    }
2051
    usedbRsp.vgNum = taosArrayGetSize(usedbRsp.pVgroupInfos);
6,148,744✔
2052
    code = 0;
6,148,744✔
2053
  } else {
2054
    pDb = mndAcquireDb(pMnode, usedbReq.db);
20,428,168✔
2055
    if (pDb == NULL) {
20,428,667✔
2056
      (void)memcpy(usedbRsp.db, usedbReq.db, TSDB_DB_FNAME_LEN);
129,294✔
2057
      usedbRsp.uid = usedbReq.dbId;
129,294✔
2058
      usedbRsp.vgVersion = usedbReq.vgVersion;
129,294✔
2059
      usedbRsp.errCode = terrno;
129,294✔
2060

2061
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
129,294✔
2062
      if (terrno != 0) code = terrno;
129,294✔
2063
      goto _OVER;
129,294✔
2064
    } else {
2065
      TAOS_CHECK_GOTO(mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_USE_DB, pDb), NULL, _OVER);
20,299,373✔
2066

2067
      TAOS_CHECK_GOTO(mndExtractDbInfo(pMnode, pDb, &usedbRsp, &usedbReq), NULL, _OVER);
20,282,028✔
2068

2069
      mDebug("db:%s, process usedb req vgVersion:%d stateTs:%" PRId64 ", rsp vgVersion:%d stateTs:%" PRId64,
20,282,028✔
2070
             usedbReq.db, usedbReq.vgVersion, usedbReq.stateTs, usedbRsp.vgVersion, usedbRsp.stateTs);
2071
      code = 0;
20,282,028✔
2072
    }
2073
  }
2074

2075
  int32_t contLen = tSerializeSUseDbRsp(NULL, 0, &usedbRsp);
26,430,772✔
2076
  void   *pRsp = rpcMallocCont(contLen);
26,430,772✔
2077
  if (pRsp == NULL) {
26,430,772✔
2078
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
2079
    code = -1;
×
2080
    goto _OVER;
×
2081
  }
2082

2083
  int32_t ret = 0;
26,430,772✔
2084
  if ((ret = tSerializeSUseDbRsp(pRsp, contLen, &usedbRsp)) < 0) {
26,430,772✔
2085
    code = ret;
×
2086
    goto _OVER;
×
2087
  }
2088

2089
  pReq->info.rsp = pRsp;
26,430,772✔
2090
  pReq->info.rspLen = contLen;
26,430,772✔
2091

2092
_OVER:
26,577,610✔
2093
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
26,577,610✔
2094
    mError("db:%s, failed to process use db req since %s", usedbReq.db, tstrerror(code));
146,838✔
2095
  }
2096

2097
  mndReleaseDb(pMnode, pDb);
26,577,610✔
2098
  tFreeSUsedbRsp(&usedbRsp);
26,577,610✔
2099

2100
  TAOS_RETURN(code);
26,577,610✔
2101
}
2102

2103
int32_t mndValidateDbInfo(SMnode *pMnode, SDbCacheInfo *pDbs, int32_t numOfDbs, void **ppRsp, int32_t *pRspLen) {
4,063,558✔
2104
  int32_t       code = 0;
4,063,558✔
2105
  SDbHbBatchRsp batchRsp = {0};
4,063,558✔
2106
  batchRsp.pArray = taosArrayInit(numOfDbs, sizeof(SDbHbRsp));
4,063,558✔
2107
  if (batchRsp.pArray == NULL) {
4,063,558✔
2108
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
2109
    TAOS_RETURN(code);
×
2110
  }
2111

2112
  for (int32_t i = 0; i < numOfDbs; ++i) {
8,851,687✔
2113
    SDbCacheInfo *pDbCacheInfo = &pDbs[i];
4,788,129✔
2114
    pDbCacheInfo->dbId = be64toh(pDbCacheInfo->dbId);
4,788,129✔
2115
    pDbCacheInfo->vgVersion = htonl(pDbCacheInfo->vgVersion);
4,788,129✔
2116
    pDbCacheInfo->cfgVersion = htonl(pDbCacheInfo->cfgVersion);
4,788,129✔
2117
    pDbCacheInfo->numOfTable = htonl(pDbCacheInfo->numOfTable);
4,788,129✔
2118
    pDbCacheInfo->stateTs = be64toh(pDbCacheInfo->stateTs);
4,788,129✔
2119
    pDbCacheInfo->tsmaVersion = htonl(pDbCacheInfo->tsmaVersion);
4,788,129✔
2120

2121
    SDbHbRsp rsp = {0};
4,788,129✔
2122
    (void)memcpy(rsp.db, pDbCacheInfo->dbFName, TSDB_DB_FNAME_LEN);
4,788,129✔
2123
    rsp.dbId = pDbCacheInfo->dbId;
4,788,129✔
2124

2125
    if ((0 == strcasecmp(pDbCacheInfo->dbFName, TSDB_INFORMATION_SCHEMA_DB) ||
4,788,129✔
2126
         (0 == strcasecmp(pDbCacheInfo->dbFName, TSDB_PERFORMANCE_SCHEMA_DB)))) {
4,558,050✔
2127
      int32_t vgVersion = mndGetGlobalVgroupVersion(pMnode);
1,676,739✔
2128
      if (pDbCacheInfo->vgVersion >= vgVersion) {
1,676,739✔
2129
        continue;
1,444,322✔
2130
      }
2131

2132
      rsp.useDbRsp = taosMemoryCalloc(1, sizeof(SUseDbRsp));
232,769✔
2133
      (void)memcpy(rsp.useDbRsp->db, pDbCacheInfo->dbFName, TSDB_DB_FNAME_LEN);
232,769✔
2134
      rsp.useDbRsp->pVgroupInfos = taosArrayInit(10, sizeof(SVgroupInfo));
232,769✔
2135

2136
      mndBuildDBVgroupInfo(NULL, pMnode, rsp.useDbRsp->pVgroupInfos);
232,769✔
2137
      rsp.useDbRsp->vgVersion = vgVersion++;
232,769✔
2138

2139
      rsp.useDbRsp->vgNum = taosArrayGetSize(rsp.useDbRsp->pVgroupInfos);
232,769✔
2140

2141
      if (taosArrayPush(batchRsp.pArray, &rsp) == NULL) {
465,538✔
2142
        if (terrno != 0) code = terrno;
×
2143
        return code;
×
2144
      }
2145

2146
      continue;
232,769✔
2147
    }
2148

2149
    SDbObj *pDb = mndAcquireDb(pMnode, pDbCacheInfo->dbFName);
3,111,390✔
2150
    if (pDb == NULL) {
3,111,390✔
2151
      mTrace("db:%s, no exist", pDbCacheInfo->dbFName);
24,199✔
2152
      rsp.useDbRsp = taosMemoryCalloc(1, sizeof(SUseDbRsp));
24,199✔
2153
      (void)memcpy(rsp.useDbRsp->db, pDbCacheInfo->dbFName, TSDB_DB_FNAME_LEN);
24,199✔
2154
      rsp.useDbRsp->uid = pDbCacheInfo->dbId;
24,199✔
2155
      rsp.useDbRsp->vgVersion = -1;
24,199✔
2156
      if (taosArrayPush(batchRsp.pArray, &rsp) == NULL) {
48,398✔
2157
        if (terrno != 0) code = terrno;
×
2158
        return code;
×
2159
      }
2160
      continue;
24,199✔
2161
    }
2162

2163
    int32_t numOfTable = mndGetDBTableNum(pDb, pMnode);
3,087,191✔
2164

2165
    if (pDbCacheInfo->vgVersion >= pDb->vgVersion && pDbCacheInfo->cfgVersion >= pDb->cfgVersion &&
3,087,191✔
2166
        numOfTable == pDbCacheInfo->numOfTable && pDbCacheInfo->stateTs == pDb->stateTs &&
2,920,754✔
2167
        pDbCacheInfo->tsmaVersion >= pDb->tsmaVersion) {
2,267,912✔
2168
      mTrace("db:%s, valid dbinfo, vgVersion:%d cfgVersion:%d stateTs:%" PRId64
2,129,656✔
2169
             " numOfTables:%d, not changed vgVersion:%d cfgVersion:%d stateTs:%" PRId64 " numOfTables:%d",
2170
             pDbCacheInfo->dbFName, pDbCacheInfo->vgVersion, pDbCacheInfo->cfgVersion, pDbCacheInfo->stateTs,
2171
             pDbCacheInfo->numOfTable, pDb->vgVersion, pDb->cfgVersion, pDb->stateTs, numOfTable);
2172
      mndReleaseDb(pMnode, pDb);
2,129,656✔
2173
      continue;
2,129,656✔
2174
    } else {
2175
      mTrace("db:%s, valid dbinfo, vgVersion:%d cfgVersion:%d stateTs:%" PRId64
957,535✔
2176
             " numOfTables:%d, changed to vgVersion:%d cfgVersion:%d stateTs:%" PRId64 " numOfTables:%d",
2177
             pDbCacheInfo->dbFName, pDbCacheInfo->vgVersion, pDbCacheInfo->cfgVersion, pDbCacheInfo->stateTs,
2178
             pDbCacheInfo->numOfTable, pDb->vgVersion, pDb->cfgVersion, pDb->stateTs, numOfTable);
2179
    }
2180

2181
    if (pDbCacheInfo->cfgVersion < pDb->cfgVersion) {
957,535✔
2182
      rsp.cfgRsp = taosMemoryCalloc(1, sizeof(SDbCfgRsp));
140,715✔
2183
      char algrId[TSDB_ENCRYPT_ALGR_NAME_LEN] = {0};
140,715✔
2184
      mndGetEncryptOsslAlgrNameById(pMnode, pDb->cfg.encryptAlgorithm, algrId);
140,715✔
2185
      mndDumpDbCfgInfo(rsp.cfgRsp, pDb, algrId);
140,715✔
2186
    }
2187

2188
    if (pDbCacheInfo->tsmaVersion != pDb->tsmaVersion) {
957,535✔
2189
      rsp.pTsmaRsp = taosMemoryCalloc(1, sizeof(STableTSMAInfoRsp));
557,509✔
2190
      if (rsp.pTsmaRsp) rsp.pTsmaRsp->pTsmas = taosArrayInit(4, POINTER_BYTES);
557,509✔
2191
      if (rsp.pTsmaRsp && rsp.pTsmaRsp->pTsmas) {
557,509✔
2192
        bool    exist = false;
557,509✔
2193
        int32_t code = mndGetDbTsmas(pMnode, 0, pDb->uid, rsp.pTsmaRsp, &exist);
557,509✔
2194
        if (TSDB_CODE_SUCCESS != code) {
557,509✔
2195
          mndReleaseDb(pMnode, pDb);
×
2196
          if (code != TSDB_CODE_NEED_RETRY) {
×
2197
            mError("db:%s, failed to get db tsmas", pDb->name);
×
2198
          } else {
2199
            mWarn("db:%s, need retry to get db tsmas", pDb->name);
×
2200
          }
2201
          taosArrayDestroyP(rsp.pTsmaRsp->pTsmas, tFreeAndClearTableTSMAInfo);
×
2202
          taosMemoryFreeClear(rsp.pTsmaRsp);
×
2203
          continue;
×
2204
        }
2205
        rsp.dbTsmaVersion = pDb->tsmaVersion;
557,509✔
2206
        mDebug("update tsma version to %d, got tsma num: %ld", pDb->tsmaVersion, rsp.pTsmaRsp->pTsmas->size);
557,509✔
2207
      }
2208
    }
2209

2210
    if (pDbCacheInfo->vgVersion < pDb->vgVersion || numOfTable != pDbCacheInfo->numOfTable ||
957,535✔
2211
        pDbCacheInfo->stateTs != pDb->stateTs) {
916,451✔
2212
      rsp.useDbRsp = taosMemoryCalloc(1, sizeof(SUseDbRsp));
740,737✔
2213
      rsp.useDbRsp->pVgroupInfos = taosArrayInit(pDb->cfg.numOfVgroups, sizeof(SVgroupInfo));
740,737✔
2214
      if (rsp.useDbRsp->pVgroupInfos == NULL) {
740,737✔
2215
        mndReleaseDb(pMnode, pDb);
×
2216
        mError("db:%s, failed to malloc usedb response", pDb->name);
×
2217
        taosArrayDestroyP(rsp.pTsmaRsp->pTsmas, tFreeAndClearTableTSMAInfo);
×
2218
        taosMemoryFreeClear(rsp.pTsmaRsp);
×
2219
        continue;
×
2220
      }
2221

2222
      mndBuildDBVgroupInfo(pDb, pMnode, rsp.useDbRsp->pVgroupInfos);
740,737✔
2223
      (void)memcpy(rsp.useDbRsp->db, pDb->name, TSDB_DB_FNAME_LEN);
740,737✔
2224
      rsp.useDbRsp->uid = pDb->uid;
740,737✔
2225
      rsp.useDbRsp->vgVersion = pDb->vgVersion;
740,737✔
2226
      rsp.useDbRsp->stateTs = pDb->stateTs;
740,737✔
2227
      rsp.useDbRsp->vgNum = (int32_t)taosArrayGetSize(rsp.useDbRsp->pVgroupInfos);
740,737✔
2228
      rsp.useDbRsp->hashMethod = pDb->cfg.hashMethod;
740,737✔
2229
      rsp.useDbRsp->hashPrefix = pDb->cfg.hashPrefix;
740,737✔
2230
      rsp.useDbRsp->hashSuffix = pDb->cfg.hashSuffix;
740,737✔
2231
      rsp.useDbRsp->flags = pDb->cfg.flags;
740,737✔
2232
    }
2233

2234
    if (taosArrayPush(batchRsp.pArray, &rsp) == NULL) {
1,915,070✔
2235
      mndReleaseDb(pMnode, pDb);
×
2236
      if (terrno != 0) code = terrno;
×
2237
      return code;
×
2238
    }
2239
    mndReleaseDb(pMnode, pDb);
957,535✔
2240
  }
2241

2242
  int32_t rspLen = tSerializeSDbHbBatchRsp(NULL, 0, &batchRsp);
4,063,558✔
2243
  void   *pRsp = taosMemoryMalloc(rspLen);
4,063,558✔
2244
  if (pRsp == NULL) {
4,063,558✔
2245
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
2246
    tFreeSDbHbBatchRsp(&batchRsp);
×
2247
    return -1;
×
2248
  }
2249
  int32_t ret = 0;
4,063,558✔
2250
  if ((ret = tSerializeSDbHbBatchRsp(pRsp, rspLen, &batchRsp)) < 0) return ret;
4,063,558✔
2251

2252
  *ppRsp = pRsp;
4,063,558✔
2253
  *pRspLen = rspLen;
4,063,558✔
2254

2255
  tFreeSDbHbBatchRsp(&batchRsp);
4,063,558✔
2256
  TAOS_RETURN(code);
4,063,558✔
2257
}
2258

2259
static int32_t mndSetTrimDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, int64_t startTs, STimeWindow tw,
18,810✔
2260
                                       SArray *vgroupIds, ETsdbOpType type, ETriggerType triggerType,
2261
                                       STrimDbRsp *pRsp) {
2262
  int32_t code = 0, lino = 0;
18,810✔
2263
  SSdb   *pSdb = pMnode->pSdb;
18,810✔
2264
  void   *pIter = NULL;
18,810✔
2265

2266
  SRetentionObj obj = {.optrType = type, .triggerType = triggerType};  // reuse SCompactObj struct
18,810✔
2267
  TAOS_CHECK_EXIT(mndAddRetentionToTrans(pMnode, pTrans, &obj, pDb, pRsp));
18,810✔
2268

2269
  int32_t j = 0;
18,810✔
2270
  int32_t numOfVgroups = taosArrayGetSize(vgroupIds);
18,810✔
2271
  if (numOfVgroups > 0) {
18,810✔
2272
    for (int32_t i = 0; i < numOfVgroups; i++) {
9,276✔
2273
      int64_t vgId = *(int64_t *)taosArrayGet(vgroupIds, i);
6,957✔
2274
      SVgObj *pVgroup = mndAcquireVgroup(pMnode, vgId);
6,957✔
2275

2276
      if (pVgroup == NULL) {
6,957✔
2277
        mError("db:%s, vgroup:%" PRId64 " not exist", pDb->name, vgId);
2,319✔
2278
        TAOS_CHECK_EXIT(TSDB_CODE_MND_VGROUP_NOT_EXIST);
2,319✔
2279
      } else if (pVgroup->dbUid != pDb->uid) {
4,638✔
2280
        mError("db:%s, vgroup:%" PRId64 " not belong to db:%s", pDb->name, vgId, pDb->name);
×
2281
        sdbRelease(pSdb, pVgroup);
×
2282
        TAOS_CHECK_EXIT(TSDB_CODE_MND_VGROUP_NOT_EXIST);
×
2283
      }
2284
      sdbRelease(pSdb, pVgroup);
4,638✔
2285
    }
2286

2287
    for (int32_t i = 0; i < numOfVgroups; i++) {
6,957✔
2288
      int64_t vgId = *(int64_t *)taosArrayGet(vgroupIds, i);
4,638✔
2289
      SVgObj *pVgroup = mndAcquireVgroup(pMnode, vgId);
4,638✔
2290

2291
      if ((code = mndBuildTrimVgroupAction(pMnode, pTrans, pDb, pVgroup, startTs, tw, type, triggerType)) != 0) {
4,638✔
2292
        sdbRelease(pSdb, pVgroup);
×
2293
        TAOS_RETURN(code);
×
2294
      }
2295

2296
      for (int32_t i = 0; i < pVgroup->replica; i++) {
9,276✔
2297
        SVnodeGid *gid = &pVgroup->vnodeGid[i];
4,638✔
2298
        if ((code = mndAddRetentionDetailToTrans(pMnode, pTrans, &obj, pVgroup, gid, j)) != 0) {
4,638✔
2299
          sdbRelease(pSdb, pVgroup);
×
2300
          TAOS_RETURN(code);
×
2301
        }
2302
        j++;
4,638✔
2303
      }
2304
      sdbRelease(pSdb, pVgroup);
4,638✔
2305
    }
2306
  } else {
2307
    while (1) {
58,380✔
2308
      SVgObj *pVgroup = NULL;
72,552✔
2309
      pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
72,552✔
2310
      if (pIter == NULL) break;
72,552✔
2311

2312
      if (pVgroup->dbUid == pDb->uid) {
58,380✔
2313
        if ((code = mndBuildTrimVgroupAction(pMnode, pTrans, pDb, pVgroup, startTs, tw, type, triggerType)) != 0) {
36,814✔
2314
          sdbCancelFetch(pSdb, pIter);
×
2315
          sdbRelease(pSdb, pVgroup);
×
2316
          TAOS_RETURN(code);
×
2317
        }
2318

2319
        for (int32_t i = 0; i < pVgroup->replica; i++) {
77,644✔
2320
          SVnodeGid *gid = &pVgroup->vnodeGid[i];
40,830✔
2321
          if ((code = mndAddRetentionDetailToTrans(pMnode, pTrans, &obj, pVgroup, gid, j)) != 0) {
40,830✔
2322
            sdbCancelFetch(pSdb, pIter);
×
2323
            sdbRelease(pSdb, pVgroup);
×
2324
            TAOS_RETURN(code);
×
2325
          }
2326
          j++;
40,830✔
2327
        }
2328
      }
2329

2330
      sdbRelease(pSdb, pVgroup);
58,380✔
2331
    }
2332
  }
2333
_exit:
18,810✔
2334
  TAOS_RETURN(code);
18,810✔
2335
}
2336

2337
static int32_t mndBuildTrimDbRsp(STrimDbRsp *rsp, int32_t *pRspLen, void **ppRsp, bool useRpcMalloc) {
16,491✔
2338
  int32_t code = 0;
16,491✔
2339
  int32_t rspLen = tSerializeSCompactDbRsp(NULL, 0, (SCompactDbRsp *)rsp);
16,491✔
2340
  void   *pRsp = NULL;
16,491✔
2341
  if (useRpcMalloc) {
16,491✔
2342
    pRsp = rpcMallocCont(rspLen);
×
2343
  } else {
2344
    pRsp = taosMemoryMalloc(rspLen);
16,491✔
2345
  }
2346

2347
  if (pRsp == NULL) {
16,491✔
2348
    code = TSDB_CODE_OUT_OF_MEMORY;
×
2349
    TAOS_RETURN(code);
×
2350
  }
2351

2352
  (void)tSerializeSCompactDbRsp(pRsp, rspLen, (SCompactDbRsp *)rsp);
16,491✔
2353
  *pRspLen = rspLen;
16,491✔
2354
  *ppRsp = pRsp;
16,491✔
2355
  TAOS_RETURN(code);
16,491✔
2356
}
2357

2358
int32_t mndTrimDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, STimeWindow tw, SArray *vgroupIds,
23,448✔
2359
                         ETsdbOpType type, ETriggerType triggerType) {
2360
  SSdb      *pSdb = pMnode->pSdb;
23,448✔
2361
  SVgObj    *pVgroup = NULL;
23,448✔
2362
  void      *pIter = NULL;
23,448✔
2363
  int32_t    code = 0, lino = 0;
23,448✔
2364
  STrimDbRsp rsp = {0};
23,448✔
2365
  bool       isExist = false;
23,448✔
2366

2367
  while (1) {
4,955✔
2368
    SRetentionObj *pObj = NULL;
28,403✔
2369
    pIter = sdbFetch(pMnode->pSdb, SDB_RETENTION, pIter, (void **)&pObj);
28,403✔
2370
    if (pIter == NULL) break;
28,403✔
2371

2372
    if (strcmp(pObj->dbname, pDb->name) == 0) {
4,955✔
2373
      isExist = true;
4,638✔
2374
    }
2375
    sdbRelease(pMnode->pSdb, pObj);
4,955✔
2376
  }
2377
  if (isExist) {
23,448✔
2378
    mInfo("trim db:%s already exist", pDb->name);
4,638✔
2379
    TAOS_RETURN(TSDB_CODE_MND_TRIM_ALREADY_EXIST);
4,638✔
2380
  }
2381

2382
  int64_t startTs = taosGetTimestampMs();
18,810✔
2383
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq, "trim-db");
18,810✔
2384
  if (pTrans == NULL) goto _exit;
18,810✔
2385
  mInfo("trans:%d, used to trim db:%s", pTrans->id, pDb->name);
18,810✔
2386
  mndTransSetDbName(pTrans, pDb->name, NULL);
18,810✔
2387
  TAOS_CHECK_EXIT(mndTrancCheckConflict(pMnode, pTrans));
18,810✔
2388
  TAOS_CHECK_EXIT(mndSetTrimDbRedoActions(pMnode, pTrans, pDb, startTs, tw, vgroupIds, type, triggerType, &rsp));
18,810✔
2389
  if (pReq) {
16,491✔
2390
    int32_t rspLen = 0;
16,491✔
2391
    void   *pRsp = NULL;
16,491✔
2392
    rsp.bAccepted = true;
16,491✔
2393
    TAOS_CHECK_EXIT(mndBuildTrimDbRsp(&rsp, &rspLen, &pRsp, false));
16,491✔
2394
    mndTransSetRpcRsp(pTrans, pRsp, rspLen);
16,491✔
2395
  }
2396
  TAOS_CHECK_EXIT(mndTransPrepare(pMnode, pTrans));
16,491✔
2397
_exit:
18,810✔
2398
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
18,810✔
2399
    mError("db:%s, failed at line %d to trim db since %s", pDb->name, lino, tstrerror(code));
2,319✔
2400
  }
2401
  mndTransDrop(pTrans);
18,810✔
2402
  TAOS_RETURN(code);
18,810✔
2403
}
2404

2405
#ifdef TD_ENTERPRISE
2406
static int32_t mndCheckRsmaInDb(SMnode *pMnode, SDbObj *pDb) {
14,687✔
2407
  int32_t   code = 0;
14,687✔
2408
  void     *pIter = NULL;
14,687✔
2409
  SRsmaObj *pRsma = NULL;
14,687✔
2410
  while ((pIter = sdbFetch(pMnode->pSdb, SDB_RSMA, pIter, (void **)&pRsma))) {
14,687✔
2411
    if (pRsma->dbUid == pDb->uid) {
14,687✔
2412
      sdbRelease(pMnode->pSdb, pRsma);
14,687✔
2413
      sdbCancelFetch(pMnode->pSdb, pIter);
14,687✔
2414
      TAOS_RETURN(code);
14,687✔
2415
    }
2416
    sdbRelease(pMnode->pSdb, pRsma);
×
2417
  }
2418
  TAOS_RETURN(TSDB_CODE_RSMA_NOT_EXIST);
×
2419
}
2420
#endif
2421

2422
static int32_t mndProcessTrimDbReq(SRpcMsg *pReq) {
23,448✔
2423
  SMnode    *pMnode = pReq->info.node;
23,448✔
2424
  int32_t    code = 0, lino = 0;
23,448✔
2425
  SDbObj    *pDb = NULL;
23,448✔
2426
  STrimDbReq trimReq = {0};
23,448✔
2427

2428
  TAOS_CHECK_EXIT(tDeserializeSTrimDbReq(pReq->pCont, pReq->contLen, &trimReq));
23,448✔
2429

2430
  mInfo("db:%s, start to trim, optr:%u, tw:%" PRId64 ",%" PRId64, trimReq.db, trimReq.optrType, trimReq.tw.skey,
23,448✔
2431
        trimReq.tw.ekey);
2432

2433
  pDb = mndAcquireDb(pMnode, trimReq.db);
23,448✔
2434
  if (pDb == NULL) {
23,448✔
2435
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2436
    if (terrno != 0) code = terrno;
×
2437
    TAOS_CHECK_EXIT(code);
×
2438
  }
2439

2440
  TAOS_CHECK_EXIT(mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_TRIM_DB, pDb));
23,448✔
2441

2442
  if (pDb->cfg.isMount) {
23,448✔
2443
    TAOS_CHECK_EXIT(TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT);
×
2444
  }
2445

2446
#ifdef TD_ENTERPRISE
2447
  if (trimReq.optrType == TSDB_OPTR_ROLLUP) {
23,448✔
2448
    TAOS_CHECK_EXIT(mndCheckRsmaInDb(pMnode, pDb));
14,687✔
2449
  }
2450
#endif
2451

2452
  TAOS_CHECK_EXIT(mndTrimDb(pMnode, pReq, pDb, trimReq.tw, trimReq.vgroupIds, trimReq.optrType, trimReq.triggerType));
23,448✔
2453
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
16,491✔
2454

2455
  SName name = {0};
16,491✔
2456
  if (tNameFromString(&name, trimReq.db, T_NAME_ACCT | T_NAME_DB) < 0) {
16,491✔
2457
    mWarn("db:%s, failed at line %d to parse db name", trimReq.db, __LINE__);
×
2458
  }
2459

2460
  char optrType[16] = {0};
16,491✔
2461
  (void)snprintf(optrType, sizeof(optrType), "%u", trimReq.optrType);
16,491✔
2462

2463
  auditRecord(pReq, pMnode->clusterId, "trimDB", name.dbname, optrType, trimReq.sql, trimReq.sqlLen);
16,491✔
2464

2465
_exit:
23,448✔
2466
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
23,448✔
2467
    mError("db:%s, failed at line %d to process trim db req since %s, optr:%u", trimReq.db, lino, tstrerror(code),
6,957✔
2468
           trimReq.optrType);
2469
  }
2470

2471
  mndReleaseDb(pMnode, pDb);
23,448✔
2472
  tFreeSTrimDbReq(&trimReq);
23,448✔
2473
  TAOS_RETURN(code);
23,448✔
2474
}
2475

2476
static int32_t mndBuildSsMigrateDbRsp(SSsMigrateDbRsp *pSsMigrateRsp, int32_t *pRspLen, void **ppRsp, bool useRpcMalloc) {
×
2477
  int32_t code = 0;
×
2478
  int32_t rspLen = tSerializeSSsMigrateDbRsp(NULL, 0, pSsMigrateRsp);
×
2479
  void   *pRsp = NULL;
×
2480
  if (useRpcMalloc) {
×
2481
    pRsp = rpcMallocCont(rspLen);
×
2482
  } else {
2483
    pRsp = taosMemoryMalloc(rspLen);
×
2484
  }
2485

2486
  if (pRsp == NULL) {
×
2487
    code = TSDB_CODE_OUT_OF_MEMORY;
×
2488
    TAOS_RETURN(code);
×
2489
  }
2490

2491
  (void)tSerializeSSsMigrateDbRsp(pRsp, rspLen, pSsMigrateRsp);
×
2492
  *pRspLen = rspLen;
×
2493
  *ppRsp = pRsp;
×
2494
  TAOS_RETURN(code);
×
2495
}
2496

2497
static int32_t mndTrimDbWal(SMnode *pMnode, SDbObj *pDb) {
599✔
2498
  SSdb   *pSdb = pMnode->pSdb;
599✔
2499
  SVgObj *pVgroup = NULL;
599✔
2500
  void   *pIter = NULL;
599✔
2501
  int32_t code = 0;
599✔
2502

2503
  // Iterate through all vgroups in this database
2504
  while (1) {
1,198✔
2505
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
1,797✔
2506
    if (pIter == NULL) break;
1,797✔
2507

2508
    // Check if this vgroup belongs to the database
2509
    if (pVgroup->dbUid != pDb->uid) {
1,198✔
2510
      sdbRelease(pSdb, pVgroup);
×
2511
      continue;
×
2512
    }
2513

2514
    // Prepare message to send to vnode
2515
    int32_t   contLen = sizeof(SMsgHead);
1,198✔
2516
    SMsgHead *pHead = rpcMallocCont(contLen);
1,198✔
2517
    if (pHead == NULL) {
1,198✔
2518
      sdbCancelFetch(pSdb, pVgroup);
×
2519
      sdbRelease(pSdb, pVgroup);
×
2520
      code = TSDB_CODE_OUT_OF_MEMORY;
×
2521
      break;
×
2522
    }
2523
    pHead->contLen = htonl(contLen);
1,198✔
2524
    pHead->vgId = htonl(pVgroup->vgId);
1,198✔
2525

2526
    // Send TRIM WAL request to vnode
2527
    SRpcMsg rpcMsg = {.msgType = TDMT_VND_TRIM_WAL, .pCont = pHead, .contLen = contLen};
1,198✔
2528
    SEpSet  epSet = mndGetVgroupEpset(pMnode, pVgroup);
1,198✔
2529
    code = tmsgSendReq(&epSet, &rpcMsg);
1,198✔
2530
    if (code != 0) {
1,198✔
2531
      mError("vgId:%d, failed to send vnode-trim-wal request since 0x%x", pVgroup->vgId, code);
×
2532
    } else {
2533
      mInfo("vgId:%d, send vnode-trim-wal request to vnode", pVgroup->vgId);
1,198✔
2534
    }
2535
    sdbRelease(pSdb, pVgroup);
1,198✔
2536
  }
2537

2538
  return code;
599✔
2539
}
2540

2541
static int32_t mndProcessTrimDbWalReq(SRpcMsg *pReq) {
599✔
2542
  SMnode    *pMnode = pReq->info.node;
599✔
2543
  int32_t    code = -1;
599✔
2544
  SDbObj    *pDb = NULL;
599✔
2545
  STrimDbReq trimReq = {0};
599✔
2546

2547
  TAOS_CHECK_GOTO(tDeserializeSTrimDbReq(pReq->pCont, pReq->contLen, &trimReq), NULL, _OVER);
599✔
2548

2549
  mInfo("db:%s, start to trim WAL", trimReq.db);
599✔
2550

2551
  pDb = mndAcquireDb(pMnode, trimReq.db);
599✔
2552
  if (pDb == NULL) {
599✔
2553
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2554
    if (terrno != 0) code = terrno;
×
2555
    goto _OVER;
×
2556
  }
2557

2558
  TAOS_CHECK_GOTO(mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_TRIM_DB, pDb), NULL, _OVER);
599✔
2559

2560
  code = mndTrimDbWal(pMnode, pDb);
599✔
2561

2562
_OVER:
599✔
2563
  if (code != 0) {
599✔
2564
    mError("db:%s, failed to process trim db wal req since %s", trimReq.db, terrstr());
×
2565
  }
2566

2567
  mndReleaseDb(pMnode, pDb);
599✔
2568
  TAOS_RETURN(code);
599✔
2569
}
2570

2571
int32_t mndSsMigrateDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb) {
×
2572
  int32_t       code = 0;
×
2573
  SSsMigrateDbRsp ssMigrateRsp = {0};
×
2574

2575
  bool  isExist = false;
×
2576
  void *pIter = NULL;
×
2577
  while (1) {
×
2578
    SSsMigrateObj *pSsMigrate = NULL;
×
2579
    pIter = sdbFetch(pMnode->pSdb, SDB_SSMIGRATE, pIter, (void **)&pSsMigrate);
×
2580
    if (pIter == NULL) break;
×
2581

2582
    if (strcmp(pSsMigrate->dbname, pDb->name) == 0) {
×
2583
      isExist = true;
×
2584
    }
2585
    sdbRelease(pMnode->pSdb, pSsMigrate);
×
2586
  }
2587
  if (isExist) {
×
2588
    mInfo("ssmigrate db:%s already exist", pDb->name);
×
2589

2590
    if (pReq) {
×
2591
      int32_t rspLen = 0;
×
2592
      void   *pRsp = NULL;
×
2593
      ssMigrateRsp.ssMigrateId = 0;
×
2594
      ssMigrateRsp.bAccepted = false;
×
2595
      TAOS_CHECK_RETURN(mndBuildSsMigrateDbRsp(&ssMigrateRsp, &rspLen, &pRsp, true));
×
2596

2597
      pReq->info.rsp = pRsp;
×
2598
      pReq->info.rspLen = rspLen;
×
2599
    }
2600

2601
    return TSDB_CODE_MND_SSMIGRATE_ALREADY_EXIST;
×
2602
  }
2603

2604
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq, "ssmigrate-db");
×
2605
  if (pTrans == NULL) {
×
2606
    mError("failed to create ssmigrate-db trans since %s", terrstr());
×
2607
    goto _OVER;
×
2608
  }
2609

2610
  mInfo("trans:%d, used to ssmigrate db:%s", pTrans->id, pDb->name);
×
2611
  mndTransSetDbName(pTrans, pDb->name, NULL);
×
2612
  TAOS_CHECK_GOTO(mndTrancCheckConflict(pMnode, pTrans), NULL, _OVER);
×
2613

2614
  SSsMigrateObj ssMigrate = { .startTime = taosGetTimestampMs() };
×
2615
  TAOS_CHECK_GOTO(mndAddSsMigrateToTran(pMnode, pTrans, &ssMigrate, pDb), NULL, _OVER);
×
2616

2617
  if (pReq) {
×
2618
    int32_t rspLen = 0;
×
2619
    void   *pRsp = NULL;
×
2620
    ssMigrateRsp.ssMigrateId = ssMigrate.id;
×
2621
    ssMigrateRsp.bAccepted = true;
×
2622
    TAOS_CHECK_GOTO(mndBuildSsMigrateDbRsp(&ssMigrateRsp, &rspLen, &pRsp, false), NULL, _OVER);
×
2623
    mndTransSetRpcRsp(pTrans, pRsp, rspLen);
×
2624
  }
2625

2626
  if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
×
2627
  code = 0;
×
2628

2629
_OVER:
×
2630
  mndTransDrop(pTrans);
×
2631
  TAOS_RETURN(code);
×
2632
}
2633

2634

2635
static int32_t mndProcessSsMigrateDbReq(SRpcMsg *pReq) {
×
2636
  SMnode         *pMnode = pReq->info.node;
×
2637
  int32_t         code = -1;
×
2638
  SDbObj         *pDb = NULL;
×
2639
  SSsMigrateDbReq ssMigrateReq = {0};
×
2640

2641
  if (!tsSsEnabled) {
×
2642
    code = TSDB_CODE_OPS_NOT_SUPPORT;
×
2643
    goto _OVER;
×
2644
  }
2645

2646
  TAOS_CHECK_GOTO(grantCheck(TSDB_GRANT_SHARED_STORAGE), NULL, _OVER);
×
2647
  TAOS_CHECK_GOTO(tDeserializeSSsMigrateDbReq(pReq->pCont, pReq->contLen, &ssMigrateReq), NULL, _OVER);
×
2648

2649
  mInfo("db:%s, start to ssmigrate", ssMigrateReq.db);
×
2650

2651
  pDb = mndAcquireDb(pMnode, ssMigrateReq.db);
×
2652
  if (pDb == NULL) {
×
2653
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2654
    if (terrno != 0) code = terrno;
×
2655
    goto _OVER;
×
2656
  }
2657

2658
  // TAOS_CHECK_GOTO(mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_SSMIGRATE_DB, pDb), NULL, _OVER);
2659

2660
  if(pDb->cfg.isMount) {
×
2661
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
×
2662
    goto _OVER;
×
2663
  }
2664

2665
  code = mndSsMigrateDb(pMnode, pReq, pDb);
×
2666

2667
_OVER:
×
2668
  if (code != 0) {
×
2669
    mError("db:%s, failed to process ssmigrate db req since %s", ssMigrateReq.db, tstrerror(code));
×
2670
  }
2671

2672
  mndReleaseDb(pMnode, pDb);
×
2673
  TAOS_RETURN(code);
×
2674
}
2675

2676
const char *mndGetDbStr(const char *src) {
25,117,629✔
2677
  char *pos = strstr(src, TS_PATH_DELIMITER);
25,117,629✔
2678
  if (pos != NULL) ++pos;
25,117,629✔
2679
  if (pos == NULL) return src;
25,117,629✔
2680
  return pos;
23,459,519✔
2681
}
2682

2683
const char *mndGetStableStr(const char *src) {
21,400,231✔
2684
  char *pos = strstr(src, TS_PATH_DELIMITER);
21,400,231✔
2685
  if (pos != NULL) ++pos;
21,400,231✔
2686
  if (pos == NULL) return src;
21,400,231✔
2687
  return mndGetDbStr(pos);
21,400,231✔
2688
}
2689

2690
static int64_t getValOfDiffPrecision(int8_t unit, int64_t val) {
×
2691
  int64_t v = 0;
×
2692
  switch (unit) {
×
2693
    case 's':
×
2694
      v = val / 1000;
×
2695
      break;
×
2696
    case 'm':
×
2697
      v = val / tsTickPerMin[TSDB_TIME_PRECISION_MILLI];
×
2698
      break;
×
2699
    case 'h':
×
2700
      v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 60);
×
2701
      break;
×
2702
    case 'd':
×
2703
      v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 24 * 60);
×
2704
      break;
×
2705
    case 'w':
×
2706
      v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 24 * 60 * 7);
×
2707
      break;
×
2708
    default:
×
2709
      break;
×
2710
  }
2711

2712
  return v;
×
2713
}
2714

2715
static char *buildRetension(SArray *pRetension) {
742,046✔
2716
  size_t size = taosArrayGetSize(pRetension);
742,046✔
2717
  if (size == 0) {
742,046✔
2718
    return NULL;
742,046✔
2719
  }
2720

2721
  char       *p1 = taosMemoryCalloc(1, 100);
×
2722
  SRetention *p = taosArrayGet(pRetension, 0);
×
2723

2724
  int32_t len = 2;
×
2725

2726
  int64_t v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
×
2727
  int64_t v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
×
2728
  len += tsnprintf(p1 + len, 100 - len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
×
2729

2730
  if (size > 1) {
×
2731
    len += tsnprintf(p1 + len, 100 - len, ",");
×
2732
    p = taosArrayGet(pRetension, 1);
×
2733

2734
    v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
×
2735
    v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
×
2736
    len += tsnprintf(p1 + len, 100 - len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
×
2737
  }
2738

2739
  if (size > 2) {
×
2740
    len += tsnprintf(p1 + len, 100 - len, ",");
×
2741
    p = taosArrayGet(pRetension, 2);
×
2742

2743
    v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
×
2744
    v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
×
2745
    len += tsnprintf(p1 + len, 100 - len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
×
2746
  }
2747

2748
  varDataSetLen(p1, len);
×
2749
  return p1;
×
2750
}
2751

2752
static const char *getCacheModelStr(int8_t cacheModel) {
742,046✔
2753
  switch (cacheModel) {
742,046✔
2754
    case TSDB_CACHE_MODEL_NONE:
702,895✔
2755
      return TSDB_CACHE_MODEL_NONE_STR;
702,895✔
2756
    case TSDB_CACHE_MODEL_LAST_ROW:
2,276✔
2757
      return TSDB_CACHE_MODEL_LAST_ROW_STR;
2,276✔
2758
    case TSDB_CACHE_MODEL_LAST_VALUE:
7,229✔
2759
      return TSDB_CACHE_MODEL_LAST_VALUE_STR;
7,229✔
2760
    case TSDB_CACHE_MODEL_BOTH:
29,646✔
2761
      return TSDB_CACHE_MODEL_BOTH_STR;
29,646✔
2762
    default:
×
2763
      break;
×
2764
  }
2765
  return "unknown";
×
2766
}
2767

2768
static void getEncryptAlgorithmStr(SMnode *pMnode, int8_t encryptAlgorithm, char *out) {
742,046✔
2769
  switch (encryptAlgorithm) {
742,046✔
2770
    case TSDB_ENCRYPT_ALGO_NONE: {
742,046✔
2771
      tstrncpy(out, TSDB_ENCRYPT_ALGO_NONE_STR, TSDB_ENCRYPT_ALGR_NAME_LEN);
742,046✔
2772
      break;
742,046✔
2773
    }
2774
    default: {
×
2775
      SEncryptAlgrObj *obj = mndAcquireEncryptAlgrById(pMnode, encryptAlgorithm);
×
2776
      if (obj != NULL) {
×
2777
        tstrncpy(out, obj->algorithm_id, TSDB_ENCRYPT_ALGR_NAME_LEN);
×
2778
        mndReleaseEncryptAlgr(pMnode, obj);
×
2779
      }
2780
      break;
×
2781
    }
2782
  }
2783
}
742,046✔
2784

2785
bool mndIsDbReady(SMnode *pMnode, SDbObj *pDb) {
2,265,027✔
2786
  if (pDb->cfg.replications == 1) return true;
2,265,027✔
2787

2788
  SSdb *pSdb = pMnode->pSdb;
437,723✔
2789
  void *pIter = NULL;
437,723✔
2790
  bool  isReady = true;
437,723✔
2791
  while (1) {
2,690,064✔
2792
    SVgObj *pVgroup = NULL;
3,127,787✔
2793
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
3,127,787✔
2794
    if (pIter == NULL) break;
3,127,787✔
2795

2796
    if (pVgroup->dbUid == pDb->uid && pVgroup->replica > 1) {
2,690,064✔
2797
      bool hasLeader = false;
1,482,722✔
2798
      for (int32_t i = 0; i < pVgroup->replica; ++i) {
5,877,552✔
2799
        if (pVgroup->vnodeGid[i].syncState == TAOS_SYNC_STATE_LEADER ||
4,394,830✔
2800
            pVgroup->vnodeGid[i].syncState == TAOS_SYNC_STATE_ASSIGNED_LEADER) {
3,808,869✔
2801
          hasLeader = true;
585,961✔
2802
        }
2803
      }
2804
      if (!hasLeader) isReady = false;
1,482,722✔
2805
    }
2806
    sdbRelease(pSdb, pVgroup);
2,690,064✔
2807
  }
2808

2809
  return isReady;
437,723✔
2810
}
2811

2812
static void mndDumpDbInfoData(SMnode *pMnode, SSDataBlock *pBlock, SDbObj *pDb, SShowObj *pShow, int32_t rows,
1,973,196✔
2813
                              int64_t numOfTables, bool sysDb, ESdbStatus objStatus, bool sysinfo) {
2814
  int32_t cols = 0;
1,973,196✔
2815
  int32_t bytes = pShow->pMeta->pSchemas[cols].bytes;
1,973,196✔
2816
  char   *buf = taosMemoryMalloc(bytes);
1,973,196✔
2817
  if (buf == NULL) {
1,973,196✔
2818
    mError("db:%s, failed to malloc buffer", pDb->name);
×
2819
    return;
×
2820
  }
2821
  int32_t code = 0;
1,973,196✔
2822
  int32_t lino = 0;
1,973,196✔
2823

2824
  const char *name = mndGetDbStr(pDb->name);
1,973,196✔
2825
  if (name != NULL) {
1,973,196✔
2826
    STR_WITH_MAXSIZE_TO_VARSTR(buf, name, bytes);
1,973,196✔
2827
  } else {
2828
    STR_WITH_MAXSIZE_TO_VARSTR(buf, "NULL", bytes);
×
2829
  }
2830

2831
  const char *precStr = NULL;
1,973,196✔
2832
  switch (pDb->cfg.precision) {
1,973,196✔
2833
    case TSDB_TIME_PRECISION_MILLI:
1,916,326✔
2834
      precStr = TSDB_TIME_PRECISION_MILLI_STR;
1,916,326✔
2835
      break;
1,916,326✔
2836
    case TSDB_TIME_PRECISION_MICRO:
18,915✔
2837
      precStr = TSDB_TIME_PRECISION_MICRO_STR;
18,915✔
2838
      break;
18,915✔
2839
    case TSDB_TIME_PRECISION_NANO:
37,955✔
2840
      precStr = TSDB_TIME_PRECISION_NANO_STR;
37,955✔
2841
      break;
37,955✔
2842
    default:
×
2843
      precStr = "none";
×
2844
      break;
×
2845
  }
2846
  char precVstr[10] = {0};
1,973,196✔
2847
  STR_WITH_MAXSIZE_TO_VARSTR(precVstr, precStr, 10);
1,973,196✔
2848

2849
  char *statusStr = "ready";
1,973,196✔
2850
  if (objStatus == SDB_STATUS_CREATING) {
1,973,196✔
2851
    statusStr = "creating";
×
2852
  } else if (objStatus == SDB_STATUS_DROPPING) {
1,973,196✔
2853
    statusStr = "dropping";
×
2854
  } else {
2855
    if (!sysDb && !mndIsDbReady(pMnode, pDb)) {
1,973,196✔
2856
      statusStr = "unsynced";
1,634✔
2857
    }
2858
  }
2859
  char statusVstr[24] = {0};
1,973,196✔
2860
  STR_WITH_MAXSIZE_TO_VARSTR(statusVstr, statusStr, 24);
1,973,196✔
2861

2862
  if (sysDb || !sysinfo) {
1,973,196✔
2863
    for (int32_t i = 0; i < pShow->numOfColumns; ++i) {
46,783,700✔
2864
      SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, i);
45,552,550✔
2865
      if (i == 0) {
45,552,550✔
2866
        TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, buf, false), &lino, _OVER);
1,231,150✔
2867
      } else if (i == 1) {
44,321,400✔
2868
        TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->createdTime, false), &lino, _OVER);
1,231,150✔
2869
      } else if (i == 3) {
43,090,250✔
2870
        TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&numOfTables, false), &lino, _OVER);
1,231,150✔
2871
      } else if (i == 14) {
41,859,100✔
2872
        TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, precVstr, false), &lino, _OVER);
1,231,150✔
2873
      } else if (i == 15) {
40,627,950✔
2874
        TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, statusVstr, false), &lino, _OVER);
1,231,150✔
2875
      } else {
2876
        colDataSetNULL(pColInfo, rows);
39,396,800✔
2877
      }
2878
    }
2879
  } else {
2880
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2881
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, buf, false), &lino, _OVER);
742,046✔
2882

2883
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2884
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->createdTime, false), &lino, _OVER);
742,046✔
2885

2886
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2887
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.numOfVgroups, false), &lino, _OVER);
742,046✔
2888

2889
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2890
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&numOfTables, false), &lino, _OVER);
742,046✔
2891

2892
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2893
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.replications, false), &lino, _OVER);
742,046✔
2894

2895
    const char *strictStr = pDb->cfg.strict ? "on" : "off";
742,046✔
2896
    char        strictVstr[24] = {0};
742,046✔
2897
    STR_WITH_MAXSIZE_TO_VARSTR(strictVstr, strictStr, 24);
742,046✔
2898
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2899
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)strictVstr, false), &lino, _OVER);
742,046✔
2900

2901
    char    durationStr[128] = {0};
742,046✔
2902
    char    durationVstr[128] = {0};
742,046✔
2903
    int32_t len = formatDurationOrKeep(&durationVstr[VARSTR_HEADER_SIZE], sizeof(durationVstr) - VARSTR_HEADER_SIZE,
742,046✔
2904
                                       pDb->cfg.daysPerFile);
2905

2906
    varDataSetLen(durationVstr, len);
742,046✔
2907
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2908
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)durationVstr, false), &lino, _OVER);
742,046✔
2909

2910
    char keepVstr[128] = {0};
742,046✔
2911
    char keep0Str[32] = {0};
742,046✔
2912
    char keep1Str[32] = {0};
742,046✔
2913
    char keep2Str[32] = {0};
742,046✔
2914

2915
    int32_t lenKeep0 = formatDurationOrKeep(keep0Str, sizeof(keep0Str), pDb->cfg.daysToKeep0);
742,046✔
2916
    int32_t lenKeep1 = formatDurationOrKeep(keep1Str, sizeof(keep1Str), pDb->cfg.daysToKeep1);
742,046✔
2917
    int32_t lenKeep2 = formatDurationOrKeep(keep2Str, sizeof(keep2Str), pDb->cfg.daysToKeep2);
742,046✔
2918

2919
    if (pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep1 || pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep2) {
742,046✔
2920
      len = tsnprintf(&keepVstr[VARSTR_HEADER_SIZE], sizeof(keepVstr), "%s,%s,%s", keep1Str, keep2Str, keep0Str);
×
2921
    } else {
2922
      len = tsnprintf(&keepVstr[VARSTR_HEADER_SIZE], sizeof(keepVstr), "%s,%s,%s", keep0Str, keep1Str, keep2Str);
742,046✔
2923
    }
2924
    varDataSetLen(keepVstr, len);
742,046✔
2925
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2926
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)keepVstr, false), &lino, _OVER);
742,046✔
2927

2928
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2929
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.buffer, false), &lino, _OVER);
742,046✔
2930

2931
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2932
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.pageSize, false), &lino, _OVER);
742,046✔
2933

2934
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2935
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.pages, false), &lino, _OVER);
742,046✔
2936

2937
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2938
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.minRows, false), &lino, _OVER);
742,046✔
2939

2940
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2941
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.maxRows, false), &lino, _OVER);
742,046✔
2942

2943
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2944
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.compression, false), &lino, _OVER);
742,046✔
2945

2946
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2947
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)precVstr, false), &lino, _OVER);
742,046✔
2948

2949
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2950
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)statusVstr, false), &lino, _OVER);
742,046✔
2951

2952
    char *rentensionVstr = buildRetension(pDb->cfg.pRetensions);
742,046✔
2953
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2954
    if (rentensionVstr == NULL) {
742,046✔
2955
      colDataSetNULL(pColInfo, rows);
742,046✔
2956
    } else {
2957
      TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)rentensionVstr, false), &lino, _OVER);
×
2958
      taosMemoryFree(rentensionVstr);
×
2959
    }
2960

2961
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2962
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.numOfStables, false), &lino, _OVER);
742,046✔
2963

2964
    const char *cacheModelStr = getCacheModelStr(pDb->cfg.cacheLast);
742,046✔
2965
    char        cacheModelVstr[24] = {0};
742,046✔
2966
    STR_WITH_MAXSIZE_TO_VARSTR(cacheModelVstr, cacheModelStr, 24);
742,046✔
2967
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2968
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)cacheModelVstr, false), &lino, _OVER);
742,046✔
2969

2970
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2971
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.cacheLastSize, false), &lino, _OVER);
742,046✔
2972

2973
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2974
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.walLevel, false), &lino, _OVER);
742,046✔
2975

2976
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2977
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.walFsyncPeriod, false), &lino, _OVER);
742,046✔
2978

2979
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2980
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.walRetentionPeriod, false), &lino, _OVER);
742,046✔
2981

2982
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2983
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.walRetentionSize, false), &lino, _OVER);
742,046✔
2984

2985
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2986
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.sstTrigger, false), &lino, _OVER);
742,046✔
2987

2988
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2989
    int16_t hashPrefix = pDb->cfg.hashPrefix;
742,046✔
2990
    if (hashPrefix > 0) {
742,046✔
2991
      hashPrefix = pDb->cfg.hashPrefix - strlen(pDb->name) - 1;
4,845✔
2992
    } else if (hashPrefix < 0) {
737,201✔
2993
      hashPrefix = pDb->cfg.hashPrefix + strlen(pDb->name) + 1;
5,440✔
2994
    }
2995
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&hashPrefix, false), &lino, _OVER);
742,046✔
2996

2997
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
2998
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.hashSuffix, false), &lino, _OVER);
742,046✔
2999

3000
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
3001
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.tsdbPageSize, false), &lino, _OVER);
742,046✔
3002

3003
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
3004
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.keepTimeOffset, false), &lino, _OVER);
742,046✔
3005

3006
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
3007
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.ssChunkSize, false), &lino, _OVER);
742,046✔
3008

3009
    char keeplocalVstr[128] = {0};
742,046✔
3010
    len = tsnprintf(&keeplocalVstr[VARSTR_HEADER_SIZE], sizeof(keeplocalVstr), "%dm", pDb->cfg.ssKeepLocal);
742,046✔
3011
    varDataSetLen(keeplocalVstr, len);
742,046✔
3012
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
3013
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)keeplocalVstr, false), &lino, _OVER);
742,046✔
3014

3015
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
3016
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.ssCompact, false), &lino, _OVER);
742,046✔
3017

3018
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
3019
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.withArbitrator, false), &lino, _OVER);
742,046✔
3020

3021
    char encryptAlgorithmStr[TSDB_ENCRYPT_ALGR_NAME_LEN] = {0};
742,046✔
3022
    getEncryptAlgorithmStr(pMnode, pDb->cfg.encryptAlgorithm, encryptAlgorithmStr);
742,046✔
3023
    char        encryptAlgorithmVStr[24] = {0};
742,046✔
3024
    STR_WITH_MAXSIZE_TO_VARSTR(encryptAlgorithmVStr, encryptAlgorithmStr, 24);
742,046✔
3025
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
742,046✔
3026
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)encryptAlgorithmVStr, false), &lino, _OVER);
742,046✔
3027

3028
    TAOS_UNUSED(formatDurationOrKeep(durationStr, sizeof(durationStr), pDb->cfg.compactInterval));
742,046✔
3029
    STR_WITH_MAXSIZE_TO_VARSTR(durationVstr, durationStr, sizeof(durationVstr));
742,046✔
3030
    if ((pColInfo = taosArrayGet(pBlock->pDataBlock, cols++))) {
742,046✔
3031
      TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)durationVstr, false), &lino, _OVER);
742,046✔
3032
    }
3033

3034
    len = formatDurationOrKeep(durationStr, sizeof(durationStr), pDb->cfg.compactStartTime);
742,046✔
3035
    TAOS_UNUSED(formatDurationOrKeep(durationVstr, sizeof(durationVstr), pDb->cfg.compactEndTime));
742,046✔
3036
    TAOS_UNUSED(snprintf(durationStr + len, sizeof(durationStr) - len, ",%s", durationVstr));
742,046✔
3037
    STR_WITH_MAXSIZE_TO_VARSTR(durationVstr, durationStr, sizeof(durationVstr));
742,046✔
3038
    if ((pColInfo = taosArrayGet(pBlock->pDataBlock, cols++))) {
742,046✔
3039
      TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)durationVstr, false), &lino, _OVER);
742,046✔
3040
    }
3041

3042
    TAOS_UNUSED(snprintf(durationStr, sizeof(durationStr), "%dh", pDb->cfg.compactTimeOffset));
742,046✔
3043
    STR_WITH_MAXSIZE_TO_VARSTR(durationVstr, durationStr, sizeof(durationVstr));
742,046✔
3044
    if ((pColInfo = taosArrayGet(pBlock->pDataBlock, cols++))) {
742,046✔
3045
      TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)durationVstr, false), &lino, _OVER);
742,046✔
3046
    }
3047
  }
3048
_OVER:
1,973,196✔
3049
  if (code != 0) mError("failed to retrieve at line:%d, since %s", lino, tstrerror(code));
1,973,196✔
3050
  taosMemoryFree(buf);
1,973,196✔
3051
}
3052

3053
static void setInformationSchemaDbCfg(SMnode *pMnode, SDbObj *pDbObj) {
613,463✔
3054
  tstrncpy(pDbObj->name, TSDB_INFORMATION_SCHEMA_DB, tListLen(pDbObj->name));
613,463✔
3055
  pDbObj->createdTime = mndGetClusterCreateTime(pMnode);
613,463✔
3056
  pDbObj->cfg.numOfVgroups = 0;
613,463✔
3057
  pDbObj->cfg.strict = 1;
613,463✔
3058
  pDbObj->cfg.replications = 1;
613,463✔
3059
  pDbObj->cfg.precision = TSDB_TIME_PRECISION_MILLI;
613,463✔
3060
}
613,463✔
3061

3062
static void setPerfSchemaDbCfg(SMnode *pMnode, SDbObj *pDbObj) {
613,463✔
3063
  tstrncpy(pDbObj->name, TSDB_PERFORMANCE_SCHEMA_DB, tListLen(pDbObj->name));
613,463✔
3064
  pDbObj->createdTime = mndGetClusterCreateTime(pMnode);
613,463✔
3065
  pDbObj->cfg.numOfVgroups = 0;
613,463✔
3066
  pDbObj->cfg.strict = 1;
613,463✔
3067
  pDbObj->cfg.replications = 1;
613,463✔
3068
  pDbObj->cfg.precision = TSDB_TIME_PRECISION_MILLI;
613,463✔
3069
}
613,463✔
3070

3071
static bool mndGetTablesOfDbFp(SMnode *pMnode, void *pObj, void *p1, void *p2, void *p3) {
5,676,753✔
3072
  SVgObj  *pVgroup = pObj;
5,676,753✔
3073
  int32_t *numOfTables = p1;
5,676,753✔
3074
  int64_t  uid = *(int64_t *)p2;
5,676,753✔
3075
  if (pVgroup->dbUid == uid) {
5,676,753✔
3076
    *numOfTables += pVgroup->numOfTables;
1,702,363✔
3077
  }
3078
  return true;
5,676,753✔
3079
}
3080

3081
static int32_t mndRetrieveDbs(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rowsCapacity) {
613,463✔
3082
  SMnode    *pMnode = pReq->info.node;
613,463✔
3083
  SSdb      *pSdb = pMnode->pSdb;
613,463✔
3084
  int32_t    numOfRows = 0;
613,463✔
3085
  SDbObj    *pDb = NULL;
613,463✔
3086
  SUserObj  *pUser = NULL;
613,463✔
3087
  ESdbStatus objStatus = 0;
613,463✔
3088

3089
  (void)mndAcquireUser(pMnode, pReq->info.conn.user, &pUser);
613,463✔
3090
  if (pUser == NULL) return 0;
613,463✔
3091
  bool sysinfo = pUser->sysInfo;
613,463✔
3092

3093
  // Append the information_schema database into the result.
3094
  if (!pShow->sysDbRsp) {
613,463✔
3095
    SDbObj infoschemaDb = {0};
613,463✔
3096
    setInformationSchemaDbCfg(pMnode, &infoschemaDb);
613,463✔
3097
    size_t numOfTables = 0;
613,463✔
3098
    getVisibleInfosTablesNum(sysinfo, &numOfTables);
613,463✔
3099
    mndDumpDbInfoData(pMnode, pBlock, &infoschemaDb, pShow, numOfRows, numOfTables, true, 0, 1);
613,463✔
3100

3101
    numOfRows += 1;
613,463✔
3102

3103
    SDbObj perfschemaDb = {0};
613,463✔
3104
    setPerfSchemaDbCfg(pMnode, &perfschemaDb);
613,463✔
3105
    numOfTables = 0;
613,463✔
3106
    getPerfDbMeta(NULL, &numOfTables);
613,463✔
3107
    mndDumpDbInfoData(pMnode, pBlock, &perfschemaDb, pShow, numOfRows, numOfTables, true, 0, 1);
613,463✔
3108

3109
    numOfRows += 1;
613,463✔
3110
    pShow->sysDbRsp = true;
613,463✔
3111
  }
3112

3113
  while (numOfRows < rowsCapacity) {
1,371,565✔
3114
    pShow->pIter = sdbFetchAll(pSdb, SDB_DB, pShow->pIter, (void **)&pDb, &objStatus, true);
1,371,565✔
3115
    if (pShow->pIter == NULL) break;
1,371,565✔
3116

3117
    if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_READ_OR_WRITE_DB, pDb) == 0) {
758,102✔
3118
      int32_t numOfTables = 0;
746,270✔
3119
      sdbTraverse(pSdb, SDB_VGROUP, mndGetTablesOfDbFp, &numOfTables, &pDb->uid, NULL);
746,270✔
3120
      mndDumpDbInfoData(pMnode, pBlock, pDb, pShow, numOfRows, numOfTables, false, objStatus, sysinfo);
746,270✔
3121
      numOfRows++;
746,270✔
3122
    }
3123

3124
    sdbRelease(pSdb, pDb);
758,102✔
3125
  }
3126

3127
  pShow->numOfRows += numOfRows;
613,463✔
3128
  mndReleaseUser(pMnode, pUser);
613,463✔
3129
  return numOfRows;
613,463✔
3130
}
3131

3132
static void mndCancelGetNextDb(SMnode *pMnode, void *pIter) {
×
3133
  SSdb *pSdb = pMnode->pSdb;
×
3134
  sdbCancelFetchByType(pSdb, pIter, SDB_DB);
×
3135
}
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc