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 ;