Author: timothyjward
Date: Wed Apr 20 23:08:55 2016
New Revision: 1740209
URL: http://svn.apache.org/viewvc?rev=1740209&view=rev
Log:
[tx-control] Add support for read-only transactions
Modified:
aries/trunk/tx-control/tx-control-api/src/main/java/org/osgi/service/transaction/control/TransactionBuilder.java
aries/trunk/tx-control/tx-control-api/src/main/java/org/osgi/service/transaction/control/TransactionContext.java
aries/trunk/tx-control/tx-control-service-common/src/main/java/org/apache/aries/tx/control/service/common/impl/AbstractTransactionControlImpl.java
aries/trunk/tx-control/tx-control-service-common/src/main/java/org/apache/aries/tx/control/service/common/impl/NoTransactionContextImpl.java
aries/trunk/tx-control/tx-control-service-local/src/main/java/org/apache/aries/tx/control/service/local/impl/TransactionContextImpl.java
aries/trunk/tx-control/tx-control-service-local/src/main/java/org/apache/aries/tx/control/service/local/impl/TransactionControlImpl.java
aries/trunk/tx-control/tx-control-service-local/src/test/java/org/apache/aries/tx/control/service/local/impl/TransactionContextTest.java
aries/trunk/tx-control/tx-control-service-xa/src/main/java/org/apache/aries/tx/control/service/xa/impl/TransactionContextImpl.java
aries/trunk/tx-control/tx-control-service-xa/src/main/java/org/apache/aries/tx/control/service/xa/impl/TransactionControlImpl.java
aries/trunk/tx-control/tx-control-service-xa/src/test/java/org/apache/aries/tx/control/service/xa/impl/TransactionContextTest.java
Modified:
aries/trunk/tx-control/tx-control-api/src/main/java/org/osgi/service/transaction/control/TransactionBuilder.java
URL:
http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-api/src/main/java/org/osgi/service/transaction/control/TransactionBuilder.java?rev=1740209&r1=1740208&r2=1740209&view=diff
==============================================================================
---
aries/trunk/tx-control/tx-control-api/src/main/java/org/osgi/service/transaction/control/TransactionBuilder.java
(original)
+++
aries/trunk/tx-control/tx-control-api/src/main/java/org/osgi/service/transaction/control/TransactionBuilder.java
Wed Apr 20 23:08:55 2016
@@ -131,4 +131,23 @@ public abstract class TransactionBuilder
noRollbackFor.addAll(Arrays.asList(throwables));
return this;
}
+
+ /**
+ * Indicate to the Transaction Control service that this transaction
+ * will be read-only. This hint may be used by the Transaction Control
+ * service and associated resources to optimise the transaction.
+ *
+ * <p>
+ * Note that this method is for optimisation purposes only. The
TransactionControl
+ * service is free to ignore the call if it does not offer read-only
optimisation.
+ *
+ * <p>
+ * If a transaction is marked read-only and then the scoped work
performs a write
+ * operation on a resource then this is a programming error. The
resource is
+ * free to raise an exception when the write is attempted, or to permit
the write
+ * operation. As a result the transaction may commit successfully, or
may rollback.
+ *
+ * @return this builder
+ */
+ public abstract TransactionBuilder readOnly();
}
Modified:
aries/trunk/tx-control/tx-control-api/src/main/java/org/osgi/service/transaction/control/TransactionContext.java
URL:
http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-api/src/main/java/org/osgi/service/transaction/control/TransactionContext.java?rev=1740209&r1=1740208&r2=1740209&view=diff
==============================================================================
---
aries/trunk/tx-control/tx-control-api/src/main/java/org/osgi/service/transaction/control/TransactionContext.java
(original)
+++
aries/trunk/tx-control/tx-control-api/src/main/java/org/osgi/service/transaction/control/TransactionContext.java
Wed Apr 20 23:08:55 2016
@@ -99,6 +99,14 @@ public interface TransactionContext {
boolean supportsLocal();
/**
+ * @return true if the TransactionContext supports read-only
optimisations
+ * <em>and</em> the transaction was marked read only. In particular it
is
+ * legal for this method to return false even if the transaction was
marked
+ * read only by the initiating client.
+ */
+ boolean isReadOnly();
+
+ /**
* Register an XA resource with the current transaction
*
* @param resource
Modified:
aries/trunk/tx-control/tx-control-service-common/src/main/java/org/apache/aries/tx/control/service/common/impl/AbstractTransactionControlImpl.java
URL:
http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-service-common/src/main/java/org/apache/aries/tx/control/service/common/impl/AbstractTransactionControlImpl.java?rev=1740209&r1=1740208&r2=1740209&view=diff
==============================================================================
---
aries/trunk/tx-control/tx-control-service-common/src/main/java/org/apache/aries/tx/control/service/common/impl/AbstractTransactionControlImpl.java
(original)
+++
aries/trunk/tx-control/tx-control-service-common/src/main/java/org/apache/aries/tx/control/service/common/impl/AbstractTransactionControlImpl.java
Wed Apr 20 23:08:55 2016
@@ -24,6 +24,14 @@ public abstract class AbstractTransactio
private final class TransactionBuilderImpl extends TransactionBuilder {
+ private boolean readOnly = false;
+
+ @Override
+ public TransactionBuilder readOnly() {
+ readOnly = true;
+ return this;
+ }
+
private void checkExceptions() {
List<Class<? extends Throwable>> duplicates =
rollbackFor.stream()
.filter(noRollbackFor::contains)
@@ -56,10 +64,12 @@ public abstract class AbstractTransactio
currentCoord = coordinator.begin(
"Resource-Local-Transaction.REQUIRED", 30000);
endCoordination = true;
- currentTran =
startTransaction(currentCoord);
+ currentTran =
startTransaction(currentCoord, readOnly);
endTransaction = true;
currentCoord.getVariables().put(TransactionContextKey.class,
currentTran);
+ } else if (currentTran.isReadOnly() &&
!readOnly){
+ throw new TransactionException("A read
only transaction is currently active, and cannot be upgraded to a writeable
transaction");
}
} catch (RuntimeException re) {
if(endTransaction) {
@@ -85,7 +95,7 @@ public abstract class AbstractTransactio
currentCoord = coordinator.begin(
"Resource-Local-Transaction.REQUIRES_NEW", 30000);
- currentTran = startTransaction(currentCoord);
+ currentTran = startTransaction(currentCoord,
readOnly);
currentCoord.getVariables().put(TransactionContextKey.class,
currentTran);
} catch (RuntimeException re) {
@@ -271,7 +281,7 @@ public abstract class AbstractTransactio
coordinator = c;
}
- protected abstract AbstractTransactionContextImpl
startTransaction(Coordination currentCoord);
+ protected abstract AbstractTransactionContextImpl
startTransaction(Coordination currentCoord, boolean readOnly);
@Override
public TransactionBuilder build() {
Modified:
aries/trunk/tx-control/tx-control-service-common/src/main/java/org/apache/aries/tx/control/service/common/impl/NoTransactionContextImpl.java
URL:
http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-service-common/src/main/java/org/apache/aries/tx/control/service/common/impl/NoTransactionContextImpl.java?rev=1740209&r1=1740208&r2=1740209&view=diff
==============================================================================
---
aries/trunk/tx-control/tx-control-service-common/src/main/java/org/apache/aries/tx/control/service/common/impl/NoTransactionContextImpl.java
(original)
+++
aries/trunk/tx-control/tx-control-service-common/src/main/java/org/apache/aries/tx/control/service/common/impl/NoTransactionContextImpl.java
Wed Apr 20 23:08:55 2016
@@ -83,6 +83,11 @@ public class NoTransactionContextImpl ex
}
@Override
+ public boolean isReadOnly() {
+ return false;
+ }
+
+ @Override
protected boolean isAlive() {
return !finished.get();
}
Modified:
aries/trunk/tx-control/tx-control-service-local/src/main/java/org/apache/aries/tx/control/service/local/impl/TransactionContextImpl.java
URL:
http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-service-local/src/main/java/org/apache/aries/tx/control/service/local/impl/TransactionContextImpl.java?rev=1740209&r1=1740208&r2=1740209&view=diff
==============================================================================
---
aries/trunk/tx-control/tx-control-service-local/src/main/java/org/apache/aries/tx/control/service/local/impl/TransactionContextImpl.java
(original)
+++
aries/trunk/tx-control/tx-control-service-local/src/main/java/org/apache/aries/tx/control/service/local/impl/TransactionContextImpl.java
Wed Apr 20 23:08:55 2016
@@ -24,10 +24,14 @@ public class TransactionContextImpl exte
final List<LocalResource> resources = new ArrayList<>();
+ private final boolean readOnly;
+
private AtomicReference<TransactionStatus> tranStatus = new
AtomicReference<>(ACTIVE);
- public TransactionContextImpl(Coordination coordination) {
+
+ public TransactionContextImpl(Coordination coordination, boolean
readOnly) {
super(coordination);
+ this.readOnly = readOnly;
}
@Override
@@ -134,6 +138,11 @@ public class TransactionContextImpl exte
}
@Override
+ public boolean isReadOnly() {
+ return readOnly;
+ }
+
+ @Override
protected boolean isAlive() {
TransactionStatus status = tranStatus.get();
return status != COMMITTED && status != ROLLED_BACK;
Modified:
aries/trunk/tx-control/tx-control-service-local/src/main/java/org/apache/aries/tx/control/service/local/impl/TransactionControlImpl.java
URL:
http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-service-local/src/main/java/org/apache/aries/tx/control/service/local/impl/TransactionControlImpl.java?rev=1740209&r1=1740208&r2=1740209&view=diff
==============================================================================
---
aries/trunk/tx-control/tx-control-service-local/src/main/java/org/apache/aries/tx/control/service/local/impl/TransactionControlImpl.java
(original)
+++
aries/trunk/tx-control/tx-control-service-local/src/main/java/org/apache/aries/tx/control/service/local/impl/TransactionControlImpl.java
Wed Apr 20 23:08:55 2016
@@ -12,8 +12,8 @@ public class TransactionControlImpl exte
}
@Override
- protected AbstractTransactionContextImpl startTransaction(Coordination
currentCoord) {
- return new TransactionContextImpl(currentCoord);
+ protected AbstractTransactionContextImpl startTransaction(Coordination
currentCoord, boolean readOnly) {
+ return new TransactionContextImpl(currentCoord, readOnly);
}
}
Modified:
aries/trunk/tx-control/tx-control-service-local/src/test/java/org/apache/aries/tx/control/service/local/impl/TransactionContextTest.java
URL:
http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-service-local/src/test/java/org/apache/aries/tx/control/service/local/impl/TransactionContextTest.java?rev=1740209&r1=1740208&r2=1740209&view=diff
==============================================================================
---
aries/trunk/tx-control/tx-control-service-local/src/test/java/org/apache/aries/tx/control/service/local/impl/TransactionContextTest.java
(original)
+++
aries/trunk/tx-control/tx-control-service-local/src/test/java/org/apache/aries/tx/control/service/local/impl/TransactionContextTest.java
Wed Apr 20 23:08:55 2016
@@ -48,7 +48,7 @@ public class TransactionContextTest {
@Before
public void setUp() {
- ctx = new TransactionContextImpl(coordination);
+ ctx = new TransactionContextImpl(coordination, false);
variables = new HashMap<>();
Mockito.when(coordination.getVariables()).thenReturn(variables);
}
@@ -65,6 +65,17 @@ public class TransactionContextTest {
}
@Test
+ public void testisReadOnlyFalse() {
+ assertFalse(ctx.isReadOnly());
+ }
+
+ @Test
+ public void testisReadOnlyTrue() {
+ ctx = new TransactionContextImpl(coordination, true);
+ assertTrue(ctx.isReadOnly());
+ }
+
+ @Test
public void testTransactionKey() {
Mockito.when(coordination.getId()).thenReturn(42L);
Modified:
aries/trunk/tx-control/tx-control-service-xa/src/main/java/org/apache/aries/tx/control/service/xa/impl/TransactionContextImpl.java
URL:
http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-service-xa/src/main/java/org/apache/aries/tx/control/service/xa/impl/TransactionContextImpl.java?rev=1740209&r1=1740208&r2=1740209&view=diff
==============================================================================
---
aries/trunk/tx-control/tx-control-service-xa/src/main/java/org/apache/aries/tx/control/service/xa/impl/TransactionContextImpl.java
(original)
+++
aries/trunk/tx-control/tx-control-service-xa/src/main/java/org/apache/aries/tx/control/service/xa/impl/TransactionContextImpl.java
Wed Apr 20 23:08:55 2016
@@ -49,9 +49,13 @@ public class TransactionContextImpl exte
private final Object key;
- public TransactionContextImpl(GeronimoTransactionManager
transactionManager, Coordination coordination) {
+ private final boolean readOnly;
+
+ public TransactionContextImpl(GeronimoTransactionManager
transactionManager, Coordination coordination,
+ boolean readOnly) {
super(coordination);
this.transactionManager = transactionManager;
+ this.readOnly = readOnly;
Transaction tmp = null;
try {
tmp = transactionManager.suspend();
@@ -222,6 +226,11 @@ public class TransactionContextImpl exte
}
@Override
+ public boolean isReadOnly() {
+ return readOnly;
+ }
+
+ @Override
protected boolean isAlive() {
TransactionStatus status = getTransactionStatus();
return status != COMMITTED && status != ROLLED_BACK;
Modified:
aries/trunk/tx-control/tx-control-service-xa/src/main/java/org/apache/aries/tx/control/service/xa/impl/TransactionControlImpl.java
URL:
http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-service-xa/src/main/java/org/apache/aries/tx/control/service/xa/impl/TransactionControlImpl.java?rev=1740209&r1=1740208&r2=1740209&view=diff
==============================================================================
---
aries/trunk/tx-control/tx-control-service-xa/src/main/java/org/apache/aries/tx/control/service/xa/impl/TransactionControlImpl.java
(original)
+++
aries/trunk/tx-control/tx-control-service-xa/src/main/java/org/apache/aries/tx/control/service/xa/impl/TransactionControlImpl.java
Wed Apr 20 23:08:55 2016
@@ -16,8 +16,8 @@ public class TransactionControlImpl exte
}
@Override
- protected AbstractTransactionContextImpl startTransaction(Coordination
currentCoord) {
- return new TransactionContextImpl(transactionManager,
currentCoord);
+ protected AbstractTransactionContextImpl startTransaction(Coordination
currentCoord, boolean readOnly) {
+ return new TransactionContextImpl(transactionManager,
currentCoord, readOnly);
}
}
Modified:
aries/trunk/tx-control/tx-control-service-xa/src/test/java/org/apache/aries/tx/control/service/xa/impl/TransactionContextTest.java
URL:
http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-service-xa/src/test/java/org/apache/aries/tx/control/service/xa/impl/TransactionContextTest.java?rev=1740209&r1=1740208&r2=1740209&view=diff
==============================================================================
---
aries/trunk/tx-control/tx-control-service-xa/src/test/java/org/apache/aries/tx/control/service/xa/impl/TransactionContextTest.java
(original)
+++
aries/trunk/tx-control/tx-control-service-xa/src/test/java/org/apache/aries/tx/control/service/xa/impl/TransactionContextTest.java
Wed Apr 20 23:08:55 2016
@@ -53,7 +53,7 @@ public class TransactionContextTest {
@Before
public void setUp() throws XAException {
- ctx = new TransactionContextImpl(new
GeronimoTransactionManager(), coordination);
+ ctx = new TransactionContextImpl(new
GeronimoTransactionManager(), coordination, false);
variables = new HashMap<>();
Mockito.when(coordination.getVariables()).thenReturn(variables);
}
@@ -68,6 +68,18 @@ public class TransactionContextTest {
ctx.setRollbackOnly();
assertTrue(ctx.getRollbackOnly());
}
+
+ @Test
+ public void testisReadOnlyFalse() {
+ assertFalse(ctx.isReadOnly());
+ }
+
+ @Test
+ public void testisReadOnlyTrue() throws XAException {
+ ctx = new TransactionContextImpl(new
GeronimoTransactionManager(), coordination, true);
+ assertTrue(ctx.isReadOnly());
+ }
+
@Test
public void testTransactionKey() {