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 2018/11/17 17:20:31 UTC

[05/34] jena git commit: JENA-1626: Txn improvements.

JENA-1626: Txn improvements.

Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/11601415
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/11601415
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/11601415

Branch: refs/heads/master
Commit: 11601415baf9868257c963be1ead7b5f200dce65
Parents: 68bc110
Author: Andy Seaborne <an...@apache.org>
Authored: Fri Nov 9 20:42:08 2018 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Tue Nov 13 15:39:14 2018 +0000

----------------------------------------------------------------------
 .../sparql/core/DatasetGraphTrackActive.java    | 18 +++++++++++
 .../main/java/org/apache/jena/system/Txn.java   | 24 ++++++++++++---
 .../java/org/apache/jena/system/TestTxn.java    | 32 +++++++++++++++++---
 3 files changed, 66 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/11601415/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphTrackActive.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphTrackActive.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphTrackActive.java
index ec323d4..79ac32f 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphTrackActive.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphTrackActive.java
@@ -48,6 +48,12 @@ public abstract class DatasetGraphTrackActive extends DatasetGraphWrapper
     }
 
     @Override
+    public final boolean promote() {
+        checkActive();
+        return _promote();
+    }
+
+    @Override
     public final boolean promote(Promote promoteMode) {
         checkActive();
         return _promote(promoteMode);
@@ -74,6 +80,18 @@ public abstract class DatasetGraphTrackActive extends DatasetGraphWrapper
     @Override
     public abstract boolean isInTransaction() ;
     protected abstract void _begin(TxnType txnType);
+    
+    // Decide promotion mode before passing on with mode.
+    protected boolean _promote() {
+        // Safe choice for READ and WRITE. 
+        Promote promoteMode = Promote.ISOLATED;
+        
+        TxnType txnType = transactionType();
+        if ( txnType == TxnType.READ_COMMITTED_PROMOTE )
+            promoteMode = Promote.READ_COMMITTED;
+        return _promote(promoteMode);
+    }
+    
     protected abstract boolean _promote(Promote promoteMode) ;
     protected abstract void _commit() ;
     protected abstract void _abort() ;

http://git-wip-us.apache.org/repos/asf/jena/blob/11601415/jena-arq/src/main/java/org/apache/jena/system/Txn.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/system/Txn.java b/jena-arq/src/main/java/org/apache/jena/system/Txn.java
index 4ab2c82..1f13495 100644
--- a/jena-arq/src/main/java/org/apache/jena/system/Txn.java
+++ b/jena-arq/src/main/java/org/apache/jena/system/Txn.java
@@ -141,21 +141,37 @@ public class Txn {
         if ( outerTxnType == null ) 
             // Not in an outer transaction.
             return;
-        // innerTxnType must be "less than or equal to the outer.
+        // innerTxnType must be "less than or equal to the outer".
+        //    TxnType.level == int?
         // Inner is READ works with any outer.
         // Outer is WRITE works with any inner. 
         // Must match:
         // Outer is READ, then inner must be READ.
         // Promotion must be the same.
+        
+        // Outer any, inner READ 
         if ( TxnType.READ.equals(innerTxnType) )
             return;
+           // Outer WRITE, inner any 
         if ( TxnType.WRITE.equals(outerTxnType) )
             return;
+        if ( TxnType.READ.equals(outerTxnType) )
+            throw new JenaTransactionException("Already in a READ transaction: outer="+outerTxnType+" : inner="+innerTxnType);
+        
+        // Outer PROMOTE (either kind), inner is not READ.
+        // Try to promote outer if inner is WRITE.
+        if ( innerTxnType == TxnType.WRITE ) {
+            boolean x = txn.promote();
+            if ( x )
+                return ;
+            throw new JenaTransactionException("Can't promote outer transaction: "+"outer="+outerTxnType+" : inner="+innerTxnType);
+        }
+        
         if ( Objects.equals(innerTxnType, outerTxnType) )
             return;
-        throw new JenaTransactionException("Already in a transaction of an incompatable type: "
-                                          +"outer="+outerTxnType+" : inner="+innerTxnType);
-    }        
+        
+        throw new JenaTransactionException("Already in a transaction of an incompatable type: "+"outer="+outerTxnType+" : inner="+innerTxnType);
+    }
     
     // Attempt some kind of cleanup.
     private static <T extends Transactional> void onThrowable(Throwable th, T txn) {

http://git-wip-us.apache.org/repos/asf/jena/blob/11601415/jena-arq/src/test/java/org/apache/jena/system/TestTxn.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/system/TestTxn.java b/jena-arq/src/test/java/org/apache/jena/system/TestTxn.java
index 901b9c6..f098f95 100644
--- a/jena-arq/src/test/java/org/apache/jena/system/TestTxn.java
+++ b/jena-arq/src/test/java/org/apache/jena/system/TestTxn.java
@@ -312,18 +312,42 @@ public class TestTxn {
         });
     }
 
-    @Test(expected=JenaTransactionException.class)
+    @Test
     public void txn_nested_10() {
         Txn.exec(counter, TxnType.READ_PROMOTE, ()->{
-            // Must the same type to nest Txn.
+            // Can promote outer.
             Txn.exec(counter, TxnType.WRITE, ()->{});
         });
     }
 
-    @Test(expected=JenaTransactionException.class)
+    @Test
     public void txn_nested_11() {
         Txn.exec(counter, TxnType.READ_COMMITTED_PROMOTE, ()->{
-            // Must the same type to nest Txn.
+            // Can promote outer.
+            Txn.exec(counter, TxnType.WRITE, ()->{});
+        });
+    }
+    
+    @Test(expected=JenaTransactionException.class)
+    public void txn_nested_12() {
+        Txn.exec(counter, TxnType.READ_PROMOTE, ()->{
+            // Block promote by doing a W txn on another thread.
+            ThreadAction.create(
+                ()->Txn.executeWrite(counter, ()->counter.inc())
+                ).run();
+            // Can not promote outer.
+            Txn.exec(counter, TxnType.WRITE, ()->{});
+        });
+    }
+    
+    @Test
+    public void txn_nested_13() {
+        Txn.exec(counter, TxnType.READ_COMMITTED_PROMOTE, ()->{
+            // Does not block promote
+            ThreadAction.create(
+                ()->Txn.executeWrite(counter, ()->counter.inc())
+                ).run();
+            // Can promote outer.
             Txn.exec(counter, TxnType.WRITE, ()->{});
         });
     }