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]