当前位置:网站首页>Etcd database source code analysis -- starting from the start function of raftnode
Etcd database source code analysis -- starting from the start function of raftnode
2022-07-07 06:26:00 【Tertium FATUM】
As shown in the figure above ,raftNode It's real manipulation ETCD RAFT API Module , act as etcd-raft The bridge between modules and upper modules , It defines the following members . among msgSnapC Channels are used to receive and send snapshots 、applyc The channel is used to send... To be applied Entry Record 、readStateC It is used to send ReadState、ticker Used to direct to raft The module sends timing pulses tick、td It is used to detect whether two heartbeat messages sent to the same node timeout .raftNodeConfig Let's talk about it later , This article mainly explains ticker modular .
type raftNode struct {
lg *zap.Logger
tickMu *sync.Mutex
raftNodeConfig
msgSnapC chan raftpb.Message // a chan to send/receive snapshot
applyc chan toApply // a chan to send out apply
readStateC chan raft.ReadState // a chan to send out readState
ticker *time.Ticker // utility
td *contention.TimeoutDetector // contention detectors for raft heartbeat message
stopped chan struct{
}
done chan struct{
}
}
initialization raftNode The function of the structure is newRaftNode,raftNodeConfig Contains the initialized network transport、 Prewrite log Storage、raftStorage And most importantly raft modular , These modules provide corresponding interfaces to raftnode Use to help complete raft log send out 、 Persistence 、 Most functions such as replication .
func newRaftNode(cfg raftNodeConfig) *raftNode {
raft.SetLogger(lg) // initialization logger( A little )
r := &raftNode{
lg: cfg.lg, tickMu: new(sync.Mutex),
raftNodeConfig: cfg, td: contention.NewTimeoutDetector(2 * cfg.heartbeat), // set up contention detectors for raft heartbeat message. expect to send a heartbeat within 2 heartbeat intervals.
readStateC: make(chan raft.ReadState, 1),
msgSnapC: make(chan raftpb.Message, maxInFlightMsgSnap),
applyc: make(chan toApply),
stopped: make(chan struct{
}), done: make(chan struct{
}),
}
// Here's the point
if r.heartbeat == 0 {
r.ticker = &time.Ticker{
} // If heartbeat zero , Use default &time.Ticker{}
} else {
r.ticker = time.NewTicker(r.heartbeat) } // otherwise , You need to set the time interval as r.heartbeat
return r
}
start Function will start a coroutine to run the main business logic , Here we will see if the timer expires ,select This channel will be detected , call raftNode Interface tick function . The tick Function gets tickMu lock , And then call Node Interface provided Tick function , That's what this is raft.Node Provided Tick function .
func (r *raftNode) start(rh *raftReadyHandler) {
internalTimeout := time.Second
go func() {
defer r.onStop()
islead := false
for {
select {
case <-r.ticker.C:
r.tick()
// raft.Node does not have locks in Raft package
func (r *raftNode) tick() {
r.tickMu.Lock()
r.Tick()
r.tickMu.Unlock()
}
raft.Node Provided Tick The function will be directed to n.tickc Write struct{}{}, And in the raft.Node There will be coordination execution run function , As shown in figure, raft.Node Of run As shown in the process , It will perform monitoring n.tickc Channel code , And then execute n.rn.Tick()
. And here n.rn.Tick()
Execution is rawnode Included members raft Structure of the Tick Member functions , This function will be based on raft Roles perform different tick function :tickElection or tickHeartbeat.
// Tick advances the internal logical clock by a single tick.
func (rn *RawNode) Tick() {
rn.raft.tick()
}
边栏推荐
- 缓存在高并发场景下的常见问题
- Jmeter自带函数不够用?不如自己动手开发一个
- 693. 行程排序
- string(讲解)
- 计算模型 FPS
- Common problems of caching in high concurrency scenarios
- postgresql 数据库 timescaledb 函数time_bucket_gapfill()报错解决及更换 license
- 博士申请 | 上海交通大学自然科学研究院洪亮教授招收深度学习方向博士生
- Jcmd of JVM command: multifunctional command line
- Developers don't miss it! Oar hacker marathon phase III chain oar track registration opens
猜你喜欢
@Detailed differences between pathvariable and @requestparam
Matlab / envi principal component analysis implementation and result analysis
FlexRay通信协议概述
jmeter 函数助手 — — 随机值、随机字符串、 固定值随机提取
Jstack of JVM command: print thread snapshots in JVM
laravel 使用腾讯云 COS5全教程
Doctoral application | Professor Hong Liang, Academy of natural sciences, Shanghai Jiaotong University, enrolls doctoral students in deep learning
2022 Android interview essential knowledge points, a comprehensive summary
[FPGA tutorial case 14] design and implementation of FIR filter based on vivado core
What are the classic database questions in the interview?
随机推荐
Markdown 并排显示图片
当我们谈论不可变基础设施时,我们在谈论什么
基于FPGA的VGA协议实现
Experience of Niuke SQL
Array proof during st table preprocessing
Software testing knowledge reserve: how much do you know about the basic knowledge of "login security"?
MySQL(十)
安装VMmare时候提示hyper-v / device defender 侧通道安全性
拼多多败诉:“砍价免费拿”侵犯知情权但不构成欺诈,被判赔400元
进程间通信之共享内存
Apple CMS V10 template /mxone Pro adaptive film and television website template
Ha Qu projection dark horse posture, only half a year to break through the 1000 yuan projector market!
UIC(组态UI工程)公版文件库新增7款行业素材
JVM in-depth
Markdown displays pictures side by side
Wechat applet hides the progress bar component of the video tag
Knight defeats demon king (Backpack & DP)
Go language learning notes - Gorm use - native SQL, named parameters, rows, tosql | web framework gin (IX)
Ctfshow-- common posture
How to use wechat cloud hosting or cloud functions for cloud development of unapp development applet