diff --git a/source/dnode/mnode/impl/src/mndSma.c b/source/dnode/mnode/impl/src/mndSma.c index 7467d9bba3..ab55829c54 100644 --- a/source/dnode/mnode/impl/src/mndSma.c +++ b/source/dnode/mnode/impl/src/mndSma.c @@ -1521,7 +1521,7 @@ static void mndCancelRetrieveIdx(SMnode *pMnode, void *pIter) { if (p != NULL) { SSdb *pSdb = pMnode->pSdb; sdbCancelFetch(pSdb, p->pSmaIter); - sdbCancelFetch(pSdb, p->pIdxIter); + sdbCancelFetchByType(pSdb, p->pIdxIter, SDB_IDX); } taosMemoryFree(p); } diff --git a/source/dnode/mnode/sdb/inc/sdb.h b/source/dnode/mnode/sdb/inc/sdb.h index 5bb8ae2b5e..4584cb817a 100644 --- a/source/dnode/mnode/sdb/inc/sdb.h +++ b/source/dnode/mnode/sdb/inc/sdb.h @@ -334,10 +334,19 @@ void *sdbFetchAll(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj, ESdbStat * @brief Cancel a traversal * * @param pSdb The sdb object. - * @param type The initial iterator of table. + * @param pIter The initial iterator of table. */ void sdbCancelFetch(SSdb *pSdb, void *pIter); +/** + * @brief Cancel a traversal + * + * @param pSdb The sdb object. + * @param pIter The initial iterator of table. + * @param type The type of table. + */ +void sdbCancelFetchByType(SSdb *pSdb, void *pIter, ESdbType type); + /** * @brief Traverse a sdb * diff --git a/source/dnode/mnode/sdb/src/sdbHash.c b/source/dnode/mnode/sdb/src/sdbHash.c index 03b45c25b4..60e6c1b81e 100644 --- a/source/dnode/mnode/sdb/src/sdbHash.c +++ b/source/dnode/mnode/sdb/src/sdbHash.c @@ -103,14 +103,14 @@ void sdbPrintOper(SSdb *pSdb, SSdbRow *pRow, const char *oper) { EKeyType keyType = pSdb->keyTypes[pRow->type]; if (keyType == SDB_KEY_BINARY) { - mTrace("%s:%s, ref:%d oper:%s row:%p status:%s", sdbTableName(pRow->type), (char *)pRow->pObj, pRow->refCount, oper, - pRow->pObj, sdbStatusName(pRow->status)); + mTrace("%s:%s, ref:%d oper:%s row:%p row->pObj:%p status:%s", sdbTableName(pRow->type), (char *)pRow->pObj, + pRow->refCount, oper, pRow, pRow->pObj, sdbStatusName(pRow->status)); } else if (keyType == SDB_KEY_INT32) { - mTrace("%s:%d, ref:%d oper:%s row:%p status:%s", sdbTableName(pRow->type), *(int32_t *)pRow->pObj, pRow->refCount, - oper, pRow->pObj, sdbStatusName(pRow->status)); + mTrace("%s:%d, ref:%d oper:%s row:%p row->pObj:%p status:%s", sdbTableName(pRow->type), *(int32_t *)pRow->pObj, + pRow->refCount, oper, pRow, pRow->pObj, sdbStatusName(pRow->status)); } else if (keyType == SDB_KEY_INT64) { - mTrace("%s:%" PRId64 ", ref:%d oper:%s row:%p status:%s", sdbTableName(pRow->type), *(int64_t *)pRow->pObj, - pRow->refCount, oper, pRow->pObj, sdbStatusName(pRow->status)); + mTrace("%s:%" PRId64 ", ref:%d oper:%s row:%p row->pObj:%p status:%s", sdbTableName(pRow->type), + *(int64_t *)pRow->pObj, pRow->refCount, oper, pRow, pRow->pObj, sdbStatusName(pRow->status)); } else { } #endif @@ -439,6 +439,7 @@ void *sdbFetchAll(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj, ESdbStat void sdbCancelFetch(SSdb *pSdb, void *pIter) { if (pIter == NULL) return; SSdbRow *pRow = *(SSdbRow **)pIter; + mTrace("cancel fetch row:%p", pRow); SHashObj *hash = sdbGetHash(pSdb, pRow->type); if (hash == NULL) return; @@ -448,6 +449,17 @@ void sdbCancelFetch(SSdb *pSdb, void *pIter) { sdbUnLock(pSdb, type); } +void sdbCancelFetchByType(SSdb *pSdb, void *pIter, ESdbType type) { + if (pIter == NULL) return; + if (type >= SDB_MAX || type < 0) return; + SHashObj *hash = sdbGetHash(pSdb, type); + if (hash == NULL) return; + + sdbReadLock(pSdb, type); + taosHashCancelIterate(hash, pIter); + sdbUnLock(pSdb, type); +} + void sdbTraverse(SSdb *pSdb, ESdbType type, sdbTraverseFp fp, void *p1, void *p2, void *p3) { SHashObj *hash = sdbGetHash(pSdb, type); if (hash == NULL) return;