diff --git a/source/libs/sync/inc/syncInt.h b/source/libs/sync/inc/syncInt.h index bd007b47992b2ece2ad8d694d2750918901bdd55..41463e2f7f4587f0027f41a3eef9492e8a4f8386 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 dca9e64b3da9fc37e920eb745c56d68844e905dd..dfd198c4893b5069b8b43db3cc2f5041d4747dff 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; }