catalog.c 38.0 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
int32_t ctgGetDBVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* dbFName, SCtgDBCache** dbCache,
26
                       SDBVgInfo** pInfo, bool* exists) {
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) {
32 33 34 35 36 37 38 39 40
    if (exists) {
      *exists = true;
    }
    
    return TSDB_CODE_SUCCESS;
  }

  if (exists) {
    *exists = false;
D
dapan1121 已提交
41
    return TSDB_CODE_SUCCESS;
D
dapan1121 已提交
42 43
  }

X
Xiaoyu Wang 已提交
44
  SUseDbOutput     DbOut = {0};
D
dapan1121 已提交
45 46
  SBuildUseDBInput input = {0};

D
dapan1121 已提交
47
  tstrncpy(input.db, dbFName, tListLen(input.db));
D
dapan1121 已提交
48
  input.vgVersion = CTG_DEFAULT_INVALID_VERSION;
H
Haojun Liao 已提交
49

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

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

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

D
dapan1121 已提交
56
  return TSDB_CODE_SUCCESS;
D
dapan 已提交
57 58 59

_return:

wafwerar's avatar
wafwerar 已提交
60
  taosMemoryFreeClear(*pInfo);
D
dapan 已提交
61
  *pInfo = DbOut.dbVgroup;
X
Xiaoyu Wang 已提交
62

D
dapan 已提交
63
  CTG_RET(code);
D
dapan1121 已提交
64 65
}

H
Hongze Cheng 已提交
66 67
int32_t ctgRefreshDBVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* dbFName) {
  int32_t      code = 0;
D
dapan1121 已提交
68
  SCtgDBCache* dbCache = NULL;
D
dapan1121 已提交
69

D
dapan1121 已提交
70
  CTG_ERR_RET(ctgAcquireVgInfoFromCache(pCtg, dbFName, &dbCache));
D
dapan1121 已提交
71

X
Xiaoyu Wang 已提交
72
  SUseDbOutput     DbOut = {0};
D
dapan1121 已提交
73 74 75
  SBuildUseDBInput input = {0};
  tstrncpy(input.db, dbFName, tListLen(input.db));

D
dapan1121 已提交
76
  if (NULL != dbCache) {
D
dapan1121 已提交
77
    input.dbId = dbCache->dbId;
D
dapan1121 已提交
78

D
dapan1121 已提交
79
    ctgReleaseVgInfoToCache(pCtg, dbCache);
D
dapan1121 已提交
80
  }
X
Xiaoyu Wang 已提交
81

D
dapan1121 已提交
82 83
  input.vgVersion = CTG_DEFAULT_INVALID_VERSION;
  input.numOfTable = 0;
D
dapan1121 已提交
84

D
dapan1121 已提交
85
  code = ctgGetDBVgInfoFromMnode(pCtg, pConn, &input, &DbOut, NULL);
D
dapan1121 已提交
86
  if (code) {
D
dapan1121 已提交
87
    if (CTG_DB_NOT_EXIST(code) && (NULL != dbCache)) {
D
dapan1121 已提交
88
      ctgDebug("db no longer exist, dbFName:%s, dbId:0x%" PRIx64, input.db, input.dbId);
D
dapan1121 已提交
89
      ctgDropDbCacheEnqueue(pCtg, input.db, input.dbId);
D
dapan1121 已提交
90 91 92 93 94
    }

    CTG_ERR_RET(code);
  }

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

D
dapan1121 已提交
97 98 99
  return TSDB_CODE_SUCCESS;
}

H
Hongze Cheng 已提交
100 101
int32_t ctgRefreshTbMeta(SCatalog* pCtg, SRequestConnInfo* pConn, SCtgTbMetaCtx* ctx, STableMetaOutput** pOutput,
                         bool syncReq) {
D
dapan1121 已提交
102
  SVgroupInfo vgroupInfo = {0};
X
Xiaoyu Wang 已提交
103
  int32_t     code = 0;
D
dapan1121 已提交
104

D
dapan1121 已提交
105
  if (!CTG_FLAG_IS_SYS_DB(ctx->flag)) {
106
    CTG_ERR_RET(ctgGetTbHashVgroup(pCtg, pConn, ctx->pName, &vgroupInfo, NULL));
D
dapan1121 已提交
107
  }
D
dapan1121 已提交
108

D
dapan1121 已提交
109
  STableMetaOutput  moutput = {0};
X
Xiaoyu Wang 已提交
110
  STableMetaOutput* output = taosMemoryCalloc(1, sizeof(STableMetaOutput));
D
dapan1121 已提交
111 112
  if (NULL == output) {
    ctgError("malloc %d failed", (int32_t)sizeof(STableMetaOutput));
D
dapan1121 已提交
113
    CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
D
dapan1121 已提交
114
  }
D
dapan1121 已提交
115

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

H
Hongze Cheng 已提交
119 120
    CTG_ERR_JRET(
        ctgGetTbMetaFromMnodeImpl(pCtg, pConn, (char*)ctx->pName->dbname, (char*)ctx->pName->tname, output, NULL));
D
dapan1121 已提交
121 122
  } else if (CTG_FLAG_IS_STB(ctx->flag)) {
    ctgDebug("will refresh tbmeta, supposed to be stb, tbName:%s", tNameGetTableName(ctx->pName));
D
dapan1121 已提交
123 124

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

D
dapan1121 已提交
127
    if (CTG_IS_META_NULL(output->metaType)) {
D
dapan1121 已提交
128
      CTG_ERR_JRET(ctgGetTbMetaFromVnode(pCtg, pConn, ctx->pName, &vgroupInfo, output, NULL));
D
dapan1121 已提交
129 130
    }
  } else {
X
Xiaoyu Wang 已提交
131 132
    ctgDebug("will refresh tbmeta, not supposed to be stb, tbName:%s, flag:%d", tNameGetTableName(ctx->pName),
             ctx->flag);
D
dapan1121 已提交
133 134

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

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

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

D
dapan1121 已提交
142
      CTG_ERR_JRET(ctgGetTbMetaFromMnodeImpl(pCtg, pConn, output->dbFName, output->tbName, output, NULL));
D
dapan1121 已提交
143
    } else if (CTG_IS_META_BOTH(output->metaType)) {
D
dapan1121 已提交
144
      int32_t exist = 0;
D
dapan1121 已提交
145 146
      if (!CTG_FLAG_IS_FORCE_UPDATE(ctx->flag)) {
        CTG_ERR_JRET(ctgTbMetaExistInCache(pCtg, output->dbFName, output->tbName, &exist));
D
dapan1121 已提交
147
      }
H
Haojun Liao 已提交
148

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

D
dapan1121 已提交
152
        if (CTG_IS_META_NULL(moutput.metaType)) {
D
dapan1121 已提交
153
          SET_META_TYPE_NULL(output->metaType);
D
dapan1121 已提交
154
        }
X
Xiaoyu Wang 已提交
155

wafwerar's avatar
wafwerar 已提交
156
        taosMemoryFreeClear(output->tbMeta);
D
dapan1121 已提交
157
        output->tbMeta = moutput.tbMeta;
D
dapan1121 已提交
158 159
        moutput.tbMeta = NULL;
      } else {
wafwerar's avatar
wafwerar 已提交
160
        taosMemoryFreeClear(output->tbMeta);
X
Xiaoyu Wang 已提交
161 162

        SET_META_TYPE_CTABLE(output->metaType);
D
dapan1121 已提交
163
      }
