catalog.c 35.5 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

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

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

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

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

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

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

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

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

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

_return:

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

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

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

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

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

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

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

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

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

    CTG_ERR_RET(code);
  }

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

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

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

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

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

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

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

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

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

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

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

wafwerar's avatar
wafwerar 已提交
128
      taosMemoryFreeClear(output->tbMeta);
D
dapan1121 已提交
129
      
D
dapan1121 已提交
130
      CTG_ERR_JRET(ctgGetTbMetaFromMnodeImpl(pCtg, pConn, output->dbFName, output->tbName, output, NULL));
D
dapan1121 已提交
131
    } else if (CTG_IS_META_BOTH(output->metaType)) {
D
dapan1121 已提交
132
      int32_t exist = 0;
D
dapan1121 已提交
133 134
      if (!CTG_FLAG_IS_FORCE_UPDATE(ctx->flag)) {
        CTG_ERR_JRET(ctgTbMetaExistInCache(pCtg, output->dbFName, output->tbName, &exist));
D
dapan1121 已提交
135
      }
H
Haojun Liao 已提交
136

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

D
dapan1121 已提交
140
        if (CTG_IS_META_NULL(moutput.metaType)) {
D
dapan1121 已提交
141
          SET_META_TYPE_NULL(output->metaType);
D
dapan1121 已提交
142
        }
X
Xiaoyu Wang 已提交
143

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

        SET_META_TYPE_CTABLE(output->metaType);
D
dapan1121 已提交
151
      }
D
dapan1121 已提交
152 153 154
    }
  }

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

D
dapan 已提交
161
  if (CTG_IS_META_TABLE(output->metaType)) {
X
Xiaoyu Wang 已提交
162 163
    ctgDebug("tbmeta got, dbFName:%s, tbName:%s, tbType:%d", output->dbFName, output->tbName,
             output->tbMeta->tableType);
D
dapan 已提交
164
  } else {
X
Xiaoyu Wang 已提交
165 166
    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 已提交
167 168
  }

D
dapan1121 已提交
169 170
  if (pOutput) {
    CTG_ERR_JRET(ctgCloneMetaOutput(output, pOutput));
D
dapan1121 已提交
171
  }
D
dapan1121 已提交
172

D
dapan1121 已提交
173
  CTG_ERR_JRET(ctgUpdateTbMetaEnqueue(pCtg, output, syncReq));
D
dapan1121 已提交
174 175 176

  return TSDB_CODE_SUCCESS;

D
dapan1121 已提交
177 178
_return:

D
dapan1121 已提交
179 180
  taosMemoryFreeClear(output->tbMeta);
  taosMemoryFreeClear(output);
X
Xiaoyu Wang 已提交
181

D
dapan1121 已提交
182 183 184
  CTG_RET(code);
}

D
dapan1121 已提交
185
int32_t ctgGetTbMeta(SCatalog* pCtg, SRequestConnInfo *pConn, SCtgTbMetaCtx* ctx, STableMeta** pTableMeta) {
D
dapan1121 已提交
186 187
  int32_t code = 0;
  STableMetaOutput *output = NULL;
D
dapan1121 已提交
188

D
dapan1121 已提交
189
  CTG_ERR_RET(ctgGetTbMetaFromCache(pCtg, pConn, ctx, pTableMeta));
D
dapan1121 已提交
190 191 192
  if (*pTableMeta) {
    goto _return;
  }
H
Haojun Liao 已提交
193

D
dapan1121 已提交
194
  while (true) {
D
dapan1121 已提交
195
    CTG_ERR_JRET(ctgRefreshTbMeta(pCtg, pConn, ctx, &output, false));
D
dapan1121 已提交
196

D
dapan1121 已提交
197 198 199
    if (CTG_IS_META_TABLE(output->metaType)) {
      *pTableMeta = output->tbMeta;
      goto _return;
D
dapan 已提交
200
    }
D
dapan1121 已提交
201 202 203

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

D
dapan1121 已提交
205 206 207 208 209 210 211 212
      *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 已提交
213 214
    }

D
dapan1121 已提交
215
    // HANDLE ONLY CHILD TABLE META
D
dapan1121 已提交
216

D
dapan1121 已提交
217
    taosMemoryFreeClear(output->tbMeta);
D
dapan 已提交
218

D
dapan1121 已提交
219 220 221 222 223
    SName stbName = *ctx->pName;
    strcpy(stbName.tname, output->tbName);
    SCtgTbMetaCtx stbCtx = {0};
    stbCtx.flag = ctx->flag;
    stbCtx.pName = &stbName;
X
Xiaoyu Wang 已提交
224

D
dapan1121 已提交
225 226 227 228 229
    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 已提交
230

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

D
dapan1121 已提交
233 234
    break;
  }
D
dapan 已提交
235

D
dapan1121 已提交
236
_return:
D
dapan 已提交
237

D
dapan1121 已提交
238 239 240 241 242 243 244
  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 已提交
245

D
dapan1121 已提交
246
    if (TSDB_SUPER_TABLE == ctx->tbInfo.tbType) {
D
dapan1121 已提交
247
      ctgDropStbMetaEnqueue(pCtg, dbFName, ctx->tbInfo.dbId, ctx->pName->tname, ctx->tbInfo.suid, false);
D
dapan1121 已提交
248
    } else {
D
dapan1121 已提交
249
      ctgDropTbMetaEnqueue(pCtg, dbFName, ctx->tbInfo.dbId, ctx->pName->tname, false);
D
dapan1121 已提交
250 251
    }
  }
D
dapan 已提交
252

D
dapan1121 已提交
253
  taosMemoryFreeClear(output);
D
dapan 已提交
254

D
dapan1121 已提交
255 256 257 258
  if (*pTableMeta) {
    ctgDebug("tbmeta returned, tbName:%s, tbType:%d", ctx->pName->tname, (*pTableMeta)->tableType);
    ctgdShowTableMeta(pCtg, ctx->pName->tname, *pTableMeta);
  }
D
dapan 已提交
259 260 261 262

  CTG_RET(code);
}

X
Xiaoyu Wang 已提交
263 264
int32_t ctgUpdateTbMeta(SCatalog* pCtg, STableMetaRsp* rspMsg, bool syncOp) {
  STableMetaOutput* output = taosMemoryCalloc(1, sizeof(STableMetaOutput));
D
dapan1121 已提交
265 266
  if (NULL == output) {
    ctgError("malloc %d failed", (int32_t)sizeof(STableMetaOutput));
D
dapan1121 已提交
267
    CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
D
dapan1121 已提交
268
  }
X
Xiaoyu Wang 已提交
269

D
dapan1121 已提交
270 271 272 273 274 275
  int32_t code = 0;

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

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

D
dapan1121 已提交
277
  SET_META_TYPE_TABLE(output->metaType);
X
Xiaoyu Wang 已提交
278

D
dapan1121 已提交
279 280 281 282 283
  CTG_ERR_JRET(queryCreateTableMetaFromMsg(rspMsg, rspMsg->tableType == TSDB_SUPER_TABLE, &output->tbMeta));

  CTG_ERR_JRET(ctgUpdateTbMetaEnqueue(pCtg, output, syncOp));

  return TSDB_CODE_SUCCESS;
X
Xiaoyu Wang 已提交
284

D
dapan1121 已提交
285 286 287 288
_return:

  taosMemoryFreeClear(output->tbMeta);
  taosMemoryFreeClear(output);
X
Xiaoyu Wang 已提交
289

D
dapan1121 已提交
290 291 292
  CTG_RET(code);
}

