On 08/06/2010 11:26, Reich, Matthias wrote:
> Hello,
> 
> I am using a CometProcessor servlet in a long-poll scenario, and recently had
> a closer look at the life span of connections that are used for poll requests.
> 
> I noticed that connections are closed by Tomcat whenever a poll request 
> was answered (and closed) directly during processing of the BEGIN event.
> In our application this happens for one out of three poll requests 
> approximately
> and thus should not be neglected.   
> 
> I had a look into the source code and found the reason in the 
> CoyoteAdapter.event method - it sets the 'error' flag to true in this 
> situation.
> 
> I modified the code (in 6.0.20 and 6.0.26) so that the error flag is not set.
> With that change Tomcat kept the connection open:
> 
> ...
>     // Calling the container
>     connector.getContainer().getPipeline().getFirst().event(request, 
> response, request.getEvent());
> 
>     if (!error && !response.isClosed() && 
> (request.getAttribute(Globals.EXCEPTION_ATTR) != null)) {
>         // An unexpected exception occurred while processing the event, so
>         // error should be called
>         request.getEvent().setEventType(CometEvent.EventType.ERROR);
>         request.getEvent().setEventSubType(null);
>         error = true;
>         connector.getContainer().getPipeline().getFirst().event(request, 
> response, request.getEvent());
>     }
>     if (response.isClosed() || !request.isComet()) {
>         if (status==SocketStatus.OPEN) {
>         //CometEvent.close was called during an event.
>         request.getEvent().setEventType(CometEvent.EventType.END);
>         request.getEvent().setEventSubType(null);
>         
> // don't set the error flag here - otherwise the connection will be closed 
> // whenever a long poll is answered already during event handling:
>         // error = true;
>         
>         connector.getContainer().getPipeline().getFirst().event(request, 
> response, request.getEvent());
>         }
>         res.action(ActionCode.ACTION_COMET_END, null);
>     } else if (!error && read && request.getAvailable()) {
>         // If this was a read and not all bytes have been read, or if no data
>         // was read from the connector, then it is an error
>         request.getEvent().setEventType(CometEvent.EventType.ERROR);
>         
> request.getEvent().setEventSubType(CometEvent.EventSubType.IOEXCEPTION);
>         error = true;
>         connector.getContainer().getPipeline().getFirst().event(request, 
> response, request.getEvent());
>     }
>     return (!error);
> ...
> 
> In my first tests I did not observe any undesired side effects of the change.
> However, I did not yet do extensive tests - especially not with a steaming 
> client.
> 
> Do you agree that this should be considered a bug and fixed in the next Tomcat
> release?

You'll need one of the devs with Async knowledge to look at this, I think.


p

> Regards,
> Matthias
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: users-h...@tomcat.apache.org
> 


Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to