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

H
Haojun Liao 已提交
16
#include "catalogInt.h"
X
Xiaoyu Wang 已提交
17
#include "query.h"
18
#include "systable.h"
X
Xiaoyu Wang 已提交
19
#include "tname.h"
D
dapan1121 已提交
20
#include "tref.h"
X
Xiaoyu Wang 已提交
21
#include "trpc.h"
22

D
dapan 已提交
23
SCatalogMgmt gCtgMgmt = {0};
D
dapan1121 已提交
24

H
Hongze Cheng 已提交
25 26
int32_t ctgGetDBVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* dbFName, SCtgDBCache** dbCache,
                       SDBVgInfo** pInfo) {
D
dapan1121 已提交
27
  int32_t code = 0;
D
dapan1121 已提交
28

D
dapan1121 已提交
29
  CTG_ERR_RET(ctgAcquireVgInfoFromCache(pCtg, dbFName, dbCache));
D
dapan1121 已提交
30

D
dapan1121 已提交
31
  if (*dbCache) {
D
dapan1121 已提交
32
    return TSDB_CODE_SUCCESS;
D
dapan1121 已提交
33 34
  }

X
Xiaoyu Wang 已提交
35
  SUseDbOutput     DbOut = {0};
D
dapan1121 已提交
36 37
  SBuildUseDBInput input = {0};

D
dapan1121 已提交
38
  tstrncpy(input.db, dbFName, tListLen(input.db));
D
dapan1121 已提交
39
  input.vgVersion = CTG_DEFAULT_INVALID_VERSION;
H
Haojun Liao 已提交
40

D
dapan1121 已提交
41
  CTG_ERR_RET(ctgGetDBVgInfoFromMnode(pCtg, pConn, &input, &DbOut, NULL));
D
dapan1121 已提交
42

D
dapan 已提交
43
  CTG_ERR_JRET(ctgCloneVgInfo(DbOut.dbVgroup, pInfo));
D
dapan1121 已提交
44

D
dapan1121 已提交
45
  CTG_ERR_RET(ctgUpdateVgroupEnqueue(pCtg, dbFName, DbOut.dbId, DbOut.dbVgroup, false));
D
dapan 已提交
46

D
dapan1121 已提交
47
  return TSDB_CODE_SUCCESS;
D
dapan 已提交
48 49 50

_return:

wafwerar's avatar
wafwerar 已提交
51
  taosMemoryFreeClear(*pInfo);
D
dapan 已提交
52
  *pInfo = DbOut.dbVgroup;
X
Xiaoyu Wang 已提交
53

D
dapan 已提交
54
  CTG_RET(code);
D
dapan1121 已提交
55 56
}

H
Hongze Cheng 已提交
57 58
int32_t ctgRefreshDBVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* dbFName) {
  int32_t      code = 0;
D
dapan1121 已提交
59
  SCtgDBCache* dbCache = NULL;
D
dapan1121 已提交
60

D
dapan1121 已提交
61
  CTG_ERR_RET(ctgAcquireVgInfoFromCache(pCtg, dbFName, &dbCache));
D
dapan1121 已提交
62

X
Xiaoyu Wang 已提交
63
  SUseDbOutput     DbOut = {0};
D
dapan1121 已提交
64 65 66
  SBuildUseDBInput input = {0};
  tstrncpy(input.db, dbFName, tListLen(input.db));

D
dapan1121 已提交
67
  if (NULL != dbCache) {
D
dapan1121 已提交
68
    input.dbId = dbCache->dbId;
D
dapan1121 已提交
69

D
dapan1121 已提交
70
    ctgReleaseVgInfoToCache(pCtg, dbCache);
D
dapan1121 已提交
71
  }
X
Xiaoyu Wang 已提交
72

D
dapan1121 已提交
73 74
  input.vgVersion = CTG_DEFAULT_INVALID_VERSION;
  input.numOfTable = 0;
D
dapan1121 已提交
75

D
dapan1121 已提交
76
  code = ctgGetDBVgInfoFromMnode(pCtg, pConn, &input, &DbOut, NULL);
D
dapan1121 已提交
77
  if (code) {
D
dapan1121 已提交
78
    if (CTG_DB_NOT_EXIST(code) && (NULL != dbCache)) {
D
dapan1121 已提交
79
      ctgDebug("db no longer exist, dbFName:%s, dbId:0x%" PRIx64, input.db, input.dbId);
D
dapan1121 已提交
80
      ctgDropDbCacheEnqueue(pCtg, input.db, input.dbId);
D
dapan1121 已提交
81 82 83 84 85
    }

    CTG_ERR_RET(code);
  }

D
dapan1121 已提交
86
  CTG_ERR_RET(ctgUpdateVgroupEnqueue(pCtg, dbFName, DbOut.dbId, DbOut.dbVgroup, true));
D
dapan 已提交
87

D
dapan1121 已提交
88 89 90
  return TSDB_CODE_SUCCESS;
}

H
Hongze Cheng 已提交
91 92
int32_t ctgRefreshTbMeta(SCatalog* pCtg, SRequestConnInfo* pConn, SCtgTbMetaCtx* ctx, STableMetaOutput** pOutput,
                         bool syncReq) {
D
dapan1121 已提交
93
  SVgroupInfo vgroupInfo = {0};
X
Xiaoyu Wang 已提交
94
  int32_t     code = 0;
D
dapan1121 已提交
95

D
dapan1121 已提交
96
  if (!CTG_FLAG_IS_SYS_DB(ctx->flag)) {
D
dapan1121 已提交
97
    CTG_ERR_RET(ctgGetTbHashVgroup(pCtg, pConn, ctx->pName, &vgroupInfo));
D
dapan1121 已提交
98
  }
D
dapan1121 已提交
99

D
dapan1121 已提交
100
  STableMetaOutput  moutput = {0};
X
Xiaoyu Wang 已提交
101
  STableMetaOutput* output = taosMemoryCalloc(1, sizeof(STableMetaOutput));
D
dapan1121 已提交
102 103
  if (NULL == output) {
    ctgError("malloc %d failed", (int32_t)sizeof(STableMetaOutput));
D
dapan1121 已提交
104
    CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
D
dapan1121 已提交
105
  }
D
dapan1121 已提交
106

D
dapan1121 已提交
107 108
  if (CTG_FLAG_IS_SYS_DB(ctx->flag)) {
    ctgDebug("will refresh tbmeta, supposed in information_schema, tbName:%s", tNameGetTableName(ctx->pName));
D
dapan1121 已提交
109

H
Hongze Cheng 已提交
110 111
    CTG_ERR_JRET(
        ctgGetTbMetaFromMnodeImpl(pCtg, pConn, (char*)ctx->pName->dbname, (char*)ctx->pName->tname, output, NULL));
D
dapan1121 已提交
112 113
  } else if (CTG_FLAG_IS_STB(ctx->flag)) {
    ctgDebug("will refresh tbmeta, supposed to be stb, tbName:%s", tNameGetTableName(ctx->pName));
D
dapan1121 已提交
114 115

    // if get from mnode failed, will not try vnode
D
dapan1121 已提交
116
    CTG_ERR_JRET(ctgGetTbMetaFromMnode(pCtg, pConn, ctx->pName, output, NULL));
D
dapan1121 已提交
117

D
dapan1121 已提交
118
    if (CTG_IS_META_NULL(output->metaType)) {
D
dapan1121 已提交
119
      CTG_ERR_JRET(ctgGetTbMetaFromVnode(pCtg, pConn, ctx->pName, &vgroupInfo, output, NULL));
D
dapan1121 已提交
120 121
    }
  } else {
X
Xiaoyu Wang 已提交
122 123
    ctgDebug("will refresh tbmeta, not supposed to be stb, tbName:%s, flag:%d", tNameGetTableName(ctx->pName),
             ctx->flag);
D
dapan1121 已提交
124 125

    // if get from vnode failed or no table meta, will not try mnode
D
dapan1121 已提交
126
    CTG_ERR_JRET(ctgGetTbMetaFromVnode(pCtg, pConn, ctx->pName, &vgroupInfo, output, NULL));
D
dapan1121 已提交
127

D
dapan1121 已提交
128
    if (CTG_IS_META_TABLE(output->metaType) && TSDB_SUPER_TABLE == output->tbMeta->tableType) {
D
dapan1121 已提交
129
      ctgDebug("will continue to refresh tbmeta since got stb, tbName:%s", tNameGetTableName(ctx->pName));
D
dapan1121 已提交
130

wafwerar's avatar
wafwerar 已提交
131
      taosMemoryFreeClear(output->tbMeta);
H
Hongze Cheng 已提交
132

D
dapan1121 已提交
133
      CTG_ERR_JRET(ctgGetTbMetaFromMnodeImpl(pCtg, pConn, output->dbFName, output->tbName, output, NULL));
D
dapan1121 已提交
134
    } else if (CTG_IS_META_BOTH(output->metaType)) {
D
dapan1121 已提交
135
      int32_t exist = 0;
D
dapan1121 已提交
136 137
      if (!CTG_FLAG_IS_FORCE_UPDATE(ctx->flag)) {
        CTG_ERR_JRET(ctgTbMetaExistInCache(pCtg, output->dbFName, output->tbName, &exist));
D
dapan1121 已提交
138
      }
H
Haojun Liao 已提交
139

D
dapan1121 已提交
140
      if (0 == exist) {
D
dapan1121 已提交
141
        CTG_ERR_JRET(ctgGetTbMetaFromMnodeImpl(pCtg, pConn, output->dbFName, output->tbName, &moutput, NULL));
D
dapan1121 已提交
142

D
dapan1121 已提交
143
        if (CTG_IS_META_NULL(moutput.metaType)) {
D
dapan1121 已提交
144
          SET_META_TYPE_NULL(output->metaType);
D
dapan1121 已提交
145
        }
X
Xiaoyu Wang 已提交
146

wafwerar's avatar
wafwerar 已提交
147
        taosMemoryFreeClear(output->tbMeta);
D
dapan1121 已提交
148
        output->tbMeta = moutput.tbMeta;
D
dapan1121 已提交
149 150
        moutput.tbMeta = NULL;
      } else {
wafwerar's avatar
wafwerar 已提交
151
        taosMemoryFreeClear(output->tbMeta);
X
Xiaoyu Wang 已提交
152 153

        SET_META_TYPE_CTABLE(output->metaType);
D
dapan1121 已提交
154
      }
D
dapan1121 已提交
155 156 157
    }
  }

D
dapan1121 已提交
158
  if (CTG_IS_META_NULL(output->metaType)) {
D
dapan1121 已提交
159 160
    ctgError("no tbmeta got, tbNmae:%s", tNameGetTableName(ctx->pName));
    ctgRemoveTbMetaFromCache(pCtg, ctx->pName, false);
D
dapan1121 已提交
161 162 163
    CTG_ERR_JRET(CTG_ERR_CODE_TABLE_NOT_EXIST);
  }

D
dapan 已提交
164
  if (CTG_IS_META_TABLE(output->metaType)) {
X
Xiaoyu Wang 已提交
165 166
    ctgDebug("tbmeta got, dbFName:%s, tbName:%s, tbType:%d", output->dbFName, output->tbName,
             output->tbMeta->tableType);
D
dapan 已提交
167
  } else {
X
Xiaoyu Wang 已提交
168 169
    ctgDebug("tbmeta got, dbFName:%s, tbName:%s, tbType:%d, stbMetaGot:%d", output->dbFName, output->ctbName,
             output->ctbMeta.tableType, CTG_IS_META_BOTH(output->metaType));
D
dapan 已提交
170 171
  }

D
dapan1121 已提交
172 173
  if (pOutput) {
    CTG_ERR_JRET(ctgCloneMetaOutput(output, pOutput));
D
dapan1121 已提交
174
  }
D
dapan1121 已提交
175

D
dapan1121 已提交
176 177 178
  code = ctgUpdateTbMetaEnqueue(pCtg, output, syncReq);
  output = NULL;
  CTG_ERR_JRET(code);
D
dapan1121 已提交
179 180 181

  return TSDB_CODE_SUCCESS;

D
dapan1121 已提交
182 183
_return:

D
dapan1121 已提交
184 185 186 187 188
  if (output) {
    taosMemoryFreeClear(output->tbMeta);
    taosMemoryFreeClear(output);
  }
  
D
dapan1121 已提交
189 190 191
  CTG_RET(code);
}

