From dd3dba58386f3a23b1ff8facb743ab14638b3de9 Mon Sep 17 00:00:00 2001 From: Nikhil Mittal Date: Fri, 6 Mar 2026 16:46:38 +0530 Subject: [PATCH 1/4] CHANGE - Tune SFGE default thread count and timeout for better performance - Increase default java_thread_count from 4 to 8 for faster parallel execution - Reduce default java_thread_timeout from 15 min (900000ms) to 3 min (180000ms) - Update Java EnvUtil.java defaults to match TypeScript config.ts defaults - Both values remain configurable via CLI --sfge-thread-count and --sfge-thread-timeout flags or via engines.sfge section in code-analyzer.yaml --- packages/code-analyzer-sfge-engine/package.json | 2 +- .../sfge/src/main/java/com/salesforce/config/EnvUtil.java | 4 ++-- packages/code-analyzer-sfge-engine/src/config.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/code-analyzer-sfge-engine/package.json b/packages/code-analyzer-sfge-engine/package.json index 6a829a97..d961632d 100644 --- a/packages/code-analyzer-sfge-engine/package.json +++ b/packages/code-analyzer-sfge-engine/package.json @@ -1,7 +1,7 @@ { "name": "@salesforce/code-analyzer-sfge-engine", "description": "Plugin package that adds 'Salesforce Graph Engine' as an engine into Salesforce Code Analyzer", - "version": "0.18.0-SNAPSHOT", + "version": "0.19.0-SNAPSHOT", "author": "The Salesforce Code Analyzer Team", "license": "BSD-3-Clause", "homepage": "https://developer.salesforce.com/docs/platform/salesforce-code-analyzer/overview", diff --git a/packages/code-analyzer-sfge-engine/sfge/src/main/java/com/salesforce/config/EnvUtil.java b/packages/code-analyzer-sfge-engine/sfge/src/main/java/com/salesforce/config/EnvUtil.java index 94be9d19..22cc2bfb 100644 --- a/packages/code-analyzer-sfge-engine/sfge/src/main/java/com/salesforce/config/EnvUtil.java +++ b/packages/code-analyzer-sfge-engine/sfge/src/main/java/com/salesforce/config/EnvUtil.java @@ -21,11 +21,11 @@ public final class EnvUtil { // TODO: These should move to SfgeConfigImpl and this class should return Optionals @VisibleForTesting static final int DEFAULT_RULE_THREAD_COUNT = - Math.min(Runtime.getRuntime().availableProcessors(), 4); + Math.min(Runtime.getRuntime().availableProcessors(), 8); @VisibleForTesting static final long DEFAULT_RULE_THREAD_TIMEOUT = - TimeUnit.MILLISECONDS.convert(15, TimeUnit.MINUTES); + TimeUnit.MILLISECONDS.convert(3, TimeUnit.MINUTES); @VisibleForTesting static final boolean DEFAULT_RULE_DISABLE_WARNING_VIOLATION = false; @VisibleForTesting static final boolean DEFAULT_LOG_WARNINGS_ON_VERBOSE = false; diff --git a/packages/code-analyzer-sfge-engine/src/config.ts b/packages/code-analyzer-sfge-engine/src/config.ts index af216c36..9df5b721 100644 --- a/packages/code-analyzer-sfge-engine/src/config.ts +++ b/packages/code-analyzer-sfge-engine/src/config.ts @@ -27,8 +27,8 @@ export const DEFAULT_SFGE_ENGINE_CONFIG: SfgeEngineConfig = { java_command: DEFAULT_JAVA_COMMAND, disable_limit_reached_violations: false, java_max_heap_size: undefined, - java_thread_count: 4, - java_thread_timeout: 900000 + java_thread_count: 8, + java_thread_timeout: 180000 }; export const SFGE_ENGINE_CONFIG_DESCRIPTION: ConfigDescription = { From 468a98fe892abd2254f129fc60077f3804ee66ef Mon Sep 17 00:00:00 2001 From: Nikhil Mittal Date: Fri, 6 Mar 2026 17:16:09 +0530 Subject: [PATCH 2/4] test case fix --- packages/code-analyzer-sfge-engine/test/plugin.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/code-analyzer-sfge-engine/test/plugin.test.ts b/packages/code-analyzer-sfge-engine/test/plugin.test.ts index 8cbd4c23..3df5e2a0 100644 --- a/packages/code-analyzer-sfge-engine/test/plugin.test.ts +++ b/packages/code-analyzer-sfge-engine/test/plugin.test.ts @@ -60,8 +60,8 @@ describe('SfgeEnginePlugin', () => { java_command: resolvedConfig.java_command, // We just checked the Java Command above. disable_limit_reached_violations: false, java_max_heap_size: undefined, - java_thread_count: 4, - java_thread_timeout: 900000 + java_thread_count: 8, + java_thread_timeout: 180000 }); }); From cb5b049b0e0a0ccd788d2af54b65e8081cf6e4ab Mon Sep 17 00:00:00 2001 From: Nikhil Mittal Date: Tue, 10 Mar 2026 11:23:23 +0530 Subject: [PATCH 3/4] timeout changes --- packages/code-analyzer-sfge-engine/src/config.ts | 2 +- packages/code-analyzer-sfge-engine/src/engine.ts | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/code-analyzer-sfge-engine/src/config.ts b/packages/code-analyzer-sfge-engine/src/config.ts index 9df5b721..6eea7783 100644 --- a/packages/code-analyzer-sfge-engine/src/config.ts +++ b/packages/code-analyzer-sfge-engine/src/config.ts @@ -28,7 +28,7 @@ export const DEFAULT_SFGE_ENGINE_CONFIG: SfgeEngineConfig = { disable_limit_reached_violations: false, java_max_heap_size: undefined, java_thread_count: 8, - java_thread_timeout: 180000 + java_thread_timeout: 30000 }; export const SFGE_ENGINE_CONFIG_DESCRIPTION: ConfigDescription = { diff --git a/packages/code-analyzer-sfge-engine/src/engine.ts b/packages/code-analyzer-sfge-engine/src/engine.ts index 9c46bc7b..ae99ae86 100644 --- a/packages/code-analyzer-sfge-engine/src/engine.ts +++ b/packages/code-analyzer-sfge-engine/src/engine.ts @@ -19,6 +19,10 @@ import {RuntimeSfgeWrapper, SfgeRuleInfo, SfgeRunOptions, SfgeRunResult} from ". import {SfgeEngineConfig} from "./config"; const SFGE_RELEVANT_FILE_EXTENSIONS = ['.cls', '.trigger', '-meta.xml', '.page', '.component']; +// SFGE can only create entry points from Apex source files — filtering targets +// to these extensions prevents SFGE from receiving non-Apex files as targets, +// which would cause useless union() branches during static rule graph traversal. +const SFGE_TARGET_FILE_EXTENSIONS = ['.cls', '.trigger']; const DEV_PREVIEW_TAG: string = 'DevPreview'; export class SfgeEngine extends Engine { @@ -68,8 +72,10 @@ export class SfgeEngine extends Engine { return { violations: [] }; } - // Get targeted files and return early if empty - prevents SFGE from analyzing all workspace files - const targetedFiles: string[] = await runOptions.workspace.getTargetedFiles(); + // Get targeted files and filter to Apex source only (.cls and .trigger). + // SFGE only creates entry points from Apex files; passing non-Apex targets + // causes useless union() branches during graph traversal with no benefit. + const targetedFiles: string[] = (await runOptions.workspace.getTargetedFiles()).filter(isApexSourceFile); if (targetedFiles.length === 0) { this.emitRunRulesProgressEvent(100); return { violations: [] }; @@ -197,6 +203,10 @@ function isFileRelevantToSfge(fileName: string): boolean { return SFGE_RELEVANT_FILE_EXTENSIONS.some(extension => fileName.toLowerCase().endsWith(extension)); } +function isApexSourceFile(fileName: string): boolean { + return SFGE_TARGET_FILE_EXTENSIONS.some(extension => fileName.toLowerCase().endsWith(extension)); +} + function toRuleDescription(sfgeRuleInfo: SfgeRuleInfo): RuleDescription { const tags: string[] = [DEV_PREVIEW_TAG, sfgeRuleInfo.category.replaceAll(' ', '')]; tags.push(COMMON_TAGS.LANGUAGES.APEX); From 10269aac365d44d247509700cb883fa8ffcbda3a Mon Sep 17 00:00:00 2001 From: Nikhil Mittal Date: Tue, 10 Mar 2026 11:26:27 +0530 Subject: [PATCH 4/4] test case fixes --- .../sfge/src/main/java/com/salesforce/config/EnvUtil.java | 2 +- packages/code-analyzer-sfge-engine/test/plugin.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/code-analyzer-sfge-engine/sfge/src/main/java/com/salesforce/config/EnvUtil.java b/packages/code-analyzer-sfge-engine/sfge/src/main/java/com/salesforce/config/EnvUtil.java index 22cc2bfb..cda8217c 100644 --- a/packages/code-analyzer-sfge-engine/sfge/src/main/java/com/salesforce/config/EnvUtil.java +++ b/packages/code-analyzer-sfge-engine/sfge/src/main/java/com/salesforce/config/EnvUtil.java @@ -25,7 +25,7 @@ public final class EnvUtil { @VisibleForTesting static final long DEFAULT_RULE_THREAD_TIMEOUT = - TimeUnit.MILLISECONDS.convert(3, TimeUnit.MINUTES); + TimeUnit.MILLISECONDS.convert(30, TimeUnit.SECONDS); @VisibleForTesting static final boolean DEFAULT_RULE_DISABLE_WARNING_VIOLATION = false; @VisibleForTesting static final boolean DEFAULT_LOG_WARNINGS_ON_VERBOSE = false; diff --git a/packages/code-analyzer-sfge-engine/test/plugin.test.ts b/packages/code-analyzer-sfge-engine/test/plugin.test.ts index 3df5e2a0..2af8174c 100644 --- a/packages/code-analyzer-sfge-engine/test/plugin.test.ts +++ b/packages/code-analyzer-sfge-engine/test/plugin.test.ts @@ -61,7 +61,7 @@ describe('SfgeEnginePlugin', () => { disable_limit_reached_violations: false, java_max_heap_size: undefined, java_thread_count: 8, - java_thread_timeout: 180000 + java_thread_timeout: 30000 }); });