Details
-
Type: Bug
-
Status: Closed
-
Priority: Major
-
Resolution: Fixed
-
Affects Version/s: EE-4.0.0.GA, EE-3.3.0.GA_P03
-
Fix Version/s: EE-4.1.0.RC1, EE-4.1.0.GA, EE-3.3.0.GA_P04, 4.2.BETA, 4.2
-
Component/s: Push Library
-
Labels:None
-
Environment:Tomcat 7, pre 7.0.62 and Tomcat8 pre 8.0.22 releases
-
Assignee Priority:P3
-
Support Case References:Support Case 13470:- https://icesoft.my.salesforce.com/5007000001GBRTQ
-
Workaround Description:
Description
"Notification queue consumer." daemon prio=3 tid=0x00000001014f6800 nid=0x17 in Object.wait() [0xffffffff713fe000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:503)
at org.apache.coyote.AsyncStateMachine.pauseNonContainerThread(AsyncStateMachine.java:382)
- eliminated <0xfffffffe5f76aae0> (a org.apache.coyote.AsyncStateMachine)
at org.apache.coyote.AsyncStateMachine.asyncComplete(AsyncStateMachine.java:240)
- locked <0xfffffffe5f76aae0> (a org.apache.coyote.AsyncStateMachine)
at org.apache.coyote.http11.Http11Processor.actionInternal(Http11Processor.java:356)
at org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Processor.java:906)
at org.apache.coyote.Request.action(Request.java:344)
at org.apache.catalina.core.AsyncContextImpl.complete(AsyncContextImpl.java:93)
at org.icepush.servlet.AsyncAdaptingServlet$AsyncRequestResponse.respondWith(AsyncAdaptingServlet.java:74)at org.icepush.SequenceTaggingServer$TaggingRequest.respondWith(SequenceTaggingServer.java:67)at org.icepush.BlockingConnectionServer.respondIfPendingRequest(BlockingConnectionServer.java:177)
at org.icepush.BlockingConnectionServer.respondIfNotificationsAvailable(BlockingConnectionServer.java:149)
- locked <0xfffffffe69880ba0> (a org.icepush.BlockingConnectionServer)
at org.icepush.BlockingConnectionServer.sendNotifications(BlockingConnectionServer.java:126)
at org.icepush.BlockingConnectionServer.receive(BlockingConnectionServer.java:293)
at org.icepush.LocalNotificationBroadcaster.broadcast(LocalNotificationBroadcaster.java:39)
at org.icepush.LocalPushGroupManager$Notification.run(LocalPushGroupManager.java:394)
at org.icepush.LocalPushGroupManager$QueueConsumerTask.run(LocalPushGroupManager.java:432)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
The attempt is being made for an incoming request to establish a new blocking connection but it just piles up waiting for the lock.
What’s unclear is why the “Notification queue consumer.” thread is having trouble completing and/or releasing the lock.
On our end, we should be looking into the current locking strategy being used by BlockConnectionServer's respondIfBackOffRequested() and respondIfNotificationsAvailable() and possible coming up with a different locking strategy that avoid any future pile-ups of Threads in State BLOCKED.
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:503)
at org.apache.coyote.AsyncStateMachine.pauseNonContainerThread(AsyncStateMachine.java:382)
- eliminated <0xfffffffe5f76aae0> (a org.apache.coyote.AsyncStateMachine)
at org.apache.coyote.AsyncStateMachine.asyncComplete(AsyncStateMachine.java:240)
- locked <0xfffffffe5f76aae0> (a org.apache.coyote.AsyncStateMachine)
at org.apache.coyote.http11.Http11Processor.actionInternal(Http11Processor.java:356)
at org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Processor.java:906)
at org.apache.coyote.Request.action(Request.java:344)
at org.apache.catalina.core.AsyncContextImpl.complete(AsyncContextImpl.java:93)
at org.icepush.servlet.AsyncAdaptingServlet$AsyncRequestResponse.respondWith(AsyncAdaptingServlet.java:74)at org.icepush.SequenceTaggingServer$TaggingRequest.respondWith(SequenceTaggingServer.java:67)at org.icepush.BlockingConnectionServer.respondIfPendingRequest(BlockingConnectionServer.java:177)
at org.icepush.BlockingConnectionServer.respondIfNotificationsAvailable(BlockingConnectionServer.java:149)
- locked <0xfffffffe69880ba0> (a org.icepush.BlockingConnectionServer)
at org.icepush.BlockingConnectionServer.sendNotifications(BlockingConnectionServer.java:126)
at org.icepush.BlockingConnectionServer.receive(BlockingConnectionServer.java:293)
at org.icepush.LocalNotificationBroadcaster.broadcast(LocalNotificationBroadcaster.java:39)
at org.icepush.LocalPushGroupManager$Notification.run(LocalPushGroupManager.java:394)
at org.icepush.LocalPushGroupManager$QueueConsumerTask.run(LocalPushGroupManager.java:432)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
The attempt is being made for an incoming request to establish a new blocking connection but it just piles up waiting for the lock.
What’s unclear is why the “Notification queue consumer.” thread is having trouble completing and/or releasing the lock.
On our end, we should be looking into the current locking strategy being used by BlockConnectionServer's respondIfBackOffRequested() and respondIfNotificationsAvailable() and possible coming up with a different locking strategy that avoid any future pile-ups of Threads in State BLOCKED.
It looks like org.apache.coyote.AsyncStateMachine.pauseNonContainerThread method is pausing the ICEpush (timer) thread responsible for emptying (and dispatching) the push notifications. (from Mircea's email July 20th) - further pointing to the tomcat implementation.