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

taosdata / TDengine / #3531

19 Nov 2024 10:42AM UTC coverage: 60.213% (-0.006%) from 60.219%
#3531

push

travis-ci

web-flow
Merge pull request #28777 from taosdata/fix/3.0/TD-32366

fix:TD-32366/stmt add geometry datatype check

118529 of 252344 branches covered (46.97%)

Branch coverage included in aggregate %.

7 of 48 new or added lines in 3 files covered. (14.58%)

2282 existing lines in 115 files now uncovered.

199096 of 275161 relevant lines covered (72.36%)

6067577.83 hits per line

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

16.86
/source/libs/catalog/src/catalog.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
#include "catalogInt.h"
17
#include "query.h"
18
#include "systable.h"
19
#include "tname.h"
20
#include "tref.h"
21
#include "trpc.h"
22

23
SCatalogMgmt gCtgMgmt = {0};
24

25
int32_t ctgGetDBVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* dbFName, SCtgDBCache** dbCache,
97,745✔
26
                       SDBVgInfo** pInfo, bool* exists) {
27
  int32_t code = 0;
97,745✔
28

29
  CTG_ERR_RET(ctgAcquireVgInfoFromCache(pCtg, dbFName, dbCache));
97,745!
30

31
  if (*dbCache) {
97,746✔
32
    if (exists) {
97,672✔
33
      *exists = true;
83,154✔
34
    }
35
    
36
    return TSDB_CODE_SUCCESS;
97,672✔
37
  }
38

39
  if (exists) {
74✔
40
    *exists = false;
16✔
41
    return TSDB_CODE_SUCCESS;
16✔
42
  }
43

44
  SUseDbOutput     DbOut = {0};
58✔
45
  SBuildUseDBInput input = {0};
58✔
46

47
  tstrncpy(input.db, dbFName, tListLen(input.db));
58✔
48
  input.vgVersion = CTG_DEFAULT_INVALID_VERSION;
58✔
49

50
  CTG_ERR_RET(ctgGetDBVgInfoFromMnode(pCtg, pConn, &input, &DbOut, NULL));
58!
51

52
  CTG_ERR_JRET(ctgCloneVgInfo(DbOut.dbVgroup, pInfo));
58!
53

54
  CTG_ERR_RET(ctgUpdateVgroupEnqueue(pCtg, dbFName, DbOut.dbId, DbOut.dbVgroup, false));
58!
55

56
  return TSDB_CODE_SUCCESS;
58✔
57

58
_return:
×
59

60
  taosMemoryFreeClear(*pInfo);
×
61
  *pInfo = DbOut.dbVgroup;
×
62

63
  CTG_RET(code);
×
64
}
65

66
int32_t ctgRefreshDBVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* dbFName) {
15,584✔
67
  int32_t      code = 0;
15,584✔
68
  SCtgDBCache* dbCache = NULL;
15,584✔
69

70
  CTG_ERR_RET(ctgAcquireVgInfoFromCache(pCtg, dbFName, &dbCache));
15,584!
71

72
  SUseDbOutput     DbOut = {0};
15,584✔
73
  SBuildUseDBInput input = {0};
15,584✔
74
  tstrncpy(input.db, dbFName, tListLen(input.db));
15,584✔
75

76
  if (NULL != dbCache) {
15,584✔
77
    input.dbId = dbCache->dbId;
10,280✔
78

79
    ctgReleaseVgInfoToCache(pCtg, dbCache);
10,280✔
80
  }
81

82
  input.vgVersion = CTG_DEFAULT_INVALID_VERSION;
15,584✔
83
  input.numOfTable = 0;
15,584✔
84

85
  code = ctgGetDBVgInfoFromMnode(pCtg, pConn, &input, &DbOut, NULL);
15,584✔
86
  if (code) {
15,584!
87
    if (CTG_DB_NOT_EXIST(code) && (NULL != dbCache)) {
×
88
      ctgDebug("db no longer exist, dbFName:%s, dbId:0x%" PRIx64, input.db, input.dbId);
×
89
      CTG_ERR_RET(ctgDropDbCacheEnqueue(pCtg, input.db, input.dbId));
×
90
    }
91

92
    CTG_ERR_RET(code);
×
93
  }
94

95
  CTG_ERR_RET(ctgUpdateVgroupEnqueue(pCtg, dbFName, DbOut.dbId, DbOut.dbVgroup, true));
15,584!
96

97
  return TSDB_CODE_SUCCESS;
15,584✔
98
}
99

100
int32_t ctgRefreshTbMeta(SCatalog* pCtg, SRequestConnInfo* pConn, SCtgTbMetaCtx* ctx, STableMetaOutput** pOutput,
2,045✔
101
                         bool syncReq) {
102
  SVgroupInfo vgroupInfo = {0};
2,045✔
103
  int32_t     code = 0;
2,045✔
104

105
  if (!CTG_FLAG_IS_SYS_DB(ctx->flag)) {
2,045!
106
    CTG_ERR_RET(ctgGetTbHashVgroup(pCtg, pConn, ctx->pName, &vgroupInfo, NULL));
2,045!
107
  }
108

109
  STableMetaOutput  moutput = {0};
2,045✔
110
  STableMetaOutput* output = taosMemoryCalloc(1, sizeof(STableMetaOutput));
2,045✔
111
  if (NULL == output) {
2,045!
112
    ctgError("malloc %d failed", (int32_t)sizeof(STableMetaOutput));
×
113
    CTG_ERR_RET(terrno);
×
114
  }
115

116
  if (CTG_FLAG_IS_SYS_DB(ctx->flag)) {
2,045!
117
    ctgDebug("will refresh tbmeta, supposed in information_schema, tbName:%s", tNameGetTableName(ctx->pName));
×
118

119
    CTG_ERR_JRET(ctgGetTbMetaFromMnodeImpl(pCtg, pConn, (char*)ctx->pName->dbname, (char*)ctx->pName->tname, output, NULL));
×
120
  } else if (CTG_FLAG_IS_STB(ctx->flag)) {
2,045✔
121
    ctgDebug("will refresh tbmeta, supposed to be stb, tbName:%s", tNameGetTableName(ctx->pName));
1,840✔
122

123
    // if get from mnode failed, will not try vnode
124
    CTG_ERR_JRET(ctgGetTbMetaFromMnode(pCtg, pConn, ctx->pName, output, NULL));
1,840!
125

126
    if (CTG_IS_META_NULL(output->metaType)) {
1,840✔
127
      CTG_ERR_JRET(ctgGetTbMetaFromVnode(pCtg, pConn, ctx->pName, &vgroupInfo, output, NULL));
1,663!
128
    }
129
  } else {
130
    ctgDebug("will refresh tbmeta, not supposed to be stb, tbName:%s, flag:%d", tNameGetTableName(ctx->pName), ctx->flag);
205✔
131

132
    // if get from vnode failed or no table meta, will not try mnode
133
    CTG_ERR_JRET(ctgGetTbMetaFromVnode(pCtg, pConn, ctx->pName, &vgroupInfo, output, NULL));
205!
134

135
    if (CTG_IS_META_TABLE(output->metaType) && TSDB_SUPER_TABLE == output->tbMeta->tableType) {
205✔
136
      ctgDebug("will continue to refresh tbmeta since got stb, tbName:%s", tNameGetTableName(ctx->pName));
83✔
137

138
      taosMemoryFreeClear(output->tbMeta);
83!
139

140
      CTG_ERR_JRET(ctgGetTbMetaFromMnodeImpl(pCtg, pConn, output->dbFName, output->tbName, output, NULL));
83!
141
    } else if (CTG_IS_META_BOTH(output->metaType)) {
122✔
142
      int32_t exist = 0;
91✔
143
      if (!CTG_FLAG_IS_FORCE_UPDATE(ctx->flag)) {
91!
144
        CTG_ERR_JRET(ctgTbMetaExistInCache(pCtg, output->dbFName, output->tbName, &exist));
91!
145
      }
146

147
      if (0 == exist) {
91✔
148
        CTG_ERR_JRET(ctgGetTbMetaFromMnodeImpl(pCtg, pConn, output->dbFName, output->tbName, &moutput, NULL));
32!
149

150
        if (CTG_IS_META_NULL(moutput.metaType)) {
32!
151
          SET_META_TYPE_NULL(output->metaType);
×
152
        }
153

154
        taosMemoryFreeClear(output->tbMeta);
32!
155
        output->tbMeta = moutput.tbMeta;
32✔
156
        moutput.tbMeta = NULL;
32✔
157
      } else {
158
        taosMemoryFreeClear(output->tbMeta);
59!
159

160
        SET_META_TYPE_CTABLE(output->metaType);
59✔
161
      }
162
    }
163
  }
164

165
  if (CTG_IS_META_NULL(output->metaType)) {
2,045✔
166
    ctgError("no tbmeta got, tbName:%s", tNameGetTableName(ctx->pName));
1,657!
167
    CTG_ERR_JRET(ctgRemoveTbMetaFromCache(pCtg, ctx->pName, false));
1,657!
168
    CTG_ERR_JRET(CTG_ERR_CODE_TABLE_NOT_EXIST);
1,657!
169
  }
170

171
  if (CTG_IS_META_TABLE(output->metaType)) {
388✔
172
    ctgDebug("tbmeta got, dbFName:%s, tbName:%s, tbType:%d", output->dbFName, output->tbName,
297✔
173
             output->tbMeta->tableType);
174
  } else {
175
    ctgDebug("tbmeta got, dbFName:%s, tbName:%s, tbType:%d, stbMetaGot:%d", output->dbFName, output->ctbName,
91✔
176
             output->ctbMeta.tableType, CTG_IS_META_BOTH(output->metaType));
177
  }
178

179
  if (pOutput) {
388✔
180
    CTG_ERR_JRET(ctgCloneMetaOutput(output, pOutput));
272!
181
  }
182

183
  code = ctgUpdateTbMetaEnqueue(pCtg, output, syncReq);
388✔
184
  output = NULL;
388✔
185
  CTG_ERR_JRET(code);
388!
186

187
  return TSDB_CODE_SUCCESS;
388✔
188

189
_return:
1,657✔
190

191
  if (output) {
1,657!
192
    taosMemoryFreeClear(output->tbMeta);
1,657!
193
    taosMemoryFreeClear(output);
1,657!
194
  }
195
  
196
  CTG_RET(code);
1,657!
197
}
198

