diff --git a/source/dnode/vnode/inc/vnode.h b/source/dnode/vnode/inc/vnode.h index fec050b5ea2176df5659ec36de6126737d522107..4d228f742a884090526401e99231df80b0b33c38 100644 --- a/source/dnode/vnode/inc/vnode.h +++ b/source/dnode/vnode/inc/vnode.h @@ -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); diff --git a/source/dnode/vnode/src/meta/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c index 0309b8177ee47f7ae4a3b3ffd667f4a0a40b7dcc..3c9f964ff6b9a42418a205949738dec5acd96e4c 100644 --- a/source/dnode/vnode/src/meta/metaQuery.c +++ b/source/dnode/vnode/src/meta/metaQuery.c @@ -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}; - - 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); + tb_uid_t *id = taosArrayGet(uidList, i); + + 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); diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index 38304bcc76ed03fb80af23aa9b29be1b1c8a89e1..ee2aa5c3fa59dee02fd61af28cdc243c81989cb8 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -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); }