H
Hongze Cheng 已提交
192 193 194
int32_t ctgGetTbMeta(SCatalog* pCtg, SRequestConnInfo* pConn, SCtgTbMetaCtx* ctx, STableMeta** pTableMeta) {
  int32_t           code = 0;
  STableMetaOutput* output = NULL;
D
dapan1121 已提交
195

D
dapan1121 已提交
196
  CTG_ERR_RET(ctgGetTbMetaFromCache(pCtg, pConn, ctx, pTableMeta));
D
dapan1121 已提交
197 198 199
  if (*pTableMeta) {
    goto _return;
  }
H
Haojun Liao 已提交
200

D
dapan1121 已提交
201
  while (true) {
D
dapan1121 已提交
202
    CTG_ERR_JRET(ctgRefreshTbMeta(pCtg, pConn, ctx, &output, false));
D
dapan1121 已提交
203

D
dapan1121 已提交
204 205 206
    if (CTG_IS_META_TABLE(output->metaType)) {
      *pTableMeta = output->tbMeta;
      goto _return;
D
dapan 已提交
207
    }
D
dapan1121 已提交
208 209 210

    if (CTG_IS_META_BOTH(output->metaType)) {
      memcpy(output->tbMeta, &output->ctbMeta, sizeof(output->ctbMeta));
X
Xiaoyu Wang 已提交
211

D
dapan1121 已提交
212 213 214 215 216 217 218 219
      *pTableMeta = output->tbMeta;
      goto _return;
    }

    if ((!CTG_IS_META_CTABLE(output->metaType)) || output->tbMeta) {
      ctgError("invalid metaType:%d", output->metaType);
      taosMemoryFreeClear(output->tbMeta);
      CTG_ERR_JRET(TSDB_CODE_CTG_INTERNAL_ERROR);
D
dapan 已提交
220 221
    }

D
dapan1121 已提交
222
    // HANDLE ONLY CHILD TABLE META
D
dapan1121 已提交
223

D
dapan1121 已提交
224
    taosMemoryFreeClear(output->tbMeta);
D
dapan 已提交
225

D
dapan1121 已提交
226 227 228 229 230
    SName stbName = *ctx->pName;
    strcpy(stbName.tname, output->tbName);
    SCtgTbMetaCtx stbCtx = {0};
    stbCtx.flag = ctx->flag;
    stbCtx.pName = &stbName;
X
Xiaoyu Wang 已提交
231

D
dapan1121 已提交
232 233 234 235 236
    CTG_ERR_JRET(ctgReadTbMetaFromCache(pCtg, &stbCtx, pTableMeta));
    if (NULL == *pTableMeta) {
      ctgDebug("stb no longer exist, dbFName:%s, tbName:%s", output->dbFName, ctx->pName->tname);
      continue;
    }
D
dapan 已提交
237

D
dapan1121 已提交
238
    memcpy(*pTableMeta, &output->ctbMeta, sizeof(output->ctbMeta));
D
dapan 已提交
239

D
dapan1121 已提交
240 241
    break;
  }
D
dapan 已提交
242

D
dapan1121 已提交
243
_return:
D
dapan 已提交
244

D
dapan1121 已提交
245 246 247 248 249 250 251
  if (CTG_TABLE_NOT_EXIST(code) && ctx->tbInfo.inCache) {
    char dbFName[TSDB_DB_FNAME_LEN] = {0};
    if (CTG_FLAG_IS_SYS_DB(ctx->flag)) {
      strcpy(dbFName, ctx->pName->dbname);
    } else {
      tNameGetFullDbName(ctx->pName, dbFName);
    }
D
dapan 已提交
252

D
dapan1121 已提交
253
    if (TSDB_SUPER_TABLE == ctx->tbInfo.tbType) {
D
dapan1121 已提交
254
      ctgDropStbMetaEnqueue(pCtg, dbFName, ctx->tbInfo.dbId, ctx->pName->tname, ctx->tbInfo.suid, false);
D
dapan1121 已提交
255
    } else {
D
dapan1121 已提交
256
      ctgDropTbMetaEnqueue(pCtg, dbFName, ctx->tbInfo.dbId, ctx->pName->tname, false);
D
dapan1121 已提交
257 258
    }
  }
D
dapan 已提交
259

D
dapan1121 已提交
260
  taosMemoryFreeClear(output);
D
dapan 已提交
261

D
dapan1121 已提交
262 263 264 265
  if (*pTableMeta) {
    ctgDebug("tbmeta returned, tbName:%s, tbType:%d", ctx->pName->tname, (*pTableMeta)->tableType);
    ctgdShowTableMeta(pCtg, ctx->pName->tname, *pTableMeta);
  }
D
dapan 已提交
266 267 268 269

  CTG_RET(code);
}

X
Xiaoyu Wang 已提交
270 271
int32_t ctgUpdateTbMeta(SCatalog* pCtg, STableMetaRsp* rspMsg, bool syncOp) {
  STableMetaOutput* output = taosMemoryCalloc(1, sizeof(STableMetaOutput));
D
dapan1121 已提交
272 273
  if (NULL == output) {
    ctgError("malloc %d failed", (int32_t)sizeof(STableMetaOutput));
D
dapan1121 已提交
274
    CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
D
dapan1121 已提交
275
  }
X
Xiaoyu Wang 已提交
276

D
dapan1121 已提交
277 278 279 280 281
  int32_t code = 0;

  strcpy(output->dbFName, rspMsg->dbFName);

  output->dbId = rspMsg->dbId;
X
Xiaoyu Wang 已提交
282

283 284
  if (TSDB_CHILD_TABLE == rspMsg->tableType && NULL == rspMsg->pSchemas) {
    strcpy(output->ctbName, rspMsg->tbName);
X
Xiaoyu Wang 已提交
285

286 287 288 289 290 291 292 293 294 295
    SET_META_TYPE_CTABLE(output->metaType);

    CTG_ERR_JRET(queryCreateCTableMetaFromMsg(rspMsg, &output->ctbMeta));
  } else {
    strcpy(output->tbName, rspMsg->tbName);

    SET_META_TYPE_TABLE(output->metaType);

    CTG_ERR_JRET(queryCreateTableMetaFromMsg(rspMsg, rspMsg->tableType == TSDB_SUPER_TABLE, &output->tbMeta));
  }
D
dapan1121 已提交
296

D
dapan1121 已提交
297 298 299
  code = ctgUpdateTbMetaEnqueue(pCtg, output, syncOp);
  output = NULL;
  CTG_ERR_JRET(code);
D
dapan1121 已提交
300 301

  return TSDB_CODE_SUCCESS;
X
Xiaoyu Wang 已提交
302

D
dapan1121 已提交
303 304
_return:

D
dapan1121 已提交
305 306 307 308 309
  if (output) {
    taosMemoryFreeClear(output->tbMeta);
    taosMemoryFreeClear(output);
  }
  
D
dapan1121 已提交
310 311 312
  CTG_RET(code);
}

