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

taosdata / TDengine / #4808

16 Oct 2025 11:40AM UTC coverage: 57.938% (-0.6%) from 58.524%
#4808

push

travis-ci

web-flow
fix(tref): increase TSDB_REF_OBJECTS from 100 to 2000 for improved reference handling (#33281)

137662 of 303532 branches covered (45.35%)

Branch coverage included in aggregate %.

209234 of 295200 relevant lines covered (70.88%)

4035326.15 hits per line

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

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

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

47
#define DB_VER_NUMBER   1
48
#define DB_RESERVE_SIZE 14
49

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

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

66
#ifndef TD_ENTERPRISE
67
int32_t mndProcessCompactDbReq(SRpcMsg *pReq) { return TSDB_CODE_OPS_NOT_SUPPORT; }
68
#endif
69

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

82
  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_DB, mndProcessCreateDbReq);
1,338✔
83
  mndSetMsgHandle(pMnode, TDMT_MND_ALTER_DB, mndProcessAlterDbReq);
1,338✔
84
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_DB, mndProcessDropDbReq);
1,338✔
85
  mndSetMsgHandle(pMnode, TDMT_MND_USE_DB, mndProcessUseDbReq);
1,338✔
86
  mndSetMsgHandle(pMnode, TDMT_MND_COMPACT_DB, mndProcessCompactDbReq);
1,338✔
87
  mndSetMsgHandle(pMnode, TDMT_MND_SCAN_DB, mndProcessScanDbReq);
1,338✔
88
  mndSetMsgHandle(pMnode, TDMT_MND_TRIM_DB, mndProcessTrimDbReq);
1,338✔
89
  mndSetMsgHandle(pMnode, TDMT_MND_GET_DB_CFG, mndProcessGetDbCfgReq);
1,338✔
90
  mndSetMsgHandle(pMnode, TDMT_MND_SSMIGRATE_DB, mndProcessSsMigrateDbReq);
1,338✔
91
  mndSetMsgHandle(pMnode, TDMT_MND_GET_DB_INFO, mndProcessUseDbReq);
1,338✔
92

93
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_DB, mndRetrieveDbs);
1,338✔
94
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_DB, mndCancelGetNextDb);
1,338✔
95

96
  return sdbSetTable(pMnode->pSdb, table);
1,338✔
97
}
98

99
void mndCleanupDb(SMnode *pMnode) {}
1,338✔
100

101
SSdbRaw *mndDbActionEncode(SDbObj *pDb) {
13,832✔
102
  int32_t code = 0;
13,832✔
103
  int32_t lino = 0;
13,832✔
104
  terrno = TSDB_CODE_OUT_OF_MEMORY;
13,832✔
105

106
  int32_t  size = sizeof(SDbObj) + pDb->cfg.numOfRetensions * sizeof(SRetention) + DB_RESERVE_SIZE;
13,832✔
107
  SSdbRaw *pRaw = sdbAllocRaw(SDB_DB, DB_VER_NUMBER, size);
13,832✔
108
  if (pRaw == NULL) goto _OVER;
13,832!
109

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

169
  SDB_SET_RESERVE(pRaw, dataPos, DB_RESERVE_SIZE, _OVER)
13,832!
170
  SDB_SET_UINT8(pRaw, dataPos, pDb->cfg.flags, _OVER)
13,832!
171
  SDB_SET_DATALEN(pRaw, dataPos, _OVER)
13,832!
172

173
  terrno = 0;
13,832✔
174

175
_OVER:
13,832✔
176
  if (terrno != 0) {
13,832!
177
    mError("db:%s, failed to encode to raw:%p since %s", pDb->name, pRaw, terrstr());
×
178
    sdbFreeRaw(pRaw);
×
179
    return NULL;
×
180
  }
181

182
  mTrace("db:%s, encode to raw:%p, row:%p", pDb->name, pRaw, pDb);
13,832✔
183
  return pRaw;
13,832✔
184
}
185

186
static SSdbRow *mndDbActionDecode(SSdbRaw *pRaw) {
12,660✔
187
  int32_t code = 0;
12,660✔
188
  int32_t lino = 0;
12,660✔
189
  terrno = TSDB_CODE_OUT_OF_MEMORY;
12,660✔
190
  SSdbRow *pRow = NULL;
12,660✔
191
  SDbObj  *pDb = NULL;
12,660✔
192

193
  int8_t sver = 0;
12,660✔
194
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
12,660!
195

196
  if (sver != DB_VER_NUMBER) {
12,660!
197
    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
×
198
    goto _OVER;
×
199
  }
200

201
  pRow = sdbAllocRow(sizeof(SDbObj));
12,660✔
202
  if (pRow == NULL) goto _OVER;
12,660!
203

204
  pDb = sdbGetRowObj(pRow);
12,660✔
205
  if (pDb == NULL) goto _OVER;
12,660!
206

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

277
  taosInitRWLatch(&pDb->lock);
12,660✔
278

279
  if (pDb->cfg.ssChunkSize == 0) {
12,660!
280
    pDb->cfg.ssChunkSize = TSDB_DEFAULT_SS_CHUNK_SIZE;
×
281

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

285
  if (pDb->cfg.ssKeepLocal == 0) {
12,660!
286
    pDb->cfg.ssKeepLocal = TSDB_DEFAULT_SS_KEEP_LOCAL;
×
287

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

291
  if (pDb->cfg.tsdbPageSize != TSDB_MIN_TSDB_PAGESIZE) {
12,660!
292
    mInfo("db:%s, tsdbPageSize set from %d to default %d", pDb->name, pDb->cfg.tsdbPageSize,
12,660!
293
          TSDB_DEFAULT_TSDB_PAGESIZE);
294
  }
295

296
  if (pDb->cfg.sstTrigger != TSDB_MIN_STT_TRIGGER) {
12,660✔
297
    mInfo("db:%s, sstTrigger set from %d to default %d", pDb->name, pDb->cfg.sstTrigger, TSDB_DEFAULT_SST_TRIGGER);
12,497!
298
  }
299

300
  terrno = 0;
12,660✔
301

302
_OVER:
12,660✔
303
  if (terrno != 0) {
12,660!
304
    mError("db:%s, failed to decode from raw:%p since %s", pDb == NULL ? "null" : pDb->name, pRaw, terrstr());
×
305
    taosMemoryFreeClear(pRow);
×
306
    return NULL;
×
307
  }
308

309
  mTrace("db:%s, decode from raw:%p, row:%p", pDb->name, pRaw, pDb);
12,660✔
310
  return pRow;
12,660✔
311
}
312

313
static int32_t mndNewDbActionValidate(SMnode *pMnode, STrans *pTrans, SSdbRaw *pRaw) {
2,986✔
314
  SSdb    *pSdb = pMnode->pSdb;
2,986✔
315
  SSdbRow *pRow = NULL;
2,986✔
316
  SDbObj  *pNewDb = NULL;
2,986✔
317
  int      code = -1;
2,986✔
318

319
  pRow = mndDbActionDecode(pRaw);
2,986✔
320
  if (pRow == NULL) {
2,986!
321
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
322
    if (terrno != 0) code = terrno;
×
323
    goto _OVER;
×
324
  }
325
  pNewDb = sdbGetRowObj(pRow);
2,986✔
326
  if (pNewDb == NULL) {
2,986!
327
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
328
    if (terrno != 0) code = terrno;
×
329
    goto _OVER;
×
330
  }
331

332
  SDbObj *pOldDb = sdbAcquire(pMnode->pSdb, SDB_DB, pNewDb->name);
2,986✔
333
  if (pOldDb != NULL) {
2,986!
334
    mError("trans:%d, db name already in use. name: %s", pTrans->id, pNewDb->name);
×
335
    sdbRelease(pMnode->pSdb, pOldDb);
×
336
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
337
    if (terrno != 0) code = terrno;
×
338
    goto _OVER;
×
339
  }
340

341
  code = 0;
2,986✔
342
_OVER:
2,986✔
343
  if (pNewDb) mndDbActionDelete(pSdb, pNewDb);
2,986!
344
  taosMemoryFreeClear(pRow);
2,986!
345
  return code;
2,986✔
346
}
347

348
static int32_t mndDbActionInsert(SSdb *pSdb, SDbObj *pDb) {
3,484✔
349
  mTrace("db:%s, perform insert action, row:%p", pDb->name, pDb);
3,484✔
350
  return 0;
3,484✔
351
}
352

353
static int32_t mndDbActionDelete(SSdb *pSdb, SDbObj *pDb) {
12,660✔
354
  mTrace("db:%s, perform delete action, row:%p", pDb->name, pDb);
12,660✔
355
  taosArrayDestroy(pDb->cfg.pRetensions);
12,660✔
356
  return 0;
12,660✔
357
}
358

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

400
static inline int32_t mndGetGlobalVgroupVersion(SMnode *pMnode) {
16,025✔
401
  SSdb *pSdb = pMnode->pSdb;
16,025✔
402
  return sdbGetTableVer(pSdb, SDB_VGROUP);
16,025✔
403
}
404

405
SDbObj *mndAcquireDb(SMnode *pMnode, const char *db) {
190,935✔
406
  SSdb   *pSdb = pMnode->pSdb;
190,935✔
407
  SDbObj *pDb = sdbAcquire(pSdb, SDB_DB, db);
190,935✔
408
  if (pDb == NULL) {
190,937✔
409
    if (terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
5,148✔
410
      terrno = TSDB_CODE_MND_DB_NOT_EXIST;
5,065✔
411
    } else if (terrno == TSDB_CODE_SDB_OBJ_CREATING) {
83✔
412
      terrno = TSDB_CODE_MND_DB_IN_CREATING;
22✔
413
    } else if (terrno == TSDB_CODE_SDB_OBJ_DROPPING) {
61!
414
      terrno = TSDB_CODE_MND_DB_IN_DROPPING;
61✔
415
    } else {
416
      terrno = TSDB_CODE_APP_ERROR;
×
417
      mFatal("db:%s, failed to acquire db since %s", db, terrstr());
×
418
    }
419
  }
420
  return pDb;
190,936✔
421
}
422

423
void mndReleaseDb(SMnode *pMnode, SDbObj *pDb) {
212,109✔
424
  SSdb *pSdb = pMnode->pSdb;
212,109✔
425
  sdbRelease(pSdb, pDb);
212,109✔
426
}
212,109✔
427

428
bool mndDbIsExist(SMnode *pMnode, const char *db, int64_t uid) {
185✔
429
  SDbObj *pDb = mndAcquireDb(pMnode, db);
185✔
430
  if (pDb == NULL) {
185!
431
    return false;
×
432
  } else {
433
    bool result = (uid == 0) || (uid == pDb->uid);
185!
434
    mndReleaseDb(pMnode, pDb);
185✔
435
    pDb = NULL;
185✔
436
    return result;
185✔
437
  }
438
}
439

440
int32_t mndCheckDbName(const char *dbName, SUserObj *pUser) {
2,767✔
441
  char *pos = strstr(dbName, TS_PATH_DELIMITER);
2,767✔
442
  if (pos == NULL) {
2,767!
443
    return TSDB_CODE_MND_INVALID_DB;
×
444
  }
445

446
  int32_t acctId;
447
  int32_t code = taosStr2int32(dbName, &acctId);
2,767✔
448
  if (code != 0) {
2,767!
449
    return code;
×
450
  }
451

452
  if (acctId != pUser->acctId) {
2,767!
453
    return TSDB_CODE_MND_INVALID_DB_ACCT;
×
454
  }
455

456
  return 0;
2,767✔
457
}
458

459
int32_t mndCheckDbCfg(SMnode *pMnode, SDbCfg *pCfg) {
2,767✔
460
  int32_t code = TSDB_CODE_MND_INVALID_DB_OPTION;
2,767✔
461

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

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

512
  if (pCfg->ssChunkSize < TSDB_MIN_SS_CHUNK_SIZE || pCfg->ssChunkSize > TSDB_MAX_SS_CHUNK_SIZE) return code;
2,766!
513
  if (pCfg->ssKeepLocal < TSDB_MIN_SS_KEEP_LOCAL || pCfg->ssKeepLocal > TSDB_MAX_SS_KEEP_LOCAL) return code;
2,766!
514
  if (pCfg->ssCompact < TSDB_MIN_SS_COMPACT || pCfg->ssCompact > TSDB_MAX_SS_COMPACT) return code;
2,766!
515

516
  if (pCfg->compactInterval != 0 &&
2,766!
517
      (pCfg->compactInterval < TSDB_MIN_COMPACT_INTERVAL || pCfg->compactInterval > pCfg->daysToKeep2))
×
518
    return code;
×
519
  if (pCfg->compactStartTime != 0 &&
2,766!
520
      (pCfg->compactStartTime < -pCfg->daysToKeep2 || pCfg->compactStartTime > -pCfg->daysPerFile))
×
521
    return code;
×
522
  if (pCfg->compactEndTime != 0 &&
2,766!
523
      (pCfg->compactEndTime < -pCfg->daysToKeep2 || pCfg->compactEndTime > -pCfg->daysPerFile))
×
524
    return code;
×
525
  if (pCfg->compactStartTime != 0 && pCfg->compactEndTime != 0 && pCfg->compactStartTime >= pCfg->compactEndTime)
2,766!
526
    return code;
×
527
  if (pCfg->compactTimeOffset < TSDB_MIN_COMPACT_TIME_OFFSET || pCfg->compactTimeOffset > TSDB_MAX_COMPACT_TIME_OFFSET)
2,766!
528
    return code;
×
529

530
  code = 0;
2,766✔
531
  TAOS_RETURN(code);
2,766✔
532
}
533

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

569
  if (pNewCfg->walLevel == 0 && pOldCfg->replications > 1) {
131!
570
    terrno = TSDB_CODE_MND_INVALID_WAL_LEVEL;
×
571
    return code;
×
572
  }
573
  if (pNewCfg->replications > 1 && pOldCfg->walLevel == 0) {
131!
574
    terrno = TSDB_CODE_MND_INVALID_WAL_LEVEL;
×
575
    return code;
×
576
  }
577

578
  if (pNewCfg->sstTrigger != pOldCfg->sstTrigger &&
131✔
579
      (pNewCfg->sstTrigger < TSDB_MIN_STT_TRIGGER || pNewCfg->sstTrigger > TSDB_MAX_STT_TRIGGER))
2!
580
    return code;
×
581
  if (pNewCfg->minRows < TSDB_MIN_MINROWS_FBLOCK || pNewCfg->minRows > TSDB_MAX_MINROWS_FBLOCK) return code;
131!
582
  if (pNewCfg->maxRows < TSDB_MIN_MAXROWS_FBLOCK || pNewCfg->maxRows > TSDB_MAX_MAXROWS_FBLOCK) return code;
131!
583
  if (pNewCfg->minRows > pNewCfg->maxRows) return code;
131✔
584
  if (pNewCfg->walRetentionPeriod < TSDB_DB_MIN_WAL_RETENTION_PERIOD) return code;
130!
585
  if (pNewCfg->walRetentionSize < TSDB_DB_MIN_WAL_RETENTION_SIZE) return code;
130!
586
  if (pNewCfg->strict < TSDB_DB_STRICT_OFF || pNewCfg->strict > TSDB_DB_STRICT_ON) return code;
130!
587
  if (pNewCfg->replications > mndGetDnodeSize(pMnode)) {
130!
588
    terrno = TSDB_CODE_MND_NO_ENOUGH_DNODES;
×
589
    return code;
×
590
  }
591
  if (pNewCfg->ssChunkSize < TSDB_MIN_SS_CHUNK_SIZE || pNewCfg->ssChunkSize > TSDB_MAX_SS_CHUNK_SIZE) return code;
130!
592
  if (pNewCfg->ssKeepLocal < TSDB_MIN_SS_KEEP_LOCAL || pNewCfg->ssKeepLocal > TSDB_MAX_SS_KEEP_LOCAL) return code;
130!
593
  if (pNewCfg->ssCompact < TSDB_MIN_SS_COMPACT || pNewCfg->ssCompact > TSDB_MAX_SS_COMPACT) return code;
130!
594

595
  if (pNewCfg->compactInterval != 0 &&
130✔
596
      (pNewCfg->compactInterval < TSDB_MIN_COMPACT_INTERVAL || pNewCfg->compactInterval > pNewCfg->daysToKeep2))
3!
597
    return code;
×
598
  if (pNewCfg->compactStartTime != 0 &&
130!
599
      (pNewCfg->compactStartTime < -pNewCfg->daysToKeep2 || pNewCfg->compactStartTime > -pNewCfg->daysPerFile))
×
600
    return code;
×
601
  if (pNewCfg->compactEndTime != 0 &&
130!
602
      (pNewCfg->compactEndTime < -pNewCfg->daysToKeep2 || pNewCfg->compactEndTime > -pNewCfg->daysPerFile))
×
603
    return code;
×
604
  if (pNewCfg->compactStartTime != 0 && pNewCfg->compactEndTime != 0 &&
130!
605
      pNewCfg->compactStartTime >= pNewCfg->compactEndTime)
×
606
    return code;
×
607
  if (pNewCfg->compactTimeOffset < TSDB_MIN_COMPACT_TIME_OFFSET ||
130!
608
      pNewCfg->compactTimeOffset > TSDB_MAX_COMPACT_TIME_OFFSET)
130!
609
    return code;
×
610

611
  code = 0;
130✔
612
  TAOS_RETURN(code);
130✔
613
}
614

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

653
int32_t mndSetCreateDbPrepareAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
2,758✔
654
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
2,758✔
655
  if (pDbRaw == NULL) return -1;
2,758!
656

657
  if (mndTransAppendPrepareLog(pTrans, pDbRaw) != 0) return -1;
2,758!
658
  if (sdbSetRawStatus(pDbRaw, SDB_STATUS_CREATING) != 0) return -1;
2,758!
659
  return 0;
2,758✔
660
}
661

662
static int32_t mndSetNewVgPrepareActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
2,754✔
663
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
8,546✔
664
    if (mndAddNewVgPrepareAction(pMnode, pTrans, (pVgroups + v)) != 0) return -1;
5,792!
665
  }
666
  return 0;
2,754✔
667
}
668

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

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

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

700
  TAOS_RETURN(code);
×
701
}
702

703
static int32_t mndSetCreateDbUndoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
2,754✔
704
  int32_t  code = 0;
2,754✔
705
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
2,754✔
706
  if (pDbRaw == NULL) {
2,754!
707
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
708
    if (terrno != 0) code = terrno;
×
709
    TAOS_RETURN(code);
×
710
  }
