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