Gentoo Archives: gentoo-portage-dev

From: Zac Medico <zmedico@g.o>
To: gentoo-portage-dev@l.g.o
Cc: Zac Medico <zmedico@g.o>
Subject: [gentoo-portage-dev] [PATCH] AbstractEbuildProcess: use mkdtemp to avoid cgroup interference (bug 554108)
Date: Tue, 07 Jul 2015 07:27:01
Message-Id: 1436253825-22016-1-git-send-email-zmedico@gentoo.org
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

Replies