I had the following exception today once when running the tests in my
project. I'm suspecting that it is caused by a concurrency bug in
Guice (the line InjectorImpl.java:673 is the for loop statement -
apparenty the list 'injectorsForClass' was null). The test where that
exception happened (EntityRepositorySpec
$WhenAnEntityIsOnlyReadAndNotModified.theEntityIsNotUpdatedAndThusCanBeReadConcurrentlyInManyTasks
()) has two threads running in parallel, and that exception caused the
test to deadlock.
The sources of that project are here, in case you need them:
http://github.com/orfjackal/dimdwarf/tree/2fb2a3d3e1c820c014b8f0d5280d362b227f383a
6.3.2009 19:01:18 net.orfjackal.dimdwarf.tasks.TransactionFilter
filter
INFO: Task failed, rolling back its transaction
java.lang.NullPointerException
at com.google.inject.InjectorImpl.injectMembers(InjectorImpl.java:
673)
at com.google.inject.InjectorImpl$8.call(InjectorImpl.java:682)
at com.google.inject.InjectorImpl$8.call(InjectorImpl.java:681)
at com.google.inject.InjectorImpl.callInContext(InjectorImpl.java:
747)
at com.google.inject.InjectorImpl.injectMembers(InjectorImpl.java:
680)
at
net.orfjackal.dimdwarf.serial.InjectObjectsOnDeserialization.afterResolve
(InjectObjectsOnDeserialization.java:51)
at net.orfjackal.dimdwarf.serial.ObjectSerializerImpl
$MyObjectInputStream.resolveObject(ObjectSerializerImpl.java:135)
at java.io.ObjectInputStream.checkResolve(ObjectInputStream.java:
1377)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at
net.orfjackal.dimdwarf.serial.ObjectSerializerImpl.deserializeFromStream
(ObjectSerializerImpl.java:82)
at net.orfjackal.dimdwarf.serial.ObjectSerializerImpl.deserialize
(ObjectSerializerImpl.java:65)
at
net.orfjackal.dimdwarf.gc.entities.GcAwareEntityRepository.readFromDatabase
(GcAwareEntityRepository.java:80)
at net.orfjackal.dimdwarf.gc.entities.GcAwareEntityRepository.read
(GcAwareEntityRepository.java:70)
at
net.orfjackal.dimdwarf.entities.EntityManagerImpl.loadEntityFromDatabase
(EntityManagerImpl.java:108)
at net.orfjackal.dimdwarf.entities.EntityManagerImpl.getEntityById
(EntityManagerImpl.java:97)
at net.orfjackal.dimdwarf.entities.EntityRepositorySpec
$WhenAnEntityIsOnlyReadAndNotModified$1.run(EntityRepositorySpec.java:
164)
at net.orfjackal.dimdwarf.tasks.FilterChain.execute(FilterChain.java:
58)
at net.orfjackal.dimdwarf.tasks.FilterChain.access$000
(FilterChain.java:40)
at net.orfjackal.dimdwarf.tasks.FilterChain$FilterRecursion.run
(FilterChain.java:73)
at net.orfjackal.dimdwarf.entities.EntityFlushingFilter.filter
(EntityFlushingFilter.java:50)
at net.orfjackal.dimdwarf.tasks.FilterChain.execute(FilterChain.java:
56)
at net.orfjackal.dimdwarf.tasks.FilterChain.access$000
(FilterChain.java:40)
at net.orfjackal.dimdwarf.tasks.FilterChain$FilterRecursion.run
(FilterChain.java:73)
at net.orfjackal.dimdwarf.tasks.TransactionFilter.filter
(TransactionFilter.java:54)
at net.orfjackal.dimdwarf.tasks.FilterChain.execute(FilterChain.java:
56)
at net.orfjackal.dimdwarf.tasks.FilterChain.execute(FilterChain.java:
50)
at net.orfjackal.dimdwarf.tasks.TaskExecutor$1.run(TaskExecutor.java:
57)
at net.orfjackal.dimdwarf.context.ThreadContext.runInContext
(ThreadContext.java:51)
at net.orfjackal.dimdwarf.tasks.TaskExecutor.execute
(TaskExecutor.java:55)
at net.orfjackal.dimdwarf.entities.EntityRepositorySpec
$WhenAnEntityIsOnlyReadAndNotModified$3.run(EntityRepositorySpec.java:
177)
at java.lang.Thread.run(Thread.java:619)
Exception in thread "Thread-21" java.lang.NullPointerException
at com.google.inject.InjectorImpl.injectMembers(InjectorImpl.java:
673)
at com.google.inject.InjectorImpl$8.call(InjectorImpl.java:682)
at com.google.inject.InjectorImpl$8.call(InjectorImpl.java:681)
at com.google.inject.InjectorImpl.callInContext(InjectorImpl.java:
747)
at com.google.inject.InjectorImpl.injectMembers(InjectorImpl.java:
680)
at
net.orfjackal.dimdwarf.serial.InjectObjectsOnDeserialization.afterResolve
(InjectObjectsOnDeserialization.java:51)
at net.orfjackal.dimdwarf.serial.ObjectSerializerImpl
$MyObjectInputStream.resolveObject(ObjectSerializerImpl.java:135)
at java.io.ObjectInputStream.checkResolve(ObjectInputStream.java:
1377)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at
net.orfjackal.dimdwarf.serial.ObjectSerializerImpl.deserializeFromStream
(ObjectSerializerImpl.java:82)
at net.orfjackal.dimdwarf.serial.ObjectSerializerImpl.deserialize
(ObjectSerializerImpl.java:65)
at
net.orfjackal.dimdwarf.gc.entities.GcAwareEntityRepository.readFromDatabase
(GcAwareEntityRepository.java:80)
at net.orfjackal.dimdwarf.gc.entities.GcAwareEntityRepository.read
(GcAwareEntityRepository.java:70)
at
net.orfjackal.dimdwarf.entities.EntityManagerImpl.loadEntityFromDatabase
(EntityManagerImpl.java:108)
at net.orfjackal.dimdwarf.entities.EntityManagerImpl.getEntityById
(EntityManagerImpl.java:97)
at net.orfjackal.dimdwarf.entities.EntityRepositorySpec
$WhenAnEntityIsOnlyReadAndNotModified$1.run(EntityRepositorySpec.java:
164)
at net.orfjackal.dimdwarf.tasks.FilterChain.execute(FilterChain.java:
58)
at net.orfjackal.dimdwarf.tasks.FilterChain.access$000
(FilterChain.java:40)
at net.orfjackal.dimdwarf.tasks.FilterChain$FilterRecursion.run
(FilterChain.java:73)
at net.orfjackal.dimdwarf.entities.EntityFlushingFilter.filter
(EntityFlushingFilter.java:50)
at net.orfjackal.dimdwarf.tasks.FilterChain.execute(FilterChain.java:
56)
at net.orfjackal.dimdwarf.tasks.FilterChain.access$000
(FilterChain.java:40)
at net.orfjackal.dimdwarf.tasks.FilterChain$FilterRecursion.run
(FilterChain.java:73)
at net.orfjackal.dimdwarf.tasks.TransactionFilter.filter
(TransactionFilter.java:54)
at net.orfjackal.dimdwarf.tasks.FilterChain.execute(FilterChain.java:
56)
at net.orfjackal.dimdwarf.tasks.FilterChain.execute(FilterChain.java:
50)
at net.orfjackal.dimdwarf.tasks.TaskExecutor$1.run(TaskExecutor.java:
57)
at net.orfjackal.dimdwarf.context.ThreadContext.runInContext
(ThreadContext.java:51)
at net.orfjackal.dimdwarf.tasks.TaskExecutor.execute
(TaskExecutor.java:55)
at net.orfjackal.dimdwarf.entities.EntityRepositorySpec
$WhenAnEntityIsOnlyReadAndNotModified$3.run(EntityRepositorySpec.java:
177)
at java.lang.Thread.run(Thread.java:619)