diff --git a/platform/lang-impl/src/com/intellij/util/indexing/impl/storage/DefaultIndexStorageLayout.kt b/platform/lang-impl/src/com/intellij/util/indexing/impl/storage/DefaultIndexStorageLayout.kt index 98b019035448..e3309370ad70 100644 --- a/platform/lang-impl/src/com/intellij/util/indexing/impl/storage/DefaultIndexStorageLayout.kt +++ b/platform/lang-impl/src/com/intellij/util/indexing/impl/storage/DefaultIndexStorageLayout.kt @@ -1,11 +1,9 @@ // Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.util.indexing.impl.storage -import com.intellij.util.SystemProperties import com.intellij.util.indexing.* import com.intellij.util.indexing.impl.IndexStorage import com.intellij.util.indexing.impl.forward.* -import com.intellij.util.indexing.impl.storage.mvstore.MVStoreForwardIndexStorageLayoutProvider import com.intellij.util.indexing.memory.InMemoryForwardIndex import com.intellij.util.indexing.memory.InMemoryIndexStorage import com.intellij.util.indexing.snapshot.SnapshotInputMappings @@ -14,11 +12,16 @@ import org.jetbrains.annotations.ApiStatus import java.io.IOException object DefaultIndexStorageLayout { + val forcedLayout: String? = System.getProperty("idea.index.storage.forced.layout") @JvmStatic @Throws(IOException::class) fun getLayout(indexExtension: FileBasedIndexExtension, contentHashEnumeratorReopen: Boolean): VfsAwareIndexStorageLayout { + val layoutEP = getForcedLayoutEP() ?: FileBasedIndexLayoutSettings.getUsedLayout() + if (layoutEP != null) { + return layoutEP.layoutProvider.getLayout(indexExtension) + } if (FileBasedIndex.USE_IN_MEMORY_INDEX) { return InMemoryStorageLayout(indexExtension) } @@ -31,6 +34,12 @@ object DefaultIndexStorageLayout { else DefaultStorageLayout(indexExtension) } + private fun getForcedLayoutEP(): FileBasedIndexLayoutProviderBean? { + val layout = forcedLayout ?: return null + return FileBasedIndexLayoutProvider.STORAGE_LAYOUT_EP_NAME.extensions.find { it.id == layout } + ?: throw IllegalStateException("Can't find index storage layout for id = $layout") + } + @ApiStatus.Internal private fun getForwardIndexAccessor(indexExtension: IndexExtension): AbstractMapForwardIndexAccessor { return if (indexExtension !is SingleEntryFileBasedIndexExtension<*> || FileBasedIndex.USE_IN_MEMORY_INDEX) { diff --git a/platform/lang-impl/src/com/intellij/util/indexing/impl/storage/FileBasedIndexLayoutProviderBean.java b/platform/lang-impl/src/com/intellij/util/indexing/impl/storage/FileBasedIndexLayoutProviderBean.java index 440f941f1b44..4f216b2e728d 100644 --- a/platform/lang-impl/src/com/intellij/util/indexing/impl/storage/FileBasedIndexLayoutProviderBean.java +++ b/platform/lang-impl/src/com/intellij/util/indexing/impl/storage/FileBasedIndexLayoutProviderBean.java @@ -3,6 +3,7 @@ package com.intellij.util.indexing.impl.storage; import com.intellij.AbstractBundle; import com.intellij.DynamicBundle; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.PluginAware; import com.intellij.openapi.extensions.PluginDescriptor; @@ -57,7 +58,15 @@ public final class FileBasedIndexLayoutProviderBean implements PluginAware { return AbstractBundle.message(resourceBundle, presentableNameKey); } - private PluginDescriptor myPluginDescriptor; + private FileBasedIndexLayoutProvider myLayoutProvider; + @NotNull synchronized FileBasedIndexLayoutProvider getLayoutProvider() { + if (myLayoutProvider == null) { + myLayoutProvider = ApplicationManager.getApplication().instantiateClass(providerClass, myPluginDescriptor); + } + return myLayoutProvider; + } + + private volatile PluginDescriptor myPluginDescriptor; @Override public void setPluginDescriptor(@NotNull PluginDescriptor pluginDescriptor) { myPluginDescriptor = pluginDescriptor;