Skip to content

Fix NPE in DeferredHitInfoFlush when Jetty request is recycled#716

Merged
acetousk merged 1 commit into
moqui:masterfrom
dixitdeepak:NPE-DeferredHitInfoFlush
Jun 24, 2026
Merged

Fix NPE in DeferredHitInfoFlush when Jetty request is recycled#716
acetousk merged 1 commit into
moqui:masterfrom
dixitdeepak:NPE-DeferredHitInfoFlush

Conversation

@dixitdeepak

Copy link
Copy Markdown
Contributor

In makeAhiValue, parameters may contain ContextStack values (which implement Map). The previous check order called ObjectUtilities.isEmpty(value) before value instanceof Map, causing ContextStack.size() to traverse the stack and hit a recycled Jetty EE11 request object in a background thread — resulting in a NullPointerException from ServletApiRequest.getRequest() returning null.

Fix by checking instanceof Map/Collection before isEmpty so ContextStack values short-circuit without calling size(). Also add a defensive NullPointerException catch in ServletRequestContainer.getAttributeNames() to mirror the existing IllegalStateException guard in HttpSessionContainer.

In makeAhiValue, parameters may contain ContextStack values (which implement
Map). The previous check order called ObjectUtilities.isEmpty(value) before
value instanceof Map, causing ContextStack.size() to traverse the stack and
hit a recycled Jetty EE11 request object in a background thread — resulting
in a NullPointerException from ServletApiRequest.getRequest() returning null.

Fix by checking instanceof Map/Collection before isEmpty so ContextStack values
short-circuit without calling size(). Also add a defensive NullPointerException
catch in ServletRequestContainer.getAttributeNames() to mirror the existing
IllegalStateException guard in HttpSessionContainer.
@dixitdeepak

Copy link
Copy Markdown
Contributor Author

To reproduced this error visit resource finder screen,
http://localhost:8080/qapps/system/Resource/ElFinder

10:06:54.022 WARN iScheduled-2 o.moqui.i.c.TransactionFacadeImpl Transaction rollback. The rollback was originally caused by: Error saving ArtifactHits java.lang.NullPointerException: Cannot invoke "org.eclipse.jetty.server.Request.getAttributeNameSet()" because the return value of "org.eclipse.jetty.ee11.servlet.ServletApiRequest.getRequest()" is null at org.eclipse.jetty.ee11.servlet.ServletApiRequest.getAttributeNames(ServletApiRequest.java:926) at org.moqui.util.WebUtilities$ServletRequestContainer.getAttributeNames(WebUtilities.java:451) at org.moqui.util.WebUtilities$AttributeContainerMap.keySet(WebUtilities.java:560) at org.moqui.util.ContextStack.keySet(ContextStack.java:263) at org.moqui.util.ContextStack.size(ContextStack.java:158) at org.moqui.util.ObjectUtilities.isEmpty(ObjectUtilities.java:312) at org.moqui.impl.context.ContextJavaUtil$ArtifactHitInfo.makeAhiValue(ContextJavaUtil.java:271) at org.moqui.impl.context.ExecutionContextFactoryImpl$DeferredHitInfoFlush$_flushQueue_closure1.doCall(ExecutionContextFactoryImpl.groovy:1558) at org.moqui.impl.context.ExecutionContextFactoryImpl$DeferredHitInfoFlush$_flushQueue_closure1.call(ExecutionContextFactoryImpl.groovy) at org.moqui.impl.context.TransactionFacadeImpl.runUseOrBegin(TransactionFacadeImpl.groovy:181) at org.moqui.impl.context.ExecutionContextFactoryImpl$DeferredHitInfoFlush.flushQueue(ExecutionContextFactoryImpl.groovy:1554) at org.moqui.impl.context.ExecutionContextFactoryImpl$DeferredHitInfoFlush.run(ExecutionContextFactoryImpl.groovy:1525) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358) at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) at org.moqui.impl.context.ContextJavaUtil$CustomScheduledTask.run(ContextJavaUtil.java:723) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583) 10:06:54.022 WARN iScheduled-2 o.moqui.i.c.TransactionFacadeImpl Transaction rollback for [Error saving ArtifactHits]. Here is the current location: org.moqui.BaseException: Rollback location at org.moqui.impl.context.TransactionFacadeImpl.rollback(TransactionFacadeImpl.groovy:472) at org.moqui.impl.context.TransactionFacadeImpl.rollback(TransactionFacadeImpl.groovy:447) at org.moqui.impl.context.TransactionFacadeImpl.runUseOrBegin(TransactionFacadeImpl.groovy:183) at org.moqui.impl.context.ExecutionContextFactoryImpl$DeferredHitInfoFlush.flushQueue(ExecutionContextFactoryImpl.groovy:1554) at org.moqui.impl.context.ExecutionContextFactoryImpl$DeferredHitInfoFlush.run(ExecutionContextFactoryImpl.groovy:1525) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358) at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) at org.moqui.impl.context.ContextJavaUtil$CustomScheduledTask.run(ContextJavaUtil.java:723) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583) 10:06:54.022 ERROR iScheduled-2 ontextFactoryImpl$DeferredHitInfoFlush Error saving ArtifactHits, retrying (5) java.lang.NullPointerException: Cannot invoke "org.eclipse.jetty.server.Request.getAttributeNameSet()" because the return value of "org.eclipse.jetty.ee11.servlet.ServletApiRequest.getRequest()" is null

@acetousk acetousk merged commit 2f1de53 into moqui:master Jun 24, 2026
1 check passed
@dixitdeepak dixitdeepak deleted the NPE-DeferredHitInfoFlush branch June 24, 2026 07:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants