refactor(sync): SyncAppendEntries
This commit is contained in:
parent
39d0b652ba
commit
d72d2d698c
|
@ -144,6 +144,7 @@ typedef struct SSyncLogStore {
|
||||||
|
|
||||||
// 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);
|
||||||
|
|
|
@ -469,6 +469,8 @@ static int32_t syncNodeMakeLogSame(SSyncNode* ths, SyncAppendEntries* pMsg) {
|
||||||
// delete confict entries
|
// delete confict entries
|
||||||
code = ths->pLogStore->syncLogTruncate(ths->pLogStore, delBegin);
|
code = ths->pLogStore->syncLogTruncate(ths->pLogStore, delBegin);
|
||||||
ASSERT(code == 0);
|
ASSERT(code == 0);
|
||||||
|
sInfo("syncNodeMakeLogSame, from %ld to %ld", delBegin, delEnd);
|
||||||
|
logStoreSimpleLog2("after syncNodeMakeLogSame", ths->pLogStore);
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -495,19 +497,30 @@ 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) {
|
||||||
|
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) {
|
||||||
|
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 (pMsg->prevLogIndex <= myLastIndex && pMsg->prevLogTerm == myPreLogTerm) {
|
if (pMsg->prevLogIndex <= myLastIndex && pMsg->prevLogTerm == myPreLogTerm) {
|
||||||
|
sTrace(
|
||||||
|
"syncNodeOnAppendEntriesLogOK true, pMsg->prevLogIndex:%ld, myLastIndex:%ld, pMsg->prevLogTerm:%lu, "
|
||||||
|
"myPreLogTerm:%lu",
|
||||||
|
pMsg->prevLogIndex, myLastIndex, pMsg->prevLogTerm, myPreLogTerm);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sTrace(
|
||||||
|
"syncNodeOnAppendEntriesLogOK false, pMsg->prevLogIndex:%ld, myLastIndex:%ld, pMsg->prevLogTerm:%lu, "
|
||||||
|
"myPreLogTerm:%lu",
|
||||||
|
pMsg->prevLogIndex, myLastIndex, pMsg->prevLogTerm, myPreLogTerm);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +530,8 @@ int32_t syncNodeOnAppendEntriesSnapshotCb(SSyncNode* ths, SyncAppendEntries* pMs
|
||||||
|
|
||||||
// print log
|
// print log
|
||||||
char logBuf[128] = {0};
|
char logBuf[128] = {0};
|
||||||
snprintf(logBuf, sizeof(logBuf), "recv SyncAppendEntries, term:%lu", ths->pRaftStore->currentTerm);
|
snprintf(logBuf, sizeof(logBuf), "recv SyncAppendEntries, vgId:%d, term:%lu", ths->vgId,
|
||||||
|
ths->pRaftStore->currentTerm);
|
||||||
syncAppendEntriesLog2(logBuf, pMsg);
|
syncAppendEntriesLog2(logBuf, pMsg);
|
||||||
|
|
||||||
// if I am standby, to be added into a raft group, I should process SyncAppendEntries msg
|
// if I am standby, to be added into a raft group, I should process SyncAppendEntries msg
|
||||||
|
@ -551,6 +565,8 @@ int32_t syncNodeOnAppendEntriesSnapshotCb(SSyncNode* ths, SyncAppendEntries* pMs
|
||||||
do {
|
do {
|
||||||
bool condition = pMsg->term == ths->pRaftStore->currentTerm && ths->state == TAOS_SYNC_STATE_CANDIDATE;
|
bool condition = pMsg->term == ths->pRaftStore->currentTerm && ths->state == TAOS_SYNC_STATE_CANDIDATE;
|
||||||
if (condition) {
|
if (condition) {
|
||||||
|
sTrace("recv SyncAppendEntries, candidate to follower");
|
||||||
|
|
||||||
syncNodeBecomeFollower(ths);
|
syncNodeBecomeFollower(ths);
|
||||||
// do not reply?
|
// do not reply?
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -586,6 +602,12 @@ int32_t syncNodeOnAppendEntriesSnapshotCb(SSyncNode* ths, SyncAppendEntries* pMs
|
||||||
bool condition = condition1 || condition2 || condition3;
|
bool condition = condition1 || condition2 || condition3;
|
||||||
|
|
||||||
if (condition) {
|
if (condition) {
|
||||||
|
sTrace(
|
||||||
|
"recv SyncAppendEntries, fake match, myLastIndex:%ld, syncLogBeginIndex:%ld, syncLogEndIndex:%ld, "
|
||||||
|
"condition1:%d, condition2:%d, condition3:%d",
|
||||||
|
myLastIndex, ths->pLogStore->syncLogBeginIndex(ths->pLogStore),
|
||||||
|
ths->pLogStore->syncLogEndIndex(ths->pLogStore), condition1, condition2, condition3);
|
||||||
|
|
||||||
// prepare response msg
|
// prepare response msg
|
||||||
SyncAppendEntriesReply* pReply = syncAppendEntriesReplyBuild(ths->vgId);
|
SyncAppendEntriesReply* pReply = syncAppendEntriesReplyBuild(ths->vgId);
|
||||||
pReply->srcId = ths->myRaftId;
|
pReply->srcId = ths->myRaftId;
|
||||||
|
@ -623,6 +645,12 @@ int32_t syncNodeOnAppendEntriesSnapshotCb(SSyncNode* ths, SyncAppendEntries* pMs
|
||||||
bool condition = condition1 || condition2;
|
bool condition = condition1 || condition2;
|
||||||
|
|
||||||
if (condition) {
|
if (condition) {
|
||||||
|
sTrace(
|
||||||
|
"recv SyncAppendEntries, not match, syncLogBeginIndex:%ld, syncLogEndIndex:%ld, condition1:%d, "
|
||||||
|
"condition2:%d, logOK:%d",
|
||||||
|
ths->pLogStore->syncLogBeginIndex(ths->pLogStore), ths->pLogStore->syncLogEndIndex(ths->pLogStore),
|
||||||
|
condition1, condition2, logOK);
|
||||||
|
|
||||||
// prepare response msg
|
// prepare response msg
|
||||||
SyncAppendEntriesReply* pReply = syncAppendEntriesReplyBuild(ths->vgId);
|
SyncAppendEntriesReply* pReply = syncAppendEntriesReplyBuild(ths->vgId);
|
||||||
pReply->srcId = ths->myRaftId;
|
pReply->srcId = ths->myRaftId;
|
||||||
|
@ -660,6 +688,9 @@ int32_t syncNodeOnAppendEntriesSnapshotCb(SSyncNode* ths, SyncAppendEntries* pMs
|
||||||
// has entries in SyncAppendEntries msg
|
// has entries in SyncAppendEntries msg
|
||||||
bool hasAppendEntries = pMsg->dataLen > 0;
|
bool hasAppendEntries = pMsg->dataLen > 0;
|
||||||
|
|
||||||
|
sTrace("recv SyncAppendEntries, match, myLastIndex:%ld, hasExtraEntries:%d, hasAppendEntries:%d", myLastIndex,
|
||||||
|
hasExtraEntries, hasAppendEntries);
|
||||||
|
|
||||||
if (hasExtraEntries) {
|
if (hasExtraEntries) {
|
||||||
// make log same, rollback deleted entries
|
// make log same, rollback deleted entries
|
||||||
code = syncNodeMakeLogSame(ths, pMsg);
|
code = syncNodeMakeLogSame(ths, pMsg);
|
||||||
|
|
|
@ -56,6 +56,8 @@ static int32_t raftLogSetBeginIndex(struct SSyncLogStore* pLogStore, SyncIndex b
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t raftLogResetBeginIndex(struct SSyncLogStore* pLogStore) { 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;
|
||||||
|
|
Loading…
Reference in New Issue