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

taosdata / TDengine / #4829

30 Oct 2025 09:25AM UTC coverage: 49.734% (-11.3%) from 61.071%
#4829

push

travis-ci

web-flow
Merge pull request #33435 from taosdata/3.0

merge 3.0

123072 of 323930 branches covered (37.99%)

Branch coverage included in aggregate %.

7 of 25 new or added lines in 3 files covered. (28.0%)

35232 existing lines in 327 files now uncovered.

172062 of 269495 relevant lines covered (63.85%)

70709785.06 hits per line

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

60.99
/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) {
122,207✔
71
  SSdbTable table = {
122,207✔
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);
122,207✔
83
  mndSetMsgHandle(pMnode, TDMT_MND_ALTER_DB, mndProcessAlterDbReq);
122,207✔
84
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_DB, mndProcessDropDbReq);
122,207✔
85
  mndSetMsgHandle(pMnode, TDMT_MND_USE_DB, mndProcessUseDbReq);
122,207✔
86
  mndSetMsgHandle(pMnode, TDMT_MND_COMPACT_DB, mndProcessCompactDbReq);
122,207✔
87
  mndSetMsgHandle(pMnode, TDMT_MND_SCAN_DB, mndProcessScanDbReq);
122,207✔
88
  mndSetMsgHandle(pMnode, TDMT_MND_TRIM_DB, mndProcessTrimDbReq);
122,207✔
89
  mndSetMsgHandle(pMnode, TDMT_MND_GET_DB_CFG, mndProcessGetDbCfgReq);
122,207✔
90
  mndSetMsgHandle(pMnode, TDMT_MND_SSMIGRATE_DB, mndProcessSsMigrateDbReq);
122,207✔
91
  mndSetMsgHandle(pMnode, TDMT_MND_GET_DB_INFO, mndProcessUseDbReq);
122,207✔
92

93
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_DB, mndRetrieveDbs);
122,207✔
94
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_DB, mndCancelGetNextDb);
122,207✔
95

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

99
void mndCleanupDb(SMnode *pMnode) {}
122,136✔
100

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

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

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

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

173
  terrno = 0;
1,051,037✔
174

175
_OVER:
1,051,037✔
176
  if (terrno != 0) {
1,051,037!
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);
1,051,037!
183
  return pRaw;
1,051,037✔
184
}
185

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

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

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

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

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

207
  int32_t dataPos = 0;
964,197✔
208
  SDB_GET_BINARY(pRaw, dataPos, pDb->name, TSDB_DB_FNAME_LEN, _OVER)
964,197!
209
  SDB_GET_BINARY(pRaw, dataPos, pDb->acct, TSDB_USER_LEN, _OVER)
964,197!
210
  SDB_GET_BINARY(pRaw, dataPos, pDb->createUser, TSDB_USER_LEN, _OVER)
964,197!
211
  SDB_GET_INT64(pRaw, dataPos, &pDb->createdTime, _OVER)
964,197!
212
  SDB_GET_INT64(pRaw, dataPos, &pDb->updateTime, _OVER)
964,197!
213
  SDB_GET_INT64(pRaw, dataPos, &pDb->uid, _OVER)
964,197!
214
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfgVersion, _OVER)
964,197!
215
  SDB_GET_INT32(pRaw, dataPos, &pDb->vgVersion, _OVER)
964,197!
216
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.numOfVgroups, _OVER)
964,197!
217
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.numOfStables, _OVER)
964,197!
218
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.buffer, _OVER)
964,197!
219
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.pageSize, _OVER)
964,197!
220
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.pages, _OVER)
964,197!
221
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.cacheLastSize, _OVER)
964,197!
222
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysPerFile, _OVER)
964,197!
223
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysToKeep0, _OVER)
964,197!
224
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysToKeep1, _OVER)
964,197!
225
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.daysToKeep2, _OVER)
964,197!
226
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.minRows, _OVER)
964,197!
227
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.maxRows, _OVER)
964,197!
228
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.walFsyncPeriod, _OVER)
964,197!
229
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.walLevel, _OVER)
964,197!
230
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.precision, _OVER)
964,197!
231
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.compression, _OVER)
964,197!
232
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.replications, _OVER)
964,197!
233
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.strict, _OVER)
964,197!
234
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.cacheLast, _OVER)
964,197!
235
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.hashMethod, _OVER)
964,197!
236
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.numOfRetensions, _OVER)
964,197!
237
  if (pDb->cfg.numOfRetensions > 0) {
964,197!
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)
964,197!
252
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.walRetentionPeriod, _OVER)
964,197!
253
  SDB_GET_INT64(pRaw, dataPos, &pDb->cfg.walRetentionSize, _OVER)
964,197!
254
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.walRollPeriod, _OVER)
964,197!
255
  SDB_GET_INT64(pRaw, dataPos, &pDb->cfg.walSegmentSize, _OVER)
964,197!
256
  SDB_GET_INT16(pRaw, dataPos, &pDb->cfg.sstTrigger, _OVER)
964,197!
257
  SDB_GET_INT16(pRaw, dataPos, &pDb->cfg.hashPrefix, _OVER)
964,197!
258
  SDB_GET_INT16(pRaw, dataPos, &pDb->cfg.hashSuffix, _OVER)
964,197!
259
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.tsdbPageSize, _OVER)
964,197!
260
  SDB_GET_INT64(pRaw, dataPos, &pDb->compactStartTime, _OVER)
964,197!
261
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.keepTimeOffset, _OVER)
964,197!
262
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.ssChunkSize, _OVER)
964,197!
263
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.ssKeepLocal, _OVER)
964,197!
264
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.ssCompact, _OVER)
964,197!
265
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.withArbitrator, _OVER)
964,197!
266
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.encryptAlgorithm, _OVER)
964,197!
267
  SDB_GET_INT32(pRaw, dataPos, &pDb->tsmaVersion, _OVER);
964,197!
268
  SDB_GET_INT8(pRaw, dataPos, &pDb->cfg.compactTimeOffset, _OVER)
964,197!
269
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.compactStartTime, _OVER)
964,197!
270
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.compactEndTime, _OVER)
964,197!
271
  SDB_GET_INT32(pRaw, dataPos, &pDb->cfg.compactInterval, _OVER)
964,197!
272
  SDB_GET_RESERVE(pRaw, dataPos, DB_RESERVE_SIZE, _OVER)
964,197!
273
  if (dataPos + sizeof(uint8_t) <= pRaw->dataLen) {
964,197!
274
    SDB_GET_UINT8(pRaw, dataPos, &pDb->cfg.flags, _OVER)
964,197!
275
  }
276

277
  taosInitRWLatch(&pDb->lock);
964,197✔
278

279
  if (pDb->cfg.ssChunkSize == 0) {
964,197!
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) {
964,197!
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) {
964,197!
292
    mInfo("db:%s, tsdbPageSize set from %d to default %d", pDb->name, pDb->cfg.tsdbPageSize,
964,197!
293
          TSDB_DEFAULT_TSDB_PAGESIZE);
294
  }
295

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

300
  terrno = 0;
964,197✔
301

302
_OVER:
964,197✔
303
  if (terrno != 0) {
964,197!
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);
964,197!
310
  return pRow;
964,197✔
311
}
312

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

319
  pRow = mndDbActionDecode(pRaw);
235,254✔
320
  if (pRow == NULL) {
235,254!
321
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
×
322
    if (terrno != 0) code = terrno;
×
323
    goto _OVER;
×
324
  }
325
  pNewDb = sdbGetRowObj(pRow);
235,254✔
326
  if (pNewDb == NULL) {
235,254!
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);
235,254✔
333
  if (pOldDb != NULL) {
235,254!
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;
235,254✔
342
_OVER:
235,254✔
343
  if (pNewDb) mndDbActionDelete(pSdb, pNewDb);
235,254!
344
  taosMemoryFreeClear(pRow);
235,254!
345
  return code;
235,254✔
346
}
347

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

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

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

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