199
int32_t ctgGetTbMeta(SCatalog* pCtg, SRequestConnInfo* pConn, SCtgTbMetaCtx* ctx, STableMeta** pTableMeta) {
84,186✔
200
  int32_t           code = 0;
84,186✔
201
  STableMetaOutput* output = NULL;
84,186✔
202

203
  CTG_ERR_RET(ctgGetTbMetaFromCache(pCtg, ctx, pTableMeta));
84,186!
204
  if (*pTableMeta || (ctx->flag & CTG_FLAG_ONLY_CACHE)) {
84,188✔
205
    goto _return;
82,271✔
206
  }
207

208
  while (true) {
×
209
    CTG_ERR_JRET(ctgRefreshTbMeta(pCtg, pConn, ctx, &output, ctx->flag & CTG_FLAG_SYNC_OP));
2,130✔
210

211
    if (CTG_IS_META_TABLE(output->metaType)) {
272✔
212
      *pTableMeta = output->tbMeta;
181✔
213
      goto _return;
181✔
214
    }
215

216
    if (CTG_IS_META_BOTH(output->metaType)) {
91✔
217
      TAOS_MEMCPY(output->tbMeta, &output->ctbMeta, sizeof(output->ctbMeta));
32✔
218

219
      *pTableMeta = output->tbMeta;
32✔
220
      goto _return;
32✔
221
    }
222

223
    if ((!CTG_IS_META_CTABLE(output->metaType)) || output->tbMeta) {
59!
224
      ctgError("invalid metaType:%d", output->metaType);
×
225
      taosMemoryFreeClear(output->tbMeta);
×
226
      CTG_ERR_JRET(TSDB_CODE_CTG_INTERNAL_ERROR);
×
227
    }
228

229
    // HANDLE ONLY CHILD TABLE META
230

231
    taosMemoryFreeClear(output->tbMeta);
59!
232

233
    SName stbName = *ctx->pName;
59✔
234
    TAOS_STRCPY(stbName.tname, output->tbName);
59✔
235
    SCtgTbMetaCtx stbCtx = {0};
59✔
236
    stbCtx.flag = ctx->flag;
59✔
237
    stbCtx.pName = &stbName;
59✔
238

239
    CTG_ERR_JRET(ctgReadTbMetaFromCache(pCtg, &stbCtx, pTableMeta));
59!
240
    if (NULL == *pTableMeta) {
59!
241
      ctgDebug("stb no longer exist, dbFName:%s, tbName:%s", output->dbFName, ctx->pName->tname);
×
242
      continue;
×
243
    }
244

245
    TAOS_MEMCPY(*pTableMeta, &output->ctbMeta, sizeof(output->ctbMeta));
59✔
246

247
    break;
59✔
248
  }
249

250
_return:
84,188✔
251

252
  if (CTG_TABLE_NOT_EXIST(code) && ctx->tbInfo.inCache) {
84,188✔
253
    char dbFName[TSDB_DB_FNAME_LEN] = {0};
2✔
254
    if (CTG_FLAG_IS_SYS_DB(ctx->flag)) {
2!
255
      TAOS_STRCPY(dbFName, ctx->pName->dbname);
×
256
    } else {
257
      (void)tNameGetFullDbName(ctx->pName, dbFName);
2✔
258
    }
259

260
    if (TSDB_SUPER_TABLE == ctx->tbInfo.tbType) {
2!
261
      (void)ctgDropStbMetaEnqueue(pCtg, dbFName, ctx->tbInfo.dbId, ctx->pName->tname, ctx->tbInfo.suid, false); // already in error
×
262
    } else {
263
      (void)ctgDropTbMetaEnqueue(pCtg, dbFName, ctx->tbInfo.dbId, ctx->pName->tname, false); // already in error
2✔
264
    }
265
  }
266

267
  taosMemoryFreeClear(output);
84,188✔
268

269
  if (*pTableMeta) {
84,188✔
270
    ctgDebug("tbmeta returned, tbName:%s, tbType:%d", ctx->pName->tname, (*pTableMeta)->tableType);
80,530✔
271
    ctgdShowTableMeta(pCtg, ctx->pName->tname, *pTableMeta);
80,530✔
272
  }
273

274
  CTG_RET(code);
84,188✔
275
}
276

277
int32_t ctgUpdateTbMeta(SCatalog* pCtg, STableMetaRsp* rspMsg, bool syncOp) {
125,352✔
278
  STableMetaOutput* output = taosMemoryCalloc(1, sizeof(STableMetaOutput));
125,352✔
279
  if (NULL == output) {
125,354!
280
    ctgError("malloc %d failed", (int32_t)sizeof(STableMetaOutput));
×
281
    CTG_ERR_RET(terrno);
×
282
  }
283

284
  int32_t code = 0;
125,354✔
285

286
  TAOS_STRCPY(output->dbFName, rspMsg->dbFName);
125,354✔
287

288
  output->dbId = rspMsg->dbId;
125,354✔
289

290
  if (TSDB_CHILD_TABLE == rspMsg->tableType && NULL == rspMsg->pSchemas) {
125,354!
291
    TAOS_STRCPY(output->ctbName, rspMsg->tbName);
101,373✔
292

293
    SET_META_TYPE_CTABLE(output->metaType);
101,373✔
294

295
    CTG_ERR_JRET(queryCreateCTableMetaFromMsg(rspMsg, &output->ctbMeta));
101,373!
296
  } else {
297
    TAOS_STRCPY(output->tbName, rspMsg->tbName);
23,981✔
298

299
    SET_META_TYPE_TABLE(output->metaType);
23,981✔
300

301
    CTG_ERR_JRET(queryCreateTableMetaFromMsg(rspMsg, rspMsg->tableType == TSDB_SUPER_TABLE, &output->tbMeta));
23,981!
302
  }
303

304
  code = ctgUpdateTbMetaEnqueue(pCtg, output, syncOp);
125,354✔
305
  output = NULL;
125,352✔
306
  CTG_ERR_JRET(code);
125,352!
307

308
  return TSDB_CODE_SUCCESS;
125,352✔
309

310
_return:
×
311

312
  if (output) {
×
313
    taosMemoryFreeClear(output->tbMeta);
×
314
    taosMemoryFreeClear(output);
×
315
  }
316
  
317
  CTG_RET(code);
×
318
}
319

320
int32_t ctgChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, SUserAuthInfo *pReq, SUserAuthRes* pRes, bool* exists) {
1,742,337✔
321
  bool    inCache = false;
1,742,337✔
322
  int32_t code = 0;
1,742,337✔
323
  SCtgAuthRsp rsp = {0};
1,742,337✔
324
  rsp.pRawRes = pRes;
1,742,337✔
325

326
  CTG_ERR_RET(ctgChkAuthFromCache(pCtg, pReq, false, &inCache, &rsp));
1,742,337!
327

328
  if (inCache) {
1,742,338✔
329
    if (exists) {
1,741,890✔
330
      *exists = true;
1,739,273✔
331
    }
332
    
333
    return TSDB_CODE_SUCCESS;
1,741,890✔
334
  } else if (exists) {
448✔
335
    *exists = false;
401✔
336
    return TSDB_CODE_SUCCESS;
401✔
337
  }
338

339
  SCtgAuthReq req = {0};
47✔
340
  req.pRawReq = pReq;
47✔
341
  req.pConn = pConn;
47✔
342
  req.onlyCache = false;
47✔
343
  CTG_ERR_RET(ctgGetUserDbAuthFromMnode(pCtg, pConn, pReq->user, &req.authInfo, NULL));
47!
344

345
  CTG_ERR_JRET(ctgChkSetAuthRes(pCtg, &req, &rsp));
47!
346

347
_return:
47✔
348

349
  (void)ctgUpdateUserEnqueue(pCtg, &req.authInfo, false); // cache update not fatal error
47✔
350

351
  CTG_RET(code);
47!
352
}
353

354
int32_t ctgGetTbType(SCatalog* pCtg, SRequestConnInfo* pConn, SName* pTableName, int32_t* tbType) {
×
355
  char dbFName[TSDB_DB_FNAME_LEN];
356
  (void)tNameGetFullDbName(pTableName, dbFName);
×
357
  CTG_ERR_RET(ctgReadTbTypeFromCache(pCtg, dbFName, pTableName->tname, tbType));
×
358
  if (*tbType > 0) {
×
359
    return TSDB_CODE_SUCCESS;
×
360
  }
361

362
  STableMeta*   pMeta = NULL;
×
363
  SCtgTbMetaCtx ctx = {0};
×
364
  ctx.pName = (SName*)pTableName;
×
365
  ctx.flag = CTG_FLAG_UNKNOWN_STB;
×
366
  CTG_ERR_RET(ctgGetTbMeta(pCtg, pConn, &ctx, &pMeta));
×
367

368
  *tbType = pMeta->tableType;
×
369
  taosMemoryFree(pMeta);
×
370

371
  return TSDB_CODE_SUCCESS;
×
372
}
373

374
int32_t ctgGetTbIndex(SCatalog* pCtg, SRequestConnInfo* pConn, SName* pTableName, SArray** pRes) {
×
375
  CTG_ERR_RET(ctgReadTbIndexFromCache(pCtg, pTableName, pRes));
×
376
  if (*pRes) {
×
377
    return TSDB_CODE_SUCCESS;
×
378
  }
379

380
  STableIndex* pIndex = taosMemoryCalloc(1, sizeof(STableIndex));
×
381
  if (NULL == pIndex) {
×
382
    CTG_ERR_RET(terrno);
×
383
  }
384

385
  int32_t code = ctgGetTbIndexFromMnode(pCtg, pConn, (SName*)pTableName, pIndex, NULL);
×
386
  if (TSDB_CODE_MND_DB_INDEX_NOT_EXIST == code) {
×
387
    code = 0;
×
388
    goto _return;
×
389
  }
390
  CTG_ERR_JRET(code);
×
391

392
  SArray* pInfo = NULL;
×
393
  CTG_ERR_JRET(ctgCloneTableIndex(pIndex->pIndex, &pInfo));
×
394

395
  *pRes = pInfo;
×
396

397
  CTG_ERR_JRET(ctgUpdateTbIndexEnqueue(pCtg, &pIndex, false));
×
398

399
  return TSDB_CODE_SUCCESS;
×
400

401
_return:
×
402

403
  tFreeSTableIndexRsp(pIndex);
×
404
  taosMemoryFree(pIndex);
×
405

406
  taosArrayDestroyEx(*pRes, tFreeSTableIndexInfo);
×
407
  *pRes = NULL;
×
408

409
  CTG_RET(code);
×
410
}
411

412
int32_t ctgGetTbCfg(SCatalog* pCtg, SRequestConnInfo* pConn, SName* pTableName, STableCfg** pCfg) {
×
413
  int32_t tbType = 0;
×
414
  CTG_ERR_RET(ctgGetTbType(pCtg, pConn, pTableName, &tbType));
×
415

416
  if (TSDB_SUPER_TABLE == tbType) {
×
417
    CTG_ERR_RET(ctgGetTableCfgFromMnode(pCtg, pConn, pTableName, pCfg, NULL));
×
418
  } else {
419
    SVgroupInfo vgroupInfo = {0};
×
420
    CTG_ERR_RET(ctgGetTbHashVgroup(pCtg, pConn, pTableName, &vgroupInfo, NULL));
×
421
    CTG_ERR_RET(ctgGetTableCfgFromVnode(pCtg, pConn, pTableName, &vgroupInfo, pCfg, NULL));
×
422
  }
423

424
  CTG_RET(TSDB_CODE_SUCCESS);
×
425
}
426

427
int32_t ctgGetTbTag(SCatalog* pCtg, SRequestConnInfo* pConn, SName* pTableName, SArray** pRes) {
×
428
  SVgroupInfo vgroupInfo = {0};
×
429
  STableCfg* pCfg = NULL;
×
430
  int32_t code = 0;
×
431

432
  CTG_ERR_RET(ctgGetTbHashVgroup(pCtg, pConn, pTableName, &vgroupInfo, NULL));
×
433
  CTG_ERR_RET(ctgGetTableCfgFromVnode(pCtg, pConn, pTableName, &vgroupInfo, &pCfg, NULL));
×
434

435
  if (NULL == pCfg->pTags || pCfg->tagsLen <= 0) {
×
436
    ctgError("invalid tag in tbCfg rsp, pTags:%p, len:%d", pCfg->pTags, pCfg->tagsLen);
×
437
    CTG_ERR_JRET(TSDB_CODE_INVALID_MSG);
×
438
  }
439

440
  SArray* pTagVals = NULL;
×
441
  STag*   pTag = (STag*)pCfg->pTags;
×
442

443
  if (tTagIsJson(pTag)) {
×
444
    pTagVals = taosArrayInit(1, sizeof(STagVal));
×
445
    if (NULL == pTagVals) {
×
446
      CTG_ERR_JRET(terrno);
×
447
    }
448

449
    char* pJson = NULL;
×
450
    parseTagDatatoJson(pTag, &pJson);
×
451
    if(NULL == pJson) {
×
452
      taosArrayDestroy(pTagVals);
×
453
      CTG_ERR_JRET(terrno);
×
454
    }
455
    STagVal tagVal;
456
    tagVal.cid = 0;
×
457
    tagVal.type = TSDB_DATA_TYPE_JSON;
×
458
    tagVal.pData = pJson;
×
459
    tagVal.nData = strlen(pJson);
×
460
    if (NULL == taosArrayPush(pTagVals, &tagVal)) {
×
461
      taosMemoryFree(pJson);
×
462
      taosArrayDestroy(pTagVals);
×
463
      CTG_ERR_JRET(terrno);
×
464
    }
465
  } else {
466
    CTG_ERR_JRET(tTagToValArray((const STag*)pCfg->pTags, &pTagVals));
×
467
  }
468

469
  *pRes = pTagVals;
×
470

471
_return:
×
472

473
  tFreeSTableCfgRsp((STableCfgRsp*)pCfg);
×
474
  
475
  CTG_RET(code);
×
476
}
477

