More tests
Project: http://git-wip-us.apache.org/repos/asf/jena/repo Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/96d03085 Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/96d03085 Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/96d03085 Branch: refs/heads/ThreadPerGraphDataset Commit: 96d03085302dcf84b02cc1c8186aa831b4d9f632 Parents: ade1e94 Author: ajs6f <[email protected]> Authored: Sun Jan 8 13:09:30 2017 -0500 Committer: ajs6f <[email protected]> Committed: Tue Feb 14 09:39:04 2017 -0500 ---------------------------------------------------------------------- .../core/pergraph/MultithreadingTest.java | 80 +++++++++++++++++++- 1 file changed, 78 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jena/blob/96d03085/jena-arq/src/test/java/org/apache/jena/sparql/core/pergraph/MultithreadingTest.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/core/pergraph/MultithreadingTest.java b/jena-arq/src/test/java/org/apache/jena/sparql/core/pergraph/MultithreadingTest.java index a5b7679..27922db 100644 --- a/jena-arq/src/test/java/org/apache/jena/sparql/core/pergraph/MultithreadingTest.java +++ b/jena-arq/src/test/java/org/apache/jena/sparql/core/pergraph/MultithreadingTest.java @@ -24,8 +24,8 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.apache.jena.atlas.junit.BaseTest; import org.apache.jena.graph.Node; -import org.apache.jena.query.ReadWrite; import org.apache.jena.sparql.core.DatasetGraphGraphPerTxn; +import org.apache.jena.sparql.core.JenaTransactionRegionException; import org.apache.jena.sparql.core.Quad; import org.junit.Test; @@ -48,7 +48,7 @@ public class MultithreadingTest extends BaseTest { Quad.create(graph3, dummy, dummy, dummy) }; @Test - public void loadTwoGraphsAtOnce() { + public void writeTwoGraphsAtOnce() { DatasetGraphGraphPerTxn dataset = new DatasetGraphGraphPerTxn(); // We start a thread loading a graph, then wait for the main thread to start loading a different graph. The @@ -117,4 +117,80 @@ public class MultithreadingTest extends BaseTest { dataset.end(); } } + + @Test(expected = JenaTransactionRegionException.class) + public void onlyOneGraphWritableInATxn() { + DatasetGraphGraphPerTxn dataset = new DatasetGraphGraphPerTxn(); + dataset.begin(WRITE); + try { + dataset.add(graph2, dummy, dummy, before); + dataset.add(graph1, dummy, dummy, after); + fail("Should not have been able to write to two different graphs!"); + dataset.commit(); + } finally { + dataset.end(); + } + } + + @Test + public void readFromOneGraphWhileWritingToAnother() { + DatasetGraphGraphPerTxn dataset = new DatasetGraphGraphPerTxn(); + // set up some data to read + dataset.begin(WRITE); + try { + dataset.add(graph1, dummy, dummy, dummy); + dataset.commit(); + } finally { + dataset.end(); + } + // try and read the data while writing some more elsewhere + dataset.begin(WRITE); + try { + dataset.add(graph2, dummy, dummy, dummy); + assertTrue("Couldn't find triple in non-written graph!", dataset.contains(graph1, dummy, dummy, dummy)); + dataset.commit(); + } finally { + dataset.end(); + } + } + + @Test + public void snapshotIsolation() { + DatasetGraphGraphPerTxn dataset = new DatasetGraphGraphPerTxn(); + + // We start a thread loading a graph, then wait for the main thread to start loading a different graph. The + // first thread must wait to see that the main thread has successfully started loading its graph to finish its + // load. So when the first thread does finish, this proves that two graphs were being loaded simultaneously. + + AtomicBoolean startMain = new AtomicBoolean(), baton = new AtomicBoolean(), finishLine = new AtomicBoolean(); + + new Thread(() -> { + dataset.begin(WRITE); + try { + dataset.add(graph1, dummy, dummy, dummy); + // wait for the baton + startMain.set(true); + await().untilTrue(baton); + // confirm that the mutation in the other thread is invisible + assertFalse("Mutation from another thread was visible!", dataset.contains(graph2, dummy, dummy, dummy)); + dataset.commit(); + finishLine.set(true); + } finally { + dataset.end(); + } + }).start(); + + await().untilTrue(startMain); + dataset.begin(WRITE); + try { + dataset.add(graph2, dummy, dummy, dummy); + // pass the baton + baton.set(true); + await().untilTrue(finishLine); + dataset.commit(); + } finally { + dataset.end(); + } + + } }
