diff options
Diffstat (limited to 'java/src')
-rw-r--r-- | java/src/IceInternal/IncomingConnectionFactory.java | 14 | ||||
-rw-r--r-- | java/src/IceInternal/Network.java | 88 | ||||
-rw-r--r-- | java/src/IceInternal/TcpAcceptor.java | 33 | ||||
-rw-r--r-- | java/src/IceSSL/AcceptorI.java | 32 |
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); |