478
int32_t ctgGetTbDistVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, SName* pTableName, SArray** pVgList) {
×
479
  STableMeta*   tbMeta = NULL;
×
480
  int32_t       code = 0;
×
481
  SVgroupInfo   vgroupInfo = {0};
×
482
  SCtgDBCache*  dbCache = NULL;
×
483
  SArray*       vgList = NULL;
×
484
  SDBVgInfo*    vgInfo = NULL;
×
485
  SCtgTbMetaCtx ctx = {0};
×
486
  ctx.pName = pTableName;
×
487
  ctx.flag = CTG_FLAG_UNKNOWN_STB;
×
488

489
  *pVgList = NULL;
×
490

491
  CTG_ERR_JRET(ctgGetTbMeta(pCtg, pConn, &ctx, &tbMeta));
×
492

493
  char db[TSDB_DB_FNAME_LEN] = {0};
×
494
  (void)tNameGetFullDbName(pTableName, db);
×
495

496
  SHashObj* vgHash = NULL;
×
497
  CTG_ERR_JRET(ctgGetDBVgInfo(pCtg, pConn, db, &dbCache, &vgInfo, NULL));
×
498

499
  if (dbCache) {
×
500
    vgHash = dbCache->vgCache.vgInfo->vgHash;
×
501
  } else {
502
    vgHash = vgInfo->vgHash;
×
503
  }
504

505
  if (tbMeta->tableType == TSDB_SUPER_TABLE) {
×
506
    CTG_ERR_JRET(ctgGenerateVgList(pCtg, vgHash, pVgList));
×
507
  } else {
508
    // USE HASH METHOD INSTEAD OF VGID IN TBMETA
509
    ctgError("invalid method to get none stb vgInfo, tbType:%d", tbMeta->tableType);
×
510
    CTG_ERR_JRET(TSDB_CODE_CTG_INVALID_INPUT);
×
511

512
#if 0  
513
    int32_t vgId = tbMeta->vgId;
514
    if (taosHashGetDup(vgHash, &vgId, sizeof(vgId), &vgroupInfo) != 0) {
515
      ctgWarn("table's vgId not found in vgroup list, vgId:%d, tbName:%s", vgId, tNameGetTableName(pTableName));
516
      CTG_ERR_JRET(TSDB_CODE_CTG_VG_META_MISMATCH);
517
    }
518

519
    vgList = taosArrayInit(1, sizeof(SVgroupInfo));
520
    if (NULL == vgList) {
521
      ctgError("taosArrayInit %d failed", (int32_t)sizeof(SVgroupInfo));
522
      CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);    
523
    }
524

525
    if (NULL == taosArrayPush(vgList, &vgroupInfo)) {
526
      ctgError("taosArrayPush vgroupInfo to array failed, vgId:%d, tbName:%s", vgId, tNameGetTableName(pTableName));
527
      CTG_ERR_JRET(TSDB_CODE_CTG_INTERNAL_ERROR);
528
    }
529

530
    *pVgList = vgList;
531
    vgList = NULL;
532
#endif
533
  }
534

535
_return:
×
536

537
  if (dbCache) {
×
538
    ctgRUnlockVgInfo(dbCache);
×
539
    ctgReleaseDBCache(pCtg, dbCache);
×
540
  }
541

542
  taosMemoryFreeClear(tbMeta);
×
543

544
  if (vgInfo) {
×
545
    freeVgInfo(vgInfo);
×
546
  }
547

548
  if (vgList) {
×
549
    taosArrayDestroy(vgList);
×
550
    vgList = NULL;
×
551
  }
552

553
  CTG_RET(code);
×
554
}
555

556
int32_t ctgGetTbHashVgroup(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, SVgroupInfo* pVgroup, bool* exists) {
96,696✔
557
  if (IS_SYS_DBNAME(pTableName->dbname)) {
96,696!
558
    ctgError("no valid vgInfo for db, dbname:%s", pTableName->dbname);
×
559
    CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT);
×
560
  }
561

562
  SCtgDBCache* dbCache = NULL;
96,696✔
563
  int32_t      code = 0;
96,696✔
564
  char         db[TSDB_DB_FNAME_LEN] = {0};
96,696✔
565
  (void)tNameGetFullDbName(pTableName, db);
96,696✔
566

567
  SDBVgInfo* vgInfo = NULL;
96,696✔
568
  CTG_ERR_JRET(ctgGetDBVgInfo(pCtg, pConn, db, &dbCache, &vgInfo, exists));
96,696!
569

570
  if (exists && false == *exists) {
96,696✔
571
    ctgDebug("db %s vgInfo not in cache", pTableName->dbname);
16!
572
    return TSDB_CODE_SUCCESS;
16✔
573
  }
574
  
575
  CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pCtg, pConn ? &pConn->mgmtEps : NULL, vgInfo ? vgInfo : dbCache->vgCache.vgInfo, pTableName, pVgroup));
96,680!
576

577
_return:
96,679✔
578

579
  if (dbCache) {
96,679✔
580
    ctgRUnlockVgInfo(dbCache);
96,621✔
581
    ctgReleaseDBCache(pCtg, dbCache);
96,622✔
582
  }
583

584
  if (vgInfo) {
96,680✔
585
    freeVgInfo(vgInfo);
58✔
586
  }
587

588
  CTG_RET(code);
96,680!
589
}
590

591
int32_t ctgGetTbsHashVgId(SCatalog* pCtg, SRequestConnInfo* pConn, int32_t acctId, const char* pDb, const char* pTbs[], int32_t tbNum, int32_t* vgId) {
×
592
  if (IS_SYS_DBNAME(pDb)) {
×
593
    ctgError("no valid vgInfo for db, dbname:%s", pDb);
×
594
    CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT);
×
595
  }
596

597
  SCtgDBCache* dbCache = NULL;
×
598
  int32_t      code = 0;
×
599
  char         dbFName[TSDB_DB_FNAME_LEN] = {0};
×
600
  (void)snprintf(dbFName, TSDB_DB_FNAME_LEN, "%d.%s", acctId, pDb);
×
601

602
  SDBVgInfo* vgInfo = NULL;
×
603
  CTG_ERR_JRET(ctgGetDBVgInfo(pCtg, pConn, dbFName, &dbCache, &vgInfo, NULL));
×
604
  
605
  CTG_ERR_JRET(ctgGetVgIdsFromHashValue(pCtg, vgInfo ? vgInfo : dbCache->vgCache.vgInfo, dbFName, pTbs, tbNum, vgId));
×
606

607
_return:
×
608

609
  if (dbCache) {
×
610
    ctgRUnlockVgInfo(dbCache);
×
611
    ctgReleaseDBCache(pCtg, dbCache);
×
612
  }
613

614
  if (vgInfo) {
×
615
    freeVgInfo(vgInfo);
×
616
  }
617

618
  CTG_RET(code);
×
619
}
620

621

622
int32_t ctgGetCachedTbVgMeta(SCatalog* pCtg, const SName* pTableName, SVgroupInfo* pVgroup, STableMeta** pTableMeta) {
1,679,754✔
623
  int32_t      code = 0;
1,679,754✔
624
  char         db[TSDB_DB_FNAME_LEN] = {0};
1,679,754✔
625
  (void)tNameGetFullDbName(pTableName, db);
1,679,754✔
626
  SCtgDBCache *dbCache = NULL;
1,679,751✔
627
  SCtgTbCache *tbCache = NULL;
1,679,751✔
628

629
  CTG_ERR_RET(ctgAcquireVgMetaFromCache(pCtg, db, pTableName->tname, &dbCache, &tbCache));
1,679,751!
630

631
  if (NULL == dbCache || NULL == tbCache) {
1,679,758!
632
    *pTableMeta = NULL;
2,290✔
633
    return TSDB_CODE_SUCCESS;
2,290✔
634
  }
635

636
  CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pCtg, NULL, dbCache->vgCache.vgInfo, pTableName, pVgroup));
1,677,468!
637

638
  ctgRUnlockVgInfo(dbCache);
1,677,465✔
639

640
  SCtgTbMetaCtx ctx = {0};
1,677,468✔
641
  ctx.pName = (SName*)pTableName;
1,677,468✔
642
  ctx.flag = CTG_FLAG_UNKNOWN_STB;
1,677,468✔
643
  code = ctgCopyTbMeta(pCtg, &ctx, &dbCache, &tbCache, pTableMeta, db);
1,677,468✔
644

645
  ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
1,677,464✔
646

647
  CTG_RET(code);
1,677,468!
648

649
_return:
×
650
  
651
  ctgReleaseVgMetaToCache(pCtg, dbCache, tbCache);
×
652

653
  CTG_RET(code);
×
654
}
655

656

657
int32_t ctgRemoveTbMeta(SCatalog* pCtg, SName* pTableName) {
35,276✔
658
  int32_t code = 0;
35,276✔
659

660
  if (NULL == pCtg || NULL == pTableName) {
35,276!
661
    CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT);
×
662
  }
663

664
  if (NULL == pCtg->dbCache) {
35,276!
665
    return TSDB_CODE_SUCCESS;
×
666
  }
667

668
  CTG_ERR_JRET(ctgRemoveTbMetaFromCache(pCtg, pTableName, true));
35,276!
669

670
_return:
35,277✔
671

672
  CTG_RET(code);
35,277!
673
}
674

675

676
int32_t ctgRemoveViewMeta(SCatalog* pCtg, const char* dbFName, uint64_t dbId, const char* viewName, uint64_t viewId) {
3,692✔
677
  int32_t code = 0;
3,692✔
678

679
  if (NULL == pCtg || NULL == dbFName || NULL == viewName) {
3,692!
680
    CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT);
×
681
  }
682

683
  if (NULL == pCtg->dbCache) {
3,692!
684
    return TSDB_CODE_SUCCESS;
×
685
  }
686

687
  CTG_ERR_JRET(ctgDropViewMetaEnqueue(pCtg, dbFName, 0, viewName, viewId, true));
3,692!
688

689
_return:
3,692✔
690

691
  CTG_RET(code);
3,692!
692
}
693

694

695
void ctgProcessTimerEvent(void *param, void *tmrId) {
10,477✔
696
  CTG_API_NENTER();
10,477!
697

698
  (void)ctgdShowCacheInfo();
10,477✔
699
  (void)ctgdShowStatInfo();
10,477✔
700

701
  int32_t cacheMaxSize = atomic_load_32(&tsMetaCacheMaxSize);
10,477✔
702
  if (cacheMaxSize >= 0) {
10,477!
703
    uint64_t cacheSize = 0;
×
704
    ctgGetGlobalCacheSize(&cacheSize);
×
705
    bool overflow = CTG_CACHE_OVERFLOW(cacheSize, cacheMaxSize);
×
706
    
707
    qDebug("catalog cache size: %" PRIu64"B, maxCaseSize:%dMB, %s", cacheSize, cacheMaxSize, overflow ? "overflow" : "NO overflow");
×
708

709
    if (overflow) {
×
710
      int32_t code = ctgClearCacheEnqueue(NULL, true, false, false, false);
×
711
      if (code) {
×
712
        qError("clear cache enqueue failed, error:%s", tstrerror(code));
×
713
        if (taosTmrReset(ctgProcessTimerEvent, CTG_DEFAULT_CACHE_MON_MSEC, NULL, gCtgMgmt.timer, &gCtgMgmt.cacheTimer)) {
×
714
          qError("reset catalog cache monitor timer error, timer stoppped");
×
715
        }
716
      }
717

718
      goto _return;
×
719
    }
720
  }
721

722
  qTrace("reset catalog timer");
10,477✔
723
  if (taosTmrReset(ctgProcessTimerEvent, CTG_DEFAULT_CACHE_MON_MSEC, NULL, gCtgMgmt.timer, &gCtgMgmt.cacheTimer)) {
10,477!
724
    qError("reset catalog cache monitor timer error, timer stoppped");
×
725
  }
726

727
_return:
10,477✔
728

729
  CTG_API_NLEAVE();
10,477!
730
}
731