405
SDbObj *mndAcquireDb(SMnode *pMnode, const char *db) {
15,232,404✔
406
  SSdb   *pSdb = pMnode->pSdb;
15,232,404✔
407
  SDbObj *pDb = sdbAcquire(pSdb, SDB_DB, db);
15,232,404✔
408
  if (pDb == NULL) {
15,232,597✔
409
    if (terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
361,406✔
410
      terrno = TSDB_CODE_MND_DB_NOT_EXIST;
331,127✔
411
    } else if (terrno == TSDB_CODE_SDB_OBJ_CREATING) {
30,279✔
412
      terrno = TSDB_CODE_MND_DB_IN_CREATING;
7,900✔
413
    } else if (terrno == TSDB_CODE_SDB_OBJ_DROPPING) {
22,379!
414
      terrno = TSDB_CODE_MND_DB_IN_DROPPING;
22,379✔
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;
15,232,597✔
421
}
422

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

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

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

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

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

456
  return 0;
215,339✔
457
}
458

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

462
  if (pCfg->numOfVgroups < TSDB_MIN_VNODES_PER_DB || pCfg->numOfVgroups > TSDB_MAX_VNODES_PER_DB) return code;
215,339!
463
  if (pCfg->numOfStables < TSDB_DB_STREAM_MODE_OFF || pCfg->numOfStables > TSDB_DB_STREAM_MODE_ON) return code;
215,339!
464
  if (pCfg->buffer < TSDB_MIN_BUFFER_PER_VNODE || pCfg->buffer > TSDB_MAX_BUFFER_PER_VNODE) return code;
215,339!
465
  if (pCfg->pageSize < TSDB_MIN_PAGESIZE_PER_VNODE || pCfg->pageSize > TSDB_MAX_PAGESIZE_PER_VNODE) return code;
215,339!
466
  if (pCfg->pages < TSDB_MIN_PAGES_PER_VNODE || pCfg->pages > TSDB_MAX_PAGES_PER_VNODE) return code;
215,339!
467
  if (pCfg->cacheLastSize < TSDB_MIN_DB_CACHE_SIZE || pCfg->cacheLastSize > TSDB_MAX_DB_CACHE_SIZE) return code;
215,339!
468
  if (pCfg->daysPerFile < TSDB_MIN_DAYS_PER_FILE || pCfg->daysPerFile > TSDB_MAX_DAYS_PER_FILE) return code;
215,339!
469
  if (pCfg->daysToKeep0 < TSDB_MIN_KEEP || pCfg->daysToKeep0 > TSDB_MAX_KEEP) return code;
215,339!
470
  if (pCfg->daysToKeep1 < TSDB_MIN_KEEP || pCfg->daysToKeep1 > TSDB_MAX_KEEP) return code;
215,339!
471
  if (pCfg->daysToKeep2 < TSDB_MIN_KEEP || pCfg->daysToKeep2 > TSDB_MAX_KEEP) return code;
215,339!
472
  if (pCfg->daysToKeep0 < pCfg->daysPerFile) return code;
215,339!
473
  if (pCfg->daysToKeep0 > pCfg->daysToKeep1) return code;
215,339!
474
  if (pCfg->daysToKeep1 > pCfg->daysToKeep2) return code;
215,339!
475
  if (pCfg->keepTimeOffset < TSDB_MIN_KEEP_TIME_OFFSET || pCfg->keepTimeOffset > TSDB_MAX_KEEP_TIME_OFFSET) return code;
215,339!
476
  if (pCfg->minRows < TSDB_MIN_MINROWS_FBLOCK || pCfg->minRows > TSDB_MAX_MINROWS_FBLOCK) return code;
215,339!
477
  if (pCfg->maxRows < TSDB_MIN_MAXROWS_FBLOCK || pCfg->maxRows > TSDB_MAX_MAXROWS_FBLOCK) return code;
215,339!
478
  if (pCfg->minRows > pCfg->maxRows) return code;
215,339✔
479
  if (pCfg->walFsyncPeriod < TSDB_MIN_FSYNC_PERIOD || pCfg->walFsyncPeriod > TSDB_MAX_FSYNC_PERIOD) return code;
214,939!
480
  if (pCfg->walLevel < TSDB_MIN_WAL_LEVEL || pCfg->walLevel > TSDB_MAX_WAL_LEVEL) return code;
214,939!
481
  if (pCfg->precision < TSDB_MIN_PRECISION && pCfg->precision > TSDB_MAX_PRECISION) return code;
214,939!
482
  if (pCfg->compression < TSDB_MIN_COMP_LEVEL || pCfg->compression > TSDB_MAX_COMP_LEVEL) return code;
214,939!
483
  if (pCfg->replications < TSDB_MIN_DB_REPLICA || pCfg->replications > TSDB_MAX_DB_REPLICA) return code;
214,939!
484
#ifdef TD_ENTERPRISE
485
  if ((pCfg->replications == 2) ^ (pCfg->withArbitrator == TSDB_MAX_DB_WITH_ARBITRATOR)) return code;
214,939!
486
  if (pCfg->encryptAlgorithm < TSDB_MIN_ENCRYPT_ALGO || pCfg->encryptAlgorithm > TSDB_MAX_ENCRYPT_ALGO) return code;
214,939!
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;
214,939!
493
  if (pCfg->schemaless < TSDB_DB_SCHEMALESS_OFF || pCfg->schemaless > TSDB_DB_SCHEMALESS_ON) return code;
214,939!
494
  if (pCfg->cacheLast < TSDB_CACHE_MODEL_NONE || pCfg->cacheLast > TSDB_CACHE_MODEL_BOTH) return code;
214,939!
495
  if (pCfg->hashMethod != 1) return code;
214,939!
496
  if (pCfg->replications > mndGetDnodeSize(pMnode)) {
214,939!
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;
214,939!
501
  if (pCfg->walRetentionSize < TSDB_DB_MIN_WAL_RETENTION_SIZE) return code;
214,939!
502
  if (pCfg->walRollPeriod < TSDB_DB_MIN_WAL_ROLL_PERIOD) return code;
214,939!
503
  if (pCfg->walSegmentSize < TSDB_DB_MIN_WAL_SEGMENT_SIZE) return code;
214,939!
504
  if (pCfg->sstTrigger < TSDB_MIN_STT_TRIGGER || pCfg->sstTrigger > TSDB_MAX_STT_TRIGGER) return code;
214,939!
505
  if (pCfg->hashPrefix < TSDB_MIN_HASH_PREFIX || pCfg->hashPrefix > TSDB_MAX_HASH_PREFIX) return code;
214,939!
506
  if (pCfg->hashSuffix < TSDB_MIN_HASH_SUFFIX || pCfg->hashSuffix > TSDB_MAX_HASH_SUFFIX) return code;
214,939!
507
  if ((pCfg->hashSuffix * pCfg->hashPrefix) < 0) return code;
214,939!
508
  if ((pCfg->hashPrefix + pCfg->hashSuffix) >= (TSDB_TABLE_NAME_LEN - 1)) return code;
214,939!
509
  if (pCfg->tsdbPageSize < TSDB_MIN_TSDB_PAGESIZE || pCfg->tsdbPageSize > TSDB_MAX_TSDB_PAGESIZE) return code;
214,939!
510
  if (taosArrayGetSize(pCfg->pRetensions) != pCfg->numOfRetensions) return code;
214,939!
511

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

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

530
  code = 0;
214,939✔
531
  TAOS_RETURN(code);
214,939✔
532
}
533

534
static int32_t mndCheckInChangeDbCfg(SMnode *pMnode, SDbCfg *pOldCfg, SDbCfg *pNewCfg) {
8,555✔
535
  int32_t code = TSDB_CODE_MND_INVALID_DB_OPTION;
8,555✔
536
  if (pNewCfg->buffer < TSDB_MIN_BUFFER_PER_VNODE || pNewCfg->buffer > TSDB_MAX_BUFFER_PER_VNODE) return code;
8,555!
537
  if (pNewCfg->pages < TSDB_MIN_PAGES_PER_VNODE || pNewCfg->pages > TSDB_MAX_PAGES_PER_VNODE) return code;
8,555!
538
  if (pNewCfg->pageSize < TSDB_MIN_PAGESIZE_PER_VNODE || pNewCfg->pageSize > TSDB_MAX_PAGESIZE_PER_VNODE) return code;
8,555!
539
  if (pNewCfg->daysPerFile < TSDB_MIN_DAYS_PER_FILE || pNewCfg->daysPerFile > TSDB_MAX_DAYS_PER_FILE) return code;
8,555!
540
  if (pNewCfg->daysToKeep0 < TSDB_MIN_KEEP || pNewCfg->daysToKeep0 > TSDB_MAX_KEEP) return code;
8,555!
541
  if (pNewCfg->daysToKeep1 < TSDB_MIN_KEEP || pNewCfg->daysToKeep1 > TSDB_MAX_KEEP) return code;
8,555!
542
  if (pNewCfg->daysToKeep2 < TSDB_MIN_KEEP || pNewCfg->daysToKeep2 > TSDB_MAX_KEEP) return code;
8,555!
543
  if (pNewCfg->daysToKeep0 < pNewCfg->daysPerFile) return code;
8,555!
544
  if (pNewCfg->daysToKeep0 > pNewCfg->daysToKeep1) return code;
8,555!
545
  if (pNewCfg->daysToKeep1 > pNewCfg->daysToKeep2) return code;
8,555!
546
  if (pNewCfg->keepTimeOffset < TSDB_MIN_KEEP_TIME_OFFSET || pNewCfg->keepTimeOffset > TSDB_MAX_KEEP_TIME_OFFSET)
8,555!
547
    return code;
×
548
  if (pNewCfg->walFsyncPeriod < TSDB_MIN_FSYNC_PERIOD || pNewCfg->walFsyncPeriod > TSDB_MAX_FSYNC_PERIOD) return code;
8,555!
549
  if (pNewCfg->walLevel < TSDB_MIN_WAL_LEVEL || pNewCfg->walLevel > TSDB_MAX_WAL_LEVEL) return code;
8,555!
550
  if (pNewCfg->cacheLast < TSDB_CACHE_MODEL_NONE || pNewCfg->cacheLast > TSDB_CACHE_MODEL_BOTH) return code;
8,555!
551
  if (pNewCfg->cacheLastSize < TSDB_MIN_DB_CACHE_SIZE || pNewCfg->cacheLastSize > TSDB_MAX_DB_CACHE_SIZE) return code;
8,555!
552
  if (pNewCfg->replications < TSDB_MIN_DB_REPLICA || pNewCfg->replications > TSDB_MAX_DB_REPLICA) return code;
8,555!
553
#ifdef TD_ENTERPRISE
554
  if ((pNewCfg->replications == 2) ^ (pNewCfg->withArbitrator == TSDB_MAX_DB_WITH_ARBITRATOR)) return code;
8,555!
555
  if (pNewCfg->replications == 2 && pNewCfg->withArbitrator == TSDB_MAX_DB_WITH_ARBITRATOR) {
8,555!
UNCOV
556
    if (pOldCfg->replications != 1 && pOldCfg->replications != 2) {
×
UNCOV
557
      terrno = TSDB_CODE_OPS_NOT_SUPPORT;
×
UNCOV
558
      return code;
×
559
    }
560
  }
561
  if (pNewCfg->replications != 2 && pOldCfg->replications == 2) {
8,555!
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) {
8,555!
570
    terrno = TSDB_CODE_MND_INVALID_WAL_LEVEL;
×
571
    return code;
×
572
  }
573
  if (pNewCfg->replications > 1 && pOldCfg->walLevel == 0) {
8,555!
574
    terrno = TSDB_CODE_MND_INVALID_WAL_LEVEL;
×
575
    return code;
×
576
  }
577

578
  if (pNewCfg->sstTrigger != pOldCfg->sstTrigger &&
8,555!
UNCOV
579
      (pNewCfg->sstTrigger < TSDB_MIN_STT_TRIGGER || pNewCfg->sstTrigger > TSDB_MAX_STT_TRIGGER))
×
580
    return code;
×
581
  if (pNewCfg->minRows < TSDB_MIN_MINROWS_FBLOCK || pNewCfg->minRows > TSDB_MAX_MINROWS_FBLOCK) return code;
8,555!
582
  if (pNewCfg->maxRows < TSDB_MIN_MAXROWS_FBLOCK || pNewCfg->maxRows > TSDB_MAX_MAXROWS_FBLOCK) return code;
8,555!
583
  if (pNewCfg->minRows > pNewCfg->maxRows) return code;
8,555!
584
  if (pNewCfg->walRetentionPeriod < TSDB_DB_MIN_WAL_RETENTION_PERIOD) return code;
8,555!
585
  if (pNewCfg->walRetentionSize < TSDB_DB_MIN_WAL_RETENTION_SIZE) return code;
8,555!
586
  if (pNewCfg->strict < TSDB_DB_STRICT_OFF || pNewCfg->strict > TSDB_DB_STRICT_ON) return code;
8,555!
587
  if (pNewCfg->replications > mndGetDnodeSize(pMnode)) {
8,555!
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;
8,555!
592
  if (pNewCfg->ssKeepLocal < TSDB_MIN_SS_KEEP_LOCAL || pNewCfg->ssKeepLocal > TSDB_MAX_SS_KEEP_LOCAL) return code;
8,555!
593
  if (pNewCfg->ssCompact < TSDB_MIN_SS_COMPACT || pNewCfg->ssCompact > TSDB_MAX_SS_COMPACT) return code;
8,555!
594

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

611
  code = 0;
8,555✔
612
  TAOS_RETURN(code);
8,555✔
613
}
614

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

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

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

662
static int32_t mndSetNewVgPrepareActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
213,160✔
663
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
691,704✔
664
    if (mndAddNewVgPrepareAction(pMnode, pTrans, (pVgroups + v)) != 0) return -1;
478,544!
665
  }
666
  return 0;
213,160✔
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) {
213,160✔
704
  int32_t  code = 0;
213,160✔
705
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
213,160✔
706
  if (pDbRaw == NULL) {
213,160!
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));
213,160!
712
  TAOS_CHECK_RETURN(sdbSetRawStatus(pDbRaw, SDB_STATUS_DROPPED));
