TinyKv流程梳理三

split流程

处理协程启动

func (bs *Raftstore) startWorkers(peers []*peer) {ctx := bs.ctxworkers := bs.workersrouter := bs.routerbs.wg.Add(2) // raftWorker, storeWorkerrw := newRaftWorker(ctx, router)go rw.run(bs.closeCh, bs.wg)sw := newStoreWorker(ctx, bs.storeState)go sw.run(bs.closeCh, bs.wg)router.sendStore(message.Msg{Type: message.MsgTypeStoreStart, Data: ctx.store})for i := 0; i < len(peers); i++ {regionID := peers[i].regionId_ = router.send(regionID, message.Msg{RegionID: regionID, Type: message.MsgTypeStart})}engines := ctx.enginecfg := ctx.cfgworkers.splitCheckWorker.Start(runner.NewSplitCheckHandler(engines.Kv, NewRaftstoreRouter(router), cfg))workers.regionWorker.Start(runner.NewRegionTaskHandler(engines, ctx.snapMgr))workers.raftLogGCWorker.Start(runner.NewRaftLogGCTaskHandler())workers.schedulerWorker.Start(runner.NewSchedulerTaskHandler(ctx.store.Id, ctx.schedulerClient, NewRaftstoreRouter(router)))go bs.tickDriver.run()
}

point1: 