732
int32_t ctgGetDBCfg(SCatalog* pCtg, SRequestConnInfo* pConn, const char* dbFName, SDbCfgInfo* pDbCfg) {
×
733
  CTG_ERR_RET(ctgReadDBCfgFromCache(pCtg, dbFName, pDbCfg));
×
734

735
  if (pDbCfg->cfgVersion < 0) {
×
736
    CTG_ERR_RET(ctgGetDBCfgFromMnode(pCtg, pConn, dbFName, pDbCfg, NULL));
×
737
    SDbCfgInfo *pCfg = NULL;
×
738
    CTG_ERR_RET(ctgCloneDbCfgInfo(pDbCfg, &pCfg));    
×
739
    
740
    CTG_ERR_RET(ctgUpdateDbCfgEnqueue(pCtg, dbFName, pDbCfg->dbId, pCfg, false));
×
741
  }
742

743
  return TSDB_CODE_SUCCESS;
×
744
}
745

746

747
int32_t ctgGetTbTsmas(SCatalog* pCtg, SRequestConnInfo* pConn, SName* pTableName, SArray** ppRes) {
×
748
  STableTSMAInfoRsp tsmasRsp = {0};
×
749
  int32_t code = ctgGetTbTSMAFromMnode(pCtg, pConn, pTableName, &tsmasRsp, NULL, TDMT_MND_GET_TABLE_TSMA);
×
750
  if (code == TSDB_CODE_MND_SMA_NOT_EXIST) {
×
751
    code = 0;
×
752
    goto _return;
×
753
  }
754
  
755
  CTG_ERR_JRET(code);
×
756
  
757
  *ppRes = tsmasRsp.pTsmas;
×
758
  tsmasRsp.pTsmas = NULL;
×
759

760
  for (int32_t i = 0; i < (*ppRes)->size; ++i) {
×
761
    CTG_ERR_JRET(ctgUpdateTbTSMAEnqueue(pCtg, taosArrayGet((*ppRes), i), 0, false));
×
762
  }
763
  
764
  return TSDB_CODE_SUCCESS;
×
765

766
_return:
×
767

768
  if (tsmasRsp.pTsmas) {
×
769
    tFreeTableTSMAInfoRsp(&tsmasRsp);
×
770
  }
771
  CTG_RET(code);
×
772
}
773

774

775
int32_t ctgGetTsma(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTsmaName, STableTSMAInfo** pTsma) {
×
776
  STableTSMAInfoRsp tsmaRsp = {0};
×
777
  int32_t code = ctgGetTbTSMAFromMnode(pCtg, pConn, pTsmaName, &tsmaRsp, NULL, TDMT_MND_GET_TSMA);
×
778
  if (code == TSDB_CODE_MND_SMA_NOT_EXIST) {
×
779
    code = 0;
×
780
    goto _return;
×
781
  }
782

783
  CTG_ERR_JRET(code);
×
784
  
785
  *pTsma = taosArrayGetP(tsmaRsp.pTsmas, 0);
×
786
  taosArrayDestroy(tsmaRsp.pTsmas);
×
787
  tsmaRsp.pTsmas = NULL;
×
788

789
_return:
×
790

791
  if (tsmaRsp.pTsmas) {
×
792
    tFreeTableTSMAInfoRsp(&tsmaRsp);
×
793
  }
794
  CTG_RET(code);
×
795
}
796

797

798
int32_t catalogInit(SCatalogCfg* cfg) {
3,289✔
799
  qDebug("catalogInit start");
3,289✔
800
  if (gCtgMgmt.pCluster) {
3,289!
801
    qError("catalog already initialized");
×
802
    CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT);
×
803
  }
804

805
  TAOS_MEMSET(&gCtgMgmt, 0, sizeof(gCtgMgmt));
3,289✔
806

807
  if (cfg) {
3,289!
808
    TAOS_MEMCPY(&gCtgMgmt.cfg, cfg, sizeof(*cfg));
3,289✔
809

810
    if (gCtgMgmt.cfg.maxDBCacheNum == 0) {
3,289!
811
      gCtgMgmt.cfg.maxDBCacheNum = CTG_DEFAULT_CACHE_DB_NUMBER;
×
812
    }
813

814
    if (gCtgMgmt.cfg.maxTblCacheNum == 0) {
3,289!
815
      gCtgMgmt.cfg.maxTblCacheNum = CTG_DEFAULT_CACHE_TBLMETA_NUMBER;
×
816
    }
817

818
    if (gCtgMgmt.cfg.maxViewCacheNum == 0) {
3,289!
819
      gCtgMgmt.cfg.maxViewCacheNum = CTG_DEFAULT_CACHE_VIEW_NUMBER;
3,289✔
820
    }
821

822
    if (gCtgMgmt.cfg.maxTSMACacheNum == 0) {
3,289!
823
      gCtgMgmt.cfg.maxTSMACacheNum = CTG_DEFAULT_CACHE_TSMA_NUMBER;
3,289✔
824
    }
825

826
    if (gCtgMgmt.cfg.dbRentSec == 0) {
3,289!
827
      gCtgMgmt.cfg.dbRentSec = CTG_DEFAULT_RENT_SECOND;
3,289✔
828
    }
829

830
    if (gCtgMgmt.cfg.stbRentSec == 0) {
3,289!
831
      gCtgMgmt.cfg.stbRentSec = CTG_DEFAULT_RENT_SECOND;
3,289✔
832
    }
833

834
    if (gCtgMgmt.cfg.viewRentSec == 0) {
3,289!
835
      gCtgMgmt.cfg.viewRentSec = CTG_DEFAULT_RENT_SECOND;
3,289✔
836
    }
837
    
838
    if (gCtgMgmt.cfg.tsmaRentSec == 0) {
3,289!
839
      gCtgMgmt.cfg.tsmaRentSec = CTG_DEFAULT_RENT_SECOND;
3,289✔
840
    }
841
  } else {
842
    gCtgMgmt.cfg.maxDBCacheNum = CTG_DEFAULT_CACHE_DB_NUMBER;
×
843
    gCtgMgmt.cfg.maxTblCacheNum = CTG_DEFAULT_CACHE_TBLMETA_NUMBER;
×
844
    gCtgMgmt.cfg.maxViewCacheNum = CTG_DEFAULT_CACHE_VIEW_NUMBER;
×
845
    gCtgMgmt.cfg.maxTSMACacheNum = CTG_DEFAULT_CACHE_TSMA_NUMBER;
×
846
    gCtgMgmt.cfg.dbRentSec = CTG_DEFAULT_RENT_SECOND;
×
847
    gCtgMgmt.cfg.stbRentSec = CTG_DEFAULT_RENT_SECOND;
×
848
    gCtgMgmt.cfg.viewRentSec = CTG_DEFAULT_RENT_SECOND;
×
849
    gCtgMgmt.cfg.tsmaRentSec = CTG_DEFAULT_RENT_SECOND;
×
850
  }
851

852
  gCtgMgmt.pCluster = taosHashInit(CTG_DEFAULT_CACHE_CLUSTER_NUMBER, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT),
3,289✔
853
                                   false, HASH_ENTRY_LOCK);
854
  if (NULL == gCtgMgmt.pCluster) {
3,289!
855
    qError("taosHashInit %d cluster cache failed", CTG_DEFAULT_CACHE_CLUSTER_NUMBER);
×
856
    CTG_ERR_RET(TSDB_CODE_CTG_INTERNAL_ERROR);
×
857
  }
858

859
  if (tsem_init(&gCtgMgmt.queue.reqSem, 0, 0)) {
3,289!
860
    qError("tsem_init failed, terror:%s", tstrerror(terrno));
×
861
    CTG_ERR_RET(TSDB_CODE_CTG_SYS_ERROR);
×
862
  }
863

864
  gCtgMgmt.queue.head = taosMemoryCalloc(1, sizeof(SCtgQNode));
3,289✔
865
  if (NULL == gCtgMgmt.queue.head) {
3,289!
866
    qError("calloc %d failed", (int32_t)sizeof(SCtgQNode));
×
867
    CTG_ERR_RET(terrno);
×
868
  }
869
  gCtgMgmt.queue.tail = gCtgMgmt.queue.head;
3,289✔
870

871
  gCtgMgmt.jobPool = taosOpenRef(200, ctgFreeJob);
3,289✔
872
  if (gCtgMgmt.jobPool < 0) {
3,289!
873
    qError("taosOpenRef failed, error:%s", tstrerror(terrno));
×
874
    CTG_ERR_RET(terrno);
×
875
  }
876

877
  gCtgMgmt.timer = taosTmrInit(0, 0, 0, "catalog");
3,289✔
878
  if (NULL == gCtgMgmt.timer) {
3,289!
879
    qError("init timer failed, error:%s", tstrerror(terrno));
×
880
    CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
×
881
  }
882

883
  gCtgMgmt.cacheTimer = taosTmrStart(ctgProcessTimerEvent, CTG_DEFAULT_CACHE_MON_MSEC, NULL, gCtgMgmt.timer);
3,289✔
884
  if (NULL == gCtgMgmt.cacheTimer) {
3,289!
885
    qError("start cache timer failed");
×
886
    CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
×
887
  }
888

889
  CTG_ERR_RET(ctgStartUpdateThread());
3,289!
890

891
  qDebug("catalog initialized, maxDb:%u, maxTbl:%u, dbRentSec:%u, stbRentSec:%u", gCtgMgmt.cfg.maxDBCacheNum,
3,289✔
892
         gCtgMgmt.cfg.maxTblCacheNum, gCtgMgmt.cfg.dbRentSec, gCtgMgmt.cfg.stbRentSec);
893

894
  return TSDB_CODE_SUCCESS;
3,289✔
895
}
896

897
int32_t catalogGetHandle(int64_t clusterId, SCatalog** catalogHandle) {
5,915,453✔
898
  if (NULL == catalogHandle) {
5,915,453!
899
    CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT);
×
900
  }
901

902
  CTG_API_ENTER();
5,915,453!
903

904
  if (NULL == gCtgMgmt.pCluster) {
5,915,476!
905
    qError("catalog cluster cache are not ready, clusterId:0x%" PRIx64, clusterId);
×
906
    CTG_API_LEAVE(TSDB_CODE_CTG_NOT_READY);
×
907
  }
908

909
  int32_t   code = 0;
5,915,476✔
910
  SCatalog* clusterCtg = NULL;
5,915,476✔
911

912
  while (true) {
×
913
    SCatalog** ctg = (SCatalog**)taosHashGet(gCtgMgmt.pCluster, (char*)&clusterId, sizeof(clusterId));
5,915,476✔
914

915
    if (ctg && (*ctg)) {
5,915,461!
916
      *catalogHandle = *ctg;
5,912,208✔
917
      CTG_STAT_HIT_INC(CTG_CI_CLUSTER, 1);
5,912,208✔
918
      qDebug("got catalog handle from cache, clusterId:0x%" PRIx64 ", CTG:%p", clusterId, *ctg);
5,912,219✔
919
      CTG_API_LEAVE(TSDB_CODE_SUCCESS);
5,912,220!
920
    }
921

922
    CTG_STAT_NHIT_INC(CTG_CI_CLUSTER, 1);
3,253✔
923

924
    clusterCtg = taosMemoryCalloc(1, sizeof(SCatalog));
3,263✔
925
    if (NULL == clusterCtg) {
3,263!
926
      qError("calloc %d failed", (int32_t)sizeof(SCatalog));
×
927
      CTG_API_LEAVE(terrno);
×
928
    }
929

930
    clusterCtg->clusterId = clusterId;
3,263✔
931

932
    CTG_ERR_JRET(ctgMetaRentInit(&clusterCtg->dbRent, gCtgMgmt.cfg.dbRentSec, CTG_RENT_DB, sizeof(SDbCacheInfo)));
3,263!
933
    CTG_ERR_JRET(ctgMetaRentInit(&clusterCtg->stbRent, gCtgMgmt.cfg.stbRentSec, CTG_RENT_STABLE, sizeof(SSTableVersion)));
3,263!
934
    CTG_ERR_JRET(ctgMetaRentInit(&clusterCtg->viewRent, gCtgMgmt.cfg.viewRentSec, CTG_RENT_VIEW, sizeof(SViewVersion)));
3,263!
935
    CTG_ERR_JRET(ctgMetaRentInit(&clusterCtg->tsmaRent, gCtgMgmt.cfg.tsmaRentSec, CTG_RENT_TSMA, sizeof(STSMAVersion)));
3,263!
936

937
    clusterCtg->dbCache = taosHashInit(gCtgMgmt.cfg.maxDBCacheNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY),
3,263✔
938
                                       false, HASH_ENTRY_LOCK);
