JDK-8022394 : java.net.SocketException: Invalid argument due to use of select() on Darwin
  • Type: Bug
  • Component: core-libs
  • Sub-Component: java.net
  • Affected Version: 7u4
  • Priority: P3
  • Status: Closed
  • Resolution: Duplicate
  • OS: os_x
  • Submitted: 2013-05-07
  • Updated: 2014-11-17
  • Resolved: 2013-08-19
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 7
7-poolResolved
Related Reports
Duplicate :  
Duplicate :  
Relates :  
Description
FULL PRODUCT VERSION :
java version  " 1.7.0_21 " 
Java(TM) SE Runtime Environment (build 1.7.0_21-b12)
Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)

ADDITIONAL OS VERSION INFORMATION :
Mac OS 10.8.3

EXTRA RELEVANT SYSTEM CONFIGURATION :
Darwin Kernel Version 12.3.0: Sun Jan  6 22:37:10 PST 2013; root:xnu-2050.22.13~1/RELEASE_X86_64 x86_64

A DESCRIPTION OF THE PROBLEM :
We've had consistent problems with a Tomcat based application on Mac OS due to java.net.SocketException: Invalid argument from JNI code:

SEVERE: StandardServer.await: accept:
java.net.SocketException: Invalid argument
      at java.net.PlainSocketImpl.socketAccept(Native Method)
      at java.net.PlainSocketImpl.socketAccept(PlainSocketImpl.java)
      at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398)
      at java.net.ServerSocket.implAccept(ServerSocket.java:522)
      at java.net.ServerSocket.accept(ServerSocket.java:490)
      at org.apache.catalina.core.StandardServer.await(StandardServer.java:431)
      at org.apache.catalina.startup.Catalina.await(Catalina.java:676)
      at org.apache.catalina.startup.Catalina.start(Catalina.java:628)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:601)
      at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
      at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
      at mycompany.tomcat.startup.ThreadDumpWrapper.main(ThreadDumpWrapper.java:260)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:601)
      at org.tanukisoftware.wrapper.WrapperStartStopApp.run(WrapperStartStopApp.java:238)
      at java.lang.Thread.run(Thread.java:722)

  Bug 7131399 changed from poll() to select() on Mac OS, however select() has an important limitation: if the application is using more than 1024 file descriptors, the select call will fail with an EINVAL.

References:

* http://stackoverflow.com/questions/16191236/tomcat-startup-fails-due-to-java-net-socketexception-invalid-argument-on-mac-o
* http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7131399
* http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/sys/_select.h?txt
* https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/select.2.html

REGRESSION.  Last worked in version 6u45

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Attempt a socket operation that will call NET_Timeout in an application using > 1024 file descriptors

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The socket operation succeeds
ACTUAL -
The exception java.net.SocketException: Invalid argument is thrown

ERROR MESSAGES/STACK TRACES THAT OCCUR :
Executable test case result:

Exception in thread  " main "  java.net.SocketException: Invalid argument
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398)
at java.net.ServerSocket.implAccept(ServerSocket.java:522)
at java.net.ServerSocket.accept(ServerSocket.java:490)
at SelectTest.main(SelectTest.java:13)

REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
import java.io.*;
import java.net.*;

public class SelectTest {

  public static void main(String[] args) throws Exception {
    // Allocate 1024 file descriptors - some will already be in use of course
    for(int i = 0; i < 1024; i++) {
      new FileInputStream( " /dev/null " );
    }

    ServerSocket socket = new ServerSocket(8080);
    socket.accept();
  }

}

---------- END SOURCE ----------

CUSTOMER SUBMITTED WORKAROUND :
select() can be used without this limit on Darwin be setting _DARWIN_UNLIMITED_SELECT:

/*
 * This is called from sys/select.h and sys/time.h for the common prototype
 * of select().  Setting _DARWIN_C_SOURCE or _DARWIN_UNLIMITED_SELECT uses
 * the version of select() that does not place a limit on the first argument
 * (nfds).  In the UNIX conformance case, values of nfds greater than
 * FD_SETSIZE will return an error of EINVAL.
 */
Comments
The evaluation seems to be correct and the suggested fix/work around is probably the right thing to do, since poll() is still broken. The poll() fix was in the original openjdk port to Mac OS X. So, I've changed affects version to 7u4. Probably too late to fix this in 7u40
09-08-2013