From: Joshua Watt <jpewhacker@gmail.com>
To: bitbake-devel@lists.openembedded.org
Cc: Michal Sieron <michal.sieron@nokia.com>,
Joshua Watt <JPEWhacker@gmail.com>
Subject: [bitbake-devel][PATCH 5/6] hashserv: server: Use streaming and queue API for upstream exist queries
Date: Fri, 24 Jul 2026 15:25:13 -0600 [thread overview]
Message-ID: <20260724212822.1165552-6-JPEWhacker@gmail.com> (raw)
In-Reply-To: <20260724212822.1165552-1-JPEWhacker@gmail.com>
Reworks the "unihash-exists" handler to use the new server queue API and
client streaming API to efficiently stream requests to the upstream
server instead of having to wait for a roundtrip on the requests.
Signed-off-by: Joshua Watt <JPEWhacker@gmail.com>
---
lib/hashserv/server.py | 31 ++++++++++++++++++++++++++-----
lib/hashserv/tests.py | 5 +++++
2 files changed, 31 insertions(+), 5 deletions(-)
diff --git a/lib/hashserv/server.py b/lib/hashserv/server.py
index d392ac19f..5017320c1 100644
--- a/lib/hashserv/server.py
+++ b/lib/hashserv/server.py
@@ -526,17 +526,38 @@ class ServerClient(bb.asyncrpc.AsyncServerConnection):
@permissions(READ_PERM)
async def handle_exists_stream(self, request):
- async def handler(l):
+ async def exists_handler(l):
if await self.db.unihash_exists(l):
return "true"
+ return "false"
+
+ if not self.upstream_client:
+ return await self._stream_handler(exists_handler)
- if self.upstream_client is not None:
- if await self.upstream_client.unihash_exists(l):
+ async with self.upstream_client.unihash_exists_stream() as stream:
+
+ async def get_local_result(m):
+ if await self.db.unihash_exists(m):
return "true"
+ return None
- return "false"
+ async def get_upstream_result(m):
+ exists = await stream.get_result()
+ return "true" if exists else "false"
- return await self._stream_handler(handler)
+ queue = asyncio.Queue()
+ upstream = UpstreamQueue(
+ queue,
+ get_local_result,
+ stream.send_query,
+ get_upstream_result,
+ )
+
+ await asyncio.gather(
+ self._stream_queue_handler(upstream.handler, queue),
+ upstream.process_results(),
+ )
+ return self.NO_RESPONSE
async def report_readonly(self, data):
method = data["method"]
diff --git a/lib/hashserv/tests.py b/lib/hashserv/tests.py
index 3acfdcd8c..0fbc19c1d 100644
--- a/lib/hashserv/tests.py
+++ b/lib/hashserv/tests.py
@@ -372,20 +372,25 @@ class HashEquivalenceCommonTests(object):
nonlocal side_client
# check upstream server
+ self.assertTrue(self.client.unihash_exists(unihash))
self.assertClientGetHash(self.client, taskhash, unihash)
# Hash should *not* be present on the side server
+ if old_sidehash and unihash != old_sidehash:
+ self.assertFalse(side_client.unihash_exists(unihash))
self.assertClientGetHash(side_client, taskhash, old_sidehash)
# Hash should be present on the downstream server, since it
# will defer to the upstream server. This will trigger
# the backfill in the downstream server
+ self.assertTrue(down_client.unihash_exists(unihash))
self.assertClientGetHash(down_client, taskhash, unihash)
# After waiting for the downstream client to finish backfilling the
# task from the upstream server, it should appear in the side server
# since the database is populated
down_client.backfill_wait()
+ self.assertTrue(side_client.unihash_exists(unihash))
self.assertClientGetHash(side_client, taskhash, unihash)
# Basic report
--
2.54.0
next prev parent reply other threads:[~2026-07-24 21:28 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-24 21:25 [bitbake-devel][PATCH 0/6] hashserv: Pipeline Upstream Queries Joshua Watt
2026-07-24 21:25 ` [bitbake-devel][PATCH 1/6] hashserv: client: Add asynchronous streaming API Joshua Watt
2026-07-24 21:25 ` [bitbake-devel][PATCH 2/6] hashserv: server: Fix formatting Joshua Watt
2026-07-24 21:25 ` [bitbake-devel][PATCH 3/6] hashserv: server: Add queued streaming API Joshua Watt
2026-07-24 21:25 ` [bitbake-devel][PATCH 4/6] hashserv: server: Use streaming and queue API for upstream unihash queries Joshua Watt
2026-07-24 21:25 ` Joshua Watt [this message]
2026-07-24 21:25 ` [bitbake-devel][PATCH 6/6] hashserv: tests: Add test for upstream pipelining Joshua Watt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260724212822.1165552-6-JPEWhacker@gmail.com \
--to=jpewhacker@gmail.com \
--cc=bitbake-devel@lists.openembedded.org \
--cc=michal.sieron@nokia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.