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/27 18:31:24 UTC

svn commit: r759274 - in /labs/bananadb/trunk/src: main/java/org/apache/labs/bananadb/entity/ main/java/org/apache/labs/bananadb/entity/isolation/ main/java/org/apache/labs/bananadb/store/ main/java/org/apache/labs/bananadb/store/data/ main/java/org/ap...

Author: kalle
Date: Fri Mar 27 17:31:23 2009
New Revision: 759274

URL: http://svn.apache.org/viewvc?rev=759274&view=rev
Log:
Banana DB  

Sequences

Added:
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/FilebasedSequenceManager.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/UnsafeSequenceManager.java
    labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/store/sequence/
    labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/store/sequence/UnitTestSequenceManager.java
      - copied, changed from r757279, labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/StaticSequenceManager.java
Removed:
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/StaticSequenceManager.java
Modified:
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/Entity.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/EntityStore.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/PrimaryIndex.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/Transaction.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/isolation/IsolationDeadlocking.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/isolation/IsolationLastCommitWins.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/isolation/IsolationUpdated.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/Store.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/data/FileHandler.java
    labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/SequenceManager.java
    labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/entity/EntityStoreTest.java
    labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/entity/TestEntityStore.java
    labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/store/StoreTest.java

Modified: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/Entity.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/Entity.java?rev=759274&r1=759273&r2=759274&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/Entity.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/Entity.java Fri Mar 27 17:31:23 2009
@@ -33,4 +33,8 @@
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.TYPE)
 public @interface Entity {
+
+  public String sequence() default "[unassigned]";
+
+
 }

Modified: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/EntityStore.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/EntityStore.java?rev=759274&r1=759273&r2=759274&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/EntityStore.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/EntityStore.java Fri Mar 27 17:31:23 2009
@@ -61,7 +61,7 @@
 
 
   @SuppressWarnings("unchecked")
-  public <PK, V> PrimaryIndex<PK, V> getPrimaryIndex(Class<PK> keyClass, Class<V> entityClass) {
+  public <PK, V> PrimaryIndex<PK, V> getPrimaryIndex(Class<PK> keyClass, Class<V> entityClass) throws IOException {
     PrimaryIndex<PK, V> primaryIndex = primaryIndexByEntityClass.get(entityClass);
     if (primaryIndex == null) {
 
@@ -153,4 +153,12 @@
     return transactions.get();
   }
 
+  @Override
+  public void close() throws IOException {
+    // todo abort any transaction, or perhaps allow them to commit?!
+    for (PrimaryIndex primaryIndex : primaryIndexByEntityClass.values()) {
+      primaryIndex.close();
+    }
+    super.close();
+  }
 }

Modified: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/PrimaryIndex.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/PrimaryIndex.java?rev=759274&r1=759273&r2=759274&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/PrimaryIndex.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/PrimaryIndex.java Fri Mar 27 17:31:23 2009
@@ -437,5 +437,8 @@
     return result;
   }
 
+  public void close() throws IOException {    
+    getPrimaryKeySequence().close();
+  }
 
 }

Modified: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/Transaction.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/Transaction.java?rev=759274&r1=759273&r2=759274&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/Transaction.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/Transaction.java Fri Mar 27 17:31:23 2009
@@ -36,13 +36,14 @@
 
   private Isolation isolation;
 
-  private long commitVersion = 0l;
+  private long storeRevisionTransactionIsSynchronizedWith = 0l;
 
   private Accessor accessor;
 
   private Map<PrimaryIndex.CachedKey, PrimaryIndex.CachedEntity> created;
   private Map<PrimaryIndex.CachedKey, PrimaryIndex.CachedEntity> replaced;
 
+
   /**
    * contains the value in the hashtable when it was removed
    */
@@ -66,7 +67,7 @@
 
     Metadata.Header mdh = new Metadata.Header();
     accessor.getMetadata().readHeader(mdh);
