From 4b3c9f33b4f554a392b686cca5ead11fa8522232 Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: Apr 22 2020 11:35:22 +0000 Subject: PR#2103: fix list-signed --tag memory issues Merges #2103 https://pagure.io/koji/pull-request/2103 Fixes: #2102 https://pagure.io/koji/issue/2102 koji list-signed --tag results in OOM --- diff --git a/cli/koji_cli/commands.py b/cli/koji_cli/commands.py index 6007a87..cf8e178 100644 --- a/cli/koji_cli/commands.py +++ b/cli/koji_cli/commands.py @@ -2101,6 +2101,8 @@ def handle_list_signed(goptions, session, args): rpm_idx = {} if options.key: qopts['sigkey'] = options.key + + sigs = [] if options.rpm: rpm_info = options.rpm try: @@ -2112,7 +2114,7 @@ def handle_list_signed(goptions, session, args): if rinfo.get('external_repo_id'): parser.error(_("External rpm: %(name)s-%(version)s-%(release)s.%(arch)s@" "%(external_repo_name)s") % rinfo) - qopts['rpm_id'] = rinfo['id'] + sigs += session.queryRPMSigs(rpm_id=rinfo['id'], **qopts) if options.build: build = options.build try: @@ -2121,13 +2123,10 @@ def handle_list_signed(goptions, session, args): pass binfo = session.getBuild(build, strict=True) build_idx[binfo['id']] = binfo - sigs = [] rpms = session.listRPMs(buildID=binfo['id']) for rinfo in rpms: rpm_idx[rinfo['id']] = rinfo sigs += session.queryRPMSigs(rpm_id=rinfo['id'], **qopts) - else: - sigs = session.queryRPMSigs(**qopts) if options.tag: tag = options.tag try: @@ -2138,9 +2137,16 @@ def handle_list_signed(goptions, session, args): tagged = {} for binfo in builds: build_idx.setdefault(binfo['id'], binfo) - for rinfo in rpms: - rpm_idx.setdefault(rinfo['id'], rinfo) - tagged[rinfo['id']] = 1 + results = [] + # use batched multicall as there could be potentially a lot of results + # so we don't exhaust server resources + with session.multicall(batch=5000) as m: + for rinfo in rpms: + rpm_idx.setdefault(rinfo['id'], rinfo) + tagged[rinfo['id']] = 1 + results.append(m.queryRPMSigs(rpm_id=rinfo['id']), **qopts) + sigs += [x.result[0] for x in results] + # Now figure out which sig entries actually have live copies for sig in sigs: rpm_id = sig['rpm_id']