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