H
Hongze Cheng 已提交
313 314 315
int32_t ctgChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, const char* user, const char* dbFName, AUTH_TYPE type,
                   bool* pass) {
  bool    inCache = false;
D
dapan1121 已提交
316
  int32_t code = 0;
X
Xiaoyu Wang 已提交
317

D
dapan1121 已提交
318
  *pass = false;
H
Hongze Cheng 已提交
319

D
dapan1121 已提交
320
  CTG_ERR_RET(ctgChkAuthFromCache(pCtg, (char*)user, (char*)dbFName, type, &inCache, pass));
D
dapan1121 已提交
321

D
dapan1121 已提交
322 323 324
  if (inCache) {
    return TSDB_CODE_SUCCESS;
  }
D
dapan1121 已提交
325

D
dapan1121 已提交
326
  SGetUserAuthRsp authRsp = {0};
D
dapan1121 已提交
327
  CTG_ERR_RET(ctgGetUserDbAuthFromMnode(pCtg, pConn, user, &authRsp, NULL));
H
Hongze Cheng 已提交
328

D
dapan1121 已提交
329 330 331
  if (authRsp.superAuth) {
    *pass = true;
    goto _return;
D
dapan1121 已提交
332 333
  }

D
dapan1121 已提交
334 335 336 337
  if (authRsp.createdDbs && taosHashGet(authRsp.createdDbs, dbFName, strlen(dbFName))) {
    *pass = true;
    goto _return;
  }
D
dapan1121 已提交
338

D
dapan1121 已提交
339 340 341 342 343
  if (type == AUTH_TYPE_READ && authRsp.readDbs && taosHashGet(authRsp.readDbs, dbFName, strlen(dbFName))) {
    *pass = true;
  } else if (type == AUTH_TYPE_WRITE && authRsp.writeDbs && taosHashGet(authRsp.writeDbs, dbFName, strlen(dbFName))) {
    *pass = true;
  }
D
dapan1121 已提交
344

D
dapan1121 已提交
345
_return:
D
dapan1121 已提交
346

D
dapan1121 已提交
347
  ctgUpdateUserEnqueue(pCtg, &authRsp, false);
D
dapan1121 已提交
348

D
dapan1121 已提交
349 350 351
  return TSDB_CODE_SUCCESS;
}

H
Hongze Cheng 已提交
352
int32_t ctgGetTbType(SCatalog* pCtg, SRequestConnInfo* pConn, SName* pTableName, int32_t* tbType) {
D
dapan1121 已提交
353 354 355 356 357 358 359
  char dbFName[TSDB_DB_FNAME_LEN];
  tNameGetFullDbName(pTableName, dbFName);
  CTG_ERR_RET(ctgReadTbTypeFromCache(pCtg, dbFName, pTableName->tname, tbType));
  if (*tbType > 0) {
    return TSDB_CODE_SUCCESS;
  }

H
Hongze Cheng 已提交
360
  STableMeta*   pMeta = NULL;
D
dapan1121 已提交
361 362 363 364
  SCtgTbMetaCtx ctx = {0};
  ctx.pName = (SName*)pTableName;
  ctx.flag = CTG_FLAG_UNKNOWN_STB;
  CTG_ERR_RET(ctgGetTbMeta(pCtg, pConn, &ctx, &pMeta));
D
dapan1121 已提交
365 366 367 368 369 370 371

  *tbType = pMeta->tableType;
  taosMemoryFree(pMeta);

  return TSDB_CODE_SUCCESS;
}

H
Hongze Cheng 已提交
372
int32_t ctgGetTbIndex(SCatalog* pCtg, SRequestConnInfo* pConn, SName* pTableName, SArray** pRes) {
D
dapan1121 已提交
373 374 375 376 377
  CTG_ERR_RET(ctgReadTbIndexFromCache(pCtg, pTableName, pRes));
  if (*pRes) {
    return TSDB_CODE_SUCCESS;
  }

H
Hongze Cheng 已提交
378
  STableIndex* pIndex = taosMemoryCalloc(1, sizeof(STableIndex));
D
dapan1121 已提交
379 380 381
  if (NULL == pIndex) {
    CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
  }
H
Hongze Cheng 已提交
382

D
dapan1121 已提交
383 384 385 386 387 388
  int32_t code = ctgGetTbIndexFromMnode(pCtg, pConn, (SName*)pTableName, pIndex, NULL);
  if (TSDB_CODE_MND_DB_INDEX_NOT_EXIST == code) {
    code = 0;
    goto _return;
  }
  CTG_ERR_JRET(code);
H
Hongze Cheng 已提交
389

D
dapan1121 已提交
390 391 392 393 394 395
  SArray* pInfo = NULL;
  CTG_ERR_JRET(ctgCloneTableIndex(pIndex->pIndex, &pInfo));

  *pRes = pInfo;

  CTG_ERR_JRET(ctgUpdateTbIndexEnqueue(pCtg, &pIndex, false));
D
dapan1121 已提交
396 397

  return TSDB_CODE_SUCCESS;
D
dapan1121 已提交
398 399 400 401 402 403 404 405 406 407

_return:

  tFreeSTableIndexRsp(pIndex);
  taosMemoryFree(pIndex);

  taosArrayDestroyEx(*pRes, tFreeSTableIndexInfo);
  *pRes = NULL;

  CTG_RET(code);
D
dapan1121 已提交
408 409
}

H
Hongze Cheng 已提交
410
int32_t ctgGetTbCfg(SCatalog* pCtg, SRequestConnInfo* pConn, SName* pTableName, STableCfg** pCfg) {
D
dapan1121 已提交
411 412 413 414 415 416 417
  int32_t tbType = 0;
  CTG_ERR_RET(ctgGetTbType(pCtg, pConn, pTableName, &tbType));

  if (TSDB_SUPER_TABLE == tbType) {
    CTG_ERR_RET(ctgGetTableCfgFromMnode(pCtg, pConn, pTableName, pCfg, NULL));
  } else {
    SVgroupInfo vgroupInfo = {0};
D
dapan1121 已提交
418
    CTG_ERR_RET(ctgGetTbHashVgroup(pCtg, pConn, pTableName, &vgroupInfo));
D
dapan1121 已提交
419 420 421 422 423
    CTG_ERR_RET(ctgGetTableCfgFromVnode(pCtg, pConn, pTableName, &vgroupInfo, pCfg, NULL));
  }

  CTG_RET(TSDB_CODE_SUCCESS);
}
D
dapan1121 已提交
424

H
Hongze Cheng 已提交
425 426 427 428 429 430 431
int32_t ctgGetTbDistVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, SName* pTableName, SArray** pVgList) {
  STableMeta*   tbMeta = NULL;
  int32_t       code = 0;
  SVgroupInfo   vgroupInfo = {0};
  SCtgDBCache*  dbCache = NULL;
  SArray*       vgList = NULL;
  SDBVgInfo*    vgInfo = NULL;
D
dapan1121 已提交
432 433 434
  SCtgTbMetaCtx ctx = {0};
  ctx.pName = pTableName;
  ctx.flag = CTG_FLAG_UNKNOWN_STB;
D
dapan1121 已提交
435 436

  *pVgList = NULL;
H
Hongze Cheng 已提交
437

D
dapan1121 已提交
438
  CTG_ERR_JRET(ctgGetTbMeta(pCtg, pConn, &ctx, &tbMeta));
D
dapan1121 已提交
439 440 441 442

  char db[TSDB_DB_FNAME_LEN] = {0};
  tNameGetFullDbName(pTableName, db);

H
Hongze Cheng 已提交
443
  SHashObj* vgHash = NULL;
D
dapan1121 已提交
444
  CTG_ERR_JRET(ctgGetDBVgInfo(pCtg, pConn, db, &dbCache, &vgInfo));
D
dapan1121 已提交
445 446

  if (dbCache) {
D
dapan1121 已提交
447
    vgHash = dbCache->vgCache.vgInfo->vgHash;
D
dapan1121 已提交
448 449 450 451 452 453 454 455 456 457
  } else {
    vgHash = vgInfo->vgHash;
  }

  if (tbMeta->tableType == TSDB_SUPER_TABLE) {
    CTG_ERR_JRET(ctgGenerateVgList(pCtg, vgHash, pVgList));
  } else {
    // USE HASH METHOD INSTEAD OF VGID IN TBMETA
    ctgError("invalid method to get none stb vgInfo, tbType:%d", tbMeta->tableType);
    CTG_ERR_JRET(TSDB_CODE_CTG_INVALID_INPUT);
X
Xiaoyu Wang 已提交
458

D
dapan1121 已提交
459 460 461 462 463 464 465 466 467 468
#if 0  
    int32_t vgId = tbMeta->vgId;
    if (taosHashGetDup(vgHash, &vgId, sizeof(vgId), &vgroupInfo) != 0) {
      ctgWarn("table's vgId not found in vgroup list, vgId:%d, tbName:%s", vgId, tNameGetTableName(pTableName));
      CTG_ERR_JRET(TSDB_CODE_CTG_VG_META_MISMATCH);
    }

    vgList = taosArrayInit(1, sizeof(SVgroupInfo));
    if (NULL == vgList) {
      ctgError("taosArrayInit %d failed", (int32_t)sizeof(SVgroupInfo));
D
dapan1121 已提交
469
      CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);    
D
dapan1121 已提交
470 471 472 473 474 475 476 477 478
    }

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

    *pVgList = vgList;
    vgList = NULL;
X
Xiaoyu Wang 已提交
479
#endif
D
dapan1121 已提交
480 481 482 483 484
  }

