allow SerializationManager to be unmodifiable (fix serializer set)

GitOrigin-RevId: 748d549ec4113081cd644506b4f8154655e57200
This commit is contained in:
Dmitry Batkovich
2019-06-10 10:06:51 +03:00
committed by intellij-monorepo-bot
parent 596e36dfa7
commit 744cf7ddc8
4 changed files with 32 additions and 13 deletions
@@ -88,7 +88,7 @@ abstract class PrebuiltStubsProviderBase : PrebuiltIndexProviderBase<SerializedS
return null
}
else {
mySerializationManager = SerializationManagerImpl(File(indexesRoot, "$indexName.names"))
mySerializationManager = SerializationManagerImpl(File(indexesRoot, "$indexName.names"), true)
Disposer.register(ApplicationManager.getApplication(), mySerializationManager!!)
return super.openIndexStorage(indexesRoot)
}
@@ -20,7 +20,6 @@ import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.ShutDownTracker;
import com.intellij.util.io.AbstractStringEnumerator;
import com.intellij.util.io.IOUtil;
import com.intellij.util.io.PersistentStringEnumerator;
import org.jetbrains.annotations.NotNull;
@@ -39,22 +38,24 @@ public class SerializationManagerImpl extends SerializationManagerEx implements
private final AtomicBoolean myNameStorageCrashed = new AtomicBoolean(false);
private final File myFile;
private final boolean myUnmodifiable;
private final AtomicBoolean myShutdownPerformed = new AtomicBoolean(false);
private AbstractStringEnumerator myNameStorage;
private PersistentStringEnumerator myNameStorage;
private StubSerializationHelper myStubSerializationHelper;
public SerializationManagerImpl() {
this(new File(PathManager.getIndexRoot(), "rep.names"));
this(new File(PathManager.getIndexRoot(), "rep.names"), false);
}
public SerializationManagerImpl(@NotNull File nameStorageFile) {
public SerializationManagerImpl(@NotNull File nameStorageFile, boolean unmodifiable) {
myFile = nameStorageFile;
myFile.getParentFile().mkdirs();
myUnmodifiable = unmodifiable;
try {
// we need to cache last id -> String mappings due to StringRefs and stubs indexing that initially creates stubs (doing enumerate on String)
// and then index them (valueOf), also similar string items are expected to be enumerated during stubs processing
myNameStorage = new PersistentStringEnumerator(myFile, true);
myStubSerializationHelper = new StubSerializationHelper(myNameStorage, this);
myStubSerializationHelper = new StubSerializationHelper(myNameStorage, unmodifiable, this);
}
catch (IOException e) {
nameStorageCrashed();
@@ -83,10 +84,13 @@ public class SerializationManagerImpl extends SerializationManagerEx implements
}
StubSerializationHelper prevHelper = myStubSerializationHelper;
if (myUnmodifiable) {
LOG.error("Data provided by unmodifiable serialization manager can be invalid after repair");
}
IOUtil.deleteAllFilesStartingWith(myFile);
myNameStorage = new PersistentStringEnumerator(myFile, true);
myStubSerializationHelper = new StubSerializationHelper(myNameStorage, this);
myStubSerializationHelper = new StubSerializationHelper(myNameStorage, myUnmodifiable, this);
myStubSerializationHelper.copyFrom(prevHelper);
}
catch (IOException e) {
@@ -14,6 +14,7 @@ import com.intellij.util.containers.RecentStringInterner;
import com.intellij.util.io.AbstractStringEnumerator;
import com.intellij.util.io.DataInputOutputUtil;
import com.intellij.util.io.IOUtil;
import com.intellij.util.io.PersistentStringEnumerator;
import gnu.trove.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -25,7 +26,9 @@ import java.util.*;
* Author: dmitrylomov
*/
class StubSerializationHelper {
private final AbstractStringEnumerator myNameStorage;
private static final Logger LOG = Logger.getInstance(StubSerializationHelper.class);
private final PersistentStringEnumerator myNameStorage;
private final TIntObjectHashMap<String> myIdToName = new TIntObjectHashMap<>();
private final TObjectIntHashMap<String> myNameToId = new TObjectIntHashMap<>();
@@ -34,10 +37,12 @@ class StubSerializationHelper {
private final ConcurrentIntObjectMap<ObjectStubSerializer> myIdToSerializer = ContainerUtil.createConcurrentIntObjectMap();
private final Map<ObjectStubSerializer, Integer> mySerializerToId = ContainerUtil.newConcurrentMap();
private final boolean myUnmodifiable;
private final RecentStringInterner myStringInterner;
StubSerializationHelper(@NotNull AbstractStringEnumerator nameStorage, @NotNull Disposable parentDisposable) {
StubSerializationHelper(@NotNull PersistentStringEnumerator nameStorage, boolean unmodifiable, @NotNull Disposable parentDisposable) {
myNameStorage = nameStorage;
myUnmodifiable = unmodifiable;
myStringInterner = new RecentStringInterner(parentDisposable);
}
@@ -53,7 +58,17 @@ class StubSerializationHelper {
return;
}
int id = myNameStorage.enumerate(name);
int id;
if (myUnmodifiable) {
id = myNameStorage.tryEnumerate(name);
if (id == 0) {
LOG.info("serialized " + name + " is ignored in unmodifiable stub serialization manager");
return;
}
}
else {
id = myNameStorage.enumerate(name);
}
myIdToName.put(id, name);
myNameToId.put(name, id);
}
@@ -31,7 +31,7 @@ import java.util.*
open class StubsGenerator(private val stubsVersion: String, private val stubsStorageFilePath: String) :
IndexGenerator<SerializedStubTree>(stubsStorageFilePath) {
private val serializationManager = SerializationManagerImpl(File("$stubsStorageFilePath.names"))
private val serializationManager = SerializationManagerImpl(File("$stubsStorageFilePath.names"), false)
fun buildStubsForRoots(roots: Collection<VirtualFile>) {
try {
@@ -96,7 +96,7 @@ fun mergeStubs(paths: List<String>, stubsFilePath: String, stubsFileName: String
stringEnumeratorFile.delete()
}
val newSerializationManager = SerializationManagerImpl(stringEnumeratorFile)
val newSerializationManager = SerializationManagerImpl(stringEnumeratorFile, false)
val map = HashMap<HashCode, Int>()
@@ -109,7 +109,7 @@ fun mergeStubs(paths: List<String>, stubsFilePath: String, stubsFileName: String
val fromStorage = PersistentHashMap<HashCode, SerializedStubTree>(fromStorageFile,
HashCodeDescriptor.instance, stubExternalizer)
val serializationManager = SerializationManagerImpl(File(path, "$stubsFileName.names"))
val serializationManager = SerializationManagerImpl(File(path, "$stubsFileName.names"), true)
try {
fromStorage.processKeysWithExistingMapping { key ->