711
  TAOS_CHECK_RETURN(mndTransAppendUndolog(pTrans, pDbRaw));
2,754!
712
  TAOS_CHECK_RETURN(sdbSetRawStatus(pDbRaw, SDB_STATUS_DROPPED));
2,754!
713

714
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
8,546✔
715
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
5,792✔
716
    if (pVgRaw == NULL) {
5,792!
717
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
718
      if (terrno != 0) code = terrno;
×
719
      TAOS_RETURN(code);
×
720
    }
721
    TAOS_CHECK_RETURN(mndTransAppendUndolog(pTrans, pVgRaw));
5,792!
722
    TAOS_CHECK_RETURN(sdbSetRawStatus(pVgRaw, SDB_STATUS_DROPPED));
5,792!
723
  }
724

725
  if (pDb->cfg.withArbitrator) {
2,754✔
726
    for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
19✔
727
      SVgObj   *pVgObj = pVgroups + v;
11✔
728
      SArbGroup arbGroup = {0};
11✔
729
      TAOS_CHECK_RETURN(mndArbGroupInitFromVgObj(pVgObj, &arbGroup));
11!
730
      TAOS_CHECK_RETURN(mndSetCreateArbGroupUndoLogs(pTrans, &arbGroup));
11!
731
    }
732
  }
733

734
  TAOS_RETURN(code);
2,754✔
735
}
736

737
static int32_t mndSetCreateDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups,
2,754✔
738
                                        SUserObj *pUserDuped) {
739
  int32_t  code = 0;
2,754✔
740
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
2,754✔
741
  if (pDbRaw == NULL) {
2,754!
742
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
743
    if (terrno != 0) code = terrno;
×
744
    TAOS_RETURN(code);
×
745
  }
746
  TAOS_CHECK_RETURN(mndTransAppendCommitlog(pTrans, pDbRaw));
2,754!
747
  TAOS_CHECK_RETURN(sdbSetRawStatus(pDbRaw, SDB_STATUS_READY));
2,754!
748

749
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
8,546✔
750
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
5,792✔
751
    if (pVgRaw == NULL) {
5,792!
752
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
753
      if (terrno != 0) code = terrno;
×
754
      TAOS_RETURN(code);
×
755
    }
756
    TAOS_CHECK_RETURN(mndTransAppendCommitlog(pTrans, pVgRaw));
5,792!
757
    TAOS_CHECK_RETURN(sdbSetRawStatus(pVgRaw, SDB_STATUS_READY));
5,792!
758
  }
759

760
  if (pDb->cfg.withArbitrator) {
2,754✔
761
    for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
19✔
762
      SVgObj   *pVgObj = pVgroups + v;
11✔
763
      SArbGroup arbGroup = {0};
11✔
764
      TAOS_CHECK_RETURN(mndArbGroupInitFromVgObj(pVgObj, &arbGroup));
11!
765
      TAOS_CHECK_RETURN(mndSetCreateArbGroupCommitLogs(pTrans, &arbGroup));
11!
766
    }
767
  }
768

769
  if (pUserDuped) {
2,754✔
770
    SSdbRaw *pUserRaw = mndUserActionEncode(pUserDuped);
10✔
771
    if (pUserRaw == NULL) {
10!
772
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
773
      if (terrno != 0) code = terrno;
×
774
      TAOS_RETURN(code);
×
775
    }
776
    TAOS_CHECK_RETURN(mndTransAppendCommitlog(pTrans, pUserRaw));
10!
777
    TAOS_CHECK_RETURN(sdbSetRawStatus(pUserRaw, SDB_STATUS_READY));
10!
778
  }
779

780
  TAOS_RETURN(code);
2,754✔
781
}
782

783
static int32_t mndSetCreateDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
2,754✔
784
  int32_t code = 0;
2,754✔
785
  for (int32_t vg = 0; vg < pDb->cfg.numOfVgroups; ++vg) {
8,546✔
786
    SVgObj *pVgroup = pVgroups + vg;
5,792✔
787

788
    for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
12,461✔
789
      SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
6,669✔
790
      TAOS_CHECK_RETURN(mndAddCreateVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid));
6,669!
791
    }
792
  }
793

794
  TAOS_RETURN(code);
2,754✔
795
}
796

797
static int32_t mndSetCreateDbUndoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
2,754✔
798
  int32_t code = 0;
2,754✔
799
  for (int32_t vg = 0; vg < pDb->cfg.numOfVgroups; ++vg) {
8,546✔
800
    SVgObj *pVgroup = pVgroups + vg;
5,792✔
801

802
    for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
12,461✔
803
      SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
6,669✔
804
      TAOS_CHECK_RETURN(mndAddDropVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid, false));
6,669!
805
    }
806
  }
807

808
  TAOS_RETURN(code);
2,754✔
809
}
810

811
static int32_t mndCreateDb(SMnode *pMnode, SRpcMsg *pReq, SCreateDbReq *pCreate, SUserObj *pUser, SArray *dnodeList) {
2,763✔
812
  int32_t  code = 0;
2,763✔
813
  SUserObj newUserObj = {0};
2,763✔
814
  SDbObj   dbObj = {0};
2,763✔
815
  (void)memcpy(dbObj.name, pCreate->db, TSDB_DB_FNAME_LEN);
2,763✔
816
  (void)memcpy(dbObj.acct, pUser->acct, TSDB_USER_LEN);
2,763✔
817
  dbObj.createdTime = taosGetTimestampMs();
2,763✔
818
  dbObj.updateTime = dbObj.createdTime;
2,763✔
819
  dbObj.uid = mndGenerateUid(dbObj.name, TSDB_DB_FNAME_LEN);
2,763✔
820
  dbObj.cfgVersion = 1;
2,763✔
821
  dbObj.vgVersion = 1;
2,763✔
822
  dbObj.tsmaVersion = 1;
2,763✔
823
  (void)memcpy(dbObj.createUser, pUser->user, TSDB_USER_LEN);
2,763✔
824
  dbObj.cfg = (SDbCfg){
2,763✔
825
      .numOfVgroups = pCreate->numOfVgroups,
2,763✔
826
      .numOfStables = pCreate->numOfStables,
2,763✔
827
      .buffer = pCreate->buffer,
2,763✔
828
      .pageSize = pCreate->pageSize,
2,763✔
829
      .pages = pCreate->pages,
2,763✔
830
      .cacheLastSize = pCreate->cacheLastSize,
2,763✔
831
      .daysPerFile = pCreate->daysPerFile,
2,763✔
832
      .daysToKeep0 = pCreate->daysToKeep0,
2,763✔
833
      .daysToKeep1 = pCreate->daysToKeep1,
2,763✔
834
      .daysToKeep2 = pCreate->daysToKeep2,
2,763✔
835
      .keepTimeOffset = pCreate->keepTimeOffset,
2,763✔
836
      .minRows = pCreate->minRows,
2,763✔
837
      .maxRows = pCreate->maxRows,
2,763✔
838
      .walFsyncPeriod = pCreate->walFsyncPeriod,
2,763✔
839
      .walLevel = pCreate->walLevel,
2,763✔
840
      .precision = pCreate->precision,
2,763✔
841
      .compression = pCreate->compression,
2,763✔
842
      .replications = pCreate->replications,
2,763✔
843
      .strict = pCreate->strict,
2,763✔
844
      .cacheLast = pCreate->cacheLast,
2,763✔
845
      .hashMethod = 1,
846
      .schemaless = pCreate->schemaless,
2,763✔
847
      .walRetentionPeriod = pCreate->walRetentionPeriod,
2,763✔
848
      .walRetentionSize = pCreate->walRetentionSize,
2,763✔
849
      .walRollPeriod = pCreate->walRollPeriod,
2,763✔
850
      .walSegmentSize = pCreate->walSegmentSize,
2,763✔
851
      .sstTrigger = pCreate->sstTrigger,
2,763✔
852
      .hashPrefix = pCreate->hashPrefix,
2,763✔
853
      .hashSuffix = pCreate->hashSuffix,
2,763✔
854
      .ssChunkSize = pCreate->ssChunkSize,
2,763✔
855
      .ssKeepLocal = pCreate->ssKeepLocal,
2,763✔
856
      .ssCompact = pCreate->ssCompact,
2,763✔
857
      .tsdbPageSize = pCreate->tsdbPageSize,
2,763✔
858
      .withArbitrator = pCreate->withArbitrator,
2,763✔
859
      .encryptAlgorithm = pCreate->encryptAlgorithm,
2,763✔
860
      .compactInterval = pCreate->compactInterval,
2,763✔
861
      .compactStartTime = pCreate->compactStartTime,
2,763✔
862
      .compactEndTime = pCreate->compactEndTime,
2,763✔
863
      .compactTimeOffset = pCreate->compactTimeOffset,
2,763✔
864
  };
865

866
  dbObj.cfg.numOfRetensions = pCreate->numOfRetensions;
2,763✔
867
  dbObj.cfg.pRetensions = pCreate->pRetensions;
2,763✔
868

869
  mndSetDefaultDbCfg(&dbObj.cfg);
2,763✔
870

871
  if ((code = mndCheckDbName(dbObj.name, pUser)) != 0) {
2,763!
872
    mError("db:%s, failed to create, check db name failed, since %s", pCreate->db, terrstr());
×
873
    TAOS_RETURN(code);
×
874
  }
875

876
  if ((code = mndCheckDbCfg(pMnode, &dbObj.cfg)) != 0) {
2,763✔
877
    mError("db:%s, failed to create, check db cfg failed, since %s", pCreate->db, terrstr());
1!
878
    TAOS_RETURN(code);
1✔
879
  }
880

881
  if (dbObj.cfg.hashPrefix > 0) {
2,762✔
882
    int32_t dbLen = strlen(dbObj.name) + 1;
6✔
883
    mInfo("db:%s, hashPrefix adjust from %d to %d", dbObj.name, dbObj.cfg.hashPrefix, dbObj.cfg.hashPrefix + dbLen);
6!
884
    dbObj.cfg.hashPrefix += dbLen;
6✔
885
  } else if (dbObj.cfg.hashPrefix < 0) {
2,756✔
886
    int32_t dbLen = strlen(dbObj.name) + 1;
7✔
887
    mInfo("db:%s, hashPrefix adjust from %d to %d", dbObj.name, dbObj.cfg.hashPrefix, dbObj.cfg.hashPrefix - dbLen);
7!
888
    dbObj.cfg.hashPrefix -= dbLen;
7✔
889
  }
890

891
  SVgObj *pVgroups = NULL;
2,762✔
892
  if ((code = mndAllocVgroup(pMnode, &dbObj, &pVgroups, dnodeList)) != 0) {
2,762✔
893
    mError("db:%s, failed to create, alloc vgroup failed, since %s", pCreate->db, terrstr());
8!
894
    TAOS_RETURN(code);
8✔
895
  }
896

897
  // add database privileges for user
898
  SUserObj *pNewUserDuped = NULL;
2,754✔
899
  if (!pUser->superUser) {
2,754✔
900
    TAOS_CHECK_GOTO(mndUserDupObj(pUser, &newUserObj), NULL, _OVER);
10!
901
    TAOS_CHECK_GOTO(taosHashPut(newUserObj.readDbs, dbObj.name, strlen(dbObj.name) + 1, dbObj.name, TSDB_FILENAME_LEN),
10!
902
                    NULL, _OVER);
903
    TAOS_CHECK_GOTO(taosHashPut(newUserObj.writeDbs, dbObj.name, strlen(dbObj.name) + 1, dbObj.name, TSDB_FILENAME_LEN),
10!
904
                    NULL, _OVER);
905
    pNewUserDuped = &newUserObj;
10✔
906
  }
907

908
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq, "create-db");
2,754✔
909
  if (pTrans == NULL) {
2,754!
910
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
911
    if (terrno != 0) code = terrno;
×
912
    goto _OVER;
×
913
  }
914
  // mndTransSetSerial(pTrans);
915
  mInfo("trans:%d, used to create db:%s", pTrans->id, pCreate->db);
2,754!
916

917
  mndTransSetDbName(pTrans, dbObj.name, NULL);
2,754✔
918
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
2,754!
919

920
  void   *pIter = NULL;
2,754✔
921
  STrans *exitTrans = NULL;
2,754✔
922

923
  if (!pUser->superUser) {
2,754✔
924
    while (1) {
925
      pIter = sdbFetch(pMnode->pSdb, SDB_TRANS, pIter, (void **)&exitTrans);
10✔
926
      if (pIter == NULL) break;
10!
927

928
      if (exitTrans->conflict == TRN_CONFLICT_DB &&
×
929
          strncmp(exitTrans->opername, "create-db", TSDB_TRANS_OPER_LEN) == 0) {
×
930
        code = TSDB_CODE_MND_TRANS_CONFLICT;
×
931
        sdbRelease(pMnode->pSdb, exitTrans);
×
932
        sdbCancelFetch(pMnode->pSdb, pIter);
×
933
        goto _OVER;
×
934
      }
935

936
      sdbRelease(pMnode->pSdb, exitTrans);
×
937
    }
938
  }
939

940
  mndTransSetOper(pTrans, MND_OPER_CREATE_DB);
2,754✔
941
  TAOS_CHECK_GOTO(mndSetCreateDbPrepareAction(pMnode, pTrans, &dbObj), NULL, _OVER);
2,754!
942
  TAOS_CHECK_GOTO(mndSetCreateDbRedoActions(pMnode, pTrans, &dbObj, pVgroups), NULL, _OVER);
2,754!
943
  TAOS_CHECK_GOTO(mndSetNewVgPrepareActions(pMnode, pTrans, &dbObj, pVgroups), NULL, _OVER);
2,754!
944
  TAOS_CHECK_GOTO(mndSetCreateDbUndoLogs(pMnode, pTrans, &dbObj, pVgroups), NULL, _OVER);
2,754!
945
  TAOS_CHECK_GOTO(mndSetCreateDbCommitLogs(pMnode, pTrans, &dbObj, pVgroups, pNewUserDuped), NULL, _OVER);
2,754!
946
  TAOS_CHECK_GOTO(mndSetCreateDbUndoActions(pMnode, pTrans, &dbObj, pVgroups), NULL, _OVER);
2,754!
947
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
2,754!
948

949
_OVER:
2,754✔
950
  taosMemoryFree(pVgroups);
2,754!
951
  mndUserFreeObj(&newUserObj);
2,754✔
952
  mndTransDrop(pTrans);
2,754✔
953
  TAOS_RETURN(code);
2,754✔
954
}
955

956
static int32_t mndCheckDbEncryptKey(SMnode *pMnode, SCreateDbReq *pReq) {
2,781✔
957
  int32_t    code = 0;
2,781✔
958
  SSdb      *pSdb = pMnode->pSdb;
2,781✔
959
  SDnodeObj *pDnode = NULL;
2,781✔
960
  void      *pIter = NULL;
2,781✔
961

962
#if defined(TD_ENTERPRISE) || defined(TD_ASTRA_TODO)
963
  if (pReq->encryptAlgorithm == TSDB_ENCRYPT_ALGO_NONE) goto _exit;
2,781✔
964
  TAOS_CHECK_GOTO(grantCheck(TSDB_GRANT_DB_ENCRYPTION), NULL, _exit);
4!
965
  if (tsEncryptionKeyStat != ENCRYPT_KEY_STAT_LOADED) {
4✔
966
    code = TSDB_CODE_MND_INVALID_ENCRYPT_KEY;
2✔
967
    mError("db:%s, failed to check encryption key:%" PRIi8 " in mnode leader since it's not loaded", pReq->db,
2!
968
           tsEncryptionKeyStat);
969
    goto _exit;
2✔
970
  }
971

972
  int64_t curMs = taosGetTimestampMs();
2✔
973
  while ((pIter = sdbFetch(pSdb, SDB_DNODE, pIter, (void **)&pDnode))) {
6✔
974
    bool online = false;
4✔
975
    if ((pDnode->encryptionKeyStat != tsEncryptionKeyStat || pDnode->encryptionKeyChksum != tsEncryptionKeyChksum) &&
4!
976
        (online = mndIsDnodeOnline(pDnode, curMs))) {
×
977
      code = TSDB_CODE_MND_INVALID_ENCRYPT_KEY;
×
978
      mError("db:%s, failed to check encryption key:%" PRIi8
×
979
             "-%u in dnode:%d since it's inconsitent with mnode leader:%" PRIi8 "-%u",
980
             pReq->db, pDnode->encryptionKeyStat, pDnode->encryptionKeyChksum, pDnode->id, tsEncryptionKeyStat,
981
             tsEncryptionKeyChksum);
982
      sdbCancelFetch(pSdb, pIter);
×
983
      sdbRelease(pSdb, pDnode);
×
984
      break;
×
985
    }
986
    sdbRelease(pSdb, pDnode);
4✔
987
  }
988
#else
989
  if (pReq->encryptAlgorithm != TSDB_ENCRYPT_ALGO_NONE) {
990
    code = TSDB_CODE_MND_INVALID_DB_OPTION;
991
    goto _exit;
992
  }
993
#endif
994
_exit:
2✔
995
  TAOS_RETURN(code);
2,781✔
996
}
997

998
#ifndef TD_ENTERPRISE
999
int32_t mndCheckDbDnodeList(SMnode *pMnode, char *db, char *dnodeListStr, SArray *dnodeList) {
1000
  if (dnodeListStr[0] != 0) {
1001
    terrno = TSDB_CODE_OPS_NOT_SUPPORT;
1002
    return terrno;
1003
  } else {
1004
    return 0;
1005
  }
1006
}
1007
#endif
1008

