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, ()->{});
});
}