213,160!
713

714
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
691,704✔
715
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
478,544✔
716
    if (pVgRaw == NULL) {
478,544!
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));
478,544!
722
    TAOS_CHECK_RETURN(sdbSetRawStatus(pVgRaw, SDB_STATUS_DROPPED));
478,544!
723
  }
724

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

734
  TAOS_RETURN(code);
213,160✔
735
}
736

737
static int32_t mndSetCreateDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups,
213,160✔
738
                                        SUserObj *pUserDuped) {
739
  int32_t  code = 0;
213,160✔
740
  SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
213,160✔
741
  if (pDbRaw == NULL) {
213,160!
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));
213,160!
747
  TAOS_CHECK_RETURN(sdbSetRawStatus(pDbRaw, SDB_STATUS_READY));
213,160!
748

749
  for (int32_t v = 0; v < pDb->cfg.numOfVgroups; ++v) {
691,704✔
750
    SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroups + v);
478,544✔
751
    if (pVgRaw == NULL) {
478,544!
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));
478,544!
757
    TAOS_CHECK_RETURN(sdbSetRawStatus(pVgRaw, SDB_STATUS_READY));
478,544!
758
  }
759

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

769
  if (pUserDuped) {
213,160✔
770
    SSdbRaw *pUserRaw = mndUserActionEncode(pUserDuped);
582✔
771
    if (pUserRaw == NULL) {
582!
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));
582!
777
    TAOS_CHECK_RETURN(sdbSetRawStatus(pUserRaw, SDB_STATUS_READY));
582!
778
  }
779

780
  TAOS_RETURN(code);
213,160✔
781
}
782

783
static int32_t mndSetCreateDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
213,160✔
784
  int32_t code = 0;
