Comments (5)
该方法是作为leader才会调用,“❓”处我觉得会使得这个leader自己election timeout,确切地说作为leader没有什么办法可以reset这个ticker中的election timeout。
electionTimer 和 heartbeatTimer 是两个 timer 呀?为什么要在心跳函数里面 reset election 的 timer 呢?
from mit6.824-2021.
该方法是作为leader才会调用,“❓”处我觉得会使得这个leader自己election timeout,确切地说作为leader没有什么办法可以reset这个ticker中的election timeout。
electionTimer 和 heartbeatTimer 是两个 timer 呀?为什么要在心跳函数里面 reset election 的 timer 呢?
抱歉我没有表述清楚。我的意思是作为leader,它的electiontimeout也是会到期的
您的ticker()
代码中:
case <-rf.electionTimer.C:
rf.mu.Lock()
rf.ChangeState(StateCandidate)
rf.currentTerm += 1
rf.StartElection()
rf.electionTimer.Reset(RandomizedElectionTimeout())
rf.mu.Unlock()
当作为leader的时候electionTimer到期了,也会进行选举,那么2A的test中会有这样的输出:warning: term changed even though there were no failures
(TestInitialElection2A
中44行)
我想了一段时间做了一点修改,只有在非leader的时候才会调用startElection()
,参考了raft论文中的Figure 4:
case <-rf.electionTimer.C: // 选举时间超时,则开始选举,这个过程参考Figure 2的"Rules for Servers"
rf.mu.Lock()
if Leader != rf.state {
rf.currentTerm++
rf.changeState(Candidate)
rf.startElection()
//todo 重要修正: https://github.com/OneSizeFitsQuorum/MIT6.824-2021/issues/15
rf.electionTimer.Reset(ElectionTimeOut())
}
rf.mu.Unlock()
原因是作为leader进行BroadcastHeartbeat
时是排除了自己的
if peer == rf.me {
continue
}
于是leader自己也会election timeout,然后成为candidate。但是Figure 4中并没有Leader直接转换为Candidate的箭头。
还改了一个地方,是您的startElection()
中的:
if response.VoteGranted {
grantedVotes += 1
if grantedVotes > len(rf.peers)/2 {
DPrintf("{Node %v} receives majority votes in term %v", rf.me, rf.currentTerm)
rf.ChangeState(StateLeader)
rf.BroadcastHeartbeat(true)
rf.heartbeatTimer.Reset(HeartbeatTimeOut()) //❗这是我多加的代码
}
}
多添加的原因是,选举成为Leader之前,ticker中的heartbeat timeout会耗尽,且不会reset,这是因为成为leader之前不是leader,于是不会执行if rf.state == StateLeader:
:
case <-rf.heartbeatTimer.C:
rf.mu.Lock()
if rf.state == StateLeader {
rf.BroadcastHeartbeat(true)
rf.heartbeatTimer.Reset(StableHeartbeatTimeout())
}
rf.mu.Unlock()
于是,在Make()
中初始化时设置的那个heartbeat timeout之后,就再也不会重channel中收到heartbeat timeout了,即使选举成为leader,也只会执行一次rf.BroadcastHeartbeat(true)
,即选举成功时执行的那次。这也是我添加那行的原因:重新“激活”heartbeat timeout。
from mit6.824-2021.
在成为 leader 之后我会将 electionTimer 停掉的。你是不是只看了我文档中的部分代码。。。
func (rf *Raft) ChangeState(state NodeState) {
if rf.state == state {
return
}
DPrintf("{Node %d} changes state from %s to %s in term %d", rf.me, rf.state, state, rf.currentTerm)
rf.state = state
switch state {
case StateFollower:
rf.heartbeatTimer.Stop()
rf.electionTimer.Reset(RandomizedElectionTimeout())
case StateCandidate:
case StateLeader:
lastLog := rf.getLastLog()
for i := 0; i < len(rf.peers); i++ {
rf.matchIndex[i], rf.nextIndex[i] = 0, lastLog.Index+1
}
rf.electionTimer.Stop()
rf.heartbeatTimer.Reset(StableHeartbeatTimeout())
}
}
from mit6.824-2021.
在成为 leader 之后我会将 electionTimer 停掉的。你是不是只看了我文档中的部分代码。。。
明白了,谢谢大佬解答😄!确实没有注意到有ChangeState的实现🤣
from mit6.824-2021.
在成为 leader 之后我会将 electionTimer 停掉的。你是不是只看了我文档中的部分代码。。。
func (rf *Raft) ChangeState(state NodeState) { if rf.state == state { return } DPrintf("{Node %d} changes state from %s to %s in term %d", rf.me, rf.state, state, rf.currentTerm) rf.state = state switch state { case StateFollower: rf.heartbeatTimer.Stop() rf.electionTimer.Reset(RandomizedElectionTimeout()) case StateCandidate: case StateLeader: lastLog := rf.getLastLog() for i := 0; i < len(rf.peers); i++ { rf.matchIndex[i], rf.nextIndex[i] = 0, lastLog.Index+1 } rf.electionTimer.Stop() rf.heartbeatTimer.Reset(StableHeartbeatTimeout()) } }
大佬,在成为了 leader 后 调用relectionTImer.Stop,但是在 ticker 中不是又继续执行了 reset 吗?
from mit6.824-2021.
Related Issues (20)
- 求一份源码 HOT 1
- 求一份源代码 HOT 1
- 求一份源代码 HOT 1
- 求一份源代码
- AppendEntries和handleAppendEntriesResponse中,response.Term=0的情况 HOT 1
- 求一份源代码 HOT 1
- 求源码 HOT 1
- 关于日志复制的一点问题 HOT 1
- 求源码 HOT 1
- 求一份源码学习 HOT 1
- 你好,可以发一份源码吗?我有些地方不太明白。[email protected] HOT 1
- 求源码 HOT 8
- Lab2 的日志复制线程模型可能会导致 2D Test 超时 HOT 1
- 大佬求发一份源码!快被这个项目搞奔溃了 HOT 2
- follower 拒绝过期 SnapShot 导致 follower 日志过长 HOT 2
- 请教大佬,在2B日志复制中,具有相同日志的节点中,大部分都已经commit并提交了,但是碰巧暂时没有提交的竞选成功。 HOT 3
- 大佬,请问lab4b中一个raft节点就有一个shardkv吗?比如一个group组,下面有一个raft集群,共有5个raft节点,则共有5个shardkv,但是只有一个leader节点的shardkv对外提供服务吗? HOT 3
- 请教一下关于 leader 选举的问题 HOT 2
- 大佬求一份源碼!謝謝! HOT 1
- 大佬 求一份代码谢谢 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from mit6.824-2021.