예제 #1
0
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
예제 #2
0
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]
                      }
                  })
예제 #3
0
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]}
            }
    )
예제 #4
0
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)
예제 #5
0
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)
예제 #6
0
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
예제 #7
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
예제 #8
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]
예제 #9
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]
예제 #10
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