[bitbake-devel] [PATCH 1/4] hashserv: Add support for equivalent hash reporting

akuster808 akuster808 at gmail.com
Wed Dec 4 18:20:13 UTC 2019



On 12/4/19 3:52 AM, Richard Purdie wrote:
> The reason for this should be recorded in the commit logs. Imagine
> you have a target recipe (e.g. meta-extsdk-toolchain) which depends on
> gdb-cross. sstate in OE-Core allows gdb-cross to have the same hash
> regardless of whether its built on x86 or arm. The outhash will be
> different.
>
> We need hashequiv to be able to adapt to the prescence of sstate artefacts
> for meta-extsdk-toolchain and allow the hashes to re-intersect, rather than
> trying to force a rebuild of meta-extsdk-toolchain. By this point in the build,
> it would have already been installed from sstate so the build needs to adapt.
>
> Equivalent hashes should be reported to the server as a taskhash that
> needs to map to an specific unihash. This patch adds API to the hashserv
> client/server to allow this.
>
> [Thanks to Joshua Watt for help with this patch]

This sounds like 1.44 backport worthy?

- armin
>
> Signed-off-by: Richard Purdie <richard.purdie at linuxfoundation.org>
> ---
>  lib/hashserv/client.py |  8 ++++++++
>  lib/hashserv/server.py | 36 ++++++++++++++++++++++++++++++++++++
>  2 files changed, 44 insertions(+)
>
> diff --git a/lib/hashserv/client.py b/lib/hashserv/client.py
> index f65956617b..ae0cce9df4 100644
> --- a/lib/hashserv/client.py
> +++ b/lib/hashserv/client.py
> @@ -148,6 +148,14 @@ class Client(object):
>          m['unihash'] = unihash
>          return self.send_message({'report': m})
>  
> +    def report_unihash_equiv(self, taskhash, method, unihash, extra={}):
> +        self._set_mode(self.MODE_NORMAL)
> +        m = extra.copy()
> +        m['taskhash'] = taskhash
> +        m['method'] = method
> +        m['unihash'] = unihash
> +        return self.send_message({'report-equiv': m})
> +
>      def get_stats(self):
>          self._set_mode(self.MODE_NORMAL)
>          return self.send_message({'get-stats': None})
> diff --git a/lib/hashserv/server.py b/lib/hashserv/server.py
> index 0aff77688e..cc7e48233b 100644
> --- a/lib/hashserv/server.py
> +++ b/lib/hashserv/server.py
> @@ -143,6 +143,7 @@ class ServerClient(object):
>              handlers = {
>                  'get': self.handle_get,
>                  'report': self.handle_report,
> +                'report-equiv': self.handle_equivreport,
>                  'get-stream': self.handle_get_stream,
>                  'get-stats': self.handle_get_stats,
>                  'reset-stats': self.handle_reset_stats,
> @@ -303,6 +304,41 @@ class ServerClient(object):
>  
>          self.write_message(d)
>  
> +    async def handle_equivreport(self, data):
> +        with closing(self.db.cursor()) as cursor:
> +            insert_data = {
> +                'method': data['method'],
> +                'outhash': "",
> +                'taskhash': data['taskhash'],
> +                'unihash': data['unihash'],
> +                'created': datetime.now()
> +            }
> +
> +            for k in ('owner', 'PN', 'PV', 'PR', 'task', 'outhash_siginfo'):
> +                if k in data:
> +                    insert_data[k] = data[k]
> +
> +            cursor.execute('''INSERT OR IGNORE INTO tasks_v2 (%s) VALUES (%s)''' % (
> +                ', '.join(sorted(insert_data.keys())),
> +                ', '.join(':' + k for k in sorted(insert_data.keys()))),
> +                insert_data)
> +
> +            self.db.commit()
> +
> +            # Fetch the unihash that will be reported for the taskhash. If the
> +            # unihash matches, it means this row was inserted (or the mapping
> +            # was already valid)
> +            row = self.query_equivalent(data['method'], data['taskhash'])
> +
> +            if row['unihash'] == data['unihash']:
> +                logger.info('Adding taskhash equivalence for %s with unihash %s',
> +                                data['taskhash'], row['unihash'])
> +
> +            d = {k: row[k] for k in ('taskhash', 'method', 'unihash')}
> +
> +        self.write_message(d)
> +
> +
>      async def handle_get_stats(self, request):
>          d = {
>              'requests': self.request_stats.todict(),



More information about the bitbake-devel mailing list