Hi,
I think that this is cased by the fact that if you create a
LockableMGraph over MGraphs provided by the SingleTdbDatasetTcProvider
you end up in a situation where you have multiple ReadWrite Locks on
the same quad store (the Jena TDB dataset). This means that acquiring
a write lock on one MGraph will not prohibit changes in other graphs -
or the creation of new graphs. Because of that you will end up with
ConcurrentModificationException when using iterators over triples
(such as going over SPARQL results).
The solution would be to
* create a single ReadWirte lock for the SingleTdbDatasetTcProvider
* replace all synchronized(dataset){..} block with read/wirte locks
* all methods returning MGraphs need to return LockableMGraph
instances that do use the ReadWrite lock used by the
SingleTdbDatasetTcProvider
* users would than need to use the LockableMGraph instance provided by
the provider and NOT wrap those with an other LockableMGraph instance
(e.g. the LockableMGraphWrapper).
best
Rupert
On Wed, Mar 13, 2013 at 5:31 PM, Minto van der Sluis <[email protected]> wrote:
> Hi Folks,
>
> I ran into an issue is both the existing SingleTdbDatasetTcProvider and
> my customized version (see CLEREZZA-736).
>
> How to reproduce:
> 1) Have some process constantly inject new named graphs (I had a process
> injecting 1000 named graphs)
> 2) perform a query while 1 is still running. I used the following query:
>
> SELECT ?graphName WHERE { GRAPH ?graphName {} } LIMIT 10 OFFSET 0
>
> 3) repeat step 2 a number of times (since the error does not always occur)
>
> This results in a ConcurrentModificationException (see stacktrace
> below). I am not sure whether this is a Clerezza or Jena issue.
>
> Anyone an idea what is causing this? Or more importantly how to fix it?
>
> Should I create a Jira issue for this?
>
> Regards,
>
> --
> ir. ing. Minto van der Sluis
> Software innovator / renovator
> Xup BV
>
>
> Stacktrace:
> java.util.ConcurrentModificationException: Iterator: started at 7103, now 7105
> at
> com.hp.hpl.jena.tdb.sys.DatasetControlMRSW.policyError(DatasetControlMRSW.java:157)
> at
> com.hp.hpl.jena.tdb.sys.DatasetControlMRSW.access$000(DatasetControlMRSW.java:32)
> at
> com.hp.hpl.jena.tdb.sys.DatasetControlMRSW$IteratorCheckNotConcurrent.checkCourrentModification(DatasetControlMRSW.java:110)
> at
> com.hp.hpl.jena.tdb.sys.DatasetControlMRSW$IteratorCheckNotConcurrent.hasNext(DatasetControlMRSW.java:118)
> at org.openjena.atlas.iterator.Iter$4.hasNext(Iter.java:295)
> at
> com.hp.hpl.jena.tdb.store.GraphTDBBase$ProjectQuadsToTriples.hasNext(GraphTDBBase.java:173)
> at
> com.hp.hpl.jena.util.iterator.WrappedIterator.hasNext(WrappedIterator.java:76)
> at
> org.apache.clerezza.rdf.jena.storage.JenaGraphAdaptor$1.hasNext(JenaGraphAdaptor.java:106)
> at
> org.apache.clerezza.rdf.core.impl.AbstractTripleCollection$1.hasNext(AbstractTripleCollection.java:78)
> at
> org.apache.clerezza.rdf.core.access.LockingIterator.hasNext(LockingIterator.java:47)
> at
> org.apache.clerezza.rdf.jena.facade.JenaGraph$1.hasNext(JenaGraph.java:95)
> at
> com.hp.hpl.jena.util.iterator.WrappedIterator.hasNext(WrappedIterator.java:76)
> at
> com.hp.hpl.jena.sparql.engine.iterator.QueryIterTriplePattern$TripleMapper.hasNextBinding(QueryIterTriplePattern.java:151)
> at
> com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:112)
> at
> com.hp.hpl.jena.sparql.engine.iterator.QueryIterRepeatApply.hasNextBinding(QueryIterRepeatApply.java:79)
> at
> com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:112)
> at
> com.hp.hpl.jena.sparql.engine.iterator.QueryIterBlockTriples.hasNextBinding(QueryIterBlockTriples.java:64)
> at
> com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:112)
> at
> com.hp.hpl.jena.sparql.engine.main.iterator.QueryIterGraph$QueryIterGraphInner.hasNextBinding(QueryIterGraph.java:123)
> at
> com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:112)
> at
> com.hp.hpl.jena.sparql.engine.iterator.QueryIterRepeatApply.hasNextBinding(QueryIterRepeatApply.java:79)
> at
> com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:112)
> at
> com.hp.hpl.jena.sparql.engine.iterator.QueryIterConvert.hasNextBinding(QueryIterConvert.java:59)
> at
> com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:112)
> at
> com.hp.hpl.jena.sparql.engine.iterator.QueryIterSlice.hasNextBinding(QueryIterSlice.java:76)
> at
> com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:112)
> at
> com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorWrapper.hasNextBinding(QueryIteratorWrapper.java:40)
> at
> com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:112)
> at
> com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorWrapper.hasNextBinding(QueryIteratorWrapper.java:40)
> at
> com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:112)
> at
> com.hp.hpl.jena.sparql.engine.ResultSetStream.hasNext(ResultSetStream.java:72)
> at
> org.apache.clerezza.rdf.jena.sparql.ResultSetWrapper.<init>(ResultSetWrapper.java:39)
> at
> org.apache.clerezza.rdf.jena.sparql.JenaSparqlEngine.execute(JenaSparqlEngine.java:68)
> at
> org.apache.clerezza.rdf.core.access.TcManager.executeSparqlQuery(TcManager.java:272)
> ...
>
--
| Rupert Westenthaler [email protected]
| Bodenlehenstraße 11 ++43-699-11108907
| A-5500 Bischofshofen