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

taosdata / TDengine / #3660

15 Mar 2025 09:06AM UTC coverage: 62.039% (-1.3%) from 63.314%
#3660

push

travis-ci

web-flow
feat(stream): support stream processing for virtual tables (#30144)

* enh: add client processing

* enh: add mnode vtables processing

* enh: add mnode vtable processing

* enh: add normal child vtable support

* fix: compile issues

* fix: compile issues

* fix: create stream issues

* fix: multi stream scan issue

* fix: remove debug info

* fix: agg task and task level issues

* fix: correct task output type

* fix: split vtablescan from agg

* fix: memory leak issues

* fix: add limitations

* Update 09-error-code.md

* Update 09-error-code.md

* fix: remove usless case

* feat(stream): extract original table data in source scan task

Implemented functionality in the source task to extract data
corresponding to the virtual table from the original table using WAL.
The extracted data is then sent to the downstream merge task for further
processing.

* feat(stream): multi-way merge using loser tree in virtual merge task

Implemented multi-way merge in the merge task using a loser tree to
combine data from multiple original table into a single virtual table.
The merged virtual table data is then pushed downstream for further
processing.  Introduced memory limit handling during the merge process
with configurable behavior when the memory limit is reached.

* fix(test): remove useless cases

---------

Co-authored-by: dapan1121 <wpan@taosdata.com>
Co-authored-by: Pan Wei <72057773+dapan1121@users.noreply.github.com>

154078 of 317582 branches covered (48.52%)

Branch coverage included in aggregate %.

313 of 2391 new or added lines in 34 files covered. (13.09%)

26134 existing lines in 205 files now uncovered.

240261 of 318051 relevant lines covered (75.54%)

16655189.27 hits per line

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

67.23
/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 "audit.h"
18
#include "command.h"
19
#include "mndArbGroup.h"
20
#include "mndCluster.h"
21
#include "mndConfig.h"
22
#include "mndDb.h"
23
#include "mndDnode.h"
24
#include "mndIndex.h"
25
#include "mndPrivilege.h"
26
#include "mndShow.h"
27
#include "mndSma.h"
28
#include "mndStb.h"
29
#include "mndStream.h"
30
#include "mndSubscribe.h"
31
#include "mndTopic.h"
32
#include "mndTrans.h"
33
#include "mndUser.h"
34
#include "mndVgroup.h"
35
#include "mndView.h"
36
#include "systable.h"
37
#include "thttp.h"
38
#include "tjson.h"
39

40
#define DB_VER_NUMBER   1
41
#define DB_RESERVE_SIZE 14
42

43
static SSdbRow *mndDbActionDecode(SSdbRaw *pRaw);
44
static int32_t  mndDbActionInsert(SSdb *pSdb, SDbObj *pDb);
45
static int32_t  mndDbActionDelete(SSdb *pSdb, SDbObj *pDb);
46
static int32_t  mndDbActionUpdate(SSdb *pSdb, SDbObj *pOld, SDbObj *pNew);
47
static int32_t  mndNewDbActionValidate(SMnode *pMnode, STrans *pTrans, SSdbRaw *pRaw);
48

49
static int32_t mndProcessCreateDbReq(SRpcMsg *pReq);
50
static int32_t mndProcessAlterDbReq(SRpcMsg *pReq);
51
static int32_t mndProcessDropDbReq(SRpcMsg *pReq);
52
static int32_t mndProcessUseDbReq(SRpcMsg *pReq);
53
static int32_t mndProcessTrimDbReq(SRpcMsg *pReq);
54
static int32_t mndProcessS3MigrateDbReq(SRpcMsg *pReq);
55
static int32_t mndRetrieveDbs(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rowsCapacity);
56
static void    mndCancelGetNextDb(SMnode *pMnode, void *pIter);
57
static int32_t mndProcessGetDbCfgReq(SRpcMsg *pReq);
58

59
#ifndef TD_ENTERPRISE
60
int32_t mndProcessCompactDbReq(SRpcMsg *pReq) { return TSDB_CODE_OPS_NOT_SUPPORT; }
61
#endif
62

63
int32_t mndInitDb(SMnode *pMnode) {
1,748✔
64
  SSdbTable table = {
1,748✔
65
      .sdbType = SDB_DB,
66
      .keyType = SDB_KEY_BINARY,
67
      .encodeFp = (SdbEncodeFp)mndDbActionEncode,
68
      .decodeFp = (SdbDecodeFp)mndDbActionDecode,
69
      .insertFp = (SdbInsertFp)mndDbActionInsert,
70
      .updateFp = (SdbUpdateFp)mndDbActionUpdate,
71
      .deleteFp = (SdbDeleteFp)mndDbActionDelete,
72
      .validateFp = (SdbValidateFp)mndNewDbActionValidate,
73
  };
74

75
  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_DB, mndProcessCreateDbReq);
1,748✔
76
  mndSetMsgHandle(pMnode, TDMT_MND_ALTER_DB, mndProcessAlterDbReq);
1,748✔
77
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_DB, mndProcessDropDbReq);
1,748✔
78
  mndSetMsgHandle(pMnode, TDMT_MND_USE_DB, mndProcessUseDbReq);
1,748✔
79
  mndSetMsgHandle(pMnode, TDMT_MND_COMPACT_DB, mndProcessCompactDbReq);
1,748✔
80
  mndSetMsgHandle(pMnode, TDMT_MND_TRIM_DB, mndProcessTrimDbReq);
1,748✔
81
  mndSetMsgHandle(pMnode, TDMT_MND_GET_DB_CFG, mndProcessGetDbCfgReq);
1,748✔
82
  mndSetMsgHandle(pMnode, TDMT_MND_S3MIGRATE_DB, mndProcessS3MigrateDbReq);
1,748✔
83
  mndSetMsgHandle(pMnode, TDMT_MND_GET_DB_INFO, mndProcessUseDbReq);
1,748✔
84

85
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_DB, mndRetrieveDbs);
1,748✔
86
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_DB, mndCancelGetNextDb);
1,748✔
87

88
  return sdbSetTable(pMnode->pSdb, table);
1,748✔
89
}
90

91
void mndCleanupDb(SMnode *pMnode) {}
1,747✔
92

93
SSdbRaw *mndDbActionEncode(SDbObj *pDb) {
21,231✔
94
  int32_t code = 0;
21,231✔
95
  int32_t lino = 0;
21,231✔
96
  terrno = TSDB_CODE_OUT_OF_MEMORY;
21,231✔
97

98
  int32_t  size = sizeof(SDbObj) + pDb->cfg.numOfRetensions * sizeof(SRetention) + DB_RESERVE_SIZE;
21,231✔
99
  SSdbRaw *pRaw = sdbAllocRaw(SDB_DB, DB_VER_NUMBER, size);
21,231✔
100
  if (pRaw == NULL) goto _OVER;
21,231!
101

102
  int32_t dataPos = 0;
21,231✔
103
  SDB_SET_BINARY(pRaw, dataPos, pDb->name, TSDB_DB_FNAME_LEN, _OVER)
21,231!
104
  SDB_SET_BINARY(pRaw, dataPos, pDb->acct, TSDB_USER_LEN, _OVER)
21,231!
105
  SDB_SET_BINARY(pRaw, dataPos, pDb->createUser, TSDB_USER_LEN, _OVER)
21,231!
106
  SDB_SET_INT64(pRaw, dataPos, pDb->createdTime, _OVER)
21,231!
107
  SDB_SET_INT64(pRaw, dataPos, pDb->updateTime, _OVER)
21,231!
108
  SDB_SET_INT64(pRaw, dataPos, pDb->uid, _OVER)
21,231!
109
  SDB_SET_INT32(pRaw, dataPos, pDb->cfgVersion, _OVER)
21,231!
110
  SDB_SET_INT32(pRaw, dataPos, pDb->vgVersion, _OVER)
21,231!
111
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.numOfVgroups, _OVER)
21,231!
112
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.numOfStables, _OVER)
21,231!
113
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.buffer, _OVER)
21,231!
114
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.pageSize, _OVER)
21,231!
115
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.pages, _OVER)
21,231!
116
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.cacheLastSize, _OVER)
21,231!
117
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.daysPerFile, _OVER)
21,231!
118
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.daysToKeep0, _OVER)
21,231!
119
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.daysToKeep1, _OVER)
21,231!
120
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.daysToKeep2, _OVER)
21,231!
121
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.minRows, _OVER)
21,231!
122
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.maxRows, _OVER)
21,231!
123
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.walFsyncPeriod, _OVER)
21,231!
124
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.walLevel, _OVER)
21,231!
125
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.precision, _OVER)
21,231!
126
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.compression, _OVER)
21,231!
127
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.replications, _OVER)
21,231!
128
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.strict, _OVER)
21,231!
129
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.cacheLast, _OVER)
21,231!
130
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.hashMethod, _OVER)
21,231!
131
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.numOfRetensions, _OVER)
21,231!
132
  for (int32_t i = 0; i < pDb->cfg.numOfRetensions; ++i) {
21,285✔
133
    SRetention *pRetension = taosArrayGet(pDb->cfg.pRetensions, i);
54✔
134
    SDB_SET_INT64(pRaw, dataPos, pRetension->freq, _OVER)
54!
135
    SDB_SET_INT64(pRaw, dataPos, pRetension->keep, _OVER)
54!
136
    SDB_SET_INT8(pRaw, dataPos, pRetension->freqUnit, _OVER)
54!
137
    SDB_SET_INT8(pRaw, dataPos, pRetension->keepUnit, _OVER)
54!
138
  }
139
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.schemaless, _OVER)
21,231!
140
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.walRetentionPeriod, _OVER)
21,231!
141
  SDB_SET_INT64(pRaw, dataPos, pDb->cfg.walRetentionSize, _OVER)
21,231!
142
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.walRollPeriod, _OVER)
21,231!
143
  SDB_SET_INT64(pRaw, dataPos, pDb->cfg.walSegmentSize, _OVER)
21,231!
144
  SDB_SET_INT16(pRaw, dataPos, pDb->cfg.sstTrigger, _OVER)
21,231!
145
  SDB_SET_INT16(pRaw, dataPos, pDb->cfg.hashPrefix, _OVER)
21,231!
146
  SDB_SET_INT16(pRaw, dataPos, pDb->cfg.hashSuffix, _OVER)
21,231!
147
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.tsdbPageSize, _OVER)
21,231!
148
  SDB_SET_INT64(pRaw, dataPos, pDb->compactStartTime, _OVER)
21,231!
149
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.keepTimeOffset, _OVER)
21,231!
150
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.s3ChunkSize, _OVER)
21,231!
151
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.s3KeepLocal, _OVER)
21,231!
152
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.s3Compact, _OVER)
21,231!
153
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.withArbitrator, _OVER)
21,231!
154
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.encryptAlgorithm, _OVER)
21,231!
155
  SDB_SET_INT32(pRaw, dataPos, pDb->tsmaVersion, _OVER);
21,231!
156
  SDB_SET_INT8(pRaw, dataPos, pDb->cfg.compactTimeOffset, _OVER)
21,231!
157
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.compactStartTime, _OVER)
21,231!
158
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.compactEndTime, _OVER)
21,231!
159
  SDB_SET_INT32(pRaw, dataPos, pDb->cfg.compactInterval, _OVER)
21,231!
160

161
  SDB_SET_RESERVE(pRaw, dataPos, DB_RESERVE_SIZE, _OVER)
21,231!
162
  SDB_SET_DATALEN(pRaw, dataPos, _OVER)
21,231!
163

164
  terrno = 0;
21,231✔
165

166
_OVER:
21,231✔
167
  if (terrno != 0) {
21,231!
168
    mError("db:%s, failed to encode to raw:%p since %s", pDb->name, pRaw, terrstr());
×
169
    sdbFreeRaw(pRaw);
×
UNCOV
170
    return NULL;
×
171
  }
172

173
  mTrace("db:%s, encode to raw:%p, row:%p", pDb->name, pRaw, pDb);
21,231✔
174
  return pRaw;
21,231✔
175
}
176

177
static SSdbRow *mndDbActionDecode(SSdbRaw *pRaw) {
17,906✔
178
  int32_t code = 0;
17,906✔
179
  int32_t lino = 0;
17,906✔
180
  terrno = TSDB_CODE_OUT_OF_MEMORY;
17,906✔
181
  SSdbRow *pRow = NULL;
17,906✔
182
  SDbObj  *pDb = NULL;
17,906✔
183

184
  int8_t sver = 0;
17,906✔
185
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
17,906!
186

187
  if (sver != DB_VER_NUMBER) {
17,906!
188
    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
×
UNCOV
189
    goto _OVER;
×
190
  }
191

192
  pRow = sdbAllocRow(sizeof(SDbObj));
17,906✔
193
  if (pRow == NULL) goto _OVER;
17,906!
194

195
  pDb = sdbGetRowObj(pRow);
17,906✔
196
  if (pDb == NULL) goto _OVER;
17,906!
197

198
  int32_t dataPos = 0;
17,906✔
199
  SDB_GET_BINARY(pRaw, dataPos, pDb->name, TSDB_DB_FNAME_LEN, _OVER)
17,906!
200
  SDB_GET_BINARY(pRaw, dataPos, pDb->acct, TSDB_USER_LEN, _OVER)
17,906!
201
  SDB_GET_BINARY(pRaw, dataPos, pDb->createUser, TSDB_USER_LEN, _OVER)
17,906!
202
  SDB_GET_INT64(pRaw, dataPos, &pDb->createdTime, _OVER)
17,906!
203
  SDB_GET_INT64(pRaw, dataPos, &pDb->updateTime, _OVER)
17,906!
204
  SDB_GET_INT64(pRaw, dataPos, &pDb->uid, _OVER)
17,906!
205
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfgVersion, _OVER)
17,906!
206
  SDB_GET_INT32(pRaw, dataPos, &pDb->vgVersion, _OVER)
17,906!
207
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.numOfVgroups, _OVER)
17,906!
208
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.numOfStables, _OVER)
17,906!
209
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.buffer, _OVER)
17,906!
210
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.pageSize, _OVER)
17,906!
211
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.pages, _OVER)
17,906!
212
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.cacheLastSize, _OVER)
17,906!
213
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysPerFile, _OVER)
17,906!
214
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysToKeep0, _OVER)
17,906!
215
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysToKeep1, _OVER)
17,906!
216
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysToKeep2, _OVER)
17,906!
217
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.minRows, _OVER)
17,906!
218
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.maxRows, _OVER)
17,906!
219
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.walFsyncPeriod, _OVER)
17,906!
220
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.walLevel, _OVER)
17,906!
221
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.precision, _OVER)
17,906!
222
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.compression, _OVER)
17,906!
223
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.replications, _OVER)
17,906!
224
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.strict, _OVER)
17,906!
225
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.cacheLast, _OVER)
17,906!
226
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.hashMethod, _OVER)
17,906!
227
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.numOfRetensions, _OVER)
17,906!
228
  if (pDb->cfg.numOfRetensions > 0) {
17,906✔
229
    pDb->cfg.pRetensions = taosArrayInit(pDb->cfg.numOfRetensions, sizeof(SRetention));
16✔
230
    if (pDb->cfg.pRetensions == NULL) goto _OVER;
16!
231
    for (int32_t i = 0; i < pDb->cfg.numOfRetensions; ++i) {
64✔
232
      SRetention retention = {0};
48✔
233
      SDB_GET_INT64(pRaw, dataPos, &retention.freq, _OVER)
48!
234
      SDB_GET_INT64(pRaw, dataPos, &retention.keep, _OVER)
48!
235
      SDB_GET_INT8(pRaw, dataPos, &retention.freqUnit, _OVER)
48!
236
      SDB_GET_INT8(pRaw, dataPos, &retention.keepUnit, _OVER)
48!
237
      if (taosArrayPush(pDb->cfg.pRetensions, &retention) == NULL) {
96!
UNCOV
238
        goto _OVER;
×
239
      }
240
    }
241
  }
242
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.schemaless, _OVER)
17,906!
243
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.walRetentionPeriod, _OVER)
17,906!
244
  SDB_GET_INT64(pRaw, dataPos, &pDb->cfg.walRetentionSize, _OVER)
17,906!
245
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.walRollPeriod, _OVER)
17,906!
246
  SDB_GET_INT64(pRaw, dataPos, &pDb->cfg.walSegmentSize, _OVER)
17,906!
247
  SDB_GET_INT16(pRaw, dataPos, &pDb->cfg.sstTrigger, _OVER)
17,906!
248
  SDB_GET_INT16(pRaw, dataPos, &pDb->cfg.hashPrefix, _OVER)
17,906!
249
  SDB_GET_INT16(pRaw, dataPos, &pDb->cfg.hashSuffix, _OVER)
17,906!
250
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.tsdbPageSize, _OVER)
17,906!
251
  SDB_GET_INT64(pRaw, dataPos, &pDb->compactStartTime, _OVER)
17,906!
252
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.keepTimeOffset, _OVER)
17,906!
253
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.s3ChunkSize, _OVER)
17,906!
254
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.s3KeepLocal, _OVER)
17,906!
255
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.s3Compact, _OVER)
17,906!
256
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.withArbitrator, _OVER)
17,906!
257
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.encryptAlgorithm, _OVER)
17,906!
258
  SDB_GET_INT32(pRaw, dataPos, &pDb->tsmaVersion, _OVER);
17,906!
259
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.compactTimeOffset, _OVER)
17,906!
260
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.compactStartTime, _OVER)
17,906!
261
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.compactEndTime, _OVER)
17,906!
262
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.compactInterval, _OVER)
17,906!
263

264
  SDB_GET_RESERVE(pRaw, dataPos, DB_RESERVE_SIZE, _OVER)
17,906!
265
  taosInitRWLatch(&pDb->lock);
17,906✔
266

267
  if (pDb->cfg.s3ChunkSize == 0) {
17,906!
UNCOV
268
    pDb->cfg.s3ChunkSize = TSDB_DEFAULT_S3_CHUNK_SIZE;
×
269

UNCOV
270
    mInfo("db:%s, s3ChunkSize set from %d to default %d", pDb->name, pDb->cfg.s3ChunkSize, TSDB_DEFAULT_S3_CHUNK_SIZE);
×
271
  }
272

273
  if (pDb->cfg.s3KeepLocal == 0) {
17,906!
UNCOV
274
    pDb->cfg.s3KeepLocal = TSDB_DEFAULT_S3_KEEP_LOCAL;
×
275

UNCOV
276
    mInfo("db:%s, s3KeepLocal set from %d to default %d", pDb->name, pDb->cfg.s3KeepLocal, TSDB_DEFAULT_S3_KEEP_LOCAL);
×
277
  }
278

279
  if (pDb->cfg.tsdbPageSize != TSDB_MIN_TSDB_PAGESIZE) {
17,906!
280
    mInfo("db:%s, tsdbPageSize set from %d to default %d", pDb->name, pDb->cfg.tsdbPageSize,
17,906!
281
          TSDB_DEFAULT_TSDB_PAGESIZE);
282
  }
283

284
  if (pDb->cfg.sstTrigger != TSDB_MIN_STT_TRIGGER) {
17,906✔
285
    mInfo("db:%s, sstTrigger set from %d to default %d", pDb->name, pDb->cfg.sstTrigger, TSDB_DEFAULT_SST_TRIGGER);
16,631!
286
  }
287

288
  terrno = 0;
17,906✔
289

290
_OVER:
17,906✔
291
  if (terrno != 0) {
17,906!
292
    mError("db:%s, failed to decode from raw:%p since %s", pDb == NULL ? "null" : pDb->name, pRaw, terrstr());
×
293
    taosMemoryFreeClear(pRow);
×
UNCOV
294
    return NULL;
×
295
  }
296

297
  mTrace("db:%s, decode from raw:%p, row:%p", pDb->name, pRaw, pDb);
17,906✔
298
  return pRow;
17,906✔
299
}
300

301
static int32_t mndNewDbActionValidate(SMnode *pMnode, STrans *pTrans, SSdbRaw *pRaw) {
4,103✔
302
  SSdb    *pSdb = pMnode->pSdb;
4,103✔
303
  SSdbRow *pRow = NULL;
4,103✔
304
  SDbObj  *pNewDb = NULL;
4,103✔
305
  int      code = -1;
4,103✔
306

307
  pRow = mndDbActionDecode(pRaw);
4,103✔
308
  if (pRow == NULL) {
4,103!
309
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
310
    if (terrno != 0) code = terrno;
×
UNCOV
311
    goto _OVER;
×
312
  }
313
  pNewDb = sdbGetRowObj(pRow);
4,103✔
314
  if (pNewDb == NULL) {
4,103!
315
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
316
    if (terrno != 0) code = terrno;
×
UNCOV
317
    goto _OVER;
×
318
  }
319

320
  SDbObj *pOldDb = sdbAcquire(pMnode->pSdb, SDB_DB, pNewDb->name);
4,103✔
321
  if (pOldDb != NULL) {
4,103!
322
    mError("trans:%d, db name already in use. name: %s", pTrans->id, pNewDb->name);
×
323
    sdbRelease(pMnode->pSdb, pOldDb);
×
324
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
325
    if (terrno != 0) code = terrno;
×
UNCOV
326
    goto _OVER;
×
327
  }
328

329
  code = 0;
4,103✔
330
_OVER:
4,103✔
331
  if (pNewDb) mndDbActionDelete(pSdb, pNewDb);
4,103!
332
  taosMemoryFreeClear(pRow);
4,103!
333
  return code;
4,103✔
334
}
335

