New NullPointerException?

34 views
Skip to first unread message

A Richardson

unread,
Mar 1, 2012, 10:19:01 AM3/1/12
to OrientDB
In the current SVN (4893), I am now getting a NullPointer Exception
from a transaction that used to succeed. I'm guessing this might have
been a side effect from Andrey's recent index fixes?

A stack trace is shown below, we'll try to work up a java test case to
demonstrate the issue. In general, we're following a graph model, and
we're attaching a new tree of vertices to an existing vertex, all
within a remote transaction:

java.lang.NullPointerException
at java.util.TreeMap.getEntry(TreeMap.java:341)
at java.util.TreeMap.containsKey(TreeMap.java:226)
at
com.orientechnologies.orient.core.tx.OTransactionIndexChanges.containsChangesPerKey(OTransactionIndexChanges.java:
52)
at
com.orientechnologies.orient.core.index.OIndexTxAwareOneValue.get(OIndexTxAwareOneValue.java:
68)
at
com.orientechnologies.orient.core.index.OIndexTxAwareOneValue.checkEntry(OIndexTxAwareOneValue.java:
47)
at
com.orientechnologies.orient.core.index.OClassIndexManager.checkIndexedPropertiesOnCreation(OClassIndexManager.java:
338)
at
com.orientechnologies.orient.core.index.OClassIndexManager.onRecordBeforeCreate(OClassIndexManager.java:
48)
at
com.orientechnologies.orient.core.hook.ODocumentHookAbstract.onTrigger(ODocumentHookAbstract.java:
119)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordAbstract.callbackHooks(ODatabaseRecordAbstract.java:
798)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordAbstract.executeSaveRecord(ODatabaseRecordAbstract.java:
610)
at
com.orientechnologies.orient.core.tx.OTransactionOptimistic.addRecord(OTransactionOptimistic.java:
102)
at
com.orientechnologies.orient.core.tx.OTransactionOptimistic.saveRecord(OTransactionOptimistic.java:
91)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordTx.save(ODatabaseRecordTx.java:
225)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordTx.save(ODatabaseRecordTx.java:
215)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordTx.save(ODatabaseRecordTx.java:
42)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerCSVAbstract.linkToStream(ORecordSerializerCSVAbstract.java:
699)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerCSVAbstract.fieldToStream(ORecordSerializerCSVAbstract.java:
241)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerSchemaAware2CSV.toString(ORecordSerializerSchemaAware2CSV.java:
240)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerStringAbstract.toStream(ORecordSerializerStringAbstract.java:
79)
at
com.orientechnologies.orient.core.record.ORecordSchemaAwareAbstract.toStream(ORecordSchemaAwareAbstract.java:
115)
at
com.orientechnologies.orient.core.record.ORecordSchemaAwareAbstract.toStream(ORecordSchemaAwareAbstract.java:
110)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordAbstract.executeSaveRecord(ODatabaseRecordAbstract.java:
590)
at
com.orientechnologies.orient.core.tx.OTransactionOptimistic.addRecord(OTransactionOptimistic.java:
102)
at
com.orientechnologies.orient.core.tx.OTransactionOptimistic.saveRecord(OTransactionOptimistic.java:
91)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordTx.save(ODatabaseRecordTx.java:
225)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordTx.save(ODatabaseRecordTx.java:
220)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordTx.save(ODatabaseRecordTx.java:
42)
at
com.orientechnologies.orient.core.record.ORecordAbstract.save(ORecordAbstract.java:
255)
at
com.orientechnologies.orient.core.record.impl.ODocument.save(ODocument.java:
1198)
at
com.orientechnologies.orient.core.record.impl.ODocument.save(ODocument.java:
1187)
at
com.orientechnologies.orient.core.record.impl.ODocument.save(ODocument.java:
65)
at
com.orientechnologies.orient.core.type.tree.OMVRBTreeRID.saveAllNewEntries(OMVRBTreeRID.java:
363)
at
com.orientechnologies.orient.core.type.tree.provider.OMVRBTreeRIDProvider.toStream(OMVRBTreeRIDProvider.java:
112)
at
com.orientechnologies.orient.core.type.tree.OMVRBTreeRIDSet.toStream(OMVRBTreeRIDSet.java:
171)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerCSVAbstract.linkSetToStream(ORecordSerializerCSVAbstract.java:
401)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerCSVAbstract.fieldToStream(ORecordSerializerCSVAbstract.java:
318)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerSchemaAware2CSV.toString(ORecordSerializerSchemaAware2CSV.java:
240)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerStringAbstract.toStream(ORecordSerializerStringAbstract.java:
79)
at
com.orientechnologies.orient.core.record.ORecordSchemaAwareAbstract.toStream(ORecordSchemaAwareAbstract.java:
115)
at
com.orientechnologies.orient.core.record.ORecordSchemaAwareAbstract.toStream(ORecordSchemaAwareAbstract.java:
110)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordAbstract.executeSaveRecord(ODatabaseRecordAbstract.java:
590)
at
com.orientechnologies.orient.core.tx.OTransactionOptimistic.addRecord(OTransactionOptimistic.java:
102)
at
com.orientechnologies.orient.core.tx.OTransactionOptimistic.saveRecord(OTransactionOptimistic.java:
91)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordTx.save(ODatabaseRecordTx.java:
225)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordTx.save(ODatabaseRecordTx.java:
215)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordTx.save(ODatabaseRecordTx.java:
42)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerCSVAbstract.linkToStream(ORecordSerializerCSVAbstract.java:
699)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerCSVAbstract.fieldToStream(ORecordSerializerCSVAbstract.java:
241)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerSchemaAware2CSV.toString(ORecordSerializerSchemaAware2CSV.java:
240)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerStringAbstract.toStream(ORecordSerializerStringAbstract.java:
79)
at
com.orientechnologies.orient.core.record.ORecordSchemaAwareAbstract.toStream(ORecordSchemaAwareAbstract.java:
115)
at
com.orientechnologies.orient.core.record.ORecordSchemaAwareAbstract.toStream(ORecordSchemaAwareAbstract.java:
110)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordAbstract.executeSaveRecord(ODatabaseRecordAbstract.java:
590)
at
com.orientechnologies.orient.core.tx.OTransactionOptimistic.addRecord(OTransactionOptimistic.java:
102)
at
com.orientechnologies.orient.core.tx.OTransactionOptimistic.saveRecord(OTransactionOptimistic.java:
91)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordTx.save(ODatabaseRecordTx.java:
225)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordTx.save(ODatabaseRecordTx.java:
220)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordTx.save(ODatabaseRecordTx.java:
42)
at
com.orientechnologies.orient.core.record.ORecordAbstract.save(ORecordAbstract.java:
255)
at
com.orientechnologies.orient.core.record.impl.ODocument.save(ODocument.java:
1198)
at
com.orientechnologies.orient.core.record.impl.ODocument.save(ODocument.java:
1187)
at
com.orientechnologies.orient.core.record.impl.ODocument.save(ODocument.java:
65)
at
com.orientechnologies.orient.core.type.tree.OMVRBTreeRID.saveAllNewEntries(OMVRBTreeRID.java:
363)
at
com.orientechnologies.orient.core.type.tree.provider.OMVRBTreeRIDProvider.toStream(OMVRBTreeRIDProvider.java:
112)
at
com.orientechnologies.orient.core.type.tree.OMVRBTreeRIDSet.toStream(OMVRBTreeRIDSet.java:
171)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerCSVAbstract.linkSetToStream(ORecordSerializerCSVAbstract.java:
401)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerCSVAbstract.fieldToStream(ORecordSerializerCSVAbstract.java:
318)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerSchemaAware2CSV.toString(ORecordSerializerSchemaAware2CSV.java:
240)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerStringAbstract.toStream(ORecordSerializerStringAbstract.java:
79)
at
com.orientechnologies.orient.core.record.ORecordSchemaAwareAbstract.toStream(ORecordSchemaAwareAbstract.java:
115)
at
com.orientechnologies.orient.core.record.ORecordSchemaAwareAbstract.toStream(ORecordSchemaAwareAbstract.java:
110)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordAbstract.executeSaveRecord(ODatabaseRecordAbstract.java:
590)
at
com.orientechnologies.orient.core.tx.OTransactionOptimistic.addRecord(OTransactionOptimistic.java:
102)
at
com.orientechnologies.orient.core.tx.OTransactionOptimistic.saveRecord(OTransactionOptimistic.java:
91)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordTx.save(ODatabaseRecordTx.java:
225)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordTx.save(ODatabaseRecordTx.java:
215)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordTx.save(ODatabaseRecordTx.java:
42)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerCSVAbstract.linkToStream(ORecordSerializerCSVAbstract.java:
699)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerCSVAbstract.fieldToStream(ORecordSerializerCSVAbstract.java:
241)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerSchemaAware2CSV.toString(ORecordSerializerSchemaAware2CSV.java:
240)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerStringAbstract.toStream(ORecordSerializerStringAbstract.java:
79)
at
com.orientechnologies.orient.core.record.ORecordSchemaAwareAbstract.toStream(ORecordSchemaAwareAbstract.java:
115)
at
com.orientechnologies.orient.core.record.ORecordSchemaAwareAbstract.toStream(ORecordSchemaAwareAbstract.java:
110)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordAbstract.executeSaveRecord(ODatabaseRecordAbstract.java:
590)
at
com.orientechnologies.orient.core.tx.OTransactionOptimistic.addRecord(OTransactionOptimistic.java:
102)
at
com.orientechnologies.orient.core.tx.OTransactionOptimistic.saveRecord(OTransactionOptimistic.java:
91)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordTx.save(ODatabaseRecordTx.java:
225)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordTx.save(ODatabaseRecordTx.java:
220)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordTx.save(ODatabaseRecordTx.java:
42)
at
com.orientechnologies.orient.core.record.ORecordAbstract.save(ORecordAbstract.java:
255)
at
com.orientechnologies.orient.core.record.impl.ODocument.save(ODocument.java:
1198)
at
com.orientechnologies.orient.core.record.impl.ODocument.save(ODocument.java:
1187)
at
com.orientechnologies.orient.core.record.impl.ODocument.save(ODocument.java:
65)
at
com.orientechnologies.orient.core.type.tree.OMVRBTreeRID.saveAllNewEntries(OMVRBTreeRID.java:
363)
at
com.orientechnologies.orient.core.type.tree.provider.OMVRBTreeRIDProvider.toStream(OMVRBTreeRIDProvider.java:
112)
at
com.orientechnologies.orient.core.type.tree.OMVRBTreeRIDSet.toStream(OMVRBTreeRIDSet.java:
171)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerCSVAbstract.linkSetToStream(ORecordSerializerCSVAbstract.java:
401)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerCSVAbstract.fieldToStream(ORecordSerializerCSVAbstract.java:
318)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerSchemaAware2CSV.toString(ORecordSerializerSchemaAware2CSV.java:
240)
at
com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerStringAbstract.toStream(ORecordSerializerStringAbstract.java:
79)
at
com.orientechnologies.orient.core.record.ORecordSchemaAwareAbstract.toStream(ORecordSchemaAwareAbstract.java:
115)
at
com.orientechnologies.orient.core.record.ORecordSchemaAwareAbstract.toStream(ORecordSchemaAwareAbstract.java:
110)
at
com.orientechnologies.orient.core.storage.impl.local.OStorageLocalTxExecuter.commitEntry(OStorageLocalTxExecuter.java:
240)
at
com.orientechnologies.orient.core.storage.impl.local.OStorageLocalTxExecuter.commitAllPendingRecords(OStorageLocalTxExecuter.java:
149)
at
com.orientechnologies.orient.core.storage.impl.local.OStorageLocal.commit(OStorageLocal.java:
885)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordTx
$1.call(ODatabaseRecordTx.java:268)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordTx
$1.call(ODatabaseRecordTx.java:265)
at
com.orientechnologies.orient.core.storage.OStorageAbstract.callInLock(OStorageAbstract.java:
173)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordTx.executeCommit(ODatabaseRecordTx.java:
265)
at
com.orientechnologies.orient.core.tx.OTransactionOptimistic.commit(OTransactionOptimistic.java:
46)
at
com.orientechnologies.orient.core.db.record.ODatabaseRecordTx.commit(ODatabaseRecordTx.java:
119)
at
com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx.commit(ODatabaseDocumentTx.java:
311)
at
com.orientechnologies.orient.server.network.protocol.binary.ONetworkProtocolBinary.commit(ONetworkProtocolBinary.java:
646)
at
com.orientechnologies.orient.server.network.protocol.binary.ONetworkProtocolBinary.executeRequest(ONetworkProtocolBinary.java:
227)
at
com.orientechnologies.orient.server.network.protocol.binary.OBinaryNetworkProtocolAbstract.execute(OBinaryNetworkProtocolAbstract.java:
119)
at
com.orientechnologies.common.thread.OSoftThread.run(OSoftThread.java:
48)

