JENA-1458: Use TxnType, replacing ReadWrite mode
Project: http://git-wip-us.apache.org/repos/asf/jena/repo Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/ee7507df Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/ee7507df Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/ee7507df Branch: refs/heads/master Commit: ee7507df9fe24abcf076e449807dc8d056699392 Parents: 143ac13 Author: Andy Seaborne <[email protected]> Authored: Sat Dec 30 22:57:06 2017 +0000 Committer: Andy Seaborne <[email protected]> Committed: Sun Dec 31 10:53:24 2017 +0000 ---------------------------------------------------------------------- .../java/org/apache/jena/query/Dataset.java | 7 + .../java/org/apache/jena/query/TxnMode.java | 64 ---------- .../java/org/apache/jena/query/TxnType.java | 64 ++++++++++ .../sparql/core/DatasetGraphTrackActive.java | 18 ++- .../jena/sparql/core/DatasetGraphWithLock.java | 11 +- .../jena/sparql/core/DatasetGraphWrapper.java | 128 +++++++++++-------- .../jena/sparql/core/DatasetGraphZero.java | 1 + .../apache/jena/sparql/core/Transactional.java | 55 ++++---- .../jena/sparql/core/TransactionalLock.java | 22 ++++ .../jena/sparql/core/TransactionalMutex.java | 14 +- .../sparql/core/TransactionalNotSupported.java | 16 ++- .../core/TransactionalNotSupportedMixin.java | 20 ++- .../jena/sparql/core/TransactionalNull.java | 12 +- .../sparql/core/mem/DatasetGraphInMemory.java | 50 ++++---- .../jena/sparql/core/DatasetGraphSimpleMem.java | 5 + .../transaction/AbstractTestTransPromote.java | 82 ++++++------ 16 files changed, 347 insertions(+), 222 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jena/blob/ee7507df/jena-arq/src/main/java/org/apache/jena/query/Dataset.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/query/Dataset.java b/jena-arq/src/main/java/org/apache/jena/query/Dataset.java index 6f8bc0e..38b1c22 100644 --- a/jena-arq/src/main/java/org/apache/jena/query/Dataset.java +++ b/jena-arq/src/main/java/org/apache/jena/query/Dataset.java @@ -32,6 +32,13 @@ import org.apache.jena.sparql.util.Context ; public interface Dataset extends Transactional { + // TEMP + + @Override + public default void begin(TxnType type) { throw new UnsupportedOperationException("Dataset.begin(TxnType)"); } + + + /** Get the default graph as a Jena Model */ public Model getDefaultModel() ; http://git-wip-us.apache.org/repos/asf/jena/blob/ee7507df/jena-arq/src/main/java/org/apache/jena/query/TxnMode.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/query/TxnMode.java b/jena-arq/src/main/java/org/apache/jena/query/TxnMode.java deleted file mode 100644 index 494da17..0000000 --- a/jena-arq/src/main/java/org/apache/jena/query/TxnMode.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.jena.query; - -import org.apache.jena.sparql.JenaTransactionException; - -public enum TxnMode { - /** Transaction mode: - * <ul> - * <li>{@code WRITE}: this gaurantees a WRITE will complete if {@code commit()} is - * called. The same as {@code begin(ReadWrite.WRITE)}. - * - * <li>{@code READ}: the transaction can not promote to WRITE,ensuring read-only - * access to the data. The same as {@code begin(ReadWrite.READ)}. - * - * <li>{@code READ_PROMOTE}: the transaction will go from "read" to "write" if the - * dataset has not been modified but if it has, the promotion fails with - * exception. - * - * <li>{@code READ_COMMITTED_PROMOTE}: Use this with care. The promotion will succeed but - * changes from oher transactions become visible. - * </ul> - * - * Read committed: at the point transaction attempts promotion from "read" to - * "write", the sytem checks if the datset has chnage since the trsnaction started - * (called {@code begin}). If {@code READ_PROMOTE}, the dataset must not have - * changed; if {@code READ_COMMITTED_PROMOTE} anyh intermediate changes are - * visible but the application can not assume any data it has read in the - * transaction is the same as it was at the point the transaction started. - */ - READ, WRITE, READ_PROMOTE, READ_COMMITTED_PROMOTE - ; - - public static TxnMode convert(ReadWrite rw) { - switch(rw) { - case READ: return READ; - case WRITE: return WRITE; - default: throw new NullPointerException(); - } - } - public static ReadWrite convert(TxnMode mode) { - switch(mode) { - case READ: return ReadWrite.READ; - case WRITE: return ReadWrite.WRITE; - default: throw new JenaTransactionException("Incompatible mode: "+mode); - } - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/jena/blob/ee7507df/jena-arq/src/main/java/org/apache/jena/query/TxnType.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/query/TxnType.java b/jena-arq/src/main/java/org/apache/jena/query/TxnType.java new file mode 100644 index 0000000..3679414 --- /dev/null +++ b/jena-arq/src/main/java/org/apache/jena/query/TxnType.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.jena.query; + +import org.apache.jena.sparql.JenaTransactionException; + +public enum TxnType { + /** Transaction mode: + * <ul> + * <li>{@code WRITE}: this gaurantees a WRITE will complete if {@code commit()} is + * called. The same as {@code begin(ReadWrite.WRITE)}. + * + * <li>{@code READ}: the transaction can not promote to WRITE,ensuring read-only + * access to the data. The same as {@code begin(ReadWrite.READ)}. + * + * <li>{@code READ_PROMOTE}: the transaction will go from "read" to "write" if the + * dataset has not been modified but if it has, the promotion fails with + * exception. + * + * <li>{@code READ_COMMITTED_PROMOTE}: Use this with care. The promotion will succeed but + * changes from oher transactions become visible. + * </ul> + * + * Read committed: at the point transaction attempts promotion from "read" to + * "write", the sytem checks if the datset has chnage since the trsnaction started + * (called {@code begin}). If {@code READ_PROMOTE}, the dataset must not have + * changed; if {@code READ_COMMITTED_PROMOTE} anyh intermediate changes are + * visible but the application can not assume any data it has read in the + * transaction is the same as it was at the point the transaction started. + */ + READ, WRITE, READ_PROMOTE, READ_COMMITTED_PROMOTE + ; + + public static TxnType convert(ReadWrite rw) { + switch(rw) { + case READ: return READ; + case WRITE: return WRITE; + default: throw new NullPointerException(); + } + } + public static ReadWrite convert(TxnType mode) { + switch(mode) { + case READ: return ReadWrite.READ; + case WRITE: return ReadWrite.WRITE; + default: throw new JenaTransactionException("Incompatible mode: "+mode); + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/jena/blob/ee7507df/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 7e29034..ef15ea1 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 @@ -19,6 +19,7 @@ package org.apache.jena.sparql.core; import org.apache.jena.query.ReadWrite ; +import org.apache.jena.query.TxnType; /** Check the transactional state of a DatasetGraph */ public abstract class DatasetGraphTrackActive extends DatasetGraphWrapper @@ -35,9 +36,21 @@ public abstract class DatasetGraphTrackActive extends DatasetGraphWrapper protected abstract void checkNotActive() ; @Override + public final void begin(TxnType txnType) { + checkNotActive(); + _begin(txnType); + } + + @Override public final void begin(ReadWrite readWrite) { checkNotActive(); - _begin(readWrite); + _begin(TxnType.convert(readWrite)); + } + + @Override + public final boolean promote() { + checkActive(); + return _promote(); } @Override @@ -60,7 +73,8 @@ public abstract class DatasetGraphTrackActive extends DatasetGraphWrapper @Override public abstract boolean isInTransaction() ; - protected abstract void _begin(ReadWrite readWrite) ; + protected abstract void _begin(TxnType txnType); + protected abstract boolean _promote() ; protected abstract void _commit() ; protected abstract void _abort() ; protected abstract void _end() ; http://git-wip-us.apache.org/repos/asf/jena/blob/ee7507df/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWithLock.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWithLock.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWithLock.java index 8bd1d91..86ae484 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWithLock.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWithLock.java @@ -21,6 +21,7 @@ package org.apache.jena.sparql.core ; import org.apache.jena.atlas.lib.Lib ; import org.apache.jena.atlas.lib.Sync ; import org.apache.jena.query.ReadWrite ; +import org.apache.jena.query.TxnType; import org.apache.jena.sparql.JenaTransactionException ; import org.apache.jena.sparql.SystemARQ ; import org.apache.jena.sparql.util.Context ; @@ -92,8 +93,9 @@ public class DatasetGraphWithLock extends DatasetGraphTrackActive implements Syn } @Override - protected void _begin(ReadWrite readWrite) { - transactional.begin(readWrite); + protected void _begin(TxnType txnType) { + ReadWrite readWrite = TxnType.convert(txnType); + transactional.begin(txnType); writeTxn.set(readWrite.equals(ReadWrite.WRITE)); if ( dsChanges != null ) // Replace by transactional state. @@ -101,6 +103,11 @@ public class DatasetGraphWithLock extends DatasetGraphTrackActive implements Syn } @Override + protected boolean _promote() { + throw new JenaTransactionException("promote not supported"); + } + + @Override protected void _commit() { if ( writeTxn.get() ) { sync() ; http://git-wip-us.apache.org/repos/asf/jena/blob/ee7507df/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java index 1f1f00b..9bb5fb9 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java @@ -18,25 +18,26 @@ package org.apache.jena.sparql.core; -import java.util.Iterator ; - -import org.apache.jena.atlas.lib.Sync ; -import org.apache.jena.graph.Graph ; -import org.apache.jena.graph.Node ; -import org.apache.jena.query.ReadWrite ; -import org.apache.jena.shared.Lock ; -import org.apache.jena.sparql.SystemARQ ; -import org.apache.jena.sparql.util.Context ; +import java.util.Iterator; + +import org.apache.jena.atlas.lib.Sync; +import org.apache.jena.graph.Graph; +import org.apache.jena.graph.Node; +import org.apache.jena.query.ReadWrite; +import org.apache.jena.query.TxnType; +import org.apache.jena.shared.Lock; +import org.apache.jena.sparql.SystemARQ; +import org.apache.jena.sparql.util.Context; import org.apache.jena.system.Txn; public class DatasetGraphWrapper implements DatasetGraph, Sync { // The wrapped DatasetGraph but all calls go via get() so this can be null. - private final DatasetGraph dsg ; + private final DatasetGraph dsg; /** Return the DatasetGraph being wrapped. */ public final DatasetGraph getWrapped() { - return get() ; + return get(); } /** Recursively unwrap a DatasetGraphWrapped. @@ -44,11 +45,11 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync * @return the first found {@link DatasetGraph} that is not an instance of {@link DatasetGraphWrapper} */ public final DatasetGraph getBase() { - DatasetGraph dsgw = dsg ; + DatasetGraph dsgw = dsg; while (dsgw instanceof DatasetGraphWrapper) { - dsgw = ((DatasetGraphWrapper)dsg).getWrapped() ; + dsgw = ((DatasetGraphWrapper)dsg).getWrapped(); } - return dsgw ; + return dsgw; } /** The dataset to use for redirection - can be overridden. @@ -56,27 +57,27 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync * delegated call. Changes to the wrapped object can be * made based on that contract. */ - protected DatasetGraph get() { return dsg ; } + protected DatasetGraph get() { return dsg; } /** For operations that only read the DatasetGraph. */ - protected DatasetGraph getR() { return get() ; } + protected DatasetGraph getR() { return get(); } /** For operations that write the DatasetGraph. */ - protected DatasetGraph getW() { return get() ; } + protected DatasetGraph getW() { return get(); } /** For operations that get a handle on a graph. */ - protected DatasetGraph getG() { return get() ; } + protected DatasetGraph getG() { return get(); } /** For operations that pass on transaction actions. */ - protected DatasetGraph getT() { return get() ; } + protected DatasetGraph getT() { return get(); } public DatasetGraphWrapper(DatasetGraph dsg) { - this.dsg = dsg ; + this.dsg = dsg; } @Override public boolean containsGraph(Node graphNode) - { return getR().containsGraph(graphNode) ; } + { return getR().containsGraph(graphNode); } @Override public Graph getDefaultGraph() @@ -88,91 +89,91 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync @Override public Graph getGraph(Node graphNode) - { return getG().getGraph(graphNode) ; } + { return getG().getGraph(graphNode); } @Override public void addGraph(Node graphName, Graph graph) - { getW().addGraph(graphName, graph) ; } + { getW().addGraph(graphName, graph); } @Override public void removeGraph(Node graphName) - { getW().removeGraph(graphName) ; } + { getW().removeGraph(graphName); } @Override public void setDefaultGraph(Graph g) - { getW().setDefaultGraph(g) ; } + { getW().setDefaultGraph(g); } @Override public Lock getLock() - { return getR().getLock() ; } + { return getR().getLock(); } @Override public Iterator<Node> listGraphNodes() - { return getR().listGraphNodes() ; } + { return getR().listGraphNodes(); } @Override public void add(Quad quad) - { getW().add(quad) ; } + { getW().add(quad); } @Override public void delete(Quad quad) - { getW().delete(quad) ; } + { getW().delete(quad); } @Override public void add(Node g, Node s, Node p, Node o) - { getW().add(g, s, p, o) ; } + { getW().add(g, s, p, o); } @Override public void delete(Node g, Node s, Node p, Node o) - { getW().delete(g, s, p, o) ; } + { getW().delete(g, s, p, o); } @Override public void deleteAny(Node g, Node s, Node p, Node o) - { getW().deleteAny(g, s, p, o) ; } + { getW().deleteAny(g, s, p, o); } @Override public void clear() - { getW().clear() ; } + { getW().clear(); } @Override public boolean isEmpty() - { return getR().isEmpty() ; } + { return getR().isEmpty(); } @Override public Iterator<Quad> find() - { return getR().find() ; } + { return getR().find(); } @Override public Iterator<Quad> find(Quad quad) - { return getR().find(quad) ; } + { return getR().find(quad); } @Override public Iterator<Quad> find(Node g, Node s, Node p, Node o) - { return getR().find(g, s, p, o) ; } + { return getR().find(g, s, p, o); } @Override public Iterator<Quad> findNG(Node g, Node s, Node p, Node o) - { return getR().findNG(g, s, p, o) ; } + { return getR().findNG(g, s, p, o); } @Override public boolean contains(Quad quad) - { return getR().contains(quad) ; } + { return getR().contains(quad); } @Override public boolean contains(Node g, Node s, Node p, Node o) - { return getR().contains(g, s, p, o) ; } + { return getR().contains(g, s, p, o); } @Override public Context getContext() - { return getR().getContext() ; } + { return getR().getContext(); } @Override public long size() - { return getR().size() ; } + { return getR().size(); } @Override public void close() - { getW().close() ; } + { getW().close(); } @Override public String toString() { @@ -183,37 +184,54 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync @Override public void sync() { // Pass down sync. - SystemARQ.sync(getW()) ; + SystemARQ.sync(getW()); } @Override + public void begin() { getT().begin(); } + + @Override + public ReadWrite transactionMode() + { return getT().transactionMode(); } + + @Override + public TxnType transactionType() + { return getT().transactionType(); } + + @Override + public void begin(TxnType type) + { getT().begin(type); } + + @Override public void begin(ReadWrite readWrite) - { getT().begin(readWrite) ; } + { getT().begin(readWrite); } @Override + public boolean promote() + { return getT().promote(); } + + @Override public void commit() - { getT().commit() ; } + { getT().commit(); } @Override public void abort() - { getT().abort() ; } + { getT().abort(); } @Override public void end() - { getT().end() ; } + { getT().end(); } @Override public boolean isInTransaction() - { return get().isInTransaction() ; } + { return get().isInTransaction(); } @Override - public boolean supportsTransactions() { - return getT().supportsTransactions() ; - } + public boolean supportsTransactions() + { return getT().supportsTransactions(); } @Override - public boolean supportsTransactionAbort() { - return getT().supportsTransactionAbort() ; - } + public boolean supportsTransactionAbort() + { return getT().supportsTransactionAbort(); } } http://git-wip-us.apache.org/repos/asf/jena/blob/ee7507df/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java index a5a813b..6524cc9 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java @@ -24,6 +24,7 @@ import org.apache.jena.atlas.iterator.Iter; import org.apache.jena.graph.Graph; import org.apache.jena.graph.Node; import org.apache.jena.query.ReadWrite; +import org.apache.jena.query.TxnType; import org.apache.jena.sparql.graph.GraphZero; /** An always empty {@link DatasetGraph}. http://git-wip-us.apache.org/repos/asf/jena/blob/ee7507df/jena-arq/src/main/java/org/apache/jena/sparql/core/Transactional.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/Transactional.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/Transactional.java index f0b11d4..8425a18 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/core/Transactional.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/Transactional.java @@ -19,7 +19,7 @@ package org.apache.jena.sparql.core; import org.apache.jena.query.ReadWrite ; -import org.apache.jena.query.TxnMode; +import org.apache.jena.query.TxnType; import org.apache.jena.sparql.JenaTransactionException; import org.apache.jena.system.Txn; @@ -62,6 +62,16 @@ import org.apache.jena.system.Txn; public interface Transactional { /** + * Start a transaction which is READ mode and which will switch to WRITE if an update + * is attempted but only if no intermdiate transaction has performed an update. + * <p> + * See {@link #begin(TxnType)} for more details an options. + * <p> + * May not be implemented. See {@link #begin(ReadWrite)} is guaranted to be provided. + */ + public default void begin() { begin(TxnType.READ_PROMOTE); } + + /** * Start a transaction.<br/> * READ or WRITE transactions start in that state and do not chnage for the * lifetime of the transaction. @@ -88,19 +98,17 @@ public interface Transactional * changed; if {@code READ_COMMITTED_PROMOTE} anyh intermediate changes are * visible but the application can not assume any data it has read in the * transaction is the same as it was at the point the transaction started. - */ - //public void begin(TxnMode mode); - public default void begin(TxnMode mode) { begin(TxnMode.convert(mode)); } - - /** - * Start a transaction which is READ mode and which will switch to WRITE if an update - * is attempted but only if no intermdiate transaction has performed an update. - * <p> - * See {@link #begin(TxnMode)} for more details an options. * <p> - * May not be implemented. See {@link #begin(ReadWrite)} is guaranted to be provided. + * This operation is optional and some implementations may throw + * a {@link JenaTransactionException} exception for some or all {@link TxnType} values + * <p> + * See {@link #begin(ReadWrite)} for a form that is required of implementations. */ - public default void begin() { begin(TxnMode.READ_PROMOTE); } + //public void begin(TxnType type); + public default void begin(TxnType type) { begin(TxnType.convert(type)); } + + /** Start either a READ or WRITE transaction. */ + public void begin(ReadWrite readWrite) ; /** * Attempt to promote a transaction from "read" to "write" and the transaction @@ -109,22 +117,9 @@ public interface Transactional * is still valid and in "read"). */ - // XXX OR JenaTransactionException if promote not possible. - //public void promote(); public default boolean promote() { throw new JenaTransactionException("Not implemented"); } - - /** Return the current state of the transaction - "read" or "write" */ - //public ReadWrite transactionRW(); - public default ReadWrite transactionRW() { throw new JenaTransactionException("Not implemented"); } - - /** Return the transaction mode used in {@code begin(TxnMode)}. */ - //public TxnMode transactionMode(); - public default TxnMode transactionMode() { throw new JenaTransactionException("Not implemented"); } - - /** Start either a READ or WRITE transaction */ - public void begin(ReadWrite readWrite) ; - + /** Commit a transaction - finish the transaction and make any changes permanent (if a "write" transaction) */ public void commit() ; @@ -134,6 +129,14 @@ public interface Transactional /** Finish the transaction - if a write transaction and commit() has not been called, then abort */ public void end() ; + /** Return the current mode of the transaction - "read" or "write" */ + //public ReadWrite transactionMode(); + public default ReadWrite transactionMode() { throw new JenaTransactionException("Not implemented"); } + + /** Return the transaction type used in {@code begin(TxnType)}. */ + //public TxnMode transactionMode(); + public default TxnType transactionType() { throw new JenaTransactionException("Not implemented"); } + /** Say whether inside a transaction. */ public boolean isInTransaction() ; } http://git-wip-us.apache.org/repos/asf/jena/blob/ee7507df/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java index 5e84b16..ad2ad3c 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java @@ -21,6 +21,7 @@ package org.apache.jena.sparql.core; import java.util.Objects ; import org.apache.jena.query.ReadWrite ; +import org.apache.jena.query.TxnType; import org.apache.jena.shared.Lock ; import org.apache.jena.shared.LockMRPlusSW ; import org.apache.jena.shared.LockMRSW ; @@ -33,7 +34,9 @@ import org.apache.jena.sparql.JenaTransactionException ; * To use with implementation inheritance, for when you don't inherit: * <pre> * private final Transactional txn = TransactionalLock.createMRSW() ; + * {@literal @}Override public void begin(TxnType txnType) { txn.begin(txnType) ; } * {@literal @}Override public void begin(ReadWrite mode) { txn.begin(mode) ; } + * {@literal @}Override public boolean promote() { return txn.promote() ; } * {@literal @}Override public void commit() { txn.commit() ; } * {@literal @}Override public void abort() { txn.abort() ; } * {@literal @}Override public boolean isInTransaction() { return txn.isInTransaction() ; } @@ -83,13 +86,32 @@ public class TransactionalLock implements Transactional { @Override public void begin(ReadWrite readWrite) { + begin(TxnType.convert(readWrite)); + } + + @Override + public void begin(TxnType txnType) { if ( isInTransaction() ) error("Already in a transaction") ; + switch(txnType) { + case READ_PROMOTE: + case READ_COMMITTED_PROMOTE: + throw new UnsupportedOperationException("begin("+txnType+")"); + default: + } + ReadWrite readWrite = TxnType.convert(txnType); boolean isRead = readWrite.equals(ReadWrite.READ) ; lock.enterCriticalSection(isRead) ; txnMode.set(readWrite) ; } + // Lock propmotion required (Ok for mutex) + +// @Override +// public boolean promote() { +// return ??; +// } + @Override public void commit() { endOnce() ; http://git-wip-us.apache.org/repos/asf/jena/blob/ee7507df/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalMutex.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalMutex.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalMutex.java index 50b2e4d..4f722c7 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalMutex.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalMutex.java @@ -19,6 +19,7 @@ package org.apache.jena.sparql.core; import org.apache.jena.query.ReadWrite ; +import org.apache.jena.query.TxnType; import org.apache.jena.shared.Lock ; /** Transactional by mutual exclusion. */ @@ -27,17 +28,27 @@ public class TransactionalMutex implements Transactional private final Lock lock; private ThreadLocal<Boolean> isInTransaction = ThreadLocal.withInitial(()->false) ; - public TransactionalMutex(Lock lock) { + private TransactionalMutex(Lock lock) { this.lock = lock ; } @Override public void begin(ReadWrite readWrite) { + begin(TxnType.convert(readWrite)); + } + + @Override + public void begin(TxnType txnType) { lock.enterCriticalSection(false); // Always take a write lock - i.e. exclusive. isInTransaction.set(true); } @Override + public boolean promote() { + return true; + } + + @Override public void commit() { end() ; } @@ -59,5 +70,6 @@ public class TransactionalMutex implements Transactional lock.leaveCriticalSection(); } isInTransaction.remove(); + isInTransaction = null; } } http://git-wip-us.apache.org/repos/asf/jena/blob/ee7507df/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupported.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupported.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupported.java index 55e1571..287aabd 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupported.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupported.java @@ -19,6 +19,7 @@ package org.apache.jena.sparql.core; import org.apache.jena.query.ReadWrite ; +import org.apache.jena.query.TxnType; /** Implementation for "un-Transactional" interface. * @@ -38,7 +39,9 @@ public class TransactionalNotSupported implements Transactional // As an included component. /* private final Transactional txn = new TransactionalNotSupported() ; + @Override public void begin(TxnType txnType) { txn.begin(type) ; } @Override public void begin(ReadWrite mode) { txn.begin(mode) ; } + @Override public boolean promote() { returntxn.promote() ; } @Override public void commit() { txn.commit() ; } @Override public void abort() { txn.abort() ; } @Override public boolean isInTransaction() { return txn.isInTransaction() ; } @@ -48,9 +51,20 @@ public class TransactionalNotSupported implements Transactional */ @Override + public void begin() + { throw new UnsupportedOperationException("Transactional.begin()") ; } + + @Override + public void begin(TxnType txnType) + { throw new UnsupportedOperationException("Transactional.begin(TxnType") ; } + + @Override public void begin(ReadWrite readWrite) - { throw new UnsupportedOperationException("Transactional.begin") ; } + { throw new UnsupportedOperationException("Transactional.begin(ReadWrite)") ; } + @Override public boolean promote() + { throw new UnsupportedOperationException("Transactional.promote") ; } + @Override public void commit() { throw new UnsupportedOperationException("Transactional.commit") ; } http://git-wip-us.apache.org/repos/asf/jena/blob/ee7507df/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupportedMixin.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupportedMixin.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupportedMixin.java index b6da902..4a98044 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupportedMixin.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupportedMixin.java @@ -19,20 +19,30 @@ package org.apache.jena.sparql.core; import org.apache.jena.query.ReadWrite ; +import org.apache.jena.query.TxnType; import org.apache.jena.shared.LockMutex ; /** Mixin interface for the "un-Transactional" interface. * Use with {@link LockMutex}. - * - * * * @see TransactionalNotSupportedMixin */ public interface TransactionalNotSupportedMixin extends Transactional { @Override + public default void begin() + { throw new UnsupportedOperationException("Transactional.begin()") ; } + + @Override + public default void begin(TxnType txnType) + { throw new UnsupportedOperationException("Transactional.begin(TxnType") ; } + + @Override public default void begin(ReadWrite readWrite) { throw new UnsupportedOperationException("Transactional.begin") ; } + @Override public default boolean promote() + { throw new UnsupportedOperationException("Transactional.promote") ; } + @Override public default void commit() { throw new UnsupportedOperationException("Transactional.commit") ; } @@ -48,5 +58,11 @@ public interface TransactionalNotSupportedMixin extends Transactional @Override public default void end() { throw new UnsupportedOperationException("Transactional.end") ; } + + public default boolean supportsTransactions() + { return false ; } + + public default boolean supportsTransactionAbort() + { return false; } } http://git-wip-us.apache.org/repos/asf/jena/blob/ee7507df/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNull.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNull.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNull.java index 618ad38..822b77d 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNull.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNull.java @@ -19,6 +19,7 @@ package org.apache.jena.sparql.core; import org.apache.jena.query.ReadWrite; +import org.apache.jena.query.TxnType; import org.apache.jena.sparql.JenaTransactionException; /** @@ -31,14 +32,23 @@ public class TransactionalNull implements Transactional { private ThreadLocal<Boolean> inTransaction = ThreadLocal.withInitial(() -> Boolean.FALSE); + @Override - public void begin(ReadWrite readWrite) { + public void begin(TxnType type) { if ( inTransaction.get() ) throw new JenaTransactionException("Already in transaction"); inTransaction.set(true); } @Override + public void begin(ReadWrite readWrite) { + begin(TxnType.convert(readWrite)); + } + + @Override + public boolean promote() { return true; } + + @Override public void commit() { if ( ! inTransaction.get() ) throw new JenaTransactionException("Not in transaction"); http://git-wip-us.apache.org/repos/asf/jena/blob/ee7507df/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java index b962a8d..1905d05 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java @@ -37,7 +37,7 @@ import org.apache.jena.graph.Graph; import org.apache.jena.graph.Node; import org.apache.jena.graph.Triple; import org.apache.jena.query.ReadWrite; -import org.apache.jena.query.TxnMode; +import org.apache.jena.query.TxnType; import org.apache.jena.shared.Lock; import org.apache.jena.shared.LockMRPlusSW; import org.apache.jena.sparql.JenaTransactionException; @@ -84,29 +84,25 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr isInTransaction.set(b); } - private final ThreadLocal<TxnMode> transactionMode = withInitial(() -> null); + private final ThreadLocal<TxnType> transactionType = withInitial(() -> null); // Current state. - private final ThreadLocal<ReadWrite> transactionType = withInitial(() -> null); + private final ThreadLocal<ReadWrite> transactionMode = withInitial(() -> null); /** - * @return the type of transaction in progress + * @return the current mode of the transaction in progress */ - private ReadWrite transactionType() { - return transactionType.get(); - } - @Override - public ReadWrite transactionRW() { - return transactionType.get(); + public ReadWrite transactionMode() { + return transactionMode.get(); } @Override - public TxnMode transactionMode() { - return transactionMode.get(); + public TxnType transactionType() { + return transactionType.get(); } private void transactionType(final ReadWrite readWrite) { - transactionType.set(readWrite); + transactionMode.set(readWrite); } private final QuadTable quadsIndex; @@ -143,11 +139,11 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr public boolean supportsTransactionAbort() { return true; } @Override - public void begin(TxnMode txnMode) { + public void begin(TxnType txnType) { if (isInTransaction()) throw new JenaTransactionException("Transactions cannot be nested!"); - transactionMode.set(txnMode); - ReadWrite initial = txnMode.equals(TxnMode.WRITE) ? WRITE : READ; + transactionType.set(txnType); + ReadWrite initial = txnType.equals(TxnType.WRITE) ? WRITE : READ; _begin(initial); } @@ -155,7 +151,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr public void begin(final ReadWrite readWrite) { if (isInTransaction()) throw new JenaTransactionException("Transactions cannot be nested!"); - transactionMode.set(TxnMode.convert(readWrite)); + transactionType.set(TxnType.convert(readWrite)); _begin(readWrite) ; } @@ -178,8 +174,8 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr /** Called transaction ending code at most once per transaction. */ private void finishTransaction() { isInTransaction.remove(); - transactionMode.remove(); transactionType.remove(); + transactionMode.remove(); version.remove(); transactionLock.leaveCriticalSection(); } @@ -188,12 +184,12 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr public boolean promote() { if (!isInTransaction()) throw new JenaTransactionException("Tried to promote outside a transaction!"); - if ( transactionType().equals(ReadWrite.WRITE) ) + if ( transactionMode().equals(ReadWrite.WRITE) ) return true; boolean readCommitted; // Initial state - switch(transactionMode.get()) { + switch(transactionType.get()) { case WRITE : return true; case READ : @@ -252,7 +248,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr public void commit() { if (!isInTransaction()) throw new JenaTransactionException("Tried to commit outside a transaction!"); - if (transactionType().equals(WRITE)) + if (transactionMode().equals(WRITE)) _commit(); finishTransaction(); } @@ -264,7 +260,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr quadsIndex().end(); defaultGraph().end(); - if ( transactionType().equals(WRITE) ) { + if ( transactionMode().equals(WRITE) ) { if ( version.get() != generation.get() ) throw new InternalErrorException(String.format("Version=%d, Generation=%d",version.get(),generation.get())) ; generation.incrementAndGet() ; @@ -276,7 +272,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr public void abort() { if (!isInTransaction()) throw new JenaTransactionException("Tried to abort outside a transaction!"); - if (transactionType().equals(WRITE)) + if (transactionMode().equals(WRITE)) _abort(); finishTransaction(); } @@ -299,7 +295,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr @Override public void end() { if (isInTransaction()) { - if (transactionType().equals(WRITE)) { + if (transactionMode().equals(WRITE)) { String msg = "end() called for WRITE transaction without commit or abort having been called. This causes a forced abort."; // _abort does _end actions inside the lock. _abort() ; @@ -413,8 +409,8 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr } return ; } - if ( !transactionType().equals(WRITE) ) { - TxnMode mode = transactionMode.get(); + if ( !transactionMode().equals(WRITE) ) { + TxnType mode = transactionType.get(); switch(mode) { case WRITE : break; @@ -423,7 +419,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr case READ_COMMITTED_PROMOTE : case READ_PROMOTE : { - boolean readCommitted = (mode == TxnMode.READ_COMMITTED_PROMOTE); + boolean readCommitted = (mode == TxnType.READ_COMMITTED_PROMOTE); _promote(readCommitted); break; } http://git-wip-us.apache.org/repos/asf/jena/blob/ee7507df/jena-arq/src/test/java/org/apache/jena/sparql/core/DatasetGraphSimpleMem.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/core/DatasetGraphSimpleMem.java b/jena-arq/src/test/java/org/apache/jena/sparql/core/DatasetGraphSimpleMem.java index e5631af..48ca221 100644 --- a/jena-arq/src/test/java/org/apache/jena/sparql/core/DatasetGraphSimpleMem.java +++ b/jena-arq/src/test/java/org/apache/jena/sparql/core/DatasetGraphSimpleMem.java @@ -239,4 +239,9 @@ public class DatasetGraphSimpleMem extends DatasetGraphTriplesQuads implements T @Override public void close() {} + + @Override + public boolean supportsTransactionAbort() { + return false; + } } http://git-wip-us.apache.org/repos/asf/jena/blob/ee7507df/jena-arq/src/test/java/org/apache/jena/sparql/transaction/AbstractTestTransPromote.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/transaction/AbstractTestTransPromote.java b/jena-arq/src/test/java/org/apache/jena/sparql/transaction/AbstractTestTransPromote.java index 421964d..e2d2237 100644 --- a/jena-arq/src/test/java/org/apache/jena/sparql/transaction/AbstractTestTransPromote.java +++ b/jena-arq/src/test/java/org/apache/jena/sparql/transaction/AbstractTestTransPromote.java @@ -27,7 +27,7 @@ import java.util.concurrent.atomic.AtomicInteger ; import org.apache.jena.atlas.iterator.Iter ; import org.apache.jena.atlas.lib.Lib ; import org.apache.jena.query.ReadWrite ; -import org.apache.jena.query.TxnMode; +import org.apache.jena.query.TxnType; import org.apache.jena.sparql.JenaTransactionException; import org.apache.jena.sparql.core.DatasetGraph ; import org.apache.jena.sparql.core.Quad ; @@ -139,68 +139,68 @@ public abstract class AbstractTestTransPromote { // Subclass / parameterized - @Test public void promote_snapshot_01() { run_01(TxnMode.READ_PROMOTE) ; } - @Test public void promote_readCommitted_01() { run_01(TxnMode.READ_COMMITTED_PROMOTE) ; } + @Test public void promote_snapshot_01() { run_01(TxnType.READ_PROMOTE) ; } + @Test public void promote_readCommitted_01() { run_01(TxnType.READ_COMMITTED_PROMOTE) ; } // READ-add - private void run_01(TxnMode txnMode) { + private void run_01(TxnType txnType) { Assume.assumeTrue( supportsReadCommitted() ); DatasetGraph dsg = create() ; - dsg.begin(txnMode) ; + dsg.begin(txnType) ; dsg.add(q1) ; dsg.commit() ; dsg.end() ; } - @Test public void promote_snapshot_02() { run_02(TxnMode.READ_PROMOTE) ; } - @Test public void promote_readCommitted_02() { run_02(TxnMode.READ_COMMITTED_PROMOTE) ; } + @Test public void promote_snapshot_02() { run_02(TxnType.READ_PROMOTE) ; } + @Test public void promote_readCommitted_02() { run_02(TxnType.READ_COMMITTED_PROMOTE) ; } // Previous transaction then READ-add - private void run_02(TxnMode txnMode) { + private void run_02(TxnType txnType) { DatasetGraph dsg = create() ; - dsg.begin(txnMode) ;dsg.end() ; + dsg.begin(txnType) ;dsg.end() ; - dsg.begin(txnMode) ; + dsg.begin(txnType) ; dsg.add(q1) ; dsg.commit() ; dsg.end() ; } - @Test public void promote_snapshot_03() { run_03(TxnMode.READ_PROMOTE) ; } - @Test public void promote_readCommitted_03() { run_03(TxnMode.READ_COMMITTED_PROMOTE) ; } + @Test public void promote_snapshot_03() { run_03(TxnType.READ_PROMOTE) ; } + @Test public void promote_readCommitted_03() { run_03(TxnType.READ_COMMITTED_PROMOTE) ; } - private void run_03(TxnMode txnMode) { + private void run_03(TxnType txnType) { DatasetGraph dsg = create() ; - dsg.begin(TxnMode.WRITE) ;dsg.commit() ; dsg.end() ; + dsg.begin(TxnType.WRITE) ;dsg.commit() ; dsg.end() ; - dsg.begin(txnMode) ; + dsg.begin(txnType) ; dsg.add(q1) ; dsg.commit() ; dsg.end() ; } - @Test public void promote_snapshot_04() { run_04(TxnMode.READ_PROMOTE) ; } - @Test public void promote_readCommitted_04() { run_04(TxnMode.READ_COMMITTED_PROMOTE) ; } + @Test public void promote_snapshot_04() { run_04(TxnType.READ_PROMOTE) ; } + @Test public void promote_readCommitted_04() { run_04(TxnType.READ_COMMITTED_PROMOTE) ; } - private void run_04(TxnMode txnMode) { + private void run_04(TxnType txnType) { DatasetGraph dsg = create() ; dsg.begin(ReadWrite.WRITE) ;dsg.abort() ; dsg.end() ; - dsg.begin(txnMode) ; + dsg.begin(txnType) ; dsg.add(q1) ; dsg.commit() ; dsg.end() ; } - @Test public void promote_snapshot_05() { run_05(TxnMode.READ_PROMOTE) ; } - @Test public void promote_readCommitted_05() { run_05(TxnMode.READ_COMMITTED_PROMOTE) ; } + @Test public void promote_snapshot_05() { run_05(TxnType.READ_PROMOTE) ; } + @Test public void promote_readCommitted_05() { run_05(TxnType.READ_COMMITTED_PROMOTE) ; } - private void run_05(TxnMode txnMode) { + private void run_05(TxnType txnType) { DatasetGraph dsg = create() ; - dsg.begin(txnMode) ; + dsg.begin(txnType) ; dsg.add(q1) ; try { @@ -216,7 +216,7 @@ public abstract class AbstractTestTransPromote { //@Test public void promote_readCommitted_06() { run_06(TxnMode.READ_COMMITTED_PROMOTE) ; } // Async writer after promotion. - private void run_06(TxnMode txnMode) { + private void run_06(TxnType txnType) { DatasetGraph dsg = create() ; AtomicInteger a = new AtomicInteger(0) ; @@ -227,7 +227,7 @@ public abstract class AbstractTestTransPromote { sema.release() ; }) ; - dsg.begin(txnMode) ; + dsg.begin(txnType) ; // Promote dsg.add(q1) ; t.start() ; @@ -243,11 +243,11 @@ public abstract class AbstractTestTransPromote { assertCount(3, dsg) ; } - @Test public void promote_snapshot_07() { run_07(TxnMode.READ_PROMOTE) ; } - @Test public void promote_readCommitted_07() { run_07(TxnMode.READ_COMMITTED_PROMOTE) ; } + @Test public void promote_snapshot_07() { run_07(TxnType.READ_PROMOTE) ; } + @Test public void promote_readCommitted_07() { run_07(TxnType.READ_COMMITTED_PROMOTE) ; } // Async writer after promotion. - private void run_07(TxnMode txnMode) { + private void run_07(TxnType txnType) { DatasetGraph dsg = create() ; // Start long running reader. ThreadAction tt = ThreadTxn.threadTxnRead(dsg, () -> { @@ -257,7 +257,7 @@ public abstract class AbstractTestTransPromote { }) ; // Start R->W here - dsg.begin(txnMode) ; + dsg.begin(txnType) ; dsg.add(q1) ; dsg.add(q2) ; dsg.commit() ; @@ -265,14 +265,14 @@ public abstract class AbstractTestTransPromote { tt.run() ; } - @Test public void promote_snapshot_08() { run_08(TxnMode.READ_PROMOTE); } - @Test public void promote_readCommitted_08() { run_08(TxnMode.READ_COMMITTED_PROMOTE) ; } + @Test public void promote_snapshot_08() { run_08(TxnType.READ_PROMOTE); } + @Test public void promote_readCommitted_08() { run_08(TxnType.READ_COMMITTED_PROMOTE) ; } // Async writer after promotion trasnaction ends. - private void run_08(TxnMode txnMode) { + private void run_08(TxnType txnType) { DatasetGraph dsg = create() ; // Start R->W here - dsg.begin(txnMode) ; + dsg.begin(txnType) ; dsg.add(q1) ; dsg.add(q2) ; dsg.commit() ; @@ -284,14 +284,14 @@ public abstract class AbstractTestTransPromote { } @Test - public void promote_10() { promote_readCommit_txnCommit(TxnMode.READ_COMMITTED_PROMOTE, true) ; } + public void promote_10() { promote_readCommit_txnCommit(TxnType.READ_COMMITTED_PROMOTE, true) ; } @Test - public void promote_11() { promote_readCommit_txnCommit(TxnMode.READ_COMMITTED_PROMOTE, false) ; } + public void promote_11() { promote_readCommit_txnCommit(TxnType.READ_COMMITTED_PROMOTE, false) ; } @Test public void promote_12() { - expect(()->promote_readCommit_txnCommit(TxnMode.READ_PROMOTE, true) , + expect(()->promote_readCommit_txnCommit(TxnType.READ_PROMOTE, true) , getTransactionExceptionClass()) ; } @@ -310,22 +310,22 @@ public abstract class AbstractTestTransPromote { } @Test - public void promote_13() { promote_readCommit_txnCommit(TxnMode.READ_PROMOTE, false) ; } + public void promote_13() { promote_readCommit_txnCommit(TxnType.READ_PROMOTE, false) ; } - private void promote_readCommit_txnCommit(TxnMode txnMode, boolean asyncCommit) { + private void promote_readCommit_txnCommit(TxnType txnType, boolean asyncCommit) { DatasetGraph dsg = create() ; ThreadAction tt = asyncCommit? ThreadTxn.threadTxnWrite(dsg, () -> dsg.add(q3) ) : ThreadTxn.threadTxnWriteAbort(dsg, () -> dsg.add(q3)) ; - dsg.begin(txnMode) ; + dsg.begin(txnType) ; // Other runs tt.run() ; // Can promote if readCommited // Can't promote if not readCommited dsg.add(q1) ; - if ( txnMode == TxnMode.READ_PROMOTE && asyncCommit ) + if ( txnType == TxnType.READ_PROMOTE && asyncCommit ) fail("Should not be here") ; // read commited - we should see the ThreadAction change. assertEquals(asyncCommit, dsg.contains(q3)) ; @@ -387,7 +387,7 @@ public abstract class AbstractTestTransPromote { semaActiveWriterStart.acquireUninterruptibly(); Callable<RuntimeException> attemptedPromote = ()->{ - dsg.begin(TxnMode.READ_PROMOTE) ; + dsg.begin(TxnType.READ_PROMOTE) ; semaPromoteTxnStart.release(1) ; // (*2) semaPromoteTxnContinue.acquireUninterruptibly();