336
static int32_t mndDbActionInsert(SSdb *pSdb, SDbObj *pDb) {
4,494✔
337
  mTrace("db:%s, perform insert action, row:%p", pDb->name, pDb);
4,494✔
338
  return 0;
4,494✔
339
}
340

341
static int32_t mndDbActionDelete(SSdb *pSdb, SDbObj *pDb) {
17,906✔
342
  mTrace("db:%s, perform delete action, row:%p", pDb->name, pDb);
17,906✔
343
  taosArrayDestroy(pDb->cfg.pRetensions);
17,906✔
344
  return 0;
17,906✔
345
}
346

347
static int32_t mndDbActionUpdate(SSdb *pSdb, SDbObj *pOld, SDbObj *pNew) {
7,368✔
348
  mTrace("db:%s, perform update action, old row:%p new row:%p", pOld->name, pOld, pNew);
7,368✔
349
  taosWLockLatch(&pOld->lock);
7,368✔
350
  pOld->updateTime = pNew->updateTime;
7,368✔
351
  pOld->cfgVersion = pNew->cfgVersion;
7,368✔
352
  pOld->vgVersion = pNew->vgVersion;
7,368✔
353
  pOld->cfg.numOfVgroups = pNew->cfg.numOfVgroups;
7,368✔
354
  pOld->cfg.buffer = pNew->cfg.buffer;
7,368✔
355
  pOld->cfg.pageSize = pNew->cfg.pageSize;
7,368✔
356
  pOld->cfg.pages = pNew->cfg.pages;
7,368✔
357
  pOld->cfg.cacheLastSize = pNew->cfg.cacheLastSize;
7,368✔
358
  pOld->cfg.daysPerFile = pNew->cfg.daysPerFile;
7,368✔
359
  pOld->cfg.daysToKeep0 = pNew->cfg.daysToKeep0;
7,368✔
360
  pOld->cfg.daysToKeep1 = pNew->cfg.daysToKeep1;
7,368✔
361
  pOld->cfg.daysToKeep2 = pNew->cfg.daysToKeep2;
7,368✔
362
  pOld->cfg.keepTimeOffset = pNew->cfg.keepTimeOffset;
7,368✔
363
  pOld->cfg.walFsyncPeriod = pNew->cfg.walFsyncPeriod;
7,368✔
364
  pOld->cfg.walLevel = pNew->cfg.walLevel;
7,368✔
365
  pOld->cfg.walRetentionPeriod = pNew->cfg.walRetentionPeriod;
7,368✔
366
  pOld->cfg.walRetentionSize = pNew->cfg.walRetentionSize;
7,368✔
367
  pOld->cfg.strict = pNew->cfg.strict;
7,368✔
368
  pOld->cfg.cacheLast = pNew->cfg.cacheLast;
7,368✔
369
  pOld->cfg.replications = pNew->cfg.replications;
7,368✔
370
  pOld->cfg.sstTrigger = pNew->cfg.sstTrigger;
7,368✔
371
  pOld->cfg.minRows = pNew->cfg.minRows;
7,368✔
372
  pOld->cfg.maxRows = pNew->cfg.maxRows;
7,368✔
373
  pOld->cfg.tsdbPageSize = pNew->cfg.tsdbPageSize;
7,368✔
374
  pOld->cfg.s3ChunkSize = pNew->cfg.s3ChunkSize;
7,368✔
375
  pOld->cfg.s3KeepLocal = pNew->cfg.s3KeepLocal;
7,368✔
376
  pOld->cfg.s3Compact = pNew->cfg.s3Compact;
7,368✔
377
  pOld->cfg.withArbitrator = pNew->cfg.withArbitrator;
7,368✔
378
  pOld->cfg.compactInterval = pNew->cfg.compactInterval;
7,368✔
379
  pOld->cfg.compactStartTime = pNew->cfg.compactStartTime;
7,368✔
380
  pOld->cfg.compactEndTime = pNew->cfg.compactEndTime;
7,368✔
381
  pOld->cfg.compactTimeOffset = pNew->cfg.compactTimeOffset;
7,368✔
382
  pOld->compactStartTime = pNew->compactStartTime;
7,368✔
383
  pOld->tsmaVersion = pNew->tsmaVersion;
7,368✔
384
  taosWUnLockLatch(&pOld->lock);
7,368✔
385
  return 0;
7,368✔
386
}
387

388
static inline int32_t mndGetGlobalVgroupVersion(SMnode *pMnode) {
298,800✔
389
  SSdb *pSdb = pMnode->pSdb;
298,800✔
390
  return sdbGetTableVer(pSdb, SDB_VGROUP);
298,800✔
391
}
392

393
SDbObj *mndAcquireDb(SMnode *pMnode, const char *db) {
3,642,528✔
394
  SSdb   *pSdb = pMnode->pSdb;
3,642,528✔
395
  SDbObj *pDb = sdbAcquire(pSdb, SDB_DB, db);
3,642,528✔
396
  if (pDb == NULL) {
3,642,600✔
397
    if (terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
8,978✔
398
      terrno = TSDB_CODE_MND_DB_NOT_EXIST;
7,065✔
399
    } else if (terrno == TSDB_CODE_SDB_OBJ_CREATING) {
1,913✔
400
      terrno = TSDB_CODE_MND_DB_IN_CREATING;
61✔
401
    } else if (terrno == TSDB_CODE_SDB_OBJ_DROPPING) {
1,852!
402
      terrno = TSDB_CODE_MND_DB_IN_DROPPING;
1,852✔
403
    } else {
404
      terrno = TSDB_CODE_APP_ERROR;
×
UNCOV
405
      mFatal("db:%s, failed to acquire db since %s", db, terrstr());
×
406
    }
407
  }
408
  return pDb;
3,642,561✔
409
}
410

411
void mndReleaseDb(SMnode *pMnode, SDbObj *pDb) {
4,041,307✔
412
  SSdb *pSdb = pMnode->pSdb;
4,041,307✔
413
  sdbRelease(pSdb, pDb);
4,041,307✔
414
}
4,041,364✔
415

416
bool mndDbIsExist(SMnode *pMnode, const char *db) {
13✔
417
  SDbObj *pDb = mndAcquireDb(pMnode, db);
13✔
418
  if (pDb == NULL) {
13!
UNCOV
419
    return false;
×
420
  } else {
421
    mndReleaseDb(pMnode, pDb);
13✔
422
    pDb = NULL;
13✔
423
    return true;
13✔
424
  }
425
}
426

427
static int32_t mndCheckDbName(const char *dbName, SUserObj *pUser) {
4,373✔
428
  char *pos = strstr(dbName, TS_PATH_DELIMITER);
4,373✔
429
  if (pos == NULL) {
4,373!
UNCOV
430
    return TSDB_CODE_MND_INVALID_DB;
×
431
  }
432

433
  int32_t acctId;
434
  int32_t code = taosStr2int32(dbName, &acctId);
4,373✔
435
  if (code != 0) {
4,373!
UNCOV
436
    return code;
×
437
  }
438

439
  if (acctId != pUser->acctId) {
4,373!
UNCOV
440
    return TSDB_CODE_MND_INVALID_DB_ACCT;
×
441
  }
442

443
  return 0;
4,373✔
444
}
445

446
static int32_t mndCheckDbCfg(SMnode *pMnode, SDbCfg *pCfg) {
4,373✔
447
  int32_t code = TSDB_CODE_MND_INVALID_DB_OPTION;
4,373✔
448

449
  if (pCfg->numOfVgroups < TSDB_MIN_VNODES_PER_DB || pCfg->numOfVgroups > TSDB_MAX_VNODES_PER_DB) return code;
4,373!
450
  if (pCfg->numOfStables < TSDB_DB_STREAM_MODE_OFF || pCfg->numOfStables > TSDB_DB_STREAM_MODE_ON) return code;
4,373!
451
  if (pCfg->buffer < TSDB_MIN_BUFFER_PER_VNODE || pCfg->buffer > TSDB_MAX_BUFFER_PER_VNODE) return code;
4,373!
452
  if (pCfg->pageSize < TSDB_MIN_PAGESIZE_PER_VNODE || pCfg->pageSize > TSDB_MAX_PAGESIZE_PER_VNODE) return code;
4,373!
453
  if (pCfg->pages < TSDB_MIN_PAGES_PER_VNODE || pCfg->pages > TSDB_MAX_PAGES_PER_VNODE) return code;
4,373!
454
  if (pCfg->cacheLastSize < TSDB_MIN_DB_CACHE_SIZE || pCfg->cacheLastSize > TSDB_MAX_DB_CACHE_SIZE) return code;
4,373!
455
  if (pCfg->daysPerFile < TSDB_MIN_DAYS_PER_FILE || pCfg->daysPerFile > TSDB_MAX_DAYS_PER_FILE) return code;
4,373!
456
  if (pCfg->daysToKeep0 < TSDB_MIN_KEEP || pCfg->daysToKeep0 > TSDB_MAX_KEEP) return code;
4,373!
457
  if (pCfg->daysToKeep1 < TSDB_MIN_KEEP || pCfg->daysToKeep1 > TSDB_MAX_KEEP) return code;
4,373!
458
  if (pCfg->daysToKeep2 < TSDB_MIN_KEEP || pCfg->daysToKeep2 > TSDB_MAX_KEEP) return code;
4,373!
459
  if (pCfg->daysToKeep0 < pCfg->daysPerFile) return code;
4,373!
460
  if (pCfg->daysToKeep0 > pCfg->daysToKeep1) return code;
4,373!
461
  if (pCfg->daysToKeep1 > pCfg->daysToKeep2) return code;
4,373!
462
  if (pCfg->keepTimeOffset < TSDB_MIN_KEEP_TIME_OFFSET || pCfg->keepTimeOffset > TSDB_MAX_KEEP_TIME_OFFSET) return code;
4,373!
463
  if (pCfg->minRows < TSDB_MIN_MINROWS_FBLOCK || pCfg->minRows > TSDB_MAX_MINROWS_FBLOCK) return code;
4,373!
464
  if (pCfg->maxRows < TSDB_MIN_MAXROWS_FBLOCK || pCfg->maxRows > TSDB_MAX_MAXROWS_FBLOCK) return code;
4,373!
465
  if (pCfg->minRows > pCfg->maxRows) return code;
4,373✔
466
  if (pCfg->walFsyncPeriod < TSDB_MIN_FSYNC_PERIOD || pCfg->walFsyncPeriod > TSDB_MAX_FSYNC_PERIOD) return code;
4,372!
467
  if (pCfg->walLevel < TSDB_MIN_WAL_LEVEL || pCfg->walLevel > TSDB_MAX_WAL_LEVEL) return code;
4,372!
468
  if (pCfg->precision < TSDB_MIN_PRECISION && pCfg->precision > TSDB_MAX_PRECISION) return code;
4,372!
469
  if (pCfg->compression < TSDB_MIN_COMP_LEVEL || pCfg->compression > TSDB_MAX_COMP_LEVEL) return code;
4,372!
470
  if (pCfg->replications < TSDB_MIN_DB_REPLICA || pCfg->replications > TSDB_MAX_DB_REPLICA) return code;
4,372!
471
#ifdef TD_ENTERPRISE
472
  if ((pCfg->replications == 2) ^ (pCfg->withArbitrator == TSDB_MAX_DB_WITH_ARBITRATOR)) return code;
4,372!
473
  if (pCfg->encryptAlgorithm < TSDB_MIN_ENCRYPT_ALGO || pCfg->encryptAlgorithm > TSDB_MAX_ENCRYPT_ALGO) return code;
4,372!
474
#else
475
  if (pCfg->replications != 1 && pCfg->replications != 3) return code;
476
  if (pCfg->encryptAlgorithm != TSDB_DEFAULT_ENCRYPT_ALGO) return code;
477
#endif
478

479
  if (pCfg->strict < TSDB_DB_STRICT_OFF || pCfg->strict > TSDB_DB_STRICT_ON) return code;
4,372!
480
  if (pCfg->schemaless < TSDB_DB_SCHEMALESS_OFF || pCfg->schemaless > TSDB_DB_SCHEMALESS_ON) return code;
4,372!
481
  if (pCfg->cacheLast < TSDB_CACHE_MODEL_NONE || pCfg->cacheLast > TSDB_CACHE_MODEL_BOTH) return code;
4,372!
482
  if (pCfg->hashMethod != 1) return code;
4,372!
483
  if (pCfg->replications > mndGetDnodeSize(pMnode)) {
4,372!
484
    code = TSDB_CODE_MND_NO_ENOUGH_DNODES;
×
UNCOV
485
    TAOS_RETURN(code);
×
486
  }
487
  if (pCfg->walRetentionPeriod < TSDB_DB_MIN_WAL_RETENTION_PERIOD) return code;
4,372!
488
  if (pCfg->walRetentionSize < TSDB_DB_MIN_WAL_RETENTION_SIZE) return code;
4,372!
489
  if (pCfg->walRollPeriod < TSDB_DB_MIN_WAL_ROLL_PERIOD) return code;
4,372!
490
  if (pCfg->walSegmentSize < TSDB_DB_MIN_WAL_SEGMENT_SIZE) return code;
4,372!
491
  if (pCfg->sstTrigger < TSDB_MIN_STT_TRIGGER || pCfg->sstTrigger > TSDB_MAX_STT_TRIGGER) return code;
4,372!
492
  if (pCfg->hashPrefix < TSDB_MIN_HASH_PREFIX || pCfg->hashPrefix > TSDB_MAX_HASH_PREFIX) return code;
4,372!
493
  if (pCfg->hashSuffix < TSDB_MIN_HASH_SUFFIX || pCfg->hashSuffix > TSDB_MAX_HASH_SUFFIX) return code;
4,372!
494
  if ((pCfg->hashSuffix * pCfg->hashPrefix) < 0) return code;
4,372!
495
  if ((pCfg->hashPrefix + pCfg->hashSuffix) >= (TSDB_TABLE_NAME_LEN - 1)) return code;
4,372!
496
  if (pCfg->tsdbPageSize < TSDB_MIN_TSDB_PAGESIZE || pCfg->tsdbPageSize > TSDB_MAX_TSDB_PAGESIZE) return code;
4,372!
497
  if (taosArrayGetSize(pCfg->pRetensions) != pCfg->numOfRetensions) return code;
4,372!
498

499
  if (pCfg->s3ChunkSize < TSDB_MIN_S3_CHUNK_SIZE || pCfg->s3ChunkSize > TSDB_MAX_S3_CHUNK_SIZE) return code;
4,372!
500
  if (pCfg->s3KeepLocal < TSDB_MIN_S3_KEEP_LOCAL || pCfg->s3KeepLocal > TSDB_MAX_S3_KEEP_LOCAL) return code;
4,372!
501
  if (pCfg->s3Compact < TSDB_MIN_S3_COMPACT || pCfg->s3Compact > TSDB_MAX_S3_COMPACT) return code;
4,372!
502

503
  if (pCfg->compactInterval != 0 &&
4,372✔
504
      (pCfg->compactInterval < TSDB_MIN_COMPACT_INTERVAL || pCfg->compactInterval > pCfg->daysToKeep2))
2!
UNCOV
505
    return code;
×
506
  if (pCfg->compactStartTime != 0 &&
4,372✔
507
      (pCfg->compactStartTime < -pCfg->daysToKeep2 || pCfg->compactStartTime > -pCfg->daysPerFile))
1!
UNCOV
508
    return code;
×
509
  if (pCfg->compactEndTime != 0 &&
4,372✔
510
      (pCfg->compactEndTime < -pCfg->daysToKeep2 || pCfg->compactEndTime > -pCfg->daysPerFile))
1!
UNCOV
511
    return code;
×
512
  if (pCfg->compactStartTime != 0 && pCfg->compactEndTime != 0 && pCfg->compactStartTime >= pCfg->compactEndTime)
4,372!
UNCOV
513
    return code;
×
514
  if (pCfg->compactTimeOffset < TSDB_MIN_COMPACT_TIME_OFFSET || pCfg->compactTimeOffset > TSDB_MAX_COMPACT_TIME_OFFSET)
4,372!
UNCOV
515
    return code;
×
516

517
  code = 0;
4,372✔
518
  TAOS_RETURN(code);
4,372✔
519
}
520

521
static int32_t mndCheckInChangeDbCfg(SMnode *pMnode, SDbCfg *pOldCfg, SDbCfg *pNewCfg) {
173✔
522
  int32_t code = TSDB_CODE_MND_INVALID_DB_OPTION;
173✔
523
  if (pNewCfg->buffer < TSDB_MIN_BUFFER_PER_VNODE || pNewCfg->buffer > TSDB_MAX_BUFFER_PER_VNODE) return code;
173!
524
  if (pNewCfg->pages < TSDB_MIN_PAGES_PER_VNODE || pNewCfg->pages > TSDB_MAX_PAGES_PER_VNODE) return code;
173!
525
  if (pNewCfg->pageSize < TSDB_MIN_PAGESIZE_PER_VNODE || pNewCfg->pageSize > TSDB_MAX_PAGESIZE_PER_VNODE) return code;
173!
526
  if (pNewCfg->daysPerFile < TSDB_MIN_DAYS_PER_FILE || pNewCfg->daysPerFile > TSDB_MAX_DAYS_PER_FILE) return code;
173!
527
  if (pNewCfg->daysToKeep0 < TSDB_MIN_KEEP || pNewCfg->daysToKeep0 > TSDB_MAX_KEEP) return code;
173!
528
  if (pNewCfg->daysToKeep1 < TSDB_MIN_KEEP || pNewCfg->daysToKeep1 > TSDB_MAX_KEEP) return code;
173!
529
  if (pNewCfg->daysToKeep2 < TSDB_MIN_KEEP || pNewCfg->daysToKeep2 > TSDB_MAX_KEEP) return code;
173!
530
  if (pNewCfg->daysToKeep0 < pNewCfg->daysPerFile) return code;
173!
531
  if (pNewCfg->daysToKeep0 > pNewCfg->daysToKeep1) return code;
173!
532
  if (pNewCfg->daysToKeep1 > pNewCfg->daysToKeep2) return code;
173!
533
  if (pNewCfg->keepTimeOffset < TSDB_MIN_KEEP_TIME_OFFSET || pNewCfg->keepTimeOffset > TSDB_MAX_KEEP_TIME_OFFSET)
173!
UNCOV
534
    return code;
×
535
  if (pNewCfg->walFsyncPeriod < TSDB_MIN_FSYNC_PERIOD || pNewCfg->walFsyncPeriod > TSDB_MAX_FSYNC_PERIOD) return code;
173!
536
  if (pNewCfg->walLevel < TSDB_MIN_WAL_LEVEL || pNewCfg->walLevel > TSDB_MAX_WAL_LEVEL) return code;
173!
537
  if (pNewCfg->cacheLast < TSDB_CACHE_MODEL_NONE || pNewCfg->cacheLast > TSDB_CACHE_MODEL_BOTH) return code;
173!
538
  if (pNewCfg->cacheLastSize < TSDB_MIN_DB_CACHE_SIZE || pNewCfg->cacheLastSize > TSDB_MAX_DB_CACHE_SIZE) return code;
173!
539
  if (pNewCfg->replications < TSDB_MIN_DB_REPLICA || pNewCfg->replications > TSDB_MAX_DB_REPLICA) return code;
173!
540
#ifdef TD_ENTERPRISE
541
  if ((pNewCfg->replications == 2) ^ (pNewCfg->withArbitrator == TSDB_MAX_DB_WITH_ARBITRATOR)) return code;
173!
542
  if (pNewCfg->replications == 2 && pNewCfg->withArbitrator == TSDB_MAX_DB_WITH_ARBITRATOR) {
173!
543
    if (pOldCfg->replications != 1 && pOldCfg->replications != 2) {
1!
544
      terrno = TSDB_CODE_OPS_NOT_SUPPORT;
1✔
545
      return code;
1✔
546
    }
547
  }
548
  if (pNewCfg->replications != 2 && pOldCfg->replications == 2) {
172!
549
    terrno = TSDB_CODE_OPS_NOT_SUPPORT;
×
UNCOV
550
    return code;
×
551
  }
552
#else
553
  if (pNewCfg->replications != 1 && pNewCfg->replications != 3) return code;
554
#endif
555

556
  if (pNewCfg->walLevel == 0 && pOldCfg->replications > 1) {
172!
557
    terrno = TSDB_CODE_MND_INVALID_WAL_LEVEL;
×
UNCOV
558
    return code;
×
559
  }
560
  if (pNewCfg->replications > 1 && pOldCfg->walLevel == 0) {
172!
561
    terrno = TSDB_CODE_MND_INVALID_WAL_LEVEL;
×
UNCOV
562
    return code;
×
563
  }
564

565
  if (pNewCfg->sstTrigger != pOldCfg->sstTrigger &&
172!
566
      (pNewCfg->sstTrigger < TSDB_MIN_STT_TRIGGER || pNewCfg->sstTrigger > TSDB_MAX_STT_TRIGGER))
×
UNCOV
567
    return code;
×
568
  if (pNewCfg->minRows < TSDB_MIN_MINROWS_FBLOCK || pNewCfg->minRows > TSDB_MAX_MINROWS_FBLOCK) return code;
172!
569
  if (pNewCfg->maxRows < TSDB_MIN_MAXROWS_FBLOCK || pNewCfg->maxRows > TSDB_MAX_MAXROWS_FBLOCK) return code;
172!
570
  if (pNewCfg->minRows > pNewCfg->maxRows) return code;
172!
571
  if (pNewCfg->walRetentionPeriod < TSDB_DB_MIN_WAL_RETENTION_PERIOD) return code;
172!
572
  if (pNewCfg->walRetentionSize < TSDB_DB_MIN_WAL_RETENTION_SIZE) return code;
172!
573
  if (pNewCfg->strict < TSDB_DB_STRICT_OFF || pNewCfg->strict > TSDB_DB_STRICT_ON) return code;
172!
574
  if (pNewCfg->replications > mndGetDnodeSize(pMnode)) {
172!
575
    terrno = TSDB_CODE_MND_NO_ENOUGH_DNODES;
×
UNCOV
576
    return code;
×
577
  }
578
  if (pNewCfg->s3ChunkSize < TSDB_MIN_S3_CHUNK_SIZE || pNewCfg->s3ChunkSize > TSDB_MAX_S3_CHUNK_SIZE) return code;
172!
579
  if (pNewCfg->s3KeepLocal < TSDB_MIN_S3_KEEP_LOCAL || pNewCfg->s3KeepLocal > TSDB_MAX_S3_KEEP_LOCAL) return code;
172!
580
  if (pNewCfg->s3Compact < TSDB_MIN_S3_COMPACT || pNewCfg->s3Compact > TSDB_MAX_S3_COMPACT) return code;
172!
581

582
  if (pNewCfg->compactInterval != 0 &&
172!
583
      (pNewCfg->compactInterval < TSDB_MIN_COMPACT_INTERVAL || pNewCfg->compactInterval > pNewCfg->daysToKeep2))
×
UNCOV
584
    return code;
×
585
  if (pNewCfg->compactStartTime != 0 &&
172!
586
      (pNewCfg->compactStartTime < -pNewCfg->daysToKeep2 || pNewCfg->compactStartTime > -pNewCfg->daysPerFile))
×
UNCOV
587
    return code;
×
588
  if (pNewCfg->compactEndTime != 0 &&
172!
589
      (pNewCfg->compactEndTime < -pNewCfg->daysToKeep2 || pNewCfg->compactEndTime > -pNewCfg->daysPerFile))
×
UNCOV
590
    return code;
×
591
  if (pNewCfg->compactStartTime != 0 && pNewCfg->compactEndTime != 0 &&
172!
592
      pNewCfg->compactStartTime >= pNewCfg->compactEndTime)
×
UNCOV
593
    return code;
×
594
  if (pNewCfg->compactTimeOffset < TSDB_MIN_COMPACT_TIME_OFFSET ||
172!
595
      pNewCfg->compactTimeOffset > TSDB_MAX_COMPACT_TIME_OFFSET)
172!
UNCOV
596
    return code;
×
597

598
  code = 0;
172✔
599
  TAOS_RETURN(code);
172✔
600
}
601

