Skip to content

Commit 2c5206d

Browse files
committed
Avoid duplicate failures in BEPAnalyzer
Tracks seen targets to prevent duplicate failure entries when extracting failures from BEP files
1 parent d246514 commit 2c5206d

1 file changed

Lines changed: 17 additions & 6 deletions

File tree

bin/bazel_failure_analyzer

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class BEPAnalyzer:
5353
self.verbose = verbose
5454
self.failures = []
5555
self.failures_skipped = 0 # Track skipped failures due to limits
56+
self.seen_targets = set() # Track targets to avoid duplicates
5657
# Limits (bytes, counts)
5758
self.MAX_FILE_SIZE = cfg.MAX_FILE_SIZE_MB_DEFAULT * 1024 * 1024
5859
self.MAX_FAILURES = cfg.MAX_FAILURES_DEFAULT
@@ -64,6 +65,7 @@ class BEPAnalyzer:
6465
def extract_failures(self, bep_file_path: str) -> List[Dict[str, Any]]:
6566
"""Extract failure information from a BEP protobuf file."""
6667
failures = []
68+
self.seen_targets.clear() # Reset for each extract
6769

6870
# Check file size before processing
6971
try:
@@ -98,10 +100,14 @@ class BEPAnalyzer:
98100
# Parse the message for failure events (returns a list or None)
99101
message_failures = self._parse_build_event_for_failure(message_data)
100102
if message_failures:
101-
failures.extend(message_failures)
102-
if self.verbose:
103-
for failure in message_failures:
104-
logger.info("Found failure: %s", failure.get('target', 'Unknown'))
103+
# Remove duplicates by target
104+
for failure in message_failures:
105+
target = failure.get('target', 'unknown')
106+
if target not in self.seen_targets:
107+
self.seen_targets.add(target)
108+
failures.append(failure)
109+
if self.verbose:
110+
logger.info("Found failure: %s", target)
105111

106112
# Check if we hit the failure limit
107113
if len(failures) >= self.MAX_FAILURES:
@@ -112,7 +118,12 @@ class BEPAnalyzer:
112118
break
113119
message_failures = self._parse_build_event_for_failure(message_data)
114120
if message_failures:
115-
self.failures_skipped += len(message_failures)
121+
# Count only new unique failures
122+
for failure in message_failures:
123+
target = failure.get('target', 'unknown')
124+
if target not in self.seen_targets:
125+
self.seen_targets.add(target)
126+
self.failures_skipped += 1
116127

117128
except Exception as e:
118129
if self.verbose:
@@ -960,7 +971,7 @@ def main():
960971

961972
if args.verbose:
962973
logger.info("Analyzing BEP file: %s", args.bep_file)
963-
974+
964975
try:
965976
# Initialize analyzer with custom limits
966977
analyzer = BEPAnalyzer(verbose=args.verbose)

0 commit comments

Comments
 (0)