* remove StepParser and switch to ErrorParser
* remove writes to TextLogStep from artifact.py
* remove buildbot ref in builders
* replace TextLogStep model in DetailsPanel, SimilarJobsTab and logviewer App
* cleanup DetailsPanel
* remove old log parsing tests and update others
* add logging to error_summary.py
* add parse max error lines limit to ErrorParser
* fix in similar jobs tab for Bug 1652869
This commit is contained in:
Sarah Clements 2020-07-17 10:28:01 -07:00 коммит произвёл GitHub
Родитель 10ccd44545
Коммит 507881a7b8
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
47 изменённых файлов: 526 добавлений и 2534 удалений

Просмотреть файл

@ -1,83 +0,0 @@
'$schema': http://json-schema.org/draft-04/schema#
type: object
properties:
blob:
type: object
properties:
step_data:
type: object
properties:
steps:
type: array
items:
type: object
properties:
errors:
type: array
items:
type: object
properties:
line:
type: string
linenumber:
type: integer
additionalProperties: false
additionalItems: false
name:
type: string
started:
type: string
format: date-time
started_linenumber:
type: integer
finished_linenumber:
type: integer
finished:
type: string
format: date-time
result:
type: string
enum:
[
busted,
testfailed,
exception,
success,
canceled,
unknown,
retry,
skipped,
]
required:
- errors
- name
- started
- started_linenumber
- finished_linenumber
- finished
- result
additionalProperties: false
additionalItems: false
errors_truncated:
type: boolean
additionalProperties: false
required:
- steps
- errors_truncated
logurl:
type: string
additionalProperties: false
required:
- step_data
- logurl
type:
type: string
name:
type: string
job_guid:
type: integer
additionalProperties: false
required:
- blob
- type
- name

Просмотреть файл