939
    if (NULL == clusterCtg->dbCache) {
3,263!
940
      qError("taosHashInit %d dbCache failed", CTG_DEFAULT_CACHE_DB_NUMBER);
×
941
      CTG_ERR_JRET(terrno);
×
942
    }
943

944
    clusterCtg->userCache = taosHashInit(gCtgMgmt.cfg.maxUserCacheNum,
3,263✔
945
                                         taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_ENTRY_LOCK);
946
    if (NULL == clusterCtg->userCache) {
3,263!
947
      qError("taosHashInit %d user cache failed", gCtgMgmt.cfg.maxUserCacheNum);
×
948
      CTG_ERR_JRET(terrno);
×
949
    }
950

951
    code = taosHashPut(gCtgMgmt.pCluster, &clusterId, sizeof(clusterId), &clusterCtg, POINTER_BYTES);
3,263✔
952
    if (code) {
3,263!
953
      if (HASH_NODE_EXIST(code)) {
×
954
        ctgFreeHandleImpl(clusterCtg);
×
955
        continue;
×
956
      }
957

958
      qError("taosHashPut CTG to cache failed, clusterId:0x%" PRIx64, clusterId);
×
959
      CTG_ERR_JRET(TSDB_CODE_CTG_INTERNAL_ERROR);
×
960
    }
961

962
    qDebug("add CTG to cache, clusterId:0x%" PRIx64 ", CTG:%p", clusterId, clusterCtg);
3,263✔
963

964
    break;
3,263✔
965
  }
966

967
  *catalogHandle = clusterCtg;
3,263✔
968

969
  CTG_STAT_NUM_INC(CTG_CI_CLUSTER, 1);
3,263✔
970

971
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
3,263!
972

973
_return:
×
974

975
  ctgFreeHandleImpl(clusterCtg);
×
976

977
  CTG_API_LEAVE(code);
×
978
}
979

980
int32_t catalogGetDBVgVersion(SCatalog* pCtg, const char* dbFName, int32_t* version, int64_t* dbId, int32_t* tableNum, int64_t* pStateTs) {
×
981
  CTG_API_ENTER();
×
982

983
  if (NULL == pCtg || NULL == dbFName || NULL == version || NULL == dbId || NULL == tableNum || NULL == pStateTs) {
×
984
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
985
  }
986

987
  SCtgDBCache* dbCache = NULL;
×
988
  int32_t      code = 0;
×
989

990
  CTG_ERR_JRET(ctgAcquireVgInfoFromCache(pCtg, dbFName, &dbCache));
×
991
  if (NULL == dbCache) {
×
992
    *version = CTG_DEFAULT_INVALID_VERSION;
×
993
    CTG_API_LEAVE(TSDB_CODE_SUCCESS);
×
994
  }
995

996
  *version = dbCache->vgCache.vgInfo->vgVersion;
×
997
  *dbId = dbCache->dbId;
×
998
  *tableNum = dbCache->vgCache.vgInfo->numOfTable;
×
999

1000
  ctgReleaseVgInfoToCache(pCtg, dbCache);
×
1001

1002
  ctgDebug("Got db vgVersion from cache, dbFName:%s, vgVersion:%d", dbFName, *version);
×
1003

1004
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
×
1005

1006
_return:
×
1007

1008
  CTG_API_LEAVE(code);
×
1009
}
1010

1011
int32_t catalogGetDBVgList(SCatalog* pCtg, SRequestConnInfo* pConn, const char* dbFName, SArray** vgroupList) {
1,050✔
1012
  CTG_API_ENTER();
1,050!
1013

1014
  if (NULL == pCtg || NULL == dbFName || NULL == pConn || NULL == vgroupList) {
1,050!
1015
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1016
  }
1017

1018
  SCtgDBCache* dbCache = NULL;
1,050✔
1019
  int32_t      code = 0;
1,050✔
1020
  SArray*      vgList = NULL;
1,050✔
1021
  SHashObj*    vgHash = NULL;
1,050✔
1022
  SDBVgInfo*   vgInfo = NULL;
1,050✔
1023
  CTG_ERR_JRET(ctgGetDBVgInfo(pCtg, pConn, dbFName, &dbCache, &vgInfo, NULL));
1,050!
1024
  if (dbCache) {
1,050!
1025
    vgHash = dbCache->vgCache.vgInfo->vgHash;
1,050✔
1026
  } else {
1027
    vgHash = vgInfo->vgHash;
×
1028
  }
1029

1030
  CTG_ERR_JRET(ctgGenerateVgList(pCtg, vgHash, &vgList));
1,050!
1031

1032
  *vgroupList = vgList;
1,050✔
1033
  vgList = NULL;
1,050✔
1034

1035
_return:
1,050✔
1036

1037
  if (dbCache) {
1,050!
1038
    ctgRUnlockVgInfo(dbCache);
1,050✔
1039
    ctgReleaseDBCache(pCtg, dbCache);
1,050✔
1040
  }
1041

1042
  if (vgInfo) {
1,050!
1043
    freeVgInfo(vgInfo);
×
1044
  }
1045

1046
  CTG_API_LEAVE(code);
1,050!
1047
}
1048

1049
int32_t catalogGetDBVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* dbFName, TAOS_DB_ROUTE_INFO* pInfo) {
×
1050
  CTG_API_ENTER();
×
1051

1052
  if (NULL == pCtg || NULL == dbFName || NULL == pConn || NULL == pInfo) {
×
1053
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1054
  }
1055

1056
  SCtgDBCache* dbCache = NULL;
×
1057
  int32_t      code = 0;
×
1058
  SDBVgInfo*   dbInfo = NULL;
×
1059
  CTG_ERR_JRET(ctgGetDBVgInfo(pCtg, pConn, dbFName, &dbCache, &dbInfo, NULL));
×
1060
  if (dbCache) {
×
1061
    dbInfo = dbCache->vgCache.vgInfo;
×
1062
  }
1063

1064
  pInfo->routeVersion = dbInfo->vgVersion;
×
1065
  pInfo->hashPrefix = dbInfo->hashPrefix;
×
1066
  pInfo->hashSuffix = dbInfo->hashSuffix;
×
1067
  pInfo->hashMethod = dbInfo->hashMethod;
×
1068
  pInfo->vgNum = taosHashGetSize(dbInfo->vgHash);
×
1069
  if (pInfo->vgNum <= 0) {
×
1070
    ctgError("invalid vgNum %d in db %s's vgHash", pInfo->vgNum, dbFName);
×
1071
    CTG_ERR_JRET(TSDB_CODE_CTG_INTERNAL_ERROR);
×
1072
  }
1073

1074
  pInfo->vgHash = taosMemoryCalloc(pInfo->vgNum, sizeof(TAOS_VGROUP_HASH_INFO));
×
1075
  if (NULL == pInfo->vgHash) {
×
1076
    CTG_ERR_JRET(terrno);
×
1077
  }
1078

1079
  SVgroupInfo* vgInfo = NULL;  
×
1080
  int32_t i = 0;
×
1081
  void* pIter = taosHashIterate(dbInfo->vgHash, NULL);
×
1082
  while (pIter) {
×
1083
    vgInfo = pIter;
×
1084

1085
    pInfo->vgHash[i].vgId = vgInfo->vgId;
×
1086
    pInfo->vgHash[i].hashBegin = vgInfo->hashBegin;
×
1087
    pInfo->vgHash[i].hashEnd = vgInfo->hashEnd;
×
1088
    
1089
    pIter = taosHashIterate(dbInfo->vgHash, pIter);
×
1090
    vgInfo = NULL;
×
1091
    ++i;
×
1092
  }
1093

1094
_return:
×
1095

1096
  if (dbCache) {
×
1097
    ctgRUnlockVgInfo(dbCache);
×
1098
    ctgReleaseDBCache(pCtg, dbCache);
×
1099
  } else if (dbInfo) {
×
1100
    freeVgInfo(dbInfo);
×
1101
  }
1102

1103
  CTG_API_LEAVE(code);
×
1104
}
1105

1106
int32_t catalogUpdateDBVgInfo(SCatalog* pCtg, const char* dbFName, uint64_t dbId, SDBVgInfo* dbInfo) {
6,299✔
1107
  CTG_API_ENTER();
6,299!
1108

1109
  int32_t code = 0;
6,299✔
1110

1111
  if (NULL == pCtg || NULL == dbFName || NULL == dbInfo) {
6,299!
1112
    freeVgInfo(dbInfo);
×
1113
    CTG_ERR_JRET(TSDB_CODE_CTG_INVALID_INPUT);
×
1114
  }
1115

1116
  code = ctgUpdateVgroupEnqueue(pCtg, dbFName, dbId, dbInfo, false);
6,299✔
1117

1118
_return:
6,299✔
1119

1120
  CTG_API_LEAVE(code);
6,299!
1121
}
1122

1123
int32_t catalogUpdateDbCfg(SCatalog* pCtg, const char* dbFName, uint64_t dbId, SDbCfgInfo* cfgInfo) {
455✔
1124
  CTG_API_ENTER();
455!
1125

1126
  int32_t code = 0;
455✔
1127

1128
  if (NULL == pCtg || NULL == dbFName || NULL == cfgInfo) {
455!
1129
    freeDbCfgInfo(cfgInfo);
×
1130
    CTG_ERR_JRET(TSDB_CODE_CTG_INVALID_INPUT);
×
1131
  }
1132

1133
  code = ctgUpdateDbCfgEnqueue(pCtg, dbFName, dbId, cfgInfo, false);
455✔
1134

1135
_return:
455✔
1136

1137
  CTG_API_LEAVE(code);
455!
1138
}
1139

1140
int32_t catalogRemoveDB(SCatalog* pCtg, const char* dbFName, uint64_t dbId) {
3,606✔
1141
  CTG_API_ENTER();
3,606!
1142

1143
  int32_t code = 0;
3,606✔
1144

1145
  if (NULL == pCtg || NULL == dbFName) {
3,606!
1146
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1147
  }
1148

1149
  if (NULL == pCtg->dbCache) {
3,606!
1150
    CTG_API_LEAVE(TSDB_CODE_SUCCESS);
×
1151
  }
1152

1153
  CTG_ERR_JRET(ctgDropDbCacheEnqueue(pCtg, dbFName, dbId));
3,606!
1154

1155
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
3,606!
1156

1157
_return:
×
1158

1159
  CTG_API_LEAVE(code);
×
1160
}
1161

1162
int32_t catalogUpdateVgEpSet(SCatalog* pCtg, const char* dbFName, int32_t vgId, SEpSet* epSet) {
790,070✔
1163
  CTG_API_ENTER();
790,070!
1164

1165
  int32_t code = 0;
790,071✔
1166

1167
  if (NULL == pCtg || NULL == dbFName || NULL == epSet) {
790,071!
UNCOV
1168
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1169
  }
1170

1171
  CTG_ERR_JRET(ctgUpdateVgEpsetEnqueue(pCtg, (char*)dbFName, vgId, epSet));
790,071!
1172

1173
_return:
790,070✔
1174

1175
  CTG_API_LEAVE(code);
790,070!
1176
}
1177

1178
int32_t catalogUpdateTableIndex(SCatalog* pCtg, STableIndexRsp* pRsp) {
×
1179
  CTG_API_ENTER();
×
1180

1181
  int32_t code = 0;
×
1182

1183
  if (NULL == pCtg || NULL == pRsp) {
×
1184
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1185
  }
1186

1187
  STableIndex* pIndex = taosMemoryCalloc(1, sizeof(STableIndex));
×
1188
  if (NULL == pIndex) {
×
1189
    CTG_API_LEAVE(terrno);
×
1190
  }
1191

1192
  TAOS_MEMCPY(pIndex, pRsp, sizeof(STableIndex));
×
1193

1194
  CTG_ERR_JRET(ctgUpdateTbIndexEnqueue(pCtg, &pIndex, false));
×
1195

1196
_return:
×
1197

1198
  CTG_API_LEAVE(code);
×
1199
}
1200

1201
int32_t catalogRemoveTableMeta(SCatalog* pCtg, SName* pTableName) {
23,024✔
1202
  CTG_API_ENTER();
23,024!
1203

1204
  CTG_API_LEAVE(ctgRemoveTbMeta(pCtg, pTableName));
23,024!
1205
}
1206