D
dapan1121 已提交
164 165 166
    }
  }

D
dapan1121 已提交
167
  if (CTG_IS_META_NULL(output->metaType)) {
D
dapan1121 已提交
168 169
    ctgError("no tbmeta got, tbNmae:%s", tNameGetTableName(ctx->pName));
    ctgRemoveTbMetaFromCache(pCtg, ctx->pName, false);
D
dapan1121 已提交
170 171 172
    CTG_ERR_JRET(CTG_ERR_CODE_TABLE_NOT_EXIST);
  }

D
dapan 已提交
173
  if (CTG_IS_META_TABLE(output->metaType)) {
X
Xiaoyu Wang 已提交
174 175
    ctgDebug("tbmeta got, dbFName:%s, tbName:%s, tbType:%d", output->dbFName, output->tbName,
             output->tbMeta->tableType);
D
dapan 已提交
176
  } else {
X
Xiaoyu Wang 已提交
177 178
    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 已提交
179 180
  }

D
dapan1121 已提交
181 182
  if (pOutput) {
    CTG_ERR_JRET(ctgCloneMetaOutput(output, pOutput));
D
dapan1121 已提交
183
  }
D
dapan1121 已提交
184

D
dapan1121 已提交
185 186 187
  code = ctgUpdateTbMetaEnqueue(pCtg, output, syncReq);
  output = NULL;
  CTG_ERR_JRET(code);
D
dapan1121 已提交
188 189 190

  return TSDB_CODE_SUCCESS;

D
dapan1121 已提交
191 192
_return:

D
dapan1121 已提交
193 194 195 196 197
  if (output) {
    taosMemoryFreeClear(output->tbMeta);
    taosMemoryFreeClear(output);
  }
  
D
dapan1121 已提交
198 199 200
  CTG_RET(code);
}

H
Hongze Cheng 已提交
201 202 203
int32_t ctgGetTbMeta(SCatalog* pCtg, SRequestConnInfo* pConn, SCtgTbMetaCtx* ctx, STableMeta** pTableMeta) {
  int32_t           code = 0;
  STableMetaOutput* output = NULL;
D
dapan1121 已提交
204

D
dapan1121 已提交
205
  CTG_ERR_RET(ctgGetTbMetaFromCache(pCtg, pConn, ctx, pTableMeta));
206
  if (*pTableMeta || (ctx->flag & CTG_FLAG_ONLY_CACHE)) {
D
dapan1121 已提交
207 208
    goto _return;
  }
H
Haojun Liao 已提交
209

D
dapan1121 已提交
210
  while (true) {
D
dapan1121 已提交
211
    CTG_ERR_JRET(ctgRefreshTbMeta(pCtg, pConn, ctx, &output, false));
D
dapan1121 已提交
212

D
dapan1121 已提交
213 214 215
    if (CTG_IS_META_TABLE(output->metaType)) {
      *pTableMeta = output->tbMeta;
      goto _return;
D
dapan 已提交
216
    }
D
dapan1121 已提交
217 218 219

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

D
dapan1121 已提交
221 222 223 224 225 226 227 228
      *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 已提交
229 230
    }

D
dapan1121 已提交
231
    // HANDLE ONLY CHILD TABLE META
D
dapan1121 已提交
232

D
dapan1121 已提交
233
    taosMemoryFreeClear(output->tbMeta);
D
dapan 已提交
234

D
dapan1121 已提交
235 236 237 238 239
    SName stbName = *ctx->pName;
    strcpy(stbName.tname, output->tbName);
    SCtgTbMetaCtx stbCtx = {0};
    stbCtx.flag = ctx->flag;
    stbCtx.pName = &stbName;
X
Xiaoyu Wang 已提交
240

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

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

D
dapan1121 已提交
249 250
    break;
  }
D
dapan 已提交
251

D
dapan1121 已提交
252
_return:
D
dapan 已提交
253

D
dapan1121 已提交
254 255 256 257 258 259 260
  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 已提交
261

D
dapan1121 已提交
262
    if (TSDB_SUPER_TABLE == ctx->tbInfo.tbType) {
D
dapan1121 已提交
263
      ctgDropStbMetaEnqueue(pCtg, dbFName, ctx->tbInfo.dbId, ctx->pName->tname, ctx->tbInfo.suid, false);
D
dapan1121 已提交
264
    } else {
D
dapan1121 已提交
265
      ctgDropTbMetaEnqueue(pCtg, dbFName, ctx->tbInfo.dbId, ctx->pName->tname, false);
D
dapan1121 已提交
266 267
    }
  }
D
dapan 已提交
268

D
dapan1121 已提交
269
  taosMemoryFreeClear(output);
D
dapan 已提交
270

D
dapan1121 已提交
271 272 273 274
  if (*pTableMeta) {
    ctgDebug("tbmeta returned, tbName:%s, tbType:%d", ctx->pName->tname, (*pTableMeta)->tableType);
    ctgdShowTableMeta(pCtg, ctx->pName->tname, *pTableMeta);
  }
D
dapan 已提交
275 276 277 278

  CTG_RET(code);
}

X
Xiaoyu Wang 已提交
279 280
int32_t ctgUpdateTbMeta(SCatalog* pCtg, STableMetaRsp* rspMsg, bool syncOp) {
  STableMetaOutput* output = taosMemoryCalloc(1, sizeof(STableMetaOutput));
D
dapan1121 已提交
281 282
  if (NULL == output) {
    ctgError("malloc %d failed", (int32_t)sizeof(STableMetaOutput));
D
dapan1121 已提交
283
    CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
D
dapan1121 已提交
284
  }
X
Xiaoyu Wang 已提交
285

D
dapan1121 已提交
286 287 288 289 290
  int32_t code = 0;

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

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

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

295 296 297 298 299 300 301 302 303 304
    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 已提交
305

D
dapan1121 已提交
306 307 308
  code = ctgUpdateTbMetaEnqueue(pCtg, output, syncOp);
  output = NULL;
  CTG_ERR_JRET(code);
D
dapan1121 已提交
309 310

  return TSDB_CODE_SUCCESS;
X
Xiaoyu Wang 已提交
311

D
dapan1121 已提交
312 313
_return:

D
dapan1121 已提交
314 315 316 317 318
  if (output) {
    taosMemoryFreeClear(output->tbMeta);
    taosMemoryFreeClear(output);
  }
  
D
dapan1121 已提交
319 320 321
  CTG_RET(code);
}

H
Hongze Cheng 已提交
322 323 324
int32_t ctgChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, const char* user, const char* dbFName, AUTH_TYPE type,
                   bool* pass) {
  bool    inCache = false;
D
dapan1121 已提交
325
  int32_t code = 0;
X
Xiaoyu Wang 已提交
326

D
dapan1121 已提交
327
  *pass = false;
H
Hongze Cheng 已提交
328

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

D
dapan1121 已提交
331 332 333
  if (inCache) {
    return TSDB_CODE_SUCCESS;
  }
D
dapan1121 已提交
334

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

D
dapan1121 已提交
338 339 340
  if (authRsp.superAuth) {
    *pass = true;
    goto _return;
D
dapan1121 已提交
341 342
  }

D
dapan1121 已提交
343 344 345 346
  if (authRsp.createdDbs && taosHashGet(authRsp.createdDbs, dbFName, strlen(dbFName))) {
    *pass = true;
    goto _return;
  }
D
dapan1121 已提交
347

D
dapan1121 已提交
348 349 350 351 352
  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 已提交
353

D
dapan1121 已提交
354
_return:
D
dapan1121 已提交
355

D
dapan1121 已提交
356
  ctgUpdateUserEnqueue(pCtg, &authRsp, false);
D
dapan1121 已提交
357

D
dapan1121 已提交
358 359 360
  return TSDB_CODE_SUCCESS;
}

