A call to ServerSocketChannel.accept() cannot be interrupted.
Dawid Weiss
dawid.weiss at gmail.com
Thu Jun 26 21:07:47 UTC 2014
Hi there,
I am an Apache Lucene committer. We've encountered a problem on one of
our test machines and I wondered if it's something known.
The machine is:
FreeBSD 9.1-RELEASE-p3 FreeBSD 9.1-RELEASE-p3 #0 r250118: Tue Apr 30
22:06:26 UTC 2013
running:
openjdk version "1.7.0_60"
OpenJDK Runtime Environment (build 1.7.0_60-b19)
OpenJDK 64-Bit Server VM (build 24.60-b09, mixed mode)
The problem is actually with Jetty; it creates a connector with a
thread pool, where each thread calls a blocking
ServerSocketChannel#accept(). Once you close the pool it attempts to
terminate those threads and fails to do so -- and indeed, you can't
break out from accept, not via interrupt(), not via closing the
acquired ServerSocketChannel. The documentation of accept() states
ClosedByInterruptException should be thrown if the thread is
interrupted and indeed, this is the behavior on Linux and Windows.
A test case and more verbose problem description is here:
https://issues.apache.org/jira/browse/SOLR-6204
>From what I've diagnosed so far this seems to be an incomplete
implementation problem.
ServerSocketChannel attempts to signal the thread waiting on the
socket (on Linux) via NativeThread.java, but in the native code (the
only one I could find in ports) it's defined as:
JNIEXPORT jlong JNICALL
Java_sun_nio_ch_NativeThread_current(JNIEnv *env, jclass cl)
{
#ifdef __linux__
return (long)pthread_self();
#else
return -1;
#endif
}
JNIEXPORT void JNICALL
Java_sun_nio_ch_NativeThread_signal(JNIEnv *env, jclass cl, jlong thread)
{
#ifdef __linux__
if (pthread_kill((pthread_t)thread, INTERRUPT_SIGNAL))
JNU_ThrowIOExceptionWithLastError(env, "Thread signal failed");
#endif
Which would indicate a no-op call. And indeed, I recompiled
ServerSocketChannel with some debugging sysouts and the
NativeThread.current() call returns -1.
Thoughts?
Dawid
More information about the freebsd-java
mailing list