From: Zac Medico Date: Wed, 28 Jan 2009 08:47:38 +0000 (-0000) Subject: When scheduling builds in parallel for --jobs, avoid potential build dir X-Git-Tag: v2.2_rc24~240 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=43e23f470a35215a96c646d107e3a6dc31d16216;p=portage.git When scheduling builds in parallel for --jobs, avoid potential build dir 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 --- diff --git a/pym/_emerge/__init__.py b/pym/_emerge/__init__.py index 7f02a48d7..881ba9cc6 100644 --- a/pym/_emerge/__init__.py +++ b/pym/_emerge/__init__.py @@ -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