H
Hongze Cheng 已提交
361
int32_t ctgGetTbType(SCatalog* pCtg, SRequestConnInfo* pConn, SName* pTableName, int32_t* tbType) {
D
dapan1121 已提交
362 363 364 365 366 367 368
  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 已提交
369
  STableMeta*   pMeta = NULL;
D
dapan1121 已提交
370 371 372 373
  SCtgTbMetaCtx ctx = {0};
  ctx.pName = (SName*)pTableName;
  ctx.flag = CTG_FLAG_UNKNOWN_STB;
  CTG_ERR_RET(ctgGetTbMeta(pCtg, pConn, &ctx, &pMeta));
D
dapan1121 已提交
374 375 376 377 378 379 380

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

  return TSDB_CODE_SUCCESS;
}

H
Hongze Cheng 已提交
381
int32_t ctgGetTbIndex(SCatalog* pCtg, SRequestConnInfo* pConn, SName* pTableName, SArray** pRes) {
D
dapan1121 已提交
382 383 384 385 386
  CTG_ERR_RET(ctgReadTbIndexFromCache(pCtg, pTableName, pRes));
  if (*pRes) {
    return TSDB_CODE_SUCCESS;
  }

H
Hongze Cheng 已提交
387
  STableIndex* pIndex = taosMemoryCalloc(1, sizeof(STableIndex));
D
dapan1121 已提交
388 389 390
  if (NULL == pIndex) {
    CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
  }
H
Hongze Cheng 已提交
391

D
dapan1121 已提交
392 393 394 395 396 397
  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 已提交
398

D
dapan1121 已提交
399 400 401 402 403 404
  SArray* pInfo = NULL;
  CTG_ERR_JRET(ctgCloneTableIndex(pIndex->pIndex, &pInfo));

  *pRes = pInfo;

  CTG_ERR_JRET(ctgUpdateTbIndexEnqueue(pCtg, &pIndex, false));
D
dapan1121 已提交
405 406

  return TSDB_CODE_SUCCESS;
D
dapan1121 已提交
407 408 409 410 411 412 413 414 415 416

_return:

  tFreeSTableIndexRsp(pIndex);
  taosMemoryFree(pIndex);

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

  CTG_RET(code);
D
dapan1121 已提交
417 418
}

H
Hongze Cheng 已提交
419
int32_t ctgGetTbCfg(SCatalog* pCtg, SRequestConnInfo* pConn, SName* pTableName, STableCfg** pCfg) {
D
dapan1121 已提交
420 421 422 423 424 425 426
  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};
427
    CTG_ERR_RET(ctgGetTbHashVgroup(pCtg, pConn, pTableName, &vgroupInfo, NULL));
D
dapan1121 已提交
428 429 430 431 432
    CTG_ERR_RET(ctgGetTableCfgFromVnode(pCtg, pConn, pTableName, &vgroupInfo, pCfg, NULL));
  }

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

H
Hongze Cheng 已提交
434 435 436 437 438 439 440
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 已提交
441 442 443
  SCtgTbMetaCtx ctx = {0};
  ctx.pName = pTableName;
  ctx.flag = CTG_FLAG_UNKNOWN_STB;
D
dapan1121 已提交
444 445

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

D
dapan1121 已提交
447
  CTG_ERR_JRET(ctgGetTbMeta(pCtg, pConn, &ctx, &tbMeta));
D
dapan1121 已提交
448 449 450 451

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

H
Hongze Cheng 已提交
452
  SHashObj* vgHash = NULL;
453
  CTG_ERR_JRET(ctgGetDBVgInfo(pCtg, pConn, db, &dbCache, &vgInfo, NULL));
D
dapan1121 已提交
454 455

  if (dbCache) {
D
dapan1121 已提交
456
    vgHash = dbCache->vgCache.vgInfo->vgHash;
D
dapan1121 已提交
457 458 459 460 461 462 463 464 465 466
  } 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 已提交
467

D
dapan1121 已提交
468 469 470 471 472 473 474 475 476 477
#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 已提交
478
      CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);    
D
dapan1121 已提交
479 480 481 482 483 484 485 486 487
    }

    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 已提交
488
#endif
D
dapan1121 已提交
489 490 491 492 493
  }

_return:

  if (dbCache) {
D
dapan1121 已提交
494
    ctgRUnlockVgInfo(dbCache);
D
dapan1121 已提交
495 496 497
    ctgReleaseDBCache(pCtg, dbCache);
  }

wafwerar's avatar
wafwerar 已提交
498
  taosMemoryFreeClear(tbMeta);
D
dapan1121 已提交
499 500 501

  if (vgInfo) {
    taosHashCleanup(vgInfo->vgHash);
wafwerar's avatar
wafwerar 已提交
502
    taosMemoryFreeClear(vgInfo);
D
dapan1121 已提交
503 504 505 506 507 508 509 510 511 512
  }

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

  CTG_RET(code);
}

513
int32_t ctgGetTbHashVgroup(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, SVgroupInfo* pVgroup, bool* exists) {
D
dapan1121 已提交
514 515 516 517 518 519 520 521 522 523
  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 已提交
524
  SDBVgInfo* vgInfo = NULL;
525
  CTG_ERR_JRET(ctgGetDBVgInfo(pCtg, pConn, db, &dbCache, &vgInfo, exists));
D
dapan1121 已提交
526

527 528 529 530 531
  if (exists && false == *exists) {
    ctgDebug("db %s vgInfo not in cache", pTableName->dbname);
    return TSDB_CODE_SUCCESS;
  }
  
D
dapan1121 已提交
532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566
  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 已提交
567
int32_t catalogInit(SCatalogCfg* cfg) {
D
dapan 已提交
568
  if (gCtgMgmt.pCluster) {
D
dapan 已提交
569
    qError("catalog already initialized");
D
dapan1121 已提交
570
    CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT);
D
dapan1121 已提交
571 572
  }

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

D
dapan1121 已提交
575
  if (cfg) {
D
dapan 已提交
576
    memcpy(&gCtgMgmt.cfg, cfg, sizeof(*cfg));
H
Haojun Liao 已提交
577

D
dapan 已提交
578 579
    if (gCtgMgmt.cfg.maxDBCacheNum == 0) {
      gCtgMgmt.cfg.maxDBCacheNum = CTG_DEFAULT_CACHE_DB_NUMBER;
D
dapan1121 已提交
580 581
    }

D
dapan 已提交
582 583
    if (gCtgMgmt.cfg.maxTblCacheNum == 0) {
      gCtgMgmt.cfg.maxTblCacheNum = CTG_DEFAULT_CACHE_TBLMETA_NUMBER;
D
dapan1121 已提交
584
    }
D
dapan1121 已提交
585

D
dapan 已提交
586 587
    if (gCtgMgmt.cfg.dbRentSec == 0) {
      gCtgMgmt.cfg.dbRentSec = CTG_DEFAULT_RENT_SECOND;
D
dapan1121 已提交
588 589
    }

D
dapan 已提交
590 591
    if (gCtgMgmt.cfg.stbRentSec == 0) {
      gCtgMgmt.cfg.stbRentSec = CTG_DEFAULT_RENT_SECOND;
D
dapan1121 已提交
592
    }
D
dapan1121 已提交
593
  } else {
D
dapan 已提交
594 595 596 597
    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 已提交
598 599
  }

X
Xiaoyu Wang 已提交
600 601
  gCtgMgmt.pCluster = taosHashInit(CTG_DEFAULT_CACHE_CLUSTER_NUMBER, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT),
                                   false, HASH_ENTRY_LOCK);
