提交 6a71b8ea 编写于 作者: Y Yifan Hao

Hash table cleanup [5/n]

1. Simplify implementation of taosHashCondTraverse
2. Complete function header comments for a few more functions

* Testing

Run through the sample mysql:
taos> create database db;
Query OK, 0 of 0 row(s) in database (0.002475s)

taos> use db;
Query OK, 0 of 0 row(s) in database (0.000252s)

taos> create table t (ts timestamp, a int);
Query OK, 0 of 0 row(s) in database (0.003588s)

taos> insert into t values ('2019-07-15 00:00:00', 1);
Query OK, 1 of 1 row(s) in database (0.001268s)

taos> insert into t values ('2019-07-15 01:00:00', 2);
Query OK, 1 of 1 row(s) in database (0.000265s)

taos> select * from t;
           ts            |      a      |
========================================
 2019-07-15 00:00:00.000 |           1 |
 2019-07-15 01:00:00.000 |           2 |
Query OK, 2 row(s) in set (0.000822s)

taos> drop database db;
Query OK, 0 of 0 row(s) in database (0.001711s)
上级 c76b3d0e
...@@ -142,7 +142,16 @@ int32_t taosHashRemove(SHashObj *pHashObj, const void *key, size_t keyLen); ...@@ -142,7 +142,16 @@ int32_t taosHashRemove(SHashObj *pHashObj, const void *key, size_t keyLen);
*/ */
int32_t taosHashRemoveWithData(SHashObj *pHashObj, const void *key, size_t keyLen, void* data, size_t dsize); int32_t taosHashRemoveWithData(SHashObj *pHashObj, const void *key, size_t keyLen, void* data, size_t dsize);
int32_t taosHashCondTraverse(SHashObj *pHashObj, bool (*fp)(void *, void *), void *param); /**
* traverse through all objects in the hash table and apply "fp" on each node.
* If "fp" returns false when applied on top of a node, the node will also be
* removed from table.
*
* @param pHashObj hash table object
* @param fp function pointer applied on each node
* @param param parameter fed into "fp"
*/
void taosHashCondTraverse(SHashObj *pHashObj, bool (*fp)(void *, void *), void *param);
/** /**
* clear the contents of the hash table * clear the contents of the hash table
......
...@@ -131,7 +131,7 @@ static FORCE_INLINE SHashNode *doSearchInEntryList(SHashObj *pHashObj, SHashEntr ...@@ -131,7 +131,7 @@ static FORCE_INLINE SHashNode *doSearchInEntryList(SHashObj *pHashObj, SHashEntr
} }
/** /**
* Resize the hash list if the threshold is reached * resize the hash list if the threshold is reached
* *
* @param pHashObj * @param pHashObj
*/ */
...@@ -144,7 +144,7 @@ static void taosHashTableResize(SHashObj *pHashObj); ...@@ -144,7 +144,7 @@ static void taosHashTableResize(SHashObj *pHashObj);
* @param keyLen length of key * @param keyLen length of key
* @param pData data to be stored in hash node * @param pData data to be stored in hash node
* @param dsize size of data * @param dsize size of data
* @return sHashNode * @return SHashNode
*/ */
static SHashNode *doCreateHashNode(const void *key, size_t keyLen, const void *pData, size_t dsize, uint32_t hashVal); static SHashNode *doCreateHashNode(const void *key, size_t keyLen, const void *pData, size_t dsize, uint32_t hashVal);
...@@ -178,7 +178,7 @@ static FORCE_INLINE void doUpdateHashNode(SHashObj *pHashObj, SHashEntry* pe, SH ...@@ -178,7 +178,7 @@ static FORCE_INLINE void doUpdateHashNode(SHashObj *pHashObj, SHashEntry* pe, SH
} }
/** /**
* Insert the hash node at the front of the linked list * insert the hash node at the front of the linked list
* *
* @param pHashObj hash table object * @param pHashObj hash table object
* @param pNode the old node with requested key * @param pNode the old node with requested key
...@@ -483,7 +483,7 @@ int32_t taosHashRemove(SHashObj *pHashObj, const void *key, size_t keyLen) { ...@@ -483,7 +483,7 @@ int32_t taosHashRemove(SHashObj *pHashObj, const void *key, size_t keyLen) {
} }
int32_t taosHashRemoveWithData(SHashObj *pHashObj, const void *key, size_t keyLen, void *data, size_t dsize) { int32_t taosHashRemoveWithData(SHashObj *pHashObj, const void *key, size_t keyLen, void *data, size_t dsize) {
if (pHashObj == NULL || taosHashTableEmpty(pHashObj)) { if (pHashObj == NULL || taosHashTableEmpty(pHashObj) || key == NULL || keyLen == 0) {
return -1; return -1;
} }
...@@ -513,7 +513,9 @@ int32_t taosHashRemoveWithData(SHashObj *pHashObj, const void *key, size_t keyLe ...@@ -513,7 +513,9 @@ int32_t taosHashRemoveWithData(SHashObj *pHashObj, const void *key, size_t keyLe
SHashNode *prevNode = NULL; SHashNode *prevNode = NULL;
while (pNode) { while (pNode) {
if ((pNode->keyLen == keyLen) && ((*(pHashObj->equalFp))(GET_HASH_NODE_KEY(pNode), key, keyLen) == 0) && pNode->removed == 0) if ((pNode->keyLen == keyLen) &&
((*(pHashObj->equalFp))(GET_HASH_NODE_KEY(pNode), key, keyLen) == 0) &&
pNode->removed == 0)
break; break;
prevNode = pNode; prevNode = pNode;
...@@ -549,9 +551,9 @@ int32_t taosHashRemoveWithData(SHashObj *pHashObj, const void *key, size_t keyLe ...@@ -549,9 +551,9 @@ int32_t taosHashRemoveWithData(SHashObj *pHashObj, const void *key, size_t keyLe
return code; return code;
} }
int32_t taosHashCondTraverse(SHashObj *pHashObj, bool (*fp)(void *, void *), void *param) { void taosHashCondTraverse(SHashObj *pHashObj, bool (*fp)(void *, void *), void *param) {
if (pHashObj == NULL || taosHashTableEmpty(pHashObj)) { if (pHashObj == NULL || taosHashTableEmpty(pHashObj) || fp == NULL) {
return 0; return;
} }
// disable the resize process // disable the resize process
...@@ -568,49 +570,22 @@ int32_t taosHashCondTraverse(SHashObj *pHashObj, bool (*fp)(void *, void *), voi ...@@ -568,49 +570,22 @@ int32_t taosHashCondTraverse(SHashObj *pHashObj, bool (*fp)(void *, void *), voi
taosWLockLatch(&pEntry->latch); taosWLockLatch(&pEntry->latch);
} }
// todo remove the first node SHashNode *pPrevNode = NULL;
SHashNode *pNode = NULL; SHashNode *pNode = pEntry->next;
while((pNode = pEntry->next) != NULL) { while (pNode != NULL) {
if (fp && (!fp(param, GET_HASH_NODE_DATA(pNode)))) { if (fp(param, GET_HASH_NODE_DATA(pNode))) {
pEntry->num -= 1; pPrevNode = pNode;
atomic_sub_fetch_64(&pHashObj->size, 1); pNode = pNode->next;
pEntry->next = pNode->next;
if (pEntry->num == 0) {
assert(pEntry->next == NULL);
} else { } else {
assert(pEntry->next != NULL); if (pPrevNode == NULL) {
} pEntry->next = pNode->next;
FREE_HASH_NODE(pHashObj, pNode);
} else { } else {
break; pPrevNode->next = pNode->next;
} }
}
// handle the following node
if (pNode != NULL) {
assert(pNode == pEntry->next);
SHashNode *pNext = NULL;
while ((pNext = pNode->next) != NULL) {
// not qualified, remove it
if (fp && (!fp(param, GET_HASH_NODE_DATA(pNext)))) {
pNode->next = pNext->next;
pEntry->num -= 1; pEntry->num -= 1;
atomic_sub_fetch_64(&pHashObj->size, 1); atomic_sub_fetch_64(&pHashObj->size, 1);
pNode = pNode->next;
if (pEntry->num == 0) { FREE_HASH_NODE(pHashObj, pNode);
assert(pEntry->next == NULL);
} else {
assert(pEntry->next != NULL);
}
FREE_HASH_NODE(pHashObj, pNext);
} else {
pNode = pNext;
}
} }
} }
...@@ -620,7 +595,6 @@ int32_t taosHashCondTraverse(SHashObj *pHashObj, bool (*fp)(void *, void *), voi ...@@ -620,7 +595,6 @@ int32_t taosHashCondTraverse(SHashObj *pHashObj, bool (*fp)(void *, void *), voi
} }
__rd_unlock(&pHashObj->lock, pHashObj->type); __rd_unlock(&pHashObj->lock, pHashObj->type);
return 0;
} }
void taosHashClear(SHashObj *pHashObj) { void taosHashClear(SHashObj *pHashObj) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册