Merge pull request #1671 from taosdata/feature/query
[td-98] optimize put performance by comparing the minimum key of skip…
This commit is contained in:
commit
5fcc81029a
|
@ -50,6 +50,8 @@ typedef struct SSkipListNode {
|
||||||
#define SL_GET_NODE_DATA(n) ((char *)(n) + SL_NODE_HEADER_SIZE((n)->level))
|
#define SL_GET_NODE_DATA(n) ((char *)(n) + SL_NODE_HEADER_SIZE((n)->level))
|
||||||
#define SL_GET_NODE_KEY(s, n) ((s)->keyFn(SL_GET_NODE_DATA(n)))
|
#define SL_GET_NODE_KEY(s, n) ((s)->keyFn(SL_GET_NODE_DATA(n)))
|
||||||
|
|
||||||
|
#define SL_GET_SL_MIN_KEY(s) (SL_GET_NODE_KEY((s), SL_GET_FORWARD_POINTER((s)->pHead, 0)))
|
||||||
|
|
||||||
#define SL_GET_NODE_LEVEL(n) *(uint8_t *)((n))
|
#define SL_GET_NODE_LEVEL(n) *(uint8_t *)((n))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -71,7 +71,8 @@ memset(pNode, 0, SL_NODE_HEADER_SIZE(_l));\
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
static void tSkipListDoInsert(SSkipList *pSkipList, SSkipListNode **forward, SSkipListNode *pNode);
|
static void tSkipListDoInsert(SSkipList *pSkipList, SSkipListNode **forward, SSkipListNode *pNode);
|
||||||
static SSkipListNode* tSkipListDoAppend(SSkipList *pSkipList, SSkipListNode *pNode);
|
static SSkipListNode* tSkipListPushBack(SSkipList *pSkipList, SSkipListNode *pNode);
|
||||||
|
static SSkipListNode* tSkipListPushFront(SSkipList* pSkipList, SSkipListNode *pNode);
|
||||||
static SSkipListIterator* doCreateSkipListIterator(SSkipList *pSkipList, int32_t order);
|
static SSkipListIterator* doCreateSkipListIterator(SSkipList *pSkipList, int32_t order);
|
||||||
|
|
||||||
static bool initForwardBackwardPtr(SSkipList* pSkipList) {
|
static bool initForwardBackwardPtr(SSkipList* pSkipList) {
|
||||||
|
@ -207,10 +208,17 @@ SSkipListNode *tSkipListPut(SSkipList *pSkipList, SSkipListNode *pNode) {
|
||||||
pthread_rwlock_wrlock(pSkipList->lock);
|
pthread_rwlock_wrlock(pSkipList->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
// the new key is greater than the last key of skiplist append it at last position
|
// if the new key is greater than the maximum key of skip list, push back this node at the end of skip list
|
||||||
char *newDatakey = SL_GET_NODE_KEY(pSkipList, pNode);
|
char *newDatakey = SL_GET_NODE_KEY(pSkipList, pNode);
|
||||||
if (pSkipList->size == 0 || pSkipList->comparFn(pSkipList->lastKey, newDatakey) < 0) {
|
if (pSkipList->size == 0 || pSkipList->comparFn(pSkipList->lastKey, newDatakey) < 0) {
|
||||||
return tSkipListDoAppend(pSkipList, pNode);
|
return tSkipListPushBack(pSkipList, pNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the new key is less than the minimum key of skip list, push front this node at the front of skip list
|
||||||
|
assert(pSkipList->size > 0);
|
||||||
|
char* minKey = SL_GET_SL_MIN_KEY(pSkipList);
|
||||||
|
if (pSkipList->comparFn(newDatakey, minKey) < 0) {
|
||||||
|
return tSkipListPushFront(pSkipList, pNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
// find the appropriated position to insert data
|
// find the appropriated position to insert data
|
||||||
|
@ -269,7 +277,17 @@ void tSkipListDoInsert(SSkipList *pSkipList, SSkipListNode **forward, SSkipListN
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SSkipListNode* tSkipListDoAppend(SSkipList *pSkipList, SSkipListNode *pNode) {
|
SSkipListNode* tSkipListPushFront(SSkipList* pSkipList, SSkipListNode *pNode) {
|
||||||
|
SSkipListNode* forward[MAX_SKIP_LIST_LEVEL] = {0};
|
||||||
|
for(int32_t i = 0; i < pSkipList->level; ++i) {
|
||||||
|
forward[i] = pSkipList->pHead;
|
||||||
|
}
|
||||||
|
|
||||||
|
tSkipListDoInsert(pSkipList, forward, pNode);
|
||||||
|
return pNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
SSkipListNode* tSkipListPushBack(SSkipList *pSkipList, SSkipListNode *pNode) {
|
||||||
// do clear pointer area
|
// do clear pointer area
|
||||||
DO_MEMSET_PTR_AREA(pNode);
|
DO_MEMSET_PTR_AREA(pNode);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue