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

MVStore: avoid deadlocks

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