When scheduling builds in parallel for --jobs, avoid potential build dir
authorZac Medico <zmedico@gentoo.org>
Wed, 28 Jan 2009 08:47:38 +0000 (08:47 -0000)
committerZac Medico <zmedico@gentoo.org>
Wed, 28 Jan 2009 08:47:38 +0000 (08:47 -0000)
collisions in cases when the same exact cpv needs to be merged to multiple
$ROOTs (like when building stages). Thanks for Daniel Robbins for reporting
this issue and troubleshooting it.

svn path=/main/trunk/; revision=12557

pym/_emerge/__init__.py

index 7f02a48d732e2693b984895008142e0661c90012..881ba9cc6252ca4b981ba8e579c3d5c6179d872e 100644 (file)
@@ -9937,6 +9937,7 @@ class Scheduler(PollScheduler):
 
                self._digraph = digraph
                self._prune_digraph()
+               self._prevent_builddir_collisions()
 
        def _prune_digraph(self):
                """
@@ -9959,6 +9960,26 @@ class Scheduler(PollScheduler):
                                break
                        removed_nodes.clear()
 
+       def _prevent_builddir_collisions(self):
+               """
+               When building stages, sometimes the same exact cpv needs to be merged
+               to both $ROOTs. Add edges to the digraph in order to avoid collisions
+               in the builddir. Currently, normal file locks would be inappropriate
+               for this purpose since emerge holds all of it's build dir locks from
+               the main process.
+               """
+               cpv_map = {}
+               for pkg in self._mergelist:
+                       if pkg.installed:
+                               continue
+                       if pkg.cpv not in cpv_map:
+                               cpv_map[pkg.cpv] = [pkg]
+                               continue
+                       for earlier_pkg in cpv_map[pkg.cpv]:
+                               self._digraph.add(earlier_pkg, pkg,
+                                       priority=DepPriority(buildtime=True))
+                       cpv_map[pkg.cpv].append(pkg)
+
        class _pkg_failure(portage.exception.PortageException):
                """
                An instance of this class is raised by unmerge() when