From 3a0ee456a8be78d217568cc1f025cd8c1f44959b Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 11 Jun 2019 14:14:15 +0200 Subject: [PATCH] push VFS event merger into IndexedFilesListener to simplify implementations GitOrigin-RevId: e3fd2227841b274f8dd41d326153498b6c2cbc37 --- .../com/intellij/java/index/IndexTest.groovy | 12 +-------- .../util/indexing/FileBasedIndexImpl.java | 27 +++++-------------- .../util/indexing/IndexedFilesListener.java | 15 ++++++++--- 3 files changed, 20 insertions(+), 34 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/java/index/IndexTest.groovy b/java/java-tests/testSrc/com/intellij/java/index/IndexTest.groovy index bdd79e872d2e..b884a753d33a 100644 --- a/java/java-tests/testSrc/com/intellij/java/index/IndexTest.groovy +++ b/java/java-tests/testSrc/com/intellij/java/index/IndexTest.groovy @@ -771,7 +771,6 @@ class IndexTest extends JavaCodeInsightFixtureTestCase { } class RecordingVfsListener extends IndexedFilesListener { - def vfsEventMerger = new VfsEventsMerger() @Override protected void iterateIndexableFiles(@NotNull VirtualFile file, @NotNull ContentIterator iterator) { @@ -784,18 +783,9 @@ class IndexTest extends JavaCodeInsightFixtureTestCase { }) } - protected void doInvalidateIndicesForFile(@NotNull VirtualFile file, boolean contentChange) { - vfsEventMerger.recordBeforeFileEvent(((VirtualFileWithId)file).id, file, contentChange) - } - - @Override - protected void buildIndicesForFile(@NotNull VirtualFile file, boolean contentChange) { - vfsEventMerger.recordFileEvent(((VirtualFileWithId)file).id, file, contentChange) - } - String indexingOperation(VirtualFile file) { Ref operation = new Ref<>() - vfsEventMerger.processChanges(new VfsEventsMerger.VfsEventProcessor() { + eventMerger.processChanges(new VfsEventsMerger.VfsEventProcessor() { @Override boolean process(@NotNull VfsEventsMerger.ChangeInfo info) { operation.set(info.toString()) diff --git a/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexImpl.java b/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexImpl.java index 8adb6f0d6cec..d5fc983d3818 100644 --- a/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexImpl.java +++ b/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexImpl.java @@ -283,7 +283,7 @@ public final class FileBasedIndexImpl extends FileBasedIndex implements Disposab boolean processChangedFiles(@NotNull Project project, @NotNull Processor processor) { // avoid missing files when events are processed concurrently - return Stream.concat(myChangedFilesCollector.myVfsEventsMerger.getChangedFiles(), + return Stream.concat(myChangedFilesCollector.getEventMerger().getChangedFiles(), myChangedFilesCollector.myFilesToUpdate.values().stream()) .filter(filesToBeIndexedForProjectCondition(project)) .distinct() @@ -1861,7 +1861,6 @@ public final class FileBasedIndexImpl extends FileBasedIndex implements Disposab private final class ChangedFilesCollector extends IndexedFilesListener { private final IntObjectMap myFilesToUpdate = ContainerUtil.createConcurrentIntObjectMap(); - private final VfsEventsMerger myVfsEventsMerger = new VfsEventsMerger(); private final AtomicInteger myProcessedEventIndex = new AtomicInteger(); private final Phaser myWorkersFinishedSync = new Phaser() { @Override @@ -1898,18 +1897,6 @@ public final class FileBasedIndexImpl extends FileBasedIndex implements Disposab } } - @Override - protected void buildIndicesForFile(@NotNull VirtualFile file, boolean contentChange) { - int fileId = getIdMaskingNonIdBasedFile(file); - myVfsEventsMerger.recordFileEvent(fileId, file, contentChange); - } - - @Override - protected void doInvalidateIndicesForFile(@NotNull VirtualFile file, boolean contentChange) { - final int fileId = Math.abs(getIdMaskingNonIdBasedFile(file)); - myVfsEventsMerger.recordBeforeFileEvent(fileId, file, contentChange); - } - void scheduleForUpdate(VirtualFile file) { if (!(file instanceof DeletedVirtualFileStub)) { IndexableFileSet setForFile = getIndexableSetForFile(file); @@ -1995,7 +1982,7 @@ public final class FileBasedIndexImpl extends FileBasedIndex implements Disposab } void ensureUpToDateAsync() { - if (myVfsEventsMerger.getApproximateChangesCount() >= 20 && myScheduledVfsEventsWorkers.compareAndSet(0,1)) { + if (getEventMerger().getApproximateChangesCount() >= 20 && myScheduledVfsEventsWorkers.compareAndSet(0,1)) { myVfsEventsExecutor.submit(this::scheduledEventProcessingInReadActionWithYieldingToWriteAction); if (Registry.is("try.starting.dumb.mode.where.many.files.changed")) { @@ -2026,7 +2013,7 @@ public final class FileBasedIndexImpl extends FileBasedIndex implements Disposab private void processFilesInReadAction() { assert ApplicationManager.getApplication().isReadAccessAllowed(); // no vfs events -> event processing code can finish - int publishedEventIndex = myVfsEventsMerger.getPublishedEventIndex(); + int publishedEventIndex = getEventMerger().getPublishedEventIndex(); int processedEventIndex = myProcessedEventIndex.get(); if (processedEventIndex == publishedEventIndex) { return; @@ -2035,7 +2022,7 @@ public final class FileBasedIndexImpl extends FileBasedIndex implements Disposab myWorkersFinishedSync.register(); int phase = myWorkersFinishedSync.getPhase(); try { - myVfsEventsMerger.processChanges(info -> + getEventMerger().processChanges(info -> ConcurrencyUtil.withLock(myWriteLock, () -> { try { ProgressManager.getInstance().executeNonCancelableSection(() -> { @@ -2061,13 +2048,13 @@ public final class FileBasedIndexImpl extends FileBasedIndex implements Disposab myWorkersFinishedSync.awaitAdvance(phase); - if (myVfsEventsMerger.getPublishedEventIndex() == publishedEventIndex) { + if (getEventMerger().getPublishedEventIndex() == publishedEventIndex) { myProcessedEventIndex.compareAndSet(processedEventIndex, publishedEventIndex); } } private void processFilesInReadActionWithYieldingToWriteAction() { - while (myVfsEventsMerger.hasChanges()) { + while (getEventMerger().hasChanges()) { if (!ProgressIndicatorUtils.runInReadActionWithWriteActionPriority(this::processFilesInReadAction)) { ProgressIndicatorUtils.yieldToPendingWriteActions(); } @@ -2248,7 +2235,7 @@ public final class FileBasedIndexImpl extends FileBasedIndex implements Disposab VirtualFile virtualFile = file.getVirtualFile(); if (virtualFile instanceof VirtualFileWithId) { - myChangedFilesCollector.myVfsEventsMerger.recordTransientStateChangeEvent(getFileId(virtualFile), virtualFile); + myChangedFilesCollector.getEventMerger().recordTransientStateChangeEvent(getFileId(virtualFile), virtualFile); } } } diff --git a/platform/lang-impl/src/com/intellij/util/indexing/IndexedFilesListener.java b/platform/lang-impl/src/com/intellij/util/indexing/IndexedFilesListener.java index 2b24f10f3ab4..26beb6eab6a3 100644 --- a/platform/lang-impl/src/com/intellij/util/indexing/IndexedFilesListener.java +++ b/platform/lang-impl/src/com/intellij/util/indexing/IndexedFilesListener.java @@ -33,6 +33,7 @@ import java.util.List; public abstract class IndexedFilesListener implements BulkFileListener { private final ManagingFS myManagingFS = ManagingFS.getInstance(); + private final VfsEventsMerger myEventMerger = new VfsEventsMerger(); @Nullable private final VirtualFile myConfig; @Nullable private final VirtualFile myLog; @@ -41,6 +42,10 @@ public abstract class IndexedFilesListener implements BulkFileListener { myLog = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(new File(PathManager.getLogPath())); } + protected VfsEventsMerger getEventMerger() { + return myEventMerger; + } + protected void buildIndicesForFileRecursively(@NotNull final VirtualFile file, final boolean contentChange) { if (file.isDirectory()) { final ContentIterator iterator = fileOrDir -> { @@ -59,13 +64,17 @@ public abstract class IndexedFilesListener implements BulkFileListener { if (isUnderConfigOrSystem(file)) { return false; } - doInvalidateIndicesForFile(file, contentChange); + final int fileId = Math.abs(FileBasedIndexImpl.getIdMaskingNonIdBasedFile(file)); + myEventMerger.recordBeforeFileEvent(fileId, file, contentChange); return !file.isDirectory() || FileBasedIndexImpl.isMock(file) || myManagingFS.wereChildrenAccessed(file); } protected abstract void iterateIndexableFiles(@NotNull VirtualFile file, @NotNull ContentIterator iterator); - protected abstract void buildIndicesForFile(@NotNull VirtualFile file, boolean contentChange); - protected abstract void doInvalidateIndicesForFile(@NotNull VirtualFile file, boolean contentChange); + + private void buildIndicesForFile(@NotNull VirtualFile file, boolean contentChange) { + int fileId = FileBasedIndexImpl.getIdMaskingNonIdBasedFile(file); + myEventMerger.recordFileEvent(fileId, file, contentChange); + } void invalidateIndicesRecursively(@NotNull final VirtualFile file, final boolean contentChange) { VfsUtilCore.visitChildrenRecursively(file, new VirtualFileVisitor() {