StevenTomer

unread,
Mar 1, 2012, 3:40:22 PM3/1/12
to OrientDB
The following test case causes the problem:

public void TransactionNullsInUniqueIndexTest()
{
System.out.println("**************************
TransactionNullsInUniqueIndexTest
***************************************");
ODatabaseDocumentTx db = new ODatabaseDocumentTx(url);
db.open("admin", "admin");
OClass vertexClass =
db.getMetadata().getSchema().createClass("TRNVertex");
OClass edgeClass =
db.getMetadata().getSchema().createClass("TRNEdge");
vertexClass.createProperty("in", OType.LINKSET, edgeClass);
vertexClass.createProperty("out", OType.LINKSET, edgeClass);
edgeClass.createProperty("in", OType.LINK, vertexClass);
edgeClass.createProperty("out", OType.LINK, vertexClass);

OClass personClass =
db.getMetadata().getSchema().createClass("TRNPerson", vertexClass);
personClass.createProperty("ssn",
OType.STRING).createIndex(OClass.INDEX_TYPE.UNIQUE);
personClass.createProperty("name",
OType.STRING).createIndex(OClass.INDEX_TYPE.NOTUNIQUE);

db.getMetadata().getSchema().save();

db.begin();

ODocument john = new ODocument("TRNPerson");
john.field("name", "John Doe");
john.field("ssn", "123-45-6789");
john.field("in", new HashSet<ODocument>());
john.field("out", new HashSet<ODocument>());

ODocument james = new ODocument("TRNPerson");
james.field("name", "james Doe");
james.field("ssn", "987-65-4321");
james.field("in", new HashSet<ODocument>());
james.field("out", new HashSet<ODocument>());

ODocument jane = new ODocument("TRNPerson");
jane.field("name", "jane Doe");
jane.field("in", new HashSet<ODocument>());
jane.field("out", new HashSet<ODocument>());

ODocument edge1 = new ODocument("TRNEdge");
edge1.field("in", john.getIdentity());
edge1.field("out", james.getIdentity());
((HashSet<ODocument>)john.field("out")).add(edge1);
((HashSet<ODocument>)james.field("in")).add(edge1);
edge1.save();

ODocument edge2 = new ODocument("TRNEdge");
edge2.field("in", james.getIdentity());
edge2.field("out", jane.getIdentity());
((HashSet<ODocument>)james.field("out")).add(edge2);
((HashSet<ODocument>)jane.field("in")).add(edge2);
edge2.save();

john.save();
james.save();
jane.save();

db.commit();

db.close();
System.out.println("**************************
TransactionNullsInUniqueIndexTest
***************************************");
}

Andrey Lomakin

unread,
Mar 1, 2012, 11:46:23 PM3/1/12
to orient-...@googlegroups.com
Hi, Steven and Alex.
Thank you for test case will fix it at the weekend.

Andrey Lomakin

unread,
Mar 3, 2012, 1:58:41 PM3/3/12
to orient-...@googlegroups.com
Hi, Alex and Steven.
Fixed by SVN 4911.

A Richardson

unread,
Mar 5, 2012, 10:16:32 AM3/5/12
to orient-...@googlegroups.com
Andrey,

Our tests over the weekend indicate that this fixed our problems.

Thanks for your very timely commit!

Alex
Reply all
Reply to author
Forward
0 new messages