From 2a90c6f5debe3f18da3317f47dfb144c559fb920 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Sat, 7 May 2011 20:29:27 -0700 Subject: Add FEATURES=parallel-install for finer locks. --- man/make.conf.5 | 7 ++++++- pym/_emerge/Scheduler.py | 3 ++- pym/portage/const.py | 3 ++- pym/portage/dbapi/vartree.py | 10 ++++++++++ 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/man/make.conf.5 b/man/make.conf.5 index 389bab1db..067f7065a 100644 --- a/man/make.conf.5 +++ b/man/make.conf.5 @@ -267,7 +267,7 @@ when a problem arises (normally due to a crash or disconnect). .TP .B ebuild\-locks Use locks to ensure that unsandboxed ebuild phases never execute -concurrently. +concurrently. Also see \fIparallel\-install\fR. .TP .B fakeroot Enable fakeroot for the install and package phases when a non-root user runs @@ -373,6 +373,11 @@ Fetch in the background while compiling. Run `tail \-f /var/log/emerge\-fetch.log` in a terminal to view parallel-fetch progress. .TP +.B parallel\-install +Use finer\-grained locks when installing packages, allowing for greater +parallelization. For additional parallelization, disable +\fIebuild\-locks\fR. +.TP .B parse\-eapi\-ebuild\-head Parse \fBEAPI\fR from the head of the ebuild (first 30 lines). This feature is only intended for experimental purposes and should not be enabled under diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py index fc69d48ae..182ad8771 100644 --- a/pym/_emerge/Scheduler.py +++ b/pym/_emerge/Scheduler.py @@ -387,7 +387,8 @@ class Scheduler(PollScheduler): def _set_max_jobs(self, max_jobs): self._max_jobs = max_jobs self._task_queues.jobs.max_jobs = max_jobs - self._task_queues.merge.max_jobs = max_jobs + if "parallel-install" in self.settings.features: + self._task_queues.merge.max_jobs = max_jobs def _background_mode(self): """ diff --git a/pym/portage/const.py b/pym/portage/const.py index 0bd56b20f..98f3dac6d 100644 --- a/pym/portage/const.py +++ b/pym/portage/const.py @@ -93,7 +93,8 @@ SUPPORTED_FEATURES = frozenset([ "installsources", "keeptemp", "keepwork", "fixlafiles", "lmirror", "metadata-transfer", "mirror", "multilib-strict", "news", "noauto", "noclean", "nodoc", "noinfo", "noman", - "nostrip", "notitles", "parallel-fetch", "parse-eapi-ebuild-head", + "nostrip", "notitles", "parallel-fetch", "parallel-install", + "parse-eapi-ebuild-head", "prelink-checksums", "preserve-libs", "protect-owned", "python-trace", "sandbox", "selinux", "sesandbox", "severe", "sfperms", diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index 2708e4307..92c467d43 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -3914,6 +3914,9 @@ class dblink(object): """ myroot = None retval = -1 + parallel_install = "parallel-install" in self.settings.features + if not parallel_install: + self.lockdb() self.vartree.dbapi._bump_mtime(self.mycpv) try: retval = self.treewalk(mergeroot, myroot, inforoot, myebuild, @@ -3966,6 +3969,8 @@ class dblink(object): else: self.vartree.dbapi._linkmap._clear_cache() self.vartree.dbapi._bump_mtime(self.mycpv) + if not parallel_install: + self.unlockdb() return retval def getstring(self,name): @@ -4066,6 +4071,9 @@ def unmerge(cat, pkg, myroot=None, settings=None, mylink = dblink(cat, pkg, settings=settings, treetype="vartree", vartree=vartree, scheduler=scheduler) vartree = mylink.vartree + parallel_install = "parallel-install" in self.settings.features + if not parallel_install: + self.lockdb() try: if mylink.exists(): retval = mylink.unmerge(ldpath_mtimes=ldpath_mtimes) @@ -4083,6 +4091,8 @@ def unmerge(cat, pkg, myroot=None, settings=None, pass else: vartree.dbapi._linkmap._clear_cache() + if not parallel_install: + self.unlockdb() def write_contents(contents, root, f): """ -- cgit v1.2.3-1-g7c22