Skip to content

Commit

Permalink
SLCORE-1180 Avoid multiple known findings store to be created
Browse files Browse the repository at this point in the history
  • Loading branch information
damien-urruty-sonarsource committed Feb 17, 2025
1 parent 488dbfb commit 2335ac3
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicReference;
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
import javax.annotation.PreDestroy;
Expand Down Expand Up @@ -52,7 +53,7 @@ public class AnalysisEngineCache {
private final NodeJsService nodeJsService;
private final Map<String, String> extraProperties = new HashMap<>();
private final Path csharpOssPluginPath;
private AnalysisEngine standaloneEngine;
private final AtomicReference<AnalysisEngine> standaloneEngine = new AtomicReference<>();
private final Map<String, AnalysisEngine> connectedEnginesByConnectionId = new ConcurrentHashMap<>();

public AnalysisEngineCache(ConfigurationRepository configurationRepository, NodeJsService nodeJsService, InitializeParams initializeParams, UserPaths userPaths,
Expand Down Expand Up @@ -103,15 +104,17 @@ private synchronized AnalysisEngine getConnectedEngineIfStarted(String connectio
}

private synchronized AnalysisEngine getOrCreateStandaloneEngine() {
if (standaloneEngine == null) {
standaloneEngine = createEngine(pluginsService.getEmbeddedPlugins(), csharpOssPluginPath);
var engine = standaloneEngine.get();
if (engine == null) {
engine = createEngine(pluginsService.getEmbeddedPlugins(), csharpOssPluginPath);
standaloneEngine.set(engine);
}
return standaloneEngine;
return engine;
}

@CheckForNull
private synchronized AnalysisEngine getStandaloneEngineIfStarted() {
return standaloneEngine;
return standaloneEngine.get();
}

private AnalysisEngine createEngine(LoadedPlugins plugins, @Nullable Path actualCsharpAnalyzerPath) {
Expand Down Expand Up @@ -167,18 +170,20 @@ private synchronized void stopEngineGracefully(String event) {
}

private synchronized void stopAllGracefully() {
if (this.standaloneEngine != null) {
this.standaloneEngine.finishGracefully();
this.standaloneEngine = null;
var standaloneAnalysisEngine = this.standaloneEngine.get();
if (standaloneAnalysisEngine != null) {
standaloneAnalysisEngine.finishGracefully();
this.standaloneEngine.set(null);
}
connectedEnginesByConnectionId.forEach((connectionId, engine) -> engine.finishGracefully());
connectedEnginesByConnectionId.clear();
}

private synchronized void stopAll() {
if (this.standaloneEngine != null) {
this.standaloneEngine.stop();
this.standaloneEngine = null;
var standaloneAnalysisEngine = this.standaloneEngine.get();
if (standaloneAnalysisEngine != null) {
standaloneAnalysisEngine.stop();
this.standaloneEngine.set(null);
}
connectedEnginesByConnectionId.forEach((connectionId, engine) -> engine.stop());
connectedEnginesByConnectionId.clear();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,23 +25,24 @@
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.atomic.AtomicReference;
import javax.annotation.CheckForNull;
import org.sonarsource.sonarlint.core.plugin.commons.LoadedPlugins;

import static org.sonarsource.sonarlint.core.commons.IOExceptionUtils.throwFirstWithOtherSuppressed;
import static org.sonarsource.sonarlint.core.commons.IOExceptionUtils.tryAndCollectIOException;

public class PluginsRepository {
private LoadedPlugins loadedEmbeddedPlugins;
private final AtomicReference<LoadedPlugins> loadedEmbeddedPlugins = new AtomicReference<>();
private final Map<String, LoadedPlugins> loadedPluginsByConnectionId = new HashMap<>();

public void setLoadedEmbeddedPlugins(LoadedPlugins loadedEmbeddedPlugins) {
this.loadedEmbeddedPlugins = loadedEmbeddedPlugins;
this.loadedEmbeddedPlugins.set(loadedEmbeddedPlugins);
}

@CheckForNull
public LoadedPlugins getLoadedEmbeddedPlugins() {
return loadedEmbeddedPlugins;
return loadedEmbeddedPlugins.get();
}

@CheckForNull
Expand All @@ -56,9 +57,10 @@ public void setLoadedPlugins(String connectionId, LoadedPlugins loadedPlugins) {
@PreDestroy
public void unloadAllPlugins() throws IOException {
Queue<IOException> exceptions = new LinkedList<>();
if (loadedEmbeddedPlugins != null) {
tryAndCollectIOException(loadedEmbeddedPlugins::close, exceptions);
loadedEmbeddedPlugins = null;
var embeddedPlugins = loadedEmbeddedPlugins.get();
if (embeddedPlugins != null) {
tryAndCollectIOException(embeddedPlugins::close, exceptions);
loadedEmbeddedPlugins.set(null);
}
synchronized (loadedPluginsByConnectionId) {
loadedPluginsByConnectionId.values().forEach(l -> tryAndCollectIOException(l::close, exceptions));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,36 +21,40 @@

import java.io.IOException;
import java.nio.file.Path;
import java.util.concurrent.atomic.AtomicReference;
import javax.annotation.PreDestroy;
import org.sonarsource.sonarlint.core.UserPaths;

public class KnownFindingsStorageService {

private final Path projectsStorageBaseDir;
private final Path workDir;
private XodusKnownFindingsStore trackedIssuesStore;
private final AtomicReference<XodusKnownFindingsStore> trackedIssuesStore = new AtomicReference<>();

public KnownFindingsStorageService(UserPaths userPaths) {
this.projectsStorageBaseDir = userPaths.getStorageRoot();
this.workDir = userPaths.getWorkDir();
}

public XodusKnownFindingsStore get() {
if (trackedIssuesStore == null) {
public synchronized XodusKnownFindingsStore get() {
var store = trackedIssuesStore.get();
if (store == null) {
try {
trackedIssuesStore = new XodusKnownFindingsStore(projectsStorageBaseDir, workDir);
return trackedIssuesStore;
store = new XodusKnownFindingsStore(projectsStorageBaseDir, workDir);
trackedIssuesStore.set(store);
return store;
} catch (IOException e) {
throw new IllegalStateException("Unable to create tracked issues database", e);
}
}
return trackedIssuesStore;
return store;
}

@PreDestroy
public void close() {
if (trackedIssuesStore != null) {
trackedIssuesStore.close();
var store = trackedIssuesStore.get();
if (store != null) {
store.close();
}
}

Expand Down

0 comments on commit 2335ac3

Please sign in to comment.