ISSUE
评审背景
-
产业推出新的硬件形态,该形态下BMC会出两路CAN-FD总线承担板间通信的基础能力,硬件中的每个节点对于CAN-FD来说均为一个下挂的设备,设备上的BMC均可以通过该总线进行通信
-
数据同步则是基于CAN-FD通信实现,需要通过广播或者单播(通过过滤不需要的信号)实现板间通信
触发原因
新需求
方案分析
- 当前是基于CAN-FD进行实现,但为保证后续的拓展性(例如TCP),需要将通信类型做到可配置,因此需要新增一个数据同步类承载配置能力
bmc_datasync仅存储其他节点的数据,所以在同步数据更新后,需通知其他组件来获取同步数据,流程为:
- 其他节点的数据同步后,采用信号的方式进行广播
- 订阅信号的组件通过资源协作接口查询同步数据并消费
信号中需要包含变更的接口名称,组件可以以此判断是否需要查询此次更新的数据。如下图所示:
graph TD;
节点1 --同步-->本端BMC
节点2 --同步-->本端BMC
本端BMC -->A
A[同步数据更新] --属性值、是否老化等--> B[广播信号];
B --interface--> C[组件A]
C --> D{是否需要}
D --是--> E[查询接口]
E --interface--> 本端BMC
B --interface--> 组件B
B --interface--> 组件C
组件B --> ...
组件C --> ..
评审点
评审点一: 新增同步数据更新信号 PropertyUpdated
path(新增): /bmc/kepler/Managers/:ManagerId/DataSync
interface(新增): bmc.kepler.Managers.DataSync
signal(新增): PropertyUpdated
信号携带参数详情如下:
| 名称 | 类型 | 说明 |
|---|---|---|
| Identifier | y | 当前同步更新的属性来自于哪个远端BMC |
| ObjectName | s | 当前同步的属性归属对象名称 |
| Interface | s | 当前同步的属性归属接口名称 |
评审点二: 新增数据同步属性获取方法 GetProperties
path(已有): /bmc/kepler/Managers/:ManagerId/DataSync
interface(已有): bmc.kepler.Managers.DataSync
method(新增): GetProperties
** 新增方法详情如下:**
| 项目 | 说明 |
|---|---|
| 方法名 | GetProperties |
| 方法描述 | 获取已同步的属性 |
| 权限 | ReadOnly |
| 请求签名 | yss |
| 请求说明 | Identifier:签名为 y,表征需要获取哪个远端BMC同步过来的属性。如果是0xFF则为获取所有节点的同步属性ObjectName:签名为 s,表征需要获取同步过来的哪个对象的属性Interface:签名为 s,表征需要获取同步过来的哪个接口的属性 |
| 响应签名 | a(ya(sa{ss})) |
| 响应说明 | Properties:查询同步的属性信息集合,如果没有属性则返回空。集合元素结构如下 : Identifier:签名为 y,表征查询同步属性归属的远端BMC的标识PropertyDetails:签名为 a(sa{ss}),表征同步属性的详细信息,元素结构如下:PropertyName:签名为 s,属性名称PropertyItems:签名为 a{ss},属性的具体信息,字典结构,其中key包括:PropertyValue:表示属性值,取值类型为字符串,对于数组、结构体类型则格式化成json字符串 Expired:表示属性值是否老化,取值类型为字符串,“true”- 已老化,“false” -未老化 |
结论
同意新增如下资源协作对象路径和接口
新增path: bmc.kepler.Managers.DataSync
新增inteface:/bmc/kepler/Managers/:ManagerId/DataSync
新增信号:
PropertyUpdated,在数据同步发生时该信号发出。信号参数签名为yss,表示属性同步更新时的远端BMC的标识符,属性归属的对象名称,属性归属的资源协作接口名称。
新增方法:GetProperties,用于获取已经同步的属性的集合。请求参数签名为yss,响应参数签名为a(ya(sa{ss})),请求和响应参数说明见评审点2,权限为ReadOnly。
遗留问题
问题1:方法 GetProperties 响应中属性以及取值能否直接进行反序列化进行返回。
结论:在远端BMC进行同步时,如果是简单类型(如整数,字符串)会直接保存原始值,如果是复杂类型,则会使用 json 格式的字符串进行处理。对于 D-Bus 的 Variant 类型,会在属性同步时直接进行反序列化处理转换为简单类型以及 json 格式的字符串。