diff options
author | Joshua Watt <JPEWhacker@gmail.com> | 2024-02-18 15:59:48 -0700 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2024-02-19 11:58:12 +0000 |
commit | 3bd2c69e70853584beaaa5a4fd62589fa051d911 (patch) | |
tree | 3dc6469a1895cc7a31a58e4fc9dc43cef9a82cfb /bitbake/lib/hashserv/client.py | |
parent | be909636c608d5ba24a41327c53d6a4ba3b70151 (diff) | |
download | poky-3bd2c69e70853584beaaa5a4fd62589fa051d911.tar.gz |
bitbake: hashserv: Add unihash-exists API
Adds API to check if the server is aware of the existence of a given
unihash. This can be used as an optimization for sstate where a client
can query the hash equivalence server to check if a unihash exists
before querying the sstate cache. If the hash server isn't aware of the
existence of a unihash, then there is very likely not a matching sstate
object, so this should be able to significantly cut down on the number
of negative hits on the sstate cache.
(Bitbake rev: cfe0ac071cfb998e4a1dd263f8860b140843361a)
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 | 44 |
1 files changed, 34 insertions, 10 deletions
diff --git a/bitbake/lib/hashserv/client.py b/bitbake/lib/hashserv/client.py index e6dc417912..daf1e12842 100644 --- a/bitbake/lib/hashserv/client.py +++ b/bitbake/lib/hashserv/client.py | |||
@@ -16,6 +16,7 @@ logger = logging.getLogger("hashserv.client") | |||
16 | class AsyncClient(bb.asyncrpc.AsyncClient): | 16 | class AsyncClient(bb.asyncrpc.AsyncClient): |
17 | MODE_NORMAL = 0 | 17 | MODE_NORMAL = 0 |
18 | MODE_GET_STREAM = 1 | 18 | MODE_GET_STREAM = 1 |
19 | MODE_EXIST_STREAM = 2 | ||
19 | 20 | ||
20 | def __init__(self, username=None, password=None): | 21 | def __init__(self, username=None, password=None): |
21 | super().__init__("OEHASHEQUIV", "1.1", logger) | 22 | super().__init__("OEHASHEQUIV", "1.1", logger) |
@@ -49,19 +50,36 @@ class AsyncClient(bb.asyncrpc.AsyncClient): | |||
49 | await self.socket.send("END") | 50 | await self.socket.send("END") |
50 | return await self.socket.recv() | 51 | return await self.socket.recv() |
51 | 52 | ||
52 | if new_mode == self.MODE_NORMAL and self.mode == self.MODE_GET_STREAM: | 53 | async def normal_to_stream(command): |
54 | r = await self.invoke({command: None}) | ||
55 | if r != "ok": | ||
56 | raise ConnectionError( | ||
57 | f"Unable to transition to stream mode: Bad response from server {r!r}" | ||
58 | ) | ||
59 | |||
60 | self.logger.debug("Mode is now %s", command) | ||
61 | |||
62 | if new_mode == self.mode: | ||
63 | return | ||
64 | |||
65 | self.logger.debug("Transitioning mode %s -> %s", self.mode, new_mode) | ||
66 | |||
67 | # Always transition to normal mode before switching to any other mode | ||
68 | if self.mode != self.MODE_NORMAL: | ||
53 | r = await self._send_wrapper(stream_to_normal) | 69 | r = await self._send_wrapper(stream_to_normal) |
54 | if r != "ok": | 70 | if r != "ok": |
55 | self.check_invoke_error(r) | 71 | self.check_invoke_error(r) |
56 | raise ConnectionError("Unable to transition to normal mode: Bad response from server %r" % r) | 72 | raise ConnectionError( |
57 | elif new_mode == self.MODE_GET_STREAM and self.mode == self.MODE_NORMAL: | 73 | f"Unable to transition to normal mode: Bad response from server {r!r}" |
58 | r = await self.invoke({"get-stream": None}) | 74 | ) |
59 | if r != "ok": | 75 | self.logger.debug("Mode is now normal") |
60 | raise ConnectionError("Unable to transition to stream mode: Bad response from server %r" % r) | 76 | |
61 | elif new_mode != self.mode: | 77 | if new_mode == self.MODE_GET_STREAM: |
62 | raise Exception( | 78 | await normal_to_stream("get-stream") |
63 | "Undefined mode transition %r -> %r" % (self.mode, new_mode) | 79 | elif new_mode == self.MODE_EXIST_STREAM: |
64 | ) | 80 | await normal_to_stream("exists-stream") |
81 | elif new_mode != self.MODE_NORMAL: | ||
82 | raise Exception("Undefined mode transition {self.mode!r} -> {new_mode!r}") | ||
65 | 83 | ||
66 | self.mode = new_mode | 84 | self.mode = new_mode |
67 | 85 | ||
@@ -95,6 +113,11 @@ class AsyncClient(bb.asyncrpc.AsyncClient): | |||
95 | {"get": {"taskhash": taskhash, "method": method, "all": all_properties}} | 113 | {"get": {"taskhash": taskhash, "method": method, "all": all_properties}} |
96 | ) | 114 | ) |
97 | 115 | ||
116 | async def unihash_exists(self, unihash): | ||
117 | await self._set_mode(self.MODE_EXIST_STREAM) | ||
118 | r = await self.send_stream(unihash) | ||
119 | return r == "true" | ||
120 | |||
98 | async def get_outhash(self, method, outhash, taskhash, with_unihash=True): | 121 | async def get_outhash(self, method, outhash, taskhash, with_unihash=True): |
99 | await self._set_mode(self.MODE_NORMAL) | 122 | await self._set_mode(self.MODE_NORMAL) |
100 | return await self.invoke( | 123 | return await self.invoke( |
@@ -236,6 +259,7 @@ class Client(bb.asyncrpc.Client): | |||
236 | "report_unihash", | 259 | "report_unihash", |
237 | "report_unihash_equiv", | 260 | "report_unihash_equiv", |
238 | "get_taskhash", | 261 | "get_taskhash", |
262 | "unihash_exists", | ||
239 | "get_outhash", | 263 | "get_outhash", |
240 | "get_stats", | 264 | "get_stats", |
241 | "reset_stats", | 265 | "reset_stats", |