func (w *Worker) Start(handler TaskHandler) {w.wg.Add(1)go func() {defer w.wg.Done()if s, ok := handler.(Starter); ok {s.Start()}for {Task := <-w.receiverif _, ok := Task.(TaskStop); ok {return}handler.Handle(Task)}}()
}
func (r *splitCheckHandler) Handle(t worker.Task) {spCheckTask, ok := t.(*SplitCheckTask)if !ok {log.Errorf("unsupported worker.Task: %+v", t)return}region := spCheckTask.RegionregionId := region.Idlog.Debugf("executing split check worker.Task: [regionId: %d, startKey: %s, endKey: %s]", regionId,hex.EncodeToString(region.StartKey), hex.EncodeToString(region.EndKey))key := r.splitCheck(regionId, region.StartKey, region.EndKey)if key != nil {_, userKey, err := codec.DecodeBytes(key)if err == nil {// It's not a raw key.// To make sure the keys of same user key locate in one Region, decode and then encode to truncate the timestampkey = codec.EncodeBytes(userKey)}msg := message.Msg{Type:     message.MsgTypeSplitRegion,RegionID: regionId,Data: &message.MsgSplitRegion{RegionEpoch: region.GetRegionEpoch(),SplitKey:    key,},}err = r.router.Send(regionId, msg)if err != nil {log.Warnf("failed to send check result: [regionId: %d, err: %v]", regionId, err)}} else {log.Debugf("no need to send, split key not found: [regionId: %v]", regionId)}
}

peerSender也就是raftCh


func (d *peerMsgHandler) onPrepareSplitRegion(regionEpoch *metapb.RegionEpoch, splitKey []byte, cb *message.Callback) {if err := d.validateSplitRegion(regionEpoch, splitKey); err != nil {cb.Done(ErrResp(err))return}region := d.Region()d.ctx.schedulerTaskSender <- &runner.SchedulerAskSplitTask{Region:   region,SplitKey: splitKey,Peer:     d.Meta,Callback: cb,}
}

请求启动过程

 

 触发上面的point1

 

 

func (r *RaftstoreRouter) SendRaftCommand(req *raft_cmdpb.RaftCmdRequest, cb *message.Callback) error {cmd := &message.MsgRaftCmd{Request:  req,Callback: cb,}regionID := req.Header.RegionIdreturn r.router.send(regionID, message.NewPeerMsg(message.MsgTypeRaftCmd, regionID, cmd))
}

 handleMsg---------》

 心跳更新region

func (m *MockSchedulerClient) RegionHeartbeat(req *schedulerpb.RegionHeartbeatRequest) error {if err := m.checkBootstrap(); err != nil {return err}m.Lock()defer m.Unlock()regionID := req.Region.GetId()for _, p := range req.Region.GetPeers() {delete(m.pendingPeers, p.GetId())}for _, p := range req.GetPendingPeers() {m.pendingPeers[p.GetId()] = p}m.leaders[regionID] = req.Leaderif err := m.handleHeartbeatVersion(req.Region); err != nil {return err}if err := m.handleHeartbeatConfVersion(req.Region); err != nil {return err}resp := &schedulerpb.RegionHeartbeatResponse{Header:      &schedulerpb.ResponseHeader{ClusterId: m.clusterID},RegionId:    regionID,RegionEpoch: req.Region.GetRegionEpoch(),TargetPeer:  req.Leader,}if op := m.operators[regionID]; op != nil {if m.tryFinished(op, req.Region, req.Leader) {delete(m.operators, regionID)} else {m.makeRegionHeartbeatResponse(op, resp)}log.Debugf("[region %d] schedule %v", regionID, op)}store := m.stores[req.Leader.GetStoreId()]store.heartbeatResponseHandler(resp)return nil
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/29456.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Batch之读数据库——JdbcCursorItemReader之使用框架提供的BeanPropertyRowMapper(三十六)

一、BeanPropertyRowMapper介绍 参考我的另一篇博客&#xff1a; Spring Batch之读数据库——JdbcCursorItemReader&#xff08;三十五&#xff09;_人……杰的博客-CSDN博客 二、项目实例 1.项目框架 2.代码实现 BatchMain.java: package com.xj.demo27;import org.spri…

Haystack:建立端到端的NLP应用程序的工具箱

Haystack是一个端到端的自然语言处理&#xff08;NLP&#xff09;框架&#xff0c;可以使用语言模型、Transformer模型、向量搜索等功能来构建NLP应用程序。无论您想进行问题回答、答案生成、语义文档搜索&#xff0c;还是构建能够进行复杂决策和查询解决的工具&#xff0c;都可…

PDF在线转PPT,不用下载软件网页在线即可转换!

PDF是我们经常在办公中使用的文件格式&#xff0c;它的兼容性和安全性使得它成为了传输文件的首选。而PPT则是我们常用的演示文稿格式&#xff0c;无论是在学校还是在公司&#xff0c;我们都需要制作演讲和汇报的PPT文件。由于这两种文件格式的重要性&#xff0c;我们经常需要进…

17 | 从后端到前端:微服务后,前端如何设计?

微服务架构通常采用前后端分离的设计方式。作为企业级的中台&#xff0c;在完成单体应用拆分和微服务建设后&#xff0c;前端项目团队会同时面对多个中台微服务项目团队&#xff0c;这时候的前端人员就犹如维修电工一样了。 面对如此多的微服务暴露出来的 API 服务&#xff0c…

【AT89C52单片机项目】数字密码锁设计

实验目的 使用单片机设计数字密码锁。 实验仪器 一套STC89C52RC开发板套件&#xff0c;包括STC89C52RC开发板&#xff0c;以及USB烧录线。 设计要求 1、有设置密码、开锁工作模式&#xff1b; 2、可以每次都设置密码&#xff0c;也可以设置一次密码多次使用。 实验原理 …

JDK、JRE、JVM三者之间的关系以及区别

一、关系 JDK JRE Java 开发工具包 [Java,Javac,Javadoc,Javap等] JRE JVM Java 的核心类库 二、JDK,JRE与JVM介绍 1、JDK JDK是用于Java程序开发的最小环境&#xff0c;包含&#xff1a;Java程序设计语言&#xff0c;Java虚拟机&#xff08;JVM&#xff09;&#xff0…

物理机传输大文件到虚拟机

物理机快速传输大文件到虚拟机 测试使用Tabby传输大文件到虚拟机 1.1 准备大文件 1.2 通过Tabby上传文件到Linux 总耗时约&#xff1a;7分钟 1.3 通过EveryThing配置服务 打开EveryThing&#xff0c;点击工具—> 选项—>http服务器 启用HTTP服务器&#xff0c;配置…

性能测试学习阶段性总结

目录 1.前言 2.概念部分 2.1不同角度看软件性能 2.2关键词 2.3测试的方法 2.4应用领域 3.性能测试过程模型&#xff08;PTGM&#xff09; 2.1测试前期准备 2.2测试工具引入 2.3测试计划 2.4测试设计与开发 2.5测试执行和管理 2.6测试分析 总结&#xff1a; 1.前言…

字符函数和字符串函数1(详解)

❤️ 作者简介 &#xff1a;对纯音乐情有独钟的阿甘 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识&#xff0c;对纯音乐有独特的喜爱 &#x1f4d7; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;如果你也感兴趣的话欢迎关注博主&#xff0c;期待更新 字符函数和…

无参数读文件和RCE总结

什么是无参数&#xff1f; 顾名思义&#xff0c;就是只使用函数&#xff0c;且函数不能带有参数&#xff0c;这里有种种限制&#xff1a;比如我们选择的函数必须能接受其括号内函数的返回值&#xff1b;使用的函数规定必须参数为空或者为一个参数等 接下来&#xff0c;从代码…

准备WebUI自动化测试面试?这30个问题你必须掌握(一)

本文共有8600字&#xff0c;包含了前十五个问题&#xff0c;如需要后十五个问题&#xff0c;可查看文末链接~ 1. 什么是WebUI自动化测试&#xff1f; WebUI自动化测试是指使用自动化测试工具和技术来模拟用户在Web用户界面&#xff08;UI&#xff09;上执行操作&#xff0c;并…

Ceph 服务的运用

目录 一、资源池 pool 管理 1.创建一个 Pool 资源池 2.查看集群 Pool 信息 3.查看资源池副本的数量 4.查看 PG 和 PGP 数量 5.修改 pg_num 和 pgp_num 的数量为 128 6.修改 Pool 副本数量为 2 7.修改默认副本数为 2 8.删除 Pool 资源池 8.1修改配置文件 8.2推送 ceph…