fix(sync): sending snapshot
This commit is contained in:
parent
ac90f61b63
commit
44994201b6
|
@ -39,6 +39,8 @@ char* logStore2Str(SSyncLogStore* pLogStore);
|
||||||
cJSON* logStoreSimple2Json(SSyncLogStore* pLogStore);
|
cJSON* logStoreSimple2Json(SSyncLogStore* pLogStore);
|
||||||
char* logStoreSimple2Str(SSyncLogStore* pLogStore);
|
char* logStoreSimple2Str(SSyncLogStore* pLogStore);
|
||||||
|
|
||||||
|
SyncIndex logStoreFirstIndex(SSyncLogStore* pLogStore);
|
||||||
|
|
||||||
// SSyncRaftEntry* logStoreGetLastEntry(SSyncLogStore* pLogStore);
|
// SSyncRaftEntry* logStoreGetLastEntry(SSyncLogStore* pLogStore);
|
||||||
// SyncIndex logStoreLastIndex(SSyncLogStore* pLogStore);
|
// SyncIndex logStoreLastIndex(SSyncLogStore* pLogStore);
|
||||||
// SyncTerm logStoreLastTerm(SSyncLogStore* pLogStore);
|
// SyncTerm logStoreLastTerm(SSyncLogStore* pLogStore);
|
||||||
|
|
|
@ -454,16 +454,16 @@ int32_t syncNodeOnAppendEntriesSnapshotCb(SSyncNode* ths, SyncAppendEntries* pMs
|
||||||
|
|
||||||
SyncIndex localPreLogIndex;
|
SyncIndex localPreLogIndex;
|
||||||
SyncTerm localPreLogTerm;
|
SyncTerm localPreLogTerm;
|
||||||
ret = syncNodeGetPreIndexTerm(ths, pMsg->prevLogIndex + 1, &localPreLogIndex, &localPreLogTerm);
|
|
||||||
ASSERT(ret == 0);
|
|
||||||
|
|
||||||
SyncIndex localLastIndex;
|
|
||||||
SyncTerm localLastTerm;
|
|
||||||
ret = syncNodeGetLastIndexTerm(ths, &localLastIndex, &localLastTerm);
|
|
||||||
ASSERT(ret == 0);
|
|
||||||
|
|
||||||
bool logOK;
|
bool logOK;
|
||||||
if (syncNodeIsIndexInSnapshot(ths, pMsg->prevLogIndex)) {
|
|
||||||
|
SyncIndex logFirstIndex = logStoreFirstIndex(ths->pLogStore);
|
||||||
|
SSnapshot snapshot;
|
||||||
|
ths->pFsm->FpGetSnapshot(ths->pFsm, &snapshot);
|
||||||
|
if (logFirstIndex > snapshot.lastApplyIndex) {
|
||||||
|
logOK = false;
|
||||||
|
|
||||||
|
} else if (syncNodeIsIndexInSnapshot(ths, pMsg->prevLogIndex)) {
|
||||||
SSnapshot snapshot;
|
SSnapshot snapshot;
|
||||||
ths->pFsm->FpGetSnapshot(ths->pFsm, &snapshot);
|
ths->pFsm->FpGetSnapshot(ths->pFsm, &snapshot);
|
||||||
|
|
||||||
|
@ -478,6 +478,9 @@ int32_t syncNodeOnAppendEntriesSnapshotCb(SSyncNode* ths, SyncAppendEntries* pMs
|
||||||
logOK, pMsg->prevLogIndex, snapshot.lastApplyIndex, pMsg->prevLogTerm, snapshot.lastApplyTerm);
|
logOK, pMsg->prevLogIndex, snapshot.lastApplyIndex, pMsg->prevLogTerm, snapshot.lastApplyTerm);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
ret = syncNodeGetPreIndexTerm(ths, pMsg->prevLogIndex + 1, &localPreLogIndex, &localPreLogTerm);
|
||||||
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
logOK = (pMsg->prevLogIndex == SYNC_INDEX_INVALID) ||
|
logOK = (pMsg->prevLogIndex == SYNC_INDEX_INVALID) ||
|
||||||
((pMsg->prevLogIndex >= SYNC_INDEX_BEGIN) &&
|
((pMsg->prevLogIndex >= SYNC_INDEX_BEGIN) &&
|
||||||
(pMsg->prevLogIndex <= ths->pLogStore->getLastIndex(ths->pLogStore)) &&
|
(pMsg->prevLogIndex <= ths->pLogStore->getLastIndex(ths->pLogStore)) &&
|
||||||
|
@ -510,6 +513,21 @@ int32_t syncNodeOnAppendEntriesSnapshotCb(SSyncNode* ths, SyncAppendEntries* pMs
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SyncIndex localLastIndex;
|
||||||
|
SyncTerm localLastTerm;
|
||||||
|
if (logFirstIndex == SYNC_INDEX_INVALID) {
|
||||||
|
localLastIndex = ths->pLogStore->getLastIndex(ths->pLogStore);
|
||||||
|
localLastTerm = ths->pLogStore->getLastTerm(ths->pLogStore);
|
||||||
|
|
||||||
|
} else if (logFirstIndex > snapshot.lastApplyIndex) {
|
||||||
|
localLastIndex = ths->pLogStore->getLastIndex(ths->pLogStore);
|
||||||
|
localLastTerm = ths->pLogStore->getLastTerm(ths->pLogStore);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
ret = syncNodeGetLastIndexTerm(ths, &localLastIndex, &localLastTerm);
|
||||||
|
ASSERT(ret == 0);
|
||||||
|
}
|
||||||
|
|
||||||
// return to follower state
|
// return to follower state
|
||||||
if (pMsg->term == ths->pRaftStore->currentTerm && ths->state == TAOS_SYNC_STATE_CANDIDATE) {
|
if (pMsg->term == ths->pRaftStore->currentTerm && ths->state == TAOS_SYNC_STATE_CANDIDATE) {
|
||||||
sTrace(
|
sTrace(
|
||||||
|
|
|
@ -258,6 +258,12 @@ char* logStoreSimple2Str(SSyncLogStore* pLogStore) {
|
||||||
return serialized;
|
return serialized;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SyncIndex logStoreFirstIndex(SSyncLogStore* pLogStore) {
|
||||||
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
|
SWal* pWal = pData->pWal;
|
||||||
|
return walGetFirstVer(pWal);
|
||||||
|
}
|
||||||
|
|
||||||
// for debug -----------------
|
// for debug -----------------
|
||||||
void logStorePrint(SSyncLogStore* pLogStore) {
|
void logStorePrint(SSyncLogStore* pLogStore) {
|
||||||
char* serialized = logStore2Str(pLogStore);
|
char* serialized = logStore2Str(pLogStore);
|
||||||
|
|
|
@ -151,8 +151,8 @@ int32_t syncNodeAppendEntriesPeersSnapshot(SSyncNode* pSyncNode) {
|
||||||
if ((syncNodeIsIndexInSnapshot(pSyncNode, nextIndex - 1) && !snapshotSendingFinish) ||
|
if ((syncNodeIsIndexInSnapshot(pSyncNode, nextIndex - 1) && !snapshotSendingFinish) ||
|
||||||
syncNodeIsIndexInSnapshot(pSyncNode, nextIndex)) {
|
syncNodeIsIndexInSnapshot(pSyncNode, nextIndex)) {
|
||||||
// will send this msg until snapshot receive finish!
|
// will send this msg until snapshot receive finish!
|
||||||
SSnapshot snapshot;
|
|
||||||
pSyncNode->pFsm->FpGetSnapshot(pSyncNode->pFsm, &snapshot);
|
SSnapshot snapshot = pSender->snapshot;
|
||||||
sInfo("nextIndex:%ld in snapshot: <lastApplyIndex:%ld, lastApplyTerm:%lu>, begin snapshot", nextIndex,
|
sInfo("nextIndex:%ld in snapshot: <lastApplyIndex:%ld, lastApplyTerm:%lu>, begin snapshot", nextIndex,
|
||||||
snapshot.lastApplyIndex, snapshot.lastApplyTerm);
|
snapshot.lastApplyIndex, snapshot.lastApplyTerm);
|
||||||
|
|
||||||
|
@ -162,6 +162,9 @@ int32_t syncNodeAppendEntriesPeersSnapshot(SSyncNode* pSyncNode) {
|
||||||
preLogIndex = snapshot.lastApplyIndex;
|
preLogIndex = snapshot.lastApplyIndex;
|
||||||
preLogTerm = snapshot.lastApplyTerm;
|
preLogTerm = snapshot.lastApplyTerm;
|
||||||
|
|
||||||
|
// update next index!
|
||||||
|
syncIndexMgrSetIndex(pSyncNode->pNextIndex, pDestId, snapshot.lastApplyIndex + 1);
|
||||||
|
|
||||||
// to claim leader
|
// to claim leader
|
||||||
SyncAppendEntries* pMsg = syncAppendEntriesBuild(0, pSyncNode->vgId);
|
SyncAppendEntries* pMsg = syncAppendEntriesBuild(0, pSyncNode->vgId);
|
||||||
assert(pMsg != NULL);
|
assert(pMsg != NULL);
|
||||||
|
|
|
@ -41,6 +41,8 @@ SSyncSnapshotSender *snapshotSenderCreate(SSyncNode *pSyncNode, int32_t replicaI
|
||||||
pSender->pSyncNode = pSyncNode;
|
pSender->pSyncNode = pSyncNode;
|
||||||
pSender->replicaIndex = replicaIndex;
|
pSender->replicaIndex = replicaIndex;
|
||||||
pSender->term = pSyncNode->pRaftStore->currentTerm;
|
pSender->term = pSyncNode->pRaftStore->currentTerm;
|
||||||
|
pSender->pSyncNode->pFsm->FpGetSnapshot(pSender->pSyncNode->pFsm, &(pSender->snapshot));
|
||||||
|
|
||||||
pSender->finish = false;
|
pSender->finish = false;
|
||||||
} else {
|
} else {
|
||||||
sInfo("snapshotSenderCreate cannot create sender");
|
sInfo("snapshotSenderCreate cannot create sender");
|
||||||
|
|
Loading…
Reference in New Issue