summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/asyncrpc/client.py
diff options
context:
space:
mode:
authorScott Murray <scott.murray@konsulko.com>2021-08-19 12:46:42 -0400
committerRichard Purdie <richard.purdie@linuxfoundation.org>2021-08-23 08:30:54 +0100
commit4df610473f21da79164ed01927103d13240d4c2a (patch)
tree9f125b4888017e5c9be825c53a855fd54e4e3888 /bitbake/lib/bb/asyncrpc/client.py
parentfdc908f321da852856a07c19e3d9a33ccb273dda (diff)
downloadpoky-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.py10
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