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.
Activity
Judy Guglielmin
created issue -
Judy Guglielmin
made changes -
Field | Original Value | New Value |
---|---|---|
Workaround Description |
use newer tomcat versions 7.0.62 or newer or 8.0.22 or newer that include the following 2 apache-tomcat fixes:-
57779 <http://bz.apache.org/bugzilla/show_bug.cgi?id=57779> : When an I/O error occurs on a non-container thread only dispatch to a container thread to handle the error if using Servlet 3+ asynchronous processing. This avoids potential deadlocks if an application is performing I/O on a non-container thread without using the Servlet 3+ asynchronous API. (markt) 57621 <http://bz.apache.org/bugzilla/show_bug.cgi?id=57621> : When an async request completes, ensure that any remaining request body data is swallowed. (markt) |
Judy Guglielmin
made changes -
Workaround Description |
use newer tomcat versions 7.0.62 or newer or 8.0.22 or newer that include the following 2 apache-tomcat fixes:-
57779 <http://bz.apache.org/bugzilla/show_bug.cgi?id=57779> : When an I/O error occurs on a non-container thread only dispatch to a container thread to handle the error if using Servlet 3+ asynchronous processing. This avoids potential deadlocks if an application is performing I/O on a non-container thread without using the Servlet 3+ asynchronous API. (markt) 57621 <http://bz.apache.org/bugzilla/show_bug.cgi?id=57621> : When an async request completes, ensure that any remaining request body data is swallowed. (markt) |
use newer tomcat versions 7.0.62 or newer or 8.0.22 or newer that include the following 2 apache-tomcat fixes:-
57779 <http://bz.apache.org/bugzilla/show_bug.cgi?id=57779> : When an I/O error occurs on a non-container thread only dispatch to a container thread to handle the error if using Servlet 3+ asynchronous processing. This avoids potential deadlocks if an application is performing I/O on a non-container thread without using the Servlet 3+ asynchronous API. (markt) 57621 <http://bz.apache.org/bugzilla/show_bug.cgi?id=57621> : When an async request completes, ensure that any remaining request body data is swallowed. (markt) OR disable using tomcat ARP with the following context-param:- <context-param> <param-name>org.icepush.useAsyncContext</param-name> <param-value>false</param-value> </context-param> |
Judy Guglielmin
made changes -
Assignee | Jack Van Ooststroom [ jack.van.ooststroom ] |
Judy Guglielmin
made changes -
Workaround Description |
use newer tomcat versions 7.0.62 or newer or 8.0.22 or newer that include the following 2 apache-tomcat fixes:-
57779 <http://bz.apache.org/bugzilla/show_bug.cgi?id=57779> : When an I/O error occurs on a non-container thread only dispatch to a container thread to handle the error if using Servlet 3+ asynchronous processing. This avoids potential deadlocks if an application is performing I/O on a non-container thread without using the Servlet 3+ asynchronous API. (markt) 57621 <http://bz.apache.org/bugzilla/show_bug.cgi?id=57621> : When an async request completes, ensure that any remaining request body data is swallowed. (markt) OR disable using tomcat ARP with the following context-param:- <context-param> <param-name>org.icepush.useAsyncContext</param-name> <param-value>false</param-value> </context-param> |
suggested workarounds- but as of yet unconfirmed--use newer tomcat versions 7.0.62 or newer or 8.0.22 or newer that include the following 2 apache-tomcat fixes:-
57779 <http://bz.apache.org/bugzilla/show_bug.cgi?id=57779> : When an I/O error occurs on a non-container thread only dispatch to a container thread to handle the error if using Servlet 3+ asynchronous processing. This avoids potential deadlocks if an application is performing I/O on a non-container thread without using the Servlet 3+ asynchronous API. (markt) 57621 <http://bz.apache.org/bugzilla/show_bug.cgi?id=57621> : When an async request completes, ensure that any remaining request body data is swallowed. (markt) OR disable using tomcat ARP with the following context-param:- <context-param> <param-name>org.icepush.useAsyncContext</param-name> <param-value>false</param-value> </context-param> |
Ken Fyten
made changes -
Fix Version/s | 4.1 [ 11570 ] | |
Fix Version/s | EE-3.3.0.GA_P04 [ 12271 ] | |
Assignee Priority | P3 [ 10012 ] |
Ken Fyten
made changes -
Fix Version/s | EE-4.1.0.GA [ 12172 ] | |
Fix Version/s | 4.1 [ 11570 ] |
Arran Mccullough
made changes -
Attachment | Case13690Example.war [ 22054 ] | |
Attachment | Case13690Example.zip [ 22055 ] | |
Attachment | after-thread-dump.txt [ 22056 ] | |
Attachment | before-thread-dump.txt [ 22057 ] |
Jack Van Ooststroom
made changes -
Summary | Manage issue with older tomcat 7 & 8 ARP with blocking connection | Stuck non-container thread using Tomcat 7/8 ARP |
Repository | Revision | Date | User | Message |
ICEsoft Public SVN Repository | #47948 | Thu Feb 18 08:08:05 MST 2016 | jack.van.ooststroom | Fixed JIRA |
Files Changed | ||||
MODIFY
/icepush/trunk/icepush/core/src/main/java/org/icepush/Browser.java
MODIFY /icepush/trunk/icepush/core/src/main/java/org/icepush/PushGroupManager.java MODIFY /icepush/trunk/icepush/core/src/main/java/org/icepush/LocalPushGroupManager.java MODIFY /icepush/trunk/icepush/core/src/main/java/org/icepush/LocalNotificationBroadcaster.java MODIFY /icepush/trunk/icepush/core/src/main/java/org/icepush/servlet/AsyncAdaptingServlet.java MODIFY /icepush/trunk/icepush/core/src/main/java/org/icepush/NoopPushGroupManager.java MODIFY /icepush/trunk/icepush/core/src/main/java/org/icepush/NotificationBroadcaster.java MODIFY /icepush/trunk/icepush/core/src/main/java/org/icepush/BlockingConnectionServer.java MODIFY /icepush/trunk/icepush/core/src/main/java/org/icepush/ConfirmationTimeout.java |
Repository | Revision | Date | User | Message |
ICEsoft Public SVN Repository | #47949 | Thu Feb 18 09:43:47 MST 2016 | jack.van.ooststroom | Fixed JIRA |
Files Changed | ||||
MODIFY
/icepush/trunk/icepush/core/src/main/java/org/icepush/BlockingConnectionServer.java
|
Jack Van Ooststroom
made changes -
Status | Open [ 1 ] | Resolved [ 5 ] |
Resolution | Fixed [ 1 ] |
Ken Fyten
made changes -
Fix Version/s | EE-4.1.0.BETA [ 13073 ] |
Ken Fyten
made changes -
Issue Type | Improvement [ 4 ] | Bug [ 1 ] |
Ken Fyten
made changes -
Fix Version/s | 4.2.BETA [ 13092 ] | |
Fix Version/s | 4.2 [ 12871 ] |
Ken Fyten
made changes -
Status | Resolved [ 5 ] | Closed [ 6 ] |
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.