_return:

  if (dbCache) {
D
dapan1121 已提交
485
    ctgRUnlockVgInfo(dbCache);
D
dapan1121 已提交
486 487 488
    ctgReleaseDBCache(pCtg, dbCache);
  }

wafwerar's avatar
wafwerar 已提交
489
  taosMemoryFreeClear(tbMeta);
D
dapan1121 已提交
490 491 492

  if (vgInfo) {
    taosHashCleanup(vgInfo->vgHash);
wafwerar's avatar
wafwerar 已提交
493
    taosMemoryFreeClear(vgInfo);
D
dapan1121 已提交
494 495 496 497 498 499 500 501 502 503
  }

  if (vgList) {
    taosArrayDestroy(vgList);
    vgList = NULL;
  }

  CTG_RET(code);
}

H
Hongze Cheng 已提交
504
int32_t ctgGetTbHashVgroup(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, SVgroupInfo* pVgroup) {
D
dapan1121 已提交
505 506 507 508 509 510 511 512 513 514
  if (IS_SYS_DBNAME(pTableName->dbname)) {
    ctgError("no valid vgInfo for db, dbname:%s", pTableName->dbname);
    CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT);
  }

  SCtgDBCache* dbCache = NULL;
  int32_t      code = 0;
  char         db[TSDB_DB_FNAME_LEN] = {0};
  tNameGetFullDbName(pTableName, db);

H
Hongze Cheng 已提交
515
  SDBVgInfo* vgInfo = NULL;
D
dapan1121 已提交
516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552
  CTG_ERR_JRET(ctgGetDBVgInfo(pCtg, pConn, db, &dbCache, &vgInfo));

  CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pCtg, vgInfo ? vgInfo : dbCache->vgCache.vgInfo, pTableName, pVgroup));

_return:

  if (dbCache) {
    ctgRUnlockVgInfo(dbCache);
    ctgReleaseDBCache(pCtg, dbCache);
  }

  if (vgInfo) {
    taosHashCleanup(vgInfo->vgHash);
    taosMemoryFreeClear(vgInfo);
  }

  CTG_RET(code);
}

int32_t ctgRemoveTbMeta(SCatalog* pCtg, SName* pTableName) {
  int32_t code = 0;

  if (NULL == pCtg || NULL == pTableName) {
    CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT);
  }

  if (NULL == pCtg->dbCache) {
    return TSDB_CODE_SUCCESS;
  }

  CTG_ERR_JRET(ctgRemoveTbMetaFromCache(pCtg, pTableName, true));

_return:

  CTG_RET(code);
}

X
Xiaoyu Wang 已提交
553
int32_t catalogInit(SCatalogCfg* cfg) {
D
dapan 已提交
554
  if (gCtgMgmt.pCluster) {
D
dapan 已提交
555
    qError("catalog already initialized");
D
dapan1121 已提交
556
    CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT);
D
dapan1121 已提交
557 558
  }

wafwerar's avatar
wafwerar 已提交
559
  atomic_store_8((int8_t*)&gCtgMgmt.exit, false);
D
dapan1121 已提交
560

D
dapan1121 已提交
561
  if (cfg) {
D
dapan 已提交
562
    memcpy(&gCtgMgmt.cfg, cfg, sizeof(*cfg));
H
Haojun Liao 已提交
563

D
dapan 已提交
564 565
    if (gCtgMgmt.cfg.maxDBCacheNum == 0) {
      gCtgMgmt.cfg.maxDBCacheNum = CTG_DEFAULT_CACHE_DB_NUMBER;
D
dapan1121 已提交
566 567
    }

D
dapan 已提交
568 569
    if (gCtgMgmt.cfg.maxTblCacheNum == 0) {
      gCtgMgmt.cfg.maxTblCacheNum = CTG_DEFAULT_CACHE_TBLMETA_NUMBER;
D
dapan1121 已提交
570
    }
D
dapan1121 已提交
571

D
dapan 已提交
572 573
    if (gCtgMgmt.cfg.dbRentSec == 0) {
      gCtgMgmt.cfg.dbRentSec = CTG_DEFAULT_RENT_SECOND;
D
dapan1121 已提交
574 575
    }

D
dapan 已提交
576 577
    if (gCtgMgmt.cfg.stbRentSec == 0) {
      gCtgMgmt.cfg.stbRentSec = CTG_DEFAULT_RENT_SECOND;
D
dapan1121 已提交
578
    }
D
dapan1121 已提交
579
  } else {
D
dapan 已提交
580 581 582 583
    gCtgMgmt.cfg.maxDBCacheNum = CTG_DEFAULT_CACHE_DB_NUMBER;
    gCtgMgmt.cfg.maxTblCacheNum = CTG_DEFAULT_CACHE_TBLMETA_NUMBER;
    gCtgMgmt.cfg.dbRentSec = CTG_DEFAULT_RENT_SECOND;
    gCtgMgmt.cfg.stbRentSec = CTG_DEFAULT_RENT_SECOND;
D
dapan 已提交
584 585
  }

X
Xiaoyu Wang 已提交
586 587
  gCtgMgmt.pCluster = taosHashInit(CTG_DEFAULT_CACHE_CLUSTER_NUMBER, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT),
                                   false, HASH_ENTRY_LOCK);
D
dapan 已提交
588
  if (NULL == gCtgMgmt.pCluster) {
D
dapan1121 已提交
589 590
    qError("taosHashInit %d cluster cache failed", CTG_DEFAULT_CACHE_CLUSTER_NUMBER);
    CTG_ERR_RET(TSDB_CODE_CTG_INTERNAL_ERROR);
D
dapan1121 已提交
591 592
  }

D
dapan1121 已提交
593 594 595 596
  if (tsem_init(&gCtgMgmt.queue.reqSem, 0, 0)) {
    qError("tsem_init failed, error:%s", tstrerror(TAOS_SYSTEM_ERROR(errno)));
    CTG_ERR_RET(TSDB_CODE_CTG_SYS_ERROR);
  }
X
Xiaoyu Wang 已提交
597

wafwerar's avatar
wafwerar 已提交
598
  gCtgMgmt.queue.head = taosMemoryCalloc(1, sizeof(SCtgQNode));
D
dapan1121 已提交
599
  if (NULL == gCtgMgmt.queue.head) {
D
dapan1121 已提交
600 601 602
    qError("calloc %d failed", (int32_t)sizeof(SCtgQNode));
    CTG_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
  }
D
dapan1121 已提交
603
  gCtgMgmt.queue.tail = gCtgMgmt.queue.head;
D
dapan1121 已提交
604

D
dapan1121 已提交
605 606 607 608 609 610
  gCtgMgmt.jobPool = taosOpenRef(200, ctgFreeJob);
  if (gCtgMgmt.jobPool < 0) {
    qError("taosOpenRef failed, error:%s", tstrerror(terrno));
    CTG_ERR_RET(terrno);
  }

D
dapan1121 已提交
611 612
  CTG_ERR_RET(ctgStartUpdateThread());

X
Xiaoyu Wang 已提交
613 614
  qDebug("catalog initialized, maxDb:%u, maxTbl:%u, dbRentSec:%u, stbRentSec:%u", gCtgMgmt.cfg.maxDBCacheNum,
         gCtgMgmt.cfg.maxTblCacheNum, gCtgMgmt.cfg.dbRentSec, gCtgMgmt.cfg.stbRentSec);
D
dapan1121 已提交
615

D
dapan 已提交
616
  return TSDB_CODE_SUCCESS;
D
dapan1121 已提交
617 618
}

D
dapan1121 已提交
619
int32_t catalogGetHandle(uint64_t clusterId, SCatalog** catalogHandle) {
620
  if (NULL == catalogHandle) {
D
dapan1121 已提交
621
    CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT);
D
dapan 已提交
622 623
  }

D
dapan1121 已提交
624 625
  CTG_API_ENTER();

D
dapan 已提交
626
  if (NULL == gCtgMgmt.pCluster) {
D
dapan1121 已提交
627
    qError("catalog cluster cache are not ready, clusterId:0x%" PRIx64, clusterId);
D
dapan1121 已提交
628
    CTG_API_LEAVE(TSDB_CODE_CTG_NOT_READY);
D
dapan 已提交
629 630
  }

X
Xiaoyu Wang 已提交
631 632
  int32_t   code = 0;
  SCatalog* clusterCtg = NULL;
D
dapan 已提交
633

D
dapan1121 已提交
634
  while (true) {
X
Xiaoyu Wang 已提交
635
    SCatalog** ctg = (SCatalog**)taosHashGet(gCtgMgmt.pCluster, (char*)&clusterId, sizeof(clusterId));
D
dapan 已提交
636

D
dapan1121 已提交
637 638
    if (ctg && (*ctg)) {
      *catalogHandle = *ctg;
D
dapan1121 已提交
639
      qDebug("got catalog handle from cache, clusterId:0x%" PRIx64 ", CTG:%p", clusterId, *ctg);
D
dapan1121 已提交
640
      CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan1121 已提交
641
    }
D
dapan 已提交
642

wafwerar's avatar
wafwerar 已提交
643
    clusterCtg = taosMemoryCalloc(1, sizeof(SCatalog));
D
dapan1121 已提交
644 645
    if (NULL == clusterCtg) {
      qError("calloc %d failed", (int32_t)sizeof(SCatalog));
D
dapan1121 已提交
646
      CTG_API_LEAVE(TSDB_CODE_OUT_OF_MEMORY);
D
dapan1121 已提交
647 648
    }

D
dapan1121 已提交
649 650
    clusterCtg->clusterId = clusterId;

D
dapan 已提交
651 652
    CTG_ERR_JRET(ctgMetaRentInit(&clusterCtg->dbRent, gCtgMgmt.cfg.dbRentSec, CTG_RENT_DB));
    CTG_ERR_JRET(ctgMetaRentInit(&clusterCtg->stbRent, gCtgMgmt.cfg.stbRentSec, CTG_RENT_STABLE));
D
dapan1121 已提交
653

X
Xiaoyu Wang 已提交
654 655
    clusterCtg->dbCache = taosHashInit(gCtgMgmt.cfg.maxDBCacheNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY),
                                       false, HASH_ENTRY_LOCK);
