You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2012/04/03 18:01:57 UTC
svn commit: r1309006 - in /incubator/jena/Jena2/TDB/trunk/src:
main/java/com/hp/hpl/jena/tdb/migrate/
main/java/com/hp/hpl/jena/tdb/transaction/
test/java/com/hp/hpl/jena/tdb/transaction/
Author: andy
Date: Tue Apr 3 16:01:56 2012
New Revision: 1309006
URL: http://svn.apache.org/viewvc?rev=1309006&view=rev
Log:
JENA-230 Concurrent access to a transctional dataset.
Solution: thread local variables.
Modified:
incubator/jena/Jena2/TDB/trunk/src/main/java/com/hp/hpl/jena/tdb/migrate/DatasetGraphTrackActive.java
incubator/jena/Jena2/TDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/DatasetGraphTransaction.java
incubator/jena/Jena2/TDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/TransactionManager.java
incubator/jena/Jena2/TDB/trunk/src/test/java/com/hp/hpl/jena/tdb/transaction/T_TransSystem.java
Modified: incubator/jena/Jena2/TDB/trunk/src/main/java/com/hp/hpl/jena/tdb/migrate/DatasetGraphTrackActive.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/TDB/trunk/src/main/java/com/hp/hpl/jena/tdb/migrate/DatasetGraphTrackActive.java?rev=1309006&r1=1309005&r2=1309006&view=diff
==============================================================================
--- incubator/jena/Jena2/TDB/trunk/src/main/java/com/hp/hpl/jena/tdb/migrate/DatasetGraphTrackActive.java (original)
+++ incubator/jena/Jena2/TDB/trunk/src/main/java/com/hp/hpl/jena/tdb/migrate/DatasetGraphTrackActive.java Tue Apr 3 16:01:56 2012
@@ -81,9 +81,9 @@ public abstract class DatasetGraphTrackA
public boolean isInTransaction() { return inTransaction ; }
protected abstract void _begin(ReadWrite readWrite) ;
- protected abstract void _commit() ;
- protected abstract void _abort() ;
- protected abstract void _end() ;
+ protected abstract void _commit() ;
+ protected abstract void _abort() ;
+ protected abstract void _end() ;
@Override
public void close()
Modified: incubator/jena/Jena2/TDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/DatasetGraphTransaction.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/TDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/DatasetGraphTransaction.java?rev=1309006&r1=1309005&r2=1309006&view=diff
==============================================================================
--- incubator/jena/Jena2/TDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/DatasetGraphTransaction.java (original)
+++ incubator/jena/Jena2/TDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/DatasetGraphTransaction.java Tue Apr 3 16:01:56 2012
@@ -37,7 +37,34 @@ public class DatasetGraphTransaction ext
* inside transactions.
*/
- private DatasetGraphTxn dsgTxn = null ;
+ static class ThreadLocalTxn extends ThreadLocal<DatasetGraphTxn>
+ {
+ // This is the default implementation - but nice to give it a name and to set it clearly.
+ @Override protected DatasetGraphTxn initialValue() {
+ return null ;
+ }
+ }
+
+ static class ThreadLocalBoolean extends ThreadLocal<Boolean>
+ {
+ // This is the default implementation - but nice to give it a name and to set it clearly.
+ @Override protected Boolean initialValue() {
+ return Boolean.FALSE ;
+ }
+ }
+
+
+ @Override
+ protected void finalize() throws Throwable
+ {
+ txn.remove() ;
+ }
+
+ // Transaction per thread.
+ private Object lock = new Object() ;
+ private ThreadLocalTxn txn = new ThreadLocalTxn() ;
+ private ThreadLocalBoolean inTransaction = new ThreadLocalBoolean() ;
+
private boolean haveUsedInTransaction = false ;
private final StoreConnection sConn ;
@@ -68,6 +95,7 @@ public class DatasetGraphTransaction ext
{
if ( isInTransaction() )
{
+ DatasetGraphTxn dsgTxn = txn.get() ;
if ( dsgTxn == null )
throw new TDBTransactionException("In a transaction but no transactional DatasetGraph") ;
return dsgTxn ;
@@ -93,30 +121,43 @@ public class DatasetGraphTransaction ext
if ( haveUsedInTransaction && isInTransaction() )
throw new JenaTransactionException("Currently in a transaction ("+getLocation()+")") ;
}
+
+ @Override
+ public boolean isInTransaction()
+ { return inTransaction.get() ; }
@Override
protected void _begin(ReadWrite readWrite)
{
- haveUsedInTransaction = true ;
- dsgTxn = sConn.begin(readWrite) ;
+ synchronized(lock)
+ {
+ haveUsedInTransaction = true ;
+ DatasetGraphTxn dsgTxn = sConn.begin(readWrite) ;
+ txn.set(dsgTxn) ;
+ inTransaction.set(true) ;
+ }
}
@Override
protected void _commit()
{
- dsgTxn.commit() ;
+ txn.get().commit() ;
+ inTransaction.set(false) ;
}
@Override
protected void _abort()
{
- dsgTxn.abort() ;
+ txn.get().abort() ;
+ inTransaction.set(false) ;
}
@Override
protected void _end()
{
- dsgTxn.end() ;
+ txn.get().end() ;
+ inTransaction.set(false) ;
+ txn.set(null) ;
}
@Override
Modified: incubator/jena/Jena2/TDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/TransactionManager.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/TDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/TransactionManager.java?rev=1309006&r1=1309005&r2=1309006&view=diff
==============================================================================
--- incubator/jena/Jena2/TDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/TransactionManager.java (original)
+++ incubator/jena/Jena2/TDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/TransactionManager.java Tue Apr 3 16:01:56 2012
@@ -317,7 +317,7 @@ public class TransactionManager
return begin$(mode, label) ;
}
- public static boolean DEBUG = false ;
+ public static final boolean DEBUG = false ;
synchronized
private DatasetGraphTxn begin$(ReadWrite mode, String label)
Modified: incubator/jena/Jena2/TDB/trunk/src/test/java/com/hp/hpl/jena/tdb/transaction/T_TransSystem.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/TDB/trunk/src/test/java/com/hp/hpl/jena/tdb/transaction/T_TransSystem.java?rev=1309006&r1=1309005&r2=1309006&view=diff
==============================================================================
--- incubator/jena/Jena2/TDB/trunk/src/test/java/com/hp/hpl/jena/tdb/transaction/T_TransSystem.java (original)
+++ incubator/jena/Jena2/TDB/trunk/src/test/java/com/hp/hpl/jena/tdb/transaction/T_TransSystem.java Tue Apr 3 16:01:56 2012
@@ -85,7 +85,10 @@ public class T_TransSystem
private static boolean silent = false ; // No progress output
static {
- TransactionManager.DEBUG = inlineProgress ; // This cause one character details to be printed.
+ //TransactionManager.DEBUG = inlineProgress ; // This cause one character details to be printed.
+ if ( TransactionManager.DEBUG != inlineProgress )
+ log.warn("TransactionManager.DEBUG != inlineProgress (need chnage siurce code to make DEBUG no final)" ) ;
+
// Various flags (may not still exist)
//ObjectFileStorage.logging = true ;