Author: fhanik
Date: Fri Mar 23 09:19:47 2007
New Revision: 521790

URL: http://svn.apache.org/viewvc?view=rev&rev=521790
Log:
better error handling

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

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioBlockingSelector.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioBlockingSelector.java?view=diff&rev=521790&r1=521789&r2=521790
==============================================================================
--- 
tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioBlockingSelector.java 
(original)
+++ 
tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioBlockingSelector.java 
Fri Mar 23 09:19:47 2007
@@ -62,7 +62,7 @@
                         continue; //we successfully wrote, try again without a 
selector
                     }
                 }
-                
+                if ( key == null ) throw new IOException("Key no longer 
registered");
                 KeyAttachment att = (KeyAttachment) key.attachment();
                 try {
                     if ( att.getLatch()==null || att.getLatch().getCount()==0) 
att.startLatch(1);

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=521790&r1=521789&r2=521790
==============================================================================
--- 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 Fri 
Mar 23 09:19:47 2007
@@ -1311,6 +1311,7 @@
         }
         public void cancelledKey(SelectionKey key, SocketStatus status, 
boolean dispatch) {
             try {
+                if ( key == null ) return;//nothing to do
                 KeyAttachment ka = (KeyAttachment) key.attachment();
                 if (ka != null && ka.getComet()) {
                     //the comet event takes care of clean up
@@ -1954,54 +1955,60 @@
         }
          
         public void run() {
-
-           
-            SelectionKey key = 
socket.getIOChannel().keyFor(socket.getPoller().getSelector());
-            int handshake = -1;
+            SelectionKey key = null;
             try {
-                handshake = socket.handshake(key.isReadable(), 
key.isWritable());
-            }catch ( IOException x ) {
-                handshake = -1;
-                if ( log.isDebugEnabled() ) log.debug("Error during SSL 
handshake",x);
-            }catch ( CancelledKeyException ckx ) {
-                handshake = -1;
-            }
-            if ( handshake == 0 ) {
-                // Process the request from this socket
-                boolean closed = 
(status==null)?(handler.process(socket)==Handler.SocketState.CLOSED) :
-                    (handler.event(socket,status)==Handler.SocketState.CLOSED);
+                key = 
socket.getIOChannel().keyFor(socket.getPoller().getSelector());
+                int handshake = -1;
+                try {
+                    handshake = socket.handshake(key.isReadable(), 
key.isWritable());
+                }catch ( IOException x ) {
+                    handshake = -1;
+                    if ( log.isDebugEnabled() ) log.debug("Error during SSL 
handshake",x);
+                }catch ( CancelledKeyException ckx ) {
+                    handshake = -1;
+                }
+                if ( handshake == 0 ) {
+                    // Process the request from this socket
+                    boolean closed = 
(status==null)?(handler.process(socket)==Handler.SocketState.CLOSED) :
+                        
(handler.event(socket,status)==Handler.SocketState.CLOSED);
 
-                if (closed) {
-                    // Close socket and pool
-                    try {
-                        KeyAttachment att = 
(KeyAttachment)socket.getAttachment(true);
-                        try {socket.close();}catch (Exception ignore){}
-                        if ( socket.isOpen() ) socket.close(true);
-                        key.cancel();
-                        key.attach(null);
-                        nioChannels.offer(socket);
-                        if ( att!=null ) keyCache.offer(att);
-                    }catch ( Exception x ) {
-                        log.error("",x);
-                    }
-                } 
-            } else if (handshake == -1 ) {
-                KeyAttachment ka = (KeyAttachment)key.attachment();
-                
socket.getPoller().cancelledKey(key,SocketStatus.DISCONNECT,false);
-                try {socket.close(true);}catch (IOException ignore){}
-                nioChannels.offer(socket);
-                if ( ka!=null ) keyCache.offer(ka);
-            } else {
-                final SelectionKey fk = key;
-                final int intops = handshake;
-                final KeyAttachment ka = (KeyAttachment)fk.attachment();
-                ka.getPoller().add(socket,intops);
+                    if (closed) {
+                        // Close socket and pool
+                        try {
+                            KeyAttachment att = 
(KeyAttachment)socket.getAttachment(true);
+                            try {socket.close();}catch (Exception ignore){}
+                            if ( socket.isOpen() ) socket.close(true);
+                            key.cancel();
+                            key.attach(null);
+                            nioChannels.offer(socket);
+                            if ( att!=null ) keyCache.offer(att);
+                        }catch ( Exception x ) {
+                            log.error("",x);
+                        }
+                    } 
+                } else if (handshake == -1 ) {
+                    KeyAttachment ka = (KeyAttachment)key.attachment();
+                    
socket.getPoller().cancelledKey(key,SocketStatus.DISCONNECT,false);
+                    try {socket.close(true);}catch (IOException ignore){}
+                    nioChannels.offer(socket);
+                    if ( ka!=null ) keyCache.offer(ka);
+                } else {
+                    final SelectionKey fk = key;
+                    final int intops = handshake;
+                    final KeyAttachment ka = (KeyAttachment)fk.attachment();
+                    ka.getPoller().add(socket,intops);
+                }
+            }catch(CancelledKeyException cx) {
+                socket.getPoller().cancelledKey(key,SocketStatus.ERROR,false);
+            }catch ( Throwable t ) {
+                log.error("",t);
+                socket.getPoller().cancelledKey(key,SocketStatus.ERROR,false);
+            } finally {
+                socket = null;
+                status = null;
+                //return to cache
+                processorCache.offer(this);
             }
-
-            socket = null;
-            status = null;
-            //return to cache
-            processorCache.offer(this);
         }
 
     }



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

Reply via email to