Add FEATURES=parallel-install for finer locks.
authorZac Medico <zmedico@gentoo.org>
Sun, 8 May 2011 03:29:27 +0000 (20:29 -0700)
committerZac Medico <zmedico@gentoo.org>
Sun, 8 May 2011 04:35:18 +0000 (21:35 -0700)
man/make.conf.5
pym/_emerge/Scheduler.py
pym/portage/const.py
pym/portage/dbapi/vartree.py

index 389bab1db17bde010afd24a6b73b12a06b23eb3c..067f7065aff95532628be808d13f7ef10c023afc 100644 (file)
@@ -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
index fc69d48aeebbd5138154d9e171183a3fb3e12df6..182ad87711e9cf70e7bbe048c425758da498b863 100644 (file)
@@ -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):
                """
index 0bd56b20f3493ab5be4051214617029f5dd913d3..98f3dac6df977caade89553a00c1fb8555e679bd 100644 (file)
@@ -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",
index 2708e43073e3195b76b2182084cbc000376fa39f..92c467d432ae5acd4185079d481785abaee5ee7a 100644 (file)
@@ -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):
        """