正常流程

    • 登录小站,点击管理--磁盘,在硬盘下创建分区并挂载
    • 安全下电,拔掉硬盘和TEC,再上电
    • 硬件端
    • drv_fault_check_init 初始化 并绑定硬件回调 drv_fault_check_callback
    • drv_fault_check_proc 发送告警事件通过ens框架回调给alarm_process模块中
    • 非硬件端
    • 初始化磁盘挂载检测任务fault_manage_mount_check_thread线程检测磁盘状态
    • fault_check.h 中 FAULT_DATA_COLLECT funcdatacollect; // 注册函数
    • global_fault_info_init 绑定所有非硬件故障检测函数
    • fault_check_task_process 中 下段代码调用检测函数检测并返回不同故障的状态
    ret = sub_item_fault->item_cfg.funcdatacollect(index, sub_item_fault->item_cfg.sub_fault_id,
    &status_curr);
    • alarm_report函数,通过此函数处理故障信息并更新状态,然后写入故障日志
    • 最后发布一个警告事件给注册的其他方法中
    • 去执行 通过ens框架提前注册好的事件
    • 执行到 process_alarm_event_func 函数中调用hal层提供的接口去执行
    • dev_set_led_color 函数
    • 最终执行的是hal_set_led_color函数 执行切换不同灯的状态

故障架构

http://image.huawei.com/tiny-lts/v1/images/a46a8e1f44cfbe69d77d5ebb3e5751f2_683x428.png@900-0-90-f.png

  • 故障检测和告警解耦。
  • 硬件和非硬件的故障检测解耦。
  • 告警主体归一。

检测流程

  1. 驱动侧启动,拉起驱动故障检测进程。
  2. OM侧ensd进程启动,ensd进程加载故障检测动态库并进行故障检测模块的初始化,在这个过程中会初始化非硬件相关的故障检测线程,同时会加载驱动提供的硬件故障检测动态库,该动态库初始化的过程中会和驱动故障检测进行连接;同时ensd进程加载告警处理动态库并进行告警处理模块的初始化,在这个过程中会初始化告警屏蔽处理线程。
  3. 故障检测模块中会进行相关非硬件故障的检测,发现故障时会通过告警上报接口上报给告警处理模块,告警处理模块生成相应的告警。
  4. 驱动侧的故障检测进程对硬件进行检测,发现故障会将故障上报给ensd进程中的故障检测模块进行处理,改模块会将故障上报给告警模块处理。

3、 各检测项实现
这边只列出硬件无关的故障检测项,硬件相关的在驱动侧实现。

  1. 磁盘挂载
    通过脚本mount_check.sh实现
  2. NFS
    通过脚本nfs_operate.sh生成的nfs_status_info文件实现NFS的故障检测功能
  3. 磁盘空间
    通过linux的df和awk命令来判断磁盘空间是否占满,目前检测的目录有: ‘/’、‘/tmp’、‘/home/data’、‘/home/log’、‘/opt’、‘/var/lib/docker’。
  4. 证书过期

告警

  1. ensd进程中硬件故障检测任务和非硬件故障检测任务将检测的故障上报给告警任务,告警任务处理故障生成告警并保存。
  2. WEB发起告警查询请求,ESP请求告警模块,查询当前活动告警,得到结果后将结果返回给WEB

故障检测模块和告警模块之间的接口

UINT32 report(const void *info),其中info的结构为:
typedef struct {
UINT32 data_len; // 报文长度
UINT32 owner; // 上报的模块标识
UINT32 item_num; // 告警个数
} ALARM_MSG_INFO_HEAD; typedef struct {
UINT16 fault_id; // 为LV1中告警id, 对应FAULT_LV2_MAPPING_STRU的fault_id_out
UINT16 sub_fault_id; // 子告警id
UINT16 fault_level; // 告警级别 FAULT_LEVEL_ENUM :紧急告警 严重告警 轻微告警
UINT16 reserved; // 4字节对齐
time_t raise_time_stamp; // 告警时间戳(元年到告警产生的秒数)
char fault_name[64]; // 告警名称
char resource[32]; // 告警实体
} ALARM_MSG_FAULT_INFO;

驱动故障检测动态库提供的接口(驱动提供)

  1. 初始化接口
    INT32 drv_fault_check_init();

  2. 设置故障上报回调函数接口
    typedef INT32(*DRV_FAULT_CHECK_PROC)(UINT8 *data, UINT32 data_len);
    INT32 drv_fault_check_register_callback(DRV_FAULT_CHECK_PROC);

现在的情况

  • 上电后健康指示灯应该为红色闪动,而指示灯还是绿色闪动
  • 屏蔽报警没有做对应的处理

分析问题

  • 通过简单的日志调试(ibma_edge/common.log)
  • 发现 g_ext_infs 这个结构体在重启的时候,为 nil 空;
  • 并且 ret 返回 非 0
  • 当重启一个platform服务的时候,发现这个g_ext_infs又重启启动了一个进程,
  • 但是在新的进程里面,这里,g_ext_infs的机构体为空
  • 并且 pfn_set_led_color为空
  • 排查发现,py中的hal在这个进程中可能是未初始化。

解决方案

    • 重新调用devm_init()初始化一个新的进程保证硬件那边可以健康
    • 重写适配接口,让屏蔽告警调用取消对应的信号报警

