chromium通信系统-ipcz系统(八)-ipcz系统代码实现-跨Node通信-Broker和Broker通信

前面我们分析了Broker和NonBroker通信,也分析了NonBroker和NonBroker通信,这里我们分析一下Broker和Broker通信过程。
我们直接一步到位,看NodeConnector的创建。

std::pair<Ref<NodeConnector>, IpczResult> CreateConnector(Ref<Node> node,Ref<DriverTransport> transport,IpczConnectNodeFlags flags,const std::vector<Ref<Portal>>& initial_portals,Ref<NodeLink> broker_link,NodeConnector::ConnectCallback callback) {const bool from_broker = node->type() == Node::Type::kBroker;const bool to_broker = (flags & IPCZ_CONNECT_NODE_TO_BROKER) != 0;const bool share_broker = (flags & IPCZ_CONNECT_NODE_SHARE_BROKER) != 0;const bool inherit_broker = (flags & IPCZ_CONNECT_NODE_INHERIT_BROKER) != 0;if (from_broker) {DriverMemoryWithMapping memory =NodeLinkMemory::AllocateMemory(node->driver());if (!memory.mapping.is_valid()) {return {nullptr, IPCZ_RESULT_RESOURCE_EXHAUSTED};}if (to_broker) {return {MakeRefCounted<NodeConnectorForBrokerToBroker>(std::move(node), std::move(transport), std::move(memory),flags, initial_portals, std::move(callback)),IPCZ_RESULT_OK};}......return {nullptr, IPCZ_RESULT_INVALID_ARGUMENT};
}

当前节点是broker的情况下,对端节点也是broker,就是broker to broker请求,创建NodeConnectorForBrokerToBroker。
NodeConnectorForBrokerToBroker

  // NodeConnector:bool Connect() override {DVLOG(4) << "Sending direct ConnectFromBrokerToBroker from broker "<< local_name_.ToString() << " with " << num_portals()<< " initial portals";ABSL_ASSERT(node_->type() == Node::Type::kBroker);msg::ConnectFromBrokerToBroker connect;connect.params().name = local_name_;connect.params().protocol_version = msg::kProtocolVersion;connect.params().num_initial_portals =checked_cast<uint32_t>(num_portals());connect.params().buffer = connect.AppendDriverObject(link_memory_allocation_.memory.TakeDriverObject());connect.params().padding = 0;return IPCZ_RESULT_OK == transport_->Transmit(connect);}

从broker链接另一个broker的消息对象为ConnectFromBrokerToBroker, ConnectFromBrokerToBroker的参数如下
name: 当前进程的NodeName,后面我们称这个进程为A进程,接收链接的进程为B进程。
protocol_version: 协议版本
num_initial_portals: 要初始化的RouterLink
buffer: 共享内存对象
padding: 用于对齐。

我们看对端收到消息如何处理

 // NodeMessageListener overrides:bool OnConnectFromBrokerToBroker(msg::ConnectFromBrokerToBroker& connect) override {const NodeName& remote_name = connect.params().name;DVLOG(4) << "Accepting ConnectFromBrokerToBroker on broker "<< local_name_.ToString() << " from other broker "<< remote_name.ToString();const LinkSide this_side =remote_name < local_name_ ? LinkSide::kA : LinkSide::kB;DriverMemory their_memory(connect.TakeDriverObject(connect.params().buffer));DriverMemoryMapping primary_buffer_mapping =this_side.is_side_a() ? std::move(link_memory_allocation_.mapping): their_memory.Map();if (!primary_buffer_mapping.is_valid()) {return false;}Ref<NodeLink> link = NodeLink::CreateActive(node_, this_side, local_name_, remote_name, Node::Type::kBroker,connect.params().protocol_version, transport_,NodeLinkMemory::Create(node_, std::move(primary_buffer_mapping)));AcceptConnection({.link = link, .broker = link},connect.params().num_initial_portals);return true;}

创建NodeLink, 注意这里面LinkSide 根据NodeName做比较确定。 共享内存使用LinkSide::kA端提供的共享内存。 对应的Connection 的broker 指向核对段的链接。

到这里我们所有的链接类型就分析完了,下面对NodeConnector 和 Connection的几种情况做一下总结。

NodeConnector类型:

Broker 和 NonBroker建立链接(假设A是Broker, B是NonBroker):

  • NodeConnectorForBrokerToNonBroker: 用于A链接B进程,创建的Connection.link 指向A->B链接,Connection.broker 为空。
  • NodeConnectorForNonBrokerToBroker: 用于B链接A进程。创建的Connection.link 指向B->A链接,Connection.broker 也指向B->A链接。

NonBroker 和NonBroker建立链接: (假设主动发起请求的NonBroker 为B, 另一个NonBroker为C, Broker 为A)

  • NodeConnectorForReferrer: 用于B 向C主动发起链接的过程中, 用于帮助A 和 另一个C 建立链接的NodeConnector。
  • NodeConnectorForBrokerReferral: 用于B 向C主动发起链接的过程中, A 一端建立的NodeConnector对象,用于等待C端链发起链接。收到C端发请求后帮助B和C建立链接。
  • NodeConnectorForReferredNonBroker: 用于C端请求NodeConnectorForBrokerReferral,并且接收NodeConnectorForBrokerReferral请求,建立C->A 和 C->B链接。

以上过程建立了三个链接:
C->A:Connection.link 为C到A的NodeLink, Connection.broker 为C到A的NodeLink。
A->C: Connection.link 为A到C的NodeLink, Connection.broker 为空。
B->C: Connection.link 为B到C的NodeLink, Connection.broker 为 B到A的NodeLink。
C->B: Connection.link 为C到B的NodeLink, Connection.broker 为 C到A的NodeLink。

也就是NonBroker<->NonBroker 的链接Connection->broker 都是和Broker的NodeLink。

Broker 和Broker建立链接
NodeConnectorForBrokerToBroker: 用于Broker 和Broker 建立链接, Connection.link 为指向对端的NodeLink, Connection.broker 也是指向对端的NodeLink。

到此几种链接我们都分析过了。下面就可以分析代理消除了。

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

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

相关文章

代码随想录刷题笔记(DAY 6)

今日总结&#xff1a;今天是关于哈希表的题目&#xff0c;总体难度不算太大&#xff0c;今天准备再写一篇关于 Vuex 的博客。 Day 6 01. 有效的字母异位词&#xff08;No. 242&#xff09; 题目链接 代码随想录题解 1.1 题目 给定两个字符串 s 和 t &#xff0c;编写一个函…

疯狂程序员之重头暴学英语语法宝典!!!

学习英语语法真的很重要&#xff01;虽然也许不会与外国人交流&#xff0c;但是你可能会因为编程学习或者阅读英语资料苦恼&#xff0c;既然看到了不如就从现在开始好好学英语吧&#xff01;Nothing is impossible to a willing heart&#xff08;有志者事竟成&#xff09;! 第…

【二叉树】【BFS】【DFS】111. 二叉树的最小深度

题目 法1&#xff1a;BFS class Solution {public int minDepth(TreeNode root) {if (root null) {return 0;}int depth 1;Queue<TreeNode> queue new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {int curSize queue.size();for (int i 0;…

作业--day39

定义一个Person类&#xff0c;私有成员int age&#xff0c;string &name&#xff0c;定义一个Stu类&#xff0c;包含私有成员double *score&#xff0c;写出两个类的构造函数、析构函数、拷贝构造和拷贝赋值函数&#xff0c;完成对Person的运算符重载(算术运算符、条件运算…

编程语言未来发展趋势探析:简化与标准化、并发与分布式、智能应用新篇章

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

PyTorch 节省显存技巧:Activation Checkpointing

参考资料 官方文档&#xff1a; https://pytorch.org/docs/2.0/checkpoint.html官方博客&#xff1a;https://medium.com/pytorch/how-activation-checkpointing-enables-scaling-up-training-deep-learning-models-7a93ae01ff2d Activation Checkpointing 介绍 激活检查点 …

【致远OA】按人员编码获取所有待办事项

接口说明 按人员编码获取所有待办事项 兼容版本 since V7.0 请求方式 http请求方式&#xff1a;GET http://ip:port/seeyon/rest/affairs/pending/code/{memberCode} 如 http://127.0.0.1/seeyon/rest/affairs/pending/code/9981 效果参考 响应结果 参考对象实例&#x…

P9198 题解

温馨提示: \color{#E74C3C}\text{温馨提示:} 温馨提示: 遇见题解勿抄袭&#xff0c;棕名封号两行泪。 \color{#E74C3C}\text{遇见题解勿抄袭&#xff0c;棕名封号两行泪。} 遇见题解勿抄袭&#xff0c;棕名封号两行泪。 题目传送门 这道题目呢&#xff0c;非常得良心&#xff…

事件循环的理解

1.单线程 Js是一个单线程的语言,代码只能一行一行去执行,遇到同步的代码就直接执行了,如果遇到异步的代码怎么办&#xff1f; 不可能等到异步的代码执行完&#xff0c;在去执行后面同步的代码。 2.主线程 遇到同步的代码,就在主线程里面直接执行了。 3.任务队列 遇到异步的…

ROS TF坐标变换 - 静态坐标变换

目录 一、静态坐标变换&#xff08;C实现&#xff09;二、静态坐标变换&#xff08;Python实现&#xff09; 如前文所属&#xff0c;ROS通过广播的形式告知各模块的位姿关系&#xff0c;接下来详述这一机制的代码实现。 模块间的位置关系有两种类型&#xff0c;一种是相对固定…

Django开发3

Django开发3 Django开发编辑用户9.靓号管理9.1 表结构9.2 靓号列表9.3 新建靓号9.4 编辑靓号9.5 搜索手机号9.6 分页 10.时间插件11.ModelForm和BootStrap操作 各位小伙伴想要博客相关资料的话关注公众号&#xff1a;chuanyeTry即可领取相关资料&#xff01; Django开发 部门管…

RK3588取经之路【序章】2024/01/01

文章目录 RK3588取经之路【序章】关于本文的规划 开篇开发板整体图外设介绍 结束 RK3588取经之路【序章】 2023年前入手买了这个广州英码出场的一款开发板EVM3588-A24EG-C-B2AA&#xff08;裸板&#xff09;&#xff0c;花了2800左右&#xff0c;是不是脑子有点毛病&#xff0…

超详细YOLOv8目标检测全程概述:环境、训练、验证与预测详解

目录 yolov8导航 YOLOv8&#xff08;附带各种任务详细说明链接&#xff09; 搭建环境说明 不同版本模型性能对比 不同版本对比 模型参数解释 不同版本说明 训练 训练示意代码 训练用数据集与 .yaml 配置方法 .yaml配置 数据说明 数据集路径 训练参数说明 训练过程…

linux下docker搭建Prometheus +SNMP Exporter +Grafana进行核心路由器交换机监控

一、安装 Docker 和 Docker Compose https://docs.docker.com/get-docker/ # 安装 Docker sudo apt-get update sudo apt-get install -y docker.io# 安装 Docker Compose sudo apt-get install -y docker-compose二、创建配置文件及测试平台是否正常 1、选个文件夹作为自建…

【Linux】修复 Linux 错误 - 权限被拒绝

修复 Linux 错误 - 权限被拒绝 问题描述 在使用 Linux 操作系统时,有时会遇到权限被拒绝的错误。这种错误通常发生在尝试执行需要特定权限的操作时,例如修改系统文件或访问受限的目录。当权限被拒绝时,系统会返回类似于“Permission denied”或“Operation not permitted”…

Airtest的iOS实用接口介绍

前段时间Airtest更新了1.3.0.1版本&#xff0c;里面涉及非常多的iOS功能新增和改动&#xff0c;今天想详细跟大家聊一下里面的iOS设备接口。 PS&#xff1a;本文示例均使用本地连接的iOS设备&#xff0c;Airtest版本为1.3.0.1 。 安装接口&#xff1a;install、install_app …

2.1 DFMEA步骤一:策划和准备

2.1.1 目的 设计FMEA的“策划和准备”步骤旨在确定将要执行的FMEA类型,以及根据进行中的分析类型(如系统、子系统或组件)明确每个FMEA的范围。设计FMEA(DFMEA)的主要目标包括: 项目识别项目计划:涵盖目的、时间安排、团队、任务和工具(5T)分析边界:界定分析的范围,…

java编程思路思想及案例练习(最近学习总结)

前言&#xff1a; 学了java的基础语法&#xff0c;但运用还不是很流畅&#xff0c;所以练习些案例&#xff0c;整理些心得。 编程思路思想 1&#xff0c;实验由多个方法组成&#xff0c;所以碰到需要实现的程序时&#xff0c;需要先分析程序&#xff0c;思考程序可以拆分成什么…

GPT4-AIl本地部署-chat AI本地使用

文章目录 GPT4-AIl本地部署GPT4客户端下载地址&#xff1a;对应的下载下载后的文件点击安装&#xff0c;改一下文件存放路径&#xff0c;下面都是默认下一步进度条100%后&#xff0c;点击完成 安装完桌面生成图标&#xff0c;点击选择都是NO&#xff0c;不进行数据上传点击后&a…

TensorFlow Hub模型

TensorFlow Hub是一个库&#xff0c;用于分享和发现预训练的机器学习模型。 可以在TensorFlow Hub上找到各种用于不同任务的模型&#xff0c;包括但不限于以下类型&#xff1a; 文本处理: BERT (Bidirectional Encoder Representations from Transformers)ALBERT (A Lite BERT…