push VFS event merger into IndexedFilesListener to simplify implementations

GitOrigin-RevId: e3fd2227841b274f8dd41d326153498b6c2cbc37
This commit is contained in:
peter
2019-06-11 18:07:33 +03:00
committed by intellij-monorepo-bot
parent 30cb7b88c7
commit 3a0ee456a8
3 changed files with 20 additions and 34 deletions
@@ -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<String> operation = new Ref<>()
vfsEventMerger.processChanges(new VfsEventsMerger.VfsEventProcessor() {
eventMerger.processChanges(new VfsEventsMerger.VfsEventProcessor() {
@Override
boolean process(@NotNull VfsEventsMerger.ChangeInfo info) {
operation.set(info.toString())
@@ -283,7 +283,7 @@ public final class FileBasedIndexImpl extends FileBasedIndex implements Disposab
boolean processChangedFiles(@NotNull Project project, @NotNull Processor<? super VirtualFile> 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<VirtualFile> 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);
}
}
}
@@ -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() {