From 6be4119fe717db9111b21864b2f352de2d13e347 Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Mon, 30 May 2022 18:45:09 +0800 Subject: [PATCH] add syncNodeIsIndexInSnapshot syncNodeGetLastIndexTerm syncNodeGetPreIndexTerm --- source/libs/sync/inc/syncInt.h | 2 +- source/libs/sync/src/syncMain.c | 40 +++++++++++++++++++++++++++++++-- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/source/libs/sync/inc/syncInt.h b/source/libs/sync/inc/syncInt.h index bd007b4799..41463e2f7f 100644 --- a/source/libs/sync/inc/syncInt.h +++ b/source/libs/sync/inc/syncInt.h @@ -220,7 +220,7 @@ void syncNodeVoteForTerm(SSyncNode* pSyncNode, SyncTerm term, SRaftId* pRaftId); void syncNodeVoteForSelf(SSyncNode* pSyncNode); // snapshot -------------- -bool syncNodeIsInSnapshot(SSyncNode* pSyncNode, SyncIndex index); +bool syncNodeIsIndexInSnapshot(SSyncNode* pSyncNode, SyncIndex index); int32_t syncNodeGetLastIndexTerm(SSyncNode* pSyncNode, SyncIndex* pLastIndex, SyncTerm* pLastTerm); int32_t syncNodeGetPreIndexTerm(SSyncNode* pSyncNode, SyncIndex index, SyncIndex* pPreIndex, SyncTerm* pPreTerm); diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index dca9e64b3d..dfd198c489 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -1201,11 +1201,47 @@ void syncNodeVoteForSelf(SSyncNode* pSyncNode) { } // snapshot -------------- -bool syncNodeIsInSnapshot(SSyncNode* pSyncNode, SyncIndex index) { return true; } +bool syncNodeIsIndexInSnapshot(SSyncNode* pSyncNode, SyncIndex index) { + SSnapshot snapshot; + pSyncNode->pFsm->FpGetSnapshot(pSyncNode->pFsm, &snapshot); + bool b = index <= snapshot.lastApplyIndex; + return b; +} + +int32_t syncNodeGetLastIndexTerm(SSyncNode* pSyncNode, SyncIndex* pLastIndex, SyncTerm* pLastTerm) { + SyncIndex logLastIndex = pSyncNode->pLogStore->getLastIndex(pSyncNode->pLogStore); + SSnapshot snapshot; + pSyncNode->pFsm->FpGetSnapshot(pSyncNode->pFsm, &snapshot); + SyncIndex snapshotLastIndex = snapshot.lastApplyIndex; -int32_t syncNodeGetLastIndexTerm(SSyncNode* pSyncNode, SyncIndex* pLastIndex, SyncTerm* pLastTerm) { return 0; } + if (logLastIndex > snapshotLastIndex) { + *pLastIndex = logLastIndex; + *pLastTerm = pSyncNode->pLogStore->getLastTerm(pSyncNode->pLogStore); + } else { + *pLastIndex = snapshotLastIndex; + *pLastTerm = snapshot.lastApplyTerm; + } + return 0; +} int32_t syncNodeGetPreIndexTerm(SSyncNode* pSyncNode, SyncIndex index, SyncIndex* pPreIndex, SyncTerm* pPreTerm) { + ASSERT(index >= SYNC_INDEX_BEGIN); + int ret = 0; + + SyncIndex preIndex = index - 1; + if (syncNodeIsIndexInSnapshot(pSyncNode, preIndex)) { + SSnapshot snapshot; + pSyncNode->pFsm->FpGetSnapshot(pSyncNode->pFsm, &snapshot); + ASSERT(preIndex == snapshot.lastApplyIndex); + *pPreIndex = snapshot.lastApplyIndex; + *pPreTerm = snapshot.lastApplyTerm; + } else { + SSyncRaftEntry *pPreEntry = pSyncNode->pLogStore->getEntry(pSyncNode->pLogStore, preIndex); + ASSERT(pPreEntry != NULL); + *pPreIndex = pPreEntry->index; + *pPreTerm = pPreEntry->term; + } + return 0; } -- GitLab