Attempt to fix CU Cache unit tests failing randomly

This commit is contained in:
BoykoAlex
2019-11-18 13:58:50 -05:00
parent 58a40ae286
commit 560128a0bb
2 changed files with 16 additions and 15 deletions

View File

@@ -40,7 +40,6 @@ import org.springframework.ide.vscode.boot.metadata.AdHocSpringPropertyIndexProv
import org.springframework.ide.vscode.boot.metadata.ClassReferenceProvider;
import org.springframework.ide.vscode.boot.metadata.LoggerNameProvider;
import org.springframework.ide.vscode.boot.metadata.ProjectBasedPropertyIndexProvider;
import org.springframework.ide.vscode.boot.metadata.PropertyInfo;
import org.springframework.ide.vscode.boot.metadata.SpringPropertyIndex;
import org.springframework.ide.vscode.boot.metadata.ValueProviderRegistry;
import org.springframework.ide.vscode.boot.yaml.completions.ApplicationYamlAssistContext;
@@ -48,9 +47,7 @@ import org.springframework.ide.vscode.commons.languageserver.LanguageServerRunne
import org.springframework.ide.vscode.commons.languageserver.util.DocumentEventListenerManager;
import org.springframework.ide.vscode.commons.languageserver.util.LspClient;
import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer;
import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService;
import org.springframework.ide.vscode.commons.util.FileObserver;
import org.springframework.ide.vscode.commons.util.FuzzyMap;
import org.springframework.ide.vscode.commons.util.LogRedirect;
import org.springframework.ide.vscode.commons.util.text.IDocument;
import org.springframework.ide.vscode.commons.yaml.ast.YamlASTProvider;
@@ -130,10 +127,10 @@ public class BootLanguagServerBootApp {
return SourceLinkFactory.createSourceLinks(server, cuCache, params.projectFinder);
}
@Bean CompilationUnitCache cuCache(BootLanguageServerParams params, SimpleTextDocumentService documents) {
return new CompilationUnitCache(params.projectFinder, documents, params.projectObserver);
@Bean CompilationUnitCache cuCache(SimpleLanguageServer server, BootLanguageServerParams params) {
return new CompilationUnitCache(params.projectFinder, server, params.projectObserver);
}
@Bean JavaDocumentUriProvider javaDocumentUriProvider() {
switch (LspClient.currentClient()) {
case ECLIPSE:

View File

@@ -16,7 +16,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -44,12 +43,15 @@ import org.springframework.ide.vscode.commons.java.IClasspathUtil;
import org.springframework.ide.vscode.commons.java.IJavaProject;
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver;
import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer;
import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService;
import org.springframework.ide.vscode.commons.util.AsyncRunner;
import org.springframework.ide.vscode.commons.util.text.TextDocument;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import reactor.core.scheduler.Schedulers;
import reactor.util.function.Tuple2;
import reactor.util.function.Tuples;
@@ -65,14 +67,14 @@ public final class CompilationUnitCache implements DocumentContentProvider {
private Cache<IJavaProject, Tuple2<List<Classpath>, INameEnvironmentWithProgress>> lookupEnvCache;
private ProjectObserver.Listener projectListener;
private SimpleTextDocumentService documents;
private AsyncRunner async;
private ReadLock readLock;
private WriteLock writeLock;
public CompilationUnitCache(JavaProjectFinder projectFinder, SimpleTextDocumentService documents, ProjectObserver projectObserver) {
public CompilationUnitCache(JavaProjectFinder projectFinder, SimpleLanguageServer server, ProjectObserver projectObserver) {
this.projectFinder = projectFinder;
this.projectObserver = projectObserver;
this.documents = documents;
this.lookupEnvCache = CacheBuilder.newBuilder().build();
// PT 154618835 - Avoid retaining the CU in the cache as it consumes memory if it hasn't been
@@ -86,12 +88,16 @@ public final class CompilationUnitCache implements DocumentContentProvider {
readLock = lock.readLock();
writeLock = lock.writeLock();
this.documents = server == null ? null : server.getTextDocumentService();
this.async = server == null ? new AsyncRunner(Schedulers.single()) : server.getAsync();
if (documents != null) {
documents.onDidChangeContent(doc -> invalidateCuForJavaFile(doc.getDocument().getId().getUri()));
documents.onDidClose(doc -> invalidateCuForJavaFile(doc.getId().getUri()));
}
CompletableFuture.runAsync(() -> {
async.execute(() -> {
writeLock.lock();
try {
for (IJavaProject project : projectFinder.all()) {
@@ -107,7 +113,7 @@ public final class CompilationUnitCache implements DocumentContentProvider {
@Override
public void deleted(IJavaProject project) {
logger.info("CU Cache: deleted project {}", project.getElementName());
CompletableFuture.runAsync(() -> {
async.execute(() -> {
writeLock.lock();
try {
invalidateProject(project);
@@ -120,7 +126,7 @@ public final class CompilationUnitCache implements DocumentContentProvider {
@Override
public void created(IJavaProject project) {
logger.info("CU Cache: created project {}", project.getElementName());
CompletableFuture.runAsync(() -> {
async.execute(() -> {
writeLock.lock();
try {
invalidateProject(project);
@@ -135,7 +141,7 @@ public final class CompilationUnitCache implements DocumentContentProvider {
@Override
public void changed(IJavaProject project) {
logger.info("CU Cache: changed project {}", project.getElementName());
CompletableFuture.runAsync(() -> {
async.execute(() -> {
writeLock.lock();
try {
invalidateProject(project);
@@ -150,7 +156,6 @@ public final class CompilationUnitCache implements DocumentContentProvider {
if (this.projectObserver != null) {
this.projectObserver.addListener(projectListener);
logger.info("CU Cache: Adding project listener");
}
}
@@ -158,7 +163,6 @@ public final class CompilationUnitCache implements DocumentContentProvider {
public void dispose() {
if (projectObserver != null) {
projectObserver.removeListener(projectListener);
logger.info("Dispose CU Cache: Removing project listener");
}
}