Hi!

While I was writing unit tests for my app I noticed this exception when 
testing more concurrent sessions than connectionPoolSize in javascript 
neo4j-driver.

Versions:
neo4j - dockerized 3.0.1, image neo4j:3.0
neo4j-driver - 1.0.1
nodejs - tested on 6.6.0 and 6.2.1

Error:
2016-09-27 19:21:41.296+0000 ERROR [o.n.b.v.t.BoltProtocolV1] Failed to 
write response to driver
java.lang.NullPointerException
at org.neo4j.bolt.v1.transport.ChunkedOutput.ensure(ChunkedOutput.java:156)
at 
org.neo4j.bolt.v1.transport.ChunkedOutput.writeShort(ChunkedOutput.java:90)
at 
org.neo4j.bolt.v1.packstream.PackStream$Packer.packStructHeader(PackStream.java:304)
at 
org.neo4j.bolt.v1.messaging.PackStreamMessageFormatV1$Writer.handleSuccessMessage(PackStreamMessageFormatV1.java:145)
at 
org.neo4j.bolt.v1.messaging.msgprocess.MessageProcessingCallback.completed(MessageProcessingCallback.java:102)
at 
org.neo4j.bolt.v1.messaging.msgprocess.MessageProcessingCallback.completed(MessageProcessingCallback.java:31)
at 
org.neo4j.bolt.v1.runtime.internal.SessionStateMachine.after(SessionStateMachine.java:823)
at 
org.neo4j.bolt.v1.runtime.internal.SessionStateMachine.reset(SessionStateMachine.java:699)
at 
org.neo4j.bolt.v1.runtime.internal.concurrent.SessionWorkerFacade.lambda$reset$6(SessionWorkerFacade.java:87)
at 
org.neo4j.bolt.v1.runtime.internal.concurrent.SessionWorker.execute(SessionWorker.java:116)
at 
org.neo4j.bolt.v1.runtime.internal.concurrent.SessionWorker.run(SessionWorker.java:77)
at java.lang.Thread.run(Thread.java:745)


I can reproduce this error on fresh DB using this code:
const _ = require('lodash'),
      neo4j = require('neo4j-driver').v1;

const driver = neo4j.driver('bolt://localhost:7687',
                            neo4j.auth.basic('neo4j',
                                             'neo4j'),
                            {connectionPoolSize: 1});

for (let i = 0; i < 100; i++) {
  let session = driver.session();

  session
    .run('create (u:User {id: {id}}) return u', {id: _.random(100000)})
    .then(records => {
      
console.log('=====================NUMBER'+i+'=======================');
      console.log(records)
      console.log('==============================================');
      session.close();
    })
    .catch(err => {
      console.error(err);
      session.close();
    });

}


The same problem appears using observer:
const _ = require('lodash'),
      neo4j = require('neo4j-driver').v1;

const driver = neo4j.driver('bolt://localhost:7687',
                            neo4j.auth.basic('neo4j',
                                             'neo4j'),
                            {connectionPoolSize: 1});

for (let i = 0; i < 100; i++) {
  let session = driver.session();

  session
    .run('create (u:User {id: {id}}) return u', {id: _.random(100000)})
    .subscribe({
      onNext(record) {

      },
      onCompleted(summary) {
        console.log('finished number ' + i);
        session.close();
      },
      onError(err) {
        console.error(err, 'itaration number' + i);
      }
    });
}



After removing session.close() this problem disappears in both cases.

When using lower number of session e.g. 5, then the same problem appears 
after few scripts run. However, all records are returned properly.
I wouldn't notice this if next test in my suite sometimes didn't strangely 
fail with timeout or even exception shown below when using  "match 
(u:Testing) detach delete u" on afterEach hook.

