summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2011-05-07 20:29:27 -0700
committerZac Medico <zmedico@gentoo.org>2011-05-07 21:35:18 -0700
commit2a90c6f5debe3f18da3317f47dfb144c559fb920 (patch)
treedfbd571fb22067ecaeab848c5829c4e020b19678
parentbc5d73fa3db0569c55d48c2e738f12742579536c (diff)
downloadportage-2a90c6f5debe3f18da3317f47dfb144c559fb920.tar.gz
portage-2a90c6f5debe3f18da3317f47dfb144c559fb920.tar.bz2
portage-2a90c6f5debe3f18da3317f47dfb144c559fb920.zip
Add FEATURES=parallel-install for finer locks.
-rw-r--r--man/make.conf.57
-rw-r--r--pym/_emerge/Scheduler.py3
-rw-r--r--pym/portage/const.py3
-rw-r--r--pym/portage/dbapi/vartree.py10
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):
"""