D
dapan1121 已提交
293
int32_t ctgChkAuth(SCatalog* pCtg, SRequestConnInfo *pConn, const char* user, const char* dbFName, AUTH_TYPE type, bool *pass) {
D
dapan1121 已提交
294 295
  bool inCache = false;
  int32_t code = 0;
X
Xiaoyu Wang 已提交
296

D
dapan1121 已提交
297 298
  *pass = false;
  
D
dapan1121 已提交
299
  CTG_ERR_RET(ctgChkAuthFromCache(pCtg, (char*)user, (char*)dbFName, type, &inCache, pass));
D
dapan1121 已提交
300

D
dapan1121 已提交
301 302 303
  if (inCache) {
    return TSDB_CODE_SUCCESS;
  }
D
dapan1121 已提交
304

D
dapan1121 已提交
305
  SGetUserAuthRsp authRsp = {0};
D
dapan1121 已提交
306
  CTG_ERR_RET(ctgGetUserDbAuthFromMnode(pCtg, pConn, user, &authRsp, NULL));
D
dapan1121 已提交
307 308 309 310
  
  if (authRsp.superAuth) {
    *pass = true;
    goto _return;
D
dapan1121 已提交
311 312
  }

D
dapan1121 已提交
313 314 315 316
  if (authRsp.createdDbs && taosHashGet(authRsp.createdDbs, dbFName, strlen(dbFName))) {
    *pass = true;
    goto _return;
  }
D
dapan1121 已提交
317

D
dapan1121 已提交
318 319 320 321 322
  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 已提交
323

D
dapan1121 已提交
324
_return:
D
dapan1121 已提交
325

D
dapan1121 已提交
326
  ctgUpdateUserEnqueue(pCtg, &authRsp, false);
D
dapan1121 已提交
327

D
dapan1121 已提交
328 329 330
  return TSDB_CODE_SUCCESS;
}

D
dapan1121 已提交
331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
int32_t ctgGetTbType(SCatalog* pCtg, SRequestConnInfo *pConn, SName* pTableName, int32_t *tbType) {
  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;
  }

  STableMeta* pMeta = NULL;
  CTG_ERR_RET(catalogGetTableMeta(pCtg, pConn, pTableName, &pMeta));

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

  return TSDB_CODE_SUCCESS;
}

D
dapan1121 已提交
348
int32_t ctgGetTbIndex(SCatalog* pCtg, SRequestConnInfo *pConn, SName* pTableName, SArray** pRes) {
D
dapan1121 已提交
349 350 351 352 353
  CTG_ERR_RET(ctgReadTbIndexFromCache(pCtg, pTableName, pRes));
  if (*pRes) {
    return TSDB_CODE_SUCCESS;
  }

D
dapan1121 已提交
354 355 356 357 358
  STableIndex *pIndex = taosMemoryCalloc(1, sizeof(STableIndex));
  if (NULL == pIndex) {
    CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
  }
  
D
dapan1121 已提交
359 360 361 362 363 364
  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);
D
dapan1121 已提交
365 366 367 368 369 370 371
  
  SArray* pInfo = NULL;
  CTG_ERR_JRET(ctgCloneTableIndex(pIndex->pIndex, &pInfo));

  *pRes = pInfo;

  CTG_ERR_JRET(ctgUpdateTbIndexEnqueue(pCtg, &pIndex, false));
D
dapan1121 已提交
372 373

  return TSDB_CODE_SUCCESS;
D
dapan1121 已提交
374 375 376 377 378 379 380 381 382 383

_return:

  tFreeSTableIndexRsp(pIndex);
  taosMemoryFree(pIndex);

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

  CTG_RET(code);
D
dapan1121 已提交
384 385
}

D
dapan1121 已提交
386 387 388 389 390 391 392 393 394 395 396 397 398 399
int32_t ctgGetTbCfg(SCatalog* pCtg, SRequestConnInfo *pConn, SName* pTableName, STableCfg** pCfg) {
  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};
    CTG_ERR_RET(catalogGetTableHashVgroup(pCtg, pConn, pTableName, &vgroupInfo));
    CTG_ERR_RET(ctgGetTableCfgFromVnode(pCtg, pConn, pTableName, &vgroupInfo, pCfg, NULL));
  }

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

D
dapan1121 已提交
401
int32_t ctgGetTbDistVgInfo(SCatalog* pCtg, SRequestConnInfo *pConn, SName* pTableName, SArray** pVgList) {
D
dapan1121 已提交
402 403 404 405 406 407
  STableMeta *tbMeta = NULL;
  int32_t code = 0;
  SVgroupInfo vgroupInfo = {0};
  SCtgDBCache* dbCache = NULL;
  SArray *vgList = NULL;
  SDBVgInfo *vgInfo = NULL;
D
dapan1121 已提交
408 409 410
  SCtgTbMetaCtx ctx = {0};
  ctx.pName = pTableName;
  ctx.flag = CTG_FLAG_UNKNOWN_STB;
D
dapan1121 已提交
411 412 413

  *pVgList = NULL;
  
D
dapan1121 已提交
414
  CTG_ERR_JRET(ctgGetTbMeta(pCtg, pConn, &ctx, &tbMeta));
D
dapan1121 已提交
415 416 417 418 419

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

  SHashObj *vgHash = NULL;  
D
dapan1121 已提交
420
  CTG_ERR_JRET(ctgGetDBVgInfo(pCtg, pConn, db, &dbCache, &vgInfo));
D
dapan1121 已提交
421 422

  if (dbCache) {
D
dapan1121 已提交
423
    vgHash = dbCache->vgCache.vgInfo->vgHash;
D
dapan1121 已提交
424 425 426 427 428 429 430 431 432 433
  } 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 已提交
434

D
dapan1121 已提交
435 436 437 438 439 440 441 442 443 444
#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 已提交
445
      CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);    
D
dapan1121 已提交
446 447 448 449 450 451 452 453 454
    }

    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 已提交
455
#endif
D
dapan1121 已提交
456 457 458 459 460
  }

_return:

  if (dbCache) {
D
dapan1121 已提交
461
    ctgRUnlockVgInfo(dbCache);
D
dapan1121 已提交
462 463 464
    ctgReleaseDBCache(pCtg, dbCache);
  }