ENS框架下一次控制灯的调试记录的更多相关文章

  1. SPI 核软件调试记录

    SPI 核软件调试记录 1.首先说说int SpiFlashWaitForFlashReady(void)这一函数,基本上其它函数在执行的时候,都会事先执行一次此函数.    因为此函数的作用主要是用 ...

  2. Video Timing Controller v6.1软件调试记录

    Video Timing Controller v6.1软件调试记录 GUI配置: . case XVTC_VMODE_PAL: //576i@50 { TimingPtr->Interlace ...

  3. Video Test Pattern Generator(7.0)软件调试记录

    Video Test Pattern Generator(7.0)软件调试记录 . XVidC_VideoMode XVIDC_VM_576_50_I = XVIDC_VM_720x576_50_I ...

  4. MA82G5D16AS16 主频调试记录

    MA82G5D16AS16 主频调试记录 当 SCKS 设置 为 MCKDO / 128 时 MCU 的电流为 0.58mA,100UF 电容可以维持 0.5S,大概可以满足. 但是需要注意外围的线路 ...

  5. Apusic中间件结合MyEclipse进行远程调试记录

    Apusic中间件结合MyEclipse进行远程调试记录. 在金蝶域中正常部署应用. 启动金蝶中间件时使用"startapusic -ds"命令. 在MyEclipse的Run-- ...

  6. mybatis框架-查询用户表中的记录数

    之前已经搭建过mybatis框架了,现在我们要用mybatis框架真正的干点事情了. 这是这个简单web项目的整体架构. 我们使用mybatis框架查询用户表中的记录数: 这是用户类: package ...

  7. PWM控制灯亮暗的verilog实现

    PWM的全称为Pulse-Width Modulation(脉冲宽度调制),即调节脉冲的占空比.当输出的脉冲频率一定时,输出的脉冲占空比越大,相当于输出的有效电平越大,这样也就简单实现了由FPGA来控 ...

  8. http://stblog.baidu-tech.com/?p=1684) coredump调试记录 - PHP篇 原创: 扶墙 贝壳产品技术 今天

    http://stblog.baidu-tech.com/?p=1684) coredump调试记录 - PHP篇 原创: 扶墙 贝壳产品技术 今天

  9. 基于freescale i.Mx6(ARM)的阿里云oss调试记录

    交叉编译阿里OSS调试记录 1.1 开通oss服务 具体参考以下链接: https://help.aliyun.com/document_detail/31884.html?spm=a2c4g.111 ...

  10. [ZJCTF 2019]EasyHeap | house of spirit 调试记录

    BUUCTF 上的题目,由于部分环境没有复现,解法是非期望的 house of spirit 第一次接触伪造堆的利用方式,exp 用的是 Pwnki 师傅的,本文为调试记录及心得体会. 逆向分析的过程 ...

随机推荐

  1. KingbaseES V8R6 锁等待检测

    背景 对于多数数据库,dba技能之一就是查找锁.锁的存在有效合理的在多并发场景下保证业务有序进行.下面我们看一下KingbaseESV8R6中查找阻塞的方法. 1.找到"被阻塞者" ...

  2. KingbaseES 客户端工具安装

    关键字: KingbaseES.Java.ClientTools 一.安装前准备 1.1 软件环境要求 金仓数据库管理系统KingbaseES V8.0支持微软Windows 7.Windows XP ...

  3. KingbaseES R3 集群一键修改集群用户密码案例

    案例说明: 在KingbaseES R3集群的最新版本中增加了kingbase_monitor.sh一键修改集群用户密码的功能,本案例是对此功能的测试. kingbaseES R3集群一键修改密码说明 ...

  4. 【读书笔记】C#高级编程 第二章 核心C#

    (一)第一个C#程序 创建一个控制台应用程序,然后输入代码,输入完毕后点击F5 Console.WriteLine();这条语句的意思:把括号内的内容输出到界面上: Console.ReadKey() ...

  5. ORM增删改查并发性能测试2

    前言 上一篇<ORM增删改查并发性能测试>出现了点小失误,有的输出SQL日志的代码没有禁用,数据库连接字符串可能有问题.统一环境,统一代码后,重新写一篇. 这次重点是并发性能测试,真不是为 ...

  6. 新增一个Redis 从节点为什么与主节点的key数量不一样呢?

    在日常的 Redis 运维过程中,经常会发生重载 RDB 文件操作,主要情形有: 主从架构如果主库宕机做高可用切换,原从库会挂载新主库重新获取数据 主库 QPS 超过10万,需要做读写分离,重新添加从 ...

  7. [深度学习]-Dataset数据集加载

    加载数据集dataloader from torch.utils.data import DataLoader form 自己写的dataset import Dataset train_set = ...

  8. 聊聊单点登录(SSO)中的CAS认证

    SSO介绍 背景 随着企业的发展,一个大型系统里可能包含 n 多子系统, 用户在操作不同的系统时,需要多次登录,很麻烦,我们需要一种全新的登录方式来实现多系统应用群的登录,这就是单点登录. web 系 ...

  9. STL堆排序&时间复杂度分析

    1. 逻辑&时间复杂度分析 pop 和 initialize 的时间复杂度请参考: [DSAAinC++] 大根堆的pop&remove&initialize 将数组初始化为一 ...

  10. Java SE 6、super关键字,包

    1.super关键字 super代表父类的引用,用于访问父类的属性,方法,构造器 super可以访问父类的属性,但不能访问父类的 private 属性 super.属性名; 可以访问父类的方法,不能访 ...