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@lists.fedoraproject.org
To unsubscribe send an email to infrastructure-le...@lists.fedoraproject.org
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@lists.fedoraproject.org
Do not reply to spam on the list, report it: 
https://pagure.io/fedora-infrastructure

Reply via email to