1009
static int32_t mndProcessCreateDbReq(SRpcMsg *pReq) {
3,089✔
1010
  SMnode      *pMnode = pReq->info.node;
3,089✔
1011
  int32_t      code = -1;
3,089✔
1012
  int32_t      lino = 0;
3,089✔
1013
  SDbObj      *pDb = NULL;
3,089✔
1014
  SUserObj    *pUser = NULL;
3,089✔
1015
  SCreateDbReq createReq = {0};
3,089✔
1016
  SArray      *dnodeList = NULL;
3,089✔
1017

1018
  dnodeList = taosArrayInit(mndGetDnodeSize(pMnode), sizeof(int32_t));
3,089✔
1019
  TSDB_CHECK_NULL(dnodeList, code, lino, _OVER, TSDB_CODE_OUT_OF_MEMORY);
3,089!
1020

1021
  TAOS_CHECK_GOTO(tDeserializeSCreateDbReq(pReq->pCont, pReq->contLen, &createReq), NULL, _OVER);
3,089!
1022
#ifdef WINDOWS
1023
  if (taosArrayGetSize(createReq.pRetensions) > 0) {
1024
    terrno = TSDB_CODE_MND_INVALID_PLATFORM;
1025
    goto _OVER;
1026
  }
1027
#endif
1028
  mInfo("db:%s, start to create, vgroups:%d", createReq.db, createReq.numOfVgroups);
3,089!
1029

1030
  pDb = mndAcquireDb(pMnode, createReq.db);
3,089✔
1031
  if (pDb != NULL) {
3,089✔
1032
    if (createReq.ignoreExist) {
281✔
1033
      mInfo("db:%s, already exist, ignore exist is set", createReq.db);
273!
1034
      code = 0;
273✔
1035
      goto _OVER;
273✔
1036
    } else {
1037
      code = TSDB_CODE_MND_DB_ALREADY_EXIST;
8✔
1038
      goto _OVER;
8✔
1039
    }
1040
  } else {
1041
    if (terrno == TSDB_CODE_MND_DB_IN_CREATING) {
2,808✔
1042
      code = terrno;
22✔
1043
      goto _OVER;
22✔
1044
    } else if (terrno == TSDB_CODE_MND_DB_IN_DROPPING) {
2,786!
1045
      goto _OVER;
×
1046
    } else if (terrno == TSDB_CODE_MND_DB_NOT_EXIST) {
2,786!
1047
      // continue
1048
    } else {  // TSDB_CODE_APP_ERROR
1049
      goto _OVER;
×
1050
    }
1051
  }
1052

1053
  TAOS_CHECK_GOTO(mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_CREATE_DB, NULL), &lino, _OVER);
2,786✔
1054

1055
  TAOS_CHECK_GOTO(grantCheck(TSDB_GRANT_DB), &lino, _OVER);
2,781!
1056

1057
  int32_t nVnodes = createReq.numOfVgroups * createReq.replications;
2,781✔
1058
  TAOS_CHECK_GOTO(grantCheckEx(TSDB_GRANT_VNODE, &nVnodes), &lino, _OVER);
2,781!
1059

1060
  if (createReq.replications == 2) {
2,781✔
1061
    TAOS_CHECK_GOTO(grantCheck(TSDB_GRANT_DUAL_REPLICA_HA), &lino, _OVER);
10!
1062
  }
1063

1064
  TAOS_CHECK_GOTO(mndCheckDbEncryptKey(pMnode, &createReq), &lino, _OVER);
2,781✔
1065

1066
  TAOS_CHECK_GOTO(mndCheckDbDnodeList(pMnode, createReq.db, createReq.dnodeListStr, dnodeList), &lino, _OVER);
2,779✔
1067

1068
  TAOS_CHECK_GOTO(mndAcquireUser(pMnode, pReq->info.conn.user, &pUser), &lino, _OVER);
2,763!
1069

1070
  if (sdbGetSize(pMnode->pSdb, SDB_MOUNT) > 0) {
2,763!
1071
    TAOS_CHECK_GOTO(TSDB_CODE_MND_MOUNT_NOT_EMPTY, &lino, _OVER);
×
1072
  }
1073

1074
  TAOS_CHECK_GOTO(mndCreateDb(pMnode, pReq, &createReq, pUser, dnodeList), &lino, _OVER);
2,763✔
1075
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
2,754!
1076

1077
  SName name = {0};
2,754✔
1078
  if (tNameFromString(&name, createReq.db, T_NAME_ACCT | T_NAME_DB) < 0)
2,754!
1079
    mError("db:%s, failed to parse db name", createReq.db);
×
1080

1081
  auditRecord(pReq, pMnode->clusterId, "createDB", name.dbname, "", createReq.sql, createReq.sqlLen);
2,754✔
1082

1083
_OVER:
3,089✔
1084
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
3,089✔
1085
    mError("db:%s, failed to create at line:%d since %s", createReq.db, lino, tstrerror(code));
62!
1086
  }
1087

1088
  mndReleaseDb(pMnode, pDb);
3,089✔
1089
  mndReleaseUser(pMnode, pUser);
3,089✔
1090
  tFreeSCreateDbReq(&createReq);
3,089✔
1091
  taosArrayDestroy(dnodeList);
3,089✔
1092

1093
  TAOS_RETURN(code);
3,089✔
1094
}
1095

1096
static int32_t mndSetDbCfgFromAlterDbReq(SDbObj *pDb, SAlterDbReq *pAlter) {
166✔
1097
  int32_t code = TSDB_CODE_MND_DB_OPTION_UNCHANGED;
166✔
1098

1099
  if (pAlter->buffer > 0 && pAlter->buffer != pDb->cfg.buffer) {
166✔
1100
    pDb->cfg.buffer = pAlter->buffer;
7✔
1101
    code = 0;
7✔
1102
  }
1103

1104
  if (pAlter->pages > 0 && pAlter->pages != pDb->cfg.pages) {
166✔
1105
    pDb->cfg.pages = pAlter->pages;
3✔
1106
    code = 0;
3✔
1107
  }
1108

1109
  if (pAlter->pageSize > 0 && pAlter->pageSize != pDb->cfg.pageSize) {
166!
1110
    pDb->cfg.pageSize = pAlter->pageSize;
×
1111
    code = 0;
×
1112
  }
1113

1114
  if (pAlter->daysPerFile > 0 && pAlter->daysPerFile != pDb->cfg.daysPerFile) {
166!
1115
    pDb->cfg.daysPerFile = pAlter->daysPerFile;
×
1116
    code = 0;
×
1117
  }
1118

1119
  if (pAlter->daysToKeep0 > 0 && pAlter->daysToKeep0 != pDb->cfg.daysToKeep0) {
166✔
1120
    pDb->cfg.daysToKeep0 = pAlter->daysToKeep0;
20✔
1121
    code = 0;
20✔
1122
  }
1123

1124
  if (pAlter->daysToKeep1 > 0 && pAlter->daysToKeep1 != pDb->cfg.daysToKeep1) {
166✔
1125
    pDb->cfg.daysToKeep1 = pAlter->daysToKeep1;
20✔
1126
    code = 0;
20✔
1127
  }
1128

1129
  if (pAlter->daysToKeep2 > 0 && pAlter->daysToKeep2 != pDb->cfg.daysToKeep2) {
166✔
1130
    pDb->cfg.daysToKeep2 = pAlter->daysToKeep2;
16✔
1131
    code = 0;
16✔
1132
  }
1133

1134
  if (pAlter->keepTimeOffset >= 0 && pAlter->keepTimeOffset != pDb->cfg.keepTimeOffset) {
166!
1135
    pDb->cfg.keepTimeOffset = pAlter->keepTimeOffset;
5✔
1136
    code = 0;
5✔
1137
  }
1138

1139
  if (pAlter->walFsyncPeriod >= 0 && pAlter->walFsyncPeriod != pDb->cfg.walFsyncPeriod) {
166✔
1140
    pDb->cfg.walFsyncPeriod = pAlter->walFsyncPeriod;
12✔
1141
    code = 0;
12✔
1142
  }
1143

1144
  if (pAlter->walLevel >= 0 && pAlter->walLevel != pDb->cfg.walLevel) {
166✔
1145
    pDb->cfg.walLevel = pAlter->walLevel;
9✔
1146
    code = 0;
9✔
1147
  }
1148

1149
  if (pAlter->strict >= 0 && pAlter->strict != pDb->cfg.strict) {
166!
1150
#if 1
1151
    code = TSDB_CODE_OPS_NOT_SUPPORT;
×
1152
#else
1153
    pDb->cfg.strict = pAlter->strict;
1154
    code = 0;
1155
#endif
1156
  }
1157

1158
  if (pAlter->cacheLast >= 0 && pAlter->cacheLast != pDb->cfg.cacheLast) {
166✔
1159
    pDb->cfg.cacheLast = pAlter->cacheLast;
29✔
1160
    code = 0;
29✔
1161
  }
1162

1163
  if (pAlter->cacheLastSize > 0 && pAlter->cacheLastSize != pDb->cfg.cacheLastSize) {
166✔
1164
    pDb->cfg.cacheLastSize = pAlter->cacheLastSize;
5✔
1165
    code = 0;
5✔
1166
  }
1167

1168
  if (pAlter->replications > 0 && pAlter->replications != pDb->cfg.replications) {
166✔
1169
    pDb->cfg.replications = pAlter->replications;
15✔
1170
    pDb->vgVersion++;
15✔
1171
    code = 0;
15✔
1172
  }
1173

1174
  if (pAlter->sstTrigger > 0 && pAlter->sstTrigger != pDb->cfg.sstTrigger) {
166✔
1175
    pDb->cfg.sstTrigger = pAlter->sstTrigger;
2✔
1176
    pDb->vgVersion++;
2✔
1177
    code = 0;
2✔
1178
  }
1179

1180
  if (pAlter->minRows > 0 && pAlter->minRows != pDb->cfg.minRows) {
166✔
1181
    pDb->cfg.minRows = pAlter->minRows;
2✔
1182
    pDb->vgVersion++;
2✔
1183
    code = 0;
2✔
1184
  }
1185

1186
  if (pAlter->walRetentionPeriod > TSDB_DB_MIN_WAL_RETENTION_PERIOD &&
166✔
1187
      pAlter->walRetentionPeriod != pDb->cfg.walRetentionPeriod) {
32✔
1188
    pDb->cfg.walRetentionPeriod = pAlter->walRetentionPeriod;
18✔
1189
    pDb->vgVersion++;
18✔
1190
    code = 0;
18✔
1191
  }
1192

1193
  if (pAlter->walRetentionSize > TSDB_DB_MIN_WAL_RETENTION_SIZE &&
166✔
1194
      pAlter->walRetentionSize != pDb->cfg.walRetentionSize) {
2✔
1195
    pDb->cfg.walRetentionSize = pAlter->walRetentionSize;
1✔
1196
    pDb->vgVersion++;
1✔
1197
    code = 0;
1✔
1198
  }
1199

1200
  if (pAlter->ssKeepLocal >= TSDB_MIN_SS_KEEP_LOCAL && pAlter->ssKeepLocal <= TSDB_MAX_SS_KEEP_LOCAL && pAlter->ssKeepLocal != pDb->cfg.ssKeepLocal) {
166!
1201
    pDb->cfg.ssKeepLocal = pAlter->ssKeepLocal;
1✔
1202
    pDb->vgVersion++;
1✔
1203
    code = 0;
1✔
1204
  }
1205

1206
  if (pAlter->ssCompact >= TSDB_MIN_SS_COMPACT && pAlter->ssCompact <= TSDB_MAX_SS_COMPACT && pAlter->ssCompact != pDb->cfg.ssCompact) {
166!
1207
    pDb->cfg.ssCompact = pAlter->ssCompact;
1✔
1208
    pDb->vgVersion++;
1✔
1209
    code = 0;
1✔
1210
  }
1211

1212
  if (pAlter->withArbitrator >= TSDB_MIN_DB_WITH_ARBITRATOR && pAlter->withArbitrator != pDb->cfg.withArbitrator) {
166✔
1213
    pDb->cfg.withArbitrator = pAlter->withArbitrator;
1✔
1214
    pDb->vgVersion++;
1✔
1215
    code = 0;
1✔
1216
  }
1217

1218
  if (pAlter->compactInterval >= TSDB_DEFAULT_COMPACT_INTERVAL && pAlter->compactInterval != pDb->cfg.compactInterval) {
166✔
1219
    pDb->cfg.compactInterval = pAlter->compactInterval;
2✔
1220
    pDb->vgVersion++;
2✔
1221
    code = 0;
2✔
1222
  }
1223

1224
  bool compactTimeRangeChanged = false;
166✔
1225
  if (pAlter->compactStartTime != pDb->cfg.compactStartTime &&
166✔
1226
      (pAlter->compactStartTime == TSDB_DEFAULT_COMPACT_START_TIME ||
165!
1227
       pAlter->compactStartTime <= -pDb->cfg.daysPerFile)) {
165!
1228
    pDb->cfg.compactStartTime = pAlter->compactStartTime;
×
1229
    compactTimeRangeChanged = true;
×
1230
    code = 0;
×
1231
  }
1232

1233
  if (pAlter->compactEndTime != pDb->cfg.compactEndTime &&
166✔
1234
      (pAlter->compactEndTime == TSDB_DEFAULT_COMPACT_END_TIME || pAlter->compactEndTime <= -pDb->cfg.daysPerFile)) {
165!
1235
    pDb->cfg.compactEndTime = pAlter->compactEndTime;
×
1236
    compactTimeRangeChanged = true;
×
1237
    code = 0;
×
1238
  }
1239
  if(compactTimeRangeChanged) {
166!
1240
    pDb->vgVersion++;
×
1241
  }
1242

1243
  if (pAlter->compactTimeOffset >= TSDB_MIN_COMPACT_TIME_OFFSET &&
166✔
1244
      pAlter->compactTimeOffset != pDb->cfg.compactTimeOffset) {
2✔
1245
    pDb->cfg.compactTimeOffset = pAlter->compactTimeOffset;
1✔
1246
    pDb->vgVersion++;
1✔
1247
    code = 0;
1✔
1248
  }
1249

1250
  TAOS_RETURN(code);
166✔
1251
}
1252

1253
static int32_t mndSetAlterDbPrepareLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
127✔
1254
  int32_t  code = 0;
127✔
1255
  SSdbRaw *pRedoRaw = mndDbActionEncode(pOld);
127✔
1256
  if (pRedoRaw == NULL) {
127!
1257
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1258
    if (terrno != 0) code = terrno;
×
1259
    TAOS_RETURN(code);
×
1260
  }
1261
  if ((code = mndTransAppendPrepareLog(pTrans, pRedoRaw)) != 0) {
127!
1262
    sdbFreeRaw(pRedoRaw);
×
1263
    TAOS_RETURN(code);
×
1264
  }
1265

1266
  if ((code = sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY)) != 0) {
127!
1267
    sdbFreeRaw(pRedoRaw);
×
1268
    TAOS_RETURN(code);
×
1269
  }
1270
  return 0;
127✔
1271
}
1272

1273
static int32_t mndSetAlterDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
127✔
1274
  int32_t  code = 0;
127✔
1275
  SSdbRaw *pCommitRaw = mndDbActionEncode(pNew);
127✔
1276
  if (pCommitRaw == NULL) {
127!
1277
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1278
    if (terrno != 0) code = terrno;
×
1279
    TAOS_RETURN(code);
×
1280
  }
1281
  if ((code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
127!
1282
    sdbFreeRaw(pCommitRaw);
×
1283
    TAOS_RETURN(code);
×
1284
  }
1285

1286
  if ((code = sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY)) != 0) {
127!
1287
    sdbFreeRaw(pCommitRaw);
×
1288
    TAOS_RETURN(code);
×
1289
  }
1290
  TAOS_RETURN(code);
127✔
1291
}
1292

1293
static int32_t mndSetAlterDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb, SDbObj *pNewDb) {
127✔
1294
  int32_t code = 0, lino = 0;
127✔
1295
  SSdb   *pSdb = pMnode->pSdb;
127✔
1296
  void   *pIter = NULL;
127✔
1297
  SVgObj *pVgroup = NULL;
127✔
1298
  SArray *pArray = mndBuildDnodesArray(pMnode, 0, NULL);
127✔
1299

1300
  TSDB_CHECK_NULL(pArray, code, lino, _err, TSDB_CODE_OUT_OF_MEMORY);
127!
1301

1302
  while (1) {
1303
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
636✔
1304
    if (pIter == NULL) break;
636✔
1305

1306
    if (mndVgroupInDb(pVgroup, pNewDb->uid)) {
510✔
1307
      SVgObj newVgroup = {0};
358✔
1308
      TAOS_CHECK_GOTO(mndBuildAlterVgroupAction(pMnode, pTrans, pOldDb, pNewDb, pVgroup, pArray, &newVgroup), &lino,
358✔
1309
                      _err);
1310

1311
      if (pNewDb->cfg.withArbitrator != pOldDb->cfg.withArbitrator) {
357!
1312
        if (pNewDb->cfg.withArbitrator) {
×
1313
          SArbGroup arbGroup = {0};
×
1314
          TAOS_CHECK_GOTO(mndArbGroupInitFromVgObj(&newVgroup, &arbGroup), &lino, _err);
×
1315
          TAOS_CHECK_GOTO(mndSetCreateArbGroupCommitLogs(pTrans, &arbGroup), &lino, _err);
×
1316
        } else {
1317
          SArbGroup arbGroup = {0};
×
1318
          TAOS_CHECK_GOTO(mndArbGroupInitFromVgObj(pVgroup, &arbGroup), &lino, _err);
×
1319
          TAOS_CHECK_GOTO(mndSetDropArbGroupCommitLogs(pTrans, &arbGroup), &lino, _err);
×
1320
        }
1321
      }
1322
    }
1323

1324
    sdbRelease(pSdb, pVgroup);
509✔
1325
  }
1326

1327
  taosArrayDestroy(pArray);
126✔
1328
  TAOS_RETURN(code);
126✔
1329

1330
_err:
1✔
1331
  mError("db:%s, %s failed at %d since %s", pNewDb->name, __func__, lino, tstrerror(code));
1!
1332

1333
  sdbCancelFetch(pSdb, pIter);
1✔
1334
  sdbRelease(pSdb, pVgroup);
1✔
1335
  taosArrayDestroy(pArray);
1✔
1336
  TAOS_RETURN(code);
1✔
1337
}
1338

1339
static int32_t mndAlterDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pOld, SDbObj *pNew) {
130✔
1340
  int32_t code = -1;
130✔
1341
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq, "alter-db");
130✔
1342
  if (pTrans == NULL) {
130!
1343
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1344
    if (terrno != 0) code = terrno;
×
1345
    TAOS_RETURN(code);
×
1346
  }
1347
  mInfo("trans:%d, used to alter db:%s", pTrans->id, pOld->name);
130!
1348
  mInfo("trans:%d, used to alter db, ableToBeKilled:%d, killMode:%d", pTrans->id, pTrans->ableToBeKilled, pTrans->killMode);
130!
1349

1350
  mndTransSetDbName(pTrans, pOld->name, NULL);
130✔
1351
  mndTransSetGroupParallel(pTrans);
130✔
1352
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
130✔
1353
  TAOS_CHECK_GOTO(mndTransCheckConflictWithCompact(pMnode, pTrans), NULL, _OVER);
