You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2015/05/05 17:29:49 UTC

svn commit: r1677839 - in /tomcat/trunk: java/org/apache/coyote/http11/ java/org/apache/tomcat/util/net/ webapps/docs/config/

Author: markt
Date: Tue May  5 15:29:49 2015
New Revision: 1677839

URL: http://svn.apache.org/r1677839
Log:
Remove the oomParachute as discissed on the dev list

Modified:
    tomcat/trunk/java/org/apache/coyote/http11/Http11Nio2Protocol.java
    tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java
    tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java
    tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
    tomcat/trunk/webapps/docs/config/http.xml

Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11Nio2Protocol.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11Nio2Protocol.java?rev=1677839&r1=1677838&r2=1677839&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/Http11Nio2Protocol.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/Http11Nio2Protocol.java Tue May  5 15:29:49 2015
@@ -57,13 +57,6 @@ public class Http11Nio2Protocol extends
     }
 
 
-    // -------------------- Tcp setup --------------------
-
-    public void setOomParachute(int oomParachute) {
-        ((Nio2Endpoint)getEndpoint()).setOomParachute(oomParachute);
-    }
-
-
     // ----------------------------------------------------- JMX related methods
 
     @Override

Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java?rev=1677839&r1=1677838&r2=1677839&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java Tue May  5 15:29:49 2015
@@ -88,11 +88,6 @@ public class Http11NioProtocol extends A
     }
 
 
-    // -------------------- Tcp setup --------------------
-    public void setOomParachute(int oomParachute) {
-        ((NioEndpoint)getEndpoint()).setOomParachute(oomParachute);
-    }
-
     // ----------------------------------------------------- JMX related methods
 
     @Override

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java?rev=1677839&r1=1677838&r2=1677839&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java Tue May  5 15:29:49 2015
@@ -74,11 +74,6 @@ public class Nio2Endpoint extends Abstra
     private AsynchronousServerSocketChannel serverSock = null;
 
     /**
-     * The size of the OOM parachute.
-     */
-    private int oomParachute = 1024*1024;
-
-    /**
      * Allows detecting if a completion handler completes inline.
      */
     private static ThreadLocal<Boolean> inlineCompletion = new ThreadLocal<>();
@@ -91,24 +86,6 @@ public class Nio2Endpoint extends Abstra
     private volatile boolean allClosed;
 
     /**
-     * The oom parachute, when an OOM error happens,
-     * will release the data, giving the JVM instantly
-     * a chunk of data to be able to recover with.
-     */
-    private byte[] oomParachuteData = null;
-
-    /**
-     * Make sure this string has already been allocated
-     */
-    private static final String oomParachuteMsg =
-        "SEVERE:Memory usage is low, parachute is non existent, your system may start failing.";
-
-    /**
-     * Keep track of OOM warning messages.
-     */
-    private long lastParachuteCheck = System.currentTimeMillis();
-
-    /**
      * Cache for SocketProcessor objects
      */
     private SynchronizedStack<SocketProcessor> processorCache;
@@ -151,14 +128,6 @@ public class Nio2Endpoint extends Abstra
         return false;
     }
 
