diff options
Diffstat (limited to 'bitbake/lib/hashserv/client.py')
-rw-r--r-- | bitbake/lib/hashserv/client.py | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/bitbake/lib/hashserv/client.py b/bitbake/lib/hashserv/client.py index a510f3284f..8cb18050a6 100644 --- a/bitbake/lib/hashserv/client.py +++ b/bitbake/lib/hashserv/client.py | |||
@@ -78,6 +78,7 @@ class AsyncClient(bb.asyncrpc.AsyncClient): | |||
78 | MODE_NORMAL = 0 | 78 | MODE_NORMAL = 0 |
79 | MODE_GET_STREAM = 1 | 79 | MODE_GET_STREAM = 1 |
80 | MODE_EXIST_STREAM = 2 | 80 | MODE_EXIST_STREAM = 2 |
81 | MODE_MARK_STREAM = 3 | ||
81 | 82 | ||
82 | def __init__(self, username=None, password=None): | 83 | def __init__(self, username=None, password=None): |
83 | super().__init__("OEHASHEQUIV", "1.1", logger) | 84 | super().__init__("OEHASHEQUIV", "1.1", logger) |
@@ -164,6 +165,8 @@ class AsyncClient(bb.asyncrpc.AsyncClient): | |||
164 | await normal_to_stream("get-stream") | 165 | await normal_to_stream("get-stream") |
165 | elif new_mode == self.MODE_EXIST_STREAM: | 166 | elif new_mode == self.MODE_EXIST_STREAM: |
166 | await normal_to_stream("exists-stream") | 167 | await normal_to_stream("exists-stream") |
168 | elif new_mode == self.MODE_MARK_STREAM: | ||
169 | await normal_to_stream("gc-mark-stream") | ||
167 | elif new_mode != self.MODE_NORMAL: | 170 | elif new_mode != self.MODE_NORMAL: |
168 | raise Exception("Undefined mode transition {self.mode!r} -> {new_mode!r}") | 171 | raise Exception("Undefined mode transition {self.mode!r} -> {new_mode!r}") |
169 | 172 | ||
@@ -306,6 +309,24 @@ class AsyncClient(bb.asyncrpc.AsyncClient): | |||
306 | """ | 309 | """ |
307 | return await self.invoke({"gc-mark": {"mark": mark, "where": where}}) | 310 | return await self.invoke({"gc-mark": {"mark": mark, "where": where}}) |
308 | 311 | ||
312 | async def gc_mark_stream(self, mark, rows): | ||
313 | """ | ||
314 | Similar to `gc-mark`, but accepts a list of "where" key-value pair | ||
315 | conditions. It utilizes stream mode to mark hashes, which helps reduce | ||
316 | the impact of latency when communicating with the hash equivalence | ||
317 | server. | ||
318 | """ | ||
319 | def row_to_dict(row): | ||
320 | pairs = row.split() | ||
321 | return dict(zip(pairs[::2], pairs[1::2])) | ||
322 | |||
323 | responses = await self.send_stream_batch( | ||
324 | self.MODE_MARK_STREAM, | ||
325 | (json.dumps({"mark": mark, "where": row_to_dict(row)}) for row in rows), | ||
326 | ) | ||
327 | |||
328 | return {"count": sum(int(json.loads(r)["count"]) for r in responses)} | ||
329 | |||
309 | async def gc_sweep(self, mark): | 330 | async def gc_sweep(self, mark): |
310 | """ | 331 | """ |
311 | Finishes garbage collection for "mark". All unihash entries that have | 332 | Finishes garbage collection for "mark". All unihash entries that have |
@@ -351,6 +372,7 @@ class Client(bb.asyncrpc.Client): | |||
351 | "get_db_query_columns", | 372 | "get_db_query_columns", |
352 | "gc_status", | 373 | "gc_status", |
353 | "gc_mark", | 374 | "gc_mark", |
375 | "gc_mark_stream", | ||
354 | "gc_sweep", | 376 | "gc_sweep", |
355 | ) | 377 | ) |
356 | 378 | ||