Clear dir/id cache on move

This commit is contained in:
Roman Shevchenko
2012-09-05 15:34:29 +04:00
parent c666fc5173
commit 4d4ce3e68d
@@ -30,6 +30,7 @@ import com.intellij.openapi.vfs.newvfs.impl.FakeVirtualFile;
import com.intellij.openapi.vfs.newvfs.impl.VirtualDirectoryImpl;
import com.intellij.openapi.vfs.newvfs.impl.VirtualFileSystemEntry;
import com.intellij.util.ArrayUtil;
import com.intellij.util.containers.ConcurrentIntObjectMap;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.StripedLockIntObjectConcurrentHashMap;
import com.intellij.util.io.ReplicatorInputStream;
@@ -855,8 +856,7 @@ public class PersistentFSImpl extends PersistentFS implements ApplicationCompone
return VfsUtilCore.toVirtualFileArray(roots);
}
//guarded by dirCacheReadLock/dirCacheWriteLock
@NotNull private final StripedLockIntObjectConcurrentHashMap<NewVirtualFile> myIdToDirCache = new StripedLockIntObjectConcurrentHashMap<NewVirtualFile>();
@NotNull private final ConcurrentIntObjectMap<NewVirtualFile> myIdToDirCache = new StripedLockIntObjectConcurrentHashMap<NewVirtualFile>();
@Override
public void clearIdCache() {
@@ -884,7 +884,7 @@ public class PersistentFSImpl extends PersistentFS implements ApplicationCompone
NewVirtualFile result = doFindFile(id, cachedOnly);
if (result != null && result.isDirectory()) {
NewVirtualFile old = myIdToDirCache.putIfAbsent(id, result);
NewVirtualFile old = myIdToDirCache.put(id, result);
if (old != null) result = old;
}
return result;
@@ -902,10 +902,6 @@ public class PersistentFSImpl extends PersistentFS implements ApplicationCompone
myRootsLock.readLock().unlock();
}
}
else if (parentId == id) {
LOG.error("Corrupted VFS? id=" + id + " name=" + getName(id));
return null;
}
else {
NewVirtualFile parentFile = _findFileById(parentId, cachedOnly);
if (parentFile == null) {
@@ -1129,7 +1125,9 @@ public class PersistentFSImpl extends PersistentFS implements ApplicationCompone
executeCreateChild(newParent, copyName);
}
private static void executeMove(@NotNull VirtualFile file, @NotNull VirtualFile newParent) {
private void executeMove(@NotNull VirtualFile file, @NotNull VirtualFile newParent) {
clearIdCache();
final int fileId = getFileId(file);
final int newParentId = getFileId(newParent);
final int oldParentId = getFileId(file.getParent());