in bugbot/crash/analyzer.py [0:0]
def handler(search_resp: dict, data: list):
logger.debug(
"Total of %d signatures received from Socorro",
len(search_resp["facets"]["signature"]),
)
for crash in search_resp["facets"]["signature"]:
signature = crash["term"]
if any(
signature.startswith(excluded_prefix)
for excluded_prefix in cls.EXCLUDED_SIGNATURE_PREFIXES
):
# Ignore signatures that start with any of the excluded prefixes.
continue
facets = crash["facets"]
installations = facets["cardinality_install_time"]["value"]
if installations <= 1:
# Ignore crashes that only happen on one installation.
continue
first_date = facets["histogram_date"][0]["term"]
if first_date < earliest_allowed_date:
# The crash is not new, skip it.
continue
if any(
reason["term"].startswith(io_error_prefix)
for reason in facets["reason"]
for io_error_prefix in cls.EXCLUDED_IO_ERROR_REASON_PREFIXES
):
# Ignore Network or I/O error crashes.
continue
if crash["count"] < 20:
# For signatures with low volume, having multiple types of
# memory errors indicates potential bad hardware crashes.
num_memory_error_types = sum(
reason["term"] in cls.MEMORY_ACCESS_ERROR_REASONS
for reason in facets["reason"]
)
if num_memory_error_types > 1:
# Potential bad hardware crash, skip it.
continue
bit_flips_count = sum(
row["count"] for row in facets["possible_bit_flips_max_confidence"]
)
bit_flips_percentage = bit_flips_count / crash["count"]
if bit_flips_percentage >= 0.2:
# Potential bad hardware crash, skip it.
continue
# TODO(investigate): is this needed since we are already
# filtering signatures that start with "OOM | "
if facets["cardinality_oom_allocation_size"]["value"]:
# If one of the crashes is an OOM crash, skip it.
continue
# TODO(investigate): do we need to check for the `moz_crash_reason`
moz_crash_reasons = facets["moz_crash_reason"]
if moz_crash_reasons and any(
excluded_reason in reason["term"]
for reason in moz_crash_reasons
for excluded_reason in cls.EXCLUDED_MOZ_REASON_STRINGS
):
continue
data.append(signature)