-    commitVersion = mdh.getCommitVersion();
+    storeRevisionTransactionIsSynchronizedWith = mdh.getCommitVersion();
   }
 
   public void commit() throws IOException {
@@ -112,8 +113,8 @@
   }
 
 
-  public long getCommitVersion() {
-    return commitVersion;
+  public long getStoreRevisionTransactionIsSynchronizedWith() {
+    return storeRevisionTransactionIsSynchronizedWith;
   }
 
   public Accessor getAccessor() {
@@ -136,8 +137,8 @@
     return entityStore;
   }
 
-  public void setCommitVersion(long commitVersion) {
-    this.commitVersion = commitVersion;
+  public void setStoreRevisionTransactionIsSynchronizedWith(long storeRevisionTransactionIsSynchronizedWith) {
+    this.storeRevisionTransactionIsSynchronizedWith = storeRevisionTransactionIsSynchronizedWith;
   }
 
   public Isolation getIsolation() {

Modified: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/isolation/IsolationDeadlocking.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/isolation/IsolationDeadlocking.java?rev=759274&r1=759273&r2=759274&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/isolation/IsolationDeadlocking.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/isolation/IsolationDeadlocking.java Fri Mar 27 17:31:23 2009
@@ -21,9 +21,9 @@
     Metadata.Header mdh = new Metadata.Header();
     txn.getAccessor().getMetadata().readHeader(mdh);
 
-    if (txn.getCommitVersion() != mdh.getCommitVersion()) {
+    if (txn.getStoreRevisionTransactionIsSynchronizedWith() != mdh.getCommitVersion()) {
 
-      txn.setCommitVersion(mdh.getCommitVersion());
+      txn.setStoreRevisionTransactionIsSynchronizedWith(mdh.getCommitVersion());
 
       Set<Map.Entry<PrimaryIndex.CachedKey, PrimaryIndex.CachedEntity>> deadlocks = new HashSet<Map.Entry<PrimaryIndex.CachedKey, PrimaryIndex.CachedEntity>>();
 

Modified: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/isolation/IsolationLastCommitWins.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/isolation/IsolationLastCommitWins.java?rev=759274&r1=759273&r2=759274&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/isolation/IsolationLastCommitWins.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/isolation/IsolationLastCommitWins.java Fri Mar 27 17:31:23 2009
@@ -23,9 +23,9 @@
     Metadata.Header mdh = new Metadata.Header();
     txn.getAccessor().getMetadata().readHeader(mdh);
 
-    if (txn.getCommitVersion() != mdh.getCommitVersion()) {
+    if (txn.getStoreRevisionTransactionIsSynchronizedWith() != mdh.getCommitVersion()) {
 
-      txn.setCommitVersion(mdh.getCommitVersion());
+      txn.setStoreRevisionTransactionIsSynchronizedWith(mdh.getCommitVersion());
 
       // todo if this contains a deleted entity and the entity already is deleted in the hashtable
       // todo then the size is -1 off per such occurance.

Modified: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/isolation/IsolationUpdated.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/isolation/IsolationUpdated.java?rev=759274&r1=759273&r2=759274&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/isolation/IsolationUpdated.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/isolation/IsolationUpdated.java Fri Mar 27 17:31:23 2009
@@ -21,9 +21,9 @@
     Metadata.Header mdh = new Metadata.Header();
     txn.getAccessor().getMetadata().readHeader(mdh);
 
-    if (txn.getCommitVersion() != mdh.getCommitVersion()) {
+    if (txn.getStoreRevisionTransactionIsSynchronizedWith() != mdh.getCommitVersion()) {
 
-      txn.setCommitVersion(mdh.getCommitVersion());
+      txn.setStoreRevisionTransactionIsSynchronizedWith(mdh.getCommitVersion());
 
       for (Iterator<Map.Entry<PrimaryIndex.CachedKey, PrimaryIndex.CachedEntity>> it = txn.getRemoved().entrySet().iterator(); it.hasNext();) {
         Map.Entry<PrimaryIndex.CachedKey, PrimaryIndex.CachedEntity> e = it.next();

Modified: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/Store.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/Store.java?rev=759274&r1=759273&r2=759274&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/Store.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/Store.java Fri Mar 27 17:31:23 2009
@@ -26,7 +26,8 @@
 import org.apache.labs.bananadb.store.data.Metadata;
 import org.apache.labs.bananadb.store.data.FileHandler;
 import org.apache.labs.bananadb.store.sequence.SequenceManager;
-import org.apache.labs.bananadb.store.sequence.StaticSequenceManager;
+import org.apache.labs.bananadb.store.sequence.UnsafeSequenceManager;
+import org.apache.labs.bananadb.store.sequence.FilebasedSequenceManager;
 
 import java.io.File;
 import java.io.IOException;
@@ -38,6 +39,8 @@
 /**
  * todo make sure deleted postings are the last postings in all hash code chains!
  *
+ * todo comsider implementing lock per file rather than store wide lock! but make sure it makes sense!
+ *
  * @author kalle
  * @since 2009-mar-16 15:34:56
  */
@@ -46,7 +49,7 @@
   private static final Log log = new Log(Store.class);
 
   private Configuration configuration;
-  private SequenceManager sequenceManager = new StaticSequenceManager();
+  private SequenceManager sequenceManager;
   private List<Accessor> accessors = new ArrayList<Accessor>();
 
   public Store(File dataPath) throws IOException {
@@ -67,6 +70,8 @@
         throw new IOException("Could not create directory " + getConfiguration().getDataPath().getAbsolutePath());
       }
     }
+    File sequencePath = new File(configuration.getDataPath(), "seq");
+    sequenceManager = new FilebasedSequenceManager(sequencePath, configuration.getLockFactory(), configuration.getLockWaitTimeoutMilliseconds());
   }
 
   public SequenceManager getSequenceManager() {
@@ -92,7 +97,9 @@
     for (Accessor accessor : new ArrayList<Accessor>(accessors)) {
       accessor.close();
     }
+    sequenceManager.close();
     log.info("Store has been closed.");
+
   }
 
   private void validateKey(byte[] key) {
@@ -914,4 +921,8 @@
 
 
   }
+
+  public void setSequenceManager(SequenceManager sequenceManager) {
+    this.sequenceManager = sequenceManager;
+  }
 }

Modified: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/data/FileHandler.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/data/FileHandler.java?rev=759274&r1=759273&r2=759274&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/data/FileHandler.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/data/FileHandler.java Fri Mar 27 17:31:23 2009
@@ -39,9 +39,9 @@
   private File file;
   private RandomAccessFile RAF;
   private String access;
-  private Lock lock;
 
-  private H header;
+  /** not implemented yet, future lock per file rather than system wide lock at write time */
+  private Lock lock;
 
   protected FileHandler(File directory, int id, String suffix, String access, LockFactory lockFactory) throws IOException {
     StringBuilder sb = new StringBuilder(15);

Added: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/FilebasedSequenceManager.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/FilebasedSequenceManager.java?rev=759274&view=auto
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/FilebasedSequenceManager.java (added)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/FilebasedSequenceManager.java Fri Mar 27 17:31:23 2009
@@ -0,0 +1,190 @@
+package org.apache.labs.bananadb.store.sequence;
+
+import org.apache.labs.bananadb.store.lock.Lock;
+import org.apache.labs.bananadb.store.lock.LockFactory;
+
+import java.util.NoSuchElementException;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.concurrent.atomic.AtomicLong;
+import java.io.File;
+import java.io.RandomAccessFile;
+import java.io.IOException;
+
+/**
+ * @author kalle
+ * @since 2009-mar-23 16:39:45
+ */
+public class FilebasedSequenceManager extends SequenceManager {
+
+  private File path;
+  private LockFactory lockFactory;
+  private long lockWaitTimeout;
+
+  private Map<String, Sequence> sequences = new HashMap<String, Sequence>();
+
+  public void close() throws IOException {
+    for (Sequence sequence : sequences.values()) {
+      sequence.close();
+    }
+  }
+
+  public FilebasedSequenceManager(File path, LockFactory lockFactory, long lockWaitTimeout) throws IOException {
+    this.path = path;
+    this.lockFactory = lockFactory;
+    this.lockWaitTimeout = lockWaitTimeout;
+    if (!path.exists()) {
+      if (!path.mkdirs()) {
+        throw new IOException("Could not create path " + path.getAbsolutePath());
+      }
+    }
+  }
+
+  public Sequence.ReservedSequenceRange reserve(String name, int requestedSize) throws IOException {
+    return sequences.get(name).reserve(requestedSize);
+  }
+
+  public <T> Sequence<T> getOrRegisterSequence(Class<T> valueType, String name) throws IOException {
+    Sequence<T> sequence = sequences.get(name);
+    if (sequence == null) {
+      synchronized (this) {
+        sequence = sequences.get(name);
+        if (sequence == null) {
+          sequence = sequenceFactory(valueType, name);
+          sequences.put(name, sequence);
+        }
+      }
+    }
+    return sequence;
+  }
+
+  public <T> Sequence<T> sequenceFactory(Class<T> valueType, String name) throws IOException {
+    if (Long.class == valueType) {
+      return (Sequence<T>) new LongSequence(name);
+    } else {
+      throw new UnsupportedOperationException();
+    }
+  }
+
+  public abstract class Sequence<T> extends SequenceManager.Sequence<T> {
+
+
+    protected Sequence(String name) {
+      super(name);
+    }
+
+    protected final void release(ReservedSequenceRange<T> reservation) {
+      // ignored  todo
+    }
+
+
+  }
+
+  public abstract class NumbericSequence<T> extends Sequence<T> {
+
+    private File file;
+    protected final RandomAccessFile RAF;
+    protected final Lock lock;
+
+    protected NumbericSequence(String name) throws IOException {
+      super(name);
+      file = new File(path, name + ".seq");
+      lock = lockFactory.makeLock(file.getName());
+      boolean create = !file.exists();
+
+      if (create) {
+        RAF = new Lock.With<RandomAccessFile>(lock, lockWaitTimeout) {
+          public RandomAccessFile doBody() throws IOException {
+            if (!file.exists()) {
+              file.createNewFile();
+              RandomAccessFile RAF = new RandomAccessFile(file, "rw");
+              initializeHeader(RAF);
+              return RAF;
+            } else {
+              return new RandomAccessFile(file, "rw");
+            }
+          }
+        }.run();
+      } else {
+        RAF = new RandomAccessFile(file, "rw");
+      }
+    }
+
+    public void close() throws IOException {
+      RAF.close();
+    }
+
+    protected abstract void initializeHeader(RandomAccessFile headerRAF) throws IOException;
+
+    public abstract class NumericRange<T> extends ReservedSequenceRange<T> {
+      private final int size;
+      protected final T start;
+      protected final T end;
+
+      protected NumericRange(int size, T start, T end) {
+        this.size = size;
+        this.start = start;
+        this.end = end;
+      }
+
+      public int size() {
+        return size;
+      }
+    }
+  }
+
+  public class LongSequence extends FilebasedSequenceManager.NumbericSequence<Long> {
+
+    public LongSequence(String name) throws IOException {
+      super(name);
+    }
+
+    protected void initializeHeader(RandomAccessFile headerRAF) throws IOException {
+      headerRAF.seek(0);
+      headerRAF.writeLong(1l);
+    }
+
+    public Class<Long> getValueType() {
+      return Long.class;
+    }
+
+    public ReservedSequenceRange<Long> reserve(final int requestedSize) throws IOException {
+      long start = new Lock.With<Long>(lock, lockWaitTimeout) {
+        public Long doBody() throws IOException {
+          RAF.seek(0);
+          long next = RAF.readLong();
+          RAF.seek(0);
+          RAF.writeLong(next + requestedSize);
+          return next;
+        }
+      }.run();
+
+      return this.new LongRange(start, start + requestedSize);
+    }
+
+
+    public class LongRange extends NumericRange<Long> {
+
+      private AtomicLong nextValue;
+
+      protected LongRange(long start, long end) {
+        super((int) (end - start), start, end);
+        nextValue = new AtomicLong(start);
+      }
+
+      public synchronized Long nextValue() throws NoSuchElementException {
+        if (!hasNextValue()) {
+          throw new NoSuchElementException();
+        }
+        return nextValue.getAndIncrement();
+      }
+
+      public boolean hasNextValue() {
+        return nextValue.get() <= end;
+      }
+    }
+
+  }
+
+
+}

Modified: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/SequenceManager.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/SequenceManager.java?rev=759274&r1=759273&r2=759274&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/SequenceManager.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/SequenceManager.java Fri Mar 27 17:31:23 2009
@@ -1,6 +1,7 @@
 package org.apache.labs.bananadb.store.sequence;
 
 import java.io.IOException;
+import java.util.NoSuchElementException;
 
 /**
  * @author kalle
@@ -8,14 +9,17 @@
  */
 public abstract class SequenceManager {
 
+  public abstract void close() throws IOException;
 
-  public abstract SequenceManager.Sequence.ReservedSequenceRange reserve(String name, int requestedSize);
-  public abstract <T> Sequence<T> getOrRegisterSequence(Class<T> valueType, String name);
+  public abstract SequenceManager.Sequence.ReservedSequenceRange reserve(String name, int requestedSize) throws IOException;
+  public abstract <T> Sequence<T> getOrRegisterSequence(Class<T> valueType, String name) throws IOException;
 
-  public abstract <T> Sequence<T> sequenceFactory(Class<T> valueType, String name);
+  public abstract <T> Sequence<T> sequenceFactory(Class<T> valueType, String name) throws IOException;
 
   public abstract class Sequence<T> {
 
+    public abstract void close() throws IOException;
+
     private String name;
 
     protected Sequence(String name) {
@@ -26,17 +30,27 @@
       return name;
     }
 
+    public void setName(String name) {
+      this.name = name;
+    }
+
     public T next() throws IOException {
       return reserve(1).nextValue();
     }
 
     public abstract Class<T> getValueType();
-    public abstract ReservedSequenceRange<T> reserve(int requestedSize);
+    public abstract ReservedSequenceRange<T> reserve(int requestedSize) throws IOException;
+
+    /**
+     * if applicable to sequence manager implementation,
+     * then the unused reserved values are queued up to get reused.
+     * @param reservation 
+     */
     protected abstract void release(ReservedSequenceRange<T> reservation);
 
     public abstract class ReservedSequenceRange<T> {
       public abstract int size();
-      public abstract T nextValue();
+      public abstract T nextValue() throws NoSuchElementException;
       public abstract boolean hasNextValue();
     }
 

Added: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/UnsafeSequenceManager.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/UnsafeSequenceManager.java?rev=759274&view=auto
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/UnsafeSequenceManager.java (added)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/UnsafeSequenceManager.java Fri Mar 27 17:31:23 2009
@@ -0,0 +1,123 @@
+package org.apache.labs.bananadb.store.sequence;
+
+import java.util.Map;
+import java.util.HashMap;
+import java.util.NoSuchElementException;
+import java.util.concurrent.atomic.AtomicLong;
+import java.io.IOException;
+
+/**
+ * identities based on system time
+ *
+ * @author kalle
+ * @since 2009-mar-23 01:41:16
+ */
+public class UnsafeSequenceManager extends SequenceManager {
+
+  private Map<String, Sequence> sequences = new HashMap<String, Sequence>();
+
+  public void close() throws IOException {
+    for (Sequence sequence : sequences.values()) {
+      sequence.close();
+    }
+  }
+
+  public SequenceManager.Sequence.ReservedSequenceRange reserve(String name, int requestedSize) throws IOException {
+    return sequences.get(name).reserve(requestedSize);
+  }
+
+  @SuppressWarnings("unchecked")
+  public <T> Sequence<T> getOrRegisterSequence(Class<T> valueType, String name) {
+    Sequence<T> sequence = sequences.get(name);
+    if (sequence == null) {
+      sequences.put(name, sequence = sequenceFactory(valueType, name));
+    }
+    return sequence;
+  }
+
+  @SuppressWarnings("unchecked")
+  public <T> Sequence<T> sequenceFactory(Class<T> valueType, String name) {
+    if (valueType == Long.class) {
+      return (Sequence<T>) new LongSequence(name);
+    }
+    throw new UnsupportedOperationException("Unregistred value type class " + valueType.getName());
+  }
+
+
+  public class LongSequence extends Sequence<Long> {
+
+    public void close() throws IOException {
+      
+    }
+
+    public LongSequence(String name) {
+      super(name);
+    }
+
+    public Class<Long> getValueType() {
+      return Long.class;
+    }
+
+    public synchronized ReservedSequenceRange<Long> reserve(int requestedSize) {
+
+      long start = System.currentTimeMillis();
+
+      try {
+        Thread.sleep(requestedSize + 5);
+      } catch (InterruptedException ie) {
+        throw new RuntimeException(ie);
+      }
+
+      return new LongRange(start, start + requestedSize);
+    }
+
+    protected void release(ReservedSequenceRange<Long> reservation) {
+      // ignored
+    }
+
+    public class LongRange extends ReservedSequenceRange<Long> {
+
+      private long start;
+      private long end;
+      private long size;
+      private AtomicLong current;
+
+      protected LongRange(long start, long end) {
+        this.start = start;
+        this.end = end;
+        size = end - start;
+        current = new AtomicLong(start);
+      }
+
+      public boolean hasNextValue() {
+        return current.get() < end;
+      }
+
+      public Long nextValue() {
+        if (!hasNextValue()) {
+          throw new NoSuchElementException();
+        }
+        return current.incrementAndGet();
+      }
+
+      public int size() {
+        return (int) size;
+      }
+
+      @Override
+      public String toString() {
+        return "LongRange{" +
+            "start=" + start +
+            ", end=" + end +
+            ", size=" + size +
+            ", current=" + current +
+            '}';
+      }
+    }
+
+  }
+}
+
+
+
+

Modified: labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/entity/EntityStoreTest.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/entity/EntityStoreTest.java?rev=759274&r1=759273&r2=759274&view=diff
==============================================================================
--- labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/entity/EntityStoreTest.java (original)
+++ labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/entity/EntityStoreTest.java Fri Mar 27 17:31:23 2009
@@ -1,9 +1,9 @@
 package org.apache.labs.bananadb.entity;
 
 import org.apache.labs.bananadb.store.*;
+import org.apache.labs.bananadb.store.sequence.UnitTestSequenceManager;
 
 import java.io.IOException;
-import java.io.File;
 
 /**
  * @author kalle
@@ -16,8 +16,16 @@
     entityStore.getConfiguration().setHashCodesPartitionByteSize(Configuration.megaByte);
     entityStore.getConfiguration().setKeysPartitionByteSize(Configuration.megaByte);
     entityStore.getConfiguration().setValuesPartitionByteSize(Configuration.megaByte);
+    entityStore.open();
     return entityStore;
   }
 
 
+  protected EntityStore reopen(EntityStore entityStore) throws IOException {
+    entityStore.close();
+    entityStore = new EntityStore(entityStore.getConfiguration());
+    entityStore.open();
+    return entityStore;
+  }
+
 }

Modified: labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/entity/TestEntityStore.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/entity/TestEntityStore.java?rev=759274&r1=759273&r2=759274&view=diff
==============================================================================
--- labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/entity/TestEntityStore.java (original)
+++ labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/entity/TestEntityStore.java Fri Mar 27 17:31:23 2009
@@ -18,7 +18,6 @@
  */
 
 
-import org.apache.labs.bananadb.store.StoreTest;
 import org.junit.Test;
 
 import java.io.Serializable;
@@ -46,7 +45,17 @@
     withSharedSequenceNamesB.put(b = new WithSharedSequenceNameB());
     assertEquals(new Long(2l), b.getPK());
 
+    store.getTxn().abort();    
+
+    store = reopen(store);
+
+    withSharedSequenceNamesA = store.getPrimaryIndex(Long.class, WithSharedSequenceNameA.class);
+    withSharedSequenceNamesB = store.getPrimaryIndex(Long.class, WithSharedSequenceNameB.class);
+    store.getTxn().begin();
+    withSharedSequenceNamesA.put(a = new WithSharedSequenceNameA());
+    assertEquals(new Long(3l), a.getPK());
     store.getTxn().abort();
+    store.close();
   }
 
   @Test

Modified: labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/store/StoreTest.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/store/StoreTest.java?rev=759274&r1=759273&r2=759274&view=diff
==============================================================================
--- labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/store/StoreTest.java (original)
+++ labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/store/StoreTest.java Fri Mar 27 17:31:23 2009
@@ -36,7 +36,6 @@
   private File path;
 
   protected StoreTest() {
-    System.setProperty("bananadb.never.turn.this.on", "on");
     path = new File("target/test-data/stores");
     if (!path.exists() && !path.mkdirs()) {
       throw new RuntimeException("Could not create path " + path);

Copied: labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/store/sequence/UnitTestSequenceManager.java (from r757279, labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/StaticSequenceManager.java)
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/store/sequence/UnitTestSequenceManager.java?p2=labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/store/sequence/UnitTestSequenceManager.java&p1=labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/StaticSequenceManager.java&r1=757279&r2=759274&rev=759274&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/StaticSequenceManager.java (original)
+++ labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/store/sequence/UnitTestSequenceManager.java Fri Mar 27 17:31:23 2009
@@ -4,6 +4,7 @@
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.concurrent.atomic.AtomicLong;
+import java.io.IOException;
 
 /**
  * For tests only!
@@ -11,11 +12,17 @@
  * @author kalle
  * @since 2009-mar-22 15:17:25
  */
-public class StaticSequenceManager extends SequenceManager {
+public class UnitTestSequenceManager extends SequenceManager {
 
   private Map<String, Sequence> sequences = new HashMap<String, Sequence>();
 
-  public SequenceManager.Sequence.ReservedSequenceRange reserve(String name, int requestedSize) {
+  public void close() throws IOException {
+    for (Sequence sequence : sequences.values()) {
+      sequence.close();
+    }
+  }
+
+  public SequenceManager.Sequence.ReservedSequenceRange reserve(String name, int requestedSize) throws IOException {
     return sequences.get(name).reserve(requestedSize);
   }
 
@@ -38,6 +45,9 @@
 
   public class LongSequence extends SequenceManager.Sequence<Long> {
 
+    public void close() throws IOException {
+    }
+
     protected LongSequence(String name) {
       super(name);
     }
@@ -49,12 +59,8 @@
     }
 
     public ReservedSequenceRange<Long> reserve(int requestedSize) {
-      if (!"on".equalsIgnoreCase(System.getProperty("bananadb.never.turn.this.on", "off"))) {
-        throw new RuntimeException("This is the dummy sequence manager, used only for test cases! Values are not stored and has limited features. To turn it off, set system property bananadb.never.turn.this.on=on");
-      } else {
-        long start = value.getAndAdd(requestedSize);
-        return new LongRange(start, start + requestedSize);
-      }
+      long start = value.getAndAdd(requestedSize);
+      return new LongRange(start, start + requestedSize);
     }
 
     protected void release(ReservedSequenceRange<Long> reservation) {



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org