当前位置:网站首页>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()
}
边栏推荐
- ICML 2022 | explore the best architecture and training method of language model
- How to set up in touch designer 2022 to solve the problem that leap motion is not recognized?
- Audio distortion analysis of DSP and DAC based on adau1452
- C interview 24 (pointer) define a double array with 20 elements a
- C language sorting (to be updated)
- 哈趣投影黑馬之姿,僅用半年强勢突圍千元投影儀市場!
- jmeter 函数助手 — — 随机值、随机字符串、 固定值随机提取
- 直击2022ECDC萤石云开发者大会:携手千百行业加速智能升级
- Jmeter自带函数不够用?不如自己动手开发一个
- C language (structure) defines a user structure with the following fields:
猜你喜欢
面试中有哪些经典的数据库问题?
laravel 使用腾讯云 COS5全教程
[FPGA tutorial case 14] design and implementation of FIR filter based on vivado core
如何在Touch Designer 2022版中设置解决Leap Motion不识别的问题?
You don't know the complete collection of recruitment slang of Internet companies
蚂蚁庄园安全头盔 7.8蚂蚁庄园答案
Deep clustering: joint optimization of depth representation learning and clustering
[FPGA] EEPROM based on I2C
ETCD数据库源码分析——从raftNode的start函数说起
进程间通信之共享内存
随机推荐
[shell] summary of common shell commands and test judgment statements
2022Android面试必备知识点,一文全面总结
软件测试知识储备:关于「登录安全」的基础知识,你了解多少?
【OpenCV】形态学滤波(2):开运算、形态学梯度、顶帽、黑帽
Dc-7 target
Experience sharing of contribution of "management world"
Subghz, lorawan, Nb IOT, Internet of things
Redis(二)—Redis通用命令
对称的二叉树【树的遍历】
缓存在高并发场景下的常见问题
【GNN】图解GNN: A gentle introduction(含视频)
Ant manor safety helmet 7.8 ant manor answer
JWT 认证
Crudini 配置文件编辑工具
Redis(一)——初识Redis
Qtthread, one of many methods of QT multithreading
生活中的开销,怎么记账合适
JVM monitoring and diagnostic tools - command line
程序员的日常 | 每日趣闻
C语言面试 写一个函数查找两个字符串中的第一个公共字符串