From: markt Date: Wed, 26 Jan 2011 16:11:46 +0000 (+0000) Subject: Don't assume servlet 3+ async when processing long poll connections (it might be... X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=15381ac86382d9013d1fef4aca19eb57e38293a7;p=tomcat7.0 Don't assume servlet 3+ async when processing long poll connections (it might be comet) Use socket rather than socket wrapper as key in connection list else comet sockets may be lost git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1063774 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/java/org/apache/coyote/http11/Http11AprProtocol.java b/java/org/apache/coyote/http11/Http11AprProtocol.java index 916520b44..a706cac3d 100644 --- a/java/org/apache/coyote/http11/Http11AprProtocol.java +++ b/java/org/apache/coyote/http11/Http11AprProtocol.java @@ -204,8 +204,8 @@ public class Http11AprProtocol extends AbstractHttp11Protocol { protected AtomicLong registerCount = new AtomicLong(0); protected RequestGroupInfo global = new RequestGroupInfo(); - protected ConcurrentHashMap, Http11AprProcessor> connections = - new ConcurrentHashMap, Http11AprProcessor>(); + protected ConcurrentHashMap connections = + new ConcurrentHashMap(); protected ConcurrentLinkedQueue recycledProcessors = new ConcurrentLinkedQueue() { @@ -264,7 +264,7 @@ public class Http11AprProtocol extends AbstractHttp11Protocol { @Override public SocketState event(SocketWrapper socket, SocketStatus status) { - Http11AprProcessor processor = connections.get(socket); + Http11AprProcessor processor = connections.get(socket.getSocket()); SocketState state = SocketState.CLOSED; if (processor != null) { @@ -294,7 +294,7 @@ public class Http11AprProtocol extends AbstractHttp11Protocol { "http11protocol.proto.error"), e); } finally { if (state != SocketState.LONG) { - connections.remove(socket); + connections.remove(socket.getSocket()); socket.setAsync(false); recycledProcessors.offer(processor); if (state == SocketState.OPEN) { @@ -329,8 +329,13 @@ public class Http11AprProtocol extends AbstractHttp11Protocol { if (state == SocketState.LONG || state == SocketState.ASYNC_END) { // Need to make socket available for next processing cycle // but no need for the poller - connections.put(socket, processor); - socket.setAsync(true); + connections.put(socket.getSocket(), processor); + if (processor.isAsync()) { + socket.setAsync(true); + } else if (processor.comet) { + ((AprEndpoint) proto.endpoint).getCometPoller().add( + socket.getSocket().longValue()); + } } else { recycledProcessors.offer(processor); } @@ -362,7 +367,7 @@ public class Http11AprProtocol extends AbstractHttp11Protocol { @Override public SocketState asyncDispatch(SocketWrapper socket, SocketStatus status) { - Http11AprProcessor result = connections.get(socket); + Http11AprProcessor result = connections.get(socket.getSocket()); SocketState state = SocketState.CLOSED; if (result != null) { diff --git a/java/org/apache/tomcat/util/net/AprEndpoint.java b/java/org/apache/tomcat/util/net/AprEndpoint.java index dcb912eec..1d0ef85bc 100644 --- a/java/org/apache/tomcat/util/net/AprEndpoint.java +++ b/java/org/apache/tomcat/util/net/AprEndpoint.java @@ -1688,7 +1688,9 @@ public class AprEndpoint extends AbstractEndpoint { socket = null; } else if (state == Handler.SocketState.LONG) { socket.access(); - waitingRequests.add(socket); + if (socket.async) { + waitingRequests.add(socket); + } } else if (state == Handler.SocketState.ASYNC_END) { socket.access(); SocketProcessor proc = new SocketProcessor(socket, SocketStatus.OPEN); diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 1d1645562..2f679019a 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -118,6 +118,10 @@ 50627: Correct interaction of NIO socket and Poller when processing Comet events. (markt) + + Correct interaction of APR socket and Poller when processing Comet + events. (markt) +