D
dapan1121 已提交
656 657
    if (NULL == clusterCtg->dbCache) {
      qError("taosHashInit %d dbCache failed", CTG_DEFAULT_CACHE_DB_NUMBER);
D
dapan1121 已提交
658 659 660
      CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
    }

H
Hongze Cheng 已提交
661 662
    clusterCtg->userCache = taosHashInit(gCtgMgmt.cfg.maxUserCacheNum,
                                         taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_ENTRY_LOCK);
D
dapan1121 已提交
663 664 665
    if (NULL == clusterCtg->userCache) {
      qError("taosHashInit %d user cache failed", gCtgMgmt.cfg.maxUserCacheNum);
      CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
D
dapan1121 已提交
666 667
    }

D
dapan 已提交
668
    code = taosHashPut(gCtgMgmt.pCluster, &clusterId, sizeof(clusterId), &clusterCtg, POINTER_BYTES);
D
dapan1121 已提交
669 670
    if (code) {
      if (HASH_NODE_EXIST(code)) {
D
dapan1121 已提交
671
        ctgFreeHandleImpl(clusterCtg);
D
dapan1121 已提交
672 673
        continue;
      }
X
Xiaoyu Wang 已提交
674

D
dapan1121 已提交
675
      qError("taosHashPut CTG to cache failed, clusterId:0x%" PRIx64, clusterId);
D
dapan1121 已提交
676 677 678
      CTG_ERR_JRET(TSDB_CODE_CTG_INTERNAL_ERROR);
    }

D
dapan1121 已提交
679
    qDebug("add CTG to cache, clusterId:0x%" PRIx64 ", CTG:%p", clusterId, clusterCtg);
D
dapan1121 已提交
680 681

    break;
D
dapan 已提交
682
  }
D
dapan1121 已提交
683 684

  *catalogHandle = clusterCtg;
D
dapan1121 已提交
685

D
dapan1121 已提交
686
  CTG_CACHE_STAT_INC(numOfCluster, 1);
X
Xiaoyu Wang 已提交
687

D
dapan1121 已提交
688
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan1121 已提交
689 690 691

_return:

D
dapan1121 已提交
692
  ctgFreeHandleImpl(clusterCtg);
D
dapan1121 已提交
693

D
dapan1121 已提交
694
  CTG_API_LEAVE(code);
D
dapan 已提交
695 696
}

X
Xiaoyu Wang 已提交
697
int32_t catalogGetDBVgVersion(SCatalog* pCtg, const char* dbFName, int32_t* version, int64_t* dbId, int32_t* tableNum) {
D
dapan1121 已提交
698 699
  CTG_API_ENTER();

D
dapan1121 已提交
700
  if (NULL == pCtg || NULL == dbFName || NULL == version || NULL == dbId) {
D
dapan1121 已提交
701 702 703
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

X
Xiaoyu Wang 已提交
704 705
  SCtgDBCache* dbCache = NULL;
  int32_t      code = 0;
D
dapan1121 已提交
706

D
dapan1121 已提交
707 708
  CTG_ERR_JRET(ctgAcquireVgInfoFromCache(pCtg, dbFName, &dbCache));
  if (NULL == dbCache) {
D
dapan1121 已提交
709
    *version = CTG_DEFAULT_INVALID_VERSION;
D
dapan1121 已提交
710
    CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan1121 已提交
711 712
  }

D
dapan1121 已提交
713
  *version = dbCache->vgCache.vgInfo->vgVersion;
D
dapan1121 已提交
714
  *dbId = dbCache->dbId;
D
dapan1121 已提交
715
  *tableNum = dbCache->vgCache.vgInfo->numOfTable;
D
dapan1121 已提交
716

D
dapan1121 已提交
717
  ctgReleaseVgInfoToCache(pCtg, dbCache);
D
dapan1121 已提交
718

D
dapan1121 已提交
719
  ctgDebug("Got db vgVersion from cache, dbFName:%s, vgVersion:%d", dbFName, *version);
D
dapan1121 已提交
720

D
dapan1121 已提交
721
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan1121 已提交
722 723 724 725

_return:

  CTG_API_LEAVE(code);
D
dapan1121 已提交
726 727
}

H
Hongze Cheng 已提交
728
int32_t catalogGetDBVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* dbFName, SArray** vgroupList) {
D
dapan1121 已提交
729 730
  CTG_API_ENTER();

D
dapan1121 已提交
731
  if (NULL == pCtg || NULL == dbFName || NULL == pConn || NULL == vgroupList) {
D
dapan1121 已提交
732 733
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }
734

D
dapan1121 已提交
735
  SCtgDBCache* dbCache = NULL;
H
Hongze Cheng 已提交
736 737 738 739
  int32_t      code = 0;
  SArray*      vgList = NULL;
  SHashObj*    vgHash = NULL;
  SDBVgInfo*   vgInfo = NULL;
D
dapan1121 已提交
740
  CTG_ERR_JRET(ctgGetDBVgInfo(pCtg, pConn, dbFName, &dbCache, &vgInfo));
D
dapan1121 已提交
741
  if (dbCache) {
D
dapan1121 已提交
742
    vgHash = dbCache->vgCache.vgInfo->vgHash;
D
dapan1121 已提交
743 744
  } else {
    vgHash = vgInfo->vgHash;
D
dapan1121 已提交
745 746
  }

D
dapan1121 已提交
747
  CTG_ERR_JRET(ctgGenerateVgList(pCtg, vgHash, &vgList));
D
dapan1121 已提交
748 749 750 751 752

  *vgroupList = vgList;
  vgList = NULL;

_return:
D
dapan1121 已提交
753 754

  if (dbCache) {
D
dapan1121 已提交
755
    ctgRUnlockVgInfo(dbCache);
D
dapan1121 已提交
756
    ctgReleaseDBCache(pCtg, dbCache);
D
dapan1121 已提交
757 758
  }

D
dapan1121 已提交
759 760
  if (vgInfo) {
    taosHashCleanup(vgInfo->vgHash);
wafwerar's avatar
wafwerar 已提交
761
    taosMemoryFreeClear(vgInfo);
D
dapan1121 已提交
762 763
  }

X
Xiaoyu Wang 已提交
764
  CTG_API_LEAVE(code);
D
dapan1121 已提交
765 766
}

D
dapan1121 已提交
767
int32_t catalogUpdateDBVgInfo(SCatalog* pCtg, const char* dbFName, uint64_t dbId, SDBVgInfo* dbInfo) {
D
dapan1121 已提交
768
  CTG_API_ENTER();
D
dapan1121 已提交
769 770

  int32_t code = 0;
X
Xiaoyu Wang 已提交
771

D
dapan1121 已提交
772
  if (NULL == pCtg || NULL == dbFName || NULL == dbInfo) {
D
dapan1121 已提交
773
    ctgFreeVgInfo(dbInfo);
D
dapan1121 已提交
774 775 776
    CTG_ERR_JRET(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
777
  code = ctgUpdateVgroupEnqueue(pCtg, dbFName, dbId, dbInfo, false);
D
dapan1121 已提交
778

D
dapan1121 已提交
779 780
_return:

D
dapan1121 已提交
781
  CTG_API_LEAVE(code);
D
dapan1121 已提交
782 783
}

D
dapan1121 已提交
784 785 786
int32_t catalogRemoveDB(SCatalog* pCtg, const char* dbFName, uint64_t dbId) {
  CTG_API_ENTER();

D
dapan1121 已提交
787
  int32_t code = 0;
X
Xiaoyu Wang 已提交
788

D
dapan1121 已提交
789 790
  if (NULL == pCtg || NULL == dbFName) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
D
dapan1121 已提交
791 792
  }

D
dapan1121 已提交
793
  if (NULL == pCtg->dbCache) {
D
dapan1121 已提交
794
    CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan1121 已提交
795
  }
D
dapan1121 已提交
796

D
dapan1121 已提交
797
  CTG_ERR_JRET(ctgDropDbCacheEnqueue(pCtg, dbFName, dbId));
D
dapan 已提交
798

D
dapan1121 已提交
799
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
X
Xiaoyu Wang 已提交
800

D
dapan1121 已提交
801 802
_return:

D
dapan1121 已提交
803
  CTG_API_LEAVE(code);
D
dapan1121 已提交
804 805
}

X
Xiaoyu Wang 已提交
806
int32_t catalogUpdateVgEpSet(SCatalog* pCtg, const char* dbFName, int32_t vgId, SEpSet* epSet) {
D
dapan1121 已提交
807 808 809
  CTG_API_ENTER();

  int32_t code = 0;
X
Xiaoyu Wang 已提交
810

D
dapan1121 已提交
811 812 813 814 815 816 817
  if (NULL == pCtg || NULL == dbFName || NULL == epSet) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

  CTG_ERR_JRET(ctgUpdateVgEpsetEnqueue(pCtg, (char*)dbFName, vgId, epSet));

_return:
X
Xiaoyu Wang 已提交
818

D
dapan1121 已提交
819
  CTG_API_LEAVE(code);
D
dapan1121 已提交
820
}
D
dapan1121 已提交
821

H
Hongze Cheng 已提交
822
int32_t catalogUpdateTableIndex(SCatalog* pCtg, STableIndexRsp* pRsp) {
D
dapan1121 已提交
823 824 825
  CTG_API_ENTER();

  int32_t code = 0;
H
Hongze Cheng 已提交
826

D
dapan1121 已提交
827 828 829 830 831 832 833 834 835 836 837 838 839 840
  if (NULL == pCtg || NULL == pRsp) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

  STableIndex* pIndex = taosMemoryCalloc(1, sizeof(STableIndex));
  if (NULL == pIndex) {
    CTG_API_LEAVE(TSDB_CODE_OUT_OF_MEMORY);
  }

  memcpy(pIndex, pRsp, sizeof(STableIndex));

  CTG_ERR_JRET(ctgUpdateTbIndexEnqueue(pCtg, &pIndex, false));

_return:
H
Hongze Cheng 已提交
841

D
dapan1121 已提交
842 843 844
  CTG_API_LEAVE(code);
}

D
dapan1121 已提交
845
int32_t catalogRemoveTableMeta(SCatalog* pCtg, SName* pTableName) {
D
dapan 已提交
846 847
  CTG_API_ENTER();

D
dapan1121 已提交
848
  CTG_API_LEAVE(ctgRemoveTbMeta(pCtg, pTableName));
D
dapan 已提交
849 850
}

D
dapan1121 已提交
851 852 853
int32_t catalogRemoveStbMeta(SCatalog* pCtg, const char* dbFName, uint64_t dbId, const char* stbName, uint64_t suid) {
  CTG_API_ENTER();

D
dapan 已提交
854
  int32_t code = 0;
X
Xiaoyu Wang 已提交
855

D
dapan1121 已提交
856 857
  if (NULL == pCtg || NULL == dbFName || NULL == stbName) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
D
dapan 已提交
858 859
  }

D
dapan1121 已提交
860
  if (NULL == pCtg->dbCache) {
D
dapan1121 已提交
861
    CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan 已提交
862
  }
D
dapan1121 已提交
863

D
dapan1121 已提交
864
  CTG_ERR_JRET(ctgDropStbMetaEnqueue(pCtg, dbFName, dbId, stbName, suid, true));
D
dapan 已提交
865

D
dapan1121 已提交
866
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
X
Xiaoyu Wang 已提交
867

D
dapan1121 已提交
868 869
_return:

D
dapan1121 已提交
870
  CTG_API_LEAVE(code);
D
dapan 已提交
871 872
}

