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 |