On Mon, Sep 13, 2021 at 12:49:21PM -0600, Tim Flink wrote: > It turns out that the configuration for rhbz was changed without an announcement and now the max number of bugs returned for any query is 20. Some of the queries that we use in blockerbugs return more than 20 bugs so I have a hotfix to deal with the new pagination requirements. I've attached the patch to this email. > > I'd like to apply this patch to production. Unfortunately, we're in the middle of a non-trivial rewrite that's currently on stg so testing the patch isn't really an option and that code isn't ready for production use right now. > > Thanks, > > Tim > diff --git a/blockerbugs/util/bz_interface.py b/blockerbugs/util/bz_interface.py > index 471140f..a9f90d7 100644 > --- a/blockerbugs/util/bz_interface.py > +++ b/blockerbugs/util/bz_interface.py > @@ -29,11 +29,14 @@ from xmlrpc.client import Fault > > from blockerbugs import app > > +# rhbz has been updated to have a max of 20 results returned > +BUGZILLA_QUERY_LIMIT = 20 If I understood correctly, you can request more than 20 results, but if you don't specify how many you want, you'll only get 20. I believe if you set it to 0 you may get everything, but this needs to be confirmed empirically. Anyway, I would check first if you can't retrieve 100 or 200 results in one go instead of doing iterations of 20 ;-) > base_query = {'o1': 'anywords', > 'f1': 'blocked', > 'query_format': 'advanced', > - 'extra_fields': ['flags']} > - > + 'extra_fields': ['flags'], > + 'limit': BUGZILLA_QUERY_LIMIT} > > class BZInterfaceError(Exception): > """A custom wrapper for XMLRPC errors from Bugzilla""" > @@ -77,7 +80,8 @@ class BlockerBugs(): > # https://bugzilla.stage.redhat.com/buglist.cgi?bug_status=NEW&bug_status=ASSIGNED > # &bug_status=POST&bug_status=MODIFIED&classification=Fedora&component=anaconda&f1=component > # &o1=changedafter&product=Fedora&query_format=advanced&v1=2013-03-21%2012%3A25&version=19 > - def get_bz_query(self, tracker: int, last_update: datetime.datetime = None) -> dict[str, Any]: > + def get_bz_query(self, tracker: int, last_update: datetime.datetime = None, offset: int = 0 > + ) -> dict[str, Any]: If you can set the limit to 0 to retrieve everything, you may want to default to None rather than 0. > """Build a Bugzilla query to retrieve all necessary info about all bugs which block the > `tracker` bug. > > @@ -129,6 +133,9 @@ class BlockerBugs(): > 'f10': 'CP' > }) > > + if offset > 0: And if you default to None, this will need to be tweaked. > + query.update({'offset': offset}) > + > return query > > def query_tracker(self, tracker: int, last_update: Optional[datetime.datetime] = None > @@ -139,8 +146,21 @@ class BlockerBugs(): > :param last_update: If provided, the query is modified to ask only about bugs which have > recent modifications; otherwise asks about all bugs. > """ > - query = self.get_bz_query(tracker, last_update) > - buglist = self.bz.query(query) > + > + buglist = [] > + last_query_len = BUGZILLA_QUERY_LIMIT > + > + > + # this is a hotfix hack to work around the sudden config change in rhbz where the max > + # number of bugs returned for a query is 20 > + # it seems to be working for now but may need more work going forward > + while last_query_len == BUGZILLA_QUERY_LIMIT: > + > + new_query = self.get_bz_query(tracker, last_update, offset=len(buglist)) > + new_buglist = self.bz.query(new_query) > + buglist.extend(new_buglist) > + last_query_len = len(new_buglist) > + Looks alright to me otherwise. Pierre _______________________________________________ infrastructure mailing list -- infrastructure@xxxxxxxxxxxxxxxxxxxxxxx To unsubscribe send an email to infrastructure-leave@xxxxxxxxxxxxxxxxxxxxxxx Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/ List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines List Archives: https://lists.fedoraproject.org/archives/list/infrastructure@xxxxxxxxxxxxxxxxxxxxxxx Do not reply to spam on the list, report it: https://pagure.io/fedora-infrastructure