Thanks, this is exactly what I needed. I've used it in the past, but have been "away" long enough that I'd forgotten about it.
On Tue, Apr 11, 2017 at 4:23 PM, A. Soroka <aj...@virginia.edu> wrote: > Yes, you will want to exercise some control over concurrency here: > > https://jena.apache.org/documentation/notes/concurrency-howto.html > > --- > A. Soroka > The University of Virginia Library > >> On Apr 11, 2017, at 1:16 PM, Joshua TAYLOR <joshuaaa...@gmail.com> wrote: >> >> I expect the answer to my question is simply "make sure model access >> is synchronized", but just in case, I'm wondering whether this is >> expected behavior. Here's some code that modifies a model from a >> bunch of different threads. This doesn't cause an error every time, >> but occasionally throws, as shown in the stacktrace following the >> code. >> >> The class here is called OhDearTest, because I getting a >> `jena.shared.BrokenException oh dear, already have a slot for ...` >> earlier, which I'm still trying to reproduce. This code doesn't seem >> to trigger it. I've included a bit of that stacktrace at the very end. >> >> ## Code >> >> import org.apache.jena.rdf.model.Model; >> import org.apache.jena.rdf.model.ModelFactory; >> import org.apache.jena.rdf.model.Property; >> import org.apache.jena.rdf.model.Resource; >> >> public class OhDearTest { >> public static void main(String[] args) throws InterruptedException { >> int n = 1000; >> Model model = ModelFactory.createDefaultModel(); >> Property p = model.createProperty("urn:ex:p"); >> Thread[] thread = new Thread[n]; >> for (int i = 0; i < n; i++) { >> thread[i] = new Thread(() -> { >> Resource r = model.createResource(); >> r.addLiteral(p, "value"); >> }); >> thread[i].start(); >> } >> for (int i = 0; i < n; i++) { >> thread[i].join(); >> } >> } >> } >> >> ## Stacktrace >> >> Exception in thread "Thread-300" Exception in thread "Thread-299" >> Exception in thread "Thread-304" Exception in thread "Thread-282" >> Exception in thread "Thread-324" Exception in thread "Thread-331" >> Exception in thread "Thread-328" >> java.lang.ArrayIndexOutOfBoundsException: 905 >> at org.apache.jena.mem.HashCommon.findSlot(HashCommon.java:164) >> at >> org.apache.jena.mem.HashedTripleBunch.contains(HashedTripleBunch.java:40) >> at >> org.apache.jena.mem.NodeToTriplesMapMem.add(NodeToTriplesMapMem.java:52) >> at >> org.apache.jena.mem.GraphTripleStoreBase.add(GraphTripleStoreBase.java:63) >> at org.apache.jena.mem.GraphMem.performAdd(GraphMem.java:37) >> at org.apache.jena.graph.impl.GraphBase.add(GraphBase.java:181) >> at org.apache.jena.rdf.model.impl.ModelCom.add(ModelCom.java:1191) >> at >> org.apache.jena.rdf.model.impl.ResourceImpl.addLiteral(ResourceImpl.java:285) >> at OhDearTest.lambda$0(OhDearTest.java:15) >> at java.lang.Thread.run(Thread.java:745) >> java.lang.ArrayIndexOutOfBoundsException: 789 >> at org.apache.jena.mem.HashCommon.findSlot(HashCommon.java:164) >> at >> org.apache.jena.mem.HashedTripleBunch.contains(HashedTripleBunch.java:40) >> at >> org.apache.jena.mem.NodeToTriplesMapMem.add(NodeToTriplesMapMem.java:52) >> at >> org.apache.jena.mem.GraphTripleStoreBase.add(GraphTripleStoreBase.java:63) >> at org.apache.jena.mem.GraphMem.performAdd(GraphMem.java:37) >> at org.apache.jena.graph.impl.GraphBase.add(GraphBase.java:181) >> at org.apache.jena.rdf.model.impl.ModelCom.add(ModelCom.java:1191) >> at >> org.apache.jena.rdf.model.impl.ResourceImpl.addLiteral(ResourceImpl.java:285) >> at OhDearTest.lambda$0(OhDearTest.java:15) >> at java.lang.Thread.run(Thread.java:745) >> java.lang.ArrayIndexOutOfBoundsException: 827 >> at org.apache.jena.mem.HashCommon.findSlot(HashCommon.java:164) >> at >> org.apache.jena.mem.HashedTripleBunch.contains(HashedTripleBunch.java:40) >> at >> org.apache.jena.mem.NodeToTriplesMapMem.add(NodeToTriplesMapMem.java:52) >> at >> org.apache.jena.mem.GraphTripleStoreBase.add(GraphTripleStoreBase.java:63) >> at org.apache.jena.mem.GraphMem.performAdd(GraphMem.java:37) >> at org.apache.jena.graph.impl.GraphBase.add(GraphBase.java:181) >> at org.apache.jena.rdf.model.impl.ModelCom.add(ModelCom.java:1191) >> at >> org.apache.jena.rdf.model.impl.ResourceImpl.addLiteral(ResourceImpl.java:285) >> at OhDearTest.lambda$0(OhDearTest.java:15) >> at java.lang.Thread.run(Thread.java:745) >> java.lang.ArrayIndexOutOfBoundsException: 1061 >> at org.apache.jena.mem.HashCommon.findSlot(HashCommon.java:164) >> at org.apache.jena.mem.HashedBunchMap.put(HashedBunchMap.java:66) >> at >> org.apache.jena.mem.NodeToTriplesMapMem.add(NodeToTriplesMapMem.java:51) >> at >> org.apache.jena.mem.GraphTripleStoreBase.add(GraphTripleStoreBase.java:60) >> at org.apache.jena.mem.GraphMem.performAdd(GraphMem.java:37) >> at org.apache.jena.graph.impl.GraphBase.add(GraphBase.java:181) >> at org.apache.jena.rdf.model.impl.ModelCom.add(ModelCom.java:1191) >> at >> org.apache.jena.rdf.model.impl.ResourceImpl.addLiteral(ResourceImpl.java:285) >> at OhDearTest.lambda$0(OhDearTest.java:15) >> at java.lang.Thread.run(Thread.java:745) >> java.lang.ArrayIndexOutOfBoundsException: 918 >> at org.apache.jena.mem.HashCommon.findSlot(HashCommon.java:164) >> at org.apache.jena.mem.HashedBunchMap.get(HashedBunchMap.java:59) >> at >> org.apache.jena.mem.NodeToTriplesMapMem.add(NodeToTriplesMapMem.java:50) >> at >> org.apache.jena.mem.GraphTripleStoreBase.add(GraphTripleStoreBase.java:60) >> at org.apache.jena.mem.GraphMem.performAdd(GraphMem.java:37) >> at org.apache.jena.graph.impl.GraphBase.add(GraphBase.java:181) >> at org.apache.jena.rdf.model.impl.ModelCom.add(ModelCom.java:1191) >> at >> org.apache.jena.rdf.model.impl.ResourceImpl.addLiteral(ResourceImpl.java:285) >> at OhDearTest.lambda$0(OhDearTest.java:15) >> at java.lang.Thread.run(Thread.java:745) >> java.lang.ArrayIndexOutOfBoundsException: 1109 >> at org.apache.jena.mem.HashCommon.findSlot(HashCommon.java:164) >> at org.apache.jena.mem.HashedBunchMap.get(HashedBunchMap.java:59) >> at >> org.apache.jena.mem.NodeToTriplesMapMem.add(NodeToTriplesMapMem.java:50) >> at >> org.apache.jena.mem.GraphTripleStoreBase.add(GraphTripleStoreBase.java:60) >> at org.apache.jena.mem.GraphMem.performAdd(GraphMem.java:37) >> at org.apache.jena.graph.impl.GraphBase.add(GraphBase.java:181) >> at org.apache.jena.rdf.model.impl.ModelCom.add(ModelCom.java:1191) >> at >> org.apache.jena.rdf.model.impl.ResourceImpl.addLiteral(ResourceImpl.java:285) >> at OhDearTest.lambda$0(OhDearTest.java:15) >> at java.lang.Thread.run(Thread.java:745) >> java.lang.ArrayIndexOutOfBoundsException: 1144 >> at org.apache.jena.mem.HashedBunchMap.put$(HashedBunchMap.java:87) >> at org.apache.jena.mem.HashedBunchMap.put(HashedBunchMap.java:70) >> at >> org.apache.jena.mem.NodeToTriplesMapMem.add(NodeToTriplesMapMem.java:51) >> at >> org.apache.jena.mem.GraphTripleStoreBase.add(GraphTripleStoreBase.java:60) >> at org.apache.jena.mem.GraphMem.performAdd(GraphMem.java:37) >> at org.apache.jena.graph.impl.GraphBase.add(GraphBase.java:181) >> at org.apache.jena.rdf.model.impl.ModelCom.add(ModelCom.java:1191) >> at >> org.apache.jena.rdf.model.impl.ResourceImpl.addLiteral(ResourceImpl.java:285) >> at OhDearTest.lambda$0(OhDearTest.java:15) >> at java.lang.Thread.run(Thread.java:745) >> >> ## The Oh Dear Exception >> >> The code above doesn't seem to produce this, but it's what I initially ran >> into. >> >> Caused by: org.apache.jena.shared.BrokenException: oh dear, already >> have a slot for 24e48338:15b5d4bfe76:-7ff3, viz 13 >> at org.apache.jena.mem.HashedBunchMap.grow(HashedBunchMap.java:109) >> at org.apache.jena.mem.HashedBunchMap.put$(HashedBunchMap.java:90) >> at org.apache.jena.mem.HashedBunchMap.put(HashedBunchMap.java:70) >> at >> org.apache.jena.mem.NodeToTriplesMapMem.add(NodeToTriplesMapMem.java:51) >> at >> org.apache.jena.mem.GraphTripleStoreBase.add(GraphTripleStoreBase.java:60) >> at org.apache.jena.mem.GraphMem.performAdd(GraphMem.java:37) >> at org.apache.jena.graph.impl.GraphBase.add(GraphBase.java:181) >> at org.apache.jena.rdf.model.impl.ModelCom.add(ModelCom.java:1191) >> at org.apache.jena.rdf.model.impl.ModelCom.add(ModelCom.java:184) >> at org.apache.jena.rdf.model.impl.ModelCom.add(ModelCom.java:172) >> at >> org.apache.jena.rdf.model.impl.ResourceImpl.addProperty(ResourceImpl.java:263) >> >> >> -- >> Joshua Taylor, http://www.cs.rpi.edu/~tayloj/ > -- Joshua Taylor, http://www.cs.rpi.edu/~tayloj/