提交 5e703674 authored 作者: Thomas Mueller's avatar Thomas Mueller

A persistent multi-version map (work in progress) - rename to MVStore / MVMap

上级 d5cc1876
......@@ -105,7 +105,7 @@ import org.h2.test.server.TestWeb;
import org.h2.test.server.TestInit;
import org.h2.test.store.TestCacheLIRS;
import org.h2.test.store.TestDataUtils;
import org.h2.test.store.TestBtreeMapStore;
import org.h2.test.store.TestMVStore;
import org.h2.test.store.TestRtree;
import org.h2.test.synth.TestBtreeIndex;
import org.h2.test.synth.TestCrashAPI;
......@@ -665,7 +665,7 @@ kill -9 `jps -l | grep "org.h2.test." | cut -d " " -f 1`
private void testUnit() {
// store
new TestBtreeMapStore().runTest(this);
new TestMVStore().runTest(this);
new TestCacheLIRS().runTest(this);
new TestDataUtils().runTest(this);
new TestRtree().runTest(this);
......
......@@ -7,8 +7,8 @@
package org.h2.test.store;
import java.util.ArrayList;
import org.h2.dev.store.btree.BtreeMap;
import org.h2.dev.store.btree.BtreeMapStore;
import org.h2.dev.store.btree.MVMap;
import org.h2.dev.store.btree.MVStore;
import org.h2.dev.store.btree.Cursor;
import org.h2.dev.store.btree.CursorPos;
import org.h2.dev.store.btree.DataType;
......@@ -21,12 +21,12 @@ import org.h2.util.New;
* @param <K> the key class
* @param <V> the value class
*/
public class RtreeMap<K, V> extends BtreeMap<K, V> {
public class RtreeMap<K, V> extends MVMap<K, V> {
private final SpatialType keyType;
private boolean quadraticSplit;
RtreeMap(BtreeMapStore store, int id, String name, DataType keyType,
RtreeMap(MVStore store, int id, String name, DataType keyType,
DataType valueType, long createVersion) {
super(store, id, name, keyType, valueType, createVersion);
this.keyType = (SpatialType) keyType;
......
......@@ -9,8 +9,8 @@ package org.h2.test.store;
import java.util.AbstractSet;
import java.util.Iterator;
import java.util.Set;
import org.h2.dev.store.btree.BtreeMap;
import org.h2.dev.store.btree.BtreeMapStore;
import org.h2.dev.store.btree.MVMap;
import org.h2.dev.store.btree.MVStore;
import org.h2.dev.store.btree.DataType;
/**
......@@ -19,11 +19,11 @@ import org.h2.dev.store.btree.DataType;
* @param <K> the key type
* @param <V> the key type
*/
public class SequenceMap<K, V> extends BtreeMap<K, V> {
public class SequenceMap<K, V> extends MVMap<K, V> {
int min = 1, max = 10;
SequenceMap(BtreeMapStore store, int id, String name, DataType keyType,
SequenceMap(MVStore store, int id, String name, DataType keyType,
DataType valueType, long createVersion) {
super(store, id, name, keyType, valueType, createVersion);
setReadOnly(true);
......
......@@ -9,8 +9,8 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;
import java.util.TreeMap;
import org.h2.dev.store.btree.BtreeMap;
import org.h2.dev.store.btree.BtreeMapStore;
import org.h2.dev.store.btree.MVMap;
import org.h2.dev.store.btree.MVStore;
import org.h2.jaqu.bytecode.Null;
import org.h2.store.fs.FileUtils;
import org.h2.test.TestBase;
......@@ -19,7 +19,7 @@ import org.h2.util.New;
/**
* Tests the tree map store.
*/
public class TestBtreeMapStore extends TestBase {
public class TestMVStore extends TestBase {
/**
* Run just this test.
......@@ -52,9 +52,9 @@ public class TestBtreeMapStore extends TestBase {
private void testIterateOverChanges() {
String fileName = getBaseDir() + "/testVersion.h3";
FileUtils.delete(fileName);
BtreeMapStore s = openStore(fileName);
MVStore s = openStore(fileName);
s.setMaxPageSize(6);
BtreeMap<Integer, String> m = s.openMap("data", Integer.class, String.class);
MVMap<Integer, String> m = s.openMap("data", Integer.class, String.class);
for (int i = 0; i < 60; i++) {
m.put(i, "Hello");
}
......@@ -79,9 +79,9 @@ public class TestBtreeMapStore extends TestBase {
private void testVersion() {
String fileName = getBaseDir() + "/testVersion.h3";
FileUtils.delete(fileName);
BtreeMapStore s;
MVStore s;
s = openStore(fileName);
BtreeMap<String, String> m;
MVMap<String, String> m;
s = openStore(fileName);
m = s.openMap("data", String.class, String.class);
long first = s.getCurrentVersion();
......@@ -94,10 +94,10 @@ public class TestBtreeMapStore extends TestBase {
long old = s.getCurrentVersion();
m.put("1", "Hallo");
m.put("2", "Welt");
BtreeMap<String, String> mFirst;
MVMap<String, String> mFirst;
mFirst = m.openVersion(first);
assertEquals(0, mFirst.size());
BtreeMap<String, String> mOld;
MVMap<String, String> mOld;
assertEquals("Hallo", m.get("1"));
assertEquals("Welt", m.get("2"));
mOld = m.openVersion(old);
......@@ -130,8 +130,8 @@ public class TestBtreeMapStore extends TestBase {
private void testTruncateFile() {
String fileName = getBaseDir() + "/testTruncate.h3";
FileUtils.delete(fileName);
BtreeMapStore s;
BtreeMap<Integer, String> m;
MVStore s;
MVMap<Integer, String> m;
s = openStore(fileName);
m = s.openMap("data", Integer.class, String.class);
for (int i = 0; i < 1000; i++) {
......@@ -153,8 +153,8 @@ public class TestBtreeMapStore extends TestBase {
private void testFastDelete() {
String fileName = getBaseDir() + "/testFastDelete.h3";
FileUtils.delete(fileName);
BtreeMapStore s;
BtreeMap<Integer, String> m;
MVStore s;
MVMap<Integer, String> m;
s = openStore(fileName);
s.setMaxPageSize(100);
m = s.openMap("data", Integer.class, String.class);
......@@ -181,16 +181,16 @@ public class TestBtreeMapStore extends TestBase {
private void testRollbackStored() {
String fileName = getBaseDir() + "/testRollback.h3";
FileUtils.delete(fileName);
BtreeMap<String, String> meta;
BtreeMapStore s = openStore(fileName);
MVMap<String, String> meta;
MVStore s = openStore(fileName);
assertEquals(-1, s.getRetainChunk());
s.setRetainChunk(0);
assertEquals(0, s.getRetainChunk());
assertEquals(1, s.getCurrentVersion());
assertFalse(s.hasUnsavedChanges());
BtreeMap<String, String> m = s.openMap("data", String.class, String.class);
MVMap<String, String> m = s.openMap("data", String.class, String.class);
assertTrue(s.hasUnsavedChanges());
BtreeMap<String, String> m0 = s.openMap("data0", String.class, String.class);
MVMap<String, String> m0 = s.openMap("data0", String.class, String.class);
m.put("1", "Hello");
assertEquals(1, s.commit());
s.rollbackTo(1);
......@@ -207,7 +207,7 @@ public class TestBtreeMapStore extends TestBase {
meta = s.getMetaMap();
m = s.openMap("data", String.class, String.class);
m0 = s.openMap("data0", String.class, String.class);
BtreeMap<String, String> m1 = s.openMap("data1", String.class, String.class);
MVMap<String, String> m1 = s.openMap("data1", String.class, String.class);
m.put("1", "Hallo");
m0.put("1", "Hallo");
m1.put("1", "Hallo");
......@@ -267,17 +267,17 @@ public class TestBtreeMapStore extends TestBase {
private void testRollbackInMemory() {
String fileName = getBaseDir() + "/testRollback.h3";
FileUtils.delete(fileName);
BtreeMapStore s = openStore(fileName);
MVStore s = openStore(fileName);
assertEquals(1, s.getCurrentVersion());
s.setMaxPageSize(5);
BtreeMap<String, String> m = s.openMap("data", String.class, String.class);
MVMap<String, String> m = s.openMap("data", String.class, String.class);
s.rollbackTo(0);
assertTrue(m.isClosed());
assertEquals(1, s.getCurrentVersion());
m = s.openMap("data", String.class, String.class);
BtreeMap<String, String> m0 = s.openMap("data0", String.class, String.class);
BtreeMap<String, String> m2 = s.openMap("data2", String.class, String.class);
MVMap<String, String> m0 = s.openMap("data0", String.class, String.class);
MVMap<String, String> m2 = s.openMap("data2", String.class, String.class);
m.put("1", "Hello");
for (int i = 0; i < 10; i++) {
m2.put("" + i, "Test");
......@@ -285,7 +285,7 @@ public class TestBtreeMapStore extends TestBase {
long v1 = s.commit();
assertEquals(1, v1);
assertEquals(2, s.getCurrentVersion());
BtreeMap<String, String> m1 = s.openMap("data1", String.class, String.class);
MVMap<String, String> m1 = s.openMap("data1", String.class, String.class);
assertEquals("Test", m2.get("1"));
m.put("1", "Hallo");
m0.put("1", "Hallo");
......@@ -309,10 +309,10 @@ public class TestBtreeMapStore extends TestBase {
private void testMeta() {
String fileName = getBaseDir() + "/testMeta.h3";
FileUtils.delete(fileName);
BtreeMapStore s = openStore(fileName);
BtreeMap<String, String> m = s.getMetaMap();
MVStore s = openStore(fileName);
MVMap<String, String> m = s.getMetaMap();
s.setRetainChunk(0);
BtreeMap<String, String> data = s.openMap("data", String.class, String.class);
MVMap<String, String> data = s.openMap("data", String.class, String.class);
data.put("1", "Hello");
data.put("2", "World");
s.store();
......@@ -332,13 +332,13 @@ public class TestBtreeMapStore extends TestBase {
private void testInMemory() {
for (int j = 0; j < 1; j++) {
BtreeMapStore s = openStore(null);
MVStore s = openStore(null);
// s.setMaxPageSize(10);
// long t;
int len = 100;
// TreeMap<Integer, String> m = new TreeMap<Integer, String>();
// HashMap<Integer, String> m = New.hashMap();
BtreeMap<Integer, String> m = s.openMap("data", Integer.class, String.class);
MVMap<Integer, String> m = s.openMap("data", Integer.class, String.class);
// t = System.currentTimeMillis();
for (int i = 0; i < len; i++) {
m.put(i, "Hello World");
......@@ -365,10 +365,10 @@ public class TestBtreeMapStore extends TestBase {
int len = 1000;
for (int j = 0; j < 5; j++) {
FileUtils.delete(fileName);
BtreeMapStore s = openStore(fileName);
MVStore s = openStore(fileName);
// s.setCompressor(null);
s.setMaxPageSize(40);
BtreeMap<Integer, Object[]> m = s.openMap("data", "", "i", "r(i,,)");
MVMap<Integer, Object[]> m = s.openMap("data", "", "i", "r(i,,)");
// Profiler prof = new Profiler();
// prof.startCollecting();
// long t = System.currentTimeMillis();
......@@ -394,10 +394,10 @@ public class TestBtreeMapStore extends TestBase {
private void testBtreeStore() {
String fileName = getBaseDir() + "/testBtreeStore.h3";
FileUtils.delete(fileName);
BtreeMapStore s = openStore(fileName);
MVStore s = openStore(fileName);
s.close();
s = openStore(fileName);
BtreeMap<Integer, String> m = s.openMap("data", Integer.class, String.class);
MVMap<Integer, String> m = s.openMap("data", Integer.class, String.class);
int count = 2000;
// Profiler p = new Profiler();
// p.startCollecting();
......@@ -443,8 +443,8 @@ public class TestBtreeMapStore extends TestBase {
FileUtils.delete(fileName);
long initialLength = 0;
for (int j = 0; j < 20; j++) {
BtreeMapStore s = openStore(fileName);
BtreeMap<Integer, String> m = s.openMap("data", Integer.class, String.class);
MVStore s = openStore(fileName);
MVMap<Integer, String> m = s.openMap("data", Integer.class, String.class);
for (int i = 0; i < 10; i++) {
m.put(j + i, "Hello " + j);
}
......@@ -461,8 +461,8 @@ public class TestBtreeMapStore extends TestBase {
}
// long len = FileUtils.size(fileName);
// System.out.println("len0: " + len);
BtreeMapStore s = openStore(fileName);
BtreeMap<Integer, String> m = s.openMap("data", Integer.class, String.class);
MVStore s = openStore(fileName);
MVMap<Integer, String> m = s.openMap("data", Integer.class, String.class);
for (int i = 0; i < 100; i++) {
m.remove(i);
}
......@@ -484,8 +484,8 @@ public class TestBtreeMapStore extends TestBase {
FileUtils.delete(fileName);
long initialLength = 0;
for (int j = 0; j < 20; j++) {
BtreeMapStore s = openStore(fileName);
BtreeMap<Integer, String> m = s.openMap("data", Integer.class, String.class);
MVStore s = openStore(fileName);
MVMap<Integer, String> m = s.openMap("data", Integer.class, String.class);
for (int i = 0; i < 10; i++) {
m.put(i, "Hello");
}
......@@ -508,8 +508,8 @@ public class TestBtreeMapStore extends TestBase {
private void testRandom() {
String fileName = getBaseDir() + "/testRandom.h3";
FileUtils.delete(fileName);
BtreeMapStore s = openStore(fileName);
BtreeMap<Integer, Integer> m = s.openMap("data", Integer.class, Integer.class);
MVStore s = openStore(fileName);
MVMap<Integer, Integer> m = s.openMap("data", Integer.class, Integer.class);
TreeMap<Integer, Integer> map = new TreeMap<Integer, Integer>();
Random r = new Random(1);
int operationCount = 1000;
......@@ -560,14 +560,14 @@ public class TestBtreeMapStore extends TestBase {
private void testKeyValueClasses() {
String fileName = getBaseDir() + "/testKeyValueClasses.h3";
FileUtils.delete(fileName);
BtreeMapStore s = openStore(fileName);
BtreeMap<Integer, String> is = s.openMap("intString", Integer.class, String.class);
MVStore s = openStore(fileName);
MVMap<Integer, String> is = s.openMap("intString", Integer.class, String.class);
is.put(1, "Hello");
BtreeMap<Integer, Integer> ii = s.openMap("intInt", Integer.class, Integer.class);
MVMap<Integer, Integer> ii = s.openMap("intInt", Integer.class, Integer.class);
ii.put(1, 10);
BtreeMap<String, Integer> si = s.openMap("stringInt", String.class, Integer.class);
MVMap<String, Integer> si = s.openMap("stringInt", String.class, Integer.class);
si.put("Test", 10);
BtreeMap<String, String> ss = s.openMap("stringString", String.class, String.class);
MVMap<String, String> ss = s.openMap("stringString", String.class, String.class);
ss.put("Hello", "World");
try {
s.openMap("invalid", Null.class, Integer.class);
......@@ -598,8 +598,8 @@ public class TestBtreeMapStore extends TestBase {
private void testIterate() {
String fileName = getBaseDir() + "/testIterate.h3";
FileUtils.delete(fileName);
BtreeMapStore s = openStore(fileName);
BtreeMap<Integer, String> m = s.openMap("data", Integer.class, String.class);
MVStore s = openStore(fileName);
MVMap<Integer, String> m = s.openMap("data", Integer.class, String.class);
Iterator<Integer> it = m.keyIterator(null);
assertFalse(it.hasNext());
for (int i = 0; i < 10; i++) {
......@@ -631,8 +631,8 @@ public class TestBtreeMapStore extends TestBase {
private void testSimple() {
String fileName = getBaseDir() + "/testSimple.h3";
FileUtils.delete(fileName);
BtreeMapStore s = openStore(fileName);
BtreeMap<Integer, String> m = s.openMap("data", Integer.class, String.class);
MVStore s = openStore(fileName);
MVMap<Integer, String> m = s.openMap("data", Integer.class, String.class);
for (int i = 0; i < 3; i++) {
m.put(i, "hello " + i);
}
......@@ -655,8 +655,8 @@ public class TestBtreeMapStore extends TestBase {
s.close();
}
protected static BtreeMapStore openStore(String fileName) {
BtreeMapStore store = BtreeMapStore.open(fileName, new TestMapFactory());
protected static MVStore openStore(String fileName) {
MVStore store = MVStore.open(fileName, new TestMapFactory());
store.setMaxPageSize(10);
return store;
}
......
......@@ -5,8 +5,8 @@
*/
package org.h2.test.store;
import org.h2.dev.store.btree.BtreeMap;
import org.h2.dev.store.btree.BtreeMapStore;
import org.h2.dev.store.btree.MVMap;
import org.h2.dev.store.btree.MVStore;
import org.h2.dev.store.btree.DataType;
import org.h2.dev.store.btree.MapFactory;
import org.h2.dev.store.btree.StringType;
......@@ -17,7 +17,7 @@ import org.h2.dev.store.btree.StringType;
public class TestMapFactory implements MapFactory {
@Override
public <K, V> BtreeMap<K, V> buildMap(String mapType, BtreeMapStore store,
public <K, V> MVMap<K, V> buildMap(String mapType, MVStore store,
int id, String name, DataType keyType, DataType valueType,
long createVersion) {
if (mapType.equals("s")) {
......
......@@ -14,7 +14,7 @@ import java.util.Random;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.stream.FileImageOutputStream;
import org.h2.dev.store.btree.BtreeMapStore;
import org.h2.dev.store.btree.MVStore;
import org.h2.store.fs.FileUtils;
import org.h2.test.TestBase;
import org.h2.util.New;
......@@ -22,7 +22,7 @@ import org.h2.util.New;
/**
* Tests the r-tree.
*/
public class TestRtree extends TestBtreeMapStore {
public class TestRtree extends TestMVStore {
/**
* Run just this test.
......@@ -43,7 +43,7 @@ public class TestRtree extends TestBtreeMapStore {
private void testRtreeMany() {
String fileName = getBaseDir() + "/testRtree.h3";
FileUtils.delete(fileName);
BtreeMapStore s;
MVStore s;
s = openStore(fileName);
// s.setMaxPageSize(50);
RtreeMap<SpatialKey, String> r = s.openMap("data", "r", "s2", "");
......@@ -106,7 +106,7 @@ public class TestRtree extends TestBtreeMapStore {
private void testRtree() {
String fileName = getBaseDir() + "/testRtree.h3";
FileUtils.delete(fileName);
BtreeMapStore s;
MVStore s;
s = openStore(fileName);
RtreeMap<SpatialKey, String> r = s.openMap("data", "r", "s2", "");
add(r, "Bern", 46.57, 7.27, 124381);
......@@ -198,7 +198,7 @@ public class TestRtree extends TestBtreeMapStore {
private void testRandomRtree() {
String fileName = getBaseDir() + "/testRtreeRandom.h3";
FileUtils.delete(fileName);
BtreeMapStore s = openStore(fileName);
MVStore s = openStore(fileName);
RtreeMap<SpatialKey, String> m = s.openMap("data", "r", "s2", "");
HashMap<SpatialKey, String> map = new HashMap<SpatialKey, String>();
Random rand = new Random(1);
......@@ -240,7 +240,7 @@ public class TestRtree extends TestBtreeMapStore {
private void testCustomMapType() {
String fileName = getBaseDir() + "/testMapType.h3";
FileUtils.delete(fileName);
BtreeMapStore s;
MVStore s;
s = openStore(fileName);
SequenceMap<Integer, String> seq = s.openMap("data", "s", "i", "");
StringBuilder buff = new StringBuilder();
......
......@@ -16,7 +16,7 @@ public class ChangeCursor<K, V> extends Cursor<K, V> {
private final long minVersion;
ChangeCursor(BtreeMap<K, V> map, long minVersion) {
ChangeCursor(MVMap<K, V> map, long minVersion) {
super(map);
this.minVersion = minVersion;
}
......
......@@ -17,12 +17,12 @@ import java.util.Iterator;
*/
public class Cursor<K, V> implements Iterator<K> {
protected final BtreeMap<K, V> map;
protected final MVMap<K, V> map;
protected final ArrayList<CursorPos> parents = new ArrayList<CursorPos>();
protected CursorPos currentPos;
protected K current;
Cursor(BtreeMap<K, V> map) {
Cursor(MVMap<K, V> map) {
this.map = map;
}
......
......@@ -17,9 +17,9 @@ import java.util.TreeMap;
* @param <K> the key class
* @param <V> the value class
*/
public class BtreeMap<K, V> {
public class MVMap<K, V> {
protected final BtreeMapStore store;
protected final MVStore store;
protected Page root;
private final int id;
......@@ -36,7 +36,7 @@ public class BtreeMap<K, V> {
private boolean closed;
private boolean readOnly;
protected BtreeMap(BtreeMapStore store, int id, String name,
protected MVMap(MVStore store, int id, String name,
DataType keyType, DataType valueType, long createVersion) {
this.store = store;
this.id = id;
......@@ -469,19 +469,19 @@ public class BtreeMap<K, V> {
@Override
public Iterator<K> iterator() {
Cursor<K, V> c = new Cursor<K, V>(BtreeMap.this);
Cursor<K, V> c = new Cursor<K, V>(MVMap.this);
c.start(root, null);
return c;
}
@Override
public int size() {
return BtreeMap.this.size();
return MVMap.this.size();
}
@Override
public boolean contains(Object o) {
return BtreeMap.this.containsKey(o);
return MVMap.this.containsKey(o);
}
};
......@@ -505,7 +505,7 @@ public class BtreeMap<K, V> {
return name;
}
BtreeMapStore getStore() {
MVStore getStore() {
return store;
}
......@@ -597,7 +597,7 @@ public class BtreeMap<K, V> {
store.removePage(p.getPos());
}
public BtreeMap<K, V> openVersion(long version) {
public MVMap<K, V> openVersion(long version) {
if (version < createVersion) {
throw new IllegalArgumentException("Unknown version");
}
......@@ -605,7 +605,7 @@ public class BtreeMap<K, V> {
return store.openMapVersion(version, name);
}
Page root = oldRoots.get(version);
BtreeMap<K, V> m = new BtreeMap<K, V>(store, id, name, keyType, valueType, createVersion);
MVMap<K, V> m = new MVMap<K, V>(store, id, name, keyType, valueType, createVersion);
m.readOnly = true;
m.root = root;
return m;
......
......@@ -39,7 +39,6 @@ blockSize=4096
TODO:
- implement complete java.util.Map interface
- maybe rename to MVStore, MVMap, TestMVStore
- limited support for writing to old versions (branches)
- atomic test-and-set (when supporting concurrent writes)
- support background writes (store old version)
......@@ -63,7 +62,7 @@ TODO:
/**
* A persistent storage for tree maps.
*/
public class BtreeMapStore {
public class MVStore {
public static final boolean ASSERT = false;
......@@ -92,13 +91,13 @@ public class BtreeMapStore {
*/
private HashMap<Long, HashMap<Integer, Chunk>> freedChunks = New.hashMap();
private BtreeMap<String, String> meta;
private HashMap<String, BtreeMap<?, ?>> maps = New.hashMap();
private MVMap<String, String> meta;
private HashMap<String, MVMap<?, ?>> maps = New.hashMap();
/**
* The set of maps with potentially unsaved changes.
*/
private HashMap<Integer, BtreeMap<?, ?>> mapsChanged = New.hashMap();
private HashMap<Integer, MVMap<?, ?>> mapsChanged = New.hashMap();
private int lastMapId;
private boolean reuseSpace = true;
......@@ -110,7 +109,7 @@ public class BtreeMapStore {
private int readCount;
private int writeCount;
private BtreeMapStore(String fileName, MapFactory mapFactory) {
private MVStore(String fileName, MapFactory mapFactory) {
this.fileName = fileName;
this.mapFactory = mapFactory;
}
......@@ -121,7 +120,7 @@ public class BtreeMapStore {
* @param fileName the file name
* @return the store
*/
public static BtreeMapStore open(String fileName) {
public static MVStore open(String fileName) {
return open(fileName, null);
}
......@@ -132,16 +131,16 @@ public class BtreeMapStore {
* @param mapFactory the map factory
* @return the store
*/
public static BtreeMapStore open(String fileName, MapFactory mapFactory) {
BtreeMapStore s = new BtreeMapStore(fileName, mapFactory);
public static MVStore open(String fileName, MapFactory mapFactory) {
MVStore s = new MVStore(fileName, mapFactory);
s.open();
return s;
}
@SuppressWarnings("unchecked")
<T extends BtreeMap<?, ?>> T openMapVersion(long version, String name) {
<T extends MVMap<?, ?>> T openMapVersion(long version, String name) {
// TODO reduce copy & pasted source code
BtreeMap<String, String> oldMeta = getMetaMap(version);
MVMap<String, String> oldMeta = getMetaMap(version);
String types = oldMeta.get("map." + name);
String[] idTypeList = StringUtils.arraySplit(types, '/', false);
int id = Integer.parseInt(idTypeList[0]);
......@@ -151,7 +150,7 @@ public class BtreeMapStore {
String valueType = idTypeList[4];
String r = oldMeta.get("root." + id);
long root = r == null ? 0 : Long.parseLong(r);
BtreeMap<?, ?> m = buildMap(mapType, id, name, keyType, valueType, createVersion);
MVMap<?, ?> m = buildMap(mapType, id, name, keyType, valueType, createVersion);
m.setRootPos(root);
return (T) m;
}
......@@ -167,8 +166,8 @@ public class BtreeMapStore {
* @return the map
*/
@SuppressWarnings("unchecked")
public <T extends BtreeMap<?, ?>> T openMap(String name, String mapType, String keyType, String valueType) {
BtreeMap<?, ?> m = maps.get(name);
public <T extends MVMap<?, ?>> T openMap(String name, String mapType, String keyType, String valueType) {
MVMap<?, ?> m = maps.get(name);
if (m == null) {
String identifier = meta.get("map." + name);
int id;
......@@ -198,11 +197,11 @@ public class BtreeMapStore {
return (T) m;
}
private BtreeMap<?, ?> buildMap(String mapType, int id, String name, String keyType, String valueType, long createVersion) {
private MVMap<?, ?> buildMap(String mapType, int id, String name, String keyType, String valueType, long createVersion) {
DataType k = buildDataType(keyType);
DataType v = buildDataType(valueType);
if (mapType.equals("")) {
return new BtreeMap<Object, Object>(this, id, name, k, v, createVersion);
return new MVMap<Object, Object>(this, id, name, k, v, createVersion);
}
return getMapFactory().buildMap(mapType, this, id, name, k, v, createVersion);
}
......@@ -218,18 +217,18 @@ public class BtreeMapStore {
*
* @return the metadata map
*/
public BtreeMap<String, String> getMetaMap() {
public MVMap<String, String> getMetaMap() {
return meta;
}
private BtreeMap<String, String> getMetaMap(long version) {
private MVMap<String, String> getMetaMap(long version) {
Chunk c = getChunkForVersion(version);
if (c == null) {
throw new IllegalArgumentException("Unknown version: " + version);
}
// TODO avoid duplicate code
c = readChunkHeader(c.start);
BtreeMap<String, String> oldMeta = new BtreeMap<String, String>(this, 0, "old-meta", STRING_TYPE, STRING_TYPE, 0);
MVMap<String, String> oldMeta = new MVMap<String, String>(this, 0, "old-meta", STRING_TYPE, STRING_TYPE, 0);
oldMeta.setRootPos(c.metaRootPos);
return oldMeta;
}
......@@ -255,16 +254,16 @@ public class BtreeMapStore {
* @param valueClass the value class
* @return the map
*/
public <K, V> BtreeMap<K, V> openMap(String name, Class<K> keyClass, Class<V> valueClass) {
public <K, V> MVMap<K, V> openMap(String name, Class<K> keyClass, Class<V> valueClass) {
String keyType = getDataType(keyClass);
String valueType = getDataType(valueClass);
@SuppressWarnings("unchecked")
BtreeMap<K, V> m = (BtreeMap<K, V>) openMap(name, "", keyType, valueType);
MVMap<K, V> m = (MVMap<K, V>) openMap(name, "", keyType, valueType);
return m;
}
void removeMap(String name) {
BtreeMap<?, ?> m = maps.remove(name);
MVMap<?, ?> m = maps.remove(name);
mapsChanged.remove(m);
}
......@@ -294,12 +293,12 @@ public class BtreeMapStore {
*
* @param map the map
*/
void markChanged(BtreeMap<?, ?> map) {
void markChanged(MVMap<?, ?> map) {
mapsChanged.put(map.getId(), map);
}
private void open() {
meta = new BtreeMap<String, String>(this, 0, "meta", STRING_TYPE, STRING_TYPE, 0);
meta = new MVMap<String, String>(this, 0, "meta", STRING_TYPE, STRING_TYPE, 0);
if (fileName == null) {
return;
}
......@@ -391,7 +390,7 @@ public class BtreeMapStore {
try {
log("file close");
file.close();
for (BtreeMap<?, ?> m : New.arrayList(maps.values())) {
for (MVMap<?, ?> m : New.arrayList(maps.values())) {
m.close();
}
meta = null;
......@@ -473,7 +472,7 @@ public class BtreeMapStore {
}
int count = 0;
int maxLength = 1 + 4 + 4 + 8;
for (BtreeMap<?, ?> m : mapsChanged.values()) {
for (MVMap<?, ?> m : mapsChanged.values()) {
if (m == meta || !m.hasUnsavedChanges()) {
continue;
}
......@@ -495,7 +494,7 @@ public class BtreeMapStore {
buff.putInt(0);
buff.putInt(0);
buff.putLong(0);
for (BtreeMap<?, ?> m : mapsChanged.values()) {
for (MVMap<?, ?> m : mapsChanged.values()) {
if (m == meta || !m.hasUnsavedChanges()) {
continue;
}
......@@ -627,7 +626,7 @@ public class BtreeMapStore {
if (mapsChanged.size() == 0) {
return false;
}
for (BtreeMap<?, ?> m : mapsChanged.values()) {
for (MVMap<?, ?> m : mapsChanged.values()) {
if (m.hasUnsavedChanges()) {
return true;
}
......@@ -755,7 +754,7 @@ public class BtreeMapStore {
// to ensure a chunk will be written
// (even if there is nothing to move)
meta.put("chunk." + move.id, move.toString());
BtreeMap<String, String> oldMeta = new BtreeMap<String, String>(this, 0, "old-meta", STRING_TYPE, STRING_TYPE, 0);
MVMap<String, String> oldMeta = new MVMap<String, String>(this, 0, "old-meta", STRING_TYPE, STRING_TYPE, 0);
oldMeta.setRootPos(move.metaRootPos);
Iterator<String> it = oldMeta.keyIterator("map.");
while (it.hasNext()) {
......@@ -766,7 +765,7 @@ public class BtreeMapStore {
String s = oldMeta.get(k);
k = k.substring("map.".length());
@SuppressWarnings("unchecked")
BtreeMap<Object, Object> data = (BtreeMap<Object, Object>) maps.get(k);
MVMap<Object, Object> data = (MVMap<Object, Object>) maps.get(k);
if (data == null) {
continue;
}
......@@ -777,7 +776,7 @@ public class BtreeMapStore {
DataType vt = buildDataType(idTypeList[4]);
long oldDataRoot = Long.parseLong(oldMeta.get("root." + id));
if (oldDataRoot != 0) {
BtreeMap<?, ?> oldData = new BtreeMap<Object, Object>(this, id, "old-" + k, kt, vt, 0);
MVMap<?, ?> oldData = new MVMap<Object, Object>(this, id, "old-" + k, kt, vt, 0);
oldData.setRootPos(oldDataRoot);
Iterator<?> dataIt = oldData.keyIterator(null);
while (dataIt.hasNext()) {
......@@ -812,7 +811,7 @@ public class BtreeMapStore {
* @param pos the page position
* @return the page
*/
Page readPage(BtreeMap<?, ?> map, long pos) {
Page readPage(MVMap<?, ?> map, long pos) {
Page p = cache.get(pos);
if (p == null) {
long filePos = getFilePosition(pos);
......@@ -926,7 +925,7 @@ public class BtreeMapStore {
}
// also, all check referenced by this version
// need to be available in the file
BtreeMap<String, String> oldMeta = getMetaMap(version);
MVMap<String, String> oldMeta = getMetaMap(version);
if (oldMeta == null) {
return false;
}
......@@ -954,7 +953,7 @@ public class BtreeMapStore {
throw new IllegalArgumentException("Unknown version: " + version);
}
// TODO could remove newer temporary pages on rollback
for (BtreeMap<?, ?> m : mapsChanged.values()) {
for (MVMap<?, ?> m : mapsChanged.values()) {
m.rollbackTo(version);
}
for (long v = currentVersion; v >= version; v--) {
......@@ -983,7 +982,7 @@ public class BtreeMapStore {
readMeta();
}
}
for (BtreeMap<?, ?> m : maps.values()) {
for (MVMap<?, ?> m : maps.values()) {
if (m.getCreateVersion() > version) {
m.close();
removeMap(m.getName());
......@@ -1000,7 +999,7 @@ public class BtreeMapStore {
private void revertTemp() {
freedChunks.clear();
for (BtreeMap<?, ?> m : mapsChanged.values()) {
for (MVMap<?, ?> m : mapsChanged.values()) {
m.revertTemp();
}
mapsChanged.clear();
......
......@@ -23,8 +23,8 @@ public interface MapFactory {
* @param createVersion when the map was created
* @return the map
*/
<K, V> BtreeMap<K, V> buildMap(
String mapType, BtreeMapStore store, int id, String name,
<K, V> MVMap<K, V> buildMap(
String mapType, MVStore store, int id, String name,
DataType keyType, DataType valueType, long createVersion);
/**
......
......@@ -27,7 +27,7 @@ public class Page {
private static final int SHARED_KEYS = 1, SHARED_VALUES = 2, SHARED_CHILDREN = 4, SHARED_COUNTS = 8;
private final BtreeMap<?, ?> map;
private final MVMap<?, ?> map;
private final long version;
private long pos;
private long totalCount;
......@@ -49,7 +49,7 @@ public class Page {
private Page[] childrenPages;
private long[] counts;
private Page(BtreeMap<?, ?> map, long version) {
private Page(MVMap<?, ?> map, long version) {
this.map = map;
this.version = version;
}
......@@ -64,7 +64,7 @@ public class Page {
* @param children the children
* @return the page
*/
public static Page create(BtreeMap<?, ?> map, long version,
public static Page create(MVMap<?, ?> map, long version,
int keyCount, Object[] keys,
Object[] values, long[] children, Page[] childrenPages, long[] counts,
long totalCount, int sharedFlags) {
......@@ -89,7 +89,7 @@ public class Page {
* @param buff the source buffer
* @return the page
*/
static Page read(FileChannel file, BtreeMap<?, ?> map,
static Page read(FileChannel file, MVMap<?, ?> map,
long filePos, long pos) {
int maxLength = DataUtils.getPageMaxLength(pos), length = maxLength;
ByteBuffer buff;
......@@ -300,7 +300,7 @@ public class Page {
}
public long getTotalCount() {
if (BtreeMapStore.ASSERT) {
if (MVStore.ASSERT) {
long check = 0;
if (isLeaf()) {
check = keyCount;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论