602
static void mndSetDefaultDbCfg(SDbCfg *pCfg) {
4,373✔
603
  if (pCfg->numOfVgroups < 0) pCfg->numOfVgroups = TSDB_DEFAULT_VN_PER_DB;
4,373!
604
  if (pCfg->numOfStables < 0) pCfg->numOfStables = TSDB_DEFAULT_DB_SINGLE_STABLE;
4,373!
605
  if (pCfg->buffer < 0) pCfg->buffer = TSDB_DEFAULT_BUFFER_PER_VNODE;
4,373✔
606
  if (pCfg->pageSize < 0) pCfg->pageSize = TSDB_DEFAULT_PAGESIZE_PER_VNODE;
4,373✔
607
  if (pCfg->pages < 0) pCfg->pages = TSDB_DEFAULT_PAGES_PER_VNODE;
4,373✔
608
  if (pCfg->daysPerFile < 0) pCfg->daysPerFile = TSDB_DEFAULT_DURATION_PER_FILE;
4,373!
609
  if (pCfg->daysToKeep0 < 0) pCfg->daysToKeep0 = TSDB_DEFAULT_KEEP;
4,373!
610
  if (pCfg->daysToKeep1 < 0) pCfg->daysToKeep1 = pCfg->daysToKeep0;
4,373!
611
  if (pCfg->daysToKeep2 < 0) pCfg->daysToKeep2 = pCfg->daysToKeep1;
4,373!
612
  if (pCfg->keepTimeOffset < 0) pCfg->keepTimeOffset = TSDB_DEFAULT_KEEP_TIME_OFFSET;
4,373!
613
  if (pCfg->minRows < 0) pCfg->minRows = TSDB_DEFAULT_MINROWS_FBLOCK;
4,373!
614
  if (pCfg->maxRows < 0) pCfg->maxRows = TSDB_DEFAULT_MAXROWS_FBLOCK;
4,373!
615
  if (pCfg->walFsyncPeriod < 0) pCfg->walFsyncPeriod = TSDB_DEFAULT_FSYNC_PERIOD;
4,373!
616
  if (pCfg->walLevel < 0) pCfg->walLevel = TSDB_DEFAULT_WAL_LEVEL;
4,373!
617
  if (pCfg->precision < 0) pCfg->precision = TSDB_DEFAULT_PRECISION;
4,373!
618
  if (pCfg->compression < 0) pCfg->compression = TSDB_DEFAULT_COMP_LEVEL;
4,373!
619
  if (pCfg->replications < 0) pCfg->replications = TSDB_DEFAULT_DB_REPLICA;
4,373!
620
  if (pCfg->strict < 0) pCfg->strict = TSDB_DEFAULT_DB_STRICT;
4,373!
621
  if (pCfg->cacheLast < 0) pCfg->cacheLast = TSDB_DEFAULT_CACHE_MODEL;
4,373!
622
  if (pCfg->cacheLastSize <= 0) pCfg->cacheLastSize = TSDB_DEFAULT_CACHE_SIZE;
4,373✔
623
  if (pCfg->numOfRetensions < 0) pCfg->numOfRetensions = 0;
4,373!
624
  if (pCfg->schemaless < 0) pCfg->schemaless = TSDB_DB_SCHEMALESS_OFF;
4,373!
625
  if (pCfg->walRetentionPeriod < 0 && pCfg->walRetentionPeriod != -1)
4,373!
UNCOV
626
    pCfg->walRetentionPeriod = TSDB_REPS_DEF_DB_WAL_RET_PERIOD;
×
627
  if (pCfg->walRetentionSize < 0 && pCfg->walRetentionSize != -1)
4,373!
UNCOV
628
    pCfg->walRetentionSize = TSDB_REPS_DEF_DB_WAL_RET_SIZE;
×
629
  if (pCfg->walRollPeriod < 0) pCfg->walRollPeriod = TSDB_REPS_DEF_DB_WAL_ROLL_PERIOD;
4,373!
630
  if (pCfg->walSegmentSize < 0) pCfg->walSegmentSize = TSDB_DEFAULT_DB_WAL_SEGMENT_SIZE;
4,373!
631
  if (pCfg->sstTrigger <= 0) pCfg->sstTrigger = TSDB_DEFAULT_SST_TRIGGER;
4,373✔
632
  if (pCfg->tsdbPageSize <= 0) pCfg->tsdbPageSize = TSDB_DEFAULT_TSDB_PAGESIZE;
4,373✔
633
  if (pCfg->s3ChunkSize <= 0) pCfg->s3ChunkSize = TSDB_DEFAULT_S3_CHUNK_SIZE;
4,373✔
634
  if (pCfg->s3KeepLocal <= 0) pCfg->s3KeepLocal = TSDB_DEFAULT_S3_KEEP_LOCAL;
4,373✔
635
  if (pCfg->s3Compact < 0) pCfg->s3Compact = TSDB_DEFAULT_S3_COMPACT;
4,373!
636
  if (pCfg->withArbitrator < 0) pCfg->withArbitrator = TSDB_DEFAULT_DB_WITH_ARBITRATOR;
4,373!
637
  if (pCfg->encryptAlgorithm < 0) pCfg->encryptAlgorithm = TSDB_DEFAULT_ENCRYPT_ALGO;
4,373!
638
}
4,373✔
639

640
static int32_t mndSetCreateDbPrepareAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
3,871✔
641
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
3,871✔
642
  if (pDbRaw == NULL) return -1;
3,871!
643

644
  if (mndTransAppendPrepareLog(pTrans, pDbRaw) != 0) return -1;
3,871!
645
  if (sdbSetRawStatus(pDbRaw, SDB_STATUS_CREATING) != 0) return -1;
3,871!
646
  return 0;
3,871✔
647
}
648

649
static int32_t mndSetNewVgPrepareActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
3,871✔
650
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
12,563✔
651
    if (mndAddNewVgPrepareAction(pMnode, pTrans, (pVgroups + v)) != 0) return -1;
8,692!
652
  }
653
  return 0;
3,871✔
654
}
655

656
static int32_t mndSetCreateDbRedoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
×
657
  int32_t  code = 0;
×
658
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
×
659
  if (pDbRaw == NULL) {
×
660
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
661
    if (terrno != 0) code = terrno;
×
UNCOV
662
    TAOS_RETURN(code);
×
663
  }
664
  TAOS_CHECK_RETURN(mndTransAppendRedolog(pTrans, pDbRaw));
×
UNCOV
665
  TAOS_CHECK_RETURN(sdbSetRawStatus(pDbRaw, SDB_STATUS_UPDATE));
×
666

667
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
×
668
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
×
669
    if (pVgRaw == NULL) {
×
670
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
671
      if (terrno != 0) code = terrno;
×
UNCOV
672
      TAOS_RETURN(code);
×
673
    }
674
    TAOS_CHECK_RETURN(mndTransAppendRedolog(pTrans, pVgRaw));
×
UNCOV
675
    TAOS_CHECK_RETURN(sdbSetRawStatus(pVgRaw, SDB_STATUS_UPDATE));
×
676
  }
677

678
  if (pDb->cfg.withArbitrator) {
×
679
    for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
×
680
      SVgObj   *pVgObj = pVgroups + v;
×
681
      SArbGroup arbGroup = {0};
×
682
      TAOS_CHECK_RETURN(mndArbGroupInitFromVgObj(pVgObj, &arbGroup));
×
UNCOV
683
      TAOS_CHECK_RETURN(mndSetCreateArbGroupRedoLogs(pTrans, &arbGroup));
×
684
    }
685
  }
686

UNCOV
687
  TAOS_RETURN(code);
×
688
}
689

690
static int32_t mndSetCreateDbUndoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
3,871✔
691
  int32_t  code = 0;
3,871✔
692
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
3,871✔
693
  if (pDbRaw == NULL) {
3,871!
694
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
695
    if (terrno != 0) code = terrno;
×
UNCOV
696
    TAOS_RETURN(code);
×
697
  }
698
  TAOS_CHECK_RETURN(mndTransAppendUndolog(pTrans, pDbRaw));
3,871!
699
  TAOS_CHECK_RETURN(sdbSetRawStatus(pDbRaw, SDB_STATUS_DROPPED));
3,871!
700

701
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
12,563✔
702
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
8,692✔
703
    if (pVgRaw == NULL) {
8,692!
704
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
705
      if (terrno != 0) code = terrno;
×
UNCOV
706
      TAOS_RETURN(code);
×
707
    }
708
    TAOS_CHECK_RETURN(mndTransAppendUndolog(pTrans, pVgRaw));
8,692!
709
    TAOS_CHECK_RETURN(sdbSetRawStatus(pVgRaw, SDB_STATUS_DROPPED));
8,692!
710
  }
711

712
  if (pDb->cfg.withArbitrator) {
3,871✔
713
    for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
11✔
714
      SVgObj   *pVgObj = pVgroups + v;
7✔
715
      SArbGroup arbGroup = {0};
7✔
716
      TAOS_CHECK_RETURN(mndArbGroupInitFromVgObj(pVgObj, &arbGroup));
7!
717
      TAOS_CHECK_RETURN(mndSetCreateArbGroupUndoLogs(pTrans, &arbGroup));
7!
718
    }
719
  }
720

721
  TAOS_RETURN(code);
3,871✔
722
}
723

724
static int32_t mndSetCreateDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups,
3,871✔
725
                                        SUserObj *pUserDuped) {
726
  int32_t  code = 0;
3,871✔
727
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
3,871✔
728
  if (pDbRaw == NULL) {
3,871!
729
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
730
    if (terrno != 0) code = terrno;
×
UNCOV
731
    TAOS_RETURN(code);
×
732
  }
733
  TAOS_CHECK_RETURN(mndTransAppendCommitlog(pTrans, pDbRaw));
3,871!
734
  TAOS_CHECK_RETURN(sdbSetRawStatus(pDbRaw, SDB_STATUS_READY));
3,871!
735

736
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
12,563✔
737
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
8,692✔
738
    if (pVgRaw == NULL) {
8,692!
739
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
740
      if (terrno != 0) code = terrno;
×
UNCOV
741
      TAOS_RETURN(code);
×
742
    }
743
    TAOS_CHECK_RETURN(mndTransAppendCommitlog(pTrans, pVgRaw));
8,692!
744
    TAOS_CHECK_RETURN(sdbSetRawStatus(pVgRaw, SDB_STATUS_READY));
8,692!
745
  }
746

747
  if (pDb->cfg.withArbitrator) {
3,871✔
748
    for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
11✔
749
      SVgObj   *pVgObj = pVgroups + v;
7✔
750
      SArbGroup arbGroup = {0};
7✔
751
      TAOS_CHECK_RETURN(mndArbGroupInitFromVgObj(pVgObj, &arbGroup));
7!
752
      TAOS_CHECK_RETURN(mndSetCreateArbGroupCommitLogs(pTrans, &arbGroup));
7!
753
    }
754
  }
755

756
  if (pUserDuped) {
3,871✔
757
    SSdbRaw *pUserRaw = mndUserActionEncode(pUserDuped);
4✔
758
    if (pUserRaw == NULL) {
4!
759
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
760
      if (terrno != 0) code = terrno;
×
UNCOV
761
      TAOS_RETURN(code);
×
762
    }
763
    TAOS_CHECK_RETURN(mndTransAppendCommitlog(pTrans, pUserRaw));
4!
764
    TAOS_CHECK_RETURN(sdbSetRawStatus(pUserRaw, SDB_STATUS_READY));
4!
765
  }
766

767
  TAOS_RETURN(code);
3,871✔
768
}
769

770
static int32_t mndSetCreateDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
3,871✔
771
  int32_t code = 0;
3,871✔
772
  for (int32_t vg = 0; vg < pDb->cfg.numOfVgroups; ++vg) {
12,563✔
773
    SVgObj *pVgroup = pVgroups + vg;
8,692✔
774

775
    for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
18,149✔
776
      SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
9,457✔
777
      TAOS_CHECK_RETURN(mndAddCreateVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid));
9,457!
778
    }
779
  }
780

781
  TAOS_RETURN(code);
3,871✔
782
}
783

784
static int32_t mndSetCreateDbUndoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
3,871✔
785
  int32_t code = 0;
3,871✔
786
  for (int32_t vg = 0; vg < pDb->cfg.numOfVgroups; ++vg) {
12,563✔
787
    SVgObj *pVgroup = pVgroups + vg;
8,692✔
788

789
    for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
18,149✔
790
      SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
9,457✔
791
      TAOS_CHECK_RETURN(mndAddDropVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid, false));
9,457!
792
    }
793
  }
794

795
  TAOS_RETURN(code);
3,871✔
796
}
797

798
static int32_t mndCreateDb(SMnode *pMnode, SRpcMsg *pReq, SCreateDbReq *pCreate, SUserObj *pUser, SArray *dnodeList) {
4,373✔
799
  int32_t  code = 0;
4,373✔
800
  SUserObj newUserObj = {0};
4,373✔
801
  SDbObj   dbObj = {0};
4,373✔
802
  (void)memcpy(dbObj.name, pCreate->db, TSDB_DB_FNAME_LEN);
4,373✔
803
  (void)memcpy(dbObj.acct, pUser->acct, TSDB_USER_LEN);
4,373✔
804
  dbObj.createdTime = taosGetTimestampMs();
4,373✔
805
  dbObj.updateTime = dbObj.createdTime;
4,373✔
806
  dbObj.uid = mndGenerateUid(dbObj.name, TSDB_DB_FNAME_LEN);
4,373✔
807
  dbObj.cfgVersion = 1;
4,373✔
808
  dbObj.vgVersion = 1;
4,373✔
809
  dbObj.tsmaVersion = 1;
4,373✔
810
  (void)memcpy(dbObj.createUser, pUser->user, TSDB_USER_LEN);
4,373✔
811
  dbObj.cfg = (SDbCfg){
4,373✔
812
      .numOfVgroups = pCreate->numOfVgroups,
4,373✔
813
      .numOfStables = pCreate->numOfStables,
4,373✔
814
      .buffer = pCreate->buffer,
4,373✔
815
      .pageSize = pCreate->pageSize,
4,373✔
816
      .pages = pCreate->pages,
4,373✔
817
      .cacheLastSize = pCreate->cacheLastSize,
4,373✔
818
      .daysPerFile = pCreate->daysPerFile,
4,373✔
819
      .daysToKeep0 = pCreate->daysToKeep0,
4,373✔
820
      .daysToKeep1 = pCreate->daysToKeep1,
4,373✔
821
      .daysToKeep2 = pCreate->daysToKeep2,
4,373✔
822
      .keepTimeOffset = pCreate->keepTimeOffset,
4,373✔
823
      .minRows = pCreate->minRows,
4,373✔
824
      .maxRows = pCreate->maxRows,
4,373✔
825
      .walFsyncPeriod = pCreate->walFsyncPeriod,
4,373✔
826
      .walLevel = pCreate->walLevel,
4,373✔
827
      .precision = pCreate->precision,
4,373✔
828
      .compression = pCreate->compression,
4,373✔
829
      .replications = pCreate->replications,
4,373✔
830
      .strict = pCreate->strict,
4,373✔
831
      .cacheLast = pCreate->cacheLast,
4,373✔
832
      .hashMethod = 1,
833
      .schemaless = pCreate->schemaless,
4,373✔
834
      .walRetentionPeriod = pCreate->walRetentionPeriod,
4,373✔
835
      .walRetentionSize = pCreate->walRetentionSize,
4,373✔
836
      .walRollPeriod = pCreate->walRollPeriod,
4,373✔
837
      .walSegmentSize = pCreate->walSegmentSize,
4,373✔
838
      .sstTrigger = pCreate->sstTrigger,
4,373✔
839
      .hashPrefix = pCreate->hashPrefix,
4,373✔
840
      .hashSuffix = pCreate->hashSuffix,
4,373✔
841
      .s3ChunkSize = pCreate->s3ChunkSize,
4,373✔
842
      .s3KeepLocal = pCreate->s3KeepLocal,
4,373✔
843
      .s3Compact = pCreate->s3Compact,
4,373✔
844
      .tsdbPageSize = pCreate->tsdbPageSize,
4,373✔
845
      .withArbitrator = pCreate->withArbitrator,
4,373✔
846
      .encryptAlgorithm = pCreate->encryptAlgorithm,
4,373✔
847
      .compactInterval = pCreate->compactInterval,
4,373✔
848
      .compactStartTime = pCreate->compactStartTime,
4,373✔
849
      .compactEndTime = pCreate->compactEndTime,
4,373✔
850
      .compactTimeOffset = pCreate->compactTimeOffset,
4,373✔
851
  };
852

853
  dbObj.cfg.numOfRetensions = pCreate->numOfRetensions;
4,373✔
854
  dbObj.cfg.pRetensions = pCreate->pRetensions;
4,373✔
855

856
  mndSetDefaultDbCfg(&dbObj.cfg);
4,373✔
857

858
  if ((code = mndCheckDbName(dbObj.name, pUser)) != 0) {
4,373!
859
    mError("db:%s, failed to create, check db name failed, since %s", pCreate->db, terrstr());
×
UNCOV
860
    TAOS_RETURN(code);
×
861
  }
862

863
  if ((code = mndCheckDbCfg(pMnode, &dbObj.cfg)) != 0) {
4,373✔
864
    mError("db:%s, failed to create, check db cfg failed, since %s", pCreate->db, terrstr());
1!
865
    TAOS_RETURN(code);
1✔
866
  }
867

868
  if (dbObj.cfg.hashPrefix > 0) {
4,372✔
869
    int32_t dbLen = strlen(dbObj.name) + 1;
11✔
870
    mInfo("db:%s, hashPrefix adjust from %d to %d", dbObj.name, dbObj.cfg.hashPrefix, dbObj.cfg.hashPrefix + dbLen);
11!
871
    dbObj.cfg.hashPrefix += dbLen;
11✔
872
  } else if (dbObj.cfg.hashPrefix < 0) {
4,361✔
873
    int32_t dbLen = strlen(dbObj.name) + 1;
11✔
874
    mInfo("db:%s, hashPrefix adjust from %d to %d", dbObj.name, dbObj.cfg.hashPrefix, dbObj.cfg.hashPrefix - dbLen);
11!
875
    dbObj.cfg.hashPrefix -= dbLen;
11✔
876
  }
877

878
  SVgObj *pVgroups = NULL;
4,372✔
879
  if ((code = mndAllocVgroup(pMnode, &dbObj, &pVgroups, dnodeList)) != 0) {
4,372✔
880
    mError("db:%s, failed to create, alloc vgroup failed, since %s", pCreate->db, terrstr());
476!
881
    TAOS_RETURN(code);
476✔
882
  }
883

884
  // add database privileges for user
885
  SUserObj *pNewUserDuped = NULL;
3,896✔
886
  if (!pUser->superUser) {
3,896✔
887
    TAOS_CHECK_GOTO(mndUserDupObj(pUser, &newUserObj), NULL, _OVER);
4!
888
    TAOS_CHECK_GOTO(taosHashPut(newUserObj.readDbs, dbObj.name, strlen(dbObj.name) + 1, dbObj.name, TSDB_FILENAME_LEN),
4!
889
                    NULL, _OVER);
890
    TAOS_CHECK_GOTO(taosHashPut(newUserObj.writeDbs, dbObj.name, strlen(dbObj.name) + 1, dbObj.name, TSDB_FILENAME_LEN),
4!
891
                    NULL, _OVER);
892
    pNewUserDuped = &newUserObj;
4✔
893
  }
894

895
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq, "create-db");
3,896✔
896
  if (pTrans == NULL) {
3,896!
897
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
898
    if (terrno != 0) code = terrno;
×
UNCOV
899
    goto _OVER;
×
900
  }
