271 lines
7.4 KiB
C++
271 lines
7.4 KiB
C++
#include "syncTest.h"
|
|
|
|
void logTest() {
|
|
sTrace("--- sync log test: trace");
|
|
sDebug("--- sync log test: debug");
|
|
sInfo("--- sync log test: info");
|
|
sWarn("--- sync log test: warn");
|
|
sError("--- sync log test: error");
|
|
sFatal("--- sync log test: fatal");
|
|
}
|
|
|
|
SSyncRaftEntry* createEntry(int i) {
|
|
int32_t dataLen = 20;
|
|
SSyncRaftEntry* pEntry = syncEntryBuild(dataLen);
|
|
assert(pEntry != NULL);
|
|
pEntry->msgType = 88;
|
|
pEntry->originalRpcType = 99;
|
|
pEntry->seqNum = 3;
|
|
pEntry->isWeak = true;
|
|
pEntry->term = 100 + i;
|
|
pEntry->index = i;
|
|
snprintf(pEntry->data, dataLen, "value%d", i);
|
|
|
|
return pEntry;
|
|
}
|
|
|
|
SSyncNode* createFakeNode() {
|
|
SSyncNode* pSyncNode = (SSyncNode*)taosMemoryMalloc(sizeof(SSyncNode));
|
|
ASSERT(pSyncNode != NULL);
|
|
memset(pSyncNode, 0, sizeof(SSyncNode));
|
|
|
|
return pSyncNode;
|
|
}
|
|
|
|
SRaftEntryHashCache* createCache(int maxCount) {
|
|
SSyncNode* pSyncNode = createFakeNode();
|
|
ASSERT(pSyncNode != NULL);
|
|
|
|
SRaftEntryHashCache* pCache = raftCacheCreate(pSyncNode, maxCount);
|
|
ASSERT(pCache != NULL);
|
|
|
|
return pCache;
|
|
}
|
|
|
|
void test1() {
|
|
int32_t code = 0;
|
|
SRaftEntryHashCache* pCache = createCache(5);
|
|
for (int i = 0; i < 5; ++i) {
|
|
SSyncRaftEntry* pEntry = createEntry(i);
|
|
code = raftCachePutEntry(pCache, pEntry);
|
|
ASSERT(code == 1);
|
|
syncEntryDestory(pEntry);
|
|
}
|
|
raftCacheLog2((char*)"==test1 write 5 entries==", pCache);
|
|
|
|
SyncIndex index;
|
|
index = 1;
|
|
code = raftCacheDelEntry(pCache, index);
|
|
ASSERT(code == 0);
|
|
index = 3;
|
|
code = raftCacheDelEntry(pCache, index);
|
|
ASSERT(code == 0);
|
|
raftCacheLog2((char*)"==test1 delete 1,3==", pCache);
|
|
|
|
code = raftCacheClear(pCache);
|
|
ASSERT(code == 0);
|
|
raftCacheLog2((char*)"==clear all==", pCache);
|
|
}
|
|
|
|
void test2() {
|
|
int32_t code = 0;
|
|
SRaftEntryHashCache* pCache = createCache(5);
|
|
for (int i = 0; i < 5; ++i) {
|
|
SSyncRaftEntry* pEntry = createEntry(i);
|
|
code = raftCachePutEntry(pCache, pEntry);
|
|
ASSERT(code == 1);
|
|
syncEntryDestory(pEntry);
|
|
}
|
|
raftCacheLog2((char*)"==test2 write 5 entries==", pCache);
|
|
|
|
SyncIndex index;
|
|
index = 1;
|
|
SSyncRaftEntry* pEntry;
|
|
code = raftCacheGetEntry(pCache, index, &pEntry);
|
|
ASSERT(code == 0);
|
|
syncEntryDestory(pEntry);
|
|
syncEntryLog2((char*)"==test2 get entry 1==", pEntry);
|
|
|
|
index = 2;
|
|
code = raftCacheGetEntryP(pCache, index, &pEntry);
|
|
ASSERT(code == 0);
|
|
syncEntryLog2((char*)"==test2 get entry pointer 2==", pEntry);
|
|
|
|
// not found
|
|
index = 8;
|
|
code = raftCacheGetEntry(pCache, index, &pEntry);
|
|
ASSERT(code == -1 && terrno == TSDB_CODE_WAL_LOG_NOT_EXIST);
|
|
sTrace("==test2 get entry 8 not found==");
|
|
|
|
// not found
|
|
index = 9;
|
|
code = raftCacheGetEntryP(pCache, index, &pEntry);
|
|
ASSERT(code == -1 && terrno == TSDB_CODE_WAL_LOG_NOT_EXIST);
|
|
sTrace("==test2 get entry pointer 9 not found==");
|
|
}
|
|
|
|
void test3() {
|
|
int32_t code = 0;
|
|
SRaftEntryHashCache* pCache = createCache(5);
|
|
for (int i = 0; i < 5; ++i) {
|
|
SSyncRaftEntry* pEntry = createEntry(i);
|
|
code = raftCachePutEntry(pCache, pEntry);
|
|
ASSERT(code == 1);
|
|
syncEntryDestory(pEntry);
|
|
}
|
|
for (int i = 6; i < 10; ++i) {
|
|
SSyncRaftEntry* pEntry = createEntry(i);
|
|
code = raftCachePutEntry(pCache, pEntry);
|
|
ASSERT(code == 0);
|
|
syncEntryDestory(pEntry);
|
|
}
|
|
raftCacheLog2((char*)"==test3 write 10 entries, max count is 5==", pCache);
|
|
}
|
|
|
|
void test4() {
|
|
int32_t code = 0;
|
|
SRaftEntryHashCache* pCache = createCache(5);
|
|
for (int i = 0; i < 5; ++i) {
|
|
SSyncRaftEntry* pEntry = createEntry(i);
|
|
code = raftCachePutEntry(pCache, pEntry);
|
|
ASSERT(code == 1);
|
|
syncEntryDestory(pEntry);
|
|
}
|
|
raftCacheLog2((char*)"==test4 write 5 entries==", pCache);
|
|
|
|
SyncIndex index;
|
|
index = 3;
|
|
SSyncRaftEntry* pEntry;
|
|
code = raftCacheGetAndDel(pCache, index, &pEntry);
|
|
ASSERT(code == 0);
|
|
syncEntryLog2((char*)"==test4 get-and-del entry 3==", pEntry);
|
|
raftCacheLog2((char*)"==test4 after get-and-del entry 3==", pCache);
|
|
}
|
|
|
|
static char* keyFn(const void* pData) {
|
|
SSyncRaftEntry* pEntry = (SSyncRaftEntry*)pData;
|
|
return (char*)(&(pEntry->index));
|
|
}
|
|
|
|
static int cmpFn(const void* p1, const void* p2) { return memcmp(p1, p2, sizeof(SyncIndex)); }
|
|
|
|
void printSkipList(SSkipList* pSkipList) {
|
|
ASSERT(pSkipList != NULL);
|
|
|
|
SSkipListIterator* pIter = tSkipListCreateIter(pSkipList);
|
|
while (tSkipListIterNext(pIter)) {
|
|
SSkipListNode* pNode = tSkipListIterGet(pIter);
|
|
ASSERT(pNode != NULL);
|
|
SSyncRaftEntry* pEntry = (SSyncRaftEntry*)SL_GET_NODE_DATA(pNode);
|
|
syncEntryPrint2((char*)"", pEntry);
|
|
}
|
|
}
|
|
|
|
void delSkipListFirst(SSkipList* pSkipList, int n) {
|
|
ASSERT(pSkipList != NULL);
|
|
|
|
sTrace("delete first %d -------------", n);
|
|
SSkipListIterator* pIter = tSkipListCreateIter(pSkipList);
|
|
for (int i = 0; i < n; ++i) {
|
|
tSkipListIterNext(pIter);
|
|
SSkipListNode* pNode = tSkipListIterGet(pIter);
|
|
tSkipListRemoveNode(pSkipList, pNode);
|
|
}
|
|
}
|
|
|
|
SSyncRaftEntry* getLogEntry2(SSkipList* pSkipList, SyncIndex index) {
|
|
SyncIndex index2 = index;
|
|
SSyncRaftEntry* pEntry = NULL;
|
|
int arraySize = 0;
|
|
|
|
SArray* entryPArray = tSkipListGet(pSkipList, (char*)(&index2));
|
|
arraySize = taosArrayGetSize(entryPArray);
|
|
if (arraySize > 0) {
|
|
SSkipListNode** ppNode = (SSkipListNode**)taosArrayGet(entryPArray, 0);
|
|
ASSERT(*ppNode != NULL);
|
|
pEntry = (SSyncRaftEntry*)SL_GET_NODE_DATA(*ppNode);
|
|
}
|
|
taosArrayDestroy(entryPArray);
|
|
|
|
sTrace("get index2: %" PRId64 ", arraySize:%d -------------", index, arraySize);
|
|
syncEntryLog2((char*)"getLogEntry2", pEntry);
|
|
return pEntry;
|
|
}
|
|
|
|
SSyncRaftEntry* getLogEntry(SSkipList* pSkipList, SyncIndex index) {
|
|
sTrace("get index: %" PRId64 " -------------", index);
|
|
SyncIndex index2 = index;
|
|
SSyncRaftEntry* pEntry = NULL;
|
|
SSkipListIterator* pIter =
|
|
tSkipListCreateIterFromVal(pSkipList, (const char*)&index2, TSDB_DATA_TYPE_BINARY, TSDB_ORDER_ASC);
|
|
if (tSkipListIterNext(pIter)) {
|
|
SSkipListNode* pNode = tSkipListIterGet(pIter);
|
|
ASSERT(pNode != NULL);
|
|
pEntry = (SSyncRaftEntry*)SL_GET_NODE_DATA(pNode);
|
|
}
|
|
|
|
syncEntryLog2((char*)"getLogEntry", pEntry);
|
|
return pEntry;
|
|
}
|
|
|
|
void test5() {
|
|
SSkipList* pSkipList =
|
|
tSkipListCreate(MAX_SKIP_LIST_LEVEL, TSDB_DATA_TYPE_BINARY, sizeof(SyncIndex), cmpFn, SL_ALLOW_DUP_KEY, keyFn);
|
|
ASSERT(pSkipList != NULL);
|
|
|
|
sTrace("insert 9 - 5");
|
|
for (int i = 9; i >= 5; --i) {
|
|
SSyncRaftEntry* pEntry = createEntry(i);
|
|
SSkipListNode* pSkipListNode = tSkipListPut(pSkipList, pEntry);
|
|
}
|
|
|
|
sTrace("insert 0 - 4");
|
|
for (int i = 0; i <= 4; ++i) {
|
|
SSyncRaftEntry* pEntry = createEntry(i);
|
|
SSkipListNode* pSkipListNode = tSkipListPut(pSkipList, pEntry);
|
|
}
|
|
|
|
sTrace("insert 7 7 7 7 7");
|
|
for (int i = 0; i <= 4; ++i) {
|
|
SSyncRaftEntry* pEntry = createEntry(7);
|
|
SSkipListNode* pSkipListNode = tSkipListPut(pSkipList, pEntry);
|
|
}
|
|
|
|
sTrace("print: -------------");
|
|
printSkipList(pSkipList);
|
|
|
|
delSkipListFirst(pSkipList, 3);
|
|
|
|
sTrace("print: -------------");
|
|
printSkipList(pSkipList);
|
|
|
|
getLogEntry(pSkipList, 2);
|
|
getLogEntry(pSkipList, 5);
|
|
getLogEntry(pSkipList, 7);
|
|
getLogEntry(pSkipList, 7);
|
|
|
|
getLogEntry2(pSkipList, 2);
|
|
getLogEntry2(pSkipList, 5);
|
|
getLogEntry2(pSkipList, 7);
|
|
getLogEntry2(pSkipList, 7);
|
|
|
|
tSkipListDestroy(pSkipList);
|
|
}
|
|
|
|
int main(int argc, char** argv) {
|
|
gRaftDetailLog = true;
|
|
tsAsyncLog = 0;
|
|
sDebugFlag = DEBUG_TRACE + DEBUG_SCREEN + DEBUG_FILE + DEBUG_DEBUG;
|
|
|
|
/*
|
|
test1();
|
|
test2();
|
|
test3();
|
|
test4();
|
|
*/
|
|
|
|
test5();
|
|
|
|
return 0;
|
|
}
|