You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by ed...@apache.org on 2009/06/14 19:18:14 UTC

svn commit: r784588 - in /mina/trunk/core/src: main/java/org/apache/mina/core/polling/ main/java/org/apache/mina/transport/socket/ test/java/org/apache/mina/transport/socket/nio/

Author: edeoliveira
Date: Sun Jun 14 17:18:14 2009
New Revision: 784588

URL: http://svn.apache.org/viewvc?rev=784588&view=rev
Log:
Fix for DIRMINA-680

Added:
    mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramPortUnreachableTest.java   (with props)
Modified:
    mina/trunk/core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java
    mina/trunk/core/src/main/java/org/apache/mina/transport/socket/AbstractDatagramSessionConfig.java
    mina/trunk/core/src/main/java/org/apache/mina/transport/socket/DatagramSessionConfig.java

Modified: mina/trunk/core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java?rev=784588&r1=784587&r2=784588&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java Sun Jun 14 17:18:14 2009
@@ -20,6 +20,7 @@
 package org.apache.mina.core.polling;
 
 import java.io.IOException;
+import java.net.PortUnreachableException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -42,6 +43,7 @@
 import org.apache.mina.core.write.WriteRequest;
 import org.apache.mina.core.write.WriteRequestQueue;
 import org.apache.mina.core.write.WriteToClosedSessionException;
+import org.apache.mina.transport.socket.AbstractDatagramSessionConfig;
 import org.apache.mina.util.ExceptionMonitor;
 import org.apache.mina.util.NamePreservingRunnable;
 
@@ -616,7 +618,12 @@
             }
         } catch (Throwable e) {
             if (e instanceof IOException) {
-                scheduleRemove(session);
+                if (!(e instanceof PortUnreachableException)
+                        || !AbstractDatagramSessionConfig.class.isAssignableFrom(config.getClass())
+                        || ((AbstractDatagramSessionConfig) config)
+                                .isCloseOnPortUnreachable())
+
+                    scheduleRemove(session);
             }
             IoFilterChain filterChain = session.getFilterChain(); 
             filterChain.fireExceptionCaught(e);

Modified: mina/trunk/core/src/main/java/org/apache/mina/transport/socket/AbstractDatagramSessionConfig.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/socket/AbstractDatagramSessionConfig.java?rev=784588&r1=784587&r2=784588&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/transport/socket/AbstractDatagramSessionConfig.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/transport/socket/AbstractDatagramSessionConfig.java Sun Jun 14 17:18:14 2009
@@ -30,6 +30,10 @@
 public abstract class AbstractDatagramSessionConfig extends
         AbstractIoSessionConfig implements DatagramSessionConfig {
 
+    private static final boolean DEFAULT_CLOSE_ON_PORT_UNREACHABLE = true;
+
+    private boolean closeOnPortUnreachable = DEFAULT_CLOSE_ON_PORT_UNREACHABLE;
+    
     protected AbstractDatagramSessionConfig() {
         // Do nothing
     }
@@ -124,4 +128,18 @@
     protected  boolean isTrafficClassChanged() {
         return true;
     }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isCloseOnPortUnreachable() {
+        return closeOnPortUnreachable;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setCloseOnPortUnreachable(boolean closeOnPortUnreachable) {
+        this.closeOnPortUnreachable = closeOnPortUnreachable;
+    }
 }
\ No newline at end of file

Modified: mina/trunk/core/src/main/java/org/apache/mina/transport/socket/DatagramSessionConfig.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/socket/DatagramSessionConfig.java?rev=784588&r1=784587&r2=784588&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/transport/socket/DatagramSessionConfig.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/transport/socket/DatagramSessionConfig.java Sun Jun 14 17:18:14 2009
@@ -20,6 +20,7 @@
 package org.apache.mina.transport.socket;
 
 import java.net.DatagramSocket;
+import java.net.PortUnreachableException;
 
 import org.apache.mina.core.session.IoSessionConfig;
 
@@ -78,4 +79,16 @@
      * @see DatagramSocket#setTrafficClass(int)
      */
     void setTrafficClass(int trafficClass);
+
+    /**
+     * If method returns true, it means session should be closed when a
+     * {@link PortUnreachableException} occurs.
+     */
+    boolean isCloseOnPortUnreachable();
+
+    /**
+     * Sets if the session should be closed if an {@link PortUnreachableException} 
+     * occurs.
+     */
+    void setCloseOnPortUnreachable(boolean closeOnPortUnreachable);
 }

Added: mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramPortUnreachableTest.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramPortUnreachableTest.java?rev=784588&view=auto
==============================================================================
--- mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramPortUnreachableTest.java (added)
+++ mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramPortUnreachableTest.java Sun Jun 14 17:18:14 2009
@@ -0,0 +1,73 @@
+/*
+ *  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.mina.transport.socket.nio;
+
+import java.net.InetSocketAddress;
+
+import junit.framework.TestCase;
+
+import org.apache.mina.core.buffer.IoBuffer;
+import org.apache.mina.core.future.ConnectFuture;
+import org.apache.mina.core.future.ReadFuture;
+import org.apache.mina.core.service.IoConnector;
+import org.apache.mina.core.service.IoHandlerAdapter;
+import org.apache.mina.core.session.IoSession;
+import org.apache.mina.transport.socket.DatagramSessionConfig;
+import org.apache.mina.transport.socket.nio.NioDatagramConnector;
+
+/**
+ * Tests {@link DatagramSessionConfig#setCloseOnPortUnreachable(boolean)}.
+ *
+ * @author <a href="http://mina.apache.org">Apache MINA Project</a>
+ */
+public class DatagramPortUnreachableTest extends TestCase {
+
+    private final static InetSocketAddress FAKE_ADDR = new InetSocketAddress(
+            "localhost", 7000);
+
+    private void runTest(boolean closeOnPortUnreachable) throws Exception {
+        IoConnector connector = new NioDatagramConnector();
+        connector.setHandler(new IoHandlerAdapter());
+        ConnectFuture future = connector.connect(FAKE_ADDR);
+        future.awaitUninterruptibly();
+        IoSession session = future.getSession();
+
+        DatagramSessionConfig cfg = ((DatagramSessionConfig) session
+                .getConfig());
+        cfg.setUseReadOperation(true);
+        cfg.setCloseOnPortUnreachable(closeOnPortUnreachable);
+
+        session.write(IoBuffer.allocate(1)).awaitUninterruptibly().isWritten();
+        ReadFuture rf = session.read();
+        rf.await(2500);
+        assertEquals(closeOnPortUnreachable, session.isClosing());
+        connector.dispose();
+    }
+
+    public void testPortUnreachableClosesSession() throws Exception {
+        // session should be closing
+        runTest(true);
+    }
+    
+    public void testNormal() throws Exception {
+        // test that session is not closed on port unreachable exception
+        runTest(false);
+    }
+}
\ No newline at end of file

Propchange: mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramPortUnreachableTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain