控制器对象的RefDrives属性无法更新问题分析
更新时间: 2026/06/02
在Gitcode上查看源码问题背景
- 单板类型:自研板;
- 软件版本:openUBMC 25.12;
- 涉及功能:存储,RAID,硬盘;
- 预置条件:环境上有RAID卡,并且RAID卡下纳管硬盘;
- 触发条件:对挂在RAID下的硬盘进行热插拔,将槽位5的盘移动到槽位2,web页面查新新建逻辑盘页面;
- 业务表现:预期RAID所属硬盘显示正确;实际RAID所属硬盘显示错误。
问题复现步骤
- 环境上配置并安装RAID卡,并且RAID卡下纳管硬盘;
- 对挂在RAID下的硬盘进行热插拔,将槽位5的盘移动到槽位2;
- 打开RAID卡创建逻辑盘页面,核对物理盘信息;
关键日志信息
web页面具体问题展示: app.log日志如下:
定位过程
- 如上图使用mdbctl查看RefDrives为插拔之前的值,使用busctl查看为插拔之后更新的值,随后mdbctl查看到的值也更新了,但是如果不调用busctl或者重启BMC,RefDrives一直不更新;
- 确认代码RefDrives为一个普通属性,不用于CSR也没有持久化;
- 代码中对赋值后的结果添加打印,日志结果发现可以看到从组件代码来看,RefDrives值是正常更新了,且是每20秒刷新一次,但资源树和上层应用看到的仍然是旧值;
- 与框架开发沟通在更新资源树信息的时候设计方案,框架回复框架设计更新硬盘信息时表table的引用地址没变导致框架检测不到变更,所以资源树不更新;
问题原因
storage组件框架在更新资源树时,table的引用地址没变更,导致框架检测不到变更,最终导致获取控制器下硬盘列表时,硬盘列表未更新到资源树上;
解决方案
代码修改如下图: 将src/lualib/drive/drive_collection.lua文件中的全局缓存drive_list改为每次都直接新建空表进行筛选,这样的话每次都是完全独立的创建table数据,互不干扰,保证数据的正确性,防止全局变量长期占用内存及多地方调用共享同一份数据导致错误的问题。