From e47e6300e4b25f961b016a634a366af9b137a08b Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 31 Jul 2020 00:49:24 +0800 Subject: [PATCH] [td-225] refactor codes. --- src/util/inc/hash.h | 2 +- src/util/src/hash.c | 5 +++-- src/util/src/tcache.c | 20 +++++++++++++------- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/util/inc/hash.h b/src/util/inc/hash.h index 900aa112e4..d3edc89585 100644 --- a/src/util/inc/hash.h +++ b/src/util/inc/hash.h @@ -103,7 +103,7 @@ void *taosHashGet(SHashObj *pHashObj, const void *key, size_t keyLen); * @param key * @param keyLen */ -void taosHashRemove(SHashObj *pHashObj, const void *key, size_t keyLen); +int32_t taosHashRemove(SHashObj *pHashObj, const void *key, size_t keyLen); void taosHashRemoveNode(); diff --git a/src/util/src/hash.c b/src/util/src/hash.c index 37e8c37cb6..f59f25d153 100644 --- a/src/util/src/hash.c +++ b/src/util/src/hash.c @@ -258,14 +258,14 @@ void *taosHashGet(SHashObj *pHashObj, const void *key, size_t keyLen) { } } -void taosHashRemove(SHashObj *pHashObj, const void *key, size_t keyLen) { +int32_t taosHashRemove(SHashObj *pHashObj, const void *key, size_t keyLen) { uint32_t hashVal = (*pHashObj->hashFp)(key, keyLen); __wr_lock(pHashObj->lock); SHashNode *pNode = doGetNodeFromHashTable(pHashObj, key, keyLen, hashVal); if (pNode == NULL) { __unlock(pHashObj->lock); - return; + return -1; } SHashNode *pNext = pNode->next; @@ -289,6 +289,7 @@ void taosHashRemove(SHashObj *pHashObj, const void *key, size_t keyLen) { pNode->prev = NULL; tfree(pNode); + return 0; } void taosHashCleanup(SHashObj *pHashObj) { diff --git a/src/util/src/tcache.c b/src/util/src/tcache.c index 715a142c90..a5317cdda1 100644 --- a/src/util/src/tcache.c +++ b/src/util/src/tcache.c @@ -207,7 +207,7 @@ SCacheObj *taosCacheInit(int32_t keyType, int64_t refreshTimeInSeconds, bool ext return NULL; } - pCacheObj->pHashTable = taosHashInit(128, taosGetDefaultHashFunction(keyType), false); + pCacheObj->pHashTable = taosHashInit(128, taosGetDefaultHashFunction(keyType), true); pCacheObj->name = strdup(cacheName); if (pCacheObj->pHashTable == NULL) { free(pCacheObj); @@ -268,7 +268,9 @@ void *taosCachePut(SCacheObj *pCacheObj, const void *key, size_t keyLen, const v if (T_REF_VAL_GET(pOld) > 0) { // todo removed by node, instead of by key - taosHashRemove(pCacheObj->pHashTable, pOld->key, pOld->keySize); + int32_t succ = taosHashRemove(pCacheObj->pHashTable, pOld->key, pOld->keySize); + assert(succ == 0); + addToTrashcan = true; } @@ -413,7 +415,7 @@ void taosCacheRelease(SCacheObj *pCacheObj, void **data, bool _remove) { } if (_remove) { - __cache_wr_lock(pCacheObj); +// __cache_wr_lock(pCacheObj); // NOTE: once refcount is decrease, pNode may be freed by other thread immediately. int32_t ref = T_REF_DEC(pNode); @@ -427,22 +429,26 @@ void taosCacheRelease(SCacheObj *pCacheObj, void **data, bool _remove) { * that tries to do the same thing. */ if (pNode->inTrashCan) { - __cache_unlock(pCacheObj); +// __cache_unlock(pCacheObj); if (ref == 0) { assert(pNode->pTNodeHeader->pData == pNode); taosRemoveFromTrashCan(pCacheObj, pNode->pTNodeHeader); } } else { - taosHashRemove(pCacheObj->pHashTable, pNode->key, pNode->keySize); - __cache_unlock(pCacheObj); + int32_t success = taosHashRemove(pCacheObj->pHashTable, pNode->key, pNode->keySize); if (ref > 0) { assert(pNode->pTNodeHeader == NULL); // todo trashcan lock - taosAddToTrash(pCacheObj, pNode); + if (success) { + taosAddToTrash(pCacheObj, pNode); + } +// __cache_unlock(pCacheObj); } else { +// __cache_unlock(pCacheObj); + // taosCacheReleaseNode(pCacheObj, pNode); atomic_fetch_sub_ptr(&pCacheObj->totalSize, pNode->size); uDebug("cache:%s, key:%p, %p is destroyed from cache, totalNum:%d totalSize:%" PRId64 "bytes size:%dbytes", -- GitLab