wafwerar's avatar
wafwerar 已提交
465
  taosMemoryFreeClear(tbMeta);
D
dapan1121 已提交
466 467 468

  if (vgInfo) {
    taosHashCleanup(vgInfo->vgHash);
wafwerar's avatar
wafwerar 已提交
469
    taosMemoryFreeClear(vgInfo);
D
dapan1121 已提交
470 471 472 473 474 475 476 477 478 479
  }

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

  CTG_RET(code);
}

X
Xiaoyu Wang 已提交
480
int32_t catalogInit(SCatalogCfg* cfg) {
D
dapan 已提交
481
  if (gCtgMgmt.pCluster) {
D
dapan 已提交
482
    qError("catalog already initialized");
D
dapan1121 已提交
483
    CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT);
D
dapan1121 已提交
484 485
  }

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

D
dapan1121 已提交
488
  if (cfg) {
D
dapan 已提交
489
    memcpy(&gCtgMgmt.cfg, cfg, sizeof(*cfg));
H
Haojun Liao 已提交
490

D
dapan 已提交
491 492
    if (gCtgMgmt.cfg.maxDBCacheNum == 0) {
      gCtgMgmt.cfg.maxDBCacheNum = CTG_DEFAULT_CACHE_DB_NUMBER;
D
dapan1121 已提交
493 494
    }

D
dapan 已提交
495 496
    if (gCtgMgmt.cfg.maxTblCacheNum == 0) {
      gCtgMgmt.cfg.maxTblCacheNum = CTG_DEFAULT_CACHE_TBLMETA_NUMBER;
D
dapan1121 已提交
497
    }
D
dapan1121 已提交
498

D
dapan 已提交
499 500
    if (gCtgMgmt.cfg.dbRentSec == 0) {
      gCtgMgmt.cfg.dbRentSec = CTG_DEFAULT_RENT_SECOND;
D
dapan1121 已提交
501 502
    }

D
dapan 已提交
503 504
    if (gCtgMgmt.cfg.stbRentSec == 0) {
      gCtgMgmt.cfg.stbRentSec = CTG_DEFAULT_RENT_SECOND;
D
dapan1121 已提交
505
    }
D
dapan1121 已提交
506
  } else {
D
dapan 已提交
507 508 509 510
    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 已提交
511 512
  }

X
Xiaoyu Wang 已提交
513 514
  gCtgMgmt.pCluster = taosHashInit(CTG_DEFAULT_CACHE_CLUSTER_NUMBER, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT),
                                   false, HASH_ENTRY_LOCK);
D
dapan 已提交
515
  if (NULL == gCtgMgmt.pCluster) {
D
dapan1121 已提交
516 517
    qError("taosHashInit %d cluster cache failed", CTG_DEFAULT_CACHE_CLUSTER_NUMBER);
    CTG_ERR_RET(TSDB_CODE_CTG_INTERNAL_ERROR);
D
dapan1121 已提交
518 519
  }

D
dapan1121 已提交
520 521 522 523
  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 已提交
524

wafwerar's avatar
wafwerar 已提交
525
  gCtgMgmt.queue.head = taosMemoryCalloc(1, sizeof(SCtgQNode));
D
dapan1121 已提交
526
  if (NULL == gCtgMgmt.queue.head) {
D
dapan1121 已提交
527 528 529
    qError("calloc %d failed", (int32_t)sizeof(SCtgQNode));
    CTG_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
  }
D
dapan1121 已提交
530
  gCtgMgmt.queue.tail = gCtgMgmt.queue.head;
D
dapan1121 已提交
531

D
dapan1121 已提交
532 533 534 535 536 537
  gCtgMgmt.jobPool = taosOpenRef(200, ctgFreeJob);
  if (gCtgMgmt.jobPool < 0) {
    qError("taosOpenRef failed, error:%s", tstrerror(terrno));
    CTG_ERR_RET(terrno);
  }

D
dapan1121 已提交
538 539
  CTG_ERR_RET(ctgStartUpdateThread());

X
Xiaoyu Wang 已提交
540 541
  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 已提交
542

D
dapan 已提交
543
  return TSDB_CODE_SUCCESS;
D
dapan1121 已提交
544 545
}

D
dapan1121 已提交
546
int32_t catalogGetHandle(uint64_t clusterId, SCatalog** catalogHandle) {
547
  if (NULL == catalogHandle) {
D
dapan1121 已提交
548
    CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT);
D
dapan 已提交
549 550
  }

D
dapan1121 已提交
551 552
  CTG_API_ENTER();

D
dapan 已提交
553
  if (NULL == gCtgMgmt.pCluster) {
D
dapan1121 已提交
554
    qError("catalog cluster cache are not ready, clusterId:0x%" PRIx64, clusterId);
D
dapan1121 已提交
555
    CTG_API_LEAVE(TSDB_CODE_CTG_NOT_READY);
D
dapan 已提交
556 557
  }

X
Xiaoyu Wang 已提交
558 559
  int32_t   code = 0;
  SCatalog* clusterCtg = NULL;
D
dapan 已提交
560

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

D
dapan1121 已提交
564 565
    if (ctg && (*ctg)) {
      *catalogHandle = *ctg;
D
dapan1121 已提交
566
      qDebug("got catalog handle from cache, clusterId:0x%" PRIx64 ", CTG:%p", clusterId, *ctg);
D
dapan1121 已提交
567
      CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan1121 已提交
568
    }
D
dapan 已提交
569

wafwerar's avatar
wafwerar 已提交
570
    clusterCtg = taosMemoryCalloc(1, sizeof(SCatalog));
D
dapan1121 已提交
571 572
    if (NULL == clusterCtg) {
      qError("calloc %d failed", (int32_t)sizeof(SCatalog));
D
dapan1121 已提交
573
      CTG_API_LEAVE(TSDB_CODE_OUT_OF_MEMORY);
D
dapan1121 已提交
574 575
    }

D
dapan1121 已提交
576 577
    clusterCtg->clusterId = clusterId;

D
dapan 已提交
578 579
    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 已提交
580

X
Xiaoyu Wang 已提交
581 582
    clusterCtg->dbCache = taosHashInit(gCtgMgmt.cfg.maxDBCacheNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY),
                                       false, HASH_ENTRY_LOCK);
D
dapan1121 已提交
583 584
    if (NULL == clusterCtg->dbCache) {
      qError("taosHashInit %d dbCache failed", CTG_DEFAULT_CACHE_DB_NUMBER);
D
dapan1121 已提交
585 586 587 588 589 590 591
      CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
    }

    clusterCtg->userCache = taosHashInit(gCtgMgmt.cfg.maxUserCacheNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_ENTRY_LOCK);
    if (NULL == clusterCtg->userCache) {
      qError("taosHashInit %d user cache failed", gCtgMgmt.cfg.maxUserCacheNum);
      CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
D
dapan1121 已提交
592 593
    }

