更新ID(KYUA-202412-1150)
- 更新简述:
- 修复dnf在异常退出后再次执行dnf相关命令会一直等待问题
- 影响操作系统版本:
- 银河麒麟高级服务器操作系统 V10 SP2
- 更新类型:
- 社区同步
- 发布时间:
- 2024-12-13
- 更新描述:
- 影响软件详情(产品名称 对应架构 软件包 修复版本)
银河麒麟高级服务器操作系统 V10 SP2 x86_64,aarch64,loongarch64 dnf 4.2.23-3.p07.ky10
详细介绍
1.问题复现方法:
创建一个长时间休眠的进程,将进程号直接写入 DNF 的锁文件,即可模拟 DNF 异常退出时锁文件中的进程号被其他进程占用的情况,DNF运行时会做不必要的等待:
# sleep 1000 &
[1] 59537
# echo -n 59537 >/var/cache/dnf/metadata_lock.pid
# dnf makecache
Waiting for process with pid 59537 to finish.
将上面复现命令中dnf换成yum,同样可复现。
2.问题分析结果:
代码分析可知,dnf处理的各类事务(安装,升级,卸载)会产生不同的锁文件。dnf/yum事务执行流程是首先查看有无和该事务对应的锁文件,如没有则创建锁文件并写入事务对应进程号,再执行事务。如有锁文件则通过进程号来判定锁文件中进程号是否被某个进程占有。未被占用则运行事务,不占用则会等待。当dnf进程异常退出且未清理锁文件,文件进程号又恰好被非 dnf/yum进程占有时,dnf/yum再次执行会等待被锁文件标示的进程运行结束后再开始执行事务,此进程一直不退出则会导致dnf/yum无法使用。基于此问题优化了对锁文件的处理逻辑:在锁文件中的进程号被某个进程占有后,进一步判断该进程是否为 dnf/yum,如不是则向锁文件写入dnf/yum的进程号,接管锁文件后继续执行事务。
3.补丁及下载地址:
从软件仓库更新
4.修复和更新方法:
银河麒麟高级服务器操作系统 V10 SP2 需要更新 dnf 软件包到 dnf-4.2.23-3.p07 或以上版本。