From 689235bf3fdfe6923e59ad51fea8754037ebe2fb Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Fri, 6 Dec 2024 15:43:41 +0100 Subject: [PATCH] add local file timestamp map to quickly check if new delta-based index cache is outdated or not --- .../cache/IndexCacheOnDiscDeltaBased.java | 48 +++++++++++++++---- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/index/cache/IndexCacheOnDiscDeltaBased.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/index/cache/IndexCacheOnDiscDeltaBased.java index cc3660b6b..5b77c1867 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/index/cache/IndexCacheOnDiscDeltaBased.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/index/cache/IndexCacheOnDiscDeltaBased.java @@ -66,6 +66,7 @@ import com.google.gson.stream.JsonReader; public class IndexCacheOnDiscDeltaBased implements IndexCache { private final File cacheDirectory; + private final Map> timestamps; private static final Logger log = LoggerFactory.getLogger(IndexCacheOnDiscDeltaBased.class); @@ -79,6 +80,8 @@ public class IndexCacheOnDiscDeltaBased implements IndexCache { if (!this.cacheDirectory.exists()) { log.warn("symbol cache directory does not exist and cannot be created: " + this.cacheDirectory.toString()); } + + this.timestamps = new ConcurrentHashMap<>(); } @Override @@ -101,6 +104,10 @@ public class IndexCacheOnDiscDeltaBased implements IndexCache { IndexCacheStore store = new IndexCacheStore(timestampedFiles, elements, dependencies.asMap(), type); persist(cacheKey, new DeltaSnapshot(store), false); + + // update local timestamp cache + ConcurrentHashMap timestampMap = new ConcurrentHashMap<>(timestampedFiles); + this.timestamps.put(cacheKey, timestampMap); } @SuppressWarnings("unchecked") @@ -134,6 +141,9 @@ public class IndexCacheOnDiscDeltaBased implements IndexCache { dependencies.replaceValues(entry.getKey(), entry.getValue()); } } + + // update local timestamp cache + this.timestamps.put(cacheKey, new ConcurrentHashMap<>(timestampedFiles)); return Pair.of( (T[]) symbols.toArray((T[]) Array.newInstance(type, symbols.size())), @@ -150,12 +160,20 @@ public class IndexCacheOnDiscDeltaBased implements IndexCache { @Override public void removeFile(IndexCacheKey cacheKey, String file, Class type) { - persist(cacheKey, new DeltaDelete(new String[] {file}), true); + removeFiles(cacheKey, new String[] {file}, type); } @Override public void removeFiles(IndexCacheKey cacheKey, String[] files, Class type) { persist(cacheKey, new DeltaDelete(files), true); + + // update local timestamp cache + Map timestampsMap = this.timestamps.get(cacheKey); + if (timestampsMap != null) { + for (String file : files) { + timestampsMap.remove(file); + } + } } @Override @@ -164,6 +182,9 @@ public class IndexCacheOnDiscDeltaBased implements IndexCache { if (cacheStore.exists()) { cacheStore.delete(); } + + // update local timestamp cache + this.timestamps.remove(cacheKey); } @Override @@ -182,6 +203,10 @@ public class IndexCacheOnDiscDeltaBased implements IndexCache { IndexCacheStore deltaStore = new IndexCacheStore(timestampsDelta, generatedSymbols, dependenciesDelta, type); persist(cacheKey, new DeltaUpdate(deltaStore), true); + + // update local timestamp cache + Map timestampsMap = this.timestamps.computeIfAbsent(cacheKey, (s) -> new ConcurrentHashMap<>()); + timestampsMap.put(file, lastModified); } @Override @@ -202,18 +227,23 @@ public class IndexCacheOnDiscDeltaBased implements IndexCache { IndexCacheStore deltaStore = new IndexCacheStore(timestampsDelta, generatedSymbols, dependenciesDelta, type); persist(cacheKey, new DeltaUpdate(deltaStore), true); + + // update local timestamp cache + Map timestampsMap = this.timestamps.computeIfAbsent(cacheKey, (s) -> new ConcurrentHashMap<>()); + for (int i = 0; i < files.length; i++) { + timestampsMap.put(files[i], lastModified[i]); + } } @Override public long getModificationTimestamp(IndexCacheKey cacheKey, String file) { -// IndexCacheStore cacheStore = this.stores.get(cacheKey); -// -// if (cacheStore != null) { -// Long result = cacheStore.getTimestampedFiles().get(file); -// if (result != null) { -// return result; -// } -// } + Map timestampsMap = this.timestamps.get(cacheKey); + if (timestampsMap != null) { + Long result = timestampsMap.get(file); + if (result != null) { + return result; + } + } return 0; }