901
  // mndTransSetSerial(pTrans);
902
  mInfo("trans:%d, used to create db:%s", pTrans->id, pCreate->db);
3,896!
903

904
  mndTransSetDbName(pTrans, dbObj.name, NULL);
3,896✔
905
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
3,896✔
906

907
  mndTransSetOper(pTrans, MND_OPER_CREATE_DB);
3,871✔
908
  TAOS_CHECK_GOTO(mndSetCreateDbPrepareAction(pMnode, pTrans, &dbObj), NULL, _OVER);
3,871!
909
  TAOS_CHECK_GOTO(mndSetCreateDbRedoActions(pMnode, pTrans, &dbObj, pVgroups), NULL, _OVER);
3,871!
910
  TAOS_CHECK_GOTO(mndSetNewVgPrepareActions(pMnode, pTrans, &dbObj, pVgroups), NULL, _OVER);
3,871!
911
  TAOS_CHECK_GOTO(mndSetCreateDbUndoLogs(pMnode, pTrans, &dbObj, pVgroups), NULL, _OVER);
3,871!
912
  TAOS_CHECK_GOTO(mndSetCreateDbCommitLogs(pMnode, pTrans, &dbObj, pVgroups, pNewUserDuped), NULL, _OVER);
3,871!
913
  TAOS_CHECK_GOTO(mndSetCreateDbUndoActions(pMnode, pTrans, &dbObj, pVgroups), NULL, _OVER);
3,871!
914
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
3,871✔
915

916
_OVER:
3,866✔
917
  taosMemoryFree(pVgroups);
3,896!
918
  mndUserFreeObj(&newUserObj);
3,896✔
919
  mndTransDrop(pTrans);
3,896✔
920
  TAOS_RETURN(code);
3,896✔
921
}
922

923
static int32_t mndCheckDbEncryptKey(SMnode *pMnode, SCreateDbReq *pReq) {
4,389✔
924
  int32_t    code = 0;
4,389✔
925
  SSdb      *pSdb = pMnode->pSdb;
4,389✔
926
  SDnodeObj *pDnode = NULL;
4,389✔
927
  void      *pIter = NULL;
4,389✔
928

929
#if defined(TD_ENTERPRISE) || defined(TD_ASTRA_TODO)
930
  if (pReq->encryptAlgorithm == TSDB_ENCRYPT_ALGO_NONE) goto _exit;
4,389!
931
  TAOS_CHECK_GOTO(grantCheck(TSDB_GRANT_DB_ENCRYPTION), NULL, _exit);
×
932
  if (tsEncryptionKeyStat != ENCRYPT_KEY_STAT_LOADED) {
×
933
    code = TSDB_CODE_MND_INVALID_ENCRYPT_KEY;
×
UNCOV
934
    mError("db:%s, failed to check encryption key:%" PRIi8 " in mnode leader since it's not loaded", pReq->db,
×
935
           tsEncryptionKeyStat);
UNCOV
936
    goto _exit;
×
937
  }
938

939
  int64_t curMs = taosGetTimestampMs();
×
940
  while ((pIter = sdbFetch(pSdb, SDB_DNODE, pIter, (void **)&pDnode))) {
×
941
    bool online = false;
×
942
    if ((pDnode->encryptionKeyStat != tsEncryptionKeyStat || pDnode->encryptionKeyChksum != tsEncryptionKeyChksum) &&
×
943
        (online = mndIsDnodeOnline(pDnode, curMs))) {
×
944
      code = TSDB_CODE_MND_INVALID_ENCRYPT_KEY;
×
UNCOV
945
      mError("db:%s, failed to check encryption key:%" PRIi8
×
946
             "-%u in dnode:%d since it's inconsitent with mnode leader:%" PRIi8 "-%u",
947
             pReq->db, pDnode->encryptionKeyStat, pDnode->encryptionKeyChksum, pDnode->id, tsEncryptionKeyStat,
948
             tsEncryptionKeyChksum);
949
      sdbCancelFetch(pSdb, pIter);
×
950
      sdbRelease(pSdb, pDnode);
×
UNCOV
951
      break;
×
952
    }
UNCOV
953
    sdbRelease(pSdb, pDnode);
×
954
  }
955
#else
956
  if (pReq->encryptAlgorithm != TSDB_ENCRYPT_ALGO_NONE) {
957
    code = TSDB_CODE_MND_INVALID_DB_OPTION;
958
    goto _exit;
959
  }
960
#endif
UNCOV
961
_exit:
×
962
  TAOS_RETURN(code);
4,389✔
963
}
964

965
#ifndef TD_ENTERPRISE
966
int32_t mndCheckDbDnodeList(SMnode *pMnode, char *db, char *dnodeListStr, SArray *dnodeList) {
967
  if (dnodeListStr[0] != 0) {
968
    terrno = TSDB_CODE_OPS_NOT_SUPPORT;
969
    return terrno;
970
  } else {
971
    return 0;
972
  }
973
}
974
#endif
975

976
static int32_t mndProcessCreateDbReq(SRpcMsg *pReq) {
4,725✔
977
  SMnode      *pMnode = pReq->info.node;
4,725✔
978
  int32_t      code = -1;
4,725✔
979
  int32_t      lino = 0;
4,725✔
980
  SDbObj      *pDb = NULL;
4,725✔
981
  SUserObj    *pUser = NULL;
4,725✔
982
  SCreateDbReq createReq = {0};
4,725✔
983
  SArray      *dnodeList = NULL;
4,725✔
984

985
  dnodeList = taosArrayInit(mndGetDnodeSize(pMnode), sizeof(int32_t));
4,725✔
986
  TSDB_CHECK_NULL(dnodeList, code, lino, _OVER, TSDB_CODE_OUT_OF_MEMORY);
4,725!
987

988
  TAOS_CHECK_GOTO(tDeserializeSCreateDbReq(pReq->pCont, pReq->contLen, &createReq), NULL, _OVER);
4,725!
989
#ifdef WINDOWS
990
  if (taosArrayGetSize(createReq.pRetensions) > 0) {
991
    terrno = TSDB_CODE_MND_INVALID_PLATFORM;
992
    goto _OVER;
993
  }
994
#endif
995
  mInfo("db:%s, start to create, vgroups:%d", createReq.db, createReq.numOfVgroups);
4,725!
996

997
  pDb = mndAcquireDb(pMnode, createReq.db);
4,725✔
998
  if (pDb != NULL) {
4,725✔
999
    if (createReq.ignoreExist) {
321✔
1000
      mInfo("db:%s, already exist, ignore exist is set", createReq.db);
307!
1001
      code = 0;
307✔
1002
      goto _OVER;
307✔
1003
    } else {
1004
      code = TSDB_CODE_MND_DB_ALREADY_EXIST;
14✔
1005
      goto _OVER;
14✔
1006
    }
1007
  } else {
1008
    if (terrno == TSDB_CODE_MND_DB_IN_CREATING) {
4,404✔
1009
      code = terrno;
14✔
1010
      goto _OVER;
14✔
1011
    } else if (terrno == TSDB_CODE_MND_DB_IN_DROPPING) {
4,390!
UNCOV
1012
      goto _OVER;
×
1013
    } else if (terrno == TSDB_CODE_MND_DB_NOT_EXIST) {
4,390!
1014
      // continue
1015
    } else {  // TSDB_CODE_APP_ERROR
UNCOV
1016
      goto _OVER;
×
1017
    }
1018
  }
1019

1020
  TAOS_CHECK_GOTO(mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_CREATE_DB, NULL), &lino, _OVER);
4,390✔
1021

1022
  TAOS_CHECK_GOTO(grantCheck(TSDB_GRANT_DB), &lino, _OVER);
4,389!
1023

1024
  if (createReq.replications == 2) {
4,389✔
1025
    TAOS_CHECK_GOTO(grantCheck(TSDB_GRANT_DUAL_REPLICA_HA), &lino, _OVER);
6!
1026
  }
1027

1028
  TAOS_CHECK_GOTO(mndCheckDbEncryptKey(pMnode, &createReq), &lino, _OVER);
4,389!
1029

1030
  TAOS_CHECK_GOTO(mndCheckDbDnodeList(pMnode, createReq.db, createReq.dnodeListStr, dnodeList), &lino, _OVER);
4,389✔
1031

1032
  TAOS_CHECK_GOTO(mndAcquireUser(pMnode, pReq->info.conn.user, &pUser), &lino, _OVER);
4,373!
1033

1034
  TAOS_CHECK_GOTO(mndCreateDb(pMnode, pReq, &createReq, pUser, dnodeList), &lino, _OVER);
4,373✔
1035
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
3,866!
1036

1037
  SName name = {0};
3,866✔
1038
  if (tNameFromString(&name, createReq.db, T_NAME_ACCT | T_NAME_DB) < 0)
3,866!
UNCOV
1039
    mError("db:%s, failed to parse db name", createReq.db);
×
1040

1041
  auditRecord(pReq, pMnode->clusterId, "createDB", name.dbname, "", createReq.sql, createReq.sqlLen);
3,866✔
1042

1043
_OVER:
4,725✔
1044
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
4,725✔
1045
    mError("db:%s, failed to create at line:%d since %s", createReq.db, lino, tstrerror(code));
552!
1046
  }
1047

1048
  mndReleaseDb(pMnode, pDb);
4,725✔
1049
  mndReleaseUser(pMnode, pUser);
4,725✔
1050
  tFreeSCreateDbReq(&createReq);
4,725✔
1051
  taosArrayDestroy(dnodeList);
4,725✔
1052

1053
  TAOS_RETURN(code);
4,725✔
1054
}
1055

1056
static int32_t mndSetDbCfgFromAlterDbReq(SDbObj *pDb, SAlterDbReq *pAlter) {
199✔
1057
  int32_t code = TSDB_CODE_MND_DB_OPTION_UNCHANGED;
199✔
1058

1059
  if (pAlter->buffer > 0 && pAlter->buffer != pDb->cfg.buffer) {
199!
1060
    pDb->cfg.buffer = pAlter->buffer;
×
UNCOV
1061
    code = 0;
×
1062
  }
1063

1064
  if (pAlter->pages > 0 && pAlter->pages != pDb->cfg.pages) {
199!
1065
    pDb->cfg.pages = pAlter->pages;
×
UNCOV
1066
    code = 0;
×
1067
  }
1068

1069
  if (pAlter->pageSize > 0 && pAlter->pageSize != pDb->cfg.pageSize) {
199!
1070
    pDb->cfg.pageSize = pAlter->pageSize;
×
UNCOV
1071
    code = 0;
×
1072
  }
1073

1074
  if (pAlter->daysPerFile > 0 && pAlter->daysPerFile != pDb->cfg.daysPerFile) {
199!
1075
    pDb->cfg.daysPerFile = pAlter->daysPerFile;
×
UNCOV
1076
    code = 0;
×
1077
  }
1078

1079
  if (pAlter->daysToKeep0 > 0 && pAlter->daysToKeep0 != pDb->cfg.daysToKeep0) {
199✔
1080
    pDb->cfg.daysToKeep0 = pAlter->daysToKeep0;
15✔
1081
    code = 0;
15✔
1082
  }
1083

1084
  if (pAlter->daysToKeep1 > 0 && pAlter->daysToKeep1 != pDb->cfg.daysToKeep1) {
199✔
1085
    pDb->cfg.daysToKeep1 = pAlter->daysToKeep1;
15✔
1086
    code = 0;
15✔
1087
  }
1088

1089
  if (pAlter->daysToKeep2 > 0 && pAlter->daysToKeep2 != pDb->cfg.daysToKeep2) {
199✔
1090
    pDb->cfg.daysToKeep2 = pAlter->daysToKeep2;
16✔
1091
    code = 0;
16✔
1092
  }
1093

1094
  if (pAlter->keepTimeOffset >= 0 && pAlter->keepTimeOffset != pDb->cfg.keepTimeOffset) {
199!
1095
    pDb->cfg.keepTimeOffset = pAlter->keepTimeOffset;
1✔
1096
    code = 0;
1✔
1097
  }
1098

1099
  if (pAlter->walFsyncPeriod >= 0 && pAlter->walFsyncPeriod != pDb->cfg.walFsyncPeriod) {
199!
1100
    pDb->cfg.walFsyncPeriod = pAlter->walFsyncPeriod;
3✔
1101
    code = 0;
3✔
1102
  }
1103

1104
  if (pAlter->walLevel >= 0 && pAlter->walLevel != pDb->cfg.walLevel) {
199!
1105
    pDb->cfg.walLevel = pAlter->walLevel;
2✔
1106
    code = 0;
2✔
1107
  }
1108

1109
  if (pAlter->strict >= 0 && pAlter->strict != pDb->cfg.strict) {
199!
1110
#if 1
UNCOV
1111
    code = TSDB_CODE_OPS_NOT_SUPPORT;
×
1112
#else
1113
    pDb->cfg.strict = pAlter->strict;
1114
    code = 0;
1115
#endif
1116
  }
1117

1118
  if (pAlter->cacheLast >= 0 && pAlter->cacheLast != pDb->cfg.cacheLast) {
199!
1119
    pDb->cfg.cacheLast = pAlter->cacheLast;
124✔
1120
    code = 0;
124✔
1121
  }
1122

1123
  if (pAlter->cacheLastSize > 0 && pAlter->cacheLastSize != pDb->cfg.cacheLastSize) {
199!
1124
    pDb->cfg.cacheLastSize = pAlter->cacheLastSize;
112✔
1125
    code = 0;
112✔
1126
  }
1127

1128
  if (pAlter->replications > 0 && pAlter->replications != pDb->cfg.replications) {
199!
1129
    pDb->cfg.replications = pAlter->replications;
6✔
1130
    pDb->vgVersion++;
6✔
1131
    code = 0;
6✔
1132
  }
1133

1134
  if (pAlter->sstTrigger > 0 && pAlter->sstTrigger != pDb->cfg.sstTrigger) {
199!
1135
    pDb->cfg.sstTrigger = pAlter->sstTrigger;
×
1136
    pDb->vgVersion++;
×
UNCOV
1137
    code = 0;
×
1138
  }
1139

1140
  if (pAlter->minRows > 0 && pAlter->minRows != pDb->cfg.minRows) {
199!
1141
    pDb->cfg.minRows = pAlter->minRows;
×
1142
    pDb->vgVersion++;
×
UNCOV
1143
    code = 0;
×
1144
  }
1145

1146
  if (pAlter->walRetentionPeriod > TSDB_DB_MIN_WAL_RETENTION_PERIOD &&
199✔
1147
      pAlter->walRetentionPeriod != pDb->cfg.walRetentionPeriod) {
44✔
1148
    pDb->cfg.walRetentionPeriod = pAlter->walRetentionPeriod;
20✔
1149
    pDb->vgVersion++;
20✔
1150
    code = 0;
20✔
1151
  }
1152

1153
  if (pAlter->walRetentionSize > TSDB_DB_MIN_WAL_RETENTION_SIZE &&
199!
1154
      pAlter->walRetentionSize != pDb->cfg.walRetentionSize) {
×
1155
    pDb->cfg.walRetentionSize = pAlter->walRetentionSize;
×
1156
    pDb->vgVersion++;
×
UNCOV
1157
    code = 0;
×
1158
  }
1159

1160
  if (pAlter->s3KeepLocal > TSDB_MIN_S3_KEEP_LOCAL && pAlter->s3KeepLocal != pDb->cfg.s3KeepLocal) {
199!
1161
    pDb->cfg.s3KeepLocal = pAlter->s3KeepLocal;
×
1162
    pDb->vgVersion++;
×
UNCOV
1163
    code = 0;
×
1164
  }
1165

1166
  if (pAlter->s3Compact > TSDB_MIN_S3_COMPACT && pAlter->s3Compact != pDb->cfg.s3Compact) {
199!
1167
    pDb->cfg.s3Compact = pAlter->s3Compact;
×
1168
    pDb->vgVersion++;
×
UNCOV
1169
    code = 0;
×
1170
  }
1171

1172
  if (pAlter->withArbitrator >= TSDB_MIN_DB_WITH_ARBITRATOR && pAlter->withArbitrator != pDb->cfg.withArbitrator) {
199✔
1173
    pDb->cfg.withArbitrator = pAlter->withArbitrator;
1✔
1174
    pDb->vgVersion++;
1✔
1175
    code = 0;
1✔
1176
  }
1177

1178
  if (pAlter->compactInterval >= TSDB_DEFAULT_COMPACT_INTERVAL && pAlter->compactInterval != pDb->cfg.compactInterval) {
199!
1179
    pDb->cfg.compactInterval = pAlter->compactInterval;
×
1180
    pDb->vgVersion++;
×
UNCOV
1181
    code = 0;
×
1182
  }
1183

1184
  bool compactTimeRangeChanged = false;
199✔
1185
  if (pAlter->compactStartTime != pDb->cfg.compactStartTime &&
199!
1186
      (pAlter->compactStartTime == TSDB_DEFAULT_COMPACT_START_TIME ||
199!
1187
       pAlter->compactStartTime <= -pDb->cfg.daysPerFile)) {
199!
1188
    pDb->cfg.compactStartTime = pAlter->compactStartTime;
×
1189
    compactTimeRangeChanged = true;
×
UNCOV
1190
    code = 0;
×
1191
  }
1192

1193
  if (pAlter->compactEndTime != pDb->cfg.compactEndTime &&
199!
1194
      (pAlter->compactEndTime == TSDB_DEFAULT_COMPACT_END_TIME || pAlter->compactEndTime <= -pDb->cfg.daysPerFile)) {
199!
1195
    pDb->cfg.compactEndTime = pAlter->compactEndTime;
×
1196
    compactTimeRangeChanged = true;
×
UNCOV
1197
    code = 0;
×
1198
  }
1199
  if(compactTimeRangeChanged) {
199!
UNCOV
1200
    pDb->vgVersion++;
×
1201
  }
1202

1203
  if (pAlter->compactTimeOffset >= TSDB_MIN_COMPACT_TIME_OFFSET &&
199!
1204
      pAlter->compactTimeOffset != pDb->cfg.compactTimeOffset) {
×
1205
    pDb->cfg.compactTimeOffset = pAlter->compactTimeOffset;
×
1206
    pDb->vgVersion++;
×
UNCOV
1207
    code = 0;
×
1208
  }
1209

1210
  TAOS_RETURN(code);
199✔
1211
}
1212

1213
static int32_t mndSetAlterDbPrepareLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
171✔
1214
  int32_t  code = 0;
171✔
1215
  SSdbRaw *pRedoRaw = mndDbActionEncode(pOld);
171✔
1216
  if (pRedoRaw == NULL) {
171!
1217
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1218
    if (terrno != 0) code = terrno;
×
UNCOV
1219
    TAOS_RETURN(code);
×
1220
  }
1221
  if ((code = mndTransAppendPrepareLog(pTrans, pRedoRaw)) != 0) {
171!
1222
    sdbFreeRaw(pRedoRaw);
×
UNCOV
1223
    TAOS_RETURN(code);
×
1224
  }
1225

1226
  if ((code = sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY)) != 0) {
171!
1227
    sdbFreeRaw(pRedoRaw);
×
UNCOV
1228
    TAOS_RETURN(code);
×
1229
  }
1230
  return 0;
171✔
1231
}
1232

1233
static int32_t mndSetAlterDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
171✔
1234
  int32_t  code = 0;
171✔
1235
  SSdbRaw *pCommitRaw = mndDbActionEncode(pNew);
171✔
1236
  if (pCommitRaw == NULL) {
171!
1237
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1238
    if (terrno != 0) code = terrno;
×
UNCOV
1239
    TAOS_RETURN(code);
×
1240
  }