D
dapan 已提交
602
  if (NULL == gCtgMgmt.pCluster) {
D
dapan1121 已提交
603 604
    qError("taosHashInit %d cluster cache failed", CTG_DEFAULT_CACHE_CLUSTER_NUMBER);
    CTG_ERR_RET(TSDB_CODE_CTG_INTERNAL_ERROR);
D
dapan1121 已提交
605 606
  }

D
dapan1121 已提交
607 608 609 610
  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 已提交
611

wafwerar's avatar
wafwerar 已提交
612
  gCtgMgmt.queue.head = taosMemoryCalloc(1, sizeof(SCtgQNode));
D
dapan1121 已提交
613
  if (NULL == gCtgMgmt.queue.head) {
D
dapan1121 已提交
614 615 616
    qError("calloc %d failed", (int32_t)sizeof(SCtgQNode));
    CTG_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
  }
D
dapan1121 已提交
617
  gCtgMgmt.queue.tail = gCtgMgmt.queue.head;
D
dapan1121 已提交
618

D
dapan1121 已提交
619 620 621 622 623 624
  gCtgMgmt.jobPool = taosOpenRef(200, ctgFreeJob);
  if (gCtgMgmt.jobPool < 0) {
    qError("taosOpenRef failed, error:%s", tstrerror(terrno));
    CTG_ERR_RET(terrno);
  }

D
dapan1121 已提交
625 626
  CTG_ERR_RET(ctgStartUpdateThread());

X
Xiaoyu Wang 已提交
627 628
  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 已提交
629

D
dapan 已提交
630
  return TSDB_CODE_SUCCESS;
D
dapan1121 已提交
631 632
}

D
dapan1121 已提交
633
int32_t catalogGetHandle(uint64_t clusterId, SCatalog** catalogHandle) {
634
  if (NULL == catalogHandle) {
D
dapan1121 已提交
635
    CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT);
D
dapan 已提交
636 637
  }

D
dapan1121 已提交
638 639
  CTG_API_ENTER();

D
dapan 已提交
640
  if (NULL == gCtgMgmt.pCluster) {
D
dapan1121 已提交
641
    qError("catalog cluster cache are not ready, clusterId:0x%" PRIx64, clusterId);
D
dapan1121 已提交
642
    CTG_API_LEAVE(TSDB_CODE_CTG_NOT_READY);
D
dapan 已提交
643 644
  }

X
Xiaoyu Wang 已提交
645 646
  int32_t   code = 0;
  SCatalog* clusterCtg = NULL;
D
dapan 已提交
647

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

D
dapan1121 已提交
651 652
    if (ctg && (*ctg)) {
      *catalogHandle = *ctg;
D
dapan1121 已提交
653
      qDebug("got catalog handle from cache, clusterId:0x%" PRIx64 ", CTG:%p", clusterId, *ctg);
D
dapan1121 已提交
654
      CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan1121 已提交
655
    }
D
dapan 已提交
656

wafwerar's avatar
wafwerar 已提交
657
    clusterCtg = taosMemoryCalloc(1, sizeof(SCatalog));
D
dapan1121 已提交
658 659
    if (NULL == clusterCtg) {
      qError("calloc %d failed", (int32_t)sizeof(SCatalog));
D
dapan1121 已提交
660
      CTG_API_LEAVE(TSDB_CODE_OUT_OF_MEMORY);
D
dapan1121 已提交
661 662
    }

D
dapan1121 已提交
663 664
    clusterCtg->clusterId = clusterId;

D
dapan 已提交
665 666
    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 已提交
667

X
Xiaoyu Wang 已提交
668 669
    clusterCtg->dbCache = taosHashInit(gCtgMgmt.cfg.maxDBCacheNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY),
                                       false, HASH_ENTRY_LOCK);
D
dapan1121 已提交
670 671
    if (NULL == clusterCtg->dbCache) {
      qError("taosHashInit %d dbCache failed", CTG_DEFAULT_CACHE_DB_NUMBER);
D
dapan1121 已提交
672 673 674
      CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
    }

H
Hongze Cheng 已提交
675 676
    clusterCtg->userCache = taosHashInit(gCtgMgmt.cfg.maxUserCacheNum,
                                         taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_ENTRY_LOCK);
D
dapan1121 已提交
677 678 679
    if (NULL == clusterCtg->userCache) {
      qError("taosHashInit %d user cache failed", gCtgMgmt.cfg.maxUserCacheNum);
      CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
D
dapan1121 已提交
680 681
    }

D
dapan 已提交
682
    code = taosHashPut(gCtgMgmt.pCluster, &clusterId, sizeof(clusterId), &clusterCtg, POINTER_BYTES);
D
dapan1121 已提交
683 684
    if (code) {
      if (HASH_NODE_EXIST(code)) {
D
dapan1121 已提交
685
        ctgFreeHandleImpl(clusterCtg);
D
dapan1121 已提交
686 687
        continue;
      }
X
Xiaoyu Wang 已提交
688

D
dapan1121 已提交
689
      qError("taosHashPut CTG to cache failed, clusterId:0x%" PRIx64, clusterId);
D
dapan1121 已提交
690 691 692
      CTG_ERR_JRET(TSDB_CODE_CTG_INTERNAL_ERROR);
    }

D
dapan1121 已提交
693
    qDebug("add CTG to cache, clusterId:0x%" PRIx64 ", CTG:%p", clusterId, clusterCtg);
D
dapan1121 已提交
694 695

    break;
D
dapan 已提交
696
  }
D
dapan1121 已提交
697 698

  *catalogHandle = clusterCtg;
D
dapan1121 已提交
699

D
dapan1121 已提交
700
  CTG_CACHE_STAT_INC(numOfCluster, 1);
X
Xiaoyu Wang 已提交
701

D
dapan1121 已提交
702
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan1121 已提交
703 704 705

_return:

D
dapan1121 已提交
706
  ctgFreeHandleImpl(clusterCtg);
D
dapan1121 已提交
707

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

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

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

X
Xiaoyu Wang 已提交
718 719
  SCtgDBCache* dbCache = NULL;
  int32_t      code = 0;
D
dapan1121 已提交
720

D
dapan1121 已提交
721 722
  CTG_ERR_JRET(ctgAcquireVgInfoFromCache(pCtg, dbFName, &dbCache));
  if (NULL == dbCache) {
D
dapan1121 已提交
723
    *version = CTG_DEFAULT_INVALID_VERSION;
D
dapan1121 已提交
724
    CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan1121 已提交
725 726
  }

D
dapan1121 已提交
727
  *version = dbCache->vgCache.vgInfo->vgVersion;