128✔
1354
  TAOS_CHECK_GOTO(mndTransCheckConflictWithRetention(pMnode, pTrans), NULL, _OVER);
127!
1355

1356
  TAOS_CHECK_GOTO(mndSetAlterDbPrepareLogs(pMnode, pTrans, pOld, pNew), NULL, _OVER);
127!
1357
  TAOS_CHECK_GOTO(mndSetAlterDbCommitLogs(pMnode, pTrans, pOld, pNew), NULL, _OVER);
127!
1358
  TAOS_CHECK_GOTO(mndSetAlterDbRedoActions(pMnode, pTrans, pOld, pNew), NULL, _OVER);
127✔
1359

1360
  mInfo("trans:%d, used to alter db, ableToBeKilled:%d, killMode:%d", pTrans->id, pTrans->ableToBeKilled, pTrans->killMode);
126!
1361
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
126!
1362
  code = 0;
126✔
1363

1364
_OVER:
130✔
1365
  mndTransDrop(pTrans);
130✔
1366
  TAOS_RETURN(code);
130✔
1367
}
1368

1369
static int32_t mndProcessAlterDbReq(SRpcMsg *pReq) {
168✔
1370
  SMnode     *pMnode = pReq->info.node;
168✔
1371
  int32_t     code = -1;
168✔
1372
  SDbObj     *pDb = NULL;
168✔
1373
  SAlterDbReq alterReq = {0};
168✔
1374
  SDbObj      dbObj = {0};
168✔
1375

1376
  TAOS_CHECK_GOTO(tDeserializeSAlterDbReq(pReq->pCont, pReq->contLen, &alterReq), NULL, _OVER);
168!
1377

1378
  mInfo("db:%s, start to alter", alterReq.db);
168!
1379

1380
  pDb = mndAcquireDb(pMnode, alterReq.db);
168✔
1381
  if (pDb == NULL) {
168!
1382
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1383
    if (terrno != 0) code = terrno;
×
1384
    goto _OVER;
×
1385
  }
1386

1387
  TAOS_CHECK_GOTO(mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_ALTER_DB, pDb), NULL, _OVER);
168✔
1388

1389
  if (alterReq.replications == 2) {
166✔
1390
    TAOS_CHECK_GOTO(grantCheck(TSDB_GRANT_DUAL_REPLICA_HA), NULL, _OVER);
1!
1391
  }
1392

1393
  int32_t numOfTopics = 0;
166✔
1394
  TAOS_CHECK_GOTO(mndGetNumOfTopics(pMnode, pDb->name, &numOfTopics), NULL, _OVER);
166!
1395

1396
  if (numOfTopics != 0 && alterReq.walRetentionPeriod == 0) {
166!
1397
    code = TSDB_CODE_MND_DB_RETENTION_PERIOD_ZERO;
×
1398
    mError("db:%s, not allowed to set WAL_RETENTION_PERIOD 0 when there are topics defined. numOfTopics:%d", pDb->name,
×
1399
           numOfTopics);
1400
    goto _OVER;
×
1401
  }
1402

1403
  if (pDb->cfg.isMount) {
166!
1404
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
×
1405
    goto _OVER;
×
1406
  }
1407

1408
  (void)memcpy(&dbObj, pDb, sizeof(SDbObj));
166✔
1409
  if (dbObj.cfg.pRetensions != NULL) {
166!
1410
    dbObj.cfg.pRetensions = taosArrayDup(pDb->cfg.pRetensions, NULL);
×
1411
    if (dbObj.cfg.pRetensions == NULL) goto _OVER;
×
1412
  }
1413

1414
  code = mndSetDbCfgFromAlterDbReq(&dbObj, &alterReq);
166✔
1415
  if (code != 0) {
166✔
1416
    if (code == TSDB_CODE_MND_DB_OPTION_UNCHANGED) code = 0;
34!
1417
    goto _OVER;
34✔
1418
  }
1419

1420
  TAOS_CHECK_GOTO(mndCheckInChangeDbCfg(pMnode, &pDb->cfg, &dbObj.cfg), NULL, _OVER);
132✔
1421

1422
  dbObj.cfgVersion++;
130✔
1423
  dbObj.updateTime = taosGetTimestampMs();
130✔
1424
  code = mndAlterDb(pMnode, pReq, pDb, &dbObj);
130✔
1425

1426
  if (dbObj.cfg.replications != pDb->cfg.replications) {
130✔
1427
    // return quickly, operation executed asynchronously
1428
    mInfo("db:%s, alter db replica from %d to %d", pDb->name, pDb->cfg.replications, dbObj.cfg.replications);
14!
1429
  } else {
1430
    if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
116!
1431
  }
1432

1433
  SName name = {0};
130✔
1434
  if (tNameFromString(&name, alterReq.db, T_NAME_ACCT | T_NAME_DB) < 0)
130!
1435
    mError("db:%s, failed to parse db name", alterReq.db);
×
1436

1437
  auditRecord(pReq, pMnode->clusterId, "alterDB", name.dbname, "", alterReq.sql, alterReq.sqlLen);
130✔
1438

1439
_OVER:
168✔
1440
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
168✔
1441
    if (terrno != 0) code = terrno;
8✔
1442
    mError("db:%s, failed to alter since %s", alterReq.db, tstrerror(code));
8!
1443
  }
1444

1445
  mndReleaseDb(pMnode, pDb);
168✔
1446
  taosArrayDestroy(dbObj.cfg.pRetensions);
168✔
1447
  tFreeSAlterDbReq(&alterReq);
168✔
1448

1449
  TAOS_RETURN(code);
168✔
1450
}
1451

1452
static void mndDumpDbCfgInfo(SDbCfgRsp *cfgRsp, SDbObj *pDb) {
3,473✔
1453
  tstrncpy(cfgRsp->db, pDb->name, sizeof(cfgRsp->db));
3,473✔
1454
  cfgRsp->dbId = pDb->uid;
3,473✔
1455
  cfgRsp->cfgVersion = pDb->cfgVersion;
3,473✔
1456
  cfgRsp->numOfVgroups = pDb->cfg.numOfVgroups;
3,473✔
1457
  cfgRsp->numOfStables = pDb->cfg.numOfStables;
3,473✔
1458
  cfgRsp->buffer = pDb->cfg.buffer;
3,473✔
1459
  cfgRsp->cacheSize = pDb->cfg.cacheLastSize;
3,473✔
1460
  cfgRsp->pageSize = pDb->cfg.pageSize;
3,473✔
1461
  cfgRsp->pages = pDb->cfg.pages;
3,473✔
1462
  cfgRsp->daysPerFile = pDb->cfg.daysPerFile;
3,473✔
1463
  cfgRsp->daysToKeep0 = pDb->cfg.daysToKeep0;
3,473✔
1464
  cfgRsp->daysToKeep1 = pDb->cfg.daysToKeep1;
3,473✔
1465
  cfgRsp->daysToKeep2 = pDb->cfg.daysToKeep2;
3,473✔
1466
  cfgRsp->keepTimeOffset = pDb->cfg.keepTimeOffset;
3,473✔
1467
  cfgRsp->minRows = pDb->cfg.minRows;
3,473✔
1468
  cfgRsp->maxRows = pDb->cfg.maxRows;
3,473✔
1469
  cfgRsp->walFsyncPeriod = pDb->cfg.walFsyncPeriod;
3,473✔
1470
  cfgRsp->hashPrefix = pDb->cfg.hashPrefix;
3,473✔
1471
  cfgRsp->hashSuffix = pDb->cfg.hashSuffix;
3,473✔
1472
  cfgRsp->hashMethod = pDb->cfg.hashMethod;
3,473✔
1473
  cfgRsp->walLevel = pDb->cfg.walLevel;
3,473✔
1474
  cfgRsp->precision = pDb->cfg.precision;
3,473✔
1475
  cfgRsp->compression = pDb->cfg.compression;
3,473✔
1476
  cfgRsp->replications = pDb->cfg.replications;
3,473✔
1477
  cfgRsp->strict = pDb->cfg.strict;
3,473✔
1478
  cfgRsp->cacheLast = pDb->cfg.cacheLast;
3,473✔
1479
  cfgRsp->tsdbPageSize = pDb->cfg.tsdbPageSize;
3,473✔
1480
  cfgRsp->walRetentionPeriod = pDb->cfg.walRetentionPeriod;
3,473✔
1481
  cfgRsp->walRollPeriod = pDb->cfg.walRollPeriod;
3,473✔
1482
  cfgRsp->walRetentionSize = pDb->cfg.walRetentionSize;
3,473✔
1483
  cfgRsp->walSegmentSize = pDb->cfg.walSegmentSize;
3,473✔
1484
  cfgRsp->numOfRetensions = pDb->cfg.numOfRetensions;
3,473✔
1485
  cfgRsp->pRetensions = taosArrayDup(pDb->cfg.pRetensions, NULL);
3,473✔
1486
  cfgRsp->schemaless = pDb->cfg.schemaless;
3,473✔
1487
  cfgRsp->sstTrigger = pDb->cfg.sstTrigger;
3,473✔
1488
  cfgRsp->ssChunkSize = pDb->cfg.ssChunkSize;
3,473✔
1489
  cfgRsp->ssKeepLocal = pDb->cfg.ssKeepLocal;
3,473✔
1490
  cfgRsp->ssCompact = pDb->cfg.ssCompact;
3,473✔
1491
  cfgRsp->withArbitrator = pDb->cfg.withArbitrator;
3,473✔
1492
  cfgRsp->encryptAlgorithm = pDb->cfg.encryptAlgorithm;
3,473✔
1493
  cfgRsp->compactInterval = pDb->cfg.compactInterval;
3,473✔
1494
  cfgRsp->compactStartTime = pDb->cfg.compactStartTime;
3,473✔
1495
  cfgRsp->compactEndTime = pDb->cfg.compactEndTime;
3,473✔
1496
  cfgRsp->compactTimeOffset = pDb->cfg.compactTimeOffset;
3,473✔
1497
  cfgRsp->flags = pDb->cfg.flags;
3,473✔
1498
}
3,473✔
1499

1500
static int32_t mndProcessGetDbCfgReq(SRpcMsg *pReq) {
3,887✔
1501
  SMnode   *pMnode = pReq->info.node;
3,887✔
1502
  int32_t   code = -1;
3,887✔
1503
  SDbObj   *pDb = NULL;
3,887✔
1504
  SDbCfgReq cfgReq = {0};
3,887✔
1505
  SDbCfgRsp cfgRsp = {0};
3,887✔
1506

1507
  TAOS_CHECK_GOTO(tDeserializeSDbCfgReq(pReq->pCont, pReq->contLen, &cfgReq), NULL, _OVER);
3,887!
1508

1509
  if (strcasecmp(cfgReq.db, TSDB_INFORMATION_SCHEMA_DB) && strcasecmp(cfgReq.db, TSDB_PERFORMANCE_SCHEMA_DB)) {
3,887!
1510
    pDb = mndAcquireDb(pMnode, cfgReq.db);
3,887✔
1511
    if (pDb == NULL) {
3,887✔
1512
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
812✔
1513
      if (terrno != 0) code = terrno;
812!
1514
      goto _OVER;
812✔
1515
    }
1516

1517
    mndDumpDbCfgInfo(&cfgRsp, pDb);
3,075✔
1518
  }
1519

1520
  int32_t contLen = tSerializeSDbCfgRsp(NULL, 0, &cfgRsp);
3,075✔
1521
  void   *pRsp = rpcMallocCont(contLen);
3,075✔
1522
  if (pRsp == NULL) {
3,075!
1523
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1524
    if (terrno != 0) code = terrno;
×
1525
    goto _OVER;
×
1526
  }
1527

1528
  int32_t ret = 0;
3,075✔
1529
  if ((ret = tSerializeSDbCfgRsp(pRsp, contLen, &cfgRsp)) < 0) {
3,075!
1530
    code = ret;
×
1531
    goto _OVER;
×
1532
  }
1533

1534
  pReq->info.rsp = pRsp;
3,075✔
1535
  pReq->info.rspLen = contLen;
3,075✔
1536

1537
  code = 0;
3,075✔
1538

1539
_OVER:
3,887✔
1540

1541
  tFreeSDbCfgRsp(&cfgRsp);
3,887✔
1542

1543
  if (code != 0) {
3,887✔
1544
    mError("db:%s, failed to get cfg since %s", cfgReq.db, terrstr());
812!
1545
  }
1546

1547
  mndReleaseDb(pMnode, pDb);
3,887✔
1548

1549
  TAOS_RETURN(code);
3,887✔
1550
}
1551

1552
int32_t mndSetDropDbPrepareLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
1,409✔
1553
  int32_t  code = 0;
1,409✔
1554
  SSdbRaw *pRedoRaw = mndDbActionEncode(pDb);
1,409✔
1555
  if (pRedoRaw == NULL) {
1,409!
1556
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1557
    if (terrno != 0) code = terrno;
×
1558
    return -1;
×
1559
  }
1560
  TAOS_CHECK_RETURN(mndTransAppendPrepareLog(pTrans, pRedoRaw));
1,409!
1561
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_DROPPING));
1,409!
1562

1563
  SSdb *pSdb = pMnode->pSdb;
1,409✔
1564
  void *pIter = NULL;
1,409✔
1565

1566
  while (1) {
6✔
1567
    SArbGroup *pArbGroup = NULL;
1,415✔
1568
    pIter = sdbFetch(pSdb, SDB_ARBGROUP, pIter, (void **)&pArbGroup);
1,415✔
1569
    if (pIter == NULL) break;
1,415✔
1570

1571
    if (pArbGroup->dbUid == pDb->uid) {
6!
1572
      if ((code = mndSetDropArbGroupPrepareLogs(pTrans, pArbGroup)) != 0) {
6!
1573
        sdbCancelFetch(pSdb, pIter);
×
1574
        sdbRelease(pSdb, pArbGroup);
×
1575
        TAOS_RETURN(code);
×
1576
      }
1577
    }
1578

1579
    sdbRelease(pSdb, pArbGroup);
6✔
1580
  }
1581

1582
  TAOS_RETURN(code);
1,409✔
1583
}
1584

1585
int32_t mndSetDropDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
1,409✔
1586
  int32_t  code = 0;
1,409✔
1587
  SSdbRaw *pCommitRaw = mndDbActionEncode(pDb);
1,409✔
1588
  if (pCommitRaw == NULL) {
1,409!
1589
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1590
    if (terrno != 0) code = terrno;
×
1591
    return -1;
×
1592
  }
1593
  TAOS_CHECK_RETURN(mndTransAppendCommitlog(pTrans, pCommitRaw));
1,409!
1594
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED));
1,409!
1595

1596
  SSdb *pSdb = pMnode->pSdb;
1,409✔
1597
  void *pIter = NULL;
1,409✔
1598

1599
  while (1) {
6✔
1600
    SArbGroup *pArbGroup = NULL;
1,415✔
1601
    pIter = sdbFetch(pSdb, SDB_ARBGROUP, pIter, (void **)&pArbGroup);
1,415✔
1602
    if (pIter == NULL) break;
1,415✔
1603

1604
    if (pArbGroup->dbUid == pDb->uid) {
6!
1605
      if ((code = mndSetDropArbGroupCommitLogs(pTrans, pArbGroup)) != 0) {
6!
1606
        sdbCancelFetch(pSdb, pIter);
×
1607
        sdbRelease(pSdb, pArbGroup);
×
1608
        TAOS_RETURN(code);
×
1609
      }
1610
    }
1611

1612
    sdbRelease(pSdb, pArbGroup);
6✔
1613
  }
1614

1615
  while (1) {
4,977✔
1616
    SVgObj *pVgroup = NULL;
6,386✔
1617
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
6,386✔
1618
    if (pIter == NULL) break;
6,386✔
1619

1620
    if (pVgroup->dbUid == pDb->uid) {
4,977✔
1621
      SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroup);
2,792✔
1622
      if (pVgRaw == NULL) {
2,792!
1623
        sdbCancelFetch(pSdb, pIter);
×
1624
        sdbRelease(pSdb, pVgroup);
×
1625
        code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1626
        if (terrno != 0) code = terrno;
×
1627
        TAOS_RETURN(code);
×
1628
      }
1629
      if ((code = mndTransAppendCommitlog(pTrans, pVgRaw)) != 0) {
2,792!
1630
        sdbCancelFetch(pSdb, pIter);
×
1631
        sdbRelease(pSdb, pVgroup);
×
1632
        TAOS_RETURN(code);
×
1633
      }
1634
      if ((code = sdbSetRawStatus(pVgRaw, SDB_STATUS_DROPPED)) != 0) {
2,792!
1635
        sdbCancelFetch(pSdb, pIter);
×
1636
        sdbRelease(pSdb, pVgroup);
×
1637
        TAOS_RETURN(code);
×
1638
      }
1639
    }
1640

1641
    sdbRelease(pSdb, pVgroup);
4,977✔
1642
  }
1643

1644
  while (1) {
2,840✔
1645
    SStbObj *pStb = NULL;
4,249✔
1646
    ESdbStatus status;
1647
    pIter = sdbFetchAll(pSdb, SDB_STB, pIter, (void **)&pStb, &status, true);
4,249✔
1648
    if (pIter == NULL) break;
4,249✔
1649

1650
    if (pStb->dbUid == pDb->uid) {
2,840✔
1651
      SSdbRaw *pStbRaw = mndStbActionEncode(pStb);
1,168✔
1652
      if (pStbRaw == NULL) {
1,168!
1653
        sdbCancelFetch(pSdb, pIter);
×
1654
        sdbRelease(pSdb, pStbRaw);
×
1655
        code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1656
        if (terrno != 0) code = terrno;
×
1657
        return -1;
×
1658
      }
1659
      if ((code = mndTransAppendCommitlog(pTrans, pStbRaw)) != 0) {
1,168!
1660
        sdbCancelFetch(pSdb, pIter);
×
1661
        sdbRelease(pSdb, pStbRaw);
×
1662
        return -1;
×
1663
      }
1664
      if ((code = sdbSetRawStatus(pStbRaw, SDB_STATUS_DROPPED)) != 0) {
1,168!
1665
        sdbCancelFetch(pSdb, pIter);
×
1666
        sdbRelease(pSdb, pStbRaw);
×
1667
        return -1;
×
1668
      }
1669
    }
1670

1671
    sdbRelease(pSdb, pStb);
2,840✔
1672
  }
1673

1674
  TAOS_RETURN(code);
1,409✔
1675
}
1676

