当前位置:网站首页>Etcd database source code analysis - brief process of processing entry records
Etcd database source code analysis - brief process of processing entry records
2022-07-04 23:16:00 【Tertium FATUM】
(1) When the client etcd After the cluster sends a request , Encapsulation in request Entry Records will be submitted to etcd-raft Module processing , among ,etcd-raft The module will first Entry Record saved to raftLog.unstable in .
We use ETCD Database source code analysis —— Server side PUT technological process For example ,kvServer Structure Put Function processing flow is as follows : First, all aspects of the request message will be checked , After checking, all the requests will be sent to the encapsulated RaftKV Interface for processing , After receiving the response message after the processing is completed , Will pass header.fill() Method to fill in the header information of the response , Finally, the complete response message is returned to the client . therefore , Track down srv.(KVServer).Put(ctx, in) In fact, it's called (s *EtcdServer) Put() function .
from raftRequestOnce The process sees that the final call is (s *EtcdServer) processInternalRaftRequestOnce(…) function , There is a key call in this function s.r.Propose(cctx, data).s yes EtcdServer, r Is its member variable raftNode, That's getting into raft The rhythm of the agreement . Through to Propose Function trace , We can see that the final function comes stepWithWaitOption
// raft/node.go
func (n *node) Propose(ctx context.Context, data []byte) error {
return n.stepWait(ctx, pb.Message{
Type: pb.MsgProp, Entries: []pb.Entry{
{
Data: data}}}) } // Here to Message Combined with the Type by pb.MsgProp,Entry For newcomers PutRequest
func (n *node) stepWait(ctx context.Context, m pb.Message) error {
return n.stepWithWaitOption(ctx, m, true) }
// Step advances the state machine using msgs. The ctx.Err() will be returned, if any.
func (n *node) stepWithWaitOption(ctx context.Context, m pb.Message, wait bool) error {
if m.Type != pb.MsgProp {
// It won't go here
select {
case n.recvc <- m: return nil
case <-ctx.Done(): return ctx.Err()
case <-n.done: return ErrStopped
}
}
ch := n.propc // Take out node Provided by the structure propc passageway
pm := msgWithResult{
m: m}
if wait {
pm.result = make(chan error, 1) }
select {
case ch <- pm: if !wait {
return nil } // Will have msg Of pm The structure is placed in propc passageway
case <-ctx.Done(): return ctx.Err()
case <-n.done: return ErrStopped
}
select {
case err := <-pm.result:
if err != nil {
return err }
case <-ctx.Done(): return ctx.Err()
case <-n.done: return ErrStopped
}
return nil
}
from raft/node.go Of run The function shows , When from propc Take it out of the channel msgWithResult, Taking messages out of it msg, Set up msg The source node of is this node id. And then call raft Modular Step Function driven state machine .
(2)etcd-raft The module will Entry The record is encapsulated into the above Ready In the example , Return to the upper module for persistence .
(3) When the upper module receives the to be persisted Entry After recording , It will be recorded to WAL Log file , And then do the persistence operation , The final notice etcd-raft Module processing .
(4) here etcd-raft The module will put this Entry Record from unstable Move to storage Kept in .
(5) To be Entry When records are copied to more than half of the nodes in the cluster , The Entry The record will be Leader The node is confirmed as submitted (committed), And encapsulate it into Ready The instance is returned to the upper module .
(6) At this time, the upper module can transfer the Ready To be applied carried in the instance Entry Records are applied to the state machine .
边栏推荐
- Google collab trample pit
- Redis入门完整教程:Pipeline
- Excel 快捷键-随时补充
- 云服务器设置ssh密钥登录
- colResizable. JS auto adjust table width plug-in
- SPH中的粒子初始排列问题(两张图解决)
- 【ODX Studio编辑PDX】-0.3-如何删除/修改Variant变体中继承的(Inherited)元素
- Redis getting started complete tutorial: publish and subscribe
- A complete tutorial for getting started with redis: transactions and Lua
- Header file duplicate definition problem solving "c1014 error“
猜你喜欢
Editplus-- usage -- shortcut key / configuration / background color / font size
Complete tutorial for getting started with redis: bitmaps
Redis入门完整教程:键管理
Talk about Middleware
Redis getting started complete tutorial: Geo
Redis getting started complete tutorial: publish and subscribe
One of the commonly used technical indicators, reading boll Bollinger line indicators
高通WLAN框架学习(30)-- 支持双STA的组件
Redis: redis message publishing and subscription (understand)
Analysis of the self increasing and self decreasing of C language function parameters
随机推荐
ScriptableObject
高配笔记本使用CAD搬砖时卡死解决记录
A complete tutorial for getting started with redis: understanding and using APIs
Redis入门完整教程:集合详解
Analysis of the self increasing and self decreasing of C language function parameters
【剑指offer】1-5题
该如何去选择证券公司,手机上开户安不安全
Principle of lazy loading of pictures
HMS core unified scanning service
Common methods in string class
Qt加法计算器(简单案例)
Redis入门完整教程:Redis Shell
MySQL数据库备份与恢复--mysqldump命令
Phpcms paid reading function Alipay payment
Application of machine learning in housing price prediction
P2181 diagonal and p1030 [noip2001 popularization group] arrange in order
The difference between cout/cerr/clog
Redis入门完整教程:哈希说明
机器学习在房屋价格预测上的应用
法国学者:最优传输理论下对抗攻击可解释性探讨