On 08/11/13 12:27, Reto Bachmann-Gmür wrote:
On Wed, Nov 6, 2013 at 2:57 PM, Andy Seaborne <[email protected]> wrote:
On 06/11/13 09:33, Reto Bachmann-Gmür wrote:
Hello,
I've been encountering the following exception. I think it happened after
the instance was killed. WHat does it mean? How to fix it?
org.apache.jena.atlas.lib.InternalErrorException: Invalid id node for
object (null node): ([000000000000025E], [000000000000019C],
[0000000000000321])
at com.hp.hpl.jena.tdb.lib.TupleLib.triple(TupleLib.java:139)
at com.hp.hpl.jena.tdb.lib.TupleLib.triple(TupleLib.java:114)
at com.hp.hpl.jena.tdb.lib.TupleLib.access$000(TupleLib.java:45)
at com.hp.hpl.jena.tdb.lib.TupleLib$3.convert(TupleLib.java:76)
at com.hp.hpl.jena.tdb.lib.TupleLib$3.convert(TupleLib.java:72)
at org.apache.jena.atlas.iterator.Iter$4.next(Iter.java:317)
at org.apache.jena.atlas.iterator.Iter$4.next(Iter.java:317)
at org.apache.jena.atlas.iterator.Iter$4.next(Iter.java:317)
at org.apache.jena.atlas.iterator.Iter.next(Iter.java:915)
at
com.hp.hpl.jena.util.iterator.WrappedIterator.next(
WrappedIterator.java:94)
Cheers,
Reto
(version?)
2.1.1 (core+arq), 1.0.0 (tdb +iri)
There are two possible causes I can think of - I can't tell which it is;
it may be something else.
1/ No transactions. There were un-synced updates and you were unlucky.
What the framework is supposed to ensure is that no two add/deletes happen
at the same time (on the same dataset).
Transaction ideally and within a transaction, one thread per
transaction. Or MRSW but that does risk corruption on a crash.
The issue is that non-transactionally, writes to the database are not
done in a safe, idempotent order as they are in a transaction.
If the JVM is killed, then there may be unwritten data only in-memory
which is lost.
Also no add/delete happens at the
same time as a read. It does not guarantee that some code uses an iterator
without proper locking, so the case where one is likely to get a
concurrentModificationException.
Would this be enough to keep that triplestore safe?
No. It is most likely the killing of a non-transactional app without
sync'ing the internal caches.
This is not most common exception that occurs in that situation; more
common is complaints from the node table.
Were you deleting stuff around the time of the instance death? There is a
triple/quad in the index where there is no RDF term for the object in the
NodeTable.
Bad news: The database is damaged on disk.
Any rescue tools/path?
Sorry - no.
When I try to serialize a graph (as n-triples) it stops somewhere in the
middle ot a triple. Not always at the same point.
Cheers,
Reto
2/ An iterator has been passed across a transaction boundary (e.g. from
one thread to another). I would hope that passing it across a transaction
boundary in the same thread would have been signalled but you may have
found another devious way to do that.
The database is not damaged on disk.
But as you said the instance was killed, (1) looks more likely. Sorry.
Andy
Andy