1677
static int32_t mndBuildDropVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup) {
2,792✔
1678
  int32_t code = 0;
2,792✔
1679
  for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
5,688✔
1680
    SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
2,896✔
1681
    TAOS_CHECK_RETURN(mndAddDropVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid, true));
2,896!
1682
  }
1683

1684
  TAOS_RETURN(code);
2,792✔
1685
}
1686

1687
int32_t mndSetDropDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
1,409✔
1688
  int32_t code = 0;
1,409✔
1689
  SSdb   *pSdb = pMnode->pSdb;
1,409✔
1690
  void   *pIter = NULL;
1,409✔
1691

1692
  while (1) {
4,977✔
1693
    SVgObj *pVgroup = NULL;
6,386✔
1694
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
6,386✔
1695
    if (pIter == NULL) break;
6,386✔
1696

1697
    if (pVgroup->dbUid == pDb->uid) {
4,977✔
1698
      if ((code = mndBuildDropVgroupAction(pMnode, pTrans, pDb, pVgroup)) != 0) {
2,792!
1699
        sdbCancelFetch(pSdb, pIter);
×
1700
        sdbRelease(pSdb, pVgroup);
×
1701
        TAOS_RETURN(code);
×
1702
      }
1703
    }
1704

1705
    sdbRelease(pSdb, pVgroup);
4,977✔
1706
  }
1707

1708
  TAOS_RETURN(code);
1,409✔
1709
}
1710

1711
static int32_t mndBuildDropDbRsp(SDbObj *pDb, int32_t *pRspLen, void **ppRsp, bool useRpcMalloc) {
2,501✔
1712
  int32_t    code = 0;
2,501✔
1713
  SDropDbRsp dropRsp = {0};
2,501✔
1714
  if (pDb != NULL) {
2,501✔
1715
    (void)memcpy(dropRsp.db, pDb->name, TSDB_DB_FNAME_LEN);
1,405✔
1716
    dropRsp.uid = pDb->uid;
1,405✔
1717
  }
1718

1719
  int32_t rspLen = tSerializeSDropDbRsp(NULL, 0, &dropRsp);
2,501✔
1720
  void   *pRsp = NULL;
2,501✔
1721
  if (useRpcMalloc) {
2,501✔
1722
    pRsp = rpcMallocCont(rspLen);
1,096✔
1723
  } else {
1724
    pRsp = taosMemoryMalloc(rspLen);
1,405!
1725
  }
1726

1727
  if (pRsp == NULL) {
2,501!
1728
    code = terrno;
×
1729
    TAOS_RETURN(code);
×
1730
  }
1731

1732
  int32_t ret = 0;
2,501✔
1733
  if ((ret = tSerializeSDropDbRsp(pRsp, rspLen, &dropRsp)) < 0) return ret;
2,501!
1734
  *pRspLen = rspLen;
2,501✔
1735
  *ppRsp = pRsp;
2,501✔
1736
  TAOS_RETURN(code);
2,501✔
1737
}
1738

1739
static int32_t mndDropDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb) {
1,406✔
1740
  int32_t code = -1;
1,406✔
1741

1742
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq, "drop-db");
1,406✔
1743
  if (pTrans == NULL) {
1,406!
1744
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
1745
    if (terrno != 0) code = terrno;
×
1746
    goto _OVER;
×
1747
  }
1748

1749
  mInfo("trans:%d start to drop db:%s", pTrans->id, pDb->name);
1,406!
1750

1751
  mndTransSetDbName(pTrans, pDb->name, NULL);
1,406✔
1752
  TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
1,406!
1753

1754
  if (mndTopicExistsForDb(pMnode, pDb)) {
1,406✔
1755
    code = TSDB_CODE_MND_TOPIC_MUST_BE_DELETED;
1✔
1756
    goto _OVER;
1✔
1757
  }
1758

1759
  TAOS_CHECK_GOTO(mndSetDropDbPrepareLogs(pMnode, pTrans, pDb), NULL, _OVER);
1,405!
1760
  TAOS_CHECK_GOTO(mndSetDropDbCommitLogs(pMnode, pTrans, pDb), NULL, _OVER);
1,405!
1761
  TAOS_CHECK_GOTO(mndDropStreamByDb(pMnode, pTrans, pDb), NULL, _OVER);
1,405!
1762
#ifdef TD_ENTERPRISE
1763
  TAOS_CHECK_GOTO(mndDropViewByDb(pMnode, pTrans, pDb), NULL, _OVER);
1,405!
1764
#endif
1765
  TAOS_CHECK_GOTO(mndDropTSMAsByDb(pMnode, pTrans, pDb), NULL, _OVER);
1,405!
1766
  TAOS_CHECK_GOTO(mndDropRsmasByDb(pMnode, pTrans, pDb), NULL, _OVER);
1,405!
1767
  TAOS_CHECK_GOTO(mndDropIdxsByDb(pMnode, pTrans, pDb), NULL, _OVER);
1,405!
1768
  //TAOS_CHECK_GOTO(mndStreamSetStopStreamTasksActions(pMnode, pTrans, pDb->uid), NULL, _OVER);
1769
  TAOS_CHECK_GOTO(mndSetDropDbRedoActions(pMnode, pTrans, pDb), NULL, _OVER);
1,405!
1770
  TAOS_CHECK_GOTO(mndUserRemoveDb(pMnode, pTrans, pDb, NULL), NULL, _OVER);
1,405!
1771

1772
  int32_t rspLen = 0;
1,405✔
1773
  void   *pRsp = NULL;
1,405✔
1774
  TAOS_CHECK_GOTO(mndBuildDropDbRsp(pDb, &rspLen, &pRsp, false), NULL, _OVER);
1,405!
1775
  mndTransSetRpcRsp(pTrans, pRsp, rspLen);
1,405✔
1776

1777
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
1,405!
1778
  code = 0;
1,405✔
1779

1780
_OVER:
1,406✔
1781
  mndTransDrop(pTrans);
1,406✔
1782
  TAOS_RETURN(code);
1,406✔
1783
}
1784

1785
static int32_t mndProcessDropDbReq(SRpcMsg *pReq) {
2,529✔
1786
  SMnode    *pMnode = pReq->info.node;
2,529✔
1787
  int32_t    code = -1;
2,529✔
1788
  SDbObj    *pDb = NULL;
2,529✔
1789
  SDropDbReq dropReq = {0};
2,529✔
1790

1791
  TAOS_CHECK_GOTO(tDeserializeSDropDbReq(pReq->pCont, pReq->contLen, &dropReq), NULL, _OVER);
2,529!
1792

1793
  mInfo("db:%s, start to drop", dropReq.db);
2,529!
1794

1795
  pDb = mndAcquireDb(pMnode, dropReq.db);
2,529✔
1796
  if (pDb == NULL) {
2,529✔
1797
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
1,104✔
1798
    if (terrno != 0) code = terrno;
1,104!
1799
    if (dropReq.ignoreNotExists) {
1,104✔
1800
      code = mndBuildDropDbRsp(pDb, &pReq->info.rspLen, &pReq->info.rsp, true);
1,096✔
1801
    }
1802
    goto _OVER;
1,104✔
1803
  }
1804

1805
  TAOS_CHECK_GOTO(mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_DROP_DB, pDb), NULL, _OVER);
1,425✔
1806

1807
  if(pDb->cfg.isMount) {
1,417✔
1808
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
4✔
1809
    goto _OVER;
4✔
1810
  }
1811

1812
  SSdb *pSdb = pMnode->pSdb;
1,413✔
1813
  void *pIter = NULL;
1,413✔
1814

1815
  while (1) {
5,019✔
1816
    SVgObj *pVgroup = NULL;
6,432✔
1817
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
6,432✔
1818
    if (pIter == NULL) break;
6,432✔
1819

1820
    if (pVgroup->dbUid == pDb->uid) {
5,019✔
1821
      bool isFound = false;
2,792✔
1822
      for (int32_t i = 0; i < pVgroup->replica; i++) {
5,688✔
1823
        if (pVgroup->vnodeGid[i].syncState == TAOS_SYNC_STATE_OFFLINE) {
2,896!
1824
          isFound = true;
×
1825
          break;
×
1826
        }
1827
      }
1828
      if (!isFound) {
2,792!
1829
        sdbRelease(pSdb, pVgroup);
2,792✔
1830
        continue;
2,792✔
1831
      }
1832
      code = TSDB_CODE_MND_VGROUP_OFFLINE;
×
1833
      sdbCancelFetch(pSdb, pIter);
×
1834
      sdbRelease(pSdb, pVgroup);
×
1835
      goto _OVER;
×
1836
    }
1837

1838
    sdbRelease(pSdb, pVgroup);
2,227✔
1839
  }
1840

1841
  bool dbStream = false;
1,413✔
1842
  bool vtableStream = false;
1,413✔
1843
  mstCheckDbInUse(pMnode, dropReq.db, &dbStream, &vtableStream, true);
1,413✔
1844
  if (dbStream) {
1,413✔
1845
    code = TSDB_CODE_MND_STREAM_DB_IN_USE;
6✔
1846
    mError("db:%s used by streams, drop db not allowed", dropReq.db);
6!
1847
    goto _OVER;
6✔
1848
  }
1849

1850
  if (vtableStream && !dropReq.force) {
1,407✔
1851
    code = TSDB_CODE_MND_STREAM_VTABLE_EXITS;
1✔
1852
    mError("db:%s, vtable stream exists, drop db not allowed", dropReq.db);
1!
1853
    goto _OVER;
1✔
1854
  }
1855

1856
  code = mndDropDb(pMnode, pReq, pDb);
1,406✔
1857
  if (code == TSDB_CODE_SUCCESS) {
1,406✔
1858
    code = TSDB_CODE_ACTION_IN_PROGRESS;
1,405✔
1859
  }
1860

1861
  SName name = {0};
1,406✔
1862
  if (tNameFromString(&name, dropReq.db, T_NAME_ACCT | T_NAME_DB) < 0)
1,406!
1863
    mError("db:%s, failed to parse db name", dropReq.db);
×
1864

1865
  auditRecord(pReq, pMnode->clusterId, "dropDB", name.dbname, "", dropReq.sql, dropReq.sqlLen);
1,406✔
1866

1867
_OVER:
2,529✔
1868
  if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_ACTION_IN_PROGRESS) {
2,529✔
1869
    mError("db:%s, failed to drop since %s", dropReq.db, terrstr());
28!
1870
  }
1871

1872
  mndReleaseDb(pMnode, pDb);
2,529✔
1873
  tFreeSDropDbReq(&dropReq);
2,529✔
1874
  TAOS_RETURN(code);
2,529✔
1875
}
1876

1877
static int32_t mndGetDBTableNum(SDbObj *pDb, SMnode *pMnode) {
54,329✔
1878
  int32_t numOfTables = 0;
54,329✔
1879
  int32_t vindex = 0;
54,329✔
1880
  SSdb   *pSdb = pMnode->pSdb;
54,329✔
1881

1882
  void *pIter = NULL;
54,329✔
1883
  while (vindex < pDb->cfg.numOfVgroups) {
210,701✔
1884
    SVgObj *pVgroup = NULL;
156,372✔
1885
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
156,372✔
1886
    if (pIter == NULL) break;
156,373!
1887

1888
    if (mndVgroupInDb(pVgroup, pDb->uid)) {
156,373✔
1889
      numOfTables += pVgroup->numOfTables / TSDB_TABLE_NUM_UNIT;
109,700✔
1890
      vindex++;
109,700✔
1891
    }
1892

1893
    sdbRelease(pSdb, pVgroup);
156,372✔
1894
  }
1895

1896
  sdbCancelFetch(pSdb, pIter);
54,329✔
1897
  return numOfTables;
54,330✔
1898
}
1899

1900
void mndBuildDBVgroupInfo(SDbObj *pDb, SMnode *pMnode, SArray *pVgList) {
59,377✔
1901
  int32_t vindex = 0;
59,377✔
1902
  SSdb   *pSdb = pMnode->pSdb;
59,377✔
1903

1904
  void *pIter = NULL;
59,377✔
1905
  while (1) {
113,811✔
1906
    SVgObj *pVgroup = NULL;
173,188✔
1907
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
173,188✔
1908
    if (pIter == NULL) break;
173,187✔
1909

1910
    if ((NULL == pDb || pVgroup->dbUid == pDb->uid) && !pVgroup->isTsma) {
159,858!
1911
      SVgroupInfo vgInfo = {0};
130,665✔
1912
      vgInfo.vgId = pVgroup->vgId;
130,665✔
1913
      vgInfo.hashBegin = pVgroup->hashBegin;
130,665✔
1914
      vgInfo.hashEnd = pVgroup->hashEnd;
130,665✔
1915
      vgInfo.numOfTable = pVgroup->numOfTables / TSDB_TABLE_NUM_UNIT;
130,665✔
1916
      vgInfo.epSet.numOfEps = pVgroup->replica;
130,665✔
1917
      for (int32_t gid = 0; gid < pVgroup->replica; ++gid) {
274,263✔
1918
        SVnodeGid *pVgid = &pVgroup->vnodeGid[gid];
143,592✔
1919
        SEp       *pEp = &vgInfo.epSet.eps[gid];
143,592✔
1920
        SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
143,592✔
1921
        if (pDnode != NULL) {
143,594✔
1922
          (void)memcpy(pEp->fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
143,535✔
1923
          pEp->port = pDnode->port;
143,535✔
1924
        }
1925
        mndReleaseDnode(pMnode, pDnode);
143,594✔
1926
        if (pVgid->syncState == TAOS_SYNC_STATE_LEADER || pVgid->syncState == TAOS_SYNC_STATE_ASSIGNED_LEADER) {
143,598!
1927
          vgInfo.epSet.inUse = gid;
129,631✔
1928
        }
1929
      }
1930
      vindex++;
130,671✔
1931
      if (taosArrayPush(pVgList, &vgInfo) == NULL) {
130,662!
1932
        mError("db:%s, failed to push vgInfo to array, vgId:%d, but continue next", pDb->name, vgInfo.vgId);
×
1933
      }
1934
    }
1935

1936
    sdbRelease(pSdb, pVgroup);
159,855✔
1937

1938
    if (pDb && (vindex >= pDb->cfg.numOfVgroups)) {
159,859✔
1939
      sdbCancelFetch(pSdb, pIter);
46,048✔
1940
      break;
46,048✔
1941
    }
1942
  }
1943
}
59,377✔
1944

1945
int32_t mndExtractDbInfo(SMnode *pMnode, SDbObj *pDb, SUseDbRsp *pRsp, const SUseDbReq *pReq) {
48,051✔
1946
  int32_t code = 0;
48,051✔
1947
  pRsp->pVgroupInfos = taosArrayInit(pDb->cfg.numOfVgroups, sizeof(SVgroupInfo));
48,051✔
1948
  if (pRsp->pVgroupInfos == NULL) {
48,051!
1949
    code = terrno;
×
1950
    TAOS_RETURN(code);
×
1951
  }
1952

1953
  int32_t numOfTable = mndGetDBTableNum(pDb, pMnode);
48,051✔
1954

1955
  if (pReq == NULL || pReq->vgVersion < pDb->vgVersion || pReq->dbId != pDb->uid || numOfTable != pReq->numOfTable ||
48,051!
1956
      pReq->stateTs < pDb->stateTs) {
4,051✔
1957
    mndBuildDBVgroupInfo(pDb, pMnode, pRsp->pVgroupInfos);
44,285✔
1958
  }
1959

1960
  (void)memcpy(pRsp->db, pDb->name, TSDB_DB_FNAME_LEN);
48,051✔
1961
  pRsp->uid = pDb->uid;
48,051✔
1962
  pRsp->vgVersion = pDb->vgVersion;
48,051✔
1963
  pRsp->stateTs = pDb->stateTs;
48,051✔
1964
  pRsp->vgNum = taosArrayGetSize(pRsp->pVgroupInfos);
48,051✔
1965
  pRsp->hashMethod = pDb->cfg.hashMethod;
48,051✔
1966
  pRsp->hashPrefix = pDb->cfg.hashPrefix;
48,051✔
1967
  pRsp->hashSuffix = pDb->cfg.hashSuffix;
48,051✔
1968
  pRsp->flags = pDb->cfg.flags;
48,051✔
1969
  TAOS_RETURN(code);
48,051✔
1970
}
1971

1972
static int32_t mndProcessUseDbReq(SRpcMsg *pReq) {
61,296✔
1973
  SMnode   *pMnode = pReq->info.node;
61,296✔
1974
  int32_t   code = -1;
61,296✔
1975
  SDbObj   *pDb = NULL;
61,296✔
1976
  SUseDbReq usedbReq = {0};
61,296✔
1977
  SUseDbRsp usedbRsp = {0};
61,296✔
1978

1979
  TAOS_CHECK_GOTO(tDeserializeSUseDbReq(pReq->pCont, pReq->contLen, &usedbReq), NULL, _OVER);
61,296!
1980

1981
  char *p = strchr(usedbReq.db, '.');
61,295✔
1982
  if (p && ((0 == strcmp(p + 1, TSDB_INFORMATION_SCHEMA_DB) || (0 == strcmp(p + 1, TSDB_PERFORMANCE_SCHEMA_DB))))) {
61,295!
1983
    (void)memcpy(usedbRsp.db, usedbReq.db, TSDB_DB_FNAME_LEN);
12,911✔
1984
    int32_t vgVersion = mndGetGlobalVgroupVersion(pMnode);
12,911✔
1985
    if (usedbReq.vgVersion < vgVersion) {
12,911✔
1986
      usedbRsp.pVgroupInfos = taosArrayInit(10, sizeof(SVgroupInfo));
12,879✔
1987
      if (usedbRsp.pVgroupInfos == NULL) goto _OVER;
12,879!
1988

1989
      mndBuildDBVgroupInfo(NULL, pMnode, usedbRsp.pVgroupInfos);
12,879✔
1990
      usedbRsp.vgVersion = vgVersion++;
12,879✔
1991
    } else {
1992
      usedbRsp.vgVersion = usedbReq.vgVersion;
32✔
1993
    }
1994
    usedbRsp.vgNum = taosArrayGetSize(usedbRsp.pVgroupInfos);
12,911✔
1995
    code = 0;
12,911✔
1996
  } else {
1997
    pDb = mndAcquireDb(pMnode, usedbReq.db);
48,384✔
1998
    if (pDb == NULL) {
48,385✔
1999
      (void)memcpy(usedbRsp.db, usedbReq.db, TSDB_DB_FNAME_LEN);
275✔
2000
      usedbRsp.uid = usedbReq.dbId;
275✔
2001
      usedbRsp.vgVersion = usedbReq.vgVersion;
275✔
2002
      usedbRsp.errCode = terrno;
275✔
2003

2004
      code = TSDB_CODE_MND_RETURN_VALUE_NULL;
275✔
2005
      if (terrno != 0) code = terrno;
275!
2006
      goto _OVER;
275✔
2007
    } else {
2008
      TAOS_CHECK_GOTO(mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_USE_DB, pDb), NULL, _OVER);
48,110✔
2009

2010
      TAOS_CHECK_GOTO(mndExtractDbInfo(pMnode, pDb, &usedbRsp, &usedbReq), NULL, _OVER);
48,051!
2011

2012
      mDebug("db:%s, process usedb req vgVersion:%d stateTs:%" PRId64 ", rsp vgVersion:%d stateTs:%" PRId64,
48,051✔
2013
             usedbReq.db, usedbReq.vgVersion, usedbReq.stateTs, usedbRsp.vgVersion, usedbRsp.stateTs);
2014
      code = 0;
48,051✔
2015
    }
2016
  }
2017

2018
  int32_t contLen = tSerializeSUseDbRsp(NULL, 0, &usedbRsp);
60,962✔
2019
  void   *pRsp = rpcMallocCont(contLen);
60,962✔
2020
  if (pRsp == NULL) {
60,962!
2021
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
2022
    code = -1;
×
2023
    goto _OVER;
×
2024
  }
2025

2026
  int32_t ret = 0;
60,962✔
2027
  if ((ret = tSerializeSUseDbRsp(pRsp, contLen, &usedbRsp)) < 0) {
60,962!
2028
    code = ret;
×
2029
    goto _OVER;
×
2030
  }
2031

2032
  pReq->info.rsp = pRsp;
60,962✔
2033
  pReq->info.rspLen = contLen;
60,962✔
2034

2035
_OVER:
61,296✔
2036
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
61,296!
2037
    mError("db:%s, failed to process use db req since %s", usedbReq.db, tstrerror(code));
334!
2038
  }
