[ https://issues.apache.org/jira/browse/POOL-326?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16918148#comment-16918148 ]
Phil Steitz commented on POOL-326: ---------------------------------- [~ggregory] - it will take me a little while to get the changes to o.a.c.performance in a state where I can commit them. I will do that. I have not tried, but I suspect even just setting up the ancient code in trunk there with the config above would cause the NPE. It does not happen on every run and the frustrating thing is that when I use the multi-thread loading framework in TestGenericKeyedObjectPool, I can't get it to happen. Hope through research... I added some instrumentation into GKOP though to see what is going on when the exception hits and it is what I suspected - the returning object is in idleObjects. So yet another way to make the exception go away and probably a good fix in any case is to change the test in deregister to check idleObjects.size instead of relying on createCount. What bugs me is I can't figure out how createCount is getting zeroed when there is an instance out in circulation. > Threading issue, NullPointerException and IllegalStateException in > GenericKeyedObjectPool > ----------------------------------------------------------------------------------------- > > Key: POOL-326 > URL: https://issues.apache.org/jira/browse/POOL-326 > Project: Commons Pool > Issue Type: Bug > Affects Versions: 2.4.2 > Reporter: Chris Allison > Priority: Major > Fix For: 2.6.1 > > Attachments: ObjectPoolIssue.java, pool-326.patch > > > I'll included a test to help reproduce this issue. Take a look at the > embedded comments as it's extremely difficult to reproduce. I've seen the > provided test show the failure on more than one PC so I believe it will show > the problem. > Example stack trace for error on return: > java.util.concurrent.ExecutionException: java.lang.NullPointerException > at java.util.concurrent.FutureTask.report(FutureTask.java:122) > at java.util.concurrent.FutureTask.get(FutureTask.java:192) > at threading_pool.ObjectPoolIssue.run(ObjectPoolIssue.java:63) > at threading_pool.ObjectPoolIssue.main(ObjectPoolIssue.java:23) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:498) > at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) > Caused by: java.lang.NullPointerException > at > org.apache.commons.pool2.impl.GenericKeyedObjectPool.returnObject(GenericKeyedObjectPool.java:474) > at threading_pool.ObjectPoolIssue$Task.call(ObjectPoolIssue.java:112) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at java.lang.Thread.run(Thread.java:745) > Example stack trace for error on borrow: > java.util.concurrent.ExecutionException: java.lang.NullPointerException > at java.util.concurrent.FutureTask.report(FutureTask.java:122) > at java.util.concurrent.FutureTask.get(FutureTask.java:192) > at threading_pool.ObjectPoolIssue.run(ObjectPoolIssue.java:63) > at threading_pool.ObjectPoolIssue.main(ObjectPoolIssue.java:23) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:498) > at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) > Caused by: java.lang.NullPointerException > at > org.apache.commons.pool2.impl.GenericKeyedObjectPool.deregister(GenericKeyedObjectPool.java:1146) > at > org.apache.commons.pool2.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:438) > at > org.apache.commons.pool2.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:279) > at threading_pool.ObjectPoolIssue$Task.call(ObjectPoolIssue.java:108) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at java.lang.Thread.run(Thread.java:745) -- This message was sent by Atlassian Jira (v8.3.2#803003)