From 6812fd5e7449245c0e34f587682e41ecaf5ccc1a Mon Sep 17 00:00:00 2001 From: Andrew Gallagher Date: Sat, 5 Apr 2014 18:14:25 -0700 Subject: [PATCH] Avoid extra DB lookups in BuildRequest When returning the list of pending build requests, BuilderStatus.getPendingBuildRequests loads on brdicts just to grab the brid to pass into the BuildRequest constructor. This brdict is then reloaded from the DB if virtually any of the BuildRequest methods are called. To avoid this extra lookup, this diff adds an extra constructor parameter to thread the brdict into the BuildRequest object. --- master/buildbot/status/builder.py | 2 +- master/buildbot/status/buildrequest.py | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/master/buildbot/status/builder.py b/master/buildbot/status/builder.py index 3bd2f427085..c3f869889a9 100644 --- a/master/buildbot/status/builder.py +++ b/master/buildbot/status/builder.py @@ -308,7 +308,7 @@ def getPendingBuildRequestStatuses(self): def make_statuses(brdicts): return [BuildRequestStatus(self.name, brdict['brid'], - self.status) + self.status, brdict=brdict) for brdict in brdicts] d.addCallback(make_statuses) return d diff --git a/master/buildbot/status/buildrequest.py b/master/buildbot/status/buildrequest.py index 5efd4608beb..f0ab4c10d00 100644 --- a/master/buildbot/status/buildrequest.py +++ b/master/buildbot/status/buildrequest.py @@ -23,12 +23,13 @@ class BuildRequestStatus: implements(interfaces.IBuildRequestStatus) - def __init__(self, buildername, brid, status): + def __init__(self, buildername, brid, status, brdict=None): self.buildername = buildername self.brid = brid self.status = status self.master = status.master + self._brdict = brdict self._buildrequest = None self._buildrequest_lock = defer.DeferredLock() @@ -52,11 +53,13 @@ def _getBuildRequest(self): try: if not self._buildrequest: - brd = yield self.master.db.buildrequests.getBuildRequest( - self.brid) + if self._brdict is None: + self._brdict = ( + yield self.master.db.buildrequests.getBuildRequest( + self.brid)) br = yield buildrequest.BuildRequest.fromBrdict(self.master, - brd) + self._brdict) self._buildrequest = br except: # try/finally isn't allowed in generators in older Pythons self._buildrequest_lock.release()