Date: Thu, 26 Jun 2014 23:07:13 +0200 From: Dawid Weiss <dawid.weiss@gmail.com> To: freebsd-java@freebsd.org Subject: A call to ServerSocketChannel.accept() cannot be interrupted. Message-ID: <CAM21Rt9aqGbTjXQk7GZAdADJh2w=AiFJ4j1hMhtkXDz6LxUKeg@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAM21Rt9aqGbTjXQk7GZAdADJh2w=AiFJ4j1hMhtkXDz6LxUKeg>