213,160✔
785
  for (int32_t vg = 0; vg < pDb->cfg.numOfVgroups; ++vg) {
691,704✔
786
    SVgObj *pVgroup = pVgroups + vg;
478,544✔
787

788
    for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
1,037,202✔
789
      SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
558,658✔
790
      TAOS_CHECK_RETURN(mndAddCreateVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid));
558,658!
791
    }
792
  }
793

794
  TAOS_RETURN(code);
213,160✔
795
}
796

797
static int32_t mndSetCreateDbUndoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
213,160✔
798
  int32_t code = 0;
213,160✔
799
  for (int32_t vg = 0; vg < pDb->cfg.numOfVgroups; ++vg) {
691,704✔
800
    SVgObj *pVgroup = pVgroups + vg;
478,544✔
801

802
    for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
1,037,202✔
803
      SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
558,658✔
804
      TAOS_CHECK_RETURN(mndAddDropVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid, false));
558,658!
805
    }
806
  }
807

808
  TAOS_RETURN(code);
213,160✔
809
}
810

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

866
  dbObj.cfg.numOfRetensions = pCreate->numOfRetensions;
215,339✔
867
  dbObj.cfg.pRetensions = pCreate->pRetensions;
215,339✔
868

869
  mndSetDefaultDbCfg(&dbObj.cfg);
215,339✔
870

871
  if ((code = mndCheckDbName(dbObj.name, pUser)) != 0) {
215,339!
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) {
215,339✔
877
    mError("db:%s, failed to create, check db cfg failed, since %s", pCreate->db, terrstr());
400!
878
    TAOS_RETURN(code);
400✔
879
  }
880

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

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

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

908
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq, "create-db");
213,160✔
909
  if (pTrans == NULL) {
213,160!
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);
213,160!
916

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

920
  void   *pIter = NULL;
213,160✔
921
  STrans *exitTrans = NULL;
213,160✔
922

923
  if (!pUser->superUser) {
213,160✔
924
    while (1) {
925
      pIter = sdbFetch(pMnode->pSdb, SDB_TRANS, pIter, (void **)&exitTrans);
582✔
926
      if (pIter == NULL) break;
582!
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);
213,160✔
941
  TAOS_CHECK_GOTO(mndSetCreateDbPrepareAction(pMnode, pTrans, &dbObj), NULL, _OVER);
213,160!
942
  TAOS_CHECK_GOTO(mndSetCreateDbRedoActions(pMnode, pTrans, &dbObj, pVgroups), NULL, _OVER);
213,160!
943
  TAOS_CHECK_GOTO(mndSetNewVgPrepareActions(pMnode, pTrans, &dbObj, pVgroups), NULL, _OVER);
213,160!
944
  TAOS_CHECK_GOTO(mndSetCreateDbUndoLogs(pMnode, pTrans, &dbObj, pVgroups), NULL, _OVER);
213,160!
945
  TAOS_CHECK_GOTO(mndSetCreateDbCommitLogs(pMnode, pTrans, &dbObj, pVgroups, pNewUserDuped), NULL, _OVER);
213,160!
946
  TAOS_CHECK_GOTO(mndSetCreateDbUndoActions(pMnode, pTrans, &dbObj, pVgroups), NULL, _OVER);
213,160!
947
  TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
213,160!
948

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

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

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

972
  int64_t curMs = taosGetTimestampMs();
400✔
973
  while ((pIter = sdbFetch(pSdb, SDB_DNODE, pIter, (void **)&pDnode))) {
1,600✔
974
    bool online = false;
1,200✔
975
    if ((pDnode->encryptionKeyStat != tsEncryptionKeyStat || pDnode->encryptionKeyChksum != tsEncryptionKeyChksum) &&
1,200!
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);
1,200✔
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:
221,968✔
995
  TAOS_RETURN(code);
221,995✔
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) {
250,079✔
1010
  SMnode      *pMnode = pReq->info.node;
250,079✔
1011
  int32_t      code = -1;
250,079✔
1012
  int32_t      lino = 0;
250,079✔
1013
  SDbObj      *pDb = NULL;
250,079✔
1014
  SUserObj    *pUser = NULL;
250,079✔
1015
  SCreateDbReq createReq = {0};
250,079✔
1016
  SArray      *dnodeList = NULL;
250,079✔
1017

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

1021
  TAOS_CHECK_GOTO(tDeserializeSCreateDbReq(pReq->pCont, pReq->contLen, &createReq), NULL, _OVER);
250,079!
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);
250,079!
1029

1030
  pDb = mndAcquireDb(pMnode, createReq.db);
250,079✔
1031
  if (pDb != NULL) {
250,079✔
1032
    if (createReq.ignoreExist) {
19,872✔
1033
      mInfo("db:%s, already exist, ignore exist is set", createReq.db);
18,486!
1034
      code = 0;
18,486✔
1035
      goto _OVER;
18,486✔
1036
    } else {
1037
      code = TSDB_CODE_MND_DB_ALREADY_EXIST;
1,386✔
1038
      goto _OVER;
1,386✔
1039
    }
1040
  } else {
1041
    if (terrno == TSDB_CODE_MND_DB_IN_CREATING) {
230,207✔
1042
      code = terrno;
7,630✔
1043
      goto _OVER;
7,630✔
1044
    } else if (terrno == TSDB_CODE_MND_DB_IN_DROPPING) {
222,577!
1045
      goto _OVER;
×
1046
    } else if (terrno == TSDB_CODE_MND_DB_NOT_EXIST) {
222,577!
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);
222,577✔
1054

1055
  TAOS_CHECK_GOTO(grantCheck(TSDB_GRANT_DB), &lino, _OVER);
221,995!
1056

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

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

1064
  TAOS_CHECK_GOTO(mndCheckDbEncryptKey(pMnode, &createReq), &lino, _OVER);
221,995✔
1065

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

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

1070
  if (sdbGetSize(pMnode->pSdb, SDB_MOUNT) > 0) {
215,339!
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);
215,339✔
1075
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
213,160!
1076

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

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

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

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

1093
  TAOS_RETURN(code);
250,079✔
1094
}
1095

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

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

1104
  if (pAlter->pages > 0 && pAlter->pages != pDb->cfg.pages) {
8,825!
UNCOV
1105
    pDb->cfg.pages = pAlter->pages;
×
UNCOV
1106
    code = 0;
×
1107
  }
1108

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

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

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

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

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

1134
  if (pAlter->keepTimeOffset >= 0 && pAlter->keepTimeOffset != pDb->cfg.keepTimeOffset) {
8,825!
UNCOV
1135
    pDb->cfg.keepTimeOffset = pAlter->keepTimeOffset;
×
UNCOV
1136
    code = 0;
×
1137
  }
1138

1139
  if (pAlter->walFsyncPeriod >= 0 && pAlter->walFsyncPeriod != pDb->cfg.walFsyncPeriod) {
8,825!
UNCOV
1140
    pDb->cfg.walFsyncPeriod = pAlter->walFsyncPeriod;
×
UNCOV
1141
    code = 0;
×
1142
  }
1143

1144
  if (pAlter->walLevel >= 0 && pAlter->walLevel != pDb->cfg.walLevel) {
8,825!
UNCOV
1145
    pDb->cfg.walLevel = pAlter->walLevel;
×
UNCOV
1146
    code = 0;
×
1147
  }
1148

1149
  if (pAlter->strict >= 0 && pAlter->strict != pDb->cfg.strict) {
8,825!
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) {
8,825!
1159
    pDb->cfg.cacheLast = pAlter->cacheLast;
5,195✔
1160
    code = 0;
5,195✔
1161
  }
1162

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

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

1174
  if (pAlter->sstTrigger > 0 && pAlter->sstTrigger != pDb->cfg.sstTrigger) {
8,825!
UNCOV
1175
    pDb->cfg.sstTrigger = pAlter->sstTrigger;
×
UNCOV
1176
    pDb->vgVersion++;
×
UNCOV
1177
    code = 0;
×
1178
  }
1179

1180
  if (pAlter->minRows > 0 && pAlter->minRows != pDb->cfg.minRows) {
8,825!
UNCOV
1181
    pDb->cfg.minRows = pAlter->minRows;
×
UNCOV
1182
    pDb->vgVersion++;
×
UNCOV
1183
    code = 0;
×
1184
  }
1185

1186
  if (pAlter->walRetentionPeriod > TSDB_DB_MIN_WAL_RETENTION_PERIOD &&
8,825✔
1187
      pAlter->walRetentionPeriod != pDb->cfg.walRetentionPeriod) {
1,559!
1188
    pDb->cfg.walRetentionPeriod = pAlter->walRetentionPeriod;
1,559✔
1189
    pDb->vgVersion++;
1,559✔
1190
    code = 0;
1,559✔
1191
  }
1192

1193
  if (pAlter->walRetentionSize > TSDB_DB_MIN_WAL_RETENTION_SIZE &&
8,825!
UNCOV
1194
      pAlter->walRetentionSize != pDb->cfg.walRetentionSize) {
×
UNCOV
1195
    pDb->cfg.walRetentionSize = pAlter->walRetentionSize;
×
UNCOV
1196
    pDb->vgVersion++;
×
UNCOV
1197
    code = 0;
×
1198
  }
1199

1200
  if (pAlter->ssKeepLocal >= TSDB_MIN_SS_KEEP_LOCAL && pAlter->ssKeepLocal <= TSDB_MAX_SS_KEEP_LOCAL && pAlter->ssKeepLocal != pDb->cfg.ssKeepLocal) {
8,825!
UNCOV
1201
    pDb->cfg.ssKeepLocal = pAlter->ssKeepLocal;
×
UNCOV
1202
    pDb->vgVersion++;
×
UNCOV
1203
    code = 0;
×
1204
  }
1205

1206
  if (pAlter->ssCompact >= TSDB_MIN_SS_COMPACT && pAlter->ssCompact <= TSDB_MAX_SS_COMPACT && pAlter->ssCompact != pDb->cfg.ssCompact) {
8,825!
UNCOV
1207
    pDb->cfg.ssCompact = pAlter->ssCompact;
×
UNCOV
1208
    pDb->vgVersion++;
×
UNCOV
1209
    code = 0;
×
1210
  }
1211

1212
  if (pAlter->withArbitrator >= TSDB_MIN_DB_WITH_ARBITRATOR && pAlter->withArbitrator != pDb->cfg.withArbitrator) {
8,825!
UNCOV
1213
    pDb->cfg.withArbitrator = pAlter->withArbitrator;
×
UNCOV
1214
    pDb->vgVersion++;
×
UNCOV
1215
    code = 0;
×
1216
  }
1217

1218
  if (pAlter->compactInterval >= TSDB_DEFAULT_COMPACT_INTERVAL && pAlter->compactInterval != pDb->cfg.compactInterval) {
8,825!
UNCOV
1219
    pDb->cfg.compactInterval = pAlter->compactInterval;
×
UNCOV
1220
    pDb->vgVersion++;
×
UNCOV
1221
    code = 0;
×
1222
  }
1223

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

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

1243
  if (pAlter->compactTimeOffset >= TSDB_MIN_COMPACT_TIME_OFFSET &&
8,825!
UNCOV
1244
      pAlter->compactTimeOffset != pDb->cfg.compactTimeOffset) {
×
UNCOV
1245
    pDb->cfg.compactTimeOffset = pAlter->compactTimeOffset;
×
UNCOV
1246
    pDb->vgVersion++;
×
UNCOV
1247
    code = 0;
×
1248
  }
1249

1250
  TAOS_RETURN(code);
8,825✔
1251
}
1252

