From 53975ed362e27c88cea7326789fad5c1d009e98e Mon Sep 17 00:00:00 2001 From: ajs6f Date: Tue, 8 Dec 2015 11:53:25 -0500 Subject: [PATCH 1/2] Logging warning when transaction is ended without commiting --- .../sparql/core/mem/DatasetGraphInMemory.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) 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 92c79e94c5c..7b738915b24 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 @@ -23,6 +23,7 @@ import static org.apache.jena.query.ReadWrite.READ; import static org.apache.jena.query.ReadWrite.WRITE; import static org.apache.jena.sparql.core.Quad.isUnionGraph; +import static org.slf4j.LoggerFactory.getLogger; import java.util.Iterator; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -41,6 +42,7 @@ import org.apache.jena.sparql.core.DatasetPrefixStorage; import org.apache.jena.sparql.core.Quad; import org.apache.jena.sparql.core.Transactional; +import org.slf4j.Logger; /** * A {@link DatasetGraph} backed by an {@link QuadTable}. By default, this is a {@link HexTable} designed for high-speed @@ -49,6 +51,8 @@ */ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Transactional { + private static final Logger log = getLogger(DatasetGraphInMemory.class); + private final DatasetPrefixStorage prefixes = new DatasetPrefixStorageInMemory(); private final Lock writeLock = new LockMRPlusSW(); @@ -103,11 +107,6 @@ private TripleTable defaultGraph() { return defaultGraph; } - @Override - public Lock getLock() { - return writeLock(); - } - /** * Default constructor. */ @@ -129,7 +128,7 @@ public void begin(final ReadWrite readWrite) { if (isInTransaction()) throw new JenaTransactionException("Transactions cannot be nested!"); transactionType(readWrite); isInTransaction(true); - getLock().enterCriticalSection(readWrite.equals(READ)); // get the dataset write lock, if needed. + writeLock().enterCriticalSection(readWrite.equals(READ)); // get the dataset write lock, if needed. commitLock().readLock().lock(); // if a commit is proceeding, wait so that we see a coherent index state try { quadsIndex().begin(readWrite); @@ -149,7 +148,8 @@ public void commit() { } finally { commitLock().writeLock().unlock(); } - end(); + isInTransaction.remove(); + writeLock().leaveCriticalSection(); } @Override @@ -161,17 +161,17 @@ public void abort() { @Override public void close() { if (isInTransaction()) abort(); - } @Override public void end() { if (isInTransaction()) { + log.warn("Ending transaction without commit!"); quadsIndex().end(); defaultGraph().end(); isInTransaction.remove(); transactionType.remove(); - getLock().leaveCriticalSection(); + writeLock().leaveCriticalSection(); } } From 0a11e4a91fcc527bd80c1773233b331b50e1c9e9 Mon Sep 17 00:00:00 2001 From: ajs6f Date: Wed, 9 Dec 2015 07:54:52 -0500 Subject: [PATCH 2/2] Checking for WRITE transaction before logging warning --- .../apache/jena/sparql/core/mem/DatasetGraphInMemory.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 7b738915b24..1d6e64530b0 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 @@ -163,17 +163,17 @@ public void close() { if (isInTransaction()) abort(); } - @Override - public void end() { + @Override + public void end() { if (isInTransaction()) { - log.warn("Ending transaction without commit!"); + if (transactionType().equals(WRITE)) log.warn("Ending WRITE transaction without commit!"); quadsIndex().end(); defaultGraph().end(); isInTransaction.remove(); transactionType.remove(); writeLock().leaveCriticalSection(); } - } + } private Iterator access(final Supplier> source) { if (!isInTransaction()) {