H
Hongze Cheng 已提交
873
int32_t catalogGetTableMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, STableMeta** pTableMeta) {
D
dapan1121 已提交
874 875
  CTG_API_ENTER();

D
dapan1121 已提交
876 877 878
  SCtgTbMetaCtx ctx = {0};
  ctx.pName = (SName*)pTableName;
  ctx.flag = CTG_FLAG_UNKNOWN_STB;
H
Hongze Cheng 已提交
879

D
dapan1121 已提交
880
  CTG_API_LEAVE(ctgGetTbMeta(pCtg, pConn, &ctx, pTableMeta));
D
dapan1121 已提交
881
}
D
dapan1121 已提交
882

H
Hongze Cheng 已提交
883 884
int32_t catalogGetSTableMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
                             STableMeta** pTableMeta) {
D
dapan1121 已提交
885 886
  CTG_API_ENTER();

D
dapan1121 已提交
887 888 889 890
  SCtgTbMetaCtx ctx = {0};
  ctx.pName = (SName*)pTableName;
  ctx.flag = CTG_FLAG_STB;

D
dapan1121 已提交
891
  CTG_API_LEAVE(ctgGetTbMeta(pCtg, pConn, &ctx, pTableMeta));
D
dapan1121 已提交
892 893
}

X
Xiaoyu Wang 已提交
894
int32_t catalogUpdateTableMeta(SCatalog* pCtg, STableMetaRsp* pMsg) {
D
dapan1121 已提交
895 896
  CTG_API_ENTER();

D
dapan1121 已提交
897
  if (NULL == pCtg || NULL == pMsg) {
D
dapan1121 已提交
898 899 900
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
901
  int32_t code = 0;
D
dapan1121 已提交
902
  CTG_ERR_JRET(ctgUpdateTbMeta(pCtg, pMsg, true));
X
Xiaoyu Wang 已提交
903

D
dapan1121 已提交
904
_return:
X
Xiaoyu Wang 已提交
905

D
dapan1121 已提交
906
  CTG_API_LEAVE(code);
D
dapan1121 已提交
907 908
}

H
Hongze Cheng 已提交
909
int32_t catalogChkTbMetaVersion(SCatalog* pCtg, SRequestConnInfo* pConn, SArray* pTables) {
D
dapan1121 已提交
910 911
  CTG_API_ENTER();

D
dapan1121 已提交
912
  if (NULL == pCtg || NULL == pConn || NULL == pTables) {
D
dapan1121 已提交
913 914
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }
D
dapan1121 已提交
915

D
dapan1121 已提交
916
  SName   name = {0};
D
dapan1121 已提交
917
  int32_t sver = 0;
D
dapan1121 已提交
918
  int32_t tver = 0;
D
dapan1121 已提交
919 920 921
  int32_t tbNum = taosArrayGetSize(pTables);
  for (int32_t i = 0; i < tbNum; ++i) {
    STbSVersion* pTb = (STbSVersion*)taosArrayGet(pTables, i);
D
dapan1121 已提交
922 923 924
    if (NULL == pTb->tbFName || 0 == pTb->tbFName[0]) {
      continue;
    }
X
Xiaoyu Wang 已提交
925

D
dapan1121 已提交
926
    tNameFromString(&name, pTb->tbFName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
D
dapan1121 已提交
927

D
dapan1121 已提交
928
    if (IS_SYS_DBNAME(name.dbname)) {
D
dapan1121 已提交
929 930 931
      continue;
    }

L
Liu Jicong 已提交
932
    int32_t  tbType = 0;
D
dapan1121 已提交
933
    uint64_t suid = 0;
L
Liu Jicong 已提交
934
    char     stbName[TSDB_TABLE_FNAME_LEN];
D
dapan1121 已提交
935 936
    ctgReadTbVerFromCache(pCtg, &name, &sver, &tver, &tbType, &suid, stbName);
    if ((sver >= 0 && sver < pTb->sver) || (tver >= 0 && tver < pTb->tver)) {
D
dapan1121 已提交
937 938 939 940
      switch (tbType) {
        case TSDB_CHILD_TABLE: {
          SName stb = name;
          strcpy(stb.tname, stbName);
D
dapan1121 已提交
941
          ctgRemoveTbMeta(pCtg, &stb);
D
dapan1121 已提交
942 943 944 945
          break;
        }
        case TSDB_SUPER_TABLE:
        case TSDB_NORMAL_TABLE:
D
dapan1121 已提交
946
          ctgRemoveTbMeta(pCtg, &name);
D
dapan1121 已提交
947 948 949 950 951
          break;
        default:
          ctgError("ignore table type %d", tbType);
          break;
      }
D
dapan1121 已提交
952 953 954 955
    }
  }

  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan1121 已提交
956 957
}

H
Hongze Cheng 已提交
958
int32_t catalogRefreshDBVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* dbFName) {
D
dapan1121 已提交
959 960
  CTG_API_ENTER();

D
dapan1121 已提交
961
  if (NULL == pCtg || NULL == pConn || NULL == dbFName) {
D
dapan1121 已提交
962 963 964
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
965
  CTG_API_LEAVE(ctgRefreshDBVgInfo(pCtg, pConn, dbFName));
D
dapan1121 已提交
966
}
D
dapan1121 已提交
967

H
Hongze Cheng 已提交
968
int32_t catalogRefreshTableMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, int32_t isSTable) {
D
dapan1121 已提交
969 970
  CTG_API_ENTER();

D
dapan1121 已提交
971
  if (NULL == pCtg || NULL == pConn || NULL == pTableName) {
D
dapan1121 已提交
972 973 974
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
975 976 977 978
  SCtgTbMetaCtx ctx = {0};
  ctx.pName = (SName*)pTableName;
  ctx.flag = CTG_FLAG_FORCE_UPDATE | CTG_FLAG_MAKE_STB(isSTable);

D
dapan1121 已提交
979
  CTG_API_LEAVE(ctgRefreshTbMeta(pCtg, pConn, &ctx, NULL, true));
980
}
981

H
Hongze Cheng 已提交
982 983
int32_t catalogRefreshGetTableMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
                                   STableMeta** pTableMeta, int32_t isSTable) {
D
dapan1121 已提交
984 985
  CTG_API_ENTER();

D
dapan1121 已提交
986 987 988 989
  SCtgTbMetaCtx ctx = {0};
  ctx.pName = (SName*)pTableName;
  ctx.flag = CTG_FLAG_FORCE_UPDATE | CTG_FLAG_MAKE_STB(isSTable);

D
dapan1121 已提交
990
  CTG_API_LEAVE(ctgGetTbMeta(pCtg, pConn, &ctx, pTableMeta));
D
dapan1121 已提交
991 992
}

H
Hongze Cheng 已提交
993
int32_t catalogGetTableDistVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, SArray** pVgList) {
D
dapan1121 已提交
994
  CTG_API_ENTER();
D
dapan1121 已提交
995

D
dapan1121 已提交
996
  if (NULL == pCtg || NULL == pConn || NULL == pTableName || NULL == pVgList) {
D
dapan1121 已提交
997 998
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }
D
dapan1121 已提交
999

D
dapan1121 已提交
1000
  if (IS_SYS_DBNAME(pTableName->dbname)) {
D
dapan1121 已提交
1001 1002 1003
    ctgError("no valid vgInfo for db, dbname:%s", pTableName->dbname);
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }
D
dapan1121 已提交
1004

D
dapan1121 已提交
1005
  CTG_API_LEAVE(ctgGetTbDistVgInfo(pCtg, pConn, (SName*)pTableName, pVgList));
D
dapan1121 已提交
1006 1007
}

