You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by tr...@apache.org on 2005/11/04 08:43:22 UTC

svn commit: r330742 - in /directory/network: branches/0.8/src/java/org/apache/mina/io/datagram/ branches/0.8/src/java/org/apache/mina/io/socket/ trunk/src/java/org/apache/mina/transport/socket/nio/support/

Author: trustin
Date: Thu Nov  3 23:43:12 2005
New Revision: 330742

URL: http://svn.apache.org/viewcvs?rev=330742&view=rev
Log:
Related issue: DIRMINA-115 Unexpected CancelledKeyException
* Added more SelectionKey check code


Modified:
    directory/network/branches/0.8/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java
    directory/network/branches/0.8/src/java/org/apache/mina/io/datagram/DatagramConnector.java
    directory/network/branches/0.8/src/java/org/apache/mina/io/socket/SocketIoProcessor.java
    directory/network/trunk/src/java/org/apache/mina/transport/socket/nio/support/DatagramAcceptorDelegate.java
    directory/network/trunk/src/java/org/apache/mina/transport/socket/nio/support/DatagramConnectorDelegate.java
    directory/network/trunk/src/java/org/apache/mina/transport/socket/nio/support/SocketIoProcessor.java

Modified: directory/network/branches/0.8/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/0.8/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java?rev=330742&r1=330741&r2=330742&view=diff
==============================================================================
--- directory/network/branches/0.8/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java (original)
+++ directory/network/branches/0.8/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java Thu Nov  3 23:43:12 2005
@@ -441,10 +441,20 @@
                 continue;
             }
 
+            SelectionKey key = session.getSelectionKey();
+            if( key == null )
+            {
+                scheduleFlush( session );
+                break;
+            }
+            if( !key.isValid() )
+            {
+                continue;
+            }
+
             int writtenBytes = ch
                     .send( buf.buf(), session.getRemoteAddress() );
 
-            SelectionKey key = session.getSelectionKey();
             if( writtenBytes == 0 )
             {
                 // Kernel buffer is full

Modified: directory/network/branches/0.8/src/java/org/apache/mina/io/datagram/DatagramConnector.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/0.8/src/java/org/apache/mina/io/datagram/DatagramConnector.java?rev=330742&r1=330741&r2=330742&view=diff
==============================================================================
--- directory/network/branches/0.8/src/java/org/apache/mina/io/datagram/DatagramConnector.java (original)
+++ directory/network/branches/0.8/src/java/org/apache/mina/io/datagram/DatagramConnector.java Thu Nov  3 23:43:12 2005
@@ -396,9 +396,19 @@
                 continue;
             }
 
+            SelectionKey key = session.getSelectionKey();
+            if( key == null )
+            {
+                scheduleFlush( session );
+                break;
+            }
+            if( !key.isValid() )
+            {
+                continue;
+            }
+
             int writtenBytes = ch.write( buf.buf() );
 
-            SelectionKey key = session.getSelectionKey();
             if( writtenBytes == 0 )
             {
                 // Kernel buffer is full

Modified: directory/network/branches/0.8/src/java/org/apache/mina/io/socket/SocketIoProcessor.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/0.8/src/java/org/apache/mina/io/socket/SocketIoProcessor.java?rev=330742&r1=330741&r2=330742&view=diff
==============================================================================
--- directory/network/branches/0.8/src/java/org/apache/mina/io/socket/SocketIoProcessor.java (original)
+++ directory/network/branches/0.8/src/java/org/apache/mina/io/socket/SocketIoProcessor.java Thu Nov  3 23:43:12 2005
@@ -19,7 +19,6 @@
 package org.apache.mina.io.socket;
 
 import java.io.IOException;
-import java.nio.channels.CancelledKeyException;
 import java.nio.channels.SelectionKey;
 import java.nio.channels.Selector;
 import java.nio.channels.SocketChannel;
@@ -379,10 +378,11 @@
                                            long currentTime,
                                            long writeTimeout, long lastIoTime )
     {
+        SelectionKey key = session.getSelectionKey();
         if( writeTimeout > 0
             && ( currentTime - lastIoTime ) >= writeTimeout
-            && session.getSelectionKey() != null
-            && ( session.getSelectionKey().interestOps() & SelectionKey.OP_WRITE ) != 0 )
+            && key != null && key.isValid()
+            && ( key.interestOps() & SelectionKey.OP_WRITE ) != 0 )
         {
             session
                     .getManagerFilterChain()
@@ -415,28 +415,26 @@
 
             // If encountered write request before session is initialized, 
             // (In case that Session.write() is called before addSession() is processed)
-            if( session.getSelectionKey() == null )
+            SelectionKey key = session.getSelectionKey();
+            if( key == null )
             {
                 // Reschedule for later write
                 scheduleFlush( session );
                 break;
             }
-            else
+            if( !key.isValid() )
             {
-                try
-                {
-                    flush( session );
-                }
-                catch( CancelledKeyException e )
-                {
-                    // Connection is closed unexpectedly.
-                    scheduleRemove( session );
-                }
-                catch( IOException e )
-                {
-                    scheduleRemove( session );
-                    session.getManagerFilterChain().exceptionCaught( session, e );
-                }
+                continue;
+            }
+            
+            try
+            {
+                flush( session );
+            }
+            catch( IOException e )
+            {
+                scheduleRemove( session );
+                session.getManagerFilterChain().exceptionCaught( session, e );
             }
         }
     }

