同步属性机制说明
更新时间: 2026/04/17
在Gitcode上查看源码

同步属性机制背景

目前同步属性是基于信号+主动获取的方式来实现的,与引用属性的最大区别在于业务需不需要感知属性的变更,如果业务需要在属性变更后做一些处理,则使用同步属性。想在远端属性变化后自动触发本地属性的更新就用同步,引用是每次访问本地属性的时候会先去访问远端,在不访问的情况下,业务是不感知远端属性的更新的。引用是强依赖,同步是弱依赖。

一、CSR配置

1.同步属性配置

表示Connector_Exu_1的Presence属性同步自Scanner_Presence_1的Value属性。

json
"Connector_Exu_1": {
    "Presence": "<=/Scanner_Presence_1.Value"
}

2.表达式配置

表示CoolingRequirement_1_50的MonitoringValue属性同步源有两个:OpticalModule_0的TemperatureCelsius属性和OpticalModule_1的TemperatureCelsius属性。使用这两个值作为表达式输入可计算出CoolingRequirement_1_50的MonitoringValue属性值。

json
"CoolingRequirement_1_50": {
    "MonitoringValue": "<=/OpticalModule_0.TemperatureCelsius; <=/OpticalModule_1.TemperatureCelsius |> expr($1 >= $2 ? $1 : $2)"
}

3.@Default语法

由于同步属性是异步进行更新的,无法保证属性初始化时就能获取到远端的属性值,SR中提供@Default语法用于指定同步属性初始化无法获取远端值时同步属性的默认值。在使用同步语法时,建议要显示通过该语法指定默认值,避免由于源属性所在对象尚未上树,导致使用属性的默认值,进而触发误告警。

json
"Scanner_ECUSys3V1": {
  "ScanEnabled": "<=/Scanner_PowerGdFlash.Value",
  "@Default": {
    "ScanEnabled": 1
  }
}

二、同步属性更新流程

1.同步属性初始化流程

1)整体流程

2)信号订阅流程

3)主动获取同步源流程

4)初始化时序图

2.通过属性变更信号更新流程

3.通过接口新增信号更新流程

4.使用本地缓存更新同步属性值流程

5.对象卸载时同步属性处理流程

三、注意事项

  1. 同步属性可以是资源树属性或私有属性,但同步源属性只能为资源树属性

  2. 同步源属性必须支持发送属性变更信号

  3. 同步属性支持自动类型转换

  4. 同步属性是异步进行更新的,同步源属性更新后并不能保证同步属性能够马上进行更新

  5. 同步属性是一种弱依赖,无法保证获取同步属性时同步源属性一定上树了

四、同步属性信息查询

1.通过busctl命令查询自发现分发的同步属性信息

例:busctl --user call bmc.kepler.hwdiscovery /bmc/kepler/ObjectGroup/0101010D04 bmc.kepler.ObjectGroup GetObjects a{ss}s 0 network_adapter

2.一键收集日志sync_property_trace.log中记录同步源最近的更新记录

sync_property_trace.log位于dump_info/AppDump/组件名称目录下,这里以dump_info/AppDump/event下的sync_property_trace.log为例

五、同步属性常见问题

1.属性未同步

1)检查model.json中是否配置同步属性usage CSR

2)通过busctl命令查询自发现分发的同步属性信息是否正确 busctl --user call bmc.kepler.hwdiscovery /bmc/kepler/ObjectGroup/0101010D04 bmc.kepler.ObjectGroup GetObjects a{ss}s 0 network_adapter emits-change

3)检查mdb_interface配置,并查看同步源属性是否有emits-change标记

4)结合sync_property_trace.log日志查看同步属性的变更记录