Skip to content

Commit 0d5e9d8

Browse files
aksOpsclaude
andcommitted
fix: increase LanguageEnricher timeout to 5min, skip non-source files
The 30-second timeout in LanguageEnricher was skipping Java files during enrichment — same timeout-based-skipping anti-pattern we fixed in the Analyzer. Changes: - Increased timeout from 30s to 5min (safety net only, not for normal operation — JavaParser on large Java files can legitimately take 1-2 minutes) - Skip test/generated/minified/binary/text files in enricher — they don't need language-specific enrichment (call graphs, type hints) - Reduces enrichment workload significantly on large codebases with many generated SDK files Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent a367821 commit 0d5e9d8

1 file changed

Lines changed: 22 additions & 6 deletions

File tree

src/main/java/io/github/randomcodespace/iq/intelligence/extractor/LanguageEnricher.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,17 +83,32 @@ public void enrich(List<CodeNode> nodes, List<CodeEdge> edges, Path rootPath) {
8383
}
8484
}
8585

86-
// Collect files that have a matching extractor
86+
// Collect files that have a matching extractor.
87+
// Skip non-source files (test, generated, minified, binary, text) — they don't need enrichment.
8788
record FileTask(String filePath, List<CodeNode> fileNodes, LanguageExtractor extractor, String language) {}
8889
List<FileTask> tasks = new ArrayList<>();
8990
for (Map.Entry<String, List<CodeNode>> entry : nodesByFile.entrySet()) {
9091
String filePath = entry.getKey();
92+
93+
// Skip non-source files based on node properties
94+
List<CodeNode> fileNodes = entry.getValue();
95+
if (!fileNodes.isEmpty()) {
96+
Object fileType = fileNodes.get(0).getProperties().get("file_type");
97+
if (fileType != null) {
98+
String ft = fileType.toString();
99+
if ("test".equals(ft) || "generated".equals(ft) || "minified".equals(ft)
100+
|| "binary".equals(ft) || "text".equals(ft) || "filtered".equals(ft)) {
101+
continue;
102+
}
103+
}
104+
}
105+
91106
String language = detectLanguage(filePath);
92107
if (language == null) continue;
93108
String resolvedLanguage = LANGUAGE_ALIASES.getOrDefault(language, language);
94109
LanguageExtractor extractor = extractorByLanguage.get(resolvedLanguage);
95110
if (extractor == null) continue;
96-
tasks.add(new FileTask(filePath, entry.getValue(), extractor, language));
111+
tasks.add(new FileTask(filePath, fileNodes, extractor, language));
97112
}
98113

99114
if (tasks.isEmpty()) {
@@ -152,14 +167,15 @@ record FileTask(String filePath, List<CodeNode> fileNodes, LanguageExtractor ext
152167
}));
153168
}
154169

155-
// Collect results in deterministic order (alphabetical by file path,
156-
// matching the TreeMap iteration order of tasks)
170+
// Collect results — no timeout-based skipping (zero data loss).
171+
// Files that are slow will complete naturally; ANTLR is already bypassed
172+
// for TS/JS and size-guarded for other languages at the factory level.
157173
for (int i = 0; i < futures.size(); i++) {
158174
try {
159-
futures.get(i).get(30, TimeUnit.SECONDS);
175+
futures.get(i).get(5, TimeUnit.MINUTES);
160176
} catch (java.util.concurrent.TimeoutException e) {
161177
futures.get(i).cancel(true);
162-
log.warn("Language enrichment timed out for {} (30s), skipping", tasks.get(i).filePath());
178+
log.warn("⏱️ Language enrichment timed out for {} (5min safety limit)", tasks.get(i).filePath());
163179
} catch (java.util.concurrent.ExecutionException e) {
164180
log.warn("Language enrichment failed for {}: {}", tasks.get(i).filePath(), e.getMessage());
165181
} catch (InterruptedException e) {

0 commit comments

Comments
 (0)