Andy,
Just for completeness here is the stack trace from running the posted
code.
com.hp.hpl.jena.tdb.base.block.BlockException: No such block
at
com.hp.hpl.jena.tdb.base.recordbuffer.RecordRangeIterator.iterator(
RecordRangeIterator.java:39)
at com.hp.hpl.jena.tdb.index.bplustree.BPlusTree.iterator(
BPlusTree.java:383)
at com.hp.hpl.jena.tdb.index.bplustree.BPlusTree.iterator(
BPlusTree.java:366)
at com.hp.hpl.jena.tdb.index.TupleIndexRecord.findWorker(
TupleIndexRecord.java:164)
at com.hp.hpl.jena.tdb.index.TupleIndexRecord.findOrScan(
TupleIndexRecord.java:84)
at com.hp.hpl.jena.tdb.index.TupleIndexRecord.performFind(
TupleIndexRecord.java:78)
at com.hp.hpl.jena.tdb.index.TupleIndexBase.find(
TupleIndexBase.java:91)
at com.hp.hpl.jena.tdb.index.TupleTable.find(TupleTable.java:197)
at com.hp.hpl.jena.tdb.nodetable.NodeTupleTableConcrete.find(
NodeTupleTableConcrete.java:169)
at com.hp.hpl.jena.tdb.nodetable.NodeTupleTableConcrete.find(
NodeTupleTableConcrete.java:157)
at
com.hp.hpl.jena.tdb.nodetable.NodeTupleTableConcrete.findAsNodeIds(
NodeTupleTableConcrete.java:146)
at com.hp.hpl.jena.tdb.store.QuadTable.find(QuadTable.java:87)
at
com.hp.hpl.jena.tdb.store.DatasetGraphTDB.findInSpecificNamedGraph(
DatasetGraphTDB.java:89)
at com.hp.hpl.jena.sparql.core.DatasetGraphBaseFind.findNG(
DatasetGraphBaseFind.java:59)
at com.hp.hpl.jena.sparql.core.DatasetGraphBaseFind.find(
DatasetGraphBaseFind.java:48)
at com.hp.hpl.jena.sparql.core.GraphView.graphBaseFind(
GraphView.java:110)
at com.hp.hpl.jena.graph.impl.GraphBase.find(GraphBase.java:287)
at com.hp.hpl.jena.rdf.model.impl.ModelCom.findTriplesFrom(
ModelCom.java:1308)
at com.hp.hpl.jena.rdf.model.impl.ModelCom.listStatements(
ModelCom.java:1279)
at com.ibm.jenatest.ReaderThread.test(ReaderThread.java:61)
at com.ibm.jenatest.GenericTestThread.run(
GenericTestThread.java:39)
It took 16690 iterations of the writer thread to obtain this error but as
you can see the reader thread gets the exception when trying to execute
this line:
StmtIterator found = model.listStatements(new
SimpleSelector((Resource)null, (Property)null, (RDFNode)null));
Thanks
Steve Groeger
From: Andy Seaborne <[email protected]>
To: [email protected],
Date: 23/01/2014 18:49
Subject: Re: BlockException: No such block
Steve,
The stacktrace does not correspond to the test code posted - there's no
class CreateThread nor methods .checkModel or .getModelCopy.
I have fixed up the code in your message and run it and it has been OK
for me over a couple of extended runs.
Andy
On 23/01/14 13:04, Steve Groeger wrote:
> We are using Jena 2.11.0 and trying to do some concurrency stress
testing.
> When running our tests, after a while we get the following error.
>
> com.hp.hpl.jena.tdb.base.block.BlockException: No such block
> at
> com.hp.hpl.jena.tdb.base.recordbuffer.RecordRangeIterator.iterator(
> RecordRangeIterator.java:39)
> at com.hp.hpl.jena.tdb.index.bplustree.BPlusTree.iterator(
> BPlusTree.java:383)
> at com.hp.hpl.jena.tdb.index.bplustree.BPlusTree.iterator(
> BPlusTree.java:366)
> at com.hp.hpl.jena.tdb.index.TupleIndexRecord.findWorker(
> TupleIndexRecord.java:164)
> at com.hp.hpl.jena.tdb.index.TupleIndexRecord.findOrScan(
> TupleIndexRecord.java:84)
> at com.hp.hpl.jena.tdb.index.TupleIndexRecord.performFind(
> TupleIndexRecord.java:78)
> at com.hp.hpl.jena.tdb.index.TupleIndexBase.find(
> TupleIndexBase.java:91)
> at
com.hp.hpl.jena.tdb.index.TupleTable.find(TupleTable.java:197)
> at com.hp.hpl.jena.tdb.nodetable.NodeTupleTableConcrete.find(
> NodeTupleTableConcrete.java:169)
> at com.hp.hpl.jena.tdb.nodetable.NodeTupleTableConcrete.find(
> NodeTupleTableConcrete.java:157)
> at
> com.hp.hpl.jena.tdb.nodetable.NodeTupleTableConcrete.findAsNodeIds(
> NodeTupleTableConcrete.java:146)
> at com.hp.hpl.jena.tdb.store.QuadTable.find(QuadTable.java:87)
> at
> com.hp.hpl.jena.tdb.store.DatasetGraphTDB.findInSpecificNamedGraph(
> DatasetGraphTDB.java:89)
> at com.hp.hpl.jena.sparql.core.DatasetGraphBaseFind.findNG(
> DatasetGraphBaseFind.java:59)
> at com.hp.hpl.jena.sparql.core.DatasetGraphBaseFind.find(
> DatasetGraphBaseFind.java:48)
> at com.hp.hpl.jena.sparql.core.GraphView.graphBaseFind(
> GraphView.java:110)
> at com.hp.hpl.jena.sparql.core.GraphView.graphBaseFind(
> GraphView.java:104)
> at
com.hp.hpl.jena.graph.impl.GraphBase.find(GraphBase.java:268)
> at com.hp.hpl.jena.graph.GraphUtil.findAll(GraphUtil.java:128)
> at com.hp.hpl.jena.graph.GraphUtil.addInto(GraphUtil.java:183)
> at
com.hp.hpl.jena.rdf.model.impl.ModelCom.add(ModelCom.java:208)
> at
com.hp.hpl.jena.rdf.model.impl.ModelCom.add(ModelCom.java:202)
> at com.ibm.jenatest.CreateThread.getModelCopy(
> CreateThread.java:154)
> at
com.ibm.jenatest.CreateThread.checkModel(CreateThread.java:125)
> at com.ibm.jenatest.CreateThread.test(CreateThread.java:86)
> at com.ibm.jenatest.CreateThread.run(CreateThread.java:52)
>
> Can anyone please explain why we are getting this error, ie if this is a
> bug or we are doing something wrong in our test.
>
> Occasionally we get other issues in the reader thread when we retrieve
the
> statements from the resource, the number that are returned do not match
> the number that are expected (ie 1000) but if we get the statements
again
> all 1000 are there. Hopefully there is an explanation for each of these
> issues.
>
> We are running out test on a RHEL system using the IBM JVM, but have
also
> used other JVMs and we get the same issues.
>
> Our test has a writer thread and several (currently 2) reader threads.
The
> number of iterations necessary for the test to fail vary greatly but it
> does fail at some point.
>
> Here are the classes for our test and the classes for the 2 threads:
>
> public class ReaderWriterTest {
>
> public static void main(String[] args) {
> int i = 1;
> GenericTestThread writer = null;
> writer = new WriterThread("writer" + (i++), args[0] +
"jenatest");
> List<ReaderThread> readers = new ArrayList<ReaderThread>();
> // setup the reader threads
> readers.add(new ReaderThread("reader" + (i++), args[0] +
> "jenatest"));
> readers.add(new ReaderThread("reader" + (i++), args[0] +
> "jenatest"));
>
> if (writer!=null)
> writer.setReaderThreads(readers);
>
> for (GenericTestThread reader : readers) {
> if (writer!=null)
> reader.setWriterThread(writer);
>
> // create the specific data for each of the reader threads
to
> read
> reader.setReaderThreads(readers);
> Dataset createSession = TDBFactory.createDataset
> (((ReaderThread)reader).location);
> createSession.begin(ReadWrite.WRITE);
> String uri = "http://www.ibm.com/" + reader.getName() + "/"
+
> 0;
>
> // Create Jena model with a number of properties
> Model model = createSession.getNamedModel(uri);
> Resource res = model.createResource(uri);
> for (int j = 0; j < 1000; j++) {
> Property p = model.createProperty("
> http://www.ibm.com/prop/" + reader.getName() + "/" + j);
> res.addProperty(p, model.createTypedLiteral("Property"
+
> reader.getName() + "/" + j));
> }
> model.close();
> createSession.commit();
> createSession.end();
> createSession.close();
> }
> // start the writer thread
> if (writer!=null)
> writer.start();
>
> // start the reader threads
> for (GenericTestThread reader : readers) {
> reader.start();
> }
> }
> }
>
>
> public class WriterThread extends GenericTestThread {
>
> private static final int NUM_PROPS = 1000;
> private String location;
>
> public WriterThread(String name, String location) {
> super(name);
> this.location = location;
> }
>
> @Override
> protected void test() {
> for (int i = 0; true; i++) {
> String uri = "http://www.ibm.com/" + getName() + "/" + i;
> checkStop(uri);
>
> Dataset createSession = TDBFactory.createDataset(location);
> createSession.begin(ReadWrite.WRITE);
> info(""+i+" size="+createSession.asDatasetGraph().size());
>
> // Create Jena model with a number of properties
> Model model = createSession.getNamedModel(uri);
> Resource res = model.createResource(uri);
> for (int i1 = 0; i1 < NUM_PROPS; i1++) {
> Property p = model.createProperty("
> http://www.ibm.com/prop/" + getName() + "/" + i1);
> res.addProperty(p, model.createTypedLiteral("Property"
+
> getName() + "/" + i1));
> }
> createSession.commit();
> createSession.end();
> model.close();
>
> createSession.begin(ReadWrite.WRITE);
> model = createSession.getNamedModel(uri);
> model.removeAll();
> createSession.removeNamedModel(uri);
> createSession.commit();
> createSession.end();
> model.close();
> createSession.close();
> }
> }
> }
>
> public class ReaderThread extends GenericTestThread {
>
> private static final int NUM_PROPS = 1000;
> protected String location;
>
> public ReaderThread(String name, String location) {
> super(name);
> this.location = location;
> }
>
> @Override
> protected void test() {
> String uri = "http://www.ibm.com/" + getName() + "/" + 0;
> int iteration = 0;
> while (true) {
> if (((iteration++) % 500) == 0) {
> info("check: "+iteration);
> // need to add a sleep to the thread otherwise
jena
> can never write the data and the journal.jml file
> // gets excessively large and we run out of
memory
> in the JVM
> try {
> Thread.sleep(1000);
> } catch (InterruptedException e) {
> // TODO Auto-generated catch block
> e.printStackTrace();
> }
> }
> Dataset checkSession = TDBFactory.createDataset(location);
> checkSession.begin(ReadWrite.READ);
> Model model = checkSession.getNamedModel(uri);
> StmtIterator found = model.listStatements(new
> SimpleSelector((Resource)null, (Property)null, (RDFNode)null));
> Int count = found.toList().size();
> if (count != NUM_PROPS) {
> System.out.println("Models do not compare expected
size: "
> + NUM_PROPS + " was: " + count);
> }
> found.close();
> checkSession.end();
> // model.close(); // removed as causes errors with jena
> saying we have multiple writers !!!!!!
> checkSession.close();
> }
> }
> }
>
> public abstract class GenericTestThread extends Thread {
>
> private GenericTestThread writerThread;
> private volatile boolean stopped = false;
> private List<ReaderThread> readers;
>
> public GenericTestThread(String name) {
> setName(name);
> }
>
> protected abstract void test();
>
> public void run() {
> try {
> info("Running thread");
> test();
> info("Thread done");
> } catch (Exception e) {// STYLE reason: fault barrier
> synchronized (WriterThread.class) {
> snapshotWriterThread();
> for (GenericTestThread reader : readers) {
> reader.shutdown();
> }
> e.printStackTrace(System.out);// STYLE reason: unit
test
> // System.exit(0); // STYLE reason: TODO
> }
> }
> }
>
> protected void snapshotWriterThread() {
> if (writerThread != null) {
> info(writerThread.getStackTrace());
> writerThread.shutdown();
> }
> }
>
> private void shutdown() {
> stopped = true;
> }
>
> private void info(StackTraceElement[] stackTraceElements) {
> for (StackTraceElement trace : stackTraceElements) {
> info(" " + trace);
> }
> }
>
> protected void info(Exception e) {
> System.out.println(getName() + ": " + e.toString());// STYLE
> reason: unit test
> }
>
> protected void info(String message) {
> System.out.println(getName() + ": " + message);// STYLE reason:
> unit test
> }
>
> protected void checkStop(String message) {
> if (stopped) {
> throw new RuntimeException("thread stopped: " + message);
> }
> }
>
> public void setWriterThread(GenericTestThread other) {
> this.writerThread = other;
> }
>
> public GenericTestThread getWriterThread() {
> return this.writerThread;
> }
>
> public void setReaderThreads(List<ReaderThread> readers) {
> this.readers = readers;
> }
>
> public List<ReaderThread> getReaderThreads() {
> return this.readers;
> }
> }
>
> Thanks
> Steve Groeger
>
> Unless stated otherwise above:
> IBM United Kingdom Limited - Registered in England and Wales with number
> 741598.
> Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6
3AU
>
Unless stated otherwise above:
IBM United Kingdom Limited - Registered in England and Wales with number
741598.
Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU