diff options
author | Joshua Watt <JPEWhacker@gmail.com> | 2024-02-18 15:59:50 -0700 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2024-02-19 11:58:12 +0000 |
commit | 37b4d7e4931cb032659273c19520d74083ffb0e9 (patch) | |
tree | e68b6d0905db327ab0da110670a5f57952774288 /bitbake/lib/hashserv/client.py | |
parent | 2406bd10550997ecd033baad93fcb59b223c5aa8 (diff) | |
download | poky-37b4d7e4931cb032659273c19520d74083ffb0e9.tar.gz |
bitbake: hashserv: Add Client Pool
Implements a Client Pool derived from the AsyncRPC client pool that
allows querying for multiple equivalent hashes in parallel
(Bitbake rev: ba4c764d8061c7b88cd4985ca493d6ea6e317106)
Signed-off-by: Joshua Watt <JPEWhacker@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/hashserv/client.py')
-rw-r--r-- | bitbake/lib/hashserv/client.py | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/bitbake/lib/hashserv/client.py b/bitbake/lib/hashserv/client.py index daf1e12842..b269879ecf 100644 --- a/bitbake/lib/hashserv/client.py +++ b/bitbake/lib/hashserv/client.py | |||
@@ -283,3 +283,83 @@ class Client(bb.asyncrpc.Client): | |||
283 | 283 | ||
284 | def _get_async_client(self): | 284 | def _get_async_client(self): |
285 | return AsyncClient(self.username, self.password) | 285 | return AsyncClient(self.username, self.password) |
286 | |||
287 | |||
288 | class ClientPool(bb.asyncrpc.ClientPool): | ||
289 | def __init__( | ||
290 | self, | ||
291 | address, | ||
292 | max_clients, | ||
293 | *, | ||
294 | username=None, | ||
295 | password=None, | ||
296 | become=None, | ||
297 | ): | ||
298 | super().__init__(max_clients) | ||
299 | self.address = address | ||
300 | self.username = username | ||
301 | self.password = password | ||
302 | self.become = become | ||
303 | |||
304 | async def _new_client(self): | ||
305 | client = await create_async_client( | ||
306 | self.address, | ||
307 | username=self.username, | ||
308 | password=self.password, | ||
309 | ) | ||
310 | if self.become: | ||
311 | await client.become_user(self.become) | ||
312 | return client | ||
313 | |||
314 | def _run_key_tasks(self, queries, call): | ||
315 | results = {key: None for key in queries.keys()} | ||
316 | |||
317 | def make_task(key, args): | ||
318 | async def task(client): | ||
319 | nonlocal results | ||
320 | unihash = await call(client, args) | ||
321 | results[key] = unihash | ||
322 | |||
323 | return task | ||
324 | |||
325 | def gen_tasks(): | ||
326 | for key, args in queries.items(): | ||
327 | yield make_task(key, args) | ||
328 | |||
329 | self.run_tasks(gen_tasks()) | ||
330 | return results | ||
331 | |||
332 | def get_unihashes(self, queries): | ||
333 | """ | ||
334 | Query multiple unihashes in parallel. | ||
335 | |||
336 | The queries argument is a dictionary with arbitrary key. The values | ||
337 | must be a tuple of (method, taskhash). | ||
338 | |||
339 | Returns a dictionary with a corresponding key for each input key, and | ||
340 | the value is the queried unihash (which might be none if the query | ||
341 | failed) | ||
342 | """ | ||
343 | |||
344 | async def call(client, args): | ||
345 | method, taskhash = args | ||
346 | return await client.get_unihash(method, taskhash) | ||
347 | |||
348 | return self._run_key_tasks(queries, call) | ||
349 | |||
350 | def unihashes_exist(self, queries): | ||
351 | """ | ||
352 | Query multiple unihash existence checks in parallel. | ||
353 | |||
354 | The queries argument is a dictionary with arbitrary key. The values | ||
355 | must be a unihash. | ||
356 | |||
357 | Returns a dictionary with a corresponding key for each input key, and | ||
358 | the value is True or False if the unihash is known by the server (or | ||
359 | None if there was a failure) | ||
360 | """ | ||
361 | |||
362 | async def call(client, unihash): | ||
363 | return await client.unihash_exists(unihash) | ||
364 | |||
365 | return self._run_key_tasks(queries, call) | ||