1207
int32_t catalogRemoveStbMeta(SCatalog* pCtg, const char* dbFName, uint64_t dbId, const char* stbName, uint64_t suid) {
527✔
1208
  CTG_API_ENTER();
527!
1209

1210
  int32_t code = 0;
527✔
1211

1212
  if (NULL == pCtg || NULL == dbFName || NULL == stbName) {
527!
1213
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1214
  }
1215

1216
  if (NULL == pCtg->dbCache) {
527!
1217
    CTG_API_LEAVE(TSDB_CODE_SUCCESS);
×
1218
  }
1219

1220
  CTG_ERR_JRET(ctgDropStbMetaEnqueue(pCtg, dbFName, dbId, stbName, suid, true));
527!
1221

1222
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
527!
1223

1224
_return:
×
1225

1226
  CTG_API_LEAVE(code);
×
1227
}
1228

1229
int32_t catalogGetTableMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, STableMeta** pTableMeta) {
13,455✔
1230
  CTG_API_ENTER();
13,455!
1231

1232
  SCtgTbMetaCtx ctx = {0};
13,455✔
1233
  ctx.pName = (SName*)pTableName;
13,455✔
1234
  ctx.flag = CTG_FLAG_UNKNOWN_STB;
13,455✔
1235

1236
  CTG_API_LEAVE(ctgGetTbMeta(pCtg, pConn, &ctx, pTableMeta));
13,455!
1237
}
1238

1239
int32_t catalogGetCachedTableMeta(SCatalog* pCtg, const SName* pTableName, STableMeta** pTableMeta) {
8,354✔
1240
  CTG_API_ENTER();
8,354!
1241

1242
  SCtgTbMetaCtx ctx = {0};
8,354✔
1243
  ctx.pName = (SName*)pTableName;
8,354✔
1244
  ctx.flag = CTG_FLAG_UNKNOWN_STB | CTG_FLAG_ONLY_CACHE;
8,354✔
1245

1246
  CTG_API_LEAVE(ctgGetTbMeta(pCtg, NULL, &ctx, pTableMeta));
8,354!
1247
}
1248

1249

1250
int32_t catalogGetSTableMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
2,909✔
1251
                             STableMeta** pTableMeta) {
1252
  CTG_API_ENTER();
2,909!
1253

1254
  SCtgTbMetaCtx ctx = {0};
2,914✔
1255
  ctx.pName = (SName*)pTableName;
2,914✔
1256
  ctx.flag = CTG_FLAG_STB;
2,914✔
1257

1258
  CTG_API_LEAVE(ctgGetTbMeta(pCtg, pConn, &ctx, pTableMeta));
2,914!
1259
}
1260

1261
int32_t catalogGetCachedSTableMeta(SCatalog* pCtg, const SName* pTableName,          STableMeta** pTableMeta) {
59,465✔
1262
  CTG_API_ENTER();
59,465!
1263

1264
  SCtgTbMetaCtx ctx = {0};
59,465✔
1265
  ctx.pName = (SName*)pTableName;
59,465✔
1266
  ctx.flag = CTG_FLAG_STB | CTG_FLAG_ONLY_CACHE;
59,465✔
1267

1268
  CTG_API_LEAVE(ctgGetTbMeta(pCtg, NULL, &ctx, pTableMeta));
59,465!
1269
}
1270

1271

1272
int32_t catalogUpdateTableMeta(SCatalog* pCtg, STableMetaRsp* pMsg) {
3,350✔
1273
  CTG_API_ENTER();
3,350!
1274

1275
  if (NULL == pCtg || NULL == pMsg) {
3,350!
1276
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1277
  }
1278

1279
  int32_t code = 0;
3,350✔
1280
  CTG_ERR_JRET(ctgUpdateTbMeta(pCtg, pMsg, true));
3,350!
1281

1282
_return:
3,350✔
1283

1284
  CTG_API_LEAVE(code);
3,350!
1285
}
1286

1287
int32_t catalogAsyncUpdateTableMeta(SCatalog* pCtg, STableMetaRsp* pMsg) {
122,002✔
1288
  CTG_API_ENTER();
122,002!
1289

1290
  if (NULL == pCtg || NULL == pMsg) {
122,004!
UNCOV
1291
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1292
  }
1293

1294
  int32_t code = 0;
122,004✔
1295
  CTG_ERR_JRET(ctgUpdateTbMeta(pCtg, pMsg, false));
122,004!
1296

1297
_return:
122,003✔
1298

1299
  CTG_API_LEAVE(code);
122,003!
1300
}
1301

1302

1303
int32_t catalogChkTbMetaVersion(SCatalog* pCtg, SRequestConnInfo* pConn, SArray* pTables) {
610,076✔
1304
  CTG_API_ENTER();
610,076!
1305

1306
  if (NULL == pCtg || NULL == pConn || NULL == pTables) {
610,077!
1307
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1308
  }
1309

1310
  int32_t code = TSDB_CODE_SUCCESS;
610,077✔
1311
  SName   name = {0};
610,077✔
1312
  int32_t sver = 0;
610,077✔
1313
  int32_t tver = 0;
610,077✔
1314
  int32_t tbNum = taosArrayGetSize(pTables);
610,077✔
1315
  for (int32_t i = 0; i < tbNum; ++i) {
1,775,592✔
1316
    STbSVersion* pTb = (STbSVersion*)taosArrayGet(pTables, i);
1,165,515✔
1317
    if (NULL == pTb) {
1,165,515!
1318
      ctgError("fail to get the %dth table, tbNum:%d", i, tbNum);
×
1319
      CTG_ERR_JRET(TSDB_CODE_CTG_INVALID_INPUT);
1!
1320
    }
1321
    
1322
    if (NULL == pTb->tbFName || 0 == pTb->tbFName[0]) {
1,165,516✔
1323
      continue;
6,075✔
1324
    }
1325

1326
    if (tNameFromString(&name, pTb->tbFName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE)) {
1,159,441!
1327
      ctgError("invalid tbFName format, tbFName:%s, idx:%d", pTb->tbFName, i);
×
1328
      CTG_ERR_JRET(TSDB_CODE_CTG_INVALID_INPUT);
×
1329
    }
1330

1331
    if (IS_SYS_DBNAME(name.dbname)) {
1,159,438!
1332
      continue;
×
1333
    }
1334

1335
    int32_t  tbType = 0;
1,159,438✔
1336
    uint64_t suid = 0;
1,159,438✔
1337
    char     stbName[TSDB_TABLE_FNAME_LEN];
1338
    CTG_ERR_JRET(ctgReadTbVerFromCache(pCtg, &name, &sver, &tver, &tbType, &suid, stbName));
1,159,438!
1339
    if ((sver >= 0 && sver < pTb->sver) || (tver >= 0 && tver < pTb->tver)) {
1,159,441✔
1340
      switch (tbType) {
11!
1341
        case TSDB_CHILD_TABLE: {
×
1342
          SName stb = name;
×
1343
          tstrncpy(stb.tname, stbName, sizeof(stb.tname));
×
1344
          CTG_ERR_JRET(ctgRemoveTbMeta(pCtg, &stb));
×
1345
          break;
×
1346
        }
1347
        case TSDB_SUPER_TABLE:
11✔
1348
        case TSDB_NORMAL_TABLE:
1349
          CTG_ERR_JRET(ctgRemoveTbMeta(pCtg, &name));
11!
1350
          break;
11✔
1351
        default:
×
1352
          ctgError("ignore table type %d", tbType);
×
1353
          break;
×
1354
      }
1355
    }
1356
  }
1357

1358
_return:
610,077✔
1359

1360
  CTG_API_LEAVE(code);
610,077!
1361
}
1362

1363
int32_t catalogRefreshDBVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* dbFName) {
15,584✔
1364
  CTG_API_ENTER();
15,584!
1365

1366
  if (NULL == pCtg || NULL == pConn || NULL == dbFName) {
15,584!
1367
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1368
  }
1369

1370
  CTG_API_LEAVE(ctgRefreshDBVgInfo(pCtg, pConn, dbFName));
15,584!
1371
}
1372

1373
int32_t catalogRefreshTableMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, int32_t isSTable) {
128✔
1374
  CTG_API_ENTER();
128!
1375

1376
  if (NULL == pCtg || NULL == pConn || NULL == pTableName) {
128!
1377
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1378
  }
1379

1380
  SCtgTbMetaCtx ctx = {0};
128✔
1381
  ctx.pName = (SName*)pTableName;
128✔
1382
  ctx.flag = CTG_FLAG_FORCE_UPDATE | CTG_FLAG_MAKE_STB(isSTable);
128!
1383
  if (IS_SYS_DBNAME(ctx.pName->dbname)) {
128!
1384
    CTG_FLAG_SET_SYS_DB(ctx.flag);
×
1385
  }
1386

1387
  CTG_API_LEAVE(ctgRefreshTbMeta(pCtg, pConn, &ctx, NULL, true));
128!
1388
}
1389

1390
int32_t catalogRefreshGetTableMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
×
1391
                                   STableMeta** pTableMeta, int32_t isSTable) {
1392
  CTG_API_ENTER();
×
1393

1394
  SCtgTbMetaCtx ctx = {0};
×
1395
  ctx.pName = (SName*)pTableName;
×
1396
  ctx.flag = CTG_FLAG_FORCE_UPDATE | CTG_FLAG_MAKE_STB(isSTable);
×
1397

1398
  CTG_API_LEAVE(ctgGetTbMeta(pCtg, pConn, &ctx, pTableMeta));
×
1399
}
1400

1401
int32_t catalogGetTableDistVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, SArray** pVgList) {
×
1402
  CTG_API_ENTER();
×
1403

1404
  if (NULL == pCtg || NULL == pConn || NULL == pTableName || NULL == pVgList) {
×
1405
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1406
  }
1407

1408
  if (IS_SYS_DBNAME(pTableName->dbname)) {
×
1409
    ctgError("no valid vgInfo for db, dbname:%s", pTableName->dbname);
×
1410
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1411
  }
1412

1413
  CTG_API_LEAVE(ctgGetTbDistVgInfo(pCtg, pConn, (SName*)pTableName, pVgList));
×
1414
}
1415

1416
int32_t catalogGetTableHashVgroup(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
11,481✔
1417
                                  SVgroupInfo* pVgroup) {
1418
  CTG_API_ENTER();
11,481!
1419

1420
  CTG_API_LEAVE(ctgGetTbHashVgroup(pCtg, pConn, pTableName, pVgroup, NULL));
11,481!
1421
}
1422

1423
int32_t catalogGetTablesHashVgId(SCatalog* pCtg, SRequestConnInfo* pConn, int32_t acctId, const char* pDb, const char* pTableName[],
×
1424
                                  int32_t tableNum, int32_t *vgId) {
1425
  CTG_API_ENTER();
×
1426

1427
  CTG_API_LEAVE(ctgGetTbsHashVgId(pCtg, pConn, acctId, pDb, pTableName, tableNum, vgId));
×
1428
}
1429

1430
int32_t catalogGetCachedTableHashVgroup(SCatalog* pCtg, const SName* pTableName,           SVgroupInfo* pVgroup, bool* exists) {
83,170✔
1431
  CTG_API_ENTER();
83,170!
1432

1433
  CTG_API_LEAVE(ctgGetTbHashVgroup(pCtg, NULL, pTableName, pVgroup, exists));
83,170!
1434
}
1435

1436
int32_t catalogGetCachedTableVgMeta(SCatalog* pCtg, const SName* pTableName,          SVgroupInfo* pVgroup, STableMeta** pTableMeta) {
1,679,749✔
1437
  CTG_API_ENTER();
1,679,749!
1438

1439
  CTG_API_LEAVE(ctgGetCachedTbVgMeta(pCtg, pTableName, pVgroup, pTableMeta));
1,679,758!
1440
}
1441

1442

