When scheduling builds in parallel for --jobs, avoid potential build dir
authorZac Medico <zmedico@gentoo.org>
Wed, 11 Mar 2009 03:27:27 +0000 (03:27 -0000)
committerZac Medico <zmedico@gentoo.org>
Wed, 11 Mar 2009 03:27:27 +0000 (03:27 -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. (trunk r12557)

svn path=/main/branches/2.1.6/; revision=12843

pym/_emerge/__init__.py

index 7636e3cdc33bb6743fa1160f0cee66e9a31e0766..160e32901a451f8bce8071199953cebbf5470b35 100644 (file)
@@ -9921,6 +9921,7 @@ class Scheduler(PollScheduler):
 
                self._digraph = digraph
                self._prune_digraph()
+               self._prevent_builddir_collisions()
 
        def _prune_digraph(self):
                """
@@ -9943,6 +9944,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