From 6b6f0b125ff8da540da1d3a288665d97c3056b3a Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Wed, 8 Sep 2021 18:52:56 +0800 Subject: [PATCH] [TS-144]: fix table missing issue caused by hash rcount overflow --- src/util/inc/hash.h | 2 +- src/util/src/hash.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/util/inc/hash.h b/src/util/inc/hash.h index b6b49693f6..7d128865f6 100644 --- a/src/util/inc/hash.h +++ b/src/util/inc/hash.h @@ -36,7 +36,7 @@ typedef struct SHashNode { uint32_t dataLen; // length of data uint32_t keyLen; // length of the key int8_t removed; // flag to indicate removed - int8_t count; // reference count + int32_t count; // reference count char data[]; } SHashNode; diff --git a/src/util/src/hash.c b/src/util/src/hash.c index ede3e1e4ce..9ee3475d44 100644 --- a/src/util/src/hash.c +++ b/src/util/src/hash.c @@ -117,7 +117,7 @@ static SHashNode *doCreateHashNode(const void *key, size_t keyLen, const void *p static FORCE_INLINE SHashNode *doUpdateHashNode(SHashObj *pHashObj, SHashEntry* pe, SHashNode* prev, SHashNode *pNode, SHashNode *pNewNode) { assert(pNode->keyLen == pNewNode->keyLen); - pNode->count--; + atomic_sub_fetch_32(&pNode->count, 1); if (prev != NULL) { prev->next = pNewNode; } else { @@ -372,7 +372,7 @@ int32_t taosHashRemoveWithData(SHashObj *pHashObj, const void *key, size_t keyLe if (pNode) { code = 0; // it is found - pNode->count--; + atomic_sub_fetch_32(&pNode->count, 1); pNode->removed = 1; if (pNode->count <= 0) { if (prevNode) { @@ -720,7 +720,7 @@ static void *taosHashReleaseNode(SHashObj *pHashObj, void *p, int *slot) { pNode = pNode->next; } - pOld->count--; + atomic_sub_fetch_32(&pOld->count, 1); if (pOld->count <=0) { if (prevNode) { prevNode->next = pOld->next; @@ -786,7 +786,7 @@ void *taosHashIterate(SHashObj *pHashObj, void *p) { if (pNode) { SHashEntry *pe = pHashObj->hashList[slot]; - pNode->count++; + atomic_add_fetch_32(&pNode->count, 1); data = GET_HASH_NODE_DATA(pNode); if (pHashObj->type == HASH_ENTRY_LOCK) { taosWUnLockLatch(&pe->latch); -- GitLab