D
dapan 已提交
594
    code = taosHashPut(gCtgMgmt.pCluster, &clusterId, sizeof(clusterId), &clusterCtg, POINTER_BYTES);
D
dapan1121 已提交
595 596
    if (code) {
      if (HASH_NODE_EXIST(code)) {
D
dapan1121 已提交
597
        ctgFreeHandleImpl(clusterCtg);
D
dapan1121 已提交
598 599
        continue;
      }
X
Xiaoyu Wang 已提交
600

D
dapan1121 已提交
601
      qError("taosHashPut CTG to cache failed, clusterId:0x%" PRIx64, clusterId);
D
dapan1121 已提交
602 603 604
      CTG_ERR_JRET(TSDB_CODE_CTG_INTERNAL_ERROR);
    }

D
dapan1121 已提交
605
    qDebug("add CTG to cache, clusterId:0x%" PRIx64 ", CTG:%p", clusterId, clusterCtg);
D
dapan1121 已提交
606 607

    break;
D
dapan 已提交
608
  }
D
dapan1121 已提交
609 610

  *catalogHandle = clusterCtg;
D
dapan1121 已提交
611

D
dapan1121 已提交
612
  CTG_CACHE_STAT_INC(numOfCluster, 1);
X
Xiaoyu Wang 已提交
613

D
dapan1121 已提交
614
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan1121 已提交
615 616 617

_return:

D
dapan1121 已提交
618
  ctgFreeHandleImpl(clusterCtg);
D
dapan1121 已提交
619

D
dapan1121 已提交
620
  CTG_API_LEAVE(code);
D
dapan 已提交
621 622
}

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

D
dapan1121 已提交
626
  if (NULL == pCtg || NULL == dbFName || NULL == version || NULL == dbId) {
D
dapan1121 已提交
627 628 629
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

X
Xiaoyu Wang 已提交
630 631
  SCtgDBCache* dbCache = NULL;
  int32_t      code = 0;
D
dapan1121 已提交
632

D
dapan1121 已提交
633 634
  CTG_ERR_JRET(ctgAcquireVgInfoFromCache(pCtg, dbFName, &dbCache));
  if (NULL == dbCache) {
D
dapan1121 已提交
635
    *version = CTG_DEFAULT_INVALID_VERSION;
D
dapan1121 已提交
636
    CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan1121 已提交
637 638
  }

D
dapan1121 已提交
639
  *version = dbCache->vgCache.vgInfo->vgVersion;
D
dapan1121 已提交
640
  *dbId = dbCache->dbId;
D
dapan1121 已提交
641
  *tableNum = dbCache->vgCache.vgInfo->numOfTable;
D
dapan1121 已提交
642

D
dapan1121 已提交
643
  ctgReleaseVgInfoToCache(pCtg, dbCache);
D
dapan1121 已提交
644

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

D
dapan1121 已提交
647
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan1121 已提交
648 649 650 651

_return:

  CTG_API_LEAVE(code);
D
dapan1121 已提交
652 653
}

D
dapan1121 已提交
654
int32_t catalogGetDBVgInfo(SCatalog* pCtg, SRequestConnInfo *pConn, const char* dbFName, SArray** vgroupList) {
D
dapan1121 已提交
655 656
  CTG_API_ENTER();

D
dapan1121 已提交
657
  if (NULL == pCtg || NULL == dbFName || NULL == pConn || NULL == vgroupList) {
D
dapan1121 已提交
658 659
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }
660

D
dapan1121 已提交
661
  SCtgDBCache* dbCache = NULL;
662
  int32_t code = 0;
D
dapan1121 已提交
663
  SArray *vgList = NULL;
D
dapan1121 已提交
664 665
  SHashObj *vgHash = NULL;
  SDBVgInfo *vgInfo = NULL;
D
dapan1121 已提交
666
  CTG_ERR_JRET(ctgGetDBVgInfo(pCtg, pConn, dbFName, &dbCache, &vgInfo));
D
dapan1121 已提交
667
  if (dbCache) {
D
dapan1121 已提交
668
    vgHash = dbCache->vgCache.vgInfo->vgHash;
D
dapan1121 已提交
669 670
  } else {
    vgHash = vgInfo->vgHash;
D
dapan1121 已提交
671 672
  }

D
dapan1121 已提交
673
  CTG_ERR_JRET(ctgGenerateVgList(pCtg, vgHash, &vgList));
D
dapan1121 已提交
674 675 676 677 678

  *vgroupList = vgList;
  vgList = NULL;

_return:
D
dapan1121 已提交
679 680

  if (dbCache) {
D
dapan1121 已提交
681
    ctgRUnlockVgInfo(dbCache);
D
dapan1121 已提交
682
    ctgReleaseDBCache(pCtg, dbCache);
D
dapan1121 已提交
683 684
  }

D
dapan1121 已提交
685 686
  if (vgInfo) {
    taosHashCleanup(vgInfo->vgHash);
wafwerar's avatar
wafwerar 已提交
687
    taosMemoryFreeClear(vgInfo);
D
dapan1121 已提交
688 689
  }

X
Xiaoyu Wang 已提交
690
  CTG_API_LEAVE(code);
D
dapan1121 已提交
691 692
}

D
dapan1121 已提交
693
int32_t catalogUpdateDBVgInfo(SCatalog* pCtg, const char* dbFName, uint64_t dbId, SDBVgInfo* dbInfo) {
D
dapan1121 已提交
694
  CTG_API_ENTER();
D
dapan1121 已提交
695 696

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

D
dapan1121 已提交
698
  if (NULL == pCtg || NULL == dbFName || NULL == dbInfo) {
D
dapan1121 已提交
699
    ctgFreeVgInfo(dbInfo);
D
dapan1121 已提交
700 701 702
    CTG_ERR_JRET(TSDB_CODE_CTG_INVALID_INPUT);
  }

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

D
dapan1121 已提交
705 706
_return:

D
dapan1121 已提交
707
  CTG_API_LEAVE(code);
D
dapan1121 已提交
708 709
}

D
dapan1121 已提交
710 711 712
int32_t catalogRemoveDB(SCatalog* pCtg, const char* dbFName, uint64_t dbId) {
  CTG_API_ENTER();

D
dapan1121 已提交
713
  int32_t code = 0;
X
Xiaoyu Wang 已提交
714

D
dapan1121 已提交
715 716
  if (NULL == pCtg || NULL == dbFName) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
D
dapan1121 已提交
717 718
  }

D
dapan1121 已提交
719
  if (NULL == pCtg->dbCache) {
D
dapan1121 已提交
720
    CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan1121 已提交
721
  }
D
dapan1121 已提交
722

D
dapan1121 已提交
723
  CTG_ERR_JRET(ctgDropDbCacheEnqueue(pCtg, dbFName, dbId));
D
dapan 已提交
724

D
dapan1121 已提交
725
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
X
Xiaoyu Wang 已提交
726