1253
static int32_t mndSetAlterDbPrepareLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
8,555✔
1254
  int32_t  code = 0;
8,555✔
1255
  SSdbRaw *pRedoRaw = mndDbActionEncode(pOld);
8,555✔
1256
  if (pRedoRaw == NULL) {
8,555!
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) {
8,555!
1262
    sdbFreeRaw(pRedoRaw);
×
1263
    TAOS_RETURN(code);
×
1264
  }
1265

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

1273
static int32_t mndSetAlterDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
8,555✔
1274
  int32_t  code = 0;
8,555✔
1275
  SSdbRaw *pCommitRaw = mndDbActionEncode(pNew);
8,555✔
1276
  if (pCommitRaw == NULL) {
8,555!
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) {
8,555!
1282
    sdbFreeRaw(pCommitRaw);
×
1283
    TAOS_RETURN(code);
×
1284
  }
1285

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

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

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

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

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

1311
      if (pNewDb->cfg.withArbitrator != pOldDb->cfg.withArbitrator) {
23,749!
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);
35,981✔
1325
  }
1326

1327
  taosArrayDestroy(pArray);
8,555✔
1328
  TAOS_RETURN(code);
8,555✔
1329

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

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

1339
static int32_t mndAlterDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pOld, SDbObj *pNew) {
8,555✔
1340
  int32_t code = -1;
8,555✔
1341
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq, "alter-db");
8,555✔
1342
  if (pTrans == NULL) {
8,555!
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);
8,555!
1348
  mInfo("trans:%d, used to alter db, ableToBeKilled:%d, killMode:%d", pTrans->id, pTrans->ableToBeKilled, pTrans->killMode);
8,555!
1349

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

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

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

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

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

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

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

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

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

1389
  if (alterReq.replications == 2) {
8,825!
UNCOV
1390
    TAOS_CHECK_GOTO(grantCheck(TSDB_GRANT_DUAL_REPLICA_HA), NULL, _OVER);
×
1391
  }
1392

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

1396
  if (numOfTopics != 0 && alterReq.walRetentionPeriod == 0) {
8,825!
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) {
8,825!
1404
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
×
1405
    goto _OVER;
×
1406
  }
1407

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

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

1420
  TAOS_CHECK_GOTO(mndCheckInChangeDbCfg(pMnode, &pDb->cfg, &dbObj.cfg), NULL, _OVER);
8,555!
1421

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

1426
  if (dbObj.cfg.replications != pDb->cfg.replications) {
8,555✔
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);
204!
1429
  } else {
1430
    if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
8,351!
1431
  }
1432

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

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

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

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

1449
  TAOS_RETURN(code);
10,736✔
1450
}
1451

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

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

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

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

1517
    mndDumpDbCfgInfo(&cfgRsp, pDb);
328,304✔
1518
  }
1519

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

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

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

1537
  code = 0;
328,304✔
1538

1539
_OVER:
331,452✔
1540

1541
  tFreeSDbCfgRsp(&cfgRsp);
331,452✔
1542

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

1547
  mndReleaseDb(pMnode, pDb);
331,452✔
1548

1549
  TAOS_RETURN(code);
331,452✔
1550
}
1551

1552
int32_t mndSetDropDbPrepareLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
94,200✔
1553
  int32_t  code = 0;
94,200✔
1554
  SSdbRaw *pRedoRaw = mndDbActionEncode(pDb);
94,200✔
1555
  if (pRedoRaw == NULL) {
94,200!
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));
94,200!
1561
  TAOS_CHECK_RETURN(sdbSetRawStatus(pRedoRaw, SDB_STATUS_DROPPING));
94,200!
1562

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

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

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

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

1582
  TAOS_RETURN(code);
94,200✔
1583
}
1584

1585
int32_t mndSetDropDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
94,200✔
1586
  int32_t  code = 0;
94,200✔
1587
  SSdbRaw *pCommitRaw = mndDbActionEncode(pDb);
94,200✔
1588
  if (pCommitRaw == NULL) {
94,200!
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));
94,200!
1594
  TAOS_CHECK_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED));
94,200!
1595

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

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

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

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

