scr中使用同步语法的一个注意事项

先说结论:csr中的同步语法和资源树属性配置持久化(ResetPer、PoweroffPer等)会存在冲突,导致对象加载失败。

定位过程:

在使用openubmc进行开发的时候,我们修改了一张GPU卡的csr中一个属性值的来源:

“UncorrectableError”: 0 → “UncorrectableError”: “<=/GPU_1.UncorrectableError”

修改之后,该GPU卡的pciedevice组件加载失败:

img_v3_02rm_2e28fa7f-de5f-4e35-98ff-a04abef1b41g

error log的意思是不能给同步语法属性直接赋值,也就是代码中存在给这个属性赋值的地方。

我在代码中找到了唯一一处赋值的地方,并将其注释,但是注释后问题还在,pciedevice对象依旧加载失败。

全局搜索UncorrectableError这个属性,确实只有这一处地方给它赋值。

此时定位有些卡壳了,尝试查看其它配了同步语法的属性和普通属性的区别,发现不少普通属性都配置了ResetPer,而同步语法似乎都没有配置。ResetPer的意思复位持久化,也就是iBMC复位时,会从数据库恢复配置了ResetPer的属性的值。

那从数据库恢复属性值的时候会不会与同步语法冲突?于是将UncorrectableError属性的ResetPer去掉,重新gen并出包验证,发现问题消失,pciedevice对象成功加载,故此得出结论。

如果各位大佬有别的结论或者想法希望可以跟帖分享。

之前开发的时候也遇到过,对于采用同步值的属性不应配置持久化,又或者说有持久化特性的属性,不能在csr中配置同步关系;这两者是冲突的,因为配置了持久化免不了会在代码中对属性进行设置,但采用同步值的属性不能被设置,如果同时使用且环境中存在该属性的持久化数据会导致属性所在对象加载失败。

pcie_device采用了orm框架,恢复持久化数据的动作在框架操作,所以你在这个组件找不到其他设置这个属性的地方了。

4 个赞

持久化属性不能别配置为同步或者引用,这是一个配置原则。对象分发时,框架会从数据库持久化值恢复到对象上并上树。如果属性是同步或者引用,那么会报错的。