@ -104,9 +104,7 @@ def test_autoclassify_no_update_job_classification(
lines = [(test_line, {})]
test_error_lines, test_failure_lines = create_lines(test_job_2, lines)
TextLogError.objects.create(
step=test_error_lines[0].step,
line="Some error that isn't in the structured logs",
line_number=2,
job=test_job_2, line="Some error that isn't in the structured logs", line_number=2,
)
do_autoclassify(test_job_2, test_failure_lines, [precise_matcher])

Просмотреть файл

@ -1,5 +1,3 @@
import datetime
from mozlog.formatters.tbplformatter import TbplFormatter
from treeherder.model.models import (
@ -8,7 +6,6 @@ from treeherder.model.models import (
JobLog,
TextLogError,
TextLogErrorMetadata,
TextLogStep,
)
test_line = {
@ -79,16 +76,6 @@ def get_data(base_data, updates):
def create_text_log_errors(job, failure_line_list):
step = TextLogStep.objects.create(
job=job,
name='everything',
started_line_number=1,
finished_line_number=10,
started=datetime.datetime.now(),
finished=datetime.datetime.now(),
result=TextLogStep.TEST_FAILED,
)
formatter = TbplFormatter()
errors = []
for i, (base_data, updates) in enumerate(failure_line_list):
@ -96,7 +83,7 @@ def create_text_log_errors(job, failure_line_list):
if not data:
continue
error = TextLogError.objects.create(
step=step, line=formatter(data).split("\n")[0], line_number=i
job=job, line=formatter(data).split("\n")[0], line_number=i
)
errors.append(error)

Просмотреть файл

@ -1,7 +1,7 @@
import json
from treeherder.etl.artifact import store_job_artifacts
from treeherder.model.models import TextLogError, TextLogStep
from treeherder.model.models import TextLogError
def test_load_textlog_summary_twice(test_repository, test_job):
@ -10,32 +10,21 @@ def test_load_textlog_summary_twice(test_repository, test_job):
'name': 'text_log_summary',
'blob': json.dumps(
{
'step_data': {
"steps": [
{
'name': 'foo',
'started': '2016-05-10 12:44:23.103904',
'started_linenumber': 8,
'finished_linenumber': 10,
'finished': '2016-05-10 12:44:23.104394',
'result': 'success',
'errors': [{"line": '07:51:28 WARNING - foobar', "linenumber": 1587}],
}
]
}
'errors': [
{"line": 'WARNING - foobar', "linenumber": 1587},
{"line": 'WARNING - foobar', "linenumber": 1590},
],
}
),
'job_guid': test_job.guid,
}
store_job_artifacts([text_log_summary_artifact])
assert TextLogError.objects.count() == 1
assert TextLogStep.objects.count() == 1
assert TextLogError.objects.count() == 2
# load again (simulating the job being parsed twice,
# which sometimes happens)
store_job_artifacts([text_log_summary_artifact])
assert TextLogError.objects.count() == 1
assert TextLogStep.objects.count() == 1
assert TextLogError.objects.count() == 2
def test_load_non_ascii_textlog_errors(test_job):
@ -44,34 +33,23 @@ def test_load_non_ascii_textlog_errors(test_job):
'name': 'text_log_summary',
'blob': json.dumps(
{
'step_data': {
"steps": [
{
'name': 'foo',
'started': '2016-05-10 12:44:23.103904',
'started_linenumber': 8,
'finished_linenumber': 10,
'finished': '2016-05-10 12:44:23.104394',
'result': 'success',
'errors': [
{
# non-ascii character
"line": '07:51:28 WARNING - \U000000c3',
"linenumber": 1587,
},
{
# astral character (i.e. higher than ucs2)
"line": '07:51:29 WARNING - \U0001d400',
"linenumber": 1588,
},
],
}
]
}
'errors': [
{
# non-ascii character
"line": '07:51:28 WARNING - \U000000c3',
"linenumber": 1587,
},
{
# astral character (i.e. higher than ucs2)
"line": '07:51:29 WARNING - \U0001d400',
"linenumber": 1588,
},
],
}
),
'job_guid': test_job.guid,
}
store_job_artifacts([text_log_summary_artifact])
assert TextLogError.objects.count() == 2

Просмотреть файл

@ -7,19 +7,19 @@ from treeherder.log_parser.artifactbuildercollection import (
ArtifactBuilderCollection,
LogSizeException,
)
from treeherder.log_parser.artifactbuilders import BuildbotLogViewArtifactBuilder
from treeherder.log_parser.artifactbuilders import LogViewerArtifactBuilder
def test_builders_as_list():
"""test that passing in a list of builders works"""
builder = BuildbotLogViewArtifactBuilder()
builder = LogViewerArtifactBuilder()
lpc = ArtifactBuilderCollection("foo-url", builders=[builder])
assert lpc.builders == [builder]
def test_builders_as_single_still_list():
"""test that passing in a single builder becomes a list"""
builder = BuildbotLogViewArtifactBuilder()
builder = LogViewerArtifactBuilder()
lpc = ArtifactBuilderCollection("foo-url", builders=builder)
assert lpc.builders == [builder]
@ -43,7 +43,7 @@ def test_all_builders_complete():
lpc.parse()
exp = {
"text_log_summary": {"step_data": {"steps": [], "errors_truncated": False}, "logurl": url,},
"text_log_summary": {"errors": [], "logurl": url,},
}
assert exp == lpc.artifacts

Просмотреть файл

@ -4,9 +4,9 @@ import responses
from tests import test_utils
from tests.test_utils import add_log_response
from treeherder.log_parser.artifactbuildercollection import ArtifactBuilderCollection
from treeherder.log_parser.artifactbuilders import BuildbotLogViewArtifactBuilder
from treeherder.log_parser.artifactbuilders import LogViewerArtifactBuilder
slow = pytest.mark.slow
skip = pytest.mark.skip
@responses.activate
@ -20,7 +20,7 @@ def do_test(log):
url = add_log_response("{}.txt.gz".format(log))
builder = BuildbotLogViewArtifactBuilder(url)
builder = LogViewerArtifactBuilder(url)
lpc = ArtifactBuilderCollection(url, builders=builder)
lpc.parse()
act = lpc.artifacts[builder.name]
@ -36,23 +36,6 @@ def do_test(log):
assert act == exp
def test_crashtest_passing():
"""Process a job with a single log reference."""
do_test("mozilla-central_fedora-b2g_test-crashtest-1-bm54-tests1-linux-build50")
def test_mochitest_pass():
"""Process a job with a single log reference."""
do_test("mozilla-central_mountainlion_test-mochitest-2-bm77-tests1-macosx-build141")
def test_duration_gt_1hr():
do_test("mozilla-central-win32-pgo-bm85-build1-build111")
@slow
def test_mochitest_fail():
"""Process a job with a single log reference."""
@ -65,128 +48,133 @@ def test_mochitest_process_crash():
do_test("mozilla-inbound_ubuntu64_vm-debug_test-mochitest-other-bm53-tests1-linux-build122")
@slow
def test_crash_1():
"""Test from old log parser"""
do_test("crash-1")
def test_opt_objc_exception():
"""Test from old log parser"""
do_test("opt-objc-exception")
def test_jsreftest_fail():
"""Test from old log parser"""
do_test("jsreftest-fail")
# TODO remove old tests and update active tests with current live backing logs
@skip
def test_jetpack_fail():
"""Process a job with a single log reference."""
do_test("ux_ubuntu32_vm_test-jetpack-bm67-tests1-linux-build16")
@slow
def test_crash_1():
"""Test from old log parser"""
do_test("crash-1")
@slow
@skip
def test_crash_2():
"""Test from old log parser"""
do_test("crash-2")
@slow
@skip
def test_crash_mac_1():
"""Test from old log parser"""
do_test("crash-mac-1")
@slow
@skip
def test_crashtest_timeout():
"""Test from old log parser"""
do_test("crashtest-timeout")
@slow
def test_jsreftest_fail():
"""Test from old log parser"""
do_test("jsreftest-fail")
@slow
@skip
def test_jsreftest_timeout_crash():
"""Test from old log parser"""
do_test("jsreftest-timeout-crash")
@slow
@skip
def test_leaks_1():
"""Test from old log parser"""
do_test("leaks-1")
@slow
@skip
def test_mochitest_test_end():
"""Test from old log parser"""
do_test("mochitest-test-end")
@slow
@skip
def test_multiple_timeouts():
"""Test from old log parser"""
do_test("multiple-timeouts")
@slow
def test_opt_objc_exception():
"""Test from old log parser"""
do_test("opt-objc-exception")
@slow
@skip
def test_reftest_fail_crash():
"""Test from old log parser"""
do_test("reftest-fail-crash")
@slow
@skip
def test_reftest_jserror():
"""Test from old log parser"""
do_test("reftest-jserror")
@slow
@skip
def test_reftest_opt_fail():
"""Test from old log parser"""
do_test("reftest-opt-fail")
@slow
@skip
def test_reftest_timeout():
"""Test from old log parser"""
do_test("reftest-timeout")
@slow
@skip
def test_tinderbox_exception():
"""Test from old log parser"""
do_test("tinderbox-exception")
@skip
def test_xpcshell_crash():
"""Test from old log parser"""
do_test("xpcshell-crash")
@skip
def test_xpcshell_multiple():
"""Test from old log parser"""
do_test("xpcshell-multiple")
@skip
def test_xpcshell_timeout():
"""Test from old log parser"""
do_test("xpcshell-timeout")
@skip
# This test is not actually testing truncation of lines - remove
def test_extreme_log_line_length_truncation():
"""This log has lines that are huge. Ensure we truncate the lines to 100"""
do_test("mozilla-central_ubuntu64_hw_test-androidx86-set-4-bm103-tests1-linux-build369")
@skip
def test_too_many_error_lines_truncation():
"""This log has a large number of lines that match the error regex. Ensure we truncate to 100 lines."""
do_test("large-number-of-error-lines")
@skip
def test_taskcluster_missing_finish_marker():
"""
A log from a Taskcluster job, where there was an infrastructure problem,

Просмотреть файл

@ -3,7 +3,7 @@ from jsonschema import validate
from tests.test_utils import add_log_response
from treeherder.log_parser.artifactbuildercollection import ArtifactBuilderCollection
from treeherder.log_parser.artifactbuilders import BuildbotPerformanceDataArtifactBuilder
from treeherder.log_parser.artifactbuilders import PerformanceDataArtifactBuilder
from treeherder.log_parser.utils import PERFHERDER_SCHEMA
@ -21,7 +21,7 @@ def test_performance_log_parsing():
]:
url = add_log_response(logfile)
builder = BuildbotPerformanceDataArtifactBuilder(url=url)
builder = PerformanceDataArtifactBuilder(url=url)
lpc = ArtifactBuilderCollection(url, builders=[builder])
lpc.parse()
act = lpc.artifacts[builder.name]

Просмотреть файл

@ -81,7 +81,7 @@ def test_update_autoclassification_bug(test_job, test_job_2, classified_failures
mark_best_classification(text_log_errors[0], classified_failure)
assert classified_failure.bug_number is None
metadata = TextLogErrorMetadata.objects.get(text_log_error__step__job=test_job_2)
metadata = TextLogErrorMetadata.objects.get(text_log_error__job=test_job_2)
metadata.failure_line = FailureLine.objects.get(pk=3)
metadata.save()

Просмотреть файл

@ -1,180 +1,23 @@
{
"blob": {
"step_data": {
"steps": [
{
"errors": [],
"name": "set props: master",
"started": "2015-04-15 05:25:03.168328",
"started_linenumber": 8,
"finished_linenumber": 10,
"finished": "2015-04-15 05:25:03.168795",
"result": "success"
},
{
"errors": [],
"name": "set props: basedir",
"started": "2015-04-15 05:25:03.169099",
"started_linenumber": 12,
"finished_linenumber": 40,
"finished": "2015-04-15 05:25:03.597219",
"result": "success"
},
{
"errors": [],
"name": "downloading to buildprops.json",
"started": "2015-04-15 05:25:03.597542",
"started_linenumber": 42,
"finished_linenumber": 43,
"finished": "2015-04-15 05:25:03.726142",
"result": "success"
},
{
"errors": [],
"name": "'rm -rf ...'",
"started": "2015-04-15 05:25:03.726523",
"started_linenumber": 45,
"finished_linenumber": 71,
"finished": "2015-04-15 05:25:03.777120",
"result": "success"
},
{
"errors": [],
"name": "set props: script_repo_url",
"started": "2015-04-15 05:25:03.777445",
"started_linenumber": 73,
"finished_linenumber": 75,
"finished": "2015-04-15 05:25:03.777817",
"result": "success"
},
{
"errors": [],
"name": "'bash -c ...'",
"started": "2015-04-15 05:25:03.778747",
"started_linenumber": 77,
"finished_linenumber": 114,
"finished": "2015-04-15 05:25:03.945448",
"result": "success"
},
{
"errors": [],
"name": "set props: script_repo_revision script_repo_url",
"started": "2015-04-15 05:25:03.945809",
"started_linenumber": 116,
"finished_linenumber": 146,
"finished": "2015-04-15 05:25:04.682022",
"result": "success"
},
{
"errors": [],
"name": "'rm -rf ...'",
"started": "2015-04-15 05:25:04.682572",
"started_linenumber": 148,
"finished_linenumber": 174,
"finished": "2015-04-15 05:25:05.278125",
"result": "success"
},
{
"errors": [],
"name": "'hg clone ...'",
"started": "2015-04-15 05:25:05.278437",
"started_linenumber": 176,
"finished_linenumber": 210,
"finished": "2015-04-15 05:25:11.964370",
"result": "success"
},
{
"errors": [],
"name": "'hg update ...'",
"started": "2015-04-15 05:25:11.964712",
"started_linenumber": 212,
"finished_linenumber": 239,
"finished": "2015-04-15 05:25:12.506740",
"result": "success"
},
{
"errors": [],
"name": "set props: script_repo_revision",
"started": "2015-04-15 05:25:12.507514",
"started_linenumber": 241,
"finished_linenumber": 269,
"finished": "2015-04-15 05:25:12.700263",
"result": "success"
},
{
"errors": [],
"name": "downloading to oauth.txt",
"started": "2015-04-15 05:25:12.700568",
"started_linenumber": 271,
"finished_linenumber": 272,
"finished": "2015-04-15 05:25:12.730239",
"result": "success"
},
{
"errors": [],
"name": "tinderboxprint_script_revlink",
"started": "2015-04-15 05:25:12.730485",
"started_linenumber": 274,
"finished_linenumber": 276,
"finished": "2015-04-15 05:25:12.730832",
"result": "success"
},
{
"errors": [
{
"line": "05:35:49 INFO - 2018 INFO TEST-UNEXPECTED-FAIL | dom/indexedDB/test/test_transaction_lifetimes.html | Should be able to get objectStore - expected PASS",
"linenumber": 8151
},
{
"line": "05:35:49 INFO - 2019 INFO TEST-UNEXPECTED-FAIL | dom/indexedDB/test/test_transaction_lifetimes.html | Should be able to get index - expected PASS",
"linenumber": 8152
},
{
"line": "05:35:49 INFO - 2023 INFO TEST-UNEXPECTED-FAIL | dom/indexedDB/test/test_transaction_lifetimes.html | Ordering is correct. - expected PASS",
"linenumber": 8156
},
{
"line": "05:35:49 INFO - 2024 INFO TEST-UNEXPECTED-FAIL | dom/indexedDB/test/test_transaction_lifetimes.html | Worker: uncaught exception [http://mochi.test:8888/tests/dom/indexedDB/test/unit/test_transaction_lifetimes.js:45]: ': InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable' - expected PASS",
"linenumber": 8157
}
],
"name": "'/tools/buildbot/bin/python scripts/scripts/desktop_unittest.py ...' warnings",
"started": "2015-04-15 05:25:12.731202",
"started_linenumber": 278,
"finished_linenumber": 9248,
"finished": "2015-04-15 05:36:51.808779",
"result": "testfailed"
},
{
"errors": [],
"name": "set props: build_url blobber_files",
"started": "2015-04-15 05:36:51.812718",
"started_linenumber": 9250,
"finished_linenumber": 9280,
"finished": "2015-04-15 05:36:51.871786",
"result": "success"
},
{
"errors": [],
"name": "'rm -f ...'",
"started": "2015-04-15 05:36:51.872124",
"started_linenumber": 9282,
"finished_linenumber": 9308,
"finished": "2015-04-15 05:36:51.927004",
"result": "success"
},
{
"errors": [],
"name": "reboot skipped",
"started": "2015-04-15 05:36:51.927332",
"started_linenumber": 9310,
"finished_linenumber": 9311,
"finished": "2015-04-15 05:36:51.927750",
"result": "skipped"
}
],
"errors_truncated": false
},
"errors": [
{
"line": "05:35:49 INFO - 2018 INFO TEST-UNEXPECTED-FAIL | dom/indexedDB/test/test_transaction_lifetimes.html | Should be able to get objectStore - expected PASS",
"linenumber": 8151
},
{
"line": "05:35:49 INFO - 2019 INFO TEST-UNEXPECTED-FAIL | dom/indexedDB/test/test_transaction_lifetimes.html | Should be able to get index - expected PASS",
"linenumber": 8152
},
{
"line": "05:35:49 INFO - 2023 INFO TEST-UNEXPECTED-FAIL | dom/indexedDB/test/test_transaction_lifetimes.html | Ordering is correct. - expected PASS",
"linenumber": 8156
},
{
"line": "05:35:49 INFO - 2024 INFO TEST-UNEXPECTED-FAIL | dom/indexedDB/test/test_transaction_lifetimes.html | Worker: uncaught exception [http://mochi.test:8888/tests/dom/indexedDB/test/unit/test_transaction_lifetimes.js:45]: ': InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable' - expected PASS",
"linenumber": 8157
}
],
"logurl": "http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/2015/04/2015-04-15-03-02-06-mozilla-central/mozilla-central_snowleopard_test-mochitest-2-bm107-tests1-macosx-build128.txt.gz"
},
"type": "json",

Просмотреть файл

@ -1,70 +1,21 @@
{
"step_data": {
"steps": [
{
"errors": [],
"name": "set props: revision",
"started": "2013-06-05 12:51:48.767751",
"started_linenumber": 8,
"finished_linenumber": 10,
"finished": "2013-06-05 12:51:48.768393",
"result": "success"
},
{
"errors": [],
"name": "set props: who",
"started": "2013-06-05 12:51:48.768881",
"started_linenumber": 12,
"finished_linenumber": 14,
"finished": "2013-06-05 12:51:48.769473",
"result": "success"
},
{
"errors": [
{
"line": "Assertion failure: !(addr & GC_CELL_MASK), at e:/builds/moz2_slave/mozilla-central-win32-debug/build/js/src/jsgc.cpp:425",
"linenumber": 38435
},
{
"line": "NEXT ERROR <#err1> TEST-UNEXPECTED-FAIL | /tests/dom/tests/mochitest/ajax/jquery/test_jQuery.html | Exited with code -1073741819 during test run",
"linenumber": 38443
},
{
"line": "PROCESS-CRASH | /tests/dom/tests/mochitest/ajax/jquery/test_jQuery.html | application crashed (minidump found)",
"linenumber": 38446
},
{
"line": "TEST-UNEXPECTED-FAIL | automationutils.processLeakLog() | missing output line for total leaks!",
"linenumber": 39592
}
],
"name": "'python mochitest/runtests.py ...' warnings",
"started": "2013-06-05 12:54:55.232364",
"started_linenumber": 16,
"finished_linenumber": 39838,
"finished": "2013-06-05 13:15:39.235146",
"result": "testfailed"
},
{
"errors": [],
"name": "'rm -rf ...'",
"started": "2013-06-05 13:15:39.244545",
"started_linenumber": 39840,
"finished_linenumber": 39884,
"finished": "2013-06-05 13:16:04.014823",
"result": "success"
},
{
"errors": [],
"name": "maybe rebooting slave lost",
"started": "2013-06-05 13:16:04.015405",
"started_linenumber": 39886,
"finished_linenumber": 39888,
"finished": "2013-06-05 13:16:04.963614",
"result": "success"
}
],
"errors_truncated": false
},
"errors": [
{
"line": "Assertion failure: !(addr & GC_CELL_MASK), at e:/builds/moz2_slave/mozilla-central-win32-debug/build/js/src/jsgc.cpp:425",
"linenumber": 38435
},
{
"line": "NEXT ERROR <#err1> TEST-UNEXPECTED-FAIL | /tests/dom/tests/mochitest/ajax/jquery/test_jQuery.html | Exited with code -1073741819 during test run",
"linenumber": 38443
},
{
"line": "PROCESS-CRASH | /tests/dom/tests/mochitest/ajax/jquery/test_jQuery.html | application crashed (minidump found)",
"linenumber": 38446
},
{
"line": "TEST-UNEXPECTED-FAIL | automationutils.processLeakLog() | missing output line for total leaks!",
"linenumber": 39592
}
],
"logurl": "http://my-log.mozilla.org/crash-1.txt.gz"
}

Просмотреть файл

@ -1,262 +1,213 @@
{
"logurl": "http://my-log.mozilla.org/jsreftest-fail.txt.gz",
"step_data": {
"steps": [
{
"name": "set props: revision",
"started": "2013-06-05 12:51:48.767751",
"started_linenumber": 8,
"errors": [],
"finished": "2013-06-05 12:51:48.768393",
"finished_linenumber": 10,
"result": "success"
},
{
"name": "set props: who",
"started": "2013-06-05 12:51:48.768881",
"started_linenumber": 12,
"errors": [],
"finished": "2013-06-05 12:51:48.769473",
"finished_linenumber": 14,
"result": "success"
},
{
"name": "'python mochitest/runtests.py ...' warnings",
"started": "2013-06-05 12:54:55.232364",
"started_linenumber": 16,
"errors": [
{
"linenumber": 26994,
"line": "TypeError: invalid XML name <x/>[0]"
},
{
"linenumber": 77596,
"line": "NEXT ERROR <#err1> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 6 of test -"
},
{
"linenumber": 77603,
"line": "NEXT ERROR <#err2> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 7 of test -"
},
{
"linenumber": 77610,
"line": "NEXT ERROR <#err3> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 8 of test -"
},
{
"linenumber": 77617,
"line": "NEXT ERROR <#err4> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 9 of test -"
},
{
"linenumber": 77624,
"line": "NEXT ERROR <#err5> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 10 of test -"
},
{
"linenumber": 77631,
"line": "NEXT ERROR <#err6> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 11 of test -"
},
{
"linenumber": 77638,
"line": "NEXT ERROR <#err7> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 12 of test -"
},
{
"linenumber": 77645,
"line": "REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 13 of test -"
},
{
"linenumber": 77653,
"line": "REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 14 of test -"
},
{
"linenumber": 77660,
"line": "REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 15 of test -"
},
{
"linenumber": 80893,
"line": "568786: \"Assertion failure: !(attrs & (JSPROP_GETTER | JSPROP_SETTER)),\" with Object.defineProperty"
},
{
"linenumber": 84107,
"line": "ReferenceError: foo is not defined"
},
{
"linenumber": 84550,
"line": "InternalError: script stack space quota is exhausted"
},
{
"linenumber": 85826,
"line": "SyntaxError: property name a appears more than once in object literal"
},
{
"linenumber": 85828,
"line": "SyntaxError: property name 1 appears more than once in object literal"
},
{
"linenumber": 85830,
"line": "TypeError: redeclaration of const 5"
},
{
"linenumber": 85928,
"line": "TypeError: variable v redeclares argument"
},
{
"linenumber": 86154,
"line": "TypeError: redeclaration of const document"
},
{
"linenumber": 86697,
"line": "InternalError: script stack space quota is exhausted"
},
{
"linenumber": 86703,
"line": "InternalError: script stack space quota is exhausted"
},
{
"linenumber": 88372,
"line": "InternalError: too much recursion"
},
{
"linenumber": 88421,
"line": "TypeError: anonymous function does not always return a value"
},
{
"linenumber": 88423,
"line": "TypeError: anonymous function does not always return a value"
},
{
"linenumber": 88683,
"line": "SyntaxError: return not in function"
},
{
"linenumber": 89077,
"line": "SyntaxError: syntax error"
},
{
"linenumber": 89686,
"line": "STATUS: Do not assert: Assertion failed: \"need a way to EOT now, since this is trace end\": 0"
},
{
"linenumber": 89991,
"line": "ReferenceError: a is not defined | undefined | 45"
},
{
"linenumber": 90260,
"line": "TypeError: z is not a function"
},
{
"linenumber": 90266,
"line": "SyntaxError: return not in function"
},
{
"linenumber": 90710,
"line": "TypeError: 6 is not a function"
},
{
"linenumber": 90770,
"line": "TypeError: p.z = [1].some(function (y) {return y > 0;}) ? 4 : [6] is not a function"
},
{
"linenumber": 91497,
"line": "TypeError: (void 0) is undefined"
},
{
"linenumber": 91634,
"line": "ReferenceError: d is not defined"
},
{
"linenumber": 91635,
"line": "ReferenceError: d is not defined"
},
{
"linenumber": 91866,
"line": "TypeError: [15].some([].watch) is not a function"
},
{
"linenumber": 91927,
"line": "TypeError: null has no properties"
},
{
"linenumber": 92096,
"line": "TypeError: (void 0) is undefined"
},
{
"linenumber": 92113,
"line": "TypeError: already executing generator iter.send"
},
{
"linenumber": 92119,
"line": "TypeError: already executing generator iter.next"
},
{
"linenumber": 92125,
"line": "TypeError: already executing generator iter.close"
},
{
"linenumber": 92395,
"line": "SyntaxError: let declaration not directly within block"
},
{
"linenumber": 92401,
"line": "SyntaxError: let declaration not directly within block"
},
{
"linenumber": 92407,
"line": "SyntaxError: let declaration not directly within block"
},
{
"linenumber": 92413,
"line": "SyntaxError: let declaration not directly within block"
},
{
"linenumber": 92523,
"line": "ReferenceError: d is not defined"
},
{
"linenumber": 92549,
"line": "TypeError: missing argument 1 when calling function watch"
},
{
"linenumber": 92998,
"line": "TypeError: [] is not a function"
},
{
"linenumber": 93044,
"line": "TypeError: XML filter is applied to non-XML value NaN"
},
{
"linenumber": 93552,
"line": "TypeError: null has no properties"
},
{
"linenumber": 93661,
"line": "STATUS: Assertion failure: staticLevel == script->staticLevel, at ../jsobj.cpp"
},
{
"linenumber": 99204,
"line": "580200: Assertion failure enumerating own properties of proxy returning duplicated own property name"
}
],
"finished": "2013-06-05 13:15:39.235146",
"finished_linenumber": 99347,
"result": "testfailed"
},
{
"name": "'rm -rf ...'",
"started": "2013-06-05 13:15:39.244545",
"started_linenumber": 99349,
"errors": [],
"finished": "2013-06-05 13:16:04.014823",
"finished_linenumber": 99393,
"result": "success"
},
{
"name": "maybe rebooting slave lost",
"started": "2013-06-05 13:16:04.015405",
"started_linenumber": 99395,
"errors": [],
"finished": "2013-06-05 13:16:04.963614",
"finished_linenumber": 99397,
"result": "success"
}
],
"errors_truncated": false
}
"errors": [
{
"linenumber": 26994,
"line": "TypeError: invalid XML name <x/>[0]"
},
{
"linenumber": 77596,
"line": "NEXT ERROR <#err1> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 6 of test -"
},
{
"linenumber": 77603,
"line": "NEXT ERROR <#err2> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 7 of test -"
},
{
"linenumber": 77610,
"line": "NEXT ERROR <#err3> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 8 of test -"
},
{
"linenumber": 77617,
"line": "NEXT ERROR <#err4> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 9 of test -"
},
{
"linenumber": 77624,
"line": "NEXT ERROR <#err5> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 10 of test -"
},
{
"linenumber": 77631,
"line": "NEXT ERROR <#err6> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 11 of test -"
},
{
"linenumber": 77638,
"line": "NEXT ERROR <#err7> REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 12 of test -"
},
{
"linenumber": 77645,
"line": "REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 13 of test -"
},
{
"linenumber": 77653,
"line": "REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 14 of test -"
},
{
"linenumber": 77660,
"line": "REFTEST TEST-UNEXPECTED-FAIL | file:///c:/talos-slave/mozilla-central_win7_test-jsreftest/build/jsreftest/tests/jsreftest.html?test=ecma_3/RegExp/15.10.6.2-2.js | Section 15 of test -"
},
{
"linenumber": 80893,
"line": "568786: \"Assertion failure: !(attrs & (JSPROP_GETTER | JSPROP_SETTER)),\" with Object.defineProperty"
},
{
"linenumber": 84107,
"line": "ReferenceError: foo is not defined"
},
{
"linenumber": 84550,
"line": "InternalError: script stack space quota is exhausted"
},
{
"linenumber": 85826,
"line": "SyntaxError: property name a appears more than once in object literal"
},
{
"linenumber": 85828,
"line": "SyntaxError: property name 1 appears more than once in object literal"
},
{
"linenumber": 85830,
"line": "TypeError: redeclaration of const 5"
},
{
"linenumber": 85928,
"line": "TypeError: variable v redeclares argument"
},
{
"linenumber": 86154,
"line": "TypeError: redeclaration of const document"
},
{
"linenumber": 86697,
"line": "InternalError: script stack space quota is exhausted"
},
{
"linenumber": 86703,
"line": "InternalError: script stack space quota is exhausted"
},
{
"linenumber": 88372,
"line": "InternalError: too much recursion"
},
{
"linenumber": 88421,
"line": "TypeError: anonymous function does not always return a value"
},
{
"linenumber": 88423,
"line": "TypeError: anonymous function does not always return a value"
},
{
"linenumber": 88683,
"line": "SyntaxError: return not in function"
},
{
"linenumber": 89077,
"line": "SyntaxError: syntax error"
},
{
"linenumber": 89686,
"line": "STATUS: Do not assert: Assertion failed: \"need a way to EOT now, since this is trace end\": 0"
},
{
"linenumber": 89991,
"line": "ReferenceError: a is not defined | undefined | 45"
},
{
"linenumber": 90260,
"line": "TypeError: z is not a function"
},
{
"linenumber": 90266,
"line": "SyntaxError: return not in function"
},
{
"linenumber": 90710,
"line": "TypeError: 6 is not a function"
},
{
"linenumber": 90770,
"line": "TypeError: p.z = [1].some(function (y) {return y > 0;}) ? 4 : [6] is not a function"
},
{
"linenumber": 91497,
"line": "TypeError: (void 0) is undefined"
},
{
"linenumber": 91634,
"line": "ReferenceError: d is not defined"
},
{
"linenumber": 91635,
"line": "ReferenceError: d is not defined"
},
{
"linenumber": 91866,
"line": "TypeError: [15].some([].watch) is not a function"
},
{
"linenumber": 91927,
"line": "TypeError: null has no properties"
},
{
"linenumber": 92096,
"line": "TypeError: (void 0) is undefined"
},
{
"linenumber": 92113,
"line": "TypeError: already executing generator iter.send"
},
{
"linenumber": 92119,
"line": "TypeError: already executing generator iter.next"
},
{
"linenumber": 92125,
"line": "TypeError: already executing generator iter.close"
},
{
"linenumber": 92395,
"line": "SyntaxError: let declaration not directly within block"
},
{
"linenumber": 92401,
"line": "SyntaxError: let declaration not directly within block"
},
{
"linenumber": 92407,
"line": "SyntaxError: let declaration not directly within block"
},
{
"linenumber": 92413,
"line": "SyntaxError: let declaration not directly within block"
},
{
"linenumber": 92523,
"line": "ReferenceError: d is not defined"
},
{
"linenumber": 92549,
"line": "TypeError: missing argument 1 when calling function watch"
},
{
"linenumber": 92998,
"line": "TypeError: [] is not a function"
},
{
"linenumber": 93044,
"line": "TypeError: XML filter is applied to non-XML value NaN"
},
{
"linenumber": 93552,
"line": "TypeError: null has no properties"
},
{
"linenumber": 93661,
"line": "STATUS: Assertion failure: staticLevel == script->staticLevel, at ../jsobj.cpp"
},
{
"linenumber": 99204,
"line": "580200: Assertion failure enumerating own properties of proxy returning duplicated own property name"
}
],
"logurl": "http://my-log.mozilla.org/jsreftest-fail.txt.gz"
}

Просмотреть файл

@ -1,503 +0,0 @@
{
"step_data": {
"steps": [
{
"errors": [],
"name": "set props: basedir",
"started": "2014-06-29 22:30:16.350054",
"started_linenumber": 8,
"finished_linenumber": 91,
"finished": "2014-06-29 22:30:17.733586",
"result": "success"
},
{
"errors": [],
"name": "set props: hashType",
"started": "2014-06-29 22:30:17.733997",
"started_linenumber": 93,
"finished_linenumber": 95,
"finished": "2014-06-29 22:30:17.734323",
"result": "success"
},
{
"errors": [],
"name": "set props: builddir",
"started": "2014-06-29 22:30:17.734607",
"started_linenumber": 97,
"finished_linenumber": 180,
"finished": "2014-06-29 22:30:17.852754",
"result": "success"
},
{
"errors": [],
"name": "clobber build tools",
"started": "2014-06-29 22:30:17.853076",
"started_linenumber": 182,
"finished_linenumber": 263,
"finished": "2014-06-29 22:30:29.974564",
"result": "success"
},
{
"errors": [],
"name": "clone build tools",
"started": "2014-06-29 22:30:29.975158",
"started_linenumber": 265,
"finished_linenumber": 353,
"finished": "2014-06-29 22:30:44.923107",
"result": "success"
},
{
"errors": [],
"name": "set props: toolsdir",
"started": "2014-06-29 22:30:44.923506",
"started_linenumber": 355,
"finished_linenumber": 438,
"finished": "2014-06-29 22:30:45.044162",
"result": "success"
},
{
"errors": [],
"name": "no change",
"started": "2014-06-29 22:30:45.045078",
"started_linenumber": 440,
"finished_linenumber": 522,
"finished": "2014-06-29 22:30:45.166864",
"result": "success"
},
{
"errors": [],
"name": "checking clobber times",
"started": "2014-06-29 22:30:45.167229",
"started_linenumber": 524,
"finished_linenumber": 712,
"finished": "2014-06-29 22:40:58.302111",
"result": "success"
},
{
"errors": [],
"name": "set props: purge_actual purge_target",
"started": "2014-06-29 22:40:58.302908",
"started_linenumber": 714,
"finished_linenumber": 811,
"finished": "2014-06-29 22:41:00.825003",
"result": "success"
},
{
"errors": [],
"name": "set_buildids",
"started": "2014-06-29 22:41:00.825666",
"started_linenumber": 813,
"finished_linenumber": 814,
"finished": "2014-06-29 22:41:00.825811",
"result": "success"
},
{
"errors": [],
"name": "set props: toolsdir",
"started": "2014-06-29 22:41:00.826350",
"started_linenumber": 816,
"finished_linenumber": 899,
"finished": "2014-06-29 22:41:00.948217",
"result": "success"
},
{
"errors": [],
"name": "set props: basedir",
"started": "2014-06-29 22:41:00.948537",
"started_linenumber": 901,
"finished_linenumber": 984,
"finished": "2014-06-29 22:41:01.066839",
"result": "success"
},
{
"errors": [],
"name": "remove mozharness",
"started": "2014-06-29 22:41:01.067220",
"started_linenumber": 986,
"finished_linenumber": 1067,
"finished": "2014-06-29 22:41:01.185636",
"result": "success"
},
{
"errors": [],
"name": "checkout mozharness",
"started": "2014-06-29 22:41:01.185958",
"started_linenumber": 1069,
"finished_linenumber": 1159,
"finished": "2014-06-29 22:41:06.592065",
"result": "success"
},
{
"errors": [],
"name": "updating mozharness to production",
"started": "2014-06-29 22:41:06.593516",
"started_linenumber": 1161,
"finished_linenumber": 1243,
"finished": "2014-06-29 22:41:07.116755",
"result": "success"
},
{
"errors": [],
"name": "delete old package",
"started": "2014-06-29 22:41:07.117128",
"started_linenumber": 1245,
"finished_linenumber": 1339,
"finished": "2014-06-29 22:41:07.635397",
"result": "success"
},
{
"errors": [],
"name": "downloading to buildprops.json",
"started": "2014-06-29 22:41:07.636162",
"started_linenumber": 1341,
"finished_linenumber": 1342,
"finished": "2014-06-29 22:41:07.757331",
"result": "success"
},
{
"errors": [],
"name": "'python c:/builds/moz2_slave/m-cen-w32-pgo-0000000000000000/tools/buildfarm/utils/retry.py ...'",
"started": "2014-06-29 22:41:07.757876",
"started_linenumber": 1344,
"finished_linenumber": 1517,
"finished": "2014-06-29 22:53:53.500864",
"result": "success"
},
{
"errors": [],
"name": "set props: got_revision",
"started": "2014-06-29 22:53:53.503996",
"started_linenumber": 1519,
"finished_linenumber": 1601,
"finished": "2014-06-29 22:53:53.723762",
"result": "success"
},
{
"errors": [],
"name": "set props: comments",
"started": "2014-06-29 22:53:53.724120",
"started_linenumber": 1603,
"finished_linenumber": 1605,
"finished": "2014-06-29 22:53:53.724565",
"result": "success"
},
{
"errors": [],
"name": "got mozconfig",
"started": "2014-06-29 22:53:53.724904",
"started_linenumber": 1607,
"finished_linenumber": 1691,
"finished": "2014-06-29 22:53:54.184027",
"result": "success"
},
{
"errors": [],
"name": "'cat .mozconfig'",
"started": "2014-06-29 22:53:54.184825",
"started_linenumber": 1693,
"finished_linenumber": 1785,
"finished": "2014-06-29 22:53:54.304847",
"result": "success"
},
{
"errors": [],
"name": "'sh c:/builds/moz2_slave/m-cen-w32-pgo-0000000000000000/tools/scripts/tooltool/tooltool_wrapper.sh ...'",
"started": "2014-06-29 22:53:54.305271",
"started_linenumber": 1787,
"finished_linenumber": 1910,
"finished": "2014-06-29 22:53:56.138113",
"result": "success"
},
{
"errors": [],
"name": "remove old nonce",
"started": "2014-06-29 22:53:56.138958",
"started_linenumber": 1912,
"finished_linenumber": 1993,
"finished": "2014-06-29 22:53:56.257351",
"result": "success"
},
{
"errors": [],
"name": "downloading to token",
"started": "2014-06-29 22:53:56.257721",
"started_linenumber": 1995,
"finished_linenumber": 2000,
"finished": "2014-06-29 22:53:56.469662",
"result": "success"
},
{
"errors": [],
"name": "compile",
"started": "2014-06-29 22:53:56.470289",
"started_linenumber": 2002,
"finished_linenumber": 57536,
"finished": "2014-06-30 02:21:57.813004",
"result": "success"
},
{
"errors": [],
"name": "set props: vsize testresults",
"started": "2014-06-30 02:21:57.815584",
"started_linenumber": 57538,
"finished_linenumber": 57622,
"finished": "2014-06-30 02:21:57.958564",
"result": "success"
},
{
"errors": [],
"name": "set props: buildid",
"started": "2014-06-30 02:21:57.958855",
"started_linenumber": 57624,
"finished_linenumber": 57707,
"finished": "2014-06-30 02:22:00.177483",
"result": "success"
},
{
"errors": [],
"name": "set props: sourcestamp",
"started": "2014-06-30 02:22:00.177859",
"started_linenumber": 57709,
"finished_linenumber": 57792,
"finished": "2014-06-30 02:22:00.298879",
"result": "success"
},
{
"errors": [],
"name": "downloading to properties.json",
"started": "2014-06-30 02:22:00.299227",
"started_linenumber": 57794,
"finished_linenumber": 57795,
"finished": "2014-06-30 02:22:00.313580",
"result": "success"
},
{
"errors": [],
"name": "graph server post results complete",
"started": "2014-06-30 02:22:00.314328",
"started_linenumber": 57797,
"finished_linenumber": 57896,
"finished": "2014-06-30 02:22:01.356388",
"result": "success"
},
{
"errors": [],
"name": "'python c:/builds/moz2_slave/m-cen-w32-pgo-0000000000000000/build/build/pymake/make.py ...'",
"started": "2014-06-30 02:22:01.357389",
"started_linenumber": 57898,
"finished_linenumber": 58630,
"finished": "2014-06-30 02:27:10.574663",
"result": "success"
},
{
"errors": [],
"name": "'python c:/builds/moz2_slave/m-cen-w32-pgo-0000000000000000/build/build/pymake/make.py ...'",
"started": "2014-06-30 02:27:10.575695",
"started_linenumber": 58632,
"finished_linenumber": 59131,
"finished": "2014-06-30 02:34:37.112183",
"result": "success"
},
{
"errors": [],
"name": "'python c:/builds/moz2_slave/m-cen-w32-pgo-0000000000000000/build/build/pymake/make.py ...'",
"started": "2014-06-30 02:34:37.113149",
"started_linenumber": 59133,
"finished_linenumber": 63272,
"finished": "2014-06-30 02:36:25.733582",
"result": "success"
},
{
"errors": [],
"name": "find filepath",
"started": "2014-06-30 02:36:25.734713",
"started_linenumber": 63274,
"finished_linenumber": 63356,
"finished": "2014-06-30 02:36:50.759546",
"result": "success"
},
{
"errors": [],
"name": "set props: packageFilename",
"started": "2014-06-30 02:36:50.759940",
"started_linenumber": 63358,
"finished_linenumber": 63441,
"finished": "2014-06-30 02:36:50.883981",
"result": "success"
},
{
"errors": [],
"name": "set props: packageSize",
"started": "2014-06-30 02:36:50.884836",
"started_linenumber": 63443,
"finished_linenumber": 63526,
"finished": "2014-06-30 02:36:51.003225",
"result": "success"
},
{
"errors": [],
"name": "set props: packageHash",
"started": "2014-06-30 02:36:51.003640",
"started_linenumber": 63528,
"finished_linenumber": 63611,
"finished": "2014-06-30 02:36:51.727337",
"result": "success"
},
{
"errors": [],
"name": "set props: filepath",
"started": "2014-06-30 02:36:51.728149",
"started_linenumber": 63613,
"finished_linenumber": 63696,
"finished": "2014-06-30 02:36:51.852435",
"result": "success"
},
{
"errors": [],
"name": "'python c:/builds/moz2_slave/m-cen-w32-pgo-0000000000000000/build/build/pymake/make.py ...'",
"started": "2014-06-30 02:36:51.853240",
"started_linenumber": 63698,
"finished_linenumber": 67508,
"finished": "2014-06-30 02:38:19.792708",
"result": "success"
},
{
"errors": [],
"name": "find filepath",
"started": "2014-06-30 02:38:19.797776",
"started_linenumber": 67510,
"finished_linenumber": 67592,
"finished": "2014-06-30 02:38:20.178990",
"result": "success"
},
{
"errors": [],
"name": "set props: installerFilename",
"started": "2014-06-30 02:38:20.179426",
"started_linenumber": 67594,
"finished_linenumber": 67677,
"finished": "2014-06-30 02:38:20.299869",
"result": "success"
},
{
"errors": [],
"name": "set props: installerSize",
"started": "2014-06-30 02:38:20.300615",
"started_linenumber": 67679,
"finished_linenumber": 67762,
"finished": "2014-06-30 02:38:20.422898",
"result": "success"
},
{
"errors": [],
"name": "set props: installerHash",
"started": "2014-06-30 02:38:20.423321",
"started_linenumber": 67764,
"finished_linenumber": 67847,
"finished": "2014-06-30 02:38:20.746602",
"result": "success"
},
{
"errors": [],
"name": "set props: filepath",
"started": "2014-06-30 02:38:20.747658",
"started_linenumber": 67849,
"finished_linenumber": 67932,
"finished": "2014-06-30 02:38:20.866610",
"result": "success"
},
{
"errors": [],
"name": "set props: buildid",
"started": "2014-06-30 02:38:20.867042",
"started_linenumber": 67934,
"finished_linenumber": 68017,
"finished": "2014-06-30 02:38:20.988577",
"result": "success"
},
{
"errors": [],
"name": "set props: appVersion",
"started": "2014-06-30 02:38:20.989188",
"started_linenumber": 68019,
"finished_linenumber": 68102,
"finished": "2014-06-30 02:38:21.111717",
"result": "success"
},
{
"errors": [],
"name": "set props: appName",
"started": "2014-06-30 02:38:21.112102",
"started_linenumber": 68104,
"finished_linenumber": 68187,
"finished": "2014-06-30 02:38:21.235722",
"result": "success"
},
{
"errors": [],
"name": "set props: symbolsUrl packageUrl testsUrl jsshellUrl",
"started": "2014-06-30 02:38:21.236747",
"started_linenumber": 68189,
"finished_linenumber": 68366,
"finished": "2014-06-30 02:38:44.118836",
"result": "success"
},
{
"errors": [],
"name": "set build property skipped",
"started": "2014-06-30 02:38:44.120204",
"started_linenumber": 68368,
"finished_linenumber": 68369,
"finished": "2014-06-30 02:38:44.120762",
"result": "skipped"
},
{
"errors": [],
"name": "sendchange",
"started": "2014-06-30 02:38:44.121114",
"started_linenumber": 68371,
"finished_linenumber": 68480,
"finished": "2014-06-30 02:38:51.041903",
"result": "success"
},
{
"errors": [],
"name": "sendchange",
"started": "2014-06-30 02:38:51.042816",
"started_linenumber": 68482,
"finished_linenumber": 68591,
"finished": "2014-06-30 02:38:51.425600",
"result": "success"
},
{
"errors": [],
"name": "'python c:/builds/moz2_slave/m-cen-w32-pgo-0000000000000000/build/build/pymake/make.py ...'",
"started": "2014-06-30 02:38:51.426344",
"started_linenumber": 68593,
"finished_linenumber": 70179,
"finished": "2014-06-30 02:40:35.920512",
"result": "success"
},
{
"errors": [],
"name": "check test complete",
"started": "2014-06-30 02:40:35.921976",
"started_linenumber": 70181,
"finished_linenumber": 80063,
"finished": "2014-06-30 02:45:56.094867",
"result": "success"
},
{
"errors": [],
"name": "maybe rebooting slave lost",
"started": "2014-06-30 02:45:56.099903",
"started_linenumber": 80065,
"finished_linenumber": 80067,
"finished": "2014-06-30 02:45:56.743970",
"result": "success"
}
],
"errors_truncated": false
},
"logurl": "http://my-log.mozilla.org/mozilla-central-win32-pgo-bm85-build1-build111.txt.gz"
}

Просмотреть файл

@ -1,16 +0,0 @@
{
"job_details": [
{
"url": "http://hg.mozilla.org/build/mozharness/rev/c43ba6cb3db3",
"content_type": "link",
"value": "http://hg.mozilla.org/build/mozharness/rev/c43ba6cb3db3",
"title": "mozharness_revlink"
},
{
"content_type": "raw_html",
"value": "810/0/22",
"title": "crashtest"
}
],
"logurl": "http://my-log.mozilla.org/mozilla-central_fedora-b2g_test-crashtest-1-bm54-tests1-linux-build50.txt.gz"
}

Просмотреть файл

@ -1,116 +0,0 @@
{
"step_data": {
"steps": [
{
"errors": [],
"name": "set props: master",
"started": "2013-06-05 12:39:57.838527",
"started_linenumber": 8,
"finished_linenumber": 10,
"finished": "2013-06-05 12:39:57.839226",
"result": "success"
},
{
"errors": [],
"name": "set props: basedir",
"started": "2013-06-05 12:39:57.839702",
"started_linenumber": 12,
"finished_linenumber": 42,
"finished": "2013-06-05 12:39:58.346114",
"result": "success"
},
{
"errors": [],
"name": "downloading to buildprops.json",
"started": "2013-06-05 12:39:58.346573",
"started_linenumber": 44,
"finished_linenumber": 45,
"finished": "2013-06-05 12:39:58.614586",
"result": "success"
},
{
"errors": [],
"name": "'rm -rf ...'",
"started": "2013-06-05 12:39:58.615003",
"started_linenumber": 47,
"finished_linenumber": 75,
"finished": "2013-06-05 12:39:58.723069",
"result": "success"
},
{
"errors": [],
"name": "'rm -rf ...'",
"started": "2013-06-05 12:39:58.723521",
"started_linenumber": 77,
"finished_linenumber": 105,
"finished": "2013-06-05 12:39:58.831972",
"result": "success"
},
{
"errors": [],
"name": "'hg clone ...'",
"started": "2013-06-05 12:39:58.832419",
"started_linenumber": 107,
"finished_linenumber": 142,
"finished": "2013-06-05 12:40:01.114413",
"result": "success"
},
{
"errors": [],
"name": "'hg update ...'",
"started": "2013-06-05 12:40:01.114870",
"started_linenumber": 144,
"finished_linenumber": 173,
"finished": "2013-06-05 12:40:01.335999",
"result": "success"
},
{
"errors": [],
"name": "set props: script_repo_revision",
"started": "2013-06-05 12:40:01.336478",
"started_linenumber": 175,
"finished_linenumber": 205,
"finished": "2013-06-05 12:40:01.520234",
"result": "success"
},
{
"errors": [],
"name": "tinderboxprint_script_revlink",
"started": "2013-06-05 12:40:01.520734",
"started_linenumber": 207,
"finished_linenumber": 209,
"finished": "2013-06-05 12:40:01.521320",
"result": "success"
},
{
"errors": [],
"name": "'/tools/buildbot/bin/python scripts/scripts/b2g_emulator_unittest.py ...'",
"started": "2013-06-05 12:40:01.521797",
"started_linenumber": 211,
"finished_linenumber": 3369,
"finished": "2013-06-05 12:57:55.646752",
"result": "success"
},
{
"errors": [],
"name": "set props: build_url",
"started": "2013-06-05 12:57:55.659998",
"started_linenumber": 3371,
"finished_linenumber": 3401,
"finished": "2013-06-05 12:57:55.793402",
"result": "success"
},
{
"errors": [],
"name": "reboot slave lost",
"started": "2013-06-05 12:57:55.793914",
"started_linenumber": 3403,
"finished_linenumber": 3433,
"finished": "2013-06-05 12:58:55.994641",
"result": "success"
}
],
"errors_truncated": false
},
"logurl": "http://my-log.mozilla.org/mozilla-central_fedora-b2g_test-crashtest-1-bm54-tests1-linux-build50.txt.gz"
}

Просмотреть файл

@ -1,16 +0,0 @@
{
"job_details": [
{
"url": "http://hg.mozilla.org/build/mozharness/rev/c43ba6cb3db3",
"content_type": "link",
"value": "http://hg.mozilla.org/build/mozharness/rev/c43ba6cb3db3",
"title": "mozharness_revlink"
},
{
"content_type": "raw_html",
"value": "206415/0/18500",
"title": "mochitest-plain2"
}
],
"logurl": "http://my-log.mozilla.org/mozilla-central_mountainlion_test-mochitest-2-bm77-tests1-macosx-build141.txt.gz"
}

Просмотреть файл

@ -1,116 +0,0 @@
{
"step_data": {
"steps": [
{
"errors": [],
"name": "set props: master",
"started": "2013-06-05 12:55:02.793687",
"started_linenumber": 8,
"finished_linenumber": 10,
"finished": "2013-06-05 12:55:02.794485",
"result": "success"
},
{
"errors": [],
"name": "set props: basedir",
"started": "2013-06-05 12:55:02.794985",
"started_linenumber": 12,
"finished_linenumber": 36,
"finished": "2013-06-05 12:55:03.579905",
"result": "success"
},
{
"errors": [],
"name": "downloading to buildprops.json",
"started": "2013-06-05 12:55:03.580420",
"started_linenumber": 38,
"finished_linenumber": 39,
"finished": "2013-06-05 12:55:05.429410",
"result": "success"
},
{
"errors": [],
"name": "'rm -rf ...'",
"started": "2013-06-05 12:55:05.429870",
"started_linenumber": 41,
"finished_linenumber": 63,
"finished": "2013-06-05 12:55:05.711713",
"result": "success"
},
{
"errors": [],
"name": "'rm -rf ...'",
"started": "2013-06-05 12:55:05.712188",
"started_linenumber": 65,
"finished_linenumber": 87,
"finished": "2013-06-05 12:55:05.951055",
"result": "success"
},
{
"errors": [],
"name": "'hg clone ...'",
"started": "2013-06-05 12:55:05.951563",
"started_linenumber": 89,
"finished_linenumber": 118,
"finished": "2013-06-05 12:55:08.587665",
"result": "success"
},
{
"errors": [],
"name": "'hg update ...'",
"started": "2013-06-05 12:55:08.588162",
"started_linenumber": 120,
"finished_linenumber": 143,
"finished": "2013-06-05 12:55:09.070938",
"result": "success"
},
{
"errors": [],
"name": "set props: script_repo_revision",
"started": "2013-06-05 12:55:09.071436",
"started_linenumber": 145,
"finished_linenumber": 169,
"finished": "2013-06-05 12:55:09.553968",
"result": "success"
},
{
"errors": [],
"name": "tinderboxprint_script_revlink",
"started": "2013-06-05 12:55:09.554462",
"started_linenumber": 171,
"finished_linenumber": 173,
"finished": "2013-06-05 12:55:09.555053",
"result": "success"
},
{
"errors": [],
"name": "'/tools/buildbot/bin/python scripts/scripts/desktop_unittest.py ...'",
"started": "2013-06-05 12:55:09.555542",
"started_linenumber": 175,
"finished_linenumber": 11552,
"finished": "2013-06-05 13:02:38.681825",
"result": "success"
},
{
"errors": [],
"name": "set props: build_url",
"started": "2013-06-05 13:02:38.687346",
"started_linenumber": 11554,
"finished_linenumber": 11578,
"finished": "2013-06-05 13:02:38.876303",
"result": "success"
},
{
"errors": [],
"name": "reboot slave lost",
"started": "2013-06-05 13:02:38.876850",
"started_linenumber": 11580,
"finished_linenumber": 11609,
"finished": "2013-06-05 13:03:00.115654",
"result": "success"
}
],
"errors_truncated": false
},
"logurl": "http://my-log.mozilla.org/mozilla-central_mountainlion_test-mochitest-2-bm77-tests1-macosx-build141.txt.gz"
}

Просмотреть файл

@ -1,143 +1,13 @@
{
"step_data": {
"steps": [
{
"errors": [],
"name": "set props: master",
"started": "2014-07-17 08:45:18.801609",
"started_linenumber": 8,
"finished_linenumber": 10,
"finished": "2014-07-17 08:45:18.802011",
"result": "success"
},
{
"errors": [],
"name": "set props: basedir",
"started": "2014-07-17 08:45:18.802295",
"started_linenumber": 12,
"finished_linenumber": 56,
"finished": "2014-07-17 08:45:18.854874",
"result": "success"
},
{
"errors": [],
"name": "downloading to buildprops.json",
"started": "2014-07-17 08:45:18.855272",
"started_linenumber": 58,
"finished_linenumber": 59,
"finished": "2014-07-17 08:45:18.904210",
"result": "success"
},
{
"errors": [],
"name": "'rm -rf ...'",
"started": "2014-07-17 08:45:18.904577",
"started_linenumber": 61,
"finished_linenumber": 103,
"finished": "2014-07-17 08:45:18.943479",
"result": "success"
},
{
"errors": [],
"name": "'rm -rf ...'",
"started": "2014-07-17 08:45:18.943846",
"started_linenumber": 105,
"finished_linenumber": 147,
"finished": "2014-07-17 08:45:19.043322",
"result": "success"
},
{
"errors": [],
"name": "'hg clone ...'",
"started": "2014-07-17 08:45:19.043748",
"started_linenumber": 149,
"finished_linenumber": 198,
"finished": "2014-07-17 08:45:21.830887",
"result": "success"
},
{
"errors": [],
"name": "'hg update ...'",
"started": "2014-07-17 08:45:21.831343",
"started_linenumber": 200,
"finished_linenumber": 243,
"finished": "2014-07-17 08:45:22.037742",
"result": "success"
},
{
"errors": [],
"name": "set props: script_repo_revision",
"started": "2014-07-17 08:45:22.038178",
"started_linenumber": 245,
"finished_linenumber": 289,
"finished": "2014-07-17 08:45:22.126650",
"result": "success"
},
{
"errors": [],
"name": "downloading to oauth.txt",
"started": "2014-07-17 08:45:22.126969",
"started_linenumber": 291,
"finished_linenumber": 292,
"finished": "2014-07-17 08:45:22.140342",
"result": "success"
},
{
"errors": [],
"name": "tinderboxprint_script_revlink",
"started": "2014-07-17 08:45:22.140752",
"started_linenumber": 294,
"finished_linenumber": 296,
"finished": "2014-07-17 08:45:22.141210",
"result": "success"
},
{
"errors": [
{
"line": "09:14:00 INFO - org.json.JSONException: Unterminated string at character 23963 of {\"reason\":\"android-anr-report\",\"slug\":\"5e99c087-ebb5-4091-b5c8-75bd0889509c\",\"payload\":{\"ver\":1,\"simpleMeasurements\":{\"uptime\":0},\"info\":{\"reason\":\"android-anr-report\",\"OS\":\"Android\",\"version\":\"17\",\"appID\":\"{aa3c5121-dab2-40e2-81ca-7ea25febc110}\",\"appVersion\":\"33.0a1\",\"appName\":\"Fennec\",\"appBuildID\":\"20140717073317\",\"appUpdateChannel\":\"default\",\"platformBuildID\":\"20140717073317\",\"locale\":\"en-US\",\"cpucount\":1,\"",
"linenumber": 3544
},
{
"line": "09:14:00 INFO - 17 INFO TEST-UNEXPECTED-FAIL | testANRReporter | Exception caught - org.json.JSONException: Unterminated string at character 23963 of {\"reason\":\"android-anr-report\",\"slug\":\"5e99c087-ebb5-4091-b5c8-75bd0889509c\",\"payload\":{\"ver\":1,\"simpleMeasurements\":{\"uptime\":0},\"info\":{\"reason\":\"android-anr-report\",\"OS\":\"Android\",\"version\":\"17\",\"appID\":\"{aa3c5121-dab2-40e2-81ca-7ea25febc110}\",\"appVersion\":\"33.0a1\",\"appName\":\"Fennec\",\"appBuildID\":\"20140717073317\",\"appUpdateChannel\":\"default",
"linenumber": 3571
}
],
"name": "'/tools/buildbot/bin/python scripts/scripts/android_emulator_unittest.py ...' warnings",
"started": "2014-07-17 08:45:22.141524",
"started_linenumber": 298,
"finished_linenumber": 10231,
"finished": "2014-07-17 09:18:15.066397",
"result": "testfailed"
},
{
"errors": [],
"name": "set props: blobber_manifest_url build_url",
"started": "2014-07-17 09:18:15.071084",
"started_linenumber": 10233,
"finished_linenumber": 10279,
"finished": "2014-07-17 09:18:15.266212",
"result": "success"
},
{
"errors": [],
"name": "'rm -f ...'",
"started": "2014-07-17 09:18:15.266604",
"started_linenumber": 10281,
"finished_linenumber": 10323,
"finished": "2014-07-17 09:18:15.290870",
"result": "success"
},
{
"errors": [],
"name": "reboot slave lost",
"started": "2014-07-17 09:18:15.291165",
"started_linenumber": 10325,
"finished_linenumber": 10369,
"finished": "2014-07-17 09:18:22.104200",
"result": "success"
}
],
"errors_truncated": false
},
"errors": [
{
"line": "09:14:00 INFO - org.json.JSONException: Unterminated string at character 23963 of {\"reason\":\"android-anr-report\",\"slug\":\"5e99c087-ebb5-4091-b5c8-75bd0889509c\",\"payload\":{\"ver\":1,\"simpleMeasurements\":{\"uptime\":0},\"info\":{\"reason\":\"android-anr-report\",\"OS\":\"Android\",\"version\":\"17\",\"appID\":\"{aa3c5121-dab2-40e2-81ca-7ea25febc110}\",\"appVersion\":\"33.0a1\",\"appName\":\"Fennec\",\"appBuildID\":\"20140717073317\",\"appUpdateChannel\":\"default\",\"platformBuildID\":\"20140717073317\",\"locale\":\"en-US\",\"cpucount\":1,\"",
"linenumber": 3544
},
{
"line": "09:14:00 INFO - 17 INFO TEST-UNEXPECTED-FAIL | testANRReporter | Exception caught - org.json.JSONException: Unterminated string at character 23963 of {\"reason\":\"android-anr-report\",\"slug\":\"5e99c087-ebb5-4091-b5c8-75bd0889509c\",\"payload\":{\"ver\":1,\"simpleMeasurements\":{\"uptime\":0},\"info\":{\"reason\":\"android-anr-report\",\"OS\":\"Android\",\"version\":\"17\",\"appID\":\"{aa3c5121-dab2-40e2-81ca-7ea25febc110}\",\"appVersion\":\"33.0a1\",\"appName\":\"Fennec\",\"appBuildID\":\"20140717073317\",\"appUpdateChannel\":\"default",
"linenumber": 3571
}
],
"logurl": "http://my-log.mozilla.org/mozilla-central_ubuntu64_hw_test-androidx86-set-4-bm103-tests1-linux-build369.txt.gz"
}

Просмотреть файл

@ -1,224 +1,13 @@
{
"step_data": {
"steps": [
{
"errors": [],
"name": "set props: revision",
"started": "2013-06-05 12:51:48.767751",
"started_linenumber": 8,
"finished_linenumber": 10,
"finished": "2013-06-05 12:51:48.768393",
"result": "success"
},
{
"errors": [],
"name": "set props: who",
"started": "2013-06-05 12:51:48.768881",
"started_linenumber": 12,
"finished_linenumber": 14,
"finished": "2013-06-05 12:51:48.769473",
"result": "success"
},
{
"errors": [],
"name": "set props: basedir",
"started": "2013-06-05 12:51:48.769970",
"started_linenumber": 16,
"finished_linenumber": 62,
"finished": "2013-06-05 12:51:50.898723",
"result": "success"
},
{
"errors": [],
"name": "set props: hashType",
"started": "2013-06-05 12:51:50.899244",
"started_linenumber": 64,
"finished_linenumber": 110,
"finished": "2013-06-05 12:51:51.050525",
"result": "success"
},
{
"errors": [],
"name": "set props: builddir",
"started": "2013-06-05 12:51:51.051012",
"started_linenumber": 112,
"finished_linenumber": 158,
"finished": "2013-06-05 12:51:51.285053",
"result": "success"
},
{
"errors": [],
"name": "clobber build tools",
"started": "2013-06-05 12:51:51.285559",
"started_linenumber": 160,
"finished_linenumber": 204,
"finished": "2013-06-05 12:52:04.344452",
"result": "success"
},
{
"errors": [],
"name": "clone build tools",
"started": "2013-06-05 12:52:04.344949",
"started_linenumber": 206,
"finished_linenumber": 257,
"finished": "2013-06-05 12:52:27.906228",
"result": "success"
},
{
"errors": [],
"name": "set props: toolsdir",
"started": "2013-06-05 12:52:27.906738",
"started_linenumber": 259,
"finished_linenumber": 305,
"finished": "2013-06-05 12:52:28.096555",
"result": "success"
},
{
"errors": [],
"name": "set props: purge_actual purge_target",
"started": "2013-06-05 12:52:28.097052",
"started_linenumber": 307,
"finished_linenumber": 373,
"finished": "2013-06-05 12:52:28.689661",
"result": "success"
},
{
"errors": [],
"name": "'rm -rf ...'",
"started": "2013-06-05 12:52:28.690156",
"started_linenumber": 375,
"finished_linenumber": 419,
"finished": "2013-06-05 12:53:56.014058",
"result": "success"
},
{
"errors": [],
"name": "download",
"started": "2013-06-05 12:53:56.014651",
"started_linenumber": 421,
"finished_linenumber": 484,
"finished": "2013-06-05 12:54:02.983974",
"result": "success"
},
{
"errors": [],
"name": "unpack",
"started": "2013-06-05 12:54:02.984470",
"started_linenumber": 486,
"finished_linenumber": 530,
"finished": "2013-06-05 12:54:06.858348",
"result": "success"
},
{
"errors": [],
"name": "set props: exepath",
"started": "2013-06-05 12:54:06.858854",
"started_linenumber": 532,
"finished_linenumber": 534,
"finished": "2013-06-05 12:54:06.859521",
"result": "success"
},
{
"errors": [],
"name": "set props: exedir",
"started": "2013-06-05 12:54:06.859991",
"started_linenumber": 536,
"finished_linenumber": 538,
"finished": "2013-06-05 12:54:06.860629",
"result": "success"
},
{
"errors": [],
"name": "set props: toolsdir",
"started": "2013-06-05 12:54:06.861112",
"started_linenumber": 540,
"finished_linenumber": 586,
"finished": "2013-06-05 12:54:07.047366",
"result": "success"
},
{
"errors": [],
"name": "set props: symbols_url",
"started": "2013-06-05 12:54:07.047887",
"started_linenumber": 588,
"finished_linenumber": 590,
"finished": "2013-06-05 12:54:07.048555",
"result": "success"
},
{
"errors": [],
"name": "download",
"started": "2013-06-05 12:54:07.049041",
"started_linenumber": 592,
"finished_linenumber": 665,
"finished": "2013-06-05 12:54:22.389733",
"result": "success"
},
{
"errors": [],
"name": "set props: buildid",
"started": "2013-06-05 12:54:22.390374",
"started_linenumber": 667,
"finished_linenumber": 714,
"finished": "2013-06-05 12:54:22.547237",
"result": "success"
},
{
"errors": [],
"name": "'python.exe c:/talos-slave/test/tools/scripts/support/mouse_and_screen_resolution.py ...'",
"started": "2013-06-05 12:54:22.547836",
"started_linenumber": 716,
"finished_linenumber": 761,
"finished": "2013-06-05 12:54:23.359326",
"result": "success"
},
{
"errors": [],
"name": "unpack tests",
"started": "2013-06-05 12:54:23.359896",
"started_linenumber": 763,
"finished_linenumber": 807,
"finished": "2013-06-05 12:54:55.231690",
"result": "success"
},
{
"errors": [
{
"line": "TEST-UNEXPECTED-FAIL | chrome://mochitests/content/browser/dom/tests/browser/browser_ConsoleAPITests.js | Exception thrown in CO_observe: TypeError: Components.utils.isXrayWrapper is not a function",
"linenumber": 26745
},
{
"line": "TEST-UNEXPECTED-FAIL | chrome://mochitests/content/browser/dom/tests/browser/browser_ConsoleAPITests.js | Test timed out",
"linenumber": 26752
}
],
"name": "'python mochitest/runtests.py ...' warnings",
"started": "2013-06-05 12:54:55.232364",
"started_linenumber": 809,
"finished_linenumber": 54531,
"finished": "2013-06-05 13:15:39.235146",
"result": "testfailed"
},
{
"errors": [],
"name": "'rm -rf ...'",
"started": "2013-06-05 13:15:39.244545",
"started_linenumber": 54533,
"finished_linenumber": 54577,
"finished": "2013-06-05 13:16:04.014823",
"result": "success"
},
{
"errors": [],
"name": "maybe rebooting slave lost",
"started": "2013-06-05 13:16:04.015405",
"started_linenumber": 54579,
"finished_linenumber": 54581,
"finished": "2013-06-05 13:16:04.963614",
"result": "success"
}
],
"errors_truncated": false
},
"errors": [
{
"line": "TEST-UNEXPECTED-FAIL | chrome://mochitests/content/browser/dom/tests/browser/browser_ConsoleAPITests.js | Exception thrown in CO_observe: TypeError: Components.utils.isXrayWrapper is not a function",
"linenumber": 26745
},
{
"line": "TEST-UNEXPECTED-FAIL | chrome://mochitests/content/browser/dom/tests/browser/browser_ConsoleAPITests.js | Test timed out",
"linenumber": 26752
}
],
"logurl": "http://my-log.mozilla.org/mozilla-esr17_xp_test_pgo-mochitest-browser-chrome-bm74-tests1-windows-build12.txt.gz"
}

Просмотреть файл

@ -1,165 +1,53 @@
{
"step_data": {
"steps": [
{
"errors": [],
"name": "set props: master",
"started": "2013-06-05 12:44:58.842738",
"started_linenumber": 8,
"finished_linenumber": 10,
"finished": "2013-06-05 12:44:58.843804",
"result": "success"
},
{
"errors": [],
"name": "set props: basedir",
"started": "2013-06-05 12:44:58.844579",
"started_linenumber": 12,
"finished_linenumber": 52,
"finished": "2013-06-05 12:44:58.975106",
"result": "success"
},
{
"errors": [],
"name": "downloading to buildprops.json",
"started": "2013-06-05 12:44:58.975618",
"started_linenumber": 54,
"finished_linenumber": 55,
"finished": "2013-06-05 12:44:59.037644",
"result": "success"
},
{
"errors": [],
"name": "'rm -rf ...'",
"started": "2013-06-05 12:44:59.038141",
"started_linenumber": 57,
"finished_linenumber": 95,
"finished": "2013-06-05 12:44:59.112857",
"result": "success"
},
{
"errors": [],
"name": "'rm -rf ...'",
"started": "2013-06-05 12:44:59.113592",
"started_linenumber": 97,
"finished_linenumber": 135,
"finished": "2013-06-05 12:44:59.201908",
"result": "success"
},
{
"errors": [],
"name": "'hg clone ...'",
"started": "2013-06-05 12:44:59.202642",
"started_linenumber": 137,
"finished_linenumber": 182,
"finished": "2013-06-05 12:45:02.180652",
"result": "success"
},
{
"errors": [],
"name": "'hg update ...'",
"started": "2013-06-05 12:45:02.181421",
"started_linenumber": 184,
"finished_linenumber": 223,
"finished": "2013-06-05 12:45:02.421021",
"result": "success"
},
{
"errors": [],
"name": "set props: script_repo_revision",
"started": "2013-06-05 12:45:02.421566",
"started_linenumber": 225,
"finished_linenumber": 265,
"finished": "2013-06-05 12:45:02.558016",
"result": "success"
},
{
"errors": [],
"name": "tinderboxprint_script_revlink",
"started": "2013-06-05 12:45:02.558553",
"started_linenumber": 267,
"finished_linenumber": 269,
"finished": "2013-06-05 12:45:02.559173",
"result": "success"
},
{
"errors": [
{
"line": "12:46:31 INFO - Assertion failure: pNew->iVersion == pSub->iVersion, at ../../../storage/src/TelemetryVFS.cpp:357",
"linenumber": 825
},
{
"line": "12:46:31 WARNING - TEST-UNEXPECTED-FAIL | automation.py | Exited with code 11 during test run",
"linenumber": 826
},
{
"line": "12:46:37 WARNING - PROCESS-CRASH | automation.py | application crashed [@ xOpen]",
"linenumber": 829
},
{
"line": "12:46:38 ERROR - Return code: 1",
"linenumber": 1600
},
{
"line": "12:46:40 INFO - Assertion failure: pNew->iVersion == pSub->iVersion, at ../../../storage/src/TelemetryVFS.cpp:357",
"linenumber": 1632
},
{
"line": "12:46:40 WARNING - TEST-UNEXPECTED-FAIL | automation.py | Exited with code 11 during test run",
"linenumber": 1633
},
{
"line": "12:46:46 WARNING - PROCESS-CRASH | automation.py | application crashed [@ xOpen]",
"linenumber": 1636
},
{
"line": "12:46:46 ERROR - Return code: 1",
"linenumber": 2283
},
{
"line": "12:46:48 INFO - Assertion failure: pNew->iVersion == pSub->iVersion, at ../../../storage/src/TelemetryVFS.cpp:357",
"linenumber": 2315
},
{
"line": "12:46:48 WARNING - TEST-UNEXPECTED-FAIL | automation.py | Exited with code 11 during test run",
"linenumber": 2316
},
{
"line": "12:46:55 WARNING - PROCESS-CRASH | automation.py | application crashed [@ xOpen]",
"linenumber": 2319
},
{
"line": "12:46:55 ERROR - Return code: 1",
"linenumber": 3062
}
],
"name": "'/tools/buildbot/bin/python scripts/scripts/desktop_unittest.py ...' warnings",
"started": "2013-06-05 12:45:02.559674",
"started_linenumber": 271,
"finished_linenumber": 3070,
"finished": "2013-06-05 12:46:55.430095",
"result": "testfailed"
},
{
"errors": [],
"name": "set props: build_url symbols_url",
"started": "2013-06-05 12:46:55.431212",
"started_linenumber": 3072,
"finished_linenumber": 3114,
"finished": "2013-06-05 12:46:55.479840",
"result": "success"
},
{
"errors": [],
"name": "reboot slave lost",
"started": "2013-06-05 12:46:55.480585",
"started_linenumber": 3116,
"finished_linenumber": 3118,
"finished": "2013-06-05 12:46:57.867188",
"result": "success"
}
],
"errors_truncated": false
},
"errors": [
{
"line": "12:46:31 INFO - Assertion failure: pNew->iVersion == pSub->iVersion, at ../../../storage/src/TelemetryVFS.cpp:357",
"linenumber": 825
},
{
"line": "12:46:31 WARNING - TEST-UNEXPECTED-FAIL | automation.py | Exited with code 11 during test run",
"linenumber": 826
},
{
"line": "12:46:37 WARNING - PROCESS-CRASH | automation.py | application crashed [@ xOpen]",
"linenumber": 829
},
{
"line": "12:46:38 ERROR - Return code: 1",
"linenumber": 1600
},
{
"line": "12:46:40 INFO - Assertion failure: pNew->iVersion == pSub->iVersion, at ../../../storage/src/TelemetryVFS.cpp:357",
"linenumber": 1632
},
{
"line": "12:46:40 WARNING - TEST-UNEXPECTED-FAIL | automation.py | Exited with code 11 during test run",
"linenumber": 1633
},
{
"line": "12:46:46 WARNING - PROCESS-CRASH | automation.py | application crashed [@ xOpen]",
"linenumber": 1636
},
{
"line": "12:46:46 ERROR - Return code: 1",
"linenumber": 2283
},
{
"line": "12:46:48 INFO - Assertion failure: pNew->iVersion == pSub->iVersion, at ../../../storage/src/TelemetryVFS.cpp:357",
"linenumber": 2315
},
{
"line": "12:46:48 WARNING - TEST-UNEXPECTED-FAIL | automation.py | Exited with code 11 during test run",
"linenumber": 2316
},
{
"line": "12:46:55 WARNING - PROCESS-CRASH | automation.py | application crashed [@ xOpen]",
"linenumber": 2319
},
{
"line": "12:46:55 ERROR - Return code: 1",
"linenumber": 3062
}
],
"logurl": "http://my-log.mozilla.org/mozilla-inbound_ubuntu64_vm-debug_test-mochitest-other-bm53-tests1-linux-build122.txt.gz"
}

Просмотреть файл

@ -1,66 +1,17 @@
{
"logurl": "http://my-log.mozilla.org/opt-objc-exception.txt.gz",
"step_data": {
"steps": [
{
"name": "set props: revision",
"started": "2013-06-05 12:51:48.767751",
"started_linenumber": 8,
"errors": [],
"finished": "2013-06-05 12:51:48.768393",
"finished_linenumber": 10,
"result": "success"
},
{
"name": "set props: who",
"started": "2013-06-05 12:51:48.768881",
"started_linenumber": 12,
"errors": [],
"finished": "2013-06-05 12:51:48.769473",
"finished_linenumber": 14,
"result": "success"
},
{
"name": "'python mochitest/runtests.py ...' warnings",
"started": "2013-06-05 12:54:55.232364",
"started_linenumber": 16,
"errors": [
{
"linenumber": 24056,
"line": " SimpleTest._logResult(test, \"TEST-PASS\", \"TEST-UNEXPECTED-FAIL\");"
},
{
"linenumber": 24084,
"line": " SimpleTest._logResult(test, \"TEST-UNEXPECTED-PASS\", \"TEST-KNOWN-FAIL\");"
},
{
"linenumber": 48743,
"line": "2010-09-23 14:48:01.299 firefox-bin[319:10b] *** Assertion failure in -[NSNextStepFrame lockFocus], /SourceCache/AppKit/AppKit-949.54/AppKit.subproj/NSView.m:4755"
}
],
"finished": "2013-06-05 13:15:39.235146",
"finished_linenumber": 48792,
"result": "testfailed"
},
{
"name": "'rm -rf ...'",
"started": "2013-06-05 13:15:39.244545",
"started_linenumber": 48794,
"errors": [],
"finished": "2013-06-05 13:16:04.014823",
"finished_linenumber": 48838,
"result": "success"
},
{
"name": "maybe rebooting slave lost",
"started": "2013-06-05 13:16:04.015405",
"started_linenumber": 48840,
"errors": [],
"finished": "2013-06-05 13:16:04.963614",
"finished_linenumber": 48842,
"result": "success"
}
],
"errors_truncated": false
}
"errors": [
{
"linenumber": 24056,
"line": " SimpleTest._logResult(test, \"TEST-PASS\", \"TEST-UNEXPECTED-FAIL\");"
},
{
"linenumber": 24084,
"line": " SimpleTest._logResult(test, \"TEST-UNEXPECTED-PASS\", \"TEST-KNOWN-FAIL\");"
},
{
"linenumber": 48743,
"line": "2010-09-23 14:48:01.299 firefox-bin[319:10b] *** Assertion failure in -[NSNextStepFrame lockFocus], /SourceCache/AppKit/AppKit-949.54/AppKit.subproj/NSView.m:4755"
}
],
"logurl": "http://my-log.mozilla.org/opt-objc-exception.txt.gz"
}

Просмотреть файл

@ -186,7 +186,7 @@ describe('Filtering', () => {
[],
);
fetchMock.get(
getProjectUrl('/jobs/259537372/text_log_steps/', 'autoland'),
getProjectUrl('/jobs/259537372/text_log_errors/', 'autoland'),
[],
);
});

Просмотреть файл

@ -41,7 +41,7 @@ describe('DetailsPanel', () => {
fetchMock.get(getProjectUrl('/jobs/259537372/', repoName), jobList.data[1]);
fetchMock.get(getProjectUrl('/note/?job_id=259537372', repoName), []);
fetchMock.get(
getProjectUrl('/jobs/259537372/text_log_steps/', repoName),
getProjectUrl('/jobs/259537372/text_log_errors/', repoName),
[],
);
fetchMock.get(

Просмотреть файл

@ -36,7 +36,7 @@
"resource_uri": "/api/project/try/jobs/303550431/",
"logs": [
{
"name": "builds-4h",
"name": "live_backing_log",
"url": "https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/O5YBAWwxRfuZ_UlRJS5Rqg/runs/0/artifacts/public/logs/live_backing.log"
},
{

Просмотреть файл

@ -49,7 +49,7 @@ describe('DetailsPanel', () => {
'[taskcluster 2020-05-27 22:09:41.219Z] Task ID: WhN846qNQPin_jnGyF3w-g\n' +
'[taskcluster 2020-05-27 22:09:41.219Z] Worker ID: i-04f0e9fbffe5a9186\n',
);
fetchMock.get(getProjectUrl('/jobs/285852125/text_log_steps/', 'try'), [
fetchMock.get(getProjectUrl('/jobs/285852125/text_log_errors/', 'try'), [
{
id: 639432541,
errors: [

Просмотреть файл

@ -37,7 +37,7 @@ describe('FailureSummaryTab', () => {
logViewerFullUrl="ber/baz"
addBug={() => {}}
pinJob={() => {}}
repoName="autoland"
repoName={repoName}
/>
);

Просмотреть файл

@ -5,7 +5,7 @@ from dateutil import parser
from django.urls import reverse
from rest_framework.status import HTTP_400_BAD_REQUEST
from treeherder.model.models import Job, TextLogError, TextLogStep
from treeherder.model.models import Job, TextLogError
@pytest.mark.parametrize(
@ -209,111 +209,10 @@ def test_job_detail_not_found(client, test_repository):
assert resp.status_code == 404
def test_text_log_steps_and_errors(client, test_job):
TextLogStep.objects.create(
job=test_job,
name='step1',
started=datetime.datetime.utcfromtimestamp(0),
finished=datetime.datetime.utcfromtimestamp(100),
started_line_number=1,
finished_line_number=100,
result=TextLogStep.SUCCESS,
)
step2 = TextLogStep.objects.create(
job=test_job,
name='step2',
started=datetime.datetime.utcfromtimestamp(101),
finished=datetime.datetime.utcfromtimestamp(200),
started_line_number=101,
finished_line_number=200,
result=TextLogStep.TEST_FAILED,
)
TextLogError.objects.create(job=test_job, step=step2, line='failure 1', line_number=101)
TextLogError.objects.create(job=test_job, step=step2, line='failure 2', line_number=102)
resp = client.get(
reverse(
"jobs-text-log-steps", kwargs={"project": test_job.repository.name, "pk": test_job.id}
)
)
assert resp.status_code == 200
assert resp.json() == [
{
'errors': [],
'finished': '1970-01-01T00:01:40',
'finished_line_number': 100,
'id': 1,
'name': 'step1',
'result': 'success',
'started': '1970-01-01T00:00:00',
'started_line_number': 1,
},
{
'errors': [
{
'id': 1,
'job': 1,
'line': 'failure 1',
'line_number': 101,
'bug_suggestions': {
'search': 'failure 1',
'search_terms': ['failure 1'],
'bugs': {'open_recent': [], 'all_others': []},
'line_number': 101,
},
'metadata': None,
'matches': [],
'classified_failures': [],
},
{
'id': 2,
'job': 1,
'line': 'failure 2',
'line_number': 102,
'bug_suggestions': {
'search': 'failure 2',
'search_terms': ['failure 2'],
'bugs': {'open_recent': [], 'all_others': []},
'line_number': 102,
},
'metadata': None,
'matches': [],
'classified_failures': [],
},
],
'finished': '1970-01-01T00:03:20',
'finished_line_number': 200,
'id': 2,
'name': 'step2',
'result': 'testfailed',
'started': '1970-01-01T00:01:41',
'started_line_number': 101,
},
]
def test_text_log_errors(client, test_job):
TextLogStep.objects.create(
job=test_job,
name='step1',
started=datetime.datetime.utcfromtimestamp(0),
finished=datetime.datetime.utcfromtimestamp(100),
started_line_number=1,
finished_line_number=100,
result=TextLogStep.SUCCESS,
)
step2 = TextLogStep.objects.create(
job=test_job,
name='step2',
started=datetime.datetime.utcfromtimestamp(101),
finished=datetime.datetime.utcfromtimestamp(200),
started_line_number=101,
finished_line_number=200,
result=TextLogStep.TEST_FAILED,
)
TextLogError.objects.create(job=test_job, step=step2, line='failure 1', line_number=101)
TextLogError.objects.create(job=test_job, step=step2, line='failure 2', line_number=102)
TextLogError.objects.create(job=test_job, line='failure 1', line_number=101)
TextLogError.objects.create(job=test_job, line='failure 2', line_number=102)
resp = client.get(
reverse(
"jobs-text-log-errors", kwargs={"project": test_job.repository.name, "pk": test_job.id}

Просмотреть файл

@ -50,8 +50,8 @@ def match_errors(job, matchers=None):
return
all_errors = set(
TextLogError.objects.filter(step__job=job, classified_failures=None).prefetch_related(
'step', '_metadata', '_metadata__failure_line'
TextLogError.objects.filter(job=job, classified_failures=None).prefetch_related(
'_metadata', '_metadata__failure_line'
)
)
errors = [t for t in all_errors if t.metadata and t.metadata.failure_line]

Просмотреть файл

@ -32,7 +32,7 @@ def precise_matcher(text_log_error):
}
qwargs = Q(text_log_error___metadata__best_classification=None) & (
Q(text_log_error___metadata__best_is_verified=True)
| Q(text_log_error__step__job=text_log_error.step.job)
| Q(text_log_error__job=text_log_error.job)
)
qs = (
TextLogErrorMatch.objects.filter(**f)
@ -74,7 +74,7 @@ def crash_signature_matcher(text_log_error):
}
qwargs = Q(text_log_error___metadata__best_classification=None) & (
Q(text_log_error___metadata__best_is_verified=True)
| Q(text_log_error__step__job=text_log_error.step.job)
| Q(text_log_error__job=text_log_error.job)
)
qs = (
TextLogErrorMatch.objects.filter(**f)

Просмотреть файл

@ -423,7 +423,7 @@ BZ_DATETIME_FORMAT = '%Y-%m-%dT%H:%M:%SZ'
COMMENTER_API_KEY = env("BUG_COMMENTER_API_KEY", default=None)
# Log Parsing
PARSER_MAX_STEP_ERROR_LINES = 100
MAX_ERROR_LINES = 100
FAILURE_LINES_CUTOFF = 35
# Perfherder

Просмотреть файл

@ -1,6 +1,5 @@
import logging
import dateutil.parser
import simplejson as json
from django.db import transaction
from django.db.utils import IntegrityError
@ -8,7 +7,7 @@ from django.db.utils import IntegrityError
from treeherder.etl.perf import store_performance_artifact
from treeherder.etl.text import astral_filter
from treeherder.model import error_summary
from treeherder.model.models import Job, TextLogError, TextLogStep
from treeherder.model.models import Job, TextLogError
logger = logging.getLogger(__name__)
@ -17,38 +16,15 @@ def store_text_log_summary_artifact(job, text_log_summary_artifact):
"""
Store the contents of the text log summary artifact
"""
step_data = json.loads(text_log_summary_artifact['blob'])['step_data']
result_map = {v: k for (k, v) in TextLogStep.RESULTS}
errors = json.loads(text_log_summary_artifact['blob'])['errors']
with transaction.atomic():
for step in step_data['steps']:
name = step['name'][: TextLogStep._meta.get_field('name').max_length]
# process start/end times if we have them
# we currently don't support timezones in treeherder, so
# just ignore that when importing/updating the bug to avoid
# a ValueError (though by default the text log summaries
# we produce should have time expressed in UTC anyway)
time_kwargs = {}
for tkey in ('started', 'finished'):
if step.get(tkey):
time_kwargs[tkey] = dateutil.parser.parse(step[tkey], ignoretz=True)
log_step = TextLogStep.objects.create(
job=job,
started_line_number=step['started_linenumber'],
finished_line_number=step['finished_linenumber'],
name=name,
result=result_map[step['result']],
**time_kwargs,
for error in errors:
obj, created = TextLogError.objects.get_or_create(
job=job, line_number=error['linenumber'], line=astral_filter(error['line']),
)
if step.get('errors'):
for error in step['errors']:
TextLogError.objects.create(
job=job,
step=log_step,
line_number=error['linenumber'],
line=astral_filter(error['line']),
)
if not created:
logger.warning('duplicate error lines processed for job %s', job.id)
# get error summary immediately (to warm the cache)
error_summary.get_error_summary(job)

Просмотреть файл

@ -4,7 +4,7 @@ import newrelic.agent
from treeherder.utils.http import make_request
from .artifactbuilders import BuildbotLogViewArtifactBuilder, BuildbotPerformanceDataArtifactBuilder
from .artifactbuilders import LogViewerArtifactBuilder, PerformanceDataArtifactBuilder
from .parsers import EmptyPerformanceData
logger = logging.getLogger(__name__)
@ -39,13 +39,13 @@ ArtifactBuilderBase
* parser
* Passes lines the ``Parser``
BuildbotLogViewArtifactBuilder
LogViewerArtifactBuilder
-------------
* Parses out content for use in a visual Log Parser
* Parsers:
* StepParser, which has its own ErrorParser
* ErrorParser
BuildbotPerformanceDataArtifactBuilder
PerformanceDataArtifactBuilder
-------------
* Builds an artifact from performance data
* Parsers:
@ -72,8 +72,8 @@ BuildbotPerformanceDataArtifactBuilder
else:
# use the defaults
self.builders = [
BuildbotLogViewArtifactBuilder(url=self.url),
BuildbotPerformanceDataArtifactBuilder(url=self.url),
LogViewerArtifactBuilder(url=self.url),
PerformanceDataArtifactBuilder(url=self.url),
]
def parse(self):

Просмотреть файл

@ -1,13 +1,13 @@
import logging
from .parsers import PerformanceParser, StepParser
from .parsers import PerformanceParser, ErrorParser
logger = logging.getLogger(__name__)
class ArtifactBuilderBase:
"""
Base class for all Buildbot log parsers.
Base class for all log parsers.
The child class will be designed to create a particular type of artifact.
@ -61,17 +61,17 @@ class ArtifactBuilderBase:
return self.artifact
class BuildbotLogViewArtifactBuilder(ArtifactBuilderBase):
class LogViewerArtifactBuilder(ArtifactBuilderBase):
"""Makes the artifact for the structured log viewer."""
def __init__(self, url=None):
"""Construct artifact builder for the log viewer"""
super().__init__(url)
self.parser = StepParser()
self.parser = ErrorParser()
self.name = "text_log_summary"
class BuildbotPerformanceDataArtifactBuilder(ArtifactBuilderBase):
class PerformanceDataArtifactBuilder(ArtifactBuilderBase):
"""Makes the artifact for performance data."""
def __init__(self, url=None):

Просмотреть файл

@ -39,7 +39,7 @@ def crossreference_job(job):
@transaction.atomic
def _crossreference(job):
failure_lines = FailureLine.objects.filter(job_guid=job.guid)
text_log_errors = TextLogError.objects.filter(step__job=job).order_by('line_number')
text_log_errors = TextLogError.objects.filter(job=job).order_by('line_number')
if not failure_lines and text_log_errors:
return False

Просмотреть файл

@ -39,227 +39,6 @@ class ParserBase:
return self.artifact
class StepParser(ParserBase):
"""
Parse out individual job steps within a log.
Step format:
"steps": [
{
"errors": [],
"name": "set props: master", # the name of the process on start line
"started": "2013-06-05 12:39:57.838527",
"started_linenumber": 8,
"finished_linenumber": 10,
"finished": "2013-06-05 12:39:57.839226",
"result": 0
},
...
]
"""
# Matches the half-dozen 'key: value' header lines printed at the start of each
# Buildbot job log. The list of keys are taken from:
# https://hg.mozilla.org/build/buildbotcustom/file/644c3860300a/bin/log_uploader.py#l126
RE_HEADER_LINE = re.compile(
r'(?:builder|slave|starttime|results|buildid|builduid|revision): .*'
)
# Step marker lines, eg:
# ========= Started foo (results: 0, elapsed: 0 secs) (at 2015-08-17 02:33:56.353866) =========
# ========= Finished foo (results: 0, elapsed: 0 secs) (at 2015-08-17 02:33:56.354301) =========
RE_STEP_MARKER = re.compile(
r'={9} (?P<marker_type>Started|Finished) (?P<name>.*?) '
r'\(results: (?P<result_code>\d+), elapsed: .*?\) '
r'\(at (?P<timestamp>.*?)\)'
)
# Legacy result code to name mapping inherited from buildbot (duplicated in TextLogStep)
# TODO: Likely remove this and step handling entirely now that Taskcluster doesn't have steps.
RESULT_DICT = {
0: "success",
1: "testfailed",
2: "busted",
3: "skipped",
4: "exception",
5: "retry",
6: "usercancel",
7: "superseded",
}
STATES = {
# The initial state until we record the first step.
"awaiting_first_step": 0,
# We've started a step, but not yet seen the end of it.
"step_in_progress": 1,
# We've seen the end of the previous step.
"step_finished": 2,
}
# date format in a step started/finished header
DATE_FORMAT = '%Y-%m-%d %H:%M:%S.%f'
def __init__(self):
"""Setup the artifact to hold the header lines."""
super().__init__("step_data")
self.stepnum = -1
self.artifact = {"steps": [], "errors_truncated": False}
self.sub_parser = ErrorParser()
self.state = self.STATES['awaiting_first_step']
def parse_line(self, line, lineno):
"""Parse a single line of the log.
We have to handle both buildbot style logs as well as Taskcluster logs. The latter
attempt to emulate the buildbot logs, but don't accurately do so, partly due
to the way logs are generated in Taskcluster (ie: on the workers themselves).
Buildbot logs:
builder: ...
slave: ...
starttime: ...
results: ...
buildid: ...
builduid: ...
revision: ...
======= <step START marker> =======
<step log output>
======= <step FINISH marker> =======
======= <step START marker> =======
<step log output>
======= <step FINISH marker> =======
Taskcluster logs (a worst-case example):
<log output outside a step>
======= <step START marker> =======
<step log output>
======= <step FINISH marker> =======
<log output outside a step>
======= <step START marker> =======
<step log output with no following finish marker>
As can be seen above, Taskcluster logs can have (a) log output that falls between
step markers, and (b) content at the end of the log, that is not followed by a
final finish step marker. We handle this by creating generic placeholder steps to
hold the log output that is not enclosed by step markers, and then by cleaning up
the final step in finish_parse() once all lines have been parsed.
"""
if not line.strip():
# Skip whitespace-only lines, since they will never contain an error line,
# so are not of interest. This also avoids creating spurious unnamed steps
# (which occurs when we find content outside of step markers) for the
# newlines that separate the steps in Buildbot logs.
return
if self.state == self.STATES['awaiting_first_step'] and self.RE_HEADER_LINE.match(line):
# The "key: value" job metadata header lines that appear at the top of
# Buildbot logs would result in the creation of an unnamed step at the
# start of the job, unless we skip them. (Which is not desired, since
# the lines are metadata and not test/build output.)
return
step_marker_match = self.RE_STEP_MARKER.match(line)
if not step_marker_match:
# This is a normal log line, rather than a step marker. (The common case.)
if self.state != self.STATES['step_in_progress']:
# We don't have an in-progress step, so need to start one, even though this
# isn't a "step started" marker line. We therefore create a new generic step,
# since we have no way of finding out the step metadata. This case occurs
# for the Taskcluster logs where content can fall between step markers.
self.start_step(lineno)
# Parse the line for errors, which if found, will be associated with the current step.
self.sub_parser.parse_line(line, lineno)
return
# This is either a "step started" or "step finished" marker line, eg:
# ========= Started foo (results: 0, elapsed: 0 secs) (at 2015-08-17 02:33:56.353866) =========
# ========= Finished foo (results: 0, elapsed: 0 secs) (at 2015-08-17 02:33:56.354301) =========
if step_marker_match.group('marker_type') == 'Started':
if self.state == self.STATES['step_in_progress']:
# We're partway through a step (ie: haven't seen a "step finished" marker line),
# but have now reached the "step started" marker for the next step. Before we
# can start the new step, we have to clean up the previous one - albeit using
# generic step metadata, since there was no "step finished" marker. This occurs
# in Taskcluster's logs when content falls between the step marker lines.
self.end_step(lineno)
# Start a new step using the extracted step metadata.
self.start_step(
lineno,
name=step_marker_match.group('name'),
timestamp=step_marker_match.group('timestamp'),
)
return
# This is a "step finished" marker line.
if self.state != self.STATES['step_in_progress']:
# We're not in the middle of a step, so can't finish one. Just ignore the marker line.
return
# Close out the current step using the extracted step metadata.
self.end_step(
lineno,
timestamp=step_marker_match.group('timestamp'),
result_code=int(step_marker_match.group('result_code')),
)
def start_step(self, lineno, name="Unnamed step", timestamp=None):
"""Create a new step and update the state to reflect we're now in the middle of a step."""
self.state = self.STATES['step_in_progress']
self.stepnum += 1
self.steps.append(
{"name": name, "started": timestamp, "started_linenumber": lineno, "errors": [],}
)
def end_step(self, lineno, timestamp=None, result_code=None):
"""Fill in the current step's summary and update the state to show the current step has ended."""
self.state = self.STATES['step_finished']
step_errors = self.sub_parser.get_artifact()
step_error_count = len(step_errors)
if step_error_count > settings.PARSER_MAX_STEP_ERROR_LINES:
step_errors = step_errors[: settings.PARSER_MAX_STEP_ERROR_LINES]
self.artifact["errors_truncated"] = True
self.current_step.update(
{
"finished": timestamp,
"finished_linenumber": lineno,
# Whilst the result code is present on both the start and end buildbot-style step
# markers, for Taskcluster logs the start marker line lies about the result, since
# the log output is unbuffered, so Taskcluster does not know the real result at
# that point. As such, we only set the result when ending a step.
"result": self.RESULT_DICT.get(result_code, "unknown"),
"errors": step_errors,
}
)
# reset the sub_parser for the next step
self.sub_parser.clear()
def finish_parse(self, last_lineno_seen):
"""Clean-up/summary tasks run at the end of parsing."""
if self.state == self.STATES['step_in_progress']:
# We've reached the end of the log without seeing the final "step finish"
# marker, which would normally have triggered updating the step. As such we
# must manually close out the current step, so things like result, finish
# time are set for it. This ensures that the error summary for Taskcluster
# infra failures actually lists the error that occurs at the
# end of the log.
self.end_step(last_lineno_seen)
@property
def steps(self):
"""Return the list of steps in the artifact"""
return self.artifact["steps"]
@property
def current_step(self):
"""Return the current step in the artifact"""
return self.steps[self.stepnum]
class ErrorParser(ParserBase):
"""A generic error detection sub-parser"""
@ -339,6 +118,9 @@ class ErrorParser(ParserBase):
def parse_line(self, line, lineno):
"""Check a single line for an error. Keeps track of the linenumber"""
if len(self.artifact) >= settings.MAX_ERROR_LINES:
return
# TaskCluster logs are a bit wonky.
#
# TaskCluster logs begin with output coming from TaskCluster itself,

Просмотреть файл

@ -32,7 +32,7 @@ def parse_logs(job_id, job_log_ids, priority):
parser_tasks = {
"errorsummary_json": store_failure_lines,
"live_backing_log": parse_unstructured_log,
"live_backing_log": post_log_artifacts,
}
# We don't want to stop parsing logs for most Exceptions however we still
@ -95,14 +95,6 @@ def parse_logs(job_id, job_log_ids, priority):
job.save()
def parse_unstructured_log(job_log):
"""
Call ArtifactBuilderCollection on the given job.
"""
logger.debug('Running parse_unstructured_log for job %s', job_log.job.id)
post_log_artifacts(job_log)
def store_failure_lines(job_log):
"""Store the failure lines from a log corresponding to the structured
errorsummary file."""

Просмотреть файл

@ -1,5 +1,6 @@
import logging
import re
import newrelic.agent
from django.core.cache import cache
@ -32,7 +33,7 @@ def get_error_summary(job):
# don't cache or do anything if we have no text log errors to get
# results for
errors = TextLogError.objects.filter(step__job=job)
errors = TextLogError.objects.filter(job=job)
if not errors:
return []
@ -40,7 +41,12 @@ def get_error_summary(job):
term_cache = {}
error_summary = [bug_suggestions_line(err, term_cache) for err in errors]
cache.set(cache_key, error_summary, BUG_SUGGESTION_CACHE_TIMEOUT)
try:
cache.set(cache_key, error_summary, BUG_SUGGESTION_CACHE_TIMEOUT)
except Exception as e:
newrelic.agent.record_custom_event('error caching error_summary for job', job.id)
logger.error('error caching error_summary for job %s: %s', job.id, e, exc_info=True)
return error_summary

Просмотреть файл

@ -566,7 +566,7 @@ class Job(models.Model):
return False
classified_error_count = TextLogError.objects.filter(
_metadata__best_classification__isnull=False, step__job=self
_metadata__best_classification__isnull=False, job=self
).count()
if classified_error_count == 0:
@ -586,7 +586,7 @@ class Job(models.Model):
instances are set to True.
"""
unverified_errors = TextLogError.objects.filter(
_metadata__best_is_verified=False, step__job=self
_metadata__best_is_verified=False, job=self
).count()
if unverified_errors:
@ -621,7 +621,7 @@ class Job(models.Model):
"""
If this Job has a single TextLogError line, return that TextLogError.
Some Jobs only have one related [via TextLogStep] TextLogError. This
Some Jobs only have one related TextLogError. This
method checks if this Job is one of those (returning None if not) by:
* checking the number of related TextLogErrors
* counting the number of search results for the single TextLogError
@ -631,7 +631,7 @@ class Job(models.Model):
If all these checks pass the TextLogError is returned, any failure returns None.
"""
try:
text_log_error = TextLogError.objects.get(step__job=self)
text_log_error = TextLogError.objects.get(job=self)
except (TextLogError.DoesNotExist, TextLogError.MultipleObjectsReturned):
return None
@ -912,8 +912,7 @@ class JobNote(models.Model):
# TODO: Decide whether this should change now that we're no longer mirroring.
bug_numbers = set(
ClassifiedFailure.objects.filter(
best_for_errors__text_log_error__step__job=job,
best_for_errors__best_is_verified=True,
best_for_errors__text_log_error__job=job, best_for_errors__best_is_verified=True,
)
.exclude(bug_number=None)
.exclude(bug_number=0)
@ -1267,7 +1266,7 @@ class TextLogError(models.Model):
unique_together = ('step', 'line_number')
def __str__(self):
return "{0} {1}".format(self.id, self.step.job.id)
return "{0} {1}".format(self.id, self.job.id)
@property
def metadata(self):

Просмотреть файл

@ -81,9 +81,9 @@ class FailuresByBug(generics.ListAPIView):
)
lines = TextLogError.objects.filter(
step__job_id__in=self.queryset.values_list('job_id', flat=True),
job_id__in=self.queryset.values_list('job_id', flat=True),
line__contains='TEST-UNEXPECTED-FAIL',
).values_list('step__job_id', 'line')
).values_list('job_id', 'line')
grouped_lines = defaultdict(list)
for job_id, line in lines:

Просмотреть файл

@ -375,6 +375,7 @@ class JobsProjectViewSet(viewsets.ViewSet):
return Response(response_body)
# TODO remove
@action(detail=True, methods=['get'])
def text_log_steps(self, request, project, pk=None):
"""
@ -397,14 +398,14 @@ class JobsProjectViewSet(viewsets.ViewSet):
@action(detail=True, methods=['get'])
def text_log_errors(self, request, project, pk=None):
"""
Gets a list of steps associated with this job
Gets a list of error lines associated with this job
"""
try:
job = Job.objects.get(repository__name=project, id=pk)
except Job.DoesNotExist:
return Response("No job with id: {0}".format(pk), status=HTTP_404_NOT_FOUND)
textlog_errors = (
TextLogError.objects.filter(step__job=job)
TextLogError.objects.filter(job=job)
.select_related("_metadata", "_metadata__failure_line")
.prefetch_related("classified_failures", "matches")
.order_by('id')

Просмотреть файл

@ -31,6 +31,8 @@ export const repoEndpoint = '/repository/';
export const tcAuthCallbackUrl = '/taskcluster-auth.html';
export const textLogErrorsEndpoint = '/text_log_errors/';
export const getRunnableJobsURL = function getRunnableJobsURL(
decisionTask,
rootUrl,

Просмотреть файл

@ -8,11 +8,12 @@ import { Button } from 'reactstrap';
import { thMaxPushFetchSize } from '../../../helpers/constants';
import { toDateStr, toShortDateStr } from '../../../helpers/display';
import { addAggregateFields, getBtnClass } from '../../../helpers/job';
import { getJobsUrl } from '../../../helpers/url';
import { getJobsUrl, textLogErrorsEndpoint } from '../../../helpers/url';
import JobModel from '../../../models/job';
import PushModel from '../../../models/push';
import TextLogStepModel from '../../../models/textLogStep';
import { notify } from '../../redux/stores/notifications';
import { getProjectJobUrl } from '../../../helpers/location';
import { getData } from '../../../helpers/http';
class SimilarJobsTab extends React.Component {
constructor(props) {
@ -124,19 +125,19 @@ class SimilarJobsTab extends React.Component {
showJobInfo = (job) => {
const { repoName, classificationMap } = this.props;
JobModel.get(repoName, job.id).then((nextJob) => {
JobModel.get(repoName, job.id).then(async (nextJob) => {
addAggregateFields(nextJob);
nextJob.failure_classification =
classificationMap[nextJob.failure_classification_id];
// retrieve the list of error lines
TextLogStepModel.get(nextJob.id).then((textLogSteps) => {
nextJob.error_lines = textLogSteps.reduce(
(acc, step) => [...acc, ...step.errors],
[],
);
this.setState({ selectedSimilarJob: nextJob });
});
const { data, failureStatus } = await getData(
getProjectJobUrl(textLogErrorsEndpoint, nextJob.id),
);
if (!failureStatus && data.length) {
nextJob.error_lines = data;
}
this.setState({ selectedSimilarJob: nextJob });
});
};

Просмотреть файл

@ -4,14 +4,23 @@ import { LazyLog } from 'react-lazylog';
import isEqual from 'lodash/isEqual';
import { Collapse } from 'reactstrap';
import { getAllUrlParams, getUrlParam, setUrlParam } from '../helpers/location';
import {
getAllUrlParams,
getUrlParam,
setUrlParam,
getProjectJobUrl,
} from '../helpers/location';
import { scrollToLine } from '../helpers/utils';
import { isReftest } from '../helpers/job';
import { getJobsUrl, getReftestUrl, getArtifactsUrl } from '../helpers/url';
import {
getJobsUrl,
getReftestUrl,
getArtifactsUrl,
textLogErrorsEndpoint,
} from '../helpers/url';
import { getData } from '../helpers/http';
import JobModel from '../models/job';
import PushModel from '../models/push';
import TextLogStepModel from '../models/textLogStep';
import JobDetails from '../shared/JobDetails';
import JobInfo from '../shared/JobInfo';
import RepositoryModel from '../models/repository';
@ -50,7 +59,7 @@ class App extends React.PureComponent {
};
}
componentDidMount() {
async componentDidMount() {
const { repoName, jobId } = this.state;
const repoPromise = RepositoryModel.getList();
@ -148,9 +157,12 @@ class App extends React.PureComponent {
});
});
TextLogStepModel.get(jobId).then((textLogSteps) => {
const stepErrors = textLogSteps.length ? textLogSteps[0].errors : [];
const errors = stepErrors.map((error) => ({
const { data, failureStatus } = await getData(
getProjectJobUrl(textLogErrorsEndpoint, jobId),
);
if (!failureStatus && data.length) {
const errors = data.map((error) => ({
line: error.line,
lineNumber: error.line_number + 1,
}));
@ -163,7 +175,7 @@ class App extends React.PureComponent {
errorLinesCss(errors);
this.setState({ errors });
this.setSelectedLine(highlight, true);
});
}
}
onHighlight = (range) => {

Просмотреть файл

@ -1,20 +0,0 @@
import { getApiUrl } from '../helpers/url';
import { update } from '../helpers/http';
const uri = getApiUrl('/text-log-error/');
export default class TextLogErrorsModel {
constructor(data) {
if (data.metadata === null) {
data.metadata = {};
}
Object.assign(this, data);
}
static verifyMany(body) {
if (!body.length) {
return Promise.resolve();
}
return update(uri, body);
}
}

Просмотреть файл

@ -1,9 +0,0 @@
import { getProjectJobUrl } from '../helpers/location';
export default class TextLogStepModel {
static get(jobId) {
return fetch(getProjectJobUrl('/text_log_steps/', jobId)).then((resp) =>
resp.json(),
);
}
}

Просмотреть файл

@ -4,9 +4,10 @@ import { LazyLog } from 'react-lazylog';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faExpand, faFileAlt } from '@fortawesome/free-solid-svg-icons';
import TextLogStepModel from '../../models/textLogStep';
import { getLogViewerUrl } from '../../helpers/url';
import { getLogViewerUrl, textLogErrorsEndpoint } from '../../helpers/url';
import { errorLinesCss } from '../../helpers/display';
import { getData } from '../../helpers/http';
import { getProjectJobUrl } from '../../helpers/location';
class LogviewerTab extends React.PureComponent {
constructor(props) {
@ -17,30 +18,35 @@ class LogviewerTab extends React.PureComponent {
};
}
componentDidMount() {
async componentDidMount() {
const {
selectedTaskFull: { id: taskId },
selectedTaskFull: { id: jobId },
} = this.props;
TextLogStepModel.get(taskId).then((textLogSteps) => {
const stepErrors = textLogSteps.length ? textLogSteps[0].errors : [];
const logErrors = stepErrors.map((error) => ({
const { data, failureStatus } = await getData(
getProjectJobUrl(textLogErrorsEndpoint, jobId),
);
if (!failureStatus && data.length) {
const logErrors = data.map((error) => ({
line: error.line,
lineNumber: error.line_number + 1,
}));
const firstErrorLineNumber = logErrors.length
? [logErrors[0].lineNumber]
: null;
errorLinesCss(logErrors);
this.setState({ highlight: firstErrorLineNumber });
});
}
}
render() {
const { selectedTaskFull, repoName } = this.props;
const { highlight } = this.state;
const { url } = selectedTaskFull.logs[0];
const { url } = selectedTaskFull.logs.find(
(log) => log.name === 'live_backing_log',
);
return (
<div className="h-100 w-100" aria-label="Log">

Просмотреть файл

@ -2,11 +2,9 @@ import React from 'react';
import PropTypes from 'prop-types';
export default function ErrorsList(props) {
const errorListItem = props.errors.map((error, key) => (
<li
key={key} // eslint-disable-line react/no-array-index-key
>
{error.name} : {error.result}.
const errorListItem = props.errors.map((error) => (
<li key={error.line_number}>
{error.line}
<a
title="Open in Log Viewer"
target="_blank"
@ -22,7 +20,7 @@ export default function ErrorsList(props) {
<li>
No Bug Suggestions Available.
<br />
<span className="font-weight-bold">Unsuccessful Execution Steps</span>
<span className="font-weight-bold">Failure Lines</span>
<ul>{errorListItem}</ul>
</li>
);

Просмотреть файл

@ -9,10 +9,12 @@ import {
getBugUrl,
getLogViewerUrl,
getReftestUrl,
textLogErrorsEndpoint,
} from '../../../helpers/url';
import BugFiler from '../../BugFiler';
import BugSuggestionsModel from '../../../models/bugSuggestions';
import TextLogStepModel from '../../../models/textLogStep';
import { getData } from '../../../helpers/http';
import { getProjectJobUrl } from '../../../helpers/location';
import ErrorsList from './ErrorsList';
import ListItem from './ListItem';
@ -77,7 +79,7 @@ class FailureSummaryTab extends React.Component {
if (!selectedJob) {
return;
}
BugSuggestionsModel.get(selectedJob.id).then((suggestions) => {
BugSuggestionsModel.get(selectedJob.id).then(async (suggestions) => {
suggestions.forEach((suggestion) => {
suggestion.bugs.too_many_open_recent =
suggestion.bugs.open_recent.length > thBugSuggestionLimit;
@ -98,20 +100,21 @@ class FailureSummaryTab extends React.Component {
// the log (we can do this asynchronously, it should normally be
// fast)
if (!suggestions.length) {
TextLogStepModel.get(selectedJob.id).then((textLogSteps) => {
const errors = textLogSteps
.filter((step) => step.result !== 'success')
.map((step) => ({
name: step.name,
result: step.result,
logViewerUrl: getLogViewerUrl(
selectedJob.id,
repoName,
step.finished_line_number,
),
}));
const { data, failureStatus } = await getData(
getProjectJobUrl(textLogErrorsEndpoint, selectedJob.id),
);
if (!failureStatus && data.length) {
const errors = data.map((error) => ({
line: error.line,
line_number: error.line_number,
logViewerUrl: getLogViewerUrl(
selectedJob.id,
repoName,
error.line_number,
),
}));
this.setState({ errors });
});
}
}
this.setState({ bugSuggestionsLoading: false, suggestions }, () => {