ctgDbg.c 13.3 KB
Newer Older
D
dapan1121 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * 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
Hongze Cheng 已提交
16
#include "catalogInt.h"
D
dapan1121 已提交
17 18
#include "query.h"
#include "tname.h"
H
Hongze Cheng 已提交
19
#include "trpc.h"
D
dapan1121 已提交
20 21

extern SCatalogMgmt gCtgMgmt;
H
Hongze Cheng 已提交
22
SCtgDebug           gCTGDebug = {0};
D
dapan1121 已提交
23

H
Hongze Cheng 已提交
24 25
void ctgdUserCallback(SMetaData *pResult, void *param, int32_t code) {
  ASSERT(*(int32_t *)param == 1);
D
dapan1121 已提交
26 27
  taosMemoryFree(param);

D
dapan1121 已提交
28
  qDebug("async call result: %s", tstrerror(code));
D
dapan1121 已提交
29
  if (NULL == pResult) {
D
dapan1121 已提交
30
    qDebug("empty meta result");
D
dapan1121 已提交
31 32 33 34 35 36 37 38
    return;
  }

  int32_t num = 0;

  if (pResult->pTableMeta && taosArrayGetSize(pResult->pTableMeta) > 0) {
    num = taosArrayGetSize(pResult->pTableMeta);
    for (int32_t i = 0; i < num; ++i) {
H
Hongze Cheng 已提交
39
      STableMeta    *p = *(STableMeta **)taosArrayGet(pResult->pTableMeta, i);
D
dapan1121 已提交
40
      STableComInfo *c = &p->tableInfo;
H
Hongze Cheng 已提交
41

D
dapan1121 已提交
42
      if (TSDB_CHILD_TABLE == p->tableType) {
H
Hongze Cheng 已提交
43 44
        qDebug("table meta: type:%d, vgId:%d, uid:0x%" PRIx64 ",suid:0x%" PRIx64, p->tableType, p->vgId, p->uid,
               p->suid);
D
dapan1121 已提交
45
      } else {
H
Hongze Cheng 已提交
46 47 48 49
        qDebug("table meta: type:%d, vgId:%d, uid:0x%" PRIx64 ",suid:0x%" PRIx64
               ",sv:%d, tv:%d, tagNum:%d, precision:%d, colNum:%d, rowSize:%d",
               p->tableType, p->vgId, p->uid, p->suid, p->sversion, p->tversion, c->numOfTags, c->precision,
               c->numOfColumns, c->rowSize);
D
dapan1121 已提交
50
      }
H
Hongze Cheng 已提交
51

D
dapan1121 已提交
52 53 54
      int32_t colNum = c->numOfColumns + c->numOfTags;
      for (int32_t j = 0; j < colNum; ++j) {
        SSchema *s = &p->schema[j];
D
dapan1121 已提交
55
        qDebug("[%d] name:%s, type:%d, colId:%d, bytes:%d", j, s->name, s->type, s->colId, s->bytes);
D
dapan1121 已提交
56 57 58
      }
    }
  } else {
D
dapan1121 已提交
59
    qDebug("empty table meta");
D
dapan1121 已提交
60 61 62 63 64
  }

  if (pResult->pDbVgroup && taosArrayGetSize(pResult->pDbVgroup) > 0) {
    num = taosArrayGetSize(pResult->pDbVgroup);
    for (int32_t i = 0; i < num; ++i) {
H
Hongze Cheng 已提交
65
      SArray *pDb = *(SArray **)taosArrayGet(pResult->pDbVgroup, i);
D
dapan1121 已提交
66
      int32_t vgNum = taosArrayGetSize(pDb);
D
dapan1121 已提交
67
      qDebug("db %d vgInfo:", i);
D
dapan1121 已提交
68
      for (int32_t j = 0; j < vgNum; ++j) {
H
Hongze Cheng 已提交
69
        SVgroupInfo *pInfo = taosArrayGet(pDb, j);
S
Shengliang Guan 已提交
70
        qDebug("vg :%d info: vgId:%d", j, pInfo->vgId);
D
dapan1121 已提交
71 72 73
      }
    }
  } else {
D
dapan1121 已提交
74
    qDebug("empty db vgroup");
D
dapan1121 已提交
75
  }
D
dapan1121 已提交
76

D
dapan1121 已提交
77 78 79 80
  if (pResult->pDbInfo && taosArrayGetSize(pResult->pDbInfo) > 0) {
    num = taosArrayGetSize(pResult->pDbInfo);
    for (int32_t i = 0; i < num; ++i) {
      SDbInfo *pDb = taosArrayGet(pResult->pDbInfo, i);
D
dapan1121 已提交
81
      qDebug("db %d dbInfo: vgVer:%d, tbNum:%d, dbId:0x%" PRIx64, i, pDb->vgVer, pDb->tbNum, pDb->dbId);
D
dapan1121 已提交
82 83 84 85 86
    }
  } else {
    qDebug("empty db info");
  }

D
dapan1121 已提交
87 88 89
  if (pResult->pTableHash && taosArrayGetSize(pResult->pTableHash) > 0) {
    num = taosArrayGetSize(pResult->pTableHash);
    for (int32_t i = 0; i < num; ++i) {
H
Hongze Cheng 已提交
90
      SVgroupInfo *pInfo = taosArrayGet(pResult->pTableHash, i);
D
dapan1121 已提交
91 92 93 94 95 96 97 98 99
      qDebug("table %d vg info: vgId:%d", i, pInfo->vgId);
    }
  } else {
    qDebug("empty table hash vgroup");
  }

  if (pResult->pUdfList && taosArrayGetSize(pResult->pUdfList) > 0) {
    num = taosArrayGetSize(pResult->pUdfList);
    for (int32_t i = 0; i < num; ++i) {
H
Hongze Cheng 已提交
100
      SFuncInfo *pInfo = taosArrayGet(pResult->pUdfList, i);
D
dapan1121 已提交
101 102 103 104 105 106 107 108 109
      qDebug("udf %d info: name:%s, funcType:%d", i, pInfo->name, pInfo->funcType);
    }
  } else {
    qDebug("empty udf info");
  }

  if (pResult->pDbCfg && taosArrayGetSize(pResult->pDbCfg) > 0) {
    num = taosArrayGetSize(pResult->pDbCfg);
    for (int32_t i = 0; i < num; ++i) {
H
Hongze Cheng 已提交
110
      SDbCfgInfo *pInfo = taosArrayGet(pResult->pDbCfg, i);
D
dapan1121 已提交
111 112 113 114
      qDebug("db %d info: numOFVgroups:%d, numOfStables:%d", i, pInfo->numOfVgroups, pInfo->numOfStables);
    }
  } else {
    qDebug("empty db cfg info");
H
Hongze Cheng 已提交
115
  }
D
dapan1121 已提交
116 117 118 119

  if (pResult->pUser && taosArrayGetSize(pResult->pUser) > 0) {
    num = taosArrayGetSize(pResult->pUser);
    for (int32_t i = 0; i < num; ++i) {
H
Hongze Cheng 已提交
120
      bool *auth = taosArrayGet(pResult->pUser, i);
D
dapan1121 已提交
121 122 123 124
      qDebug("user auth %d info: %d", i, *auth);
    }
  } else {
    qDebug("empty user auth info");
H
Hongze Cheng 已提交
125
  }
D
dapan1121 已提交
126 127 128 129

  if (pResult->pQnodeList && taosArrayGetSize(pResult->pQnodeList) > 0) {
    num = taosArrayGetSize(pResult->pQnodeList);
    for (int32_t i = 0; i < num; ++i) {
H
Hongze Cheng 已提交
130
      SQueryNodeAddr *qaddr = taosArrayGet(pResult->pQnodeList, i);
D
dapan1121 已提交
131 132 133 134
      qDebug("qnode %d info: id:%d", i, qaddr->nodeId);
    }
  } else {
    qDebug("empty qnode info");
H
Hongze Cheng 已提交
135
  }
D
dapan1121 已提交
136 137
}

