Merge pull request #17190 from taosdata/enh/optGetTableMeta
enh(query): opt get table meta
This commit is contained in:
commit
5aab7ab475
|
@ -96,7 +96,7 @@ void metaReaderClear(SMetaReader *pReader);
|
|||
int32_t metaGetTableEntryByUid(SMetaReader *pReader, tb_uid_t uid);
|
||||
int metaGetTableEntryByName(SMetaReader *pReader, const char *name);
|
||||
int32_t metaGetTableTags(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj *tags);
|
||||
int32_t metaGetTableTagsOpt(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj *tags);
|
||||
int32_t metaGetTableTagsByUids(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj *tags);
|
||||
int32_t metaReadNext(SMetaReader *pReader);
|
||||
const void *metaGetTableTagVal(void *tag, int16_t type, STagVal *tagVal);
|
||||
int metaGetTableNameByUid(void *meta, uint64_t uid, char *tbName);
|
||||
|
@ -159,7 +159,7 @@ uint64_t getReaderMaxVersion(STsdbReader *pReader);
|
|||
|
||||
int32_t tsdbCacherowsReaderOpen(void *pVnode, int32_t type, SArray *pTableIdList, int32_t numOfCols, void **pReader);
|
||||
int32_t tsdbRetrieveCacheRows(void *pReader, SSDataBlock *pResBlock, const int32_t *slotIds, SArray *pTableUids);
|
||||
void* tsdbCacherowsReaderClose(void *pReader);
|
||||
void *tsdbCacherowsReaderClose(void *pReader);
|
||||
int32_t tsdbGetTableSchema(SVnode *pVnode, int64_t uid, STSchema **pSchema, int64_t *suid);
|
||||
|
||||
void tsdbCacheSetCapacity(SVnode *pVnode, size_t capacity);
|
||||
|
|
|
@ -207,17 +207,17 @@ int metaGetTableUidByName(void *meta, char *tbName, uint64_t *uid) {
|
|||
SMetaReader mr = {0};
|
||||
metaReaderInit(&mr, (SMeta *)meta, 0);
|
||||
|
||||
SMeta *pMeta = mr.pMeta;
|
||||
SMetaReader *pReader = &mr;
|
||||
|
||||
// query name.idx
|
||||
if (tdbTbGet(pMeta->pNameIdx, tbName, strlen(tbName) + 1, &pReader->pBuf, &pReader->szBuf) < 0) {
|
||||
if (tdbTbGet(pReader->pMeta->pNameIdx, tbName, strlen(tbName) + 1, &pReader->pBuf, &pReader->szBuf) < 0) {
|
||||
terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST;
|
||||
metaReaderClear(&mr);
|
||||
return -1;
|
||||
}
|
||||
|
||||
*uid = *(tb_uid_t *)pReader->pBuf;
|
||||
|
||||
metaReaderClear(&mr);
|
||||
|
||||
return 0;
|
||||
|
@ -228,11 +228,11 @@ int metaGetTableTypeByName(void *meta, char *tbName, ETableType *tbType) {
|
|||
SMetaReader mr = {0};
|
||||
metaReaderInit(&mr, (SMeta *)meta, 0);
|
||||
|
||||
if (metaGetTableEntryByName(&mr, tbName) == 0) {
|
||||
*tbType = mr.me.type;
|
||||
}
|
||||
code = metaGetTableEntryByName(&mr, tbName);
|
||||
if (code == 0) *tbType = mr.me.type;
|
||||
|
||||
metaReaderClear(&mr);
|
||||
return 0;
|
||||
return code;
|
||||
}
|
||||
|
||||
int metaReadNext(SMetaReader *pReader) {
|
||||
|
@ -1134,22 +1134,49 @@ END:
|
|||
return ret;
|
||||
}
|
||||
|
||||
int32_t metaGetTableTagsOpt(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj *tags) {
|
||||
static int32_t metaGetTableTagByUid(SMeta *pMeta, uint64_t suid, uint64_t uid, void **tag, int32_t *len, bool lock) {
|
||||
int ret = 0;
|
||||
if (lock) {
|
||||
metaRLock(pMeta);
|
||||
}
|
||||
|
||||
SCtbIdxKey ctbIdxKey = {.suid = suid, .uid = uid};
|
||||
ret = tdbTbGet(pMeta->pCtbIdx, &ctbIdxKey, sizeof(SCtbIdxKey), tag, len);
|
||||
if (lock) {
|
||||
metaULock(pMeta);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
int32_t metaGetTableTagsByUids(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj *tags) {
|
||||
const int32_t LIMIT = 128;
|
||||
|
||||
int32_t isLock = false;
|
||||
int32_t sz = uidList ? taosArrayGetSize(uidList) : 0;
|
||||
for (int i = 0; i < sz; i++) {
|
||||
tb_uid_t *id = taosArrayGet(uidList, i);
|
||||
SCtbIdxKey ctbIdxKey = {.suid = suid, .uid = *id};
|
||||
tb_uid_t *id = taosArrayGet(uidList, i);
|
||||
|
||||
void *val = NULL;
|
||||
int32_t len = 0;
|
||||
if (taosHashGet(tags, id, sizeof(tb_uid_t)) == NULL &&
|
||||
0 == tdbTbGet(pMeta->pCtbIdx, &ctbIdxKey, sizeof(SCtbIdxKey), &val, &len)) {
|
||||
taosHashPut(tags, id, sizeof(tb_uid_t), val, len);
|
||||
tdbFree(val);
|
||||
if (i % LIMIT == 0) {
|
||||
if (isLock) metaULock(pMeta);
|
||||
|
||||
metaRLock(pMeta);
|
||||
isLock = true;
|
||||
}
|
||||
|
||||
if (taosHashGet(tags, id, sizeof(tb_uid_t)) == NULL) {
|
||||
void *val = NULL;
|
||||
int32_t len = 0;
|
||||
if (metaGetTableTagByUid(pMeta, suid, *id, &val, &len, false) == 0) {
|
||||
taosHashPut(tags, id, sizeof(tb_uid_t), val, len);
|
||||
tdbFree(val);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (isLock) metaULock(pMeta);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32_t metaGetTableTags(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj *tags) {
|
||||
SMCtbCursor *pCur = metaOpenCtbCursor(pMeta, suid);
|
||||
|
||||
|
|
|
@ -420,7 +420,7 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, uint64_t suid, SArray
|
|||
goto end;
|
||||
}
|
||||
} else {
|
||||
metaGetTableTagsOpt(metaHandle, suid, uidList, tags);
|
||||
metaGetTableTagsByUids(metaHandle, suid, uidList, tags);
|
||||
qInfo("succ to get table from meta idx, suid:%" PRIu64, suid);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue