diff options
author | Scott Murray <scott.murray@konsulko.com> | 2021-08-19 12:46:42 -0400 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2021-08-23 08:30:54 +0100 |
commit | 4df610473f21da79164ed01927103d13240d4c2a (patch) | |
tree | 9f125b4888017e5c9be825c53a855fd54e4e3888 /bitbake/lib/bb/asyncrpc/client.py | |
parent | fdc908f321da852856a07c19e3d9a33ccb273dda (diff) | |
download | poky-4df610473f21da79164ed01927103d13240d4c2a.tar.gz |
bitbake: bitbake: asyncrpc: always create new asyncio loops
asyncio in older Python 3.x (seen with 3.7) can seemingly hang if
new_event_loop is called repeatedly in the same process. The
reuse of processes in the Bitbake thread pool during parsing seems
to be able to trigger this with the PR server export selftest.
It appears that calling set_event_loop with the new loop avoids the
issue, so that is now done in the asyncrpc Client initializer (with
an explanatory comment). This should be revisited when the day
arrives that Python 3.9 becomes the minimum required for BitBake.
Additionally, it was discovered that using get_event_loop in the
asyncrpc server initialization can trigger hangs in the hashserv
unittests when the second test is run. To avoid this, switch to
calling new_event_loop + set_event_loop in the initialization code
there as well.
(Bitbake rev: bb9a36563505652294b20b4c88199b24fa208342)
Signed-off-by: Scott Murray <scott.murray@konsulko.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/asyncrpc/client.py')
-rw-r--r-- | bitbake/lib/bb/asyncrpc/client.py | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/bitbake/lib/bb/asyncrpc/client.py b/bitbake/lib/bb/asyncrpc/client.py index 3eb4fdde8a..50e60d5c31 100644 --- a/bitbake/lib/bb/asyncrpc/client.py +++ b/bitbake/lib/bb/asyncrpc/client.py | |||
@@ -119,6 +119,16 @@ class Client(object): | |||
119 | self.client = self._get_async_client() | 119 | self.client = self._get_async_client() |
120 | self.loop = asyncio.new_event_loop() | 120 | self.loop = asyncio.new_event_loop() |
121 | 121 | ||
122 | # Override any pre-existing loop. | ||
123 | # Without this, the PR server export selftest triggers a hang | ||
124 | # when running with Python 3.7. The drawback is that there is | ||
125 | # potential for issues if the PR and hash equiv (or some new) | ||
126 | # clients need to both be instantiated in the same process. | ||
127 | # This should be revisited if/when Python 3.9 becomes the | ||
128 | # minimum required version for BitBake, as it seems not | ||
129 | # required (but harmless) with it. | ||
130 | asyncio.set_event_loop(self.loop) | ||
131 | |||
122 | self._add_methods('connect_tcp', 'close', 'ping') | 132 | self._add_methods('connect_tcp', 'close', 'ping') |
123 | 133 | ||
124 | @abc.abstractmethod | 134 | @abc.abstractmethod |