package com.alibaba.doris.dataserver.store.bdb;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import junit.framework.TestCase;
import com.alibaba.doris.common.data.Key;
import com.alibaba.doris.common.data.Pair;
import com.alibaba.doris.common.data.Value;
import com.alibaba.doris.common.data.impl.KeyImpl;
import com.alibaba.doris.common.data.impl.ValueImpl;
import com.alibaba.doris.common.data.util.ByteUtils;
import com.alibaba.doris.dataserver.store.ClosableIterator;
import com.alibaba.doris.dataserver.store.Storage;
import com.alibaba.doris.dataserver.store.StorageConfig;
import com.alibaba.doris.dataserver.store.StorageDriver;
/**
* @author ajun Email:jack.yuj@alibaba-inc.com
*/
public class BDBStorageTest extends TestCase {
@Override
protected void setUp() throws Exception {
try {
driver = (StorageDriver) BDBStorageDriver.class.newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
StorageConfig config = getStorageConfig();
driver.init(config);
storage = driver.createStorage();
storage.open();
}
@Override
protected void tearDown() throws Exception {
storage.close();
}
public StorageConfig getStorageConfig() {
StorageConfig config = new StorageConfig();
config.setPropertiesFile("bdb_storage_test_mock.properties");
config.setSize(5000);
config.setStorageDriverClass("com.alibaba.doris.dataserver.store.bdb.BDBStorageDriver");
config.setStorageTypeClass("");
return config;
}
protected StorageDriver getStorageDriver() {
return driver;
}
protected Storage getStorage() {
return storage;
}
protected Key createKey(String key) {
return new KeyImpl(100, key, 0);
}
protected Value createValue(String value) {
return new ValueImpl(ByteUtils.stringToByte(value), (new Date()).getTime());
}
protected void clear() {
String path = this.getClass().getClassLoader().getResource("").getPath();
File f = new File(path);
for (File file : f.listFiles()) {
if (file.getName().contains(".jdb")) {
file.delete();
} else if (file.getName().contains("je.")) {
file.delete();
}
}
}
private StorageDriver driver;
private Storage storage;
public void testGetAndSet() {
Storage storage = getStorage();
Key key = createKey("test");
Value value = createValue("啊荤万科假日巍峨峻岭");
storage.set(key, value);
Value vNew = storage.get(key);
assertNotNull(vNew);
assertTrue(value.equals(vNew));
}
public void testDelete() {
Storage storage = getStorage();
Key key = createKey("test");
Value value = createValue("啊荤万科假日巍峨峻岭");
storage.set(key, value);
Value vNew = storage.get(key);
assertNotNull(vNew);
assertTrue(value.equals(vNew));
storage.delete(key);
vNew = storage.get(key);
assertNull(vNew);
}
public void t1estCas() {
Thread t1 = new ThreadCas();
Thread t2 = new ThreadSet();
t1.start();
t2.start();
}
private class ThreadCas extends Thread {
@Override
public void run() {
Storage storage = getStorage();
Key key = createKey("test");
Value value = createValue("啊荤万科假日巍峨峻岭");
storage.set(key, value, true);
}
}
private class ThreadSet extends Thread {
@Override
public void run() {
Storage storage = getStorage();
Key key = createKey("test");
Value value = createValue("cas");
storage.set(key, value);
}
}
public void testGetAll() {
Storage storage = getStorage();
Map<Key, Value> map = new HashMap<Key, Value>();
List<Key> keyList = new ArrayList<Key>();
for (int i = 0; i < 10; i++) {
Key key = createKey("test" + i);
Value value = createValue("啊荤万科假日巍峨峻岭" + i);
map.put(key, value);
keyList.add(key);
storage.set(key, value);
}
Map<Key, Value> mapNew = storage.getAll(keyList);
assertNotNull(mapNew);
Iterator<Entry<Key, Value>> itr = mapNew.entrySet().iterator();
while (itr.hasNext()) {
Entry<Key, Value> evtry = itr.next();
Value vNew = evtry.getValue();
Key key = evtry.getKey();
Value aspect = map.get(key);
assertTrue(vNew.equals(aspect));
}
}
public void testIterator() {
clear();
int len = 10;
Storage storage = getStorage();
for (int i = 0; i < len; i++) {
Key key = createKey("test" + i);
Value value = createValue("啊荤万科假日巍峨峻岭" + i);
storage.set(key, value);
}
ClosableIterator<Pair> testPairIterator = (ClosableIterator<Pair>) storage.iterator();
assertNotNull(testPairIterator);
int count = 0;
while (testPairIterator.hasNext()) {
Pair p = testPairIterator.next();
assertNotNull(p);
assertNotNull(p.getKey());
assertNotNull(p.getValue());
count++;
}
testPairIterator.close();
assertTrue(count >= len);
}
public void testIterator2() {
int len = 10;
Storage storage = getStorage();
// for (int i = 0; i < len; i++) {
// Key key = createKey("test" + i);
// Value value = createValue("啊荤万科假日巍峨峻岭" + i);
// storage.set(key, value);
// }
List<Integer> nodeList = new ArrayList<Integer>(virtualNode.length);
for (int i : virtualNode) {
nodeList.add(i);
}
ClosableIterator<Pair> testPairIterator = (ClosableIterator<Pair>) storage.iterator(nodeList);
assertNotNull(testPairIterator);
int count = 0;
while (testPairIterator.hasNext()) {
Pair p = testPairIterator.next();
assertNotNull(p);
assertNotNull(p.getKey());
assertNotNull(p.getValue());
count++;
}
testPairIterator.close();
assertTrue(count >= len);
}
public void testRemoveDataBase() {
Storage storage = getStorage();
List<Integer> nodeList = new ArrayList<Integer>(virtualNode.length);
for (int i : virtualNode) {
nodeList.add(i);
}
ClosableIterator<Pair> testPairIterator = (ClosableIterator<Pair>) storage.iterator(nodeList);
assertNotNull(testPairIterator);
Set<Integer> vnodeSet = new HashSet<Integer>();
while (testPairIterator.hasNext()) {
Pair p = testPairIterator.next();
assertNotNull(p);
assertNotNull(p.getKey());
vnodeSet.add(p.getKey().getVNode());
}
testPairIterator.close();
List<Integer> vnodeList = new ArrayList<Integer>(vnodeSet);
storage.delete(vnodeList);
testPairIterator = (ClosableIterator<Pair>) storage.iterator(vnodeList);
assertNotNull(testPairIterator);
assertFalse(testPairIterator.hasNext());
testPairIterator.close();
}
private int[] virtualNode = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
}