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 <a...@apache.org> To: users@jena.apache.org, 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