1From 3881757eabfde2ff54400ab127b106ab085d83f0 Mon Sep 17 00:00:00 2001 2From: Changqing Li <changqing.li@windriver.com> 3Date: Wed, 13 Mar 2024 11:22:05 +0800 4Subject: [PATCH] lock.py: fix Exception handling 5 6Before, when logdir is not writable, _try_lock will raise an Exception 7like "Permission denied: '/var/log/log_lock.pid'", and in this case, 8_unlock_thread will not be called and the variable count will not be 9handled, it maybe cause log_lock.pid not be deleted in case like [1]. 10 11For [1], it is an cross compile case, when dnf install some packages to 12rootfs, seems like some threads don't do chroot like work, some threads 13do chroot like work. so for the threads don't do chroot, "Permission denied" 14Exception happend, for the threads that do chroot, log_lock.pid will be 15created under installroot/var/log/log_lock.pid, since variable count not 16handled correct before, log_lock.pid may not be deleted correctly. 17 18So fixed like this, if _try_lock raise Exception, _unlock_thread first, 19then raise the Exception. 20 21[1] https://github.com/rpm-software-management/dnf/issues/1963 22 23Upstream-Status: Submitted [ https://github.com/rpm-software-management/dnf/pull/2065 ] 24 25Signed-off-by: Changqing Li <changqing.li@windriver.com> 26--- 27 dnf/lock.py | 12 ++++++++++-- 28 1 file changed, 10 insertions(+), 2 deletions(-) 29 30diff --git a/dnf/lock.py b/dnf/lock.py 31index 6817aac9..5718062a 100644 32--- a/dnf/lock.py 33+++ b/dnf/lock.py 34@@ -128,7 +128,11 @@ class ProcessLock(object): 35 self._lock_thread() 36 prev_pid = -1 37 my_pid = os.getpid() 38- pid = self._try_lock(my_pid) 39+ try: 40+ pid = self._try_lock(my_pid) 41+ except Exception: 42+ self._unlock_thread() 43+ raise 44 while pid != my_pid: 45 if pid != -1: 46 if not self.blocking: 47@@ -140,7 +144,11 @@ class ProcessLock(object): 48 logger.info(msg) 49 prev_pid = pid 50 time.sleep(1) 51- pid = self._try_lock(my_pid) 52+ try: 53+ pid = self._try_lock(my_pid) 54+ except Exception: 55+ self._unlock_thread() 56+ raise 57 58 def __exit__(self, *exc_args): 59 if self.count == 1: 60-- 612.25.1 62 63