H
Hongze Cheng 已提交
1008 1009
int32_t catalogGetTableHashVgroup(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
                                  SVgroupInfo* pVgroup) {
D
dapan1121 已提交
1010 1011
  CTG_API_ENTER();

D
dapan1121 已提交
1012
  CTG_API_LEAVE(ctgGetTbHashVgroup(pCtg, pConn, pTableName, pVgroup));
D
dapan1121 已提交
1013 1014
}

H
Hongze Cheng 已提交
1015
int32_t catalogGetAllMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SCatalogReq* pReq, SMetaData* pRsp) {
D
dapan1121 已提交
1016 1017
  CTG_API_ENTER();

D
dapan1121 已提交
1018
  if (NULL == pCtg || NULL == pConn || NULL == pReq || NULL == pRsp) {
D
dapan1121 已提交
1019 1020 1021
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1022
  int32_t code = 0;
D
dapan1121 已提交
1023
  pRsp->pTableMeta = NULL;
D
dapan1121 已提交
1024

D
dapan1121 已提交
1025 1026
  if (pReq->pTableMeta) {
    int32_t tbNum = (int32_t)taosArrayGetSize(pReq->pTableMeta);
D
dapan1121 已提交
1027
    if (tbNum <= 0) {
D
dapan1121 已提交
1028
      ctgError("empty table name list, tbNum:%d", tbNum);
D
dapan1121 已提交
1029
      CTG_ERR_JRET(TSDB_CODE_CTG_INVALID_INPUT);
D
dapan1121 已提交
1030
    }
H
Haojun Liao 已提交
1031

D
dapan1121 已提交
1032 1033
    pRsp->pTableMeta = taosArrayInit(tbNum, POINTER_BYTES);
    if (NULL == pRsp->pTableMeta) {
D
dapan1121 已提交
1034
      ctgError("taosArrayInit %d failed", tbNum);
D
dapan1121 已提交
1035
      CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
D
dapan1121 已提交
1036
    }
X
Xiaoyu Wang 已提交
1037

D
dapan1121 已提交
1038
    for (int32_t i = 0; i < tbNum; ++i) {
X
Xiaoyu Wang 已提交
1039 1040
      SName*        name = taosArrayGet(pReq->pTableMeta, i);
      STableMeta*   pTableMeta = NULL;
D
dapan1121 已提交
1041 1042 1043
      SCtgTbMetaCtx ctx = {0};
      ctx.pName = name;
      ctx.flag = CTG_FLAG_UNKNOWN_STB;
H
Hongze Cheng 已提交
1044

D
dapan1121 已提交
1045
      CTG_ERR_JRET(ctgGetTbMeta(pCtg, pConn, &ctx, &pTableMeta));
D
dapan1121 已提交
1046 1047 1048

      if (NULL == taosArrayPush(pRsp->pTableMeta, &pTableMeta)) {
        ctgError("taosArrayPush failed, idx:%d", i);
wafwerar's avatar
wafwerar 已提交
1049
        taosMemoryFreeClear(pTableMeta);
D
dapan1121 已提交
1050
        CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
D
dapan1121 已提交
1051 1052 1053 1054
      }
    }
  }

D
dapan1121 已提交
1055
  if (pReq->qNodeRequired) {
D
dapan1121 已提交
1056
    pRsp->pQnodeList = taosArrayInit(10, sizeof(SQueryNodeLoad));
D
dapan1121 已提交
1057
    CTG_ERR_JRET(ctgGetQnodeListFromMnode(pCtg, pConn, pRsp->pQnodeList, NULL));
D
dapan1121 已提交
1058 1059
  }

D
dapan1121 已提交
1060
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan1121 已提交
1061

X
Xiaoyu Wang 已提交
1062
_return:
D
dapan1121 已提交
1063

D
dapan1121 已提交
1064 1065 1066
  if (pRsp->pTableMeta) {
    int32_t aSize = taosArrayGetSize(pRsp->pTableMeta);
    for (int32_t i = 0; i < aSize; ++i) {
X
Xiaoyu Wang 已提交
1067
      STableMeta* pMeta = taosArrayGetP(pRsp->pTableMeta, i);
wafwerar's avatar
wafwerar 已提交
1068
      taosMemoryFreeClear(pMeta);
D
dapan1121 已提交
1069
    }
X
Xiaoyu Wang 已提交
1070

D
dapan1121 已提交
1071
    taosArrayDestroy(pRsp->pTableMeta);
D
dapan1121 已提交
1072
    pRsp->pTableMeta = NULL;
D
dapan1121 已提交
1073
  }
X
Xiaoyu Wang 已提交
1074

D
dapan1121 已提交
1075
  CTG_API_LEAVE(code);
1076
}
D
dapan 已提交
1077

H
Hongze Cheng 已提交
1078 1079
int32_t catalogAsyncGetAllMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SCatalogReq* pReq, catalogCallback fp,
                               void* param, int64_t* jobId) {
D
dapan1121 已提交
1080 1081
  CTG_API_ENTER();

D
dapan1121 已提交
1082
  if (NULL == pCtg || NULL == pConn || NULL == pReq || NULL == fp || NULL == param) {
D
dapan1121 已提交
1083 1084 1085
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

H
Hongze Cheng 已提交
1086 1087
  int32_t  code = 0;
  SCtgJob* pJob = NULL;
D
dapan1121 已提交
1088
  CTG_ERR_JRET(ctgInitJob(pCtg, pConn, &pJob, pReq, fp, param));
D
dapan1121 已提交
1089 1090 1091

  CTG_ERR_JRET(ctgLaunchJob(pJob));

1092
  // NOTE: here the assignment of jobId is invalid, may over-write the true scheduler created query job.
X
Xiaoyu Wang 已提交
1093 1094
  //  *jobId = pJob->refId;

D
dapan1121 已提交
1095
_return:
D
dapan1121 已提交
1096

D
dapan1121 已提交
1097 1098 1099 1100 1101 1102 1103
  if (pJob) {
    taosReleaseRef(gCtgMgmt.jobPool, pJob->refId);

    if (code) {
      taosRemoveRef(gCtgMgmt.jobPool, pJob->refId);
    }
  }
X
Xiaoyu Wang 已提交
1104

D
dapan1121 已提交
1105 1106 1107
  CTG_API_LEAVE(code);
}

H
Hongze Cheng 已提交
1108
int32_t catalogGetQnodeList(SCatalog* pCtg, SRequestConnInfo* pConn, SArray* pQnodeList) {
D
dapan1121 已提交
1109
  CTG_API_ENTER();
X
Xiaoyu Wang 已提交
1110

D
dapan1121 已提交
1111
  int32_t code = 0;
D
dapan1121 已提交
1112
  if (NULL == pCtg || NULL == pConn || NULL == pQnodeList) {
D
dapan1121 已提交
1113 1114 1115
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1116
  CTG_ERR_JRET(ctgGetQnodeListFromMnode(pCtg, pConn, pQnodeList, NULL));
D
dapan1121 已提交
1117 1118

_return:
D
dapan 已提交
1119

D
dapan1121 已提交
1120
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan 已提交
1121 1122
}

D
dapan1121 已提交
1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135
int32_t catalogGetDnodeList(SCatalog* pCtg, SRequestConnInfo* pConn, SArray** pDnodeList) {
  CTG_API_ENTER();

  int32_t code = 0;
  if (NULL == pCtg || NULL == pConn || NULL == pDnodeList) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

  CTG_ERR_JRET(ctgGetDnodeListFromMnode(pCtg, pConn, pDnodeList, NULL));

_return:

  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
1136 1137
}

H
Hongze Cheng 已提交
1138
int32_t catalogGetExpiredSTables(SCatalog* pCtg, SSTableVersion** stables, uint32_t* num) {
D
dapan1121 已提交
1139 1140
  CTG_API_ENTER();

D
dapan1121 已提交
1141 1142
  if (NULL == pCtg || NULL == stables || NULL == num) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
D
dapan1121 已提交
1143 1144
  }

H
Hongze Cheng 已提交
1145
  CTG_API_LEAVE(ctgMetaRentGet(&pCtg->stbRent, (void**)stables, num, sizeof(SSTableVersion)));
D
dapan1121 已提交
1146 1147
}

X
Xiaoyu Wang 已提交
1148
int32_t catalogGetExpiredDBs(SCatalog* pCtg, SDbVgVersion** dbs, uint32_t* num) {
D
dapan1121 已提交
1149
  CTG_API_ENTER();
X
Xiaoyu Wang 已提交
1150

D
dapan1121 已提交
1151 1152 1153
  if (NULL == pCtg || NULL == dbs || NULL == num) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }
D
dapan1121 已提交
1154

X
Xiaoyu Wang 已提交
1155
  CTG_API_LEAVE(ctgMetaRentGet(&pCtg->dbRent, (void**)dbs, num, sizeof(SDbVgVersion)));
D
dapan1121 已提交
1156 1157
}