-    public void setOomParachute(int oomParachute) {
-        this.oomParachute = oomParachute;
-    }
-
-    public void setOomParachuteData(byte[] oomParachuteData) {
-        this.oomParachuteData = oomParachuteData;
-    }
-
 
     /**
      * Port in use.
@@ -183,35 +152,12 @@ public class Nio2Endpoint extends Abstra
     }
 
 
-    // --------------------------------------------------------- OOM Parachute Methods
-
-    protected void checkParachute() {
-        boolean para = reclaimParachute(false);
-        if (!para && (System.currentTimeMillis()-lastParachuteCheck)>10000) {
-            try {
-                log.fatal(oomParachuteMsg);
-            }catch (Throwable t) {
-                ExceptionUtils.handleThrowable(t);
-                System.err.println(oomParachuteMsg);
-            }
-            lastParachuteCheck = System.currentTimeMillis();
-        }
-    }
-
-    protected boolean reclaimParachute(boolean force) {
-        if ( oomParachuteData != null ) return true;
-        if ( oomParachute > 0 && ( force || (Runtime.getRuntime().freeMemory() > (oomParachute*2))) )
-            oomParachuteData = new byte[oomParachute];
-        return oomParachuteData != null;
-    }
-
     protected void releaseCaches() {
         if (useCaches) {
             this.nioChannels.clear();
             this.processorCache.clear();
         }
         if ( handler != null ) handler.recycle();
-
     }
 
     // --------------------------------------------------------- Public Methods
@@ -261,8 +207,6 @@ public class Nio2Endpoint extends Abstra
 
         // Initialize SSL if needed
         initialiseSsl();
-
-        if (oomParachute>0) reclaimParachute(true);
     }
 
 
@@ -398,15 +342,6 @@ public class Nio2Endpoint extends Abstra
         return socketProperties.getRxBufSize();
     }
 
-    public int getOomParachute() {
-        return oomParachute;
-    }
-
-    public byte[] getOomParachuteData() {
-        return oomParachuteData;
-    }
-
-
     @Override
     protected AbstractEndpoint.Acceptor createAcceptor() {
         return new Acceptor();
@@ -1742,20 +1677,6 @@ public class Nio2Endpoint extends Abstra
                             nioChannels.push(socket.getSocket());
                         }
                     }
-                } catch (OutOfMemoryError oom) {
-                    try {
-                        oomParachuteData = null;
-                        log.error("", oom);
-                        closeSocket(socket);
-                        releaseCaches();
-                    } catch (Throwable oomt) {
-                        try {
-                            System.err.println(oomParachuteMsg);
-                            oomt.printStackTrace();
-                        } catch (Throwable letsHopeWeDontGetHere){
-                            ExceptionUtils.handleThrowable(letsHopeWeDontGetHere);
-                        }
-                    }
                 } catch (VirtualMachineError vme) {
                     ExceptionUtils.handleThrowable(vme);
                 } catch (Throwable t) {

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java?rev=1677839&r1=1677838&r2=1677839&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Tue May  5 15:29:49 2015
@@ -88,28 +88,6 @@ public class NioEndpoint extends Abstrac
     private ServerSocketChannel serverSock = null;
 
     /**
-     * The size of the OOM parachute.
-     */
-    private int oomParachute = 1024*1024;
-    /**
-     * The oom parachute, when an OOM error happens,
-     * will release the data, giving the JVM instantly
-     * a chunk of data to be able to recover with.
-     */
-    private byte[] oomParachuteData = null;
-
-    /**
-     * Make sure this string has already been allocated
-     */
-    private static final String oomParachuteMsg =
-        "SEVERE:Memory usage is low, parachute is non existent, your system may start failing.";
-
-    /**
-     * Keep track of OOM warning messages.
-     */
-    private long lastParachuteCheck = System.currentTimeMillis();
-
-    /**
      *
      */
     private volatile CountDownLatch stopLatch = null;
@@ -211,14 +189,6 @@ public class NioEndpoint extends Abstrac
         return false;
     }
 
-    public void setOomParachute(int oomParachute) {
-        this.oomParachute = oomParachute;
-    }
-
-    public void setOomParachuteData(byte[] oomParachuteData) {
-        this.oomParachuteData = oomParachuteData;
-    }
-
 
     /**
      * Port in use.
@@ -239,28 +209,6 @@ public class NioEndpoint extends Abstrac
     }
 
 
-    // --------------------------------------------------------- OOM Parachute Methods
-
-    protected void checkParachute() {
-        boolean para = reclaimParachute(false);
-        if (!para && (System.currentTimeMillis()-lastParachuteCheck)>10000) {
-            try {
-                log.fatal(oomParachuteMsg);
-            }catch (Throwable t) {
-                ExceptionUtils.handleThrowable(t);
-                System.err.println(oomParachuteMsg);
-            }
-            lastParachuteCheck = System.currentTimeMillis();
-        }
-    }
-
-    protected boolean reclaimParachute(boolean force) {
-        if ( oomParachuteData != null ) return true;
-        if ( oomParachute > 0 && ( force || (Runtime.getRuntime().freeMemory() > (oomParachute*2))) )
-            oomParachuteData = new byte[oomParachute];
-        return oomParachuteData != null;
-    }
-
     protected void releaseCaches() {
         this.nioChannels.clear();
         this.processorCache.clear();
@@ -268,6 +216,7 @@ public class NioEndpoint extends Abstrac
 
     }
 
+
     // --------------------------------------------------------- Public Methods
     /**
      * Number of keep-alive sockets.
@@ -290,7 +239,6 @@ public class NioEndpoint extends Abstrac
 
     // ----------------------------------------------- Public Lifecycle Methods
 
-
     /**
      * Initialize the endpoint.
      */
@@ -318,7 +266,6 @@ public class NioEndpoint extends Abstrac
         // Initialize SSL if needed
         initialiseSsl();
 
-        if (oomParachute>0) reclaimParachute(true);
         selectorPool.open();
     }
 
