Files
poky/meta/recipes-devtools/dnf/dnf/0001-lock.py-fix-Exception-handling.patch
Changqing Li 319353cd9d dnf: fix Exception handling for class ProcessLock
Yocto based systems will sometimes have log_lock.pid left in target
filesystems.  Users typing 'ls /' will notice it, and will never be
removed.

It happened when log rotate happened, refer [1], since the problem
descripted in patch 0001-lock.py-fix-Exception-handling.patch, file
log_lock.pid will not be removed after dnf exit. For target system,
refer [4], dnf have a solution to remove it. But for OE, refer commit
[2][3], for fix another issue, OE changed log_lock.pid to root dir for
native dnf, so solution in [4] not works for log_lock.pid under "/", so
it will always exist under "/" of target system.

Use patch 0001-lock.py-fix-Exception-handling.patch to fix the problem.

[1] a6d82221ae/dnf/logging.py (L127C31-L127C42)
[2] https://git.openembedded.org/openembedded-core/commit/?id=742a1b71249f4da1c8d8e13e270b0eb6128a3f66
[3] https://git.openembedded.org/openembedded-core/commit/?id=7610f81586bd475f28fd3d89a7350771720c3264
[4] https://github.com/rpm-software-management/dnf/blob/master/etc/tmpfiles.d/dnf.conf

(From OE-Core rev: d86c0e3468504c6ed19e38750abbb8970b5b7691)

Signed-off-by: Changqing Li <changqing.li@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2024-03-30 22:25:43 +00:00

63 lines
2.2 KiB
Diff

From 3881757eabfde2ff54400ab127b106ab085d83f0 Mon Sep 17 00:00:00 2001
From: Changqing Li <changqing.li@windriver.com>
Date: Wed, 13 Mar 2024 11:22:05 +0800
Subject: [PATCH] lock.py: fix Exception handling
Before, when logdir is not writable, _try_lock will raise an Exception
like "Permission denied: '/var/log/log_lock.pid'", and in this case,
_unlock_thread will not be called and the variable count will not be
handled, it maybe cause log_lock.pid not be deleted in case like [1].
For [1], it is an cross compile case, when dnf install some packages to
rootfs, seems like some threads don't do chroot like work, some threads
do chroot like work. so for the threads don't do chroot, "Permission denied"
Exception happend, for the threads that do chroot, log_lock.pid will be
created under installroot/var/log/log_lock.pid, since variable count not
handled correct before, log_lock.pid may not be deleted correctly.
So fixed like this, if _try_lock raise Exception, _unlock_thread first,
then raise the Exception.
[1] https://github.com/rpm-software-management/dnf/issues/1963
Upstream-Status: Submitted [ https://github.com/rpm-software-management/dnf/pull/2065 ]
Signed-off-by: Changqing Li <changqing.li@windriver.com>
---
dnf/lock.py | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/dnf/lock.py b/dnf/lock.py
index 6817aac9..5718062a 100644
--- a/dnf/lock.py
+++ b/dnf/lock.py
@@ -128,7 +128,11 @@ class ProcessLock(object):
self._lock_thread()
prev_pid = -1
my_pid = os.getpid()
- pid = self._try_lock(my_pid)
+ try:
+ pid = self._try_lock(my_pid)
+ except Exception:
+ self._unlock_thread()
+ raise
while pid != my_pid:
if pid != -1:
if not self.blocking:
@@ -140,7 +144,11 @@ class ProcessLock(object):
logger.info(msg)
prev_pid = pid
time.sleep(1)
- pid = self._try_lock(my_pid)
+ try:
+ pid = self._try_lock(my_pid)
+ except Exception:
+ self._unlock_thread()
+ raise
def __exit__(self, *exc_args):
if self.count == 1:
--
2.25.1