D
dapan1121 已提交
728
  *dbId = dbCache->dbId;
D
dapan1121 已提交
729
  *tableNum = dbCache->vgCache.vgInfo->numOfTable;
D
dapan1121 已提交
730

D
dapan1121 已提交
731
  ctgReleaseVgInfoToCache(pCtg, dbCache);
D
dapan1121 已提交
732

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

D
dapan1121 已提交
735
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan1121 已提交
736 737 738 739

_return:

  CTG_API_LEAVE(code);
D
dapan1121 已提交
740 741
}

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

D
dapan1121 已提交
745
  if (NULL == pCtg || NULL == dbFName || NULL == pConn || NULL == vgroupList) {
D
dapan1121 已提交
746 747
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }
748

D
dapan1121 已提交
749
  SCtgDBCache* dbCache = NULL;
H
Hongze Cheng 已提交
750 751 752 753
  int32_t      code = 0;
  SArray*      vgList = NULL;
  SHashObj*    vgHash = NULL;
  SDBVgInfo*   vgInfo = NULL;
754
  CTG_ERR_JRET(ctgGetDBVgInfo(pCtg, pConn, dbFName, &dbCache, &vgInfo, NULL));
D
dapan1121 已提交
755
  if (dbCache) {
D
dapan1121 已提交
756
    vgHash = dbCache->vgCache.vgInfo->vgHash;
D
dapan1121 已提交
757 758
  } else {
    vgHash = vgInfo->vgHash;
D
dapan1121 已提交
759 760
  }

D
dapan1121 已提交
761
  CTG_ERR_JRET(ctgGenerateVgList(pCtg, vgHash, &vgList));
D
dapan1121 已提交
762 763 764 765 766

  *vgroupList = vgList;
  vgList = NULL;

_return:
D
dapan1121 已提交
767 768

  if (dbCache) {
D
dapan1121 已提交
769
    ctgRUnlockVgInfo(dbCache);
D
dapan1121 已提交
770
    ctgReleaseDBCache(pCtg, dbCache);
D
dapan1121 已提交
771 772
  }

D
dapan1121 已提交
773 774
  if (vgInfo) {
    taosHashCleanup(vgInfo->vgHash);
wafwerar's avatar
wafwerar 已提交
775
    taosMemoryFreeClear(vgInfo);
D
dapan1121 已提交
776 777
  }

X
Xiaoyu Wang 已提交
778
  CTG_API_LEAVE(code);
D
dapan1121 已提交
779 780
}

D
dapan1121 已提交
781
int32_t catalogUpdateDBVgInfo(SCatalog* pCtg, const char* dbFName, uint64_t dbId, SDBVgInfo* dbInfo) {
D
dapan1121 已提交
782
  CTG_API_ENTER();
D
dapan1121 已提交
783 784

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

D
dapan1121 已提交
786
  if (NULL == pCtg || NULL == dbFName || NULL == dbInfo) {
D
dapan1121 已提交
787
    ctgFreeVgInfo(dbInfo);
D
dapan1121 已提交
788 789 790
    CTG_ERR_JRET(TSDB_CODE_CTG_INVALID_INPUT);
  }

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

D
dapan1121 已提交
793 794
_return:

D
dapan1121 已提交
795
  CTG_API_LEAVE(code);
D
dapan1121 已提交
796 797
}

D
dapan1121 已提交
798 799 800
int32_t catalogRemoveDB(SCatalog* pCtg, const char* dbFName, uint64_t dbId) {
  CTG_API_ENTER();

D
dapan1121 已提交
801
  int32_t code = 0;
X
Xiaoyu Wang 已提交
802

D
dapan1121 已提交
803 804
  if (NULL == pCtg || NULL == dbFName) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
D
dapan1121 已提交
805 806
  }

D
dapan1121 已提交
807
  if (NULL == pCtg->dbCache) {
D
dapan1121 已提交
808
    CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan1121 已提交
809
  }
D
dapan1121 已提交
810

D
dapan1121 已提交
811
  CTG_ERR_JRET(ctgDropDbCacheEnqueue(pCtg, dbFName, dbId));
D
dapan 已提交
812

D
dapan1121 已提交
813
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
X
Xiaoyu Wang 已提交
814

D
dapan1121 已提交
815 816
_return:

D
dapan1121 已提交
817
  CTG_API_LEAVE(code);
D
dapan1121 已提交
818 819
}

X
Xiaoyu Wang 已提交
820
int32_t catalogUpdateVgEpSet(SCatalog* pCtg, const char* dbFName, int32_t vgId, SEpSet* epSet) {
D
dapan1121 已提交
821 822 823
  CTG_API_ENTER();

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

D
dapan1121 已提交
825 826 827 828 829 830 831
  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 已提交
832

D
dapan1121 已提交
833
  CTG_API_LEAVE(code);
D
dapan1121 已提交
834
}
D
dapan1121 已提交
835

H
Hongze Cheng 已提交
836
int32_t catalogUpdateTableIndex(SCatalog* pCtg, STableIndexRsp* pRsp) {
D
dapan1121 已提交
837 838 839
  CTG_API_ENTER();

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

D
dapan1121 已提交
841 842 843 844 845 846 847 848 849 850 851 852 853 854
  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 已提交
855

D
dapan1121 已提交
856 857 858
  CTG_API_LEAVE(code);
}

D
dapan1121 已提交
859
int32_t catalogRemoveTableMeta(SCatalog* pCtg, SName* pTableName) {
D
dapan 已提交
860 861
  CTG_API_ENTER();

D
dapan1121 已提交
862
  CTG_API_LEAVE(ctgRemoveTbMeta(pCtg, pTableName));
D
dapan 已提交
863 864
}

D
dapan1121 已提交
865 866 867
int32_t catalogRemoveStbMeta(SCatalog* pCtg, const char* dbFName, uint64_t dbId, const char* stbName, uint64_t suid) {
  CTG_API_ENTER();

D
dapan 已提交
868
  int32_t code = 0;
X
Xiaoyu Wang 已提交
869

D
dapan1121 已提交
870 871
  if (NULL == pCtg || NULL == dbFName || NULL == stbName) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
D
dapan 已提交
872 873
  }

D
dapan1121 已提交
874
  if (NULL == pCtg->dbCache) {
D
dapan1121 已提交
875
    CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan 已提交
876
  }
D
dapan1121 已提交
877

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

D
dapan1121 已提交
880
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
X
Xiaoyu Wang 已提交
881

D
dapan1121 已提交
882 883
_return:

D
dapan1121 已提交
884
  CTG_API_LEAVE(code);
D
dapan 已提交
885 886
}

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

D
dapan1121 已提交
890 891 892
  SCtgTbMetaCtx ctx = {0};
  ctx.pName = (SName*)pTableName;
  ctx.flag = CTG_FLAG_UNKNOWN_STB;
H
Hongze Cheng 已提交
893

D
dapan1121 已提交
894
  CTG_API_LEAVE(ctgGetTbMeta(pCtg, pConn, &ctx, pTableMeta));
D
dapan1121 已提交
895
}
D
dapan1121 已提交
896

897 898 899 900 901 902 903 904 905 906 907
int32_t catalogGetCachedTableMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, STableMeta** pTableMeta) {
  CTG_API_ENTER();

  SCtgTbMetaCtx ctx = {0};
  ctx.pName = (SName*)pTableName;
  ctx.flag = CTG_FLAG_UNKNOWN_STB | CTG_FLAG_ONLY_CACHE;

  CTG_API_LEAVE(ctgGetTbMeta(pCtg, pConn, &ctx, pTableMeta));
}