D
dapan1121 已提交
138 139 140 141 142 143 144 145 146 147 148 149 150 151
/*
prepare SQL:
create database db1;
use db1;
create stable st1 (ts timestamp, f1 int) tags(t1 int);
create table tb1 using st1 tags(1);
insert into tb1 values (now, 1);
create qnode on dnode 1;
create user user1 pass "abc";
create database db2;
grant write on db2.* to user1;
create function udf1 as '/tmp/libudf1.so' outputtype int;
create aggregate function udf2 as '/tmp/libudf2.so' outputtype int;
*/
H
Hongze Cheng 已提交
152 153
int32_t ctgdLaunchAsyncCall(SCatalog *pCtg, SRequestConnInfo *pConn, uint64_t reqId, bool forceUpdate) {
  int32_t     code = 0;
D
dapan1121 已提交
154 155 156
  SCatalogReq req = {0};
  req.pTableMeta = taosArrayInit(2, sizeof(SName));
  req.pDbVgroup = taosArrayInit(2, TSDB_DB_FNAME_LEN);
D
dapan1121 已提交
157
  req.pDbInfo = taosArrayInit(2, TSDB_DB_FNAME_LEN);
D
dapan1121 已提交
158 159 160
  req.pTableHash = taosArrayInit(2, sizeof(SName));
  req.pUdf = taosArrayInit(2, TSDB_FUNC_NAME_LEN);
  req.pDbCfg = taosArrayInit(2, TSDB_DB_FNAME_LEN);
H
Hongze Cheng 已提交
161
  req.pIndex = NULL;  // taosArrayInit(2, TSDB_INDEX_FNAME_LEN);
D
dapan1121 已提交
162 163
  req.pUser = taosArrayInit(2, sizeof(SUserAuthInfo));
  req.qNodeRequired = true;
D
dapan1121 已提交
164
  req.forceUpdate = forceUpdate;
D
dapan1121 已提交
165

H
Hongze Cheng 已提交
166 167 168
  SName         name = {0};
  char          dbFName[TSDB_DB_FNAME_LEN] = {0};
  char          funcName[TSDB_FUNC_NAME_LEN] = {0};
D
dapan1121 已提交
169
  SUserAuthInfo user = {0};
H
Hongze Cheng 已提交
170

D
dapan1121 已提交
171 172 173 174 175 176 177 178 179 180
  tNameFromString(&name, "1.db1.tb1", T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
  taosArrayPush(req.pTableMeta, &name);
  taosArrayPush(req.pTableHash, &name);
  tNameFromString(&name, "1.db1.st1", T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
  taosArrayPush(req.pTableMeta, &name);
  taosArrayPush(req.pTableHash, &name);

  strcpy(dbFName, "1.db1");
  taosArrayPush(req.pDbVgroup, dbFName);
  taosArrayPush(req.pDbCfg, dbFName);
D
dapan1121 已提交
181
  taosArrayPush(req.pDbInfo, dbFName);
D
dapan1121 已提交
182 183 184
  strcpy(dbFName, "1.db2");
  taosArrayPush(req.pDbVgroup, dbFName);
  taosArrayPush(req.pDbCfg, dbFName);
D
dapan1121 已提交
185
  taosArrayPush(req.pDbInfo, dbFName);
D
dapan1121 已提交
186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211

  strcpy(funcName, "udf1");
  taosArrayPush(req.pUdf, funcName);
  strcpy(funcName, "udf2");
  taosArrayPush(req.pUdf, funcName);

  strcpy(user.user, "root");
  strcpy(user.dbFName, "1.db1");
  user.type = AUTH_TYPE_READ;
  taosArrayPush(req.pUser, &user);
  user.type = AUTH_TYPE_WRITE;
  taosArrayPush(req.pUser, &user);
  user.type = AUTH_TYPE_OTHER;
  taosArrayPush(req.pUser, &user);

  strcpy(user.user, "user1");
  strcpy(user.dbFName, "1.db2");
  user.type = AUTH_TYPE_READ;
  taosArrayPush(req.pUser, &user);
  user.type = AUTH_TYPE_WRITE;
  taosArrayPush(req.pUser, &user);
  user.type = AUTH_TYPE_OTHER;
  taosArrayPush(req.pUser, &user);

  int32_t *param = taosMemoryCalloc(1, sizeof(int32_t));
  *param = 1;
H
Hongze Cheng 已提交
212

D
dapan1121 已提交
213
  int64_t jobId = 0;
D
dapan1121 已提交
214

D
dapan1121 已提交
215
  CTG_ERR_JRET(catalogAsyncGetAllMeta(pCtg, pConn, &req, ctgdUserCallback, param, &jobId));
D
dapan1121 已提交
216 217 218 219 220 221 222 223 224 225

_return:

  taosArrayDestroy(req.pTableMeta);
  taosArrayDestroy(req.pDbVgroup);
  taosArrayDestroy(req.pTableHash);
  taosArrayDestroy(req.pUdf);
  taosArrayDestroy(req.pDbCfg);
  taosArrayDestroy(req.pUser);

H
Hongze Cheng 已提交
226
  CTG_RET(code);
D
dapan1121 已提交
227 228
}

D
dapan1121 已提交
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
int32_t ctgdEnableDebug(char *option) {
  if (0 == strcasecmp(option, "lock")) {
    gCTGDebug.lockEnable = true;
    qDebug("lock debug enabled");
    return TSDB_CODE_SUCCESS;
  }

  if (0 == strcasecmp(option, "cache")) {
    gCTGDebug.cacheEnable = true;
    qDebug("cache debug enabled");
    return TSDB_CODE_SUCCESS;
  }

  if (0 == strcasecmp(option, "api")) {
    gCTGDebug.apiEnable = true;
    qDebug("api debug enabled");
    return TSDB_CODE_SUCCESS;
  }

  if (0 == strcasecmp(option, "meta")) {
    gCTGDebug.metaEnable = true;
    qDebug("api debug enabled");
    return TSDB_CODE_SUCCESS;
  }

  qError("invalid debug option:%s", option);
H
Hongze Cheng 已提交
255

D
dapan1121 已提交
256 257 258 259
  return TSDB_CODE_CTG_INTERNAL_ERROR;
}

int32_t ctgdGetStatNum(char *option, void *res) {
D
dapan1121 已提交
260 261
  if (0 == strcasecmp(option, "runtime.numOfOpDequeue")) {
    *(uint64_t *)res = atomic_load_64(&gCtgMgmt.stat.runtime.numOfOpDequeue);
D
dapan1121 已提交
262 263 264 265
    return TSDB_CODE_SUCCESS;
  }

  qError("invalid stat option:%s", option);
H
Hongze Cheng 已提交
266

D
dapan1121 已提交
267 268 269 270
  return TSDB_CODE_CTG_INTERNAL_ERROR;
}

int32_t ctgdGetTbMetaNum(SCtgDBCache *dbCache) {
D
dapan1121 已提交
271
  return dbCache->tbCache ? (int32_t)taosHashGetSize(dbCache->tbCache) : 0;
D
dapan1121 已提交
272 273 274
}

int32_t ctgdGetStbNum(SCtgDBCache *dbCache) {
D
dapan1121 已提交
275
  return dbCache->stbCache ? (int32_t)taosHashGetSize(dbCache->stbCache) : 0;
D
dapan1121 已提交
276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291
}

int32_t ctgdGetRentNum(SCtgRentMgmt *rent) {
  int32_t num = 0;
  for (uint16_t i = 0; i < rent->slotNum; ++i) {
    SCtgRentSlot *slot = &rent->slots[i];
    if (NULL == slot->meta) {
      continue;
    }

    num += taosArrayGetSize(slot->meta);
  }

  return num;
}

H
Hongze Cheng 已提交
292
int32_t ctgdGetClusterCacheNum(SCatalog *pCtg, int32_t type) {
D
dapan1121 已提交
293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
  if (NULL == pCtg || NULL == pCtg->dbCache) {
    return 0;
  }

  switch (type) {
    case CTG_DBG_DB_NUM:
      return (int32_t)taosHashGetSize(pCtg->dbCache);
    case CTG_DBG_DB_RENT_NUM:
      return ctgdGetRentNum(&pCtg->dbRent);
    case CTG_DBG_STB_RENT_NUM:
      return ctgdGetRentNum(&pCtg->stbRent);
    default:
      break;
  }

  SCtgDBCache *dbCache = NULL;
H
Hongze Cheng 已提交
309 310
  int32_t      num = 0;
  void        *pIter = taosHashIterate(pCtg->dbCache, NULL);
D
dapan1121 已提交
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329
  while (pIter) {
    dbCache = (SCtgDBCache *)pIter;
    switch (type) {
      case CTG_DBG_META_NUM:
        num += ctgdGetTbMetaNum(dbCache);
        break;
      case CTG_DBG_STB_NUM:
        num += ctgdGetStbNum(dbCache);
        break;
      default:
        ctgError("invalid type:%d", type);
        break;
    }
    pIter = taosHashIterate(pCtg->dbCache, pIter);
  }

  return num;
}

H
Hongze Cheng 已提交
330
void ctgdShowTableMeta(SCatalog *pCtg, const char *tbName, STableMeta *p) {
D
dapan1121 已提交
331 332 333 334 335 336 337
  if (!gCTGDebug.metaEnable) {
    return;
  }

  STableComInfo *c = &p->tableInfo;

  if (TSDB_CHILD_TABLE == p->tableType) {
H
Hongze Cheng 已提交
338 339
    ctgDebug("table [%s] meta: type:%d, vgId:%d, uid:0x%" PRIx64 ",suid:0x%" PRIx64, tbName, p->tableType, p->vgId,
             p->uid, p->suid);
D
dapan1121 已提交
340 341
    return;
  } else {
H
Hongze Cheng 已提交
342 343 344 345
    ctgDebug("table [%s] meta: type:%d, vgId:%d, uid:0x%" PRIx64 ",suid:0x%" PRIx64
             ",sv:%d, tv:%d, tagNum:%d, precision:%d, colNum:%d, rowSize:%d",
             tbName, p->tableType, p->vgId, p->uid, p->suid, p->sversion, p->tversion, c->numOfTags, c->precision,
             c->numOfColumns, c->rowSize);
D
dapan1121 已提交
346 347 348 349 350 351 352 353 354
  }

  int32_t colNum = c->numOfColumns + c->numOfTags;
  for (int32_t i = 0; i < colNum; ++i) {
    SSchema *s = &p->schema[i];
    ctgDebug("[%d] name:%s, type:%d, colId:%d, bytes:%d", i, s->name, s->type, s->colId, s->bytes);
  }
}

H
Hongze Cheng 已提交
355
void ctgdShowDBCache(SCatalog *pCtg, SHashObj *dbHash) {
D
dapan1121 已提交
356 357 358 359
  if (NULL == dbHash || !gCTGDebug.cacheEnable) {
    return;
  }

H
Hongze Cheng 已提交
360
  int32_t      i = 0;
D
dapan1121 已提交
361
  SCtgDBCache *dbCache = NULL;
H
Hongze Cheng 已提交
362
  void        *pIter = taosHashIterate(dbHash, NULL);
D
dapan1121 已提交
363
  while (pIter) {
H
Hongze Cheng 已提交
364
    char  *dbFName = NULL;
D
dapan1121 已提交
365
    size_t len = 0;
H
Hongze Cheng 已提交
366

D
dapan1121 已提交
367 368 369 370
    dbCache = (SCtgDBCache *)pIter;

    dbFName = taosHashGetKey(pIter, &len);

D
dapan1121 已提交
371 372
    int32_t metaNum = dbCache->tbCache ? taosHashGetSize(dbCache->tbCache) : 0;
    int32_t stbNum = dbCache->stbCache ? taosHashGetSize(dbCache->stbCache) : 0;
D
dapan1121 已提交
373 374
    int32_t vgVersion = CTG_DEFAULT_INVALID_VERSION;
    int32_t hashMethod = -1;
375 376
    int16_t hashPrefix = 0;
    int16_t hashSuffix = 0;
D
dapan1121 已提交
377 378
    int32_t vgNum = 0;

D
dapan1121 已提交
379 380 381
    if (dbCache->vgCache.vgInfo) {
      vgVersion = dbCache->vgCache.vgInfo->vgVersion;
      hashMethod = dbCache->vgCache.vgInfo->hashMethod;
382 383
      hashPrefix = dbCache->vgCache.vgInfo->hashPrefix;
      hashSuffix = dbCache->vgCache.vgInfo->hashSuffix;
D
dapan1121 已提交
384 385
      if (dbCache->vgCache.vgInfo->vgHash) {
        vgNum = taosHashGetSize(dbCache->vgCache.vgInfo->vgHash);
D
dapan1121 已提交
386 387
      }
    }
H
Hongze Cheng 已提交
388 389 390 391 392

    ctgDebug("[%d] db [%.*s][0x%" PRIx64
             "] %s: metaNum:%d, stbNum:%d, vgVersion:%d, hashMethod:%d, prefix:%d, suffix:%d, vgNum:%d",
             i, (int32_t)len, dbFName, dbCache->dbId, dbCache->deleted ? "deleted" : "", metaNum, stbNum, vgVersion,
             hashMethod, hashPrefix, hashSuffix, vgNum);
D
dapan1121 已提交
393 394 395 396 397

    pIter = taosHashIterate(dbHash, pIter);
  }
}

H
Hongze Cheng 已提交
398
void ctgdShowClusterCache(SCatalog *pCtg) {
D
dapan1121 已提交
399 400 401 402
  if (!gCTGDebug.cacheEnable || NULL == pCtg) {
    return;
  }

H
Hongze Cheng 已提交
403 404 405 406 407
  ctgDebug("## cluster 0x%" PRIx64 " %p cache Info BEGIN ##", pCtg->clusterId, pCtg);
  ctgDebug("db:%d meta:%d stb:%d dbRent:%d stbRent:%d", ctgdGetClusterCacheNum(pCtg, CTG_DBG_DB_NUM),
           ctgdGetClusterCacheNum(pCtg, CTG_DBG_META_NUM), ctgdGetClusterCacheNum(pCtg, CTG_DBG_STB_NUM),
           ctgdGetClusterCacheNum(pCtg, CTG_DBG_DB_RENT_NUM), ctgdGetClusterCacheNum(pCtg, CTG_DBG_STB_RENT_NUM));

D
dapan1121 已提交
408 409
  ctgdShowDBCache(pCtg, pCtg->dbCache);

H
Hongze Cheng 已提交
410
  ctgDebug("## cluster 0x%" PRIx64 " %p cache Info END ##", pCtg->clusterId, pCtg);
D
dapan1121 已提交
411 412 413 414 415 416 417 418
}

int32_t ctgdShowCacheInfo(void) {
  if (!gCTGDebug.cacheEnable) {
    return TSDB_CODE_CTG_OUT_OF_SERVICE;
  }

  CTG_API_ENTER();
D
dapan1121 已提交
419 420

  qDebug("# total catalog cluster number %d #", taosHashGetSize(gCtgMgmt.pCluster));
H
Hongze Cheng 已提交
421

D
dapan1121 已提交
422
  SCatalog *pCtg = NULL;
H
Hongze Cheng 已提交
423
  void     *pIter = taosHashIterate(gCtgMgmt.pCluster, NULL);
D
dapan1121 已提交
424 425 426 427 428 429
  while (pIter) {
    pCtg = *(SCatalog **)pIter;

    if (pCtg) {
      ctgdShowClusterCache(pCtg);
    }
H
Hongze Cheng 已提交
430

D
dapan1121 已提交
431 432 433 434 435
    pIter = taosHashIterate(gCtgMgmt.pCluster, pIter);
  }

  CTG_API_LEAVE(TSDB_CODE_SUCCESS);
}