Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lab3 #13

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open

Lab3 #13

Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 78 additions & 12 deletions raft/raft.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,9 +113,18 @@ func (raft *Raft) followerSelect() {
Term: raft.currentTerm,
}

log.Printf("[FOLLOWER] Vote denied to '%v' for term '%v'.\n", raft.peers[rv.CandidateID], raft.currentTerm)
if raft.currentTerm < rv.Term {
raft.currentTerm = rv.Term
raft.votedFor = rv.CandidateID
reply.VoteGranted = true
log.Printf("[FOLLOWER] Vote accept to '%v' for term '%v'.\n", raft.peers[rv.CandidateID], raft.currentTerm)
raft.resetElectionTimeout()

} else {
reply.VoteGranted = false
log.Printf("[FOLLOWER] Vote denied to '%v' for term '%v'.\n", raft.peers[rv.CandidateID], raft.currentTerm)
}

reply.VoteGranted = false
rv.replyChan <- reply
break
// END OF MODIFY //
Expand All @@ -128,8 +137,17 @@ func (raft *Raft) followerSelect() {
Term: raft.currentTerm,
}

log.Printf("[FOLLOWER] Accept AppendEntry from '%v'.\n", raft.peers[ae.LeaderID])
reply.Success = true
if raft.currentTerm <= ae.Term {
raft.currentTerm = ae.Term
reply.Success = true
log.Printf("[FOLLOWER] Accept AppendEntry from '%v'.\n", raft.peers[ae.LeaderID])
raft.resetElectionTimeout()

} else {
reply.Success = false
log.Printf("[FOLLOWER] Denied AppendEntry from '%v'.\n", raft.peers[ae.LeaderID])
}

ae.replyChan <- reply
break
// END OF MODIFY //
Expand Down Expand Up @@ -167,13 +185,25 @@ func (raft *Raft) candidateSelect() {
// MODIFY HERE //

if rvr.VoteGranted {
log.Printf("[CANDIDATE] Vote granted by '%v'.\n", raft.peers[rvr.peerIndex])
voteCount++
log.Printf("[CANDIDATE] Vote granted by '%v'.\n", raft.peers[rvr.peerIndex])
log.Println("[CANDIDATE] VoteCount: ", voteCount)
if voteCount > len(raft.peers)/2{
log.Printf("[CANDIDATE] Stepping up.\n")
raft.currentState.Set(leader)
return
}
break
}
log.Printf("[CANDIDATE] Vote denied by '%v'.\n", raft.peers[rvr.peerIndex])

log.Printf("[CANDIDATE] Vote denied by '%v'.\n", raft.peers[rvr.peerIndex])
if raft.currentTerm < rvr.Term{
log.Printf("[CANDIDATE] Stepping down.\n")
raft.currentTerm = rvr.Term
raft.currentState.Set(follower)
return
}

// END OF MODIFY //
///////////////////

Expand All @@ -184,10 +214,21 @@ func (raft *Raft) candidateSelect() {
Term: raft.currentTerm,
}

log.Printf("[CANDIDATE] Vote denied to '%v' for term '%v'.\n", raft.peers[rv.CandidateID], raft.currentTerm)
reply.VoteGranted = false
if rv.Term <= raft.currentTerm{
log.Printf("[CANDIDATE] Vote denied to '%v' for term '%v'.\n", raft.peers[rv.CandidateID], raft.currentTerm)
reply.VoteGranted = false
rv.replyChan <- reply
break
}

log.Printf("[CANDIDATE] Vote accept to '%v' for term '%v'.\n", raft.peers[rv.CandidateID], raft.currentTerm)
reply.VoteGranted = true
rv.replyChan <- reply
break
log.Printf("[CANDIDATE] Stepping down.\n")
raft.currentTerm = rv.Term
raft.currentState.Set(follower)
return

// END OF MODIFY //
///////////////////

Expand All @@ -198,8 +239,18 @@ func (raft *Raft) candidateSelect() {
Term: raft.currentTerm,
}

log.Printf("[CANDIDATE] Accept AppendEntry from '%v'.\n", raft.peers[ae.LeaderID])
reply.Success = true
if raft.currentTerm <= ae.Term {
log.Printf("[CANDIDATE] Accept AppendEntry from '%v'.\n", raft.peers[ae.LeaderID])
reply.Success = true
ae.replyChan <- reply
log.Printf("[CANDIDATE] Stepping down.\n")
raft.currentTerm = ae.Term
raft.currentState.Set(follower)
return
}

log.Printf("[CANDIDATE] Denied AppendEntry from '%v'.\n", raft.peers[ae.LeaderID])
reply.Success = false
ae.replyChan <- reply
break
// END OF MODIFY //
Expand Down Expand Up @@ -234,7 +285,12 @@ func (raft *Raft) leaderSelect() {
case aet := <-replyChan:
///////////////////
// MODIFY HERE //
_ = aet
if !aet.Success && raft.currentTerm < aet.Term{
log.Printf("[LEADER] Stepping down.\n")
raft.currentTerm = aet.Term
raft.currentState.Set(follower)
return
}
// END OF MODIFY //
///////////////////
case rv := <-raft.requestVoteChan:
Expand All @@ -245,6 +301,16 @@ func (raft *Raft) leaderSelect() {
Term: raft.currentTerm,
}

if raft.currentTerm < rv.Term {
log.Printf("[LEADER] Vote accept to '%v' for term '%v'.\n", raft.peers[rv.CandidateID], raft.currentTerm)
reply.VoteGranted = true
rv.replyChan <- reply
log.Printf("[LEADER] Stepping down.\n")
raft.currentTerm = rv.Term
raft.currentState.Set(follower)
return
}

log.Printf("[LEADER] Vote denied to '%v' for term '%v'.\n", raft.peers[rv.CandidateID], raft.currentTerm)
reply.VoteGranted = false
rv.replyChan <- reply
Expand Down