2016-09-27 20:19:32.868+0000 ERROR [o.n.b.v.r.i.ErrorReporter] Client 
triggered an unexpected error [UnknownError]: 
Property[1075,used=false,prev=-1,next=-1] not in use. See debug.log for 
more details, reference 4c0fb1ed-ee5b-4036-a156-828a206cfc2e.
2016-09-27 20:19:32.868+0000 ERROR [o.n.b.v.r.i.ErrorReporter] Client 
triggered an unexpected error [UnknownError]: 
Property[1075,used=false,prev=-1,next=-1] not in use, reference 
4c0fb1ed-ee5b-4036-a156-828a206cfc2e. 
Property[1075,used=false,prev=-1,next=-1] not in use
org.neo4j.kernel.impl.store.InvalidRecordException: 
Property[1075,used=false,prev=-1,next=-1] not in use
at 
org.neo4j.kernel.impl.store.record.RecordLoad$1.verify(RecordLoad.java:55)
at 
org.neo4j.kernel.impl.store.CommonAbstractStore.verifyAfterReading(CommonAbstractStore.java:1240)
at 
org.neo4j.kernel.impl.store.CommonAbstractStore.readIntoRecord(CommonAbstractStore.java:1064)
at 
org.neo4j.kernel.impl.store.CommonAbstractStore.getRecord(CommonAbstractStore.java:1042)
at org.neo4j.kernel.impl.transaction.state.Loaders$2.load(Loaders.java:165)
at org.neo4j.kernel.impl.transaction.state.Loaders$2.load(Loaders.java:145)
at 
org.neo4j.kernel.impl.transaction.state.RecordChanges.getOrLoad(RecordChanges.java:72)
at 
org.neo4j.kernel.impl.transaction.state.PropertyDeleter.deletePropertyChain(PropertyDeleter.java:45)
at 
org.neo4j.kernel.impl.transaction.state.TransactionRecordState.getAndDeletePropertyChain(TransactionRecordState.java:336)
at 
org.neo4j.kernel.impl.transaction.state.TransactionRecordState.nodeDelete(TransactionRecordState.java:322)
at 
org.neo4j.kernel.impl.storageengine.impl.recordstorage.TransactionToRecordStateVisitor.visitDeletedNode(TransactionToRecordStateVisitor.java:89)
at 
org.neo4j.storageengine.api.txstate.TxStateVisitor$Delegator.visitDeletedNode(TxStateVisitor.java:220)
at 
org.neo4j.kernel.api.txstate.TransactionCountingStateVisitor.visitDeletedNode(TransactionCountingStateVisitor.java:100)
at org.neo4j.kernel.impl.api.state.TxState$12.visitRemoved(TxState.java:339)
at org.neo4j.kernel.impl.api.state.TxState$12.visitRemoved(TxState.java:335)
at 
org.neo4j.kernel.impl.util.diffsets.SuperDiffSets.accept(SuperDiffSets.java:70)
at org.neo4j.kernel.impl.util.diffsets.DiffSets.accept(DiffSets.java:41)
at org.neo4j.kernel.impl.api.state.TxState.accept(TxState.java:274)
at 
org.neo4j.kernel.impl.storageengine.impl.recordstorage.RecordStorageEngine.createCommands(RecordStorageEngine.java:304)
at 
org.neo4j.kernel.impl.api.KernelTransactionImplementation.commit(KernelTransactionImplementation.java:431)
at 
org.neo4j.kernel.impl.api.KernelTransactionImplementation.close(KernelTransactionImplementation.java:380)
at 
org.neo4j.bolt.v1.runtime.internal.SessionStateMachine$State$3.commitTransaction(SessionStateMachine.java:187)
at 
org.neo4j.bolt.v1.runtime.internal.SessionStateMachine$State$4.discardAll(SessionStateMachine.java:258)
at 
org.neo4j.bolt.v1.runtime.internal.SessionStateMachine$State$4.pullAll(SessionStateMachine.java:237)
at 
org.neo4j.bolt.v1.runtime.internal.SessionStateMachine.pullAll(SessionStateMachine.java:664)
at 
org.neo4j.bolt.v1.runtime.internal.concurrent.SessionWorkerFacade.lambda$pullAll$4(SessionWorkerFacade.java:74)
at 
org.neo4j.bolt.v1.runtime.internal.concurrent.SessionWorker.execute(SessionWorker.java:116)
at 
org.neo4j.bolt.v1.runtime.internal.concurrent.SessionWorker.executeBatch(SessionWorker.java:102)
at 
org.neo4j.bolt.v1.runtime.internal.concurrent.SessionWorker.run(SessionWorker.java:82)
at java.lang.Thread.run(Thread.java:745)

And error returned to client:
Structure {
  signature: 127,
  fields: 
   [ { code: 'Neo.DatabaseError.General.UnknownError',
       message: 'An unexpected failure occurred, see details in the 
database logs, reference number 4c0fb1ed-ee5b-4036-a156-828a206cfc2e.' } ] }



When I don't use tests that runs more sessions than connectionPoolSize and 
without afterEach hook, then everything is OK.

So to summarize:
1) I hit NullPointerException in DB when running more sessions than 
connectionPoolSize
2) After hitting NullPointerException, next test which is simple 
transaction will timeout.
3) using afterEach hook that deletes all test nodes, sometimes I get 
UnknownError on client and InvalidRecordException in DB

So how can I make sure that this sort of problems doesn't occur on my 
server when requests will increase so much that there will be more sessions 
than connectionPoolSize?

Thanks!
Michal

-- 
You received this message because you are subscribed to the Google Groups 
"Neo4j" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to neo4j+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to