@@ -430,14 +377,6 @@ public class NioEndpoint extends Abstrac
         return selectorPool;
     }
 
-    public int getOomParachute() {
-        return oomParachute;
-    }
-
-    public byte[] getOomParachuteData() {
-        return oomParachuteData;
-    }
-
 
     @Override
     protected AbstractEndpoint.Acceptor createAcceptor() {
@@ -601,23 +540,6 @@ public class NioEndpoint extends Abstrac
                     if (running) {
                         log.error(sm.getString("endpoint.accept.fail"), x);
                     }
-                } catch (OutOfMemoryError oom) {
-                    try {
-                        oomParachuteData = null;
-                        releaseCaches();
-                        log.error("", oom);
-                    }catch ( Throwable oomt ) {
-                        try {
-                            try {
-                                System.err.println(oomParachuteMsg);
-                                oomt.printStackTrace();
-                            }catch (Throwable letsHopeWeDontGetHere){
-                                ExceptionUtils.handleThrowable(letsHopeWeDontGetHere);
-                            }
-                        }catch (Throwable letsHopeWeDontGetHere){
-                            ExceptionUtils.handleThrowable(letsHopeWeDontGetHere);
-                        }
-                    }
                 } catch (Throwable t) {
                     ExceptionUtils.handleThrowable(t);
                     log.error(sm.getString("endpoint.accept.fail"), t);
@@ -874,19 +796,42 @@ public class NioEndpoint extends Abstrac
         public void run() {
             // Loop until destroy() is called
             while (true) {
-                try {
-                    // Loop if endpoint is paused
-                    while (paused && (!close) ) {
-                        try {
-                            Thread.sleep(100);
-                        } catch (InterruptedException e) {
-                            // Ignore
-                        }
+                // Loop if endpoint is paused
+                while (paused && (!close) ) {
+                    try {
+                        Thread.sleep(100);
+                    } catch (InterruptedException e) {
+                        // Ignore
                     }
+                }
 
-                    boolean hasEvents = false;
+                boolean hasEvents = false;
 
-                    // Time to terminate?
+                // Time to terminate?
+                if (close) {
+                    events();
+                    timeout(0, false);
+                    try {
+                        selector.close();
+                    } catch (IOException ioe) {
+                        log.error(sm.getString(
+                                "endpoint.nio.selectorCloseFail"), ioe);
+                    }
+                    break;
+                } else {
+                    hasEvents = events();
+                }
+                try {
+                    if ( !close ) {
+                        if (wakeupCounter.getAndSet(-1) > 0) {
+                            //if we are here, means we have other stuff to do
+                            //do a non blocking select
+                            keyCount = selector.selectNow();
+                        } else {
+                            keyCount = selector.select(selectorTimeout);
+                        }
+                        wakeupCounter.set(0);
+                    }
                     if (close) {
                         events();
                         timeout(0, false);
@@ -897,73 +842,34 @@ public class NioEndpoint extends Abstrac
                                     "endpoint.nio.selectorCloseFail"), ioe);
                         }
                         break;
-                    } else {
-                        hasEvents = events();
                     }
-                    try {
-                        if ( !close ) {
-                            if (wakeupCounter.getAndSet(-1) > 0) {
-                                //if we are here, means we have other stuff to do
-                                //do a non blocking select
-                                keyCount = selector.selectNow();
-                            } else {
-                                keyCount = selector.select(selectorTimeout);
-                            }
-                            wakeupCounter.set(0);
-                        }
-                        if (close) {
-                            events();
-                            timeout(0, false);
-                            try {
-                                selector.close();
-                            } catch (IOException ioe) {
-                                log.error(sm.getString(
-                                        "endpoint.nio.selectorCloseFail"), ioe);
-                            }
-                            break;
-                        }
-                    } catch (Throwable x) {
-                        ExceptionUtils.handleThrowable(x);
-                        log.error("",x);
-                        continue;
-                    }
-                    //either we timed out or we woke up, process events first
-                    if ( keyCount == 0 ) hasEvents = (hasEvents | events());
-
-                    Iterator<SelectionKey> iterator =
-                        keyCount > 0 ? selector.selectedKeys().iterator() : null;
-                    // Walk through the collection of ready keys and dispatch
-                    // any active event.
-                    while (iterator != null && iterator.hasNext()) {
-                        SelectionKey sk = iterator.next();
-                        NioSocketWrapper attachment = (NioSocketWrapper)sk.attachment();
-                        // Attachment may be null if another thread has called
-                        // cancelledKey()
-                        if (attachment == null) {
-                            iterator.remove();
-                        } else {
-                            iterator.remove();
-                            processKey(sk, attachment);
-                        }
-                    }//while
+                } catch (Throwable x) {
+                    ExceptionUtils.handleThrowable(x);
+                    log.error("",x);
+                    continue;
+                }
+                //either we timed out or we woke up, process events first
+                if ( keyCount == 0 ) hasEvents = (hasEvents | events());
 
-                    //process timeouts
-                    timeout(keyCount,hasEvents);
-                    if ( oomParachute > 0 && oomParachuteData == null ) checkParachute();
-                } catch (OutOfMemoryError oom) {
-                    try {
-                        oomParachuteData = null;
-                        releaseCaches();
-                        log.error("", oom);
-                    }catch ( Throwable oomt ) {
-                        try {
-                            System.err.println(oomParachuteMsg);
-                            oomt.printStackTrace();
-                        }catch (Throwable letsHopeWeDontGetHere){
-                            ExceptionUtils.handleThrowable(letsHopeWeDontGetHere);
-                        }
+                Iterator<SelectionKey> iterator =
+                    keyCount > 0 ? selector.selectedKeys().iterator() : null;
+                // Walk through the collection of ready keys and dispatch
+                // any active event.
+                while (iterator != null && iterator.hasNext()) {
+                    SelectionKey sk = iterator.next();
+                    NioSocketWrapper attachment = (NioSocketWrapper)sk.attachment();
+                    // Attachment may be null if another thread has called
+                    // cancelledKey()
+                    if (attachment == null) {
+                        iterator.remove();
+                    } else {
+                        iterator.remove();
+                        processKey(sk, attachment);
                     }
-                }
+                }//while
+
+                //process timeouts
+                timeout(keyCount,hasEvents);
             }//while
 
             stopLatch.countDown();
@@ -1641,22 +1547,6 @@ public class NioEndpoint extends Abstrac
                     if (socket != null) {
                         socket.getPoller().cancelledKey(key);
                     }
-                } catch (OutOfMemoryError oom) {
-                    try {
-                        oomParachuteData = null;
-                        log.error("", oom);
-                        if (socket != null) {
-                            socket.getPoller().cancelledKey(key);
-                        }
-                        releaseCaches();
-                    } catch (Throwable oomt) {
-                        try {
-                            System.err.println(oomParachuteMsg);
-                            oomt.printStackTrace();
-                        } catch (Throwable letsHopeWeDontGetHere){
-                            ExceptionUtils.handleThrowable(letsHopeWeDontGetHere);
-                        }
-                    }
                 } catch (VirtualMachineError vme) {
                     ExceptionUtils.handleThrowable(vme);
                 } catch (Throwable t) {

Modified: tomcat/trunk/webapps/docs/config/http.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/http.xml?rev=1677839&r1=1677838&r2=1677839&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/config/http.xml (original)
+++ tomcat/trunk/webapps/docs/config/http.xml Tue May  5 15:29:49 2015
@@ -777,18 +777,6 @@
         <strong>selectorPool.maxSelectors</strong> attribute.</p>
       </attribute>
 
-      <attribute name="oomParachute" required="false">
-        <p>(int)The NIO connector implements an OutOfMemoryError strategy called
-        parachute. It holds a chunk of data as a byte array. In case of an OOM,
-        this chunk of data is released and the error is reported. This will give
-        the VM enough room to clean up. The <code>oomParachute</code> represents
-        the size in bytes of the parachute(the byte array). The default value is
-        <code>1024*1024</code>(1MB). Please note, this only works for OOM errors
-        regarding the Java Heap space, and there is absolutely no  guarantee
-        that you will be able to recover at all. If you have an OOM outside of
-        the Java Heap, then this parachute trick will not help.
-        </p>
-      </attribute>
     </attributes>
   </subsection>
 
@@ -876,18 +864,6 @@
         <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p>
       </attribute>
 
-      <attribute name="oomParachute" required="false">
-        <p>(int)The NIO2 connector implements an OutOfMemoryError strategy called
-        parachute. It holds a chunk of data as a byte array. In case of an OOM,
-        this chunk of data is released and the error is reported. This will give
-        the VM enough room to clean up. The <code>oomParachute</code> represents
-        the size in bytes of the parachute(the byte array). The default value is
-        <code>1024*1024</code>(1MB). Please note, this only works for OOM errors
-        regarding the Java Heap space, and there is absolutely no  guarantee
-        that you will be able to recover at all. If you have an OOM outside of
-        the Java Heap, then this parachute trick will not help.
-        </p>
-      </attribute>
     </attributes>
   </subsection>
 



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org