I've applied the patch to blockerbugs production, thanks.

For now, I've kept the limit to 20 because I was having trouble getting more 
than 20 to work for me. We can re-visit what the limit should be set to once 
beta freeze lifts.

Tim

On 9/13/21 12:55 PM, Pierre-Yves Chibon wrote:
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

_______________________________________________
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