diff options
| author | Paul Barker <pbarker@konsulko.com> | 2021-02-05 11:26:10 +0000 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2021-02-10 23:48:16 +0000 |
| commit | 40ecec326effeb1f4dd647849293f18118d4dd21 (patch) | |
| tree | 6ee2bee7cce76dcafa3cb03c557ffa8dcc93c613 /bitbake/lib/hashserv | |
| parent | 73160aac0608cc186be1ec991b08ff8f130cdb8f (diff) | |
| download | poky-40ecec326effeb1f4dd647849293f18118d4dd21.tar.gz | |
bitbake: hashserv: Add get-outhash message
The get-outhash message can be sent via the get_outhash client method.
This works in a similar way to the get message but looks up a db entry
by outhash rather than by taskhash. It is intended to be used as a
read-only form of the report message.
As both handle_get_outhash and handle_report use the same query string
we can factor this out.
(Bitbake rev: dc19606ada29a4d8afde4fcecd8ec986b47b867e)
Signed-off-by: Paul Barker <pbarker@konsulko.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/hashserv')
| -rw-r--r-- | bitbake/lib/hashserv/client.py | 6 | ||||
| -rw-r--r-- | bitbake/lib/hashserv/server.py | 46 |
2 files changed, 38 insertions, 14 deletions
diff --git a/bitbake/lib/hashserv/client.py b/bitbake/lib/hashserv/client.py index 0b7f4e42e9..e05c1eb568 100644 --- a/bitbake/lib/hashserv/client.py +++ b/bitbake/lib/hashserv/client.py | |||
| @@ -170,6 +170,12 @@ class AsyncClient(object): | |||
| 170 | {"get": {"taskhash": taskhash, "method": method, "all": all_properties}} | 170 | {"get": {"taskhash": taskhash, "method": method, "all": all_properties}} |
| 171 | ) | 171 | ) |
| 172 | 172 | ||
| 173 | async def get_outhash(self, method, outhash, taskhash): | ||
| 174 | await self._set_mode(self.MODE_NORMAL) | ||
| 175 | return await self.send_message( | ||
| 176 | {"get-outhash": {"outhash": outhash, "taskhash": taskhash, "method": method}} | ||
| 177 | ) | ||
| 178 | |||
| 173 | async def get_stats(self): | 179 | async def get_stats(self): |
| 174 | await self._set_mode(self.MODE_NORMAL) | 180 | await self._set_mode(self.MODE_NORMAL) |
| 175 | return await self.send_message({"get-stats": None}) | 181 | return await self.send_message({"get-stats": None}) |
diff --git a/bitbake/lib/hashserv/server.py b/bitbake/lib/hashserv/server.py index 9ade988e56..a0dc0c170f 100644 --- a/bitbake/lib/hashserv/server.py +++ b/bitbake/lib/hashserv/server.py | |||
| @@ -152,6 +152,20 @@ async def copy_outhash_from_upstream(client, db, method, outhash, taskhash): | |||
| 152 | class ServerClient(object): | 152 | class ServerClient(object): |
| 153 | FAST_QUERY = 'SELECT taskhash, method, unihash FROM tasks_v2 WHERE method=:method AND taskhash=:taskhash ORDER BY created ASC LIMIT 1' | 153 | FAST_QUERY = 'SELECT taskhash, method, unihash FROM tasks_v2 WHERE method=:method AND taskhash=:taskhash ORDER BY created ASC LIMIT 1' |
| 154 | ALL_QUERY = 'SELECT * FROM tasks_v2 WHERE method=:method AND taskhash=:taskhash ORDER BY created ASC LIMIT 1' | 154 | ALL_QUERY = 'SELECT * FROM tasks_v2 WHERE method=:method AND taskhash=:taskhash ORDER BY created ASC LIMIT 1' |
| 155 | OUTHASH_QUERY = ''' | ||
| 156 | -- Find tasks with a matching outhash (that is, tasks that | ||
| 157 | -- are equivalent) | ||
| 158 | SELECT * FROM tasks_v2 WHERE method=:method AND outhash=:outhash | ||
| 159 | |||
| 160 | -- If there is an exact match on the taskhash, return it. | ||
| 161 | -- Otherwise return the oldest matching outhash of any | ||
| 162 | -- taskhash | ||
| 163 | ORDER BY CASE WHEN taskhash=:taskhash THEN 1 ELSE 2 END, | ||
| 164 | created ASC | ||
| 165 | |||
| 166 | -- Only return one row | ||
| 167 | LIMIT 1 | ||
| 168 | ''' | ||
| 155 | 169 | ||
| 156 | def __init__(self, reader, writer, db, request_stats, backfill_queue, upstream, read_only): | 170 | def __init__(self, reader, writer, db, request_stats, backfill_queue, upstream, read_only): |
| 157 | self.reader = reader | 171 | self.reader = reader |
| @@ -164,6 +178,7 @@ class ServerClient(object): | |||
| 164 | 178 | ||
| 165 | self.handlers = { | 179 | self.handlers = { |
| 166 | 'get': self.handle_get, | 180 | 'get': self.handle_get, |
| 181 | 'get-outhash': self.handle_get_outhash, | ||
| 167 | 'get-stream': self.handle_get_stream, | 182 | 'get-stream': self.handle_get_stream, |
| 168 | 'get-stats': self.handle_get_stats, | 183 | 'get-stats': self.handle_get_stats, |
| 169 | 'chunk-stream': self.handle_chunk, | 184 | 'chunk-stream': self.handle_chunk, |
| @@ -301,6 +316,21 @@ class ServerClient(object): | |||
| 301 | 316 | ||
| 302 | self.write_message(d) | 317 | self.write_message(d) |
| 303 | 318 | ||
| 319 | async def handle_get_outhash(self, request): | ||
| 320 | with closing(self.db.cursor()) as cursor: | ||
| 321 | cursor.execute(self.OUTHASH_QUERY, | ||
| 322 | {k: request[k] for k in ('method', 'outhash', 'taskhash')}) | ||
| 323 | |||
| 324 | row = cursor.fetchone() | ||
| 325 | |||
| 326 | if row is not None: | ||
| 327 | logger.debug('Found equivalent outhash %s -> %s', (row['outhash'], row['unihash'])) | ||
| 328 | d = {k: row[k] for k in row.keys()} | ||
| 329 | else: | ||
| 330 | d = None | ||
| 331 | |||
| 332 | self.write_message(d) | ||
| 333 | |||
| 304 | async def handle_get_stream(self, request): | 334 | async def handle_get_stream(self, request): |
| 305 | self.write_message('ok') | 335 | self.write_message('ok') |
| 306 | 336 | ||
| @@ -354,20 +384,8 @@ class ServerClient(object): | |||
| 354 | 384 | ||
| 355 | async def handle_report(self, data): | 385 | async def handle_report(self, data): |
| 356 | with closing(self.db.cursor()) as cursor: | 386 | with closing(self.db.cursor()) as cursor: |
| 357 | cursor.execute(''' | 387 | cursor.execute(self.OUTHASH_QUERY, |
| 358 | -- Find tasks with a matching outhash (that is, tasks that | 388 | {k: data[k] for k in ('method', 'outhash', 'taskhash')}) |
| 359 | -- are equivalent) | ||
| 360 | SELECT taskhash, method, unihash FROM tasks_v2 WHERE method=:method AND outhash=:outhash | ||
| 361 | |||
| 362 | -- If there is an exact match on the taskhash, return it. | ||
| 363 | -- Otherwise return the oldest matching outhash of any | ||
| 364 | -- taskhash | ||
| 365 | ORDER BY CASE WHEN taskhash=:taskhash THEN 1 ELSE 2 END, | ||
| 366 | created ASC | ||
| 367 | |||
| 368 | -- Only return one row | ||
| 369 | LIMIT 1 | ||
| 370 | ''', {k: data[k] for k in ('method', 'outhash', 'taskhash')}) | ||
| 371 | 389 | ||
| 372 | row = cursor.fetchone() | 390 | row = cursor.fetchone() |
| 373 | 391 | ||
