I/O cancellation issue with ServerSocketChannel

Langer, Christoph christoph.langer at sap.com
Wed Jun 3 14:20:33 UTC 2015

Hi Alan,

on older AIX releases (5.3 and lower) I'm stumbling over the issue that a Java process hangs when a ServerSocketChannel is accepting in one thread and another thread is attempting to close the fd (hangs in dup2()). This is the Java callstack:

"Thread-0" #12 prio=5 os_prio=57 cpu=3.37 [reset 3.37] ms elapsed=575.79 [reset 575.79] s allocated=17160 B (16.76 KB) [reset 17160 B (16.76 KB)] defined_classes=2
io= file i/o: 4077/48 B, net i/o: 0/0 B, files opened:0, socks opened:0  [reset file i/o: 4077/48 B, net i/o: 0/0 B, files opened:0, socks opened:0 ]
tid=0x00000001853b8000 nid=0x1819 / 6169  ktid=2412747 runnable  [_thread_in_native (_at_safepoint), stack(0x0000000185a55000,0x0000000185c55890)] [0x0000000185c54000]
   java.lang.Thread.State: RUNNABLE
        at sun.nio.ch.FileDispatcherImpl.preClose0(Ljava/io/FileDescriptor;)V(Native Method)
        at sun.nio.ch.SocketDispatcher.preClose(Ljava/io/FileDescriptor;)V(SocketDispatcher.java:64)
        at sun.nio.ch.ServerSocketChannelImpl.implCloseSelectableChannel()V(ServerSocketChannelImpl.java:289)
        - locked <0x00000000bad4db58> (a java.lang.Object)
        at java.nio.channels.spi.AbstractSelectableChannel.implCloseChannel()V(AbstractSelectableChannel.java:234)
        at java.nio.channels.spi.AbstractInterruptibleChannel.close()V(AbstractInterruptibleChannel.java:115)
        - locked <0x00000000bad4db18> (a java.lang.Object)
        at com.sap.cl.ServerSocketChannelAsyncCloseTest$1.run()V(ServerSocketChannelAsyncCloseTest.java:33)
        at java.lang.Thread.run()V(Thread.java:812)
   Locked ownable synchronizers:
        - None

"main" #1 prio=5 os_prio=57 cpu=1975.89 [reset 1975.89] ms elapsed=582.97 [reset 582.97] s allocated=673352 B (657.57 KB) [reset 673352 B (657.57 KB)] defined_classes=549
io= file i/o: 2378532/24 B, net i/o: 0/0 B, files opened:4, socks opened:1  [reset file i/o: 2378532/24 B, net i/o: 0/0 B, files opened:4, socks opened:1 ]
tid=0x000000018031a800 nid=0x102 / 258  ktid=2642125 runnable  [_thread_in_native (_at_safepoint), stack(0x0000000180016000,0x0000000180216890)] [0x0000000180215000]
   java.lang.Thread.State: RUNNABLE
        at sun.nio.ch.ServerSocketChannelImpl.accept0(Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;[Ljava/net/InetSocketAddress;)I(Native Method)
        at sun.nio.ch.ServerSocketChannelImpl.accept(Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;[Ljava/net/InetSocketAddress;)I(ServerSocketChannelImpl.java:422)
        at sun.nio.ch.ServerSocketChannelImpl.accept()Ljava/nio/channels/SocketChannel;(ServerSocketChannelImpl.java:250)
        - locked <0x00000000bad4db48> (a java.lang.Object)
        at com.sap.cl.ServerSocketChannelAsyncCloseTest.main([Ljava/lang/String;)V(ServerSocketChannelAsyncCloseTest.java:45)
   Locked ownable synchronizers:
        - None

The preClose0 method does a dup2 which hangs, waiting for accept in the other thread to return which is working as designed on older AIX releases. The behavior of dup2 was improved with AIX 6.1 and later such that dup2 would return in this case. However, I found that in this thread: http://mail.openjdk.java.net/pipermail/nio-dev/2014-January/002500.html you indicated that you had an idea on how to fix this and would come up with a change proposal. What happened to that? In the current code base, even of JDK9, I still find the same behavior.

In my opinion one could just do the signaling in ServerSocketChannelImpl.implCloseSelectableChannel() before one calls the preClose() method. Is there any problem with that? Or do you have a different solution?

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/nio-dev/attachments/20150603/dc1425f9/attachment-0001.html>

More information about the nio-dev mailing list