提交 8d3851fc 编写于 作者: Y Yifan Hao

Hash table cleanup [11/n]

Add wrapper for per entry lock / unlock.

+taosHashEntryWLock
+taosHashEntryWUnlock
+taosHashEntryRLock
+taosHashEntryRUnlock

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

insert delay, avg:      66.40ms, max:     254.78ms, min:      24.61ms
上级 785b75e6
...@@ -95,6 +95,42 @@ static FORCE_INLINE void taosHashRUnlock(SHashObj *pHashObj) { ...@@ -95,6 +95,42 @@ static FORCE_INLINE void taosHashRUnlock(SHashObj *pHashObj) {
taosRUnLockLatch(&pHashObj->lock); taosRUnLockLatch(&pHashObj->lock);
} }
static FORCE_INLINE void
taosHashEntryWLock(const SHashObj *pHashObj, SHashEntry* pe) {
if (pHashObj->type == HASH_NO_LOCK) {
return;
}
taosWLockLatch(&pe->latch);
}
static FORCE_INLINE void
taosHashEntryWUnlock(const SHashObj *pHashObj, SHashEntry* pe) {
if (pHashObj->type == HASH_NO_LOCK) {
return;
}
taosWUnLockLatch(&pe->latch);
}
static FORCE_INLINE void
taosHashEntryRLock(const SHashObj *pHashObj, SHashEntry* pe) {
if (pHashObj->type == HASH_NO_LOCK) {
return;
}
taosRLockLatch(&pe->latch);
}
static FORCE_INLINE void
taosHashEntryRUnlock(const SHashObj *pHashObj, SHashEntry* pe) {
if (pHashObj->type == HASH_NO_LOCK) {
return;
}
taosRUnLockLatch(&pe->latch);
}
static FORCE_INLINE int32_t taosHashCapacity(int32_t length) { static FORCE_INLINE int32_t taosHashCapacity(int32_t length) {
int32_t len = MIN(length, HASH_MAX_CAPACITY); int32_t len = MIN(length, HASH_MAX_CAPACITY);
...@@ -288,9 +324,7 @@ int32_t taosHashPut(SHashObj *pHashObj, const void *key, size_t keyLen, void *da ...@@ -288,9 +324,7 @@ int32_t taosHashPut(SHashObj *pHashObj, const void *key, size_t keyLen, void *da
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];
if (pHashObj->type == HASH_ENTRY_LOCK) { taosHashEntryWLock(pHashObj, pe);
taosWLockLatch(&pe->latch);
}
SHashNode *pNode = pe->next; SHashNode *pNode = pe->next;
if (pe->num > 0) { if (pe->num > 0) {
...@@ -318,9 +352,7 @@ int32_t taosHashPut(SHashObj *pHashObj, const void *key, size_t keyLen, void *da ...@@ -318,9 +352,7 @@ int32_t taosHashPut(SHashObj *pHashObj, const void *key, size_t keyLen, void *da
assert(pe->next != NULL); assert(pe->next != NULL);
if (pHashObj->type == HASH_ENTRY_LOCK) { taosHashEntryWUnlock(pHashObj, pe);
taosWUnLockLatch(&pe->latch);
}
// enable resize // enable resize
taosHashRUnlock(pHashObj); taosHashRUnlock(pHashObj);
...@@ -335,9 +367,7 @@ int32_t taosHashPut(SHashObj *pHashObj, const void *key, size_t keyLen, void *da ...@@ -335,9 +367,7 @@ int32_t taosHashPut(SHashObj *pHashObj, const void *key, size_t keyLen, void *da
FREE_HASH_NODE(pNewNode); FREE_HASH_NODE(pNewNode);
} }
if (pHashObj->type == HASH_ENTRY_LOCK) { taosHashEntryWUnlock(pHashObj, pe);
taosWUnLockLatch(&pe->latch);
}
// enable resize // enable resize
taosHashRUnlock(pHashObj); taosHashRUnlock(pHashObj);
...@@ -371,10 +401,7 @@ void* taosHashGetCloneExt(SHashObj *pHashObj, const void *key, size_t keyLen, vo ...@@ -371,10 +401,7 @@ void* taosHashGetCloneExt(SHashObj *pHashObj, const void *key, size_t keyLen, vo
char *data = NULL; char *data = NULL;
// lock entry taosHashEntryRLock(pHashObj, pe);
if (pHashObj->type == HASH_ENTRY_LOCK) {
taosRLockLatch(&pe->latch);
}
if (pe->num > 0) { if (pe->num > 0) {
assert(pe->next != NULL); assert(pe->next != NULL);
...@@ -404,11 +431,9 @@ void* taosHashGetCloneExt(SHashObj *pHashObj, const void *key, size_t keyLen, vo ...@@ -404,11 +431,9 @@ void* taosHashGetCloneExt(SHashObj *pHashObj, const void *key, size_t keyLen, vo
data = GET_HASH_NODE_DATA(pNode); data = GET_HASH_NODE_DATA(pNode);
} }
if (pHashObj->type == HASH_ENTRY_LOCK) { taosHashEntryRUnlock(pHashObj, pe);
taosRUnLockLatch(&pe->latch);
}
taosHashRUnlock(pHashObj); taosHashRUnlock(pHashObj);
return data; return data;
} }
...@@ -433,10 +458,7 @@ void* taosHashGetClone(SHashObj *pHashObj, const void *key, size_t keyLen, void ...@@ -433,10 +458,7 @@ void* taosHashGetClone(SHashObj *pHashObj, const void *key, size_t keyLen, void
char *data = NULL; char *data = NULL;
// lock entry taosHashEntryRLock(pHashObj, pe);
if (pHashObj->type == HASH_ENTRY_LOCK) {
taosRLockLatch(&pe->latch);
}
if (pe->num > 0) { if (pe->num > 0) {
assert(pe->next != NULL); assert(pe->next != NULL);
...@@ -457,11 +479,9 @@ void* taosHashGetClone(SHashObj *pHashObj, const void *key, size_t keyLen, void ...@@ -457,11 +479,9 @@ void* taosHashGetClone(SHashObj *pHashObj, const void *key, size_t keyLen, void
data = GET_HASH_NODE_DATA(pNode); data = GET_HASH_NODE_DATA(pNode);
} }
if (pHashObj->type == HASH_ENTRY_LOCK) { taosHashEntryRUnlock(pHashObj, pe);
taosRUnLockLatch(&pe->latch);
}
taosHashRUnlock(pHashObj); taosHashRUnlock(pHashObj);
return data; return data;
} }
...@@ -482,14 +502,12 @@ int32_t taosHashRemoveWithData(SHashObj *pHashObj, const void *key, size_t keyLe ...@@ -482,14 +502,12 @@ int32_t taosHashRemoveWithData(SHashObj *pHashObj, const void *key, size_t keyLe
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];
if (pHashObj->type == HASH_ENTRY_LOCK) { taosHashEntryWLock(pHashObj, pe);
taosWLockLatch(&pe->latch);
}
// double check after locked // double check after locked
if (pe->num == 0) { if (pe->num == 0) {
assert(pe->next == NULL); assert(pe->next == NULL);
taosWUnLockLatch(&pe->latch); taosHashEntryWUnlock(pHashObj, pe);
taosHashRUnlock(pHashObj); taosHashRUnlock(pHashObj);
return -1; return -1;
...@@ -526,9 +544,7 @@ int32_t taosHashRemoveWithData(SHashObj *pHashObj, const void *key, size_t keyLe ...@@ -526,9 +544,7 @@ int32_t taosHashRemoveWithData(SHashObj *pHashObj, const void *key, size_t keyLe
} }
} }
if (pHashObj->type == HASH_ENTRY_LOCK) { taosHashEntryWUnlock(pHashObj, pe);
taosWUnLockLatch(&pe->latch);
}
taosHashRUnlock(pHashObj); taosHashRUnlock(pHashObj);
...@@ -550,9 +566,7 @@ void taosHashCondTraverse(SHashObj *pHashObj, bool (*fp)(void *, void *), void * ...@@ -550,9 +566,7 @@ void taosHashCondTraverse(SHashObj *pHashObj, bool (*fp)(void *, void *), void *
continue; continue;
} }
if (pHashObj->type == HASH_ENTRY_LOCK) { taosHashEntryWLock(pHashObj, pEntry);
taosWLockLatch(&pEntry->latch);
}
SHashNode *pPrevNode = NULL; SHashNode *pPrevNode = NULL;
SHashNode *pNode = pEntry->next; SHashNode *pNode = pEntry->next;
...@@ -574,9 +588,7 @@ void taosHashCondTraverse(SHashObj *pHashObj, bool (*fp)(void *, void *), void * ...@@ -574,9 +588,7 @@ void taosHashCondTraverse(SHashObj *pHashObj, bool (*fp)(void *, void *), void *
} }
} }
if (pHashObj->type == HASH_ENTRY_LOCK) { taosHashEntryWUnlock(pHashObj, pEntry);
taosWUnLockLatch(&pEntry->latch);
}
} }
taosHashRUnlock(pHashObj); taosHashRUnlock(pHashObj);
...@@ -789,10 +801,7 @@ static void *taosHashReleaseNode(SHashObj *pHashObj, void *p, int *slot) { ...@@ -789,10 +801,7 @@ static void *taosHashReleaseNode(SHashObj *pHashObj, void *p, int *slot) {
*slot = HASH_INDEX(pOld->hashVal, pHashObj->capacity); *slot = HASH_INDEX(pOld->hashVal, pHashObj->capacity);
SHashEntry *pe = pHashObj->hashList[*slot]; SHashEntry *pe = pHashObj->hashList[*slot];
// lock entry taosHashEntryWLock(pHashObj, pe);
if (pHashObj->type == HASH_ENTRY_LOCK) {
taosWLockLatch(&pe->latch);
}
SHashNode *pNode = pe->next; SHashNode *pNode = pe->next;
...@@ -844,9 +853,7 @@ void *taosHashIterate(SHashObj *pHashObj, void *p) { ...@@ -844,9 +853,7 @@ void *taosHashIterate(SHashObj *pHashObj, void *p) {
pNode = taosHashReleaseNode(pHashObj, p, &slot); pNode = taosHashReleaseNode(pHashObj, p, &slot);
if (pNode == NULL) { if (pNode == NULL) {
SHashEntry *pe = pHashObj->hashList[slot]; SHashEntry *pe = pHashObj->hashList[slot];
if (pHashObj->type == HASH_ENTRY_LOCK) { taosHashEntryWUnlock(pHashObj, pe);
taosWUnLockLatch(&pe->latch);
}
slot = slot + 1; slot = slot + 1;
} }
...@@ -856,10 +863,7 @@ void *taosHashIterate(SHashObj *pHashObj, void *p) { ...@@ -856,10 +863,7 @@ void *taosHashIterate(SHashObj *pHashObj, void *p) {
for (; slot < pHashObj->capacity; ++slot) { for (; slot < pHashObj->capacity; ++slot) {
SHashEntry *pe = pHashObj->hashList[slot]; SHashEntry *pe = pHashObj->hashList[slot];
// lock entry taosHashEntryWLock(pHashObj, pe);
if (pHashObj->type == HASH_ENTRY_LOCK) {
taosWLockLatch(&pe->latch);
}
pNode = pe->next; pNode = pe->next;
while (pNode) { while (pNode) {
...@@ -869,9 +873,7 @@ void *taosHashIterate(SHashObj *pHashObj, void *p) { ...@@ -869,9 +873,7 @@ void *taosHashIterate(SHashObj *pHashObj, void *p) {
if (pNode) break; if (pNode) break;
if (pHashObj->type == HASH_ENTRY_LOCK) { taosHashEntryWUnlock(pHashObj, pe);
taosWUnLockLatch(&pe->latch);
}
} }
} }
...@@ -879,9 +881,7 @@ void *taosHashIterate(SHashObj *pHashObj, void *p) { ...@@ -879,9 +881,7 @@ void *taosHashIterate(SHashObj *pHashObj, void *p) {
SHashEntry *pe = pHashObj->hashList[slot]; SHashEntry *pe = pHashObj->hashList[slot];
atomic_add_fetch_32(&pNode->refCount, 1); atomic_add_fetch_32(&pNode->refCount, 1);
data = GET_HASH_NODE_DATA(pNode); data = GET_HASH_NODE_DATA(pNode);
if (pHashObj->type == HASH_ENTRY_LOCK) { taosHashEntryWUnlock(pHashObj, pe);
taosWUnLockLatch(&pe->latch);
}
} }
taosHashRUnlock(pHashObj); taosHashRUnlock(pHashObj);
...@@ -899,9 +899,7 @@ void taosHashCancelIterate(SHashObj *pHashObj, void *p) { ...@@ -899,9 +899,7 @@ void taosHashCancelIterate(SHashObj *pHashObj, void *p) {
taosHashReleaseNode(pHashObj, p, &slot); taosHashReleaseNode(pHashObj, p, &slot);
SHashEntry *pe = pHashObj->hashList[slot]; SHashEntry *pe = pHashObj->hashList[slot];
if (pHashObj->type == HASH_ENTRY_LOCK) { taosHashEntryWUnlock(pHashObj, pe);
taosWUnLockLatch(&pe->latch);
}
taosHashRUnlock(pHashObj); taosHashRUnlock(pHashObj);
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册