def determine_revlist(repo_url, buildername, rev, back_revisions, delta, from_rev, backfill, skips, max_revisions): """Determine which revisions we need to trigger.""" if back_revisions: revlist = query_revisions_range_from_revision_before_and_after( repo_url=repo_url, revision=rev, before=back_revisions, after=0) elif delta: revlist = query_revisions_range_from_revision_before_and_after( repo_url=repo_url, revision=rev, before=delta, after=delta) elif from_rev: revlist = query_revisions_range(repo_url, to_revision=rev, from_revision=from_rev) elif backfill: revlist = find_backfill_revlist( buildername=buildername, revision=rev, max_revisions=max_revisions, ) else: revlist = [rev] if skips: revlist = revlist[::skips] return revlist
def manual_backfill(revision, buildername, max_revisions, dry_run=False): """ This function is used to trigger jobs for a range of revisions when a user clicks the backfill icon for a job on Treeherder. It backfills to the last known job on Treeherder. """ repo_url = query_repo_url_from_buildername(buildername) # We want to use data from treeherder for manual backfilling for long term. set_query_source("treeherder") revlist = pushlog.query_revisions_range_from_revision_before_and_after( repo_url=repo_url, revision=revision, before=max_revisions, after=-1 ) # We do not want the current job in the revision to be included. filtered_revlist = _filter_backfill_revlist(buildername, revlist, only_successful=False) trigger_range(buildername=buildername, revisions=filtered_revlist, times=1, dry_run=dry_run, extra_properties={ 'mozci_request': { 'type': 'manual_backfill', 'builders': [buildername] } })
def manual_backfill(revision, buildername, max_revisions, dry_run=False): """ This function is used to trigger jobs for a range of revisions when a user clicks the backfill icon for a job on Treeherder. It backfills to the last known job on Treeherder. """ repo_url = query_repo_url_from_buildername(buildername) # We want to use data from treeherder for manual backfilling for long term. set_query_source("treeherder") revlist = pushlog.query_revisions_range_from_revision_before_and_after( repo_url=repo_url, revision=revision, before=max_revisions, after=-1) # We do not want the current job in the revision to be included. filtered_revlist = _filter_backfill_revlist(buildername, revlist, only_successful=False) trigger_range( buildername=buildername, revisions=filtered_revlist, times=1, dry_run=dry_run, extra_properties={ 'mozci_request': { 'type': 'manual_backfill', 'builders': [buildername]} } )
def find_backfill_revlist(repo_url, revision, max_revisions, buildername): """Determine which revisions we need to trigger in order to backfill.""" revlist = pushlog.query_revisions_range_from_revision_before_and_after( repo_url=repo_url, revision=revision, before=max_revisions - 1, after=0) return _filter_backfill_revlist(buildername, revlist, only_successful=True)
def determine_revlist(repo_url, buildername, rev, back_revisions, delta, from_rev, backfill, skips, max_revisions): """Determine which revisions we need to trigger.""" if back_revisions: revlist = query_revisions_range_from_revision_before_and_after( repo_url=repo_url, revision=rev, before=back_revisions, after=0) elif delta: revlist = query_revisions_range_from_revision_before_and_after( repo_url=repo_url, revision=rev, before=delta, after=delta) elif from_rev: revlist = query_revisions_range( repo_url, to_revision=rev, from_revision=from_rev) elif backfill: revlist = find_backfill_revlist( repo_url=repo_url, revision=rev, max_revisions=max_revisions, buildername=buildername) else: revlist = [rev] if skips: revlist = revlist[::skips] return revlist
def find_backfill_revlist(buildername, revision, max_revisions): """Determine which revisions we need to trigger in order to backfill. This function is generally called by automatic backfilling on pulse_actions. We need to take into consideration that a job might not be run for many revisions due to SETA. We also might have a permanent failure appear after a reconfiguration (a new job is added). When a permanent failure appears, we keep on adding load unnecessarily by triggering coalesced jobs in between pushes. Long lived failing job (it could be hidden): * push N -> failed job * push N-1 -> failed/coalesced job * push N-2 -> failed/coalesced job ... * push N-max_revisions-1 -> failed/coalesced job If the list of revision we need to trigger is larger than max_revisions it means that we either have not had that job scheduled beyond max_revisions or it has been failing forever. """ # XXX: There is a chance that a green job has run in a newer push (the priority was higher), # however, this is unlikely. # XXX: We might need to consider when a backout has already landed and stop backfilling LOG.info("BACKFILL-START:%s_%s begins." % (revision[0:8], buildername)) revlist = pushlog.query_revisions_range_from_revision_before_and_after( repo_url=query_repo_url_from_buildername(buildername), revision=revision, before=max_revisions - 1, after=0) new_revlist = _filter_backfill_revlist(buildername, revlist, only_successful=True) if len(new_revlist) >= max_revisions: # It is likely that we are facing a long lived permanent failure LOG.debug( "We're not going to backfill %s since it is likely to be a permanent " "failure." % buildername) LOG.info("BACKFILL-END:%s_%s will not backfill." % (revision[0:8], buildername)) return [] else: LOG.info("BACKFILL-END:%s_%s will backfill %s." % (revision[0:8], buildername, new_revlist)) return new_revlist
def get_revision_range(repo_name, revision): """ Query pushlog in mozci and return revisions in a range of six. """ try: if repo_name == 'mobile': repo_name = 'mozilla-central' repo_url = query_repo_url(repo_name) revlist = query_revisions_range_from_revision_before_and_after(repo_url, revision, 6, 6) except: print "exception while getting repo: %s, revision: %s" % (repo_name, revision) raise return revlist[-1], revlist[0]
def get_revision_range(repo_name, revision): """ Query pushlog in mozci and return revisions in a range of six. """ try: if repo_name == 'mobile': repo_name = 'mozilla-central' repo_url = query_repo_url(repo_name) revlist = query_revisions_range_from_revision_before_and_after( repo_url, revision, 6, 6) except: print "exception while getting repo: %s, revision: %s" % (repo_name, revision) raise return revlist[-1], revlist[0]
def find_backfill_revlist(buildername, revision, max_revisions): """Determine which revisions we need to trigger in order to backfill. This function is generally called by automatic backfilling on pulse_actions. We need to take into consideration that a job might not be run for many revisions due to SETA. We also might have a permanent failure appear after a reconfiguration (a new job is added). When a permanent failure appears, we keep on adding load unnecessarily by triggering coalesced jobs in between pushes. Long lived failing job (it could be hidden): * push N -> failed job * push N-1 -> failed/coalesced job * push N-2 -> failed/coalesced job ... * push N-max_revisions-1 -> failed/coalesced job If the list of revision we need to trigger is larger than max_revisions it means that we either have not had that job scheduled beyond max_revisions or it has been failing forever. """ # XXX: There is a chance that a green job has run in a newer push (the priority was higher), # however, this is unlikely. # XXX: We might need to consider when a backout has already landed and stop backfilling LOG.info("BACKFILL-START:%s_%s begins." % (revision[0:8], buildername)) revlist = pushlog.query_revisions_range_from_revision_before_and_after( repo_url=query_repo_url_from_buildername(buildername), revision=revision, before=max_revisions - 1, after=0 ) new_revlist = _filter_backfill_revlist(buildername, revlist, only_successful=True) if len(new_revlist) >= max_revisions: # It is likely that we are facing a long lived permanent failure LOG.debug("We're not going to backfill %s since it is likely to be a permanent " "failure." % buildername) LOG.info("BACKFILL-END:%s_%s will not backfill." % (revision[0:8], buildername)) return [] else: LOG.info("BACKFILL-END:%s_%s will backfill %s." % (revision[0:8], buildername, new_revlist)) return new_revlist