From 4b8c007618406005beeb4ea5cb116034531a2816 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Wed, 27 Jul 2022 16:06:00 +0800 Subject: [PATCH] fix:fix remove from cache issue --- source/util/src/tcache.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/source/util/src/tcache.c b/source/util/src/tcache.c index 0975b10d55..7cbc1cd555 100644 --- a/source/util/src/tcache.c +++ b/source/util/src/tcache.c @@ -266,6 +266,7 @@ static void pushfrontNodeInEntryList(SCacheEntry *pEntry, SCacheNode *pNode) { pNode->pNext = pEntry->next; pEntry->next = pNode; pEntry->num += 1; + ASSERT((pEntry->next && pEntry->num > 0) || (NULL == pEntry->next && pEntry->num == 0)); } static void removeNodeInEntryList(SCacheEntry *pe, SCacheNode *prev, SCacheNode *pNode) { @@ -278,6 +279,7 @@ static void removeNodeInEntryList(SCacheEntry *pe, SCacheNode *prev, SCacheNode pNode->pNext = NULL; pe->num -= 1; + ASSERT((pe->next && pe->num > 0) || (NULL == pe->next && pe->num == 0)); } static FORCE_INLINE SCacheEntry *doFindEntry(SCacheObj *pCacheObj, const void *key, size_t keyLen) { @@ -657,15 +659,18 @@ void doTraverseElems(SCacheObj *pCacheObj, bool (*fp)(void *param, SCacheNode *p taosWLockLatch(&pEntry->latch); + SCacheNode **pPre = &pEntry->next; SCacheNode *pNode = pEntry->next; while (pNode != NULL) { SCacheNode *next = pNode->pNext; if (fp(pSup, pNode)) { + pPre = &pNode->pNext; pNode = pNode->pNext; } else { - pEntry->next = next; + *pPre = next; pEntry->num -= 1; + ASSERT((pEntry->next && pEntry->num > 0) || (NULL == pEntry->next && pEntry->num == 0)); atomic_sub_fetch_ptr(&pCacheObj->numOfElems, 1); pNode = next;