1241
  if ((code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
171!
1242
    sdbFreeRaw(pCommitRaw);
×
UNCOV
1243
    TAOS_RETURN(code);
×
1244
  }
1245

1246
  if ((code = sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY)) != 0) {
171!
1247
    sdbFreeRaw(pCommitRaw);
×
UNCOV
1248
    TAOS_RETURN(code);
×
1249
  }
1250
  TAOS_RETURN(code);
171✔
1251
}
1252

1253
static int32_t mndSetAlterDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb, SDbObj *pNewDb) {
171✔
1254
  int32_t code = 0, lino = 0;
171✔
1255
  SSdb   *pSdb = pMnode->pSdb;
171✔
1256
  void   *pIter = NULL;
171✔
1257
  SVgObj *pVgroup = NULL;
171✔
1258
  SArray *pArray = mndBuildDnodesArray(pMnode, 0, NULL);
171✔
1259

1260
  TSDB_CHECK_NULL(pArray, code, lino, _err, TSDB_CODE_OUT_OF_MEMORY);
171!
1261

1262
  while (1) {
1263
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
6,261✔
1264
    if (pIter == NULL) break;
6,261✔
1265

1266
    if (mndVgroupInDb(pVgroup, pNewDb->uid)) {
6,090✔
1267
      SVgObj newVgroup = {0};
429✔
1268
      TAOS_CHECK_GOTO(mndBuildAlterVgroupAction(pMnode, pTrans, pOldDb, pNewDb, pVgroup, pArray, &newVgroup), &lino,
429!
1269
                      _err);
1270

1271
      if (pNewDb->cfg.withArbitrator != pOldDb->cfg.withArbitrator) {
429!
1272
        if (pNewDb->cfg.withArbitrator) {
×
1273
          SArbGroup arbGroup = {0};
×
1274
          TAOS_CHECK_GOTO(mndArbGroupInitFromVgObj(&newVgroup, &arbGroup), &lino, _err);
×
UNCOV
1275
          TAOS_CHECK_GOTO(mndSetCreateArbGroupCommitLogs(pTrans, &arbGroup), &lino, _err);
×
1276
        } else {
1277
          SArbGroup arbGroup = {0};
×
1278
          TAOS_CHECK_GOTO(mndArbGroupInitFromVgObj(pVgroup, &arbGroup), &lino, _err);
×
UNCOV
1279
          TAOS_CHECK_GOTO(mndSetDropArbGroupCommitLogs(pTrans, &arbGroup), &lino, _err);
×
1280
        }
1281
      }
1282
    }
1283

1284
    sdbRelease(pSdb, pVgroup);
6,090✔
1285
  }
1286

1287
  taosArrayDestroy(pArray);
171✔
1288
  TAOS_RETURN(code);
171✔
1289

1290
_err:
×
UNCOV
1291
  mError("db:%s, %s failed at %d since %s", pNewDb->name, __func__, lino, tstrerror(code));
×
1292

1293
  sdbCancelFetch(pSdb, pIter);
×
1294
  sdbRelease(pSdb, pVgroup);
×
1295
  taosArrayDestroy(pArray);
×
UNCOV
1296
  TAOS_RETURN(code);
×
1297
}
1298

1299
static int32_t mndAlterDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pOld, SDbObj *pNew) {
172✔
1300
  int32_t code = -1;
172✔
1301
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq, "alter-db");
172✔
1302
  if (pTrans == NULL) {
172!
1303
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1304
    if (terrno != 0) code = terrno;
×
UNCOV
1305
    TAOS_RETURN(code);
×
1306
  }
1307
  mInfo("trans:%d, used to alter db:%s", pTrans->id, pOld->name);
172!
1308
  mInfo("trans:%d, used to alter db, ableToBeKilled:%d, killMode:%d", pTrans->id, pTrans->ableToBeKilled, pTrans->killMode);
172!
1309

1310
  mndTransSetDbName(pTrans, pOld->name, NULL);
172✔
1311
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
172!
1312
  TAOS_CHECK_GOTO(mndTransCheckConflictWithCompact(pMnode, pTrans), NULL, _OVER);
172✔
1313

1314
  TAOS_CHECK_GOTO(mndSetAlterDbPrepareLogs(pMnode, pTrans, pOld, pNew), NULL, _OVER);
171!
1315
  TAOS_CHECK_GOTO(mndSetAlterDbCommitLogs(pMnode, pTrans, pOld, pNew), NULL, _OVER);
171!
1316
  TAOS_CHECK_GOTO(mndSetAlterDbRedoActions(pMnode, pTrans, pOld, pNew), NULL, _OVER);
171!
1317

1318
  mInfo("trans:%d, used to alter db, ableToBeKilled:%d, killMode:%d", pTrans->id, pTrans->ableToBeKilled, pTrans->killMode);
171!
1319
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
171!
1320
  code = 0;
171✔
1321

1322
_OVER:
172✔
1323
  mndTransDrop(pTrans);
172✔
1324
  TAOS_RETURN(code);
172✔
1325
}
1326

1327
static int32_t mndProcessAlterDbReq(SRpcMsg *pReq) {
200✔
1328
  SMnode     *pMnode = pReq->info.node;
200✔
1329
  int32_t     code = -1;
200✔
1330
  SDbObj     *pDb = NULL;
200✔
1331
  SAlterDbReq alterReq = {0};
200✔
1332
  SDbObj      dbObj = {0};
200✔
1333

1334
  TAOS_CHECK_GOTO(tDeserializeSAlterDbReq(pReq->pCont, pReq->contLen, &alterReq), NULL, _OVER);
200!
1335

1336
  mInfo("db:%s, start to alter", alterReq.db);
200!
1337

1338
  pDb = mndAcquireDb(pMnode, alterReq.db);
200✔
1339
  if (pDb == NULL) {
200!
1340
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1341
    if (terrno != 0) code = terrno;
×
UNCOV
1342
    goto _OVER;
×
1343
  }
1344

1345
  TAOS_CHECK_GOTO(mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_ALTER_DB, pDb), NULL, _OVER);
200✔
1346

1347
  if (alterReq.replications == 2) {
199✔
1348
    TAOS_CHECK_GOTO(grantCheck(TSDB_GRANT_DUAL_REPLICA_HA), NULL, _OVER);
1!
1349
  }
1350

1351
  int32_t numOfTopics = 0;
199✔
1352
  TAOS_CHECK_GOTO(mndGetNumOfTopics(pMnode, pDb->name, &numOfTopics), NULL, _OVER);
199!
1353

1354
  if (numOfTopics != 0 && alterReq.walRetentionPeriod == 0) {
199!
1355
    code = TSDB_CODE_MND_DB_RETENTION_PERIOD_ZERO;
×
UNCOV
1356
    mError("db:%s, not allowed to set WAL_RETENTION_PERIOD 0 when there are topics defined. numOfTopics:%d", pDb->name,
×
1357
           numOfTopics);
UNCOV
1358
    goto _OVER;
×
1359
  }
1360

1361
  (void)memcpy(&dbObj, pDb, sizeof(SDbObj));
199✔
1362
  if (dbObj.cfg.pRetensions != NULL) {
199!
1363
    dbObj.cfg.pRetensions = taosArrayDup(pDb->cfg.pRetensions, NULL);
×
UNCOV
1364
    if (dbObj.cfg.pRetensions == NULL) goto _OVER;
×
1365
  }
1366

1367
  code = mndSetDbCfgFromAlterDbReq(&dbObj, &alterReq);
199✔
1368
  if (code != 0) {
199✔
1369
    if (code == TSDB_CODE_MND_DB_OPTION_UNCHANGED) code = 0;
26!
1370
    goto _OVER;
26✔
1371
  }
1372

1373
  TAOS_CHECK_GOTO(mndCheckInChangeDbCfg(pMnode, &pDb->cfg, &dbObj.cfg), NULL, _OVER);
173✔
1374

1375
  dbObj.cfgVersion++;
172✔
1376
  dbObj.updateTime = taosGetTimestampMs();
172✔
1377
  code = mndAlterDb(pMnode, pReq, pDb, &dbObj);
172✔
1378

1379
  if (dbObj.cfg.replications != pDb->cfg.replications) {
172✔
1380
    // return quickly, operation executed asynchronously
1381
    mInfo("db:%s, alter db replica from %d to %d", pDb->name, pDb->cfg.replications, dbObj.cfg.replications);
5!
1382
  } else {
1383
    if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
167!
1384
  }
1385

1386
  SName name = {0};
172✔
1387
  if (tNameFromString(&name, alterReq.db, T_NAME_ACCT | T_NAME_DB) < 0)
172!
UNCOV
1388
    mError("db:%s, failed to parse db name", alterReq.db);
×
1389

1390
  auditRecord(pReq, pMnode->clusterId, "alterDB", name.dbname, "", alterReq.sql, alterReq.sqlLen);
172✔
1391

1392
_OVER:
200✔
1393
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
200✔
1394
    if (terrno != 0) code = terrno;
3!
1395
    mError("db:%s, failed to alter since %s", alterReq.db, tstrerror(code));
3!
1396
  }
1397

1398
  mndReleaseDb(pMnode, pDb);
200✔
1399
  taosArrayDestroy(dbObj.cfg.pRetensions);
200✔
1400
  tFreeSAlterDbReq(&alterReq);
200✔
1401

1402
  TAOS_RETURN(code);
200✔
1403
}
1404

1405
static void mndDumpDbCfgInfo(SDbCfgRsp *cfgRsp, SDbObj *pDb) {
78,398✔
1406
  tstrncpy(cfgRsp->db, pDb->name, sizeof(cfgRsp->db));
78,398✔
1407
  cfgRsp->dbId = pDb->uid;
78,398✔
1408
  cfgRsp->cfgVersion = pDb->cfgVersion;
78,398✔
1409
  cfgRsp->numOfVgroups = pDb->cfg.numOfVgroups;
78,398✔
1410
  cfgRsp->numOfStables = pDb->cfg.numOfStables;
78,398✔
1411
  cfgRsp->buffer = pDb->cfg.buffer;
78,398✔
1412
  cfgRsp->cacheSize = pDb->cfg.cacheLastSize;
78,398✔
1413
  cfgRsp->pageSize = pDb->cfg.pageSize;
78,398✔
1414
  cfgRsp->pages = pDb->cfg.pages;
78,398✔
1415
  cfgRsp->daysPerFile = pDb->cfg.daysPerFile;
78,398✔
1416
  cfgRsp->daysToKeep0 = pDb->cfg.daysToKeep0;
78,398✔
1417
  cfgRsp->daysToKeep1 = pDb->cfg.daysToKeep1;
78,398✔
1418
  cfgRsp->daysToKeep2 = pDb->cfg.daysToKeep2;
78,398✔
1419
  cfgRsp->keepTimeOffset = pDb->cfg.keepTimeOffset;
78,398✔
1420
  cfgRsp->minRows = pDb->cfg.minRows;
78,398✔
1421
  cfgRsp->maxRows = pDb->cfg.maxRows;
78,398✔
1422
  cfgRsp->walFsyncPeriod = pDb->cfg.walFsyncPeriod;
78,398✔
1423
  cfgRsp->hashPrefix = pDb->cfg.hashPrefix;
78,398✔
1424
  cfgRsp->hashSuffix = pDb->cfg.hashSuffix;
78,398✔
1425
  cfgRsp->hashMethod = pDb->cfg.hashMethod;
78,398✔
1426
  cfgRsp->walLevel = pDb->cfg.walLevel;
78,398✔
1427
  cfgRsp->precision = pDb->cfg.precision;
78,398✔
1428
  cfgRsp->compression = pDb->cfg.compression;
78,398✔
1429
  cfgRsp->replications = pDb->cfg.replications;
78,398✔
1430
  cfgRsp->strict = pDb->cfg.strict;
78,398✔
1431
  cfgRsp->cacheLast = pDb->cfg.cacheLast;
78,398✔
1432
  cfgRsp->tsdbPageSize = pDb->cfg.tsdbPageSize;
78,398✔
1433
  cfgRsp->walRetentionPeriod = pDb->cfg.walRetentionPeriod;
78,398✔
1434
  cfgRsp->walRollPeriod = pDb->cfg.walRollPeriod;
78,398✔
1435
  cfgRsp->walRetentionSize = pDb->cfg.walRetentionSize;
78,398✔
1436
  cfgRsp->walSegmentSize = pDb->cfg.walSegmentSize;
78,398✔
1437
  cfgRsp->numOfRetensions = pDb->cfg.numOfRetensions;
78,398✔
1438
  cfgRsp->pRetensions = taosArrayDup(pDb->cfg.pRetensions, NULL);
78,398✔
1439
  cfgRsp->schemaless = pDb->cfg.schemaless;
78,397✔
1440
  cfgRsp->sstTrigger = pDb->cfg.sstTrigger;
78,397✔
1441
  cfgRsp->s3ChunkSize = pDb->cfg.s3ChunkSize;
78,397✔
1442
  cfgRsp->s3KeepLocal = pDb->cfg.s3KeepLocal;
78,397✔
1443
  cfgRsp->s3Compact = pDb->cfg.s3Compact;
78,397✔
1444
  cfgRsp->withArbitrator = pDb->cfg.withArbitrator;
78,397✔
1445
  cfgRsp->encryptAlgorithm = pDb->cfg.encryptAlgorithm;
78,397✔
1446
  cfgRsp->compactInterval = pDb->cfg.compactInterval;
78,397✔
1447
  cfgRsp->compactStartTime = pDb->cfg.compactStartTime;
78,397✔
1448
  cfgRsp->compactEndTime = pDb->cfg.compactEndTime;
78,397✔
1449
  cfgRsp->compactTimeOffset = pDb->cfg.compactTimeOffset;
78,397✔
1450
}
78,397✔
1451

1452
static int32_t mndProcessGetDbCfgReq(SRpcMsg *pReq) {
71,911✔
1453
  SMnode   *pMnode = pReq->info.node;
71,911✔
1454
  int32_t   code = -1;
71,911✔
1455
  SDbObj   *pDb = NULL;
71,911✔
1456
  SDbCfgReq cfgReq = {0};
71,911✔
1457
  SDbCfgRsp cfgRsp = {0};
71,911✔
1458

1459
  TAOS_CHECK_GOTO(tDeserializeSDbCfgReq(pReq->pCont, pReq->contLen, &cfgReq), NULL, _OVER);
71,911!
1460

1461
  if (strcasecmp(cfgReq.db, TSDB_INFORMATION_SCHEMA_DB) && strcasecmp(cfgReq.db, TSDB_PERFORMANCE_SCHEMA_DB)) {
71,911!
1462
    pDb = mndAcquireDb(pMnode, cfgReq.db);
71,910✔
1463
    if (pDb == NULL) {
71,911✔
1464
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
54✔
1465
      if (terrno != 0) code = terrno;
54!
1466
      goto _OVER;
54✔
1467
    }
1468

1469
    mndDumpDbCfgInfo(&cfgRsp, pDb);
71,857✔
1470
  }
1471

1472
  int32_t contLen = tSerializeSDbCfgRsp(NULL, 0, &cfgRsp);
71,857✔
1473
  void   *pRsp = rpcMallocCont(contLen);
71,856✔
1474
  if (pRsp == NULL) {
71,854!
1475
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1476
    if (terrno != 0) code = terrno;
×
UNCOV
1477
    goto _OVER;
×
1478
  }
1479

1480
  int32_t ret = 0;
71,854✔
1481
  if ((ret = tSerializeSDbCfgRsp(pRsp, contLen, &cfgRsp)) < 0) {
71,854!
1482
    code = ret;
×
UNCOV
1483
    goto _OVER;
×
1484
  }
1485

1486
  pReq->info.rsp = pRsp;
71,857✔
1487
  pReq->info.rspLen = contLen;
71,857✔
1488

1489
  code = 0;
71,857✔
1490

1491
_OVER:
71,911✔
1492

1493
  tFreeSDbCfgRsp(&cfgRsp);
71,911✔
1494

1495
  if (code != 0) {
71,908✔
1496
    mError("db:%s, failed to get cfg since %s", cfgReq.db, terrstr());
54!
1497
  }
1498

1499
  mndReleaseDb(pMnode, pDb);
71,908✔
1500

1501
  TAOS_RETURN(code);
71,911✔
1502
}
1503

1504
static int32_t mndSetDropDbPrepareLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
1,923✔
1505
  int32_t  code = 0;
1,923✔
1506
  SSdbRaw *pRedoRaw = mndDbActionEncode(pDb);
1,923✔
1507
  if (pRedoRaw == NULL) {
1,923!
1508
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1509
    if (terrno != 0) code = terrno;
×
UNCOV
1510
    return -1;
×
1511
  }
1512
  TAOS_CHECK_RETURN(mndTransAppendPrepareLog(pTrans, pRedoRaw));
1,923!
1513
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_DROPPING));
1,923!
1514

1515
  SSdb *pSdb = pMnode->pSdb;
1,923✔
1516
  void *pIter = NULL;
1,923✔
1517

1518
  while (1) {
6✔
1519
    SArbGroup *pArbGroup = NULL;
1,929✔
1520
    pIter = sdbFetch(pSdb, SDB_ARBGROUP, pIter, (void **)&pArbGroup);
1,929✔
1521
    if (pIter == NULL) break;
1,929✔
1522

1523
    if (pArbGroup->dbUid == pDb->uid) {
6!
1524
      if ((code = mndSetDropArbGroupPrepareLogs(pTrans, pArbGroup)) != 0) {
6!
1525
        sdbCancelFetch(pSdb, pIter);
×
1526
        sdbRelease(pSdb, pArbGroup);
×
UNCOV
1527
        TAOS_RETURN(code);
×
1528
      }
1529
    }
1530

1531
    sdbRelease(pSdb, pArbGroup);
6✔
1532
  }
1533

1534
  TAOS_RETURN(code);
1,923✔
1535
}
1536

1537
static int32_t mndSetDropDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
1,923✔
1538
  int32_t  code = 0;
1,923✔
1539
  SSdbRaw *pCommitRaw = mndDbActionEncode(pDb);
1,923✔
1540
  if (pCommitRaw == NULL) {
1,923!
1541
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1542
    if (terrno != 0) code = terrno;
×
UNCOV
1543
    return -1;
×
1544
  }
1545
  TAOS_CHECK_RETURN(mndTransAppendCommitlog(pTrans, pCommitRaw));
1,923!
1546
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED));
1,923!
1547

1548
  SSdb *pSdb = pMnode->pSdb;
1,923✔
1549
  void *pIter = NULL;
1,923✔
1550

1551
  while (1) {
6✔
1552
    SArbGroup *pArbGroup = NULL;
1,929✔
1553
    pIter = sdbFetch(pSdb, SDB_ARBGROUP, pIter, (void **)&pArbGroup);
1,929✔
1554
    if (pIter == NULL) break;
1,929✔
1555

1556
    if (pArbGroup->dbUid == pDb->uid) {
6!
1557
      if ((code = mndSetDropArbGroupCommitLogs(pTrans, pArbGroup)) != 0) {
6!
1558
        sdbCancelFetch(pSdb, pIter);
×
1559
        sdbRelease(pSdb, pArbGroup);
×
UNCOV
1560
        TAOS_RETURN(code);
×
1561
      }
1562
    }
1563

1564
    sdbRelease(pSdb, pArbGroup);
6✔
1565
  }
1566

1567
  while (1) {
17,830✔
1568
    SVgObj *pVgroup = NULL;
19,753✔
1569
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
19,753✔
1570
    if (pIter == NULL) break;
19,753✔
1571

1572
    if (pVgroup->dbUid == pDb->uid) {
17,830✔
1573
      SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroup);
4,351✔
1574
      if (pVgRaw == NULL) {
4,351!
1575
        sdbCancelFetch(pSdb, pIter);
×
1576
        sdbRelease(pSdb, pVgroup);
×
1577
        code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1578
        if (terrno != 0) code = terrno;
×
UNCOV
1579
        TAOS_RETURN(code);
×
1580
      }
1581
      if ((code = mndTransAppendCommitlog(pTrans, pVgRaw)) != 0) {
4,351!
1582
        sdbCancelFetch(pSdb, pIter);
×
1583
        sdbRelease(pSdb, pVgroup);
×
UNCOV
1584
        TAOS_RETURN(code);
×
1585
      }
1586
      if ((code = sdbSetRawStatus(pVgRaw, SDB_STATUS_DROPPED)) != 0) {
4,351!
1587
        sdbCancelFetch(pSdb, pIter);
×
1588
        sdbRelease(pSdb, pVgroup);
×
UNCOV
1589
        TAOS_RETURN(code);
×
1590
      }
1591
    }
1592

1593
    sdbRelease(pSdb, pVgroup);
17,830✔
1594
  }
1595

