Skip to content

Commit 4ce4f02

Browse files
committed
Evict CU cache future entry in case of exception
1 parent 8349671 commit 4ce4f02

File tree

1 file changed

+19
-9
lines changed
  • headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils

1 file changed

+19
-9
lines changed

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/CompilationUnitCache.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.Set;
1919
import java.util.concurrent.CancellationException;
2020
import java.util.concurrent.CompletableFuture;
21+
import java.util.concurrent.CompletionException;
2122
import java.util.concurrent.ExecutionException;
2223
import java.util.concurrent.Executor;
2324
import java.util.concurrent.Executors;
@@ -238,8 +239,9 @@ public <T> T withCompilationUnit(IJavaProject project, URI uri, Function<Compila
238239
}
239240

240241
private synchronized CompletableFuture<CompilationUnit> requestCU(IJavaProject project, URI uri) throws ExecutionException {
241-
return uriToCu.get(uri, () -> {
242-
CompletableFuture<CompilationUnit> future = CompletableFuture.supplyAsync(() -> {
242+
CompletableFuture<CompilationUnit> cuFuture = uriToCu.getIfPresent(uri);
243+
if (cuFuture == null) {
244+
cuFuture = CompletableFuture.supplyAsync(() -> {
243245

244246
try {
245247
logger.info("Started parsing CU for " + uri);
@@ -252,17 +254,25 @@ private synchronized CompletableFuture<CompilationUnit> requestCU(IJavaProject p
252254

253255
logger.info("Parsed successfully CU for " + uri);
254256
return cUnit;
255-
} catch (Exception e) {
256-
logger.warn("exception happened during parsing CU for " + uri + ": " + e);
257-
return null;
257+
} catch (Throwable t) {
258+
// Complete future exceptionally
259+
throw new CompletionException(t);
258260
}
259261
}, createCuExecutorThreadPool);
260-
return future;
261-
262-
});
262+
// Cache the future
263+
uriToCu.put(uri, cuFuture);
264+
// If CU future completed exceptionally invalidate the cache entry
265+
cuFuture.exceptionally(t -> {
266+
if (!(t instanceof CancellationException)) {
267+
logger.error("", t);
268+
}
269+
uriToCu.invalidate(uri);
270+
return null;
271+
});
272+
}
273+
return cuFuture;
263274
}
264275

265-
266276
public static CompilationUnit parse2(char[] source, String docURI, String unitName, IJavaProject project) throws Exception {
267277
List<Classpath> classpaths = createClasspath(getClasspathEntries(project));
268278
return parse2(source, docURI, unitName, classpaths, null);

0 commit comments

Comments
 (0)