H
Hongze Cheng 已提交
908 909
int32_t catalogGetSTableMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
                             STableMeta** pTableMeta) {
D
dapan1121 已提交
910 911
  CTG_API_ENTER();

D
dapan1121 已提交
912 913 914 915
  SCtgTbMetaCtx ctx = {0};
  ctx.pName = (SName*)pTableName;
  ctx.flag = CTG_FLAG_STB;

D
dapan1121 已提交
916
  CTG_API_LEAVE(ctgGetTbMeta(pCtg, pConn, &ctx, pTableMeta));
D
dapan1121 已提交
917 918
}

919 920 921 922 923 924 925 926 927 928 929 930
int32_t catalogGetCachedSTableMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
                            STableMeta** pTableMeta) {
  CTG_API_ENTER();

  SCtgTbMetaCtx ctx = {0};
  ctx.pName = (SName*)pTableName;
  ctx.flag = CTG_FLAG_STB | CTG_FLAG_ONLY_CACHE;

  CTG_API_LEAVE(ctgGetTbMeta(pCtg, pConn, &ctx, pTableMeta));
}


X
Xiaoyu Wang 已提交
931
int32_t catalogUpdateTableMeta(SCatalog* pCtg, STableMetaRsp* pMsg) {
D
dapan1121 已提交
932 933
  CTG_API_ENTER();

D
dapan1121 已提交
934
  if (NULL == pCtg || NULL == pMsg) {
D
dapan1121 已提交
935 936 937
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
938
  int32_t code = 0;
D
dapan1121 已提交
939
  CTG_ERR_JRET(ctgUpdateTbMeta(pCtg, pMsg, true));
X
Xiaoyu Wang 已提交
940

D
dapan1121 已提交
941
_return:
X
Xiaoyu Wang 已提交
942

D
dapan1121 已提交
943
  CTG_API_LEAVE(code);
D
dapan1121 已提交
944 945
}

H
Hongze Cheng 已提交
946
int32_t catalogChkTbMetaVersion(SCatalog* pCtg, SRequestConnInfo* pConn, SArray* pTables) {
D
dapan1121 已提交
947 948
  CTG_API_ENTER();

D
dapan1121 已提交
949
  if (NULL == pCtg || NULL == pConn || NULL == pTables) {
D
dapan1121 已提交
950 951
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }
D
dapan1121 已提交
952

D
dapan1121 已提交
953
  SName   name = {0};
D
dapan1121 已提交
954
  int32_t sver = 0;
D
dapan1121 已提交
955
  int32_t tver = 0;
D
dapan1121 已提交
956 957 958
  int32_t tbNum = taosArrayGetSize(pTables);
  for (int32_t i = 0; i < tbNum; ++i) {
    STbSVersion* pTb = (STbSVersion*)taosArrayGet(pTables, i);
D
dapan1121 已提交
959 960 961
    if (NULL == pTb->tbFName || 0 == pTb->tbFName[0]) {
      continue;
    }
X
Xiaoyu Wang 已提交
962

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

D
dapan1121 已提交
965
    if (IS_SYS_DBNAME(name.dbname)) {
D
dapan1121 已提交
966 967 968
      continue;
    }

L
Liu Jicong 已提交
969
    int32_t  tbType = 0;
D
dapan1121 已提交
970
    uint64_t suid = 0;
L
Liu Jicong 已提交
971
    char     stbName[TSDB_TABLE_FNAME_LEN];
D
dapan1121 已提交
972 973
    ctgReadTbVerFromCache(pCtg, &name, &sver, &tver, &tbType, &suid, stbName);
    if ((sver >= 0 && sver < pTb->sver) || (tver >= 0 && tver < pTb->tver)) {
D
dapan1121 已提交
974 975 976 977
      switch (tbType) {
        case TSDB_CHILD_TABLE: {
          SName stb = name;
          strcpy(stb.tname, stbName);
D
dapan1121 已提交
978
          ctgRemoveTbMeta(pCtg, &stb);
D
dapan1121 已提交
979 980 981 982
          break;
        }
        case TSDB_SUPER_TABLE:
        case TSDB_NORMAL_TABLE:
D
dapan1121 已提交
983
          ctgRemoveTbMeta(pCtg, &name);
D
dapan1121 已提交
984 985 986 987 988
          break;
        default:
          ctgError("ignore table type %d", tbType);
          break;
      }
D
dapan1121 已提交
989 990 991 992
    }
  }

  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan1121 已提交
993 994
}

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

D
dapan1121 已提交
998
  if (NULL == pCtg || NULL == pConn || NULL == dbFName) {
D
dapan1121 已提交
999 1000 1001
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1002
  CTG_API_LEAVE(ctgRefreshDBVgInfo(pCtg, pConn, dbFName));
D
dapan1121 已提交
1003
}
D
dapan1121 已提交
1004

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

D
dapan1121 已提交
1008
  if (NULL == pCtg || NULL == pConn || NULL == pTableName) {
D
dapan1121 已提交
1009 1010 1011
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1012 1013 1014 1015
  SCtgTbMetaCtx ctx = {0};
  ctx.pName = (SName*)pTableName;
  ctx.flag = CTG_FLAG_FORCE_UPDATE | CTG_FLAG_MAKE_STB(isSTable);

D
dapan1121 已提交
1016
  CTG_API_LEAVE(ctgRefreshTbMeta(pCtg, pConn, &ctx, NULL, true));
1017
}
1018

H
Hongze Cheng 已提交
1019 1020
int32_t catalogRefreshGetTableMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
                                   STableMeta** pTableMeta, int32_t isSTable) {
D
dapan1121 已提交
1021 1022
  CTG_API_ENTER();

D
dapan1121 已提交
1023 1024 1025 1026
  SCtgTbMetaCtx ctx = {0};
  ctx.pName = (SName*)pTableName;
  ctx.flag = CTG_FLAG_FORCE_UPDATE | CTG_FLAG_MAKE_STB(isSTable);

D
dapan1121 已提交
1027
  CTG_API_LEAVE(ctgGetTbMeta(pCtg, pConn, &ctx, pTableMeta));
D
dapan1121 已提交
1028 1029
}

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

D
dapan1121 已提交
1033
  if (NULL == pCtg || NULL == pConn || NULL == pTableName || NULL == pVgList) {
D
dapan1121 已提交
1034 1035
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }
D
dapan1121 已提交
1036

D
dapan1121 已提交
1037
  if (IS_SYS_DBNAME(pTableName->dbname)) {
D
dapan1121 已提交
1038 1039 1040
    ctgError("no valid vgInfo for db, dbname:%s", pTableName->dbname);
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }
D
dapan1121 已提交
1041

D
dapan1121 已提交
1042
  CTG_API_LEAVE(ctgGetTbDistVgInfo(pCtg, pConn, (SName*)pTableName, pVgList));
D
dapan1121 已提交
1043 1044
}

H
Hongze Cheng 已提交
1045 1046
int32_t catalogGetTableHashVgroup(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
                                  SVgroupInfo* pVgroup) {
D
dapan1121 已提交
1047 1048
  CTG_API_ENTER();

1049 1050 1051 1052 1053 1054 1055 1056
  CTG_API_LEAVE(ctgGetTbHashVgroup(pCtg, pConn, pTableName, pVgroup, NULL));
}