D
dapan1121 已提交
727 728
_return:

D
dapan1121 已提交
729
  CTG_API_LEAVE(code);
D
dapan1121 已提交
730 731
}

X
Xiaoyu Wang 已提交
732
int32_t catalogUpdateVgEpSet(SCatalog* pCtg, const char* dbFName, int32_t vgId, SEpSet* epSet) {
D
dapan1121 已提交
733 734 735
  CTG_API_ENTER();

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

D
dapan1121 已提交
737 738 739 740 741 742 743
  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 已提交
744

D
dapan1121 已提交
745
  CTG_API_LEAVE(code);
D
dapan1121 已提交
746
}
D
dapan1121 已提交
747

D
dapan1121 已提交
748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771
int32_t catalogUpdateTableIndex(SCatalog* pCtg, STableIndexRsp *pRsp) {
  CTG_API_ENTER();

  int32_t code = 0;
  
  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:
  
  CTG_API_LEAVE(code);
}


D
dapan1121 已提交
772
int32_t catalogRemoveTableMeta(SCatalog* pCtg, SName* pTableName) {
D
dapan 已提交
773 774 775
  CTG_API_ENTER();

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

D
dapan 已提交
777 778 779 780 781 782 783 784
  if (NULL == pCtg || NULL == pTableName) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

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

D
dapan1121 已提交
785
  CTG_ERR_JRET(ctgRemoveTbMetaFromCache(pCtg, pTableName, true));
D
dapan 已提交
786 787

_return:
X
Xiaoyu Wang 已提交
788

D
dapan 已提交
789 790 791
  CTG_API_LEAVE(code);
}

D
dapan1121 已提交
792 793 794
int32_t catalogRemoveStbMeta(SCatalog* pCtg, const char* dbFName, uint64_t dbId, const char* stbName, uint64_t suid) {
  CTG_API_ENTER();

D
dapan 已提交
795
  int32_t code = 0;
X
Xiaoyu Wang 已提交
796

D
dapan1121 已提交
797 798
  if (NULL == pCtg || NULL == dbFName || NULL == stbName) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
D
dapan 已提交
799 800
  }

D
dapan1121 已提交
801
  if (NULL == pCtg->dbCache) {
D
dapan1121 已提交
802
    CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan 已提交
803
  }
D
dapan1121 已提交
804

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

D
dapan1121 已提交
807
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
X
Xiaoyu Wang 已提交
808

D
dapan1121 已提交
809 810
_return:

D
dapan1121 已提交
811
  CTG_API_LEAVE(code);
D
dapan 已提交
812 813
}

D
dapan1121 已提交
814
int32_t catalogGetTableMeta(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, STableMeta** pTableMeta) {
D
dapan1121 已提交
815 816
  CTG_API_ENTER();

D
dapan1121 已提交
817 818 819 820
  SCtgTbMetaCtx ctx = {0};
  ctx.pName = (SName*)pTableName;
  ctx.flag = CTG_FLAG_UNKNOWN_STB;
  
D
dapan1121 已提交
821
  CTG_API_LEAVE(ctgGetTbMeta(pCtg, pConn, &ctx, pTableMeta));
D
dapan1121 已提交
822
}
D
dapan1121 已提交
823

D
dapan1121 已提交
824
int32_t catalogGetSTableMeta(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, STableMeta** pTableMeta) {
D
dapan1121 已提交
825 826
  CTG_API_ENTER();

D
dapan1121 已提交
827 828 829 830
  SCtgTbMetaCtx ctx = {0};
  ctx.pName = (SName*)pTableName;
  ctx.flag = CTG_FLAG_STB;

D
dapan1121 已提交
831
  CTG_API_LEAVE(ctgGetTbMeta(pCtg, pConn, &ctx, pTableMeta));
D
dapan1121 已提交
832 833
}

