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] MergeProcess: propagate mtimedb["ldpath"] to parent process (bug 836375)
Date: Sun, 17 Apr 2022 19:22:07
Message-Id: 20220417192141.13554-1-zmedico@gentoo.org
1 Use an instance of multiprocessing.Pipe to propagate mtimedb["ldpath"]
2 from the MergeProcess child process to the parent process. This fixes
3 env_update calls to avoid unnecessary regeneration of ld.so.cache in
4 cases where mtimedb["ldpath"] has not changed since the last call to
5 env_update.
6
7 Bug: https://bugs.gentoo.org/836375
8 ---
9 lib/portage/dbapi/_MergeProcess.py | 18 ++++++++++++++++++
10 lib/portage/dbapi/vartree.py | 10 ++++++++++
11 2 files changed, 28 insertions(+)
12
13 diff --git a/lib/portage/dbapi/_MergeProcess.py b/lib/portage/dbapi/_MergeProcess.py
14 index db3f3b105..667a5bf20 100644
15 --- a/lib/portage/dbapi/_MergeProcess.py
16 +++ b/lib/portage/dbapi/_MergeProcess.py
17 @@ -2,6 +2,7 @@
18 # Distributed under the terms of the GNU General Public License v2
19
20 import io
21 +import multiprocessing
22 import platform
23
24 import fcntl
25 @@ -38,6 +39,7 @@ class MergeProcess(ForkProcess):
26 "_dblink",
27 "_elog_keys",
28 "_locked_vdb",
29 + "_mtime_reader",
30 )
31
32 def _start(self):
33 @@ -113,6 +115,15 @@ class MergeProcess(ForkProcess):
34 self._elog_reader_fd = None
35 return False
36
37 + def _mtime_handler(self):
38 + try:
39 + mtimes = self._mtime_reader.recv()
40 + except EOFError:
41 + pass
42 + else:
43 + self.prev_mtimes.clear()
44 + self.prev_mtimes.update(mtimes)
45 +
46 def _spawn(self, args, fd_pipes, **kwargs):
47 """
48 Extend the superclass _spawn method to perform some pre-fork and
49 @@ -127,6 +138,11 @@ class MergeProcess(ForkProcess):
50 fcntl.fcntl(elog_reader_fd, fcntl.F_GETFL) | os.O_NONBLOCK,
51 )
52
53 + mtime_reader, mtime_writer = multiprocessing.Pipe(duplex=False)
54 + fd_pipes[mtime_writer.fileno()] = mtime_writer.fileno()
55 + self.scheduler.add_reader(mtime_reader.fileno(), self._mtime_handler)
56 + self._mtime_reader = mtime_reader
57 +
58 blockers = None
59 if self.blockers is not None:
60 # Query blockers in the main process, since closing
61 @@ -142,6 +158,7 @@ class MergeProcess(ForkProcess):
62 vartree=self.vartree,
63 blockers=blockers,
64 pipe=elog_writer_fd,
65 + mtime_pipe=mtime_writer,
66 )
67 fd_pipes[elog_writer_fd] = elog_writer_fd
68 self.scheduler.add_reader(elog_reader_fd, self._elog_output_handler)
69 @@ -160,6 +177,7 @@ class MergeProcess(ForkProcess):
70 self._elog_reader_fd = elog_reader_fd
71 pids = super(MergeProcess, self)._spawn(args, fd_pipes, **kwargs)
72 os.close(elog_writer_fd)
73 + mtime_writer.close()
74 self._buf = ""
75 self._elog_keys = set()
76 # Discard messages which will be collected by the subprocess,
77 diff --git a/lib/portage/dbapi/vartree.py b/lib/portage/dbapi/vartree.py
78 index 602913862..a95d60691 100644
79 --- a/lib/portage/dbapi/vartree.py
80 +++ b/lib/portage/dbapi/vartree.py
81 @@ -1806,6 +1806,7 @@ class dblink:
82 blockers=None,
83 scheduler=None,
84 pipe=None,
85 + mtime_pipe=None,
86 ):
87 """
88 Creates a DBlink object for a given CPV.
89 @@ -1862,6 +1863,7 @@ class dblink:
90 self._device_path_map = {}
91 self._hardlink_merge_map = {}
92 self._hash_key = (self._eroot, self.mycpv)
93 + self._mtime_pipe = mtime_pipe
94 self._protect_obj = None
95 self._pipe = pipe
96 self._postinst_failure = False
97 @@ -2618,6 +2620,7 @@ class dblink:
98 writemsg_level=self._display_merge,
99 vardbapi=self.vartree.dbapi,
100 )
101 + self._send_mtimes(ldpath_mtimes)
102
103 unmerge_with_replacement = preserve_paths is not None
104 if not unmerge_with_replacement:
105 @@ -4243,6 +4246,12 @@ class dblink:
106 def _emerge_log(self, msg):
107 emergelog(False, msg)
108
109 + def _send_mtimes(self, mtimes):
110 + if self._mtime_pipe is None:
111 + return
112 +
113 + self._mtime_pipe.send(mtimes)
114 +
115 def treewalk(
116 self,
117 srcroot,
118 @@ -5274,6 +5283,7 @@ class dblink:
119 writemsg_level=self._display_merge,
120 vardbapi=self.vartree.dbapi,
121 )
122 + self._send_mtimes(prev_mtimes)
123
124 # For gcc upgrades, preserved libs have to be removed after the
125 # the library path has been updated.
126 --
127 2.35.1