1 |
This fixes parallel builds of the same package, so they don't try |
2 |
to kill eachothers processes. |
3 |
|
4 |
Fixes: b01a1b90d8c5 ("Add FEATURES=cgroup to isolate phase processes.") |
5 |
X-Gentoo-Bug: 554108 |
6 |
X-Gentoo-Bug-url: https://bugs.gentoo.org/show_bug.cgi?id=554108 |
7 |
--- |
8 |
pym/_emerge/AbstractEbuildProcess.py | 21 ++++++++++++++------- |
9 |
1 file changed, 14 insertions(+), 7 deletions(-) |
10 |
|
11 |
diff --git a/pym/_emerge/AbstractEbuildProcess.py b/pym/_emerge/AbstractEbuildProcess.py |
12 |
index 31127f4..68d96e4 100644 |
13 |
--- a/pym/_emerge/AbstractEbuildProcess.py |
14 |
+++ b/pym/_emerge/AbstractEbuildProcess.py |
15 |
@@ -1,10 +1,12 @@ |
16 |
# Copyright 1999-2012 Gentoo Foundation |
17 |
# Distributed under the terms of the GNU General Public License v2 |
18 |
|
19 |
+import errno |
20 |
import io |
21 |
import platform |
22 |
import stat |
23 |
import subprocess |
24 |
+import tempfile |
25 |
import textwrap |
26 |
from _emerge.SpawnProcess import SpawnProcess |
27 |
from _emerge.EbuildBuildDir import EbuildBuildDir |
28 |
@@ -14,7 +16,7 @@ from portage.elog import messages as elog_messages |
29 |
from portage.localization import _ |
30 |
from portage.package.ebuild._ipc.ExitCommand import ExitCommand |
31 |
from portage.package.ebuild._ipc.QueryCommand import QueryCommand |
32 |
-from portage import os |
33 |
+from portage import shutil, os |
34 |
from portage.util._pty import _create_pty_or_pipe |
35 |
from portage.util import apply_secpass_permissions |
36 |
|
37 |
@@ -69,9 +71,7 @@ class AbstractEbuildProcess(SpawnProcess): |
38 |
and self.phase not in self._phases_without_cgroup): |
39 |
cgroup_root = '/sys/fs/cgroup' |
40 |
cgroup_portage = os.path.join(cgroup_root, 'portage') |
41 |
- cgroup_path = os.path.join(cgroup_portage, |
42 |
- '%s:%s' % (self.settings["CATEGORY"], |
43 |
- self.settings["PF"])) |
44 |
+ |
45 |
try: |
46 |
# cgroup tmpfs |
47 |
if not os.path.ismount(cgroup_root): |
48 |
@@ -90,9 +90,9 @@ class AbstractEbuildProcess(SpawnProcess): |
49 |
'-o', 'rw,nosuid,nodev,noexec,none,name=portage', |
50 |
'tmpfs', cgroup_portage]) |
51 |
|
52 |
- # the ebuild cgroup |
53 |
- if not os.path.isdir(cgroup_path): |
54 |
- os.mkdir(cgroup_path) |
55 |
+ cgroup_path = tempfile.mkdtemp(dir=cgroup_portage, |
56 |
+ prefix='%s:%s.' % (self.settings["CATEGORY"], |
57 |
+ self.settings["PF"])) |
58 |
except (subprocess.CalledProcessError, OSError): |
59 |
pass |
60 |
else: |
61 |
@@ -313,6 +313,13 @@ class AbstractEbuildProcess(SpawnProcess): |
62 |
def _set_returncode(self, wait_retval): |
63 |
SpawnProcess._set_returncode(self, wait_retval) |
64 |
|
65 |
+ if self.cgroup is not None: |
66 |
+ try: |
67 |
+ shutil.rmtree(self.cgroup) |
68 |
+ except EnvironmentError as e: |
69 |
+ if e.errno != errno.ENOENT: |
70 |
+ raise |
71 |
+ |
72 |
if self._exit_timeout_id is not None: |
73 |
self.scheduler.source_remove(self._exit_timeout_id) |
74 |
self._exit_timeout_id = None |
75 |
-- |
76 |
2.4.5 |