public inbox for gentoo-portage-dev@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-portage-dev] [PATCH] dblink.treewalk: lock for parallel-install with blockers (bug 576888)
@ 2016-03-09 21:57 Zac Medico
  2016-03-09 22:27 ` [gentoo-portage-dev] " Zac Medico
  0 siblings, 1 reply; 2+ messages in thread
From: Zac Medico @ 2016-03-09 21:57 UTC (permalink / raw
  To: gentoo-portage-dev; +Cc: Zac Medico

For parallel-install, lock when interacting with blocked packages, in
order to account for blocked packages being removed or replaced
concurrently.

X-Gentoo-Bug:     576888
X-Gentoo-Bug-url: https://bugs.gentoo.org/show_bug.cgi?id=576888
---
 pym/portage/dbapi/vartree.py | 45 ++++++++++++++++++++++++++++++++++----------
 1 file changed, 35 insertions(+), 10 deletions(-)

diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py
index e7effca..6d4514c 100644
--- a/pym/portage/dbapi/vartree.py
+++ b/pym/portage/dbapi/vartree.py
@@ -3932,9 +3932,25 @@ class dblink(object):
 		blockers = self._blockers
 		if blockers is None:
 			blockers = []
-		collisions, dirs_ro, symlink_collisions, plib_collisions = \
-			self._collision_protect(srcroot, destroot,
-			others_in_slot + blockers, filelist, linklist)
+
+		# For parallel-install, acquire a lock to interact
+		# with blocked packages.
+		with_lock = bool(blockers) and "parallel-install" in self.settings.features
+
+		if with_lock:
+			self.lockdb()
+			self.vartree.dbapi._fs_lock()
+			# Filter out any blocked packages that may have
+			# been uninstalled concurrently.
+			blockers = [blocker for blocker in blockers if blocker.exists()]
+		try:
+			collisions, dirs_ro, symlink_collisions, plib_collisions = \
+				self._collision_protect(srcroot, destroot,
+				others_in_slot + blockers, filelist, linklist)
+		finally:
+			if with_lock:
+				self.vartree.dbapi._fs_unlock()
+				self.unlockdb()
 
 		# Check for read-only filesystems.
 		ro_checker = get_ro_checker()
@@ -4290,13 +4306,22 @@ class dblink(object):
 		self._clear_contents_cache()
 		contents = self.getcontents()
 		destroot_len = len(destroot) - 1
-		self.lockdb()
-		try:
-			for blocker in blockers:
-				self.vartree.dbapi.removeFromContents(blocker, iter(contents),
-					relative_paths=False)
-		finally:
-			self.unlockdb()
+
+		if blockers:
+			self.lockdb()
+			self.vartree.dbapi._fs_lock()
+			try:
+				for blocker in blockers:
+					# Blocked packages may have been removed
+					# or replaced concurrently, so check if
+					# they still exist, and clear contents cache.
+					if blocker.exists():
+						blocker._clear_contents_cache()
+						self.vartree.dbapi.removeFromContents(blocker,
+							iter(contents), relative_paths=False)
+			finally:
+				self.vartree.dbapi._fs_unlock()
+				self.unlockdb()
 
 		plib_registry = self.vartree.dbapi._plib_registry
 		if plib_registry:
-- 
2.4.10



^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2016-03-09 22:28 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-03-09 21:57 [gentoo-portage-dev] [PATCH] dblink.treewalk: lock for parallel-install with blockers (bug 576888) Zac Medico
2016-03-09 22:27 ` [gentoo-portage-dev] " Zac Medico

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox