[jboss-svn-commits] JBL Code SVN: r28944 - in labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main: java/uk/ac/ncl/sdia/a8905943/handle and 11 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sat Aug 15 15:00:31 EDT 2009
Author: whitingjr
Date: 2009-08-15 15:00:30 -0400 (Sat, 15 Aug 2009)
New Revision: 28944
Added:
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/FieldReadParameter.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/FieldWriteParameter.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/ReadUncommittedIsolationImpl.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/resources/cluster-cfg.xml
Removed:
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/spec/History.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/spec/ObjectStoreManager.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/spec/ResourceManager.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/annotation/STMEntity.java
Modified:
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/factory/TransactionFactory.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/handle/TransactedObjectReference.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/impl/TransactionImpl.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/AbstractIsolation.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/Isolation.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/RepeatableReadIsolationImpl.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/factory/IsolationFactory.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/Car.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/persistence/jdbc/STMConnection.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/persistence/xa/STMXADatasourceImpl.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/spec/STMTransaction.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/STM.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/tracker/TransactionWriteSet.java
Log:
Added implementation to isolation.
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/factory/TransactionFactory.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/factory/TransactionFactory.java 2009-08-15 07:47:53 UTC (rev 28943)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/factory/TransactionFactory.java 2009-08-15 19:00:30 UTC (rev 28944)
@@ -1,5 +1,7 @@
package uk.ac.ncl.sdia.a8905943.factory;
+import java.util.concurrent.atomic.AtomicLong;
+
import uk.ac.ncl.sdia.a8905943.impl.TransactionImpl;
import uk.ac.ncl.sdia.a8905943.spec.STMTransaction;
@@ -12,11 +14,15 @@
{
private static final TransactionFactory factory = new TransactionFactory();
private final static ThreadLocal<STMTransaction> currentTransaction = new ThreadLocal<STMTransaction>();
+ /**
+ * Used for version numbering transactions
+ */
+ public static final AtomicLong version = new AtomicLong();
public static STMTransaction getCurrentTransaction(boolean create)
{
if (null == currentTransaction.get() && create)
{
- currentTransaction.set(new TransactionImpl());
+ currentTransaction.set(new TransactionImpl(version.incrementAndGet()));
}
return currentTransaction.get();
}
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/handle/TransactedObjectReference.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/handle/TransactedObjectReference.java 2009-08-15 07:47:53 UTC (rev 28943)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/handle/TransactedObjectReference.java 2009-08-15 19:00:30 UTC (rev 28944)
@@ -6,18 +6,21 @@
*/
package uk.ac.ncl.sdia.a8905943.handle;
-public class TransactedObjectReference<T>
+public class TransactedObjectReference
{
final Long lookupIdentity;
- final T value;
+ private Object value;
+ private Long nextIdentity;
+ private long version;
- public TransactedObjectReference(Long identity, T value)
+ public TransactedObjectReference(Long identity, Object value, long version)
{
lookupIdentity = identity;
this.value = value;
+ this.version = version;
}
- public T getValue()
+ public Object getValue()
{
return value;
}
@@ -26,4 +29,29 @@
{
return lookupIdentity;
}
+
+ public Long getNextIdentity()
+ {
+ return nextIdentity;
+ }
+
+ public void setNextIdentity(Long nextIdentity)
+ {
+ this.nextIdentity = nextIdentity;
+ }
+
+ public long getVersion()
+ {
+ return version;
+ }
+
+ public void setVersion(long version)
+ {
+ this.version = version;
+ }
+
+ public void setValue(Object value)
+ {
+ this.value = value;
+ }
}
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/impl/TransactionImpl.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/impl/TransactionImpl.java 2009-08-15 07:47:53 UTC (rev 28943)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/impl/TransactionImpl.java 2009-08-15 19:00:30 UTC (rev 28944)
@@ -6,74 +6,52 @@
*/
package uk.ac.ncl.sdia.a8905943.impl;
-import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import java.util.HashMap;
+import java.util.Map;
-import javax.transaction.RollbackException;
import javax.transaction.Status;
-import javax.transaction.Synchronization;
-import javax.transaction.SystemException;
-import javax.transaction.Transaction;
-import javax.transaction.xa.XAResource;
-import javax.transaction.xa.Xid;
import org.apache.log4j.Logger;
-import uk.ac.ncl.sdia.a8905943.model.TransactionStatus;
+import uk.ac.ncl.sdia.a8905943.handle.TransactedObjectReference;
+import uk.ac.ncl.sdia.a8905943.isolation.FieldReadParameter;
+import uk.ac.ncl.sdia.a8905943.isolation.FieldWriteParameter;
+import uk.ac.ncl.sdia.a8905943.isolation.Isolation;
import uk.ac.ncl.sdia.a8905943.spec.STMTransaction;
-import uk.ac.ncl.sdia.a8905943.tracker.TransactionReadSet;
-import uk.ac.ncl.sdia.a8905943.tracker.TransactionWriteSet;
+
/**
* The purpose of this object is to perform the transaction functionality.
*
* @author <a href="whitingjr at hotmail.com">Jeremy Whiting</a>
* @version $Revision: 1.1 $
*/
-public class TransactionImpl implements STMTransaction{
+public class TransactionImpl implements STMTransaction
+{
// status available for inspection
- private volatile int status = Status.STATUS_NO_TRANSACTION;
+ private volatile int status = Status.STATUS_NO_TRANSACTION;
+
+ protected final Map<Long, TransactedObjectReference> deferredReads = new HashMap<Long, TransactedObjectReference>();
+
+ protected final Map<Long, TransactedObjectReference> deferredWrites = new HashMap<Long, TransactedObjectReference>();
+
/**
- * the statusModifer should be used for updating the status field. Any part of the system that is responsible
- * for transitioning a transaction through it's states should use this field.
+ * The version number of this transaction
*/
- private final AtomicReferenceFieldUpdater<Transaction, TransactionStatus> statusModifier = AtomicReferenceFieldUpdater.newUpdater(Transaction.class, TransactionStatus.class, "status");
- /**
- * Nested writes are a record of writes performed by nested classes. Access to them is necessary so this transaction is not isolated completely.
- */
- private final TransactionWriteSet nestedWrites = new TransactionWriteSet();
- /**
- * This TM system deferred update to synchronize updates. This field stores all the updates performed by this transaction.
- */
- private final TransactionWriteSet writeSet = new TransactionWriteSet();
- /**
- * This TM needs to keep it's readset for validation to check for conflicts.
- */
- private final TransactionReadSet readSet = new TransactionReadSet();
- private static final Logger logger = Logger.getLogger(TransactionImpl.class);
-
- @Override
- public void commit() {
-
- // make object versioned fields visible to all other transactions (depending on isolation)
- // make versioned collection objects fields visible to all other transactions (depending on isolation)
- // change status
- // notify all transactions committed, cleanup reader and writer traces.
- }
-
+ private final long version;
- @Override
- public STMTransaction readField()
+ private static final Logger logger = Logger.getLogger(TransactionImpl.class);
+
+ private Isolation isolation;
+
+ public void commit()
{
- // FIXME readField
- return null;
- }
- @Override
- public STMTransaction writeField()
- {
- // FIXME writeField
- return null;
+ // make object versioned fields visible to all other transactions (depending on isolation)
+ // make versioned collection objects fields visible to all other transactions (depending on isolation)
+ // change status
+ // notify all transactions committed, cleanup reader and writer traces.
}
@Override
@@ -83,12 +61,37 @@
{
logger.info("Starting transaction.");
}
+ if (null == this.isolation)
+ {
+ throw new RuntimeException("The STM transaction is not ready to be started.");
+ }
+ this.status = Status.STATUS_ACTIVE;
}
-
- public TransactionImpl()
+
+ public TransactionImpl(long version)
{
- //TODO: incomplete
+ this.version = version;
}
+ @Override
+ public Object read(FieldReadParameter fieldRead)
+ {
+ fieldRead.setReads(this.deferredReads);
+ return this.isolation.read(fieldRead);
+ }
+
+ @Override
+ public Boolean write(FieldWriteParameter fieldWrite)
+ {
+ fieldWrite.setWrites(this.deferredWrites);
+ fieldWrite.setVersion(this.version);
+ return this.isolation.write(fieldWrite);
+ }
+
+ @Override
+ public void setIsolationLevel(Isolation isolation)
+ {
+ this.isolation = isolation;
+ }
+
}
-
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/AbstractIsolation.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/AbstractIsolation.java 2009-08-15 07:47:53 UTC (rev 28943)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/AbstractIsolation.java 2009-08-15 19:00:30 UTC (rev 28944)
@@ -1,20 +1,22 @@
package uk.ac.ncl.sdia.a8905943.isolation;
-import uk.ac.ncl.sdia.a8905943.spec.History;
-import uk.ac.ncl.sdia.a8905943.tracker.TransactionReadSet;
import uk.ac.ncl.sdia.a8905943.tracker.TransactionWriteSet;
public abstract class AbstractIsolation implements Isolation {
- protected History readhistory;
- protected History writeHistory;
-
public TransactionWriteSet getNestedTransactionWriteSet()
{
return null;
}
+ @Override
+ public boolean supportsRepeatableRead()
+ {// default behaviour
+ return false;
+ }
+ @Override
+ public boolean supportsWriteSkew()
+ {// default behaviour
+ return false;
+ }
- public abstract Object read( TransactionReadSet currentReadSet, TransactionReadSet nested, Long lookupIdentity);
-
- public abstract Object write(TransactionWriteSet currentWriteSet, Object newObject);
}
Added: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/FieldReadParameter.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/FieldReadParameter.java (rev 0)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/FieldReadParameter.java 2009-08-15 19:00:30 UTC (rev 28944)
@@ -0,0 +1,76 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package uk.ac.ncl.sdia.a8905943.isolation;
+
+import java.util.Map;
+
+import uk.ac.ncl.sdia.a8905943.handle.TransactedObjectReference;
+
+public class FieldReadParameter
+{
+ private Map<Long, TransactedObjectReference> reads;
+
+ private Map<Long, TransactedObjectReference> writes;
+
+ private Map<Long, TransactedObjectReference> objectStore;
+
+ private long handle;
+
+ public FieldReadParameter(Map<Long, TransactedObjectReference> reads, Map<Long, TransactedObjectReference> writes,
+ Map<Long, TransactedObjectReference> objectStore, long handle)
+ {
+ this.reads = reads;
+ this.writes = writes;
+ this.objectStore = objectStore;
+ this.handle = handle;
+ }
+
+ public Map<Long, TransactedObjectReference> getReads()
+ {
+ return reads;
+ }
+
+ public void setReads(Map<Long, TransactedObjectReference> reads)
+ {
+ this.reads = reads;
+ }
+
+ public Map<Long, TransactedObjectReference> getWrites()
+ {
+ return writes;
+ }
+
+ public void setWrites(Map<Long, TransactedObjectReference> writes)
+ {
+ this.writes = writes;
+ }
+
+ public Map<Long, TransactedObjectReference> getObjectStore()
+ {
+ return objectStore;
+ }
+
+ public void setObjectStore(Map<Long, TransactedObjectReference> objectStore)
+ {
+ this.objectStore = objectStore;
+ }
+
+ public long getHandle()
+ {
+ return handle;
+ }
+
+ public void setHandle(long handle)
+ {
+ this.handle = handle;
+ }
+
+ public FieldReadParameter(long handle)
+ {
+ this.handle = handle;
+ }
+}
\ No newline at end of file
Added: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/FieldWriteParameter.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/FieldWriteParameter.java (rev 0)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/FieldWriteParameter.java 2009-08-15 19:00:30 UTC (rev 28944)
@@ -0,0 +1,92 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package uk.ac.ncl.sdia.a8905943.isolation;
+
+import java.util.Map;
+
+import uk.ac.ncl.sdia.a8905943.handle.TransactedObjectReference;
+
+public class FieldWriteParameter
+{
+ private Map<Long, TransactedObjectReference> writes;
+
+ private Map<Long, TransactedObjectReference> objectStore;
+
+ private long handle;
+
+ private Object newObject;
+
+ private long version;
+
+ public FieldWriteParameter(Map<Long, TransactedObjectReference> writes,
+ Map<Long, TransactedObjectReference> objectStore, long handle, Object newObject)
+ {
+ this.writes = writes;
+ this.objectStore = objectStore;
+ this.handle = handle;
+ this.newObject = newObject;
+ }
+
+ public Map<Long, TransactedObjectReference> getWrites()
+ {
+ return writes;
+ }
+
+ public void setWrites(Map<Long, TransactedObjectReference> writes)
+ {
+ this.writes = writes;
+ }
+
+ public Map<Long, TransactedObjectReference> getObjectStore()
+ {
+ return objectStore;
+ }
+
+ public void setObjectStore(Map<Long, TransactedObjectReference> objectStore)
+ {
+ this.objectStore = objectStore;
+ }
+
+ public long getHandle()
+ {
+ return handle;
+ }
+
+ public void setHandle(long handle)
+ {
+ this.handle = handle;
+ }
+
+ public Object getNewObject()
+ {
+ return newObject;
+ }
+
+ public void setNewObject(Object newObject)
+ {
+ this.newObject = newObject;
+ }
+ public FieldWriteParameter()
+ {
+ }
+
+ public FieldWriteParameter(long handle, Object newObject)
+ {
+ this.handle = handle;
+ this.newObject = newObject;
+ }
+
+ public long getVersion()
+ {
+ return version;
+ }
+
+ public void setVersion(long version)
+ {
+ this.version = version;
+ }
+}
\ No newline at end of file
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/Isolation.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/Isolation.java 2009-08-15 07:47:53 UTC (rev 28943)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/Isolation.java 2009-08-15 19:00:30 UTC (rev 28944)
@@ -1,11 +1,23 @@
package uk.ac.ncl.sdia.a8905943.isolation;
+
+
public interface Isolation {
-
public boolean supportsRepeatableRead();
public boolean supportsWriteSkew();
-
+ public Object read(FieldReadParameter fieldRead);
+
+ /**
+ * Use this method to write a field object to the transaction.
+ * This system is a deferred update system so a reference to
+ * the
+ * @param fieldWrite TODO
+ * @param currentWriteSet
+ *
+ * @return
+ */
+ public Boolean write(FieldWriteParameter fieldWrite);
}
Added: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/ReadUncommittedIsolationImpl.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/ReadUncommittedIsolationImpl.java (rev 0)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/ReadUncommittedIsolationImpl.java 2009-08-15 19:00:30 UTC (rev 28944)
@@ -0,0 +1,43 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package uk.ac.ncl.sdia.a8905943.isolation;
+
+import uk.ac.ncl.sdia.a8905943.tracker.TransactionReadSet;
+import uk.ac.ncl.sdia.a8905943.tracker.TransactionWriteSet;
+
+public class ReadUncommittedIsolationImpl extends AbstractIsolation
+{
+
+ @Override
+ public Object read(TransactionReadSet currentReadSet, TransactionReadSet nested, Long lookupIdentity)
+ {
+ // FIXME read
+ return null;
+ }
+
+ @Override
+ public Object write(TransactionWriteSet currentWriteSet, Object newObject)
+ {
+ // FIXME write
+ return null;
+ }
+
+ @Override
+ public boolean supportsRepeatableRead()
+ {
+ // FIXME supportsRepeatableRead
+ return false;
+ }
+
+ @Override
+ public boolean supportsWriteSkew()
+ {
+ // FIXME supportsWriteSkew
+ return false;
+ }
+
+}
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/RepeatableReadIsolationImpl.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/RepeatableReadIsolationImpl.java 2009-08-15 07:47:53 UTC (rev 28943)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/RepeatableReadIsolationImpl.java 2009-08-15 19:00:30 UTC (rev 28944)
@@ -1,11 +1,8 @@
package uk.ac.ncl.sdia.a8905943.isolation;
-import java.util.HashMap;
-import java.util.Map;
+import org.apache.log4j.Logger;
-import uk.ac.ncl.sdia.a8905943.spec.History;
-import uk.ac.ncl.sdia.a8905943.tracker.TransactionReadSet;
-import uk.ac.ncl.sdia.a8905943.tracker.TransactionWriteSet;
+import uk.ac.ncl.sdia.a8905943.handle.TransactedObjectReference;
/**
* This object defines the behaviour for reads and writes for a
@@ -17,86 +14,68 @@
* @version $Revision: 1.1 $
*/
public final class RepeatableReadIsolationImpl extends AbstractIsolation{
-
+ private static final Logger logger = Logger.getLogger(RepeatableReadIsolationImpl.class);
// fast lookups
- protected final Map<Long, Object> reads = new HashMap<Long, Object>();
- protected final Map<Long, Object> writes = new HashMap<Long, Object>();
-
- @Override
- public boolean supportsRepeatableRead() {
- return true;
- }
-
- @Override
- public boolean supportsWriteSkew()
- {
- return false;
- }
-
+
/**
* Read the value requested. First check for version previously read and
* return it. If not found then read the shared value, add to have read list.
+ * @param transaction
+ *
+ * @return
*/
- public Object read(Long lookupIdentity)
+ public Object read(FieldReadParameter fieldRead)
{
Object returnValue = null;
- /* check for the value initially in the writes, then reads otherwise
- * retrieve the shared version*/
- if (writes.containsKey(lookupIdentity))
+ //
+ /* first check the transaction, is the object in the write then read list. if not get from object store
+ * and add to read list */
+ if (fieldRead.getWrites().containsKey(fieldRead.getHandle()))
{// found
- returnValue = writes.get(lookupIdentity);
+ returnValue = fieldRead.getWrites().get(fieldRead.getHandle()).getValue();
}
- else if (reads.containsKey(lookupIdentity))
- {
- returnValue = writes.get(lookupIdentity);
+ else if (fieldRead.getReads().containsKey(fieldRead.getHandle()))
+ {// has been read beforehand, return the previous value
+ returnValue = fieldRead.getReads().get(fieldRead.getHandle()).getValue();
}
else
{// not found in this transaction, read shared value
- //TODO: read from shared store, first check to see if it has been locked, pass responsibility to
// retrieve from shared memory back to caller
+ if (fieldRead.getObjectStore().containsKey(fieldRead.getHandle()))
+ {
+ returnValue = fieldRead.getObjectStore().get(fieldRead.getHandle() );
+ }
+ else
+ {
+ logger.warn("Field not found.");
+ }
}
return returnValue;
}
-
- /**
- * Read the value requested. First check for version previously read and
- * return it. If not found then read the shared value, add to have read list.
- */
@Override
- public Object read(TransactionReadSet currentTransaction, TransactionReadSet nested, Long lookupIdentity)
+ public Boolean write(FieldWriteParameter fieldWrite)
{
- Object returnValue = null;
- /* check for the value initially in the writes, then reads otherwise
- * retrieve the shared version*/
- if (writes.containsKey(lookupIdentity))
- {// found
- returnValue = writes.get(lookupIdentity);
- }
- else if (reads.containsKey(lookupIdentity))
+ Boolean returnValue = null;
+ if (null != fieldWrite.getNewObject())
{
- returnValue = writes.get(lookupIdentity);
- }
- else
- {// not found in this transaction, read shared value
- //TODO: read from shared store, first check to see if it has been locked, pass responsibility to
- // retrieve from shared memory back to caller
- }
- return returnValue;
- }
-
- @Override
- public Object write(TransactionWriteSet currentWriteSet, Object newObject)
- {
- Object returnValue = null;
- if (null != newObject)
- {
+ TransactedObjectReference fieldReference = null;
+ if (fieldWrite.getWrites().containsKey(fieldWrite.getHandle()))
+ {// this field has been written before, overwrite it
+ fieldReference = fieldWrite.getWrites().get(fieldWrite.getHandle());
+ }
+ else
+ {// new write of field
+ fieldReference = new TransactedObjectReference(fieldWrite.getHandle(), fieldWrite.getNewObject(), fieldWrite.getVersion());
+ fieldWrite.getWrites().put(fieldWrite.getHandle(), fieldReference);
+ }
+ returnValue = Boolean.TRUE;
}
else
- {
+ {// place in the store a transacted object representing a null
}
- return null;
+ return returnValue;
}
}
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/factory/IsolationFactory.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/factory/IsolationFactory.java 2009-08-15 07:47:53 UTC (rev 28943)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/isolation/factory/IsolationFactory.java 2009-08-15 19:00:30 UTC (rev 28944)
@@ -1,35 +1,40 @@
package uk.ac.ncl.sdia.a8905943.isolation.factory;
+import java.sql.Connection;
-
import uk.ac.ncl.sdia.a8905943.isolation.Isolation;
-import uk.ac.ncl.sdia.a8905943.isolation.IsolationLevel;
import uk.ac.ncl.sdia.a8905943.isolation.ReadCommittedIsolationImpl;
+import uk.ac.ncl.sdia.a8905943.isolation.ReadUncommittedIsolationImpl;
import uk.ac.ncl.sdia.a8905943.isolation.RepeatableReadIsolationImpl;
import uk.ac.ncl.sdia.a8905943.isolation.SerializableIsolationImpl;
public class IsolationFactory {
- public static Isolation createIsolationLevel(IsolationLevel level)
+ public static Isolation createIsolationLevel( int level)
{
Isolation returnValue = null;
- if (level.equals(IsolationLevel.READ_COMMITTED))
- {
- returnValue = new ReadCommittedIsolationImpl();
- }
- else if (level.equals(IsolationLevel.REPEATABLE_READ))
- {
- returnValue = new RepeatableReadIsolationImpl();
- }
- else if (level.equals(IsolationLevel.SERIALIZABLE))
- {
- returnValue = new SerializableIsolationImpl();
- }
- else
- {
- throw new UnsupportedOperationException("The system does not support the isolation level ["+level.toString()+"] requested.");
- }
+ switch (level)
+ {
+ case Connection.TRANSACTION_NONE :
+
+ break;
+ case Connection.TRANSACTION_READ_COMMITTED :
+ returnValue = new ReadCommittedIsolationImpl();
+ break;
+ case Connection.TRANSACTION_READ_UNCOMMITTED :
+ returnValue = new ReadUncommittedIsolationImpl();
+ break;
+ case Connection.TRANSACTION_REPEATABLE_READ :
+ returnValue = new RepeatableReadIsolationImpl();
+ break;
+ case Connection.TRANSACTION_SERIALIZABLE :
+ returnValue = new SerializableIsolationImpl();
+ break;
+ default :
+ throw new UnsupportedOperationException("The system does not support the isolation level ["+level+"] requested.");
+ }
+
return returnValue;
}
}
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/Car.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/Car.java 2009-08-15 07:47:53 UTC (rev 28943)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/Car.java 2009-08-15 19:00:30 UTC (rev 28944)
@@ -1,15 +1,18 @@
package uk.ac.ncl.sdia.a8905943.model;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
import javax.persistence.Id;
-import uk.ac.ncl.sdia.a8905943.stm.annotation.STMEntity;
- at STMEntity
+ at Entity
public class Car {
- // fields should be private
@Id
+ @GeneratedValue
private Long id;
- private String make;
+
+
+ private String make;
public Long getId()
{
return id;
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/persistence/jdbc/STMConnection.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/persistence/jdbc/STMConnection.java 2009-08-15 07:47:53 UTC (rev 28943)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/persistence/jdbc/STMConnection.java 2009-08-15 19:00:30 UTC (rev 28944)
@@ -371,6 +371,7 @@
{
logger.debug("STMConnection.setTransactionIsolation called.");
}
+ this.xaConnection.getSTM().setCurrentTransactionIsolation(level);
}
@Override
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/persistence/xa/STMXADatasourceImpl.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/persistence/xa/STMXADatasourceImpl.java 2009-08-15 07:47:53 UTC (rev 28943)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/persistence/xa/STMXADatasourceImpl.java 2009-08-15 19:00:30 UTC (rev 28944)
@@ -6,6 +6,7 @@
*/
package uk.ac.ncl.sdia.a8905943.persistence.xa;
+import java.io.IOException;
import java.io.PrintWriter;
import java.io.Serializable;
import java.sql.SQLException;
@@ -22,11 +23,13 @@
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.log4j.Logger;
+import org.infinispan.manager.CacheManager;
+import org.infinispan.manager.DefaultCacheManager;
import uk.ac.ncl.sdia.a8905943.persistence.jdbc.STMDataSource;
import uk.ac.ncl.sdia.a8905943.stm.STM;
-public class STMXADatasourceImpl extends STMDataSource implements XADataSource, Serializable, Referenceable
+public final class STMXADatasourceImpl extends STMDataSource implements XADataSource, Serializable, Referenceable
{
private String serverName = StringUtils.EMPTY;
private String databaseName = StringUtils.EMPTY;
@@ -36,6 +39,7 @@
private static final String DATABASE_NAME = "databaseName";
private static final ConcurrentHashMap<String, STM> stmDatabases = new ConcurrentHashMap<String, STM>();
private static final Logger logger = Logger.getLogger(STMXADatasourceImpl.class );
+ private CacheManager cacheManager ; // heavy weight object
/** The serialVersionUID */
private static final long serialVersionUID = 2341586268344164513L;
@@ -62,7 +66,17 @@
}
else
{// the stm does not exist create an instance and attempt to put it into the map
- STM newSTM = new STM(getDatabaseName());
+ STM newSTM = null;
+ if (null != this.cacheManager)
+ {
+ newSTM = new STM(getDatabaseName(), this.cacheManager.getCache(getDatabaseName()));
+ }
+ else
+ {
+ newSTM = new STM(getDatabaseName(), null);
+ logger.warn("Starting the STM witout replication enabled.");
+ }
+
STM concurrentSTM = stmDatabases.putIfAbsent(getDatabaseName(), newSTM);
if (null == concurrentSTM)
{// the database has been created by this thread
@@ -196,13 +210,24 @@
}
-
+ /**
+ * Constructor for creating a DataSource. There is an expectation of
+ * only one DataSource in a JVM.
+ */
public STMXADatasourceImpl()
{
if (logger.isInfoEnabled())
{
logger.info("Instance of XADataSource created.");
}
+
+ try
+ {// this is not great performing work inside a constructor that can barf
+ this.cacheManager = new DefaultCacheManager("cluster-cfg.xml");
+ }
+ catch (IOException ioe)
+ {
+ logger.error("The configuration file for the replicated memory system could not be found.");
+ }
}
-
}
Deleted: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/spec/History.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/spec/History.java 2009-08-15 07:47:53 UTC (rev 28943)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/spec/History.java 2009-08-15 19:00:30 UTC (rev 28944)
@@ -1,7 +0,0 @@
-package uk.ac.ncl.sdia.a8905943.spec;
-
-public interface History {
-
- public void recordRead();
- public void recordWrite();
-}
Deleted: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/spec/ObjectStoreManager.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/spec/ObjectStoreManager.java 2009-08-15 07:47:53 UTC (rev 28943)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/spec/ObjectStoreManager.java 2009-08-15 19:00:30 UTC (rev 28944)
@@ -1,7 +0,0 @@
-package uk.ac.ncl.sdia.a8905943.spec;
-
-public interface ObjectStoreManager {
-
- public Object find(Class type, Object identity);
- public void put(Object object);
-}
Deleted: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/spec/ResourceManager.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/spec/ResourceManager.java 2009-08-15 07:47:53 UTC (rev 28943)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/spec/ResourceManager.java 2009-08-15 19:00:30 UTC (rev 28944)
@@ -1,5 +0,0 @@
-package uk.ac.ncl.sdia.a8905943.spec;
-
-public interface ResourceManager {
-
-}
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/spec/STMTransaction.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/spec/STMTransaction.java 2009-08-15 07:47:53 UTC (rev 28943)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/spec/STMTransaction.java 2009-08-15 19:00:30 UTC (rev 28944)
@@ -6,7 +6,11 @@
*/
package uk.ac.ncl.sdia.a8905943.spec;
+import uk.ac.ncl.sdia.a8905943.isolation.FieldReadParameter;
+import uk.ac.ncl.sdia.a8905943.isolation.FieldWriteParameter;
+import uk.ac.ncl.sdia.a8905943.isolation.Isolation;
+
/**
* Purpose of this object is for behaviour of a transaction that
* uses memory to control changes.a
@@ -16,8 +20,9 @@
*/
public interface STMTransaction
{
- public Boolean write(long hash, Object writtenObject);
- public Object read( long hashIdentity);
+ public Boolean write(FieldWriteParameter fieldWrite);
+ public Object read(FieldReadParameter fieldRead);
+ public void setIsolationLevel(Isolation isolation);
public void startTransaction();
}
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/STM.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/STM.java 2009-08-15 07:47:53 UTC (rev 28943)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/STM.java 2009-08-15 19:00:30 UTC (rev 28944)
@@ -2,7 +2,14 @@
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.log4j.Logger;
+import org.infinispan.Cache;
+import uk.ac.ncl.sdia.a8905943.factory.TransactionFactory;
+import uk.ac.ncl.sdia.a8905943.handle.TransactedObjectReference;
+import uk.ac.ncl.sdia.a8905943.isolation.FieldReadParameter;
+import uk.ac.ncl.sdia.a8905943.isolation.FieldWriteParameter;
+import uk.ac.ncl.sdia.a8905943.isolation.factory.IsolationFactory;
+
/**
* This object is a proxy to the transactional memory system. It provides a
* convenient interface to the world for any systems that interact with it.
@@ -14,8 +21,8 @@
{
private final String databaseName;
private static final Logger logger = Logger.getLogger(STM.class);
+ private final Cache<Long, TransactedObjectReference> replicatedMemory ;
-
/**
* This method is where transactional updates are made..
*
@@ -23,20 +30,22 @@
* @param writtenObject
* @return
*/
- public Boolean write(long hash, Object writtenObject)
+ public Boolean write(FieldWriteParameter fieldWrite)
{
- //TODO:jrw complete implementation.
+ fieldWrite.setObjectStore(this.replicatedMemory);
+ TransactionFactory.getFactory().getCurrentTransaction(false).write(fieldWrite);
return Boolean.FALSE;
}
- public Object read( long hashIdentity)
+ public Object read( FieldReadParameter fieldRead)
{
- // TODO:jrw complete implementation
- return null;
+ fieldRead.setObjectStore(this.replicatedMemory);
+ return TransactionFactory.getFactory().getCurrentTransaction(false).read(fieldRead);
}
- public STM(String name)
+ public STM(String name, Cache replicatedMemory)
{
this.databaseName = name;
+ this.replicatedMemory = replicatedMemory;
}
@Override
@@ -78,7 +87,7 @@
}
/**
* Notify the transactional system the changes should be locked for future
- * storing in share transactional memory.
+ * updating in share transactional memory.
*/
public void prepare()
{
@@ -104,4 +113,9 @@
{
return databaseName;
}
+
+ public void setCurrentTransactionIsolation(int isolationLevel)
+ {
+ TransactionFactory.getFactory().getCurrentTransaction(false).setIsolationLevel(IsolationFactory.createIsolationLevel(isolationLevel));
+ }
}
Deleted: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/annotation/STMEntity.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/annotation/STMEntity.java 2009-08-15 07:47:53 UTC (rev 28943)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/annotation/STMEntity.java 2009-08-15 19:00:30 UTC (rev 28944)
@@ -1,21 +0,0 @@
-/*
- * JBoss, the OpenSource J2EE webOS
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package uk.ac.ncl.sdia.a8905943.stm.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
- at Target(ElementType.TYPE)
- at Retention(RetentionPolicy.RUNTIME)
-public @interface STMEntity
-{
-
-}
-
-
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/tracker/TransactionWriteSet.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/tracker/TransactionWriteSet.java 2009-08-15 07:47:53 UTC (rev 28943)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/tracker/TransactionWriteSet.java 2009-08-15 19:00:30 UTC (rev 28944)
@@ -9,7 +9,7 @@
import java.util.HashMap;
import java.util.Map;
-public class TransactionWriteSet
+public final class TransactionWriteSet
{
private final Map<Long, Object> writes = new HashMap<Long, Object>();
@@ -17,4 +17,9 @@
{
return writes;
}
+
+ public void addWrite(long handle, Object writeable)
+ {
+
+ }
}
Added: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/resources/cluster-cfg.xml
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/resources/cluster-cfg.xml (rev 0)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/resources/cluster-cfg.xml 2009-08-15 19:00:30 UTC (rev 28944)
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:infinispan:config:4.0">
+
+
+ <transport transportClass="org.infinispan.remoting.transport.jgroups.JGroupsTransport"
+ clusterName="infinispan-cluster" distributedSyncTimeout="50000">
+ <!--
+ Note that the JGroups transport uses sensible defaults if no
+ configuration property is defined.
+ -->
+ <property name="configurationFile" value="udp.xml" />
+ <!-- See the JGroupsTransport javadocs for more flags -->
+ </transport>
+
+
+ <!-- *************************** -->
+ <!-- Default "template" settings -->
+ <!-- *************************** -->
+ <!--
+ this is used as a "template" configuration for all caches in the
+ system.
+ -->
+ <default>
+ <!--
+ isolation levels supported: READ_COMMITTED and REPEATABLE_READ
+ -->
+ <locking isolationLevel="REPEATABLE_READ"
+ lockAcquisitionTimeout="20000" writeSkewCheck="false"
+ concurrencyLevel="500" />
+
+ <!--
+ Used to register a transaction manager and participate in ongoing
+ transactions.
+ -->
+ <transaction
+ transactionManagerLookupClass="org.infinispan.transaction.lookup.JBossTransactionManagerLookup"
+ syncRollbackPhase="false" syncCommitPhase="false" useEagerLocking="false" />
+
+ <!--
+ Used to register JMX statistics in any available MBean server
+ -->
+ <jmxStatistics enabled="false" />
+
+ <lazyDeserialization enabled="false" />
+
+ <!--
+ Used to enable invocation batching and allow the use of
+ Cache.startBatch()/endBatch() methods.
+ -->
+ <invocationBatching enabled="false" />
+
+ <!--
+ This element specifies that the cache is clustered. modes supported:
+ distribution (d), replication (r) or invalidation (i).
+ -->
+ <clustering mode="replication">
+
+ <!--
+ Defines whether to retrieve state on startup
+ -->
+ <stateRetrieval timeout="20000" fetchInMemoryState="false" />
+
+ <!--
+ Network calls are synchronous.
+ -->
+ <sync replTimeout="20000" />
+ <!--
+ Uncomment this for async replication.
+ -->
+ <!--
+ <async useReplQueue="true" replQueueInterval="10000"
+ replQueueMaxElements="500"/>
+ -->
+ </clustering>
+ </default>
+
+ <!-- No named caches, the DataSource creates the caches on the fly. -->
+
+</infinispan>
\ No newline at end of file
More information about the jboss-svn-commits
mailing list