From 2a6be7f34626e97a2e8f879c896f564cc95d20c3 Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Tue, 20 Oct 2020 14:01:50 +0300 Subject: [PATCH] indexes: flush cache before return if file is marked as indexed since we still load its state GitOrigin-RevId: ef455cf865f488b098a2ec7cdcf08255f00fde47 --- .../intellij/util/indexing/IndexingStamp.java | 16 ++++++++++++++++ .../util/indexing/UnindexedFilesFinder.java | 4 +++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/util/indexing/IndexingStamp.java b/platform/lang-impl/src/com/intellij/util/indexing/IndexingStamp.java index fc0b917cd8c0..55e9f3b39ebe 100644 --- a/platform/lang-impl/src/com/intellij/util/indexing/IndexingStamp.java +++ b/platform/lang-impl/src/com/intellij/util/indexing/IndexingStamp.java @@ -509,6 +509,22 @@ public final class IndexingStamp { public static void flushCache(@Nullable Integer finishedFile) { if (finishedFile != null && finishedFile == INVALID_FILE_ID) finishedFile = 0; + + if (finishedFile != null) { + Lock readLock = getStripedLock(finishedFile).readLock(); + readLock.lock(); + try { + Timestamps timestamps = ourTimestampsCache.get(finishedFile); + if (timestamps == null) return; + if (!timestamps.isDirty()) { + ourTimestampsCache.remove(finishedFile); + return; + } + } finally { + readLock.unlock(); + } + } + // todo make better (e.g. FinishedFiles striping, remove integers) while (finishedFile == null || !ourFinishedFiles.offer(finishedFile)) { List files = new ArrayList<>(ourFinishedFiles.size()); diff --git a/platform/lang-impl/src/com/intellij/util/indexing/UnindexedFilesFinder.java b/platform/lang-impl/src/com/intellij/util/indexing/UnindexedFilesFinder.java index 06726aed6f69..60d56c87fa8a 100644 --- a/platform/lang-impl/src/com/intellij/util/indexing/UnindexedFilesFinder.java +++ b/platform/lang-impl/src/com/intellij/util/indexing/UnindexedFilesFinder.java @@ -60,8 +60,9 @@ final class UnindexedFilesFinder implements VirtualFileFilter { IndexedFileImpl indexedFile = new IndexedFileImpl(file, myProject); if (file instanceof VirtualFileSystemEntry && ((VirtualFileSystemEntry)file).isFileIndexed()) { + int inputId = Math.abs(FileBasedIndexImpl.getIdMaskingNonIdBasedFile(file)); + if (myRunExtensionsForFilesMarkedAsIndexed && myShouldProcessUpToDateFiles) { - int inputId = Math.abs(FileBasedIndexImpl.getIdMaskingNonIdBasedFile(file)); List> ids = IndexingStamp.getNontrivialFileIndexedStates(inputId); for (FileBasedIndexInfrastructureExtension.FileIndexingStatusProcessor processor : myStateProcessors) { for (ID id : ids) { @@ -74,6 +75,7 @@ final class UnindexedFilesFinder implements VirtualFileFilter { } } if (!shouldIndexFile.get()) { + IndexingStamp.flushCache(inputId); return false; } }