2039

2040
  mndReleaseDb(pMnode, pDb);
61,296✔
2041
  tFreeSUsedbRsp(&usedbRsp);
61,296✔
2042

2043
  TAOS_RETURN(code);
61,296✔
2044
}
2045

2046
int32_t mndValidateDbInfo(SMnode *pMnode, SDbCacheInfo *pDbs, int32_t numOfDbs, void **ppRsp, int32_t *pRspLen) {
7,782✔
2047
  int32_t       code = 0;
7,782✔
2048
  SDbHbBatchRsp batchRsp = {0};
7,782✔
2049
  batchRsp.pArray = taosArrayInit(numOfDbs, sizeof(SDbHbRsp));
7,782✔
2050
  if (batchRsp.pArray == NULL) {
7,782!
2051
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
2052
    TAOS_RETURN(code);
×
2053
  }
2054

2055
  for (int32_t i = 0; i < numOfDbs; ++i) {
17,216✔
2056
    SDbCacheInfo *pDbCacheInfo = &pDbs[i];
9,434✔
2057
    pDbCacheInfo->dbId = be64toh(pDbCacheInfo->dbId);
9,434✔
2058
    pDbCacheInfo->vgVersion = htonl(pDbCacheInfo->vgVersion);
9,434✔
2059
    pDbCacheInfo->cfgVersion = htonl(pDbCacheInfo->cfgVersion);
9,434✔
2060
    pDbCacheInfo->numOfTable = htonl(pDbCacheInfo->numOfTable);
9,434✔
2061
    pDbCacheInfo->stateTs = be64toh(pDbCacheInfo->stateTs);
9,434✔
2062
    pDbCacheInfo->tsmaVersion = htonl(pDbCacheInfo->tsmaVersion);
9,434✔
2063

2064
    SDbHbRsp rsp = {0};
9,434✔
2065
    (void)memcpy(rsp.db, pDbCacheInfo->dbFName, TSDB_DB_FNAME_LEN);
9,434✔
2066
    rsp.dbId = pDbCacheInfo->dbId;
9,434✔
2067

2068
    if ((0 == strcasecmp(pDbCacheInfo->dbFName, TSDB_INFORMATION_SCHEMA_DB) ||
9,434✔
2069
         (0 == strcasecmp(pDbCacheInfo->dbFName, TSDB_PERFORMANCE_SCHEMA_DB)))) {
8,979✔
2070
      int32_t vgVersion = mndGetGlobalVgroupVersion(pMnode);
3,114✔
2071
      if (pDbCacheInfo->vgVersion >= vgVersion) {
3,114✔
2072
        continue;
7,154✔
2073
      }
2074

2075
      rsp.useDbRsp = taosMemoryCalloc(1, sizeof(SUseDbRsp));
450!
2076
      (void)memcpy(rsp.useDbRsp->db, pDbCacheInfo->dbFName, TSDB_DB_FNAME_LEN);
450✔
2077
      rsp.useDbRsp->pVgroupInfos = taosArrayInit(10, sizeof(SVgroupInfo));
450✔
2078

2079
      mndBuildDBVgroupInfo(NULL, pMnode, rsp.useDbRsp->pVgroupInfos);
450✔
2080
      rsp.useDbRsp->vgVersion = vgVersion++;
450✔
2081

2082
      rsp.useDbRsp->vgNum = taosArrayGetSize(rsp.useDbRsp->pVgroupInfos);
450✔
2083

2084
      if (taosArrayPush(batchRsp.pArray, &rsp) == NULL) {
900!
2085
        if (terrno != 0) code = terrno;
×
2086
        return code;
×
2087
      }
2088

2089
      continue;
450✔
2090
    }
2091

2092
    SDbObj *pDb = mndAcquireDb(pMnode, pDbCacheInfo->dbFName);
6,320✔
2093
    if (pDb == NULL) {
6,320✔
2094
      mTrace("db:%s, no exist", pDbCacheInfo->dbFName);
41!
2095
      rsp.useDbRsp = taosMemoryCalloc(1, sizeof(SUseDbRsp));
41!
2096
      (void)memcpy(rsp.useDbRsp->db, pDbCacheInfo->dbFName, TSDB_DB_FNAME_LEN);
41✔
2097
      rsp.useDbRsp->uid = pDbCacheInfo->dbId;
41✔
2098
      rsp.useDbRsp->vgVersion = -1;
41✔
2099
      if (taosArrayPush(batchRsp.pArray, &rsp) == NULL) {
82!
2100
        if (terrno != 0) code = terrno;
×
2101
        return code;
×
2102
      }
2103
      continue;
41✔
2104
    }
2105

2106
    int32_t numOfTable = mndGetDBTableNum(pDb, pMnode);
6,279✔
2107

2108
    if (pDbCacheInfo->vgVersion >= pDb->vgVersion && pDbCacheInfo->cfgVersion >= pDb->cfgVersion &&
6,279✔
2109
        numOfTable == pDbCacheInfo->numOfTable && pDbCacheInfo->stateTs == pDb->stateTs &&
5,818!
2110
        pDbCacheInfo->tsmaVersion >= pDb->tsmaVersion) {
4,267✔
2111
      mTrace("db:%s, valid dbinfo, vgVersion:%d cfgVersion:%d stateTs:%" PRId64
3,999✔
2112
             " numOfTables:%d, not changed vgVersion:%d cfgVersion:%d stateTs:%" PRId64 " numOfTables:%d",
2113
             pDbCacheInfo->dbFName, pDbCacheInfo->vgVersion, pDbCacheInfo->cfgVersion, pDbCacheInfo->stateTs,
2114
             pDbCacheInfo->numOfTable, pDb->vgVersion, pDb->cfgVersion, pDb->stateTs, numOfTable);
2115
      mndReleaseDb(pMnode, pDb);
3,999✔
2116
      continue;
3,999✔
2117
    } else {
2118
      mTrace("db:%s, valid dbinfo, vgVersion:%d cfgVersion:%d stateTs:%" PRId64
2,280✔
2119
             " numOfTables:%d, changed to vgVersion:%d cfgVersion:%d stateTs:%" PRId64 " numOfTables:%d",
2120
             pDbCacheInfo->dbFName, pDbCacheInfo->vgVersion, pDbCacheInfo->cfgVersion, pDbCacheInfo->stateTs,
2121
             pDbCacheInfo->numOfTable, pDb->vgVersion, pDb->cfgVersion, pDb->stateTs, numOfTable);
2122
    }
2123

2124
    if (pDbCacheInfo->cfgVersion < pDb->cfgVersion) {
2,280✔
2125
      rsp.cfgRsp = taosMemoryCalloc(1, sizeof(SDbCfgRsp));
398!
2126
      mndDumpDbCfgInfo(rsp.cfgRsp, pDb);
398✔
2127
    }
2128

2129
    if (pDbCacheInfo->tsmaVersion != pDb->tsmaVersion) {
2,280✔
2130
      rsp.pTsmaRsp = taosMemoryCalloc(1, sizeof(STableTSMAInfoRsp));
1,356!
2131
      if (rsp.pTsmaRsp) rsp.pTsmaRsp->pTsmas = taosArrayInit(4, POINTER_BYTES);
1,356!
2132
      if (rsp.pTsmaRsp && rsp.pTsmaRsp->pTsmas) {
1,356!
2133
        bool    exist = false;
1,356✔
2134
        int32_t code = mndGetDbTsmas(pMnode, 0, pDb->uid, rsp.pTsmaRsp, &exist);
1,356✔
2135
        if (TSDB_CODE_SUCCESS != code) {
1,356!
2136
          mndReleaseDb(pMnode, pDb);
×
2137
          if (code != TSDB_CODE_NEED_RETRY) {
×
2138
            mError("db:%s, failed to get db tsmas", pDb->name);
×
2139
          } else {
2140
            mWarn("db:%s, need retry to get db tsmas", pDb->name);
×
2141
          }
2142
          taosArrayDestroyP(rsp.pTsmaRsp->pTsmas, tFreeAndClearTableTSMAInfo);
×
2143
          taosMemoryFreeClear(rsp.pTsmaRsp);
×
2144
          continue;
×
2145
        }
2146
        rsp.dbTsmaVersion = pDb->tsmaVersion;
1,356✔
2147
        mDebug("update tsma version to %d, got tsma num: %ld", pDb->tsmaVersion, rsp.pTsmaRsp->pTsmas->size);
1,356✔
2148
      }
2149
    }
2150

2151
    if (pDbCacheInfo->vgVersion < pDb->vgVersion || numOfTable != pDbCacheInfo->numOfTable ||
2,280!
2152
        pDbCacheInfo->stateTs != pDb->stateTs) {
2,199✔
2153
      rsp.useDbRsp = taosMemoryCalloc(1, sizeof(SUseDbRsp));
1,763!
2154
      rsp.useDbRsp->pVgroupInfos = taosArrayInit(pDb->cfg.numOfVgroups, sizeof(SVgroupInfo));
1,763✔
2155
      if (rsp.useDbRsp->pVgroupInfos == NULL) {
1,763!
2156
        mndReleaseDb(pMnode, pDb);
×
2157
        mError("db:%s, failed to malloc usedb response", pDb->name);
×
2158
        taosArrayDestroyP(rsp.pTsmaRsp->pTsmas, tFreeAndClearTableTSMAInfo);
×
2159
        taosMemoryFreeClear(rsp.pTsmaRsp);
×
2160
        continue;
×
2161
      }
2162

2163
      mndBuildDBVgroupInfo(pDb, pMnode, rsp.useDbRsp->pVgroupInfos);
1,763✔
2164
      (void)memcpy(rsp.useDbRsp->db, pDb->name, TSDB_DB_FNAME_LEN);
1,763✔
2165
      rsp.useDbRsp->uid = pDb->uid;
1,763✔
2166
      rsp.useDbRsp->vgVersion = pDb->vgVersion;
1,763✔
2167
      rsp.useDbRsp->stateTs = pDb->stateTs;
1,763✔
2168
      rsp.useDbRsp->vgNum = (int32_t)taosArrayGetSize(rsp.useDbRsp->pVgroupInfos);
1,763✔
2169
      rsp.useDbRsp->hashMethod = pDb->cfg.hashMethod;
1,763✔
2170
      rsp.useDbRsp->hashPrefix = pDb->cfg.hashPrefix;
1,763✔
2171
      rsp.useDbRsp->hashSuffix = pDb->cfg.hashSuffix;
1,763✔
2172
      rsp.useDbRsp->flags = pDb->cfg.flags;
1,763✔
2173
    }
2174

2175
    if (taosArrayPush(batchRsp.pArray, &rsp) == NULL) {
4,560!
2176
      mndReleaseDb(pMnode, pDb);
×
2177
      if (terrno != 0) code = terrno;
×
2178
      return code;
×
2179
    }
2180
    mndReleaseDb(pMnode, pDb);
2,280✔
2181
  }
2182

2183
  int32_t rspLen = tSerializeSDbHbBatchRsp(NULL, 0, &batchRsp);
7,782✔
2184
  void   *pRsp = taosMemoryMalloc(rspLen);
7,782!
2185
  if (pRsp == NULL) {
7,782!
2186
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
2187
    tFreeSDbHbBatchRsp(&batchRsp);
×
2188
    return -1;
×
2189
  }
2190
  int32_t ret = 0;
7,782✔
2191
  if ((ret = tSerializeSDbHbBatchRsp(pRsp, rspLen, &batchRsp)) < 0) return ret;
7,782!
2192

2193
  *ppRsp = pRsp;
7,782✔
2194
  *pRspLen = rspLen;
7,782✔
2195

2196
  tFreeSDbHbBatchRsp(&batchRsp);
7,782✔
2197
  TAOS_RETURN(code);
7,782✔
2198
}
2199

2200
static int32_t mndSetTrimDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, int64_t startTs, STimeWindow tw,
27✔
2201
                                       SArray *vgroupIds, ETsdbOpType type, ETriggerType triggerType,
2202
                                       STrimDbRsp *pRsp) {
2203
  int32_t code = 0, lino = 0;
27✔
2204
  SSdb   *pSdb = pMnode->pSdb;
27✔
2205
  void   *pIter = NULL;
27✔
2206

2207
  SRetentionObj obj = {.optrType = type, .triggerType = triggerType};  // reuse SCompactObj struct
27✔
2208
  TAOS_CHECK_EXIT(mndAddRetentionToTrans(pMnode, pTrans, &obj, pDb, pRsp));
27!
2209

2210
  int32_t j = 0;
27✔
2211
  int32_t numOfVgroups = taosArrayGetSize(vgroupIds);
27✔
2212
  if (numOfVgroups > 0) {
27✔
2213
    for (int32_t i = 0; i < numOfVgroups; i++) {
12✔
2214
      int64_t vgId = *(int64_t *)taosArrayGet(vgroupIds, i);
9✔
2215
      SVgObj *pVgroup = mndAcquireVgroup(pMnode, vgId);
9✔
2216

2217
      if (pVgroup == NULL) {
9✔
2218
        mError("db:%s, vgroup:%" PRId64 " not exist", pDb->name, vgId);
3!
2219
        TAOS_CHECK_EXIT(TSDB_CODE_MND_VGROUP_NOT_EXIST);
3!
2220
      } else if (pVgroup->dbUid != pDb->uid) {
6!
2221
        mError("db:%s, vgroup:%" PRId64 " not belong to db:%s", pDb->name, vgId, pDb->name);
×
2222
        sdbRelease(pSdb, pVgroup);
×
2223
        TAOS_CHECK_EXIT(TSDB_CODE_MND_VGROUP_NOT_EXIST);
×
2224
      }
2225
      sdbRelease(pSdb, pVgroup);
6✔
2226
    }
2227

2228
    for (int32_t i = 0; i < numOfVgroups; i++) {
9✔
2229
      int64_t vgId = *(int64_t *)taosArrayGet(vgroupIds, i);
6✔
2230
      SVgObj *pVgroup = mndAcquireVgroup(pMnode, vgId);
6✔
2231

2232
      if ((code = mndBuildTrimVgroupAction(pMnode, pTrans, pDb, pVgroup, startTs, tw, type, triggerType)) != 0) {
6!
2233
        sdbRelease(pSdb, pVgroup);
×
2234
        TAOS_RETURN(code);
×
2235
      }
2236

2237
      for (int32_t i = 0; i < pVgroup->replica; i++) {
12✔
2238
        SVnodeGid *gid = &pVgroup->vnodeGid[i];
6✔
2239
        if ((code = mndAddRetentionDetailToTrans(pMnode, pTrans, &obj, pVgroup, gid, j)) != 0) {
6!
2240
          sdbRelease(pSdb, pVgroup);
×
2241
          TAOS_RETURN(code);
×
2242
        }
2243
        j++;
6✔
2244
      }
2245
      sdbRelease(pSdb, pVgroup);
6✔
2246
    }
2247
  } else {
2248
    while (1) {
83✔
2249
      SVgObj *pVgroup = NULL;
104✔
2250
      pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
104✔
2251
      if (pIter == NULL) break;
104✔
2252

2253
      if (pVgroup->dbUid == pDb->uid) {
83✔
2254
        if ((code = mndBuildTrimVgroupAction(pMnode, pTrans, pDb, pVgroup, startTs, tw, type, triggerType)) != 0) {
57!
2255
          sdbCancelFetch(pSdb, pIter);
×
2256
          sdbRelease(pSdb, pVgroup);
×
2257
          TAOS_RETURN(code);
×
2258
        }
2259

2260
        for (int32_t i = 0; i < pVgroup->replica; i++) {
124✔
2261
          SVnodeGid *gid = &pVgroup->vnodeGid[i];
67✔
2262
          if ((code = mndAddRetentionDetailToTrans(pMnode, pTrans, &obj, pVgroup, gid, j)) != 0) {
67!
2263
            sdbCancelFetch(pSdb, pIter);
×
2264
            sdbRelease(pSdb, pVgroup);
×
2265
            TAOS_RETURN(code);
×
2266
          }
2267
          j++;
67✔
2268
        }
2269
      }
2270

2271
      sdbRelease(pSdb, pVgroup);
83✔
2272
    }
2273
  }
2274
_exit:
27✔
2275
  TAOS_RETURN(code);
27✔
2276
}
2277