1615
  while (1) {
356,874✔
1616
    SVgObj *pVgroup = NULL;
451,074✔
1617
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
451,074✔
1618
    if (pIter == NULL) break;
451,074✔
1619

1620
    if (pVgroup->dbUid == pDb->uid) {
356,874✔
1621
      SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroup);
212,166✔
1622
      if (pVgRaw == NULL) {
212,166!
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) {
212,166!
1630
        sdbCancelFetch(pSdb, pIter);
×
1631
        sdbRelease(pSdb, pVgroup);
×
1632
        TAOS_RETURN(code);
×
1633
      }
1634
      if ((code = sdbSetRawStatus(pVgRaw, SDB_STATUS_DROPPED)) != 0) {
212,166!
1635
        sdbCancelFetch(pSdb, pIter);
×
1636
        sdbRelease(pSdb, pVgroup);
×
1637
        TAOS_RETURN(code);
×
1638
      }
1639
    }
1640

1641
    sdbRelease(pSdb, pVgroup);
356,874✔
1642
  }
1643

1644
  while (1) {
164,342✔
1645
    SStbObj *pStb = NULL;
258,542✔
1646
    ESdbStatus status;
258,542✔
1647
    pIter = sdbFetchAll(pSdb, SDB_STB, pIter, (void **)&pStb, &status, true);
258,542✔
1648
    if (pIter == NULL) break;
258,542✔
1649

1650
    if (pStb->dbUid == pDb->uid) {
164,342✔
1651
      SSdbRaw *pStbRaw = mndStbActionEncode(pStb);
89,110✔
1652
      if (pStbRaw == NULL) {
89,110!
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) {
89,110!
1660
        sdbCancelFetch(pSdb, pIter);
×
1661
        sdbRelease(pSdb, pStbRaw);
×
1662
        return -1;
×
1663
      }
1664
      if ((code = sdbSetRawStatus(pStbRaw, SDB_STATUS_DROPPED)) != 0) {
89,110!
1665
        sdbCancelFetch(pSdb, pIter);
×
1666
        sdbRelease(pSdb, pStbRaw);
×
1667
        return -1;
×
1668
      }
1669
    }
1670

1671
    sdbRelease(pSdb, pStb);
164,342✔
1672
  }
1673

1674
  TAOS_RETURN(code);
94,200✔
1675
}
1676

1677
static int32_t mndBuildDropVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup) {
212,166✔
1678
  int32_t code = 0;
212,166✔
1679
  for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
442,480✔
1680
    SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
230,314✔
1681
    TAOS_CHECK_RETURN(mndAddDropVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid, true));
230,314!
1682
  }
1683

1684
  TAOS_RETURN(code);
212,166✔
1685
}
1686

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

1692
  while (1) {
356,874✔
1693
    SVgObj *pVgroup = NULL;
451,074✔
1694
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
451,074✔
1695
    if (pIter == NULL) break;
451,074✔
1696

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

1705
    sdbRelease(pSdb, pVgroup);
356,874✔
1706
  }
1707

1708
  TAOS_RETURN(code);
94,200✔
1709
}
1710

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

1719
  int32_t rspLen = tSerializeSDropDbRsp(NULL, 0, &dropRsp);
192,560✔
1720
  void   *pRsp = NULL;
192,560✔
1721
  if (useRpcMalloc) {
192,560✔
1722
    pRsp = rpcMallocCont(rspLen);
98,360✔
1723
  } else {
1724
    pRsp = taosMemoryMalloc(rspLen);
94,200!
1725
  }
1726

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

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

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

1742
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq, "drop-db");
94,200✔
1743
  if (pTrans == NULL) {
94,200!
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);
94,200!
1750

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

1754
  if (mndTopicExistsForDb(pMnode, pDb)) {
94,200!
UNCOV
1755
    code = TSDB_CODE_MND_TOPIC_MUST_BE_DELETED;
×
UNCOV
1756
    goto _OVER;
×
1757
  }
1758

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

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

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

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

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

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

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

1795
  pDb = mndAcquireDb(pMnode, dropReq.db);
196,603✔
1796
  if (pDb == NULL) {
196,603✔
1797
    code = TSDB_CODE_MND_RETURN_VALUE_NULL;
100,119✔
1798
    if (terrno != 0) code = terrno;
100,119!
1799
    if (dropReq.ignoreNotExists) {
100,119✔
1800
      code = mndBuildDropDbRsp(pDb, &pReq->info.rspLen, &pReq->info.rsp, true);
98,360✔
1801
    }
1802
    goto _OVER;
100,119✔
1803
  }
1804

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

1807
  if(pDb->cfg.isMount) {
95,705!
UNCOV
1808
    code = TSDB_CODE_MND_MOUNT_OBJ_NOT_SUPPORT;
×
UNCOV
1809
    goto _OVER;
×
1810
  }
1811

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

1815
  while (1) {
369,516✔
1816
    SVgObj *pVgroup = NULL;
465,221✔
1817
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
465,221✔
1818
    if (pIter == NULL) break;
465,221✔
1819

1820
    if (pVgroup->dbUid == pDb->uid) {
369,516✔
1821
      bool isFound = false;
213,671✔
1822
      for (int32_t i = 0; i < pVgroup->replica; i++) {
445,490✔
1823
        if (pVgroup->vnodeGid[i].syncState == TAOS_SYNC_STATE_OFFLINE) {
231,819!
1824
          isFound = true;
×
1825
          break;
×
1826
        }
1827
      }
1828
      if (!isFound) {
213,671!
1829
        sdbRelease(pSdb, pVgroup);
213,671✔
1830
        continue;
213,671✔
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);
155,845✔
1839
  }
1840

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

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

1856
  code = mndDropDb(pMnode, pReq, pDb);
94,200✔
1857
  if (code == TSDB_CODE_SUCCESS) {
94,200!
1858
    code = TSDB_CODE_ACTION_IN_PROGRESS;
94,200✔
1859
  }
1860

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

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

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

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

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

1882
  void *pIter = NULL;
4,845,664✔
1883
  while (vindex < pDb->cfg.numOfVgroups) {
22,472,527✔
1884
    SVgObj *pVgroup = NULL;
17,626,863✔
1885
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
17,626,863✔
1886
    if (pIter == NULL) break;
17,626,863!
1887

1888
    if (mndVgroupInDb(pVgroup, pDb->uid)) {
17,626,863✔
1889
      numOfTables += pVgroup->numOfTables / TSDB_TABLE_NUM_UNIT;
9,608,156✔
1890
      vindex++;
9,608,156✔
1891
    }
1892

1893
    sdbRelease(pSdb, pVgroup);
17,626,863✔
1894
  }
1895

1896
  sdbCancelFetch(pSdb, pIter);
4,845,664✔
1897
  return numOfTables;
4,845,664✔
1898
}
1899

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

1904
  void *pIter = NULL;
