From a35f864f32cd96e42e10468898b88a5dc7065875 Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: Nov 12 2019 11:41:37 +0000 Subject: [PATCH 1/2] drop buildMap API call It was originally designed for garbage-collector, but it is now using buildReferences call which supersedes this one. Fixes: https://pagure.io/koji/issue/1721 --- diff --git a/hub/kojihub.py b/hub/kojihub.py index 41d9c4f..9e3e1b2 100644 --- a/hub/kojihub.py +++ b/hub/kojihub.py @@ -7543,23 +7543,6 @@ def untagged_builds(name=None, queryOpts=None): opts=queryOpts) return query.iterate() -def build_map(): - """Map which builds were used in the buildroots of other builds - - To be used for garbage collection - """ - # find rpms whose buildroots we were in - st_complete = koji.BUILD_STATES['COMPLETE'] - fields = ('used', 'built') - q = """SELECT DISTINCT used.id, built.id - FROM buildroot_listing - JOIN rpminfo AS r_used ON r_used.id = buildroot_listing.rpm_id - JOIN rpminfo AS r_built ON r_built.buildroot_id = buildroot_listing.buildroot_id - JOIN build AS used ON used.id = r_used.build_id - JOIN build AS built ON built.id = r_built.build_id - WHERE built.state = %(st_complete)i AND used.state =%(st_complete)i""" - return _multiRow(q, locals(), fields) - def build_references(build_id, limit=None, lazy=False): """Returns references to a build @@ -9987,7 +9970,6 @@ class RootExports(object): tagHistory = staticmethod(tag_history) queryHistory = staticmethod(query_history) - buildMap = staticmethod(build_map) deleteBuild = staticmethod(delete_build) def buildReferences(self, build, limit=None, lazy=False): return build_references(get_build(build, strict=True)['id'], limit, lazy) From a8f818db4850cc09d38b917c5227bd49a60a2c9c Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: Nov 12 2019 12:10:26 +0000 Subject: [PATCH 2/2] rewrite list-untagged to use buildReferences --- diff --git a/cli/koji_cli/commands.py b/cli/koji_cli/commands.py index 48b4ac0..f8deec2 100644 --- a/cli/koji_cli/commands.py +++ b/cli/koji_cli/commands.py @@ -2635,19 +2635,21 @@ def anon_handle_list_untagged(goptions, session, args): data = session.untaggedBuilds(**opts) if options.show_references: print("(Showing build references)") - refs = {} - refs2 = {} #reverse map - for x in session.buildMap(): - refs.setdefault(x['used'], {}).setdefault(x['built'], 1) - refs2.setdefault(x['built'], {}).setdefault(x['used'], 1) - #XXX - need to ignore refs to unreferenced builds - for x in data: - builds = refs.get(x['id']) - if builds: - x['refs'] = "%s" % builds - else: - x['refs'] = '' - #data = [x for x in data if x['id'] not in refs)] + references = {} + with session.multicall(strict=True, batch=10000) as m: + for build in data: + references[build['id']] = m.buildReferences(build['id']) + + for build in data: + refs = references[build['id']].result + r = [] + if refs.get('rpms'): + r.append("rpms: %s" % refs['rpms']) + if refs.get('component_of'): + r.append("images/archives: %" % refs['component_of']) + if refs.get('archives'): + r.append("archives buildroots: %s" % refs['archives']) + build['refs'] = ', '.join(r) if options.paths: for x in data: x['path'] = pathinfo.build(x)