提交 9164f30d authored 作者: Thomas Mueller's avatar Thomas Mueller

MVStore: avoid deadlocks

上级 ef857032
...@@ -169,7 +169,8 @@ public class MVStore { ...@@ -169,7 +169,8 @@ public class MVStore {
* is the unsaved version, the value is the map of chunks. The maps contains * is the unsaved version, the value is the map of chunks. The maps contains
* the number of freed entries per chunk. Access is synchronized. * the number of freed entries per chunk. Access is synchronized.
*/ */
private final HashMap<Long, HashMap<Integer, Chunk>> freedPageSpace = New.hashMap(); private final ConcurrentHashMap<Long, HashMap<Integer, Chunk>> freedPageSpace =
new ConcurrentHashMap<Long, HashMap<Integer, Chunk>>();
/** /**
* The metadata map. * The metadata map.
...@@ -1056,10 +1057,10 @@ public class MVStore { ...@@ -1056,10 +1057,10 @@ public class MVStore {
*/ */
private Set<Chunk> applyFreedSpace(long storeVersion, long time) { private Set<Chunk> applyFreedSpace(long storeVersion, long time) {
Set<Chunk> removedChunks = New.hashSet(); Set<Chunk> removedChunks = New.hashSet();
synchronized (freedPageSpace) {
while (true) { while (true) {
ArrayList<Chunk> modified = New.arrayList(); ArrayList<Chunk> modified = New.arrayList();
for (Iterator<Long> it = freedPageSpace.keySet().iterator(); it.hasNext();) { ArrayList<Long> keys = new ArrayList<Long>(freedPageSpace.keySet());
for (Iterator<Long> it = keys.iterator(); it.hasNext();) {
long v = it.next(); long v = it.next();
if (v > storeVersion) { if (v > storeVersion) {
continue; continue;
...@@ -1090,7 +1091,7 @@ public class MVStore { ...@@ -1090,7 +1091,7 @@ public class MVStore {
} }
modified.add(c); modified.add(c);
} }
it.remove(); freedPageSpace.remove(v);
} }
for (Chunk c : modified) { for (Chunk c : modified) {
if (c.maxLengthLive == 0) { if (c.maxLengthLive == 0) {
...@@ -1110,7 +1111,6 @@ public class MVStore { ...@@ -1110,7 +1111,6 @@ public class MVStore {
break; break;
} }
} }
}
return removedChunks; return removedChunks;
} }
...@@ -1501,7 +1501,6 @@ public class MVStore { ...@@ -1501,7 +1501,6 @@ public class MVStore {
} }
private void registerFreePage(long version, int chunkId, long maxLengthLive, int pageCount) { private void registerFreePage(long version, int chunkId, long maxLengthLive, int pageCount) {
synchronized (freedPageSpace) {
HashMap<Integer, Chunk>freed = freedPageSpace.get(version); HashMap<Integer, Chunk>freed = freedPageSpace.get(version);
if (freed == null) { if (freed == null) {
freed = New.hashMap(); freed = New.hashMap();
...@@ -1515,7 +1514,6 @@ public class MVStore { ...@@ -1515,7 +1514,6 @@ public class MVStore {
f.maxLengthLive -= maxLengthLive; f.maxLengthLive -= maxLengthLive;
f.pageCountLive -= pageCount; f.pageCountLive -= pageCount;
} }
}
Compressor getCompressor() { Compressor getCompressor() {
return compressor; return compressor;
...@@ -1741,9 +1739,7 @@ public class MVStore { ...@@ -1741,9 +1739,7 @@ public class MVStore {
fileStore.clear(); fileStore.clear();
} }
maps.clear(); maps.clear();
synchronized (freedPageSpace) {
freedPageSpace.clear(); freedPageSpace.clear();
}
currentVersion = version; currentVersion = version;
setWriteVersion(version); setWriteVersion(version);
lastCommittedVersion = version; lastCommittedVersion = version;
...@@ -1831,7 +1827,6 @@ public class MVStore { ...@@ -1831,7 +1827,6 @@ public class MVStore {
} }
private void revertTemp(long storeVersion) { private void revertTemp(long storeVersion) {
synchronized (freedPageSpace) {
for (Iterator<Long> it = freedPageSpace.keySet().iterator(); it.hasNext();) { for (Iterator<Long> it = freedPageSpace.keySet().iterator(); it.hasNext();) {
long v = it.next(); long v = it.next();
if (v > storeVersion) { if (v > storeVersion) {
...@@ -1839,7 +1834,6 @@ public class MVStore { ...@@ -1839,7 +1834,6 @@ public class MVStore {
} }
it.remove(); it.remove();
} }
}
for (MVMap<?, ?> m : maps.values()) { for (MVMap<?, ?> m : maps.values()) {
m.removeUnusedOldVersions(); m.removeUnusedOldVersions();
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论