int32_t catalogGetCachedTableHashVgroup(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
                                  SVgroupInfo* pVgroup, bool* exists) {
  CTG_API_ENTER();

  CTG_API_LEAVE(ctgGetTbHashVgroup(pCtg, pConn, pTableName, pVgroup, exists));
D
dapan1121 已提交
1057 1058
}

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

D
dapan1121 已提交
1062
  if (NULL == pCtg || NULL == pConn || NULL == pReq || NULL == pRsp) {
D
dapan1121 已提交
1063 1064 1065
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1066
  int32_t code = 0;
D
dapan1121 已提交
1067
  pRsp->pTableMeta = NULL;
D
dapan1121 已提交
1068

D
dapan1121 已提交
1069 1070
  if (pReq->pTableMeta) {
    int32_t tbNum = (int32_t)taosArrayGetSize(pReq->pTableMeta);
D
dapan1121 已提交
1071
    if (tbNum <= 0) {
D
dapan1121 已提交
1072
      ctgError("empty table name list, tbNum:%d", tbNum);
D
dapan1121 已提交
1073
      CTG_ERR_JRET(TSDB_CODE_CTG_INVALID_INPUT);
D
dapan1121 已提交
1074
    }
H
Haojun Liao 已提交
1075

D
dapan1121 已提交
1076 1077
    pRsp->pTableMeta = taosArrayInit(tbNum, POINTER_BYTES);
    if (NULL == pRsp->pTableMeta) {
D
dapan1121 已提交
1078
      ctgError("taosArrayInit %d failed", tbNum);
D
dapan1121 已提交
1079
      CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
D
dapan1121 已提交
1080
    }
X
Xiaoyu Wang 已提交
1081

D
dapan1121 已提交
1082
    for (int32_t i = 0; i < tbNum; ++i) {
X
Xiaoyu Wang 已提交
1083 1084
      SName*        name = taosArrayGet(pReq->pTableMeta, i);
      STableMeta*   pTableMeta = NULL;
D
dapan1121 已提交
1085 1086 1087
      SCtgTbMetaCtx ctx = {0};
      ctx.pName = name;
      ctx.flag = CTG_FLAG_UNKNOWN_STB;
H
Hongze Cheng 已提交
1088

D
dapan1121 已提交
1089
      CTG_ERR_JRET(ctgGetTbMeta(pCtg, pConn, &ctx, &pTableMeta));
D
dapan1121 已提交
1090 1091 1092

      if (NULL == taosArrayPush(pRsp->pTableMeta, &pTableMeta)) {
        ctgError("taosArrayPush failed, idx:%d", i);
wafwerar's avatar
wafwerar 已提交
1093
        taosMemoryFreeClear(pTableMeta);
D
dapan1121 已提交
1094
        CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
D
dapan1121 已提交
1095 1096 1097 1098
      }
    }
  }

D
dapan1121 已提交
1099
  if (pReq->qNodeRequired) {
D
dapan1121 已提交
1100
    pRsp->pQnodeList = taosArrayInit(10, sizeof(SQueryNodeLoad));
D
dapan1121 已提交
1101
    CTG_ERR_JRET(ctgGetQnodeListFromMnode(pCtg, pConn, pRsp->pQnodeList, NULL));
D
dapan1121 已提交
1102 1103
  }

D
dapan1121 已提交
1104
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan1121 已提交
1105

X
Xiaoyu Wang 已提交
1106
_return:
D
dapan1121 已提交
1107

D
dapan1121 已提交
1108 1109 1110
  if (pRsp->pTableMeta) {
    int32_t aSize = taosArrayGetSize(pRsp->pTableMeta);
    for (int32_t i = 0; i < aSize; ++i) {
X
Xiaoyu Wang 已提交
1111
      STableMeta* pMeta = taosArrayGetP(pRsp->pTableMeta, i);
wafwerar's avatar
wafwerar 已提交
1112
      taosMemoryFreeClear(pMeta);
D
dapan1121 已提交
1113
    }
X
Xiaoyu Wang 已提交
1114

D
dapan1121 已提交
1115
    taosArrayDestroy(pRsp->pTableMeta);
D
dapan1121 已提交
1116
    pRsp->pTableMeta = NULL;
D
dapan1121 已提交
1117
  }
X
Xiaoyu Wang 已提交
1118

D
dapan1121 已提交
1119
  CTG_API_LEAVE(code);
1120
}
D
dapan 已提交
1121

H
Hongze Cheng 已提交
1122 1123
int32_t catalogAsyncGetAllMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SCatalogReq* pReq, catalogCallback fp,
                               void* param, int64_t* jobId) {
D
dapan1121 已提交
1124 1125
  CTG_API_ENTER();

D
dapan1121 已提交
1126
  if (NULL == pCtg || NULL == pConn || NULL == pReq || NULL == fp || NULL == param) {
D
dapan1121 已提交
1127 1128 1129
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

H
Hongze Cheng 已提交
1130 1131
  int32_t  code = 0;
  SCtgJob* pJob = NULL;
D
dapan1121 已提交
1132
  CTG_ERR_JRET(ctgInitJob(pCtg, pConn, &pJob, pReq, fp, param));
D
dapan1121 已提交
1133 1134 1135

  CTG_ERR_JRET(ctgLaunchJob(pJob));

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

D
dapan1121 已提交
1139
_return:
D
dapan1121 已提交
1140

D
dapan1121 已提交
1141 1142 1143 1144 1145 1146 1147
  if (pJob) {
    taosReleaseRef(gCtgMgmt.jobPool, pJob->refId);

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

D
dapan1121 已提交
1149 1150 1151
  CTG_API_LEAVE(code);
}

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

D
dapan1121 已提交
1155
  int32_t code = 0;
D
dapan1121 已提交
1156
  if (NULL == pCtg || NULL == pConn || NULL == pQnodeList) {
D
dapan1121 已提交
1157 1158 1159
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1160
  CTG_ERR_JRET(ctgGetQnodeListFromMnode(pCtg, pConn, pQnodeList, NULL));
D
dapan1121 已提交
1161 1162

_return:
D
dapan 已提交
1163

D
dapan1121 已提交
1164
  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
D
dapan 已提交
1165 1166
}

D
dapan1121 已提交
1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179
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);
1180 1181
}

H
Hongze Cheng 已提交
1182
int32_t catalogGetExpiredSTables(SCatalog* pCtg, SSTableVersion** stables, uint32_t* num) {
D
dapan1121 已提交
1183 1184
  CTG_API_ENTER();

D
dapan1121 已提交
1185 1186
  if (NULL == pCtg || NULL == stables || NULL == num) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
D
dapan1121 已提交
1187 1188
  }

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

X
Xiaoyu Wang 已提交
1192
int32_t catalogGetExpiredDBs(SCatalog* pCtg, SDbVgVersion** dbs, uint32_t* num) {
D
dapan1121 已提交
1193
  CTG_API_ENTER();
X
Xiaoyu Wang 已提交
1194

D
dapan1121 已提交
1195 1196 1197
  if (NULL == pCtg || NULL == dbs || NULL == num) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }
D
dapan1121 已提交
1198

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