1443
#if 0
1444
int32_t catalogGetAllMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SCatalogReq* pReq, SMetaData* pRsp) {
1445
  CTG_API_ENTER();
1446

1447
  if (NULL == pCtg || NULL == pConn || NULL == pReq || NULL == pRsp) {
1448
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
1449
  }
1450

1451
  int32_t code = 0;
1452
  pRsp->pTableMeta = NULL;
1453

1454
  if (pReq->pTableMeta) {
1455
    int32_t tbNum = (int32_t)taosArrayGetSize(pReq->pTableMeta);
1456
    if (tbNum <= 0) {
1457
      ctgError("empty table name list, tbNum:%d", tbNum);
1458
      CTG_ERR_JRET(TSDB_CODE_CTG_INVALID_INPUT);
1459
    }
1460

1461
    pRsp->pTableMeta = taosArrayInit(tbNum, POINTER_BYTES);
1462
    if (NULL == pRsp->pTableMeta) {
1463
      ctgError("taosArrayInit %d failed", tbNum);
1464
      CTG_ERR_JRET(terrno);
1465
    }
1466

1467
    for (int32_t i = 0; i < tbNum; ++i) {
1468
      SName*        name = taosArrayGet(pReq->pTableMeta, i);
1469
      STableMeta*   pTableMeta = NULL;
1470
      SCtgTbMetaCtx ctx = {0};
1471
      ctx.pName = name;
1472
      ctx.flag = CTG_FLAG_UNKNOWN_STB;
1473

1474
      CTG_ERR_JRET(ctgGetTbMeta(pCtg, pConn, &ctx, &pTableMeta));
1475

1476
      if (NULL == taosArrayPush(pRsp->pTableMeta, &pTableMeta)) {
1477
        ctgError("taosArrayPush failed, idx:%d", i);
1478
        taosMemoryFreeClear(pTableMeta);
1479
        CTG_ERR_JRET(terrno);
1480
      }
1481
    }
1482
  }
1483

1484
  if (pReq->qNodeRequired) {
1485
    pRsp->pQnodeList = taosArrayInit(10, sizeof(SQueryNodeLoad));
1486
    CTG_ERR_JRET(ctgGetQnodeListFromMnode(pCtg, pConn, pRsp->pQnodeList, NULL));
1487
  }
1488

1489
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
1490

1491
_return:
1492

1493
  if (pRsp->pTableMeta) {
1494
    int32_t aSize = taosArrayGetSize(pRsp->pTableMeta);
1495
    for (int32_t i = 0; i < aSize; ++i) {
1496
      STableMeta* pMeta = taosArrayGetP(pRsp->pTableMeta, i);
1497
      taosMemoryFreeClear(pMeta);
1498
    }
1499

1500
    taosArrayDestroy(pRsp->pTableMeta);
1501
    pRsp->pTableMeta = NULL;
1502
  }
1503

1504
  CTG_API_LEAVE(code);
1505
}
1506
#endif
1507

1508
int32_t catalogAsyncGetAllMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SCatalogReq* pReq, catalogCallback fp,
1,086,419✔
1509
                               void* param, int64_t* jobId) {
1510
  CTG_API_ENTER();
1,086,419!
1511

1512
  if (NULL == pCtg || NULL == pConn || NULL == pReq || NULL == fp || NULL == param) {
1,086,442!
1513
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
7!
1514
  }
1515

1516
  int32_t  code = 0;
1,086,435✔
1517
  SCtgJob* pJob = NULL;
1,086,435✔
1518
  CTG_ERR_JRET(ctgInitJob(pCtg, pConn, &pJob, pReq, fp, param));
1,086,435!
1519

1520
  CTG_ERR_JRET(ctgLaunchJob(pJob));
1,086,437!
1521

1522
  // NOTE: here the assignment of jobId is invalid, may over-write the true scheduler created query job.
1523
  //  *jobId = pJob->refId;
1524

1525
_return:
1,086,438✔
1526

1527
  if (pJob) {
1,086,438!
1528
    int32_t code2 = taosReleaseRef(gCtgMgmt.jobPool, pJob->refId);
1,086,439✔
1529
    if (TSDB_CODE_SUCCESS) {
1530
      qError("release catalog job refId %" PRId64 "falied, error:%s", pJob->refId, tstrerror(code2));
1531
    }
1532

1533
    if (code) {
1,086,442!
1534
      code2 = taosRemoveRef(gCtgMgmt.jobPool, pJob->refId);
×
1535
      if (TSDB_CODE_SUCCESS) {
1536
        qError("remove catalog job refId %" PRId64 "falied, error:%s", pJob->refId, tstrerror(code2));
1537
      }
1538
    }
1539
  }
1540

1541
  CTG_API_LEAVE(code);
1,086,442!
1542
}
1543

1544
int32_t catalogGetQnodeList(SCatalog* pCtg, SRequestConnInfo* pConn, SArray* pQnodeList) {
×
1545
  CTG_API_ENTER();
×
1546

1547
  int32_t code = 0;
×
1548
  if (NULL == pCtg || NULL == pConn || NULL == pQnodeList) {
×
1549
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1550
  }
1551

1552
  CTG_CACHE_NHIT_INC(CTG_CI_QNODE, 1);
×
1553
  CTG_ERR_JRET(ctgGetQnodeListFromMnode(pCtg, pConn, pQnodeList, NULL));
×
1554

1555
_return:
×
1556

1557
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
×
1558
}
1559

1560
int32_t catalogGetDnodeList(SCatalog* pCtg, SRequestConnInfo* pConn, SArray** pDnodeList) {
×
1561
  CTG_API_ENTER();
×
1562

1563
  int32_t code = 0;
×
1564
  if (NULL == pCtg || NULL == pConn || NULL == pDnodeList) {
×
1565
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1566
  }
1567

1568
  CTG_CACHE_NHIT_INC(CTG_CI_DNODE, 1);
×
1569
  CTG_ERR_JRET(ctgGetDnodeListFromMnode(pCtg, pConn, pDnodeList, NULL));
×
1570

1571
_return:
×
1572

1573
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
×
1574
}
1575

1576
int32_t catalogGetExpiredSTables(SCatalog* pCtg, SSTableVersion** stables, uint32_t* num) {
32,864✔
1577
  CTG_API_ENTER();
32,864!
1578

1579
  if (NULL == pCtg || NULL == stables || NULL == num) {
32,864!
1580
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1581
  }
1582

1583
  CTG_API_LEAVE(ctgMetaRentGet(&pCtg->stbRent, (void**)stables, num, sizeof(SSTableVersion)));
32,864!
1584
}
1585

1586
int32_t catalogGetExpiredViews(SCatalog* pCtg, SViewVersion** views, uint32_t* num, SDynViewVersion** dynViewVersion) {
32,864✔
1587
  CTG_API_ENTER();
32,864!
1588

1589
  if (NULL == pCtg || NULL == views || NULL == num) {
32,864!
1590
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1591
  }
1592

1593
  *dynViewVersion = taosMemoryMalloc(sizeof(SDynViewVersion));
32,864✔
1594
  if (NULL == *dynViewVersion) {
32,864!
1595
    CTG_API_LEAVE(terrno);
×
1596
  }
1597

1598
  (*dynViewVersion)->svrBootTs = atomic_load_64(&pCtg->dynViewVer.svrBootTs);
32,864✔
1599
  (*dynViewVersion)->dynViewVer = atomic_load_64(&pCtg->dynViewVer.dynViewVer);
32,864✔
1600
  
1601
  CTG_API_LEAVE(ctgMetaRentGet(&pCtg->viewRent, (void**)views, num, sizeof(SViewVersion)));
32,864!
1602
}
1603

1604

1605
int32_t catalogGetExpiredDBs(SCatalog* pCtg, SDbCacheInfo** dbs, uint32_t* num) {
32,864✔
1606
  CTG_API_ENTER();
32,864!
1607

1608
  if (NULL == pCtg || NULL == dbs || NULL == num) {
32,864!
1609
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1610
  }
1611

1612
  CTG_API_LEAVE(ctgMetaRentGet(&pCtg->dbRent, (void**)dbs, num, sizeof(SDbCacheInfo)));
32,864!
1613
}
1614

1615
int32_t catalogGetExpiredUsers(SCatalog* pCtg, SUserAuthVersion** users, uint32_t* num) {
29,427✔
1616
  CTG_API_ENTER();
29,427!
1617

1618
  if (NULL == pCtg || NULL == users || NULL == num) {
29,427!
1619
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1620
  }
1621

1622
  *num = taosHashGetSize(pCtg->userCache);
29,427✔
1623
  if (*num <= 0) {
29,427✔
1624
    CTG_API_LEAVE(TSDB_CODE_SUCCESS);
831!
1625
  }
1626

1627
  *users = taosMemoryCalloc(*num, sizeof(SUserAuthVersion));
28,596✔
1628
  if (NULL == *users) {
28,596!
1629
    ctgError("calloc %d userAuthVersion failed", *num);
×
1630
    CTG_API_LEAVE(terrno);
×
1631
  }
1632

1633
  uint32_t      i = 0;
28,596✔
1634
  SCtgUserAuth* pAuth = taosHashIterate(pCtg->userCache, NULL);
28,596✔
1635
  while (pAuth != NULL) {
29,645!
1636
    size_t len = 0;
29,645✔
1637
    void*  key = taosHashGetKey(pAuth, &len);
29,645✔
1638
    TAOS_STRNCPY((*users)[i].user, key, len);
29,645✔
1639
    (*users)[i].user[len] = 0;
29,645✔
1640
    (*users)[i].version = pAuth->userAuth.version;
29,645✔
1641
    ++i;
29,645✔
1642
    if (i >= *num) {
29,645✔
1643
      taosHashCancelIterate(pCtg->userCache, pAuth);
28,596✔
1644
      break;
28,596✔
1645
    }
1646

1647
    pAuth = taosHashIterate(pCtg->userCache, pAuth);
1,049✔
1648
  }
1649

1650
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
28,596!
1651
}
1652

1653
int32_t catalogGetExpiredTsmas(SCatalog* pCtg, STSMAVersion** tsmas, uint32_t* num) {
32,864✔
1654
  CTG_API_ENTER();
32,864!
1655

1656
  if (!pCtg || !tsmas || !num) {
32,864!
1657
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1658
  }
1659

1660
  CTG_API_LEAVE(ctgMetaRentGet(&pCtg->tsmaRent, (void**)tsmas, num, sizeof(STSMAVersion)));
32,864!
1661
}
1662

1663
int32_t catalogGetDBCfg(SCatalog* pCtg, SRequestConnInfo* pConn, const char* dbFName, SDbCfgInfo* pDbCfg) {
×
1664
  CTG_API_ENTER();
×
1665

1666
  if (NULL == pCtg || NULL == pConn || NULL == dbFName || NULL == pDbCfg) {
×
1667
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1668
  }
1669

1670
  CTG_API_LEAVE(ctgGetDBCfg(pCtg, pConn, dbFName, pDbCfg));
×
1671
}
1672

1673
int32_t catalogGetIndexMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const char* indexName, SIndexInfo* pInfo) {
×
1674
  CTG_API_ENTER();
×
1675

1676
  if (NULL == pCtg || NULL == pConn || NULL == indexName || NULL == pInfo) {
×
1677
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1678
  }
1679

1680
  CTG_API_LEAVE(ctgGetIndexInfoFromMnode(pCtg, pConn, indexName, pInfo, NULL));
×
1681
}
1682

1683
int32_t catalogGetTableIndex(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, SArray** pRes) {
×
1684
  CTG_API_ENTER();
×
1685

1686
  if (NULL == pCtg || NULL == pConn || NULL == pTableName || NULL == pRes) {
×
1687
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1688
  }
1689

1690
  int32_t code = 0;
×
1691
  CTG_ERR_JRET(ctgGetTbIndex(pCtg, pConn, (SName*)pTableName, pRes));
×
1692

1693
_return:
×
1694

1695
  CTG_API_LEAVE(code);
×
1696
}
1697

1698
int32_t catalogGetTableTag(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, SArray** pRes) {
×
1699
  CTG_API_ENTER();
×
1700

1701
  if (NULL == pCtg || NULL == pConn || NULL == pTableName || NULL == pRes) {
×
1702
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1703
  }
1704

1705
  int32_t code = 0;
×
1706
  CTG_ERR_JRET(ctgGetTbTag(pCtg, pConn, (SName*)pTableName, pRes));
×
1707

1708
_return:
×
1709

1710
  CTG_API_LEAVE(code);
×
1711
}
1712

