Gentoo Archives: gentoo-portage-dev

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