X
Xiaoyu Wang 已提交
1202
int32_t catalogGetExpiredUsers(SCatalog* pCtg, SUserAuthVersion** users, uint32_t* num) {
D
dapan 已提交
1203
  CTG_API_ENTER();
X
Xiaoyu Wang 已提交
1204

D
dapan 已提交
1205 1206 1207 1208 1209
  if (NULL == pCtg || NULL == users || NULL == num) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

  *num = taosHashGetSize(pCtg->userCache);
D
dapan1121 已提交
1210 1211 1212
  if (*num <= 0) {
    CTG_API_LEAVE(TSDB_CODE_SUCCESS);
  }
H
Hongze Cheng 已提交
1213

D
dapan1121 已提交
1214 1215 1216 1217
  *users = taosMemoryCalloc(*num, sizeof(SUserAuthVersion));
  if (NULL == *users) {
    ctgError("calloc %d userAuthVersion failed", *num);
    CTG_API_LEAVE(TSDB_CODE_OUT_OF_MEMORY);
D
dapan 已提交
1218 1219
  }

X
Xiaoyu Wang 已提交
1220 1221
  uint32_t      i = 0;
  SCtgUserAuth* pAuth = taosHashIterate(pCtg->userCache, NULL);
D
dapan 已提交
1222
  while (pAuth != NULL) {
D
fix bug  
dapan1121 已提交
1223
    size_t len = 0;
X
Xiaoyu Wang 已提交
1224
    void*  key = taosHashGetKey(pAuth, &len);
D
fix bug  
dapan1121 已提交
1225 1226
    strncpy((*users)[i].user, key, len);
    (*users)[i].user[len] = 0;
D
dapan 已提交
1227
    (*users)[i].version = pAuth->version;
D
fix bug  
dapan1121 已提交
1228
    ++i;
D
dapan1121 已提交
1229 1230 1231 1232
    if (i >= *num) {
      taosHashCancelIterate(pCtg->userCache, pAuth);
      break;
    }
H
Hongze Cheng 已提交
1233

D
dapan 已提交
1234 1235 1236 1237 1238 1239
    pAuth = taosHashIterate(pCtg->userCache, pAuth);
  }

  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
}

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

D
dapan1121 已提交
1243
  if (NULL == pCtg || NULL == pConn || NULL == dbFName || NULL == pDbCfg) {
D
dapan1121 已提交
1244 1245 1246
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1247
  CTG_API_LEAVE(ctgGetDBCfgFromMnode(pCtg, pConn, dbFName, pDbCfg, NULL));
D
dapan1121 已提交
1248
}
D
dapan 已提交
1249

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

D
dapan1121 已提交
1253
  if (NULL == pCtg || NULL == pConn || NULL == indexName || NULL == pInfo) {
D
dapan1121 已提交
1254 1255 1256
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1257
  CTG_API_LEAVE(ctgGetIndexInfoFromMnode(pCtg, pConn, indexName, pInfo, NULL));
D
dapan1121 已提交
1258 1259
}

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

D
dapan1121 已提交
1263
  if (NULL == pCtg || NULL == pConn || NULL == pTableName || NULL == pRes) {
D
dapan1121 已提交
1264 1265 1266
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

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

D
dapan1121 已提交
1270 1271 1272
_return:

  CTG_API_LEAVE(code);
D
dapan1121 已提交
1273 1274
}

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

D
dapan1121 已提交
1278 1279 1280 1281
  if (NULL == pCtg || NULL == pConn || NULL == pTableName || NULL == pCfg) {
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1282
  int32_t code = 0;
D
dapan1121 已提交
1283
  CTG_ERR_JRET(ctgRemoveTbMeta(pCtg, (SName*)pTableName));
D
dapan1121 已提交
1284 1285 1286 1287 1288 1289

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

_return:

  CTG_API_LEAVE(code);
D
dapan1121 已提交
1290 1291
}

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

D
dapan1121 已提交
1295
  if (NULL == pCtg || NULL == pConn || NULL == funcName || NULL == pInfo) {
D
dapan1121 已提交
1296 1297 1298
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

D
dapan1121 已提交
1299
  int32_t code = 0;
D
dapan1121 已提交
1300
  CTG_ERR_JRET(ctgGetUdfInfoFromMnode(pCtg, pConn, funcName, pInfo, NULL));
H
Hongze Cheng 已提交
1301

D
dapan1121 已提交
1302
_return:
X
Xiaoyu Wang 已提交
1303

D
dapan1121 已提交
1304
  CTG_API_LEAVE(code);
D
dapan1121 已提交
1305 1306
}

H
Hongze Cheng 已提交
1307 1308
int32_t catalogChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, const char* user, const char* dbFName, AUTH_TYPE type,
                       bool* pass) {
D
dapan 已提交
1309
  CTG_API_ENTER();
H
Hongze Cheng 已提交
1310

D
dapan1121 已提交
1311
  if (NULL == pCtg || NULL == pConn || NULL == user || NULL == dbFName || NULL == pass) {
D
dapan 已提交
1312 1313 1314 1315
    CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
  }

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

D
dapan 已提交
1318 1319 1320 1321 1322
_return:

  CTG_API_LEAVE(code);
}

H
Hongze Cheng 已提交
1323
int32_t catalogGetServerVersion(SCatalog* pCtg, SRequestConnInfo* pConn, char** pVersion) {
D
dapan1121 已提交
1324
  CTG_API_ENTER();
H
Hongze Cheng 已提交
1325

D
dapan1121 已提交
1326 1327 1328 1329 1330 1331
  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 已提交
1332

D
dapan1121 已提交
1333 1334 1335 1336 1337
_return:

  CTG_API_LEAVE(code);
}

D
dapan 已提交
1338 1339 1340 1341 1342 1343 1344
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 已提交
1345
  CTG_API_LEAVE(ctgUpdateUserEnqueue(pCtg, pAuth, false));
D
dapan 已提交
1346 1347
}

D
dapan1121 已提交
1348
int32_t catalogClearCache(void) {
D
dapan1121 已提交
1349
  CTG_API_ENTER_NOLOCK();
D
dapan1121 已提交
1350 1351 1352 1353

  qInfo("start to clear catalog cache");

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

D
dapan1121 已提交
1357
  int32_t code = ctgClearCacheEnqueue(NULL, false, false, true);
D
dapan1121 已提交
1358 1359

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

D
dapan1121 已提交
1361
  CTG_API_LEAVE_NOLOCK(code);
D
dapan1121 已提交
1362 1363
}

D
dapan 已提交
1364
void catalogDestroy(void) {
D
dapan1121 已提交
1365
  qInfo("start to destroy catalog");
X
Xiaoyu Wang 已提交
1366

wafwerar's avatar
wafwerar 已提交
1367
  if (NULL == gCtgMgmt.pCluster || atomic_load_8((int8_t*)&gCtgMgmt.exit)) {
D
dapan1121 已提交
1368 1369 1370
    return;
  }

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

D
dapan1121 已提交
1373 1374
  if (!taosCheckCurrentInDll()) {
    ctgClearCacheEnqueue(NULL, true, true, true);
D
dapan1121 已提交
1375
    taosThreadJoin(gCtgMgmt.updateThread, NULL);
D
dapan1121 已提交
1376
  }
1377

D
dapan 已提交
1378 1379
  taosHashCleanup(gCtgMgmt.pCluster);
  gCtgMgmt.pCluster = NULL;
D
dapan1121 已提交
1380 1381

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