1596
  while (1) {
26,972✔
1597
    SStbObj *pStb = NULL;
28,895✔
1598
    pIter = sdbFetch(pSdb, SDB_STB, pIter, (void **)&pStb);
28,895✔
1599
    if (pIter == NULL) break;
28,895✔
1600

1601
    if (pStb->dbUid == pDb->uid) {
26,972✔
1602
      SSdbRaw *pStbRaw = mndStbActionEncode(pStb);
4,240✔
1603
      if (pStbRaw == NULL) {
4,240!
1604
        sdbCancelFetch(pSdb, pIter);
×
1605
        sdbRelease(pSdb, pStbRaw);
×
1606
        code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1607
        if (terrno != 0) code = terrno;
×
UNCOV
1608
        return -1;
×
1609
      }
1610
      if ((code = mndTransAppendCommitlog(pTrans, pStbRaw)) != 0) {
4,240!
1611
        sdbCancelFetch(pSdb, pIter);
×
1612
        sdbRelease(pSdb, pStbRaw);
×
UNCOV
1613
        return -1;
×
1614
      }
1615
      if ((code = sdbSetRawStatus(pStbRaw, SDB_STATUS_DROPPED)) != 0) {
4,240!
1616
        sdbCancelFetch(pSdb, pIter);
×
1617
        sdbRelease(pSdb, pStbRaw);
×
UNCOV
1618
        return -1;
×
1619
      }
1620
    }
1621

1622
    sdbRelease(pSdb, pStb);
26,972✔
1623
  }
1624

1625
  TAOS_RETURN(code);
1,923✔
1626
}
1627

1628
static int32_t mndBuildDropVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup) {
4,348✔
1629
  int32_t code = 0;
4,348✔
1630
  for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
8,816✔
1631
    SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
4,468✔
1632
    TAOS_CHECK_RETURN(mndAddDropVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid, true));
4,468!
1633
  }
1634

1635
  TAOS_RETURN(code);
4,348✔
1636
}
1637

1638
static int32_t mndSetDropDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
1,922✔
1639
  int32_t code = 0;
1,922✔
1640
  SSdb   *pSdb = pMnode->pSdb;
1,922✔
1641
  void   *pIter = NULL;
1,922✔
1642

1643
  while (1) {
17,821✔
1644
    SVgObj *pVgroup = NULL;
19,743✔
1645
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
19,743✔
1646
    if (pIter == NULL) break;
19,743✔
1647

1648
    if (pVgroup->dbUid == pDb->uid) {
17,821✔
1649
      if ((code = mndBuildDropVgroupAction(pMnode, pTrans, pDb, pVgroup)) != 0) {
4,348!
1650
        sdbCancelFetch(pSdb, pIter);
×
1651
        sdbRelease(pSdb, pVgroup);
×
UNCOV
1652
        TAOS_RETURN(code);
×
1653
      }
1654
    }
1655

1656
    sdbRelease(pSdb, pVgroup);
17,821✔
1657
  }
1658

1659
  TAOS_RETURN(code);
1,922✔
1660
}
1661

1662
static int32_t mndBuildDropDbRsp(SDbObj *pDb, int32_t *pRspLen, void **ppRsp, bool useRpcMalloc) {
3,801✔
1663
  int32_t    code = 0;
3,801✔
1664
  SDropDbRsp dropRsp = {0};
3,801✔
1665
  if (pDb != NULL) {
3,801✔
1666
    (void)memcpy(dropRsp.db, pDb->name, TSDB_DB_FNAME_LEN);
1,922✔
1667
    dropRsp.uid = pDb->uid;
1,922✔
1668
  }
1669

1670
  int32_t rspLen = tSerializeSDropDbRsp(NULL, 0, &dropRsp);
3,801✔
1671
  void   *pRsp = NULL;
3,801✔
1672
  if (useRpcMalloc) {
3,801✔
1673
    pRsp = rpcMallocCont(rspLen);
1,879✔
1674
  } else {
1675
    pRsp = taosMemoryMalloc(rspLen);
1,922!
1676
  }
1677

1678
  if (pRsp == NULL) {
3,801!
1679
    code = terrno;
×
UNCOV
1680
    TAOS_RETURN(code);
×
1681
  }
1682

1683
  int32_t ret = 0;
3,801✔
1684
  if ((ret = tSerializeSDropDbRsp(pRsp, rspLen, &dropRsp)) < 0) return ret;
3,801!
1685
  *pRspLen = rspLen;
3,801✔
1686
  *ppRsp = pRsp;
3,801✔
1687
  TAOS_RETURN(code);
3,801✔
1688
}
1689

1690
static int32_t mndDropDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb) {
1,924✔
1691
  int32_t code = -1;
1,924✔
1692

1693
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq, "drop-db");
1,924✔
1694
  if (pTrans == NULL) {
1,924!
1695
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1696
    if (terrno != 0) code = terrno;
×
UNCOV
1697
    goto _OVER;
×
1698
  }
1699

1700
  mInfo("trans:%d start to drop db:%s", pTrans->id, pDb->name);
1,924!
1701

1702
  mndTransSetDbName(pTrans, pDb->name, NULL);
1,924✔
1703
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
1,924!
1704

1705
  if (mndTopicExistsForDb(pMnode, pDb)) {
1,924✔
1706
    code = TSDB_CODE_MND_TOPIC_MUST_BE_DELETED;
1✔
1707
    goto _OVER;
1✔
1708
  }
1709

1710
  TAOS_CHECK_GOTO(mndSetDropDbPrepareLogs(pMnode, pTrans, pDb), NULL, _OVER);
1,923!
1711
  TAOS_CHECK_GOTO(mndSetDropDbCommitLogs(pMnode, pTrans, pDb), NULL, _OVER);
1,923!
1712
  TAOS_CHECK_GOTO(mndDropStreamByDb(pMnode, pTrans, pDb), NULL, _OVER);
1,923✔
1713
#ifdef TD_ENTERPRISE
1714
  TAOS_CHECK_GOTO(mndDropViewByDb(pMnode, pTrans, pDb), NULL, _OVER);
1,922!
1715
#endif
1716
  TAOS_CHECK_GOTO(mndDropSmasByDb(pMnode, pTrans, pDb), NULL, _OVER);
1,922!
1717
  TAOS_CHECK_GOTO(mndDropIdxsByDb(pMnode, pTrans, pDb), NULL, _OVER);
1,922!
1718
  TAOS_CHECK_GOTO(mndStreamSetStopStreamTasksActions(pMnode, pTrans, pDb->uid), NULL, _OVER);
1,922!
1719
  TAOS_CHECK_GOTO(mndSetDropDbRedoActions(pMnode, pTrans, pDb), NULL, _OVER);
1,922!
1720
  TAOS_CHECK_GOTO(mndUserRemoveDb(pMnode, pTrans, pDb->name), NULL, _OVER);
1,922!
1721

1722
  int32_t rspLen = 0;
1,922✔
1723
  void   *pRsp = NULL;
1,922✔
1724
  TAOS_CHECK_GOTO(mndBuildDropDbRsp(pDb, &rspLen, &pRsp, false), NULL, _OVER);
1,922!
1725
  mndTransSetRpcRsp(pTrans, pRsp, rspLen);
1,922✔
1726

1727
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
1,922!
1728
  code = 0;
1,922✔
1729

1730
_OVER:
1,924✔
1731
  mndTransDrop(pTrans);
1,924✔
1732
  TAOS_RETURN(code);
1,924✔
1733
}
1734

1735
static int32_t mndProcessDropDbReq(SRpcMsg *pReq) {
3,874✔
1736
  SMnode    *pMnode = pReq->info.node;
3,874✔
1737
  int32_t    code = -1;
3,874✔
1738
  SDbObj    *pDb = NULL;
3,874✔
1739
  SDropDbReq dropReq = {0};
3,874✔
1740

1741
  TAOS_CHECK_GOTO(tDeserializeSDropDbReq(pReq->pCont, pReq->contLen, &dropReq), NULL, _OVER);
3,874!
1742

1743
  mInfo("db:%s, start to drop", dropReq.db);
3,874!
1744

1745
  pDb = mndAcquireDb(pMnode, dropReq.db);
3,874✔
1746
  if (pDb == NULL) {
3,874✔
1747
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
1,941✔
1748
    if (terrno != 0) code = terrno;
1,941!
1749
    if (dropReq.ignoreNotExists) {
1,941✔
1750
      code = mndBuildDropDbRsp(pDb, &pReq->info.rspLen, &pReq->info.rsp, true);
1,879✔
1751
    }
1752
    goto _OVER;
1,941✔
1753
  }
1754

1755
  TAOS_CHECK_GOTO(mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_DROP_DB, pDb), NULL, _OVER);
1,933✔
1756

1757
  code = mndDropDb(pMnode, pReq, pDb);
1,924✔
1758
  if (code == TSDB_CODE_SUCCESS) {
1,924✔
1759
    code = TSDB_CODE_ACTION_IN_PROGRESS;
1,922✔
1760
  }
1761

1762
  SName name = {0};
1,924✔
1763
  if (tNameFromString(&name, dropReq.db, T_NAME_ACCT | T_NAME_DB) < 0)
1,924!
UNCOV
1764
    mError("db:%s, failed to parse db name", dropReq.db);
×
1765

1766
  auditRecord(pReq, pMnode->clusterId, "dropDB", name.dbname, "", dropReq.sql, dropReq.sqlLen);
1,924✔
1767

1768
_OVER:
3,874✔
1769
  if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_ACTION_IN_PROGRESS) {
3,874✔
1770
    mError("db:%s, failed to drop since %s", dropReq.db, terrstr());
73!
1771
  }
1772

1773
  mndReleaseDb(pMnode, pDb);
3,874✔
1774
  tFreeSDropDbReq(&dropReq);
3,874✔
1775
  TAOS_RETURN(code);
3,874✔
1776
}
1777

1778
static int32_t mndGetDBTableNum(SDbObj *pDb, SMnode *pMnode) {
2,524,833✔
1779
  int32_t numOfTables = 0;
2,524,833✔
1780
  int32_t vindex = 0;
2,524,833✔
1781
  SSdb   *pSdb = pMnode->pSdb;
2,524,833✔
1782

1783
  void *pIter = NULL;
2,524,833✔
1784
  while (vindex < pDb->cfg.numOfVgroups) {
70,305,325✔
1785
    SVgObj *pVgroup = NULL;
67,779,996✔
1786
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
67,779,996✔
1787
    if (pIter == NULL) break;
67,780,462!
1788

1789
    if (mndVgroupInDb(pVgroup, pDb->uid)) {
67,780,462✔
1790
      numOfTables += pVgroup->numOfTables / TSDB_TABLE_NUM_UNIT;
5,072,097✔
1791
      vindex++;
5,072,097✔
1792
    }
1793

1794
    sdbRelease(pSdb, pVgroup);
67,780,334✔
1795
  }
1796

1797
  sdbCancelFetch(pSdb, pIter);
2,525,329✔
1798
  return numOfTables;
2,524,867✔
1799
}
1800

1801
void mndBuildDBVgroupInfo(SDbObj *pDb, SMnode *pMnode, SArray *pVgList) {
2,696,504✔
1802
  int32_t vindex = 0;
2,696,504✔
1803
  SSdb   *pSdb = pMnode->pSdb;
2,696,504✔
1804

1805
  void *pIter = NULL;
2,696,504✔
1806
  while (1) {
75,964,290✔
1807
    SVgObj *pVgroup = NULL;
78,660,794✔
1808
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
78,660,794✔
1809
    if (pIter == NULL) break;
78,660,816✔
1810

1811
    if ((NULL == pDb || pVgroup->dbUid == pDb->uid) && !pVgroup->isTsma) {
78,372,266!
1812
      SVgroupInfo vgInfo = {0};
18,454,368✔
1813
      vgInfo.vgId = pVgroup->vgId;
18,454,368✔
1814
      vgInfo.hashBegin = pVgroup->hashBegin;
18,454,368✔
1815
      vgInfo.hashEnd = pVgroup->hashEnd;
18,454,368✔
1816
      vgInfo.numOfTable = pVgroup->numOfTables / TSDB_TABLE_NUM_UNIT;
18,454,368✔
1817
      vgInfo.epSet.numOfEps = pVgroup->replica;
18,454,368✔
1818
      for (int32_t gid = 0; gid < pVgroup->replica; ++gid) {
36,919,804✔
1819
        SVnodeGid *pVgid = &pVgroup->vnodeGid[gid];
18,465,408✔
1820
        SEp       *pEp = &vgInfo.epSet.eps[gid];
18,465,408✔
1821
        SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
18,465,408✔
1822
        if (pDnode != NULL) {
18,465,411✔
1823
          (void)memcpy(pEp->fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
18,465,294✔
1824
          pEp->port = pDnode->port;
18,465,294✔
1825
        }
1826
        mndReleaseDnode(pMnode, pDnode);
18,465,411✔
1827
        if (pVgid->syncState == TAOS_SYNC_STATE_LEADER || pVgid->syncState == TAOS_SYNC_STATE_ASSIGNED_LEADER) {
18,465,436!
1828
          vgInfo.epSet.inUse = gid;
18,453,428✔
1829
        }
1830
      }
1831
      vindex++;
18,454,396✔
1832
      if (taosArrayPush(pVgList, &vgInfo) == NULL) {
18,454,335!
UNCOV
1833
        mError("db:%s, failed to push vgInfo to array, vgId:%d, but continue next", pDb->name, vgInfo.vgId);
×
1834
      }
1835
    }
1836

1837
    sdbRelease(pSdb, pVgroup);
78,372,236✔
1838

1839
    if (pDb && (vindex >= pDb->cfg.numOfVgroups)) {
78,372,261✔
1840
      sdbCancelFetch(pSdb, pIter);
2,407,971✔
1841
      break;
2,407,971✔
1842
    }
1843
  }
1844
}
2,696,521✔
1845

1846
int32_t mndExtractDbInfo(SMnode *pMnode, SDbObj *pDb, SUseDbRsp *pRsp, const SUseDbReq *pReq) {
2,485,689✔
1847
  int32_t code = 0;
2,485,689✔
1848
  pRsp->pVgroupInfos = taosArrayInit(pDb->cfg.numOfVgroups, sizeof(SVgroupInfo));
2,485,689✔
1849
  if (pRsp->pVgroupInfos == NULL) {
2,485,646!
1850
    code = terrno;
×
UNCOV
1851
    TAOS_RETURN(code);
×
1852
  }
1853

1854
  int32_t numOfTable = mndGetDBTableNum(pDb, pMnode);
2,485,646✔
1855

1856
  if (pReq == NULL || pReq->vgVersion < pDb->vgVersion || pReq->dbId != pDb->uid || numOfTable != pReq->numOfTable ||
2,485,688!
1857
      pReq->stateTs < pDb->stateTs) {
80,462✔
1858
    mndBuildDBVgroupInfo(pDb, pMnode, pRsp->pVgroupInfos);
2,405,574✔
1859
  }
1860

1861
  (void)memcpy(pRsp->db, pDb->name, TSDB_DB_FNAME_LEN);
2,485,690✔
1862
  pRsp->uid = pDb->uid;
2,485,690✔
1863
  pRsp->vgVersion = pDb->vgVersion;
2,485,690✔
1864
  pRsp->stateTs = pDb->stateTs;
2,485,690✔
1865
  pRsp->vgNum = taosArrayGetSize(pRsp->pVgroupInfos);
2,485,690✔
1866
  pRsp->hashMethod = pDb->cfg.hashMethod;
2,485,689✔
1867
  pRsp->hashPrefix = pDb->cfg.hashPrefix;
2,485,689✔
1868
  pRsp->hashSuffix = pDb->cfg.hashSuffix;
2,485,689✔
1869
  TAOS_RETURN(code);
2,485,689✔
1870
}
1871

1872
static int32_t mndProcessUseDbReq(SRpcMsg *pReq) {
2,767,990✔
1873
  SMnode   *pMnode = pReq->info.node;
2,767,990✔
1874
  int32_t   code = -1;
2,767,990✔
1875
  SDbObj   *pDb = NULL;
2,767,990✔
1876
  SUseDbReq usedbReq = {0};
2,767,990✔
1877
  SUseDbRsp usedbRsp = {0};
2,767,990✔
1878

1879
  TAOS_CHECK_GOTO(tDeserializeSUseDbReq(pReq->pCont, pReq->contLen, &usedbReq), NULL, _OVER);
2,767,990!
1880

1881
  char *p = strchr(usedbReq.db, '.');
2,768,021✔
1882
  if (p && ((0 == strcmp(p + 1, TSDB_INFORMATION_SCHEMA_DB) || (0 == strcmp(p + 1, TSDB_PERFORMANCE_SCHEMA_DB))))) {
2,768,021✔
1883
    (void)memcpy(usedbRsp.db, usedbReq.db, TSDB_DB_FNAME_LEN);
287,338✔
1884
    int32_t vgVersion = mndGetGlobalVgroupVersion(pMnode);
287,338✔
1885
    if (usedbReq.vgVersion < vgVersion) {
287,348✔
1886
      usedbRsp.pVgroupInfos = taosArrayInit(10, sizeof(SVgroupInfo));
287,320✔
1887
      if (usedbRsp.pVgroupInfos == NULL) goto _OVER;
287,320!
1888

1889
      mndBuildDBVgroupInfo(NULL, pMnode, usedbRsp.pVgroupInfos);
287,320✔
1890
      usedbRsp.vgVersion = vgVersion++;
287,320✔
1891
    } else {
1892
      usedbRsp.vgVersion = usedbReq.vgVersion;
28✔
1893
    }
1894
    usedbRsp.vgNum = taosArrayGetSize(usedbRsp.pVgroupInfos);
287,348✔
1895
    code = 0;
287,348✔
1896
  } else {
1897
    pDb = mndAcquireDb(pMnode, usedbReq.db);
2,480,683✔
1898
    if (pDb == NULL) {
2,480,683✔
1899
      (void)memcpy(usedbRsp.db, usedbReq.db, TSDB_DB_FNAME_LEN);
1,215✔
1900
      usedbRsp.uid = usedbReq.dbId;
1,215✔
1901
      usedbRsp.vgVersion = usedbReq.vgVersion;
1,215✔
1902
      usedbRsp.errCode = terrno;
1,215✔
1903

1904
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
1,215✔
1905
      if (terrno != 0) code = terrno;
1,215!
1906
      goto _OVER;
1,215✔
1907
    } else {
1908
      TAOS_CHECK_GOTO(mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_USE_DB, pDb), NULL, _OVER);
2,479,468✔
1909

1910
      TAOS_CHECK_GOTO(mndExtractDbInfo(pMnode, pDb, &usedbRsp, &usedbReq), NULL, _OVER);
2,479,478!
1911

1912
      mDebug("db:%s, process usedb req vgVersion:%d stateTs:%" PRId64 ", rsp vgVersion:%d stateTs:%" PRId64,
2,479,478✔
1913
             usedbReq.db, usedbReq.vgVersion, usedbReq.stateTs, usedbRsp.vgVersion, usedbRsp.stateTs);
1914
      code = 0;
2,479,478✔
1915
    }
1916
  }
1917

1918
  int32_t contLen = tSerializeSUseDbRsp(NULL, 0, &usedbRsp);
2,766,826✔
1919
  void   *pRsp = rpcMallocCont(contLen);
2,766,805✔
1920
  if (pRsp == NULL) {
2,766,805!
1921
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
1922
    code = -1;
×
UNCOV
1923
    goto _OVER;
×
1924
  }
1925

1926
  int32_t ret = 0;
2,766,805✔
1927
  if ((ret = tSerializeSUseDbRsp(pRsp, contLen, &usedbRsp)) < 0) {
2,766,805!
1928
    code = ret;
×
UNCOV
1929
    goto _OVER;
×
1930
  }
1931

1932
  pReq->info.rsp = pRsp;
2,766,812✔
1933
  pReq->info.rspLen = contLen;
2,766,812✔
1934

1935
_OVER:
2,768,040✔
1936
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
2,768,040!
1937
    mError("db:%s, failed to process use db req since %s", usedbReq.db, tstrerror(code));
1,228!
1938
  }
1939

1940
  mndReleaseDb(pMnode, pDb);
2,768,040✔
1941
  tFreeSUsedbRsp(&usedbRsp);
2,768,049✔
1942

1943
  TAOS_RETURN(code);
2,768,045✔
1944
}
1945

