You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by ka...@apache.org on 2009/03/15 12:32:43 UTC
svn commit: r754655 - in /labs/bananadb/trunk: ./
src/main/java/org/apache/labs/bananadb/hashtable/
src/main/java/org/apache/labs/bananadb/hashtable/txn/
src/test/java/org/apache/labs/bananadb/hashtable/
Author: kalle
Date: Sun Mar 15 11:32:43 2009
New Revision: 754655
URL: http://svn.apache.org/viewvc?rev=754655&view=rev
Log:
BananaDB
Configuration factored out from Hashtable to a new interface.
Added:
labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/Configuration.java
labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/ConfigurationImpl.java
labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/DefaultConfiguration.java
Modified:
labs/bananadb/trunk/CHANGES.txt
labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/Benchmark.java
labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/Hashtable.java
labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/txn/Transaction.java
labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestHashtable.java
labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestMultiThreaded.java
labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestRehash.java
labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestTransaction.java
labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestTransactionIsolation.java
labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestValuePartitions.java
Modified: labs/bananadb/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/CHANGES.txt?rev=754655&r1=754654&r2=754655&view=diff
==============================================================================
--- labs/bananadb/trunk/CHANGES.txt (original)
+++ labs/bananadb/trunk/CHANGES.txt Sun Mar 15 11:32:43 2009
@@ -7,6 +7,9 @@
API Changes
+ 1. Configuration factored out from Hashtable to a new interface.
+ (Karl Wettin)
+
File format
Modified: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/Benchmark.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/Benchmark.java?rev=754655&r1=754654&r2=754655&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/Benchmark.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/Benchmark.java Sun Mar 15 11:32:43 2009
@@ -1,22 +1,19 @@
package org.apache.labs.bananadb.hashtable;
-import java.io.IOException;
-import java.io.File;
-import java.util.*;
-
import org.apache.labs.bananadb.hashtable.handlers.IntegerHandler;
import org.apache.labs.bananadb.hashtable.handlers.StringValueHandler;
+import java.io.File;
+import java.io.IOException;
+import java.util.*;
+
/**
* @author kalle
* @since 2009-mar-11 11:52:55
*/
public class Benchmark {
- private Hashtable hashtable;
- private int capacity;
- private KeyClassHandler keyClassHandler;
- private ValueClassHandler valueClassHandler;
+ private Hashtable<Integer, String> hashtable;
public static void main(String[] args) throws Exception {
@@ -27,7 +24,7 @@
int capacityfactor = 8;
for (int items = 1000; items <= 1000000; items *= 1.5) {
- benchmark.test(items, capacityfactor * items, csv);
+ benchmark.bench(items, capacityfactor * items, csv);
System.out.println("-----");
System.out.println(csv.toString());
System.out.println("-----");
@@ -36,9 +33,10 @@
}
}
- public void test(int items, int capacity, StringBuilder csv) throws Exception {
+ public void bench(int items, int capacity, StringBuilder csv) throws Exception {
- this.capacity = capacity;
+ KeyClassHandler<Integer> keyClassHandler;
+ ValueClassHandler<String> valueClassHandler;
System.out.println("Benchmarking with capacity = " + capacity + ", items = " + items);
@@ -48,7 +46,9 @@
keyClassHandler = new IntegerHandler();
valueClassHandler = new StringValueHandler();
- hashtable = new Hashtable(new File("target/benchmark/" + System.currentTimeMillis()), capacity, keyClassHandler, valueClassHandler);
+
+ Configuration<Integer, String> configuration = new ConfigurationImpl<Integer, String>(new File("target/benchmark/" + System.currentTimeMillis()), capacity, keyClassHandler, valueClassHandler);
+ hashtable = new Hashtable<Integer, String>(configuration);
List<Integer> keys = new ArrayList<Integer>(items);
@@ -100,7 +100,7 @@
accessor.close();
}
- private void randomRead(int items, List keys, StringBuilder csv) throws IOException {
+ private void randomRead(int items, List<Integer> keys, StringBuilder csv) throws IOException {
System.out.println("random reading..");
HashtableAccessor accessor = hashtable.createAccessor(true);
Random random = new Random(0);
@@ -109,8 +109,8 @@
long ms = System.currentTimeMillis();
for (int cnt = 0; cnt < items; cnt++) {
- Object key = keys.get(random.nextInt(keys.size()));
- Object value = hashtable.get(accessor, key);
+ Integer key = keys.get(random.nextInt(keys.size()));
+ hashtable.get(accessor, key);
}
double millisSpent = System.currentTimeMillis() - ms;
double millisSpentPerItem = millisSpent / (double) items;
@@ -124,7 +124,7 @@
accessor.close();
}
- private void write(List keys, List values, StringBuilder csv) throws IOException {
+ private void write(List<Integer> keys, List<String> values, StringBuilder csv) throws IOException {
System.out.println("writing..");
HashtableAccessor accessor = hashtable.createAccessor(false);
Added: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/Configuration.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/Configuration.java?rev=754655&view=auto
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/Configuration.java (added)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/Configuration.java Sun Mar 15 11:32:43 2009
@@ -0,0 +1,75 @@
+package org.apache.labs.bananadb.hashtable;
+
+import org.apache.labs.bananadb.lock.LockFactory;
+import org.apache.labs.bananadb.hashtable.txn.Isolation;
+
+import java.io.IOException;
+import java.io.File;
+
+/**
+ * @author kalle
+ * @since 2009-mar-15 11:36:05
+ */
+public interface Configuration<K, V> {
+
+ /**
+ * Number of items you want to fit in the hashtable from the start.
+ *
+ * @return
+ * @see #getAutomaticRehashCapacityGrowFactor()
+ * @see #getAutomaticRehashThreadshold()
+ */
+ public abstract int getInitialCapacity();
+
+ /**
+ * The factor of which to grow the capacity on rehash.
+ *
+ * @return
+ */
+ public abstract double getAutomaticRehashCapacityGrowFactor();
+
+ /**
+ * Ratio of available key posting left required to trigger a rehash at put()-time.
+ * <p/>
+ * The default identified sweetspot
+ * is to have at least 8x greater capacity than items in the hashtable.
+ * <p/>
+ * In order to automatically rehash so you never fill the hashtable to more than 1/8
+ * you have set this value to 1/8 (0.125).
+ *
+ * @return a number greater than 0 and less than 1.
+ */
+ public abstract double getAutomaticRehashThreadshold();
+
+ public abstract KeyClassHandler<K> getKeyClassHandler();
+
+ public abstract ValueClassHandler<V> getValueClassHandler();
+
+ /**
+ * Location of directory containing the data files.
+ * Only one hashtable can exist in a path.
+ * @return
+ */
+ public abstract File getDataPath();
+
+ public abstract LockFactory getLockFactory() throws IOException;
+
+ public abstract long getLockWaitTimeoutMilliseconds();
+
+ public static final int megaByte = 1024 * 1024;
+
+ public abstract int getPartitionByteSize();
+
+ public abstract Isolation<K, V> getDefaultIsolation();
+
+
+
+ public abstract void setInitialCapacity(int initialCapacity);
+ public abstract void setAutomaticRehashCapacityGrowFactor(double automaticRehashCapacityGrowFactor);
+ public abstract void setAutomaticRehashThreadshold(double automaticRehashThreadshold);
+ public abstract void setLockFactory(LockFactory lockFactory);
+ public abstract void setLockWaitTimeoutMilliseconds(long lockWaitTimeoutMilliseconds);
+ public abstract void setPartitionByteSize(int partitionByteSize);
+ public abstract void setDefaultIsolation(Isolation<K, V> defaultIsolation);
+
+}
Added: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/ConfigurationImpl.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/ConfigurationImpl.java?rev=754655&view=auto
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/ConfigurationImpl.java (added)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/ConfigurationImpl.java Sun Mar 15 11:32:43 2009
@@ -0,0 +1,125 @@
+package org.apache.labs.bananadb.hashtable;
+
+import org.apache.labs.bananadb.lock.LockFactory;
+import org.apache.labs.bananadb.hashtable.txn.Isolation;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * @author kalle
+ * @since 2009-mar-15 12:05:10
+ */
+public class ConfigurationImpl<K, V> extends DefaultConfiguration<K, V> {
+
+ private File dataPath;
+ private KeyClassHandler<K> keyClassHandler;
+ private ValueClassHandler<V> valueClassHandler;
+
+ private int initialCapacity;
+ private double automaticRehashCapacityGrowFactor;
+ private double automaticRehashThreadshold;
+ private LockFactory lockFactory;
+ private long lockWaitTimeoutMilliseconds;
+ private int partitionByteSize;
+ private Isolation<K, V> defaultIsolation;
+
+
+ public ConfigurationImpl(File dataPath, KeyClassHandler<K> keyClassHandler, ValueClassHandler<V> valueClassHandler)
+ throws IOException {
+ this.dataPath = dataPath;
+ this.keyClassHandler = keyClassHandler;
+ this.valueClassHandler = valueClassHandler;
+
+ initialCapacity = super.getInitialCapacity();
+ automaticRehashCapacityGrowFactor = super.getAutomaticRehashCapacityGrowFactor();
+ automaticRehashThreadshold = super.getAutomaticRehashThreadshold();
+ lockFactory = super.getLockFactory();
+ lockWaitTimeoutMilliseconds = super.getLockWaitTimeoutMilliseconds();
+ partitionByteSize = super.getPartitionByteSize();
+ defaultIsolation = super.getDefaultIsolation();
+ }
+
+ public ConfigurationImpl(File dataPath, int initialCapacity, KeyClassHandler<K> keyClassHandler, ValueClassHandler<V> valueClassHandler)
+ throws IOException {
+ this.dataPath = dataPath;
+ this.keyClassHandler = keyClassHandler;
+ this.valueClassHandler = valueClassHandler;
+ this.initialCapacity = initialCapacity;
+
+ automaticRehashCapacityGrowFactor = super.getAutomaticRehashCapacityGrowFactor();
+ automaticRehashThreadshold = super.getAutomaticRehashThreadshold();
+ lockFactory = super.getLockFactory();
+ lockWaitTimeoutMilliseconds = super.getLockWaitTimeoutMilliseconds();
+ partitionByteSize = super.getPartitionByteSize();
+ defaultIsolation = super.getDefaultIsolation();
+ }
+
+ public File getDataPath() {
+ return dataPath;
+ }
+
+ public KeyClassHandler<K> getKeyClassHandler() {
+ return keyClassHandler;
+ }
+
+ public ValueClassHandler<V> getValueClassHandler() {
+ return valueClassHandler;
+ }
+
+ public int getInitialCapacity() {
+ return initialCapacity;
+ }
+
+ public double getAutomaticRehashCapacityGrowFactor() {
+ return automaticRehashCapacityGrowFactor;
+ }
+
+ public double getAutomaticRehashThreadshold() {
+ return automaticRehashThreadshold;
+ }
+
+ public LockFactory getLockFactory() {
+ return lockFactory;
+ }
+
+ public long getLockWaitTimeoutMilliseconds() {
+ return lockWaitTimeoutMilliseconds;
+ }
+
+ public int getPartitionByteSize() {
+ return partitionByteSize;
+ }
+
+ public Isolation<K, V> getDefaultIsolation() {
+ return defaultIsolation;
+ }
+
+ public void setInitialCapacity(int initialCapacity) {
+ this.initialCapacity = initialCapacity;
+ }
+
+ public void setAutomaticRehashCapacityGrowFactor(double automaticRehashCapacityGrowFactor) {
+ this.automaticRehashCapacityGrowFactor = automaticRehashCapacityGrowFactor;
+ }
+
+ public void setAutomaticRehashThreadshold(double automaticRehashThreadshold) {
+ this.automaticRehashThreadshold = automaticRehashThreadshold;
+ }
+
+ public void setLockFactory(LockFactory lockFactory) {
+ this.lockFactory = lockFactory;
+ }
+
+ public void setLockWaitTimeoutMilliseconds(long lockWaitTimeoutMilliseconds) {
+ this.lockWaitTimeoutMilliseconds = lockWaitTimeoutMilliseconds;
+ }
+
+ public void setPartitionByteSize(int partitionByteSize) {
+ this.partitionByteSize = partitionByteSize;
+ }
+
+ public void setDefaultIsolation(Isolation<K, V> defaultIsolation) {
+ this.defaultIsolation = defaultIsolation;
+ }
+}
Added: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/DefaultConfiguration.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/DefaultConfiguration.java?rev=754655&view=auto
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/DefaultConfiguration.java (added)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/DefaultConfiguration.java Sun Mar 15 11:32:43 2009
@@ -0,0 +1,46 @@
+package org.apache.labs.bananadb.hashtable;
+
+import org.apache.labs.bananadb.lock.LockFactory;
+import org.apache.labs.bananadb.lock.NativeFSLockFactory;
+import org.apache.labs.bananadb.hashtable.txn.Isolation;
+import org.apache.labs.bananadb.hashtable.txn.IsolationUpdated;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * @author kalle
+ * @since 2009-mar-15 11:47:24
+ */
+public abstract class DefaultConfiguration<K, V> implements Configuration<K, V> {
+
+ public int getInitialCapacity() {
+ return 100000;
+ }
+
+ public double getAutomaticRehashCapacityGrowFactor() {
+ return 1.7d;
+ }
+
+ public double getAutomaticRehashThreadshold() {
+ return 0.125d;
+ }
+
+ public LockFactory getLockFactory() throws IOException {
+ return new NativeFSLockFactory(getDataPath());
+ }
+
+ public long getLockWaitTimeoutMilliseconds() {
+ return 10000;
+ }
+
+ private Isolation<K, V> defaultIsolation = new IsolationUpdated<K, V>();
+ public Isolation<K, V> getDefaultIsolation() {
+ return defaultIsolation;
+ }
+
+ public int getPartitionByteSize() {
+ return megaByte * 100;
+ }
+
+}
Modified: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/Hashtable.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/Hashtable.java?rev=754655&r1=754654&r2=754655&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/Hashtable.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/Hashtable.java Sun Mar 15 11:32:43 2009
@@ -19,8 +19,6 @@
import org.apache.labs.bananadb.lock.Lock;
-import org.apache.labs.bananadb.lock.NativeFSLockFactory;
-import org.apache.labs.bananadb.lock.LockFactory;
import org.apache.labs.bananadb.hashtable.txn.Transaction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -48,7 +46,6 @@
*/
private static final int KEY_POSTINGS_HEADER_BYTE_SIZE = 1024;
- private File path;
private List<Partition> partitions = new ArrayList<Partition>();
private File hashtableFile;
@@ -58,19 +55,12 @@
private static final String keyPostingsFileName = "keys";
private static final String valuePostingsFileName = "values";
- private static final int megaByte = 1024 * 1024;
- private static final int partitionSize = 100 * megaByte;
-
- private KeyClassHandler<K> keyClassHandler;
-
+ private final Configuration<K, V> configuration;
/**
* size of a key posting in the key postings file
*/
private int keyPostingByteSize;
- private ValueClassHandler<V> valueClassHandler;
-
- private long lockWaitTimeoutMilliseconds = 10000;
private Lock writeLock;
/**
@@ -89,11 +79,6 @@
return accessor;
}
- public Hashtable(File path, int capacity, KeyClassHandler<K> keyClassHandler, ValueClassHandler<V> valueClassHandler) throws IOException {
- this(path, capacity, keyClassHandler, valueClassHandler, new NativeFSLockFactory(path));
- }
-
-
/**
* Open or create a hashtable.
* <p/>
@@ -104,29 +89,24 @@
* <p/>
* Milage might vary depending on distribution of key value hash codes.
*
- * @param path Directory where hashtable data is stored. Only one hashtable can fit in this directory.
- * @param initalCapacity Maximum number of entites that fits this hashtable. This value is only valid when creating a new hashtable.
- * @param keyClassHandler
- * @param valueClassHandler
+ * @param configuration
* @throws IOException
*/
- public Hashtable(final File path, final int initalCapacity, final KeyClassHandler<K> keyClassHandler, final ValueClassHandler<V> valueClassHandler, LockFactory lockFactory) throws IOException {
+ public Hashtable(Configuration<K, V> configuration) throws IOException {
- writeLock = lockFactory.makeLock("write");
+ this.configuration = configuration;
- this.keyClassHandler = keyClassHandler;
- this.valueClassHandler = valueClassHandler;
+ writeLock = configuration.getLockFactory().makeLock("write");
- keyPostingByteSize = 4 + 4 + 4 + 4 + 4 + keyClassHandler.getByteSize();
+ keyPostingByteSize = 4 + 4 + 4 + 4 + 4 + getConfiguration().getKeyClassHandler().getByteSize();
- this.path = path;
- if (!path.exists()) {
- log.warn("Creating new path " + path.getAbsolutePath());
- path.mkdirs();
+ if (!getConfiguration().getDataPath().exists()) {
+ log.warn("Creating new path " + getConfiguration().getDataPath().getAbsolutePath());
+ getConfiguration().getDataPath().mkdirs();
}
- hashtableFile = new File(path, hashtableFileName);
- this.keyPostingsFile = new File(path, keyPostingsFileName);
+ hashtableFile = new File(getConfiguration().getDataPath(), hashtableFileName);
+ this.keyPostingsFile = new File(getConfiguration().getDataPath(), keyPostingsFileName);
boolean open;
if (!hashtableFile.exists()) {
@@ -142,10 +122,10 @@
log.info("Creating hashtable file");
- File hashtableFile = new File(path, hashtableFileName);
- format(hashtableFile, HASHTABLE_HEADER_BYTE_SIZE + (initalCapacity * HASHTABLE_RECORD_BYTE_SIZE));
+ File hashtableFile = new File(getConfiguration().getDataPath(), hashtableFileName);
+ format(hashtableFile, HASHTABLE_HEADER_BYTE_SIZE + (getConfiguration().getInitialCapacity() * HASHTABLE_RECORD_BYTE_SIZE));
- HashtableFileHeader hashtableFileHeader = new HashtableFileHeader(HASHTABLE_HEADER_BYTE_SIZE, initalCapacity);
+ HashtableFileHeader hashtableFileHeader = new HashtableFileHeader(HASHTABLE_HEADER_BYTE_SIZE, getConfiguration().getInitialCapacity());
RandomAccessFile raf = new RandomAccessFile(hashtableFile, "rw");
hashtableFileHeader.save(raf);
raf.close();
@@ -153,10 +133,10 @@
log.info("Creating key postings file");
- File keyPostingsFile = new File(path, keyPostingsFileName);
- format(keyPostingsFile, KEY_POSTINGS_HEADER_BYTE_SIZE + (initalCapacity * keyPostingByteSize));
+ File keyPostingsFile = new File(getConfiguration().getDataPath(), keyPostingsFileName);
+ format(keyPostingsFile, KEY_POSTINGS_HEADER_BYTE_SIZE + (getConfiguration().getInitialCapacity() * keyPostingByteSize));
- KeyPostingsFileHeader keyPostingsFileHeader = new KeyPostingsFileHeader(KEY_POSTINGS_HEADER_BYTE_SIZE, 0, KEY_POSTINGS_HEADER_BYTE_SIZE, initalCapacity, 0);
+ KeyPostingsFileHeader keyPostingsFileHeader = new KeyPostingsFileHeader(KEY_POSTINGS_HEADER_BYTE_SIZE, 0, KEY_POSTINGS_HEADER_BYTE_SIZE, getConfiguration().getInitialCapacity(), 0);
raf = new RandomAccessFile(keyPostingsFile, "rw");
keyPostingsFileHeader.save(raf);
raf.close();
@@ -164,7 +144,7 @@
log.info("Creating first value partition file");
Partition partition = new Partition();
- partition.format(partitionSize);
+ partition.format(Hashtable.this.configuration.getPartitionByteSize());
return true;
}
@@ -185,7 +165,7 @@
// open
- File[] valueFiles = path.listFiles(new FileFilter() {
+ File[] valueFiles = getConfiguration().getDataPath().listFiles(new FileFilter() {
public boolean accept(File file) {
return file.isFile() && file.getName().matches(valuePostingsFileName + "\\.[0-9]+");
}
@@ -455,7 +435,7 @@
* @throws IOException
*/
public V put(final HashtableAccessor accessor, final K key, final V value) throws IOException {
- Lock.With<V> with = new Lock.With<V>(writeLock, lockWaitTimeoutMilliseconds) {
+ Lock.With<V> with = new Lock.With<V>(writeLock, configuration.getLockWaitTimeoutMilliseconds()) {
protected V doBody() throws IOException {
return doPut(accessor, key, value);
}
@@ -495,7 +475,7 @@
// write key to buf
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
- keyClassHandler.write(key, new DataOutputStream(baos));
+ getConfiguration().getKeyClassHandler().write(key, new DataOutputStream(baos));
byte[] keyBuf = baos.toByteArray();
baos.close();
@@ -503,7 +483,7 @@
byte[] valueBuf = null;
if (value != null) {
baos = new ByteArrayOutputStream(1024); // todo
- valueClassHandler.write(value, new DataOutputStream(baos));
+ getConfiguration().getValueClassHandler().write(value, new DataOutputStream(baos));
valueBuf = baos.toByteArray();
baos.close();
}
@@ -562,7 +542,7 @@
if (keySize > 0) {
byte[] compareKeyBuf = new byte[keySize];
accessor.getKeyPostingsRAF().read(compareKeyBuf);
- compareKey = keyClassHandler.read(new DataInputStream(new ByteArrayInputStream(compareKeyBuf)));
+ compareKey = getConfiguration().getKeyClassHandler().read(new DataInputStream(new ByteArrayInputStream(compareKeyBuf)));
if (key.equals(compareKey)) {
@@ -630,7 +610,7 @@
ValuePostingsFileHeader valueHeader = new ValuePostingsFileHeader(accessor.getPartitionRAF(partition));
if (valueHeader.bytesLeft < valueBuf.length) {
partition = this.new Partition();
- partition.format(partitionSize);
+ partition.format(configuration.getPartitionByteSize());
for (HashtableAccessor tmp : accessors) {
tmp.registerPartition(partition);
@@ -712,7 +692,7 @@
if (keySize > 0) {
byte[] compareKeyBuf = new byte[keySize];
accessor.getKeyPostingsRAF().read(compareKeyBuf);
- compareKey = keyClassHandler.read(new DataInputStream(new ByteArrayInputStream(compareKeyBuf)));
+ compareKey = getConfiguration().getKeyClassHandler().read(new DataInputStream(new ByteArrayInputStream(compareKeyBuf)));
if (key.equals(compareKey)) {
return true;
}
@@ -768,7 +748,7 @@
if (keySize > 0) {
byte[] compareKeyBuf = new byte[keySize];
accessor.getKeyPostingsRAF().read(compareKeyBuf);
- compareKey = keyClassHandler.read(new DataInputStream(new ByteArrayInputStream(compareKeyBuf)));
+ compareKey = getConfiguration().getKeyClassHandler().read(new DataInputStream(new ByteArrayInputStream(compareKeyBuf)));
if (key.equals(compareKey)) {
V v;
@@ -792,7 +772,7 @@
* @throws IOException
*/
public V remove(final HashtableAccessor accessor, final K key) throws IOException {
- Lock.With<V> with = new Lock.With<V>(writeLock, lockWaitTimeoutMilliseconds) {
+ Lock.With<V> with = new Lock.With<V>(writeLock, configuration.getLockWaitTimeoutMilliseconds()) {
protected V doBody() throws IOException {
return doRemove(accessor, key);
}
@@ -817,7 +797,7 @@
// write key to buf
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
- keyClassHandler.write(key, new DataOutputStream(baos));
+ getConfiguration().getKeyClassHandler().write(key, new DataOutputStream(baos));
byte[] keyBuf = baos.toByteArray();
@@ -851,7 +831,7 @@
if (keySize > 0) {
byte[] compareKeyBuf = new byte[keySize];
accessor.getKeyPostingsRAF().read(compareKeyBuf);
- compareKey = keyClassHandler.read(new DataInputStream(new ByteArrayInputStream(compareKeyBuf)));
+ compareKey = getConfiguration().getKeyClassHandler().read(new DataInputStream(new ByteArrayInputStream(compareKeyBuf)));
if (key.equals(compareKey)) {
V oldValue = null;
@@ -887,7 +867,7 @@
accessor.getKeyPostingsRAF().writeInt(-2); // int value partition
accessor.getKeyPostingsRAF().writeInt(-2); // int value partition offset
accessor.getKeyPostingsRAF().writeInt(-2); // int key length // todo remove
- for (int i = 0; i < keyClassHandler.getByteSize(); i++) {
+ for (int i = 0; i < getConfiguration().getKeyClassHandler().getByteSize(); i++) {
accessor.getKeyPostingsRAF().writeByte(-2); // key
}
@@ -926,7 +906,7 @@
* @throws IOException
*/
public void rehash(final HashtableAccessor accessor, final int capacity) throws IOException {
- Lock.With<V> with = new Lock.With<V>(writeLock, lockWaitTimeoutMilliseconds) {
+ Lock.With<V> with = new Lock.With<V>(writeLock, configuration.getLockWaitTimeoutMilliseconds()) {
protected V doBody() throws IOException {
doRehash(accessor, capacity);
return null;
@@ -970,7 +950,7 @@
int valuePartition;
int valuePartitionOffset;
- byte[] keyBuf = new byte[keyClassHandler.getByteSize()];
+ byte[] keyBuf = new byte[getConfiguration().getKeyClassHandler().getByteSize()];
int keyHash;
RandomAccessFile keyPostingsInput = accessor.getKeyPostingsRAF();
@@ -1107,7 +1087,7 @@
private Partition(int partitionNumber) {
this.partitionNumber = partitionNumber;
- file = new File(path, valuePostingsFileName + "." + partitionNumber);
+ file = new File(getConfiguration().getDataPath(), valuePostingsFileName + "." + partitionNumber);
while (partitions.size() < partitionNumber) {
log.warn("Adding a null partition");
partitions.add(null);
@@ -1147,7 +1127,7 @@
if (length > 0) {
byte[] buf = new byte[length];
raf.read(buf);
- return valueClassHandler.read(new DataInputStream(new ByteArrayInputStream(buf)));
+ return getConfiguration().getValueClassHandler().read(new DataInputStream(new ByteArrayInputStream(buf)));
}
return null;
}
@@ -1376,7 +1356,7 @@
byte[] keyBuf = new byte[accessor.getKeyPostingsRAF().readInt()];
accessor.getKeyPostingsRAF().read(keyBuf);
K key;
- key = keyClassHandler.read(new DataInputStream(new ByteArrayInputStream(keyBuf)));
+ key = getConfiguration().getKeyClassHandler().read(new DataInputStream(new ByteArrayInputStream(keyBuf)));
this.key = key;
V value;
@@ -1399,17 +1379,6 @@
// todo
}
- public KeyClassHandler<K> getKeyClassHandler() {
- return keyClassHandler;
- }
-
- public ValueClassHandler<V> getValueClassHandler() {
- return valueClassHandler;
- }
-
- public File getPath() {
- return path;
- }
public File getHashtableFile() {
return hashtableFile;
@@ -1423,14 +1392,6 @@
return partitions;
}
- public long getLockWaitTimeoutMilliseconds() {
- return lockWaitTimeoutMilliseconds;
- }
-
- public void setLockWaitTimeoutMilliseconds(long lockWaitTimeoutMilliseconds) {
- this.lockWaitTimeoutMilliseconds = lockWaitTimeoutMilliseconds;
- }
-
List<HashtableAccessor> getAccessors() {
return accessors;
@@ -1455,6 +1416,10 @@
super.finalize();
}
+ public Configuration<K, V> getConfiguration() {
+ return configuration;
+ }
+
// transactions
private ThreadLocal<Transaction<K, V>> transactions = new ThreadLocal<Transaction<K, V>>() {
Modified: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/txn/Transaction.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/txn/Transaction.java?rev=754655&r1=754654&r2=754655&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/txn/Transaction.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/hashtable/txn/Transaction.java Sun Mar 15 11:32:43 2009
@@ -16,7 +16,7 @@
private Lock lock = new SingleInstanceLockFactory().makeLock("transaction");
private long lockWaitTimeoutMilliseconds = 60000;
- private Isolation<K, V> isolation = new IsolationUpdated<K, V>();
+ private Isolation<K, V> isolation;
private long hashtableVersion = 0l;
@@ -32,6 +32,7 @@
public Transaction(org.apache.labs.bananadb.hashtable.Hashtable<K, V> hashtable) {
this.hashtable = hashtable;
+ isolation = hashtable.getConfiguration().getDefaultIsolation();
}
public void begin() throws IOException {
Modified: labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestHashtable.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestHashtable.java?rev=754655&r1=754654&r2=754655&view=diff
==============================================================================
--- labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestHashtable.java (original)
+++ labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestHashtable.java Sun Mar 15 11:32:43 2009
@@ -36,7 +36,7 @@
File path = getDirectory("testSimple");
- Hashtable<Integer, String> map = new Hashtable<Integer, String>(path, 100, new IntegerHandler(), new StringValueHandler());
+ Hashtable<Integer, String> map = new Hashtable<Integer, String>(new ConfigurationImpl<Integer, String>(path, 100, new IntegerHandler(), new StringValueHandler()));
HashtableAccessor accessor = map.createAccessor(false);
assertEquals(0, map.size(accessor));
@@ -76,7 +76,7 @@
// close and reopen
- map = new Hashtable<Integer, String>(path, 100, new IntegerHandler(), new StringValueHandler());
+ map = new Hashtable<Integer, String>(new ConfigurationImpl<Integer, String>(path, 100, new IntegerHandler(), new StringValueHandler()));
accessor = map.createAccessor(false);
@@ -103,7 +103,7 @@
//
- map = new Hashtable<Integer, String>(path, 100, new IntegerHandler(), new StringValueHandler());
+ map = new Hashtable<Integer, String>(new ConfigurationImpl<Integer, String>(path, 100, new IntegerHandler(), new StringValueHandler()));
accessor = map.createAccessor(false);
@@ -127,7 +127,7 @@
File path = getDirectory("testNull");
- Hashtable<Integer, String> map = new Hashtable<Integer, String>(path, 100, new IntegerHandler(), new StringValueHandler());
+ Hashtable<Integer, String> map = new Hashtable<Integer, String>(new ConfigurationImpl<Integer, String>(path, 100, new IntegerHandler(), new StringValueHandler()));
HashtableAccessor accessor = map.createAccessor(false);
assertFalse(map.containsKey(accessor, 0));
Modified: labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestMultiThreaded.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestMultiThreaded.java?rev=754655&r1=754654&r2=754655&view=diff
==============================================================================
--- labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestMultiThreaded.java (original)
+++ labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestMultiThreaded.java Sun Mar 15 11:32:43 2009
@@ -67,8 +67,11 @@
public void testThreaded() throws Exception {
File path = getDirectory("testThreaded");
- Hashtable<Integer, String> map = new Hashtable<Integer, String>(path, 40000, new IntegerHandler(), new StringValueHandler());
- map.setLockWaitTimeoutMilliseconds(60000);
+ Configuration<Integer, String> configuration = new ConfigurationImpl<Integer, String>(path, 40000, new IntegerHandler(), new StringValueHandler());
+ configuration.setLockWaitTimeoutMilliseconds(60000);
+
+ Hashtable<Integer, String> map = new Hashtable<Integer, String>(configuration);
+
AtomicInteger pk = new AtomicInteger(0);
List<Thread> threads = new ArrayList<Thread>();
Modified: labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestRehash.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestRehash.java?rev=754655&r1=754654&r2=754655&view=diff
==============================================================================
--- labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestRehash.java (original)
+++ labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestRehash.java Sun Mar 15 11:32:43 2009
@@ -34,7 +34,7 @@
public void testAutomaticRehash() throws Exception {
File path = getDirectory("testAutomaticRehash");
- Hashtable<Integer, String> map = new Hashtable<Integer, String>(path, 100, new IntegerHandler(), new StringValueHandler());
+ Hashtable<Integer, String> map = new Hashtable<Integer, String>(new ConfigurationImpl<Integer, String>(path, 100, new IntegerHandler(), new StringValueHandler()));
HashtableAccessor accessor = map.createAccessor(false);
for (int i = 0; i < 200; i++) {
@@ -53,7 +53,7 @@
File path = getDirectory("testRehash");
- Hashtable<Integer, String> map = new Hashtable<Integer, String>(path, 100, new IntegerHandler(), new StringValueHandler());
+ Hashtable<Integer, String> map = new Hashtable<Integer, String>(new ConfigurationImpl<Integer, String>(path, 100, new IntegerHandler(), new StringValueHandler()));
HashtableAccessor accessor = map.createAccessor(false);
map.put(accessor, 0, "hello world");
Modified: labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestTransaction.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestTransaction.java?rev=754655&r1=754654&r2=754655&view=diff
==============================================================================
--- labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestTransaction.java (original)
+++ labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestTransaction.java Sun Mar 15 11:32:43 2009
@@ -20,7 +20,7 @@
File path = getDirectory("testTransaction");
- Hashtable<Integer, String> map = new Hashtable<Integer, String>(path, 100, new IntegerHandler(), new StringValueHandler());
+ Hashtable<Integer, String> map = new Hashtable<Integer, String>(new ConfigurationImpl<Integer, String>(path, 100, new IntegerHandler(), new StringValueHandler()));
HashtableAccessor accessor = map.createAccessor(false);
Modified: labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestTransactionIsolation.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestTransactionIsolation.java?rev=754655&r1=754654&r2=754655&view=diff
==============================================================================
--- labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestTransactionIsolation.java (original)
+++ labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestTransactionIsolation.java Sun Mar 15 11:32:43 2009
@@ -17,18 +17,19 @@
@Test
public void testLastCommitWinsConflicts() throws Exception {
File path = getDirectory("testLastCommitWinsConflicts");
- Hashtable<Integer, String> map = new Hashtable<Integer, String>(path, 100, new IntegerHandler(), new StringValueHandler());
+
+ Configuration<Integer, String> configuration = new ConfigurationImpl<Integer, String>(path, 100, new IntegerHandler(), new StringValueHandler());
+ configuration.setDefaultIsolation(new IsolationLastCommitWins<Integer, String>());
+ Hashtable<Integer, String> map = new Hashtable<Integer, String>(configuration);
map.getTxn().begin();
map.getTxn().put(0, "foo");
map.getTxn().commit();
Transaction<Integer, String> txn1 = new Transaction<Integer, String>(map);
- txn1.setIsolation(new IsolationLastCommitWins<Integer, String>());
txn1.begin();
Transaction<Integer, String> txn2 = new Transaction<Integer, String>(map);
- txn2.setIsolation(new IsolationLastCommitWins<Integer, String>());
txn2.begin();
txn1.remove(0);
@@ -41,7 +42,6 @@
assertEquals(0, txn2.size());
Transaction<Integer, String> txn3 = new Transaction<Integer, String>(map);
- txn3.setIsolation(new IsolationLastCommitWins<Integer, String>());
txn3.begin();
txn3.put(0, "bar");
@@ -64,18 +64,19 @@
@Test
public void testDeadlockingConflicts() throws Exception {
File path = getDirectory("testDeadlockingConflicts");
- Hashtable<Integer, String> map = new Hashtable<Integer, String>(path, 100, new IntegerHandler(), new StringValueHandler());
+
+ Configuration<Integer, String> configuration = new ConfigurationImpl<Integer, String>(path, 100, new IntegerHandler(), new StringValueHandler());
+ configuration.setDefaultIsolation(new IsolationDeadlocking<Integer, String>());
+ Hashtable<Integer, String> map = new Hashtable<Integer, String>(configuration);
map.getTxn().begin();
map.getTxn().put(0, "foo");
map.getTxn().commit();
Transaction<Integer, String> txn1 = new Transaction<Integer, String>(map);
- txn1.setIsolation(new IsolationDeadlocking<Integer, String>());
txn1.begin();
Transaction<Integer, String> txn2 = new Transaction<Integer, String>(map);
- txn2.setIsolation(new IsolationDeadlocking<Integer, String>());
txn2.begin();
txn1.remove(0);
@@ -86,7 +87,6 @@
txn1.commit();
Transaction<Integer, String> txn3 = new Transaction<Integer, String>(map);
- txn3.setIsolation(new IsolationDeadlocking<Integer, String>());
txn3.begin();
txn3.put(0, "bar");
txn3.commit();
@@ -108,18 +108,19 @@
@Test
public void testUpdatedConflicts() throws Exception {
File path = getDirectory("testUpdatedConflicts");
- Hashtable<Integer, String> map = new Hashtable<Integer, String>(path, 100, new IntegerHandler(), new StringValueHandler());
+ Configuration<Integer, String> configuration = new ConfigurationImpl<Integer, String>(path, 100, new IntegerHandler(), new StringValueHandler());
+ configuration.setDefaultIsolation(new IsolationUpdated<Integer, String>());
+ Hashtable<Integer, String> map = new Hashtable<Integer, String>(configuration);
+
map.getTxn().begin();
map.getTxn().put(0, "foo");
map.getTxn().commit();
Transaction<Integer, String> txn1 = new Transaction<Integer, String>(map);
- txn1.setIsolation(new IsolationUpdated<Integer, String>());
txn1.begin();
Transaction<Integer, String> txn2 = new Transaction<Integer, String>(map);
- txn2.setIsolation(new IsolationUpdated<Integer, String>());
txn2.begin();
txn1.remove(0);
@@ -132,7 +133,6 @@
assertEquals(0, txn2.size());
Transaction<Integer, String> txn3 = new Transaction<Integer, String>(map);
- txn3.setIsolation(new IsolationUpdated<Integer, String>());
txn3.begin();
txn3.put(0, "bar");
Modified: labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestValuePartitions.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestValuePartitions.java?rev=754655&r1=754654&r2=754655&view=diff
==============================================================================
--- labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestValuePartitions.java (original)
+++ labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/hashtable/TestValuePartitions.java Sun Mar 15 11:32:43 2009
@@ -38,7 +38,9 @@
File path = getDirectory("testPartitions");
- Hashtable<Integer, String> map = new Hashtable<Integer, String>(path, 10000, new IntegerHandler(), new StringValueHandler());
+ Configuration<Integer, String> configuration = new ConfigurationImpl<Integer, String>(path, 10000, new IntegerHandler(), new StringValueHandler());
+ configuration.setPartitionByteSize(Configuration.megaByte * 100);
+ Hashtable<Integer, String> map = new Hashtable<Integer, String>(configuration);
HashtableAccessor accessor = map.createAccessor(false);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org