Cache github PR shas
Maintain a cache of sha->PR which we update every time we fetch a pull_request object from github. Use this in the status event handler to map the status event to relevant PRs. Change-Id: Ie811329429e1b672ce012767a475447f80832ee8
This commit is contained in:
parent
d540ebfe32
commit
217aa97eff
|
@ -71,6 +71,26 @@ class UTC(datetime.tzinfo):
|
||||||
utc = UTC()
|
utc = UTC()
|
||||||
|
|
||||||
|
|
||||||
|
class GithubShaCache(object):
|
||||||
|
def __init__(self):
|
||||||
|
self.projects = {}
|
||||||
|
|
||||||
|
def update(self, project_name, pr):
|
||||||
|
project_cache = self.projects.setdefault(project_name, {})
|
||||||
|
sha = pr['head']['sha']
|
||||||
|
number = pr['number']
|
||||||
|
cached_prs = project_cache.setdefault(sha, set())
|
||||||
|
if pr['state'] == 'open':
|
||||||
|
cached_prs.add(number)
|
||||||
|
else:
|
||||||
|
cached_prs.discard(number)
|
||||||
|
|
||||||
|
def get(self, project_name, sha):
|
||||||
|
project_cache = self.projects.get(project_name, {})
|
||||||
|
cached_prs = project_cache.get(sha, set())
|
||||||
|
return cached_prs
|
||||||
|
|
||||||
|
|
||||||
class GithubGearmanWorker(object):
|
class GithubGearmanWorker(object):
|
||||||
"""A thread that answers gearman requests"""
|
"""A thread that answers gearman requests"""
|
||||||
log = logging.getLogger("zuul.GithubGearmanWorker")
|
log = logging.getLogger("zuul.GithubGearmanWorker")
|
||||||
|
@ -514,6 +534,7 @@ class GithubConnection(BaseConnection):
|
||||||
'canonical_hostname', self.server)
|
'canonical_hostname', self.server)
|
||||||
self.source = driver.getSource(self)
|
self.source = driver.getSource(self)
|
||||||
self.event_queue = queue.Queue()
|
self.event_queue = queue.Queue()
|
||||||
|
self._sha_pr_cache = GithubShaCache()
|
||||||
|
|
||||||
# Logging of rate limit is optional as this does additional requests
|
# Logging of rate limit is optional as this does additional requests
|
||||||
rate_limit_logging = self.connection_config.get(
|
rate_limit_logging = self.connection_config.get(
|
||||||
|
@ -1125,6 +1146,9 @@ class GithubConnection(BaseConnection):
|
||||||
pr['files'] = []
|
pr['files'] = []
|
||||||
|
|
||||||
pr['labels'] = [l.name for l in issueobj.labels()]
|
pr['labels'] = [l.name for l in issueobj.labels()]
|
||||||
|
|
||||||
|
self._sha_pr_cache.update(project_name, pr)
|
||||||
|
|
||||||
log.debug('Got PR %s#%s', project_name, number)
|
log.debug('Got PR %s#%s', project_name, number)
|
||||||
self.log_rate_limit(self.log, github)
|
self.log_rate_limit(self.log, github)
|
||||||
return pr
|
return pr
|
||||||
|
@ -1162,16 +1186,26 @@ class GithubConnection(BaseConnection):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def getPullBySha(self, sha, project, log):
|
def getPullBySha(self, sha, project, log):
|
||||||
|
cached_pr_numbers = self._sha_pr_cache.get(project, sha)
|
||||||
|
if len(cached_pr_numbers) > 1:
|
||||||
|
raise Exception('Multiple pulls found with head sha %s' % sha)
|
||||||
|
if len(cached_pr_numbers) == 1:
|
||||||
|
for pr in cached_pr_numbers:
|
||||||
|
return self.getPull(project, pr, log)
|
||||||
|
|
||||||
pulls = []
|
pulls = []
|
||||||
|
project_name = project
|
||||||
owner, project = project.split('/')
|
owner, project = project.split('/')
|
||||||
github = self.getGithubClient("%s/%s" % (owner, project))
|
github = self.getGithubClient("%s/%s" % (owner, project))
|
||||||
repo = github.repository(owner, project)
|
repo = github.repository(owner, project)
|
||||||
for pr in repo.pull_requests(state='open'):
|
for pr in repo.pull_requests(state='open'):
|
||||||
|
pr_dict = pr.as_dict()
|
||||||
|
self._sha_pr_cache.update(project_name, pr_dict)
|
||||||
if pr.head.sha != sha:
|
if pr.head.sha != sha:
|
||||||
continue
|
continue
|
||||||
if pr.as_dict() in pulls:
|
if pr_dict in pulls:
|
||||||
continue
|
continue
|
||||||
pulls.append(pr.as_dict())
|
pulls.append(pr_dict)
|
||||||
|
|
||||||
log.debug('Got PR on project %s for sha %s', project, sha)
|
log.debug('Got PR on project %s for sha %s', project, sha)
|
||||||
self.log_rate_limit(self.log, github)
|
self.log_rate_limit(self.log, github)
|
||||||
|
|
Loading…
Reference in New Issue