2278
static int32_t mndBuildTrimDbRsp(STrimDbRsp *rsp, int32_t *pRspLen, void **ppRsp, bool useRpcMalloc) {
24✔
2279
  int32_t code = 0;
24✔
2280
  int32_t rspLen = tSerializeSCompactDbRsp(NULL, 0, (SCompactDbRsp *)rsp);
24✔
2281
  void   *pRsp = NULL;
24✔
2282
  if (useRpcMalloc) {
24!
2283
    pRsp = rpcMallocCont(rspLen);
×
2284
  } else {
2285
    pRsp = taosMemoryMalloc(rspLen);
24!
2286
  }
2287

2288
  if (pRsp == NULL) {
24!
2289
    code = TSDB_CODE_OUT_OF_MEMORY;
×
2290
    TAOS_RETURN(code);
×
2291
  }
2292

2293
  (void)tSerializeSCompactDbRsp(pRsp, rspLen, (SCompactDbRsp *)rsp);
24✔
2294
  *pRspLen = rspLen;
24✔
2295
  *ppRsp = pRsp;
24✔
2296
  TAOS_RETURN(code);
24✔
2297
}
2298

2299
int32_t mndTrimDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, STimeWindow tw, SArray *vgroupIds,
33✔
2300
                         ETsdbOpType type, ETriggerType triggerType) {
2301
  SSdb      *pSdb = pMnode->pSdb;
33✔
2302
  SVgObj    *pVgroup = NULL;
33✔
2303
  void      *pIter = NULL;
33✔
2304
  int32_t    code = 0, lino = 0;
33✔
2305
  STrimDbRsp rsp = {0};
33✔
2306
  bool       isExist = false;
33✔
2307

2308
  while (1) {
7✔
2309
    SRetentionObj *pObj = NULL;
40✔
2310
    pIter = sdbFetch(pMnode->pSdb, SDB_RETENTION, pIter, (void **)&pObj);
40✔
2311
    if (pIter == NULL) break;
40✔
2312

2313
    if (strcmp(pObj->dbname, pDb->name) == 0) {
7✔
2314
      isExist = true;
6✔
2315
    }
2316
    sdbRelease(pMnode->pSdb, pObj);
7✔
2317
  }
2318
  if (isExist) {
33✔
2319
    mInfo("trim db:%s already exist", pDb->name);
6!
2320
    TAOS_RETURN(TSDB_CODE_MND_TRIM_ALREADY_EXIST);
6✔
2321
  }
2322

2323
  int64_t startTs = taosGetTimestampMs();
27✔
2324
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq, "trim-db");
27✔
2325
  if (pTrans == NULL) goto _exit;
27!
2326
  mInfo("trans:%d, used to trim db:%s", pTrans->id, pDb->name);
27!
2327
  mndTransSetDbName(pTrans, pDb->name, NULL);
27✔
2328
  TAOS_CHECK_EXIT(mndTrancCheckConflict(pMnode, pTrans));
27!
2329
  TAOS_CHECK_EXIT(mndSetTrimDbRedoActions(pMnode, pTrans, pDb, startTs, tw, vgroupIds, type, triggerType, &rsp));
27✔
2330
  if (pReq) {
24!
2331
    int32_t rspLen = 0;
24✔
2332
    void   *pRsp = NULL;
24✔
2333
    rsp.bAccepted = true;
24✔
2334
    TAOS_CHECK_EXIT(mndBuildTrimDbRsp(&rsp, &rspLen, &pRsp, false));
24!
2335
    mndTransSetRpcRsp(pTrans, pRsp, rspLen);
24✔
2336
  }
2337
  TAOS_CHECK_EXIT(mndTransPrepare(pMnode, pTrans));
24!
2338
_exit:
24✔
2339
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
27!
2340
    mError("db:%s, failed at line %d to trim db since %s", pDb->name, lino, tstrerror(code));
3!
2341
  }
2342
  mndTransDrop(pTrans);
27✔
2343
  TAOS_RETURN(code);
27✔
2344
}
2345

2346
#ifdef TD_ENTERPRISE
2347
static int32_t mndCheckRsmaInDb(SMnode *pMnode, SDbObj *pDb) {
18✔
2348
  int32_t   code = 0;
18✔
2349
  void     *pIter = NULL;
18✔
2350
  SRsmaObj *pRsma = NULL;
18✔
2351
  while ((pIter = sdbFetch(pMnode->pSdb, SDB_RSMA, pIter, (void **)&pRsma))) {
18!
2352
    if (pRsma->dbUid == pDb->uid) {
18!
2353
      sdbRelease(pMnode->pSdb, pRsma);
18✔
2354
      sdbCancelFetch(pMnode->pSdb, pIter);
18✔
2355
      TAOS_RETURN(code);
18✔
2356
    }
2357
    sdbRelease(pMnode->pSdb, pRsma);
×
2358
  }
2359
  TAOS_RETURN(TSDB_CODE_RSMA_NOT_EXIST);
×
2360
}
2361
#endif
2362

2363
static int32_t mndProcessTrimDbReq(SRpcMsg *pReq) {
33✔
2364
  SMnode    *pMnode = pReq->info.node;
33✔
2365
  int32_t    code = 0, lino = 0;
33✔
2366
  SDbObj    *pDb = NULL;
33✔
2367
  STrimDbReq trimReq = {0};
33✔
2368

2369
  TAOS_CHECK_EXIT(tDeserializeSTrimDbReq(pReq->pCont, pReq->contLen, &trimReq));
33!
2370

2371
  mInfo("db:%s, start to trim, optr:%u, tw:%" PRId64 ",%" PRId64, trimReq.db, trimReq.optrType, trimReq.tw.skey,
33!
2372
        trimReq.tw.ekey);
2373

2374
  pDb = mndAcquireDb(pMnode, trimReq.db);
33✔
2375
  if (pDb == NULL) {
33!
2376
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2377
    if (terrno != 0) code = terrno;
×
2378
    TAOS_CHECK_EXIT(code);
×
2379
  }
2380

2381
  TAOS_CHECK_EXIT(mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_TRIM_DB, pDb));
33!
2382

2383
  if (pDb->cfg.isMount) {
33!
2384
    TAOS_CHECK_EXIT(TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT);
×
2385
  }
2386

2387
#ifdef TD_ENTERPRISE
2388
  if (trimReq.optrType == TSDB_OPTR_ROLLUP) {
33✔
2389
    TAOS_CHECK_EXIT(mndCheckRsmaInDb(pMnode, pDb));
18!
2390
  }
2391
#endif
2392

2393
  TAOS_CHECK_EXIT(mndTrimDb(pMnode, pReq, pDb, trimReq.tw, trimReq.vgroupIds, trimReq.optrType, trimReq.triggerType));
33✔
2394
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
24!
2395

2396
  SName name = {0};
24✔
2397
  if (tNameFromString(&name, trimReq.db, T_NAME_ACCT | T_NAME_DB) < 0) {
24!
2398
    mWarn("db:%s, failed at line %d to parse db name", trimReq.db, __LINE__);
×
2399
  }
2400

2401
  char optrType[16] = {0};
24✔
2402
  (void)snprintf(optrType, sizeof(optrType), "%u", trimReq.optrType);
24✔
2403

2404
  auditRecord(pReq, pMnode->clusterId, "trimDB", name.dbname, optrType, trimReq.sql, trimReq.sqlLen);
24✔
2405

2406
_exit:
33✔
2407
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
33!
2408
    mError("db:%s, failed at line %d to process trim db req since %s, optr:%u", trimReq.db, lino, tstrerror(code),
9!
2409
           trimReq.optrType);
2410
  }
2411

2412
  mndReleaseDb(pMnode, pDb);
33✔
2413
  tFreeSTrimDbReq(&trimReq);
33✔
2414
  TAOS_RETURN(code);
33✔
2415
}
2416

2417
static int32_t mndBuildSsMigrateDbRsp(SSsMigrateDbRsp *pSsMigrateRsp, int32_t *pRspLen, void **ppRsp, bool useRpcMalloc) {
×
2418
  int32_t code = 0;
×
2419
  int32_t rspLen = tSerializeSSsMigrateDbRsp(NULL, 0, pSsMigrateRsp);
×
2420
  void   *pRsp = NULL;
×
2421
  if (useRpcMalloc) {
×
2422
    pRsp = rpcMallocCont(rspLen);
×
2423
  } else {
2424
    pRsp = taosMemoryMalloc(rspLen);
×
2425
  }
2426

2427
  if (pRsp == NULL) {
×
2428
    code = TSDB_CODE_OUT_OF_MEMORY;
×
2429
    TAOS_RETURN(code);
×
2430
  }
2431

2432
  (void)tSerializeSSsMigrateDbRsp(pRsp, rspLen, pSsMigrateRsp);
×
2433
  *pRspLen = rspLen;
×
2434
  *ppRsp = pRsp;
×
2435
  TAOS_RETURN(code);
×
2436
}
2437

2438
int32_t mndSsMigrateDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb) {
×
2439
  int32_t       code = 0;
×
2440
  SSsMigrateDbRsp ssMigrateRsp = {0};
×
2441

2442
  bool  isExist = false;
×
2443
  void *pIter = NULL;
×
2444
  while (1) {
×
2445
    SSsMigrateObj *pSsMigrate = NULL;
×
2446
    pIter = sdbFetch(pMnode->pSdb, SDB_SSMIGRATE, pIter, (void **)&pSsMigrate);
×
2447
    if (pIter == NULL) break;
×
2448

2449
    if (strcmp(pSsMigrate->dbname, pDb->name) == 0) {
×
2450
      isExist = true;
×
2451
    }
2452
    sdbRelease(pMnode->pSdb, pSsMigrate);
×
2453
  }
2454
  if (isExist) {
×
2455
    mInfo("ssmigrate db:%s already exist", pDb->name);
×
2456

2457
    if (pReq) {
×
2458
      int32_t rspLen = 0;
×
2459
      void   *pRsp = NULL;
×
2460
      ssMigrateRsp.ssMigrateId = 0;
×
2461
      ssMigrateRsp.bAccepted = false;
×
2462
      TAOS_CHECK_RETURN(mndBuildSsMigrateDbRsp(&ssMigrateRsp, &rspLen, &pRsp, true));
×
2463

2464
      pReq->info.rsp = pRsp;
×
2465
      pReq->info.rspLen = rspLen;
×
2466
    }
2467

2468
    return TSDB_CODE_MND_SSMIGRATE_ALREADY_EXIST;
×
2469
  }
2470

2471
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq, "ssmigrate-db");
×
2472
  if (pTrans == NULL) {
×
2473
    mError("failed to create ssmigrate-db trans since %s", terrstr());
×
2474
    goto _OVER;
×
2475
  }
2476

2477
  mInfo("trans:%d, used to ssmigrate db:%s", pTrans->id, pDb->name);
×
2478
  mndTransSetDbName(pTrans, pDb->name, NULL);
×
2479
  TAOS_CHECK_GOTO(mndTrancCheckConflict(pMnode, pTrans), NULL, _OVER);
×
2480

2481
  SSsMigrateObj ssMigrate = { .startTime = taosGetTimestampMs() };
×
2482
  TAOS_CHECK_GOTO(mndAddSsMigrateToTran(pMnode, pTrans, &ssMigrate, pDb), NULL, _OVER);
×
2483

2484
  if (pReq) {
×
2485
    int32_t rspLen = 0;
×
2486
    void   *pRsp = NULL;
×
2487
    ssMigrateRsp.ssMigrateId = ssMigrate.id;
×
2488
    ssMigrateRsp.bAccepted = true;
×
2489
    TAOS_CHECK_GOTO(mndBuildSsMigrateDbRsp(&ssMigrateRsp, &rspLen, &pRsp, false), NULL, _OVER);
×
2490
    mndTransSetRpcRsp(pTrans, pRsp, rspLen);
×
2491
  }
2492

2493
  if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
×
2494
  code = 0;
×
2495

2496
_OVER:
×
2497
  mndTransDrop(pTrans);
×
2498
  TAOS_RETURN(code);
×
2499
}
2500

2501

2502
static int32_t mndProcessSsMigrateDbReq(SRpcMsg *pReq) {
×
2503
  SMnode         *pMnode = pReq->info.node;
×
2504
  int32_t         code = -1;
×
2505
  SDbObj         *pDb = NULL;
×
2506
  SSsMigrateDbReq ssMigrateReq = {0};
×
2507

2508
  if (!tsSsEnabled) {
×
2509
    code = TSDB_CODE_OPS_NOT_SUPPORT;
×
2510
    goto _OVER;
×
2511
  }
2512

2513
  TAOS_CHECK_GOTO(grantCheck(TSDB_GRANT_SHARED_STORAGE), NULL, _OVER);
×
2514
  TAOS_CHECK_GOTO(tDeserializeSSsMigrateDbReq(pReq->pCont, pReq->contLen, &ssMigrateReq), NULL, _OVER);
×
2515

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

2518
  pDb = mndAcquireDb(pMnode, ssMigrateReq.db);
×
2519
  if (pDb == NULL) {
×
2520
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
2521
    if (terrno != 0) code = terrno;
×
2522
    goto _OVER;
×
2523
  }
2524

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

2527
  if(pDb->cfg.isMount) {
×
2528
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
×
2529
    goto _OVER;
×
2530
  }
2531

2532
  code = mndSsMigrateDb(pMnode, pReq, pDb);
×
2533

2534
_OVER:
×
2535
  if (code != 0) {
×
2536
    mError("db:%s, failed to process ssmigrate db req since %s", ssMigrateReq.db, tstrerror(code));
×
2537
  }
2538

2539
  mndReleaseDb(pMnode, pDb);
×
2540
  TAOS_RETURN(code);
×
2541
}
2542

2543
const char *mndGetDbStr(const char *src) {
40,528✔
2544
  char *pos = strstr(src, TS_PATH_DELIMITER);
40,528✔
2545
  if (pos != NULL) ++pos;
40,528✔
2546
  if (pos == NULL) return src;
40,528✔
2547
  return pos;
37,190✔
2548
}
2549

2550
const char *mndGetStableStr(const char *src) {
32,794✔
2551
  char *pos = strstr(src, TS_PATH_DELIMITER);
32,794✔
2552
  if (pos != NULL) ++pos;
32,794!
2553
  if (pos == NULL) return src;
32,794!
2554
  return mndGetDbStr(pos);
32,794✔
2555
}
2556

2557
static int64_t getValOfDiffPrecision(int8_t unit, int64_t val) {
×
2558
  int64_t v = 0;
×
2559
  switch (unit) {
×
2560
    case 's':
×
2561
      v = val / 1000;
×
2562
      break;
×
2563
    case 'm':
×
2564
      v = val / tsTickPerMin[TSDB_TIME_PRECISION_MILLI];
×
2565
      break;
×
2566
    case 'h':
×
2567
      v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 60);
×
2568
      break;
×
2569
    case 'd':
×
2570
      v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 24 * 60);
×
2571
      break;
×
2572
    case 'w':
×
2573
      v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 24 * 60 * 7);
×
2574
      break;
×
2575
    default:
×
2576
      break;
×
2577
  }
2578

2579
  return v;
×
2580
}
2581

