You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by fh...@apache.org on 2006/07/19 19:49:47 UTC
svn commit: r423544 - in /tomcat/tc6.0.x/trunk/java/org/apache:
coyote/http11/Http11NioProcessor.java
coyote/http11/InternalNioOutputBuffer.java tomcat/util/net/NioEndpoint.java
Author: fhanik
Date: Wed Jul 19 10:49:47 2006
New Revision: 423544
URL: http://svn.apache.org/viewvc?rev=423544&view=rev
Log:
Comet connection handling. When the response.getWriter().close() method has been called,
the comet connection is setup for closure instead of waiting for a timeout.
This is necessary since the servlet could have set a long timeout.
Also, improve on timeout checking. Only use the optimization for how frequently we need to check the keys if there has been no activity on the selector. During heavy activity, the optimization takes into effect.
Modified:
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalNioOutputBuffer.java
tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
Modified: tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java?rev=423544&r1=423543&r2=423544&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java Wed Jul 19 10:49:47 2006
@@ -174,7 +174,14 @@
* Comet used.
*/
protected boolean comet = false;
-
+
+ /**
+ * Closed flag, a Comet async thread can
+ * signal for this Nio processor to be closed and recycled instead
+ * of waiting for a timeout.
+ * Closed by HttpServletResponse.getWriter().close()
+ */
+ protected boolean cometClose = false;
/**
* Content delimitator for the request (if false, the connection will
@@ -970,6 +977,8 @@
inputBuffer.recycle();
outputBuffer.recycle();
this.socket = null;
+ this.cometClose = false;
+ this.comet = false;
}
@@ -1034,6 +1043,17 @@
// transactions with the client
comet = false;
+ cometClose = true;
+ SelectionKey key = socket.keyFor(endpoint.getPoller().getSelector());
+ if ( key != null ) {
+ NioEndpoint.KeyAttachment attach = (NioEndpoint.KeyAttachment) key.attachment();
+ if ( attach!=null && attach.getComet()) {
+ //we need to recycle
+ request.getAttributes().remove("org.apache.tomcat.comet.timeout");
+ attach.setError(true);
+ }
+ }
+
try {
outputBuffer.endRequest();
} catch (IOException e) {
Modified: tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalNioOutputBuffer.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalNioOutputBuffer.java?rev=423544&r1=423543&r2=423544&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalNioOutputBuffer.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalNioOutputBuffer.java Wed Jul 19 10:49:47 2006
@@ -571,16 +571,11 @@
int total = 0;
private synchronized void addToBB(byte[] buf, int offset, int length) throws IOException {
- try {
- if (bbuf.capacity() <= (offset + length)) {
- flushBuffer();
- }
- bbuf.put(buf, offset, length);
- total += length;
- }catch ( Exception x ) {
- x.printStackTrace();
+ if (bbuf.capacity() <= (offset + length)) {
+ flushBuffer();
}
- //System.out.println("Total:"+total);
+ bbuf.put(buf, offset, length);
+ total += length;
}
Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java?rev=423544&r1=423543&r2=423544&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Wed Jul 19 10:49:47 2006
@@ -312,7 +312,7 @@
public void setPollerThreadCount(int pollerThreadCount) { this.pollerThreadCount = pollerThreadCount; }
public int getPollerThreadCount() { return pollerThreadCount; }
- protected long selectorTimeout = 5000;
+ protected long selectorTimeout = 1000;
public void setSelectorTimeout(long timeout){ this.selectorTimeout = timeout;}
public long getSelectorTimeout(){ return this.selectorTimeout; }
/**
@@ -1043,9 +1043,11 @@
addEvent(r);
}
- public void events() {
+ public boolean events() {
+ boolean result = false;
synchronized (events) {
Runnable r = null;
+ result = (events.size() > 0);
while ( (events.size() > 0) && (r = events.removeFirst()) != null ) {
try {
r.run();
@@ -1055,6 +1057,7 @@
}
events.clear();
}
+ return result;
}
public void register(final SocketChannel socket)
@@ -1103,8 +1106,9 @@
// Ignore
}
}
+ boolean hasEvents = false;
- events();
+ hasEvents = (hasEvents | events());
// Time to terminate?
if (close) return;
@@ -1115,8 +1119,9 @@
log.error("",x);
continue;
}
-
-
+
+ //either we timed out or we woke up, process events first
+ if ( keyCount == 0 ) hasEvents = (hasEvents | events());
//if (keyCount == 0) continue;
@@ -1162,16 +1167,18 @@
}
}//while
//process timeouts
- timeout();
- }
+ timeout(keyCount,hasEvents);
+ }//while
synchronized (this) {
this.notifyAll();
}
}
- protected void timeout() {
+ protected void timeout(int keyCount, boolean hasEvents) {
long now = System.currentTimeMillis();
- if ( now < nextExpiration ) return;
+ //don't process timeouts too frequently, but if the selector simply timed out
+ //then we can check timeouts to avoid gaps
+ if ( (now < nextExpiration) && (keyCount>0 || hasEvents) ) return;
nextExpiration = now + (long)soTimeout;
//timeout
Set<SelectionKey> keys = selector.keys();
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org