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

Reply via email to