From 621b23131545a9eaac99ee9c27ce2393d1aa51a7 Mon Sep 17 00:00:00 2001 From: markt Date: Tue, 25 Jan 2011 17:20:20 +0000 Subject: [PATCH] Fix various odd behaviours seen with a debugger. Observed both multiple and zero (rather than 1) selection events for a single data receive event git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1063366 13f79535-47bb-0310-9956-ffa450edef68 --- java/org/apache/coyote/http11/Http11NioProtocol.java | 18 ++++++++++++++---- java/org/apache/coyote/http11/LocalStrings.properties | 1 + webapps/docs/changelog.xml | 4 ++++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/java/org/apache/coyote/http11/Http11NioProtocol.java b/java/org/apache/coyote/http11/Http11NioProtocol.java index 375a93f33..0735d8095 100644 --- a/java/org/apache/coyote/http11/Http11NioProtocol.java +++ b/java/org/apache/coyote/http11/Http11NioProtocol.java @@ -17,6 +17,8 @@ package org.apache.coyote.http11; +import java.io.IOException; +import java.nio.channels.SelectionKey; import java.nio.channels.SocketChannel; import java.security.AccessController; import java.security.PrivilegedAction; @@ -317,8 +319,10 @@ public class Http11NioProtocol extends AbstractHttp11JsseProtocol { } else { // Comet if (log.isDebugEnabled()) log.debug("Keeping processor["+processor); - //add correct poller events here based on Comet stuff - socket.getPoller().add(socket,att.getCometOps()); + // May receive more data from client + SelectionKey key = socket.getIOChannel().keyFor(socket.getPoller().getSelector()); + key.interestOps(SelectionKey.OP_READ); + att.interestOps(SelectionKey.OP_READ); } } else { // state == SocketState.ASYNC_END @@ -358,8 +362,11 @@ public class Http11NioProtocol extends AbstractHttp11JsseProtocol { connections.put(socket, processor); if (processor.comet) { + // May receive more data from client + SelectionKey key = socket.getIOChannel().keyFor(socket.getPoller().getSelector()); NioEndpoint.KeyAttachment att = (NioEndpoint.KeyAttachment)socket.getAttachment(false); - socket.getPoller().add(socket,att.getCometOps()); + key.interestOps(SelectionKey.OP_READ); + att.interestOps(SelectionKey.OP_READ); } else if (processor.isAsync()) { NioEndpoint.KeyAttachment att = (NioEndpoint.KeyAttachment)socket.getAttachment(false); att.setAsync(true); @@ -367,7 +374,10 @@ public class Http11NioProtocol extends AbstractHttp11JsseProtocol { // complete or dispatch) state = processor.asyncPostProcess(); } else { - socket.getPoller().add(socket); + // Error condition. A connection in this state should + // by using one of async or comet + throw new IOException(sm.getString( + "http11protocol.state.long.error")); } } if (state == SocketState.LONG || state == SocketState.ASYNC_END) { diff --git a/java/org/apache/coyote/http11/LocalStrings.properties b/java/org/apache/coyote/http11/LocalStrings.properties index c0c27fc36..92e193311 100644 --- a/java/org/apache/coyote/http11/LocalStrings.properties +++ b/java/org/apache/coyote/http11/LocalStrings.properties @@ -20,6 +20,7 @@ http11protocol.proto.ioexception.info=IOException reading request, ignored http11protocol.proto.socketexception.debug=SocketException reading request http11protocol.proto.socketexception.info=SocketException reading request, ignored http11protocol.start=Starting Coyote HTTP/1.1 on {0} +http11protocol.state.long.error=Error processing request. Socket is in the long poll state but neither Servlet 3.0+ async or Comet is being used http11processor.regexp.error=Error parsing regular expression {0} http11processor.filter.unknown=Unknown filter {0} diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 0b9b7c95c..21dfe272d 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -114,6 +114,10 @@ Ensure correct recycling of NIO input filters when processing Comet events. (markt) + + Correct interaction of NIO socket and Poller when processing Comet + events. (markt) + -- 2.11.0