2582
static char *buildRetension(SArray *pRetension) {
1,234✔
2583
  size_t size = taosArrayGetSize(pRetension);
1,234✔
2584
  if (size == 0) {
1,234!
2585
    return NULL;
1,234✔
2586
  }
2587

2588
  char       *p1 = taosMemoryCalloc(1, 100);
×
2589
  SRetention *p = taosArrayGet(pRetension, 0);
×
2590

2591
  int32_t len = 2;
×
2592

2593
  int64_t v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
×
2594
  int64_t v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
×
2595
  len += tsnprintf(p1 + len, 100 - len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
×
2596

2597
  if (size > 1) {
×
2598
    len += tsnprintf(p1 + len, 100 - len, ",");
×
2599
    p = taosArrayGet(pRetension, 1);
×
2600

2601
    v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
×
2602
    v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
×
2603
    len += tsnprintf(p1 + len, 100 - len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
×
2604
  }
2605

2606
  if (size > 2) {
×
2607
    len += tsnprintf(p1 + len, 100 - len, ",");
×
2608
    p = taosArrayGet(pRetension, 2);
×
2609

2610
    v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
×
2611
    v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
×
2612
    len += tsnprintf(p1 + len, 100 - len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
×
2613
  }
2614

2615
  varDataSetLen(p1, len);
×
2616
  return p1;
×
2617
}
2618

2619
static const char *getCacheModelStr(int8_t cacheModel) {
1,234✔
2620
  switch (cacheModel) {
1,234!
2621
    case TSDB_CACHE_MODEL_NONE:
1,194✔
2622
      return TSDB_CACHE_MODEL_NONE_STR;
1,194✔
2623
    case TSDB_CACHE_MODEL_LAST_ROW:
7✔
2624
      return TSDB_CACHE_MODEL_LAST_ROW_STR;
7✔
2625
    case TSDB_CACHE_MODEL_LAST_VALUE:
12✔
2626
      return TSDB_CACHE_MODEL_LAST_VALUE_STR;
12✔
2627
    case TSDB_CACHE_MODEL_BOTH:
21✔
2628
      return TSDB_CACHE_MODEL_BOTH_STR;
21✔
2629
    default:
×
2630
      break;
×
2631
  }
2632
  return "unknown";
×
2633
}
2634

2635
static const char *getEncryptAlgorithmStr(int8_t encryptAlgorithm) {
1,234✔
2636
  switch (encryptAlgorithm) {
1,234!
2637
    case TSDB_ENCRYPT_ALGO_NONE:
1,234✔
2638
      return TSDB_ENCRYPT_ALGO_NONE_STR;
1,234✔
2639
    case TSDB_ENCRYPT_ALGO_SM4:
×
2640
      return TSDB_ENCRYPT_ALGO_SM4_STR;
×
2641
    default:
×
2642
      break;
×
2643
  }
2644
  return "unknown";
×
2645
}
2646

2647
bool mndIsDbReady(SMnode *pMnode, SDbObj *pDb) {
4,819✔
2648
  if (pDb->cfg.replications == 1) return true;
4,819✔
2649

2650
  SSdb *pSdb = pMnode->pSdb;
1,059✔
2651
  void *pIter = NULL;
1,059✔
2652
  bool  isReady = true;
1,059✔
2653
  while (1) {
7,545✔
2654
    SVgObj *pVgroup = NULL;
8,604✔
2655
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
8,604✔
2656
    if (pIter == NULL) break;
8,604✔
2657

2658
    if (pVgroup->dbUid == pDb->uid && pVgroup->replica > 1) {
7,545!
2659
      bool hasLeader = false;
3,451✔
2660
      for (int32_t i = 0; i < pVgroup->replica; ++i) {
13,729✔
2661
        if (pVgroup->vnodeGid[i].syncState == TAOS_SYNC_STATE_LEADER ||
10,278✔
2662
            pVgroup->vnodeGid[i].syncState == TAOS_SYNC_STATE_ASSIGNED_LEADER) {
9,186!
2663
          hasLeader = true;
1,092✔
2664
        }
2665
      }
2666
      if (!hasLeader) isReady = false;
3,451✔
2667
    }
2668
    sdbRelease(pSdb, pVgroup);
7,545✔
2669
  }
2670

2671
  return isReady;
1,059✔
2672
}
2673

2674
static void mndDumpDbInfoData(SMnode *pMnode, SSDataBlock *pBlock, SDbObj *pDb, SShowObj *pShow, int32_t rows,
3,770✔
2675
                              int64_t numOfTables, bool sysDb, ESdbStatus objStatus, bool sysinfo) {
2676
  int32_t cols = 0;
3,770✔
2677
  int32_t bytes = pShow->pMeta->pSchemas[cols].bytes;
3,770✔
2678
  char   *buf = taosMemoryMalloc(bytes);
3,770!
2679
  if (buf == NULL) {
3,770!
2680
    mError("db:%s, failed to malloc buffer", pDb->name);
×
2681
    return;
×
2682
  }
2683
  int32_t code = 0;
3,770✔
2684
  int32_t lino = 0;
3,770✔
2685

2686
  const char *name = mndGetDbStr(pDb->name);
3,770✔
2687
  if (name != NULL) {
3,770!
2688
    STR_WITH_MAXSIZE_TO_VARSTR(buf, name, bytes);
3,770✔
2689
  } else {
2690
    STR_WITH_MAXSIZE_TO_VARSTR(buf, "NULL", bytes);
×
2691
  }
2692

2693
  const char *precStr = NULL;
3,770✔
2694
  switch (pDb->cfg.precision) {
3,770!
2695
    case TSDB_TIME_PRECISION_MILLI:
3,682✔
2696
      precStr = TSDB_TIME_PRECISION_MILLI_STR;
3,682✔
2697
      break;
3,682✔
2698
    case TSDB_TIME_PRECISION_MICRO:
42✔
2699
      precStr = TSDB_TIME_PRECISION_MICRO_STR;
42✔
2700
      break;
42✔
2701
    case TSDB_TIME_PRECISION_NANO:
46✔
2702
      precStr = TSDB_TIME_PRECISION_NANO_STR;
46✔
2703
      break;
46✔
2704
    default:
×
2705
      precStr = "none";
×
2706
      break;
×
2707
  }
2708
  char precVstr[10] = {0};
3,770✔
2709
  STR_WITH_MAXSIZE_TO_VARSTR(precVstr, precStr, 10);
3,770✔
2710

2711
  char *statusStr = "ready";
3,770✔
2712
  if (objStatus == SDB_STATUS_CREATING) {
3,770!
2713
    statusStr = "creating";
×
2714
  } else if (objStatus == SDB_STATUS_DROPPING) {
3,770!
2715
    statusStr = "dropping";
×
2716
  } else {
2717
    if (!sysDb && !mndIsDbReady(pMnode, pDb)) {
3,770✔
2718
      statusStr = "unsynced";
3✔
2719
    }
2720
  }
2721
  char statusVstr[24] = {0};
3,770✔
2722
  STR_WITH_MAXSIZE_TO_VARSTR(statusVstr, statusStr, 24);
3,770✔
2723

2724
  if (sysDb || !sysinfo) {
3,770✔
2725
    for (int32_t i = 0; i < pShow->numOfColumns; ++i) {
96,368✔
2726
      SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, i);
93,832✔
2727
      if (i == 0) {
93,832✔
2728
        TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, buf, false), &lino, _OVER);
2,536!
2729
      } else if (i == 1) {
91,296✔
2730
        TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->createdTime, false), &lino, _OVER);
2,536!
2731
      } else if (i == 3) {
88,760✔
2732
        TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&numOfTables, false), &lino, _OVER);
2,536!
2733
      } else if (i == 14) {
86,224✔
2734
        TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, precVstr, false), &lino, _OVER);
2,536!
2735
      } else if (i == 15) {
83,688✔
2736
        TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, statusVstr, false), &lino, _OVER);
2,536!
2737
      } else {
2738
        colDataSetNULL(pColInfo, rows);
81,152✔
2739
      }
2740
    }
2741
  } else {
2742
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2743
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, buf, false), &lino, _OVER);
1,234!
2744

2745
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2746
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->createdTime, false), &lino, _OVER);
1,234!
2747

2748
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2749
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.numOfVgroups, false), &lino, _OVER);
1,234!
2750

2751
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2752
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&numOfTables, false), &lino, _OVER);
1,234!
2753

2754
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2755
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.replications, false), &lino, _OVER);
1,234!
2756

2757
    const char *strictStr = pDb->cfg.strict ? "on" : "off";
1,234!
2758
    char        strictVstr[24] = {0};
1,234✔
2759
    STR_WITH_MAXSIZE_TO_VARSTR(strictVstr, strictStr, 24);
1,234✔
2760
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2761
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)strictVstr, false), &lino, _OVER);
1,234!
2762

2763
    char    durationStr[128] = {0};
1,234✔
2764
    char    durationVstr[128] = {0};
1,234✔
2765
    int32_t len = formatDurationOrKeep(&durationVstr[VARSTR_HEADER_SIZE], sizeof(durationVstr) - VARSTR_HEADER_SIZE,
1,234✔
2766
                                       pDb->cfg.daysPerFile);
2767

2768
    varDataSetLen(durationVstr, len);
1,234✔
2769
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2770
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)durationVstr, false), &lino, _OVER);
1,234!
2771

2772
    char keepVstr[128] = {0};
1,234✔
2773
    char keep0Str[32] = {0};
1,234✔
2774
    char keep1Str[32] = {0};
1,234✔
2775
    char keep2Str[32] = {0};
1,234✔
2776

2777
    int32_t lenKeep0 = formatDurationOrKeep(keep0Str, sizeof(keep0Str), pDb->cfg.daysToKeep0);
1,234✔
2778
    int32_t lenKeep1 = formatDurationOrKeep(keep1Str, sizeof(keep1Str), pDb->cfg.daysToKeep1);
1,234✔
2779
    int32_t lenKeep2 = formatDurationOrKeep(keep2Str, sizeof(keep2Str), pDb->cfg.daysToKeep2);
1,234✔
2780

2781
    if (pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep1 || pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep2) {
1,234!
2782
      len = tsnprintf(&keepVstr[VARSTR_HEADER_SIZE], sizeof(keepVstr), "%s,%s,%s", keep1Str, keep2Str, keep0Str);
×
2783
    } else {
2784
      len = tsnprintf(&keepVstr[VARSTR_HEADER_SIZE], sizeof(keepVstr), "%s,%s,%s", keep0Str, keep1Str, keep2Str);
1,234✔
2785
    }
2786
    varDataSetLen(keepVstr, len);
1,234✔
2787
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2788
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)keepVstr, false), &lino, _OVER);
1,234!
2789

2790
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2791
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.buffer, false), &lino, _OVER);
1,234!
2792

2793
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2794
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.pageSize, false), &lino, _OVER);
1,234!
2795

2796
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2797
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.pages, false), &lino, _OVER);
1,234!
2798

2799
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2800
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.minRows, false), &lino, _OVER);
1,234!
2801

2802
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2803
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.maxRows, false), &lino, _OVER);
1,234!
2804

2805
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2806
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.compression, false), &lino, _OVER);
1,234!
2807

2808
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2809
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)precVstr, false), &lino, _OVER);
1,234!
2810

2811
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2812
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)statusVstr, false), &lino, _OVER);
1,234!
2813

2814
    char *rentensionVstr = buildRetension(pDb->cfg.pRetensions);
1,234✔
2815
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2816
    if (rentensionVstr == NULL) {
1,234!
2817
      colDataSetNULL(pColInfo, rows);
1,234!
2818
    } else {
2819
      TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)rentensionVstr, false), &lino, _OVER);
×
2820
      taosMemoryFree(rentensionVstr);
×
2821
    }
2822

2823
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2824
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.numOfStables, false), &lino, _OVER);
1,234!
2825

2826
    const char *cacheModelStr = getCacheModelStr(pDb->cfg.cacheLast);
1,234✔
2827
    char        cacheModelVstr[24] = {0};
1,234✔
2828
    STR_WITH_MAXSIZE_TO_VARSTR(cacheModelVstr, cacheModelStr, 24);
1,234✔
2829
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2830
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)cacheModelVstr, false), &lino, _OVER);
1,234!
2831

2832
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2833
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.cacheLastSize, false), &lino, _OVER);
1,234!
2834

2835
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2836
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.walLevel, false), &lino, _OVER);
1,234!
2837

2838
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2839
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.walFsyncPeriod, false), &lino, _OVER);
1,234!
2840

2841
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2842
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.walRetentionPeriod, false), &lino, _OVER);
1,234!
2843

2844
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2845
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.walRetentionSize, false), &lino, _OVER);
1,234!
2846

2847
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2848
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.sstTrigger, false), &lino, _OVER);
1,234!
2849

2850
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2851
    int16_t hashPrefix = pDb->cfg.hashPrefix;
1,234✔
2852
    if (hashPrefix > 0) {
1,234✔
2853
      hashPrefix = pDb->cfg.hashPrefix - strlen(pDb->name) - 1;
5✔
2854
    } else if (hashPrefix < 0) {
1,229✔
2855
      hashPrefix = pDb->cfg.hashPrefix + strlen(pDb->name) + 1;
8✔
2856
    }
2857
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&hashPrefix, false), &lino, _OVER);
1,234!
2858

2859
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2860
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.hashSuffix, false), &lino, _OVER);
1,234!
2861

2862
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2863
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.tsdbPageSize, false), &lino, _OVER);
1,234!
2864

2865
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2866
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.keepTimeOffset, false), &lino, _OVER);
1,234!
2867

2868
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2869
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.ssChunkSize, false), &lino, _OVER);
1,234!
2870

2871
    char keeplocalVstr[128] = {0};
1,234✔
2872
    len = tsnprintf(&keeplocalVstr[VARSTR_HEADER_SIZE], sizeof(keeplocalVstr), "%dm", pDb->cfg.ssKeepLocal);
1,234✔
2873
    varDataSetLen(keeplocalVstr, len);
1,234✔
2874
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2875
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)keeplocalVstr, false), &lino, _OVER);
1,234!
2876

2877
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2878
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.ssCompact, false), &lino, _OVER);
1,234!
2879

2880
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2881
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.withArbitrator, false), &lino, _OVER);
1,234!
2882

2883
    const char *encryptAlgorithmStr = getEncryptAlgorithmStr(pDb->cfg.encryptAlgorithm);
1,234✔
2884
    char        encryptAlgorithmVStr[24] = {0};
1,234✔
2885
    STR_WITH_MAXSIZE_TO_VARSTR(encryptAlgorithmVStr, encryptAlgorithmStr, 24);
1,234✔
2886
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
1,234✔
2887
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)encryptAlgorithmVStr, false), &lino, _OVER);
1,234!
2888

2889
    TAOS_UNUSED(formatDurationOrKeep(durationStr, sizeof(durationStr), pDb->cfg.compactInterval));
1,234✔
2890
    STR_WITH_MAXSIZE_TO_VARSTR(durationVstr, durationStr, sizeof(durationVstr));
1,234✔
2891
    if ((pColInfo = taosArrayGet(pBlock->pDataBlock, cols++))) {
1,234!
2892
      TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)durationVstr, false), &lino, _OVER);
1,234!
2893
    }
2894

2895
    len = formatDurationOrKeep(durationStr, sizeof(durationStr), pDb->cfg.compactStartTime);
1,234✔
2896
    TAOS_UNUSED(formatDurationOrKeep(durationVstr, sizeof(durationVstr), pDb->cfg.compactEndTime));
1,234✔
2897
    TAOS_UNUSED(snprintf(durationStr + len, sizeof(durationStr) - len, ",%s", durationVstr));
1,234✔
2898
    STR_WITH_MAXSIZE_TO_VARSTR(durationVstr, durationStr, sizeof(durationVstr));
1,234✔
2899
    if ((pColInfo = taosArrayGet(pBlock->pDataBlock, cols++))) {
1,234!
2900
      TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)durationVstr, false), &lino, _OVER);
1,234!
2901
    }
2902

2903
    TAOS_UNUSED(snprintf(durationStr, sizeof(durationStr), "%dh", pDb->cfg.compactTimeOffset));
1,234✔
2904
    STR_WITH_MAXSIZE_TO_VARSTR(durationVstr, durationStr, sizeof(durationVstr));
1,234✔
2905
    if ((pColInfo = taosArrayGet(pBlock->pDataBlock, cols++))) {
1,234!
2906
      TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)durationVstr, false), &lino, _OVER);
1,234!
2907
    }
2908
  }
2909
_OVER:
3,770✔
2910
  if (code != 0) mError("failed to retrieve at line:%d, since %s", lino, tstrerror(code));
3,770!
2911
  taosMemoryFree(buf);
3,770!
2912
}
2913

2914
static void setInformationSchemaDbCfg(SMnode *pMnode, SDbObj *pDbObj) {
1,262✔
2915
  tstrncpy(pDbObj->name, TSDB_INFORMATION_SCHEMA_DB, tListLen(pDbObj->name));
1,262✔
2916
  pDbObj->createdTime = mndGetClusterCreateTime(pMnode);
1,262✔
2917
  pDbObj->cfg.numOfVgroups = 0;
1,262✔
2918
  pDbObj->cfg.strict = 1;
1,262✔
2919
  pDbObj->cfg.replications = 1;
1,262✔
2920
  pDbObj->cfg.precision = TSDB_TIME_PRECISION_MILLI;
1,262✔
2921
}
1,262✔
2922

2923
static void setPerfSchemaDbCfg(SMnode *pMnode, SDbObj *pDbObj) {
1,262✔
2924
  tstrncpy(pDbObj->name, TSDB_PERFORMANCE_SCHEMA_DB, tListLen(pDbObj->name));
1,262✔
2925
  pDbObj->createdTime = mndGetClusterCreateTime(pMnode);
1,262✔
2926
  pDbObj->cfg.numOfVgroups = 0;
1,262✔
2927
  pDbObj->cfg.strict = 1;
1,262✔
2928
  pDbObj->cfg.replications = 1;
1,262✔
2929
  pDbObj->cfg.precision = TSDB_TIME_PRECISION_MILLI;
1,262✔
2930
}
1,262✔
2931

2932
static bool mndGetTablesOfDbFp(SMnode *pMnode, void *pObj, void *p1, void *p2, void *p3) {
6,253✔
2933
  SVgObj  *pVgroup = pObj;
6,253✔
2934
  int32_t *numOfTables = p1;
6,253✔
2935
  int64_t  uid = *(int64_t *)p2;
6,253✔
2936
  if (pVgroup->dbUid == uid) {
6,253✔
2937
    *numOfTables += pVgroup->numOfTables;
2,498✔
2938
  }
2939
  return true;
6,253✔
2940
}
2941

2942
static int32_t mndRetrieveDbs(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rowsCapacity) {
1,262✔
2943
  SMnode    *pMnode = pReq->info.node;
1,262✔
2944
  SSdb      *pSdb = pMnode->pSdb;
1,262✔
2945
  int32_t    numOfRows = 0;
1,262✔
2946
  SDbObj    *pDb = NULL;
1,262✔
2947
  SUserObj  *pUser = NULL;
1,262✔
2948
  ESdbStatus objStatus = 0;
1,262✔
2949

2950
  (void)mndAcquireUser(pMnode, pReq->info.conn.user, &pUser);
1,262✔
2951
  if (pUser == NULL) return 0;
1,262!
2952
  bool sysinfo = pUser->sysInfo;
1,262✔
2953

2954
  // Append the information_schema database into the result.
2955
  if (!pShow->sysDbRsp) {
1,262!
2956
    SDbObj infoschemaDb = {0};
1,262✔
2957
    setInformationSchemaDbCfg(pMnode, &infoschemaDb);
1,262✔
2958
    size_t numOfTables = 0;
1,262✔
2959
    getVisibleInfosTablesNum(sysinfo, &numOfTables);
1,262✔
2960
    mndDumpDbInfoData(pMnode, pBlock, &infoschemaDb, pShow, numOfRows, numOfTables, true, 0, 1);
1,262✔
2961

2962
    numOfRows += 1;
1,262✔
2963

2964
    SDbObj perfschemaDb = {0};
1,262✔
2965
    setPerfSchemaDbCfg(pMnode, &perfschemaDb);
1,262✔
2966
    numOfTables = 0;
1,262✔
2967
    getPerfDbMeta(NULL, &numOfTables);
1,262✔
2968
    mndDumpDbInfoData(pMnode, pBlock, &perfschemaDb, pShow, numOfRows, numOfTables, true, 0, 1);
1,262✔
2969

2970
    numOfRows += 1;
1,262✔
2971
    pShow->sysDbRsp = true;
1,262✔
2972
  }
2973

2974
  while (numOfRows < rowsCapacity) {
2,540!
2975
    pShow->pIter = sdbFetchAll(pSdb, SDB_DB, pShow->pIter, (void **)&pDb, &objStatus, true);
2,540✔
2976
    if (pShow->pIter == NULL) break;
2,540✔
2977

2978
    if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_READ_OR_WRITE_DB, pDb) == 0) {
1,278✔
2979
      int32_t numOfTables = 0;
1,246✔
2980
      sdbTraverse(pSdb, SDB_VGROUP, mndGetTablesOfDbFp, &numOfTables, &pDb->uid, NULL);
1,246✔
2981
      mndDumpDbInfoData(pMnode, pBlock, pDb, pShow, numOfRows, numOfTables, false, objStatus, sysinfo);
1,246✔
2982
      numOfRows++;
1,246✔
2983
    }
2984

2985
    sdbRelease(pSdb, pDb);
1,278✔
2986
  }
2987

2988
  pShow->numOfRows += numOfRows;
1,262✔
2989
  mndReleaseUser(pMnode, pUser);
1,262✔
2990
  return numOfRows;
1,262✔
2991
}
2992

2993
static void mndCancelGetNextDb(SMnode *pMnode, void *pIter) {
×
2994
  SSdb *pSdb = pMnode->pSdb;
×
2995
  sdbCancelFetchByType(pSdb, pIter, SDB_DB);
×
2996
}
×
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