提交 785b75e6 编写于 作者: Y Yifan Hao

Hash table cleanup [10/n]

Unify hash table lock function namespace and does not have
functional change.

__rd_lock -> taosHashRLock
__rd_unlock -> taosHashRUnlock
__wr_lock -> taosHashWLock
__wr_unlock -> taosHashWUnlock

* Testing
./taosdemo
Spent 87.8813 seconds to insert rows: 100000000, affected rows: 100000000 with 8 thread(s) into test.meters. 1137898.27 records/second

insert delay, avg:      69.68ms, max:     275.15ms, min:      26.63ms
上级 a1170e80
...@@ -42,8 +42,6 @@ ...@@ -42,8 +42,6 @@
* typedef * typedef
*/ */
typedef void (*_hash_free_fn_t)(void *param);
typedef struct SHashEntry { typedef struct SHashEntry {
int32_t num; // number of elements in current entry int32_t num; // number of elements in current entry
SRWLatch latch; // entry latch SRWLatch latch; // entry latch
...@@ -55,8 +53,7 @@ typedef struct SHashObj { ...@@ -55,8 +53,7 @@ typedef struct SHashObj {
size_t capacity; // number of slots size_t capacity; // number of slots
size_t size; // number of elements in hash table size_t size; // number of elements in hash table
_hash_fn_t hashFp; // hash function _hash_fn_t hashFp; // hash function
_equal_fn_t equalFp; // equal function _equal_fn_t equalFp; // equal function
SRWLatch lock; // read-write spin lock SRWLatch lock; // read-write spin lock
SHashLockTypeE type; // lock type SHashLockTypeE type; // lock type
bool enableUpdate; // enable update bool enableUpdate; // enable update
...@@ -67,35 +64,35 @@ typedef struct SHashObj { ...@@ -67,35 +64,35 @@ typedef struct SHashObj {
* Function definition * Function definition
*/ */
static FORCE_INLINE void __wr_lock(void *lock, int32_t type) { static FORCE_INLINE void taosHashWLock(SHashObj *pHashObj) {
if (type == HASH_NO_LOCK) { if (pHashObj->type == HASH_NO_LOCK) {
return; return;
} }
taosWLockLatch(lock); taosWLockLatch(&pHashObj->lock);
} }
static FORCE_INLINE void __rd_lock(void *lock, int32_t type) { static FORCE_INLINE void taosHashWUnlock(SHashObj *pHashObj) {
if (type == HASH_NO_LOCK) { if (pHashObj->type == HASH_NO_LOCK) {
return; return;
} }
taosRLockLatch(lock); taosWUnLockLatch(&pHashObj->lock);
} }
static FORCE_INLINE void __rd_unlock(void *lock, int32_t type) { static FORCE_INLINE void taosHashRLock(SHashObj *pHashObj) {
if (type == HASH_NO_LOCK) { if (pHashObj->type == HASH_NO_LOCK) {
return; return;
} }
taosRUnLockLatch(lock); taosRLockLatch(&pHashObj->lock);
} }
static FORCE_INLINE void __wr_unlock(void *lock, int32_t type) { static FORCE_INLINE void taosHashRUnlock(SHashObj *pHashObj) {
if (type == HASH_NO_LOCK) { if (pHashObj->type == HASH_NO_LOCK) {
return; return;
} }
taosWUnLockLatch(lock); taosRUnLockLatch(&pHashObj->lock);
} }
static FORCE_INLINE int32_t taosHashCapacity(int32_t length) { static FORCE_INLINE int32_t taosHashCapacity(int32_t length) {
...@@ -281,12 +278,12 @@ int32_t taosHashPut(SHashObj *pHashObj, const void *key, size_t keyLen, void *da ...@@ -281,12 +278,12 @@ int32_t taosHashPut(SHashObj *pHashObj, const void *key, size_t keyLen, void *da
// need the resize process, write lock applied // need the resize process, write lock applied
if (HASH_NEED_RESIZE(pHashObj)) { if (HASH_NEED_RESIZE(pHashObj)) {
__wr_lock(&pHashObj->lock, pHashObj->type); taosHashWLock(pHashObj);
taosHashTableResize(pHashObj); taosHashTableResize(pHashObj);
__wr_unlock(&pHashObj->lock, pHashObj->type); taosHashWUnlock(pHashObj);
} }
__rd_lock(&pHashObj->lock, pHashObj->type); taosHashRLock(pHashObj);
int32_t slot = HASH_INDEX(hashVal, pHashObj->capacity); int32_t slot = HASH_INDEX(hashVal, pHashObj->capacity);
SHashEntry *pe = pHashObj->hashList[slot]; SHashEntry *pe = pHashObj->hashList[slot];
...@@ -326,7 +323,7 @@ int32_t taosHashPut(SHashObj *pHashObj, const void *key, size_t keyLen, void *da ...@@ -326,7 +323,7 @@ int32_t taosHashPut(SHashObj *pHashObj, const void *key, size_t keyLen, void *da
} }
// enable resize // enable resize
__rd_unlock(&pHashObj->lock, pHashObj->type); taosHashRUnlock(pHashObj);
atomic_add_fetch_64(&pHashObj->size, 1); atomic_add_fetch_64(&pHashObj->size, 1);
return 0; return 0;
...@@ -343,7 +340,7 @@ int32_t taosHashPut(SHashObj *pHashObj, const void *key, size_t keyLen, void *da ...@@ -343,7 +340,7 @@ int32_t taosHashPut(SHashObj *pHashObj, const void *key, size_t keyLen, void *da
} }
// enable resize // enable resize
__rd_unlock(&pHashObj->lock, pHashObj->type); taosHashRUnlock(pHashObj);
return pHashObj->enableUpdate ? 0 : -1; return pHashObj->enableUpdate ? 0 : -1;
} }
...@@ -361,14 +358,14 @@ void* taosHashGetCloneExt(SHashObj *pHashObj, const void *key, size_t keyLen, vo ...@@ -361,14 +358,14 @@ void* taosHashGetCloneExt(SHashObj *pHashObj, const void *key, size_t keyLen, vo
uint32_t hashVal = (*pHashObj->hashFp)(key, (uint32_t)keyLen); uint32_t hashVal = (*pHashObj->hashFp)(key, (uint32_t)keyLen);
// only add the read lock to disable the resize process // only add the read lock to disable the resize process
__rd_lock(&pHashObj->lock, pHashObj->type); taosHashRLock(pHashObj);
int32_t slot = HASH_INDEX(hashVal, pHashObj->capacity); int32_t slot = HASH_INDEX(hashVal, pHashObj->capacity);
SHashEntry *pe = pHashObj->hashList[slot]; SHashEntry *pe = pHashObj->hashList[slot];
// no data, return directly // no data, return directly
if (atomic_load_32(&pe->num) == 0) { if (atomic_load_32(&pe->num) == 0) {
__rd_unlock(&pHashObj->lock, pHashObj->type); taosHashRUnlock(pHashObj);
return NULL; return NULL;
} }
...@@ -411,7 +408,7 @@ void* taosHashGetCloneExt(SHashObj *pHashObj, const void *key, size_t keyLen, vo ...@@ -411,7 +408,7 @@ void* taosHashGetCloneExt(SHashObj *pHashObj, const void *key, size_t keyLen, vo
taosRUnLockLatch(&pe->latch); taosRUnLockLatch(&pe->latch);
} }
__rd_unlock(&pHashObj->lock, pHashObj->type); taosHashRUnlock(pHashObj);
return data; return data;
} }
...@@ -423,14 +420,14 @@ void* taosHashGetClone(SHashObj *pHashObj, const void *key, size_t keyLen, void ...@@ -423,14 +420,14 @@ void* taosHashGetClone(SHashObj *pHashObj, const void *key, size_t keyLen, void
uint32_t hashVal = (*pHashObj->hashFp)(key, (uint32_t)keyLen); uint32_t hashVal = (*pHashObj->hashFp)(key, (uint32_t)keyLen);
// only add the read lock to disable the resize process // only add the read lock to disable the resize process
__rd_lock(&pHashObj->lock, pHashObj->type); taosHashRLock(pHashObj);
int32_t slot = HASH_INDEX(hashVal, pHashObj->capacity); int32_t slot = HASH_INDEX(hashVal, pHashObj->capacity);
SHashEntry *pe = pHashObj->hashList[slot]; SHashEntry *pe = pHashObj->hashList[slot];
// no data, return directly // no data, return directly
if (atomic_load_32(&pe->num) == 0) { if (atomic_load_32(&pe->num) == 0) {
__rd_unlock(&pHashObj->lock, pHashObj->type); taosHashRUnlock(pHashObj);
return NULL; return NULL;
} }
...@@ -464,7 +461,7 @@ void* taosHashGetClone(SHashObj *pHashObj, const void *key, size_t keyLen, void ...@@ -464,7 +461,7 @@ void* taosHashGetClone(SHashObj *pHashObj, const void *key, size_t keyLen, void
taosRUnLockLatch(&pe->latch); taosRUnLockLatch(&pe->latch);
} }
__rd_unlock(&pHashObj->lock, pHashObj->type); taosHashRUnlock(pHashObj);
return data; return data;
} }
...@@ -480,7 +477,7 @@ int32_t taosHashRemoveWithData(SHashObj *pHashObj, const void *key, size_t keyLe ...@@ -480,7 +477,7 @@ int32_t taosHashRemoveWithData(SHashObj *pHashObj, const void *key, size_t keyLe
uint32_t hashVal = (*pHashObj->hashFp)(key, (uint32_t)keyLen); uint32_t hashVal = (*pHashObj->hashFp)(key, (uint32_t)keyLen);
// disable the resize process // disable the resize process
__rd_lock(&pHashObj->lock, pHashObj->type); taosHashRLock(pHashObj);
int32_t slot = HASH_INDEX(hashVal, pHashObj->capacity); int32_t slot = HASH_INDEX(hashVal, pHashObj->capacity);
SHashEntry *pe = pHashObj->hashList[slot]; SHashEntry *pe = pHashObj->hashList[slot];
...@@ -494,7 +491,7 @@ int32_t taosHashRemoveWithData(SHashObj *pHashObj, const void *key, size_t keyLe ...@@ -494,7 +491,7 @@ int32_t taosHashRemoveWithData(SHashObj *pHashObj, const void *key, size_t keyLe
assert(pe->next == NULL); assert(pe->next == NULL);
taosWUnLockLatch(&pe->latch); taosWUnLockLatch(&pe->latch);
__rd_unlock(&pHashObj->lock, pHashObj->type); taosHashRUnlock(pHashObj);
return -1; return -1;
} }
...@@ -533,7 +530,7 @@ int32_t taosHashRemoveWithData(SHashObj *pHashObj, const void *key, size_t keyLe ...@@ -533,7 +530,7 @@ int32_t taosHashRemoveWithData(SHashObj *pHashObj, const void *key, size_t keyLe
taosWUnLockLatch(&pe->latch); taosWUnLockLatch(&pe->latch);
} }
__rd_unlock(&pHashObj->lock, pHashObj->type); taosHashRUnlock(pHashObj);
return code; return code;
} }
...@@ -544,7 +541,7 @@ void taosHashCondTraverse(SHashObj *pHashObj, bool (*fp)(void *, void *), void * ...@@ -544,7 +541,7 @@ void taosHashCondTraverse(SHashObj *pHashObj, bool (*fp)(void *, void *), void *
} }
// disable the resize process // disable the resize process
__rd_lock(&pHashObj->lock, pHashObj->type); taosHashRLock(pHashObj);
int32_t numOfEntries = (int32_t)pHashObj->capacity; int32_t numOfEntries = (int32_t)pHashObj->capacity;
for (int32_t i = 0; i < numOfEntries; ++i) { for (int32_t i = 0; i < numOfEntries; ++i) {
...@@ -582,7 +579,7 @@ void taosHashCondTraverse(SHashObj *pHashObj, bool (*fp)(void *, void *), void * ...@@ -582,7 +579,7 @@ void taosHashCondTraverse(SHashObj *pHashObj, bool (*fp)(void *, void *), void *
} }
} }
__rd_unlock(&pHashObj->lock, pHashObj->type); taosHashRUnlock(pHashObj);
} }
void taosHashClear(SHashObj *pHashObj) { void taosHashClear(SHashObj *pHashObj) {
...@@ -592,7 +589,7 @@ void taosHashClear(SHashObj *pHashObj) { ...@@ -592,7 +589,7 @@ void taosHashClear(SHashObj *pHashObj) {
SHashNode *pNode, *pNext; SHashNode *pNode, *pNext;
__wr_lock(&pHashObj->lock, pHashObj->type); taosHashWLock(pHashObj);
for (int32_t i = 0; i < pHashObj->capacity; ++i) { for (int32_t i = 0; i < pHashObj->capacity; ++i) {
SHashEntry *pEntry = pHashObj->hashList[i]; SHashEntry *pEntry = pHashObj->hashList[i];
...@@ -616,7 +613,7 @@ void taosHashClear(SHashObj *pHashObj) { ...@@ -616,7 +613,7 @@ void taosHashClear(SHashObj *pHashObj) {
} }
pHashObj->size = 0; pHashObj->size = 0;
__wr_unlock(&pHashObj->lock, pHashObj->type); taosHashWUnlock(pHashObj);
} }
void taosHashCleanup(SHashObj *pHashObj) { void taosHashCleanup(SHashObj *pHashObj) {
...@@ -647,7 +644,7 @@ int32_t taosHashGetMaxOverflowLinkLength(SHashObj *pHashObj) { ...@@ -647,7 +644,7 @@ int32_t taosHashGetMaxOverflowLinkLength(SHashObj *pHashObj) {
int32_t num = 0; int32_t num = 0;
__rd_lock(&pHashObj->lock, pHashObj->type); taosHashRLock(pHashObj);
for (int32_t i = 0; i < pHashObj->size; ++i) { for (int32_t i = 0; i < pHashObj->size; ++i) {
SHashEntry *pEntry = pHashObj->hashList[i]; SHashEntry *pEntry = pHashObj->hashList[i];
...@@ -657,7 +654,7 @@ int32_t taosHashGetMaxOverflowLinkLength(SHashObj *pHashObj) { ...@@ -657,7 +654,7 @@ int32_t taosHashGetMaxOverflowLinkLength(SHashObj *pHashObj) {
num = pEntry->num; num = pEntry->num;
} }
} }
__rd_unlock(&pHashObj->lock, pHashObj->type); taosHashRUnlock(pHashObj);
return num; return num;
} }
...@@ -840,7 +837,7 @@ void *taosHashIterate(SHashObj *pHashObj, void *p) { ...@@ -840,7 +837,7 @@ void *taosHashIterate(SHashObj *pHashObj, void *p) {
char *data = NULL; char *data = NULL;
// only add the read lock to disable the resize process // only add the read lock to disable the resize process
__rd_lock(&pHashObj->lock, pHashObj->type); taosHashRLock(pHashObj);
SHashNode *pNode = NULL; SHashNode *pNode = NULL;
if (p) { if (p) {
...@@ -887,7 +884,7 @@ void *taosHashIterate(SHashObj *pHashObj, void *p) { ...@@ -887,7 +884,7 @@ void *taosHashIterate(SHashObj *pHashObj, void *p) {
} }
} }
__rd_unlock(&pHashObj->lock, pHashObj->type); taosHashRUnlock(pHashObj);
return data; return data;
} }
...@@ -896,7 +893,7 @@ void taosHashCancelIterate(SHashObj *pHashObj, void *p) { ...@@ -896,7 +893,7 @@ void taosHashCancelIterate(SHashObj *pHashObj, void *p) {
if (pHashObj == NULL || p == NULL) return; if (pHashObj == NULL || p == NULL) return;
// only add the read lock to disable the resize process // only add the read lock to disable the resize process
__rd_lock(&pHashObj->lock, pHashObj->type); taosHashRLock(pHashObj);
int slot; int slot;
taosHashReleaseNode(pHashObj, p, &slot); taosHashReleaseNode(pHashObj, p, &slot);
...@@ -906,5 +903,5 @@ void taosHashCancelIterate(SHashObj *pHashObj, void *p) { ...@@ -906,5 +903,5 @@ void taosHashCancelIterate(SHashObj *pHashObj, void *p) {
taosWUnLockLatch(&pe->latch); taosWUnLockLatch(&pe->latch);
} }
__rd_unlock(&pHashObj->lock, pHashObj->type); taosHashRUnlock(pHashObj);
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册