summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2008-03-10 20:37:20 +0100
committerBenoit Foucher <benoit@zeroc.com>2008-03-10 20:37:20 +0100
commitf01293d8f1e1dc0b77a1ebe20a2a55cb7cc7e41c (patch)
tree58a8e381c3266facc8e707b13cd0aa29757757cb /java/src
parentMerge branch 'master' of ssh://git/home/git/ice (diff)
downloadice-f01293d8f1e1dc0b77a1ebe20a2a55cb7cc7e41c.tar.bz2
ice-f01293d8f1e1dc0b77a1ebe20a2a55cb7cc7e41c.tar.xz
ice-f01293d8f1e1dc0b77a1ebe20a2a55cb7cc7e41c.zip
Fix for bug 2721
Diffstat (limited to 'java/src')
-rw-r--r--java/src/IceInternal/IncomingConnectionFactory.java14
-rw-r--r--java/src/IceInternal/Network.java88
-rw-r--r--java/src/IceInternal/TcpAcceptor.java33
-rw-r--r--java/src/IceSSL/AcceptorI.java32
4 files changed, 82 insertions, 85 deletions
diff --git a/java/src/IceInternal/IncomingConnectionFactory.java b/java/src/IceInternal/IncomingConnectionFactory.java
index d231b2eea04..2a6b1263e2a 100644
--- a/java/src/IceInternal/IncomingConnectionFactory.java
+++ b/java/src/IceInternal/IncomingConnectionFactory.java
@@ -252,6 +252,20 @@ public final class IncomingConnectionFactory extends EventHandler implements Ice
}
catch(Ice.SocketException ex)
{
+ if(Network.noMoreFds(ex.getCause()))
+ {
+ try
+ {
+ String s = "fatal error: can't accept more connections:\n" + ex.getCause().getMessage();
+ s += '\n' + _acceptor.toString();
+ _instance.initializationData().logger.error(s);
+ }
+ finally
+ {
+ Runtime.getRuntime().halt(1);
+ }
+ }
+
// Ignore socket exceptions.
return;
}
diff --git a/java/src/IceInternal/Network.java b/java/src/IceInternal/Network.java
index 1bdd30b54e4..e181b51a714 100644
--- a/java/src/IceInternal/Network.java
+++ b/java/src/IceInternal/Network.java
@@ -87,28 +87,32 @@ public final class Network
return false;
}
- //
- // This method is not used anymore. See comments in
- // TcpTransceiverI.java.
- //
-// public static boolean
-// notConnected(java.net.SocketException ex)
-// {
-// String msg = ex.getMessage().toLowerCase();
-// if(msg.indexOf("transport endpoint is not connected") != -1)
-// {
-// return true;
-// }
-// //
-// // BUGFIX: We check for EINVAL because shutdown() under Mac OS
-// // X returns EINVAL if the server side is gone.
-// //
-// else if(msg.indexOf("invalid argument") != -1)
-// {
-// return true;
-// }
-// return false;
-// }
+ public static boolean
+ noMoreFds(java.lang.Throwable ex)
+ {
+ String msg = ex.getMessage();
+ if(msg != null)
+ {
+ msg = msg.toLowerCase();
+
+ final String[] msgs =
+ {
+ "too many open files", // EMFILE
+ "file table overflow", // ENFILE
+ "too many open files in system" // ENFILE
+ };
+
+ for(int i = 0; i < msgs.length; i++)
+ {
+ if(msg.indexOf(msgs[i]) != -1)
+ {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
public static java.nio.channels.SocketChannel
createTcpSocket()
@@ -279,6 +283,46 @@ public final class Network
}
}
+ public static java.nio.channels.SocketChannel
+ doAccept(java.nio.channels.ServerSocketChannel afd)
+ {
+ java.nio.channels.SocketChannel fd = null;
+ while(true)
+ {
+ try
+ {
+ fd = afd.accept();
+ break;
+ }
+ catch(java.io.IOException ex)
+ {
+ if(interrupted(ex))
+ {
+ continue;
+ }
+
+ Ice.SocketException se = new Ice.SocketException();
+ se.initCause(ex);
+ throw se;
+ }
+ }
+
+ try
+ {
+ java.net.Socket socket = fd.socket();
+ socket.setTcpNoDelay(true);
+ socket.setKeepAlive(true);
+ }
+ catch(java.io.IOException ex)
+ {
+ Ice.SocketException se = new Ice.SocketException();
+ se.initCause(ex);
+ throw se;
+ }
+
+ return fd;
+ }
+
public static boolean
doConnect(java.nio.channels.SocketChannel fd, java.net.InetSocketAddress addr)
{
diff --git a/java/src/IceInternal/TcpAcceptor.java b/java/src/IceInternal/TcpAcceptor.java
index 87e1f619adf..e09bf7c760d 100644
--- a/java/src/IceInternal/TcpAcceptor.java
+++ b/java/src/IceInternal/TcpAcceptor.java
@@ -46,40 +46,9 @@ class TcpAcceptor implements Acceptor
public Transceiver
accept()
{
- java.nio.channels.SocketChannel fd = null;
- while(true)
- {
- try
- {
- fd = _fd.accept();
- break;
- }
- catch(java.io.IOException ex)
- {
- if(Network.interrupted(ex))
- {
- continue;
- }
- Ice.SocketException se = new Ice.SocketException();
- se.initCause(ex);
- throw se;
- }
- }
-
+ java.nio.channels.SocketChannel fd = Network.doAccept(_fd);
Network.setBlock(fd, false);
Network.setTcpBufSize(fd, _instance.initializationData().properties, _logger);
- try
- {
- java.net.Socket socket = fd.socket();
- socket.setTcpNoDelay(true);
- socket.setKeepAlive(true);
- }
- catch(java.io.IOException ex)
- {
- Ice.SocketException se = new Ice.SocketException();
- se.initCause(ex);
- throw se;
- }
if(_traceLevels.network >= 1)
{
diff --git a/java/src/IceSSL/AcceptorI.java b/java/src/IceSSL/AcceptorI.java
index aadf7316c50..29984ec9d6f 100644
--- a/java/src/IceSSL/AcceptorI.java
+++ b/java/src/IceSSL/AcceptorI.java
@@ -56,41 +56,11 @@ final class AcceptorI implements IceInternal.Acceptor
throw ex;
}
- java.nio.channels.SocketChannel fd = null;
- while(fd == null)
- {
- try
- {
- fd = _fd.accept();
- }
- catch(java.io.IOException ex)
- {
- if(IceInternal.Network.interrupted(ex))
- {
- continue;
- }
- Ice.SocketException se = new Ice.SocketException();
- se.initCause(ex);
- throw se;
- }
- }
+ java.nio.channels.SocketChannel fd = IceInternal.Network.doAccept(_fd);
javax.net.ssl.SSLEngine engine = null;
try
{
- try
- {
- java.net.Socket socket = fd.socket();
- socket.setTcpNoDelay(true);
- socket.setKeepAlive(true);
- }
- catch(java.io.IOException ex)
- {
- Ice.SocketException se = new Ice.SocketException();
- se.initCause(ex);
- throw se;
- }
-
IceInternal.Network.setBlock(fd, false);
IceInternal.Network.setTcpBufSize(fd, _instance.communicator().getProperties(), _logger);