The lockfile function is expected to raise PermissionDenied if
the (root) parent process holds the lock, so retry in this case.

Bug: https://bugs.gentoo.org/468990
Signed-off-by: Zac Medico <zmed...@gentoo.org>
---
 bin/ebuild-ipc.py | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/bin/ebuild-ipc.py b/bin/ebuild-ipc.py
index 4999c043a..6eaa658a2 100755
--- a/bin/ebuild-ipc.py
+++ b/bin/ebuild-ipc.py
@@ -158,7 +158,16 @@ class EbuildIpc:
         # Make locks quiet since unintended locking messages displayed on
         # stdout could corrupt the intended output of this program.
         portage.locks._quiet = True
-        lock_obj = portage.locks.lockfile(self.ipc_lock_file, unlinkfile=True)
+        # Acquire lock with PermissionDenied retry for bug #468990.
+        for _ in range(1000):
+            try:
+                lock_obj = portage.locks.lockfile(self.ipc_lock_file, 
unlinkfile=True)
+            except portage.exception.PermissionDenied:
+                time.sleep(0.1)
+            else:
+                break
+        else:
+            raise portage.exception.PermissionDenied(self.ipc_lock_file)
 
         try:
             return self._communicate(args)
-- 
2.32.0


Reply via email to