From c545f5fe4ebbbbeda1f0246699b8ed4e7e52791e Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Mon, 30 Oct 2023 13:30:17 +0400 Subject: [PATCH] provide index rebuild causes where it's possible to distinguish events caused by index related errors and explicit rebuilds caused by plugin functionality IDEA-331941 GitOrigin-RevId: 3c16c110f75aad687067bdc94f1453e456980810 --- .../util/indexing/FileBasedIndex.java | 14 +++++++++++-- .../diagnostic/IndexStatisticGroup.kt | 21 +++++++++++++++++-- .../FileBasedIndexDataInitialization.java | 2 +- .../util/indexing/FileBasedIndexImpl.java | 2 +- .../util/indexing/UnindexedFilesFinder.java | 2 +- 5 files changed, 34 insertions(+), 7 deletions(-) diff --git a/platform/indexing-api/src/com/intellij/util/indexing/FileBasedIndex.java b/platform/indexing-api/src/com/intellij/util/indexing/FileBasedIndex.java index 3d0490030299..62fb2cb96afc 100644 --- a/platform/indexing-api/src/com/intellij/util/indexing/FileBasedIndex.java +++ b/platform/indexing-api/src/com/intellij/util/indexing/FileBasedIndex.java @@ -2,8 +2,10 @@ package com.intellij.util.indexing; import com.intellij.diagnostic.PluginException; +import com.intellij.ide.plugins.PluginUtil; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadAction; +import com.intellij.openapi.extensions.PluginId; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; @@ -95,7 +97,7 @@ public abstract class FileBasedIndex { public abstract VirtualFile findFileById(Project project, int id); public void requestRebuild(@NotNull ID indexId) { - requestRebuild(indexId, new RebuildRequestedByUserAction()); + requestRebuild(indexId, new RebuildRequestedByUserAction(PluginUtil.getInstance().findPluginId(new Throwable()))); } @NotNull @@ -387,6 +389,14 @@ public abstract class FileBasedIndex { public void loadIndexes() { } - private static class RebuildRequestedByUserAction extends Throwable { + @ApiStatus.Internal + public static class RebuildRequestedByUserAction extends Throwable { + private final @Nullable PluginId myRequestorPluginId; + + private RebuildRequestedByUserAction(@Nullable PluginId requestorPluginId) { myRequestorPluginId = requestorPluginId; } + + public @Nullable PluginId getRequestorPluginId() { + return myRequestorPluginId; + } } } diff --git a/platform/indexing-impl/src/com/intellij/util/indexing/diagnostic/IndexStatisticGroup.kt b/platform/indexing-impl/src/com/intellij/util/indexing/diagnostic/IndexStatisticGroup.kt index f6da97b77205..069ff1ce9cf2 100644 --- a/platform/indexing-impl/src/com/intellij/util/indexing/diagnostic/IndexStatisticGroup.kt +++ b/platform/indexing-impl/src/com/intellij/util/indexing/diagnostic/IndexStatisticGroup.kt @@ -1,18 +1,21 @@ // Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.util.indexing.diagnostic +import com.intellij.internal.statistic.collectors.fus.PluginIdRuleValidator import com.intellij.internal.statistic.eventLog.EventLogGroup import com.intellij.internal.statistic.eventLog.events.EventFields import com.intellij.internal.statistic.service.fus.collectors.CounterUsagesCollector import com.intellij.internal.statistic.utils.StatisticsUtil +import com.intellij.openapi.extensions.PluginId import com.intellij.openapi.project.Project +import com.intellij.util.indexing.FileBasedIndex.RebuildRequestedByUserAction import com.intellij.util.indexing.ID import org.jetbrains.annotations.ApiStatus.Internal import java.util.* @Internal object IndexStatisticGroup { - val GROUP = EventLogGroup("indexing.statistics", 10) + val GROUP = EventLogGroup("indexing.statistics", 11) private val stubIndexInconsistencyRegistered = GROUP.registerEvent("stub.index.inconsistency") @@ -25,6 +28,10 @@ object IndexStatisticGroup { EventFields.StringValidatedByCustomRule("index_id", IndexIdRuleValidator::class.java) private val rebuildCauseField = EventFields.Class("rebuild_cause") + private val requestorPluginId = EventFields.StringValidatedByCustomRule( + "requestor_plugin_id", + PluginIdRuleValidator::class.java, + ) private val insideIndexInitialization = EventFields.Boolean("inside_index_initialization") @@ -32,6 +39,7 @@ object IndexStatisticGroup { "index_rebuild", indexIdField, rebuildCauseField, + requestorPluginId, insideIndexInitialization, ) @@ -39,8 +47,17 @@ object IndexStatisticGroup { fun reportIndexRebuild(indexId: ID<*, *>, cause: Throwable, isInsideIndexInitialization: Boolean) { + val realCause = (if (cause.javaClass == Throwable::class.java) cause.cause else cause) ?: cause + val causeClass = realCause.javaClass + + var requestorPluginID: PluginId? = null + if (realCause is RebuildRequestedByUserAction) { + requestorPluginID = realCause.requestorPluginId + } + indexRebuildEvent.log(indexIdField with indexId.name, - rebuildCauseField with cause.javaClass, + rebuildCauseField with causeClass, + requestorPluginId with requestorPluginID?.idString, insideIndexInitialization with isInsideIndexInitialization) } diff --git a/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexDataInitialization.java b/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexDataInitialization.java index 8a2d4a9a0c1d..454f6e19c976 100644 --- a/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexDataInitialization.java +++ b/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexDataInitialization.java @@ -171,7 +171,7 @@ final class FileBasedIndexDataInitialization extends IndexDataInitializer myFileBasedIndex.clearIndex(indexId)); } catch (StorageException e) { - myFileBasedIndex.requestRebuild(indexId); + myFileBasedIndex.requestRebuild(indexId, e); FileBasedIndexImpl.LOG.error(e); } } 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 7a9a7094a22f..28a29636223b 100644 --- a/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexImpl.java +++ b/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexImpl.java @@ -891,7 +891,7 @@ public final class FileBasedIndexImpl extends FileBasedIndexEx { } catch (StorageException e) { LOG.error(e); - requestRebuild(indexId); + requestRebuild(indexId, e); } } } 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 0951d099973f..5858d5d925db 100644 --- a/platform/lang-impl/src/com/intellij/util/indexing/UnindexedFilesFinder.java +++ b/platform/lang-impl/src/com/intellij/util/indexing/UnindexedFilesFinder.java @@ -326,7 +326,7 @@ final class UnindexedFilesFinder { final Throwable cause = e.getCause(); if (cause instanceof IOException || cause instanceof StorageException) { LOG.info(e); - myFileBasedIndex.requestRebuild(indexId); + myFileBasedIndex.requestRebuild(indexId, cause); } else { throw e;