当前位置:网站首页>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 .
边栏推荐
- SPH中的粒子初始排列问题(两张图解决)
- [Jianzhi offer] 6-10 questions
- Principle of lazy loading of pictures
- 位运算符讲解
- Pict generate orthogonal test cases tutorial
- List related knowledge points to be sorted out
- 该如何去选择证券公司,手机上开户安不安全
- One of the commonly used technical indicators, reading boll Bollinger line indicators
- CTF competition problem solution STM32 reverse introduction
- Redis introduction complete tutorial: detailed explanation of ordered collection
猜你喜欢
Redis入门完整教程:有序集合详解
Redis入门完整教程:Pipeline
【剑指offer】1-5题
Complete tutorial for getting started with redis: bitmaps
One of the commonly used technical indicators, reading boll Bollinger line indicators
heatmap. JS picture hotspot heat map plug-in
Compare two vis in LabVIEW
[machine learning] handwritten digit recognition
MariaDB's Galera cluster application scenario -- multi master and multi active databases
MariaDB的Galera集群应用场景--数据库多主多活
随机推荐
A mining of edu certificate station
Basic knowledge of database
机器学习在房屋价格预测上的应用
Insert sort, select sort, bubble sort
为什么信息图会帮助你的SEO
Examples of time (calculation) total tools: start time and end time of this year, etc
P2181 对角线和P1030 [NOIP2001 普及组] 求先序排列
[Jianzhi offer] 6-10 questions
微信公众号解决从自定义菜单进入的缓存问题
debug和release的区别
【taichi】用最少的修改将太极的pbf2d(基于位置的流体模拟)改为pbf3d
CTF競賽題解之stm32逆向入門
UML图记忆技巧
JS 3D explosive fragment image switching JS special effect
PICT 生成正交测试用例教程
[Taichi] change pbf2d (position based fluid simulation) of Taiji to pbf3d with minimal modification
一次edu证书站的挖掘
Editplus-- usage -- shortcut key / configuration / background color / font size
智力考验看成语猜古诗句微信小程序源码
A complete tutorial for getting started with redis: redis usage scenarios