Skip to content

Conversation

@snjeza
Copy link

@snjeza snjeza commented Oct 27, 2025

Fixes #8

cc @guw

@github-actions
Copy link

github-actions bot commented Oct 27, 2025

Test Results

 40 files  ±0   40 suites  ±0   17s ⏱️ -3s
 57 tests ±0   56 ✅ ±0   1 💤 ±0  0 ❌ ±0 
114 runs  ±0  103 ✅ ±0  11 💤 ±0  0 ❌ ±0 

Results for commit ddd30f4. ± Comparison against base commit d67316e.

♻️ This comment has been updated with latest results.

@snjeza
Copy link
Author

snjeza commented Oct 27, 2025

@guw I have updated the PR.

var project = findProject(getBazelPackage());
if (project == null) {
project = findProject(getBazelPackage());
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@snjeza Can you help me understand ... when cachedBazelProject is null, this should be reliably null as well. Are you seeing many findProject calls for the same target or for different targets?

@guw
Copy link
Member

guw commented Oct 29, 2025

@snjeza Can you test #13? I tweaked the code a litte further to see if we can improve further.

@guw guw closed this Oct 29, 2025
@snjeza
Copy link
Author

snjeza commented Oct 29, 2025

Can you help me understand ... when cachedBazelProject is null, this should be reliably null as well. Are you seeing many findProject calls for the same target or for different targets?
Can you test #13? I tweaked the code a litte further to see if we can improve further.

#13 fixes issue 1. described at #8 (comment) but doesn't fix 2 and 3

Issue 3 can be reproduced in the following way:

  • use your performance or main branch
  • clone bazel-ls-demo-project
  • add small/.eclipse/.bazelproject with the following content
directories:
  . 
derive_targets_from_directories: true
target_provisioning_strategy: project-per-package
  • import bazel-ls-demo-project/small
  • set a breakpoint at com.salesforce.bazel.eclipse.core.model.BazelPackageInfo.findProject(BazelPackage)
  • call Sync Bazel Project Views

You will see that BazelPackageInfo.findProject(BazelPackage) is called twice for every created package.

A similar issue happens if you set target_provisioning_strategy: project-per-target to small/.eclipse/.bazelproject and test BazelTargetInfo.findProject(BazelTarget)

I have created a patch against your performance branch. It fixes both issues.

diff --git a/bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/BazelPackage.java b/bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/BazelPackage.java
index 6a5f6f3a..986a5959 100644
--- a/bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/BazelPackage.java
+++ b/bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/BazelPackage.java
@@ -156,6 +156,10 @@ public final class BazelPackage extends BazelElement<BazelPackageInfo, BazelWork
      *             if the project cannot be found in the Eclipse workspace
      */
     public BazelProject getBazelProject() throws CoreException {
+        var previouslyDiscoveredProject = discoveredProjectCache;
+        if ((previouslyDiscoveredProject != null) && previouslyDiscoveredProject.isPresent()) {
+            return getInfo().getBazelProject(previouslyDiscoveredProject.get());
+        }
         return getInfo().getBazelProject();
     }
 
diff --git a/bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/BazelPackageInfo.java b/bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/BazelPackageInfo.java
index 4e6f13ad..090b6f75 100644
--- a/bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/BazelPackageInfo.java
+++ b/bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/BazelPackageInfo.java
@@ -166,20 +166,20 @@ public final class BazelPackageInfo extends BazelElementInfo {
     }
 
     public BazelProject getBazelProject() throws CoreException {
+        return getBazelProject(null);
+    }
+
+    public BazelProject getBazelProject(IProject project) throws CoreException {
         var cachedProject = bazelProject;
         if (cachedProject != null) {
             return cachedProject;
         }
 
         // avoid checking for project multiple times (https://github.com/eclipseguru/bazel-eclipse/issues/8)
-        IProject project;
-        if ((hasBazelProject != null) && !hasBazelProject) {
-            project = null;
-        } else {
+        if (project == null) {
             project = findProject(getBazelPackage());
-            hasBazelProject = project != null;
         }
-
+        hasBazelProject = project != null;
         if (project == null) {
             throw new CoreException(
                     Status.error(
diff --git a/bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/BazelTarget.java b/bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/BazelTarget.java
index ace6dbb6..0634002b 100644
--- a/bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/BazelTarget.java
+++ b/bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/BazelTarget.java
@@ -95,6 +95,10 @@ public final class BazelTarget extends BazelElement<BazelTargetInfo, BazelPackag
      *             if the project cannot be found in the Eclipse workspace
      */
     public BazelProject getBazelProject() throws CoreException {
+        var previouslyDiscoveredProject = discoveredProjectCache;
+        if ((previouslyDiscoveredProject != null) && previouslyDiscoveredProject.isPresent()) {
+            return getInfo().getBazelProject(previouslyDiscoveredProject.get());
+        }
         return getInfo().getBazelProject();
     }
 
diff --git a/bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/BazelTargetInfo.java b/bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/BazelTargetInfo.java
index c219b447..d0da4011 100644
--- a/bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/BazelTargetInfo.java
+++ b/bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/BazelTargetInfo.java
@@ -101,19 +101,20 @@ public final class BazelTargetInfo extends BazelElementInfo {
     }
 
     public BazelProject getBazelProject() throws CoreException {
+        return getBazelProject(null);
+    }
+
+    public BazelProject getBazelProject(IProject project) throws CoreException {
         var cachedProject = bazelProject;
         if (cachedProject != null) {
             return cachedProject;
         }
 
         // avoid checking for project multiple times (https://github.com/eclipseguru/bazel-eclipse/issues/8)
-        IProject project;
-        if ((hasBazelProject != null) && !hasBazelProject) {
-            project = null;
-        } else {
+        if (project == null) {
             project = findProject(getBazelTarget());
-            hasBazelProject = project != null;
         }
+        hasBazelProject = project != null;
 
         if (project == null) {
             throw new CoreException(

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Synchronization of bazel projects (performance)

2 participants