1713
int32_t catalogRefreshGetTableCfg(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, STableCfg** pCfg) {
×
1714
  CTG_API_ENTER();
×
1715

1716
  if (NULL == pCtg || NULL == pConn || NULL == pTableName || NULL == pCfg) {
×
1717
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1718
  }
1719

1720
  int32_t code = 0;
×
1721
  CTG_ERR_JRET(ctgRemoveTbMeta(pCtg, (SName*)pTableName));
×
1722

1723
  CTG_ERR_JRET(ctgGetTbCfg(pCtg, pConn, (SName*)pTableName, pCfg));
×
1724

1725
_return:
×
1726

1727
  CTG_API_LEAVE(code);
×
1728
}
1729

1730
int32_t catalogGetUdfInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* funcName, SFuncInfo* pInfo) {
×
1731
  CTG_API_ENTER();
×
1732

1733
  if (NULL == pCtg || NULL == pConn || NULL == funcName || NULL == pInfo) {
×
1734
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1735
  }
1736

1737
  CTG_CACHE_NHIT_INC(CTG_CI_UDF, 1);
×
1738

1739
  int32_t code = 0;
×
1740
  CTG_ERR_JRET(ctgGetUdfInfoFromMnode(pCtg, pConn, funcName, pInfo, NULL));
×
1741

1742
_return:
×
1743

1744
  CTG_API_LEAVE(code);
×
1745
}
1746

1747
int32_t catalogChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, SUserAuthInfo *pAuth, SUserAuthRes* pRes) {
2,664✔
1748
  CTG_API_ENTER();
2,664!
1749

1750
  if (NULL == pCtg || NULL == pConn || NULL == pAuth || NULL == pRes) {
2,664!
1751
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1752
  }
1753

1754
  int32_t code = 0;
2,664✔
1755
  CTG_ERR_JRET(ctgChkAuth(pCtg, pConn, pAuth, pRes, NULL));
2,664!
1756

1757
_return:
2,664✔
1758

1759
  CTG_API_LEAVE(code);
2,664!
1760
}
1761

1762
int32_t catalogChkAuthFromCache(SCatalog* pCtg, SUserAuthInfo *pAuth,        SUserAuthRes* pRes, bool* exists) {
1,739,671✔
1763
  CTG_API_ENTER();
1,739,671!
1764

1765
  if (NULL == pCtg || NULL == pAuth || NULL == pRes || NULL == exists) {
1,739,676!
1766
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
1!
1767
  }
1768

1769
  int32_t code = 0;
1,739,675✔
1770
  CTG_ERR_JRET(ctgChkAuth(pCtg, NULL, pAuth, pRes, exists));
1,739,675!
1771

1772
_return:
1,739,673✔
1773

1774
  CTG_API_LEAVE(code);
1,739,673!
1775
}
1776

1777

1778
int32_t catalogGetServerVersion(SCatalog* pCtg, SRequestConnInfo* pConn, char** pVersion) {
×
1779
  CTG_API_ENTER();
×
1780

1781
  if (NULL == pCtg || NULL == pConn || NULL == pVersion) {
×
1782
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1783
  }
1784

1785
  CTG_CACHE_NHIT_INC(CTG_CI_SVR_VER, 1);
×
1786

1787
  int32_t code = 0;
×
1788
  CTG_ERR_JRET(ctgGetSvrVerFromMnode(pCtg, pConn, pVersion, NULL));
×
1789

1790
_return:
×
1791

1792
  CTG_API_LEAVE(code);
×
1793
}
1794

1795
int32_t catalogUpdateUserAuthInfo(SCatalog* pCtg, SGetUserAuthRsp* pAuth) {
2,617✔
1796
  CTG_API_ENTER();
2,617!
1797

1798
  if (NULL == pCtg || NULL == pAuth) {
2,617!
1799
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1800
  }
1801

1802
  CTG_API_LEAVE(ctgUpdateUserEnqueue(pCtg, pAuth, false));
2,617!
1803
}
1804

1805
void catalogFreeMetaData(SMetaData * pData) {
426✔
1806
  ctgDestroySMetaData(pData);
426✔
1807
}
426✔
1808

1809
int32_t catalogRemoveViewMeta(SCatalog* pCtg, const char* dbFName, uint64_t dbId, const char* viewName, uint64_t viewId) {
3,692✔
1810
  CTG_API_ENTER();
3,692!
1811

1812
  CTG_API_LEAVE(ctgRemoveViewMeta(pCtg, dbFName, dbId, viewName, viewId));
3,692!
1813
}
1814

1815

1816
int32_t catalogUpdateDynViewVer(SCatalog* pCtg, SDynViewVersion* pVer) {
7✔
1817
  CTG_API_ENTER();
7!
1818

1819
  if (NULL == pCtg || NULL == pVer) {
7!
1820
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1821
  }
1822

1823
  atomic_store_64(&pCtg->dynViewVer.svrBootTs, pVer->svrBootTs);
7✔
1824
  atomic_store_64(&pCtg->dynViewVer.dynViewVer, pVer->dynViewVer);
7✔
1825

1826
  ctgDebug("cluster %" PRIx64 " svrBootTs updated to %" PRId64, pCtg->clusterId, pVer->svrBootTs);
7!
1827
  ctgDebug("cluster %" PRIx64 " dynViewVer updated to %" PRId64, pCtg->clusterId, pVer->dynViewVer);
7!
1828

1829
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
7!
1830
}
1831

1832
int32_t catalogUpdateViewMeta(SCatalog* pCtg, SViewMetaRsp* pMsg) {
×
1833
  CTG_API_ENTER();
×
1834

1835
  if (NULL == pCtg || NULL == pMsg) {
×
1836
    tFreeSViewMetaRsp(pMsg);
×
1837
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1838
  }
1839

1840
  int32_t code = 0;
×
1841
  CTG_ERR_JRET(ctgUpdateViewMetaToCache(pCtg, pMsg, true));
×
1842

1843
_return:
×
1844

1845
  CTG_API_LEAVE(code);
×
1846
}
1847

1848

1849
int32_t catalogAsyncUpdateViewMeta(SCatalog* pCtg, SViewMetaRsp* pMsg) {
×
1850
  CTG_API_ENTER();
×
1851

1852
  if (NULL == pCtg || NULL == pMsg) {
×
1853
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1854
  }
1855

1856
  int32_t code = 0;
×
1857
  CTG_ERR_JRET(ctgUpdateViewMetaToCache(pCtg, pMsg, false));
×
1858

1859
_return:
×
1860

1861
  CTG_API_LEAVE(code);
×
1862
}
1863

1864
int32_t catalogGetViewMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pViewName, STableMeta** pTableMeta) {
×
1865
  CTG_API_ENTER();
×
1866

1867
  CTG_API_LEAVE(TSDB_CODE_OPS_NOT_SUPPORT);
×
1868
}
1869

1870
int32_t catalogAsyncUpdateTSMA(SCatalog* pCtg, STableTSMAInfo** ppTsma, int32_t tsmaVersion) {
235✔
1871
  CTG_API_ENTER();
235!
1872
  if (!pCtg || !ppTsma) {
235!
1873
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1874
  }
1875
  
1876
  int32_t code = 0;
235✔
1877
  CTG_ERR_JRET(ctgUpdateTbTSMAEnqueue(pCtg, ppTsma, tsmaVersion, false));
235!
1878

1879
_return:
235✔
1880

1881
  CTG_API_LEAVE(code);
235!
1882
}
1883

1884
int32_t catalogUpdateTSMA(SCatalog* pCtg, STableTSMAInfo** pTsma) {
×
1885
  CTG_API_ENTER();
×
1886
  if (!pCtg || !pTsma) {
×
1887
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1888
  }
1889
  
1890
  int32_t code = 0;
×
1891
  CTG_ERR_JRET(ctgUpdateTbTSMAEnqueue(pCtg, pTsma, 0, true));
×
1892

1893
_return:
×
1894

1895
  CTG_API_LEAVE(code);
×
1896
}
1897

1898
int32_t catalogRemoveTSMA(SCatalog* pCtg, const STableTSMAInfo* pTsma) {
4✔
1899
  CTG_API_ENTER();
4!
1900
  int32_t code = 0;
4✔
1901

1902
  if (!pCtg || !pTsma) {
4!
1903
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1904
  }
1905

1906
  if (!pCtg->dbCache) {
4!
1907
    goto _return;
×
1908
  }
1909
  
1910
  CTG_ERR_JRET(ctgDropTbTSMAEnqueue(pCtg, pTsma, true));
4!
1911
  
1912
_return:
4✔
1913

1914
  CTG_API_LEAVE(code);
4!
1915
}
1916

1917
int32_t catalogGetTableTsmas(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, SArray** pRes) {
×
1918
  CTG_API_ENTER();
×
1919

1920
  if (NULL == pCtg || NULL == pConn || NULL == pTableName || NULL == pRes) {
×
1921
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1922
  }
1923

1924
  int32_t code = 0;
×
1925
  CTG_ERR_JRET(ctgGetTbTsmas(pCtg, pConn, (SName*)pTableName, pRes));
×
1926

1927
_return:
×
1928

1929
  CTG_API_LEAVE(code);
×
1930
}
1931

1932

1933
int32_t catalogGetTsma(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTsmaName, STableTSMAInfo** pTsma) {
×
1934
  CTG_API_ENTER();
×
1935

1936
  if (!pCtg || !pConn || !pTsmaName) {
×
1937
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1938
  }
1939

1940
  int32_t code = 0;
×
1941
  CTG_ERR_JRET(ctgGetTsma(pCtg, pConn, pTsmaName, pTsma));
×
1942

1943
_return:
×
1944

1945
  CTG_API_LEAVE(code);
×
1946
}
1947

1948
int32_t catalogAsyncUpdateDbTsmaVersion(SCatalog* pCtg, int32_t tsmaVersion, const char* dbFName, int64_t dbId) {
1,942✔
1949
  CTG_API_ENTER();
1,942!
1950
  if (!pCtg || !dbFName) {
1,942!
1951
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
×
1952
  }
1953
  int32_t code = 0;
1,942✔
1954
  CTG_ERR_JRET(ctgUpdateDbTsmaVersionEnqueue(pCtg, tsmaVersion, dbFName, dbId, false));
1,942!
1955

1956
_return:
1,942✔
1957
  CTG_API_LEAVE(code);
1,942!
1958
}
1959

1960
int32_t catalogClearCache(void) {
7,732✔
1961
  CTG_API_ENTER_NOLOCK();
7,732!
1962

1963
  qInfo("start to clear catalog cache");
7,732!
1964

1965
  if (NULL == gCtgMgmt.pCluster) {
7,732!
1966
    CTG_API_LEAVE_NOLOCK(TSDB_CODE_SUCCESS);
×
1967
  }
1968

1969
  int32_t code = ctgClearCacheEnqueue(NULL, false, false, false, true);
7,732✔
1970

1971
  qInfo("clear catalog cache end, code: %s", tstrerror(code));
7,732!
1972

1973
  CTG_API_LEAVE_NOLOCK(code);
7,732!
1974
}
1975

1976
void catalogDestroy(void) {
3,289✔
1977
  qInfo("start to destroy catalog");
3,289!
1978

1979
  if (NULL == gCtgMgmt.pCluster || atomic_load_8((int8_t*)&gCtgMgmt.exit)) {
3,289!
1980
    return;
×
1981
  }
1982

1983
  if (gCtgMgmt.cacheTimer) {
3,289!
1984
    if (taosTmrStop(gCtgMgmt.cacheTimer)) {
3,289!
1985
      qTrace("stop catalog cache timer may failed");
3,289✔
1986
    }
1987
    gCtgMgmt.cacheTimer = NULL;
3,289✔
1988
    taosTmrCleanUp(gCtgMgmt.timer);
3,289✔
1989
    gCtgMgmt.timer = NULL;
3,289✔
1990
  }
1991

1992
  atomic_store_8((int8_t*)&gCtgMgmt.exit, true);
3,289✔
1993

1994
  if (!taosCheckCurrentInDll()) {
3,289!
1995
    (void)ctgClearCacheEnqueue(NULL, false, true, true, true);
3,289✔
1996
    (void)taosThreadJoin(gCtgMgmt.updateThread, NULL);
3,289✔
1997
  }
1998

1999
  taosHashCleanup(gCtgMgmt.pCluster);
3,289✔
2000
  gCtgMgmt.pCluster = NULL;
3,289✔
2001

2002
  qInfo("catalog destroyed");
3,289!
2003
}
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