存储Controller对象无法正常卸载问题分析
更新时间: 2026/05/26
在Gitcode上查看源码

问题背景

  • 单板类型:自研板;
  • 软件版本:openUBMC 2512 LTS SP1;
  • 涉及功能:raid卡识别;
  • 触发条件:插上raid卡后再拔掉raid卡;
  • 业务表现:预期controller对象正常卸载,web页面不显示已经拔掉的raid卡;实际controller对象卸载失败,web页面会显示已经拔掉的raid卡。

问题复现步骤

环境插上raid卡,拔掉raid卡后,发现拔掉的raid卡在web界面仍然有显示。

关键日志信息

web页面如下图:

app.log日志截图如下:

定位过程

app.log日志分析,在尝试删除Controller对象时,storage组件代码试图访问一个为nil的变量controller,导致删除过程异常中断;代码截图如下: 问题出在最后一行使用的变量obj,实际上obj参数非入参,非函数自行定义的变量,但函数参数为controller,因此obj是未定义变量(nil),导致运行时报错;

问题原因

storage组件中的raid对象卸载函数执行过程中使用了未定义的变量,导致raid卡的Controller对象卸载失败。

解决方案

文件路径:storage\src\lualib\controller\controller_collection.lua 代码修改如下:

text
    c_controller.on_delete_object:on(function(controller)
        self.controller_list[controller.Id] = nil
        c_storageconfig.get_instance():add_or_del_controller(controller, nil)
        self:link_interface(controller, false)
    end)

即最后一行的第一个入参从obj改为controller,保证函数不会传入nil的参数。