Modified: directory/network/trunk/src/java/org/apache/mina/transport/socket/nio/support/DatagramAcceptorDelegate.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/transport/socket/nio/support/DatagramAcceptorDelegate.java?rev=330742&r1=330741&r2=330742&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/transport/socket/nio/support/DatagramAcceptorDelegate.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/transport/socket/nio/support/DatagramAcceptorDelegate.java Thu Nov  3 23:43:12 2005
@@ -433,11 +433,21 @@
                 continue;
             }
 
+            SelectionKey key = session.getSelectionKey();
+            if( key == null )
+            {
+                scheduleFlush( session );
+                break;
+            }
+            if( !key.isValid() )
+            {
+                continue;
+            }
+
             int pos = buf.position();
             int writtenBytes = ch
                     .send( buf.buf(), session.getRemoteAddress() );
 
-            SelectionKey key = session.getSelectionKey();
             if( writtenBytes == 0 )
             {
                 // Kernel buffer is full

Modified: directory/network/trunk/src/java/org/apache/mina/transport/socket/nio/support/DatagramConnectorDelegate.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/transport/socket/nio/support/DatagramConnectorDelegate.java?rev=330742&r1=330741&r2=330742&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/transport/socket/nio/support/DatagramConnectorDelegate.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/transport/socket/nio/support/DatagramConnectorDelegate.java Thu Nov  3 23:43:12 2005
@@ -356,10 +356,20 @@
                 continue;
             }
 
+            SelectionKey key = session.getSelectionKey();
+            if( key == null )
+            {
+                scheduleFlush( session );
+                break;
+            }
+            if( !key.isValid() )
+            {
+                continue;
+            }
+
             int pos = buf.position();
             int writtenBytes = ch.write( buf.buf() );
 
-            SelectionKey key = session.getSelectionKey();
             if( writtenBytes == 0 )
             {
                 // Kernel buffer is full

Modified: directory/network/trunk/src/java/org/apache/mina/transport/socket/nio/support/SocketIoProcessor.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/transport/socket/nio/support/SocketIoProcessor.java?rev=330742&r1=330741&r2=330742&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/transport/socket/nio/support/SocketIoProcessor.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/transport/socket/nio/support/SocketIoProcessor.java Thu Nov  3 23:43:12 2005
@@ -19,7 +19,6 @@
 package org.apache.mina.transport.socket.nio.support;
 
 import java.io.IOException;
-import java.nio.channels.CancelledKeyException;
 import java.nio.channels.SelectionKey;
 import java.nio.channels.Selector;
 import java.nio.channels.SocketChannel;
@@ -219,7 +218,6 @@
                 scheduleRemove( session );
                 break;
             }
-
             // skip if channel is already closed
             if( !key.isValid() )
             {
@@ -376,10 +374,11 @@
                                            long currentTime,
                                            long writeTimeout, long lastIoTime )
     {
+        SelectionKey key = session.getSelectionKey();
         if( writeTimeout > 0
             && ( currentTime - lastIoTime ) >= writeTimeout
-            && session.getSelectionKey() != null
-            && ( session.getSelectionKey().interestOps() & SelectionKey.OP_WRITE ) != 0 )
+            && key != null && key.isValid()
+            && ( key.interestOps() & SelectionKey.OP_WRITE ) != 0 )
         {
             session
                     .getManagerFilterChain()
@@ -410,30 +409,28 @@
                 continue;
             }
             
-            // If encountered write request before session is initialized, 
+            SelectionKey key = session.getSelectionKey();
+            // Retry later if session is not yet fully initialized.
             // (In case that Session.write() is called before addSession() is processed)
-            if( session.getSelectionKey() == null )
+            if( key == null )
             {
-                // Reschedule for later write
                 scheduleFlush( session );
                 break;
             }
-            else
+            // skip if channel is already closed
+            if( !key.isValid() )
             {
-                try
-                {
-                    doFlush( session );
-                }
-                catch( CancelledKeyException e )
-                {
-                    // Connection is closed unexpectedly.
-                    scheduleRemove( session );
-                }
-                catch( IOException e )
-                {
-                    scheduleRemove( session );
-                    session.getManagerFilterChain().exceptionCaught( session, e );
-                }
+                continue;
+            }
+
+            try
+            {
+                doFlush( session );
+            }
+            catch( IOException e )
+            {
+                scheduleRemove( session );
+                session.getManagerFilterChain().exceptionCaught( session, e );
             }
         }
     }
@@ -535,6 +532,11 @@
                 scheduleTrafficControl( session );
                 break;
             }
+            // skip if channel is already closed
+            if( !key.isValid() )
+            {
+                continue;
+            }
 
             // The normal is OP_READ and, if there are write requests in the
             // session's write queue, set OP_WRITE to trigger flushing.
@@ -550,16 +552,7 @@
 
             // Now mask the preferred ops with the mask of the current session
             int mask = session.getTrafficMask().getInterestOps();
-
-            try
-            {
-                key.interestOps( ops & mask );
-            }
-            catch( CancelledKeyException e )
-            {
-                // Connection is closed unexpectedly.
-                scheduleRemove( session );
-            }
+            key.interestOps( ops & mask );
         }
     }