X
Xiaoyu Wang 已提交
1158
int32_t catalogGetExpiredUsers(SCatalog* pCtg, SUserAuthVersion** users, uint32_t* num) {
D
dapan 已提交
1159
  CTG_API_ENTER();
X
Xiaoyu Wang 已提交
1160

D
dapan 已提交
1161 1162 1163 1164 1165
  if (NULL == pCtg || NULL == users || NULL == num) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

  *num = taosHashGetSize(pCtg->userCache);
D
dapan1121 已提交
1166 1167 1168
  if (*num <= 0) {
    CTG_API_LEAVE(TSDB_CODE_SUCCESS);
  }
H
Hongze Cheng 已提交
1169

D
dapan1121 已提交
1170 1171 1172 1173
  *users = taosMemoryCalloc(*num, sizeof(SUserAuthVersion));
  if (NULL == *users) {
    ctgError("calloc %d userAuthVersion failed", *num);
    CTG_API_LEAVE(TSDB_CODE_OUT_OF_MEMORY);
D
dapan 已提交
1174 1175
  }

X
Xiaoyu Wang 已提交
1176 1177
  uint32_t      i = 0;
  SCtgUserAuth* pAuth = taosHashIterate(pCtg->userCache, NULL);
D
dapan 已提交
1178
  while (pAuth != NULL) {
D
fix bug  
dapan1121 已提交
1179
    size_t len = 0;
X
Xiaoyu Wang 已提交
1180
    void*  key = taosHashGetKey(pAuth, &len);
D
fix bug  
dapan1121 已提交
1181 1182
    strncpy((*users)[i].user, key, len);
    (*users)[i].user[len] = 0;
D
dapan 已提交
1183
    (*users)[i].version = pAuth->version;
D
fix bug  
dapan1121 已提交
1184
    ++i;
D
dapan1121 已提交
1185 1186 1187 1188
    if (i >= *num) {
      taosHashCancelIterate(pCtg->userCache, pAuth);
      break;
    }
H
Hongze Cheng 已提交
1189

D
dapan 已提交
1190 1191 1192 1193 1194 1195
    pAuth = taosHashIterate(pCtg->userCache, pAuth);
  }

  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
}

H
Hongze Cheng 已提交
1196
int32_t catalogGetDBCfg(SCatalog* pCtg, SRequestConnInfo* pConn, const char* dbFName, SDbCfgInfo* pDbCfg) {
D
dapan1121 已提交
1197
  CTG_API_ENTER();
H
Hongze Cheng 已提交
1198

D
dapan1121 已提交
1199
  if (NULL == pCtg || NULL == pConn || NULL == dbFName || NULL == pDbCfg) {
D
dapan1121 已提交
1200 1201 1202
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1203
  CTG_API_LEAVE(ctgGetDBCfgFromMnode(pCtg, pConn, dbFName, pDbCfg, NULL));
D
dapan1121 已提交
1204
}
D
dapan 已提交
1205

H
Hongze Cheng 已提交
1206
int32_t catalogGetIndexMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const char* indexName, SIndexInfo* pInfo) {
D
dapan1121 已提交
1207
  CTG_API_ENTER();
H
Hongze Cheng 已提交
1208

D
dapan1121 已提交
1209
  if (NULL == pCtg || NULL == pConn || NULL == indexName || NULL == pInfo) {
D
dapan1121 已提交
1210 1211 1212
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1213
  CTG_API_LEAVE(ctgGetIndexInfoFromMnode(pCtg, pConn, indexName, pInfo, NULL));
D
dapan1121 已提交
1214 1215
}

H
Hongze Cheng 已提交
1216
int32_t catalogGetTableIndex(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, SArray** pRes) {
D
dapan1121 已提交
1217
  CTG_API_ENTER();
H
Hongze Cheng 已提交
1218

D
dapan1121 已提交
1219
  if (NULL == pCtg || NULL == pConn || NULL == pTableName || NULL == pRes) {
D
dapan1121 已提交
1220 1221 1222
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1223
  int32_t code = 0;
D
dapan1121 已提交
1224
  CTG_ERR_JRET(ctgGetTbIndex(pCtg, pConn, (SName*)pTableName, pRes));
H
Hongze Cheng 已提交
1225

D
dapan1121 已提交
1226 1227 1228
_return:

  CTG_API_LEAVE(code);
D
dapan1121 已提交
1229 1230
}

H
Hongze Cheng 已提交
1231
int32_t catalogRefreshGetTableCfg(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, STableCfg** pCfg) {
D
dapan1121 已提交
1232
  CTG_API_ENTER();
H
Hongze Cheng 已提交
1233

D
dapan1121 已提交
1234 1235 1236 1237
  if (NULL == pCtg || NULL == pConn || NULL == pTableName || NULL == pCfg) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1238
  int32_t code = 0;
D
dapan1121 已提交
1239
  CTG_ERR_JRET(ctgRemoveTbMeta(pCtg, (SName*)pTableName));
D
dapan1121 已提交
1240 1241 1242 1243 1244 1245

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

_return:

  CTG_API_LEAVE(code);
D
dapan1121 已提交
1246 1247
}

H
Hongze Cheng 已提交
1248
int32_t catalogGetUdfInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* funcName, SFuncInfo* pInfo) {
D
dapan1121 已提交
1249
  CTG_API_ENTER();
H
Hongze Cheng 已提交
1250

D
dapan1121 已提交
1251
  if (NULL == pCtg || NULL == pConn || NULL == funcName || NULL == pInfo) {
D
dapan1121 已提交
1252 1253 1254
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1255
  int32_t code = 0;
D
dapan1121 已提交
1256
  CTG_ERR_JRET(ctgGetUdfInfoFromMnode(pCtg, pConn, funcName, pInfo, NULL));
H
Hongze Cheng 已提交
1257

D
dapan1121 已提交
1258
_return:
X
Xiaoyu Wang 已提交
1259

D
dapan1121 已提交
1260
  CTG_API_LEAVE(code);
D
dapan1121 已提交
1261 1262
}

H
Hongze Cheng 已提交
1263 1264
int32_t catalogChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, const char* user, const char* dbFName, AUTH_TYPE type,
                       bool* pass) {
D
dapan 已提交
1265
  CTG_API_ENTER();
H
Hongze Cheng 已提交
1266

D
dapan1121 已提交
1267
  if (NULL == pCtg || NULL == pConn || NULL == user || NULL == dbFName || NULL == pass) {
D
dapan 已提交
1268 1269 1270 1271
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

  int32_t code = 0;
D
dapan1121 已提交
1272
  CTG_ERR_JRET(ctgChkAuth(pCtg, pConn, user, dbFName, type, pass));
H
Hongze Cheng 已提交
1273

D
dapan 已提交
1274 1275 1276 1277 1278
_return:

  CTG_API_LEAVE(code);
}

H
Hongze Cheng 已提交
1279
int32_t catalogGetServerVersion(SCatalog* pCtg, SRequestConnInfo* pConn, char** pVersion) {
D
dapan1121 已提交
1280
  CTG_API_ENTER();
H
Hongze Cheng 已提交
1281

D
dapan1121 已提交
1282 1283 1284 1285 1286 1287
  if (NULL == pCtg || NULL == pConn || NULL == pVersion) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

  int32_t code = 0;
  CTG_ERR_JRET(ctgGetSvrVerFromMnode(pCtg, pConn, pVersion, NULL));
H
Hongze Cheng 已提交
1288

D
dapan1121 已提交
1289 1290 1291 1292 1293
_return:

  CTG_API_LEAVE(code);
}

D
dapan 已提交
1294 1295 1296 1297 1298 1299 1300
int32_t catalogUpdateUserAuthInfo(SCatalog* pCtg, SGetUserAuthRsp* pAuth) {
  CTG_API_ENTER();

  if (NULL == pCtg || NULL == pAuth) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1301
  CTG_API_LEAVE(ctgUpdateUserEnqueue(pCtg, pAuth, false));
D
dapan 已提交
1302 1303
}

D
dapan1121 已提交
1304
int32_t catalogClearCache(void) {
D
dapan1121 已提交
1305
  CTG_API_ENTER_NOLOCK();
D
dapan1121 已提交
1306 1307 1308 1309

  qInfo("start to clear catalog cache");

  if (NULL == gCtgMgmt.pCluster || atomic_load_8((int8_t*)&gCtgMgmt.exit)) {
D
dapan1121 已提交
1310
    CTG_API_LEAVE_NOLOCK(TSDB_CODE_SUCCESS);
D
dapan1121 已提交
1311 1312
  }

D
dapan1121 已提交
1313
  int32_t code = ctgClearCacheEnqueue(NULL, false, false, true);
D
dapan1121 已提交
1314 1315

  qInfo("clear catalog cache end, code: %s", tstrerror(code));
H
Hongze Cheng 已提交
1316

D
dapan1121 已提交
1317
  CTG_API_LEAVE_NOLOCK(code);
D
dapan1121 已提交
1318 1319
}

D
dapan 已提交
1320
void catalogDestroy(void) {
D
dapan1121 已提交
1321
  qInfo("start to destroy catalog");
X
Xiaoyu Wang 已提交
1322

wafwerar's avatar
wafwerar 已提交
1323
  if (NULL == gCtgMgmt.pCluster || atomic_load_8((int8_t*)&gCtgMgmt.exit)) {
D
dapan1121 已提交
1324 1325 1326
    return;
  }

wafwerar's avatar
wafwerar 已提交
1327
  atomic_store_8((int8_t*)&gCtgMgmt.exit, true);
D
dapan 已提交
1328

D
dapan1121 已提交
1329 1330
  if (!taosCheckCurrentInDll()) {
    ctgClearCacheEnqueue(NULL, true, true, true);
D
dapan1121 已提交
1331
    taosThreadJoin(gCtgMgmt.updateThread, NULL);
D
dapan1121 已提交
1332
  }
1333

D
dapan 已提交
1334 1335
  taosHashCleanup(gCtgMgmt.pCluster);
  gCtgMgmt.pCluster = NULL;
D
dapan1121 已提交
1336 1337

  qInfo("catalog destroyed");
D
dapan 已提交
1338
}