refactor(sync): refactor wal abstraction
This commit is contained in:
parent
f140a5ad1b
commit
3d9ffc42e8
|
@ -157,13 +157,13 @@ typedef struct SSyncLogStore {
|
||||||
SyncIndex (*getCommitIndex)(struct SSyncLogStore* pLogStore);
|
SyncIndex (*getCommitIndex)(struct SSyncLogStore* pLogStore);
|
||||||
|
|
||||||
// refactor, log[0 .. n] ==> log[m .. n]
|
// refactor, log[0 .. n] ==> log[m .. n]
|
||||||
int32_t (*syncLogSetBeginIndex)(struct SSyncLogStore* pLogStore, SyncIndex beginIndex);
|
// int32_t (*syncLogSetBeginIndex)(struct SSyncLogStore* pLogStore, SyncIndex beginIndex);
|
||||||
int32_t (*syncLogResetBeginIndex)(struct SSyncLogStore* pLogStore);
|
|
||||||
SyncIndex (*syncLogBeginIndex)(struct SSyncLogStore* pLogStore);
|
SyncIndex (*syncLogBeginIndex)(struct SSyncLogStore* pLogStore);
|
||||||
SyncIndex (*syncLogEndIndex)(struct SSyncLogStore* pLogStore);
|
SyncIndex (*syncLogEndIndex)(struct SSyncLogStore* pLogStore);
|
||||||
bool (*syncLogIsEmpty)(struct SSyncLogStore* pLogStore);
|
bool (*syncLogIsEmpty)(struct SSyncLogStore* pLogStore);
|
||||||
int32_t (*syncLogEntryCount)(struct SSyncLogStore* pLogStore);
|
int32_t (*syncLogEntryCount)(struct SSyncLogStore* pLogStore);
|
||||||
// bool (*syncLogInRange)(struct SSyncLogStore* pLogStore, SyncIndex index);
|
int32_t (*syncLogRestoreFromSnapshot)(struct SSyncLogStore* pLogStore, SyncIndex index);
|
||||||
|
|
||||||
SyncIndex (*syncLogWriteIndex)(struct SSyncLogStore* pLogStore);
|
SyncIndex (*syncLogWriteIndex)(struct SSyncLogStore* pLogStore);
|
||||||
SyncIndex (*syncLogLastIndex)(struct SSyncLogStore* pLogStore);
|
SyncIndex (*syncLogLastIndex)(struct SSyncLogStore* pLogStore);
|
||||||
|
|
|
@ -32,7 +32,7 @@ typedef struct SSyncLogStoreData {
|
||||||
SSyncNode* pSyncNode;
|
SSyncNode* pSyncNode;
|
||||||
SWal* pWal;
|
SWal* pWal;
|
||||||
SWalReadHandle* pWalHandle;
|
SWalReadHandle* pWalHandle;
|
||||||
SyncIndex beginIndex; // valid begin index, default 0, may be set beginIndex > 0
|
// SyncIndex beginIndex; // valid begin index, default 0, may be set beginIndex > 0
|
||||||
} SSyncLogStoreData;
|
} SSyncLogStoreData;
|
||||||
|
|
||||||
SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode);
|
SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode);
|
||||||
|
|
|
@ -420,44 +420,26 @@ static int32_t syncNodePreCommit(SSyncNode* ths, SSyncRaftEntry* pEntry) {
|
||||||
// prevLogIndex == -1
|
// prevLogIndex == -1
|
||||||
static bool syncNodeOnAppendEntriesLogOK(SSyncNode* pSyncNode, SyncAppendEntries* pMsg) {
|
static bool syncNodeOnAppendEntriesLogOK(SSyncNode* pSyncNode, SyncAppendEntries* pMsg) {
|
||||||
if (pMsg->prevLogIndex == SYNC_INDEX_INVALID) {
|
if (pMsg->prevLogIndex == SYNC_INDEX_INVALID) {
|
||||||
if (gRaftDetailLog) {
|
|
||||||
sTrace("syncNodeOnAppendEntriesLogOK true, pMsg->prevLogIndex:%ld", pMsg->prevLogIndex);
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
SyncIndex myLastIndex = syncNodeGetLastIndex(pSyncNode);
|
SyncIndex myLastIndex = syncNodeGetLastIndex(pSyncNode);
|
||||||
if (pMsg->prevLogIndex > myLastIndex) {
|
if (pMsg->prevLogIndex > myLastIndex) {
|
||||||
if (gRaftDetailLog) {
|
sDebug("vgId:%d sync log not ok, preindex:%ld", pSyncNode->vgId, pMsg->prevLogIndex);
|
||||||
sTrace("syncNodeOnAppendEntriesLogOK false, pMsg->prevLogIndex:%ld, myLastIndex:%ld", pMsg->prevLogIndex,
|
|
||||||
myLastIndex);
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
SyncTerm myPreLogTerm = syncNodeGetPreTerm(pSyncNode, pMsg->prevLogIndex + 1);
|
SyncTerm myPreLogTerm = syncNodeGetPreTerm(pSyncNode, pMsg->prevLogIndex + 1);
|
||||||
if (myPreLogTerm == SYNC_TERM_INVALID) {
|
if (myPreLogTerm == SYNC_TERM_INVALID) {
|
||||||
sError("vgId:%d sync get pre term error, preindex:%ld", pSyncNode->vgId, pMsg->prevLogIndex);
|
sDebug("vgId:%d sync log not ok2, preindex:%ld", pSyncNode->vgId, pMsg->prevLogIndex);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pMsg->prevLogIndex <= myLastIndex && pMsg->prevLogTerm == myPreLogTerm) {
|
if (pMsg->prevLogIndex <= myLastIndex && pMsg->prevLogTerm == myPreLogTerm) {
|
||||||
if (gRaftDetailLog) {
|
|
||||||
sTrace(
|
|
||||||
"syncNodeOnAppendEntriesLogOK true, pMsg->prevLogIndex:%ld, myLastIndex:%ld, pMsg->prevLogTerm:%lu, "
|
|
||||||
"myPreLogTerm:%lu",
|
|
||||||
pMsg->prevLogIndex, myLastIndex, pMsg->prevLogTerm, myPreLogTerm);
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gRaftDetailLog) {
|
sDebug("vgId:%d sync log not ok3, preindex:%ld", pSyncNode->vgId, pMsg->prevLogIndex);
|
||||||
sTrace(
|
|
||||||
"syncNodeOnAppendEntriesLogOK false, pMsg->prevLogIndex:%ld, myLastIndex:%ld, pMsg->prevLogTerm:%lu, "
|
|
||||||
"myPreLogTerm:%lu",
|
|
||||||
pMsg->prevLogIndex, myLastIndex, pMsg->prevLogTerm, myPreLogTerm);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -528,7 +510,7 @@ int32_t syncNodeOnAppendEntriesSnapshotCb(SSyncNode* ths, SyncAppendEntries* pMs
|
||||||
bool condition0 = (pMsg->term == ths->pRaftStore->currentTerm) && (ths->state == TAOS_SYNC_STATE_FOLLOWER) &&
|
bool condition0 = (pMsg->term == ths->pRaftStore->currentTerm) && (ths->state == TAOS_SYNC_STATE_FOLLOWER) &&
|
||||||
syncNodeHasSnapshot(ths);
|
syncNodeHasSnapshot(ths);
|
||||||
bool condition1 =
|
bool condition1 =
|
||||||
condition0 && (ths->pLogStore->syncLogEntryCount(ths->pLogStore) == 0) && (pMsg->prevLogIndex > myLastIndex);
|
condition0 && (ths->pLogStore->syncLogEntryCount(ths->pLogStore) == 0) && (pMsg->prevLogIndex > myLastIndex); // donot use syncLogEntryCount!!! use isEmpty
|
||||||
bool condition2 = condition0 && (ths->pLogStore->syncLogLastIndex(ths->pLogStore) <= snapshot.lastApplyIndex) &&
|
bool condition2 = condition0 && (ths->pLogStore->syncLogLastIndex(ths->pLogStore) <= snapshot.lastApplyIndex) &&
|
||||||
(pMsg->prevLogIndex > myLastIndex);
|
(pMsg->prevLogIndex > myLastIndex);
|
||||||
bool condition3 = condition0 && (pMsg->prevLogIndex < snapshot.lastApplyIndex);
|
bool condition3 = condition0 && (pMsg->prevLogIndex < snapshot.lastApplyIndex);
|
||||||
|
@ -574,10 +556,13 @@ int32_t syncNodeOnAppendEntriesSnapshotCb(SSyncNode* ths, SyncAppendEntries* pMs
|
||||||
bool condition = (pMsg->term == ths->pRaftStore->currentTerm) && (ths->state == TAOS_SYNC_STATE_FOLLOWER) &&
|
bool condition = (pMsg->term == ths->pRaftStore->currentTerm) && (ths->state == TAOS_SYNC_STATE_FOLLOWER) &&
|
||||||
(pMsg->prevLogIndex <= ths->commitIndex);
|
(pMsg->prevLogIndex <= ths->commitIndex);
|
||||||
if (condition) {
|
if (condition) {
|
||||||
char logBuf[128];
|
do {
|
||||||
snprintf(logBuf, sizeof(logBuf), "recv sync-append-entries, fake match2, pre-index:%ld, pre-term:%lu, datalen:%d",
|
char logBuf[128];
|
||||||
pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->dataLen);
|
snprintf(logBuf, sizeof(logBuf),
|
||||||
syncNodeEventLog(ths, logBuf);
|
"recv sync-append-entries, fake match2, pre-index:%ld, pre-term:%lu, datalen:%d", pMsg->prevLogIndex,
|
||||||
|
pMsg->prevLogTerm, pMsg->dataLen);
|
||||||
|
syncNodeEventLog(ths, logBuf);
|
||||||
|
} while (0);
|
||||||
|
|
||||||
SyncIndex matchIndex = ths->commitIndex;
|
SyncIndex matchIndex = ths->commitIndex;
|
||||||
bool hasAppendEntries = pMsg->dataLen > 0;
|
bool hasAppendEntries = pMsg->dataLen > 0;
|
||||||
|
|
|
@ -1962,17 +1962,21 @@ SyncTerm syncNodeGetPreTerm(SSyncNode* pSyncNode, SyncIndex index) {
|
||||||
taosMemoryFree(pPreEntry);
|
taosMemoryFree(pPreEntry);
|
||||||
return preTerm;
|
return preTerm;
|
||||||
} else {
|
} else {
|
||||||
if (terrno == TSDB_CODE_WAL_LOG_NOT_EXIST) {
|
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0, .lastConfigIndex = -1};
|
||||||
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0, .lastConfigIndex = -1};
|
if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
|
||||||
if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
|
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
|
||||||
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
|
if (snapshot.lastApplyIndex == preIndex) {
|
||||||
if (snapshot.lastApplyIndex == preIndex) {
|
return snapshot.lastApplyTerm;
|
||||||
return snapshot.lastApplyTerm;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
char logBuf[128];
|
||||||
|
snprintf(logBuf, sizeof(logBuf), "sync node get pre term error, index:%ld", index);
|
||||||
|
syncNodeErrorLog(pSyncNode, logBuf);
|
||||||
|
} while (0);
|
||||||
|
|
||||||
return SYNC_TERM_INVALID;
|
return SYNC_TERM_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,8 @@
|
||||||
#include "syncRaftStore.h"
|
#include "syncRaftStore.h"
|
||||||
|
|
||||||
// refactor, log[0 .. n] ==> log[m .. n]
|
// refactor, log[0 .. n] ==> log[m .. n]
|
||||||
static int32_t raftLogSetBeginIndex(struct SSyncLogStore* pLogStore, SyncIndex beginIndex);
|
static int32_t raftLogRestoreFromSnapshot(struct SSyncLogStore* pLogStore, SyncIndex snapshotIndex);
|
||||||
|
// static int32_t raftLogSetBeginIndex(struct SSyncLogStore* pLogStore, SyncIndex beginIndex);
|
||||||
static SyncIndex raftLogBeginIndex(struct SSyncLogStore* pLogStore);
|
static SyncIndex raftLogBeginIndex(struct SSyncLogStore* pLogStore);
|
||||||
static SyncIndex raftLogEndIndex(struct SSyncLogStore* pLogStore);
|
static SyncIndex raftLogEndIndex(struct SSyncLogStore* pLogStore);
|
||||||
static SyncIndex raftLogWriteIndex(struct SSyncLogStore* pLogStore);
|
static SyncIndex raftLogWriteIndex(struct SSyncLogStore* pLogStore);
|
||||||
|
@ -44,6 +45,7 @@ static int32_t logStoreUpdateCommitIndex(SSyncLogStore* pLogStore, SyncI
|
||||||
static SyncIndex logStoreGetCommitIndex(SSyncLogStore* pLogStore);
|
static SyncIndex logStoreGetCommitIndex(SSyncLogStore* pLogStore);
|
||||||
|
|
||||||
// refactor, log[0 .. n] ==> log[m .. n]
|
// refactor, log[0 .. n] ==> log[m .. n]
|
||||||
|
/*
|
||||||
static int32_t raftLogSetBeginIndex(struct SSyncLogStore* pLogStore, SyncIndex beginIndex) {
|
static int32_t raftLogSetBeginIndex(struct SSyncLogStore* pLogStore, SyncIndex beginIndex) {
|
||||||
// if beginIndex == 0, donot need call this funciton
|
// if beginIndex == 0, donot need call this funciton
|
||||||
ASSERT(beginIndex > 0);
|
ASSERT(beginIndex > 0);
|
||||||
|
@ -56,19 +58,30 @@ static int32_t raftLogSetBeginIndex(struct SSyncLogStore* pLogStore, SyncIndex b
|
||||||
walRestoreFromSnapshot(pWal, beginIndex - 1);
|
walRestoreFromSnapshot(pWal, beginIndex - 1);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int32_t raftLogRestoreFromSnapshot(struct SSyncLogStore* pLogStore, SyncIndex snapshotIndex) {
|
||||||
|
ASSERT(snapshotIndex >= 0);
|
||||||
|
|
||||||
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
|
SWal* pWal = pData->pWal;
|
||||||
|
walRestoreFromSnapshot(pWal, snapshotIndex);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static SyncIndex raftLogBeginIndex(struct SSyncLogStore* pLogStore) {
|
static SyncIndex raftLogBeginIndex(struct SSyncLogStore* pLogStore) {
|
||||||
SSyncLogStoreData* pData = pLogStore->data;
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
SWal* pWal = pData->pWal;
|
SWal* pWal = pData->pWal;
|
||||||
return pData->beginIndex;
|
SyncIndex firstVer = walGetFirstVer(pWal);
|
||||||
|
return firstVer;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SyncIndex raftLogEndIndex(struct SSyncLogStore* pLogStore) { return raftLogLastIndex(pLogStore); }
|
static SyncIndex raftLogEndIndex(struct SSyncLogStore* pLogStore) { return raftLogLastIndex(pLogStore); }
|
||||||
|
|
||||||
static bool raftLogIsEmpty(struct SSyncLogStore* pLogStore) {
|
static bool raftLogIsEmpty(struct SSyncLogStore* pLogStore) {
|
||||||
SyncIndex beginIndex = raftLogBeginIndex(pLogStore);
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
SyncIndex endIndex = raftLogEndIndex(pLogStore);
|
SWal* pWal = pData->pWal;
|
||||||
return (endIndex < beginIndex);
|
return walIsEmpty(pWal);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t raftLogEntryCount(struct SSyncLogStore* pLogStore) {
|
static int32_t raftLogEntryCount(struct SSyncLogStore* pLogStore) {
|
||||||
|
@ -95,23 +108,8 @@ static SyncIndex raftLogLastIndex(struct SSyncLogStore* pLogStore) {
|
||||||
SSyncLogStoreData* pData = pLogStore->data;
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
SWal* pWal = pData->pWal;
|
SWal* pWal = pData->pWal;
|
||||||
SyncIndex lastVer = walGetLastVer(pWal);
|
SyncIndex lastVer = walGetLastVer(pWal);
|
||||||
SyncIndex firstVer = walGetFirstVer(pWal);
|
|
||||||
|
|
||||||
if (lastVer < firstVer) {
|
return lastVer;
|
||||||
// no record
|
|
||||||
lastIndex = -1;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
if (firstVer >= 0) {
|
|
||||||
lastIndex = lastVer;
|
|
||||||
} else if (firstVer == -1) {
|
|
||||||
lastIndex = -1;
|
|
||||||
} else {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return lastIndex;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static SyncIndex raftLogWriteIndex(struct SSyncLogStore* pLogStore) {
|
static SyncIndex raftLogWriteIndex(struct SSyncLogStore* pLogStore) {
|
||||||
|
@ -121,6 +119,26 @@ static SyncIndex raftLogWriteIndex(struct SSyncLogStore* pLogStore) {
|
||||||
return lastVer + 1;
|
return lastVer + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SyncTerm raftLogLastTerm(struct SSyncLogStore* pLogStore) {
|
||||||
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
|
SWal* pWal = pData->pWal;
|
||||||
|
if (walIsEmpty(pWal)) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
SSyncRaftEntry* pLastEntry;
|
||||||
|
int32_t code = raftLogGetLastEntry(pLogStore, &pLastEntry);
|
||||||
|
ASSERT(code == 0);
|
||||||
|
ASSERT(pLastEntry != NULL);
|
||||||
|
|
||||||
|
SyncTerm lastTerm = pLastEntry->term;
|
||||||
|
taosMemoryFree(pLastEntry);
|
||||||
|
return lastTerm;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
static SyncTerm raftLogLastTerm(struct SSyncLogStore* pLogStore) {
|
static SyncTerm raftLogLastTerm(struct SSyncLogStore* pLogStore) {
|
||||||
SyncTerm lastTerm = 0;
|
SyncTerm lastTerm = 0;
|
||||||
if (raftLogEntryCount(pLogStore) == 0) {
|
if (raftLogEntryCount(pLogStore) == 0) {
|
||||||
|
@ -136,6 +154,7 @@ static SyncTerm raftLogLastTerm(struct SSyncLogStore* pLogStore) {
|
||||||
}
|
}
|
||||||
return lastTerm;
|
return lastTerm;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry) {
|
static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry) {
|
||||||
SSyncLogStoreData* pData = pLogStore->data;
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
|
@ -302,6 +321,25 @@ static int32_t raftLogTruncate(struct SSyncLogStore* pLogStore, SyncIndex fromIn
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t raftLogGetLastEntry(SSyncLogStore* pLogStore, SSyncRaftEntry** ppLastEntry) {
|
||||||
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
|
SWal* pWal = pData->pWal;
|
||||||
|
ASSERT(ppLastEntry != NULL);
|
||||||
|
|
||||||
|
*ppLastEntry = NULL;
|
||||||
|
if (walIsEmpty(pWal)) {
|
||||||
|
terrno = TSDB_CODE_WAL_LOG_NOT_EXIST;
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
SyncIndex lastIndex = raftLogLastIndex(pLogStore);
|
||||||
|
int32_t code = raftLogGetEntry(pLogStore, lastIndex, ppLastEntry);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
static int32_t raftLogGetLastEntry(SSyncLogStore* pLogStore, SSyncRaftEntry** ppLastEntry) {
|
static int32_t raftLogGetLastEntry(SSyncLogStore* pLogStore, SSyncRaftEntry** ppLastEntry) {
|
||||||
*ppLastEntry = NULL;
|
*ppLastEntry = NULL;
|
||||||
if (raftLogEntryCount(pLogStore) == 0) {
|
if (raftLogEntryCount(pLogStore) == 0) {
|
||||||
|
@ -311,6 +349,7 @@ static int32_t raftLogGetLastEntry(SSyncLogStore* pLogStore, SSyncRaftEntry** pp
|
||||||
int32_t code = raftLogGetEntry(pLogStore, lastIndex, ppLastEntry);
|
int32_t code = raftLogGetEntry(pLogStore, lastIndex, ppLastEntry);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
//-------------------------------
|
//-------------------------------
|
||||||
SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode) {
|
SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode) {
|
||||||
|
@ -328,15 +367,17 @@ SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode) {
|
||||||
pData->pWalHandle = walOpenReadHandle(pData->pWal);
|
pData->pWalHandle = walOpenReadHandle(pData->pWal);
|
||||||
ASSERT(pData->pWalHandle != NULL);
|
ASSERT(pData->pWalHandle != NULL);
|
||||||
|
|
||||||
SyncIndex firstVer = walGetFirstVer(pData->pWal);
|
/*
|
||||||
SyncIndex lastVer = walGetLastVer(pData->pWal);
|
SyncIndex firstVer = walGetFirstVer(pData->pWal);
|
||||||
if (firstVer >= 0) {
|
SyncIndex lastVer = walGetLastVer(pData->pWal);
|
||||||
pData->beginIndex = firstVer;
|
if (firstVer >= 0) {
|
||||||
} else if (firstVer == -1) {
|
pData->beginIndex = firstVer;
|
||||||
pData->beginIndex = lastVer + 1;
|
} else if (firstVer == -1) {
|
||||||
} else {
|
pData->beginIndex = lastVer + 1;
|
||||||
ASSERT(0);
|
} else {
|
||||||
}
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
pLogStore->appendEntry = logStoreAppendEntry;
|
pLogStore->appendEntry = logStoreAppendEntry;
|
||||||
pLogStore->getEntry = logStoreGetEntry;
|
pLogStore->getEntry = logStoreGetEntry;
|
||||||
|
@ -346,7 +387,8 @@ SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode) {
|
||||||
pLogStore->updateCommitIndex = logStoreUpdateCommitIndex;
|
pLogStore->updateCommitIndex = logStoreUpdateCommitIndex;
|
||||||
pLogStore->getCommitIndex = logStoreGetCommitIndex;
|
pLogStore->getCommitIndex = logStoreGetCommitIndex;
|
||||||
|
|
||||||
pLogStore->syncLogSetBeginIndex = raftLogSetBeginIndex;
|
// pLogStore->syncLogSetBeginIndex = raftLogSetBeginIndex;
|
||||||
|
pLogStore->syncLogRestoreFromSnapshot = raftLogRestoreFromSnapshot;
|
||||||
pLogStore->syncLogBeginIndex = raftLogBeginIndex;
|
pLogStore->syncLogBeginIndex = raftLogBeginIndex;
|
||||||
pLogStore->syncLogEndIndex = raftLogEndIndex;
|
pLogStore->syncLogEndIndex = raftLogEndIndex;
|
||||||
pLogStore->syncLogIsEmpty = raftLogIsEmpty;
|
pLogStore->syncLogIsEmpty = raftLogIsEmpty;
|
||||||
|
@ -538,6 +580,7 @@ SSyncRaftEntry* logStoreGetLastEntry(SSyncLogStore* pLogStore) {
|
||||||
return pEntry;
|
return pEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
cJSON* logStore2Json(SSyncLogStore* pLogStore) {
|
cJSON* logStore2Json(SSyncLogStore* pLogStore) {
|
||||||
char u64buf[128] = {0};
|
char u64buf[128] = {0};
|
||||||
SSyncLogStoreData* pData = (SSyncLogStoreData*)pLogStore->data;
|
SSyncLogStoreData* pData = (SSyncLogStoreData*)pLogStore->data;
|
||||||
|
@ -584,6 +627,57 @@ cJSON* logStore2Json(SSyncLogStore* pLogStore) {
|
||||||
cJSON_AddItemToObject(pJson, "SSyncLogStore", pRoot);
|
cJSON_AddItemToObject(pJson, "SSyncLogStore", pRoot);
|
||||||
return pJson;
|
return pJson;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
cJSON* logStore2Json(SSyncLogStore* pLogStore) {
|
||||||
|
char u64buf[128] = {0};
|
||||||
|
SSyncLogStoreData* pData = (SSyncLogStoreData*)pLogStore->data;
|
||||||
|
cJSON* pRoot = cJSON_CreateObject();
|
||||||
|
|
||||||
|
if (pData != NULL && pData->pWal != NULL) {
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%p", pData->pSyncNode);
|
||||||
|
cJSON_AddStringToObject(pRoot, "pSyncNode", u64buf);
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%p", pData->pWal);
|
||||||
|
cJSON_AddStringToObject(pRoot, "pWal", u64buf);
|
||||||
|
|
||||||
|
SyncIndex beginIndex = raftLogBeginIndex(pLogStore);
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%ld", beginIndex);
|
||||||
|
cJSON_AddStringToObject(pRoot, "beginIndex", u64buf);
|
||||||
|
|
||||||
|
SyncIndex endIndex = raftLogEndIndex(pLogStore);
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%ld", endIndex);
|
||||||
|
cJSON_AddStringToObject(pRoot, "endIndex", u64buf);
|
||||||
|
|
||||||
|
int32_t count = raftLogEntryCount(pLogStore);
|
||||||
|
cJSON_AddNumberToObject(pRoot, "entryCount", count);
|
||||||
|
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%ld", raftLogWriteIndex(pLogStore));
|
||||||
|
cJSON_AddStringToObject(pRoot, "WriteIndex", u64buf);
|
||||||
|
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%d", raftLogIsEmpty(pLogStore));
|
||||||
|
cJSON_AddStringToObject(pRoot, "IsEmpty", u64buf);
|
||||||
|
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%ld", raftLogLastIndex(pLogStore));
|
||||||
|
cJSON_AddStringToObject(pRoot, "LastIndex", u64buf);
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%lu", raftLogLastTerm(pLogStore));
|
||||||
|
cJSON_AddStringToObject(pRoot, "LastTerm", u64buf);
|
||||||
|
|
||||||
|
cJSON* pEntries = cJSON_CreateArray();
|
||||||
|
cJSON_AddItemToObject(pRoot, "pEntries", pEntries);
|
||||||
|
|
||||||
|
if (!raftLogIsEmpty(pLogStore)) {
|
||||||
|
for (SyncIndex i = beginIndex; i <= endIndex; ++i) {
|
||||||
|
SSyncRaftEntry* pEntry = logStoreGetEntry(pLogStore, i);
|
||||||
|
cJSON_AddItemToArray(pEntries, syncEntry2Json(pEntry));
|
||||||
|
syncEntryDestory(pEntry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cJSON* pJson = cJSON_CreateObject();
|
||||||
|
cJSON_AddItemToObject(pJson, "SSyncLogStore", pRoot);
|
||||||
|
return pJson;
|
||||||
|
}
|
||||||
|
|
||||||
char* logStore2Str(SSyncLogStore* pLogStore) {
|
char* logStore2Str(SSyncLogStore* pLogStore) {
|
||||||
cJSON* pJson = logStore2Json(pLogStore);
|
cJSON* pJson = logStore2Json(pLogStore);
|
||||||
|
@ -603,7 +697,8 @@ cJSON* logStoreSimple2Json(SSyncLogStore* pLogStore) {
|
||||||
snprintf(u64buf, sizeof(u64buf), "%p", pData->pWal);
|
snprintf(u64buf, sizeof(u64buf), "%p", pData->pWal);
|
||||||
cJSON_AddStringToObject(pRoot, "pWal", u64buf);
|
cJSON_AddStringToObject(pRoot, "pWal", u64buf);
|
||||||
|
|
||||||
snprintf(u64buf, sizeof(u64buf), "%ld", pData->beginIndex);
|
SyncIndex beginIndex = raftLogBeginIndex(pLogStore);
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%ld", beginIndex);
|
||||||
cJSON_AddStringToObject(pRoot, "beginIndex", u64buf);
|
cJSON_AddStringToObject(pRoot, "beginIndex", u64buf);
|
||||||
|
|
||||||
SyncIndex endIndex = raftLogEndIndex(pLogStore);
|
SyncIndex endIndex = raftLogEndIndex(pLogStore);
|
||||||
|
|
|
@ -545,7 +545,8 @@ int32_t syncNodeOnSnapshotSendCb(SSyncNode *pSyncNode, SyncSnapshotSend *pMsg) {
|
||||||
pReceiver->pSyncNode->commitIndex = pReceiver->snapshot.lastApplyIndex;
|
pReceiver->pSyncNode->commitIndex = pReceiver->snapshot.lastApplyIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
pSyncNode->pLogStore->syncLogSetBeginIndex(pSyncNode->pLogStore, pMsg->lastIndex + 1);
|
// pSyncNode->pLogStore->syncLogSetBeginIndex(pSyncNode->pLogStore, pMsg->lastIndex + 1);
|
||||||
|
pSyncNode->pLogStore->syncLogRestoreFromSnapshot(pSyncNode->pLogStore, pMsg->lastIndex);
|
||||||
|
|
||||||
// maybe update lastconfig
|
// maybe update lastconfig
|
||||||
if (pMsg->lastConfigIndex >= SYNC_INDEX_BEGIN) {
|
if (pMsg->lastConfigIndex >= SYNC_INDEX_BEGIN) {
|
||||||
|
|
|
@ -113,7 +113,8 @@ void test2() {
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
pSyncNode->pLogStore = pLogStore;
|
pSyncNode->pLogStore = pLogStore;
|
||||||
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
//pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
||||||
|
pLogStore->syncLogRestoreFromSnapshot(pLogStore, 4);
|
||||||
logStoreLog2((char*)"\n\n\ntest2 ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest2 ----- ", pLogStore);
|
||||||
|
|
||||||
if (gAssert) {
|
if (gAssert) {
|
||||||
|
@ -228,7 +229,8 @@ void test4() {
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
pSyncNode->pLogStore = pLogStore;
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest4 ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest4 ----- ", pLogStore);
|
||||||
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
//pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
||||||
|
pLogStore->syncLogRestoreFromSnapshot(pLogStore, 4);
|
||||||
|
|
||||||
for (int i = 5; i <= 9; ++i) {
|
for (int i = 5; i <= 9; ++i) {
|
||||||
int32_t dataLen = 10;
|
int32_t dataLen = 10;
|
||||||
|
@ -289,7 +291,8 @@ void test5() {
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
pSyncNode->pLogStore = pLogStore;
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest5 ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest5 ----- ", pLogStore);
|
||||||
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
//pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
||||||
|
pLogStore->syncLogRestoreFromSnapshot(pLogStore, 4);
|
||||||
|
|
||||||
for (int i = 5; i <= 9; ++i) {
|
for (int i = 5; i <= 9; ++i) {
|
||||||
int32_t dataLen = 10;
|
int32_t dataLen = 10;
|
||||||
|
@ -363,7 +366,8 @@ void test6() {
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
pSyncNode->pLogStore = pLogStore;
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest6 ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest6 ----- ", pLogStore);
|
||||||
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
// pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
||||||
|
pLogStore->syncLogRestoreFromSnapshot(pLogStore, 4);
|
||||||
|
|
||||||
for (int i = 5; i <= 9; ++i) {
|
for (int i = 5; i <= 9; ++i) {
|
||||||
int32_t dataLen = 10;
|
int32_t dataLen = 10;
|
||||||
|
@ -405,14 +409,32 @@ void test6() {
|
||||||
assert(pLogStore->syncLogLastTerm(pLogStore) == 0);
|
assert(pLogStore->syncLogLastTerm(pLogStore) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
SyncIndex firstVer = walGetFirstVer(pWal);
|
||||||
|
SyncIndex lastVer = walGetLastVer(pWal);
|
||||||
|
bool isEmpty = walIsEmpty(pWal);
|
||||||
|
printf("before -------- firstVer:%ld lastVer:%ld isEmpty:%d \n", firstVer, lastVer, isEmpty);
|
||||||
|
} while (0);
|
||||||
|
|
||||||
logStoreDestory(pLogStore);
|
logStoreDestory(pLogStore);
|
||||||
cleanup();
|
cleanup();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// restart
|
// restart
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
pSyncNode->pLogStore = pLogStore;
|
pSyncNode->pLogStore = pLogStore;
|
||||||
|
|
||||||
|
|
||||||
|
do {
|
||||||
|
SyncIndex firstVer = walGetFirstVer(pWal);
|
||||||
|
SyncIndex lastVer = walGetLastVer(pWal);
|
||||||
|
bool isEmpty = walIsEmpty(pWal);
|
||||||
|
printf("after -------- firstVer:%ld lastVer:%ld isEmpty:%d \n", firstVer, lastVer, isEmpty);
|
||||||
|
} while (0);
|
||||||
|
|
||||||
logStoreLog2((char*)"\n\n\ntest6 restart ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest6 restart ----- ", pLogStore);
|
||||||
|
|
||||||
if (gAssert) {
|
if (gAssert) {
|
||||||
|
@ -432,17 +454,20 @@ void test6() {
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
tsAsyncLog = 0;
|
tsAsyncLog = 0;
|
||||||
sDebugFlag = DEBUG_TRACE + DEBUG_INFO + DEBUG_SCREEN + DEBUG_FILE;
|
sDebugFlag = DEBUG_TRACE + DEBUG_INFO + DEBUG_SCREEN + DEBUG_FILE;
|
||||||
|
gRaftDetailLog = true;
|
||||||
|
|
||||||
if (argc == 2) {
|
if (argc == 2) {
|
||||||
gAssert = atoi(argv[1]);
|
gAssert = atoi(argv[1]);
|
||||||
}
|
}
|
||||||
sTrace("gAssert : %d", gAssert);
|
sTrace("gAssert : %d", gAssert);
|
||||||
|
|
||||||
|
/*
|
||||||
test1();
|
test1();
|
||||||
test2();
|
test2();
|
||||||
test3();
|
test3();
|
||||||
test4();
|
test4();
|
||||||
test5();
|
test5();
|
||||||
|
*/
|
||||||
test6();
|
test6();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -312,7 +312,8 @@ void test5() {
|
||||||
pSyncNode->pLogStore = pLogStore;
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest5 ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest5 ----- ", pLogStore);
|
||||||
|
|
||||||
pSyncNode->pLogStore->syncLogSetBeginIndex(pSyncNode->pLogStore, 6);
|
//pSyncNode->pLogStore->syncLogSetBeginIndex(pSyncNode->pLogStore, 6);
|
||||||
|
pLogStore->syncLogRestoreFromSnapshot(pSyncNode->pLogStore, 5);
|
||||||
for (int i = 6; i <= 10; ++i) {
|
for (int i = 6; i <= 10; ++i) {
|
||||||
int32_t dataLen = 10;
|
int32_t dataLen = 10;
|
||||||
SSyncRaftEntry* pEntry = syncEntryBuild(dataLen);
|
SSyncRaftEntry* pEntry = syncEntryBuild(dataLen);
|
||||||
|
@ -372,6 +373,7 @@ void test5() {
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
tsAsyncLog = 0;
|
tsAsyncLog = 0;
|
||||||
sDebugFlag = DEBUG_TRACE + DEBUG_INFO + DEBUG_SCREEN + DEBUG_FILE;
|
sDebugFlag = DEBUG_TRACE + DEBUG_INFO + DEBUG_SCREEN + DEBUG_FILE;
|
||||||
|
gRaftDetailLog = true;
|
||||||
|
|
||||||
if (argc == 2) {
|
if (argc == 2) {
|
||||||
gAssert = atoi(argv[1]);
|
gAssert = atoi(argv[1]);
|
||||||
|
|
Loading…
Reference in New Issue