X
Xiaoyu Wang 已提交
834
int32_t catalogUpdateTableMeta(SCatalog* pCtg, STableMetaRsp* pMsg) {
D
dapan1121 已提交
835 836
  CTG_API_ENTER();

D
dapan1121 已提交
837
  if (NULL == pCtg || NULL == pMsg) {
D
dapan1121 已提交
838 839 840
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
841
  int32_t code = 0;
D
dapan1121 已提交
842
  CTG_ERR_JRET(ctgUpdateTbMeta(pCtg, pMsg, true));
X
Xiaoyu Wang 已提交
843

D
dapan1121 已提交
844
_return:
X
Xiaoyu Wang 已提交
845

D
dapan1121 已提交
846
  CTG_API_LEAVE(code);
D
dapan1121 已提交
847 848
}

D
dapan1121 已提交
849
int32_t catalogChkTbMetaVersion(SCatalog* pCtg, SRequestConnInfo *pConn, SArray* pTables) {
D
dapan1121 已提交
850 851
  CTG_API_ENTER();

D
dapan1121 已提交
852
  if (NULL == pCtg || NULL == pConn || NULL == pTables) {
D
dapan1121 已提交
853 854
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }
D
dapan1121 已提交
855

X
Xiaoyu Wang 已提交
856
  SName   name;
D
dapan1121 已提交
857
  int32_t sver = 0;
D
dapan1121 已提交
858
  int32_t tver = 0;
D
dapan1121 已提交
859 860 861
  int32_t tbNum = taosArrayGetSize(pTables);
  for (int32_t i = 0; i < tbNum; ++i) {
    STbSVersion* pTb = (STbSVersion*)taosArrayGet(pTables, i);
D
dapan1121 已提交
862 863 864
    if (NULL == pTb->tbFName || 0 == pTb->tbFName[0]) {
      continue;
    }
X
Xiaoyu Wang 已提交
865

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

D
dapan1121 已提交
868 869 870 871
    if (CTG_IS_SYS_DBNAME(name.dbname)) {
      continue;
    }

L
Liu Jicong 已提交
872
    int32_t  tbType = 0;
D
dapan1121 已提交
873
    uint64_t suid = 0;
L
Liu Jicong 已提交
874
    char     stbName[TSDB_TABLE_FNAME_LEN];
D
dapan1121 已提交
875 876
    ctgReadTbVerFromCache(pCtg, &name, &sver, &tver, &tbType, &suid, stbName);
    if ((sver >= 0 && sver < pTb->sver) || (tver >= 0 && tver < pTb->tver)) {
D
dapan1121 已提交
877 878 879 880
      switch (tbType) {
        case TSDB_CHILD_TABLE: {
          SName stb = name;
          strcpy(stb.tname, stbName);
L
Liu Jicong 已提交
881
          catalogRemoveTableMeta(pCtg, &stb);
D
dapan1121 已提交
882 883 884 885 886 887 888 889 890 891
          break;
        }
        case TSDB_SUPER_TABLE:
        case TSDB_NORMAL_TABLE:
          catalogRemoveTableMeta(pCtg, &name);
          break;
        default:
          ctgError("ignore table type %d", tbType);
          break;
      }
D
dapan1121 已提交
892 893 894 895
    }
  }

  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan1121 已提交
896 897
}

D
dapan1121 已提交
898
int32_t catalogRefreshDBVgInfo(SCatalog* pCtg, SRequestConnInfo *pConn, const char* dbFName) {
D
dapan1121 已提交
899 900
  CTG_API_ENTER();

D
dapan1121 已提交
901
  if (NULL == pCtg || NULL == pConn || NULL == dbFName) {
D
dapan1121 已提交
902 903 904
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
905
  CTG_API_LEAVE(ctgRefreshDBVgInfo(pCtg, pConn, dbFName));
D
dapan1121 已提交
906
}
D
dapan1121 已提交
907

D
dapan1121 已提交
908
int32_t catalogRefreshTableMeta(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, int32_t isSTable) {
D
dapan1121 已提交
909 910
  CTG_API_ENTER();

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

D
dapan1121 已提交
915 916 917 918
  SCtgTbMetaCtx ctx = {0};
  ctx.pName = (SName*)pTableName;
  ctx.flag = CTG_FLAG_FORCE_UPDATE | CTG_FLAG_MAKE_STB(isSTable);

D
dapan1121 已提交
919
  CTG_API_LEAVE(ctgRefreshTbMeta(pCtg, pConn, &ctx, NULL, true));
920
}
921

D
dapan1121 已提交
922
int32_t catalogRefreshGetTableMeta(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, STableMeta** pTableMeta, int32_t isSTable) {
D
dapan1121 已提交
923 924
  CTG_API_ENTER();

D
dapan1121 已提交
925 926 927 928
  SCtgTbMetaCtx ctx = {0};
  ctx.pName = (SName*)pTableName;
  ctx.flag = CTG_FLAG_FORCE_UPDATE | CTG_FLAG_MAKE_STB(isSTable);

D
dapan1121 已提交
929
  CTG_API_LEAVE(ctgGetTbMeta(pCtg, pConn, &ctx, pTableMeta));
D
dapan1121 已提交
930 931
}

D
dapan1121 已提交
932
int32_t catalogGetTableDistVgInfo(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, SArray** pVgList) {
D
dapan1121 已提交
933
  CTG_API_ENTER();
D
dapan1121 已提交
934

D
dapan1121 已提交
935
  if (NULL == pCtg || NULL == pConn || NULL == pTableName || NULL == pVgList) {
D
dapan1121 已提交
936 937
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }
D
dapan1121 已提交
938

D
dapan1121 已提交
939
  if (CTG_IS_SYS_DBNAME(pTableName->dbname)) {
D
dapan1121 已提交
940 941 942
    ctgError("no valid vgInfo for db, dbname:%s", pTableName->dbname);
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }
D
dapan1121 已提交
943

D
dapan1121 已提交
944
  CTG_API_LEAVE(ctgGetTbDistVgInfo(pCtg, pConn, (SName*)pTableName, pVgList));
D
dapan1121 已提交
945 946
}

D
dapan1121 已提交
947
int32_t catalogGetTableHashVgroup(SCatalog *pCtg, SRequestConnInfo *pConn, const SName *pTableName, SVgroupInfo *pVgroup) {
D
dapan1121 已提交
948 949
  CTG_API_ENTER();

D
dapan1121 已提交
950
  if (CTG_IS_SYS_DBNAME(pTableName->dbname)) {
D
dapan1121 已提交
951 952 953 954
    ctgError("no valid vgInfo for db, dbname:%s", pTableName->dbname);
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
955
  SCtgDBCache* dbCache = NULL;
X
Xiaoyu Wang 已提交
956 957
  int32_t      code = 0;
  char         db[TSDB_DB_FNAME_LEN] = {0};
H
Haojun Liao 已提交
958
  tNameGetFullDbName(pTableName, db);
D
dapan1121 已提交
959

D
dapan1121 已提交
960
  SDBVgInfo *vgInfo = NULL;
D
dapan1121 已提交
961
  CTG_ERR_JRET(ctgGetDBVgInfo(pCtg, pConn, db, &dbCache, &vgInfo));
D
dapan1121 已提交
962

D
dapan1121 已提交
963
  CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pCtg, vgInfo ? vgInfo : dbCache->vgCache.vgInfo, pTableName, pVgroup));
D
dapan1121 已提交
964

D
dapan1121 已提交
965
_return:
D
dapan1121 已提交
966

D
dapan1121 已提交
967
  if (dbCache) {
D
dapan1121 已提交
968
    ctgRUnlockVgInfo(dbCache);
D
dapan1121 已提交
969 970 971 972 973
    ctgReleaseDBCache(pCtg, dbCache);
  }

  if (vgInfo) {
    taosHashCleanup(vgInfo->vgHash);
wafwerar's avatar
wafwerar 已提交
974
    taosMemoryFreeClear(vgInfo);
D
dapan1121 已提交
975
  }
D
dapan1121 已提交
976

D
dapan1121 已提交
977
  CTG_API_LEAVE(code);
D
dapan1121 已提交
978 979
}

D
dapan1121 已提交
980
int32_t catalogGetAllMeta(SCatalog* pCtg, SRequestConnInfo *pConn, const SCatalogReq* pReq, SMetaData* pRsp) {
D
dapan1121 已提交
981 982
  CTG_API_ENTER();

D
dapan1121 已提交
983
  if (NULL == pCtg || NULL == pConn || NULL == pReq || NULL == pRsp) {
D
dapan1121 已提交
984 985 986
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
987
  int32_t code = 0;
D
dapan1121 已提交
988
  pRsp->pTableMeta = NULL;
D
dapan1121 已提交
989

D
dapan1121 已提交
990 991
  if (pReq->pTableMeta) {
    int32_t tbNum = (int32_t)taosArrayGetSize(pReq->pTableMeta);
D
dapan1121 已提交
992
    if (tbNum <= 0) {
D
dapan1121 已提交
993
      ctgError("empty table name list, tbNum:%d", tbNum);
D
dapan1121 已提交
994
      CTG_ERR_JRET(TSDB_CODE_CTG_INVALID_INPUT);
D
dapan1121 已提交
995
    }
H
Haojun Liao 已提交
996

D
dapan1121 已提交
997 998
    pRsp->pTableMeta = taosArrayInit(tbNum, POINTER_BYTES);
    if (NULL == pRsp->pTableMeta) {
D
dapan1121 已提交
999
      ctgError("taosArrayInit %d failed", tbNum);
D
dapan1121 已提交
1000
      CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
D
dapan1121 已提交
1001
    }
X
Xiaoyu Wang 已提交
1002

D
dapan1121 已提交
1003
    for (int32_t i = 0; i < tbNum; ++i) {
X
Xiaoyu Wang 已提交
1004 1005
      SName*        name = taosArrayGet(pReq->pTableMeta, i);
      STableMeta*   pTableMeta = NULL;
D
dapan1121 已提交
1006 1007 1008
      SCtgTbMetaCtx ctx = {0};
      ctx.pName = name;
      ctx.flag = CTG_FLAG_UNKNOWN_STB;
D
dapan1121 已提交
1009
      
D
dapan1121 已提交
1010
      CTG_ERR_JRET(ctgGetTbMeta(pCtg, pConn, &ctx, &pTableMeta));
D
dapan1121 已提交
1011 1012 1013

      if (NULL == taosArrayPush(pRsp->pTableMeta, &pTableMeta)) {
        ctgError("taosArrayPush failed, idx:%d", i);
wafwerar's avatar
wafwerar 已提交
1014
        taosMemoryFreeClear(pTableMeta);
D
dapan1121 已提交
1015
        CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
D
dapan1121 已提交
1016 1017 1018 1019
      }
    }
  }

D
dapan1121 已提交
1020
  if (pReq->qNodeRequired) {
D
dapan1121 已提交
1021
    pRsp->pQnodeList = taosArrayInit(10, sizeof(SQueryNodeLoad));
D
dapan1121 已提交
1022
    CTG_ERR_JRET(ctgGetQnodeListFromMnode(pCtg, pConn, pRsp->pQnodeList, NULL));
D
dapan1121 已提交
1023 1024
  }

D
dapan1121 已提交
1025
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan1121 已提交
1026

X
Xiaoyu Wang 已提交
1027
_return:
D
dapan1121 已提交
1028

D
dapan1121 已提交
1029 1030 1031
  if (pRsp->pTableMeta) {
    int32_t aSize = taosArrayGetSize(pRsp->pTableMeta);
    for (int32_t i = 0; i < aSize; ++i) {
X
Xiaoyu Wang 已提交
1032
      STableMeta* pMeta = taosArrayGetP(pRsp->pTableMeta, i);
wafwerar's avatar
wafwerar 已提交
1033
      taosMemoryFreeClear(pMeta);
D
dapan1121 已提交
1034
    }
X
Xiaoyu Wang 已提交
1035

D
dapan1121 已提交
1036
    taosArrayDestroy(pRsp->pTableMeta);
D
dapan1121 已提交
1037
    pRsp->pTableMeta = NULL;
D
dapan1121 已提交
1038
  }
X
Xiaoyu Wang 已提交
1039

D
dapan1121 已提交
1040
  CTG_API_LEAVE(code);
1041
}
D
dapan 已提交
1042

D
dapan1121 已提交
1043
int32_t catalogAsyncGetAllMeta(SCatalog* pCtg, SRequestConnInfo *pConn, const SCatalogReq* pReq, catalogCallback fp, void* param, int64_t* jobId) {
D
dapan1121 已提交
1044 1045
  CTG_API_ENTER();

D
dapan1121 已提交
1046
  if (NULL == pCtg || NULL == pConn || NULL == pReq || NULL == fp || NULL == param) {
D
dapan1121 已提交
1047 1048 1049
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1050
  int32_t code = 0;
D
dapan1121 已提交
1051
  SCtgJob *pJob = NULL;
D
dapan1121 已提交
1052
  CTG_ERR_JRET(ctgInitJob(pCtg, pConn, &pJob, pReq, fp, param));
D
dapan1121 已提交
1053 1054 1055

  CTG_ERR_JRET(ctgLaunchJob(pJob));

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

D
dapan1121 已提交
1059
_return:
D
dapan1121 已提交
1060

D
dapan1121 已提交
1061 1062 1063 1064 1065 1066 1067
  if (pJob) {
    taosReleaseRef(gCtgMgmt.jobPool, pJob->refId);

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

D
dapan1121 已提交
1069 1070 1071
  CTG_API_LEAVE(code);
}

D
dapan1121 已提交
1072
int32_t catalogGetQnodeList(SCatalog* pCtg, SRequestConnInfo *pConn, SArray* pQnodeList) {
D
dapan1121 已提交
1073
  CTG_API_ENTER();
X
Xiaoyu Wang 已提交
1074

D
dapan1121 已提交
1075
  int32_t code = 0;
D
dapan1121 已提交
1076
  if (NULL == pCtg || NULL == pConn || NULL == pQnodeList) {
D
dapan1121 已提交
1077 1078 1079
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1080
  CTG_ERR_JRET(ctgGetQnodeListFromMnode(pCtg, pConn, pQnodeList, NULL));
D
dapan1121 已提交
1081 1082

_return:
D
dapan 已提交
1083

D
dapan1121 已提交
1084
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan 已提交
1085 1086
}

D
dapan1121 已提交
1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099
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);
1100 1101
}

D
dapan1121 已提交
1102
int32_t catalogGetExpiredSTables(SCatalog* pCtg, SSTableVersion **stables, uint32_t *num) {
D
dapan1121 已提交
1103 1104
  CTG_API_ENTER();

D
dapan1121 已提交
1105 1106
  if (NULL == pCtg || NULL == stables || NULL == num) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
D
dapan1121 已提交
1107 1108
  }

D
dapan1121 已提交
1109
  CTG_API_LEAVE(ctgMetaRentGet(&pCtg->stbRent, (void **)stables, num, sizeof(SSTableVersion)));
D
dapan1121 已提交
1110 1111
}

X
Xiaoyu Wang 已提交
1112
int32_t catalogGetExpiredDBs(SCatalog* pCtg, SDbVgVersion** dbs, uint32_t* num) {
D
dapan1121 已提交
1113
  CTG_API_ENTER();
X
Xiaoyu Wang 已提交
1114

D
dapan1121 已提交
1115 1116 1117
  if (NULL == pCtg || NULL == dbs || NULL == num) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }
D
dapan1121 已提交
1118

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

X
Xiaoyu Wang 已提交
1122
int32_t catalogGetExpiredUsers(SCatalog* pCtg, SUserAuthVersion** users, uint32_t* num) {
D
dapan 已提交
1123
  CTG_API_ENTER();
X
Xiaoyu Wang 已提交
1124

D
dapan 已提交
1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137
  if (NULL == pCtg || NULL == users || NULL == num) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

  *num = taosHashGetSize(pCtg->userCache);
  if (*num > 0) {
    *users = taosMemoryCalloc(*num, sizeof(SUserAuthVersion));
    if (NULL == *users) {
      ctgError("calloc %d userAuthVersion failed", *num);
      CTG_API_LEAVE(TSDB_CODE_OUT_OF_MEMORY);
    }
  }

X
Xiaoyu Wang 已提交
1138 1139
  uint32_t      i = 0;
  SCtgUserAuth* pAuth = taosHashIterate(pCtg->userCache, NULL);
D
dapan 已提交
1140
  while (pAuth != NULL) {
D
fix bug  
dapan1121 已提交
1141
    size_t len = 0;
X
Xiaoyu Wang 已提交
1142
    void*  key = taosHashGetKey(pAuth, &len);
D
fix bug  
dapan1121 已提交
1143 1144
    strncpy((*users)[i].user, key, len);
    (*users)[i].user[len] = 0;
D
dapan 已提交
1145
    (*users)[i].version = pAuth->version;
D
fix bug  
dapan1121 已提交
1146
    ++i;
D
dapan 已提交
1147 1148 1149 1150 1151 1152
    pAuth = taosHashIterate(pCtg->userCache, pAuth);
  }

  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
}

D
dapan1121 已提交
1153
int32_t catalogGetDBCfg(SCatalog* pCtg, SRequestConnInfo *pConn, const char* dbFName, SDbCfgInfo* pDbCfg) {
D
dapan1121 已提交
1154 1155
  CTG_API_ENTER();
  
D
dapan1121 已提交
1156
  if (NULL == pCtg || NULL == pConn || NULL == dbFName || NULL == pDbCfg) {
D
dapan1121 已提交
1157 1158 1159
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1160
  CTG_API_LEAVE(ctgGetDBCfgFromMnode(pCtg, pConn, dbFName, pDbCfg, NULL));
D
dapan1121 已提交
1161
}
D
dapan 已提交
1162

D
dapan1121 已提交
1163
int32_t catalogGetIndexMeta(SCatalog* pCtg, SRequestConnInfo *pConn, const char* indexName, SIndexInfo* pInfo) {
D
dapan1121 已提交
1164 1165
  CTG_API_ENTER();
  
D
dapan1121 已提交
1166
  if (NULL == pCtg || NULL == pConn || NULL == indexName || NULL == pInfo) {
D
dapan1121 已提交
1167 1168 1169
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1170
  CTG_API_LEAVE(ctgGetIndexInfoFromMnode(pCtg, pConn, indexName, pInfo, NULL));
D
dapan1121 已提交
1171 1172
}

D
dapan1121 已提交
1173
int32_t catalogGetTableIndex(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, SArray** pRes) {
D
dapan1121 已提交
1174 1175
  CTG_API_ENTER();
  
D
dapan1121 已提交
1176
  if (NULL == pCtg || NULL == pConn || NULL == pTableName || NULL == pRes) {
D
dapan1121 已提交
1177 1178 1179
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1180
  int32_t code = 0;
D
dapan1121 已提交
1181
  CTG_ERR_JRET(ctgGetTbIndex(pCtg, pConn, (SName*)pTableName, pRes));
D
dapan1121 已提交
1182
  
D
dapan1121 已提交
1183 1184 1185
_return:

  CTG_API_LEAVE(code);
D
dapan1121 已提交
1186 1187
}

D
dapan1121 已提交
1188
int32_t catalogRefreshGetTableCfg(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, STableCfg** pCfg) {
D
dapan1121 已提交
1189 1190 1191 1192 1193 1194
  CTG_API_ENTER();
  
  if (NULL == pCtg || NULL == pConn || NULL == pTableName || NULL == pCfg) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1195 1196 1197 1198 1199 1200 1201 1202
  int32_t code = 0;
  CTG_ERR_JRET(catalogRemoveTableMeta(pCtg, (SName*)pTableName));

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

_return:

  CTG_API_LEAVE(code);
D
dapan1121 已提交
1203 1204
}

D
dapan1121 已提交
1205
int32_t catalogGetUdfInfo(SCatalog* pCtg, SRequestConnInfo *pConn, const char* funcName, SFuncInfo* pInfo) {
D
dapan1121 已提交
1206 1207
  CTG_API_ENTER();
  
D
dapan1121 已提交
1208
  if (NULL == pCtg || NULL == pConn || NULL == funcName || NULL == pInfo) {
D
dapan1121 已提交
1209 1210 1211
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1212
  int32_t code = 0;
D
dapan1121 已提交
1213
  CTG_ERR_JRET(ctgGetUdfInfoFromMnode(pCtg, pConn, funcName, pInfo, NULL));
D
dapan1121 已提交
1214 1215
  
_return:
X
Xiaoyu Wang 已提交
1216

D
dapan1121 已提交
1217
  CTG_API_LEAVE(code);
D
dapan1121 已提交
1218 1219
}

D
dapan1121 已提交
1220
int32_t catalogChkAuth(SCatalog* pCtg, SRequestConnInfo *pConn, const char* user, const char* dbFName, AUTH_TYPE type, bool *pass) {
D
dapan 已提交
1221 1222
  CTG_API_ENTER();
  
D
dapan1121 已提交
1223
  if (NULL == pCtg || NULL == pConn || NULL == user || NULL == dbFName || NULL == pass) {
D
dapan 已提交
1224 1225 1226 1227
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

  int32_t code = 0;
D
dapan1121 已提交
1228
  CTG_ERR_JRET(ctgChkAuth(pCtg, pConn, user, dbFName, type, pass));
D
dapan 已提交
1229 1230 1231 1232 1233 1234
  
_return:

  CTG_API_LEAVE(code);
}

D
dapan1121 已提交
1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250
int32_t catalogGetServerVersion(SCatalog* pCtg, SRequestConnInfo *pConn, char** pVersion) {
  CTG_API_ENTER();
  
  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));
  
_return:

  CTG_API_LEAVE(code);
}


D
dapan 已提交
1251 1252 1253 1254 1255 1256 1257
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 已提交
1258
  CTG_API_LEAVE(ctgUpdateUserEnqueue(pCtg, pAuth, false));
D
dapan 已提交
1259 1260
}

D
dapan1121 已提交
1261
int32_t catalogClearCache(void) {
D
dapan1121 已提交
1262
  CTG_API_ENTER_NOLOCK();
D
dapan1121 已提交
1263 1264 1265 1266

  qInfo("start to clear catalog cache");

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

D
dapan1121 已提交
1270
  int32_t code = ctgClearCacheEnqueue(NULL, false, false, true);
D
dapan1121 已提交
1271 1272 1273

  qInfo("clear catalog cache end, code: %s", tstrerror(code));
  
D
dapan1121 已提交
1274
  CTG_API_LEAVE_NOLOCK(code);
D
dapan1121 已提交
1275 1276 1277
}


D
dapan 已提交
1278
void catalogDestroy(void) {
D
dapan1121 已提交
1279
  qInfo("start to destroy catalog");
X
Xiaoyu Wang 已提交
1280

wafwerar's avatar
wafwerar 已提交
1281
  if (NULL == gCtgMgmt.pCluster || atomic_load_8((int8_t*)&gCtgMgmt.exit)) {
D
dapan1121 已提交
1282 1283 1284
    return;
  }

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

D
dapan1121 已提交
1287
  ctgClearCacheEnqueue(NULL, true, true, true);
1288

D
dapan 已提交
1289 1290
  taosHashCleanup(gCtgMgmt.pCluster);
  gCtgMgmt.pCluster = NULL;
D
dapan1121 已提交
1291 1292

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