Skip site navigation (1)Skip section navigation (2)
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>