1946
int32_t mndValidateDbInfo(SMnode *pMnode, SDbCacheInfo *pDbs, int32_t numOfDbs, void **ppRsp, int32_t *pRspLen) {
48,644✔
1947
  int32_t       code = 0;
48,644✔
1948
  SDbHbBatchRsp batchRsp = {0};
48,644✔
1949
  batchRsp.pArray = taosArrayInit(numOfDbs, sizeof(SDbHbRsp));
48,644✔
1950
  if (batchRsp.pArray == NULL) {
48,644!
1951
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
UNCOV
1952
    TAOS_RETURN(code);
×
1953
  }
1954

1955
  for (int32_t i = 0; i < numOfDbs; ++i) {
99,576✔
1956
    SDbCacheInfo *pDbCacheInfo = &pDbs[i];
50,932✔
1957
    pDbCacheInfo->dbId = be64toh(pDbCacheInfo->dbId);
50,932✔
1958
    pDbCacheInfo->vgVersion = htonl(pDbCacheInfo->vgVersion);
50,932✔
1959
    pDbCacheInfo->cfgVersion = htonl(pDbCacheInfo->cfgVersion);
50,932✔
1960
    pDbCacheInfo->numOfTable = htonl(pDbCacheInfo->numOfTable);
50,932✔
1961
    pDbCacheInfo->stateTs = be64toh(pDbCacheInfo->stateTs);
50,932✔
1962
    pDbCacheInfo->tsmaVersion = htonl(pDbCacheInfo->tsmaVersion);
50,932✔
1963

1964
    SDbHbRsp rsp = {0};
50,932✔
1965
    (void)memcpy(rsp.db, pDbCacheInfo->dbFName, TSDB_DB_FNAME_LEN);
50,932✔
1966
    rsp.dbId = pDbCacheInfo->dbId;
50,932✔
1967

1968
    if ((0 == strcasecmp(pDbCacheInfo->dbFName, TSDB_INFORMATION_SCHEMA_DB) ||
50,932✔
1969
         (0 == strcasecmp(pDbCacheInfo->dbFName, TSDB_PERFORMANCE_SCHEMA_DB)))) {
46,566✔
1970
      int32_t vgVersion = mndGetGlobalVgroupVersion(pMnode);
11,452✔
1971
      if (pDbCacheInfo->vgVersion >= vgVersion) {
11,452✔
1972
        continue;
37,574✔
1973
      }
1974

1975
      rsp.useDbRsp = taosMemoryCalloc(1, sizeof(SUseDbRsp));
1,230!
1976
      (void)memcpy(rsp.useDbRsp->db, pDbCacheInfo->dbFName, TSDB_DB_FNAME_LEN);
1,230✔
1977
      rsp.useDbRsp->pVgroupInfos = taosArrayInit(10, sizeof(SVgroupInfo));
1,230✔
1978

1979
      mndBuildDBVgroupInfo(NULL, pMnode, rsp.useDbRsp->pVgroupInfos);
1,230✔
1980
      rsp.useDbRsp->vgVersion = vgVersion++;
1,230✔
1981

1982
      rsp.useDbRsp->vgNum = taosArrayGetSize(rsp.useDbRsp->pVgroupInfos);
1,230✔
1983

1984
      if (taosArrayPush(batchRsp.pArray, &rsp) == NULL) {
2,460!
1985
        if (terrno != 0) code = terrno;
×
UNCOV
1986
        return code;
×
1987
      }
1988

1989
      continue;
1,230✔
1990
    }
1991

1992
    SDbObj *pDb = mndAcquireDb(pMnode, pDbCacheInfo->dbFName);
39,480✔
1993
    if (pDb == NULL) {
39,480✔
1994
      mTrace("db:%s, no exist", pDbCacheInfo->dbFName);
301✔
1995
      rsp.useDbRsp = taosMemoryCalloc(1, sizeof(SUseDbRsp));
301!
1996
      (void)memcpy(rsp.useDbRsp->db, pDbCacheInfo->dbFName, TSDB_DB_FNAME_LEN);
301✔
1997
      rsp.useDbRsp->uid = pDbCacheInfo->dbId;
301✔
1998
      rsp.useDbRsp->vgVersion = -1;
301✔
1999
      if (taosArrayPush(batchRsp.pArray, &rsp) == NULL) {
602!
2000
        if (terrno != 0) code = terrno;
×
UNCOV
2001
        return code;
×
2002
      }
2003
      continue;
301✔
2004
    }
2005

2006
    int32_t numOfTable = mndGetDBTableNum(pDb, pMnode);
39,179✔
2007

2008
    if (pDbCacheInfo->vgVersion >= pDb->vgVersion && pDbCacheInfo->cfgVersion >= pDb->cfgVersion &&
39,179✔
2009
        numOfTable == pDbCacheInfo->numOfTable && pDbCacheInfo->stateTs == pDb->stateTs &&
32,601!
2010
        pDbCacheInfo->tsmaVersion >= pDb->tsmaVersion) {
30,411✔
2011
      mTrace("db:%s, valid dbinfo, vgVersion:%d cfgVersion:%d stateTs:%" PRId64
25,821✔
2012
             " numOfTables:%d, not changed vgVersion:%d cfgVersion:%d stateTs:%" PRId64 " numOfTables:%d",
2013
             pDbCacheInfo->dbFName, pDbCacheInfo->vgVersion, pDbCacheInfo->cfgVersion, pDbCacheInfo->stateTs,
2014
             pDbCacheInfo->numOfTable, pDb->vgVersion, pDb->cfgVersion, pDb->stateTs, numOfTable);
2015
      mndReleaseDb(pMnode, pDb);
25,821✔
2016
      continue;
25,821✔
2017
    } else {
2018
      mTrace("db:%s, valid dbinfo, vgVersion:%d cfgVersion:%d stateTs:%" PRId64
13,358✔
2019
             " numOfTables:%d, changed to vgVersion:%d cfgVersion:%d stateTs:%" PRId64 " numOfTables:%d",
2020
             pDbCacheInfo->dbFName, pDbCacheInfo->vgVersion, pDbCacheInfo->cfgVersion, pDbCacheInfo->stateTs,
2021
             pDbCacheInfo->numOfTable, pDb->vgVersion, pDb->cfgVersion, pDb->stateTs, numOfTable);
2022
    }
2023

2024
    if (pDbCacheInfo->cfgVersion < pDb->cfgVersion) {
13,358✔
2025
      rsp.cfgRsp = taosMemoryCalloc(1, sizeof(SDbCfgRsp));
6,541!
2026
      mndDumpDbCfgInfo(rsp.cfgRsp, pDb);
6,541✔
2027
    }
2028

2029
    if (pDbCacheInfo->tsmaVersion != pDb->tsmaVersion) {
13,358✔
2030
      rsp.pTsmaRsp = taosMemoryCalloc(1, sizeof(STableTSMAInfoRsp));
12,424!
2031
      if (rsp.pTsmaRsp) rsp.pTsmaRsp->pTsmas = taosArrayInit(4, POINTER_BYTES);
12,424!
2032
      if (rsp.pTsmaRsp && rsp.pTsmaRsp->pTsmas) {
12,424!
2033
        bool    exist = false;
12,424✔
2034
        int32_t code = mndGetDbTsmas(pMnode, 0, pDb->uid, rsp.pTsmaRsp, &exist);
12,424✔
2035
        if (TSDB_CODE_SUCCESS != code) {
12,424!
UNCOV
2036
          mndReleaseDb(pMnode, pDb);
×
2037
          if (code != TSDB_CODE_NEED_RETRY) {
×
UNCOV
2038
            mError("db:%s, failed to get db tsmas", pDb->name);
×
2039
          } else {
UNCOV
2040
            mWarn("db:%s, need retry to get db tsmas", pDb->name);
×
2041
          }
UNCOV
2042
          taosArrayDestroyP(rsp.pTsmaRsp->pTsmas, tFreeAndClearTableTSMAInfo);
×
UNCOV
2043
          taosMemoryFreeClear(rsp.pTsmaRsp);
×
UNCOV
2044
          continue;
×
2045
        }
2046
        rsp.dbTsmaVersion = pDb->tsmaVersion;
12,424✔
2047
        mDebug("update tsma version to %d, got tsma num: %ld", pDb->tsmaVersion, rsp.pTsmaRsp->pTsmas->size);
12,424✔
2048
      }
2049
    }
2050

2051
    if (pDbCacheInfo->vgVersion < pDb->vgVersion || numOfTable != pDbCacheInfo->numOfTable ||
13,358!
2052
        pDbCacheInfo->stateTs != pDb->stateTs) {
13,317✔
2053
      rsp.useDbRsp = taosMemoryCalloc(1, sizeof(SUseDbRsp));
2,395!
2054
      rsp.useDbRsp->pVgroupInfos = taosArrayInit(pDb->cfg.numOfVgroups, sizeof(SVgroupInfo));
2,395✔
2055
      if (rsp.useDbRsp->pVgroupInfos == NULL) {
2,395!
2056
        mndReleaseDb(pMnode, pDb);
×
2057
        mError("db:%s, failed to malloc usedb response", pDb->name);
×
2058
        taosArrayDestroyP(rsp.pTsmaRsp->pTsmas, tFreeAndClearTableTSMAInfo);
×
2059
        taosMemoryFreeClear(rsp.pTsmaRsp);
×
UNCOV
2060
        continue;
×
2061
      }
2062

2063
      mndBuildDBVgroupInfo(pDb, pMnode, rsp.useDbRsp->pVgroupInfos);
2,395✔
2064
      (void)memcpy(rsp.useDbRsp->db, pDb->name, TSDB_DB_FNAME_LEN);
2,395✔
2065
      rsp.useDbRsp->uid = pDb->uid;
2,395✔
2066
      rsp.useDbRsp->vgVersion = pDb->vgVersion;
2,395✔
2067
      rsp.useDbRsp->stateTs = pDb->stateTs;
2,395✔
2068
      rsp.useDbRsp->vgNum = (int32_t)taosArrayGetSize(rsp.useDbRsp->pVgroupInfos);
2,395✔
2069
      rsp.useDbRsp->hashMethod = pDb->cfg.hashMethod;
2,395✔
2070
      rsp.useDbRsp->hashPrefix = pDb->cfg.hashPrefix;
2,395✔
2071
      rsp.useDbRsp->hashSuffix = pDb->cfg.hashSuffix;
2,395✔
2072
    }
2073

2074
    if (taosArrayPush(batchRsp.pArray, &rsp) == NULL) {
26,716!
2075
      mndReleaseDb(pMnode, pDb);
×
2076
      if (terrno != 0) code = terrno;
×
UNCOV
2077
      return code;
×
2078
    }
2079
    mndReleaseDb(pMnode, pDb);
13,358✔
2080
  }
2081

2082
  int32_t rspLen = tSerializeSDbHbBatchRsp(NULL, 0, &batchRsp);
48,644✔
2083
  void   *pRsp = taosMemoryMalloc(rspLen);
48,643!
2084
  if (pRsp == NULL) {
48,643!
2085
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
2086
    tFreeSDbHbBatchRsp(&batchRsp);
×
UNCOV
2087
    return -1;
×
2088
  }
2089
  int32_t ret = 0;
48,643✔
2090
  if ((ret = tSerializeSDbHbBatchRsp(pRsp, rspLen, &batchRsp)) < 0) return ret;
48,643!
2091

2092
  *ppRsp = pRsp;
48,644✔
2093
  *pRspLen = rspLen;
48,644✔
2094

2095
  tFreeSDbHbBatchRsp(&batchRsp);
48,644✔
2096
  TAOS_RETURN(code);
48,644✔
2097
}
2098

2099
static int32_t mndTrimDb(SMnode *pMnode, SDbObj *pDb) {
1✔
2100
  SSdb       *pSdb = pMnode->pSdb;
1✔
2101
  SVgObj     *pVgroup = NULL;
1✔
2102
  void       *pIter = NULL;
1✔
2103
  int32_t     code = 0;
1✔
2104
  SVTrimDbReq trimReq = {.timestamp = taosGetTimestampSec()};
1✔
2105
  int32_t     reqLen = tSerializeSVTrimDbReq(NULL, 0, &trimReq);
1✔
2106
  int32_t     contLen = reqLen + sizeof(SMsgHead);
1✔
2107

2108
  while (1) {
2✔
2109
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
3✔
2110
    if (pIter == NULL) break;
3✔
2111

2112
    SMsgHead *pHead = rpcMallocCont(contLen);
2✔
2113
    if (pHead == NULL) {
2!
2114
      sdbCancelFetch(pSdb, pVgroup);
×
2115
      sdbRelease(pSdb, pVgroup);
×
UNCOV
2116
      continue;
×
2117
    }
2118
    pHead->contLen = htonl(contLen);
2✔
2119
    pHead->vgId = htonl(pVgroup->vgId);
2✔
2120
    int32_t ret = 0;
2✔
2121
    if ((ret = tSerializeSVTrimDbReq((char *)pHead + sizeof(SMsgHead), contLen, &trimReq)) < 0) {
2!
2122
      sdbRelease(pSdb, pVgroup);
×
UNCOV
2123
      return ret;
×
2124
    }
2125

2126
    SRpcMsg rpcMsg = {.msgType = TDMT_VND_TRIM, .pCont = pHead, .contLen = contLen};
2✔
2127
    SEpSet  epSet = mndGetVgroupEpset(pMnode, pVgroup);
2✔
2128
    int32_t code = tmsgSendReq(&epSet, &rpcMsg);
2✔
2129
    if (code != 0) {
2!
UNCOV
2130
      mError("vgId:%d, failed to send vnode-trim request to vnode since 0x%x", pVgroup->vgId, code);
×
2131
    } else {
2132
      mInfo("vgId:%d, send vnode-trim request to vnode, time:%d", pVgroup->vgId, trimReq.timestamp);
2!
2133
    }
2134
    sdbRelease(pSdb, pVgroup);
2✔
2135
  }
2136

2137
  return 0;
1✔
2138
}
2139

2140
static int32_t mndProcessTrimDbReq(SRpcMsg *pReq) {
1✔
2141
  SMnode    *pMnode = pReq->info.node;
1✔
2142
  int32_t    code = -1;
1✔
2143
  SDbObj    *pDb = NULL;
1✔
2144
  STrimDbReq trimReq = {0};
1✔
2145

2146
  TAOS_CHECK_GOTO(tDeserializeSTrimDbReq(pReq->pCont, pReq->contLen, &trimReq), NULL, _OVER);
1!
2147

2148
  mInfo("db:%s, start to trim", trimReq.db);
1!
2149

2150
  pDb = mndAcquireDb(pMnode, trimReq.db);
1✔
2151
  if (pDb == NULL) {
1!
2152
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2153
    if (terrno != 0) code = terrno;
×
UNCOV
2154
    goto _OVER;
×
2155
  }
2156

2157
  TAOS_CHECK_GOTO(mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_TRIM_DB, pDb), NULL, _OVER);
1!
2158

2159
  code = mndTrimDb(pMnode, pDb);
1✔
2160

2161
_OVER:
1✔
2162
  if (code != 0) {
1!
UNCOV
2163
    mError("db:%s, failed to process trim db req since %s", trimReq.db, terrstr());
×
2164
  }
2165

2166
  mndReleaseDb(pMnode, pDb);
1✔
2167
  TAOS_RETURN(code);
1✔
2168
}
2169

2170
static int32_t mndS3MigrateDb(SMnode *pMnode, SDbObj *pDb) {
×
2171
  SSdb            *pSdb = pMnode->pSdb;
×
2172
  SVgObj          *pVgroup = NULL;
×
2173
  void            *pIter = NULL;
×
2174
  SVS3MigrateDbReq s3migrateReq = {.timestamp = taosGetTimestampSec()};
×
2175
  int32_t          reqLen = tSerializeSVS3MigrateDbReq(NULL, 0, &s3migrateReq);
×
2176
  int32_t          contLen = reqLen + sizeof(SMsgHead);
×
UNCOV
2177
  int32_t          code = 0;
×
2178

2179
  while (1) {
×
2180
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
×
UNCOV
2181
    if (pIter == NULL) break;
×
2182

UNCOV
2183
    if (pVgroup->dbUid != pDb->uid) continue;
×
2184

2185
    SMsgHead *pHead = rpcMallocCont(contLen);
×
2186
    if (pHead == NULL) {
×
2187
      sdbCancelFetch(pSdb, pVgroup);
×
2188
      sdbRelease(pSdb, pVgroup);
×
UNCOV
2189
      continue;
×
2190
    }
2191
    pHead->contLen = htonl(contLen);
×
2192
    pHead->vgId = htonl(pVgroup->vgId);
×
2193
    int32_t ret = 0;
×
2194
    if ((ret = tSerializeSVS3MigrateDbReq((char *)pHead + sizeof(SMsgHead), contLen, &s3migrateReq)) < 0) {
×
2195
      sdbRelease(pSdb, pVgroup);
×
UNCOV
2196
      return ret;
×
2197
    }
2198

2199
    SRpcMsg rpcMsg = {.msgType = TDMT_VND_S3MIGRATE, .pCont = pHead, .contLen = contLen};
×
2200
    SEpSet  epSet = mndGetVgroupEpset(pMnode, pVgroup);
×
2201
    int32_t code = tmsgSendReq(&epSet, &rpcMsg);
×
2202
    if (code != 0) {
×
UNCOV
2203
      mError("vgId:%d, failed to send vnode-s3migrate request to vnode since 0x%x", pVgroup->vgId, code);
×
2204
    } else {
UNCOV
2205
      mInfo("vgId:%d, send vnode-s3migrate request to vnode, time:%d", pVgroup->vgId, s3migrateReq.timestamp);
×
2206
    }
UNCOV
2207
    sdbRelease(pSdb, pVgroup);
×
2208
  }
2209

UNCOV
2210
  return 0;
×
2211
}
2212

2213
static int32_t mndProcessS3MigrateDbReq(SRpcMsg *pReq) {
×
2214
  SMnode         *pMnode = pReq->info.node;
×
2215
  int32_t         code = -1;
×
2216
  SDbObj         *pDb = NULL;
×
UNCOV
2217
  SS3MigrateDbReq s3migrateReq = {0};
×
2218

UNCOV
2219
  TAOS_CHECK_GOTO(tDeserializeSS3MigrateDbReq(pReq->pCont, pReq->contLen, &s3migrateReq), NULL, _OVER);
×
2220

UNCOV
2221
  mInfo("db:%s, start to s3migrate", s3migrateReq.db);
×
2222

2223
  pDb = mndAcquireDb(pMnode, s3migrateReq.db);
×
2224
  if (pDb == NULL) {
×
2225
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2226
    if (terrno != 0) code = terrno;
×
UNCOV
2227
    goto _OVER;
×
2228
  }
2229

UNCOV
2230
  TAOS_CHECK_GOTO(mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_TRIM_DB, pDb), NULL, _OVER);
×
2231

UNCOV
2232
  code = mndS3MigrateDb(pMnode, pDb);
×
2233

2234
_OVER:
×
2235
  if (code != 0) {
×
UNCOV
2236
    mError("db:%s, failed to process s3migrate db req since %s", s3migrateReq.db, terrstr());
×
2237
  }
2238

2239
  mndReleaseDb(pMnode, pDb);
×
UNCOV
2240
  TAOS_RETURN(code);
×
2241
}
2242

2243
const char *mndGetDbStr(const char *src) {
1,857,688✔
2244
  char *pos = strstr(src, TS_PATH_DELIMITER);
1,857,688✔
2245
  if (pos != NULL) ++pos;
1,857,688✔
2246
  if (pos == NULL) return src;
1,857,688✔
2247
  return pos;
1,802,240✔
2248
}
2249

2250
const char *mndGetStableStr(const char *src) {
×
2251
  char *pos = strstr(src, TS_PATH_DELIMITER);
×
2252
  if (pos != NULL) ++pos;
×
2253
  if (pos == NULL) return src;
×
UNCOV
2254
  return mndGetDbStr(pos);
×
2255
}
2256

2257
static int64_t getValOfDiffPrecision(int8_t unit, int64_t val) {
6✔
2258
  int64_t v = 0;
6✔
2259
  switch (unit) {
6!
2260
    case 's':
2✔
2261
      v = val / 1000;
2✔
2262
      break;
2✔
2263
    case 'm':
1✔
2264
      v = val / tsTickPerMin[TSDB_TIME_PRECISION_MILLI];
1✔
2265
      break;
1✔
2266
    case 'h':
×
2267
      v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 60);
×
UNCOV
2268
      break;
×
2269
    case 'd':
3✔
2270
      v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 24 * 60);
3✔
2271
      break;
3✔
2272
    case 'w':
×
2273
      v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 24 * 60 * 7);
×
2274
      break;
×
2275
    default:
×
UNCOV
2276
      break;
×
2277
  }
2278

2279
  return v;
6✔
2280
}
2281

