更新ID(KYUA-202412-1150)
- 更新簡述:
- 修復(fù)dnf在異常退出后再次執(zhí)行dnf相關(guān)命令會一直等待問題
- 影響操作系統(tǒng)版本:
- 銀河麒麟高級服務(wù)器操作系統(tǒng) V10 SP2
- 更新類型:
- 社區(qū)同步
- 發(fā)布時(shí)間:
- 2024-12-13
- 更新描述:
- 影響軟件詳情(產(chǎn)品名稱 對應(yīng)架構(gòu) 軟件包 修復(fù)版本)
銀河麒麟高級服務(wù)器操作系統(tǒng) V10 SP2 x86_64,aarch64,loongarch64 dnf 4.2.23-3.p07.ky10
詳細(xì)介紹
1.問題復(fù)現(xiàn)方法:
創(chuàng)建一個(gè)長時(shí)間休眠的進(jìn)程,將進(jìn)程號直接寫入 DNF 的鎖文件,即可模擬 DNF 異常退出時(shí)鎖文件中的進(jìn)程號被其他進(jìn)程占用的情況,DNF運(yùn)行時(shí)會做不必要的等待:
# sleep 1000 &
[1] 59537
# echo -n 59537 >/var/cache/dnf/metadata_lock.pid
# dnf makecache
Waiting for process with pid 59537 to finish.
將上面復(fù)現(xiàn)命令中dnf換成yum,同樣可復(fù)現(xiàn)。
2.問題分析結(jié)果:
代碼分析可知,dnf處理的各類事務(wù)(安裝,升級,卸載)會產(chǎn)生不同的鎖文件。dnf/yum事務(wù)執(zhí)行流程是首先查看有無和該事務(wù)對應(yīng)的鎖文件,如沒有則創(chuàng)建鎖文件并寫入事務(wù)對應(yīng)進(jìn)程號,再執(zhí)行事務(wù)。如有鎖文件則通過進(jìn)程號來判定鎖文件中進(jìn)程號是否被某個(gè)進(jìn)程占有。未被占用則運(yùn)行事務(wù),不占用則會等待。當(dāng)dnf進(jìn)程異常退出且未清理鎖文件,文件進(jìn)程號又恰好被非 dnf/yum進(jìn)程占有時(shí),dnf/yum再次執(zhí)行會等待被鎖文件標(biāo)示的進(jìn)程運(yùn)行結(jié)束后再開始執(zhí)行事務(wù),此進(jìn)程一直不退出則會導(dǎo)致dnf/yum無法使用。基于此問題優(yōu)化了對鎖文件的處理邏輯:在鎖文件中的進(jìn)程號被某個(gè)進(jìn)程占有后,進(jìn)一步判斷該進(jìn)程是否為 dnf/yum,如不是則向鎖文件寫入dnf/yum的進(jìn)程號,接管鎖文件后繼續(xù)執(zhí)行事務(wù)。
3.補(bǔ)丁及下載地址:
從軟件倉庫更新
4.修復(fù)和更新方法:
銀河麒麟高級服務(wù)器操作系統(tǒng) V10 SP2 需要更新 dnf 軟件包到 dnf-4.2.23-3.p07 或以上版本。