Author: fhanik
Date: Mon Aug  6 16:19:37 2007
New Revision: 563331

URL: http://svn.apache.org/viewvc?view=rev&rev=563331
Log:
Improve poller timeout handling to not waste cycles

Modified:
    tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
    tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/SocketProperties.java

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?view=diff&rev=563331&r1=563330&r2=563331
==============================================================================
--- 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 Mon 
Aug  6 16:19:37 2007
@@ -1582,8 +1582,11 @@
             long now = System.currentTimeMillis();
             //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) && 
(!close) ) return;
-            nextExpiration = now + (long)socketProperties.getSoTimeout();
+            if ( ((keyCount>0 || hasEvents) ||(now < nextExpiration)) && 
(!close) ) {
+                return;
+            }
+            long prevExp = nextExpiration;
+            nextExpiration = now + socketProperties.getTimeoutInterval();
             //timeout
             Set<SelectionKey> keys = selector.keys();
             int keycount = 0;
@@ -1618,7 +1621,9 @@
                     cancelledKey(key, SocketStatus.ERROR,false);
                 }
             }//for
-            if ( log.isDebugEnabled() ) log.debug("Poller processed 
"+keycount+" keys through timeout");
+           if ( log.isDebugEnabled() ) log.debug("timeout completed: 
keycount="+keycount+"; now="+now+"; nextExpiration="+prevExp+"; "+
+                                                  "keyCount="+keyCount+"; 
hasEvents="+hasEvents +"; eval="+( (now < prevExp) && (keyCount>0 || hasEvents) 
&& (!close) ));
+
         }
     }
 

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/SocketProperties.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/SocketProperties.java?view=diff&rev=563331&r1=563330&r2=563331
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/SocketProperties.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/SocketProperties.java 
Mon Aug  6 16:19:37 2007
@@ -1,354 +1,370 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomcat.util.net;
-
-import java.net.Socket;
-import java.net.SocketException;
-/**
- * Properties that can be set in the &lt;Connector&gt; element
- * in server.xml. All properties are prefixed with &quot;socket.&quot;
- * and are currently only working for the Nio connector
- *
- * @author Filip Hanik
- */
-public class SocketProperties {
-    /**
-     * Enable/disable key cache, this bounded cache stores
-     * KeyAttachment objects to reduce GC
-     * Default is 500
-     * -1 is unlimited
-     * 0 is disabled
-     */
-    protected int keyCache = 500;
-    
-    /**
-     * Enable/disable socket processor cache, this bounded cache stores
-     * SocketProcessor objects to reduce GC
-     * Default is 500
-     * -1 is unlimited
-     * 0 is disabled
-     */
-    protected int processorCache = 500;
-
-
-
-    /**
-     * Enable/disable poller event cache, this bounded cache stores
-     * PollerEvent objects to reduce GC for the poller
-     * Default is 500 
-     * -1 is unlimited
-     * 0 is disabled
-     * >0 the max number of objects to keep in cache.
-     */
-    protected int eventCache = 500;
-
-
-    /**
-     * Enable/disable direct buffers for the network buffers
-     * Default value is enabled
-     */
-    protected boolean directBuffer = false;
-    /**
-     * Socket receive buffer size in bytes (SO_RCVBUF)
-     * Default value is 25188
-     */
-    protected int rxBufSize = 25188;
-    /**
-     * Socket send buffer size in bytes (SO_SNDBUF)
-     * Default value is 43800
-     */
-    protected int txBufSize = 43800;
-
-    /**
-     * The application read buffer size in bytes.
-     * Default value is rxBufSize
-     */
-    protected int appReadBufSize = 8192;
-
-    /**
-     * The application write buffer size in bytes
-     * Default value is txBufSize
-     */
-    protected int appWriteBufSize = 8192;
-
-    /**
-     * NioChannel pool size for the endpoint,
-     * this value is how many channels
-     * -1 means unlimited cached, 0 means no cache
-     * Default value is 500
-     */
-    protected int bufferPool = 500;
-
-
-    /**
-     * Buffer pool size in bytes to be cached
-     * -1 means unlimited, 0 means no cache
-     * Default value is 100MB (1024*1024*100 bytes)
-     */
-    protected int bufferPoolSize = 1024*1024*100;
-
-    /**
-     * TCP_NO_DELAY option, default is true
-     */
-    protected boolean tcpNoDelay = true;
-    /**
-     * SO_KEEPALIVE option, default is false
-     */
-    protected boolean soKeepAlive = false;
-    /**
-     * OOBINLINE option, default is true
-     */
-    protected boolean ooBInline = true;
-    /**
-     * SO_REUSEADDR option, default is true
-     */
-    protected boolean soReuseAddress = true;
-    /**
-     * SO_LINGER option, default is true, paired with the 
<code>soLingerTime</code> value
-     */
-    protected boolean soLingerOn = true;
-    /**
-     * SO_LINGER option, default is 25 seconds.
-     */
-    protected int soLingerTime = 25;
-    /**
-     * SO_TIMEOUT option, default is 5000 milliseconds
-     */
-    protected int soTimeout = 5000;
-    /**
-     * Traffic class option, value between 0 and 255
-     * IPTOS_LOWCOST (0x02)
-     * IPTOS_RELIABILITY (0x04)
-     * IPTOS_THROUGHPUT (0x08)
-     * IPTOS_LOWDELAY (0x10)
-     * Default value is 0x04 | 0x08 | 0x010
-     */
-    protected int soTrafficClass = 0x04 | 0x08 | 0x010;
-    /**
-     * Performance preferences according to
-     * 
http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int)
-     * Default value is 1
-     */
-    protected int performanceConnectionTime = 1;
-    /**
-     * Performance preferences according to
-     * 
http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int)
-     * Default value is 0
-     */
-    protected int performanceLatency = 0;
-    /**
-     * Performance preferences according to
-     * 
http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int)
-     * Default value is 1
-     */
-    protected int performanceBandwidth = 1;
-    private Socket properties;
-
-    public void setProperties(Socket socket) throws SocketException{
-        socket.setReceiveBufferSize(rxBufSize);
-        socket.setSendBufferSize(txBufSize);
-        socket.setOOBInline(ooBInline);
-        socket.setKeepAlive(soKeepAlive);
-        
socket.setPerformancePreferences(performanceConnectionTime,performanceLatency,performanceBandwidth);
-        socket.setReuseAddress(soReuseAddress);
-        socket.setSoLinger(soLingerOn,soLingerTime);
-        socket.setSoTimeout(soTimeout);
-        socket.setTcpNoDelay(tcpNoDelay);
-        socket.setTrafficClass(soTrafficClass);
-    }
-
-    public boolean getDirectBuffer() {
-        return directBuffer;
-    }
-
-    public boolean getOoBInline() {
-        return ooBInline;
-    }
-
-    public int getPerformanceBandwidth() {
-        return performanceBandwidth;
-    }
-
-    public int getPerformanceConnectionTime() {
-        return performanceConnectionTime;
-    }
-
-    public int getPerformanceLatency() {
-        return performanceLatency;
-    }
-
-    public int getRxBufSize() {
-        return rxBufSize;
-    }
-
-    public boolean getSoKeepAlive() {
-        return soKeepAlive;
-    }
-
-    public boolean getSoLingerOn() {
-        return soLingerOn;
-    }
-
-    public int getSoLingerTime() {
-        return soLingerTime;
-    }
-
-    public boolean getSoReuseAddress() {
-        return soReuseAddress;
-    }
-
-    public int getSoTimeout() {
-        return soTimeout;
-    }
-
-    public int getSoTrafficClass() {
-        return soTrafficClass;
-    }
-
-    public boolean getTcpNoDelay() {
-        return tcpNoDelay;
-    }
-
-    public int getTxBufSize() {
-        return txBufSize;
-    }
-
-    public int getBufferPool() {
-        return bufferPool;
-    }
-
-    public int getBufferPoolSize() {
-        return bufferPoolSize;
-    }
-
-    public int getEventCache() {
-        return eventCache;
-    }
-
-    public int getKeyCache() {
-        return keyCache;
-    }
-
-    public Socket getProperties() {
-        return properties;
-    }
-
-    public int getAppReadBufSize() {
-        return appReadBufSize;
-    }
-
-    public int getAppWriteBufSize() {
-        return appWriteBufSize;
-    }
-
-    public int getProcessorCache() {
-        return processorCache;
-    }
-
-    public int getDirectBufferPool() {
-        return bufferPool;
-    }
-
-    public void setPerformanceConnectionTime(int performanceConnectionTime) {
-        this.performanceConnectionTime = performanceConnectionTime;
-    }
-
-    public void setTxBufSize(int txBufSize) {
-        this.txBufSize = txBufSize;
-    }
-
-    public void setTcpNoDelay(boolean tcpNoDelay) {
-        this.tcpNoDelay = tcpNoDelay;
-    }
-
-    public void setSoTrafficClass(int soTrafficClass) {
-        this.soTrafficClass = soTrafficClass;
-    }
-
-    public void setSoTimeout(int soTimeout) {
-        this.soTimeout = soTimeout;
-    }
-
-    public void setSoReuseAddress(boolean soReuseAddress) {
-        this.soReuseAddress = soReuseAddress;
-    }
-
-    public void setSoLingerTime(int soLingerTime) {
-        this.soLingerTime = soLingerTime;
-    }
-
-    public void setSoKeepAlive(boolean soKeepAlive) {
-        this.soKeepAlive = soKeepAlive;
-    }
-
-    public void setRxBufSize(int rxBufSize) {
-        this.rxBufSize = rxBufSize;
-    }
-
-    public void setPerformanceLatency(int performanceLatency) {
-        this.performanceLatency = performanceLatency;
-    }
-
-    public void setPerformanceBandwidth(int performanceBandwidth) {
-        this.performanceBandwidth = performanceBandwidth;
-    }
-
-    public void setOoBInline(boolean ooBInline) {
-        this.ooBInline = ooBInline;
-    }
-
-    public void setDirectBuffer(boolean directBuffer) {
-        this.directBuffer = directBuffer;
-    }
-
-    public void setSoLingerOn(boolean soLingerOn) {
-        this.soLingerOn = soLingerOn;
-    }
-
-    public void setBufferPool(int bufferPool) {
-        this.bufferPool = bufferPool;
-    }
-
-    public void setBufferPoolSize(int bufferPoolSize) {
-        this.bufferPoolSize = bufferPoolSize;
-    }
-
-    public void setEventCache(int eventCache) {
-        this.eventCache = eventCache;
-    }
-
-    public void setKeyCache(int keyCache) {
-        this.keyCache = keyCache;
-    }
-
-    public void setAppReadBufSize(int appReadBufSize) {
-        this.appReadBufSize = appReadBufSize;
-    }
-
-    public void setAppWriteBufSize(int appWriteBufSize) {
-        this.appWriteBufSize = appWriteBufSize;
-    }
-
-    public void setProcessorCache(int processorCache) {
-        this.processorCache = processorCache;
-    }
-
-    public void setDirectBufferPool(int directBufferPool) {
-        this.bufferPool = directBufferPool;
-    }
-
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.util.net;
+
+import java.net.Socket;
+import java.net.SocketException;
+/**
+ * Properties that can be set in the &lt;Connector&gt; element
+ * in server.xml. All properties are prefixed with &quot;socket.&quot;
+ * and are currently only working for the Nio connector
+ *
+ * @author Filip Hanik
+ */
+public class SocketProperties {
+    /**
+     * Enable/disable key cache, this bounded cache stores
+     * KeyAttachment objects to reduce GC
+     * Default is 500
+     * -1 is unlimited
+     * 0 is disabled
+     */
+    protected int keyCache = 500;
+    
+    /**
+     * Enable/disable socket processor cache, this bounded cache stores
+     * SocketProcessor objects to reduce GC
+     * Default is 500
+     * -1 is unlimited
+     * 0 is disabled
+     */
+    protected int processorCache = 500;
+
+
+
+    /**
+     * Enable/disable poller event cache, this bounded cache stores
+     * PollerEvent objects to reduce GC for the poller
+     * Default is 500 
+     * -1 is unlimited
+     * 0 is disabled
+     * >0 the max number of objects to keep in cache.
+     */
+    protected int eventCache = 500;
+
+
+    /**
+     * Enable/disable direct buffers for the network buffers
+     * Default value is enabled
+     */
+    protected boolean directBuffer = false;
+    /**
+     * Socket receive buffer size in bytes (SO_RCVBUF)
+     * Default value is 25188
+     */
+    protected int rxBufSize = 25188;
+    /**
+     * Socket send buffer size in bytes (SO_SNDBUF)
+     * Default value is 43800
+     */
+    protected int txBufSize = 43800;
+
+    /**
+     * The application read buffer size in bytes.
+     * Default value is rxBufSize
+     */
+    protected int appReadBufSize = 8192;
+
+    /**
+     * The application write buffer size in bytes
+     * Default value is txBufSize
+     */
+    protected int appWriteBufSize = 8192;
+
+    /**
+     * NioChannel pool size for the endpoint,
+     * this value is how many channels
+     * -1 means unlimited cached, 0 means no cache
+     * Default value is 500
+     */
+    protected int bufferPool = 500;
+
+
+    /**
+     * Buffer pool size in bytes to be cached
+     * -1 means unlimited, 0 means no cache
+     * Default value is 100MB (1024*1024*100 bytes)
+     */
+    protected int bufferPoolSize = 1024*1024*100;
+
+    /**
+     * TCP_NO_DELAY option, default is true
+     */
+    protected boolean tcpNoDelay = true;
+    /**
+     * SO_KEEPALIVE option, default is false
+     */
+    protected boolean soKeepAlive = false;
+    /**
+     * OOBINLINE option, default is true
+     */
+    protected boolean ooBInline = true;
+    /**
+     * SO_REUSEADDR option, default is true
+     */
+    protected boolean soReuseAddress = true;
+    /**
+     * SO_LINGER option, default is true, paired with the 
<code>soLingerTime</code> value
+     */
+    protected boolean soLingerOn = true;
+    /**
+     * SO_LINGER option, default is 25 seconds.
+     */
+    protected int soLingerTime = 25;
+    /**
+     * SO_TIMEOUT option, default is 5000 milliseconds
+     */
+    protected int soTimeout = 5000;
+    /**
+     * Traffic class option, value between 0 and 255
+     * IPTOS_LOWCOST (0x02)
+     * IPTOS_RELIABILITY (0x04)
+     * IPTOS_THROUGHPUT (0x08)
+     * IPTOS_LOWDELAY (0x10)
+     * Default value is 0x04 | 0x08 | 0x010
+     */
+    protected int soTrafficClass = 0x04 | 0x08 | 0x010;
+    /**
+     * Performance preferences according to
+     * 
http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int)
+     * Default value is 1
+     */
+    protected int performanceConnectionTime = 1;
+    /**
+     * Performance preferences according to
+     * 
http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int)
+     * Default value is 0
+     */
+    protected int performanceLatency = 0;
+    /**
+     * Performance preferences according to
+     * 
http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int)
+     * Default value is 1
+     */
+    protected int performanceBandwidth = 1;
+    
+    /**
+     * The minimum frequency of the timeout interval to avoid the 
+     * poller going boinkers during high traffic
+     */
+    protected long timeoutInterval = 1000;
+
+
+    private Socket properties;
+
+    public void setProperties(Socket socket) throws SocketException{
+        socket.setReceiveBufferSize(rxBufSize);
+        socket.setSendBufferSize(txBufSize);
+        socket.setOOBInline(ooBInline);
+        socket.setKeepAlive(soKeepAlive);
+        
socket.setPerformancePreferences(performanceConnectionTime,performanceLatency,performanceBandwidth);
+        socket.setReuseAddress(soReuseAddress);
+        socket.setSoLinger(soLingerOn,soLingerTime);
+        socket.setSoTimeout(soTimeout);
+        socket.setTcpNoDelay(tcpNoDelay);
+        socket.setTrafficClass(soTrafficClass);
+    }
+
+    public boolean getDirectBuffer() {
+        return directBuffer;
+    }
+
+    public boolean getOoBInline() {
+        return ooBInline;
+    }
+
+    public int getPerformanceBandwidth() {
+        return performanceBandwidth;
+    }
+
+    public int getPerformanceConnectionTime() {
+        return performanceConnectionTime;
+    }
+
+    public int getPerformanceLatency() {
+        return performanceLatency;
+    }
+
+    public int getRxBufSize() {
+        return rxBufSize;
+    }
+
+    public boolean getSoKeepAlive() {
+        return soKeepAlive;
+    }
+
+    public boolean getSoLingerOn() {
+        return soLingerOn;
+    }
+
+    public int getSoLingerTime() {
+        return soLingerTime;
+    }
+
+    public boolean getSoReuseAddress() {
+        return soReuseAddress;
+    }
+
+    public int getSoTimeout() {
+        return soTimeout;
+    }
+
+    public int getSoTrafficClass() {
+        return soTrafficClass;
+    }
+
+    public boolean getTcpNoDelay() {
+        return tcpNoDelay;
+    }
+
+    public int getTxBufSize() {
+        return txBufSize;
+    }
+
+    public int getBufferPool() {
+        return bufferPool;
+    }
+
+    public int getBufferPoolSize() {
+        return bufferPoolSize;
+    }
+
+    public int getEventCache() {
+        return eventCache;
+    }
+
+    public int getKeyCache() {
+        return keyCache;
+    }
+
+    public Socket getProperties() {
+        return properties;
+    }
+
+    public int getAppReadBufSize() {
+        return appReadBufSize;
+    }
+
+    public int getAppWriteBufSize() {
+        return appWriteBufSize;
+    }
+
+    public int getProcessorCache() {
+        return processorCache;
+    }
+
+    public long getTimeoutInterval() {
+        return timeoutInterval;
+    }
+
+    public int getDirectBufferPool() {
+        return bufferPool;
+    }
+
+    public void setPerformanceConnectionTime(int performanceConnectionTime) {
+        this.performanceConnectionTime = performanceConnectionTime;
+    }
+
+    public void setTxBufSize(int txBufSize) {
+        this.txBufSize = txBufSize;
+    }
+
+    public void setTcpNoDelay(boolean tcpNoDelay) {
+        this.tcpNoDelay = tcpNoDelay;
+    }
+
+    public void setSoTrafficClass(int soTrafficClass) {
+        this.soTrafficClass = soTrafficClass;
+    }
+
+    public void setSoTimeout(int soTimeout) {
+        this.soTimeout = soTimeout;
+    }
+
+    public void setSoReuseAddress(boolean soReuseAddress) {
+        this.soReuseAddress = soReuseAddress;
+    }
+
+    public void setSoLingerTime(int soLingerTime) {
+        this.soLingerTime = soLingerTime;
+    }
+
+    public void setSoKeepAlive(boolean soKeepAlive) {
+        this.soKeepAlive = soKeepAlive;
+    }
+
+    public void setRxBufSize(int rxBufSize) {
+        this.rxBufSize = rxBufSize;
+    }
+
+    public void setPerformanceLatency(int performanceLatency) {
+        this.performanceLatency = performanceLatency;
+    }
+
+    public void setPerformanceBandwidth(int performanceBandwidth) {
+        this.performanceBandwidth = performanceBandwidth;
+    }
+
+    public void setOoBInline(boolean ooBInline) {
+        this.ooBInline = ooBInline;
+    }
+
+    public void setDirectBuffer(boolean directBuffer) {
+        this.directBuffer = directBuffer;
+    }
+
+    public void setSoLingerOn(boolean soLingerOn) {
+        this.soLingerOn = soLingerOn;
+    }
+
+    public void setBufferPool(int bufferPool) {
+        this.bufferPool = bufferPool;
+    }
+
+    public void setBufferPoolSize(int bufferPoolSize) {
+        this.bufferPoolSize = bufferPoolSize;
+    }
+
+    public void setEventCache(int eventCache) {
+        this.eventCache = eventCache;
+    }
+
+    public void setKeyCache(int keyCache) {
+        this.keyCache = keyCache;
+    }
+
+    public void setAppReadBufSize(int appReadBufSize) {
+        this.appReadBufSize = appReadBufSize;
+    }
+
+    public void setAppWriteBufSize(int appWriteBufSize) {
+        this.appWriteBufSize = appWriteBufSize;
+    }
+
+    public void setProcessorCache(int processorCache) {
+        this.processorCache = processorCache;
+    }
+
+    public void setTimeoutInterval(long timeoutInterval) {
+        this.timeoutInterval = timeoutInterval;
+    }
+
+    public void setDirectBufferPool(int directBufferPool) {
+        this.bufferPool = directBufferPool;
+    }
+
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to