2282
static char *buildRetension(SArray *pRetension) {
655,483✔
2283
  size_t size = taosArrayGetSize(pRetension);
655,483✔
2284
  if (size == 0) {
655,475!
2285
    return NULL;
655,489✔
2286
  }
2287

UNCOV
2288
  char       *p1 = taosMemoryCalloc(1, 100);
×
2289
  SRetention *p = taosArrayGet(pRetension, 0);
1✔
2290

2291
  int32_t len = 2;
1✔
2292

2293
  int64_t v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
1✔
2294
  int64_t v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
1✔
2295
  len += tsnprintf(p1 + len, 100 - len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
1✔
2296

2297
  if (size > 1) {
1!
2298
    len += tsnprintf(p1 + len, 100 - len, ",");
1✔
2299
    p = taosArrayGet(pRetension, 1);
1✔
2300

2301
    v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
1✔
2302
    v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
1✔
2303
    len += tsnprintf(p1 + len, 100 - len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
1✔
2304
  }
2305

2306
  if (size > 2) {
1!
2307
    len += tsnprintf(p1 + len, 100 - len, ",");
1✔
2308
    p = taosArrayGet(pRetension, 2);
1✔
2309

2310
    v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
1✔
2311
    v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
1✔
2312
    len += tsnprintf(p1 + len, 100 - len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
1✔
2313
  }
2314

2315
  varDataSetLen(p1, len);
1✔
2316
  return p1;
1✔
2317
}
2318

2319
static const char *getCacheModelStr(int8_t cacheModel) {
655,502✔
2320
  switch (cacheModel) {
655,502!
2321
    case TSDB_CACHE_MODEL_NONE:
354,995✔
2322
      return TSDB_CACHE_MODEL_NONE_STR;
354,995✔
2323
    case TSDB_CACHE_MODEL_LAST_ROW:
122,678✔
2324
      return TSDB_CACHE_MODEL_LAST_ROW_STR;
122,678✔
2325
    case TSDB_CACHE_MODEL_LAST_VALUE:
39,647✔
2326
      return TSDB_CACHE_MODEL_LAST_VALUE_STR;
39,647✔
2327
    case TSDB_CACHE_MODEL_BOTH:
138,414✔
2328
      return TSDB_CACHE_MODEL_BOTH_STR;
138,414✔
2329
    default:
×
UNCOV
2330
      break;
×
2331
  }
UNCOV
2332
  return "unknown";
×
2333
}
2334

2335
static const char *getEncryptAlgorithmStr(int8_t encryptAlgorithm) {
655,489✔
2336
  switch (encryptAlgorithm) {
655,489!
2337
    case TSDB_ENCRYPT_ALGO_NONE:
655,502✔
2338
      return TSDB_ENCRYPT_ALGO_NONE_STR;
655,502✔
2339
    case TSDB_ENCRYPT_ALGO_SM4:
×
2340
      return TSDB_ENCRYPT_ALGO_SM4_STR;
×
2341
    default:
×
UNCOV
2342
      break;
×
2343
  }
UNCOV
2344
  return "unknown";
×
2345
}
2346

2347
bool mndIsDbReady(SMnode *pMnode, SDbObj *pDb) {
659,341✔
2348
  if (pDb->cfg.replications == 1) return true;
659,341✔
2349

2350
  SSdb *pSdb = pMnode->pSdb;
1,039✔
2351
  void *pIter = NULL;
1,039✔
2352
  bool  isReady = true;
1,039✔
2353
  while (1) {
6,724✔
2354
    SVgObj *pVgroup = NULL;
7,763✔
2355
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
7,763✔
2356
    if (pIter == NULL) break;
7,782✔
2357

2358
    if (pVgroup->dbUid == pDb->uid && pVgroup->replica > 1) {
6,724!
2359
      bool hasLeader = false;
3,145✔
2360
      for (int32_t i = 0; i < pVgroup->replica; ++i) {
12,523✔
2361
        if (pVgroup->vnodeGid[i].syncState == TAOS_SYNC_STATE_LEADER ||
9,378✔
2362
            pVgroup->vnodeGid[i].syncState == TAOS_SYNC_STATE_ASSIGNED_LEADER) {
8,318!
2363
          hasLeader = true;
1,060✔
2364
        }
2365
      }
2366
      if (!hasLeader) isReady = false;
3,145✔
2367
    }
2368
    sdbRelease(pSdb, pVgroup);
6,724✔
2369
  }
2370

2371
  return isReady;
1,058✔
2372
}
2373

2374
static void mndDumpDbInfoData(SMnode *pMnode, SSDataBlock *pBlock, SDbObj *pDb, SShowObj *pShow, int32_t rows,
711,198✔
2375
                              int64_t numOfTables, bool sysDb, ESdbStatus objStatus, bool sysinfo) {
2376
  int32_t cols = 0;
711,198✔
2377
  int32_t bytes = pShow->pMeta->pSchemas[cols].bytes;
711,198✔
2378
  char   *buf = taosMemoryMalloc(bytes);
711,198!
2379
  if (buf == NULL) {
711,112!
2380
    mError("db:%s, failed to malloc buffer", pDb->name);
×
UNCOV
2381
    return;
×
2382
  }
2383
  int32_t code = 0;
711,112✔
2384
  int32_t lino = 0;
711,112✔
2385

2386
  const char *name = mndGetDbStr(pDb->name);
711,112✔
2387
  if (name != NULL) {
711,123✔
2388
    STR_WITH_MAXSIZE_TO_VARSTR(buf, name, bytes);
711,037✔
2389
  } else {
2390
    STR_WITH_MAXSIZE_TO_VARSTR(buf, "NULL", bytes);
86✔
2391
  }
2392

2393
  const char *precStr = NULL;
711,123✔
2394
  switch (pDb->cfg.precision) {
711,123✔
2395
    case TSDB_TIME_PRECISION_MILLI:
711,077✔
2396
      precStr = TSDB_TIME_PRECISION_MILLI_STR;
711,077✔
2397
      break;
711,077✔
2398
    case TSDB_TIME_PRECISION_MICRO:
13✔
2399
      precStr = TSDB_TIME_PRECISION_MICRO_STR;
13✔
2400
      break;
13✔
2401
    case TSDB_TIME_PRECISION_NANO:
23✔
2402
      precStr = TSDB_TIME_PRECISION_NANO_STR;
23✔
2403
      break;
23✔
2404
    default:
10✔
2405
      precStr = "none";
10✔
2406
      break;
10✔
2407
  }
2408
  char precVstr[10] = {0};
711,123✔
2409
  STR_WITH_MAXSIZE_TO_VARSTR(precVstr, precStr, 10);
711,123✔
2410

2411
  char *statusStr = "ready";
711,123✔
2412
  if (objStatus == SDB_STATUS_CREATING) {
711,123✔
2413
    statusStr = "creating";
125✔
2414
  } else if (objStatus == SDB_STATUS_DROPPING) {
710,998✔
2415
    statusStr = "dropping";
916✔
2416
  } else {
2417
    if (!sysDb && !mndIsDbReady(pMnode, pDb)) {
710,082✔
2418
      statusStr = "unsynced";
53✔
2419
    }
2420
  }
2421
  char statusVstr[24] = {0};
711,053✔
2422
  STR_WITH_MAXSIZE_TO_VARSTR(statusVstr, statusStr, 24);
711,053✔
2423

2424
  if (sysDb || !sysinfo) {
711,053✔
2425
    for (int32_t i = 0; i < pShow->numOfColumns; ++i) {
2,081,793✔
2426
      SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, i);
2,025,503✔
2427
      if (i == 0) {
2,024,693✔
2428
        TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, buf, false), &lino, _OVER);
53,511!
2429
      } else if (i == 1) {
1,971,182✔
2430
        TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->createdTime, false), &lino, _OVER);
55,226!
2431
      } else if (i == 3) {
1,915,956✔
2432
        TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&numOfTables, false), &lino, _OVER);
55,197!
2433
      } else if (i == 14) {
1,860,759✔
2434
        TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, precVstr, false), &lino, _OVER);
55,243!
2435
      } else if (i == 15) {
1,805,516✔
2436
        TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, statusVstr, false), &lino, _OVER);
55,280!
2437
      } else {
2438
        colDataSetNULL(pColInfo, rows);
1,750,236✔
2439
      }
2440
    }
2441
  } else {
2442
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,800✔
2443
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, buf, false), &lino, _OVER);
655,578!
2444

2445
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,474✔
2446
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->createdTime, false), &lino, _OVER);
655,380!
2447

2448
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,370✔
2449
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.numOfVgroups, false), &lino, _OVER);
655,244!
2450

2451
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,358✔
2452
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&numOfTables, false), &lino, _OVER);
655,275!
2453

2454
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,324✔
2455
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.replications, false), &lino, _OVER);
655,255!
2456

2457
    const char *strictStr = pDb->cfg.strict ? "on" : "off";
655,364!
2458
    char        strictVstr[24] = {0};
655,364✔
2459
    STR_WITH_MAXSIZE_TO_VARSTR(strictVstr, strictStr, 24);
655,364✔
2460
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,364✔
2461
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)strictVstr, false), &lino, _OVER);
655,301!
2462

2463
    char    durationStr[128] = {0};
655,566✔
2464
    char    durationVstr[128] = {0};
655,566✔
2465
    int32_t len = formatDurationOrKeep(&durationVstr[VARSTR_HEADER_SIZE], sizeof(durationVstr) - VARSTR_HEADER_SIZE,
655,566✔
2466
                                       pDb->cfg.daysPerFile);
2467

2468
    varDataSetLen(durationVstr, len);
655,817✔
2469
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,817✔
2470
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)durationVstr, false), &lino, _OVER);
655,636!
2471

2472
    char keepVstr[128] = {0};
655,628✔
2473
    char keep0Str[32] = {0};
655,628✔
2474
    char keep1Str[32] = {0};
655,628✔
2475
    char keep2Str[32] = {0};
655,628✔
2476

2477
    int32_t lenKeep0 = formatDurationOrKeep(keep0Str, sizeof(keep0Str), pDb->cfg.daysToKeep0);
655,628✔
2478
    int32_t lenKeep1 = formatDurationOrKeep(keep1Str, sizeof(keep1Str), pDb->cfg.daysToKeep1);
655,871✔
2479
    int32_t lenKeep2 = formatDurationOrKeep(keep2Str, sizeof(keep2Str), pDb->cfg.daysToKeep2);
655,933✔
2480

2481
    if (pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep1 || pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep2) {
655,919!
UNCOV
2482
      len = tsnprintf(&keepVstr[VARSTR_HEADER_SIZE], sizeof(keepVstr), "%s,%s,%s", keep1Str, keep2Str, keep0Str);
×
2483
    } else {
2484
      len = tsnprintf(&keepVstr[VARSTR_HEADER_SIZE], sizeof(keepVstr), "%s,%s,%s", keep0Str, keep1Str, keep2Str);
655,920✔
2485
    }
2486
    varDataSetLen(keepVstr, len);
655,902✔
2487
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,902✔
2488
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)keepVstr, false), &lino, _OVER);
655,554!
2489

2490
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,446✔
2491
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.buffer, false), &lino, _OVER);
655,371!
2492

2493
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,433✔
2494
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.pageSize, false), &lino, _OVER);
655,322!
2495

2496
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,403✔
2497
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.pages, false), &lino, _OVER);
655,291!
2498

2499
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,388✔
2500
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.minRows, false), &lino, _OVER);
655,298!
2501

2502
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,356✔
2503
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.maxRows, false), &lino, _OVER);
655,283!
2504

2505
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,399✔
2506
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.compression, false), &lino, _OVER);
655,322!
2507

2508
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,445✔
2509
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)precVstr, false), &lino, _OVER);
655,371!
2510

2511
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,514✔
2512
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)statusVstr, false), &lino, _OVER);
655,412!
2513

2514
    char *rentensionVstr = buildRetension(pDb->cfg.pRetensions);
655,543✔
2515
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,447✔
2516
    if (rentensionVstr == NULL) {
655,399✔
2517
      colDataSetNULL(pColInfo, rows);
655,398!
2518
    } else {
2519
      TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)rentensionVstr, false), &lino, _OVER);
1!
2520
      taosMemoryFree(rentensionVstr);
1!
2521
    }
2522

2523
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,399✔
2524
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.numOfStables, false), &lino, _OVER);
655,304!
2525

2526
    const char *cacheModelStr = getCacheModelStr(pDb->cfg.cacheLast);
655,541✔
2527
    char        cacheModelVstr[24] = {0};
655,509✔
2528
    STR_WITH_MAXSIZE_TO_VARSTR(cacheModelVstr, cacheModelStr, 24);
655,509✔
2529
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,509✔
2530
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)cacheModelVstr, false), &lino, _OVER);
655,515!
2531

2532
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,609✔
2533
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.cacheLastSize, false), &lino, _OVER);
655,507!
2534

2535
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,512✔
2536
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.walLevel, false), &lino, _OVER);
655,405!
2537

2538
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,470✔
2539
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.walFsyncPeriod, false), &lino, _OVER);
655,378!
2540

2541
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,447✔
2542
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.walRetentionPeriod, false), &lino, _OVER);
655,333!
2543

2544
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,436✔
2545
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.walRetentionSize, false), &lino, _OVER);
655,346!
2546

2547
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,404✔
2548
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.sstTrigger, false), &lino, _OVER);
655,332!
2549

2550
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,457✔
2551
    int16_t hashPrefix = pDb->cfg.hashPrefix;
655,395✔
2552
    if (hashPrefix > 0) {
655,395✔
2553
      hashPrefix = pDb->cfg.hashPrefix - strlen(pDb->name) - 1;
13✔
2554
    } else if (hashPrefix < 0) {
655,382✔
2555
      hashPrefix = pDb->cfg.hashPrefix + strlen(pDb->name) + 1;
16✔
2556
    }
2557
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&hashPrefix, false), &lino, _OVER);
655,395!
2558

2559
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,487✔
2560
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.hashSuffix, false), &lino, _OVER);
655,399!
2561

2562
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,395✔
2563
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.tsdbPageSize, false), &lino, _OVER);
655,364!
2564

2565
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,438✔
2566
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.keepTimeOffset, false), &lino, _OVER);
655,376!
2567

2568
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,466✔
2569
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.s3ChunkSize, false), &lino, _OVER);
655,382!
2570

2571
    char keeplocalVstr[128] = {0};
655,490✔
2572
    len = tsnprintf(&keeplocalVstr[VARSTR_HEADER_SIZE], sizeof(keeplocalVstr), "%dm", pDb->cfg.s3KeepLocal);
655,490✔
2573
    varDataSetLen(keeplocalVstr, len);
655,897✔
2574
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,897✔
2575
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)keeplocalVstr, false), &lino, _OVER);
655,750!
2576

2577
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,641✔
2578
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.s3Compact, false), &lino, _OVER);
655,556!
2579

2580
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,498✔
2581
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.withArbitrator, false), &lino, _OVER);
655,425!
2582

2583
    const char *encryptAlgorithmStr = getEncryptAlgorithmStr(pDb->cfg.encryptAlgorithm);
655,510✔
2584
    char        encryptAlgorithmVStr[24] = {0};
655,506✔
2585
    STR_WITH_MAXSIZE_TO_VARSTR(encryptAlgorithmVStr, encryptAlgorithmStr, 24);
655,506✔
2586
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
655,506✔
2587
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)encryptAlgorithmVStr, false), &lino, _OVER);
655,532!
2588

2589
    TAOS_UNUSED(formatDurationOrKeep(durationStr, sizeof(durationStr), pDb->cfg.compactInterval));
655,652✔
2590
    STR_WITH_MAXSIZE_TO_VARSTR(durationVstr, durationStr, sizeof(durationVstr));
655,877✔
2591
    if ((pColInfo = taosArrayGet(pBlock->pDataBlock, cols++))) {
655,877!
2592
      TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)durationVstr, false), &lino, _OVER);
655,703!
2593
    }
2594

2595
    len = formatDurationOrKeep(durationStr, sizeof(durationStr), pDb->cfg.compactStartTime);
655,635✔
2596
    TAOS_UNUSED(formatDurationOrKeep(durationVstr, sizeof(durationVstr), pDb->cfg.compactEndTime));
655,934✔
2597
    TAOS_UNUSED(snprintf(durationStr + len, sizeof(durationStr) - len, ",%s", durationVstr));
655,941✔
2598
    STR_WITH_MAXSIZE_TO_VARSTR(durationVstr, durationStr, sizeof(durationVstr));
655,941✔
2599
    if ((pColInfo = taosArrayGet(pBlock->pDataBlock, cols++))) {
655,941!
2600
      TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)durationVstr, false), &lino, _OVER);
655,679!
2601
    }
2602

2603
    TAOS_UNUSED(snprintf(durationStr, sizeof(durationStr), "%dh", pDb->cfg.compactTimeOffset));
655,594✔
2604
    STR_WITH_MAXSIZE_TO_VARSTR(durationVstr, durationStr, sizeof(durationVstr));
655,594✔
2605
    if ((pColInfo = taosArrayGet(pBlock->pDataBlock, cols++))) {
655,594✔
2606
      TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)durationVstr, false), &lino, _OVER);
655,662!
2607
    }
2608
  }
2609
_OVER:
711,911✔
2610
  if (code != 0) mError("failed to retrieve at line:%d, since %s", lino, tstrerror(code));
711,911!
2611
  taosMemoryFree(buf);
710,873!
2612
}
2613

2614
static void setInformationSchemaDbCfg(SMnode *pMnode, SDbObj *pDbObj) {
27,638✔
2615
  tstrncpy(pDbObj->name, TSDB_INFORMATION_SCHEMA_DB, tListLen(pDbObj->name));
27,638✔
2616
  pDbObj->createdTime = mndGetClusterCreateTime(pMnode);
27,638✔
2617
  pDbObj->cfg.numOfVgroups = 0;
27,655✔
2618
  pDbObj->cfg.strict = 1;
27,655✔
2619
  pDbObj->cfg.replications = 1;
27,655✔
2620
  pDbObj->cfg.precision = TSDB_TIME_PRECISION_MILLI;
27,655✔
2621
}
27,655✔
2622

2623
static void setPerfSchemaDbCfg(SMnode *pMnode, SDbObj *pDbObj) {
27,647✔
2624
  tstrncpy(pDbObj->name, TSDB_PERFORMANCE_SCHEMA_DB, tListLen(pDbObj->name));
27,647✔
2625
  pDbObj->createdTime = mndGetClusterCreateTime(pMnode);
27,647✔
2626
  pDbObj->cfg.numOfVgroups = 0;
27,654✔
2627
  pDbObj->cfg.strict = 1;
27,654✔
2628
  pDbObj->cfg.replications = 1;
27,654✔
2629
  pDbObj->cfg.precision = TSDB_TIME_PRECISION_MILLI;
27,654✔
2630
}
27,654✔
2631

2632
static bool mndGetTablesOfDbFp(SMnode *pMnode, void *pObj, void *p1, void *p2, void *p3) {
31,490,468✔
2633
  SVgObj  *pVgroup = pObj;
31,490,468✔
2634
  int32_t *numOfTables = p1;
31,490,468✔
2635
  int64_t  uid = *(int64_t *)p2;
31,490,468✔
2636
  if (pVgroup->dbUid == uid) {
31,490,468✔
2637
    *numOfTables += pVgroup->numOfTables;
1,285,710✔
2638
  }
2639
  return true;
31,490,468✔
2640
}
2641

2642
static int32_t mndRetrieveDbs(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rowsCapacity) {
27,648✔
2643
  SMnode    *pMnode = pReq->info.node;
27,648✔
2644
  SSdb      *pSdb = pMnode->pSdb;
27,648✔
2645
  int32_t    numOfRows = 0;
27,648✔
2646
  SDbObj    *pDb = NULL;
27,648✔
2647
  SUserObj  *pUser = NULL;
27,648✔
2648
  ESdbStatus objStatus = 0;
27,648✔
2649

2650
  (void)mndAcquireUser(pMnode, pReq->info.conn.user, &pUser);
27,648✔
2651
  if (pUser == NULL) return 0;
27,644!
2652
  bool sysinfo = pUser->sysInfo;
27,644✔
2653

2654
  // Append the information_schema database into the result.
2655
  if (!pShow->sysDbRsp) {
27,644!
2656
    SDbObj infoschemaDb = {0};
27,645✔
2657
    setInformationSchemaDbCfg(pMnode, &infoschemaDb);
27,645✔
2658
    size_t numOfTables = 0;
27,655✔
2659
    getVisibleInfosTablesNum(sysinfo, &numOfTables);
27,655✔
2660
    mndDumpDbInfoData(pMnode, pBlock, &infoschemaDb, pShow, numOfRows, numOfTables, true, 0, 1);
27,651✔
2661

2662
    numOfRows += 1;
27,639✔
2663

2664
    SDbObj perfschemaDb = {0};
27,639✔
2665
    setPerfSchemaDbCfg(pMnode, &perfschemaDb);
27,639✔
2666
    numOfTables = 0;
27,653✔
2667
    getPerfDbMeta(NULL, &numOfTables);
27,653✔
2668
    mndDumpDbInfoData(pMnode, pBlock, &perfschemaDb, pShow, numOfRows, numOfTables, true, 0, 1);
27,653✔
2669

2670
    numOfRows += 1;
27,649✔
2671
    pShow->sysDbRsp = true;
27,649✔
2672
  }
2673

2674
  while (numOfRows < rowsCapacity) {
683,706✔
2675
    pShow->pIter = sdbFetchAll(pSdb, SDB_DB, pShow->pIter, (void **)&pDb, &objStatus, true);
683,680✔
2676
    if (pShow->pIter == NULL) break;
683,675✔
2677

2678
    if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_READ_OR_WRITE_DB, pDb) == 0) {
656,020✔
2679
      int32_t numOfTables = 0;
656,033✔
2680
      sdbTraverse(pSdb, SDB_VGROUP, mndGetTablesOfDbFp, &numOfTables, &pDb->uid, NULL);
656,033✔
2681
      mndDumpDbInfoData(pMnode, pBlock, pDb, pShow, numOfRows, numOfTables, false, objStatus, sysinfo);
655,992✔
2682
      numOfRows++;
655,811✔
2683
    }
2684

2685
    sdbRelease(pSdb, pDb);
655,834✔
2686
  }
2687

2688
  pShow->numOfRows += numOfRows;
27,681✔
2689
  mndReleaseUser(pMnode, pUser);
27,681✔
2690
  return numOfRows;
27,655✔
2691
}
2692

2693
static void mndCancelGetNextDb(SMnode *pMnode, void *pIter) {
×
2694
  SSdb *pSdb = pMnode->pSdb;
×
2695
  sdbCancelFetchByType(pSdb, pIter, SDB_DB);
×
UNCOV
2696
}
×
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