4,670,984✔
1905
  while (1) {
11,976,121✔
1906
    SVgObj *pVgroup = NULL;
16,647,105✔
1907
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
16,647,105✔
1908
    if (pIter == NULL) break;
16,647,105✔
1909

1910
    if ((NULL == pDb || pVgroup->dbUid == pDb->uid) && !pVgroup->isTsma) {
15,553,078!
1911
      SVgroupInfo vgInfo = {0};
9,970,114✔
1912
      vgInfo.vgId = pVgroup->vgId;
9,970,114✔
1913
      vgInfo.hashBegin = pVgroup->hashBegin;
9,970,114✔
1914
      vgInfo.hashEnd = pVgroup->hashEnd;
9,970,114✔
1915
      vgInfo.numOfTable = pVgroup->numOfTables / TSDB_TABLE_NUM_UNIT;
9,970,114✔
1916
      vgInfo.epSet.numOfEps = pVgroup->replica;
9,970,114✔
1917
      for (int32_t gid = 0; gid < pVgroup->replica; ++gid) {
20,922,078✔
1918
        SVnodeGid *pVgid = &pVgroup->vnodeGid[gid];
10,951,382✔
1919
        SEp       *pEp = &vgInfo.epSet.eps[gid];
10,951,382✔
1920
        SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
10,951,746✔
1921
        if (pDnode != NULL) {
10,951,964✔
1922
          (void)memcpy(pEp->fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
10,949,716!
1923
          pEp->port = pDnode->port;
10,949,716✔
1924
        }
1925
        mndReleaseDnode(pMnode, pDnode);
10,951,964✔
1926
        if (pVgid->syncState == TAOS_SYNC_STATE_LEADER || pVgid->syncState == TAOS_SYNC_STATE_ASSIGNED_LEADER) {
10,951,964!
1927
          vgInfo.epSet.inUse = gid;
9,855,317✔
1928
        }
1929
      }
1930
      vindex++;
9,970,114✔
1931
      if (taosArrayPush(pVgList, &vgInfo) == NULL) {
9,970,114!
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);
15,553,078✔
1937

1938
    if (pDb && (vindex >= pDb->cfg.numOfVgroups)) {
15,553,078✔
1939
      sdbCancelFetch(pSdb, pIter);
3,576,957✔
1940
      break;
3,576,957✔
1941
    }
1942
  }
1943
}
4,670,984✔
1944

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

1953
  int32_t numOfTable = mndGetDBTableNum(pDb, pMnode);
3,818,669✔
1954

1955
  if (pReq == NULL || pReq->vgVersion < pDb->vgVersion || pReq->dbId != pDb->uid || numOfTable != pReq->numOfTable ||
3,818,669!
1956
      pReq->stateTs < pDb->stateTs) {
372,174✔
1957
    mndBuildDBVgroupInfo(pDb, pMnode, pRsp->pVgroupInfos);
3,470,392✔
1958
  }
1959

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

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

1979
  TAOS_CHECK_GOTO(tDeserializeSUseDbReq(pReq->pCont, pReq->contLen, &usedbReq), NULL, _OVER);
4,904,126!
1980

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

1989
      mndBuildDBVgroupInfo(NULL, pMnode, usedbRsp.pVgroupInfos);
1,079,979✔
1990
      usedbRsp.vgVersion = vgVersion++;
1,079,979✔
1991
    } else {
UNCOV
1992
      usedbRsp.vgVersion = usedbReq.vgVersion;
×
1993
    }
1994
    usedbRsp.vgNum = taosArrayGetSize(usedbRsp.pVgroupInfos);
1,079,979✔
1995
    code = 0;
