aboutsummaryrefslogtreecommitdiffstats
path: root/lib/hashserv
diff options
context:
space:
mode:
authorJoshua Watt <JPEWhacker@gmail.com>2023-11-03 08:26:27 -0600
committerRichard Purdie <richard.purdie@linuxfoundation.org>2023-11-09 17:21:15 +0000
commitd0bbb98553f5f3451606bd5f089b36cfe4219dc2 (patch)
treef13ff033bd46a47156ba5749f9779891f35386de /lib/hashserv
parente0b73466dd7478c77c82f46879246c1b68b228c0 (diff)
downloadbitbake-d0bbb98553f5f3451606bd5f089b36cfe4219dc2.tar.gz
hashserv: Implement read-only version of "report" RPC
When the hash equivalence server is in read-only mode, it should still return a unihash for a given "report" call if there is one. Signed-off-by: Joshua Watt <JPEWhacker@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'lib/hashserv')
-rw-r--r--lib/hashserv/server.py25
-rw-r--r--lib/hashserv/tests.py4
2 files changed, 26 insertions, 3 deletions
diff --git a/lib/hashserv/server.py b/lib/hashserv/server.py
index 84cf4f228..c691df761 100644
--- a/lib/hashserv/server.py
+++ b/lib/hashserv/server.py
@@ -124,6 +124,7 @@ class ServerClient(bb.asyncrpc.AsyncServerConnection):
self.max_chunk = bb.asyncrpc.DEFAULT_MAX_CHUNK
self.backfill_queue = backfill_queue
self.upstream = upstream
+ self.read_only = read_only
self.handlers.update(
{
@@ -131,13 +132,15 @@ class ServerClient(bb.asyncrpc.AsyncServerConnection):
"get-outhash": self.handle_get_outhash,
"get-stream": self.handle_get_stream,
"get-stats": self.handle_get_stats,
+ # Not always read-only, but internally checks if the server is
+ # read-only
+ "report": self.handle_report,
}
)
if not read_only:
self.handlers.update(
{
- "report": self.handle_report,
"report-equiv": self.handle_equivreport,
"reset-stats": self.handle_reset_stats,
"backfill-wait": self.handle_backfill_wait,
@@ -284,7 +287,27 @@ class ServerClient(bb.asyncrpc.AsyncServerConnection):
await self.socket.send("ok")
return self.NO_RESPONSE
+ async def report_readonly(self, data):
+ method = data["method"]
+ outhash = data["outhash"]
+ taskhash = data["taskhash"]
+
+ info = await self.get_outhash(method, outhash, taskhash)
+ if info:
+ unihash = info["unihash"]
+ else:
+ unihash = data["unihash"]
+
+ return {
+ "taskhash": taskhash,
+ "method": method,
+ "unihash": unihash,
+ }
+
async def handle_report(self, data):
+ if self.read_only:
+ return await self.report_readonly(data)
+
outhash_data = {
"method": data["method"],
"outhash": data["outhash"],
diff --git a/lib/hashserv/tests.py b/lib/hashserv/tests.py
index 268b27006..e9a361dc4 100644
--- a/lib/hashserv/tests.py
+++ b/lib/hashserv/tests.py
@@ -387,8 +387,8 @@ class HashEquivalenceCommonTests(object):
outhash2 = '3c979c3db45c569f51ab7626a4651074be3a9d11a84b1db076f5b14f7d39db44'
unihash2 = '90e9bc1d1f094c51824adca7f8ea79a048d68824'
- with self.assertRaises(ConnectionError):
- ro_client.report_unihash(taskhash2, self.METHOD, outhash2, unihash2)
+ result = ro_client.report_unihash(taskhash2, self.METHOD, outhash2, unihash2)
+ self.assertEqual(result['unihash'], unihash2)
# Ensure that the database was not modified
self.assertClientGetHash(rw_client, taskhash2, None)