Author: markt
Date: Tue Nov  1 10:21:20 2016
New Revision: 1767471

URL: http://svn.apache.org/viewvc?rev=1767471&view=rev
Log:
If an I/O error occurs during async processing on a non-container thread, 
ensure that the onError() event is triggered.

Modified:
    tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java
    tomcat/trunk/java/org/apache/coyote/AsyncStateMachine.java
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java?rev=1767471&r1=1767470&r2=1767471&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java Tue Nov  1 
10:21:20 2016
@@ -103,6 +103,9 @@ public abstract class AbstractProcessor
                 response.setStatus(500);
             }
             
getLog().info(sm.getString("abstractProcessor.nonContainerThreadError"), t);
+            // Set the request attribute so that the async onError() event is
+            // fired when the error event is processed
+            request.setAttribute(RequestDispatcher.ERROR_EXCEPTION, t);
             socketWrapper.processSocket(SocketEvent.ERROR, true);
         }
     }

Modified: tomcat/trunk/java/org/apache/coyote/AsyncStateMachine.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AsyncStateMachine.java?rev=1767471&r1=1767470&r2=1767471&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/AsyncStateMachine.java [UTF-8] 
(original)
+++ tomcat/trunk/java/org/apache/coyote/AsyncStateMachine.java [UTF-8] Tue Nov  
1 10:21:20 2016
@@ -69,30 +69,30 @@ import org.apache.tomcat.util.security.P
  * ERROR            - Something went wrong.
  *
  * |-----------------»------|
- * |                       \|/
- * |   
|----------«-------ERROR-----------------------------------«-------------------------------|
- * |   |      complete() /|\/|\\                                               
                   |
- * |   |                  |  |  \                                              
                   |
- * |   |    |-----»-------|  |   \-----------»----------|                      
                   |
- * |   |    |                |                          |dispatch()            
                   |
- * |   |    |                |                         \|/                     
                   |
- * |   |    |                |          |--|timeout()   |                      
                   |
- * |   |    |     post()     |          | \|/           |     post()           
                   |
- * |   |    |    |---------- | --»DISPATCHED«---------- | 
--------------COMPLETING«-----|         |
- * |   |    |    |           |   /|\/|\ |               |                | /|\ 
/|\      |         |
- * |   |    |    |    |---»- | ---|  |  |startAsync()   |       timeout()|--|  
 |       |         |
- * |   |    ^    ^    |      |       |  |               |                      
 |       |         |
- * |   |    |    |    |   |-- \ -----|  |   complete()  |                      
 |post() |         |
- * |   |    |    |    |   |    \        |     /--»----- | 
---COMPLETE_PENDING-»-|       |         |
- * |   |    |    |    |   |     \       |    /          |                      
         |         |
- * |   |    |    |    |   ^      \      |   /           |                      
         |         |
- * |  \|/   |    |    |   |       \    \|/ /   post()   |                      
         |         |
- * | MUST_COMPLETE-«- | - | --«----STARTING--»--------- | -------------|       
         ^         |
- * |  /|\    /|\      |   |  complete()  | \            |              |     
complete() |         |
- * |   |      |       |   |              |  \           |    post()    |     
/----------|         |
- * |   |      |       ^   |    dispatch()|   \          |    |-----|   |    /  
                   |
- * |   |      |       |   |              |    \         |    |     |   |   /   
                   |
- * |   |      |       |   |             \|/    \        |    |    \|/ \|/ /    
   post()          |
+ * |                       \|/ 
/-----------------------------------«------------------------------|
+ * |   
|----------«-------ERROR----------------------------«-------------------------------|
      |
+ * |   |      complete() /|\/|\\                                               
            |      |
+ * |   |                  |  |  \                                              
            |      |
+ * |   |    |-----»-------|  |   \-----------»----------|                      
            |      |
+ * |   |    |                |                          |dispatch()            
            |      |
+ * |   |    |                |                         \|/                     
            |      |
+ * |   |    |                |          |--|timeout()   |                      
            |      |
+ * |   |    |     post()     |          | \|/           |     post()           
            |      |
+ * |   |    |    |---------- | --»DISPATCHED«---------- | 
--------------COMPLETING«-----|  |      |
+ * |   |    |    |           |   /|\/|\ |               |                | /|\ 
/|\      |  |      |
+ * |   |    |    |    |---»- | ---|  |  |startAsync()   |       timeout()|--|  
 |       |  |      |
+ * |   |    ^    ^    |      |       |  |               |                      
 |       |  ^      |
+ * |   |    |    |    |   |-- \ -----|  |   complete()  |                      
 |post() |  |      |
+ * |   |    |    |    |   |    \        |     /--»----- | 
---COMPLETE_PENDING-»-|       ^  |      |
+ * |   |    |    |    |   |     \       |    /          |                      
         |  |      |
+ * |   |    |    |    |   ^      \      |   /           |                      
         |  |      |
+ * |  \|/   |    |    |   |       \    \|/ /   post()   |                    
complete() |  |      |
+ * | MUST_COMPLETE-«- | - | --«----STARTING--»--------- | ------------|       
/---»-----|  |      |
+ * |  /|\    /|\      |   |  complete()  | \            |             |      / 
            |      ^
+ * |   |      |       |   |              |  \           |    post()   |     /  
 error()    |      |
+ * |   |      |       ^   |    dispatch()|   \          |    |-----|  |    
//------»-------|      |
+ * |   |      |       |   |              |    \         |    |     |  |   //   
                   |
+ * |   |      |       |   |             \|/    \        |    |    \|/\|/ //    
   post()          |
  * |   |      |       |   |--«--MUST_DISPATCH-----«-----|    
|--«--STARTED«---------«---------|   |
  * |   |      |       | dispatched() /|\   |     \                / |   |      
               |   |
  * |   |      |       |               |    |      \              /  |   |      
               |   |
@@ -386,6 +386,7 @@ public class AsyncStateMachine {
 
     public synchronized void asyncError() {
         if (state == AsyncState.STARTING ||
+                state == AsyncState.STARTED ||
                 state == AsyncState.DISPATCHED ||
                 state == AsyncState.TIMING_OUT ||
                 state == AsyncState.MUST_COMPLETE ||

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1767471&r1=1767470&r2=1767471&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Tue Nov  1 10:21:20 2016
@@ -165,6 +165,11 @@
         use. The values used by the executor may be set and obtained via the
         Executor. (markt)
       </fix>
+      <fix>
+        If an I/O error occurs during async processing on a non-container
+        thread, ensure that the <code>onError()</code> event is triggered.
+        (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Jasper">



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to