diff --git a/source/dnode/vnode/inc/vnode.h b/source/dnode/vnode/inc/vnode.h index d006f12a3f393b7ed562de56a9b14072fa81f260..54d5d9eec25e0a6fa8c6a80961c9a1ea6b5ee4e1 100644 --- a/source/dnode/vnode/inc/vnode.h +++ b/source/dnode/vnode/inc/vnode.h @@ -95,6 +95,7 @@ typedef struct SMetaEntry SMetaEntry; #define META_READER_NOLOCK 0x1 void metaReaderInit(SMetaReader *pReader, SMeta *pMeta, int32_t flags); +void metaReaderReleaseLock(SMetaReader *pReader); void metaReaderClear(SMetaReader *pReader); int32_t metaGetTableEntryByUid(SMetaReader *pReader, tb_uid_t uid); int metaGetTableEntryByName(SMetaReader *pReader, const char *name); diff --git a/source/dnode/vnode/src/meta/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c index b4fc2c010b251d4a239179749f2c87cffe4ae635..84ce087e555a195fe8ab924f9357626939fe335f 100644 --- a/source/dnode/vnode/src/meta/metaQuery.c +++ b/source/dnode/vnode/src/meta/metaQuery.c @@ -24,6 +24,13 @@ void metaReaderInit(SMetaReader *pReader, SMeta *pMeta, int32_t flags) { } } +void metaReaderReleaseLock(SMetaReader *pReader) { + if (pReader->pMeta && !(pReader->flags & META_READER_NOLOCK)) { + metaULock(pReader->pMeta); + pReader->flags |= META_READER_NOLOCK; + } +} + void metaReaderClear(SMetaReader *pReader) { if (pReader->pMeta && !(pReader->flags & META_READER_NOLOCK)) { metaULock(pReader->pMeta); diff --git a/source/dnode/vnode/src/vnd/vnodeQuery.c b/source/dnode/vnode/src/vnd/vnodeQuery.c index 2b61bc6f33f8aedb2ede0506083399dcb0f344e7..e18379fe8aa331a71ffc3378707170bb93da629c 100644 --- a/source/dnode/vnode/src/vnd/vnodeQuery.c +++ b/source/dnode/vnode/src/vnd/vnodeQuery.c @@ -74,7 +74,7 @@ int vnodeGetTableMeta(SVnode *pVnode, SRpcMsg *pMsg, bool direct) { schemaTag = mer1.me.stbEntry.schemaTag; metaRsp.suid = mer1.me.uid; } else if (mer1.me.type == TSDB_CHILD_TABLE) { - metaReaderInit(&mer2, pVnode->pMeta, 0); + metaReaderInit(&mer2, pVnode->pMeta, META_READER_NOLOCK); if (metaGetTableEntryByUid(&mer2, mer1.me.ctbEntry.suid) < 0) goto _exit; strcpy(metaRsp.stbName, mer2.me.name); diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index 0cfdd2b68e49d1b89c851cc87ed867698921a65c..c20bb9581164de0a76fee5a1aec983c3802be203 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -429,6 +429,8 @@ int32_t addTagPseudoColumnData(SReadHandle* pHandle, SExprInfo* pPseudoExpr, int return terrno; } + metaReaderReleaseLock(&mr); + for (int32_t j = 0; j < numOfPseudoExpr; ++j) { SExprInfo* pExpr = &pPseudoExpr[j]; @@ -2548,7 +2550,7 @@ static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) { return NULL; } SMetaReader smrSuperTable = {0}; - metaReaderInit(&smrSuperTable, pInfo->readHandle.meta, 0); + metaReaderInit(&smrSuperTable, pInfo->readHandle.meta, META_READER_NOLOCK); metaGetTableEntryByUid(&smrSuperTable, smrChildTable.me.ctbEntry.suid); sysTableUserTagsFillOneTableTags(pInfo, &smrSuperTable, &smrChildTable, dbname, tableName, &numOfRows, dataBlock); metaReaderClear(&smrSuperTable);