indexes: shared index do not reopen chunks
authorDmitro Batko <dmitry.batkovich@jetbrains.com>
Thu, 20 Feb 2020 11:13:06 +0000 (14:13 +0300)
committerintellij-monorepo-bot <intellij-monorepo-bot-no-reply@jetbrains.com>
Thu, 20 Feb 2020 11:46:48 +0000 (11:46 +0000)
GitOrigin-RevId: 8b27a6460f5dfddd9ae66d3635bc795cdcda87b9

platform/lang-impl/src/com/intellij/util/indexing/hash/SharedIndexChunkConfigurationImpl.java

index 328022e59bbc9f2d784745bf48edab1556f3f652..0368ccf83945167fb6b4b5ee8e2785c0142f585a 100644 (file)
@@ -26,6 +26,7 @@ import com.intellij.util.ExceptionUtil;
 import com.intellij.util.Processor;
 import com.intellij.util.concurrency.SameThreadExecutor;
 import com.intellij.util.concurrency.SequentialTaskExecutor;
+import com.intellij.util.containers.ContainerUtil;
 import com.intellij.util.hash.ContentHashEnumerator;
 import com.intellij.util.indexing.*;
 import com.intellij.util.indexing.hash.building.EmptyIndexEnumerator;
@@ -290,13 +291,24 @@ public class SharedIndexChunkConfigurationImpl implements SharedIndexChunkConfig
 
   @Override
   public boolean attachExistingChunk(int chunkId, @NotNull Project project) {
-    try {
-      return bindChunkToProject(registerChunk(chunkId), project);
+    if (chunkId == FileContentHashIndexExtension.NULL_INDEX_ID) return true;
+    boolean isChunkLoaded;
+    synchronized (myChunkEnumerators) {
+      isChunkLoaded = myChunkEnumerators.containsKey(chunkId);
     }
-    catch (IOException e) {
-      LOG.error(e);
-      return false;
+    List<@NotNull SharedIndexChunk> chunkIndexes;
+    if (isChunkLoaded) {
+      chunkIndexes = ContainerUtil.mapNotNull(myChunkMap.values(), m -> m.get(chunkId));
+    } else {
+      try {
+        chunkIndexes = registerChunk(chunkId);
+      }
+      catch (IOException e) {
+        LOG.error(e);
+        return false;
+      }
     }
+    return bindChunkToProject(chunkIndexes, project);
   }
 
   @NotNull