1,079,979✔
1996
  } else {
1997
    pDb = mndAcquireDb(pMnode, usedbReq.db);
3,824,340✔
1998
    if (pDb == NULL) {
3,824,147✔
1999
      (void)memcpy(usedbRsp.db, usedbReq.db, TSDB_DB_FNAME_LEN);
3,134✔
2000
      usedbRsp.uid = usedbReq.dbId;
3,134✔
2001
      usedbRsp.vgVersion = usedbReq.vgVersion;
3,134✔
2002
      usedbRsp.errCode = terrno;
3,134✔
2003

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

2010
      TAOS_CHECK_GOTO(mndExtractDbInfo(pMnode, pDb, &usedbRsp, &usedbReq), NULL, _OVER);
3,818,669!
2011

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

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

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

2032
  pReq->info.rsp = pRsp;
4,898,648✔
2033
  pReq->info.rspLen = contLen;
4,898,648✔
2034

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

2040
  mndReleaseDb(pMnode, pDb);
4,904,126✔
2041
  tFreeSUsedbRsp(&usedbRsp);
4,904,126✔
2042

2043
  TAOS_RETURN(code);
4,904,126✔
2044
}
2045

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

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

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

2068
    if ((0 == strcasecmp(pDbCacheInfo->dbFName, TSDB_INFORMATION_SCHEMA_DB) ||
1,519,205✔
2069
         (0 == strcasecmp(pDbCacheInfo->dbFName, TSDB_PERFORMANCE_SCHEMA_DB)))) {
1,444,550✔
2070
      int32_t vgVersion = mndGetGlobalVgroupVersion(pMnode);
484,242✔
2071
      if (pDbCacheInfo->vgVersion >= vgVersion) {
484,242✔
2072
        continue;
470,425✔
2073
      }
2074

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

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

2082
      rsp.useDbRsp->vgNum = taosArrayGetSize(rsp.useDbRsp->pVgroupInfos);
14,048✔
2083

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

2089
      continue;
14,048✔
2090
    }
2091

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

2106
    int32_t numOfTable = mndGetDBTableNum(pDb, pMnode);
1,026,995✔
2107

2108
    if (pDbCacheInfo->vgVersion >= pDb->vgVersion && pDbCacheInfo->cfgVersion >= pDb->cfgVersion &&
1,026,995✔
2109
        numOfTable == pDbCacheInfo->numOfTable && pDbCacheInfo->stateTs == pDb->stateTs &&
949,342!
2110
        pDbCacheInfo->tsmaVersion >= pDb->tsmaVersion) {
861,622✔
2111
      mTrace("db:%s, valid dbinfo, vgVersion:%d cfgVersion:%d stateTs:%" PRId64
823,390!
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);
823,390✔
2116
      continue;
823,390✔
2117
    } else {
2118
      mTrace("db:%s, valid dbinfo, vgVersion:%d cfgVersion:%d stateTs:%" PRId64
203,605!
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) {
203,605✔
2125
      rsp.cfgRsp = taosMemoryCalloc(1, sizeof(SDbCfgRsp));
74,255!
2126
      mndDumpDbCfgInfo(rsp.cfgRsp, pDb);
74,255✔
2127
    }
2128

2129
    if (pDbCacheInfo->tsmaVersion != pDb->tsmaVersion) {
203,605✔
2130
      rsp.pTsmaRsp = taosMemoryCalloc(1, sizeof(STableTSMAInfoRsp));
172,228!
2131
      if (rsp.pTsmaRsp) rsp.pTsmaRsp->pTsmas = taosArrayInit(4, POINTER_BYTES);
172,228!
2132
      if (rsp.pTsmaRsp && rsp.pTsmaRsp->pTsmas) {
172,228!
2133
        bool    exist = false;
172,228✔
2134
        int32_t code = mndGetDbTsmas(pMnode, 0, pDb->uid, rsp.pTsmaRsp, &exist);
172,228✔
2135
        if (TSDB_CODE_SUCCESS != code) {
172,228!
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;
172,228✔
2147
        mDebug("update tsma version to %d, got tsma num: %ld", pDb->tsmaVersion, rsp.pTsmaRsp->pTsmas->size);
172,228✔
2148
      }
2149
    }
2150

2151
    if (pDbCacheInfo->vgVersion < pDb->vgVersion || numOfTable != pDbCacheInfo->numOfTable ||
203,605!
2152
        pDbCacheInfo->stateTs != pDb->stateTs) {
200,207✔
2153
      rsp.useDbRsp = taosMemoryCalloc(1, sizeof(SUseDbRsp));
106,565!
2154
      rsp.useDbRsp->pVgroupInfos = taosArrayInit(pDb->cfg.numOfVgroups, sizeof(SVgroupInfo));
106,565✔
2155
      if (rsp.useDbRsp->pVgroupInfos == NULL) {
106,565!
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);
106,565✔
2164
      (void)memcpy(rsp.useDbRsp->db, pDb->name, TSDB_DB_FNAME_LEN);
106,565!
2165
      rsp.useDbRsp->uid = pDb->uid;
106,565✔
2166
      rsp.useDbRsp->vgVersion = pDb->vgVersion;
106,565✔
2167
      rsp.useDbRsp->stateTs = pDb->stateTs;
106,565✔
2168
      rsp.useDbRsp->vgNum = (int32_t)taosArrayGetSize(rsp.useDbRsp->pVgroupInfos);
106,565✔
2169
      rsp.useDbRsp->hashMethod = pDb->cfg.hashMethod;
106,565✔
2170
      rsp.useDbRsp->hashPrefix = pDb->cfg.hashPrefix;
106,565✔
2171
      rsp.useDbRsp->hashSuffix = pDb->cfg.hashSuffix;
106,565✔
2172
      rsp.useDbRsp->flags = pDb->cfg.flags;
106,565✔
2173
    }
2174

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

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

2193
  *ppRsp = pRsp;
1,308,882✔
2194
  *pRspLen = rspLen;
1,308,882✔
2195

2196
  tFreeSDbHbBatchRsp(&batchRsp);
1,308,882✔
2197
  TAOS_RETURN(code);
1,308,882✔
2198
}
2199

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

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

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

UNCOV
2217
      if (pVgroup == NULL) {
×
UNCOV
2218
        mError("db:%s, vgroup:%" PRId64 " not exist", pDb->name, vgId);
×
UNCOV
2219
        TAOS_CHECK_EXIT(TSDB_CODE_MND_VGROUP_NOT_EXIST);
×
UNCOV
2220
      } else if (pVgroup->dbUid != pDb->uid) {
×
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
      }
UNCOV
2225
      sdbRelease(pSdb, pVgroup);
×
2226
    }
2227

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

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

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

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

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

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

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

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

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

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

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

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

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

2346
#ifdef TD_ENTERPRISE
UNCOV
2347
static int32_t mndCheckRsmaInDb(SMnode *pMnode, SDbObj *pDb) {
×
UNCOV
2348
  int32_t   code = 0;
×
UNCOV
2349
  void     *pIter = NULL;
×
UNCOV
2350
  SRsmaObj *pRsma = NULL;
×
UNCOV
2351
  while ((pIter = sdbFetch(pMnode->pSdb, SDB_RSMA, pIter, (void **)&pRsma))) {
×
UNCOV
2352
    if (pRsma->dbUid == pDb->uid) {
×
UNCOV
2353
      sdbRelease(pMnode->pSdb, pRsma);
×
UNCOV
2354
      sdbCancelFetch(pMnode->pSdb, pIter);
×
UNCOV
2355
      TAOS_RETURN(code);
×
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) {
385✔
2364
  SMnode    *pMnode = pReq->info.node;
385✔
2365
  int32_t    code = 0, lino = 0;
385✔
2366
  SDbObj    *pDb = NULL;
385✔
2367
  STrimDbReq trimReq = {0};
385✔
2368

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

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

2374
  pDb = mndAcquireDb(pMnode, trimReq.db);
385✔
2375
  if (pDb == NULL) {
385!
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));
385!
2382

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

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

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

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

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

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

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

2412
  mndReleaseDb(pMnode, pDb);
385✔
2413
  tFreeSTrimDbReq(&trimReq);
385✔
2414
  TAOS_RETURN(code);
385✔
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) {
2,280,461✔
2544
  char *pos = strstr(src, TS_PATH_DELIMITER);
2,280,461!
2545
  if (pos != NULL) ++pos;
2,280,461✔
2546
  if (pos == NULL) return src;
2,280,461✔
2547
  return pos;
2,132,847✔
2548
}
2549

2550
const char *mndGetStableStr(const char *src) {
1,861,907✔
2551
  char *pos = strstr(src, TS_PATH_DELIMITER);
1,861,907!
2552
  if (pos != NULL) ++pos;
1,861,907!
2553
  if (pos == NULL) return src;
1,861,907!
2554
  return mndGetDbStr(pos);
1,861,907✔
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) {
71,663✔
2583
  size_t size = taosArrayGetSize(pRetension);
71,663✔
2584
  if (size == 0) {
71,663!
2585
    return NULL;
71,663✔
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) {
71,663✔
2620
  switch (cacheModel) {
71,663!
2621
    case TSDB_CACHE_MODEL_NONE:
67,736✔
2622
      return TSDB_CACHE_MODEL_NONE_STR;
67,736✔
2623
    case TSDB_CACHE_MODEL_LAST_ROW:
400✔
2624
      return TSDB_CACHE_MODEL_LAST_ROW_STR;
400✔
2625
    case TSDB_CACHE_MODEL_LAST_VALUE:
1,523✔
2626
      return TSDB_CACHE_MODEL_LAST_VALUE_STR;
1,523✔
2627
    case TSDB_CACHE_MODEL_BOTH:
2,004✔
2628
      return TSDB_CACHE_MODEL_BOTH_STR;
2,004✔
2629
    default:
×
2630
      break;
×
2631
  }
2632
  return "unknown";
×
2633
}
2634

2635
static const char *getEncryptAlgorithmStr(int8_t encryptAlgorithm) {
71,663✔
2636
  switch (encryptAlgorithm) {
71,663!
2637
    case TSDB_ENCRYPT_ALGO_NONE:
71,663✔
2638
      return TSDB_ENCRYPT_ALGO_NONE_STR;
71,663✔
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) {
337,538✔
2648
  if (pDb->cfg.replications == 1) return true;
337,538✔
2649

2650
  SSdb *pSdb = pMnode->pSdb;
69,225✔
2651
  void *pIter = NULL;
69,225✔
2652
  bool  isReady = true;
69,225✔
2653
  while (1) {
700,011✔
2654
    SVgObj *pVgroup = NULL;
769,236✔
2655
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
769,236✔
2656
    if (pIter == NULL) break;
769,236✔
2657

2658
    if (pVgroup->dbUid == pDb->uid && pVgroup->replica > 1) {
700,011!
2659
      bool hasLeader = false;
306,570✔
2660
      for (int32_t i = 0; i < pVgroup->replica; ++i) {
1,208,712✔
2661
        if (pVgroup->vnodeGid[i].syncState == TAOS_SYNC_STATE_LEADER ||
902,142✔
2662
            pVgroup->vnodeGid[i].syncState == TAOS_SYNC_STATE_ASSIGNED_LEADER) {
788,958!
2663
          hasLeader = true;
113,184✔
2664
        }
2665
      }
2666
      if (!hasLeader) isReady = false;
306,570✔
2667
    }
2668
    sdbRelease(pSdb, pVgroup);
700,011✔
2669
  }
2670

2671
  return isReady;
69,225✔
2672
}
2673

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

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

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

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

2724
  if (sysDb || !sysinfo) {
219,073!
2725
    for (int32_t i = 0; i < pShow->numOfColumns; ++i) {
5,601,580✔
2726
      SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, i);
5,454,170✔
2727
      if (i == 0) {
5,454,170✔
2728
        TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, buf, false), &lino, _OVER);
147,410!
2729
      } else if (i == 1) {
5,306,760✔
2730
        TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->createdTime, false), &lino, _OVER);
147,410!
2731
      } else if (i == 3) {
5,159,350✔
2732
        TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&numOfTables, false), &lino, _OVER);
147,410!
2733
      } else if (i == 14) {
5,011,940✔
2734
        TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, precVstr, false), &lino, _OVER);
147,410!
2735
      } else if (i == 15) {
4,864,530✔
2736
        TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, statusVstr, false), &lino, _OVER);
147,410!
2737
      } else {
2738
        colDataSetNULL(pColInfo, rows);
4,717,120!
2739
      }
2740
    }
2741
  } else {
2742
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
71,663✔
2743
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, buf, false), &lino, _OVER);
71,663!
2744

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

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

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

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

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

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

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

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

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

2781
    if (pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep1 || pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep2) {
71,663!
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);
71,663✔
2785
    }
2786
    varDataSetLen(keepVstr, len);
71,663✔
2787
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
71,663✔
2788
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)keepVstr, false), &lino, _OVER);
71,663!
2789

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

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

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

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

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

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

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

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

2814
    char *rentensionVstr = buildRetension(pDb->cfg.pRetensions);
71,663✔
2815
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
71,663✔
2816
    if (rentensionVstr == NULL) {
71,663!
2817
      colDataSetNULL(pColInfo, rows);
71,663!
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++);
71,663✔
2824
    TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)&pDb->cfg.numOfStables, false), &lino, _OVER);
71,663!
2825

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2962
    numOfRows += 1;
73,705✔
2963

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

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

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

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

2985
    sdbRelease(pSdb, pDb);
71,663✔
2986
  }
2987

2988
  pShow->numOfRows += numOfRows;
73,705✔
2989
  mndReleaseUser(pMnode, pUser);
73,705✔
2990
  return numOfRows;
73,705✔
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