Details
-
Type: Bug
-
Status: Closed
-
Priority: Major
-
Resolution: Fixed
-
Affects Version/s: 3.3
-
Fix Version/s: EE-3.3.0.GA, 4.0.BETA, 4.0
-
Component/s: Push Library
-
Labels:None
-
Environment:ICEpush
-
Assignee Priority:P2
Description
If a RuntimeException occurs in the BlockingConnectionServer$RunningServer.service() method, the response sent to the bridge results in a Push storm - a tight, never-ending loop of requests to re-establish the blocking connection which results another exeption, etc.
Activity
Deryk Sinotte
created issue -
Deryk Sinotte
made changes -
Field | Original Value | New Value |
---|---|---|
Assignee | Mircea Toma [ mircea.toma ] | |
Assignee Priority | P2 [ 10011 ] |
Mircea Toma
made changes -
Status | Open [ 1 ] | Resolved [ 5 ] |
Resolution | Fixed [ 1 ] |
Repository | Revision | Date | User | Message |
ICEsoft Public SVN Repository | #35196 | Tue May 21 11:32:22 MDT 2013 | mircea.toma | |
Files Changed | ||||
MODIFY
/icepush/trunk/icepush/core/src/main/java/org/icepush/BlockingConnectionServer.java
|
Repository | Revision | Date | User | Message |
ICEsoft Public SVN Repository | #35206 | Tue May 21 16:03:37 MDT 2013 | mircea.toma | |
Files Changed | ||||
MODIFY
/icepush/trunk/icepush/core/src/main/java/org/icepush/BlockingConnectionServer.java
|
Ken Fyten
made changes -
Fix Version/s | 4.0 [ 11383 ] |
Ken Fyten
made changes -
Status | Resolved [ 5 ] | Closed [ 6 ] |
The problem causing the Push storm for me was code I had added (see
PUSH-221) to allow registering notification URIs from the server-side. Under certain circumstances, the code would throw an NPE when an old push id was included with the request. I improved the null check so managed to avoid causing the Push storm in that manner but this exception was being caught and handled in the BlockingConnectionServer$RunningServer.service() method. There is a large try/catch that does this:So the NPE was being caught and a <noop> response being returned with the header:
The bridge receives this and right away tries to re-establish the blocking connection. However, the NPE would happen again and -> Push storm.
In the past (as per
PUSH-135), to prevent these types Push storms we had instituted a mechanism to cap the number of retries when an empty response is returned. It doesn't appear that this logic is handling the situation. In connection.async.js we have:Perhaps because it's not really empty. So I believe we need to:
The easiest way to reproduce this is synthetically. Just have it throw an NPE somewhere in the middle of that service() method based on some criteria. For example, I wedged this in towards the bottom of the try block:
After a few listen.icepush requests, a storm should be triggered.