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