[jboss-svn-commits] JBL Code SVN: r29182 - in labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM: src/main/java/uk/ac/ncl/sdia/a8905943/aspects and 18 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Fri Sep 4 10:04:53 EDT 2009
Author: whitingjr
Date: 2009-09-04 10:04:52 -0400 (Fri, 04 Sep 2009)
New Revision: 29182
Added:
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/annotation/STMAssociationReadable.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/annotation/STMAssociationWriteable.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/annotation/collections/
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/annotation/collections/set/
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/annotation/collections/set/STMCollectionAdd.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/annotation/collections/set/STMCollectionClear.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/annotation/collections/set/STMCollectionRemove.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/BankAccountEntity.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/BankEntity.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/Flight.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/untransactional/AddressEntity.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/untransactional/PersonEntity.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/transaction/PrepareParameter.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/stm/AbstractUnitT.java
Removed:
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/stm/AbstractTest.java
Modified:
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/.classpath
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/build.xml
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/pom.xml
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/STMInjectionAspect.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/impl/STMTransactionImpl.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/LeccyCar.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/persistence/xa/STMXAResource.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/stm/model/LoadEntityParameter.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/object/TransactedObjectReference.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/object/collection/AbstractTransactedCollectionReference.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/transaction/STMTransaction.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/transaction/TransactionManager.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/resources/META-INF/jboss-aop.xml
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/aspects/TestSTMReadAspect.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/aspects/TestSTMWriteAspect.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/aspects/TestVersioningAspectImpl.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/isolation/TestUnitRepeatableReadIsolationImpl.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/stm/TestUnitModelReplicatedMemory.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/stm/TestUnitSTM.java
labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/stm/transaction/TestUnitTransactionManager.java
Log:
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/.classpath
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/.classpath 2009-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/.classpath 2009-09-04 14:04:52 UTC (rev 29182)
@@ -3,7 +3,6 @@
<classpathentry kind="src" output="target/classes" path="src/main/java"/>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/>
<classpathentry kind="src" path="src/test/java"/>
- <classpathentry kind="src" path="src/test/resources"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.eclipse.jst.server.generic.runtimeTarget/JBoss v5.0"/>
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/build.xml
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/build.xml 2009-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/build.xml 2009-09-04 14:04:52 UTC (rev 29182)
@@ -1,99 +1,115 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name="mvccsamplestm.jar" basedir="." default="usage">
-
+
<target name="build">
<echo>Java module build task was executed.</echo>
-
+
<javac destdir="${build.dir}/classes" classpathref="COMPILE_DEPENDENCIES" debug="true" target="1.6">
- <src path="${basedir}/src/main/java"/>
+ <src path="${basedir}/src/main/java" />
</javac>
-
+
+ <!--copy todir="${build.dir}/classes/uk/ac/ncl/sdia/a8905943/model">
+ <fileset dir="/home/whitingjr/eclipse/workspaces/red-hat/MVCCSampleSTM/target/classes/uk/ac/ncl/sdia/a8905943/model">
+ <include name="*.class" />
+ </fileset>
+ </copy>
+ <copy todir="${build.dir}/classes/uk/ac/ncl/sdia/a8905943/aspects">
+ <fileset dir="/home/whitingjr/eclipse/workspaces/red-hat/MVCCSampleSTM/target/classes/uk/ac/ncl/sdia/a8905943/aspects">
+ <include name="*.class" />
+ </fileset>
+ </copy>
+
+
<jar jarfile="${artifact-target}/MVCCSampleSTM.jar" manifest="${basedir}/src/main/resources/META-INF/MANIFEST.MF">
<fileset dir="${build.dir}/classes">
- <include name="uk/ac/ncl/sdia/a8905943/**"/>
- <patternset refid="testcase.filename.patternset"/>
+ <include name="uk/ac/ncl/sdia/a8905943/**" />
+ <patternset refid="testcase.filename.patternset" />
</fileset>
-
+
<fileset dir="${basedir}/src/main/resources">
- <include name="versioning-aop.xml" />
+ <include name="jboss-aop.xml" />
</fileset>
-
+
<metainf dir="${basedir}/src/main/resources/META-INF">
- <include name="*"/>
+ <include name="*" />
</metainf>
-
- </jar>
+
+ </jar-->
+
+ <copy tofile="${artifact-target}/MVCCSampleSTM.aop">
+ <!--fileset dir="${artifact-target}">
+ <include name="MVCCSampleSTM.jar" />
+ </fileset-->
+ <fileset dir="/home/whitingjr/eclipse/workspaces/red-hat/MVCCSampleSTM/target">
+ <include name="MVCCSampleSTM-0.0.1-SNAPSHOT.jar" />
+ </fileset>
+ </copy>
+ <copy tofile="${artifact-target}/MVCCSampleSTM.jar">
+ <fileset dir="/home/whitingjr/eclipse/workspaces/red-hat/MVCCSampleSTM/target">
+ <include name="MVCCSampleSTM-0.0.1-SNAPSHOT.jar" />
+ </fileset>
+ </copy>
</target>
-
+
<target name="usage">
<echo>Please do not call this build file directly. Use master build script in ../MVCCSample-build directory.</echo>
</target>
-
- <target name="prepare">
- <path id="jboss.aop.classpath">
- <fileset dir="../aop-lesson-1">
- <include name="jboss-aop-jdk50-single.jar"/>
- </fileset>
- </path>
- <path id="classpath">
- <path refid="jboss.aop.classpath"/>
- <pathelement path="classes"/>
- </path>
+ <target name="prepare">
+ <path id="jboss.aop.classpath">
+ <fileset dir="../aop-lesson-1">
+ <include name="jboss-aop-jdk50-single.jar" />
+ </fileset>
+ </path>
- <taskdef name="aopc" classname="org.jboss.aop.ant.AopC" classpathref="jboss.aop.classpath"/>
- </target>
+ <path id="classpath">
+ <path refid="jboss.aop.classpath" />
+ <pathelement path="classes" />
+ </path>
- <target name="compile" depends="prepare">
- <delete dir="classes"/>
- <mkdir dir="classes"/>
- <javac srcdir="src/main/java"
- destdir="classes"
- debug="on"
- deprecation="on"
- optimize="off"
- includes="**">
- <classpath refid="classpath"/>
- </javac>
- <javac srcdir="src/test/java"
- destdir="classes"
- debug="on"
- deprecation="on"
- optimize="off"
- includes="**">
- <classpath refid="classpath"/>
- </javac>
-
- <copy todir="classes" filtering="no">
- <fileset dir="src">
- <include name="**/*.properties"/>
- </fileset>
- </copy>
- </target>
-
- <target name="aopc" depends="compile">
- <aopc compilerclasspathref="classpath" classpathref="classpath" verbose="true">
- <classpath path="classes"/>
- <src path="src/main/java"/>
- <aoppath path="jboss-aop.xml"/>
- </aopc>
- </target>
+ <taskdef name="aopc" classname="org.jboss.aop.ant.AopC" classpathref="jboss.aop.classpath" />
+ </target>
- <target name="run-compile-time" depends="aopc">
- <java fork="yes" failOnError="true" className="bank.Bank">
- <sysproperty key="jboss.aop.path" value="jboss-aop.xml"/>
- <classpath refid="classpath"/>
- </java>
- </target>
+ <target name="compile" depends="prepare">
+ <delete dir="classes" />
+ <mkdir dir="classes" />
+ <javac srcdir="src/main/java" destdir="classes" debug="on" deprecation="on" optimize="off" includes="**">
+ <classpath refid="classpath" />
+ </javac>
+ <javac srcdir="src/test/java" destdir="classes" debug="on" deprecation="on" optimize="off" includes="**">
+ <classpath refid="classpath" />
+ </javac>
- <target name="run-load-time" depends="compile">
- <java fork="yes" failOnError="true" className="bank.Bank">
- <sysproperty key="jboss.aop.path" value="jboss-aop.xml"/>
- <jvmarg value="-javaagent:../aop-lesson-1/jboss-aop-jdk50-single.jar"/>
- <classpath refid="classpath"/>
- </java>
- </target>
+ <copy todir="classes" filtering="no">
+ <fileset dir="src">
+ <include name="**/*.properties" />
+ </fileset>
+ </copy>
+ </target>
+ <target name="aopc" depends="compile">
+ <aopc compilerclasspathref="classpath" classpathref="classpath" verbose="true">
+ <classpath path="classes" />
+ <src path="src/main/java" />
+ <aoppath path="jboss-aop.xml" />
+ </aopc>
+ </target>
+
+ <target name="run-compile-time" depends="aopc">
+ <java fork="yes" failOnError="true" className="bank.Bank">
+ <sysproperty key="jboss.aop.path" value="jboss-aop.xml" />
+ <classpath refid="classpath" />
+ </java>
+ </target>
+
+ <target name="run-load-time" depends="compile">
+ <java fork="yes" failOnError="true" className="bank.Bank">
+ <sysproperty key="jboss.aop.path" value="jboss-aop.xml" />
+ <jvmarg value="-javaagent:../aop-lesson-1/jboss-aop-jdk50-single.jar" />
+ <classpath refid="classpath" />
+ </java>
+ </target>
+
</project>
\ No newline at end of file
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/pom.xml
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/pom.xml 2009-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/pom.xml 2009-09-04 14:04:52 UTC (rev 29182)
@@ -29,14 +29,12 @@
<version>1.2.14</version>
<scope>compile</scope>
</dependency>
- <!--
<dependency>
- <groupId>uk.ac.ncl.sdia.a8905943</groupId>
- <artifactId>STMAnnotationsJAR</artifactId>
- <version>0.0.1-SNAPSHOT</version>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.5</version>
<scope>compile</scope>
</dependency>
- -->
</dependencies>
<build>
<plugins>
@@ -77,8 +75,10 @@
<useSystemClassLoader>false</useSystemClassLoader>
<argLine>-Djboss.aop.path=src/main/resources/META-INF/jboss-aop.xml</argLine>
<excludes>
- <exclude>**/AbstractTest.java</exclude>
+ <exclude>**/AbstractTest.java</exclude>
</excludes>
+ <testFailureIgnore>true</testFailureIgnore>
+
</configuration>
</plugin>
</plugins>
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/STMInjectionAspect.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/STMInjectionAspect.java 2009-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/STMInjectionAspect.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -11,7 +11,6 @@
import org.jboss.aop.joinpoint.FieldWriteInvocation;
import uk.ac.ncl.sdia.a8905943.factory.STMFactory;
-import uk.ac.ncl.sdia.a8905943.stm.STM;
/**
* This object injects a reference to the STM system.
Added: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/annotation/STMAssociationReadable.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/annotation/STMAssociationReadable.java (rev 0)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/annotation/STMAssociationReadable.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -0,0 +1,18 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package uk.ac.ncl.sdia.a8905943.aspects.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+ at Target ({ElementType.METHOD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface STMAssociationReadable {
+
+}
Added: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/annotation/STMAssociationWriteable.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/annotation/STMAssociationWriteable.java (rev 0)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/annotation/STMAssociationWriteable.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -0,0 +1,18 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package uk.ac.ncl.sdia.a8905943.aspects.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+ at Target ({ElementType.METHOD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface STMAssociationWriteable {
+
+}
Added: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/annotation/collections/set/STMCollectionAdd.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/annotation/collections/set/STMCollectionAdd.java (rev 0)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/annotation/collections/set/STMCollectionAdd.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -0,0 +1,18 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package uk.ac.ncl.sdia.a8905943.aspects.annotation.collections.set;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+ at Target ({ElementType.METHOD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface STMCollectionAdd {
+
+}
Added: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/annotation/collections/set/STMCollectionClear.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/annotation/collections/set/STMCollectionClear.java (rev 0)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/annotation/collections/set/STMCollectionClear.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -0,0 +1,18 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package uk.ac.ncl.sdia.a8905943.aspects.annotation.collections.set;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+ at Target ({ElementType.METHOD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface STMCollectionClear {
+
+}
Added: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/annotation/collections/set/STMCollectionRemove.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/annotation/collections/set/STMCollectionRemove.java (rev 0)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/aspects/annotation/collections/set/STMCollectionRemove.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -0,0 +1,18 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package uk.ac.ncl.sdia.a8905943.aspects.annotation.collections.set;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+ at Target ({ElementType.METHOD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface STMCollectionRemove {
+
+}
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/impl/STMTransactionImpl.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/impl/STMTransactionImpl.java 2009-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/impl/STMTransactionImpl.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -48,15 +48,19 @@
private Isolation isolation;
+ /**
+ *
+ * @deprecated
+ */
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.
- this.status = Status.STATUS_COMMITTED;
- releaseHeldLocks();
- this.phaseTwoTerminated.countDown();
+ //this.status = Status.STATUS_COMMITTED;
+ //releaseHeldLocks();
+ //this.phaseTwoTerminated.countDown();
}
@Override
@@ -110,11 +114,15 @@
return deferredReads;
}
+ /**
+ * FIXME Comment this
+ *@deprecated
+ */
public void abort()
{
this.status = Status.STATUS_ROLLEDBACK;
- releaseHeldLocks();
- this.phaseTwoTerminated.countDown();
+ //releaseHeldLocks();
+ //this.phaseTwoTerminated.countDown();
}
@Override
Added: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/BankAccountEntity.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/BankAccountEntity.java (rev 0)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/BankAccountEntity.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -0,0 +1,35 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package uk.ac.ncl.sdia.a8905943.model;
+
+import javax.persistence.Id;
+
+import uk.ac.ncl.sdia.a8905943.aspects.annotation.STMReadable;
+import uk.ac.ncl.sdia.a8905943.aspects.annotation.STMWriteable;
+import uk.ac.ncl.sdia.a8905943.stm.annotation.STMEntity;
+
+ at STMEntity public class BankAccountEntity
+{
+ @Id
+ private Long id;
+ private Double balance;
+
+ @STMReadable public Double getBalance()
+ {
+ return balance;
+ }
+ @STMWriteable
+ public void setBalance(Double balance)
+ {
+ this.balance = balance;
+ }
+ @STMReadable
+ public Long getId()
+ {
+ return id;
+ }
+}
Added: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/BankEntity.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/BankEntity.java (rev 0)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/BankEntity.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -0,0 +1,50 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package uk.ac.ncl.sdia.a8905943.model;
+
+import java.util.Collection;
+
+import javax.persistence.Id;
+
+import uk.ac.ncl.sdia.a8905943.aspects.annotation.STMReadable;
+import uk.ac.ncl.sdia.a8905943.aspects.annotation.STMWriteable;
+import uk.ac.ncl.sdia.a8905943.stm.annotation.STMEntity;
+
+ @STMEntity public class BankEntity
+ {
+ @Id
+ private Long id;
+ private Collection<BankAccountEntity> bankAccounts;
+ @STMReadable
+ public Collection<BankAccountEntity> getBankAccounts()
+ {
+ return bankAccounts;
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+ @STMWriteable
+ public void setBankAccounts(Collection<BankAccountEntity> bankAccounts)
+ {
+ this.bankAccounts = bankAccounts;
+ }
+ @STMReadable
+ public Long getId()
+ {
+ return id;
+ }
+
+}
Added: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/Flight.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/Flight.java (rev 0)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/Flight.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -0,0 +1,35 @@
+package uk.ac.ncl.sdia.a8905943.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Id;
+
+import uk.ac.ncl.sdia.a8905943.aspects.annotation.STMReadable;
+import uk.ac.ncl.sdia.a8905943.aspects.annotation.STMWriteable;
+import uk.ac.ncl.sdia.a8905943.stm.annotation.STMEntity;
+
+ @STMEntity
+ public class Flight implements Serializable {
+ @Id
+ private java.lang.Long id;
+ private String airlineName;
+ public Long getId() {
+ return this.id;
+ }
+ @STMReadable public String getAirlineName() {
+ return this.airlineName;
+ }
+ @STMWriteable public void setAirline(String airline) {
+ this.airlineName = airline;
+ }
+
+
+
+ public Flight() {
+ super();
+ String query = "model/uk.ac.ncl.sdia.a8905943.model.Flight[airlineName='British Airways']";
+ }
+ /** The serialVersionUID */
+ private static final long serialVersionUID = 1L;
+
+}
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/LeccyCar.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/LeccyCar.java 2009-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/LeccyCar.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -6,17 +6,18 @@
*/
package uk.ac.ncl.sdia.a8905943.model;
-import javax.persistence.Id;
-
import uk.ac.ncl.sdia.a8905943.aspects.annotation.STMReadable;
import uk.ac.ncl.sdia.a8905943.aspects.annotation.STMWriteable;
+import uk.ac.ncl.sdia.a8905943.aspects.annotation.collections.set.STMCollectionAdd;
+import uk.ac.ncl.sdia.a8905943.aspects.annotation.collections.set.STMCollectionClear;
+import uk.ac.ncl.sdia.a8905943.aspects.annotation.collections.set.STMCollectionRemove;
import uk.ac.ncl.sdia.a8905943.stm.annotation.STMEntity;
@STMEntity
public class LeccyCar
{
- @Id
- private Long id;
+ @javax.persistence.Id
+ private java.lang.Long id;
private String name;
/**
@@ -24,10 +25,12 @@
*
* @param identity
*/
+
public LeccyCar(Long identity)
{
this.id = identity;
}
+ @STMCollectionClear
public Long getId()
{
return id;
@@ -44,3 +47,4 @@
}
}
+
Added: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/untransactional/AddressEntity.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/untransactional/AddressEntity.java (rev 0)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/untransactional/AddressEntity.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -0,0 +1,42 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package uk.ac.ncl.sdia.a8905943.model.untransactional;
+
+import javax.persistence.Id;
+
+import uk.ac.ncl.sdia.a8905943.aspects.annotation.STMReadable;
+import uk.ac.ncl.sdia.a8905943.aspects.annotation.STMWriteable;
+
+public class AddressEntity
+{
+ @Id
+ private Long id;
+ private String street;
+ private String town;
+ @STMReadable public String getStreet()
+ {
+ return street;
+ }
+ @STMWriteable public void setStreet(String street)
+ {
+ this.street = street;
+ }
+ @STMReadable public String getTown()
+ {
+ return town;
+ }
+ @STMWriteable public void setTown(String town)
+ {
+ this.town = town;
+ }
+ public Long getId()
+ {
+ return id;
+ }
+
+
+}
Added: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/untransactional/PersonEntity.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/untransactional/PersonEntity.java (rev 0)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/model/untransactional/PersonEntity.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -0,0 +1,38 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package uk.ac.ncl.sdia.a8905943.model.untransactional;
+
+import javax.persistence.Id;
+
+import uk.ac.ncl.sdia.a8905943.aspects.annotation.STMReadable;
+import uk.ac.ncl.sdia.a8905943.aspects.annotation.STMWriteable;
+import uk.ac.ncl.sdia.a8905943.stm.annotation.STMEntity;
+
+ at STMEntity public class PersonEntity
+{
+ @Id
+ private Long id;
+ private AddressEntity address;
+ @STMReadable public AddressEntity getAddress()
+ {
+ return address;
+ }
+ @STMWriteable public void setAddress(AddressEntity address)
+ {
+ this.address = address;
+ }
+ @STMReadable
+ public Long getId()
+ {
+ return id;
+ }
+
+ public PersonEntity(Long identity)
+ {
+ this.id = identity;
+ }
+}
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-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/persistence/jdbc/STMConnection.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -66,7 +66,7 @@
{
logger.debug("STMConnection.commit called.");
}
-
+ this.xaConnection.getSTM().commit(); // called for 1phase commit
}
@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-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/persistence/xa/STMXADatasourceImpl.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -10,8 +10,8 @@
import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;
-import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import javax.naming.NamingException;
import javax.naming.Reference;
@@ -37,10 +37,10 @@
private String user = StringUtils.EMPTY;
private static final String SERVER_NAME = "serverName"; // this field is ignored except for calculating equals method
private static final String DATABASE_NAME = "databaseName";
- private static final ConcurrentHashMap<String, STM> stmDatabases = new ConcurrentHashMap<String, STM>();
+ private static final ConcurrentMap<String, STM> stmDatabases = new ConcurrentHashMap<String, STM>();
private static final Logger logger = Logger.getLogger(STMXADatasourceImpl.class );
- private Map<Long, TransactedObjectReference> transactedFieldStore ;
- private Map<String, List<Object>> transactedModelStore;
+ private ConcurrentMap<Long, TransactedObjectReference> transactedFieldStore ;
+ private ConcurrentMap<String, List<Object>> transactedModelStore;
/** The serialVersionUID */
private static final long serialVersionUID = 2341586268344164513L;
@@ -61,7 +61,7 @@
logger.debug("The XA Datasource is providing an XAConnection ");
}
STMXAConnectionImpl returnValue = null;
- if (stmDatabases.contains(getDatabaseName()))
+ if (stmDatabases.containsKey(getDatabaseName()))
{
returnValue = new STMXAConnectionImpl(this, stmDatabases.get(getDatabaseName()));
}
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/persistence/xa/STMXAResource.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/persistence/xa/STMXAResource.java 2009-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/persistence/xa/STMXAResource.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -82,7 +82,11 @@
{
throw new XAException(XAException.XAER_NOTA);
}
- //TODO: perform two phase commit of prepared changes.
+ boolean committed = this.xaConnection.getSTM().commit();
+ if (!committed)
+ {
+ throw new XAException(XAException.XA_RBOTHER);
+ }
}
}
@@ -198,6 +202,7 @@
@Override
public int prepare(Xid xId) throws XAException
{
+ int returnValue = XAResource.XA_RDONLY;
if (logger.isDebugEnabled())
{
logger.debug("XAResource.prepare called.");
@@ -206,9 +211,25 @@
{
logger.trace("XAResource.prepare called for branch [" + xId + "].");
}
- isXidRecognised(xId);
-
- return 0;
+ if (!this.xaConnection.isActive())
+ {
+ throw new XAException(XAException.XA_RBPROTO);
+ }
+ if (!isXidRecognised(xId))
+ {
+ throw new XAException(XAException.XAER_NOTA);
+ }
+ boolean prepared = this.xaConnection.getSTM().prepare();
+ if (prepared)
+ {
+ returnValue = XAResource.XA_OK;
+ }
+ else
+ {
+ throw new XAException(XAException.XA_RBOTHER);
+ }
+
+ return returnValue;
}
@Override
@@ -227,24 +248,33 @@
}
@Override
- public void rollback(Xid arg0) throws XAException
+ public void rollback(Xid xId) throws XAException
{
if (logger.isDebugEnabled())
{
logger.debug("XAResource.rollback called.");
}
- // pass instruction through to STM system to rollback any prepared resources
+ if (!isActive(xId))
+ {
+ throw new XAException(XAException.XAER_NOTA);
+ }
+ if (!isXidRecognised(xId))
+ {
+ throw new XAException(XAException.XAER_NOTA);
+ }
+ this.xaConnection.getSTM().abort();
+
}
@Override
- public boolean setTransactionTimeout(int arg0) throws XAException
+ public boolean setTransactionTimeout(int timeout) throws XAException
{
- if (logger.isDebugEnabled())
+ if (logger.isTraceEnabled())
{
- logger.debug("XAResource.setTransactionTimeout called.");
+ logger.trace("XAResource.setTransactionTimeout called. ["+timeout+"].");
}
- getXAConnection().getSTM().set
- return false;
+ getXAConnection().getSTM().setTimeout(timeout);
+ return true;
}
/**
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-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/STM.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -2,17 +2,22 @@
import java.util.List;
import java.util.Map;
+import java.util.concurrent.ConcurrentMap;
+import javax.transaction.Status;
+
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.log4j.Logger;
import uk.ac.ncl.sdia.a8905943.factory.TransactionFactory;
+import uk.ac.ncl.sdia.a8905943.impl.STMTransactionImpl;
import uk.ac.ncl.sdia.a8905943.isolation.factory.IsolationFactory;
import uk.ac.ncl.sdia.a8905943.stm.exception.IsolationLevelNotConfiguredException;
import uk.ac.ncl.sdia.a8905943.stm.field.FieldReadParameter;
import uk.ac.ncl.sdia.a8905943.stm.field.FieldWriteParameter;
import uk.ac.ncl.sdia.a8905943.stm.model.LoadEntityParameter;
import uk.ac.ncl.sdia.a8905943.stm.object.TransactedObjectReference;
+import uk.ac.ncl.sdia.a8905943.stm.transaction.PrepareParameter;
import uk.ac.ncl.sdia.a8905943.stm.transaction.STMTransaction;
import uk.ac.ncl.sdia.a8905943.stm.transaction.TransactionManager;
@@ -27,8 +32,8 @@
{
private final String databaseName;
private static final Logger logger = Logger.getLogger(STM.class);
- private final Map<Long, TransactedObjectReference> transactedFieldMemory ;
- private final Map<String, List<Object>> transactedModelMemory;
+ private final ConcurrentMap<Long, TransactedObjectReference> transactedFieldMemory ;
+ private final ConcurrentMap<String, List<Object>> transactedModelMemory;
private final TransactionManager transactionManager = new TransactionManager();
private ThreadLocal<Integer> isolationLevel = new ThreadLocal<Integer>();
private ThreadLocal<Integer> timeoutPeriod = new ThreadLocal<Integer>();
@@ -58,7 +63,7 @@
return transaction.read(fieldRead);
}
- public STM(String name, Map<Long, TransactedObjectReference> transactedFieldMemory, Map<String, List<Object>> transactedModelMemory)
+ public STM(String name, ConcurrentMap<Long, TransactedObjectReference> transactedFieldMemory, ConcurrentMap<String, List<Object>> transactedModelMemory)
{
this.databaseName = name;
this.transactedFieldMemory = transactedFieldMemory;
@@ -84,15 +89,21 @@
}
}
}
- return returnValue;
+ return returnValue;
}
/**
* Commit the current transaction
*/
- public void commit()
+ public boolean commit()
{
+ boolean returnValue = true;
+ STMTransaction transaction = TransactionFactory.getFactory().getCurrentTransaction(false);
+ transaction.setStatus(Status.STATUS_COMMITTING);
+ returnValue = this.transactionManager.commit(transaction, this.transactedFieldMemory);
logger.debug("commit invoked on stm");
+ transaction.setStatus(Status.STATUS_COMMITTED);
+ return returnValue;
}
/**
* The changes stored in this transaction are not going to persistent store
@@ -100,11 +111,12 @@
*/
public void abort()
{
- //TODO: jrw complete, complete implementation to release (unlock) prepared resources.
+ STMTransaction transaction = TransactionFactory.getFactory().getCurrentTransaction(false);
+ transaction.setStatus(Status.STATUS_MARKED_ROLLBACK);
this.isolationLevel.remove();
- STMTransaction transaction = TransactionFactory.getFactory().getCurrentTransaction(false);
this.transactionManager.abort(this.transactedFieldMemory, transaction);
TransactionFactory.getFactory().deallocate();
+ transaction.setStatus(Status.STATUS_ROLLEDBACK);
}
/**
* Notify the transactional system the changes should be locked for future
@@ -114,10 +126,19 @@
{
boolean returnValue = false;
STMTransaction transaction = TransactionFactory.getFactory().getCurrentTransaction(false);
+ transaction.setStatus(Status.STATUS_PREPARING);
/* Calculate the expiry milliseconds, prevents the thread going beyond the timeout
* the TM is using. */
long expiryTime = System.currentTimeMillis() + this.timeoutPeriod.get().longValue() - EXPIRE_BEFORE_TIMEOUT;
- returnValue = this.transactionManager.prepare(this.transactedFieldMemory, transaction.getDeferredWrites(), RETRY_COUNT, expiryTime);
+ returnValue = this.transactionManager.prepare(new PrepareParameter(this.transactedFieldMemory, RETRY_COUNT, expiryTime, transaction));
+ if (returnValue)
+ {
+ transaction.setStatus(Status.STATUS_PREPARED);
+ }
+ else
+ {
+ transaction.setStatus(Status.STATUS_MARKED_ROLLBACK);
+ }
return returnValue; //returning false will cause the transaction to be aborted
}
@@ -135,10 +156,12 @@
{
logger.debug("begin invoked on stm system.");
STMTransaction transaction = TransactionFactory.getFactory().getCurrentTransaction(true);
+ this.transactionManager.addTransaction((STMTransactionImpl)transaction);
if (null != this.isolationLevel.get())
{
+ transaction.setStatus(Status.STATUS_ACTIVE);
transaction.setIsolationLevel(IsolationFactory.createIsolationLevel(this.isolationLevel.get()));
- this.isolationLevel.remove();
+ //this.isolationLevel.remove();
}
else
{
@@ -150,6 +173,7 @@
*/
public void discard()
{
+ logger.debug("STM.discard called.");
this.isolationLevel.remove();
STMTransaction transaction = TransactionFactory.getFactory().getCurrentTransaction(false);
this.transactionManager.abort(this.transactedFieldMemory, transaction);
@@ -177,11 +201,11 @@
public void end()
{
//TODO:jrw, errm, do something......
-
+ logger.debug("STM.end() called.");
}
public Object loadEntity(LoadEntityParameter entityLoad)
{
- entityLoad.setReplicatedModelMemory(this.transactedModelMemory);
+ entityLoad.setModelMemory(this.transactedModelMemory);
STMTransaction transaction = TransactionFactory.getFactory().getCurrentTransaction(false);
return transaction.load(entityLoad);
@@ -204,4 +228,9 @@
}
}
+
+ public Map<Long, TransactedObjectReference> getFieldStore()
+ {
+ return this.transactedFieldMemory;
+ }
}
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/model/LoadEntityParameter.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/model/LoadEntityParameter.java 2009-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/model/LoadEntityParameter.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -13,7 +13,7 @@
{
private String entityFQCN;
private Long identity;
- private Map<String, List<Object>> replicatedModelMemory;
+ private Map<String, List<Object>> modelMemory;
public String getEntityFQCN()
@@ -32,13 +32,13 @@
{
this.identity = identity;
}
- public Map<String, List<Object>> getReplicatedModelMemory()
+ public Map<String, List<Object>> getModelMemory()
{
- return replicatedModelMemory;
+ return modelMemory;
}
- public void setReplicatedModelMemory(Map<String, List<Object>> replicatedModelMemory)
+ public void setModelMemory(Map<String, List<Object>> replicatedModelMemory)
{
- this.replicatedModelMemory = replicatedModelMemory;
+ this.modelMemory = replicatedModelMemory;
}
}
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/object/TransactedObjectReference.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/object/TransactedObjectReference.java 2009-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/object/TransactedObjectReference.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -7,6 +7,8 @@
package uk.ac.ncl.sdia.a8905943.stm.object;
import java.io.Serializable;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.locks.ReentrantLock;
import org.apache.commons.lang.builder.EqualsBuilder;
@@ -16,48 +18,49 @@
/** The serialVersionUID */
private static final long serialVersionUID = 2497531722707627406L;
final Long lookupIdentity;
- protected Object value;
- protected Long nextIdentity;
- protected Long version;
+ protected AtomicReference<Object> value = new AtomicReference<Object>();
+ //protected AtomicLong nextIdentity = new AtomicLong();
+ protected AtomicLong version = new AtomicLong();
transient final ReentrantLock prepared = new ReentrantLock(true);
+ protected transient Long preparedVersion ;
public TransactedObjectReference(Long identity, Object value, long version)
{
lookupIdentity = identity;
- this.value = value;
- this.version = version;
+ this.value.set( value);
+ this.version.set( version);
}
public Object getValue()
{
- return value;
+ return value.get();
}
public Long getLookupIdentity()
{
return lookupIdentity;
}
-
+/*
public Long getNextIdentity()
{
- return nextIdentity;
+ return nextIdentity.get();
}
public void setNextIdentity(Long nextIdentity)
{
- this.nextIdentity = nextIdentity;
- }
+ this.nextIdentity.set( nextIdentity);
+ }*/
public long getVersion()
{
- return version;
+ return version.get();
}
public void setVersion(long version)
{
- this.version = version;
+ this.version.set( version);
}
public void setValue(Object value)
{
- this.value = value;
+ this.value.set( value);
}
@Override
public boolean equals(Object other)
@@ -85,4 +88,14 @@
{
return prepared;
}
+
+ public Long getPreparedVersion()
+ {
+ return preparedVersion;
+ }
+
+ public void setPreparedVersion(Long preparedVersion)
+ {
+ this.preparedVersion = preparedVersion;
+ }
}
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/object/collection/AbstractTransactedCollectionReference.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/object/collection/AbstractTransactedCollectionReference.java 2009-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/object/collection/AbstractTransactedCollectionReference.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -7,6 +7,7 @@
package uk.ac.ncl.sdia.a8905943.stm.object.collection;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicLong;
import uk.ac.ncl.sdia.a8905943.stm.object.TransactedObjectReference;
@@ -16,6 +17,7 @@
/** The serialVersionUID */
private static final long serialVersionUID = -8692532420551821737L;
+ protected AtomicLong nextIdentity = new AtomicLong();;
public AbstractTransactedCollectionReference(Long identity, Object value, long version, Map<Long, TransactedObjectReference> transactionalFieldStore)
{
@@ -30,4 +32,14 @@
{
return getBuilder().construct(this);
}
+
+ protected Long getNextIdentity()
+ {
+ return nextIdentity.get();
+ }
+
+ protected void setNextIdentity(Long nextIdentity)
+ {
+ this.nextIdentity.set( nextIdentity);
+ }
}
Added: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/transaction/PrepareParameter.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/transaction/PrepareParameter.java (rev 0)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/transaction/PrepareParameter.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -0,0 +1,59 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package uk.ac.ncl.sdia.a8905943.stm.transaction;
+
+import java.util.Map;
+
+import uk.ac.ncl.sdia.a8905943.stm.object.TransactedObjectReference;
+
+/**
+ *
+ * This object encapsulates the variables needed to prepare a transaction.
+ *
+ * @author <a href="whitingjr at hotmail.com">Jeremy Whiting</a>
+ * @version $Revision: 1.1 $
+ */
+public final class PrepareParameter
+{
+ private final Map<Long, TransactedObjectReference> fieldMemory;
+
+ private final int retryCount;
+
+ private final long expiredTime;
+
+ private final STMTransaction transaction;
+
+ public PrepareParameter(Map<Long, TransactedObjectReference> fieldMemory, int retryCount, long expiredTime,
+ STMTransaction transaction)
+ {
+ this.fieldMemory = fieldMemory;
+ this.retryCount = retryCount;
+ this.expiredTime = expiredTime;
+ this.transaction = transaction;
+ }
+
+ public Map<Long, TransactedObjectReference> getFieldMemory()
+ {
+ return fieldMemory;
+ }
+
+ public int getRetryCount()
+ {
+ return retryCount;
+ }
+ public long getExpiredTime()
+ {
+ return expiredTime;
+ }
+
+
+ public STMTransaction getTransaction()
+ {
+ return transaction;
+ }
+
+}
\ No newline at end of file
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/transaction/STMTransaction.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/transaction/STMTransaction.java 2009-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/transaction/STMTransaction.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -7,6 +7,7 @@
package uk.ac.ncl.sdia.a8905943.stm.transaction;
import java.util.Map;
+import java.util.concurrent.CountDownLatch;
import uk.ac.ncl.sdia.a8905943.isolation.Isolation;
import uk.ac.ncl.sdia.a8905943.stm.field.FieldReadParameter;
@@ -31,6 +32,8 @@
public void startTransaction();
public Object load(LoadEntityParameter load);
public Map<Long, TransactedObjectReference> getDeferredWrites();
+ public Map<Long, TransactedObjectReference> getDeferredReads();
public void setStatus(int status);
public Long getVersion();
+ public CountDownLatch getPhaseTwoTerminated();
}
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/transaction/TransactionManager.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/transaction/TransactionManager.java 2009-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/java/uk/ac/ncl/sdia/a8905943/stm/transaction/TransactionManager.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -7,9 +7,11 @@
package uk.ac.ncl.sdia.a8905943.stm.transaction;
import java.util.ArrayDeque;
+import java.util.Collection;
import java.util.Deque;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@@ -17,13 +19,12 @@
import org.apache.log4j.Logger;
-import uk.ac.ncl.sdia.a8905943.factory.TransactionFactory;
import uk.ac.ncl.sdia.a8905943.impl.STMTransactionImpl;
import uk.ac.ncl.sdia.a8905943.stm.object.TransactedObjectReference;
public class TransactionManager
{
- private final Map<Long, STMTransactionImpl> transactionsKeyedByVersion = new ConcurrentHashMap<Long, STMTransactionImpl>();
+ private final ConcurrentMap<Long, STMTransactionImpl> transactionsKeyedByVersion = new ConcurrentHashMap<Long, STMTransactionImpl>();
private static final Logger logger = Logger.getLogger(TransactionManager.class);
public STMTransactionImpl findTransaction(Long version)
@@ -32,29 +33,16 @@
}
public boolean addTransaction(STMTransactionImpl transaction)
{
- return (null == this.transactionsKeyedByVersion.put(transaction.getVersion() , transaction) ? Boolean.TRUE.booleanValue(): Boolean.FALSE.booleanValue());
- }
-
- /**
- * The purpose of this method is to lock all resources needed by the transaction. Need to keep a list of the
- * fields locked. On a detected conflict backout. This means unlocking resources in reverse order.
- *
- * Also, between the validation and this prepare a concurrent transaction may have updated a
- * field. Need to validate again after aquiring the lock. Yes this is not a great performance but
- * at least it will work.
- * Doing the "lock then validate" in reverse closes any window for a concurrent transaction to update the
- * field. Again, upon any validation failure unlock the resources in reverse order.
- *
- * @param transaction the transaction to prepare
- * @return did the prepare of resources succeed without conflict
- */
- public boolean prepare(STMTransactionImpl transaction)
- {
boolean returnValue = false;
-
- //TODO: jrw complete implemenation
+ if (null != transaction)
+ {
+ Object present = this.transactionsKeyedByVersion.put(transaction.getVersion() , transaction);
+ returnValue = (null == present);
+ }
return returnValue;
}
+
+
/**
* The purpose of this validate is to check all the fields in the transaction object
* for reads that are now stale.
@@ -92,14 +80,16 @@
logger.info("STMTransaction has been called to abort the transaction.");
try
{
- if (Status.STATUS_PREPARED == transaction.getStatus())
- {// release all the locks on resources
- transaction.setStatus(Status.STATUS_MARKED_ROLLBACK);
- for (TransactedObjectReference reference : transaction.getDeferredWrites().values())
+ transaction.setStatus(Status.STATUS_MARKED_ROLLBACK);
+ for (TransactedObjectReference reference : transaction.getDeferredWrites().values())
+ {
+ TransactedObjectReference sharedReference = fieldMemory.get(reference.getLookupIdentity());
+ if (null != sharedReference)
{
- TransactedObjectReference sharedReference = fieldMemory.get(reference.getLookupIdentity());
if (sharedReference.getPrepared().isHeldByCurrentThread())
{
+ sharedReference.setPreparedVersion(null);
+ //sharedReference.notifyAll();
sharedReference.getPrepared().unlock();
}
else
@@ -107,62 +97,102 @@
logger.error("Problem occured, prepared lock is not held by current thread. Interleaving threads not working properly.");
}
}
- logger.info("STMTransaction has finished releasing all the locks aquired during prepare phase.");
}
+ logger.info("STMTransaction has finished releasing all the locks aquired during prepare phase.");
transaction.setStatus(Status.STATUS_ROLLEDBACK);
+ transaction.getPhaseTwoTerminated().countDown();
}
catch (Exception e)
{
logger.error(e.getMessage(), e);
}
}
+ /**
+ * The purpose of this method is to lock all resources needed by the transaction. Need to keep a list of the
+ * fields locked. On a detected conflict backout. This means unlocking resources in reverse order.
+ *
+ * Also, between the validation and this prepare a concurrent transaction may have updated a
+ * field. Need to validate again after aquiring the lock. Yes this is not a great performance but
+ * at least it will work.
+ * Doing the "lock then validate" in reverse closes any window for a concurrent transaction to update the
+ * field. Again, upon any validation failure unlock the resources in reverse order.
+ *
+ * @param transaction the transaction to prepare
+ * @return did the prepare of resources succeed without conflict
+ */
/**
* Purpose of this method is to prepare the transaction resources. Will acquire locks
- * on each field. On a detected conflict back out and retry. Either
+ * on each field. On a detected conflict back out and retry.
+ * On detected conflict with prepared transaction get the 2nd phase termination latch, wait (bounded timeout) for it to open.
+ * @param prepareParameter All the objects necessary to prepare the transaction
+ * @param writes
*
- * @param fieldMemory
- * @param writes
- * @param retryCount
- * @return
+ * @return prepared transaction, all reasources are locked
*/
- public boolean prepare(Map<Long, TransactedObjectReference> fieldMemory, Map<Long, TransactedObjectReference> writes, int retryCount, long expiredTime)
+ public boolean prepare(PrepareParameter prepareParameter)
{
logger.info("STMTransaction has been called to prepare transaction.");
boolean returnValue = false;
- for (int count = 0 ; count < retryCount ; count = count + 1)
+ for (int count = 0 ; count < prepareParameter.getRetryCount() ; count = count + 1)
{
boolean backout = false;
+ boolean abort = false;
CountDownLatch latch = null;
- Deque<TransactedObjectReference> lockedFields = new ArrayDeque<TransactedObjectReference>(writes.values().size());
- for (TransactedObjectReference write : writes.values())
+
+ Deque<TransactedObjectReference> lockedFields = new ArrayDeque<TransactedObjectReference>(prepareParameter.getTransaction().getDeferredWrites().values().size());
+ for (TransactedObjectReference write : prepareParameter.getTransaction().getDeferredWrites().values())
{// loop through the write list, attempt lock and validate
// try and get the lock
- boolean locked = fieldMemory.get(write.getLookupIdentity()).getPrepared().tryLock();
+ TransactedObjectReference sharedField = prepareParameter.getFieldMemory().get(write.getLookupIdentity());
+ boolean locked = sharedField.getPrepared().tryLock();
if (locked)
{
+ /* Invariant alert: small window between lock acquisition and setting of prepared version. TODO: refactor*/
+ sharedField.setPreparedVersion(prepareParameter.getTransaction().getVersion());
lockedFields.addFirst(write);
+ if (isStale(prepareParameter.getTransaction().getDeferredReads().get(write.getLookupIdentity()), prepareParameter.getFieldMemory().get(write.getLookupIdentity())))
+ {// this transaction is invalidated, the shared version of data has been updated
+ backout = true;
+ abort = true;
+ sharedField = null;
+ break;
+ }
// now validate to ensure the shared value is not updated between validation and lock
}
else
- {// conflict detected, determine whether to backout, this creates a DAG using the transaction version
- if (isBackoutNecessary(this.findTransaction( write.getVersion()), this.findTransaction(fieldMemory.get(write.getLookupIdentity()).getVersion())))
+ {// conflict detected, determine whether to backout, this creates a DAG using the transaction version
+ STMTransaction compareTo = this.findTransaction(sharedField.getPreparedVersion());
+ if (isBackoutNecessary(prepareParameter.getTransaction() , compareTo ))
{
backout = true;
- STMTransactionImpl preparedTransaction = this.findTransaction(fieldMemory.get(write.getLookupIdentity()).getVersion());
+ STMTransactionImpl preparedTransaction = this.findTransaction(prepareParameter.getFieldMemory().get(write.getLookupIdentity()).getVersion());
if (Status.STATUS_PREPARED == preparedTransaction.getStatus())
{// other transaction is prepared, get latch and wait for transaction 2nd phase termination
latch = preparedTransaction.getPhaseTwoTerminated();
+ preparedTransaction = null;
+ compareTo = null;
+ sharedField = null;
break;
}
}
else
{// entitled to acquire the lock
- fieldMemory.get(write.getLookupIdentity()).getPrepared().lock();
+ //prepareParameter.getFieldMemory().get(write.getLookupIdentity()).getPrepared().lock(); // this is going to block, is this really the desired behaviour ?
+ //TODO: check for livelock
+ backout = true;
}
}
}
+ if (!backout && null == latch)
+ {// no problem acquiring locks, clear out deque and change status
+ lockedFields.clear();
+ prepareParameter.getTransaction().setStatus(Status.STATUS_PREPARED);
+ returnValue = true;
+ break; // break out of retry loop
+ }
+
if (backout)
{// release all the locks acquired to complete backout
for (TransactedObjectReference locked : lockedFields)
@@ -171,6 +201,8 @@
{
if (locked.getPrepared().isHeldByCurrentThread())
{// small window here when this thread is barged from the lock
+ locked.setPreparedVersion(null);
+ locked.getPrepared().notifyAll();
locked.getPrepared().unlock();
}
}
@@ -179,12 +211,18 @@
logger.warn(imse.getMessage(), imse);
}
}
+ lockedFields.clear();
}
+ if (abort)
+ {// drop out of retry loop and return a false vote for prepared
+ break;
+ }
+
if (null != latch)
{// await the latch being released or timeout
try
{
- latch.await(expiredTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
+ latch.await(prepareParameter.getExpiredTime() - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
}
catch (InterruptedException ie)
{
@@ -192,9 +230,7 @@
}
}
}
-
-
- return false;
+ return returnValue;
}
/**
@@ -218,11 +254,53 @@
return returnValue;
}
- private boolean locksAcquired()
+ /**
+ * Make all the changes to the shared version of system state.
+ *
+ * @param transaction
+ * @param fieldMemory
+ * @return success indicator
+ */
+ public boolean commit(STMTransaction transaction, ConcurrentMap<Long, TransactedObjectReference> fieldMemory)
{
-
+ boolean returnValue = false;
+ boolean isValid = true;
+ // loop through all the writes and swap them for the current value.
+ Collection<TransactedObjectReference> collection = transaction.getDeferredWrites().values();
+ for (TransactedObjectReference deferredWrite : collection)
+ {// replace the values, retain the prepared lock
+ // quick validation nothing has been modified. should not happen because locks have been acquired.
+ TransactedObjectReference sharedReference = fieldMemory.get(deferredWrite.getLookupIdentity());
+ if (isStale( transaction.getDeferredReads().get( deferredWrite.getLookupIdentity()),sharedReference))
+ {
+ logger.error("STM TransactionManager has detected a validation error during commit. A field is stale. ["+deferredWrite.toString()+"]");
+ isValid = false;
+ break;
+ }
+ /* don't really want to substitute the shared version with the deferred write.
+ * should update values and use the count down latch to notify resource available. */
+ // go ahead and replace all the values inside the shared transacted reference.
+ sharedReference.setValue(deferredWrite.getValue());
+ sharedReference.setVersion(deferredWrite.getVersion());
+ sharedReference.setPreparedVersion(null);
+ }
+ if (isValid)
+ {
+ for (TransactedObjectReference deferredWrite : collection)
+ {// release the locks
+ TransactedObjectReference sharedReference = fieldMemory.get(deferredWrite.getLookupIdentity());
+ if (sharedReference.getPrepared().isHeldByCurrentThread())
+ {
+ sharedReference.getPrepared().unlock();
+ }
+ }
+ transaction.getPhaseTwoTerminated().countDown();
+ returnValue = true;
+ }
+ return returnValue;
}
+
private boolean isExpired(long expiryTime)
{
return expiryTime > System.currentTimeMillis();
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/resources/META-INF/jboss-aop.xml
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/resources/META-INF/jboss-aop.xml 2009-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/main/resources/META-INF/jboss-aop.xml 2009-09-04 14:04:52 UTC (rev 29182)
@@ -5,7 +5,7 @@
<aspect name="stminjectionaspect"
class="uk.ac.ncl.sdia.a8905943.aspects.STMInjectionAspect" />
- <bind
+ <!-- bind
pointcut="execution(* *->@uk.ac.ncl.sdia.a8905943.aspects.annotation.STMWriteable(..))">
<advice name="stmwrite" aspect="stmwriteaspect" />
</bind>
@@ -18,6 +18,20 @@
<bind
pointcut="field(uk.ac.ncl.sdia.a8905943.stm.STM *->@uk.ac.ncl.sdia.a8905943.stm.annotation.InjectedSTM )">
<advice name="access" aspect="stminjectionaspect" />
- </bind>
+ </bind-->
+ <bind
+ pointcut="execution(* *->@uk.ac.ncl.sdia.a8905943.aspects.annotation.STMWriteable(..))">
+ <advice name="stmwrite" aspect="stmwriteaspect" />
+ </bind>
+
+ <bind
+ pointcut="execution(* *->@uk.ac.ncl.sdia.a8905943.aspects.annotation.STMReadable(..))">
+ <advice name="stmread" aspect="stmreadaspect" />
+ </bind>
+
+ <bind
+ pointcut="field(uk.ac.ncl.sdia.a8905943.stm.STM *->@uk.ac.ncl.sdia.a8905943.stm.annotation.InjectedSTM )">
+ <advice name="access" aspect="stminjectionaspect" />
+ </bind>
</aop>
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/aspects/TestSTMReadAspect.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/aspects/TestSTMReadAspect.java 2009-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/aspects/TestSTMReadAspect.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -11,9 +11,9 @@
import org.junit.Test;
import uk.ac.ncl.sdia.a8905943.model.Bike;
-import uk.ac.ncl.sdia.a8905943.stm.AbstractTest;
+import uk.ac.ncl.sdia.a8905943.stm.AbstractUnitT;
-public class TestSTMReadAspect extends AbstractTest
+public class TestSTMReadAspect extends AbstractUnitT
{
/**
* This test checks the read aspect is invoked.
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/aspects/TestSTMWriteAspect.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/aspects/TestSTMWriteAspect.java 2009-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/aspects/TestSTMWriteAspect.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -5,7 +5,7 @@
import uk.ac.ncl.sdia.a8905943.model.Bike;
import uk.ac.ncl.sdia.a8905943.model.LeccyCar;
-import uk.ac.ncl.sdia.a8905943.stm.AbstractTest;
+import uk.ac.ncl.sdia.a8905943.stm.AbstractUnitT;
/*
* JBoss, the OpenSource J2EE webOS
@@ -14,7 +14,7 @@
* See terms of license at gnu.org.
*/
-public class TestSTMWriteAspect extends AbstractTest
+public class TestSTMWriteAspect extends AbstractUnitT
{
/**
* Use the mvn test command to execute
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/aspects/TestVersioningAspectImpl.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/aspects/TestVersioningAspectImpl.java 2009-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/aspects/TestVersioningAspectImpl.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -12,9 +12,9 @@
import org.junit.Test;
import uk.ac.ncl.sdia.a8905943.model.Car;
-import uk.ac.ncl.sdia.a8905943.stm.AbstractTest;
+import uk.ac.ncl.sdia.a8905943.stm.AbstractUnitT;
-public class TestVersioningAspectImpl extends AbstractTest
+public class TestVersioningAspectImpl extends AbstractUnitT
{
/* use the eclipse AOP debbugger to run these AOP test
* See README.txt for instructions to setup eclipse.
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/isolation/TestUnitRepeatableReadIsolationImpl.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/isolation/TestUnitRepeatableReadIsolationImpl.java 2009-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/isolation/TestUnitRepeatableReadIsolationImpl.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -14,11 +14,11 @@
import uk.ac.ncl.sdia.a8905943.handle.HandleUtils;
import uk.ac.ncl.sdia.a8905943.impl.STMTransactionImpl;
import uk.ac.ncl.sdia.a8905943.model.Car;
-import uk.ac.ncl.sdia.a8905943.stm.AbstractTest;
+import uk.ac.ncl.sdia.a8905943.stm.AbstractUnitT;
import uk.ac.ncl.sdia.a8905943.stm.field.FieldReadParameter;
import uk.ac.ncl.sdia.a8905943.stm.object.TransactedObjectReference;
-public class TestUnitRepeatableReadIsolationImpl extends AbstractTest
+public class TestUnitRepeatableReadIsolationImpl extends AbstractUnitT
{
@Test
Deleted: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/stm/AbstractTest.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/stm/AbstractTest.java 2009-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/stm/AbstractTest.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -1,58 +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;
-
-import java.sql.Connection;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import junit.framework.Assert;
-
-import org.junit.After;
-import org.junit.Before;
-
-import uk.ac.ncl.sdia.a8905943.factory.STMFactory;
-import uk.ac.ncl.sdia.a8905943.factory.TransactionFactory;
-import uk.ac.ncl.sdia.a8905943.stm.exception.IsolationLevelNotConfiguredException;
-import uk.ac.ncl.sdia.a8905943.stm.object.TransactedObjectReference;
-
-public class AbstractTest
-{
- protected STM stm = null;
- protected Map<Long, TransactedObjectReference> fieldStore = null;
- protected Map<String, List<Object>> modelStore = null;
-
-
- @Before
- public void setUp()
- {
- this.fieldStore = new ConcurrentHashMap<Long, TransactedObjectReference>();
- this.modelStore = new ConcurrentHashMap<String, List<Object>>();
- this.stm = new STM("retail", this.fieldStore, this.modelStore);
- STMFactory.getFactoryInstance().allocate(this.stm);
- stm.setCurrentTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
- try
- {
- this.stm.begin();
- }
- catch (IsolationLevelNotConfiguredException ilnce)
- {
- Assert.fail(ilnce.getMessage());
- }
- }
-
- @After
- public void tearDown()
- {
- STMFactory.getFactoryInstance().getCurrent().abort();
- STMFactory.getFactoryInstance().deallocate();
- TransactionFactory.getFactory().deallocate();
-
- }
-
-}
Copied: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/stm/AbstractUnitT.java (from rev 29036, labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/stm/AbstractTest.java)
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/stm/AbstractUnitT.java (rev 0)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/stm/AbstractUnitT.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -0,0 +1,60 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package uk.ac.ncl.sdia.a8905943.stm;
+
+import java.sql.Connection;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import junit.framework.Assert;
+
+import org.junit.After;
+import org.junit.Before;
+
+import uk.ac.ncl.sdia.a8905943.factory.STMFactory;
+import uk.ac.ncl.sdia.a8905943.factory.TransactionFactory;
+import uk.ac.ncl.sdia.a8905943.stm.exception.IsolationLevelNotConfiguredException;
+import uk.ac.ncl.sdia.a8905943.stm.object.TransactedObjectReference;
+
+public class AbstractUnitT
+{
+ protected STM stm = null;
+ protected ConcurrentMap<Long, TransactedObjectReference> fieldStore = null;
+ protected ConcurrentMap<String, List<Object>> modelStore = null;
+
+
+ @Before
+ public void setUp()
+ {
+ this.fieldStore = new ConcurrentHashMap<Long, TransactedObjectReference>();
+ this.modelStore = new ConcurrentHashMap<String, List<Object>>();
+ this.stm = new STM("retail", this.fieldStore, this.modelStore);
+ STMFactory.getFactoryInstance().allocate(this.stm);
+ stm.setCurrentTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
+ stm.setTimeout(10000);
+ try
+ {
+ this.stm.begin();
+ }
+ catch (IsolationLevelNotConfiguredException ilnce)
+ {
+ Assert.fail(ilnce.getMessage());
+ }
+
+ }
+
+ @After
+ public void tearDown()
+ {
+ STMFactory.getFactoryInstance().getCurrent().abort();
+ STMFactory.getFactoryInstance().deallocate();
+ TransactionFactory.getFactory().deallocate();
+
+ }
+
+}
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/stm/TestUnitModelReplicatedMemory.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/stm/TestUnitModelReplicatedMemory.java 2009-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/stm/TestUnitModelReplicatedMemory.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -26,7 +26,7 @@
* @author <a href="whitingjr at hotmail.com">Jeremy Whiting</a>
* @version $Revision: 1.1 $
*/
-public class TestUnitModelReplicatedMemory extends AbstractTest
+public class TestUnitModelReplicatedMemory extends AbstractUnitT
{
/**
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/stm/TestUnitSTM.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/stm/TestUnitSTM.java 2009-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/stm/TestUnitSTM.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -7,8 +7,8 @@
package uk.ac.ncl.sdia.a8905943.stm;
import java.util.List;
-import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import org.junit.Test;
@@ -22,8 +22,8 @@
public void checkIsolationSetBeforeBeginningTransaction()
throws IsolationLevelNotConfiguredException
{ // expected to throw an exception when stm instructred to begin before configured
- Map<Long, TransactedObjectReference> fieldStore = new ConcurrentHashMap<Long, TransactedObjectReference>();
- Map<String, List<Object>> modelStore = new ConcurrentHashMap<String, List<Object>>();
+ ConcurrentMap<Long, TransactedObjectReference> fieldStore = new ConcurrentHashMap<Long, TransactedObjectReference>();
+ ConcurrentMap<String, List<Object>> modelStore = new ConcurrentHashMap<String, List<Object>>();
STM stm = new STM("retail", fieldStore, modelStore);
STMFactory.getFactoryInstance().allocate(stm);
Modified: labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/stm/transaction/TestUnitTransactionManager.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/stm/transaction/TestUnitTransactionManager.java 2009-09-04 14:03:20 UTC (rev 29181)
+++ labs/jbosstm/workspace/whitingjr/trunk/MVCCSampleSTM/src/test/java/uk/ac/ncl/sdia/a8905943/stm/transaction/TestUnitTransactionManager.java 2009-09-04 14:04:52 UTC (rev 29182)
@@ -6,18 +6,27 @@
*/
package uk.ac.ncl.sdia.a8905943.stm.transaction;
+import java.sql.Connection;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
+
+import javax.transaction.Status;
+
import junit.framework.Assert;
import org.junit.Test;
+import uk.ac.ncl.sdia.a8905943.factory.STMFactory;
import uk.ac.ncl.sdia.a8905943.factory.TransactionFactory;
import uk.ac.ncl.sdia.a8905943.handle.HandleUtils;
import uk.ac.ncl.sdia.a8905943.impl.STMTransactionImpl;
import uk.ac.ncl.sdia.a8905943.model.Car;
-import uk.ac.ncl.sdia.a8905943.stm.AbstractTest;
+import uk.ac.ncl.sdia.a8905943.stm.AbstractUnitT;
+import uk.ac.ncl.sdia.a8905943.stm.STM;
+import uk.ac.ncl.sdia.a8905943.stm.exception.IsolationLevelNotConfiguredException;
import uk.ac.ncl.sdia.a8905943.stm.object.TransactedObjectReference;
-public class TestUnitTransactionManager extends AbstractTest
+public class TestUnitTransactionManager extends AbstractUnitT
{
/**
* This test constructs a valid number of reads and validates them against the shared version.
@@ -65,10 +74,177 @@
TransactedObjectReference concurrentUpdate = new TransactedObjectReference(handle, make, 3l);
this.fieldStore.put(handle, concurrentUpdate);
- TransactionManager transactionManager = new TransactionManager();
Assert.assertEquals(1, transaction.getDeferredReads().size());
Assert.assertEquals( 1, this.fieldStore.size());
- Assert.assertFalse( transactionManager.validate(transaction, this.fieldStore));
+ Assert.assertFalse( this.stm.prepare());
}
+ @Test
+ public void testPrepareOnNoConflictTransactionWorks()
+ {
+ Assert.assertNotNull(TransactionFactory.getFactory());
+ STMTransactionImpl transaction =(STMTransactionImpl) TransactionFactory.getFactory().getCurrentTransaction(false);
+ Assert.assertNotNull(transaction);
+ Assert.assertEquals(Status.STATUS_ACTIVE, transaction.getStatus());
+ Long id = 3l;
+ String make = "Jaguar";
+ String buyOutMake = "Ford";
+ Long version = 0l;
+ Car car = new Car(id);
+ Long handle = new HandleUtils().getHandle(Car.class, id, "make") ;
+ TransactedObjectReference reference = new TransactedObjectReference(handle, make, version);
+ this.fieldStore.put(handle, reference);
+
+ Assert.assertEquals(make, car.getMake());// puts the read in the transaction history
+ car.setMake(buyOutMake);
+
+ Assert.assertEquals(1, transaction.getDeferredReads().size());
+ Assert.assertEquals( 1, this.fieldStore.size());
+
+ Assert.assertTrue(this.stm.prepare());
+ Assert.assertNotNull(reference.getPrepared());
+ Assert.assertTrue(reference.getPrepared().isLocked()); // only one resource locked during prepare
+ Assert.assertEquals(Status.STATUS_PREPARED, transaction.getStatus());
+ }
+
+ @Test
+ public void testPrepareOnConflictBackoutWorks()
+ {
+ Assert.assertNotNull(TransactionFactory.getFactory());
+ STMTransactionImpl transaction =(STMTransactionImpl) TransactionFactory.getFactory().getCurrentTransaction(false);
+ Assert.assertNotNull(transaction);
+ Assert.assertEquals(Status.STATUS_ACTIVE, transaction.getStatus());
+ Long id = 3l;
+ String make = "Jaguar";
+ String buyOutMake = "Ford";
+ Long version = 0l;
+ Car car = new Car(id);
+ Long handle = new HandleUtils().getHandle(Car.class, id, "make") ;
+ TransactedObjectReference reference = new TransactedObjectReference(handle, make, version);
+ this.fieldStore.put(handle, reference);
+
+ Assert.assertEquals(make, car.getMake());// puts the read in the transaction history
+ car.setMake(buyOutMake);
+ Executor executor = new TransactionExecutor();
+ ConflictingRunnableTransaction conflicting = new ConflictingRunnableTransaction(this.stm);
+ CountDownLatch latch = conflicting.getLatch();
+ executor.execute(conflicting);
+ try
+ {// this will wait till the other thread has finished processing, the field will be locked
+ latch.await();
+ }
+ catch (InterruptedException ie)
+ {
+ }
+
+ Assert.assertTrue(reference.getPrepared().isLocked());
+
+ Assert.assertEquals(1, transaction.getDeferredReads().size());
+ Assert.assertEquals( 1, this.fieldStore.size());
+
+ Assert.assertFalse(this.stm.prepare());
+ Assert.assertFalse(reference.getPrepared().isHeldByCurrentThread()); // only one resource locked during prepare
+ Assert.assertEquals(Status.STATUS_MARKED_ROLLBACK, transaction.getStatus());
+ }
+
+ @Test
+ public void testPrepareAbortInvalidStaleStateDetected()
+ {
+ Assert.assertNotNull(TransactionFactory.getFactory());
+ STMTransactionImpl transaction =(STMTransactionImpl) TransactionFactory.getFactory().getCurrentTransaction(false);
+ Assert.assertNotNull(transaction);
+ Assert.assertEquals(Status.STATUS_ACTIVE, transaction.getStatus());
+ Long id = 3l;
+ String make = "Jaguar";
+ String buyOutMake = "Ford";
+ Long version = 0l;
+ Car car = new Car(id);
+ Long handle = new HandleUtils().getHandle(Car.class, id, "make") ;
+ TransactedObjectReference reference = new TransactedObjectReference(handle, make, version);
+ this.fieldStore.put(handle, reference);
+ Assert.assertEquals(make, car.getMake());
+ car.setMake(buyOutMake);
+ reference.setValue("BMW");
+ reference.setVersion(Long.MAX_VALUE);
+ Assert.assertFalse(this.stm.prepare());
+
+ }
+ @Test
+ public void testCommitWorks()
+ {
+ Assert.assertNotNull(TransactionFactory.getFactory());
+ STMTransactionImpl transaction =(STMTransactionImpl) TransactionFactory.getFactory().getCurrentTransaction(false);
+ Assert.assertNotNull(transaction);
+ Assert.assertEquals(Status.STATUS_ACTIVE, transaction.getStatus());
+ Long id = 3l;
+ String make = "Jaguar";
+ String buyOutMake = "Ford";
+ Long version = 0l;
+ Car car = new Car(id);
+ Long handle = new HandleUtils().getHandle(Car.class, id, "make") ;
+ TransactedObjectReference reference = new TransactedObjectReference(handle, make, version);
+ this.fieldStore.put(handle, reference);
+
+ Assert.assertEquals(make, car.getMake());// puts the read in the transaction history
+ car.setMake(buyOutMake);
+
+ Assert.assertEquals(1, transaction.getDeferredReads().size());
+ Assert.assertEquals( 1, this.fieldStore.size());
+
+ Assert.assertTrue(this.stm.prepare());
+ Assert.assertNotNull(reference.getPrepared());
+ Assert.assertTrue(reference.getPrepared().isLocked()); // only one resource locked during prepare
+ Assert.assertEquals(Status.STATUS_PREPARED, transaction.getStatus());
+ Assert.assertTrue(this.stm.commit());
+ Assert.assertEquals(buyOutMake, reference.getValue());
+
+ }
+ public class TransactionExecutor implements Executor
+ {
+ @Override
+ public void execute(Runnable command)
+ {
+ new Thread(command).start();
+ }
+ }
+ public class ConflictingRunnableTransaction implements Runnable
+ {
+ private final STM stm;
+ private final CountDownLatch latch = new CountDownLatch(1);
+ public CountDownLatch getLatch()
+ {
+ return latch;
+ }
+ @Override
+ public void run()
+ {// this is meant to lock the reference and hold onto it
+ this.stm.setCurrentTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
+ this.stm.setTimeout(10000);
+ STMFactory.getFactoryInstance().allocate(this.stm);
+ try
+ {
+ this.stm.begin();
+ }
+ catch (IsolationLevelNotConfiguredException ilnce)
+ {
+ Assert.fail(ilnce.getMessage());
+ }
+ STMTransactionImpl transaction = (STMTransactionImpl)TransactionFactory.getFactory().getCurrentTransaction(false);
+ Assert.assertNotNull(transaction);
+ Long id = 3l;
+ Car car = new Car(id);
+ Long handle = new HandleUtils().getHandle(Car.class, id, "make") ;
+ car.setMake("Fiat");
+ Assert.assertEquals(1, this.stm.getFieldStore().size());
+ TransactedObjectReference reference = this.stm.getFieldStore().get(handle);
+ reference.getPrepared().lock();// that's it locked, job done
+ reference.setPreparedVersion(transaction.getVersion());
+ this.latch.countDown();
+ }
+ public ConflictingRunnableTransaction(STM stmref)
+ {
+ this.stm = stmref;
+ }
+
+ }
}
More information about the jboss-svn-commits
mailing list